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>
Но это может быть излишним, если только это не спасет вас от частой смены языка.