アプリケションをロカラズする
アプリケションをロカラズする
国際的な利用者のために,ob娱乐下载Symfonyは国際化(i18n)とローカライゼーション(l10n)を扱うことができるようになりました。アプリケーションのローカライズはインターフェースの翻訳だけではなく,複数形,日付と通貨のフォーマット,URL,そしてもっと多くのことにも関係します。
urlを国際化する
网址サaapl . aapl .トを国際化するための最初のステップは,网址を国際化することです。Webサイトを翻訳する場合,HTTPキャッシュが適切に使われるように,URLはロケールごとに異なる必要があります。(同じurlを使用してセッションにロケルを保存しないでください.)
特別な_locale
ル,トパラメ,タを使ってル,トのロケ,ルを参照します。
1 2 3 4 5 6 7 8 9 10 11
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -28,7 +28,7 @@类ConferenceController扩展AbstractController {}- #[路由('/',名称:'主页')]+ #[路由('/{_locale}/',名称:'首页')]public函数index(ConferenceRepository $ ConferenceRepository): Response{返回$this->渲染('conference/index.html. html. html. html)嫩枝”,(
ホ,ムペ,ジ上で,url,に応じてロケ,ルが内部的に設定されるようになりました。例えば/ fr /
というurlなら请求- > getLocale ()
の戻り値はfr
になります。
おそらくすべての有効なロケールにコンテンツを翻訳できないので,サポートするロケールのみに制限してください。
1 2 3 4 5 6 7 8 9 10 11
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -28,7 +28,7 @@类ConferenceController扩展AbstractController {}- #[Route('/{_locale}/', name: '首页')]+ #[路线(' / {_locale < en | fr >} / ',名字:“主页”))public函数index(ConferenceRepository $ ConferenceRepository): Response{返回$this->渲染('conference/index.html. html. html. html)嫩枝”,(
各ル,トのパラメ,タは<
と>
で囲まれた正規表現で制限されます。主页
のル,トは_locale
パラメ,タが在
かfr
の時のみ一致します。/ es /
の場合は,一致するル,トがないので404ペ,ジが表示されます。
ほとんどすべてのル,トで同じ要件を使用します。コンテナパラメ,タ,に移動してみましょう。
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
——/ config / services.yaml+ + + b / config / services.yaml@@ -9,6 +9,7 @@ parameters: admin_email: "%env(string:default:default_admin_email: admin_email)%" default_base_url: 'http://127.0.0.1'base_url:“% env(默认值:default_base_url: SYMob娱乐下载FONY_DEFAULT_ROUTE_URL) % '+ app.supported_locale: 'en|fr'Services: # this*文件中服务的默认配置——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -28,7 +28,7 @@类ConferenceController扩展AbstractController {}- #[路线(' / {_locale < en | fr >} / ',名字:“主页”))+ #【路线(' / {_locale < %应用。Supported_locales %>}/', name: '主页')]public函数index(ConferenceRepository $ ConferenceRepository): Response{返回$this->渲染('conference/index.html. html. html. html)嫩枝”,(
言語を追加するにはapp.supported_languages
パラメ,タを更新します。
同じロケ,ルのル,トプレフィクスを他のurlに追加します。
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -36,7 +36,7 @@ class ConferenceController extends AbstractController])->setSharedMaxAge(3600);}- #[Route('/conference_header', name: 'conference_header')]+ #【路线(' / {_locale < %应用。Supported_locales %>}/conference_header', name: 'conference_header')]公共函数conferenceHeader(ConferenceRepository $ ConferenceRepository): Response{返回$this->渲染('conference/header.html. html. html)。twig', [@@ -44,7 +44,7 @@ class ConferenceController extends AbstractController])->setSharedMaxAge(3600);}- #[路线(“/会议/{蛞蝓}”,名字:“会议”))+ #【路线(' / {_locale < %应用。Supported_locales %>}/conference/{slug}', name: 'conference')](Request $ Request, Conference $ Conference,
これでほぼ完了です。/
に一致するル,トはもうありません。/ en /
にリダ@ @レクトさせるようにしましょう。
12 3 4 5 6 7 8 9 10 11 12 13 14 15
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -28,6 +28,12 @@类ConferenceController扩展AbstractController {}+ #(路线(“/”))+公共函数indexNoLocale():响应+ {+返回$this->redirectToRoute('首页',['_locale' => 'en']);+}+#(路线(' / {_locale < %应用。supported_locales%>}/', name: '首页')]公共函数索引(ConferenceRepository $ ConferenceRepository): Response {
全てのメンルトがロケルを認識するようになりました。ペ,ジで生成されたurlは現在のロケ,ルが自動的に付与されているので注意してください。
ロケルのスッチャを追加する
ユ,ザがデフォルトのロケ,ル在
から別のロケ,ルに切り替えれるように,ヘッダ,にス,ッチャ,を追加しましょう:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
——/模板/ base.html.twig+ + + b /模板/ base.html.twig@@ -34,6 +34,16 @@Admin . Admin ++ + data-b -toggle="下拉" aria-haspopup="true" aria-expanded="false">+英语+ < / >+
+ <李> < class = " dropdown-item " href = "{{路径(“主页”,{_locale:“en”})}}" >英语< / > < /李>+ <李> < class = " dropdown-item " href = "{{路径(“主页”,{_locale:“fr”})}}" >法语< / > < /李>+ < / ul >李+ < / >
別のロケ,ルに切り替えるには,_locale
ル,トパラメ,タを路径()
関数に明示的に渡します。
テンプレートを修正して,“英语”とハードコードされたロケールではなく,現在のロケール名を表示するようにしましょう。
1 2 3 4 5 6 7 8 9 10 11
——/模板/ base.html.twig+ + + b /模板/ base.html.twig@@ -37,7 +37,7 @@ .- - - - - -英语+ {{app.request.locale|locale_name(app.request.locale)}}< ul class="dropdown-menu dropdown-menu-right" aria- labledby ="dropdown-language"> English
应用程序
は現在のリクエストへのアクセスを提供するグロバルな树枝変数です。ロケ,ルを人間が読めるような文字列に置換するには,树枝フィルタ,のlocale_name
を使います。
ロケ,ルによっては,ロケ,ル名が常に大文字とは限りません。文字を適切に大文字にするには,ob娱乐下载Symfony字符串コンポーネントと树枝で提供されているUnicode対応のフィルターが必要です。
1
$ob娱乐下载Symfony作曲家req twig/string-extra
1 2 3 4 5 6 7 8 9 10 11
——/模板/ base.html.twig+ + + b /模板/ base.html.twig@@ -37,7 +37,7 @@ .- {{app.request.locale|locale_name(app.request.locale)}}+ {{app.request.locale|locale_name(app.request.locale)|标题}}< ul class="dropdown-menu dropdown-menu-right" aria- labledby ="dropdown-language"> English
これでスイッチャーを介してフランス語から英語に切り替えることができ,全体が良い感じにローカライズに対応しました。
インターフェースを翻訳する
大きなWebサイト上の文章を全て翻訳するのは面倒ですが,幸いなことに,今回作成しているWebサイトはほんの一握りのメッセージしかありません。ではホ,ムペ,ジ上の全ての文章から始めましょう:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
——/模板/ base.html.twig+ + + b /模板/ base.html.twig@@ -20,7 +20,7 @@
树枝フィルタ反式
は入力値に対する現在のロケ,ルへの翻訳を探します。翻訳が見からない場合は配置/包/ translation.yaml
に設定されている缺省语言环境で翻訳します。
1 2 3 4 5 6
框架:default_locale:在翻译:default_path:' % kernel.project_dir % /翻译'回退:-在
Webデバッグの翻訳“タブ”が赤くなっていることに注目してください:
3のメッセジがまだ未翻訳であることがわかります。
“タブ”をクリックして,Sob娱乐下载ymfonyが翻訳を見けられなかったメッセジを一覧表示します。
翻訳を提供する
配置/包/ translation.yaml
ですでに見ているかもしれませんが,翻訳デ,タは翻译/
配下に保存されています。これは自動的に作成されます。
手動でファ电子邮箱ルを更新する代わりに,翻译:提取
コマンドを使用します。
1
$ob娱乐下载Symfony控制台翻译:提取fr——force——domain=消息
このコマンドはfr
ロケル用の翻訳ファルと消息
ドメ▪▪ン用の翻訳ファ▪▪ルを生成します。(——力
フラグを付けることで,既存ファ,ルを更新します)消息
ドメ▪▪ンには,検証やセキュリティエラ▪▪のよob娱乐下载うなSymfony自体から送られてくるものを除いた全ての应用程序メッセ,ジが含まれます。
翻译/消息+ intl-icu.fr.xlf
ファ@ @ルを編集して,フランス語にメッセ@ @ジを翻訳しましょう。フランス語が喋れませんか?お手伝いします:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
——/ /消息+ intl-icu.fr.xlf翻译+ + + + intl-icu.fr.xlf b /翻译/消息@@ -7,15 +7,15 @@ — __会议留言簿 . 0+ <目标>Livre d'Or pour Conferences目标> . <来源>给出你的反馈!> < /来源- __给出你的反馈!> < /目标 + Donnez votre avis ! - <目标> __View目标> < /+ <目标>选择目标> < /
全てのテンプレ,トを翻訳しませんが,も,ろんしていただいても結構です:
フォ,ムを翻訳する
フォ,ムのラベルはob娱乐下载Symfonyの翻訳機能によって自動的に表示されます。カンファレンスペジへ行き,Webデバッグの翻译
タブをクリックすると,翻訳できる全てのラベルを見ることができます。
日付をロカラズする
もしフランス語に切り替えて,いくつかコメントのついたカンファレンスページへ行った場合,コメントの日付が自動的にローカライズされているのに気づくでしょう。これは树枝フィルタ,のformat_datetime
を使っているためで,ロケ,ルを考慮しています。({{发表评论。createdAt|format_datetime('medium', 'short')}}
)
ロ、カラ、ゼ、ションは日付や時間(format_time
) 、通貨 (format_currency
) 、数字 (format_number
)や一般的なもの(パ,センテ,ジ,持続時間,スペルなど)に対応しています。
複数形を翻訳する
翻訳における複数形の管理は,条件に基づいて翻訳を選択するというより一般的な問題の一の使い方です。
カンファレンスペ,ジではコメント数を表示しています:这里有两条评论
。コメントが1であれば有1条评论
と表示しますが,これは間違いです。テンプレ,トを変更して,翻訳可能な文章に換えましょう:
1 2 3 4 5 6 7 8 9 10 11
——/模板/会议/ show.html.twig+ + + b /模板/会议/ show.html.twig@@ -44,7 +44,7 @@
このメッセ:ジでは,もう1の翻訳方法を使いました。英語版のメッセ、ジをテンプレ、トに保、代わりに、一意の識別子に置換しました。この方法は複雑で大量のテキストに適しています。
新しいメッセ,ジを追加して,翻訳ファ,ルを更新します:
12 3 4 5 6 7 8 9 10 11 12 13
——/ /消息+ intl-icu.fr.xlf翻译+ + + + intl-icu.fr.xlf b /翻译/消息@@ -17,6 +17,10 @@<源>会议留言簿源> <目标>Livre d'Or pour会议目标> + + <源> nb_of_comments源> < /+ <目标>{计数,复数,=0 {Aucun commentaire。} =1{1个注释。}other {# commentaires.}}+ < / trans-unit >