欢迎进入Wiki » FAQ » 如何开发多国语言应用(国际化支持)?

如何开发多国语言应用(国际化支持)?

在2014-08-05 09:06上被李小翔修改
评论 (0) · 附件 (0) · 记录 · 信息

考虑下面的需求:

  1. 开发一个支持多国语言的应用,需支持中文(zh_CN)和英文(en_US)两种语言
  2. 默认情况下,根据浏览器的语言配置,显示相应的文本,包括 javascript 提示信息
  3. 如果浏览器配置为 zh 开头的中文系语言(如 zh_TW),则显示中文(zh_CN),其他语言都显示为英文
  4. 中文为默认语言,对于 en_US 中未定义的文本,则显示为中文
  5. 用户可以通过个性设置配置自己的首选语言

Grails 虽然提供了通用的国际化解决方案,但是对于上述需求完全无法满足,因此,我们在 BroToolkit/BroFWK 中对其进行了扩展和改造,以满足上述需求。

国际化配置

在应用 Config.groovy 中可以配置系统支持的语言和语言映射关系,按照上面的需求,配置如下:

/** 系统支持的i18n语言 */
bropen.toolkit.i18n.supported = ["zh_CN", "en_US"]

/** 语言不在上面列表中时的映射关系 */
bropen.toolkit.i18n.mapping = ["zh_CN": ["zh*"], "en_US":["*"]]

解释如下:

  • i18n.supported:
    • 配置可支持的语言列表,默认为 ["zh_CN"];
    • 根据需求1,这里添加 en_US;
    • 考虑需求4,将 zh_CN 设置为第一条作为默认语言
  • i18n.mapping:
    • 配置语言的映射关系,默认为空 [:];
    • 根据需求3,配置以 zh 为前缀的所有语言都映射到 zh_CN,其他语言都映射到 en_US
      注意这里的通配符 * 仅支持作为语言后缀。

为了加深理解,再举例如下:

  • 应用支持英文、中文两种语言,但是英文为系统默认语言
  • 所有 zh 为前缀的语言都映射到 zh_CN 上,而其他语言都采用默认语言 en_US
/** 系统支持的i18n语言 */
bropen.toolkit.i18n.supported = ["en_US", "zh_CN"]

/** 语言不在上面列表中时的映射关系 */
bropen.toolkit.i18n.mapping = ["zh_CN": ["zh*"]]

语言文件定义

语言文件包括 grails-app/i18n/*.properties 文件,以及 grails-app/assets/javascript/i18n/*.js 文件,前者用于后台API、视图标签标签调用(参考Internationalization),后者用于 javascript API 调用(参考JavaScript的国际化支持)。

个性设置

用户个性设置 fwk.locale (即常量 bropen.framework.Constants.UP_LOCALE)可以用来设置个人的首选语言,在个性配置视图 _editProfile_broFramework.gsp 中定义了设置界面。

<g:select class="up-locale" name="profiles.${Constants.UP_LOCALE}" from="${GrailsUtils.getConfig('bropen.toolkit.i18n.supported')}" value="${profiles[Constants.UP_LOCALE]}" />
<script>$j(".up-locale option:first").val('')</script>

国际化API

Grails 提供了一系列 API 来获得 properties 文件中定义的文本,如常用的 message 标签(视图、控制器中都可以用),以及预定义的 spring bean messageSource。

除此以外,我们还提供了几个工具 API 来计算当前语言和获取多语言文本,详细请参考API手册:

  • GrailsUtils.message( String code, List args = null, String defaultMsg = "" ):同 Grails 的 message API,但可以在任何地方调用
  • GrailsUtils.errorMessages( Object bean ):将 bean.errors 中的错误对象转换成错误消息列表
  • GrailsUtils.messageLang( String lang ):计算当前使用的国际化语言
  • GrailsUtils.messageLocale( String lang )

在 JavaScript 的国际化支持中,我们除了提供 API m 来获得 js 文件中定义的文本外,还可以通过 page.lang 和 page.country 获得当前语言,如 { lang: "zh", country:"CN" }。

其他资料

更多关于 BroToolkit/BroFWK 中的国际化支持和问题,可以点击下面标签的“国际化”。

在2014-08-05 09:05上被李小翔创建

Copyright © 2013 北京博瑞开源软件有限公司
京ICP备12048974号