2014-12-05 58 views
5

我正在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循环?

回答

4

我一个深化发展的网络multilangage应用也是一样,我建议你使用一个包,像这样的:https://atmospherejs.com/tap/i18n

可以被动地改变langage。根据需要为您的所有语言配备相同的模板! 您可以将其作为路线中的参数。 Personnaly我使用它作为会话变量和用户配置文件!

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

你把你的JSON文件中的所有单词:

en.i18n.json: 
{ 
    "hello": "hello" 
} 
fr.i18n.json: 
{ 
    "hello": "bonjour" 
} 

{{_ "hello" }} 

会写个招呼或Bonjour取决于langage一套。你可以将其设置:

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

是的我已经在使用tap:i18n;事情就是在模板中翻译固定字符串很有用;在这里我想了解如何从mongodb获取和呈现多语言内容 – 2014-12-05 21:19:58

2

这个模块做了你在找什么

https://github.com/TAPevents/tap-i18n-db

由于开发人员表示:“扩展水龙头:国际化软件包,让藏品的翻译。“

+1

如果您推荐库/模块通常会显示如何将其应用于代码示例。 – 2015-06-09 08:09:02

+0

看来,该软件包已不再被使用,超过2年没有提交。 – 2017-06-10 10:24:37