微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

grails – Backbone和Handlebars的服务器端国际化

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

但我想知道的是如何将(例如)国际化标签放入我的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库可以提供帮助,或者我应该开始制作东西?
>有更好/更标准的替代方法吗?

解决方法

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

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(转换为本地时间,格式,翻译等).

原文地址:https://www.jb51.cc/js/158245.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