在Javascript中本地化字符串
我目前正在使用.resx文件来管理.NET的服务器端资源。
我正在处理的应用程序还允许开发人员将JavaScript插入各种事件处理程序中,以进行客户端验证等。对我来说,本地化JavaScript消息和字符串的最佳方法是什么?
理想情况下,我想将字符串存储在.resx
文件中,以使其与其余本地化资源保持一致。
我愿意提出建议。
解决方案
我将使用对象/数组符号:
var phrases={}; phrases['fatalError'] ='On no!';
然后,我们可以交换JS文件,或者使用Ajax调用重新定义短语列表。
扩大对二极管us.myopenid.com的回答:让代码写出一个包含带有所有必需字符串的JS数组的文件,然后在其他JS代码之前加载适当的文件/脚本。
基本的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] );
使用附属程序集(而不是resx文件),我们可以枚举服务器上我们知道该语言的所有字符串,从而生成仅包含正确语言字符串的Javascript对象。
这样的事情对我们有用(VB.NET代码):
Dim rm As New ResourceManager([resource name], [your assembly]) Dim rs As ResourceSet = rm.GetResourceSet(Thread.CurrentThread.CurrentCulture, True, True) For Each kvp As DictionaryEntry In rs [Write out kvp.Key and kvp.Value] Next
但是,遗憾的是,我们还没有找到对.resx文件执行此操作的方法。
JSGettext使用后端上几乎任何语言对GNU Gettext .po文件进行出色的工作动态加载。 Google为"使用Gettext和PHP实现动态Javascript本地化"找到了使用PHP进行JSGettext的演练(我会发布链接,但是这个愚蠢的网站不会让我感叹……)
编辑:这应该是链接
MSDN的实现方式基本上是:
You create a separate script file for each supported language and culture. In each script file, you include an object in JSON format that contains the localized resources values for that language and culture.
我不能告诉我们问题的最佳解决方案,但是恕我直言,这是最糟糕的解决方法。至少现在我们知道该怎么做了。