Symfony2语言环境不会在AJAX请求中持久存在

时间:2015-01-21 15:02:12

标签: php jquery ajax symfony

我有一个自定义LocaleListner,它在数据库中保留选择的区域设置:

class LocaleListener implements EventSubscriberInterface
{
    private $defaultLocale;

    private $securityContext;

    private $em;

    public function __construct($defaultLocale, SecurityContext $securityContext, EntityManager $em)
    {
        $this->defaultLocale = $defaultLocale;
        $this->securityContext = $securityContext;
        $this->em = $em;
    }

    static public function getSubscribedEvents()
    {
        return array(
            // must be registered before the default Locale listener
            KernelEvents::REQUEST => array(
                array('onKernelRequest', -50)
            ),
        );
    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) {
            return;
        }

        $request = $event->getRequest();
        // Impersonate account check
        if (!$request->hasPreviousSession()) {
            return;
        }

        $user = null;
        if ($this->securityContext->getToken()) {
            $user = $this->securityContext->getToken()->getUser();
        }

        if ($locale = $request->get('_locale')) {
            $request->getSession()->set('_locale', $locale);
            if (null !== $user && $user != 'anon.' && $user->getLocale() !== $locale) {
                $user->setLocale($locale);
                $this->em->persist($user);
                $this->em->flush();
            }
        } else if ($user instanceof User && null !== $user->getLocale()) {
            $request->getSession()->set('_locale', $user->getLocale());
        }

        $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
    }
}

这非常有效,但如果我使用 AJAX请求调用控制器,则完全忽略语言环境。

实际上,默认语言环境是fr。如果我选择en locale并发出ajax请求,则返回的模板将翻译为法语,而不是英语。

这怎么可能?

感谢。

EDIT。

这里是我的javascript ajax电话(咖啡):

refreshUrl = Routing.generate('ticket_index') + location.search
setInterval =>
  $.get refreshUrl, { _ajax: 1 }, (data) =>
    @tbody.html data
    momentFromNow()
, 10000

我已经尝试在ajax请求中添加_locale参数,但不起作用。

2 个答案:

答案 0 :(得分:1)

终于找到了为什么这不起作用。

选择的优先级导致此问题,将-50更改为17解决所有问题。

但我根本不明白为什么优先影响AJAX请求的翻译......

如果有人有解释,我会听到! ;)

感谢Alexandru Olaru寻求帮助。

答案 1 :(得分:0)

发布ajax请求非常好我猜测问题可能来自你在ajax中发送的数据。

$.ajax({
   url: path_to_your_controller,
   data: {'_locale': 'en'} //you probably are missing this part
})