翻译

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.5,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

翻译

“国际化”这个词(通常缩写i18n)是指抽象成字符串的过程和其他应用程序的特定部分为一层,在那里他们可以被翻译和转换根据用户的语言环境(即语言和国家)。对于文本,这意味着包装每一个函数能够翻译文本(或“消息”)为用户的语言:

1 2 3 4 5 6
/ /文本将* *总是用英文打印回声“Hello World”;/ /文本可以转化为最终用户的语言或/ /默认为英文回声美元翻译- >反式(“Hello World”);

请注意

这个词语言环境大概是指用户的语言和国家。它可以是任何字符串,您的应用程序使用管理翻译和其他格式的差异(如货币格式)。的ISO 639 - 1语言代码,下划线(_),那么ISO 3166 - 1α2国家代码(如。fr_FR法国建议/法国)。

在本章中,您将了解如何使用翻译组件在Symfony框架。ob娱乐下载你可以阅读的翻译组件文档欧宝官网下载app学习更多。总的来说,这个过程有几个步骤:

  1. 启用和配置ob娱乐下载Symfony的翻译服务;
  2. (即抽象的字符串。“消息”),在调用包装它们翻译(“翻译”);
  3. 创建翻译资源/文件每种受支持的语言环境,将每个消息的应用程序;
  4. 确定,设置和管理用户的语言环境请求和选择在用户的整个会话

配置

翻译由一个处理翻译服务使用用户的语言环境来查找并返回翻译信息。在使用它之前,启用翻译在你的配置:

  • YAML
  • XML
  • PHP
1 2 3
# app / config / config.yml框架:翻译:{回退:}

看到翻译细节的回退键和什么Symfony的时ob娱乐下载候不找一个翻译。

翻译中所使用的语言环境是一个存储在请求。这通常是通过设置_locale在你的路线(见属性翻译)。

基本的翻译

翻译文本是通过的翻译服务(翻译)。翻译的文本块(称为消息),用反式()方法。例如,假设你翻译一个简单的消息从一个控制器:

1 2 3 4 5 6 7 8 9
/ /……使用ob娱乐下载\组件\HttpFoundation\响应;公共函数indexAction(){美元翻译=美元- >get (“翻译”)- >反式(Sob娱乐下载ymfony是伟大的);返回响应(美元翻译);}

执行这段代码时,Symfony将尝试翻译消息基于“Symob娱乐下载fony是伟大的”语言环境的用户。为此,您需要告诉Symfony如何翻译消息通过“翻译资源”,这通常是一ob娱乐下载个文件,它包含一组翻译对于一个给定的语言环境。这种“字典”的翻译可以在几个不同的格式,创建XLIFF被推荐的格式:

  • XML
  • YAML
  • PHP
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”><>ob娱乐下载Symfony是伟大的< /><目标>我Symfonob娱乐下载y< /目标>< /trans-unit>< /身体>< /文件>< /xliff>

这些文件应该安装在哪里的信息,明白了翻译

现在,如果用户的语言环境是法国人的语言(如。fr_FRfr_BE),消息将被翻译成我Symfonob娱乐下载y。你也可以翻译你的消息模板

翻译过程

翻译消息,Symfony使用一个简单的流程:ob娱乐下载

  • 语言环境当前用户的存储在请求决定;
  • 目录(例如大集合)翻译的翻译信息加载资源的定义语言环境(如。fr_FR)。的消息回退场所也加载并添加到目录如果他们不存在。最终的结果是一个大型的“词典”翻译。
  • 如果消息位于目录,返回翻译。如果没有,翻译返回原始消息。

当使用反式()方法,Symfoob娱乐下载ny寻找适当的消息目录内的精确字符串并返回(如果它存在的话)。

消息占位符

有时,一个消息包含一个变量需要翻译:

