1

我构建了一个具有以下层的应用程序:

  • WEB表示层
  • 业务逻辑层 - BLL - 通过 HTTP Web 服务从 WEB UI 调用
  • WindowsService - 运行时 - 通过 net.pipe 从 BLL 调用

BLL 也可以从第 3 方调用以集成到其他客户的系统中。

假设在运行时甚至 BLL 中发生了验证错误。哪里最好放翻译:

  1. 在异常消息中 - 表示我们必须将 UICulture 从 WEB 层发送到较低层
  2. BLL 和 Runtime 正在返回错误代码或自定义 Exception 派生类型,并在 WEB UI 层执行翻译
  3. 其他一些方法

在 SOA 架构中支持多种语言的最佳实践是什么?

编辑:我可能应该使用术语层而不是层。

  • WEB UI 层在 ASP.NET Web 表单中实现,将部署在 IIS 下的服务器 A 上。
  • BLL 和 Runtime 将部署在服务器 B 上,但由进程边界分隔(由于 WCF 服务,BLL 在 ASP.NET 工作进程下运行,而 Runtime 作为独立的 Windows 服务进程运行)。
4

4 回答 4

1

我对您的问题的建议是一般性的,因为我不知道您正在使用的 .NET 平台的具体情况。

从你的问题中,我看到了两个不同的问题。

  1. 您的 Web 表示层依赖于语言。它将需要自定义 CSS、字体、间距甚至自定义内容。不要自欺欺人,这将是不需要的。这是人们最初在国际化 Web 应用程序时犯的最大错误之一。您将需要另一种语言风格。因此,如果您使用模板方法,您可以将大部分语言内容直接放在与语言相关的模板中。

  2. 从您的问题描述来看,听起来您还需要处理本地化错误消息。有两种方法:您可以拥有一个语言文件,当使用资源文件解决方案引发错误时,您可以在其中进行本地化。另一种方法是让您的错误消息使用通用标识符和参数,并让另一层捕获消息并将其本地化。我自己更喜欢前一种解决方案,因为它更简单。

还要记住,如果您将错误消息写入日志文件,则错误消息是开发人员可以阅读的语言。同样,对于在 GUI 中向用户显示的错误,您将需要某种方式让用户向不说用户语言的开发人员识别错误。这可以通过使用数字来完成 - 我更喜欢使用短键,例如DATABASE_ERROR_BAD_QUERY.

于 2009-04-21T15:42:28.650 回答
1

翻译应由表示层处理,因为它与视图相关。可以添加到消息中的上下文越多越好,业务逻辑可能不知道上下文也不应该知道。

我使用的一种方法如下:

  • 业务逻辑会抛出独特的、已定义的错误代码,这些错误代码可用作资源包中的键以获取已翻译的消息。

  • 表示层维护一个文本包,其中包含与一般表示层代码分开的所有错误代码翻译。

  • 表示层依赖于
    业务逻辑和文本包。

  • 业务逻辑的第 3 方客户端(如 Web 服务)如果需要标准错误代码翻译,可以选择将文本包作为依赖项包含在内。否则他们可以自己处理业务逻辑抛出的错误代码。

于 2009-06-13T19:18:51.487 回答
0

我不太确定您对 WEB UI 的定义是什么。如果您使用 MVC 模式,控制器将负责在 UI 中显示正确的语言版本,而文本本身将位于视图层中。我不明白的是,控制器在您的架构中扮演什么角色。BLL 是指只包含处理逻辑,不包含 UI 和 Services 之间的通信吗?如果是这样,那么 Web UI 层可能会包含本地化逻辑。

我还要说,这很大程度上取决于您在项目中使用的技术。例如,ASP.NET 有一个可以使用的内置本地化模型。我并不是说它应该作为一个例子,即使相反 - ASP.NET 打破了关注点分离。但我认为这是一个问题,在不同的自定义架构模型中会有非常不同的解决方案,就像你的情况一样。

于 2009-04-21T15:30:01.907 回答
0

根据您的应用程序的结构,您可能需要在两个位置进行国际化:

1)软件本身。 菜单、对话框、消息、标签、报告等。

2)内容。当您的应用程序以一种以上的语言运行时,您的应用程序可能需要处理一种以上语言的内容。

我在分离不同层的管理工具和发布逻辑方面很幸运(到目前为止)。

First, consider placing the language translation management and generation logic (resource bundles, etc) in the Business Logic. So, for all your translations, you want a way to quickly sync all data entries as they get added to the system in all languages from a master language (english), and then populate and manage those. So, if you're using resource bundles for example, generate the rb files from a database for all the languages.

Second, publish the language translations logic at the presentation tier. It has more to do with presentation and formatting. You inevitably will run into issues with localization for dates, times, currencies, etc that you can handle pretty well here. You may or may not build your own library to publish these things as the confines, or flexibility of your programming language may or may not allow.

If you can give more details I'm sure there are other insights available from everyone here.

Good Luck!

于 2009-06-13T20:50:42.483 回答