Play Framework 2.2.0 – Erzwingen Sie die Sprache mithilfe von Filter und globalen Objekten
-
22-12-2019 - |
Frage
Ich habe versucht, das Gebietsschema abhängig vom Hostnamen der Anwendung in das Request-Objekt einzufügen.Dies erfolgt durch das Auslesen einer Konfigurationskarte
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)) )
}
}
Der Code lässt sich nicht kompilieren.Es sagt:
type mismatch:
[error] found : play.api.mvc.PlainResult
[error] required: play.api.mvc.SimpleResult
[error] f(rh).map( _.withLang(Lang(language, country)) )
Irgendein Vorschlag?
Beachten:Möglicherweise habe ich einen schlechten Ansatz gewählt, um mein Ziel zu erreichen. Wenn Sie also etwas Besseres vorzuschlagen haben, freue ich mich über Ihren Rat.
Lösung
Hmmm, es scheint, als ob Sie einen Fehler im Zusammenhang mit der Umstellung von Play entdeckt haben PlainResult
Zu SimpleResult
.
Wenn ich in die schaue 2.2.0 Codebasis, PlainResult
Ist:
sealed trait PlainResult extends Result with WithHeaders[PlainResult]
Und SimpleResult
ist definiert als:
case class SimpleResult(...) extends PlainResult
...was bedeutet, dass alle WithHeaders
Methoden werden zurückgegeben PlainResult
s - was falsch ist.
Ich stelle fest, dass in der 2.2.x-Codebasis auf GitHub, es wurde behoben:
case class SimpleResult(...) extends PlainResult with WithHeaders[SimpleResult]
...und wenn Sie gerne einen Release Candidate verwenden möchten, können Sie ihn verwenden 2.2.2-RC1 das den Fix enthält, laut der Versionshinweise.
Wenn nicht, verwenden Sie eine Hilfsmethode, um das Problem zu umgehen, indem Sie Folgendes tun WithHeaders.withLang
tut es trotzdem:
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))
}
}