我有一个单页应用。我使用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扩展有关吗?
答案 0 :(得分:0)
通过你的代码,它是这样的:
在 main.js 中定义 myapp 对象,其中包含一些预定义的键/值对。
main.js 中的 require 方法说:只要您加载了 app 和 utils / i18n 使用 app 和 118n 对象作为参数运行以下函数。如上面的评论中所述:jQuery extend
将两个或多个对象的内容合并到第一个对象中。您的参数详细信息如下:
myapp.i18n = $.extend(true, {}, i18n, myapp.i18n);
结果: myapp.i18n 现在包含旧的静态键/值以及来自 i18n 的方法。
在 i18n.js 中,requirejs define 方法设置包含各种方法的对象。其中一个是 load 方法,它初始化require i18n插件。该函数包含另一个require,检索所有翻译文件。 加载会返回一个jQuery延迟对象。这样的对象可以将多个回调注册到回调队列中,调用回调队列,并中继任何同步或异步功能的成功或失败状态。简而言之,只要加载所有翻译文件,它就会通过使用jQuery扩展来填充另一个对象。
这就是你如何在视图中使用 mapp.i18n.lang 的方式。