Переключатель языка в 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 вы можете изменить его

Другие вопросы по тегам