ステップ28:アプリケーションをローカライズする

5.2版本
维护 没有维护的
5.0

アプリケーションをローカライズする

国際的な利用者のために,欧宝娱乐app下载地址Symfonyは国際化(i18n)とローカライゼーション(l10n)を扱うことができるようになりました。アプリケーションのローカライズはインターフェースの翻訳だけではなく,複数形,日付と通貨のフォーマット,URL,そしてもっと多くのことにも関係します。

URLを国际化

Webサイトを国外化学するの最初のは,网址ををのすること.webサイトを翻訳することにににににににありががありがありURLを使用してセッションにロケールを保存しでください。)

特別な_Locale.ルートパラメータを使ってルートのロケールを参照します。

patch_file.
1 2 3 4 5 6 7 8 9 10 11
——/ src /控制器/ ConferenceController.php+++ b / src / controller / conferenceController.php@@ -33,7 + 33,7 @@类ConferenceController扩展了AbstractController$以下 - >总线= $公共汽车;}- #[路线('/',名称:'主页')]+#[路线('/ {_ locale} /',名称:'主页')]公共函数索引(ConferenceRepository $ ConferenceRepository):响应{$ response =新响应($ this-> twig-> render('conference / index.html.twig',[

ホームページ上で、URLに応じてロケールが内部的に設定されるようになりました。例えば/ fr /というurlなら请求- > getLocale ()の戻り値はFR.ににます。

おそらくすべての有効なロケールにコンテンツを翻訳できないので,サポートするロケールのみに制限してください。

patch_file.
1 2 3 4 5 6 7 8 9 10 11
——/ src /控制器/ ConferenceController.php+++ b / src / controller / conferenceController.php@@ -33,7 + 33,7 @@类ConferenceController扩展了AbstractController$以下 - >总线= $公共汽车;}- #[路线('/ {_ locale} /',名称:'主页')]+ #[路线(' / {_locale < en | fr >} / ',名字:“主页”))公共函数索引(ConferenceRepository $ ConferenceRepository):响应{$ response =新响应($ this-> twig-> render('conference / index.html.twig',[

各ルートのパラメータは<>で囲まれた正规でで制でされますます。主页のルートは_Locale.パラメータがEN.FR.の時のみ一致します。/ es /のの合书,一般するルートがので404ページが表示され。

ほとんどすべてのルートで要件使使ますます。

patch_file.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17 18 19 20 21
--- a / config / services.yaml+++ b / config / services.yaml@@ -7,6 +7,7 @@参数:default_admin_email:(电子邮件保护)Default_domain: '127.0.0.1' default_scheme: 'http'+ app.supported_locales:'en | fr'router.request_context.host:'%env(默认值:default_domain:symfo欧宝娱乐app下载地址ny_default_route_host)%'router.request_context.scheme:'%env(默认:default_scheme:symfony_default_route_scheme)%'——/ src /控制器/ ConferenceController.php+++ b / src / controller / conferenceController.php@@ -33,7 + 33,7 @@类ConferenceController扩展了AbstractController$以下 - >总线= $公共汽车;}- #[路线('/ {_ {locale } /',名称:'主页')]+#[路线('/ {_ locale <%app.supported_locales%>} /',名称:'主页')]公共函数索引(ConferenceRepository $ ConferenceRepository):响应{$ response =新响应($ this-> twig-> render('conference / index.html.twig',[

言语言语加加するにはapp.supported_languagesパラメータを更新します。

同じ同じロケールのルートプレフィクスを他他他のののにににしし

patch_file.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17 17 18 19 20
——/ src /控制器/ ConferenceController.php+++ b / src / controller / conferenceController.php@@ -44,7 +44,7 @@类ConferenceController扩展了抽象的控制器返回$响应;}- #[路线('/ conference_header',名称:'conference_header')]+ #【路线(' / {_locale < %应用。supported_locales % >} / conference_header”,名字:“conference_header”)public function conferenceHeader(ConferenceRepository $ ConferenceRepository): Response {$ Response = new Response($this->twig->render(' ConferenceRepository .html ');嫩枝”,(@@ -55,7 +55,7 @@类conference econtroller扩展了AbstractController返回$响应;}- #[路线('/ conference / {slug}',名称:'会议')]+#[路线('/ {_ {_ locale <%app.supported_locales%>} / conference / {slug}',名称:'会议')]public function show(Request $ Request, Conference $ Conference, CommentRepository $ CommentRepository, NotifierInterface $notifier, string $photoDir): Response {$comment = new comment ();

これでほぼ完了です。/に一致するルートはもうありません。/ en /にリダイレクトさせるようにしましょう。

