2015-05-09 67 views
3

正常的方法来改变语言是使重定向性反应与游戏框架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) 
} 

但这种方法并不ofcourse工作: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) 
} 

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

+0

我不知道Play本身是否有更简洁的方法,但是手动提供一个值来覆盖不适当的隐式范围感觉就像是交换implicits的规范方法 –

回答

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,编译器会抱怨的暧昧隐含参数。