翻訳する


「国際化」 (i18n と略されることがよくあります) は、プログラムから地域特性を持つ文字列やその他のフラグメントを抽出することを指します。また、ベースに基づいて翻訳および変換できるレイヤーにユーザーを配置するプロセスを指します。ロケール (言語、国など) に応じて。テキストの場合、これは、テキスト (または「情報」) をユーザーが希望する言語に翻訳する関数を使用してテキストの各部分を削除することを意味します。

// 文本始终以英语输出echo 'Hello World'; // 文本将以用户指定语言或默认英语输出echo $translator->trans('Hello World');

ロケールの意味は次のとおりです。単純にユーザーの言語と国です。プログラム内の任意の文字列にすることができ、翻訳やその他の形式情報 (通貨など) を管理するために使用されます。 ISO 639-1 言語コードにアンダースコア (__) を付け、その後に ISO 3166-1 alpha-2 国コードを続けることをお勧めします。 (fr_FRこのロケールは、「フランス語」フランス語/フランスを参照します)。

この章では、Symfony フレームワークで翻訳コンポーネントを使用する方法を学びます。詳細については、翻訳コンポーネントをご覧ください。全体として、翻訳プロセスには次の手順があります:

  1. Symfony の翻訳サービスを開いて設定します;

  2. 文字列は抽象化されます(「xxxx」など)、これは Translator を呼び出してそれらを削除することで実現されます (翻訳の基本 を参照)

  3. サポートされているロケールごとに、プログラム内で翻訳される各文字列の翻訳に使用される翻訳リソース/ファイル を作成します。

  4. リクエスト (リクエスト) およびオプション ユーザーのセッション プロセス全体に基づきます。 ユーザーのロケール情報を決定、設定、管理します

構成

翻訳プロセスは、ユーザー指定のロケールを使用する 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 は対応するメッセージ ディレクトリから正確な文字列を検索し、それを返します (存在する場合)。

翻訳に関する注意:
メッセージ カタログ

ここでのカタログ (原文はカタログ) は、Symfony の「翻訳」処理プロセスを指します。翻訳ソースから抽出された翻訳情報のセットは、多くのメッセージを含む xliff ファイルです。以下の「翻訳ソース/ファイルの名前と場所」のドメインのセクションを参照してください)

情報プレースホルダー

場合によっては、アイテムに次の情報が含まれることがあります。変数の情報を翻訳する必要があります:

use Symfony\Component\HttpFoundation\Response; public function indexAction($name){$translated = $this->get('translator')->trans('Hello '.$name); return new Response($translated);}

ただし、このような文字列の場合、対応する翻訳を作成することは不可能です。これは、翻訳者が常に「決定論的な情報」を見つけようとするためです。変数値自体 (たとえば、翻訳者の視点では、「こんにちは、ライアン」と「こんにちは、ファビアン」は 2 つの異なるメッセージです)。

この場合については、コンポーネントのドキュメントの

メッセージ プレースホルダー/メッセージ プレースホルダー

を参照してください。テンプレートで同じ状況を処理する方法については、Twig テンプレートを参照してください。 複数処理

もう 1 つの複雑な状況は、翻訳中に特定の変数に基づいて「複数の状況」に直面しなければならないことです。

1
2
There is one apple.
There are 5 apples.

これに対処するには、transChoice() メソッドを使用するか、テンプレートで transchoice タグ/レギュレーターを使用する必要があります。参照ここ# ##。

詳細については、翻訳コンポーネントのドキュメントの

複数形処理の章を参照してください。

テンプレートでの翻訳

ほとんどの場合、翻訳はテンプレート内で行われます。Twig および PHP テンプレートについては、Symfony がネイティブ サポートを提供します。

Twig テンプレート

##Symfony は、「静的テキスト ブロック」情報に特別な Twig タグ (

trans

および transchoice) を提供します。翻訳補助。

{% trans %}Hello %name%{% endtrans %} {% transchoice count %}{0} There are no apples|{1} There is one apple|]1,Inf[ There are %count% apples{% endtranschoice %}


transchoice

タグは、現在のコンテキストから %count% 変数を自動的に取得し、トランスレーターに渡します。このメカニズムは、%var% 形式のプレースホルダーを使用する場合にのみ有効です。

Twig テンプレートでの翻訳に trans/transchoice タグを使用する場合、
%var%

プレースホルダー コメントが必要です。

文字列内でパーセント記号 % を使用する必要がある場合は、次のように 2 回書いてエスケープします。

1
{% trans %}Percent: %percent%%%{% endtrans %}
メッセージ ドメインを指定して追加の変数を渡すこともできます:
{% 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 }}


単一のタグを使用して、twig テンプレート全体の翻訳ドメインを設定できます:

##
1
{% trans_default_domain "app" %}
##

これは現在のテンプレートにのみ影響し、「含まれている」テンプレートには影響しないことに注意してください (副作用を軽減するため)。

PHP テンプレート

トランスレータは、トランスレータ ヘルパーを介して PHP テンプレートでも使用できます:

<?php echo $view['translator']->trans('Symfony is great') ?> <?php echo $view['translator']->transChoice('{0} There are no apples|{1} There is one apple|]1,Inf[ There are %count% apples',10,array('%count%' => 10)) ?>

トランスレーション ソース/ファイルの名前と場所

