流星中的多语言

Cer*_*ler 6 multilingual meteor

我正在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"
   }
}
Run Code Online (Sandbox Code Playgroud)

然后我使用currentLang会话变量发布订阅:

Meteor.publish("elementsCurrentLang", function(currentLang) {

    var projection = {
        images: 1
    };

    projection[currentLang] = 1;

    return Elements.find({}, projection);
});
Run Code Online (Sandbox Code Playgroud)

我使用Iron Router waitOn钩子在路线上订阅:

Router.route('/eng/elements', {
    waitOn: function() {
        return Meteor.subscribe("municipalitiesCurrentLang", Session.get('currentLang'));
    },
    action: function() {
        this.layout('ApplicationLayout');
        this.render('elements');
    } 
});
Run Code Online (Sandbox Code Playgroud)

现在第一个问题:我想为每种语言重用相同的模板,但我不能简单地放入模板{{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;
    }
});
Run Code Online (Sandbox Code Playgroud)

现在在模板中我可以访问想要的属性:

 <h1>{{name}}</h1>
 <p>{{content}}</p>
Run Code Online (Sandbox Code Playgroud)

在继续这种方法之前,我想听取建议,因为我不知道这是否会有效; 当Session.currentLang将改变时,订阅将被重新加载?有没有办法避免模板助手中的forEach循环?

ror*_*_57 4

我也在开发一个多语言 Web 应用程序,我建议您使用一个包,如下所示:https: //atmospherejs.com/tap/i18n

您可以被动地更改语言。根据您的需要,为您的所有语言提供相同的模板!您可以将其作为参数放入路线中。我个人将它用作会话变量并在用户配置文件中使用!

如果您使用此包,您还可以更轻松地导出应用程序或其一部分,因为许多开发人员将使用相同的代码。

您将所有单词放入 json 文件中:

en.i18n.json:
{
    "hello": "hello"
}
fr.i18n.json:
{
    "hello": "bonjour"
}
Run Code Online (Sandbox Code Playgroud)

{{_ "hello" }}
Run Code Online (Sandbox Code Playgroud)

将根据语言设置写出 hello 或 bonjour。您可以使用以下命令设置它:

TAPi18n.setLanguage(getUserLanguage())
//getUserLanguage() <- my function to get the current langage in the user profile or 
the one used by the navigator
Run Code Online (Sandbox Code Playgroud)