本地化应用程序

本地化应用程序

有国际观众,Symfony已经能够处理国际化(i18n)和本地化欧宝娱乐app下载地址(l10n)开箱即用的因为喜欢。本地化应用程序不仅仅是翻译界面,也是复数,日期和货币格式,网址等等。

国际化的url

国际化的第一步是国际化的网站的url。翻译网站界面时,URL应该每个地区不同的打好与HTTP缓存(不要使用相同的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} /”,名字:“主页”))公共函数指数(ConferenceRepository ConferenceRepository美元):响应{返回$ this - >渲染(会议/ index . html。嫩枝”,(

主页上,地区现在是设置在内部根据URL;例如,如果你的打击/ fr /,$请求- > 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) {}- #[路线(“/ {_locale} /”,名字:“主页”))+ #[路线(' / {_locale < en | fr >} / ',名字:“主页”))公共函数指数(ConferenceRepository ConferenceRepository美元):响应{返回$ this - >渲染(会议/ index . html。嫩枝”,(

每个路由参数可以通过正则表达式限制<>。的主页现在只有比赛的时候_locale参数是fr。试着打/ es /,你应该有一个404年没有匹配的路线。

我们会使用相同的要求几乎所有的路线,让我们把它移动到一个容器参数:

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@@ 9 6 + 9 7 @@参数:admin_email:“% env(字符串:默认值:default_admin_email: admin_email) %”default_base_url: router.request_context“http://127.0.0.1”。base_url:“% env(默认值:default_base_url: SYM欧宝娱乐app下载地址FONY_DEFAULT_ROUTE_URL) % '+ app.supported_locales:“en | fr”服务:#在* *文件默认配置服务- - - / src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -28 7 + 28 7 @@类ConferenceController扩展AbstractController) {}- #[路线(' / {_locale < en | fr >} / ',名字:“主页”))+ #【路线(' / {_locale < %应用。supported_locales % >} /”,名字:“主页”)公共函数指数(ConferenceRepository ConferenceRepository美元):响应{返回$ this - >渲染(会议/ index . html。嫩枝”,(

添加一个语言可以通过更新完成app.supported_languages参数。

添加相同的地区前缀路由到其他网址:

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.php@@ -36 7 + 36 7 @@类ConferenceController延伸AbstractController]) - > setSharedMaxAge (3600);}- #[路线(“/ conference_header”,名字:“conference_header”))+ #【路线(' / {_locale < %应用。supported_locales % >} / conference_header”,名字:“conference_header”)公共函数conferenceHeader (ConferenceRepository ConferenceRepository美元):响应{返回$ this - >渲染(会议/ header.html。嫩枝”,[@@ -44 7 + 44 7 @@类ConferenceController延伸AbstractController]) - > setSharedMaxAge (3600);}- #[路线(“/会议/{蛞蝓}”,名字:“会议”))+ #【路线(' / {_locale < %应用。supported_locales % >} /会议/{蛞蝓}”,名字:“会议”)公共函数显示(请求请求美元,美元会议,会议

我们几乎已经完成了。我们没有匹配的路线/了。让我们添加它,让它重定向到/ en /:

1 2 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 % >} /”,名字:“主页”)]公共函数指数(ConferenceRepository ConferenceRepository美元):反应{

现在所有航线主要有语言环境意识到,注意到生成的url的页面自动考虑当前语言环境。

添加一个语言环境切换器

允许用户从默认切换另一个语言环境,让我们添加一个标题切换器:

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 >

切换到另一个地区,我们显式地通过_locale线路参数路径()函数。

更新模板来显示当前语言环境名称而不是硬编码的“英语”:

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”})}} " > < / > < /李>英语

应用程序是一个全球性的树枝出访问当前请求变量。将区域设置一个人类可读的字符串,我们使用locale_name树枝过滤器。

根据不同的语言环境,语言环境名称并不总是大写。利用正确的句子,我们需要一个过滤器是Unicode知道,Symfony提供的字符串组件和它的树枝实现:欧宝娱乐app下载地址

1
美元欧宝娱乐app下载地址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”})}} " > < / > < /李>英语

您现在可以从法国转到英语通过切换器和整个界面很好地适应本身:

/ fr /会议/阿姆斯特丹- 2019

翻译的接口

翻译每个句子在一个大型网站上可能很乏味,但幸运的是,我们只有少量的信息在我们的网站上。让我们先从所有的主页上的句子:

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 >

反式树枝过滤查找翻译给定输入的当前的语言环境。如果没有找到,则落回缺省语言环境中的配置配置/包/ translation.yaml:

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

注意web调试工具栏翻译“选项卡”已经变红了:

/ fr /

它告诉我们,3消息还没有翻译。

点击“标签”列表中所有消息的Symfony没有找到一个翻译:欧宝娱乐app下载地址

/ _profiler / 64282 d ?面板=翻译

提供翻译

正如你所看到的配置/包/ translation.yaml翻译存储下一个翻译/根目录,自动创建。

而不是手工创建的翻译文件,使用翻译:提取命令:

1
美元欧宝娱乐app下载地址symfony控制台翻译:提取fr -力-域=消息

这个命令生成一个翻译文件(——力国旗)fr语言环境和消息域。的消息域包含所有应用程序消息不包括那些来自Symfony本身像验证或安全错误。欧宝娱乐app下载地址

编辑翻译/消息+ intl-icu.fr.xlf文件和翻译在法国的消息。不讲法语?让我来帮你:

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 > < /身体> < /文件>
翻译/消息+ intl-icu.fr.xlf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><xliffxmlns=“urn: oasis:名称:tc: xliff文档:1.2”版本=“1.2”><文件通过读=“en”目标语言=“fr”数据类型=“明文”原始=“file.ext”><><工具tool-id=“欧宝娱乐app下载地址symfony”tool-name=“欧宝娱乐app下载地址Symfony”/ >< /><身体><trans-unitid=“LNAVleg”resname=“给你的反馈!”><>给你的反馈!< /><目标>Donnez你们认为!< /目标>< /trans-unit><trans-unitid=“3 mg5paf”resname=“视图”><>视图< /><目标>选择< /目标>< /trans-unit><trans-unitid=“eOy4.6V”resname=“留言板”会议><>会议留言板< /><目标>里弗d ' or倒会议< /目标>< /trans-unit>< /身体>< /文件>< /xliff>

请注意,我们不会翻译所有模板,但请这样做:

/ fr /

翻译形式

表单标签会自动显示Symfony通过翻译系统。欧宝娱乐app下载地址去一个会议页面的“翻译”选项卡并单击web调试工具栏;您应该看到所有标签准备好翻译:

/ _profiler / 64282 d ?面板=翻译

本地化的日期

如果你切换到法国,去一个会议网页有一些评论,你会注意到评论日期自动本地化。这种安排是可行的,因为我们使用了format_datetime树枝过滤器,识别地区({{发表评论。createdAt | format_datetime(“媒介”,“短”)}})。

本地化工作日期、时间(format_tim