次のチェックリストを作成しました。
私のtwigテンプレートファイルでは、
{{ 'message'|trans }}
決して翻訳しません。
翻訳を機能させるために、次にどこを見ればよいですか?
使用しているDoctrine Translatable Extensionが何らかの競合を引き起こす可能性はありますか?
Symfony 3.0では、キャッシュをクリアする必要がありました:
php bin/console cache:clear
私はあなたがすでにそれをしたのを見ます、多分それは私のような他の人を助けるでしょう。
設定ファイルで翻訳サービスを有効にしましたか?
framework:
translator: { fallback: en }
言語カタログは、トランスレータが有効になっているかどうかに関係なく、キャッシュフォルダに作成されます。
コントローラで翻訳してみましたか?
$translatedMessage = $this->get('translator')->trans('message');
ドメインを指定 を試してください。デフォルトでドメインを指定しないと、メッセージになります。
_{{ 'message'|trans({}, 'some_domain') }}
_
その後、翻訳は
たとえば、_some_domain.fr.yml
_です。最後のステップは、ロケールを構成することです。 $request->getLocale()
を使用して、リクエストから現在のロケールを取得できます
追伸_rm -r app/cache
_を試行して、キャッシュが削除されていることを確認します
どちらか一方の翻訳は使用できましたが、もう一方は使用できず、理由もわかりませんでした。翻訳にも問題がある場合は、こちらをお読みください。
まず、標準チェックリスト:
php app/console cache:clear
_コマンドを使用してキャッシュをクリアします。$this->getRequest()->setLocale('en');
を呼び出そうとするか、コントローラーで直接$this->get('translator')->trans('Some message');
を使用してみてください。翻訳済みファイルの BOM
に注意してください。 ymlファイルを翻訳する翻訳者はUTF8を使用しましたが、編集者はファイルの先頭にBOMを残しました。 PHPのUTF8 BOMバグ のため、これは危険です。ファイルの最初のセクションに目に見えない文字がほとんど追加されないためです。
ところで、 翻訳のデバッグ も非常に役立ちます。
Symfony Translations Documentation page によると、翻訳の目的で Service Container を使用していない場合、これらは簡単な手順です:
有効化および構成 symfonyの翻訳サービス。
YAML
framework:
translator: { fallbacks: [en] }
PHP
$container->loadFromExtension('framework', array(
'translator' => array('fallbacks' => array('en')),
));
文字列(つまり「メッセージ」)を、トランスレータへの呼び出しでラップして抽象化します( " Basic Translation ")。
public function indexAction()
{
$translated = $this->get('translator')->trans('Symfony is great');
return new Response($translated);
}
翻訳リソース/ファイルを作成 アプリケーション内の各メッセージを翻訳するサポートされているロケールごとに。
Symfonyは次のデフォルトの場所でメッセージファイル(つまり翻訳)を探します:
app/Resources/translations
ディレクトリ;app/Resources/<bundle name>/translations
ディレクトリ;Resources/translations/
任意のバンドル内のディレクトリ。
翻訳ファイル名
翻訳ファイルのファイル名も重要です。各メッセージファイルには、次のパスに従って名前を付ける必要があります:domain。locale。loader(例:ファイル名:navigation.en.xlf
):
ドメイン:メッセージをグループに整理するオプションの方法(例:admin
、navigation
またはデフォルトのmessages
)-参照 メッセージドメインの使用 ;
ロケール:翻訳の対象となるロケール(en_GB、enなど)。ローダー:Symfonyがファイルをロードして解析する方法(例:xlf、php、ymlなど)。
ローダーは、登録済みのローダーの名前にすることができます。デフォルトでは、symfonyは以下を含む多くのローダーを提供します:
xlf
:[〜#〜] xliff [〜#〜]ファイル;php
:[〜#〜] php [〜#〜]ファイル;yml
:[〜#〜] yaml [〜#〜]ファイル。
使用するローダーの選択は完全にあなた次第であり、好みの問題です。 推奨されるオプションは、翻訳にxlf
を使用することです。
決定します ユーザーのロケールを設定および管理します リクエストに対してオプションでユーザーのセッション全体 。
キャッシュをクリアします。
php bin/console c:c
翻訳プロセス
実際にメッセージを翻訳するために、symfonyは単純なプロセスを使用します:
私はすでにあなたの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つの独立した部分です。
同じ問題に直面し、コントローラーアクションの$this->get('translator')->setLocale('fr');
で修正しました。ルートパスに{_locale}
を追加して修正しました。
キャッシュをクリアすることも役に立たなかったので、これは私がそれを機能させるのに役立ちました。
symfony 4.6.2:
次のコマンドを試して翻訳ファイルを更新します。
php bin/console translation:update --dump-messages --force de
(ソース: https://symfony.com/doc/current/translation.html#configuration )