明信片Anwendung lokalisieren
明信片Anwendung lokalisieren
麻省理工学院朝向internationalen Nutzerkreis是Symfonyob娱乐下载 seit jeh der拉赫,Internationalisierung (i18n)和Lokalisierung (l10n) ohne weiteres祖茂堂bewaltigen。贝der Lokalisierung静脉Anwendung蒙特es不努尔嗯Ubersetzung der Benutzeroberflache死去,sondern欧什嗯Mehrzahlformen,论据——和Wahrungsformatierung、url和更多。
url internationalisieren
Der奥地利第一储蓄Schritt苏珥Internationalisierung Der网站是死Internationalisierung Der url。贝der Ubersetzung静脉网站sollten死URL pro Sprache unterschiedlich盛,该死http缓存problemlos funktionieren (verwende niemals死gleiche URL和speichere死Sprache der会话)。
Nutze窝speziellen Routen-Parameter_locale
,死在Routen Sprache祖茂堂verwenden:
1 2 3 4 5 6 7 8 9 10 11
- - - / src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -33 7 + 33 7 @@类ConferenceController AbstractController $ this - >扩展总线= $总线;}- #[路线(“/”,名字:“主页”))+ #[路线(“/ {_locale} /”,名字:“主页”))公共函数指数(ConferenceRepository ConferenceRepository美元):{$响应响应= new响应($ this - >树枝>渲染(会议/ index . html。嫩枝”,(
Auf der主页将嫩死Sprache实习生abhangig von der URL gesetzt;z。b .有$请求- > getLocale ()
爹妈fr
选择,要是杜/ fr /
eintippst。
杜达窝目录wahrscheinlich永远在艾伦说ubersetzen kannst, beschranke zulassigen死去_locale
-Werte汪汪汪说死去,死杜unterstutzen想:
1 2 3 4 5 6 7 8 9 10 11
- - - / src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -33 7 + 33 7 @@类ConferenceController AbstractController $ this - >扩展总线= $总线;}- #[路线(“/ {_locale} /”,名字:“主页”))+ #[路线(' / {_locale < en | fr >} / ',名字:“主页”))公共函数指数(ConferenceRepository ConferenceRepository美元):{$响应响应= new响应($ this - >树枝>渲染(会议/ index . html。嫩枝”,(
杰德Routen-Parameter萤石的军队杯regularen Ausdruck innerhalb<
>
eingeschrankt了。死主页
要是der Routen-Parameter路线passt现在努尔带_locale
在
奥得河fr
坚持。关切的/ es /
einzutippen, Du solltest杯404 - fehler bekommen, da passt路线。
艾伦达我们死gleiche Anforderung在快速Routen verwenden了,verschieben我们您在Container-Parameter:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
- - - / config / services.yaml+ + + b / config / services.yaml@@ 7,6 + 7,7 @@参数:default_admin_email: admin@example.com default_domain: 127.0.0.1的default_scheme:“http”+ app.supported_locales:“en | fr”router.request_context。主持人:' % env(默认值:default_domain: SYMob娱乐下载FONY_DEFAULT_ROUTE_HOST) %的router.request_context。方案:' % env(默认值:default_scheme: SYMFONob娱乐下载Y_DEFAULT_ROUTE_SCHEME) % '- - - / src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -33 7 + 33 7 @@类ConferenceController AbstractController $ this - >扩展总线= $总线;}- #[路线(' / {_locale < en | fr >} / ',名字:“主页”))+ #【路线(' / {_locale < %应用。supported_locales % >} /”,名字:“主页”)公共函数指数(ConferenceRepository ConferenceRepository美元):{$响应响应= new响应($ this - >树枝>渲染(会议/ index . html。嫩枝”,(
Das Hinzufugen静脉Sprache萤石的军队Aktualisieren desapp.supported_languages
参数erfolgen。
Fuge窝anderen url das gleiche lokale Routenprafix hinzu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
- - - / src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php7 + 44 @@ -44年,7美元@@类ConferenceController扩展AbstractController返回响应;}- #[路线(“/ conference_header”,名字:“conference_header”))+ #【路线(' / {_locale < %应用。supported_locales % >} / conference_header”,名字:“conference_header”)公共函数conferenceHeader (ConferenceRepository ConferenceRepository美元):{$响应响应= new响应($ this - >树枝>渲染(会议/ header.html。枝”,[@@ -55 7 + 55岁,7美元@@类ConferenceController扩展AbstractController返回响应;}- #[路线(“/会议/{蛞蝓}”,名字:“会议”))+ #【路线(' / {_locale < %应用。supported_locales % >} /会议/{蛞蝓}”,名字:“会议”)公共函数显示(请求请求美元,美元会议,会议CommentRepository CommentRepository美元,美元NotifierInterface通知,字符串photoDir美元):反应{$评论=新的评论();
多数时候我们信德快。我们有keine路线较多,祖茂堂死去/
passt。Fugen我们您wieder和leiten您到/ en /
魏特:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
- - - / src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -33年33岁的6 + 12 @@类ConferenceController AbstractController $ this - >扩展总线= $总线;}+ #(路线(“/”))+公共职能indexNoLocale():反应+ {+ $ this - > redirectToRoute返回(“主页”,(“_locale”= >“en”));+}+#(路线(' / {_locale < %应用。supported_locales % >} /”,名字:“主页”)]公共函数指数(ConferenceRepository ConferenceRepository美元):反应{
Da嫩阿莱Hauptrouten杯‘_locale‘参数有,sieht男人,dass死generierten url天改Seiten automatisch死aktuelle Sprache berucksichtigen。
靠窗户Sprachwechsler hinzufugen
该死Benutzer * innen von der Standard-Sprache在
祖茂堂静脉anderen wechseln能帮,fugen我们杯Sprachwechsler im头hinzu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
- - - /模板/ base.html.twig+ + + b /模板/ base.html.twig6 + 34 @@ -34年,16 @@李管理< / > < / >+ <李类= " nav-item拉" >+ < class = " nav-link dropdown-toggle " href = " # " id =“dropdown-language”角色=“按钮”+ data-bs-toggle =“下拉”aria-haspopup = " true " aria-expanded =“false”>+英语+ < / >+ < ul类= "下拉菜单dropdown-menu-right”aria-labelledby = " dropdown-language " >+ <李> < class = " dropdown-item " href = "{{路径(“主页”,{_locale:“en”})}} " > < / > < /李>英语+ <李> < class = " dropdown-item " href = "{{路径(“主页”,{_locale:“fr”})}} " > < / > < /李>法语+ < / ul >李+ < / >< / ul > < / div > < / div >
嗯祖茂堂einem anderen Sprache祖wechseln ubergeben我们explizit den Routen-Parameter_locale
一个死路径()
-Funktion。
Aktualisiere das模板,嗯窝aktuellen Sprach-Namen anstelle des电影节geschriebenen anzuzeigen“英语”:
1 2 3 4 5 6 7 8 9 10 11
- - - /模板/ base.html.twig+ + + b /模板/ base.html.twig@@ -37年,37岁的7 + 7 @@<李class = " nav-item拉" > < class = " nav-link dropdown-toggle " href = " # " id =“dropdown-language”角色=“按钮”data-bs-toggle =“下拉”aria-haspopup = " true " aria-expanded =“false”>- - - - - -英语+ {{app.request.locale | locale_name (app.request.locale)}}< / > < ul类= "下拉菜单dropdown-menu-right”aria-labelledby = " dropdown-language " > <李> < class = " dropdown-item " href = "{{路径(“主页”,{_locale:“en”})}} " > < / > < /李>英语
应用程序
这是这个整体Twig-Variable,死穴Zugriff天改ermoglicht aktuellen请求。嗯das Sprachkurzel ein lesbares麦芽汁祖konvertieren verwenden我们窝Twig-Filterlocale_name
。
Abhangig von der Sprache将der名字der Sprache不总是großgeschrieben。嗯Satze richtig groß祖茂堂事实benotigen我们杯entsprechenden过滤器,der麻省理工学院Unicode umgehen萤石,以色列立ihn死Symfony String-Komponente您Twig-Iob娱乐下载mplementierung bereitstellen:
1
美元ob娱乐下载symfony作曲家点播树枝/ string-extra
1 2 3 4 5 6 7 8 9 10 11
- - - /模板/ base.html.twig+ + + b /模板/ base.html.twig@@ -37年,37岁的7 + 7 @@<李class = " nav-item拉" > < class = " nav-link dropdown-toggle " href = " # " id =“dropdown-language”角色=“按钮”data-bs-toggle =“下拉”aria-haspopup = " true " aria-expanded =“false”>- {{app.request.locale | locale_name (app.request.locale)}}+ {{app.request.locale | locale_name (app.request.locale) | u。标题}}< / > < ul类= "下拉菜单dropdown-menu-right”aria-labelledby = " dropdown-language " > <李> < class = " dropdown-item " href = "{{路径(“主页”,{_locale:“en”})}} " > < / > < /李>英语
Du kannst修女uber窝Sprachwechsler冯Franzosisch auf Englisch umschalten和对整个Oberflache passt西奇肖恩一个:
Das接口ubersetzen
死Ubersetzung jed einzelnen satz auf静脉großen网站萤石muhsam盛,但glucklicherweise有我们努尔一张Handvoll柏林(消息)unser汪汪汪的网站。Beginnen我们麻省理工学院艾伦Satzen der主页:汪汪汪
1 2 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.twig7 @@ @@ -20年7 + 20日<导航类= "导航navbar-expand-xl navbar-light bg-light”> < div class = "容器mt-4 mb-3”> < class = " navbar-brand我pr-2 " href = "{{路径(主页)}}" >- & # 128217;会议留言板+ & # 128217;{{“会议留言板”|反式}}< / > <按钮类= " navbar-toggler border-0 " type = "按钮" data-bs-toggle =“崩溃”data-bs-target = " # header-menu " aria-controls =“navbarSupportedContent aria-expanded”=“false”aria-label = "显示/隐藏导航" >- - - /模板/会议/ index.html.twig+ + + b /模板/会议/ index.html.twig@@ 4、7 + 4,7 @@{%块体%}< h2类= " mb-5 " >——给你的反馈!+{{'给你的反馈!“|反式}}< / h2 >{%在会议|行批处理(4)%}7 @@ @@ -21年7 + 21日< a href = "{{路径(“会议”,{蛞蝓:会议。蛞蝓})}}”class = " btn btn-sm btn-primary stretched-link " >——视图+{{‘视图’|反式}}< / > < / div > < / div >
Der Twig-Filter反式
在死aktuelle sucht去静脉Ubersetzung der gegebenen Eingabe Sprache。的意思要是gefunden将,将您改模Standard-Sprachezuruckgesetzt,死在配置/包/ translation.yaml
konfiguriert坚持:
1 2 3 4 5 6
框架:default_locale:在翻译:default_path:' % kernel.project_dir % /翻译'回退:- - - - - -在
Beachte dass der翻译——“选项卡”der Web-Debug-Toolbar腐烂geworden坚持:
Das“爹妈,dass 3后还有不ubersetzt信德。
Klicke天改“选项卡”,嗯阿莱柏林aufzulisten,皮毛死Symfony keine Ubersetzung gefob娱乐下载unden帽子:
Ubersetzungen erstellen
你叫杜vielleicht肖恩配置/包/ translation.yaml
gesehen所,了Ubersetzungen einem翻译/
-Stammverzeichnis gespeichert, das automatisch毛皮爹妈erstellt,。
Verwende窝翻译:提取
-Befehl, anstatt死Ubersetzungsdateien manuell祖茂堂erstellen:
1
美元ob娱乐下载symfony控制台翻译:提取fr -力-域=消息
这位Befehl erzeugt一张Ubersetzungsdatei (——力
国旗)毛皮Sprache死去fr
和死消息
-Domane。死消息
-Domane enthalt阿莱Anwendungsmeldungen走错,Symfony selbst来,是ob娱乐下载不是那些Validierungs -奥得河Sicherheitsfehler。
Bearbeite死翻译/消息+ intl-icu.fr.xlf
Franzosisch -Datei和ubersetze死后再见。Sprichst Du凯文Franzosisch吗?我萤石Dir helfen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
- - - /翻译/消息+ intl-icu.fr.xlf+ + + + intl-icu.fr.xlf b /翻译/消息15 @@ @@ 7日15 + 7,<身体> < trans-unit id = " eOy4.6V " resname = "会议留言板" > <源>会议留言板源> < /- <目标> __Conference留言板目标> < /+ <目标>里弗d ' or倒会议目标> < /< / trans-unit > < trans-unit id = " LNAVleg " resname = "给你的反馈!> <源>给你反馈! > < /来源——<目标> __Give你反馈! < /目标>+ <目标> Donnez你们认为! < /目标>< / trans-unit > < trans-unit id =“3 mg5paf”resname =“视图”> <源>视图> < /来源- <目标> __View目标> < /+ <目标>选择目标> < /< / trans-unit > < /身体> < /文件>
Beachte,采掘带我们走错阿莱Vorlagen ubersetzen了,但zogere走错,死祖茂堂桶:
Formulare ubersetzen
表单标签了冯Symfony automatisob娱乐下载ch uber das Ubersetzungssystem angezeigt。去一杯Konferenzseite和汪汪汪klicke der Web-Debug-Toolbar天改标签“翻译”;杜solltest阿莱标签看清,死ubersetzt了:
Das基准面ubersetzen
要是Du祖茂堂Franzosisch wechselst祖静脉Konferenz网站你死静脉洼地Kommentare帽子,腕Du merken dass das基准进行Kommentares automatisch angepasst,。Das funktioniert, weil我们窝Twig-Filterformat_datetime
benutzen, der死Sprache berucksichtigt ({{发表评论。createdAt | format_datetime(“媒介”,“短”)}}
)。
死Lokalisierung funktioniert毛皮基准,他(format_time
),Wahrungen (format_currency
)和Zahlen (format_number
)我Allgemeinen (Prozent多尔,Buchstabieren…)。
Mehrzahlformen ubersetzen
死Verwaltung冯Mehrzahlformen在Ubersetzungen是菩提树des ublichen问题,风景明信片Ubersetzung basierend auf静脉Bedingung auszuwahlen。
再见,静脉Konferenzseite将死Anzahl der Kommentare angezeigt:有两个评论
。毛皮1 Kommentar请给我们有1的评论
一个是falsch坚持。安德利果汁死滑雪的前倾姿势,嗯窝Satz在一张ubersetzbare Nachricht祖茂堂konvertieren:
1 2 3 4 5 6 7 8 9 10 11
- - - /模板/会议/ show.html.twig+ + + b /模板/会议/ show.html.twig7 + 44 @@ -44年,7 @@< / div > < / div > {% endfor %}——< div >有{{评论|长度}}评论。< / div >+ < div > {{“nb_of_comments”|反式({长度数:评论|})}}< / div >{%如果先前> = 0%}< a href = "{{路径(“会议”,{蛞蝓:会议。蛞蝓,抵消:以前})之前}}" > < / > {% endif %}
毛这Nachricht有我们一张安德利果汁Ubersetzungsstrategie gewahlt。Anstatt死英镑版本der滑雪的前倾姿势祖茂堂behalten,有我们您的军队ersetzt eindeutigen标识符。这策略funktioniert贝komplexen和großen Textmengen贝瑟。
Aktualisiere Ubersetzungsdatei死去,indem杜死neue Nachricht hinzufugst:
1 2 3 4 5 6 7 8 9 10 11 12 13
- - - /翻译/消息+ intl-icu.fr.xlf+ + + + intl-icu.fr.xlf b /翻译/消息10 @@ @@ -17年6 + 17日<源>会议留言板< /源> <目标>里弗d ' or倒会议< /目标> < / trans-unit >+ < trans-unit id = " Dg2dPd6“resname = " nb_of_comments " >+ <源> nb_of_comments源> < /+ <目标>{数、复数、= 0{没有commentaire。{1 commentaire} = 1。}other {# commentaires.}}< /span>+ < / trans-unit >< /身体> < /文件> < / xliff >
我们信德还有不多数时候,da我们嫩模英镑Ubersetzung苏珥Verfugung stellen得。Erstelle死翻译/消息+ intl-icu.en.xlf
-Datei:
Funktionale测试aktualisieren
Vergiss走错,死funktionalen测试祖茂堂aktualisieren, url和Inhaltsanderungen aufzunehmen:
1 2 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 32 33 34 35 36 37
- - - /测试/控制器/ ConferenceControllerTest.php+ + + b /测试/控制器/ ConferenceControllerTest.php@@ -11 7 + 11 7 @@类ConferenceControllerTest WebTestCase延伸公共函数testIndex(){$客户=静态:createClient ();-客户- >请求(‘得到’,‘/’);+ $客户- >请求(‘得到’,' / en / ');$ this - > assertResponseIsSuccessful ();$ this - > assertSelectorTextContains (h2,给你反馈);@@ -20 7 + 20 7 @@类ConferenceControllerTest WebTestCase延伸公共函数testCommentSubmission(){$客户=静态:createClient ();-客户- >请求(‘得到’,' /会议/阿姆斯特丹- 2019 ');+ $客户- >请求(‘得到’,‘/ en /会议/阿姆斯特丹- 2019);$客户- > submitForm(‘提交’,‘comment_form(作者)”= >“法”,“comment_form[文本]= >从自动化功能测试的一些反馈,@@ -41年7 + 41,7 @@类ConferenceControllerTest WebTestCase延伸公共函数testConferencePage(){$客户=静态:createClient ();-履带=美元客户- >请求(‘得到’,‘/’);+ $履带= $客户- >请求(‘得到’,' / en / ');$ this - > assertCount(2 $履带- >过滤器(h4));@@ -50 50 6 + 6 @@类ConferenceControllerTest延伸WebTestCase $ this - > assertPageTitleContains(阿姆斯特丹);$ this - > assertResponseIsSuccessful ();$ this - > assertSelectorTextContains (h2,阿姆斯特丹2019);- $ this - > assertSelectorExists (“div:包含(“有1评论”)');+ $ this - > assertSelectorExists (“div:包含(“有一个评论”)');}}
Weiterfuhrendes