Я разрабатываю многоязычное приложение в 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 в шаблонных помощниках?
Да, я уже использую кран: i18n: дело в том, что полезно переводить фиксированные строки в шаблоны, здесь я пытаюсь понять, как получить и отобразить многоязычное содержимое из mongodb –