我正在使用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"
}
}
然后我使用当前语言会话变量发布一个订阅:
Meteor.publish("elementsCurrentLang", function(currentLang) {
var projection = {
images: 1
};
projection[currentLang] = 1;
return Elements.find({}, projection);
});
我使用Iron Router的waitOn钩子订阅路由:
Router.route('/eng/elements', {
waitOn: function() {
return Meteor.subscribe("municipalitiesCurrentLang", Session.get('currentLang'));
},
action: function() {
this.layout('ApplicationLayout');
this.render('elements');
}
});
现在第一个问题是:我希望为每种语言重复使用相同的模板,但我不能简单地在模板中放置{{name}}或{{content}},因为订阅返回的属性嵌套在lang根下,所以需要为英语做{{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;
}
});
现在我可以在模板中访问像wanted这样的属性:
<h1>{{name}}</h1>
<p>{{content}}</p>
在继续这种方法之前,我想听听建议,因为我不知道这是否会很好地运作;当Session.currentLang更改时,订阅将重新加载吗? 有没有办法避免在模板助手中使用forEach循环?