Play Framework 2.2.0 - Forza la lingua usando il filtro e l'oggetto globale
-
22-12-2019 - |
Domanda
Ho cercato di forzare la locale nell'oggetto di richiesta a seconda del nome host dell'applicazione.Questo è fatto leggendo una mappa di configurazione
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)) )
}
}
.
Il codice non è compilato.Dice:
type mismatch:
[error] found : play.api.mvc.PlainResult
[error] required: play.api.mvc.SimpleResult
[error] f(rh).map( _.withLang(Lang(language, country)) )
.
Qualsiasi suggerimento?
Avviso: Potrei probabilmente aver usato un cattivo approccio per raggiungere il mio obiettivo, quindi se hai qualcosa di meglio da suggerire, sarò felice di avere il tuo consiglio.
Soluzione
Hmmm - Sembra che tu abbia colpito un bug relativo alla transizione del gioco da PlainResult
a SimpleResult
.
Quando guardo nel 2.2.0 CodeBase, PlainResult
è:
sealed trait PlainResult extends Result with WithHeaders[PlainResult]
.
e SimpleResult
è definito come:
case class SimpleResult(...) extends PlainResult
.
... il che significa che tutti i metodi WithHeaders
restituiranno PlainResult
s - che è sbagliato.
Noto che nel 2.2.x codebase su github , è stato rettificato:
case class SimpleResult(...) extends PlainResult with WithHeaders[SimpleResult]
.
... e se sei felice di utilizzare un candidato di rilascio, puoi usare 2.2.2-RC1 che contiene la correzione, in base all'http Note di rilascio .
In caso contrario, impiegare un metodo helper per aggirare il problema, facendo ciò che WithHeaders.withLang
lo fa comunque:
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))
}
}
.