Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript i18n的jquery扩展_Javascript_Jquery_Internationalization - Fatal编程技术网

Javascript i18n的jquery扩展

Javascript i18n的jquery扩展,javascript,jquery,internationalization,Javascript,Jquery,Internationalization,我有一个单页应用程序。我使用RequireJS、BackboneJS等,在main.js中有以下代码 var myapp = { "i18n": { "myTranslationFile": "my-translations" } }; 在main.js中也是这样 require([ 'app', // i18n utility 'util/i18n' ], function(app, i18n){

我有一个单页应用程序。我使用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;
    }
});
现在在我看来,我使用以下代码用翻译文件中定义的字符串替换键

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

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

在您的代码中,它是这样的:

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

  • main.js中的require方法说:一旦加载了apputils/i18n,使用app118n对象作为参数运行以下函数。如上所述:jQuery
    extend
    将两个或多个对象的内容合并到第一个对象中。您的详细参数如下:
    myapp.i18n=$.extend(true,{},i18n,myapp.i18n)

    • true-合并变为递归(也称为深度复制)
    • {}-目标,要扩展的对象。它将接收新属性
    • i18n-包含要合并的其他属性的对象(函数参数)
    • myapp.i18n-包含要合并的属性的其他对象(原始对象)
    结果:myapp.i18n现在包含旧的静态键/值以及来自i18n的方法

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


  • 这就是如何在视图中使用mapp.i18n.lang作为函数的方法。

    您正在使用此代码扩展
    myapp.i18n
    myapp.i18n=$.extend(true,{},i18n,myapp.i18n)。来自规范:“扩展-将两个或多个对象的内容合并到第一个对象中。”-i18n.js中的define方法包含一个对象,该对象随后扩展myapp.i18n对象。因此,您可以使用myapp.i18n.lang、myapp.i18n.setlang等。