Symfony-internationalization
symfony-国際化
- 国際化(i18n)*および*ローカリゼーション(l10n)*は、Webアプリケーションの顧客カバレッジの向上に役立ちます。 symfonyは、この目的のために優れた翻訳コンポーネントを提供します。 この章で翻訳コンポーネントの使用方法を学びましょう。
翻訳を有効にする
デフォルトでは、Symfony Webフレームワークは翻訳コンポーネントを無効にします。 有効にするには、設定ファイルapp/config/config.ymlにトランスレーターセクションを追加します。
framework: translator: { fallbacks: [en] }
翻訳ファイル
翻訳コンポーネントは、翻訳リソースファイルを使用してテキストを翻訳します。 リソースファイルは、PHP、XML、およびYAMLで記述できます。 リソースファイルのデフォルトの場所は app/Resources/translations です。 言語ごとに1つのリソースファイルが必要です。 フランス語の messages.fr.yml というリソースファイルを作成してみましょう。
I love Symfony: J'aime Symfony
I love %name%: J'aime %name%
左側のテキストは英語で、右側のテキストはフランス語です。 2行目はプレースホルダーの使用を示しています。 プレースホルダー情報は、翻訳を使用しながら動的に追加できます。
使用法
デフォルトでは、ユーザーのシステムのデフォルトロケールはSymfony Webフレームワークによって設定されます。 デフォルトのロケールがWebアプリケーションで設定されていない場合、英語にフォールバックします。 ロケールは、WebページのURLでも設定できます。
http://www.somedomain.com/en/index
http://www.somedomain.com/fr/index
この例でURLベースのロケールを使用して、翻訳の概念を簡単に理解してみましょう。 DefaultController(src/AppBundle/Controller/DefaultController.php)のルート /\ {_ locale}/translation/sample で新しい関数 translationSample を作成します。 \ {_ locale}はデフォルトのロケールを指定するためのSymfonyの特別なキーワードです。
/* *
* @Route("/{_locale}/translation/sample", name="translation_sample")
*/
public function translationSample() {
$translated = $this->get('translator')->trans('I love Symfony');
return new Response($translated);
}
ここでは、コンテンツを現在のロケールに翻訳する翻訳方法 trans を使用しました。 この場合、現在のロケールはURLの最初の部分です。 ここで、アプリケーションを実行し、ブラウザにページ http://localhost:8000/en/translation/sample をロードします。
結果は英語で「I love symfony」になります。 ここで、ブラウザにページ http://localhost:8000/fr/translation/sample をロードします。 これで、テキストは次のようにフランス語に翻訳されます。
同様に、twigテンプレートには \ {%trans%} ブロックがあり、ビューでも翻訳機能を有効にします。 これを確認するには、 translationTwigSample と対応するビューを app/Resources/views/translate/indexl.twig に追加します。
/* *
* @Route("/{_locale}/translation/twigsample", name="translation_twig_sample")
*/
public function translationTwigSample() {
return $this->render('translate/indexl.twig');
}
View
{% extends 'basel.twig' %}
{% block body %}
{% trans with {'%name%': 'Symfony'} from "app" into "fr" %}I love %name% {% endtrans %}
{% endblock %}
ここで、transブロックはプレースホルダーも指定します。 ページ結果は次のとおりです。