0

ドキュメントを読んでGoogleで検索した後、あなたに尋ねなければなりません.

ca_ES、es_ES、en_GB の 3 つの言語を切り替えたい

そこで、次のようなコントローラーを作成しました。

/**
 * @Route("/canviar-idioma/{locale}", name="change_lang")
 * @Template()
 * 
 * @return array
 */
public function canviarIdiomaAction($locale){
    $request = $this->getRequest();
    if ($locale == 'cat'){
        $this->get('translator')->setLocale('ca_ES');
        return new Response('ca');
    } else if ($locale == 'es'){
        $this->get('translator')->setLocale('es_ES');
        return new Response('es');
    } else if ($locale == 'eng'){
        $this->get('session')->set('_locale', 'en_GB');
        return new Response('en');
    }

    return new Response(null);
}

このコントローラーは、ユーザーが言語のフラグをクリックすると、ajax によって呼び出されます。「ca」または「es」または「en」を正しく受け取ったので、コントローラーは何らかの形で「機能」しています。ご覧のとおり、セッションで使用したり、翻訳者を取得したりしてみました。どちらの方法でも同じ結果になります。

しかし、ロケールが本当に変更されたかどうかを確認するために、このコントローラーを作成しました。

/**
 * @Route("/quinlocaletinc", name="quinlocaletinc")
 * @Template()
 * 
 * @return array
 */
public function quinlocaletincAction(){
    $request = $this->getRequest();
    return new Response($request->getLocale());
}

そして、このロケールは常に「 ca_ES」を提供します。これは、パラメーターファイルで定義されているものです。

locale: ca_ES

そして私のconfig.yml:

default_locale:  %locale%
translator:      { fallback: %locale% }
4

2 に答える 2

1

ルートで「特別な」_locale変数を使用する必要があります。これにより、Symfony はアプリケーションのロケールを適切に設定します。

詳細については、ドキュメントを参照してください。

ルートは次のようになります。

/**
 * @Route("/canviar-idioma/{_locale}", requirements={"_locale" = "ca_ES|es_ES|en_GB"}, name="change_lang")
 * @Template()
 * 
 * @return array
 */
public function canviarIdiomaAction() {
   $locale = $request->getLocale();

   // ...

2 番目のルートにもパラメータが必要です

/**
 * @Route("/quinlocaletinc/{_locale}", name="quinlocaletinc")
 * @Template()
 * 
 * @return array
 */
public function quinlocaletincAction() {
    $request = $this->getRequest();
    return new Response($request->getLocale());
}

すべてのルートに接尾辞ではなくロケールの接頭辞を付けるのが良い慣例です。

/**
 * @Route("/{_locale}/quinlocaletinc", name="quinlocaletinc")
 * @Template()
 * 
 * @return array
 */
public function quinlocaletincAction() {
    $request = $this->getRequest();
    return new Response($request->getLocale());
}

Symfony で _locale 変数を使用すると、すべてが「機能」します (つまり、/ca_ES/pageそのページのすべてのリンクにアクセスすると、正しい URL が含まれます)。

また、ルートで _locale パラメータを使用する場合は、$this->get('translator')->setLocale('ca_ES');自動的に行われるため不要です。

于 2013-05-24T15:29:09.220 に答える
0

アノテーション ルーティングとコントローラの引数は {_locale} と $_locale である必要があります。

/**
 * @Route("/canviar-idioma/{_locale}", name="change_lang")
 * @Template()
 * 
 * @return array
 */
public function canviarIdiomaAction($_locale)
{
   // ...
于 2013-05-24T15:32:03.210 に答える