play framework 2.3 无需额外请求即可更改模板语言

play framework 2.3 change template language without extra request

更改语言的正常方法是使用

进行重定向响应
.withLang(Lang(newLangCode))

但是如何在没有额外重定向的情况下更好地更改当前语言,我有以下结构。我尝试使用来自用户记录或请求 cookie 的语言,或者 headers 如果用户没有语言。

def index(userId:Int) = Action {
val userLang = getUser(userId).getLang.getOrElse(implicitly[Lang])
Ok(views.html.index(...)).withLang(userLang)
}

但是这种方法当然行不通:views.html.index(...) 是用旧的隐式语言调用的,"withLang" 只为新请求设置 cookie。

我只知道一种解决方案:使用显式 lang 参数调用模板函数。

def index(userId:Int) = Action {
   implicit request => 
   val userLang = getUser(userId).getLang.getOrElse(implicitly[Lang])
   Ok(views.html.index(...)(request,userLang)).withLang(userLang)
}

但可能存在更规范的语言切换方式?

您应该将 userLang 值声明为隐式值。这样,您的 userLang 值将自动为您的模板参数 @(...)(implicit lang: Lang) 选取。

def index(userId:Int) = Action { request => 
    implicit val userLang = getUser(userId).getLang.getOrElse(implicitly[Lang])
    Ok(views.html.index(...)).withLang(userLang)
}

您还需要从请求参数中删除隐式修饰符,因为在 Controller 特征中有一个 implicit conversion 从隐式请求到 lang,编译器会抱怨不明确的隐式参数.