使用 Scala 播放 Framework 2.4.0 和 I18n

Posted

技术标签:

【中文标题】使用 Scala 播放 Framework 2.4.0 和 I18n【英文标题】:Play Framework 2.4.0 and I18n with Scala 【发布时间】:2015-06-11 12:51:32 【问题描述】:

我有一个使用 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 对象,并为某些块覆盖它的语言。 【参考方案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))

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

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

【讨论】:

谢谢,但我决定编写我的课程来处理翻译和 i18n,对我来说,playframework 2.4 中的新库很笨拙。我更喜欢旧版本。

以上是关于使用 Scala 播放 Framework 2.4.0 和 I18n的主要内容,如果未能解决你的问题,请参考以下文章

在 Play Framework 2.4 中为 Scala 实现 Akka

在 Play Framework 2.4 中为 Scala 实现 CORS

使用 Scala 播放 Framework 2.4.0 和 I18n

Play Framework 2.4 发送邮件

播放Framework和Scala Json,解析包含JSArray和JSObject的json

如何将 IntelliJ 与 Play Framework 和 Scala 一起使用