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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top