【问题标题】:How to handle localization in JavaScript files?如何处理 JavaScript 文件中的本地化?
【发布时间】:2009-07-06 12:53:51
【问题描述】:

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

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

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

PS:我找到了 Ayende 的 a solution。这是正确的方向。

编辑:
我得到了提供 Controller.Resource('foo') 扩展方法的本地化助手类。

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

这是个好主意吗?

【问题讨论】:

    标签: javascript asp.net-mvc localization


    【解决方案1】:

    编辑

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

    在视图中:

    <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 代码中。

    【讨论】:

    • "我希望 javascript 与视图分离。" == "将您的 javascript 与您的标记分开也是一个很好的做法。"。 不起作用的问题。
    • 顺便说一句,为什么在 JS onload 上附加 onclick 处理程序更可取?
    • 我错过了您问题的“由 JS 生成”部分——刚刚扫描过它。在这种情况下,我会考虑将本地化数据写入视图并让 javascript 从本地对象加载它。将重写。
    • 您很可能错过了它,因为我编辑了我的问题(提交后约 5 秒)以添加它。 :)
    • @Arnis -- 回复:添加 onload。当我认为您正在内联渲染元素时,发表了该评论。我更喜欢使用 click() 方法来添加处理程序,而不是在动态添加时通过元素属性来添加。有关如何在动态创建元素时使用本地化资源的示例,请参阅我的更新答案。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您坚持将其分开,您可以执行以下操作:

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

      请记住,如果您使用 JavaScript 代码来初始化任何元素文本,您的网站将在 JavaScript 不可用的地方严重降级。

      【讨论】:

      • 该死的......再次忘记了可能缺乏javascript支持。 :(
      猜你喜欢
      • 1970-01-01
      • 2012-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      相关资源
      最近更新 更多