12. Internationalization国际化支持
国际化 (I18N)意思是允许你的应用程序适用于不同的语言环境。参数下列步骤实现国际化。
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编码,还需要作更多解释吗?
国际化你的信息
为了支持I18N,你必须国际化你的所有信息。
在conf/目录创建一个名叫messages的文件,这个文件是一个真正的java属性文件。
hello=Hello!
back=Back
然后就可以为每种语言定义明确的message文件,只需要为文件名加上ISO语言代码文件后缀。
比如法语为conf/messages.fr,中文为zh,英语为en:
hello=Bonjour!
back=Retour
在application.langs configuration里定义支持的语言列表。
新用户第一次进行请求时,play会猜测默认使用的语言。它主要是通过解析HTTP Accept-languageheader来实现的。然后把猜出的语言存储到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。
配置date.format以指定默认使用的日期格式。
找回区域信息
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作为参数值。