簡短的問題是:有沒有一種方法在播放前提取ACCEPT_LANGUAGE請求頭以確定i18n語言?Scala的2.2版 - 使用ScalaInterceptors修改AcceptLanguage HTTP請求頭
我認爲這可以通過覆蓋路由請求來完成(參見http://www.playframework.com/documentation/2.2.0/ScalaInterceptors)。
但它似乎沒有工作。 這是我的「測試」的代碼,看到同樣在https://gist.github.com/mcallisto/3f428fad87f7a7759519
import play.api._
import play.api.mvc._
import play.api.http.HeaderNames
object Global extends GlobalSettings {
override def onRouteRequest(rh: RequestHeader): Option[Handler] = {
Logger.info("Request: " + rh.toString)
Logger.info("Accepted languages : " + rh.acceptLanguages.mkString(", "))
val newLang = "it"
val newHeaders = new Headers { val data = (rh.headers.toMap
+ (HeaderNames.ACCEPT_LANGUAGE -> Seq(newLang))).toList }
val newRequestHeader = rh.copy(headers = newHeaders)
Logger.info("New accepted languages : " + newRequestHeader.acceptLanguages.mkString(", "))
super.onRouteRequest(newRequestHeader)
}
}
沒有這個代碼,國際化功能根據影響AcceptLanguage標頭的瀏覽器設置工作。
有了它,即使標題顯然改爲意大利語(「it」)語言(請參閱記錄器),但i18n仍由瀏覽器語言提供。
在哪一點播放提取頭?
有沒有其他方法可以實現相同的目標?我只是想達到一個基本的步驟,其中請求子域(如it.example.com)普遍存在對瀏覽器的設置,以確定國際化
預先感謝您爲您提示
還有一個道理:這是通過全球最好的方法嗎?我想知道性能是否明智,因爲它會在需要資產時修改標題,也許沒有必要這樣做。這可以做到更進一步,也許作爲一個行動生成器,可用於幾個控制器? – user2364174
是的,你也可以使用動作組合。過濾器更有趣,可以添加會影響很多請求的行爲。如果只是少數,那麼行動會更好。 – vptheron
理論上我想影響所有的行爲,但不是所有的請求。我會嘗試與行動組成。 也不是修改觸發Play i18n邏輯的AcceptLanguage標題,而不是修改Play邏輯本身的另一個選項?哪裏? – user2364174