Cer*_*ler 6 multilingual meteor
我正在Meteor.js开发一个多语言应用程序我想知道你认为这样做的最佳方式; 这里的例子就是我现在正在做的事情(很确定可以做得更好);
首先,我使用语言根目录中的属性保存mongodb中的项目:
{
en: {
name: "english name",
content: "english content"
},
it: {
name: "italian name",
content: "italian content"
},
//since images are the same for both, are not nested
images: {
mainImage: "dataURL",
mainThumb: "dataURL"
}
}
Run Code Online (Sandbox Code Playgroud)
然后我使用currentLang会话变量发布订阅:
Meteor.publish("elementsCurrentLang", function(currentLang) {
var projection = {
images: 1
};
projection[currentLang] = 1;
return Elements.find({}, projection);
});
Run Code Online (Sandbox Code Playgroud)
我使用Iron Router waitOn钩子在路线上订阅:
Router.route('/eng/elements', {
waitOn: function() {
return Meteor.subscribe("municipalitiesCurrentLang", Session.get('currentLang'));
},
action: function() {
this.layout('ApplicationLayout');
this.render('elements');
}
});
Run Code Online (Sandbox Code Playgroud)
现在第一个问题:我想为每种语言重用相同的模板,但我不能简单地放入模板{{name}}或{{content}},因为订阅返回嵌套在lang root下的属性,所以例如,{{en.name}}表示英语,或{{it.name}}表示意大利语; 为了避免这种情况,我使用了一个模拟新对象的模板助手; 本质上它从lang根中删除属性:
Template.elements.helpers({
elements: function() {
var elements = Elements.find();
var currentLang = Session.get('currentLang');
var resultList = [];
elements.forEach(function(element, index) {
var element = {
name: element[currentLang].name,
content: element[currentLang].nameUrl,
images: element.images
};
resultList.push(element);
});
return resultList;
}
});
Run Code Online (Sandbox Code Playgroud)
现在在模板中我可以访问想要的属性:
<h1>{{name}}</h1>
<p>{{content}}</p>
Run Code Online (Sandbox Code Playgroud)
在继续这种方法之前,我想听取建议,因为我不知道这是否会有效; 当Session.currentLang将改变时,订阅将被重新加载?有没有办法避免模板助手中的forEach循环?
我也在开发一个多语言 Web 应用程序,我建议您使用一个包,如下所示:https: //atmospherejs.com/tap/i18n
您可以被动地更改语言。根据您的需要,为您的所有语言提供相同的模板!您可以将其作为参数放入路线中。我个人将它用作会话变量并在用户配置文件中使用!
如果您使用此包,您还可以更轻松地导出应用程序或其一部分,因为许多开发人员将使用相同的代码。
您将所有单词放入 json 文件中:
en.i18n.json:
{
"hello": "hello"
}
fr.i18n.json:
{
"hello": "bonjour"
}
Run Code Online (Sandbox Code Playgroud)
和
{{_ "hello" }}
Run Code Online (Sandbox Code Playgroud)
将根据语言设置写出 hello 或 bonjour。您可以使用以下命令设置它:
TAPi18n.setLanguage(getUserLanguage())
//getUserLanguage() <- my function to get the current langage in the user profile or
the one used by the navigator
Run Code Online (Sandbox Code Playgroud)