我目前正在使用.resx
文件来管理.NET的服务器端资源.
我正在处理的应用程序还允许开发人员将JavaScript插入各种事件处理程序以进行客户端验证等.对我来说,本地化我的JavaScript消息和字符串的最佳方法是什么?
理想情况下,我想将字符串存储在.resx
文件中,以使其与其他本地化资源保持一致.
我愿意接受建议.
基本JavaScript对象是关联数组,因此可以轻松地用于存储键/值对.因此,使用JSON,您可以为每个字符串创建一个对象,如下所示:
var localizedStrings={ confirmMessage:{ 'en/US':'Are you sure?', 'fr/FR':'Est-ce que vous êtes certain?', ... }, ... }
然后你可以得到每个字符串的语言环境版本,如下所示:
var locale='en/US'; var confirm=localizedStrings['confirmMessage'][locale];
灵感来自SproutCore您可以设置字符串的属性:
'Hello'.fr = 'Bonjour'; 'Hello'.es = 'Hola';
然后根据您的语言环境简单地吐出正确的本地化:
var locale = 'en'; alert( message[locale] );
经过Google搜索并对所提供的大多数解决方案不满意后,我刚刚找到了一个使用T4模板的惊人/通用解决方案.Jochen van Wylick的完整帖子你可以在这里阅读:
使用T4基于.resx文件本地化JavaScript资源
主要优点是:
只有一个地方管理资源(即.resx文件)
支持多种文化
利用IntelliSense - 允许代码完成
缺点:
当然,这个解决方案的缺点是.js文件的大小可能会变得非常大.但是,由于它是由浏览器缓存的,因此我们认为这不是我们的应用程序的问题.但是 - 此缓存还可能导致浏览器无法找到从代码调用的资源.
这是怎么回事?
基本上他定义了一个指向.resx文件的T4模板.使用一些C#代码,他遍历每个资源字符串并将其添加到JavaScript纯键值属性,然后在一个名为JavaScript的文件中输出Resources.js
(如果您愿意,可以调整名称).
T4模板 [相应更改指向.resx文件位置]
<#@ template language="C#" debug="false" hostspecific="true"#> <#@ assembly name="System.Windows.Forms" #> <#@ import namespace="System.Resources" #> <#@ import namespace="System.Collections" #> <#@ import namespace="System.IO" #> <#@ output extension=".js"#> <# var path = Path.GetDirectoryName(Host.TemplateFile) + "/../App_GlobalResources/"; var resourceNames = new string[1] { "Common" }; #> /** * Resources * --------- * This file is auto-generated by a tool * 2012 Jochen van Wylick **/ var Resources = { <# foreach (var name in resourceNames) { #> <#=name #>: {}, <# } #> }; <# foreach (var name in resourceNames) { var nlFile = Host.ResolvePath(path + name + ".nl.resx" ); var enFile = Host.ResolvePath(path + name + ".resx" ); ResXResourceSet nlResxSet = new ResXResourceSet(nlFile); ResXResourceSet enResxSet = new ResXResourceSet(enFile); #> <# foreach (DictionaryEntry item in nlResxSet) { #> Resources.<#=name#>.<#=item.Key.ToString()#> = { 'nl-NL': '<#= ("" + item.Value).Replace("\r\n", string.Empty).Replace("'","\\'")#>', 'en-GB': '<#= ("" + enResxSet.GetString(item.Key.ToString())).Replace("\r\n", string.Empty).Replace("'","\\'")#>' }; <# } #> <# } #>
在表单/视图方面
要获取正确的翻译,如果您使用的是WebForms,请在主文件中添加:
如果你正在使用ASP.NET MVC(像我一样),你可以这样做:
MetaAcceptLanguage
我从Scott Hanselman的这篇精彩文章中得到的帮助:
ASP.NET MVC 3,JavaScript和jQuery中的全球化,国际化和本地化 - 第1部分
public static IHtmlString MetaAcceptLanguage(this HtmlHelper html) { var acceptLanguage = HttpUtility.HtmlAttributeEncode( Thread.CurrentThread.CurrentUICulture.ToString()); return new HtmlString( String.Format("", "accept-language", acceptLanguage)); }
用它
var msg = Resources.Common.Greeting[locale]; alert(msg);