2

我有一个使用 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)
  }
}

我会在不使用隐式语言的情况下维护这个结构,可能吗?

在某些情况下,我在同一页面中使用不同的语言,在这种情况下,隐式语言既困难又无聊。

4

1 回答 1

1

如果我正确理解您的问题,即您想为页面的某些块覆盖用户选择的语言,我会使用隐式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))
}

要在视图中进行这项工作,您需要将类添加到您templateImportbuild.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>

但这可能是矫枉过正,除非它真的为您节省了大量的样板语言切换。

于 2015-07-06T22:00:12.933 回答