Backbone和Handlebars的服务器端国际化

Dav*_*les 7 grails internationalization backbone.js handlebars.js

我正在开发一个Grails/Backbone/Handlebars应用程序,它是一个更大的遗留Java系统的前端,其中(出于历史和可定制性的原因)国际化消息深藏在隐藏在几个SOAP服务背后的数据库中隐藏在各种内部Java库之后.从Grails图层获取这些消息很简单,工作正常.

但我想知道的是如何将(例如)国际化标签放入我的Handlebars模板中.

现在,我正在使用GSP片段生成模板,包括一个获取我感兴趣的消息的自定义标记,例如:

<li><myTags:message msgKey="title"/> {{title}}</li>
Run Code Online (Sandbox Code Playgroud)

但是,出于性能和代码布局的原因,我希望摆脱GSP模板并将它们变成直接的HTML.我看了一下客户端国际化选项,比如i18n.js,但它们似乎依赖于我没有得到的消息文件的存在.(我可能会产生它,但它会是巨大且昂贵的.)

到目前为止,我能想到的最好的事情就是将标签楔入Backbone模型,所以我最终会得到像

<li>{{titleLabel}} {{title}}</li>
Run Code Online (Sandbox Code Playgroud)

然而,这真的远离了在一个漂亮干净的RESTful JSON API之上构建Backbone模型的理想 - RESTful服务返回的JSON混乱了表示数据(即本地化标签),或者我必须做额外的工作将标签注入Backbone模型 - 并且使用演示数据混乱Backbone模型似乎也是错误的.

我认为,就干净数据和干净的API而言,我想要做的是编写另一个RESTful服务,它接受消息键列表和类似消息,并返回包含所有本地化消息的JSON数据结构.但问题仍然存在:

  1. 指示(可能在模板中)给定视图需要哪些消息键的最佳方法是什么?
  2. 什么是正确的数据格式?
  3. 如何将本地化消息导入Backbone视图?
  4. 是否有任何现有的Javascript库可以提供帮助,或者我应该开始制作东西?
  5. 是否有更好/更标准的替代方法?

Ris*_*nha 2

我们使用http://i18next.com在 Backbone/Handlebars 应用程序中进行国际化。(还有 Require.js,它也通过插件加载和编译模板。)

i18next 可以配置为动态加载资源。它支持 gettext 格式的 JSON(支持复数和上下文变体)。他们的页面上有关如何加载远程资源的示例:

var option = { 
  resGetPath: 'resources.json?lng=__lng__&ns=__ns__',
  dynamicLoad: true 
};

i18n.init(option);
Run Code Online (Sandbox Code Playgroud)

(当然,您需要更多配置,例如设置语言、后备语言等。)

然后,您可以配置一个 Handlebars 助手,在提供的变量上调用 i18next(最简单的版本,没有复数,没有上下文):

// namespace: "translation" (default)
Handlebars.registerHelper('_', function (i18n_key) {
    i18n_key = Handlebars.compile(i18n_key)(this);
    var result = i18n.t(i18n_key);
    if (!result) {
        console.log("ERROR : Handlebars-Helpers : no translation result for " + i18n_key);
    }
    return new Handlebars.SafeString(result);
});
Run Code Online (Sandbox Code Playgroud)

在您的模板中,您可以提供一个扩展为键的动态变量:

<li>{{_ titleLabeli18nKey}} {{title}}</li>
Run Code Online (Sandbox Code Playgroud)

或者直接指定密钥:

<li>{{_ "page.fancy.title"}} {{title}}</li>
Run Code Online (Sandbox Code Playgroud)

对于日期时间的本地化,我们使用http://momentjs.com(转换为本地时间、格式化、翻译等)。