Функция play.api.i18n.Messages(key)
принимает дополнительный неявный параметр типа Lang
.Поэтому, когда вы пишете Messages("foo")
, оно расширяется до Messages("foo")(l)
, где l
- это значение типа Lang
, взятое из текущей неявной области.
Всегда есть доступный неявный lang по умолчанию (который имеет низкий приоритет ), используя ваш языковой стандарт по умолчанию jvm.
Но когда вы находитесь внутри Controller , неявное значение с более высоким приоритетомможно найти, если есть неявный запрос.Это значение выглядит в заголовке Accept-Language
запроса.
Когда вы находитесь внутри шаблона, будет использоваться неявный lang по умолчанию, если ваш шаблон не импортирует другой неявный lang.
Вот почему,в вашем примере сообщения, вычисленные из контроллера, используют заголовок запроса Accept-Language
, а сообщения, вычисленные из представления, используют ваш языковой стандарт по умолчанию jvm.
Если вы добавите в шаблон неявный параметр типа Lang
, этоПараметр будет иметь более высокий приоритет, чем lang по умолчанию, и будет использоваться для вычисления сообщений:
@(langInController: Lang, msg:String)(implicit request: RequestHeader, lang: Lang)
<div>Lang from controller: @langInController, Message: @msg</div>
<div>Message from view: @Messages("error.required")</div>
Когда вы вызовете шаблон из действия Controller, его неявный lang будет передан, поэтому тот же langбудет использоваться как вашими представлениями, так и вашими контроллерами.