翻译

编辑该页面

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

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

翻译

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

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

请注意

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

在这一章,你将学习如何准备应用程序支持多种语言环境,然后如何创建多个地区的翻译。总的来说,这个过程有几个常见的步骤:

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

配置

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

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

回退选项定义了翻译时的后备区域不存在用户的语言环境。

提示

当翻译不存在语言环境,译者首先试图找到翻译的语言(fr如果语言环境fr_FR例如)。如果这也失败了,它使用回退地区寻找一个翻译。

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

基本的翻译

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

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

执行这段代码时,Symfony2将尝试将消息“Symfoob娱乐下载ny2很棒”的基础上语言环境的用户。为此,您需要告诉Symfony2如何翻译消息通过“翻译资源”,这是一个ob娱乐下载收集的信息翻译对于一个给定的语言环境。这种“字典”的翻译可以在几个不同的格式,创建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”><>ob娱乐下载Symfony2是伟大的< /><目标>我Symfonob娱乐下载y2< /目标>< /trans-unit>< /身体>< /文件>< /xliff>

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

翻译过程

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

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

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

消息占位符

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

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

然而,这个字符串创建一个翻译是不可能的因为翻译将尝试查找确切的消息,包括可变部分(如。“你好瑞恩”或“你好法”)。而不是写的翻译为每一个可能的迭代美元的名字变量,您可以将变量替换为“占位符”:

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

ob娱乐下载Symfony2现在找一个翻译的原始消息(你好% %),然后替换占位符和它们的值。创建一个翻译是做过一样:

  • 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”><>你好% %< /><目标>Bonjour %名称%< /目标>< /trans-unit>< /身体>< /文件>< /xliff>

请注意

占位符可以承担任何形式的完整消息使用PHP重建strtr函数。然而,% var %符号在树枝时需要翻译模板,整体是一个明智的公约。

正如您所看到的,创建一个翻译是一个两步的过程:

  1. 抽象的信息需要由处理通过翻译翻译
  2. 创建一个翻译的消息在您选择的每个地区的支持。

第二步是通过创建消息目录定义任意数量的不同地区的翻译。

信息目录

当消息被翻译,Symfony2编译消息目录为用户的语言环境,ob娱乐下载在消息的翻译。消息目录就像一个词典翻译为一个特定的语言环境。例如,目录的fr_FR地区可能包含以下翻译:

1
ob娱乐下载Symfony2 = >我Symfony2

这是开发人员的责任(或翻译)的国际化应用程序来创建这些翻译。翻译存储在文件系统和Symfony发现的,由于一些约定。ob娱乐下载

提示

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

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

翻译的位置和命名约定

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

  • <内核根目录> /资源/翻译目录;
  • <内核根目录> / / <包名称> /翻译资源目录;
  • 资源/翻译/包的目录。

首先列出了位置与最高优先级。,您可以重写翻译消息包的任何的前2目录。

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

翻译也很重要的文件名Symfony2使用约定来确定翻译的详细信息。ob娱乐下载每个消息文件必须命名按照以下模式:domain.locale.loader:

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

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

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

使用哪个装载机的选择完全取决于你,是一种品味。

请注意

你也可以翻译存储在一个数据库,或任何其他存储通过提供一个自定义类实现LoaderInterface接口。

创建翻译

