express3-handlebars和18next-node – 基于页面的国际化?

我的第一个问题 – 请容易。 我使用express,express3-handlebars和i18next-node与node.js

该计划是根据哪个视图(即哪个句柄文件)当前正在服务于不同的翻译命名空间。 因此,如果我们查看名为ie(.hbs)的页面,则i18next将在名为ie(.json)的相关语言中查找。 这使得翻译的组织和协调更容易。

这就是我目前的做法:首先,我将当前页面发送到handlebars模板进行渲染(即使这似乎是不必要的 – handlebars不会自动暴露它渲染的文件):

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

然后我在当前页面的命名空间中访问要翻译的variables“greeting”,就像{{t "greeting" page=currentpage }} – 令人讨厌的是每个页面上有10个variables。 不要重复自己,有人吗?

't'是在express3-handlebars create()函数中定义的,如下所示helpers: { t: t }

翻译function看起来像这样

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

为了充分披露,这是我的(英文)名称空间文件为当前页面看起来像

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

这工作,但似乎应该有一个更简单的解决scheme。

我真正想要的只是能够{{t "greeting"}}input到句柄模板中,以达到相同的效果。 这是可能的,而不重写核心车把function?

这里是i18next文档页面http://i18next.com/pages/doc_features.html

我已经回答了我自己的问题 – 结果比我想象的要容易。

你可以在我的Handlebars translate helper(duh?)中访问handlebars实例,所以在助手: renderer = this (为了清楚起见),那么你可以访问renderer.currentpage来获取所需的名称空间的名称。 请注意,您仍然需要在渲染函数(在res.render() )上发送currentpage,但是我可以正确使用它。

我已经这样做了(现在可能非常慢,但是它的工作原理就是我想要的):

  // Set namespace for translation options.ns = options.ns || bestNamespaceFor( i18n_key ); result = i18n.t(i18n_key, options); return new hbs.handlebars.SafeString(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"; 

{{t "my translation key" }}完美地工作,并获得正确的命名空间,无论我在哪里使用它。

    Interesting Posts