(快速参考)

15 国际化

版本 6.2.0

15 国际化

Grails 通过利用底层的 Spring MVC 国际化支持开箱即用地支持国际化 (i18n)。利用 Grails,您可以根据用户的语言环境自定义在视图中显示的文本。引用 语言环境 类的 javadoc

语言环境对象表示特定的地理、政治或文化区域。需要语言环境才能执行其任务的操作称为语言环境敏感型操作,并使用语言环境根据用户情况定制信息。例如,显示数字是一个语言环境敏感型操作——应根据用户所在国家/地区或文化的习俗/惯例格式化数字。

语言环境由 语言代码国家/地区代码 组成。例如,“en_US”是美国英语的代码,而“en_GB”是英国英语的代码。

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,即可为用户提供切换语言环境的功能

/book/list?lang=es

Grails 将自动切换用户的语言环境,后续请求将使用切换后的语言环境。

默认情况下,Grails 将 SessionLocaleResolver 用作 localeResolver bean。

你可以轻松更改默认语言环境

grails-app/conf/spring/resources.groovy
import org.springframework.web.servlet.i18n.SessionLocaleResolver

beans = {
    localeResolver(SessionLocaleResolver) {
        defaultLocale= new Locale('es')
    }
}

其他 localeResolver 可以使用。例如,你可以在 Cookie 中保存切换后的语言环境

grails-app/conf/spring/resources.groovy
import org.springframework.web.servlet.i18n.CookieLocaleResolver

beans = {
    localeResolver(CookieLocaleResolver) {
        defaultLocale= new Locale('es')
    }
}

或修复语言环境

grails-app/conf/spring/resources.groovy
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'])
}

该技术也可以用于 标签库,但如果你的标签库使用一个自定义 命名空间,则你必须使用 g. 在前面添加调用前缀。

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作为键的一部分没有特别之处,只是脚手架使用的惯例。