Jogar Quadro 2.2.0 - Força o idioma usando o Filtro e o objeto Global
-
22-12-2019 - |
Pergunta
Eu estive tentando forçar a localidade em que o objeto do Pedido, dependendo o nome de host do aplicativo.Isto é feito através da leitura de um Mapa de configuração
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)) )
}
}
O código não vai compilar.Ele diz:
type mismatch:
[error] found : play.api.mvc.PlainResult
[error] required: play.api.mvc.SimpleResult
[error] f(rh).map( _.withLang(Lang(language, country)) )
Alguma sugestão?
Aviso:Eu poderia provavelmente ter usado uma má abordagem para atingir o meu objetivo, então se você tem algo melhor para sugerir, eu vou ser feliz para ter o seu conselho.
Solução
Hmmm - parece que você bateu um bug relacionado para Brincar de transição de PlainResult
para SimpleResult
.
Quando eu olho no 2.2.0 codebase, PlainResult
é:
sealed trait PlainResult extends Result with WithHeaders[PlainResult]
e SimpleResult
é definido como:
case class SimpleResult(...) extends PlainResult
...o que significa que todos os WithHeaders
métodos vai voltar PlainResult
s - o que é errado.
Note-se que, no 2.2.x codebase no GitHub, ele foi rectificado:
case class SimpleResult(...) extends PlainResult with WithHeaders[SimpleResult]
...e se você está feliz em usar uma versão Release Candidate, você pode usar 2.2.2-RC1 que contém a correcção, de acordo com o notas de lançamento.
Se não, empregar um método auxiliar para contornar o problema, fazendo o que WithHeaders.withLang
não de qualquer maneira:
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))
}
}