【问题标题】:How to use Dojo i18n in the SIMPLEST manner possible如何以最简单的方式使用 Dojo i18n
【发布时间】:2012-12-03 11:44:01
【问题描述】:

我是 Dojo 和 i18n 的新手。我希望在我的应用程序中将一些作品转换为不同的语言。我已经阅读了几篇文章,老实说,我觉得有很多信息需要我消化,而我正在努力解决它。有人可以为我提供最简单的方法吗?假设我想更改“你好”这个词。在我的脑海中,它会是这样的:

  • Dojo 库可供使用
  • 我在我的 javascript 文件中定义了字符串 'hello'。它有“你好”的占位符文本
  • 我在我的 HTML 中指定我希望我的页面是

    "此处指定的字符串以不同的语言显示 hello"

所以我能从我有限的知识中吸收尽可能多的东西。我如何才能让这种设置正常工作?我假设我需要在我的页面上要求 i18n,但我执行此操作的具体方式仍有待确定。

任何帮助都会很棒。请记住,如果可能的话,我对您的回答了解有限,谢谢!

【问题讨论】:

    标签: internationalization dojo


    【解决方案1】:

    nls 文件夹通常用于存储您的翻译字符串,并且通常是使用它的小部件旁边的子目录。

    即。如果您的小部件存储在名为 app 的文件夹中的 myWidget.js 中,则 myWidget.js 的翻译字符串存储在一个文件中app/nls 目录中的同名 (myWidget.js)。

    这只是约定,但可能值得遵循,因为它使您的目录结构合乎逻辑。

    这是 myWidget.js 小部件的示例:

    define([
        "dojo/_base/declare",
        "dijit/_WidgetBase",
        "dijit/_TemplatedMixin",
        "dojo/i18n!./nls/myWidget"
    ], function(
        declare,  _widget, _templated,  strings, domAttr
    ){
        "use strict";
    
        var construct = declare([_widget,  _templated], {
            "i18n": strings,
            "templateString": "<div>${i18n.hello}</div>"
        });
    
        return construct;
    });
    

    这是一个非常简单的小部件,它在屏幕上创建一个

    (参见 templateString 属性)。
    应该包含从翻译文件加载并分配给 hello 属性的文本。

    小部件需要在与 myWidget.js 相同的目录中创建 nls 目录。在 nls 目录中,您创建另一个名为 myWidget.js 的 javascript 文件(即与父级相同的名称)。该文件是您的根翻译文件,如下所示:

    define({
        root: ({
            "hello": "Hello"
        })
    });
    

    在这里,您已将字符串“Hello”分配给属性hello。这不是很有用,因为没有提供翻译。如果你想要挪威语翻译,你可以这样修改:

    define({
        root: ({
            "hello": "Hello"
        }) ,
        "no": true
    });
    

    在这里,您是说除了根翻译字符串之外,您还有挪威语翻译。然后,您需要创建您的挪威语翻译文件并将其放置在 nls 的一个名为 no 的子目录中。因此,您创建另一个名为 myWidget.js 的文件并将其放在 nls/no 中:

    define({
        "hello": "Hei"
    });
    

    翻译文件的格式与根文件略有不同。使用默认字符串,除非当前浏览器语言中给定字符串的翻译可用(即,您不需要翻译每个字符串,只需翻译您想要翻译的字符串)。

    在小部件之外加载翻译字符串:

    以上示例展示了如何按照常规约定为小部件加载翻译文本。您可以在任何小部件或任何 require 语句中加载所需的任何字符串集。 dojo/i18n 类能够加载您指定的任何字符串集。

    eg:
    
    require([
        "dojo/i18n!<PATH TO TRANSLATION ROOT FILE YOU WANT TO LOAD>"
    ], function(string) {
        // translation-string are stored in the 'strings' variable for the
        //    current browser language
    });
    

    【讨论】:

    • 感谢您的回复。我有包含所需项目的 main.js。然后,在 js/app/nls 我有 sample.js 包含根规范的定义。在这里,我没有那么真实。然后在 js/app/nls/no 我有带有挪威语规范的 sample.js。我已将我的语言环境指定为否,但没有任何反应。在我的案例中,我尝试更改的标头保留了我在 HTML 中指定的默认值,并且不会更改为我在任何 sample.js 文件中的值。我不知所措。你有一个示例项目或知道我可以看到一个活生生的例子吗? Dojo 文档没有帮助。
    • 我已经快速将上述项目发布到 Bitbucket (bitbucket.org/ssimpo/stackoverflow-13702818/src)。我已经使用 Firefox 17.0.1 在我的机器上对此进行了测试。注意:我使用的是 Dojo 1.8.1,不确定您使用的是哪个版本,但认为代码应该适用于旧版本(除了在 data-dojo-type 中将斜杠更改为点)。如果您将浏览器语言设置为英语,它应该显示 Hello,如果设置为挪威语,它应该显示 Hei。您可以通过下载 Dojo SDK 并查看 i18n 如何在核心 dijits (dojotoolkit.org/download) 中获得更多提示
    • 从您的评论来看,我认为您需要将 require/define 行设置为“dojo/i18n!./nls/sample”(因为您将其称为 sample.js)假设代码正在以 dojo 可以正确映射相对 url 的方式运行。尝试根文件的完整路径并从那里向后工作(例如“dojo/i18n!myserver.com/js/app/nls/sample.js"
    • 谢谢。答案很有帮助。顺便说一句,您在 nls/no 的 myWidget.js 中有一个额外的圆括号:define(({ 应该是 define({。对吗?

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2019-12-02
    • 2017-09-28
    相关资源
    最近更新 更多