当前位置:  开发笔记 > 编程语言 > 正文

在Javascript中本地化字符串

如何解决《在Javascript中本地化字符串》经验,为你挑选了3个好方法。

我目前正在使用.resx文件来管理.NET的服务器端资源.

我正在处理的应用程序还允许开发人员将JavaScript插入各种事件处理程序以进行客户端验证等.对我来说,本地化我的JavaScript消息和字符串的最佳方法是什么?

理想情况下,我想将字符串存储在.resx文件中,以使其与其他本地化资源保持一致.

我愿意接受建议.



1> Joel Anair..:

基本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];


这种方法的问题是您加载所有语言的所有字符串.然而,服务器很可能通过浏览器提供的线索或通过用户首选项知道需要什么语言.发送单个语言文件会更好.
简单地颠倒顺序'localizedStrings [culture] [key]'解决了加载多种文化的问题..它还可以让'中性'文化被用作所有其他文化的原型(当文化没有时提供无缝回退定义一个特定的密钥)

2> 小智..:

灵感来自SproutCore您可以设置字符串的属性:

'Hello'.fr = 'Bonjour';
'Hello'.es = 'Hola';

然后根据您的语言环境简单地吐出正确的本地化:

var locale = 'en';
alert( message[locale] );



3> Leniel Macca..:

经过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);

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有