2015-05-09 1 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) 
} 

Но этот подход не работает конечно: views.html.index (...) вызываются со старым неявным Лангом и «withLang» только устанавливает кук для нового запроса.

Я знаю только одно решение: вызвать функцию шаблона с явным параметром 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

Я не знаю, имеет ли игра сама по себе более чистый способ, но ручное предоставление значения для переопределения неявной неявной области видится как канонический способ замены имплицитов –

ответ

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 от неявного запроса на язык, и компилятор будет жаловаться на неоднозначные неявные параметры.