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.

Foi útil?

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 PlainResults - 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))
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top