本地化应用程序
本地化应用程序
Avec son public international, ob娱乐下载Symfony gère本地国际化(i18n)和本地化(l10n)代理旅行社。Localiser une application ne包括pas seulement à traduire l'interface, mais aussi à traduire les pluriels, le formatage des date et des des des des des des des des des des des des des des des des des, URLs, et + encore。
url的国际化器
La première étape pour localiser le site web est d'internationaliser les url。Quand on traduit un site web, l'URL devrait être différente pour chque locale afin de tirer pleinement parti des caches HTTP (n'utilisez jamais la même URL en stockant la locale dans la session)。
使用le paramètre de routage spécial_locale
倒référencer la locale dans les路线:
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)嫩枝”,(
Sur la page d'accueil, la locale est maintenant définie en interne en function de l'URL;举例来说,我必须航行/ fr /
,请求- > getLocale ()
retournefr
.
我不能做任何事,我不能做任何事,我不能做任何事à我不能做任何事,我不能做任何事à
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)嫩枝”,(
查克paramètre de route peut être limité par une expression régulière à l'intérieur de<
>
.洛杉矶的路线主页
N 'est维护人员不合格paramètre_locale
等于在
欧fr
.Essayez d'atteindre l'URL/ es /
航路领航员:404错误,车在原航线上。
Comme nous utiliserons la même condition dans presque toutes les routes, déplaçons-la dans un paramètre du conteneur:
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)嫩枝”,(
关于语言的问题à白天paramètreapp.supported_languages
.
Ajoutez le même préfixe de route locale aux autres网址:
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,
我爱你,我爱你。独立的,nous n'avons加上路线对应的à/
.Recréons-la在我们的生活中/ 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 {
维护que toutes les routes principales bénéficient de la locale,备注que les URLs générées sur les pages prennent automatiquement en compte la locale courante。
Ajouter un sélecteur de locale
Pour permettre aux internautes de passer de la locale par défaut在
à une autre, ajoutons UN sélecteur dans l'en-tête:
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 >李+ < / >
Pour change de locale, nous passion explicitement le paramètre de routage_locale
à la函数路径()
.
Modifiez le template pour afficher le nom de la locale actuelle au lieu du nom“英语”codé en dur:
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
应用程序
est une variable Twig global qui donne accès à la requête courante。Pour convertir la locale en une chaîne humainement compréhensible, nous utilisons le filter Twiglocale_name
.
这是一个地方,这是一个地方,这是一个地方。Pour gérer correctement les majuscules dans les phrases, nous avons besoin d'un filter compatible Unicode, comme celui fourni par le composant ob娱乐下载Symfony String et son implémentation Twig:
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
Vous pouvez dorénavant passer du français à l'anglais grâce au sélecteur, et toute l'interface s'adapte à merveille:
Traduire l 'interface
交易短语d'un gros site web peut être fastidieux, mais heureusement, nous n'avons que quelques messages sur notre site web。Commençons par toutes les phrases de la page d'accueil:
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 @@
Le滤镜树枝反式
研究une traduction pour la valeur donnée dans la locale courante。Si cellle -ci n'est pas trouvée, il utilise la区域参数défaut,告诉que configurée dans配置/包/ translation.yaml
:
1 2 3 4 5 6
框架:default_locale:在翻译:default_path:' % kernel.project_dir % /翻译'回退:-在
Notez que l'"onglet" de traduction de la web调试工具栏est devenu rouge:
我有三句话不能再说了。
Cliquez sur l'"onglet" pour lister tous les messages pour lesquels ob娱乐下载Symfony n'a pas trouvé de traduction:
Fournir des traductions
我爱你,我爱你配置/包/ translation.yaml
, les traductions sont stockées dans le répertoire拉辛翻译/
, qui a été créé automatiquement pour nous。
Au lieu de créer les fichiers de traduction à la main, utilisez la command翻译:提取
:
1
$ob娱乐下载Symfony控制台翻译:提取fr——force——domain=消息
Cette命令génère un fichier de traduction(选项——力
) pour la localefr
Et le domain消息
.Le葡萄园消息
大陆的讯息应用程序,不排除证明错误的理由sécurité。ob娱乐下载
Éditez le fichier翻译/消息+ intl-icu.fr.xlf
Et traduisez les messages en français:
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目标> < /+ <目标>选择目标> < /
Nous ne traduirons pas tous les templates, mais n'hésitez pas à le faire:
贸易公式
Les labels des formulaires sont automatiquement affichés par ob娱乐下载Symfony via le système de traduction。Allez sur une page de conférence et cliquez sur l'onglet“翻译”de la web调试工具栏;Vous devriez voir tous les libellés prêts à être traduits:
日期定位器
语言的变化français在页面上的变化conférence评论的内容,评论的日期été自动操作localisées。Cela function parce que nous avons utilisé le filter树枝format_datetime
, qui tient compte de la locale ({{发表评论。createdAt|format_datetime('medium', 'short')}}
).
La本地化函数pour les dates, les heures (format_time
), les designs (format_currency
) et les nombres (format_number
) zh général (pourcentages, durées, écriture,等等)。
贸易是多元的
这是一个关于多原则的问题,是一个关于原则的问题problèmes关于sélectionne有条件的问题。
Sur la page d'une conférence, nous affichons le nombre de commentaires:这里有两条评论
.倒一篇评论,理智有1条评论
, ce qui est faux。Modifiez le template pour convertir la phrase en un message traduisible:
1 2 3 4 5 6 7 8 9 10 11
——/模板/会议/ show.html.twig+ + + b /模板/会议/ show.html.twig@@ -44,7 +44,7 @@
倾注信息,有头脑utilisé une autre stratégie de traduction。Au lieu de conserver la version anglaise dans le modèle, nous l'avons remplacée par un identity unique。Cette stratégie function mieux pour les textes complexet volumineux。
梅特兹à今天我们的传统观念与新事物有关信息:
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 >