Model view controller 在MVC模式中,语言翻译在哪里合适?

Model view controller 在MVC模式中,语言翻译在哪里合适?,model-view-controller,web-applications,architecture,Model View Controller,Web Applications,Architecture,我正在以MVC模式为起点构建一个多语言的web应用程序。该应用程序有许多用户将与之交互的表单,其中许多表单都有从数据库表(例如“省”)进行查找的字段 如果我需要在屏幕上以用户语言显示这些列表中的选项,我可以看到几种方法: 在模型中。查询模型时,我可以提供希望返回结果的语言。这将允许在显示模型数据的任何地方使用转换,而不进行任何更改。然而,这也意味着我的示例中的省模型(加上所有其他应用程序模型)现在需要知道如何进行语言翻译 在控制器中。我可以像往常一样在控制器操作中查询模型,然后创建一个“Tran

我正在以MVC模式为起点构建一个多语言的web应用程序。该应用程序有许多用户将与之交互的表单,其中许多表单都有从数据库表(例如“省”)进行查找的字段

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

  • 在模型中。查询模型时,我可以提供希望返回结果的语言。这将允许在显示模型数据的任何地方使用转换,而不进行任何更改。然而,这也意味着我的示例中的省模型(加上所有其他应用程序模型)现在需要知道如何进行语言翻译
  • 在控制器中。我可以像往常一样在控制器操作中查询模型,然后创建一个“Translator”对象,我可以在完成操作之前将结果传递到该对象中。这意味着每个控制器操作都可能复制相同的翻译代码,违反了DRY原则
  • 在视图中。由于应用程序的表示通常会出现在视图中,并且用户的语言不会影响系统的业务逻辑,因此可以认为语言翻译属于此处。特别是考虑到一个页面也可能包含需要翻译的静态内容。这样做的缺点是,它会使视图有些复杂,特别是对于前端设计师来说,他们将不得不围绕新的翻译代码工作
  • 对于web应用程序的MCV模式中文本翻译的位置,是否有公认的最佳实践?如果我通过AJAX调用而不是在页面加载时加载选择列表选项,这种情况会发生变化吗


    谢谢你的帮助

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

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

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

    @Translate("NewUserHeading")
    
    因此,关于UI,在UI中处理这一点是有意义的


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

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

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


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

    < P>,另一个非常重要的事情是什么时候翻译。如果您的页面上只有100个翻译,那么使用类似于
    @Translate(“NewUserHeading”)
    每次翻译一次方法是可以的,但是如果您有更多的翻译呢

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

    查看


    这是为了更好的表现而付出更多努力的代价。目前翻译的最终用例是900多种语言

    我想这会引发肥胖模型/瘦控制器和瘦模型/胖控制器之间的争论。“我是对的,你会把你的业务逻辑放在控制器上吗?”WallyAlless从未听过有人为胖控制器辩护。控制器是一个从视图到模型以及从模型到视图的薄层。控制器通常不被重用,它们只是胶水,不要用胶水填充代码。