Meteor中的多语言支持

6

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

然后我使用当前语言会话变量发布一个订阅:
Meteor.publish("elementsCurrentLang", function(currentLang) {

    var projection = {
        images: 1
    };

    projection[currentLang] = 1;

    return Elements.find({}, projection);
});

我使用Iron Router的waitOn钩子订阅路由:
Router.route('/eng/elements', {
    waitOn: function() {
        return Meteor.subscribe("municipalitiesCurrentLang", Session.get('currentLang'));
    },
    action: function() {
        this.layout('ApplicationLayout');
        this.render('elements');
    } 
});

现在第一个问题是:我希望为每种语言重复使用相同的模板,但我不能简单地在模板中放置{{name}}或{{content}},因为订阅返回的属性嵌套在lang根下,所以需要为英语做{{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;
    }
});

现在我可以在模板中访问像wanted这样的属性:

 <h1>{{name}}</h1>
 <p>{{content}}</p>

在继续这种方法之前,我想听听建议,因为我不知道这是否会很好地运作;当Session.currentLang更改时,订阅将重新加载吗? 有没有办法避免在模板助手中使用forEach循环?
3个回答

4
我正在开发一款多语言的Web应用,并建议您使用类似于这个的软件包:https://atmospherejs.com/tap/i18n。您可以动态地更改语言,以任何您想要的方式拥有相同的模板。您可以将它作为路由中的参数或者像我一样将其作为会话变量和用户配置文件中的参数。如果您使用此软件包,当其他开发人员使用相同的代码时,您也可以更轻松地导出您的应用程序或部分内容。您可以将所有单词放入JSON文件中。
en.i18n.json:
{
    "hello": "hello"
}
fr.i18n.json:
{
    "hello": "bonjour"
}

and

{{_ "hello" }}

根据设置的语言,将写入“hello”或“bonjour”。 您可以使用以下方式进行设置:

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

是的,我已经在使用tap:i18n了;问题在于它对于翻译模板中的固定字符串非常有用;在这里,我正在尝试理解如何从mongodb获取和呈现多语言内容。 - Cereal Killer

3

2
如果您推荐一个库/模块,通常需要展示如何使用代码示例来应用它。 - Artjom B.
看起来这个软件包已经不再维护了,已经超过两年没有提交了。 - Hola Soy Edu Feliz Navidad

2

最后,有一个非常全面的软件包(它也能够处理数字格式、区域设置等),并且经常得到更新。

https://github.com/vazco/meteor-universe-i18n

您还可以安装https://atmospherejs.com/universe/i18n-blaze,以便在Blaze中使用它。

只需按照这个模式命名您的文件:locale.i80n.json,并添加如下内容:

{
  name: "english name",
  content: "english content"
}

然后使用{{__ 'name'}}来翻译你的字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接