我的第一个问题 - 请放轻松。我正在使用express,express3-handlebars和带有node.js的i18next-node
计划是使用不同的翻译命名空间,具体取决于当前正在提供哪个视图(即哪个句柄文件)。因此,如果我们查看名为ie(.hbs)的页面,i18next将查找名为ie(.json)的名称空间中的相关语言。这使得翻译的组织和协调更容易。
这就是我目前正在做的事情:首先我将当前页面发送到把手模板进行渲染(即使这似乎没必要 - 把手不会自动显示它正在渲染哪个文件?):
res.render( url_base_path, { layout: ("sub"), title: title, currentpage: url_base_path } );
然后我访问变量“greeting”以在当前页面的命名空间中进行翻译,如{{t "greeting" page=currentpage }}
- 令人讨厌的是每页上有10个这些变量。不要重复自己,任何人?
't'在express3-handlebars create()函数中定义,如此helpers: { t: t }
,翻译功能如下所示
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."
}
这有效,但似乎应该有一个更简单的解决方案。
我真正想要的是能够在把手模板中输入{{t "greeting"}}
来获得相同的结果。这是否可能没有覆盖核心车把功能?
这是i18next文档页面 http://i18next.com/pages/doc_features.html
答案 0 :(得分:0)
我已回答了我自己的问题 - 结果比我想象的要容易。
你可以在我的Handlebars翻译助手(duh?)中访问把手实例,所以在助手:renderer = this
(为了清楚起见),然后你可以访问renderer.currentpage
来获取名称必需命名空间注意,你仍然需要在渲染功能中发送当前页面(在res.render()
上),但我对它的那一面很好。
我已经这样做了(目前它可能很慢,但它的确如此符合我的要求):
// 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" }}
完美配合,无论我在何处使用它,都能获得正确的命名空间。