2016-04-01 14 views
0

私はSymfony 2.6.0を使用します デフォルト言語の代わりにユーザの言語を設定する必要があります。 サービスロケールを変更するには:Symfony 2.6.0のデフォルト言語を変更するには

helper.interactive_login_listener: 
     class: HelperBundle\Listeners\LanguageListener 
     calls: 
      - [ setSession, [@session] ] 
     tags: 
      - { name: kernel.event_listener, event: security.interactive_login, method: setLocaleForAuthenticatedUser } 

helper.language.kernel_request_listener: 
     class: HelperBundle\Listeners\LanguageListener 
     tags: 
      - { name: kernel.event_listener, event: kernel.request, method: setLocaleForUnauthenticatedUser } 

コード:

namespace HelperBundle\Listeners; 

use Symfony\Component\HttpFoundation\Session\Session; 
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; 
use Symfony\Component\HttpKernel\Event\GetResponseEvent; 
use Symfony\Component\HttpKernel\HttpKernelInterface; 

class LanguageListener 
{ 
    private $session; 

    public function setSession(Session $session) 
    { 
     $this->session = $session; 
    } 

    /** 
    * kernel.request event. If a guest user doesn't have an opened session, locale is equal to 
    * "undefined" as configured by default in parameters.ini. If so, set as a locale the user's 
    * preferred language. 
    * 
    * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event 
    */ 
    public function setLocaleForUnauthenticatedUser(GetResponseEvent $event) 
    { 

     if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) { 
      return; 
     } 
     $request = $event->getRequest(); 
     $request->setLocale('ru'); 

    } 

    /** 
    * security.interactive_login event. If a user chose a language in preferences, it would be set, 
    * if not, a locale that was set by setLocaleForUnauthenticatedUser remains. 
    * 
    * @param \Symfony\Component\Security\Http\Event\InteractiveLoginEvent $event 
    */ 
    public function setLocaleForAuthenticatedUser(InteractiveLoginEvent $event) 
    { 

     $this->session->set('_locale', 'ru'); 

    } 
} 

設定:コントローラで

framework: 
    translator:  ~ 
    default_locale: ~ 

namespace HelperBundle\Controller; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 

abstract class PrototypeController extends Controller 
{ 
    protected $model; 
    protected $flashBag; 

    //Метод загрузки модели контроллера 
    abstract function loadServiceModelEvent($model_service_name); 

    //Вывод шаблона 
    protected function renderPage($template, $response) 
    { 
     print $this->get('request')->getLocale().'=='; 
     print $this->get('request')->getSession()->get('_locale'); die(); 

結果の印刷:

ru==ru 

同時に、英語(en)が使用されます。 ただし、設定されている場合

framework: 

translator:  ~ 
default_locale: ru 

すべては問題ありません。 言語を変更するには? ありがとうございました!

+0

を? – eRIZ

+0

デフォルトのロケールを使用します。 "ru"ロケールは有効化されていません。私の英語には申し訳ありません。 –

答えて

0

質問を正しく理解すると、言語がリスナーによって正しく設定されていないという問題があります。この場合のリスナーの問題は、実行の優先順位を設定できないことです。それがEventSubscriberがパーティーに来るときです。

# app/config/services.yml 
services: 
    app.exception_subscriber: 
     class: AppBundle\EventSubscriber\LanguageListener 
     tags: 
      - { name: kernel.event_subscriber } 

その場合のあなたのリスナーは次のようにSTHます:あなたは差が大きいのではなく、getSubscribedEvents機能であなたが(に使用される優先順位を指定することができます見ることができるように

class LanguageListener implements EventSubscriberInterface 
{ 
    private $session; 

    public function setSession(Session $session) 
    { 
     $this->session = $session; 
    } 

    /** 
    * @return array 
    */ 
    public static function getSubscribedEvents() 
    { 
     return [ 
      KernelEvents::REQUEST => [ 
       ['onKernelRequest', 9], 
      ], 
     ]; 
    } 

    public function onKernelRequest(GetResponseEvent $event) 
    { 
    ... 
    } 
} 

この場合9)。優先度について詳しくは、official documentationをご覧ください。

symfonyフレームワークからLocaleListenerを初期化する前にサブスクライバが実行されることを確認する必要があります。そのリスナー(実際には加入者)は設定を「駄目」にし、何かがある場合はデフォルトを設定します。だから、あなたが前にロケールを傍受したら、それはかなりうまくいくはずです。

あなたはCLIコマンドを使って、すべての登録されたリスナーとサブスクライバをチェックすることができます:「同時に」あなたは何を意味するか

php bin/console debug:event-dispatcher 
+0

イベントリスナーとサブスクライバの両方に優先度を設定できます。 –

+0

これはおそらく可能かもしれませんが、公式の文書でさえそれについて何も言わないだけで、それはサブスクライバのための '優先順位'設定だけを言います。リスナーの優先度を変更しようとは決してしなかった:-) –

関連する問題