Zajmuję się tworzeniem wielojęzycznej aplikacji w Meteor.js Chciałbym wiedzieć o najlepszym sposobie, według Pana, aby to zrobić; na przykład tutaj jest wat robię teraz (całkiem pewni, że można zrobić lepiej);Wielojęzyczny w Meteoru
Najpierw zapisać produktów w MongoDB o właściwościach neted w korzeniu języka:
{
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"
}
}
Potem publikowania subskrypcję na sesji currentLang zmiennej:
Meteor.publish("elementsCurrentLang", function(currentLang) {
var projection = {
images: 1
};
projection[currentLang] = 1;
return Elements.find({}, projection);
});
subskrypcji na trasie za pomocą żelaznej Router waitOn hak:
Router.route('/eng/elements', {
waitOn: function() {
return Meteor.subscribe("municipalitiesCurrentLang", Session.get('currentLang'));
},
action: function() {
this.layout('ApplicationLayout');
this.render('elements');
}
});
Teraz pierwszy problem: chciałbym reu se ten sam szablon dla każdego języka, ale nie mogę po prostu wstawić szablonu {{name}} lub {{content}}, ponieważ subskrypcja zwraca atrybuty zagnieżdżone w katalogu głównym, więc trzeba to zrobić na przykład {{ en.name}} dla języka angielskiego lub {{it.name}} dla języka włoskiego; Aby tego uniknąć, używam szablonu pomocnika, który buiduje nowy obiekt; zasadniczo usuwa atrybuty z korzenia 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;
}
});
A teraz w szablonie można uzyskać dostęp atrybuty jak chcieliśmy:
<h1>{{name}}</h1>
<p>{{content}}</p>
Przed kontynuowaniem tej metody chcę słuchać o sugestie, bo don nie wiem, czy to zadziała dobrze; kiedy Session.currentLang zmieni się, subskrypcja zostanie przeładowana? jest sposób na uniknięcie pętli forEach w szablonach pomocników?
Tak, już używam kranu: i18n, rzecz jest przydatna do tłumaczenia stałych łańcuchów w szablonach, tutaj staram się zrozumieć, jak uzyskać i renderować wielojęzyczną zawartość z mongodb –