我正在尝试实施多语种网站。语言是克罗地亚语,英语和德语。在多语言网站中,网址也必须使用不同的语言。所以,如果克罗地亚网址是......
www.example.com/hr/o-nama
英语必须是......
www.example.com/en/about-us
据我所知,Symfony没有这样做的组件。但这不是问题所在。我已设法使用存储当前和上一个区域设置(en
或hr
或de
)的对象来解决该问题,因此当区域设置发生更改时,网站会被重定向到包含相应的区域设置。例如,特定于语言的路由的名称为some_bundle_route_en
或some_bundle_route_hr
。因此,如果当前区域设置为hr
且区域设置已更改,则网站会重定向到some_bundle_route_en
。
这是我实现此系统的Controller事件监听器中的代码......
$controller = $event->getController();
if ( ! is_array($controller)) {
return;
}
if($session->has('prev-locale')) {
$prevLocale = $session->get('prev-locale');
if($prevLocale != $locale) {
$session->set('prev-locale', $locale);
$redirectUrl = $router->generate($this->generateWantedRoute($this->request->get('_route'), $locale));
$event->setController(function() use ($redirectUrl) {
return new RedirectResponse($redirectUrl);
});
return;
}
}
else {
$session->set('prev-locale', $locale);
}
这是程序流程:(让我们说当前的语言环境是hr
)
prev-locale
,请将其设置为当前区域设置。prev-locale
,请检查区域设置是否已更改。prev-locale
设置为当前区域设置并重定向到some_bundle_route_en
。问题是prev-locale
无缘无故地变为en
。我已经彻底调试了它,并且如果prev-locale
和当前区域设置不同,那么区域设置将改变的唯一方式。
首次加载页面时,prev-locale
为hr
,当前区域设置($locale
)也为hr
。但是,如果我再次刷新页面,prev-locale
得到了更改。
现在,the strangest thing is
,如果我将相同的代码从事件监听器复制/粘贴到当前正在执行的控制器,则代码可以正常工作。没有会话问题或奇怪的覆盖。
因此,如果您正在考虑回答此问题,请记住,此相同的代码在控制器中有效,但在事件侦听器中无效。
我知道这是一个很长的问题,所以任何试图回答它的人都会得到我永恒的感激之情。