Symfony は次の場所で情報ファイル (つまり、翻訳/翻訳情報) を探します:

  • ##app/Resources/translationsディレクトリ;

  • ##app/Resources/<バンドル名>/translations

    ディレクトリ;

  • 下の任意のバンドルResources/translations/

    Directory

  • 上記の位置は「優先度の高い順」に並べられています。これは、最初の 2 つのディレクトリのいずれかを使用して、バンドル内の翻訳情報を上書きできることを意味します。

上書きメカニズムはキー レベルに基づいて実行されます。上書きされたキーのみを優先度の高い情報ファイルにリストする必要があります。メッセージ ファイル内でキーが見つからない場合、トランスレーターは優先度の低いメッセージ ファイルに自動的にロールバックします。

情報ファイルのファイル名も非常に重要です。各情報ファイルは、次の名前付けパスに従って命名する必要があります:

domain.locale.loader

:

  • domain

    : これは、メッセージ ファイルをグループ (管理メッセージ、ナビゲーション メッセージ、デフォルト メッセージなど) に整理するためのオプション オプションです。 「メッセージ ドメインの使用」を参照してください。;

  • locale

    : これは、翻訳されたメッセージのロケールです (en_GB、en など)。

  • loader

    : これは、Symfony が情報ファイル (つまり、 xlfphp 、 # をロードおよび解析する方法) です。 ##yml およびその他のファイル接尾辞)。

    Loader (ローダー) には、登録されている任意のローダーの名前を指定できます。 Symfony はデフォルトで次のような多くのローダーを提供します:

    xlf
  • : XLIFF ファイルをロードします;

  • php
  • : PHP ファイルをロードする;

  • yml
  • : YAML ファイルをロードする;

    どのローダーを使用するか選択します。完全にあなたのものです。翻訳情報ファイルとしては、xlf を使用することをお勧めします。その他のオプションについては、
  • メッセージ カタログのロード
を参照してください。

#LoaderInterface
## を実装するカスタム クラスを提供する限り、翻訳情報をデータベースまたはその他の媒体に保存することもできます。 # インターフェース 以上です。詳細については、

translation.loader タグを参照してください。

新しい翻訳リソース (翻訳リソース) を作成するか、翻訳リソースを含むバンドルをインストールするたびに、Symfony が新しい翻訳ソースを検出できるように、必ずキャッシュをクリアしてください。

#
$  php app/console cache:clear
#

翻訳中のロケールのロールバック

ユーザーのロケール情報が fr_FR であり、キーがあなたが翻訳しているのは Symfony は素晴らしいです です。フランス語のメッセージを見つけるために、Symfony は実際にいくつかのロケール翻訳ソースをチェックします:

  1. まず、Symfony は fr_FR 翻訳ソース (例:messages.fr_FR.xlf) をチェックします。情報;

  2. 見つからない場合、Symfony は fr 翻訳ソース (messages.fr.xlf など) で翻訳情報の検索を続けます。

  3. ##それでも見つからない場合、Symfony はフォールバック設定パラメータを使用します。これはデフォルトで
  4. en

    に設定されています (FrameworkBundle 設定情報 を参照)。

Symfony のバージョン 2.6 では、不足している翻訳情報をログに書き込む機能が導入されました。

Symfony が特定のロケールの翻訳情報を見つけられない場合、不足している翻訳情報をログ ファイルに追加します。

ロギング

を参照してください。

データベース コンテンツを翻訳する

データベース コンテンツを翻訳するときは、

Translatable Extension

または ## を使用する必要があります。 Doctrine 拡張機能 #TranslatableBehavior(PHP 5.4)。詳細については、対応するドキュメントを参照してください。

翻訳注:
Doctrine 拡張機能を使用するには 2 つの方法があります。

1 つはクラス ライブラリ メソッドで、もう 1 つはバンドル メソッドです。ここでの翻訳可能な動作とは、バンドルでインストールした後にデータベースのコンテンツを翻訳するときに参照する必要がある使用法を指します)

制約メッセージの翻訳

詳細については、検証制約メッセージの翻訳方法を参照してください。

ユーザーのロケールの処理

翻訳プロセスはユーザーのロケールによって異なります。これに対処する方法については、「ユーザーのロケールを操作する方法」を読んでください。

デバッグ翻訳

debug:translation コマンドライン ステートメントは Symfony 2.5 から導入されました。 Symfony 2.6 より前では、このコマンドは translation:debug でした。

さまざまな言語に翻訳された大量の情報を扱う場合、どの情報が不足していて、どの情報が使用されていないのかを追跡するのが難しい場合があります。

欠落または未使用の翻訳を見つける方法 を読んで、そのような翻訳を見つける方法を学びます。

まとめ

Symfony の翻訳コンポーネントを使用して国際化されたアプリケーションを作成することは、もはや「面倒なプロセス」ではなく、次の簡単な手順で完了します。

  • 翻訳対象の情報をプログラムから抽出し、各情報を

    trans() または transChoice() メソッド (## 経由) に置き換えます。 #Use Translator to learn more);

  • 翻訳メッセージ ファイルを作成して、翻訳する情報を複数のロケール言語に翻訳します。これらのファイルの名前は指定された命名規則に従っているため、symfony は各ファイルを検索して処理できます;
  • ユーザーのロケールを管理し、リクエストに保存できますが、保存することもできます。ユーザーのセッション中。
1