express3手柄和18next节点-基于页面的国际化

express3-handlebars and 18next-node - internationalisation based on page?

本文关键字:于页面 国际化 节点 18next express3      更新时间:2024-05-25

我在这里的第一个问题-请放松。我使用express、express3手柄和带有node.js 的i18next节点

该计划是使用不同的翻译命名空间,具体取决于当前提供的视图(即哪个handlerbs文件)。因此,如果我们查看的是名为ie(.hbs)的页面,i18next将在名为ie(.json)的命名空间中查找相关语言。这使得翻译的组织和协调更加容易。

这就是我目前的工作方式:首先,我将当前页面发送到handlers模板中进行渲染(即使这样似乎也没有必要——handlers不会自动公开它正在渲染的文件?):

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

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

't'是在express3 handlebas 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"}}以获得相同的结果。在不覆盖核心把手功能的情况下,这可能吗?

这是i18下一个文档页面http://i18next.com/pages/doc_features.html

我已经回答了自己的问题——结果比我预期的要容易。

您可以在我的handlebars translate helper(duh?)中访问handlerbs实例,因此在helper:renderer = this(为了清晰起见)中,您可以只访问renderer.currentpage来获得所需命名空间的名称。请注意,您仍然需要在render函数中发送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" }}完美配合,无论在哪里使用,都能获得正确的命名空间。