通过潜在支持Spring MVC国际化标准,Grails支持国际化标准(i18n)开箱即用。在Grails中,你能够根据用户属地定制该地区语言的文字。引用Java语言中的 Locale 文档定义:
Locale 对象描述了特定的地理、政治和文化地区。需要 Locale来执行其任务的操作称为本地化操作,它使用 Locale为用户量身定制信息。例如,显示一个数值就是本地化操作,应该根据用户本国家、地区或文化的风俗/传统来格式化该数值。
一个Locale对象由language code和country code组成。比如,en_US是美国英语的代码,而en_GB是英国英语的代码。
现在你知道了本地化,为了在Grails中使用它们,你不得不创建你想显示的不同语言信息资源。Grails中的信息资源以简单的java属性文件格式放置在grails-app/i18n目录下。
每个资源束根据规则,以messages名字开始和locale结束。Grails在grails-app/i18n下
发布了一串不同语言范围内的内置信息,例如:
messages.properties messages_de.properties messages_es.properties etc.
默认情况Grails会在messages.properties文件中检索信息,除非用户已经指定了一个自定义本地化文件。通过创建一个新的以 locale标签结尾的属性文件,你可以创建你感兴趣的属于自己的信息资源。比如属于英式英语范畴的 messages_en_GB.properties。
默认情况用户地区从传进来的 Accept-Language头部得知。然而
通过简单得给Grails传进lang参数作为请求参数,用户就可以更改地区了:
/book/list?lang=es
Grails 会自动更改用户地区,并把这个值存放在cookie里,随后的各种请求会有个新的头部。
你 通常最需要信息的地方是在视图内。要在视图内读取信息,使用message标签就可以了,如下:
<g:message code="my.localized.content" />
只要你在带有合适locale后缀的messages.properties文件有个key键,比如下面这种格式,Grails就会找到相对应的信息:
my.localized.content=Hola, Me llamo John. Hoy es domingo.
注 意有时候你需要向相应的信息传递参数。参考下面这个message标签:
<g:message code="my.localized.content" args="${ ['Juan', 'lunes'] }" />
还有可能在信息中使用定位参数:
my.localized.content=Hola, Me llamo {0}. Hoy es {1}.
因为你可以在controllers中像方法一样使用标签,所以在controllers中读取信息也很经常,如下:
def show = {
def msg = message(code:"my.localized.content", args:['Juan', 'lunes'])
}
tag libraries中使用的方法一样,但是注意如果你的标签库使用了不同的namespace,你需要使用g.前缀:
def myTag = { attrs, body ->
def msg = g.message(code:"my.localized.content", args:['Juan', 'lunes'])
}
Grails 没有发布可以生成控制器和视图的i18n特性脚手架模板。然而i18n模板插件可以提供i18n特性脚手架模板,这些模板与默认的脚手架模板一样,除了它们为标签,按钮等定义信息时使用message标签外。
首先用下面的这个命令安装i18n模板:
grails install-plugin i18n-templates
参考reference on the wiki,它里面了解释怎么使用i18n模板。