如果我正确理解您的问题,即您想为页面的某些块覆盖用户选择的语言,我会使用隐式Messages
对象执行此操作(对于 Play 2.4):
@()(implicit messages: Messages)
<!-- some section in the user's chosen language -->
<h1>@Messages("hello.world")</h1>
<!-- some section in a specific language -->
@defining(messages.copy(lang = play.api.i18n.Lang("it")) { implicit messages =>
<h2>@Messages("something.in.italian")</h2>
}
也就是说,defining
用于为某些嵌套的 HTML 块创建新的(隐式)消息。
如果你真的想去城里(我不一定推荐这个),你可以通过隐式类添加一个italian
方法:Messages
(在my.package.utils.i18n.MessagesExtensions.scala
):
package my.packages.utils.i18n
import play.api.i18n.{Lang, Messages}
implicit class MessagesExtensions(messages: Messages) {
def italian = messages.copy(lang = Lang("it"))
// and an `as` method for good measure:
def as(code: String) = messages.copy(lang = Lang(code))
}
要在视图中进行这项工作,您需要将类添加到您templateImport
的build.sbt
:
templateImports in Compile ++= Seq(
"my.packages.utils.i18n.MessagesExtensions"
)
然后在您的模板中,您可以这样做:
@()(implicit messages: Messages)
<!-- some section in the user's chosen language -->
<h1>@Messages("hello.world")</h1>
<!-- some section in a specific language -->
@defining(messages.italian) { implicit messages =>
<h2>@Messages("something.in.italian")</h2>
....
}
<!-- or singly, in another language -->
<h3>@Messages("another.thing.in.french")(messages.as("fr"))</h3>
但这可能是矫枉过正,除非它真的为您节省了大量的样板语言切换。