Play 框架手册(12) – Internationalization 国际化支持


国际化 (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 作为参数值。


前一篇:
后一篇:

发表评论