【问题标题】:User select languague and save locale for all session用户选择语言并保存所有会话的区域设置
【发布时间】:2017-10-04 10:15:25
【问题描述】:

我正在使用多种语言的页面。 我在树枝主页上有一个按钮可以在语言之间切换。 当用户单击按钮选择语言时,我正在尝试设置这样的语言环境:

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

这是twig中调用路由privacy_lang的链接:

<a class="privacy enllac-lower" href="{{ path('privacy_lang') }}">Política de privacidad</a>

【问题讨论】:

标签: php symfony session multilingual


【解决方案1】:

使用监听器。先创建一个服务:

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

【讨论】:

    猜你喜欢
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2021-02-05
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多