Scala Play Framework如何为当前请求设置语言?

时间:2015-10-26 17:00:58

标签: scala playframework

我知道可以将优先语言设置为带代码的会话

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")
}

1 个答案:

答案 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")