Я пытаюсь реализовать LocaleListener, который определяет предпочтительный язык пользователя (учитывая заголовок Accept-Language) и сохраняет его в сеансе, чтобы избежать проверки его на каждый запрос. Я разработал код ниже для достижения этой цели:Определение локали Symfony2: не считая _locale в сеансе
public function onKernelRequest(GetResponseEvent $event) {
$request = $event->getRequest();
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}
$preferredLocale = $request->getPreferredLanguage($this->availableLocales);
if ($this->container->has('session')) {
$session = $this->container->get('session');
if (!$session->has('_locale')) {
$session->set('_locale', $preferredLocale);
}
} else {
$request->setLocale($preferredLocale);
}
}
код работает, предпочтительный язык хранится в сессии, но Symfony не рассматривает локаль, хранящийся в сессии для перевода строк. В моем случае, мой любимый язык был «pt_BR», и когда я бежать:
{{ app.request.locale }}
Symfony убегает «ан». Не следует ли symfony рассматривать значение, сохраненное в сеансе ('_ locale'), для определения локали запроса? Это правильное поведение? Как я могу это сделать?
Спасибо, @Pazi. У меня есть два вопроса о вашем фрагменте: 1) это хорошая идеа, чтобы установить локаль в каждом запросе? Я пытался избежать этого сохранения локали в сеансе. 2) Где вы установили свой язык во время сеанса? Что возвращает ваш метод $ user-> getLanguage()? –
В моем проекте это не проблема. Я получил этот фрагмент из другого источника, но я больше не знаю URL. Можете ли вы изменить его, чтобы использовать только '_locale' в сеансе. Раньше, когда я ввел это, он не сработал.'$ user-> getLanguage()' просто поле языка в моей пользовательской сущности, потому что мои пользователи могут решить, на каком языке использовать веб-приложение, независимо от языкового стандарта браузеров. –