2014-12-05 5 views
5

Я разрабатываю многоязычное приложение в Meteor.js Хотелось бы узнать о наилучшем способе, по вашему мнению, сделать это; например, здесь ват, который я делаю прямо сейчас (довольно уверен, что это можно сделать лучше);Многоязычный в Метеор

Сначала я сохранить детали в 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 сеанса:

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

    var projection = { 
     images: 1 
    }; 

    projection[currentLang] = 1; 

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

подписаться на маршрут, используя железный маршрутизатор waitOn крюк:

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

Теперь первая проблема: я хотел бы reu по одному шаблону для каждого языка, но я не могу просто вставить шаблон {{name}} или {{content}}, так как подписка возвращает атрибуты, вложенные под корень lang, поэтому это необходимо сделать, например, {{ 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

Я developping в multilangage веб-приложение тоже, и я советую вам использовать пакет, как этот: https://atmospherejs.com/tap/i18n

Вы можете изменить реактивно языка сайта. Иметь тот же шаблон для всех ваших языков, как вы хотите! Вы можете указать его как параметр в маршруте. 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 
+0

Да, я уже использую кран: i18n: дело в том, что полезно переводить фиксированные строки в шаблоны, здесь я пытаюсь понять, как получить и отобразить многоязычное содержимое из mongodb –

2

Этот модуль делает то, что вы ищете

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

Как говорит разработчик: «Расширяет кран: i18n пакет, чтобы перевод коллекций."

+1

Если вы рекомендуете библиотеку/модуль обычно показывает, как его можно применять с примером кода. –

+0

Кажется, что этот пакет больше не поддерживается, более 2 лет без фиксации. –

Смежные вопросы