jquery扩展为i18n

时间:2014-12-10 07:34:55

标签: javascript jquery internationalization

我有一个单页应用。我使用RequireJS,BackboneJS等,并在main.js

中包含以下代码
var myapp = {
    "i18n": {
        "myTranslationFile": "my-translations"
    }
};

同样在main.js中,我做

require([
    'app',
    // i18n utility
    'util/i18n'
    ], function(app, i18n){        
            myapp.i18n = $.extend(true, {}, i18n, myapp.i18n);
});

添加,i18n.js如下所示;

define({
    "lang": function( key, valArr ){
        var str = this._translated_strings[key] || key;
        return str;
    },

    "setLang": function( obj ){
        this._translated_strings = $.extend(true, {}, obj);
    },

    "load": function(){
        var self = this,
            rootDeferred = new $.Deferred(),
            i18nDeferred = new $.Deferred();

        require([
            // Root translations
            // Active translations
        ],
        function(root, active){
            //rootDeferred.resolve();
        });

        rootDeferred.done(function(root, activeLang){

            var lang = $("html").attr("lang"),
                finalTranslations = {};

            if (
                typeof lang !== "undefined" && 
                typeof activeLang[lang] !== "undefined" && 
                activeLang[lang] === true
            ) {
                require(['resources/i18n/' + lang + '/' + self.myTranslationFile],
                    function(translations){
                        self.setLang(finalTranslations);
                    });
            } else {
                self.setLang(finalTranslations);
            }
        });

        return i18nDeferred;
    }
});

现在在我看来,我使用以下代码用我的翻译文件中的字符串define替换密钥;

myapp.i18n.lang("myKeyForString")

我无法理解这是如何工作的? 我的意思是我可以清楚地看到myapp.i18n

但myapp.i18n.lang来自哪里? 这与jquery扩展有关吗?

1 个答案:

答案 0 :(得分:0)

通过你的代码,它是这样的:

  1. main.js 中定义 myapp 对象,其中包含一些预定义的键/值对。

  2. main.js 中的 require 方法说:只要您加载了 app utils / i18n 使用 app 118n 对象作为参数运行以下函数。如上面的评论中所述:jQuery extend将两个或多个对象的内容合并到第一个对象中。您的参数详细信息如下: myapp.i18n = $.extend(true, {}, i18n, myapp.i18n);

    • true - 合并变为递归(又名深拷贝)。
    • {} - 目标,要扩展的对象。它将收到新的属性。
    • i18n - 包含要合并的其他属性的对象(函数参数)
    • myapp.i18n - 包含要合并的属性的其他对象(原始对象)

    结果: myapp.i18n 现在包含旧的静态键/值以及来自 i18n 的方法。

  3. i18n.js 中,requirejs define 方法设置包含各种方法的对象。其中一个是 load 方法,它初始化require i18n插件。该函数包含另一个require,检索所有翻译文件。 加载会返回一个jQuery延迟对象。这样的对象可以将多个回调注册到回调队列中,调用回调队列,并中继任何同步或异步功能的成功或失败状态。简而言之,只要加载所有翻译文件,它就会通过使用jQuery扩展来填充另一个对象。

  4. 这就是你如何在视图中使用 mapp.i18n.lang 的方式。