Play Framework 2.2.0 - Forcer le langage à l'aide du filtre et de l'objet global
-
22-12-2019 - |
Question
J'ai essayé de forcer les paramètres régionaux dans l'objet Request en fonction du nom d'hôte de l'application.Cela se fait en lisant une carte de configuration
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)) )
}
}
Le code ne compile pas.Ça dit:
type mismatch:
[error] found : play.api.mvc.PlainResult
[error] required: play.api.mvc.SimpleResult
[error] f(rh).map( _.withLang(Lang(language, country)) )
Toute suggestion?
Avis:J'ai probablement utilisé une mauvaise approche pour atteindre mon objectif, donc si vous avez quelque chose de mieux à suggérer, je serai heureux d'avoir vos conseils.
La solution
Hmmm - il semble que vous ayez rencontré un bug lié à la transition de Play depuis PlainResult
à SimpleResult
.
Quand je regarde dans le 2.2.0 base de code, PlainResult
est:
sealed trait PlainResult extends Result with WithHeaders[PlainResult]
et SimpleResult
est défini comme:
case class SimpleResult(...) extends PlainResult
...ce qui veut dire que tous les WithHeaders
les méthodes reviendront PlainResult
s - ce qui est faux.
Je note que dans le Base de code 2.2.x sur GitHub, c'est rectifié :
case class SimpleResult(...) extends PlainResult with WithHeaders[SimpleResult]
...et si vous souhaitez utiliser une Release Candidate, vous pouvez utiliser 2.2.2-RC1 qui contient le correctif, selon le notes de version.
Si ce n'est pas le cas, utilisez une méthode d'assistance pour contourner le problème, en faisant ce qui suit. WithHeaders.withLang
fait quand même :
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))
}
}