Я пытаюсь использовать языковой коммутатор на моем сайте symfony 2.1.
Я выполнил официальную документацию , установил файлы перевода, но установил локаль с помощью $ request-> setLocale ('en_US'); похоже, не работает. После некоторых исследований я нашел этот вопрос, который дает начало ответа с помощью этой техники слушателя .
Тем не менее, мне все еще не удается заставить его работать, я не уверен в своей декларации слушателя, что-то не так с ним?
Мой контроллер:
public function englishAction(Request $request) { $this->get('session')->set('_locale', 'en_US'); return $this->redirect($request->headers->get('referer')); }
Объявление сервиса в config.yml:
services: my_listener: class: "FK\MyWebsiteBundle\Listener\LocaleListener"
Моя маршрутизация:
homepage: pattern: /{_locale} defaults: { _controller: FKMyWebsiteBundle:Default:index, _locale: en } requirements: _locale: en|fr|cn about: pattern: /{_locale}/about defaults: { _controller: FKMyWebsiteBundle:Default:about, _locale: en } requirements: _locale: en|fr|cn
страницаhomepage: pattern: /{_locale} defaults: { _controller: FKMyWebsiteBundle:Default:index, _locale: en } requirements: _locale: en|fr|cn about: pattern: /{_locale}/about defaults: { _controller: FKMyWebsiteBundle:Default:about, _locale: en } requirements: _locale: en|fr|cn
Объявление LocaleListener в yml (вдохновленное текущим объявлением нового LocaleListener: \ vendor \ symfony \ symfony \ src \ Symfony \ Bundle \ FrameworkBundle \ Resources \ config \ web.xml)
services: my_listener: class: "FK\MyWebsiteBundle\Listener\LocaleListener" arguments: [%locale%] tags: - { name: kernel.event_subscriber }
Некоторые фрагменты:
Языковой коммутатор в вашем шаблоне:
{% for locale in ['en', 'fr', 'cn'] %} <li {% if locale == app.request.locale %}class="active"{% endif %}> <a href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale' : locale})) }}">{{ locale }}</a> </li> {% endfor %}
Перенаправление с изменением локали с контроллера:
$LocalizedUrl = $this->get('router')->generate( $request->attributes->get('_route'), ['_locale' => $locale] + $request->attributes->get('_route_params') ); return new \Symfony\Component\HttpFoundation\RedirectResponse($LocalizedUrl);
Вы должны получить экземпляр транслятора, связанный с вашим контейнером ядра symfony:
$this->container->get('translator')->setLocale('fr');