/book/list?lang=es
15 国际化
版本 6.2.0
15 国际化
Grails 通过利用底层的 Spring MVC 国际化支持开箱即用地支持国际化 (i18n)。利用 Grails,您可以根据用户的语言环境自定义在视图中显示的文本。引用 语言环境 类的 javadoc
语言环境对象表示特定的地理、政治或文化区域。需要语言环境才能执行其任务的操作称为语言环境敏感型操作,并使用语言环境根据用户情况定制信息。例如,显示数字是一个语言环境敏感型操作——应根据用户所在国家/地区或文化的习俗/惯例格式化数字。
15.1 了解消息包
现在您已经了解了语言环境,要在 Grails 中使用它们,您需要创建包含您想要呈现的不同语言的消息包文件。Grails 中的消息包位于 grails-app/i18n
目录中,是简单的 Java 属性文件。
根据惯例,每个包都以 messages
为名,并以语言环境结尾。Grails 随 grails-app/i18n
目录中的各种语言的多个消息包一同提供。例如
-
messages.properties
-
messages_da.properties
-
messages_de.properties
-
messages_es.properties
-
messages_fr.properties
-
…
除非用户已指定语言环境,否则 Grails 默认在 messages.properties
中查找消息。你只需创建一个以目标语言环境结尾的新属性文件,即可创建自己的消息包。例如,用于英式英语的 messages_en_GB.properties
。
15.2 更改语言环境
默认情况下,从传入的 Accept-Language
头检测用户语言环境。你只需将名为 lang
的参数作为请求参数传递给 Grails,即可为用户提供切换语言环境的功能
Grails 将自动切换用户的语言环境,后续请求将使用切换后的语言环境。
默认情况下,Grails 将 SessionLocaleResolver 用作 localeResolver
bean。
你可以轻松更改默认语言环境
import org.springframework.web.servlet.i18n.SessionLocaleResolver
beans = {
localeResolver(SessionLocaleResolver) {
defaultLocale= new Locale('es')
}
}
其他 localeResolver
可以使用。例如,你可以在 Cookie 中保存切换后的语言环境
import org.springframework.web.servlet.i18n.CookieLocaleResolver
beans = {
localeResolver(CookieLocaleResolver) {
defaultLocale= new Locale('es')
}
}
或修复语言环境
import org.springframework.web.servlet.i18n.FixedLocaleResolver
beans = {
localeResolver(FixedLocaleResolver, new Locale('de'))
}
15.3 读取消息
在视图中读取消息
在视图中需要消息的最常见情况。为此使用 message 标记
<g:message code="my.localized.content" />
只要你的 messages.properties
中有相应的键(附带适当的语言环境后缀),如下所示,那么 Grails 将查找该消息
my.localized.content=Hola, me llamo John. Hoy es domingo.
消息还可以包含参数,例如
<g:message code="my.localized.content" args="${ ['Juan', 'lunes'] }" />
消息声明指定了动态指定的位置参数
my.localized.content=Hola, me llamo {0}. Hoy es {1}.
使用 MessageSource 在 Grails 工件中读取消息
在 Grails 工件中,你可以注入 messageSource
,并使用方法 getMessage
(其参数为:消息代码、消息参数、默认消息和语言环境)来检索消息。
import org.springframework.context.MessageSource
import org.springframework.context.i18n.LocaleContextHolder
class MyappController {
MessageSource messageSource
def show() {
def msg = messageSource.getMessage('my.localized.content', ['Juan', 'lunes'] as Object[], 'Default Message', LocaleContextHolder.locale)
}
在 Controller 和标签库中使用 Message 标记读取消息
此外,你可以使用 Message 标记 在 Controller 和标签库中读取消息。然而,使用 message 标记依赖于 GSP 支持,而 Grails 应用程序并不一定拥有此支持;例如,一个 rest 应用程序。
在控制器中,你可以将标记调用为方法。
def show() {
def msg = message(code: "my.localized.content", args: ['Juan', 'lunes'])
}
def myTag = { attrs, body ->
def msg = g.message(code: "my.localized.content", args: ['Juan', 'lunes'])
}
15.4 脚手架和 i18n
Controller 和视图的 Grails 脚手架 模板完全支持 i18n。GSP 的标签、按钮等内容使用 message 标记,并且 Controller 的 flash
消息使用 i18n 来解析特定语言环境的消息。
脚手架包含特定于语言环境的领域类和领域字段标签。例如,如果你有一个包含 title
字段的 Book
领域类
class Book {
String title
}
脚手架将使用以下键的标签
book.label = Libro
book.title.label = Título del libro
您可以使用这个属性模板或自己想一个。将单词label
作为键的一部分没有特别之处,只是脚手架使用的惯例。