12. Internationalization国际化支持

12. Internationalization国际化支持

国际化 (I18N)意思是允许你的应用程序适用于不同的语言环境。参数下列步骤实现国际化。

仅使用 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编码,还需要作更多解释吗?

国际化你的信息

为了支持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作为参数值。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值