#playframework #locale
#playframework #язык
Вопрос:
Работаю с вашим обычным веб-приложением, и у меня возникают проблемы с применением языкового стандарта, который я хочу использовать в API сообщений Play Framework 2.4 при ответе на запросы (и отображении представлений).
То, что я пробовал, вызывается Http.Context.Implicit.ctx().changeLang(mySpecificLangCode);
с моего контроллера (расширяет devkit.mvc.Controller). Если я позвоню play.i18n.Messages#get(java.lang.String, java.lang.Object...)
после этого, ответ, который я получу, будет на том языке, который я хочу, все в порядке.
Однако, если я использую API сообщений из своих представлений (scala / Twirl) для обслуживания того же запроса, это не нормально. Он возвращается к языку по умолчанию. Я должен дождаться, пока клиент отправит второй запрос, чтобы он был обслужен на правильном языке.
Я думаю, это связано с тем, что в первый раз сервер отправляет файл cookie PLAY_LANG, клиент отправляет его в следующих запросах, и каким-то образом это сообщает Play отображать представление на нужном мне языке. Однако я не могу полагаться на это поведение, потому что я должен учитывать, что продолжительность жизни клиента — это один запрос. У меня нет никакого контроля над клиентом, и я также не могу / не могу основывать свой код на заголовке Accept-Language запроса клиента. Я попытался немного отладить вещи и посмотреть, что происходит, когда API сообщений вызывается изнутри представления, читая некоторые документы, это мне не очень помогло, тем более, учитывая, что я не владею scala.
Рекомендации (здесь, в SO, и из официальных документов тоже), похоже, заключаются в использовании внедрения зависимостей для предоставления объекта Messages для представлений, но я не могу позволить себе изменять свои представления (в моем ответе используется шаблон scala, который вызывает другие шаблоны и т. Д. Об изменении всех из них не может быть и речи).
Что я могу сделать, это то, что я хочу сделать просто и просто невозможно без изменения представлений?
Ответ №1:
В конце концов я обнаружил, что это (была) актуальная проблема в Play Framework, см. https://github.com/playframework/playframework/issues/5875 (с обходным путем, который работает).