Я только начал с symfony. Я пытаюсь создать многоязычный сайт, но у меня есть проблема с изменением языка.
Я прочитал несколько сообщений, и я прочитал документацию об этом, но локаль не изменилась, я пытаюсь:
public function indexAction() { $this->get('session')->set('_locale', 'fr'); $request = $this->getRequest(); $locale = $request->getLocale(); return $this->render('PhoneMainBundle:Default:index.html.twig',array('locale'=>$locale)); }
но значение в $ locale всегда «en» (мой локаль по умолчанию)
Я также пытаюсь
public function indexAction() { $this->get('session')->set('_locale', 'fr'); $request = $this->getRequest(); $request->setLocale('fr'); $locale = $request->getLocale(); return $this->render('PhoneMainBundle:Default:index.html.twig',array('locale'=>$locale)); }
В этом случае $ locale является fr, но переводы всегда происходят из messages.en.yml
Я бы хотел, чтобы в первый раз обнаружил пользовательский язык с помощью $ _SERVER ['HTTP_ACCEPT_LANGUAGE'], возможно, используя listner для каждой актуализации страницы?
и после того, как я создам маршрут для изменения локали
Но я бы хотел найти способ изменить локаль.
Спасибо за вашу помощь
На основании этого и этого ответа.
LanguageListener.php:
<?php namespace Acme\UserBundle\EventListener; use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\HttpKernel\HttpKernelInterface; class LanguageListener { private $session; public function setSession(Session $session) { $this->session = $session; } public function setLocale(GetResponseEvent $event) { if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) { return; } $request = $event->getRequest(); $request->setLocale($request->getPreferredLanguage(array('en', 'de'))); } }
services.yml:
acme.language.kernel_request_listener: class: Acme\UserBundle\EventListener\LanguageListener tags: - { name: kernel.event_listener, event: kernel.request, method: setLocale }
О неправильном обнаружении локали в веточке может быть много разных причин. Поиск через SO, вы обязательно найдете ответ. Убедитесь, что ваш «_local» var определен правильно, убедитесь, что вы поместили файлы языков в нужное место и т. Д. FInally, прочитайте снова последнюю версию документации: http://symfony.com/doc/current/ книга / translation.html
Однако я добавил это, чтобы сделать его более динамичным
services.yml
services: acme.language.kernel_request_listener: class: Acme\UserBundle\EventListener\LanguageListener tags: - { name: kernel.event_listener, event: kernel.request, method: setLocale } arguments: [ @router, @service_container ]
LanguageListener.php:
<?php namespace Acme\UserBundle\EventListener; use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; use Symfony\Component\HttpKernel\Event\GetResponseEvent; use Symfony\Component\HttpKernel\HttpKernelInterface; class LanguageListener { private $session; private $container; private $router; public function __construct($router, $container) { // ... $this->router= $router; $this->container = $container; } public function setSession(Session $session) { $this->session = $session; } public function setLocale(GetResponseEvent $event) { if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) { return; } $request = $event->getRequest(); $request->setLocale($request->getPreferredLanguage($this->container->parameters['jms_i18n_routing.locales'])); } }
Просто чтобы получить параметры и значения из config.yml.
С уважением, Вик
Если, например, ваш языковой стандарт по умолчанию – французский, за исключением одного контроллера, который вы хотите, чтобы языковой стандарт по умолчанию, установленный на английском, может сделать это:
routing.yml
desktop_comingsoonpage: resource: "@RemmelComparabusBundle/Controller/ComingsoonpageController.php" defaults: { _locale: en } type: annotation
Дополнительная информация: Symfony doc