播放框架2.3更改模板语言,无需额外请求

时间:2015-05-09 13:34:08

标签: scala cookies playframework playframework-2.3

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

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

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

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

但是这种方法不起作用:views.html.index(...)使用旧的隐式语言和" withLang"仅为新请求设置cookie。

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

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

但可能存在更规范的方式来进行语言转换?

1 个答案:

答案 0 :(得分:3)

您应该将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,编译器会抱怨含糊不清的隐式参数。 / p>