Messages和国际化

通过你的应用程序支持指定语言

可以按照有效的 ISO 639-2 语言代码 来指定有效的语言代码, 还可以按 ISO 3166-1 alpha-2 国家代码, 如fren-US

你需要在 conf/application.conf 文件中指定语言支持:

play.i18n.langs = [ "en", "en-US", "fr" ]

外部化 messages

你可以在conf/messages.xxx 文件中外部化messages。

默认conf/messages 文件匹配所有语言。另外你可以指定特定的语言message文件,如conf/messages.fr or conf/messages.en-US.

然后你可以用play.api.i18n.Messages 对象检索messages:

val title = Messages("home.title")

所有国际化API调用带有一个隐式play.api.i18n.Messages 参数,其中参数值从当前作用域检出。这个隐式值包含要使用的语言和 (基本上) 国际化message。

获取如一个隐式值的简单方式是使用I18nSupport 特质。比如你可以像下面的控制器那样使用它:

import play.api.i18n.I18nSupport
class MyController(val messagesApi: MessagesApi) extends Controller with I18nSupport {
  // ...

I18nSupport 特质给你一个隐式Messages 值,只要有一个LangRequestHeader 在隐式作用域。

注意: 如果你在隐式作用域有一个RequestHeader , 程序会使用Accept-Language 标头中提取的推荐语言并匹配MessagesApi 支持语言中的一个。你要添加一个Messages 隐式参数到你的模板,像这样: @()(implicit messages: Messages)

注意: 同样, Play开箱即用的 “懂得” 如何注入一个MessagesApi 值 (使用DefaultMessagesApi 实现), 所以你可以只使用@javax.inject.Inject 注解添加到你的控制器,并让Play自动为你管理组件。

Messages 格式

Messages使用java.text.MessageFormat 库来格式化。举例, 假定你有message定义如下:

files.summary=The disk {1} contains {0} file(s).

那么你可以这样指定参数:

Messages("files.summary", d.files.length, d.name)

注意单引号

因为 Messages 使用java.text.MessageFormat, 请注意单引号被会用作元字符来转义参数代入。

举例, 如果你定义了以下messages:

info.error=You aren''t logged in!
example.formatting=When using MessageFormat, '''{0}''' is replaced with the first parameter.

你应该期望以下结果:

Messages("info.error") == "You aren't logged in!"
Messages("example.formatting") == "When using MessageFormat, '{0}' is replaced with the first parameter."

从HTTP请求中取回支持的语言

你可以从给定的HTTP请求取回支持的语言:

def index = Action { request =>
  Ok("Languages: " + request.acceptLanguages.map(_.code).mkString(", "))
}