Meteor 流星中的多语
我正在Meteor.js中开发一个多语言应用程序 我想知道你认为做这件事的最佳方式;举个例子,我现在正在做的是什么(很确定可以做得更好) 首先,我将项目保存在mongodb中,其属性在语言根目录中:Meteor 流星中的多语,meteor,multilingual,Meteor,Multilingual,我正在Meteor.js中开发一个多语言应用程序 我想知道你认为做这件事的最佳方式;举个例子,我现在正在做的是什么(很确定可以做得更好) 首先,我将项目保存在mongodb中,其属性在语言根目录中: { en: { name: "english name", content: "english content" }, it: { name: "italian name", content: "italian content"
{
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会话变量发布订阅:
Meteor.publish("elementsCurrentLang", function(currentLang) {
var projection = {
images: 1
};
projection[currentLang] = 1;
return Elements.find({}, projection);
});
我使用Iron Router waitOn hook订阅路线:
Router.route('/eng/elements', {
waitOn: function() {
return Meteor.subscribe("municipalitiesCurrentLang", Session.get('currentLang'));
},
action: function() {
this.layout('ApplicationLayout');
this.render('elements');
}
});
现在,第一个问题是:我想对每种语言重复使用相同的模板,但我不能简单地放入模板{{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;
}
});
现在在模板中,我可以访问所需的属性:
<h1>{{name}}</h1>
<p>{{content}}</p>
{{name}
{{content}}
在继续使用这种方法之前,我想听听大家的建议,因为我不知道这是否有效;当Session.currentLang将更改时,是否将重新加载订阅?
有没有办法避免模板帮助程序中的forEach循环?我也在开发一个多语言web应用程序,我建议您使用一个软件包,如下所示: 你可以反应性地改变语言。根据您的需要,为您的所有语言使用相同的模板! 您可以将其作为参数放入路由中。 Personnaly我将其用作会话变量并在用户配置文件中使用 如果你使用这个软件包,你还可以更容易地导出你的应用程序或其中的一部分,因为许多开发人员将使用相同的代码 您将所有单词都放在json文件中:
en.i18n.json:
{
"hello": "hello"
}
fr.i18n.json:
{
"hello": "bonjour"
}
及
将根据语言集编写hello或bonjour。您可以将其设置为:
TAPi18n.setLanguage(getUserLanguage())
//getUserLanguage() <- my function to get the current langage in the user profile or
the one used by the navigator
TAPi18n.setLanguage(getUserLanguage())
//getUserLanguage()此模块执行您所需的操作
正如开发人员所说:“扩展tap:i18n包以允许对集合进行翻译。”最后,有一个非常完整的包(它也适用于数字格式、区域设置……),并且经常更新
您也可以安装,以便与刀片一起使用
只需使用模式locale.i80n.json命名文件,其内容如下
{
name: "english name",
content: "english content"
}
然后用{{{{{uuu'name'}}
翻译字符串。是的,我已经在使用tap:i18n;问题是,在模板中转换固定字符串很有用;在这里,我试图了解如何从MongoDBI获取和呈现多语言内容。如果您推荐一个库/模块,通常会通过一个代码示例演示如何应用该库/模块。这个包似乎不再被托管,两年多没有提交。
{
name: "english name",
content: "english content"
}