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

时间:2013-12-10 11:06:16

标签: javascript node.js express internationalization handlebars.js

我的第一个问题 - 请放轻松。我正在使用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

1 个答案:

答案 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" }}完美配合,无论我在何处使用它,都能获得正确的命名空间。