Play Framework 2.2.0 - 使用Filter和Global对象强制语言

时间:2014-01-10 23:21:15

标签: scala localization playframework-2.2

我一直在尝试根据应用程序的主机名强制将语言环境放入Request对象。这是通过读取配置Map

来完成的
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)) ) 

有什么建议吗?

注意:我可能使用了一种不好的方法来实现我的目标,所以如果你有更好的建议,我会很高兴得到你的建议。

1 个答案:

答案 0 :(得分:3)

嗯 - 好像你遇到了与Play从PlainResult过渡到SimpleResult相关的错误。

当我查看 2.2.0 代码库时,PlainResult是:

sealed trait PlainResult extends Result with WithHeaders[PlainResult]

SimpleResult定义为:

case class SimpleResult(...) extends PlainResult

...这意味着所有WithHeaders方法都将返回PlainResult s - 这是错误的。

我注意到在2.2.x codebase on GitHub中,它已得到纠正:

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

...如果您愿意使用Release Candidate,则可以根据release notes使用包含此修复程序的 2.2.2-RC1

如果没有,请采用辅助方法解决问题,无论如何都要执行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))
  }
}