2014-12-05 60 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