patch_file.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
——/ src /控制器/ ConferenceController.php+++ b / src / controller / conferenceController.php@@ -33,6 +33,12 @@类ConferenceController扩展了AbstractController$以下 - >总线= $公共汽车;}+#[路线('/')]+公共函数indexnolocale():响应+ {+返回$ this-> redirecttoroute('主页',['_locale'=>'en');+}+#(路线(' / {_locale < %应用。public function index(ConferenceRepository $ ConferenceRepository): Response {

。

ロケールのスイッチャーを追加する

ユーザがデフォルトのロケールEN.からから别のロケールロケールに切り替えようよう,ヘッダーにスイッチャーを追加しましょ

patch_file.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
--- a / templates / base.html.twig+++ b / templates / base.html.twig@@ -34,6 +34,16 @@管理员 + 
  • + +数据 - toggle =“dropdown”aria-haspopup =“true”aria-algended =“false”>+英语+ < / >+ + + + < / div >+
  • 別のロケールに切り替えるには,_Locale.ルートパラメータを小路()関数に明示的に渡します。

    テンプレートを修正して,“英语”とハードコードされたロケールではなく,現在のロケール名を表示するようにしましょう。

    patch_file.
    1 2 3 4 5 6 7 8 9 10 11
    --- a / templates / base.html.twig+++ b / templates / base.html.twig@@ -37,7 + 37,7 @@
  • - - - - - -英语+ {{apprequest .locale|locale_name(app.request.locale)}} 英语
  • 应用程序は現在のリクエストへのアクセスを提供するグローバルな树枝変数です。ロケールを人間が読めるような文字列に置換するには,树枝フィルターのlocale_name.ををます。

    ロケールによっては,ロケール名が常に大文字とは限りません。文字を適切に大文字にするには,欧宝娱乐app下载地址Symfony字符串コンポーネントと树枝で提供されているUnicode対応のフィルターが必要です。

    1
    $ 欧宝娱乐app下载地址symfony composer req twig/string-extra
    patch_file.
    1 2 3 4 5 6 7 8 9 10 11
    --- a / templates / base.html.twig+++ b / templates / base.html.twig@@ -37,7 + 37,7 @@
  • - {{app.request.locale|locale_name(app.request.locale)}}+ {{app.request.locale | locale_name(app.request.locale)| u.title}} 英语
  • 00

    インターフェースを翻訳する

    Webサイトサイト翻訳を开放するに欧宝娱乐app下载地址は,symfony翻译コンポーネントコンポーネントをインストールする必要があり:

    1
    $ 欧宝娱乐app下载地址symfony composer req翻译

    大きなWebサイト上の文章を全て翻訳するのは面倒ですが,幸いなことに,今回作成しているWebサイトはほんの一握りのメッセージしかありません。ではホームページ上の全ての文章から始めましょう:

    patch_file.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 21 22 23 23 29 29 29 29 29 29 32 32
    --- a / templates / base.html.twig+++ b / templates / base.html.twig@@ -20,7 +20,7 @@  >- & # 128217;会议留言板+ & # 128217;{{'会议留言'|trans}} 

    Twigフィルターtransは入力値に対する現在のロケールへの翻訳を探します。翻訳が見つからない場合は配置/包/ translation.yamlに设定されている缺省语言环境で翻訳します。

    1 2 3 4 5 6
    框架default_localeEN.翻译default_path' % kernel.project_dir % /翻译'回退-EN.

    Webデバッグツールバーの翻訳”タブ”が赤くなっていることに注目してください:

    3つつのメッセージがまだ未翻訳であることがわかりわかり翻訳であるであることがわかりわかり

    “タブ”をクリックして,s欧宝娱乐app下载地址ymfonyが翻訳を见つけられたメッセージをを表示表示ししします。

    翻訳を提供する

    配置/包/ translation.yamlですでに見ているかもしれませんが,翻訳データは翻译/これは自动的にます。

    手动でファイルを更新する代わりに,译文:更新コマンドコマンド使使。

    1
    $ 欧宝娱乐app下载地址symfony控制台翻译:更新fr -force --domain=消息

    このコマンドはFR.ロケール用の翻訳ファイル消息ドメイン用の翻訳ファイルを生成します。(——力フラグを付けることで,既存ファイルを更新します)消息ドメインには,検証やセキュリティエラーのような欧宝娱乐app下载地址Symfony自体から送られてくるものを除いた全ての应用程序メッセージが含まれます。

    翻译/消息+ intl-icu.fr.xlfファイルを编集し,フランス语フランス语にメッセージを翻訳しましょましょましょかかかかかかかかます:

    patch_file.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17 18 19 20 21
    ——/ /消息+ intl-icu.fr.xlf翻译+++ b / translations / messages + Intl-Icu.fr.xlf@@ -7,15 +7,15 @ @@  < /来源-   __给出您的反馈!+ Donnez votre avis  View- <目标> __View目标> < /+ <目标>选择目标> < /  <源>会议留言簿-   __会议留言簿+  livre d'或倾注会议  

    全て全てのテンプレートを翻訳しませが,もちろんしていただいても结构结构:

    フォームを翻訳する

    フォームのラベルは欧宝娱乐app下载地址symfonyの翻訳机能によって自动的にに表示さされれれれます。カンファレンスページカンファレンスページ行,网页デバッグツールバーの翻译タブをクリックすると,翻訳できる全てのラベルを见るますことができます。

    日付をローカライズする

    format_datetime.を使っているためで,ロケールを考虑してい。({{comment.createdat | format_datetime('媒体',“短”)}}

    ローカライゼーションは日付や时间(format_time.) 、通貨 (format_currency) 、数字 (format_number.)や一般的なもの(パーセンテージ,持続時間,スペルなど)に対応しています。

    复数形を翻訳する

    翻訳における複数形の管理は,条件に基づいて翻訳を選択するというより一般的な問題の一つの使い方です。

    カンファレンスページではコメント数号表示しています:在那里2评论。コメントが1つば在那里1评论と表示しますが,これは间违いです。テンプレートを変更して,翻訳可能な文章にましょ

    patch_file.
    1 2 3 4 5 6 7 8 9 10 11
    ——/模板/会议/ show.html.twig+++ b / templates / conference / show.html.twig@@ -44,7 +44,7 @@
    < div> -
    有{{评论|长度}}评论。+
    {{'nb_of_comments'| trans({count:comments | length})} {% if previous >= 0 %}
    1 2 3 4 5 6 7 8 9 10 11 12 13
    ——/ /消息+ intl-icu.fr.xlf翻译+++ b / translations / messages + Intl-Icu.fr.xlf@@ -17,6 +17,10 @@会议留言簿  livre d'或play会议 + +  nb_of_comments +  {count,复数,= 0 {aucun注释。} = 1 {1条评论。}其他{#注释。}} + < /身体> < /文件> < / xliff >

    英语の翻訳を提供必要があるので,まだ作业は终わりん。翻译/邮件+ INTL-ICU.EN.XLFファイルを作物成し:

    翻译/邮件+ INTL-ICU.EN.XLF
    1 2 3 4 5 6 7 8 9 10 11 12 13 14
    <?XML Version =“1.0”编码=“UTF-8”?>< xliffXMLNS =“urn: oasis:名称:tc: xliff文档:1.2”版本=“1.2”><文件所谓=“en”目标语言=“en”数据类型=“明文”原始=“file.ext”>
    <工具tool-id =“欧宝娱乐app下载地址symfony”工具名称=“欧宝娱乐app下载地址Symfony”/>< /头><跨单元id =“maMQz7W”resname =“nb_of_comments”><源>nb_of_comments.> < /来源{count,复数,= 0 {没有注释。}一个{有一个注释。}其他{有#评论。}}< / trans-unit >< / xliff >

    ファンクショナルテストを更新する

    URLやコンテンツの変更による,机构テストの更新を忘れないでください:

    patch_file.
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 21 22 23 23 32 32 32 32 32 32 32 32 32 32
    ——/ /控制器/ ConferenceControllerTest.php测试+ + + b /测试/控制器/ ConferenceControllerTest.php@@ -11,7 +11,7 @@类ConferenceControllertest延伸了WebTestCasepublic function testIndex(){$ client = static :: createClient();-  $客户 - >请求('get','/');+ $客户 - >请求('get','/ en /');$以下 - > assertresponseSiseuccessful();$以下 - > AssertselectortextContains('H2','给您的反馈');@@ -20,7 +20,7 @@类ConferenceControllert最延伸WebTestCase公共函数testCommentsubmission(){$ client = static :: createClient();-  $客户 - >请求('get','/会议/ Amsterdam-2019');+客户端- >请求(‘得到’,‘/ en /会议/阿姆斯特丹- 2019);$客户 - > submentform('submity',['comment_form [作者]'=>'fabien','comment_form [text]'=>'来自自动功能测试的一些反馈',@@ -41,7 +41,7 @@类ConferenceControllerTest扩展了WebTestCase公共函数testconfernerferspage(){$ client = static :: createClient();-  $ crawler = $ client->请求('get','/');+ $crawler = $client->request('GET', '/en/');$以下 - > AssertCount(2,$爬网 - >过滤器('H4'));@@ -50,6 +50,6 @@ class conferenceControllertest扩展了webtestcase$以下 - > assertpagetitlecontains('阿姆斯特丹');$以下 - > assertresponseSiseuccessful();$以下 - > AssertselectortContains('H2','Amsterdam 2019');- $this-> assertselectoreexists ('div:contains("有1个注释")');+ $this-> assertselectoreexists ('div:contains("有一条评论")');}}

    这项工作包括代码样本,是在a下获得的许可Creative Commons BY-NC-SA 4.0执照。