Question

J'ai essayé de forcer les paramètres régionaux dans l'objet Request en fonction du nom d'hôte de l'application.Cela se fait en lisant une carte de configuration

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

}

Le code ne compile pas.Ça dit:

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

Toute suggestion?

Avis:J'ai probablement utilisé une mauvaise approche pour atteindre mon objectif, donc si vous avez quelque chose de mieux à suggérer, je serai heureux d'avoir vos conseils.

Était-ce utile?

La solution

Hmmm - il semble que vous ayez rencontré un bug lié à la transition de Play depuis PlainResult à SimpleResult.

Quand je regarde dans le 2.2.0 base de code, PlainResult est:

sealed trait PlainResult extends Result with WithHeaders[PlainResult]

et SimpleResult est défini comme:

case class SimpleResult(...) extends PlainResult

...ce qui veut dire que tous les WithHeaders les méthodes reviendront PlainResults - ce qui est faux.

Je note que dans le Base de code 2.2.x sur GitHub, c'est rectifié :

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

...et si vous souhaitez utiliser une Release Candidate, vous pouvez utiliser 2.2.2-RC1 qui contient le correctif, selon le notes de version.

Si ce n'est pas le cas, utilisez une méthode d'assistance pour contourner le problème, en faisant ce qui suit. WithHeaders.withLang fait quand même :

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))
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top