我正在尝试确定将本地化实现到我们的一个Web应用程序中的最佳方法。该应用程序将拥有大量的JavaScript文件,这些文件也需要进行本地化。
本地化.net代码是很容易的。我们有一个名为WebResources.resx的文件,其中包含所有英语字符串(我们的后备语言)。然后,我们只需添加带有替代本地化信息的其他文件(例如:WebResources.es-mx.resx)。然后,.Net几乎会自动处理剩下的部分。
非常不错。但是当涉及到JavaScript时,就不那么快了。根据MSDN的建议:
您为每种支持的语言和文化创建单独的脚本文件。在每个脚本文件中,您都包含一个以JSON格式表示的对象,其中包含该语言和文化的本地化资源值。
这似乎是我想要避免的维护噩梦。此外,我还想避免使用asp.net ScriptManager。因此,我想到了在我的.js文件中使用资源文件。例如
很遗憾,这不起作用,因为.NET似乎不会对.js文件进行任何处理。所以我得到的下一个想法来自于此线程上的答案。它建议创建一个包含所有语言字符串的JavaScript文件。但是,这会造成资源浪费,因为在运行时我只需要一种语言,而不是所有语言。
这导致我想要实现的解决方案。我计划有一个通用处理程序,编写出本地化为当前用户所需语言的JSON。以下是.ashx页面的示例:
在我的网页头部,我会有以下内容:
那么我的js文件将如下所示:
本地化.net代码是很容易的。我们有一个名为WebResources.resx的文件,其中包含所有英语字符串(我们的后备语言)。然后,我们只需添加带有替代本地化信息的其他文件(例如:WebResources.es-mx.resx)。然后,.Net几乎会自动处理剩下的部分。
非常不错。但是当涉及到JavaScript时,就不那么快了。根据MSDN的建议:
您为每种支持的语言和文化创建单独的脚本文件。在每个脚本文件中,您都包含一个以JSON格式表示的对象,其中包含该语言和文化的本地化资源值。
这似乎是我想要避免的维护噩梦。此外,我还想避免使用asp.net ScriptManager。因此,我想到了在我的.js文件中使用资源文件。例如
foobar.js
:function showGenericError(){
alert('<% =Resources.WebResources.JsGenericError %>');
}
很遗憾,这不起作用,因为.NET似乎不会对.js文件进行任何处理。所以我得到的下一个想法来自于此线程上的答案。它建议创建一个包含所有语言字符串的JavaScript文件。但是,这会造成资源浪费,因为在运行时我只需要一种语言,而不是所有语言。
这导致我想要实现的解决方案。我计划有一个通用处理程序,编写出本地化为当前用户所需语言的JSON。以下是.ashx页面的示例:
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "application/json";
StringBuilder json = new StringBuilder();
using (StringWriter jsonStringWriter = new StringWriter(json))
{
using (JsonTextWriter jsonWriter = new JsonTextWriter(jsonStringWriter))
{
jsonWriter.WriteStartObject();
jsonWriter.WritePropertyName("genericErrorMessage");
jsonWriter.WriteValue(Resources.WebResources.GenericErrorMessage);
jsonWriter.WriteEndObject();
}
}
context.Response.Write("var webResources = " + json.ToString());
}
在我的网页头部,我会有以下内容:
<script type="text/javascript" src="js/webResources.js.ashx"></script>
那么我的js文件将如下所示:
function showGenericError(){
alert(webResources.genericErrorMessage);
}
看起来似乎太容易了,对吧?那么我的问题是,这有意义吗?我是否遗漏了某些“陷阱”?有什么缺点吗?有更好的方法吗?