国际化 (I18N)意思是允许你的应用程序适用于不同的语言环境。参数下列步骤 实现国际化。
12.1. 仅使用 UTF-8!
Play 只支持一种编码:UTF-8。因为编码会导致一些古怪的问题,因此我们选择 只支持一种编码。UTF-8 允许显示所有的语言的所有字符。
请确定在你的应用程序里始终使用的是 UTF-8:
- 源文件编辑用的是 UTF-8
- 在 HTTP 里定义了合适的编码 headers
- HTML meta 标签设置的是 UTF-8
- 数据库使用的也是 UTF-8 而且总是使用 UTF-8 进行连接
注意!
UTF-8编码是导致许多play配置文件、 java属性文件都不能命名为*.properties 的原因。Java 强制要求属性文件必须是 ISO-8859-1 编码,而 Play 配置文件必 须是 UTF-8 编码,还需要作更多解释吗?
12.2. 国际化你的信息
为了支持 I18N,你必须国际化你的所有信息。
在 conf/目录创建一个名叫 messages 的文件,这个文件是一个真正的 java 属性 文件。
hello=Hello!
back=Back
然后就可以为每种语言定义明确的 message 文件, 只需要为文件名加上 ISO 语言 代码文件后缀。
比如法语为 conf/messages.fr,中文为 zh,英语为 en:
hello=Bonjour!
back=Retour
12.3. 通过应用程序定义支持的语言
在 application.langs configuration 里定义支持的语言列表。
新用户第一次进行请求时, play 会猜测默认使用的语言。 它主要是通过解析 HTTP Accept-language header 来实现的。 然后把猜出的语言存储到 PLAY_LANG cookie 里,以方便用户的再次访问。
也可使用 language/country 进行区别,比如 en_US、en_GB,或 zh_CN 和 zh_TW。
然而应该知道某些用户暴露的语言并不是他能接受的语言,因此,我们应该提供 国际通用的语言(比如 en)。
比如, 如果许多用户来自 US, 但你又想支持 British English, 推荐使用 “en” 来代表 US English,使用 “en_GB”来代表 British English。
在应用程序代码里,可以为用户访问的 play.i18n.Lang 对象找回当前语言。
String lang = Lang.get();
如果你打算永久改变用户语言,请使用 change()方法:
Lang.change("ja");
新值将回存给用户的语言 cookie。
12.4. 依照你的区域定义日期格式
配置 date.format 以指定默认使用的日期格式。
12.5. 找回区域信息
Message arguments
在代码里,可以找回在 message 文件里定义的消息,对 java 来说,使用的是 play.i18n.Messages 对象。
public static void hello() {
renderText(Messages.get("hello"));
}
通过标准的 java.util.Formatter ‘格式化字符串语法’可以支持消息格式化。
也可在 messages 里定义动态的内容:
hello=Hello %s!
%s 将输出一个字符串。Message 参数是通过给 Messages.get 附加(变量)参数 来提供的:
public static void hello(String user) {
renderText(Messages.get("hello", user));
}
模板输出
在模板里可以使用特定的&{„}语法来显示本地化 messages:
<h1>&{'hello'}</h1>
或在消息参数里使用动态:
<h1>&{'hello', params.user}</h1>
多参数
可以定义多个消息参数,比如下面的消息引用了两个十进制参数:
guess=Please pick a number between %d and %d
在显示消息参数时依照正确的顺序进行显示:
<p>&{'guess', low, high}</p>
立即数 Argument indices
为了用于不同的顺序, 也可为消息指定明确的参数。 比如, 假定下面有两个参数:
guess.characteristic=Guess %s’s %s.
消息输出如下:
<p>&{'guess.characteristic', person.name, 'age'}</p>
法国区域的有两个相反顺序的消息,因此在法国区域里,我们指定了立即参数:
guess.characteristic=Devinez %2$s de %1$s.
%2$s 输出第二个参数作为十进制数。
最后,我们想对‘age’进行限制,因此我们可以使用消息 key person.age 改变 输出,定义如下:
guess.characteristic=Guess %s’s &{%s}.
person.age = age
和
guess.characteristic=Devinez &{%2$s} de %1$s.
person.age = l’age
这里,&{%s}就是它自身,使用消息 key 作为参数值。