用户 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');