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

أي اقتراح؟

يلاحظ:ربما استخدمت أسلوبًا سيئًا لتحقيق هدفي، لذا إذا كان لديك شيء أفضل تقترحه، سأكون سعيدًا بالحصول على نصيحتك.

هل كانت مفيدة؟

المحلول

حسنًا - يبدو أنك قد واجهت خطأً متعلقًا بالانتقال من 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))
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top