我正在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