Play Framework 2.4.0 和 I18n 与 Scala
Play Framework 2.4.0 and I18n with Scala
我有一个使用 Play Framework 2.3.8 的项目,我正在迁移到 Play Framework 2.4,但我遇到了 I18n 问题。
现在我有这样的视图代码:
@Messages("components.navbar.text")(locale.MyLang)
语言环境是:
object locale {
var MyLang =Lang("it")
def changeLang(newLang:String): Unit ={
MyLang=Lang(newLang)
}
}
我会在不使用隐式语言的情况下维护这个结构,可能吗?
在某些情况下,我在同一个页面中使用不同的语言,在这种情况下,使用隐式语言会很困难而且很无聊。
如果我正确理解你的问题,即你想为页面的某些块覆盖用户选择的语言,我会使用隐式 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
通过隐含的 class:
(在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))
}
要在视图中工作,您需要将 class 添加到 build.sbt
中的 templateImport
:
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>
但这可能有点矫枉过正,除非它真的为您节省了大量的样板语言切换。
我有一个使用 Play Framework 2.3.8 的项目,我正在迁移到 Play Framework 2.4,但我遇到了 I18n 问题。
现在我有这样的视图代码:
@Messages("components.navbar.text")(locale.MyLang)
语言环境是:
object locale {
var MyLang =Lang("it")
def changeLang(newLang:String): Unit ={
MyLang=Lang(newLang)
}
}
我会在不使用隐式语言的情况下维护这个结构,可能吗?
在某些情况下,我在同一个页面中使用不同的语言,在这种情况下,使用隐式语言会很困难而且很无聊。
如果我正确理解你的问题,即你想为页面的某些块覆盖用户选择的语言,我会使用隐式 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
通过隐含的 class:
(在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))
}
要在视图中工作,您需要将 class 添加到 build.sbt
中的 templateImport
:
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>
但这可能有点矫枉过正,除非它真的为您节省了大量的样板语言切换。