Play Framework 2.2.0 — принудительное изменение языка с помощью фильтра и глобального объекта.

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

Вопрос

Я пытался принудительно ввести локаль в объект Request в зависимости от имени хоста приложения.Это делается путем чтения карты конфигурации.

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

Любое предложение?

Уведомление:Вероятно, я использовал плохой подход для достижения своей цели, поэтому, если вы можете предложить что-то лучшее, я буду рад вашему совету.

Это было полезно?

Решение

Хммм, похоже, вы столкнулись с ошибкой, связанной с переходом Play PlainResult к SimpleResult.

Когда я смотрю в 2.2.0 кодовая база, PlainResult является:

sealed trait PlainResult extends Result with WithHeaders[PlainResult]

и SimpleResult определяется как:

case class SimpleResult(...) extends PlainResult

...это означает, что все WithHeaders методы будут возвращаться PlainResultс - это неправильно.

Отмечу, что в Кодовая база 2.2.x на GitHub, исправлено:

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

...и если вы готовы использовать Release Candidate, вы можете использовать 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))
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top