【问题标题】:Where does language translation fit in the MVC pattern?语言翻译在哪里适合 MVC 模式?
【发布时间】:2012-04-22 19:16:09
【问题描述】:

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

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

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

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

感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      @Translate("NewUserHeading")
      

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 我想这会引发胖模型/瘦控制器和瘦模型/胖控制器之间的争论。我是对的,您将在控制器中包含您的业务逻辑?
        • @WallyLawless 从未听过有人为胖控制器争论。控制器是一个薄层,从视图到模型,从模型到视图。控制器通常不会被重用,它们只是胶水,不要用胶水填充你的代码。
        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          这是为了获得更好的性能而付出更多的努力。目前翻译的终极用例是https://www.jw.org/,拥有超过 900 种语言!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-16
            • 1970-01-01
            • 2023-03-03
            • 2011-12-21
            • 1970-01-01
            • 2015-04-03
            相关资源
            最近更新 更多