Meteor 流星中的多语

Meteor 流星中的多语,meteor,multilingual,Meteor,Multilingual,我正在Meteor.js中开发一个多语言应用程序 我想知道你认为做这件事的最佳方式;举个例子,我现在正在做的是什么(很确定可以做得更好) 首先,我将项目保存在mongodb中,其属性在语言根目录中: { en: { name: "english name", content: "english content" }, it: { name: "italian name", content: "italian content"

我正在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"
   }
}
然后,我使用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"
}