web-dev-qa-db-ja.com

symfonyの翻訳が機能しない

次のチェックリストを作成しました。

  1. 形式domain.lang.loaderに従って翻訳ファイルを作成
  2. キャッシュをクリアしました
  3. 言語カタログがキャッシュフォルダに作成されていることを確認しました

私のtwigテンプレートファイルでは、

{{ 'message'|trans }}

決して翻訳しません。

翻訳を機能させるために、次にどこを見ればよいですか?

使用しているDoctrine Translatable Extensionが何らかの競合を引き起こす可能性はありますか?

15
Michael

Symfony 3.0では、キャッシュをクリアする必要がありました:

php bin/console cache:clear

私はあなたがすでにそれをしたのを見ます、多分それは私のような他の人を助けるでしょう。

23
zuzuleinen

設定ファイルで翻訳サービスを有効にしましたか?

framework:
    translator: { fallback: en }

言語カタログは、トランスレータが有効になっているかどうかに関係なく、キャッシュフォルダに作成されます。

コントローラで翻訳してみましたか?

$translatedMessage = $this->get('translator')->trans('message');
23
Ankit Khedekar

ドメインを指定 を試してください。デフォルトでドメインを指定しないと、メッセージになります。

_{{ 'message'|trans({}, 'some_domain') }} 
_

その後、翻訳は

  • カーネルのルートディレクトリ/ Resources/translationsディレクトリ。
  • カーネルルートディレクトリ/ Resources /バンドル名/ translationsディレクトリ。
  • バンドルのResources/translations /ディレクトリ。

たとえば、_some_domain.fr.yml_です。最後のステップは、ロケールを構成することです。 $request->getLocale()を使用して、リクエストから現在のロケールを取得できます

追伸_rm -r app/cache_を試行して、キャッシュが削除されていることを確認します

15
Alexey B.

どちらか一方の翻訳は使用できましたが、もう一方は使用できず、理由もわかりませんでした。翻訳にも問題がある場合は、こちらをお読みください。

まず、標準チェックリスト:

  • トランスレーターを有効にして構成した であることを確認します。
  • 翻訳が適切な場所にある であることを確認してください 適切な命名規則 (domain(デフォルトではメッセージ).lang_code.file_format)。
  • _php app/console cache:clear_コマンドを使用してキャッシュをクリアします。
  • コントローラーで手動で$this->getRequest()->setLocale('en');を呼び出そうとするか、コントローラーで直接$this->get('translator')->trans('Some message');を使用してみてください。
  • それでも機能しない場合は、BOMが翻訳ファイルに含まれていないことを確認してください。それは私の場合でした。

翻訳済みファイルの BOM に注意してください。 ymlファイルを翻訳する翻訳者はUTF8を使用しましたが、編集者はファイルの先頭にBOMを残しました。 PHPのUTF8 BOMバグ のため、これは危険です。ファイルの最初のセクションに目に見えない文字がほとんど追加されないためです。

ところで、 翻訳のデバッグ も非常に役立ちます。

7
Jakub Krol

Symfony Translations Documentation page によると、翻訳の目的で Service Container を使用していない場合、これらは簡単な手順です:

  1. 有効化および構成 symfonyの翻訳サービス。

    • YAML

      framework:
          translator: { fallbacks: [en] }
      
    • PHP

      $container->loadFromExtension('framework', array(
          'translator' => array('fallbacks' => array('en')),
      ));
      
  2. 文字列(つまり「メッセージ」)を、トランスレータへの呼び出しでラップして抽象化します( " Basic Translation ")。

    public function indexAction()
    {
        $translated = $this->get('translator')->trans('Symfony is great');
    
        return new Response($translated);
    }
    
  3. 翻訳リソース/ファイルを作成 アプリケーション内の各メッセージを翻訳するサポートされているロケールごとに。

    Symfonyは次のデフォルトの場所でメッセージファイル(つまり翻訳)を探します:

    • app/Resources/translationsディレクトリ;
    • app/Resources/<bundle name>/translationsディレクトリ;
    • Resources/translations/任意のバンドル内のディレクトリ。

      翻訳ファイル名

      翻訳ファイルのファイル名も重要です。各メッセージファイルには、次のパスに従って名前を付ける必要があります:domainlocaleloader(例:ファイル名:navigation.en.xlf):

      • ドメイン:メッセージをグループに整理するオプションの方法(例:adminnavigationまたはデフォルトのmessages)-参照 メッセージドメインの使用 ;

      • ロケール:翻訳の対象となるロケール(en_GB、enなど)。ローダー:Symfonyがファイルをロードして解析する方法(例:xlf、php、ymlなど)。

      • ローダーは、登録済みのローダーの名前にすることができます。デフォルトでは、symfonyは以下を含む多くのローダーを提供します:

        • xlf[〜#〜] xliff [〜#〜]ファイル;
        • php[〜#〜] php [〜#〜]ファイル;
        • yml[〜#〜] yaml [〜#〜]ファイル。

          使用するローダーの選択は完全にあなた次第であり、好みの問題です。 推奨されるオプションは、翻訳にxlfを使用することです

  4. 決定します ユーザーのロケールを設定および管理します リクエストに対してオプションでユーザーのセッション全体

  5. キャッシュをクリアします。

    php bin/console c:c
    

翻訳プロセス

実際にメッセージを翻訳するために、symfonyは単純なプロセスを使用します:

  • リクエストに保存されている現在のユーザーのロケールが決定されます。
  • 翻訳されたメッセージのカタログ(大きなコレクションなど)は、ロケールに定義された翻訳リソース(fr_FRなど)から読み込まれます。フォールバックロケールからのメッセージもロードされ、まだ存在しない場合はカタログに追加されます。最終結果は、翻訳の大きな「辞書」になります。
  • メッセージがカタログにある場合、翻訳が返されます。そうでない場合、翻訳者は元のメッセージを返します。
6
Pmpr

私はすでにあなたの2つの質問に答えることができます:

1:あなたは見ることができます

https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Twig/Extension/TranslationExtension.php#L97https://github.com/ symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Translation/Translator.phphttps://github.com/symfony/symfony/blob/master/src/Symfony/Component/ Translation/Translator.php#L174

2:gedmo doctrine extensions、またはKnplabs DoctrineBehaviorsについて話している場合、いいえ、symfonyのトランスレータと競合することはありません。これらは2つの独立した部分です。

0
Florian

同じ問題に直面し、コントローラーアクションの$this->get('translator')->setLocale('fr');で修正しました。ルートパスに{_locale}を追加して修正しました。

0
R Sun

キャッシュをクリアすることも役に立たなかったので、これは私がそれを機能させるのに役立ちました。

symfony 4.6.2:

次のコマンドを試して翻訳ファイルを更新します。

php bin/console translation:update --dump-messages --force de

(ソース: https://symfony.com/doc/current/translation.html#configuration

0
AlexioVay