Php 如何在会话期间配置Symfony2粘性区域设置
我想翻译我的网站感谢在右上方的链接 我发现,自symfony2.1以来,区域设置不再存储在会话中 因此,我遵循了Symfony文档: …Bundle/Service/LocaleListener.phpPhp 如何在会话期间配置Symfony2粘性区域设置,php,symfony,locale,multilingual,Php,Symfony,Locale,Multilingual,我想翻译我的网站感谢在右上方的链接 我发现,自symfony2.1以来,区域设置不再存储在会话中 因此,我遵循了Symfony文档: …Bundle/Service/LocaleListener.php class LocaleListener implements EventSubscriberInterface { private $defaultLocale; public function __construct($defaultLocale) {
class LocaleListener implements EventSubscriberInterface
{
private $defaultLocale;
public function __construct($defaultLocale)
{
$this->defaultLocale = $defaultLocale;
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
$locale = $request->attributes->get('_locale');
var_dump($locale);
if ($locale) {
$request->getSession()->set('_locale', $locale);
} else {
$request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
}
}
static public function getSubscribedEvents()
{
return array(
// must be registered before the default Locale listener
KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
);
}
}
…Bundle/Resources/config/services.yml
locale_listener:
class: ..Bundle\Service\LocaleListener
arguments: ["%kernel.default_locale%"]
tags:
- { name: kernel.event_subscriber }
framework:
translator: { fallback: en }
/app/config/config.yml
locale_listener:
class: ..Bundle\Service\LocaleListener
arguments: ["%kernel.default_locale%"]
tags:
- { name: kernel.event_subscriber }
framework:
translator: { fallback: en }
并且,我添加了两个链接来在父细枝模板上翻译我的网站,如下所示()
base.html.twig
<li><a href="{{-
path(app.request.get('_route'),
app.request.get('_route_params')|merge({'_locale' : 'fr'}))
-}}">FR</a></li>
<li><a href="{{-
path(app.request.get('_route'),
app.request.get('_route_params')|merge({'_locale' : 'en'}))
-}}">EN</a></li>
因此,\u locale
参数的值是fr
。因此,我的网站应该翻译成法语
然而,
var_dump($locale)
在侦听器中,将显示三次:
\u locale
参数在显示null
时找不到,为什么en
使用侦听器,您将捕获所有不需要的请求和子请求。这就解释了三次幻影 尝试将以下代码添加到
onKernelRequest
方法中:
if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) {
return;
}
这将避免子请求,并可能解决您的问题。好的,我在onKernelRequest方法的顶部添加了它。现在,我只显示了两个“null”。。但这并不能解决我的问题。在我的侦听器中,我使用
$request->get('u locale')
而不是$request->attributes->get('u locale')
,你能试试吗?好的。现在,它在每个实例中都显示“en”,尽管url是满意度?\u locale=fr
。。。(顺便说一句,感谢您的帮助)如注释所示,您的区域设置侦听器必须在默认区域设置侦听器之前注册。在我的Symfony 2.3项目中,默认的区域设置listner的优先级为16。尝试将侦听器的优先级更改为10,例如,或更低…这里是我的区域设置侦听器,如果您想检查:我在其上添加了数据库区域设置存储功能,您可以忽略此项。\u locale
应该是url层次结构的一部分,如example.com/{u locale}/suitation
而不是GET参数(example.com/successment?\u locale=fr
)