我试图根据存储在数据库中的当前用户的首选项来设置区域设置。
因此,我们的 User 类有一个 getPreferredLanguage,它返回一个区域设置标识('en'、'fr_FR' 等)。
我考虑过以下方法:
- 注册订阅 KernelEvents::REQUEST 事件的“区域设置”侦听器服务。
- 该服务可以访问安全上下文(通过其构造函数)
- 该服务的 onKernelRequest 方法尝试从安全上下文中获取用户,获取用户的首选区域设置,并将其设置为请求的区域设置。
不幸的是,这不起作用。当调用“locale”侦听器服务的 onRequestEvent 方法时,安全上下文没有令牌。看来上下文侦听器是在很晚的阶段调用的(优先级为 0),并且不可能告诉我的“区域设置”侦听器在安全上下文之前运行。
有谁知道如何解决这种方法,或建议另一种方法?
您可能对区域设置侦听器感兴趣,我在此答案中发布了它:Symfony2 语言环境检测:不考虑会话中的 _locale https://stackoverflow.com/questions/16350846/symfony2-locale-detection-not-considering-locale-in-session/16356280#16356280
编辑:如果用户在个人资料中更改其语言,那没有问题。如果您使用的是 FOSUserBundle (master),您可以挂钩配置文件编辑成功事件。否则,如果您使用的是自制系统,则在您的配置文件控制器中。以下是 FOSUserBundle 的示例:
<?php
namespace Acme\UserBundle\EventListener;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ChangeLanguageListener implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::PROFILE_EDIT_SUCCESS => 'onProfileEditSuccess',
);
}
public function onProfileEditSuccess(FormEvent $event)
{
$request = $event->getRequest();
$session = $request->getSession();
$form = $event->getForm();
$user = $form->getData();
$lang = $user->getLanguage();
$session->set('_locale', $lang);
$request->setLocale($lang);
}
}
并在 services.yml 中
services:
acme.change_language:
class: Acme\UserBundle\EventListener\ChangeLanguageListener
tags:
- { name: kernel.event_subscriber }
对于多个浏览器中的多个会话没有问题,因为每个新会话都需要新的登录。嗯,好吧,更改语言后不会,因为只会更新当前会话。但您可以修改 LanguageListener 以支持这一点。
如果管理员更改语言的情况应该是微不足道的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)