Play Framework 2.2.0 - フィルタとグローバルオブジェクトを使用して言語を強制する
-
22-12-2019 - |
質問
アプリケーションのホスト名に応じて、ロケールを要求オブジェクトに強制しようとしています。これは構成マップを読むことによって行われます
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)) )
}
}
.
コードはコンパイルされません。それは言います:
type mismatch:
[error] found : play.api.mvc.PlainResult
[error] required: play.api.mvc.SimpleResult
[error] f(rh).map( _.withLang(Lang(language, country)) )
.
提案?
通知:私はおそらく私の目標を達成するために悪いアプローチを使ったかもしれません。
解決
HMMM - PlainResult
からSimpleResult
への移行に関連するバグを打つことのようです。
2.2.0 codebaseを見ると、PlainResult
は次のとおりです。
sealed trait PlainResult extends Result with WithHeaders[PlainResult]
.
とSimpleResult
は次のように定義されています。
case class SimpleResult(...) extends PlainResult
.
...これは、WithHeaders
メソッドのすべてがPlainResult
を返すことを意味します。
2.2.x CODEBASEのGitHUB 、それは修正されています:
case class SimpleResult(...) extends PlainResult with WithHeaders[SimpleResult]
.
...そしてリリース候補を使用してうれしいのなら、リリースノート
でない場合は、とにかくWithHeaders.withLang
が何をすることで問題を回避するためのヘルパーメソッドを採用しています。
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))
}
}
. 所属していません StackOverflow