2013-06-24 35 views
4

我創建了一個控制器,根據加密的GET參數手動設置安全令牌。我用它來創建一個遠程登錄URL,當用戶關注這個鏈接時,它將執行登錄。通過GET參數在Symfony中設置語言環境

現在我想添加語言環境的設置。當提供Lang參數時,它應該設置語言環境。我把它添加到我的控制器中:

$lang = strtolower($lang); 
$this->getRequest()->getSession()->set('_locale', $lang); 
$this->getRequest()->setLocale($lang); 
$this->container->get('translator')->setLocale($lang); 

根據開發欄將_locale變量設置爲設置。語言文件雖然沒有加載,但它回落到默認語言。

我讀過關於創建一個Listener來實現這一點,但在我看來,當你想在URL中提供語言時,這是有用的。我不想將這添加到我的路由中,我只是想在創建會話時設置語言環境。

UPDATE:

我去了 'simulate old beheaviour' 的解決方案,如Symfony的提供。設置請求區域設置似乎不起作用。當我在我的Twig模板中回顯這些時,值不相等:req lang: {{ app.request.locale }} session: {{ app.session.get('_locale') }}。下面發佈的LocaleListener工作正常,我通過插入die()來檢查這個,並且設置翻譯服務的語言環境似乎正在工作。

所以通過設置翻譯器的語言環境,我得到了這個工作。我不明白爲什麼雖然。翻譯服務不應該使用請求語言環境嗎?爲什麼我需要手動設置?

請求對象中的區域設置是否用於翻譯以外的內容?

<?php 
namespace Mb\MyBundle\Listener; 

use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpKernel\KernelEvents; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 

class LocaleListener implements EventSubscriberInterface 
{ 
    private $translator; 

    public function __construct($translator) { 
     $this->translator = $translator; 
    } 

    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $request = $event->getRequest(); 

     if (!$request->hasPreviousSession()) { 
      return; 
     } 

     if (strlen($request->getSession()->get('_locale'))) { 
      $request->setLocale($request->getSession()->get('_locale')); 
      $this->translator->setLocale($request->getSession()->get('_locale')); 
     } 
    } 

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

在我services.yml我:

mb.locale.listener: 
    class: Mb\MyBundle\Listener\LocaleListener 
    arguments: [@translator] 
    tags:An 
     - { name: kernel.event_subscriber } 

如果有人能解釋我這裏發生了什麼,我會非常高興:-)

+0

這也爲我解決了!我還使用了LocaleListener方法,請求在偵聽器中有正確的區域設置,但不再在控制器中。感謝您分享翻譯解決方案。儘管如此,仍然無法告訴你爲什麼會發生這種情況:p – juuga

回答

0

我有同樣的問題,我不知道這取決於聽衆的順序:

php bin/console debug:event-dispatcher顯示

"kernel.request" event 
---------------------- 
Order Callable         Priority 
------------------------------------------------ ---------- 
#1  Symfony\Component\HttpKernel\EventListener\DebugHandlersListener::configure()   2048  
#2  Symfony\Component\HttpKernel\EventListener\DumpListener::configure()     1024  
#3  Symfony\Component\HttpKernel\EventListener\ValidateRequestListener::onKernelRequest() 256  
#4  Symfony\Bundle\FrameworkBundle\EventListener\SessionListener::onKernelRequest()   128  
#5  Symfony\Component\HttpKernel\EventListener\FragmentListener::onKernelRequest()   48   
#6  Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest()   32   
#7  Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest()   16   
#8  Symfony\Component\HttpKernel\EventListener\TranslatorListener::onKernelRequest()  10   
#9  Symfony\Component\Security\Http\Firewall::onKernelRequest()        8   
#10  AppBundle\Service\LocaleListener::onKernelRequest()          0   
#11  Symfony\Bundle\AsseticBundle\EventListener\RequestListener::onKernelRequest()   0   

和#10是我的,應該在#7 LocaleListener之後和#8 TranslatorListener之前,這就是爲什麼我必須在我的服務中回憶翻譯者。