使用Scala播放框架2.4.0和I18n

使用Scala播放框架2.4.0和I18n,scala,internationalization,playframework-2.4,Scala,Internationalization,Playframework 2.4,我有一个PlayFramework2.3.8的项目,我正在PlayFramework2.4中迁移,但是我在I18n上遇到了一个问题 现在,我在视图中有如下代码: @Messages("components.navbar.text")(locale.MyLang) 其中区域设置为: object locale { var MyLang =Lang("it") def changeLang(newLang:String): Unit ={ MyLang=Lang(newLan

我有一个PlayFramework2.3.8的项目,我正在PlayFramework2.4中迁移,但是我在I18n上遇到了一个问题

现在,我在视图中有如下代码:

@Messages("components.navbar.text")(locale.MyLang)
其中区域设置为:

object locale {
  var MyLang =Lang("it") 

  def changeLang(newLang:String): Unit ={
     MyLang=Lang(newLang)
  }
}
我会在不使用隐式lang的情况下维护这个结构,这是可能的吗


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

如果我正确理解您的问题,即您希望覆盖用户选择的页面某些块的语言,我会这样做(对于播放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>
}
要使该类在视图中工作,您需要将该类添加到
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>
@()(隐式消息:消息)
@消息(“hello.world”)
@定义(messages.意大利语){隐式消息=>
@信息(“用意大利语写的东西”)
....
}
@Messages(法语中的另一个东西)(Messages.as(“fr”))

但这可能有点过头了,除非它真的为您节省了大量的样板语言转换。

您能提供一个在模板中如何做到这一点的示例吗?听起来你可以使用一个标准的隐式
Messages
对象,只需在某些块中覆盖它的lang。谢谢,但我已经决定编写我的类来处理翻译和i18n,对我来说,playframework 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.italian) { implicit messages =>
  <h2>@Messages("something.in.italian")</h2>
  ....
}

<!-- or singly, in another language -->
<h3>@Messages("another.thing.in.french")(messages.as("fr"))</h3>