Ошибка i18n: контроллер и шаблоны используют разные неявные языки

Controller:

def test = Action { implicit request =>
    import play.api.i18n._
    val msg = Messages("error.invalid")
    implicit val langInController = lang(request)
    Ok(views.html.test(langInController, msg))
}

View:

@(langInController: play.api.i18n.Lang, msg:String)(implicit request: Request[_])
<div>Lang from controller: @langInController, Message: @msg</div>
<div>Message from view: @play.api.i18n.Messages("error.required")</div>

Messages resource, conf/messages.zh-CN:

error.required=该字段必填

Попытка

  1. Использует английский Firefox, который отправляет заголовок запроса Accept-Language:en-us,en;q=0.5для посещения действия test. Результат:

    Language от контроллера: Lang(en,), Сообщение: Это поле обязательно для заполнения
    Сообщение в поле зрения: 该字段必填
    
  2. Использует китайский Google Chrome, который отправляет заголовок запроса Accept-Language:zh-CN,zh;q=0.8для его посещения. Результат:

    Язык: Lang(zh,CN), Сообщение: 该字段必填
    Сообщение в поле зрения: 该字段必填
    

Из тестов мы знаем, что:

  1. Неявный язык в контроллере взят из заголовка запроса Accept-Language
  2. Неявный язык, используемый в шаблоне, определяется ОС

Среда:

  1. Play 2 — это последняя версия play2.1-SNAPSHOT с GitHub (2012-03-16)
  2. Моя ОС — Windows 7 x64, китайская версия

Я думаю, что Play 2 должен использовать тот же неявный язык для контроллеров и представлений. Я могу исправить это, добавив что-то в Build.sbt:

val main = PlayProject(...) (
    templatesImport ++= Seq("utilis.TemplateMixin._")
)

Где TemplateMixinпросто:

object TemplateMixin extends play.api.mvc.Controller

(он расширяет контроллер и просто повторно использует некоторые методы, например implicit def lang(request).)

Но я думаю, что это должна делать платформа Play.

9
задан Peter Mortensen 3 November 2012 в 17:41
поделиться