我正在Meteor.js开发一个多语言应用程序 我想知道你认为做这件事的最佳方式;作为例子,我现在正在做笏(很确定可以做得更好);使用铁路由器waitOn流星中的多语言
Meteor.publish("elementsCurrentLang", function(currentLang) {
var projection = {
images: 1
};
projection[currentLang] = 1;
return Elements.find({}, projection);
});
我订阅的路线:
首先,我保存在MongoDB中的项目与语言根neted性质:
{
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"
}
}
然后我用currentLang会话变量发布订阅挂钩:
Router.route('/eng/elements', {
waitOn: function() {
return Meteor.subscribe("municipalitiesCurrentLang", Session.get('currentLang'));
},
action: function() {
this.layout('ApplicationLayout');
this.render('elements');
}
});
现在第一个问题:我想reu对于每种语言都使用相同的模板,但由于订阅返回嵌套在lang根目录下的属性,因此我不能简单地放入{{name}}或{{content}}模板,因此需要执行{{ en.name}}为英文或{{it.name}}为意大利语; 为了避免这种情况,我使用了一个建立新对象的模板助手;本质上它会从郎根属性:
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;
}
});
现在在模板一样想我可以访问属性:
<h1>{{name}}</h1>
<p>{{content}}</p>
这种方法我要听的建议在继续之前,因为我不不知道这是否会奏效;当Session.currentLang会改变时,订阅将被重新加载? 有没有办法避免模板助手中的forEach循环?
是的我已经在使用tap:i18n;事情就是在模板中翻译固定字符串很有用;在这里我想了解如何从mongodb获取和呈现多语言内容 – 2014-12-05 21:19:58