Grails中,通过判断浏览器中的语言设置,可以自动实现后台消息的国际化;此外,通过扩展配置 bropen.toolkit.i18n.supported,还可以锁定语言。
但是对于前台 JavaScript 的国际化,Grails并未提供原生的支持,但是通过 resource 插件,在 BroFramework 中实现了 js 的国际化。
js 国际化的开发过程如下。
- 在应用或插件的 grails-app/assets/javascripts 文件夹下创建一个 i18n 的文件夹,此文件夹中可以创建相应的语言定义文件,文件名格式同 grails-app/i18n 下的 properties 文件,只是扩展名为 .js,如 “BroFramework_zh_CN.js”;
- 系统启动时,根据 BroFramework 下的 i18n_xx_XX.js,以插件依赖关系顺序搜索所有 js/i18n 文件夹下的语言定义文件,并将他们按照语言(即文件名后缀)组合成不同的 js 资源包,如 “i18n_zh_CN.js”;
- 视图模板(或者未引用视图模板的视图,如index.gsp)中,在 head 加上标签 <bro:scriptI18n />,将自动解析浏览器语言设置,并加载对应的 js 资源包;
- 在javascript中,通过调用 m(code) 即可获得 code 对应的国际化文本。
上面的步骤中,语言定义文件的格式如下例所示:
m.merge({
"jqui.dalog.button" : {
"SUBMIT": "提交",
"OK": "确定",
"CLOSE": "关闭",
"CANCEl": "取消"
},
"default.not.unique.message": "【{1}】 的属性 【{0}】 的值 【{2}】 必须是唯一的"
});
- 可以直接定义一个code,并定义其文本,如 “default.not.unique.message”
- 或者定义一个父集合,然后定义子集,如在 “jqui.dialog.button” 下定义了 “SUBMIT” 四个子集,等同于定义了 “jqui.dialog.button.SUBMIT” 等四个code
- 文本中可以包含参数 {N},其中 N 为数字,表示第 N 个参数(从0开始)
此外,获得国际化文本 m 方法,支持下面的几种调用方式:
- m(code):只有参数 code
- m(code, default):其中 default 必须为字符串,即默认的文本
- m(code, args):其中 args 为数组,表示参数
- m(code, args, default):上面两种调用方式的组合
如:m("jqui.dalog.button.CLOSE", "Close")