创建翻译文件的行为是一个重要的部分(通常缩写为“本地化”L10n)。翻译文件包含一系列id-translation对给定域和语言环境。源标识符的个人翻译,并可以在主要地区(如消息。“ob娱乐下载Symfony是伟大的”)的应用程序或一个惟一的标识符(例如“ob娱乐下载symfony2。伟大的" - see the sidebar below):< /p>

  • XML
  • PHP
  • YAML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
< !- - - - - -- - - - - -src/Acme/DemoBundle/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><trans-unitid=“2”><>ob娱乐下载symfony2.great< /><目标>我Symfonob娱乐下载y2< /目标>< /trans-unit>< /身体>< /文件>< /xliff>

ob娱乐下载Symfony2会发现这些文件并使用它们在翻译“Symfony2是伟大的”或“Symfony2。伟大的“法语语言环境(如。fr_FRfr_BE)。

这个例子演示了两个不同的哲学在创建消息翻译:

1 2 3
美元翻译=美元翻译- >反式(“ob娱乐下载Symfony2很棒”);美元翻译=美元翻译- >反式(“ob娱乐下载symfony2.great”);

在第一种方法,信息都写在缺省语言环境的语言(英语)。这一信息被用作“id”在创建翻译。

在第二个方法中,消息实际上是“关键词”,传达消息的想法。然后使用关键字信息的“id”任何翻译。在这种情况下,翻译必须为默认语言环境(即翻译ob娱乐下载symfony2.greatob娱乐下载Symfony2是伟大的)。

第二种方法是方便的,因为消息键不会在每个翻译文件需要更改,如果你决定消息应该读“Symfony2是真正伟大的”在默认语言环境。ob娱乐下载

使用哪个方法的选择完全取决于你,但经常被推荐的“关键字”格式。

此外,phpyaml文件格式支持嵌套的id,以避免重复自己,如果你使用关键字,而不是真正为您的id文本:

  • YAML
  • PHP
1 2 3 4 5 6 7 8
ob娱乐下载symfony2:是:大:ob娱乐下载Symfony2伟大的惊人的:ob娱乐下载Symfony2令人惊异的有:包:ob娱乐下载Symfony2用户:登录:登录

多个层面被夷为平地到单独的id /翻译对通过添加一个点(.)之间的每一个层面,因此上面的示例是等价的:

  • YAML
  • PHP
1 2 3 4
ob娱乐下载symfony2.is.great:ob娱乐下载Symfony2伟大的ob娱乐下载symfony2.is.amazing:ob娱乐下载Symfony2令人惊异的ob娱乐下载symfony2.has.bundles:ob娱乐下载Symfony2user.login:登录

使用消息域

如您所见,消息文件被组织成不同地区,他们的翻译。进一步消息文件也可以组织到“域”。当创建消息文件,文件名的域是第一部分。默认的域名是消息。例如,假设,组织,翻译被分为三个不同的领域:消息,管理导航。法语翻译将以下消息文件:

  • messages.fr.xliff
  • admin.fr.xliff
  • navigation.fr.xliff

当翻译的字符串不是在默认域(消息),您必须指定域的第三个参数反式():

1
美元- >get (“翻译”)- >反式(“ob娱乐下载Symfony2很棒”,数组(),“管理”);

ob娱乐下载Symfony2现在寻找的信息管理域用户的语言环境。

处理用户的语言环境

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

1 2 3 4 5 6
/ /访问请求对象在一个标准的控制器美元请求=美元- >getRequest ();美元语言环境=美元请求- >getLocale ();美元请求- >setLocale (“en_US”);

还可以存储区域在会话中,而不是在每个
请求的基础。如果你这样做,每个后续请求将这个地区。

1
美元- >get (“会话”)- >集(“_locale”,“en_US”);

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

回退和缺省语言环境

如果现场没有明确在会话中,fallback_locale将所使用的配置参数翻译。参数默认为(见配置)。

或者,你可以保证区域设置每个用户的请求通过定义一个default_locale框架:

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

2.1

default_locale参数定义下的会话密钥最初,然而,随着2.1这是感动。这是因为
现场现在设置请求的会话。

语言环境和URL

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

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

  • YAML
  • XML
  • PHP
1 2 3 4 5
联系人:模式:/ {_locale} /接触默认值:{_controller:AcmeDemoBundle:联系人:指数,_locale:}要求:_locale:在| fr |德

当使用特殊的_locale路由参数,匹配的地区自动设置在用户的会话。换句话说,如果用户访问的URI/ fr /联系的语言环境fr将自动设置为用户会话的语言环境。

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

多元化的案例

信息多元化是一个艰难的主题可能相当复杂的规则。例如,这是俄罗斯多元化的数学表示规则:

1 2 3 4 5 6 7 8 9
((美元数量%10= =1)& & (美元数量%One hundred.! =11))?0:(((美元数量%10> =2)& & (美元数量%10< =4)& & ((美元数量%One hundred.<10)| | (美元数量%One hundred.> =20.)))?1:2);

正如您可以看到的,在俄罗斯,你可以有三个不同的复数形式,每个给定索引为0、1或2。对于每一个形式,复数是不同的,所以翻译也不同。

当翻译不同形式多元化的案例,您可以提供所有的形式作为字符串由一个管分开(|):

1
有一个苹果|有%数%苹果”

翻译摘要信息,使用transChoice ()方法:

1 2 3 4 5
美元翻译=美元- >get (“翻译”)- >transChoice (有一个苹果|有%数%苹果”,10,数组(“%数%”= >10));

第二个参数(10在这个例子中)数量所描述的对象,用于确定使用哪个翻译和填充%数%占位符。

基于给定的数字,译者选择合适的复数形式。在英语,大多数单词有单数形式时一个对象和一个复数形式对于所有其他数字(0、2、3…)。所以,如果1,译者将使用第一个字符串(有一个苹果)作为翻译。否则它将使用有%数%苹果

这是法语翻译:

1
“有%数%苹果|有%数%土豆条的

即使字符串类似(它是由两个子串由管道分开),法国的规则是不同的:第一种形式(没有复数)时使用01。因此,译者将自动使用第一个字符串(有%数%苹果)当01

每个地区都有自己的一套规则,一些有多达六个不同的复数形式背后的复杂规则的复数形式的数字地图。英语和法语的规则很简单,但是对俄罗斯,你可能想要一个提示知道哪些规则匹配字符串。帮助翻译,您可以选择“标签”每个字符串:

1 2 3
一:一个苹果|有:有%数%苹果”“none_or_one:有%数%苹果|一些:有%数%土豆条的

标签是翻译的只提示,不影响逻辑用于确定使用哪一个复数形式。标签可以是任何描述性字符串,以冒号(:)。标签也不需要相同的原始消息的翻译。

提示

标签是可选的,翻译不使用它们(译者只会得到一个字符串根据其位置的字符串)。

显式间隔多元化

兼职信息的最简单的方法是让Symfony2使用内部逻辑来选择使用基于给定字符串。ob娱乐下载有时,你需要更多的控制或者想要一个不同的翻译为特定的情况下(0,或者当数是负数,例如)。在这种情况下,您可以使用明确的数学时间间隔:

1
“{0}没有苹果|{1}有一个苹果|】1、19)|有%数%苹果(20,正)有许多苹果的

