Play Framework 2.2.0 - フィルタとグローバルオブジェクトを使用して言語を強制する

StackOverflow https://stackoverflow.com//questions/21056304

質問

アプリケーションのホスト名に応じて、ロケールを要求オブジェクトに強制しようとしています。これは構成マップを読むことによって行われます

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top