1

私はこれに従いますhttp://symfony.com/it/doc/current/cookbook/controller/error_pages.html

しかし、404ページにいるとき、デフォルトのロケールでロケールが変更されます

私のロケールのデフォルトは「it」ですが、en(fooが存在しないmysite/en/foo)にいるとき、ロケールは「it」に切り替わります

このリスナーも試してみますhttp://symfony.com/it/doc/current/cookbook/session/locale_sticky_session.html

そしていつ

if ($locale = $request->attributes->get('_locale')) {

私の $locale は null で、デフォルトのロケールへの切り替え

4

1 に答える 1

0

私は1つの解決策を見つけました。これは最善の解決策ではありませんが、機能します

私のホームページで

ホームページコントローラー

パブリック関数 indexAction()
{
    $request = $this->get('request');
    /**
     * ユーザー言語をセッションに保存します
     */
    $sessionId = $this->get("セッション");
    if($sessionId->get("lingua")==""){
        $this->get('session')->set('lingua', $request->getLocale());
    }

    配列を返す();

}

上書きされた FOSUserBundle の他のバンドル

UserBundle/Controller/RegistrationController.php (例)

パブリック関数 customAction() {

    /**
     * ユーザー言語をセッションに保存します
     */
    $sessionId = $this->container->get("セッション");
    if($sessionId->get("lingua")==""){
        $this->container->get("session")->set('lingua', $this->container->get('request')->getLocale());
    }

    配列を返します(

    );
}

次に、次のようなサービスを作成します: http://symfony.com/doc/current/cookbook/session/locale_sticky_session.html

サービス.xml

サービス:
    acme_locale.locale_listener:
        クラス: Acme\LocaleBundle\EventListener\LocaleListener
        引数: ["%kernel.default_locale%",@session]
        タグ:
            - { 名前: kernel.event_subscriber }

LocaleListener


名前空間 Acme\LocaleBundle\EventListener;

Symfony\Component\HttpKernel\Event\GetResponseEvent を使用します。
Symfony\Component\HttpKernel\KernelEvents を使用します。
Symfony\Component\EventDispatcher\EventSubscriberInterface を使用します。
Symfony\Component\HttpFoundation\Session を使用します。


クラス SnLocaleListener は EventSubscriberInterface を実装します
{
    プライベート $defaultLocale;
    プライベート $ セッション;


    public function __construct($defaultLocale = 'it', $session)
    {
        $this->defaultLocale = $defaultLocale;
        $this->session = $session;
    }

    公開関数 onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();
        if (!$request->hasPreviousSession()) {
            戻る;
        }

        // incapsula la lingua in sessione se esiste
        $locale_session = $this->session->get('lingua');

        if ($locale_session == "") {

            // prova a vedere se il locale sia stato impostato come parametro _locale di una rotta
            if ($locale = $request->attributes->get('_locale')) {
                $request->getSession()->set('_locale', $locale);
            } そうしないと {
                // se non trova un locale esplicito in questa richiesta, usa quello della sessione
                $request->setLocale($request->getSession()->get('_locale', $this->defaultLocale));
            }

        } そうしないと {
            $request->setLocale($request->getSession()->get('_locale', $locale_session));
            $request->getSession()->set('_locale', $locale_session);
            $request->attributes->set('_locale', $locale_session);
        }


    }

    public static function getSubscribeEvents()
    {
        配列を返します(
            // deve essere registrato prima dell'ascoltatore predefinito di locale
            KernelEvents::REQUEST => array(array('onKernelRequest', 17)),
        );
    }
}

申し訳ありませんが、私の英語は完璧ではありません..私にとってこの解決策はうまくいきます。それは最善ではありません

于 2013-10-04T15:27:54.030 に答える