Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala play framework 2.3无需额外请求即可更改模板语言_Scala_Cookies_Playframework_Playframework 2.3 - Fatal编程技术网

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

Scala play framework 2.3无需额外请求即可更改模板语言,scala,cookies,playframework,playframework-2.3,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(user

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

.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(…)是用旧的隐式lang调用的,“withLang”只为新请求设置cookie

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

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
值将自动为模板参数
@(…)(隐式lang:lang)
拾取


您还需要从request参数中删除隐式修饰符,因为在
控制器
trait中有一个from implicit request to lang,编译器会抱怨隐式参数不明确。

我不知道Play本身是否有更干净的方式,但是手动提供一个值来覆盖范围中不适当的隐式,感觉就像是交换隐式的规范方法
def index(userId:Int) = Action { request => 
    implicit val userLang = getUser(userId).getLang.getOrElse(implicitly[Lang])
    Ok(views.html.index(...)).withLang(userLang)
}