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,编译器会抱怨不明确的隐式参数.
更改语言的正常方法是使用
进行重定向响应.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,编译器会抱怨不明确的隐式参数.