2014-12-05 9 views
5

Ich entwickle eine mehrsprachige App in Meteor.js Ich würde gerne über die beste Weise Ihrer Meinung nach, dies zu tun; Als Beispiel hier ist, was ich gerade mache (ziemlich sicher, dass das besser gemacht werden kann);Mehrsprachig in Meteor

Zuerst habe ich sparen Gegenstände in mongodb mit Eigenschaften in einer Sprache Wurzel 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" 
    } 
} 

Dann veröffentliche ich ein Abonnement currentLang Sitzung Variable:

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

    var projection = { 
     images: 1 
    }; 

    projection[currentLang] = 1; 

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

Ich abonniere auf der Strecke mit Eisen Router WaitOn haken:

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

Jetzt das erste Problem: Ich würde gerne reu Für jede Sprache die gleiche Vorlage verwenden, aber ich kann nicht einfach die Vorlage {{name}} oder {{content}} einfügen, da die Subskription die unter lang root geschachtelten Attribute zurückgibt, also z. B. {{ en.name}} für Englisch oder {{it.name}} für Italienisch; Um dies zu vermeiden, verwende ich einen Template-Helfer, der ein neues Objekt enthält; im Wesentlichen entfernen sie Attribute aus dem lang root:

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; 
    } 
}); 

Und jetzt in der Vorlage I Attribute zugreifen kann wie gewünscht:

<h1>{{name}}</h1> 
<p>{{content}}</p> 

Bevor Sie mit diesem Ansatz fort ich für Anregungen hören will, da ich don Ich weiß nicht, ob das gut funktionieren wird. Wenn sich Session.currentLang ändert, wird das Abonnement neu geladen. gibt es eine Möglichkeit, die ForEach-Schleife in Vorlagenhelfern zu vermeiden?

Antwort

4

Ich developping einen multilangage Web-App zu und ich rate Ihnen, ein Paket zu verwenden, wie diese: https://atmospherejs.com/tap/i18n

Sie die langage reaktiv ändern können. Haben Sie die gleiche Vorlage für alle Ihre Sprachen, wie Sie wollen! Sie können es als Parameter in der Route einfügen. Persönlich benutze ich es als Session-Variable und im Benutzerprofil!

Wenn Sie dieses Paket verwenden, können Sie Ihre App oder einen Teil davon auch einfacher exportieren, da viele Entwickler denselben Code verwenden.

Sie setzen alle Ihre Worte in json Dateien:

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

und

{{_ "hello" }} 

schreibt hallo oder bonjour abhängig von der langage-Set. Sie können es mit ein:

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

Ja ich benutze bereits tap: i18n; die Sache ist das ist nützlich, um feste Zeichenfolgen in Templates zu übersetzen; hier versuche ich zu verstehen, wie man mehrsprachige Inhalte von mongodb bekommt und rendert –

2

Dieses Modul macht, was Sie suchen

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

Wie der Entwickler sagt: „Erweitert den Hahn: i18n Paket Übersetzung von Sammlungen zu ermöglichen."

+1

Wenn Sie eine Bibliothek empfehlen/Modul Es ist üblich zu zeigen, wie es mit einem Codebeispiel angewendet werden kann –

+0

Es scheint, dass dieses Paket nicht mehr länger als 2 Jahre ohne Commit gehalten wird. –