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)) )
أي اقتراح؟
يلاحظ:ربما استخدمت أسلوبًا سيئًا لتحقيق هدفي، لذا إذا كان لديك شيء أفضل تقترحه، سأكون سعيدًا بالحصول على نصيحتك.
المحلول
حسنًا - يبدو أنك قد واجهت خطأً متعلقًا بالانتقال من 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 قاعدة التعليمات البرمجية على جيثب, ، لقد تم تصحيحه:
case class SimpleResult(...) extends PlainResult with WithHeaders[SimpleResult]
...وإذا كنت سعيدًا باستخدام الإصدار المرشح، فيمكنك استخدامه 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))
}
}