语言翻译在哪里适合MVC模式?

时间:2012-04-10 13:28:55

标签: model-view-controller web-applications architecture

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

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

  1. 在模型中。在查询模型时,我可以提供我希望返回结果的语言。这将允许在不显示模型数据的任何地方使用翻译变化。但是,这也意味着我的示例中的省模型(以及所有其他应用程序模型)现在需要知道如何进行语言翻译。
  2. 在控制器中。我可以像往常一样在控制器操作中查询模型,然后创建一个'Translator'对象,我可以在完成操作之前将结果传递给它。这意味着每个控制器操作都可能会复制相同的翻译代码,违反了DRY原则。
  3. 在视图中。由于应用程序的呈现通常预期存在于视图中,并且用户的语言不会影响系统的业务逻辑,因此可能存在争议使语言翻译属于这里。特别是考虑到页面还可能包含需要翻译的静态内容。这样做的缺点是它会使视图有些复杂化,特别是对于必须解决新翻译代码的前端设计人员而言。
  4. 对于Web应用程序的MCV模式,文本翻译属于何处,是否存在公认的最佳实践?如果我通过AJAX调用而不是在页面加载时加载选择列表选项,这是否会发生变化?

    感谢您的帮助!

5 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

@Translate("NewUserHeading")

因此,关于UI,在UI中处理它是有意义的。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

视图将只显示资源文件中的字符串。包含区域设置的正确资源文件应该这样做。在Web应用程序中,它通常是定义每个语言环境的UI字符串的单一语言JS文件,例如strings.en-us.js,strings.pt-br.js等。

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

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

答案 4 :(得分: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多种语言!