但我想知道的是如何将(例如)国际化标签放入我的Handlebars模板中.
现在,我正在使用GSP片段生成模板,包括一个获取我感兴趣的消息的自定义标记,例如:
<li><myTags:message msgKey="title"/> {{title}}</li>
但是,出于性能和代码布局的原因,我希望摆脱GSP模板并将它们变成直接的HTML.我看了一下客户端国际化选项,如i18n.js,但它们似乎依赖于我没有得到的消息文件的存在. (我可能会产生它,但它会是巨大且昂贵的.)
到目前为止,我能想到的最好的事情是将标签楔入Backbone模型中,所以我最终会得到像
<li>{{titleLabel}} {{title}}</li>
然而,这真的远离了在一个漂亮干净的RESTful JSON API之上构建Backbone模型的理想 – RESTful服务返回的JSON与表示数据混合(即本地化标签),或者我必须做额外的工作将标签注入Backbone模型 – 并且使用演示数据混乱Backbone模型似乎也是错误的.
我认为,在干净数据和干净的API方面,我想做的是编写另一个RESTful服务,它接受消息键列表和类似消息,并返回包含所有本地化消息的JSON数据结构.但问题仍然存在:
>指示(可能在模板中)给定视图需要哪些消息键的最佳方法是什么?
>什么是正确的数据格式?
>如何将本地化消息导入Backbone视图?
>是否有任何现有的Javascript库可以提供帮助,或者我应该开始制作东西?
>有更好/更标准的替代方法吗?
解决方法
i18next可以配置为动态加载资源.它支持gettext格式的JSON(支持复数和上下文变体).
有关如何加载远程资源的页面示例:
var option = { resGetPath: 'resources.json?lng=__lng__&ns=__ns__',dynamicLoad: true }; i18n.init(option);
(您当然需要更多配置,如设置语言,后备语言等)
然后,您可以配置在提供的变量上调用i18next的Handlebars助手(最简单的版本,无复数,无上下文):
// 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); });
在模板中,您可以提供扩展为键的动态变量:
<li>{{_ titleLabeli18nKey}} {{title}}</li>
或直接指定密钥:
<li>{{_ "page.fancy.title"}} {{title}}</li>
对于日期时间的本地化,我们使用http://momentjs.com(转换为本地时间,格式,翻译等).