我知道可以将优先语言设置为带代码的会话
Ok(views.html.index()).withLang(lang)
但它仅适用于下一个请求和当前请求用户获取默认语言的页面。 我试过这样的可能:
implicit val lang = Lang("de")
Ok(views.html.index("Homepage"))
没有成功。 实现这一目标的正确方法是什么? 以下是观点:
@(message: String)(implicit messages: Messages)
@main(message) {
@messages("admin.area.enter")
}
答案 0 :(得分:2)
Play 2.4 documentation on internationalization州
"此外,Play知道如何注入MessagesApi值(使用DefaultMessagesApi实现),因此您只需使用@ javax.inject.Inject注释注释您的控制器并让Play自动连线适合您的组件。"
像这样的东西
控制器:
class FooController @Inject() (val messagesApi: MessagesApi) extends Controller with I18nSupport {
def index() = Action { implicit request =>
Ok(views.html.index())
}
}
模板:
@()(implicit messages: Messages, lang: Lang)
Messages says @messages("hello.msg")
如果您希望实现语言选择器组件,那么这个答案可能会有所帮助
Language selector in Play 2.4 & Scala 2.11.6
以下是一个复合操作的示例,它修改了请求标头。
object LanguageAction extends ActionBuilder[Request] {
def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = {
val newRequest = new WrappedRequest[A](request) {
//calculate from request url
val lang = Lang("fr")
override lazy val acceptLanguages = Seq(lang)
}
block(newRequest)
}
}
控制器:
class FooController @Inject() (val messagesApi: MessagesApi) extends Controller with I18nSupport {
def index() = LanguageAction { implicit request =>
Ok(views.html.index())
}
}
查看:
@()(implicit messages: Messages, lang: Lang)
@messages("foo.bar")