【发布时间】:2011-02-17 16:28:01
【问题描述】:
我正在尝试确定在我们的一个网络应用程序中实施本地化的最佳方式。这个应用程序将有大量的 javascript 文件,这些文件也需要本地化。
本地化 .net 代码非常简单。我们有一个名为 WebResources.resx 的文件,其中包含所有英文字符串(我们的后备语言)。然后我们只需添加带有替代本地化信息的附加文件(例如:WebResources.es-mx.resx)。然后,砰! .Net 几乎负责其余的工作。
很甜。但是当涉及到 javascript 时,并没有那么快。 Reading on MSDN they recommend:
您为每种支持的语言和文化创建一个单独的脚本文件。在每个脚本文件中,您都包含一个 JSON 格式的对象,其中包含该语言和文化的本地化资源值。
这似乎是我想避免的维护噩梦。另外,我想避免使用 asp.net ScriptManager。所以我想到了尝试在我的 .js 文件中使用资源文件的好主意。 EGfoobar.js:
function showGenericError(){
alert('<% =Resources.WebResources.JsGenericError %>');
}
不幸的是,这不起作用,因为 .NET 似乎没有对 .js 文件进行任何处理。所以我得到的下一个想法来自this thread 上的答案。它建议有一个包含所有语言字符串的 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);
}
几乎看起来太容易了,对吧?所以我的问题是,这有意义吗?我在某处错过了“陷阱”吗?有什么缺点?有没有更好的方法来做到这一点?
【问题讨论】:
-
有道理,尽管您可能想找出一种方法来在 build 时生成每个目录文件的 JavaScript 版本,以便浏览器可以缓存数据。按照这里的方式,每次页面浏览都必须重新下载目录。
-
看起来你最终得到了与你推荐的 MSDN 文章非常相似的东西。即一个包含单一语言的 json 序列化本地化的 js 文件。
-
CodeInChaos,总之,是的。但是我避免了使用 ScriptManager 或编写逻辑来确定要加载哪个 JS 文件。真正的优势是,如果其中一个语言文件中缺少密钥,它会很好地降级。
-
对所有语言使用相同的 javascript url 是 IMO 的一个坏主意。这使得缓存更难正确执行。例如,如果用户切换语言...
标签: javascript .net localization