翻译
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.2,不再维护。
读这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。
翻译
“国际化”这个词(通常缩写i18n)是指抽象成字符串的过程和其他应用程序的特定部分为一层,在那里他们可以被翻译和转换根据用户的语言环境(即语言和国家)。对于文本,这意味着包装每一个函数能够翻译文本(或“消息”)为用户的语言:
1 2 3 4 5 6
/ /文本将* *总是用英文打印回声“Hello World”;/ /文本可以转化为最终用户的语言或/ /默认为英文回声美元翻译- >反式(“Hello World”);
请注意
这个词语言环境大概是指用户的语言和国家。它可以是任何字符串,您的应用程序使用管理翻译和其他格式的差异(如货币格式)。的ISO 639 - 1语言代码,下划线(_
),那么ISO 3166 - 1α2国家代码(如。fr_FR
法国建议/法国)。
在本章中,您将了解如何使用翻译组件Symfony2框架。欧宝娱乐app下载地址你可以阅读的翻译组件文档欧宝体育电话学习更多。总的来说,这个过程有几个步骤:
- 启用和配置欧宝娱乐app下载地址Symfony的翻译服务;
- (即抽象的字符串。“消息”),在调用包装它们
翻译
(“翻译”); - 创建翻译资源/文件每种受支持的语言环境,将每个消息的应用程序;
- 确定,设置和管理用户的语言环境请求和选择在用户的整个会话。
配置
翻译由一个处理翻译
服务使用用户的语言环境来查找并返回翻译信息。在使用它之前,启用翻译
在你的配置:
- YAML
- XML
- PHP
1 2 3
# app / config / config.yml框架:翻译:{回退:在}
1 2 3 4 5 6 7 8 9 10 11 12
< !- - - - - -- - - - - -app/config/config.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><框架:翻译回退=“en”/ >< /框架:配置>< /容器>
1 2 3 4
/ / app / config / config . php美元容器- >loadFromExtension (“框架”,数组(“翻译”= >数组(“回退”= >“en”)));
看到翻译细节的回退
键和什么Symfony的时欧宝娱乐app下载地址候不找一个翻译。
翻译中所使用的语言环境是一个存储在请求。这通常是通过设置_locale
在你的路线(见属性翻译)。
基本的翻译
翻译文本是通过的翻译
服务(翻译)。翻译的文本块(称为消息),用反式()方法。例如,假设你翻译一个简单的消息从一个控制器:
1 2 3 4 5 6 7 8 9
/ /……使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;公共函数indexAction(){美元翻译=美元这- >get (“翻译”)- >反式(“欧宝娱乐app下载地址Symfony2很棒”);返回新响应(美元翻译);}
执行这段代码时,Symfony2将尝试将消息“Symfo欧宝娱乐app下载地址ny2很棒”的基础上语言环境
的用户。为此,您需要告诉Symfony2如何翻译消息通过“翻译资源”,这通常是欧宝娱乐app下载地址一个文件,它包含一组翻译对于一个给定的语言环境。这种“字典”的翻译可以在几个不同的格式,创建XLIFF被推荐的格式:
- XML
- PHP
- YAML
1 2 3 4 5 6 7 8 9 10 11 12
< !- - - - - -- - - - - -messages.fr.xliff- - - - - -- >< ?xml version = " 1.0 " ? ><xliff版本=“1.2”xmlns=“urn: oasis:名称:tc: xliff文档:1.2”><文件通过读=“en”数据类型=“明文”原始=“file.ext”><身体><trans-unitid=“1”><源>欧宝娱乐app下载地址Symfony2是伟大的< /源><目标>我Symfon欧宝娱乐app下载地址y2< /目标>< /trans-unit>< /身体>< /文件>< /xliff>
1 2 3 4
/ / messages.fr.php返回数组(“欧宝娱乐app下载地址Symfony2很棒”= >“J \“艾梅Sy欧宝娱乐app下载地址mfony2”,);
1 2
# messages.fr.yml欧宝娱乐app下载地址Symfony2很棒:我欧宝娱乐app下载地址Symfony2
这些文件应该安装在哪里的信息,明白了翻译。
现在,如果用户的语言环境是法国人的语言(如。fr_FR
或fr_BE
),消息将被翻译成我Symfon欧宝娱乐app下载地址y2
。你也可以翻译你的消息模板。
消息占位符
有时,一个消息包含一个变量需要翻译:
1 2 3 4 5 6 7 8
使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;公共函数indexAction(美元的名字){美元翻译=美元这- >get (“翻译”)- >反式(“你好”。美元的名字);返回新响应(美元翻译);}
然而,这个字符串创建一个翻译是不可能的因为翻译将尝试查找确切的消息,包括可变部分(如。“你好瑞恩”或“你好,法比安”)。
多元化的案例
另一个问题是当你有可能是也可能不是复数翻译,基于一些变量:
1 2
有一个苹果。有5个苹果。
为了处理这个问题,使用transChoice ()法或者transchoice
在你的标签/过滤器模板。
有关更多信息,请参见使用翻译在翻译组件文档。欧宝体育电话
翻译的模板
大多数时候,翻译出现在模板。欧宝娱乐app下载地址Symfony2提供本机支持树枝和PHP模板。
树枝模板
欧宝娱乐app下载地址Symfony2提供专门的树枝标记(反式
和transchoice
)帮助信息的翻译静态文本块:
1 2 3 4 5
{%反式%}你好% %{%endtrans%}{%transchoice数%}{0}没有苹果| |{1}有一个苹果)1,正有%数%苹果{%endtranschoice%}
的transchoice
标签自动获取%数%
从当前上下文变量,将其传递到翻译。这种机制只适用后当你使用一个占位符% var %
模式。
谨慎
的% var %
符号的占位符时需要翻译在树枝模板使用标签。
提示
如果你需要使用字符(百分比%
)在一个字符串,逃避它增加一倍:{%反式%}%:% % % % % {% endtrans %}
你也可以指定消息域和通过一些额外的变量:
1 2 3 4 5 6 7
{%反式与{%名称%的:‘法’}从“应用”%}你好% %{%endtrans%}{%反式与{%名称%的:‘法’}从“应用”到“fr”%}你好% %{%endtrans%}{%transchoice数与{%名称%的:‘法’}从“应用”%}{0}% %的名字,没有苹果|{1}% %的名字,有一个苹果| 1,正]%名称%,%数%有苹果{%endtranschoice%}
的反式
和transchoice
过滤器可以用来翻译变量文本和复杂的表达式:
1 2 3 4 5 6 7
{{消息|反式}}{{消息| transchoice (5)}}{{消息|反式({%名称%的:‘法’},“应用程序”)}}{{{消息| transchoice(5日‘%名称%’:‘法’},“应用程序”)}}
提示
使用翻译标记或过滤器具有相同的效果,但有一个微妙的差异:自动输出逃避只是使用一个过滤器应用于翻译。换句话说,如果你需要确保你的信息是翻译不输出了,你必须应用生
翻译后过滤器过滤:
1 2 3 4 5 6 7 8 9 10
{#标记之间的文本翻译从来不是逃脱了#}{%反式%}<h3>喷火< /h3>{%endtrans%}{%集消息= ' < h3 > foo < / h3 > ' %}{#通过一个过滤器字符串和变量翻译默认了#}{{消息反式| |生}}{{< h3 > < / h3 >酒吧的反式| |生}}
提示
你可以设置整个树枝模板的翻译领域一个标签:
1
{%trans_default_domain“应用程序”%}
请注意,这仅影响当前模板,而不是任何“包括”模板(为了避免副作用)。
2.1
的trans_default_domain
标签是新在Symfony 2欧宝娱乐app下载地址.1
PHP模板
翻译服务可通过在PHP模板翻译
助手:
1 2 3 4 5 6 7
< ? php回声美元视图(“翻译”]- >反式(“欧宝娱乐app下载地址Symfony2很棒”)? >< ? php回声美元视图(“翻译”]- >transChoice ({0}没有苹果| |{1}有一个苹果)1,正[有%数%苹果',10,数组(“%数%”= >10))? >
翻译资源/文件名称和位置
欧宝娱乐app下载地址Symfony2查找消息文件(即翻译)在以下位置:
- 的
应用程序/资源/翻译
目录; - 的
应用程序/资源/ <包名称> /翻译
目录; - 的
资源/翻译/
目录里面的包。
这里列出的位置是最高的优先级。也就是说,您可以重写翻译消息包的顶部2目录。
覆盖机制的关键水准:只有覆盖键需要列在一个更高的优先级消息文件。当一个关键消息文件中没有找到,译者会自动退回到低优先级消息文件。
翻译文件的文件名也很重要:每个消息文件必须命名根据以下路径:domain.locale.loader
:
- 域:一个可选的方法来组织信息分组(如。
管理
,导航
或默认消息
)- - -看翻译组件; - 语言环境:翻译的语言环境(如
en_GB
,在
等); - 加载程序:Symfo欧宝娱乐app下载地址ny2如何加载和解析文件(如。
xliff
,php
,yml
等等)。
装载机可以任何注册加载程序的名称。默认情况下,Symfon欧宝娱乐app下载地址y提供了许多加载器,包括:
xliff
:XLIFF文件;php
:PHP文件;yml
:YAML文件。
使用哪个装载机的选择完全取决于你,是一种品味。更多的选项,请参阅翻译组件。
请注意
你也可以翻译存储在一个数据库,或任何其他存储通过提供一个自定义类实现LoaderInterface接口。看到依赖注入的标签标签的更多信息。
谨慎
每次你创建一个新翻译资源(或安装一个包,其中包括翻译资源),一定要清楚你的缓存,这样Symfony会发现新的翻译资源:欧宝娱乐app下载地址
1
美元的php应用程序/控制台缓存:清楚
回退翻译的地方
想象一下,用户的区域设置fr_FR
那你翻译的关键欧宝娱乐app下载地址Symfony2是伟大的
。找到法语翻译,Symfony会检查翻译资源几个不同地区:欧宝娱乐app下载地址
- 首先,Symf欧宝娱乐app下载地址ony查找翻译的
fr_FR
翻译资源(如。messages.fr_FR.xfliff
); - 如果没有发现,Symfony查找翻译的欧宝娱乐app下载地址
fr
翻译资源(如。messages.fr.xliff
); - 如果翻译还没有发现,Symfony使用欧宝娱乐app下载地址
回退
默认的配置参数在
(见配置)。
处理用户的语言环境
当前用户的语言环境是存储在请求,并通过访问请求
对象:
1 2 3 4 5 6
/ /访问请求对象在一个标准的控制器美元请求=美元这- >getRequest ();美元语言环境=美元请求- >getLocale ();美元请求- >setLocale (“en_US”);
提示
读使语言环境在用户会话期间“粘性”学习,如何存储在会话中用户的区域设置。
看到翻译章节关于通过路由设置语言环境。
语言环境和URL
因为你可以在会话存储用户的语言环境,它可能会使用相同的URL资源在很多不同的语言来显示基于用户的语言环境。例如,http://www.example.com/contact
可以显示了一个用户的内容用英语和法语为另一个用户。不幸的是,这违反了基本的网络规则:一个特定的URL返回相同的资源无论用户。进一步的问题,哪个版本的内容会被搜索引擎索引?
一个更好的政策是包括语言环境在URL中。这是通过使用特殊的路由系统完全支持_locale
参数:
- YAML
- XML
- PHP
1 2 3 4 5
联系人:路径:/ {_locale} /接触默认值:{_controller:AcmeDemoBundle:联系人:指数,_locale:在}要求:_locale:在| fr |德
1 2 3 4 5 6 7 8 9 10 11 12
< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><路线xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/routing //www.oldmanjams.com/schema/routing/routing-1.0.xsd”><路线id=“接触”路径=“/ {_locale} /接触”><默认的关键=“_controller”>AcmeDemoBundle:联系人:索引< /默认的><默认的关键=“_locale”>在< /默认的><要求关键=“_locale”>在| fr |德< /要求>< /路线>< /路线>
1 2 3 4 5 6 7 8 9 10 11 12
使用欧宝娱乐app下载地址\组件\路由\RouteCollection;使用欧宝娱乐app下载地址\组件\路由\路线;美元集合=新RouteCollection ();美元集合- >add (“接触”,新路线(“/ {_locale} /接触”,数组(“_controller”= >“AcmeDemoBundle:联系人:指数”,“_locale”= >“en”),数组(“_locale”= >“en | fr |德”)));返回美元集合;
当使用特殊_locale
线路参数,匹配的地区自动设置请求并且可以通过检索getLocale ()方法。换句话说,如果用户访问的URI/ fr /联系
的语言环境fr
将自动设置为当前请求的区域设置。
您现在可以使用语言环境创建路线在应用程序中其他翻译页面。
设置一个默认的语言环境
如果用户的语言环境还没有确定吗?可以保证地区设置每个用户的请求通过定义一个default_locale
框架:
- YAML
- XML
- PHP
1 2 3
# app / config / config.yml框架:default_locale:在
1 2 3 4
< !- - - - - -- - - - - -app/config/config.xml -->< /span><框架:配置><框架:缺省语言环境>在< /框架:缺省语言环境>< /框架:配置>
1 2 3 4
/ / app / config / config . php美元容器- >loadFromExtension (“框架”,数组(“default_locale”= >“en”));
2.1
的default_locale
参数定义下的会话密钥最初,然而,随着2.1这是感动。这是因为语言环境现在设置请求的会话。
翻译约束信息
如果你使用验证约束的形式框架,然后翻译错误消息很容易:简单地创建一个翻译的资源验证器
域。
首先,假设您已经创建了一个plain-old-PHP对象,您需要使用在您的应用程序:
1 2 3 4 5 6 7
/ / src / Acme / / Author.php BlogBundle /实体名称空间Acme\BlogBundle\实体;类作者{公共美元的名字;}
尽管任何支持的方法添加约束。设置消息选项来翻译源文本。例如,为了保证美元名称属性并不是空的,添加以下:
- YAML
- 注释
- XML
- PHP
1 2 3 4 5
# src / Acme / BlogBundle /资源/ config / validation.ymlAcme \ BlogBundle \实体\作者:属性:名称:- - - - - -NotBlank:{信息:“author.name.not_blank”}
1 2 3 4 5 6 7 8 9 10
/ / src / Acme / / Author.php BlogBundle /实体使用欧宝娱乐app下载地址\组件\验证器\约束作为断言;类作者{/ * * *@Assert\ NotBlank(消息= " author.name.not_blank ") * /公共美元的名字;}
1 2 3 4 5 6 7 8 9 10 11 12 13 14
< !- - - - - -- - - - - -src/Acme/BlogBundle/Resources/config/validation.xml -->< /span>< ?xml version = " 1.0 " encoding = " utf - 8 " ? ><constraint-mappingxmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/constraint-mapping //www.oldmanjams.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd”><类的名字=“Acme \ BlogBundle \实体\作者”><财产的名字=“名称”><约束的名字=“NotBlank”><选项的名字=“消息”>author.name.not_blank< /选项>< /约束>< /财产>< /类>< /constraint-mapping>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src / Acme / / Author.php BlogBundle /实体/ /……使用欧宝娱乐app下载地址\组件\验证器\映射\ClassMetadata;使用欧宝娱乐app下载地址\组件\验证器\约束\NotBlank;类作者{公共美元的名字;公共静态函数loadValidatorMetadata(ClassMetadata美元元数据){美元元数据- >addPropertyConstraint (“名字”,新NotBlank (数组(“消息”= >“author.name.not_blank”)));}}
下创建一个翻译文件验证器
目录的约束信息,通常的资源/翻译/
包的目录。
- XML
- PHP
- YAML
1 2 3 4 5 6 7 8 9 10 11 12
< !- - - - - -- - - - - -验证器。在。xliff - - >< ?xml version = " 1.0 " ? ><xliff版本=“1.2”xmlns=“urn: oasis:名称:tc: xliff文档:1.2”><文件通过读=“en”数据类型=“明文”原始=“file.ext”><身体><trans-unitid=“1”><源>author.name.not_blank< /源><目标>请输入作者名称。< /目标>< /trans-unit>< /身体>< /文件>< /xliff>
1 2 3 4
/ / validators.en.php返回数组(“author.name.not_blank”= >请输入作者名称。,);
1 2
# validators.en.ymlauthor.name.not_blank:请输入一个作者的名字。
总结
Symfony2翻欧宝娱乐app下载地址译组件,创建国际化应用程序不再需要一个痛苦的过程,可以归结为几个基本步骤:
- 文摘信息在您的应用程序通过包装的反式()或transChoice ()方法(了解这个使用翻译);
- 每个消息转化为多个地区通过创建翻译消息文件。欧宝娱乐app下载地址Symfony2发现每个文件和流程,因为它遵循一个特定的会议名称;
- 管理用户的语言环境,这是存储在请求,但也可以设置用户的会话。