本地化应用程序
本地化应用程序
由于拥有国际受众,Symfony已经能够处理国际化(i18n)和ob娱乐下载本地化(l10n),就像以前一样。本地化应用程序不仅仅是翻译界面,还包括复数、日期和货币格式、url等等。
国际化的url
国际化网站的第一步是国际化网址。当翻译一个网站界面时,URL应该根据地区不同而不同,以更好地使用HTTP缓存(永远不要使用相同的URL并将地区存储在会话中)。
使用特惠_locale
Route参数用于在路由中引用区域设置:
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 /
,请求- > 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会自动考虑当前的语言环境。
添加区域切换器
允许用户从默认切换在
Locale到另一个,让我们在头文件中添加一个切换器:
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
路由参数到路径()
函数。
更新模板以显示当前区域名称,而不是硬编码的“English”:
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
应用程序
是一个全局Twig变量,用于访问当前请求。要将区域设置转换为人类可读的字符串,可以使用locale_name
树枝过滤器。
根据区域设置,区域设置名称并不总是大写。为了正确地大写句子,我们需要一个能识别Unicode的过滤器,就像Symfony String组件及其Twig实现提供的那样:ob娱乐下载
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
你现在可以通过切换器从法语切换到英语,整个界面适应得非常好:
转换接口
在大型网站上翻译每句话可能很乏味,但幸运的是,我们的网站上只有少量的信息。让我们从主页上的所有句子开始:
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调试工具栏翻译“tab”变成了红色:
它告诉我们有3条消息还没有被翻译。
点击“选项卡”,列出Symfony没有找到翻译的所有消息:ob娱乐下载
提供翻译
你可能已经看到了配置/包/ translation.yaml
,翻译存储在翻译/
根目录,已经为我们自动创建。
方法创建翻译文件,而不是手工创建翻译:提取
命令:
1
$ob娱乐下载Symfony控制台翻译:提取fr——force——domain=消息
这个命令生成一个翻译文件(——力
旗帜)fr
区域设置和消息
域。的消息
域包含所有应用程序排除来自Symfony本身的消息,如验证或安全错误。ob娱乐下载
编辑翻译/消息+ 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目标> < /+ <目标>选择目标> < /
注意,我们不会翻译所有的模板,但可以随意这样做:
翻译形式
表单标签由Symfony通过翻译系统自动显示。ob娱乐下载进入会议页面,点击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 @@
对于这条信息,我们使用了另一种翻译策略。我们没有在模板中保留英文版本,而是用唯一的标识符替换了它。这种策略更适用于复杂和大量的文本。
通过添加新消息来更新翻译文件:
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 >