我正在尝试在Symfony中设置 locale ,除了我尝试在布局文件中翻译或生成路径的地方外,一切正常。 我创建了一个监听器,因此我可以在每个请求上设置区域设置。
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class LocaleListener implements EventSubscriberInterface {
private $container;
private $defaultLocale;
public function __construct(ContainerInterface $container, $defaultLocale = 'en') {
$this->container = $container;
$this->defaultLocale = $defaultLocale;
}
public function onKernelRequest(GetResponseEvent $event) {
$request = $event->getRequest();
if (!$request->hasPreviousSession()) {
return;
}
// try to see if the locale has been set as a _locale routing parameter
$loc = $this->defaultLocale;
if ($locale = $request->attributes->get('_locale')) {
//$request->getSession()->set('lang', $locale);
$event->getRequest()->getSession()->set('_locale', $locale);
$event->getRequest()->setLocale($locale);
$loc = $locale;
} else {
// if no explicit locale has been set on this request, use one from the session
$request->setLocale($this->defaultLocale);
$event->getRequest()->getSession()->set('_locale', $this->defaultLocale);
$loc = $this->defaultLocale;
}
$this->container->get('translator')->setLoc($loc);
}
public static function getSubscribedEvents() {
return array(
// must be registered after the default Locale listener
KernelEvents::REQUEST => array(array('onKernelRequest', 15)),
);
}
}
如果在twig模板中,我尝试使用 app.session.get('_ locale')来访问会话变量,该变量存储它应该是的语言环境 - 我得到了所需的结果。但是当我尝试 app.request.locale 时,我得到的默认语言环境不是网址中的默认语言环境。因此,我的所有路由都以默认语言环境为前缀,所有内容都使用默认语言进行翻译。如何从布局中的url获取区域设置并使用它生成路径和翻译?
答案 0 :(得分:0)
您可能只应该使用一种方法来处理区域设置翻译。
我实施了这项行动
/**
* @Route("/{_locale}")
*/
$request->setLocale('en');
$request->getSession()->set('_locale','fr');
$localesArray = [
'request' => $request->getLocale(),
'request_default' => $request->getDefaultLocale(),
'config_default' => $this->getParameter('kernel.default_locale'),
'session_locale' => $request->getSession()->get('_locale'),
'request_attributes' => $request->attributes->get('_locale')
];
var_dump($localesArray);
die();
答案就是这个
array(5) {
["request"]=> string(2) "en"
["request_default"]=> string(2) "nl"
["config_default"]=> string(2) "nl"
["session_locale"]=> string(2) "fr"
["request_attributes"]=> string(2) "es"
}
正如您所看到的,当我通过setLocale更改语言环境时,不会影响其他结果。我得到了结果accessi这个网址" / es"我测试的默认语言环境是" nl"。比较结果
我的建议:仅使用请求区域设置来描述此doc