La localisation de modèles à l'aide de require.js, de la colonne vertébrale et le trait de soulignement
Cette question porte sur la création de modèles et de localiser, à l'aide de require.js et de souligner des modèles par le biais de backbone.js. L'application devra être localisée à la volée.
Avant de se lancer dans une voie qui plus tard s'est avéré problématique, est-il une meilleure solution que celle que je suis en train d'étudier - je suis préoccupé par la vitesse et de la mémoire à plusieurs reprises avec la fusion et de traitement de la langue matrice. Supposons que sont les 2-3 mille chaînes de langue.
Approche actuelle (qui fonctionne, mais il semble processeur lourd):
- À l'aide de la I18N regroupement approche, créer de la langue "comprend" qui contiennent essentiellement de la traduction des éléments pour tous les modèles
- De fusion de cet objet/tableau d'éléments avec les attributs de modèle (à partir de la colonne vertébrale), et de passer à la fusion de beaucoup dans le trait de soulignement modèle
.
define(['backbone', 'models/model', 'text!template.html', 'i18n!my/nls/translatedbits'],
function(Backbone, MyModel, TemplateText, TranslationObject) {
var View = Backbone.View.extend({
model: {},
initialize : function(params) {
this.model = new MyModel();
},
render : function(callBack) {
//Get the model attributes
var templateParams = _.clone(this.model.attributes);
//Bolt on the tranlsated elements (established from require.js I18N plugin)
templateParams.t = TranslationObject;
//Pass the lot ot the template
var template = _.template(TemplateText, this.model.attributes);
$(this.el).html( template );
return this;
}
});
return View;
}
);
Ensuite, le modèle permettra de lire
<%= modelAttribute1 %> <%= t.translationString1 %>
Est-il une meilleure solution ou d'un meilleur moteur de template? [Mieux pour ce but - moustache peut avoir d'autres avantages, mais peut-on localiser plus facilement, ou peut-on le cache localisée résultats permettant attributs de modèle à être passé au plus tard?]
Remarque que les langues devrez peut-être modifier "à la volée" - et c'est un autre souci que j'ai avec le plugin I18N. J'ai peut-fin de compte les opérations en JSON demande par le biais d'un modèle, mais il faut quand même une fusion des objets, qui est ce que j'essaie d'éviter.
merci. Il existe deux méthodes que j'ai vu le long de ces lignes. On obtient un peu délicate avec l'exigent, mais je considère que la création d'un modèle, puis le chargement de chacun en cas de besoin (par le biais de besoin), pré-analyse et mise en cache etc et puis rappelant le modèle de la le modèle dans la vue(s). Une autre option est de pré-compilation côté serveur (php ou node.js) et de rappeler le modèle par le biais de JSON, mais encore besoin que la mise en cache du modèle dans le milieu. Mais je pense que il doit y avoir une meilleure façon standard? Sauf si ce sont les seules options? Merci pour la suggestion.
OriginalL'auteur Robbie | 2012-10-10
Vous devez vous connecter pour publier un commentaire.
Voici ce que je suis en train de faire (il suffit d'ouvrir-source, puisqu'il semble utile à d'autres)
underi18n est très minime lib pour faire i18n sur les modèles et le code.
Il fournit:
gettext
catalogues au format json.Il ne pas traiter avec la pluralisation.
Du README:
Catalogues
under18n
utilise un simple format JSON pour les catalogues, suivant la normegettext
format. Dans l'exemple suivant,nous avons deux chaînes de traduction, la seconde avec deux variables,
role
etcontext
.Un simple script python est fourni pour vous aider à convertir standard
.mo
fichiers à ce format JSON.Utilisation
Créer un MessageFactory à partir d'un json i18n catalogue:
Vous pouvez maintenant traduire en ligne:
Modèles
Généralement des variables dans les modèles sont indiqués avec certains délimiteur. Dans la moustache par exemple
{{ var }}
est utilisé alors que<%= var %>
est par défaut pour le trait de soulignement. Nous utilisons la même approche pour indiquer des chaînes traduisibles. Vous pouvez spécifier les délimiteurs de chaînes traduisibles comme une expression rationnelle, ainsi que gauche/droite délimiteurs utilisés par votre modèle de langue de choix dansunder18n.templateSettings
. Par défaut, c'est à la suite de soulignement conventions:donc,
<%_ i18n %>
sont définies pour désigner des chaînes traduisibles et<%= var %>
est utilisé pour désigner les variables à l'intérieur d'un modèle.Vous pouvez traduire un modèle en appelant
under18n.template
, par exemple à l'aide de soulignement, vous pouvez le faireExemple
Donné les catalogues suivants, les usines et le modèle pour l'anglais et le grec et en supposant un trait de soulignement modèle,
le modèle peut par construit par,
donnerait
AMD chargement
under18n sera enregistré comme un anonyme, un module si vous utilisez requireJS.
J'espère que cela résout votre problème, laissez-moi savoir si ce n', j'avais l'intention de le sortir à un certain stade, mais bon mieux vaut tard que jamais 😉
Merci!!!! Les commentaires plus que la bienvenue, cela a été en production pendant un moment et de se comporter ainsi. Notez que vous pouvez si vous le souhaitez compiler sur le serveur!
cela ressemble à une recherche et remplacer la fonction, à l'aide de cordes (objets) qui sont "à la main". Nous pouvons tirer de ces chaînes/ objet via exige I18N faisceaux, mais il a toujours l'air d'avoir les mêmes inconvénients que la simple exécution à travers soulignent - pas de mise en cache et beaucoup de grands objets à plusieurs reprises analysée? Ou ai-je raté quelque chose (désolé si je l'ai!)? Merci.
La façon dont je l'éviter complètement à côté client, le calcul est de préparer l'i18n-isée modèle sur le serveur! Si votre client a juste des charges localisées modèle prêt. De cette façon, il n'y a pas d'analyse syntaxique et pas d'objets de grande taille, en fait, vous n'avez même pas besoin underi18n plus.
C'est en quelque sorte là où mes pensées étaient les meilleurs de moi. Ne pas résoudre les problèmes les problèmes. Merci pour la réponse, cependant.
OriginalL'auteur ggozad
Pour l'exhaustivité, la solution que nous avons trouvé qui se sentait de plus a été optimisé:
Lorsqu'un modèle a été demandée au serveur, un cookie déterminé la langue et le bon modèle a été livré.
PHP back-end de pré-analyser les modèles; ils ont ensuite été stockés dans memcached dans la langue correcte
Le modèle de langue, à leur demande, a ensuite été mis en cache par le navigateur interne et une dorsale modèle de sorte qu'il puisse rapidement être ré-utilisé par JavaScript.
Raisons:
OriginalL'auteur Robbie