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数据结构.但问题仍然存在:
我们使用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(转换为本地时间、格式化、翻译等)。