翻訳する
「国際化」 (i18n と略されることがよくあります) は、プログラムから地域特性を持つ文字列やその他のフラグメントを抽出することを指します。また、ベースに基づいて翻訳および変換できるレイヤーにユーザーを配置するプロセスを指します。ロケール (言語、国など) に応じて。テキストの場合、これは、テキスト (または「情報」) をユーザーが希望する言語に翻訳する関数を使用してテキストの各部分を削除することを意味します。
// 文本始终以英语输出echo 'Hello World'; // 文本将以用户指定语言或默认英语输出echo $translator->trans('Hello World');
ロケールの意味は次のとおりです。単純にユーザーの言語と国です。プログラム内の任意の文字列にすることができ、翻訳やその他の形式情報 (通貨など) を管理するために使用されます。 ISO 639-1 言語コードにアンダースコア (__
) を付け、その後に ISO 3166-1 alpha-2 国コードを続けることをお勧めします。 (fr_FR
このロケールは、「フランス語」フランス語/フランスを参照します)。
この章では、Symfony フレームワークで翻訳コンポーネントを使用する方法を学びます。詳細については、翻訳コンポーネントをご覧ください。全体として、翻訳プロセスには次の手順があります:
文字列は抽象化されます(「xxxx」など)、これは Translator を呼び出してそれらを削除することで実現されます (翻訳の基本 を参照)
サポートされているロケールごとに、プログラム内で翻訳される各文字列の翻訳に使用される翻訳リソース/ファイル を作成します。
リクエスト (リクエスト) およびオプション ユーザーのセッション プロセス全体に基づきます。 、ユーザーのロケール情報を決定、設定、管理します。
構成 ¶
翻訳プロセスは、ユーザー指定のロケールを使用する translator
サービスを通じて処理されます。翻訳された情報を検索して返します。トランスレータを使用する前に、設定ファイルでトランスレータを有効にします:
PHP:// app/config/config.php$container->loadFromExtension('framework', array('translator' => array('fallbacks' => array('en')),));
XML:<!-- app/config/config.xml --><?xml version="1.0" encoding="UTF-8" ?><container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:framework="http://symfony.com/schema/dic/symfony" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd http://symfony.com/schema/dic/symfony http://symfony.com/schema/dic/symfony/symfony-1.0.xsd"> <framework:config> <framework:translator> <framework:fallback>en</framework:fallback> </framework:translator> </framework:config></container>
YAML:# app/config/config.ymlframework:translator: { fallbacks: [en] }
fallbacks キーワード および翻訳言語が見つからない場合の Symfony の処理方法については、詳細については 翻訳中のロケールのロールバック を参照してください。
翻訳に使用されるロケール情報はリクエスト オブジェクトに格納されます。通常、ルーティングでは _locale
属性に設定されます。 ロケールとURLを参照してください。
翻訳の基本 ¶
translator このサービスは、テキストの翻訳を完了する責任があります。テキストのブロック (「メッセージ」と呼ばれ、以下「情報」と呼ばれます) を翻訳するには、trans() メソッドを使用します。たとえば、コントローラー内の単純なメッセージを翻訳したいとします。
// ...use Symfony\Component\HttpFoundation\Response; public function indexAction(){$translated = $this->get('translator')->trans('Symfony is great'); return new Response($translated);}上記のコードが実行されると、Symfony はユーザーの
locale## に基づいて「Symfony は素晴らしいです」メッセージを翻訳しようとします。 #。このプロセスが機能するためには、「翻訳リソース」を通じて翻訳を実行する方法を Symfony に指示する必要があります。一般的に、翻訳ソースは、指定されたロケールに対応する翻訳情報のグループを含むファイルです。これは翻訳用の「辞書」のようなもので、さまざまな形式で作成できますが、XLIFF (注釈: 異なる接尾辞を持つ XML 形式) を使用することをお勧めします。 PHP:// messages.fr.phpreturn array('Symfony is great' => 'J\'aime Symfony',);
YAML:# messages.fr.ymlSymfony is great: J'aime Symfony
XML:<!-- messages.fr.xlf --><?xml version="1.0"?><xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"> <file source-language="en" datatype="plaintext" original="file.ext"> <body> <trans-unit id="symfony_is_great"> <source>Symfony is great</source> <target>J'aime Symfony</target> </trans-unit> </body> </file></xliff>
このようなファイルの保存場所については、翻訳元/ファイル名と場所を参照してください。
ユーザーのロケールがフランス語 (fr_FR# など) の場合、 ## または
fr_BE )、前のメッセージは
J'aime Symfony として翻訳されます。
テンプレートで翻訳を完了することもできます。
¶
メッセージを翻訳するために、Symfony は次の簡潔なプロセスを実行します:- リクエストを決定する最初にオブジェクトに保存されている現在のユーザーの
locale
情報;
- 特定のディレクトリ (メッセージの大規模なグループ) の翻訳された情報が # から取得されます。 # #locale
で決定された翻訳ソース (
fr_FR
など) が読み込まれます。ロケールが存在しない場合は、fallback locale
によって決定された翻訳情報もロードされ、ディレクトリにマージされます。最終的な結果は「翻訳辞書」であり、 ディレクトリから翻訳対象の情報が見つかった場合は、翻訳結果が返されます。それ以外の場合、翻訳者は元の情報を返します。 - trans() メソッドを使用する場合、Symfony は対応するメッセージ ディレクトリから正確な文字列を検索し、それを返します (存在する場合)。
場合によっては、アイテムに次の情報が含まれることがあります。変数の情報を翻訳する必要があります:
use Symfony\Component\HttpFoundation\Response; public function indexAction($name){$translated = $this->get('translator')->trans('Hello '.$name); return new Response($translated);}ただし、このような文字列の場合、対応する翻訳を作成することは不可能です。これは、翻訳者が常に「決定論的な情報」を見つけようとするためです。変数値自体 (たとえば、翻訳者の視点では、「こんにちは、ライアン」と「こんにちは、ファビアン」は 2 つの異なるメッセージです)。
この場合については、コンポーネントのドキュメントの
メッセージ プレースホルダー/メッセージ プレースホルダーを参照してください。テンプレートで同じ状況を処理する方法については、Twig テンプレートを参照してください。 複数処理
¶もう 1 つの複雑な状況は、翻訳中に特定の変数に基づいて「複数の状況」に直面しなければならないことです。
{% trans with {'%name%': 'Fabien'} from "app" %}Hello %name%{% endtrans %} {% trans with {'%name%': 'Fabien'} from "app" into "fr" %}Hello %name%{% endtrans %} {% transchoice count with {'%name%': 'Fabien'} from "app" %}{0} %name%, there are no apples|{1} %name%, there is one apple|]1,Inf[ %name%, there are %count% apples{% endtranschoice %}
trans 修飾子と transchoice 修飾子を使用して、変数テキストと複雑な式を変換できます: {{ message|trans }} {{ message|transchoice(5) }} {{ message|trans({'%name%': 'Fabien'}, "app") }} {{ message|transchoice(5, {'%name%': 'Fabien'}, 'app') }}
{# 标签中被翻译的文本从不被转义#}{% trans %}<h3>foo</h3>{% endtrans %} {% set message = '<h3>foo</h3>' %} {# 变量调节器翻译的字符串和变量,默认将被转义 #}{{ message|trans|raw }}{{ '<h3>bar</h3>'|trans|raw }}