用户 select 语言并为所有会话保存语言环境
User select languague and save locale for all session
我在使用多种语言的页面上工作。
我在树枝主页上有一个按钮可以在语言之间切换。
当用户单击 select 语言的按钮时,我正在尝试像这样设置语言环境:
public function indexLangAction(Request $request, $lang)
{
$session = $this->get('session');
if ($session->has("_locale") && $lang !== $session->get("_locale")) {
$session->set("_locale", $lang);
return new RedirectResponse('/' . $lang);
}
return $this->render('default/index.html.twig', [
'base_dir' => realpath($this-
>getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR,
]);
}
但是当我在同一会话中转到另一个页面时,语言恢复为默认语言。
如何在所有用户会话中保存 _locale
?
怎么设置最好_locale
?我怎样才能从树枝调用控制器?当用户点击按钮更改语言时,如何调用控制器?
privacy_lang:
path: /{_locale}/privacy
defaults: { _controller: AppBundle:Documents:privacy }
requirements:
_locale: en|es|ca
这是调用路由 privacy_lang
:
的树枝中的 link
<a class="privacy enllac-lower" href="{{ path('privacy_lang') }}">Política de privacidad</a>
使用侦听器。先创建一个服务:
AppBundle\EventListener\LocaleListener:
tags:
- { name: kernel.event_subscriber }
LocaleListener.php:
namespace AppBundle\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class LocaleListener implements EventSubscriberInterface {
private $defaultLocale;
public function __construct($defaultLocale = 'en')
{
$this->defaultLocale = $defaultLocale;
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if ($locale = $request->attributes->get('_locale')) {
$request->getSession()->set('_locale', $locale);
} else {
$request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
}
}
public static function getSubscribedEvents()
{
return [KernelEvents::REQUEST => array(array('onKernelRequest', 15))];
}
}
更改语言控制器:
$request->getSession()->set('_locale', 'fr');
我在使用多种语言的页面上工作。 我在树枝主页上有一个按钮可以在语言之间切换。 当用户单击 select 语言的按钮时,我正在尝试像这样设置语言环境:
public function indexLangAction(Request $request, $lang)
{
$session = $this->get('session');
if ($session->has("_locale") && $lang !== $session->get("_locale")) {
$session->set("_locale", $lang);
return new RedirectResponse('/' . $lang);
}
return $this->render('default/index.html.twig', [
'base_dir' => realpath($this-
>getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR,
]);
}
但是当我在同一会话中转到另一个页面时,语言恢复为默认语言。
如何在所有用户会话中保存 _locale
?
怎么设置最好_locale
?我怎样才能从树枝调用控制器?当用户点击按钮更改语言时,如何调用控制器?
privacy_lang:
path: /{_locale}/privacy
defaults: { _controller: AppBundle:Documents:privacy }
requirements:
_locale: en|es|ca
这是调用路由 privacy_lang
:
<a class="privacy enllac-lower" href="{{ path('privacy_lang') }}">Política de privacidad</a>
使用侦听器。先创建一个服务:
AppBundle\EventListener\LocaleListener:
tags:
- { name: kernel.event_subscriber }
LocaleListener.php:
namespace AppBundle\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class LocaleListener implements EventSubscriberInterface {
private $defaultLocale;
public function __construct($defaultLocale = 'en')
{
$this->defaultLocale = $defaultLocale;
}
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if ($locale = $request->attributes->get('_locale')) {
$request->getSession()->set('_locale', $locale);
} else {
$request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
}
}
public static function getSubscribedEvents()
{
return [KernelEvents::REQUEST => array(array('onKernelRequest', 15))];
}
}
更改语言控制器:
$request->getSession()->set('_locale', 'fr');