【发布时间】:2012-10-05 10:31:12
【问题描述】:
在过去的几天里,我一直在为我用 MVC 编写的 Web 应用程序实现本地化。 有 3 个主要任务可以解决我可以指出的 Lozalization “问题”:
- 存储:以多种语言存储键值对字符串以在您的应用程序中使用
- 服务器端访问:根据服务器端脚本中的给定键访问值(例如视图、控制器、Web 表单等...)
- 客户端访问:根据客户端脚本(例如 Java 脚本)中的给定键访问值
- 创建文化转换机制。
有几种方法可以完成我探索过的每项任务,我正在努力在它们之间进行选择。 有两个我感兴趣的问题:
- 我想知道本地化的最佳做法是什么?从你的角度来看。 请写出一种方法与另一种方法的优点\缺点。
- 您是否可以提出其他方法或改进建议。
1。存储
资源文件:
- 将本地化字符串的键值对存储在资源文件中
- 为每种文化创建一个具有相同键的资源文件,例如myString.resx、myStrings.he-IL.resex 等...
XML 文件:
-
创建一个结构化的 XML 文件,该文件将包含每个键的父节点和每个文化特定值的子节点,例如
<string key="myAppName"> <heIL>some Hebrew value</heIL> <enUS>some English value</enUS> </string>
2。服务器端访问
- 使用两个 Storage 选项,从服务器端访问将相当容易。
- 在这种情况下,使用资源文件会更容易一些,因为有一些类是自动生成的,以便于访问这些值。因此,您可以将资源用作具有静态属性的常规类,以根据键访问每个字符串值。
- 使用 XML 文件,您必须自己写下访问层代码,这不一定是坏事 - 因为您可以通过这种方式获得更多控制权(仅在需要时)
3。客户端访问
这就是它变得有趣且有时复杂的地方。 我在这里探索了两个选项,但我不确定如何继续。
服务器端生成脚本:
- 在您的 View\ Web-Form 中,在
<script>标记内添加一个服务器脚本渲染块 -
从这一点开始,动态创建一个键数组,或在 java 脚本中的静态变量,并将所需的字符串放入其中。 这是一个使用 Razor 引擎的示例。
<script type="text/javascript"> k_CultureInfo = "@CultureInfo.CurrentCulture.Name"; K_ApplicationName = "@MyStrings.SomeStringKey"; .... </script>
自定义 HTTP 处理程序:
我在这里的博客帖子中找到了这个想法:Localize text in JavaScript files in ASP.NET 这里
- 最好是编写一个 HTTP 处理程序来处理任何到达服务器的“.js.axd”请求。
- "ScriptTranslatorHandler" 将读取 javascrip 文件并替换预定义令牌的任何实例,例如将您的 java 脚本中的 (SomeStringKey) 转换为上述任何方法所采用的正确字符串。
【问题讨论】:
-
我个人认为,除非您花费很长时间,否则尝试将所有类型的应用程序集中到一个单一的资源管理机制中是不会成功的。对服务器端使用 ResourceManager 机制通常效果很好,例如,如果您想从数据库而不是 resx 文件中驱动资源字符串,则可以插入自己的资源提供程序。客户端应用程序应该使用自己的静态数据本地化机制 - 例如。在 Android 上,您使用“Droids 资源” - 然后我会使用语言标头来本地化来自服务器的动态信息。
-
只是为了看看是否理解正确,您建议实现自己的访问层,这样您就可以更好地控制从何处提取信息,而不管存储方式如何?
-
个人比较喜欢使用资源文件。主要原因是项目的透明度和非常容易的文化切换。将xml文件的内容(包含en-US-english等语言字符串)绑定到下拉列表。您只需根据选择设置文化。
-
@user829081 确实,使用资源似乎更容易,因为它们已经是内置本地化机制的一部分。您希望为客户端访问做什么?
-
也许你应该查看这个博客到:A Localization Handler to serve ASP.NET Resources to JavaScript 它使用带有 http 处理程序的 resx 文件。
标签: asp.net asp.net-mvc design-patterns language-agnostic localization