на HTTP-стандарт. Вы должны использовать разные URL для каждой переведенной версии страницы. Остается простое действие, которое выведет из запроса лучший языковой стандарт и перенаправит на соответствующую страницу:
/**
* @Route("/")
*/
public function localeRedirectAction() {
/* @var $request \Symfony\Component\HttpFoundation\Request */
/* @var $session \Symfony\Component\HttpFoundation\Session */
$req = $this->getRequest();
$session = $this->get('session');
$session->setLocale($req->getPreferredLanguage(array('de', 'en')));
return $this->redirect($this->generateUrl('home'));
}
Если вам нужно сделать это для любой страницы, вам, в основном, нужно сделать то же самое, но в Слушателе для kernel.request
-События. Чтобы быть надежно вызванным после того, как route-matcher сделал его работу, вы должны установить priority
слушателя на значение <0: </p>
# services.yml
services:
my_locale_listener:
class: Namespace\LocaleListener
tags: [{ name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: -255 }]
arguments: [ @service_container, [ 'en', 'fr', 'de', 'es', 'it' ] ]
тогда слушатель будет выглядеть так:
class LocaleListener {
public function __construct($container, $availableLocales) {
$this->container = $container;
$this->availableLocales = $availableLocales;
}
public function onKernelRequest(GetResponseEvent $e) {
$req = $e->getRequest();
$locale = $req->getPreferredLanguage($this->availableLocales);
// generate a new URL from the current route-name and -params, overwriting
// the current locale
$routeName = $req->attributes->get('_route');
$routeParams = array_merge($req->attributes->all(), array('_locale' => $locale));
$localizedUrl = $this->container->get('router')->generateUrl($routeName, $routeParams);
$e->setResponse(new RedirectResponse($localizedUrl));
}
}
P.S. я не совсем уверен, что этот код действительно работает, но он должен дать общее представление о том, как это можно сделать.