2014-12-05 9 views
5

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?

Odpowiedz

4

jestem rozwijająca aplikację internetową zbyt multilangage i Radzę użyć pakietu, jak ten: https://atmospherejs.com/tap/i18n

Można zmienić langage reaktywnie. Miej ten sam szablon dla wszystkich twoich bibliotek, jak chcesz! Możesz umieścić go jako parametr na trasie. Personalia Używam go jako zmiennej sesji i profilu użytkownika!

Jeśli korzystasz z tego pakietu, możesz również wyeksportować swoją aplikację lub jej część, łatwiej, ponieważ wielu programistów użyje tego samego kodu.

umieścić wszystkie swoje słowa w plikach json:

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

i

{{_ "hello" }} 

napisze cześć lub bonjour zależności od zestawu langage. Można ustawić go z:

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

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 –

2

modułu to robi co szukasz

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

Jako deweloper mówi: „Przedłuża kranu: pakiet i18n aby umożliwić tłumaczenie zbiorów."

+1

Jeśli polecisz bibliotekę/moduł zwyczajowo pokazuje, jak można go zastosować z przykładem kodu. –

+0

Wygląda na to, że ten pakiet nie jest już dłużej przechowywany, dłużej niż 2 lata bez zatwierdzenia. –

Powiązane problemy