express3-guidon et 18next-node – internationalisation basée sur la page?

ma première question ici – allez-y doucement. J’utilise express, express3-handlebars et i18next-node avec node.js

Le plan consiste à utiliser un espace de noms de traduction différent en fonction de la vue (c’est-à-dire du fichier de guidon) en cours de diffusion. Donc, si nous regardons la page appelée ie (.hbs), i18next regardera dans l’espace de nommage nommé ie (.json) pour le langage approprié. Cela facilite l’organisation et la coordination des traductions.

Voici comment je le fais actuellement: d’abord, j’envoie la page en cours dans le modèle de guidon pour le rendu (même si cela semble inutile: le guidon n’expose pas automatiquement le fichier qu’il rend?):

res.render( url_base_path, { layout: ("sub"), title: title, currentpage: url_base_path } );

et puis j’accède à la variable “salutation” à traduire dans l’espace de noms de la page en cours, de la même manière que {{t "greeting" page=currentpage }} ; Ne te répète pas, n’importe qui?

‘t’ est défini dans la fonction create () de express3-handlebars, ainsi, helpers: { t: t }

et la fonction de traduction ressemble à ceci

 var t = function (i18next_key, options) { var page, result; page = options.hash.page; result = i18next.t(page + ":" + i18next_key); return new hbs.handlebars.SafeSsortingng(result); }; 

par souci de divulgation complète, voici à quoi ressemble mon fichier (anglais) d’espace de noms pour la page en cours

 { "greeting": "Hello, it appears you're using Internet Explorer, an outdated web browser." } 

cela fonctionne, mais il semble qu’il devrait y avoir une solution beaucoup plus simple.

Ce que je veux vraiment, c’est pouvoir taper simplement {{t "greeting"}} dans le modèle de guidon pour obtenir le même résultat. est-ce possible sans surcharger les fonctionnalités du guidon principal?

voici la page de documentation i18next http://i18next.com/pages/doc_features.html

J’ai répondu à ma propre question – il s’est avéré plus facile que prévu.

Vous pouvez accéder à l’occurrence du guidon dans mon assistant de traduction du guidon (duh?), Donc dans l’aide: renderer = this (pour la clarté), vous pouvez simplement accéder à renderer.currentpage pour obtenir le nom de l’espace de nom requirejs. Notez que vous devez toujours envoyer currentpage dans la fonction de rendu (sur res.render() ), mais ça ne me dérange pas.

Je l’ai fait comme ça (c’est probablement assez lent comme ça pour le moment, mais ça marche exactement comme je le veux):

  // Set namespace for translation options.ns = options.ns || bestNamespaceFor( i18n_key ); result = i18n.t(i18n_key, options); return new hbs.handlebars.SafeSsortingng(result); function bestNamespaceFor( i18n_key ){ if ( i18n.exists(i18n_key, { ns: renderer.currentpage }) ) return renderer.currentpage; if ( i18n.exists(i18n_key, { ns: renderer.layout }) ) return renderer.layout; if ( i18n.exists(i18n_key, { ns: "common" }) ) return "common"; 

Fonctionne parfaitement avec {{t "my translation key" }} et obtient le bon espace de noms, peu importe où je l’utilise.