Переключатель языка в Symfony 2.4
У меня есть объект Language, и я могу добавлять, удалять и обновлять языки со страницы администратора.
Что я хочу сделать, это добавить переключатель языка, я поместил этот HTML / Twig код:
{% for language in languages %}
<li><a href="{{ path('evr_footer_switch_language',{'locale': language.code | lower }) }}">{{ language.language | capitalize }} ({{ language.code }})</a></li>
{% endfor %}
И действие the route for the action is evr_footer_switch_language
тот, который я использовал в переключателе выше:
public function switchlanguageAction($locale = 'en') {
$this->get('session')->set('_locale', $locale);
$request = $this->getRequest();
$request->setLocale($locale);
return $this->redirect($request->headers->get('referer'));
}
Это маршрут, который я определил для action/controller switchlanguageAction()
evr_footer_switch_language:
pattern: /language/switch/{locale}
defaults: { _controller: EvrHomeBundle:Footer:switchlanguage, locale: en }
Мне кажется, что в принципе все очень просто: вы нажимаете на ссылку языка (полученную из базы данных), отправляете код языка (например: 'fr', 'en', 'zh' и т. Д.) На действие как переменная $locale, затем установите значение Locale сеанса / запроса на это значение.
Проблема в том, что ничего из этого не работает, и язык по-прежнему "EN" (значение по умолчанию).
Примечание. В соответствии с требованиями этого проекта, язык не может быть указан в URL (например, fr/ Articles, en/article), но один и тот же URL (/article /) может отображаться на разных языках, поэтому я не сделал этого. не использовать предопределенный слаг (_locale).
Спасибо
3 ответа
В поисках некоторых подробностей, чтобы написать ответ, я наткнулся на это Symfony
Запись в кулинарной книге: создание локали "липкой" во время сеанса пользователя
Я думаю, что это именно то, что вам нужно;)
Symfony 2.6: я использовал LocaleListener, упомянутый в "Создание языкового стандарта, но также должен был использовать это, чтобы все работало правильно:
/** from Controller
*
* @Route("/changeLanguage/{changeToLocale}", name="changeLanguage")
*
*/
public function changeLanguageAction($changeToLocale){
$this->get('request')->attributes->set('_locale', null);
$this->get('session')->set('_locale', $changeToLocale);
return $this->redirect($this->generateUrl('index'));
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
// try to see if the locale has been set as a _locale routing parameter
if ($locale = $request->query->get('swich_language')) {
$request->getSession()->set('_locale', $locale);
$routing = $this->router->match($request->getPathInfo());
$route_params = array();
foreach ($routing as $key => $value) {
if($key[0] !== "_")
{
$route_params[$key] = $value;
}
}
$parameters = \array_merge($route_params, array("_locale" => $locale));
$url = $this->urlGenerator->generate($routing['_route'], $parameters);
$response = new RedirectResponse($url);
$event->setResponse($response);
}
}
Вы можете добавить запрос к ядру, а с помощью строки запроса swich_language вы можете изменить его