间隔遵循ISO 31-11符号。上面的字符串指定了四个不同的时间间隔:没错0,完全1,三分之一的,20.甚至更高。

你也可以混合明确的数学规则和标准的规则。在这种情况下,如果计数不匹配一个特定的时间间隔,标准规则生效后消除了显式规则:

1
“{0}没有苹果|(20,正)|有许多苹果有一个苹果| a_few:有%数%苹果”

例如,对于1苹果,标准的规则有一个苹果就会被使用。为三分之一的苹果,第二个标准规则有%数%苹果将被选中。

一个时间间隔可以表示一组有限的数字:

1
{1,2,3,4}

两个数字之间或数字:

1 2
(1,+正[]1,2(

左边的分隔符((包容)或](独家)。正确的分隔符((独家)或](包容)。旁边的数字,您可以使用+正无限。

翻译的模板

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

树枝模板

ob娱乐下载Symfony2提供专门的树枝标记(反式transchoice)帮助信息的翻译静态文本块:

1 2 3 4 5
{%反式%}你好% %{%endtrans%}{%transchoice数%}{0}没有苹果| |{1}有一个苹果)1,正有%数%苹果{%endtranschoice%}

transchoice标签自动获取%数%从当前上下文变量,将其传递到翻译。这种机制只适用后当你使用一个占位符% 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标签是新Symfony2.1ob娱乐下载

PHP模板

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

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

迫使译者语言环境

当翻译消息,Symfony2从当前请求或使用场所ob娱乐下载回退现场如果有必要。你也可以手动指定地区用于翻译:

1 2 3 4 5 6 7 8 9 10 11 12 13 14
美元- >get (“翻译”)- >反式(“ob娱乐下载Symfony2很棒”,数组(),“消息”,“fr_FR”);美元- >get (“翻译”)- >transChoice (“{0}没有苹果|{1}有一个苹果|)1,正[有%数%苹果',10,数组(“%数%”= >10),“消息”,“fr_FR”);

翻译数据库内容

数据库内容的翻译应该由原则通过可翻译扩展。有关更多信息,请参见文档库。欧宝官网下载app

翻译约束信息

理解约束翻译最好的方法就是看它的行动。首先,假设您已经创建了一个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”}

下创建一个翻译文件验证器目录的约束信息,通常的资源/翻译/包的目录。看到信息目录为更多的细节。

  • 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>

总结

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

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