Play Framework 2.2.0 — принудительное изменение языка с помощью фильтра и глобального объекта.
-
22-12-2019 - |
Вопрос
Я пытался принудительно ввести локаль в объект Request в зависимости от имени хоста приложения.Это делается путем чтения карты конфигурации.
package controllers
import play.api.mvc._
import play.api.i18n.Lang
import play.api.Play.current
import scala.actors.Future
object Global extends WithFilters(ForceLocalization)
object ForceLocalization extends Filter {
override def apply(next: (RequestHeader) => Future[SimpleResult])
(rh: RequestHeader): Future[SimpleResult] = {
val arr = models.DomainSettings.forDomain(rh.domain).locale.split("_") // -> "en_US"
val language = arr(0) // -> "en"
val country = if ( arr.length == 1 ) "" else arr(1) // -> "US"
f(rh).map( _.withLang(Lang(language, country)) )
}
}
Код не компилируется.Там говорится:
type mismatch:
[error] found : play.api.mvc.PlainResult
[error] required: play.api.mvc.SimpleResult
[error] f(rh).map( _.withLang(Lang(language, country)) )
Любое предложение?
Уведомление:Вероятно, я использовал плохой подход для достижения своей цели, поэтому, если вы можете предложить что-то лучшее, я буду рад вашему совету.
Решение
Хммм, похоже, вы столкнулись с ошибкой, связанной с переходом Play PlainResult
к SimpleResult
.
Когда я смотрю в 2.2.0 кодовая база, PlainResult
является:
sealed trait PlainResult extends Result with WithHeaders[PlainResult]
и SimpleResult
определяется как:
case class SimpleResult(...) extends PlainResult
...это означает, что все WithHeaders
методы будут возвращаться PlainResult
с - это неправильно.
Отмечу, что в Кодовая база 2.2.x на GitHub, исправлено:
case class SimpleResult(...) extends PlainResult with WithHeaders[SimpleResult]
...и если вы готовы использовать Release Candidate, вы можете использовать 2.2.2-RC1 который содержит исправление, согласно примечания к выпуску.
Если нет, используйте вспомогательный метод, чтобы обойти проблему, выполнив следующие действия: WithHeaders.withLang
все равно делает:
object ForceLocalization extends Filter {
override def apply(next: (RequestHeader) => Future[SimpleResult])
(rh: RequestHeader): Future[SimpleResult] = {
...
next(rh).map( withLang(_, Lang(language, country)) )
}
private def withLang(sr:SimpleResult, lang:Lang) = {
sr.withCookies(Cookie(Play.langCookieName, lang.code))
}
}