Saa*_*per 38 .net javascript localization resx
我目前正在使用.resx文件来管理.NET的服务器端资源.
我正在处理的应用程序还允许开发人员将JavaScript插入各种事件处理程序以进行客户端验证等.对我来说,本地化我的JavaScript消息和字符串的最佳方法是什么?
理想情况下,我想将字符串存储在.resx文件中,以使其与其他本地化资源保持一致.
我愿意接受建议.
Joe*_*air 26
基本JavaScript对象是关联数组,因此可以轻松地用于存储键/值对.因此,使用JSON,您可以为每个字符串创建一个对象,如下所示:
var localizedStrings={
confirmMessage:{
'en/US':'Are you sure?',
'fr/FR':'Est-ce que vous êtes certain?',
...
},
...
}
Run Code Online (Sandbox Code Playgroud)
然后你可以得到每个字符串的语言环境版本,如下所示:
var locale='en/US';
var confirm=localizedStrings['confirmMessage'][locale];
Run Code Online (Sandbox Code Playgroud)
小智 13
灵感来自SproutCore您可以设置字符串的属性:
'Hello'.fr = 'Bonjour';
'Hello'.es = 'Hola';
Run Code Online (Sandbox Code Playgroud)
然后根据您的语言环境简单地吐出正确的本地化:
var locale = 'en';
alert( message[locale] );
Run Code Online (Sandbox Code Playgroud)
Len*_*rri 10
经过Google搜索并对所提供的大多数解决方案不满意后,我刚刚找到了一个使用T4模板的惊人/通用解决方案.Jochen van Wylick的完整帖子你可以在这里阅读:
主要优点是:
缺点:
当然,这个解决方案的缺点是.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("'","\\'")#>'
};
<# } #>
<# } #>
Run Code Online (Sandbox Code Playgroud)
在表单/视图方面
要获取正确的翻译,如果您使用的是WebForms,请在主文件中添加:
<script type="text/javascript">
var locale = '<%= System.Threading.Thread.CurrentThread.CurrentCulture.Name %>';
</script>
<script type="text/javascript" src="/Scripts/Resources.js"></script>
Run Code Online (Sandbox Code Playgroud)
如果你正在使用ASP.NET MVC(像我一样),你可以这样做:
<script type="text/javascript">
// Setting Locale that will be used by JavaScript translations
var locale = $("meta[name='accept-language']").attr("content");
</script>
<script type="text/javascript" src="/Scripts/Resources.js"></script>
Run Code Online (Sandbox Code Playgroud)
MetaAcceptLanguage我从Scott Hanselman的这篇精彩文章中得到的帮助:
ASP.NET MVC 3,JavaScript和jQuery中的全球化,国际化和本地化 - 第1部分
public static IHtmlString MetaAcceptLanguage<T>(this HtmlHelper<T> html)
{
var acceptLanguage =
HttpUtility.HtmlAttributeEncode(
Thread.CurrentThread.CurrentUICulture.ToString());
return new HtmlString(
String.Format("<meta name=\"{0}\" content=\"{1}\">", "accept-language",
acceptLanguage));
}
Run Code Online (Sandbox Code Playgroud)
用它
var msg = Resources.Common.Greeting[locale];
alert(msg);
Run Code Online (Sandbox Code Playgroud)
我会使用对象/数组表示法:
var phrases={};
phrases['fatalError'] ='On no!';
Run Code Online (Sandbox Code Playgroud)
然后您可以交换 JS 文件,或者使用 Ajax 调用来重新定义您的短语列表。