如何处理JavaScript文件中的本地化?

时间:2009-07-06 12:53:52

标签: javascript asp.net-mvc localization

我希望JavaScript代码与视图分开 我得到了为JavaScript生成的简单图像按钮实现本地化的要求:

<img src="..." onclick="..." title="Close" />

本地化标题的最佳技巧是什么?

PS:我发现Ayende a solution。这是正确的方向。

编辑:
我得到了Localization helper类,它提供了Controller.Resource('foo')扩展方法。

我正在考虑扩展它(帮助器),以便它可以通过名称返回指定控制器的所有JavaScript资源(来自App_LocalResources中的“ClientSideResources”子文件夹)。然后 - 在BaseController中调用它,将其添加到ViewData并在Layout中呈现。

这会是一个好主意吗?

3 个答案:

答案 0 :(得分:9)

修改

考虑将必要的本地化资源写入JavaScript对象(哈希),然后使用它来查找动态创建的对象。我认为这比回到服务器进行翻译更好。这与通过viewdata添加它类似,但可能更灵活一些。 FWIW,我可以认为本地化资源是View的一部分,而不是控制器的一部分。

在视图中:

<script type="text/javascript"
         src='<%= Url.Content( "~/Resources/Load?translate=Close,Open" %>'></script>

会输出如下内容:

var local = {};
local.Close = "Close";
local.Open = "Open";

没有参数,它将输出整个翻译哈希。使用参数可以为每个视图自定义它。

然后,您可以在JavaScript文件中使用它,例如:

 $(function(){
     $('#button').click( function() {
        $("<img src=... title='" + local.Close + "' />")
           .appendTo("#someDiv")
           .click( function() { ... } );
     });
 });

实际上,只要JavaScript代码本地化在容器中,我就不会太过于担心将JavaScript代码保留在我的视图之外。通常我会在主页面上设置4个内容区域:标题,标题,主要和脚本。标题,标题和主要去你想象的地方,脚本区域位于正文的底部。

我将所有JavaScript包括(包括任何用于viewusercontrols的)包含在脚本容器中。特定于视图的JavaScript代码位于包含之后。我根据需要将共享代码重构为脚本。我曾考虑使用控制器方法来整理脚本包含,即使用单个请求包含多个脚本,但尚未解决这个问题。

这样做的好处是可以保持JavaScript代码的可读性,但也允许我根据需要轻松地将模型或视图数据注入JavaScript代码。

答案 1 :(得分:2)

实际上,ASP.NET Ajax有一个内置的本地化机制:Understanding ASP.NET AJAX Localization

答案 2 :(得分:1)

如果你坚持要将它分开,你可以这样做:

//keep all of your localised vars somewhere
var title = '{title_from_server}';
document.getElementById('someImage').title = title;

请记住,如果您使用JavaScript代码初始化任何元素文本,那么您的网站将在JavaScript无法使用的地方发生可怕的降级。