Play Framework 2.4.0 и I18n со 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)
  }
}

Я бы поддерживал эту структуру без использования неявного языка, возможно?

У меня есть ситуация, когда я использую на одной странице другой язык, и в этом случае мне сложно и скучно с неявным языком.

1 ответ

Решение

Если я правильно понимаю ваш вопрос о том, что вы хотите переопределить выбранный пользователем язык для определенных блоков страницы, я бы сделал это (для Play 2.4), используя неявный Messages объект:

@()(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>

Но это может быть излишним, если только это не спасет вас от частой смены языка.

Другие вопросы по тегам