根据HTTP标准,每个翻译版本的页面应使用不同的URL。剩下的是一个简单的操作,它将从请求中推断出最适合使用的语言环境,并重定向到相应的页面。
public function localeRedirectAction() {
$req = $this->getRequest();
$session = $this->get('session');
$session->setLocale($req->getPreferredLanguage(array('de', 'en')));
return $this->redirect($this->generateUrl('home'));
}
如果您需要为任何页面执行此操作,您基本上需要做相同的事情,但是在
kernel.request
事件的侦听器内进行。为了可靠地在路由匹配程序完成其工作后调用它,您应将侦听器的
priority
设置为一个小于0的值:
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));
}
}
注:我并不完全确定这段代码是否能够正常运行,但它应该可以提供关于如何完成此操作的基本思路。
Symfony\Component\HttpFoundation\Request::getPreferredLanguage()
的方法,如果这个方法可用的话应该被调用,但是我在代码中没有找到任何对这个函数的调用。我认为你应该提交一个错误报告。 - greg0ire