7

我正在使用 MVC 模式作为起始位置构建多语言 Web 应用程序。该应用程序有许多用户将与之交互的表单,其中许多表单将具有从数据库表(例如“省”)进行查找的字段。

如果我需要在屏幕上以用户的语言显示这些列表中的选项,我可以看到几种方法来做到这一点:

  1. 在模型中。 查询模型时,我可以提供我希望返回结果的语言。这将允许在模型数据显示不变的任何地方使用翻译。但是,这也意味着我的示例中的省模型(以及所有其他应用程序模型)现在需要知道如何进行语言翻译。
  2. 在控制器中。 我可以像往常一样在控制器操作中查询模型,然后创建一个“翻译器”对象,我可以在完成操作之前将结果传递给该对象。这意味着每个控制器操作都可能复制相同的翻译代码,违反 DRY 原则。
  3. 在视图中。由于应用程序的呈现通常期望存在于视图中,并且用户的语言不会影响系统的业务逻辑,因此可以提出语言翻译属于这里的论点。特别是考虑到页面还可能包含需要翻译的静态内容。这样做的缺点是它会使视图有些复杂,尤其是对于必须处理新的翻译代码的前端设计人员。

对于 Web 应用程序的 MCV 模式中文本翻译的归属,是否存在公认的最佳实践?如果我要通过 AJAX 调用而不是在页面加载时加载选择列表选项,这是否会发生变化?

谢谢您的帮助!

4

5 回答 5

5

处理它的最佳位置是在视图中。您的问题仅引用数据库中的动态数据,但您还必须处理视图中的静态信息。最好在同一个地方处理这两个。MVC 中处理多种语言的常见做法是资源字符串、每种语言的单独视图或两者的组合。对于来自数据库资源字符串的信息,它会很好地工作。您将在数据库中为列表中的选项存储一个标记(该标记可以是英文翻译),并且视图将从指定国家/地区的资源中获取适当的翻译。在这篇博文中有关于这种方法的很好的详细解释。

于 2012-04-10T19:02:07.447 回答
1

如果您需要翻译部分 UI,那么我将创建一个辅助方法来读取资源文件并为该资源输出翻译后的字符串。例如

@Translate("NewUserHeading")

所以关于 UI,在 UI 中处理这个是有意义的。

如果您要翻译的数据可能会显示在 Flash 客户端或移动应用程序中,那么它应该由服务器翻译,并且与您的 MVC 应用程序无关。

于 2012-04-11T09:35:33.320 回答
0

老实说,与数据库的任何交互都应该在模型中处理,而这是模型中唯一处理的事情。解释/组织数据应在控制器中处理。我想需要更多信息来说明这个翻译的来源以及它是如何工作的,才能真正给出一个可靠的答案。

于 2012-04-10T15:53:42.097 回答
0

该视图将仅显示资源文件中的字符串。包括正确的语言环境资源文件应该可以做到。在 Web 应用程序中,它通常是一个单一语言的 JS 文件,用于定义每个语言环境的 UI 字符串,例如,strings.en-us.js、strings.pt-br.js 等等。

一些字符串确实来自服务器动态,控制器不需要知道它,模型应该只获取本地化的字符串并返回作为数据请求的一部分。

所以它要么在视图中(如果它是静态的),要么在模型中(如果它是动态的)。控制器应该只将数据从视图转换到模型,从模型转换到视图

于 2012-06-14T19:28:33.387 回答
0

另一个需要考虑的非常重要的事情是何时翻译。如果您的页面上只有 100 个翻译,则使用每次翻译一次的方法@Translate("NewUserHeading")很好,但如果您有更多翻译怎么办?

因为想一想,翻译是基于语言选择的,而且每页只发生一次,甚至每会话一次。Kendo UI 人员在他们的演示中这样做的方式是,当用户单击一种新语言时,会加载一组新的服务器文件。这意味着有类似的东西:
/src/html/en-us//
src/js/en-us//
src/html/es//
src/js/es/
等。

在https://demos.telerik.com/kendo-ui/grid/localization查看

这是为了更好的性能而牺牲更多的工作。目前翻译的最终用例是https://www.jw.org/,拥有 900 多种语言!

于 2018-09-21T13:04:15.870 回答