Pregunta

He estado intentando forzar la configuración regional en el objeto Solicitud según el nombre de host de la aplicación.Esto se hace leyendo un mapa de configuración.

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)) ) 
  }

}

El código no se compila.Dice:

type mismatch:
  [error]  found   : play.api.mvc.PlainResult
  [error]  required: play.api.mvc.SimpleResult
  [error]     f(rh).map( _.withLang(Lang(language, country)) ) 

¿Cualquier sugerencia?

Aviso:Probablemente haya utilizado un mal enfoque para lograr mi objetivo, así que si tienes algo mejor que sugerir, estaré encantado de contar con tu consejo.

¿Fue útil?

Solución

Hmmm, parece que has encontrado un error relacionado con la transición de Play desde PlainResult a SimpleResult.

Cuando miro en el 2.2.0 base de código, PlainResult es:

sealed trait PlainResult extends Result with WithHeaders[PlainResult]

y SimpleResult Se define como:

case class SimpleResult(...) extends PlainResult

...lo que significa que todos los WithHeaders los métodos regresarán PlainResults - lo cual está mal.

Observo que en el Base de código 2.2.x en GitHub, ha sido rectificado:

case class SimpleResult(...) extends PlainResult with WithHeaders[SimpleResult]

...y si está satisfecho con utilizar una versión candidata, puede utilizar 2.2.2-RC1 que contiene la solución, según el Notas de lanzamiento.

Si no es así, emplee un método auxiliar para solucionar el problema, haciendo lo que WithHeaders.withLang lo hace de todos modos:

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))
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top