1 2 3 4 5 6 7 8
使用ob娱乐下载\组件\HttpFoundation\响应;公共函数indexAction(美元的名字){美元翻译=美元- >get (“翻译”)- >反式(“你好”美元的名字);返回响应(美元翻译);}

然而,这个字符串创建一个翻译是不可能的因为翻译将尝试查找确切的消息,包括可变部分(如。“你好瑞恩”“你好,法比安”)。

如何处理这种情况的详细信息,请参见使用翻译组件的文档。欧宝官网下载app如何做到这一点的模板,明白了翻译

多元化的案例

另一个问题是当你有可能是也可能不是复数翻译,基于一些变量:

1 2
有一个苹果。有5个苹果。

为了处理这个问题,使用transChoice ()法或者transchoice在你的标签/过滤器模板

有关更多信息,请参见使用翻译在翻译组件文档。欧宝官网下载app

翻译的模板

大多数时候,翻译出现在模板。ob娱乐下载Symfony提供本机支持树枝和PHP模板。

树枝模板

ob娱乐下载Symfony提供了专门的树枝标签(反式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“应用程序”%}

请注意,这仅影响当前模板,而不是任何“包括”模板(为了避免副作用)。

PHP模板

翻译服务可通过在PHP模板翻译助手:

1 2 3 4 5 6 7
< ? php回声美元视图(“翻译”]- >反式(Sob娱乐下载ymfony是伟大的)? >< ? php回声美元视图(“翻译”]- >transChoice (“{0}没有苹果|{1}有一个苹果|)1,正[有%数%苹果',10,数组(“%数%”= >10))? >

翻译资源/文件名称和位置

ob娱乐下载Symfony查找消息文件(即翻译)在以下位置:

  • 应用程序/资源/翻译目录;
  • 应用程序/资源/ <包名称> /翻译目录;
  • 资源/翻译/目录里面的包。

这里列出的位置是最高的优先级。也就是说,您可以重写翻译消息包的顶部2目录。

覆盖机制的关键水准:只有覆盖键需要列在一个更高的优先级消息文件。当一个关键消息文件中没有找到,译者会自动退回到低优先级消息文件。

翻译文件的文件名也很重要:每个消息文件必须命名根据以下路径:domain.locale.loader:

  • :一个可选的方法来组织信息分组(如。管理,导航或默认消息)- - -看翻译组件;
  • 语言环境:翻译的语言环境(如en_GB,等);
  • 加载程序:Symfoob娱乐下载ny如何加载和解析文件(如。xliff,php,yml等等)。

装载机可以任何注册加载程序的名称。默认情况下,Symfonob娱乐下载y提供了许多加载器,包括:

  • xliff:XLIFF文件;
  • php:PHP文件;
  • yml:YAML文件。

使用哪个装载机的选择完全取决于你,是一种品味。推荐的方法是使用xliff翻译。更多的选项,请参阅翻译组件

请注意

你也可以翻译存储在一个数据库,或任何其他存储通过提供一个自定义类实现LoaderInterface接口。看到依赖注入的标签标签的更多信息。

谨慎

每次你创建一个翻译资源(或安装一个包,其中包括翻译资源),一定要清楚你的缓存,这样Symfony会发现新的翻译资源:ob娱乐下载

1
美元的php应用程序/控制台缓存:清楚

回退翻译的地方

想象一下,用户的区域设置fr_FR那你翻译的关键ob娱乐下载Symfony是伟大的。找到法语翻译,Symfony会检查翻译资源几个地区:ob娱乐下载

  1. 首先,Symfob娱乐下载ony查找翻译的fr_FR翻译资源(如。messages.fr_FR.xliff);
  2. 如果没有发现,Symfony查找翻译的ob娱乐下载fr翻译资源(如。messages.fr.xliff);
  3. 如果翻译还没有发现,Symfony使用ob娱乐下载回退默认的配置参数(见配置)。

处理用户的语言环境

当前用户的语言环境是存储在请求,并通过访问请求对象:

1 2 3 4 5 6 7 8
使用ob娱乐下载\组件\HttpFoundation\请求;公共函数indexAction(请求美元请求){美元语言环境=美元请求- >getLocale ();美元请求- >setLocale (“en_US”);}

提示

使语言环境在用户会话期间“粘性”学习如何在会话中存储用户的区域设置。

看到翻译章节关于通过路由设置语言环境。

语言环境和URL

因为你可以在会话存储用户的语言环境,它可能会使用相同的URL来显示资源在不同的语言中基于用户的语言环境。例如,http://www.example.com/contact可以显示了一个用户的内容用英语和法语为另一个用户。不幸的是,这违反了基本的网络规则:一个特定的URL返回相同的资源无论用户。进一步的问题,哪个版本的内容会被搜索引擎索引?

一个更好的政策是包括语言环境在URL中。这是通过使用特殊的路由系统完全支持_locale参数:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
# app / config / routing.yml联系人:路径:/ {_locale} /接触默认值:{_controller:AppBundle:联系人:索引}要求:_locale:在| fr |德

当使用特殊_locale线路参数,匹配的地区自动设置请求并且可以通过检索getLocale ()方法。换句话说,如果用户访问的URI/ fr /联系的语言环境fr将自动设置为当前请求的区域设置。

您现在可以使用语言环境创建路线在应用程序中其他翻译页面。

提示

如何使用服务容器参数在你的路线吗学习如何避免硬编码_locale要求所有的路线。

设置一个默认的语言环境

如果用户的语言环境还没有确定吗?可以保证地区设置每个用户的请求通过定义一个default_locale框架:

  • YAML
  • XML
  • PHP
1 2 3
# app / config / config.yml框架:default_locale:

翻译约束信息

如果你使用验证约束的形式框架,然后翻译错误消息很容易:简单地创建一个翻译的资源验证器

首先,假设您已经创建了一个plain-old-PHP对象,您需要使用在您的应用程序:

1 2 3 4 5 6 7
/ / src / AppBundle /实体/ Author.php名称空间AppBundle\实体;作者{公共美元的名字;}

尽管任何支持的方法添加约束。设置消息选项来翻译源文本。例如,为了保证美元的名字财产不是空的,添加以下:

  • 注释
  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
/ / src / AppBundle /实体/ Author.php使用ob娱乐下载\组件\验证器\约束作为断言;作者{/ * * *@Assert\ NotBlank(消息= " author.name.not_blank ") * /公共美元的名字;}

下创建一个翻译文件验证器目录的约束信息,通常的资源/翻译/包的目录。

  • XML
  • YAML
  • PHP
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>

翻译数据库内容

数据库内容的翻译应该由原则通过可翻译扩展或者是可翻译行为(PHP 5.4 +)。有关更多信息,请参见这些库的文档。欧宝官网下载app

调试翻译

2.5

翻译:调试命令是在Symfony 2.5中引入的。ob娱乐下载

维护一个包时,你可能使用或删除的使用翻译消息没有更新消息目录。的翻译:调试命令帮助你找到这些缺失或未使用的翻译信息对于一个给定的语言环境。它向您展示了一个表结果当翻译的信息在特定的语言环境和回退将使用后的结果。最重要的是,它还显示你当翻译是一样的回退翻译(这可能表明消息不正确翻译)。

由于信息提取器,命令将检测翻译标记或过滤器使用在树枝模板:

1 2 3 4 5 6 7
{%反式%}ob娱乐下载Symfony2是伟大的{%endtrans%}{{Syob娱乐下载mfony2很棒的|反式}}{{Syob娱乐下载mfony2很棒的| transchoice (1)}}{%transchoice1%}ob娱乐下载Symfony2是伟大的{%endtranschoice%}

它还将检测以下翻译用法在PHP模板:

1 2 3
美元视图(“翻译”]- >反式(“ob娱乐下载Symfony2很棒”);美元视图(“翻译”]- >transChoice (“ob娱乐下载Symfony2很棒”,1);

谨慎

提取器无法检查消息翻译在表单模板这意味着翻译用法外标签或在你的控制器不会被探测到。动态翻译涉及变量或表达式不检测模板,这意味着这个例子不会进行分析:

1 2
{%消息= ' Symfoob娱乐下载ny2很棒' %}{{消息|反式}}

假设您的应用程序的default_localefr你已经配置了作为后备区域(见翻译翻译如何配置这些)。假设你已经安装的一些翻译fr地区内一个AcmeDemoBundle:

  • XML
  • YAML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12
< !- - - - - -- - - - - -src/Acme/AcmeDemoBundle/Resources/translations/messages.fr.xliff -->< /span>< ?xml version = " 1.0 " ? ><xliff版本=“1.2”xmlns=“urn: oasis:名称:tc: xliff文档:1.2”><文件通过读=“en”数据类型=“明文”原始=“file.ext”><身体><trans-unitid=“1”><>ob娱乐下载Symfony2是伟大的< /><目标>我Symfonob娱乐下载y2< /目标>< /trans-unit>< /身体>< /文件>< /xliff>

地区:

  • XML
  • YAML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12
< !- - - - - -- - - - - -src/Acme/AcmeDemoBundle/Resources/translations/messages.en.xliff -->< /span>< ?xml version = " 1.0 " ? ><xliff版本=“1.2”xmlns=“urn: oasis:名称:tc: xliff文档:1.2”><文件通过读=“en”数据类型=“明文”原始=“file.ext”><身体><trans-unitid=“1”><>ob娱乐下载Symfony2是伟大的< /><目标>ob娱乐下载Symfony2是伟大的< /目标>< /trans-unit>< /身体>< /文件>< /xliff>

检查中的所有消息frAcmeDemoBundle语言环境,运行:

1
美元的php应用程序/控制台翻译:调试fr AcmeDemoBundle

你将会得到这样的输出:

这表明,该消息ob娱乐下载Symfony2是伟大的是未使用的,因为它是翻译,但是你还没有在任何地方使用它。

现在,如果你把消息在你的一个模板,你会得到这个输出:

状态为空这意味着信息是翻译的fr语言环境和使用的一个或多个模板。

如果你删除消息ob娱乐下载Symfony2是伟大的从你的翻译文件fr语言环境和运行该命令,你将得到:

状态指示消息丢失,因为它没有翻译fr地区但它仍然是在模板中使用。此外,消息的fr语言环境等于的消息语言环境。这是一个特例,因为翻译消息id等于其翻译语言环境。

如果你复制翻译文件的内容语境,翻译文件fr语言环境和运行该命令,你将得到:

你可以看到消息的翻译是相同的fr地区这意味着这个消息可能是复制从法国到英语,也许你忘记翻译了。

默认情况下所有领域进行检查,但它是可以指定单个域:

1
美元的php应用程序/控制台翻译:调试en AcmeDemoBundle——域=消息

当包有很多信息,它是有用的只显示未使用或只失踪的消息,通过使用——only-unused——唯一丧失开关:

1 2
美元php应用程序/控制台翻译:调试en AcmeDemoBundle——美元only-unused php应用程序/控制台翻译:调试en AcmeDemoBundle——仅仅缺少

总结

Symfony翻译ob娱乐下载组件,创建国际化应用程序不再需要一个痛苦的过程,可以归结为几个基本步骤:

  • 文摘信息在您的应用程序通过包装的反式()transChoice ()方法(了解这个使用翻译);
  • 每个消息转化为多个地区通过创建翻译消息文件。ob娱乐下载Symfony发现每个文件和流程,因为它遵循一个特定的会议名称;
  • 管理用户的语言环境,这是存储在请求,但也可以设置用户的会话。
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。