使用翻译
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.8,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
使用翻译
想象你想翻译的字符串“ob娱乐下载Symfony是伟大的”法国:
1 2 3 4 5 6 7 8 9 10
使用ob娱乐下载\组件\翻译\翻译;使用ob娱乐下载\组件\翻译\加载程序\ArrayLoader;美元翻译=新翻译(“fr_FR”);美元翻译- >addLoader (“数组”,新ArrayLoader ());美元翻译- >addResource (“数组”,数组(“ob娱乐下载Symfony是伟大的!”= >“ob娱乐下载Symfony est超级!”),“fr_FR”);var_dump (美元翻译- >反式(“ob娱乐下载Symfony是伟大的!”));
在这个示例中,消息“ob娱乐下载Symfony是伟大的!”将翻译成语言环境设置在构造函数中(fr_FR
)如果消息的信息存在于一个目录。
消息占位符
有时,一个消息包含一个变量需要翻译:
1 2 3 4
/ /……美元翻译=美元翻译- >反式(“你好”。美元的名字);var_dump (美元翻译);
然而,这个字符串创建一个翻译是不可能的因为翻译将尝试查找确切的消息,包括可变部分(如。“你好瑞恩”或“你好,法比安”)。而不是写的翻译为每一个可能的迭代美元的名字
变量,您可以将变量替换为“占位符”:
1 2 3 4 5 6 7
/ /……美元翻译=美元翻译- >反式(“你好% %”,数组(%的名字%的= >美元的名字));var_dump (美元翻译);
ob娱乐下载Symfony将找一个翻译的原始消息(你好% %
),然后替换占位符和它们的值。创建一个翻译是做过一样:
- XML
- PHP
- YAML
1 2 3 4 5 6 7 8 9 10 11
< ?xml version = " 1.0 " ? ><xliff版本=“1.2”xmlns=“urn: oasis:名称:tc: xliff文档:1.2”><文件通过读=“en”数据类型=“明文”原始=“file.ext”><身体><trans-unitid=“1”><源>你好% %< /源><目标>Bonjour %名称%< /目标>< /trans-unit>< /身体>< /文件>< /xliff>
1 2 3
返回数组(“你好% %”= >“Bonjour %名称%”,);
1
“你好% %”:你好%的名字%
请注意
占位符可以承担任何形式的完整消息使用PHP重建strtr函数。但是,%…%
形成建议,为了避免问题在使用树枝。
正如您所看到的,创建一个翻译是一个两步的过程:
- 抽象的信息需要由处理通过翻译
翻译
。 - 创建一个翻译的消息在您选择的每个地区的支持。
第二步是通过创建消息目录定义任意数量的不同地区的翻译。
创建翻译
创建翻译文件的行为是一个重要的部分(通常缩写为“本地化”L10n)。翻译文件包含一系列id-translation对给定域和语言环境。源标识符的个人翻译,并可以在主要地区(如消息。“ob娱乐下载Symfony是伟大的”)您的应用程序或一个惟一的标识符(例如ob娱乐下载symfony.great
下面,请参阅侧栏)。
翻译文件可以在几个不同的格式,创建XLIFF被推荐的格式。这些文件被解析类装入器之一。
- XML
- YAML
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
< ?xml version = " 1.0 " ? ><xliff版本=“1.2”xmlns=“urn: oasis:名称:tc: xliff文档:1.2”><文件通过读=“en”数据类型=“明文”原始=“file.ext”><身体><trans-unitid=“ob娱乐下载symfony_is_great”><源>ob娱乐下载Symfony是伟大的< /源><目标>我Symfonob娱乐下载y< /目标>< /trans-unit><trans-unitid=“ob娱乐下载symfony.great”><源>ob娱乐下载symfony.great< /源><目标>我Symfonob娱乐下载y< /目标>< /trans-unit>< /身体>< /文件>< /xliff>
1 2
ob娱乐下载Symfony是伟大的:我ob娱乐下载ob娱乐下载symfony.great:我ob娱乐下载
1 2 3 4
返回数组(Sob娱乐下载ymfony是伟大的= >“J \”艾梅Syob娱乐下载mfony”,“ob娱乐下载symfony.great”= >“J \”艾梅Syob娱乐下载mfony”,);
使用真实的或关键字信息
这个例子演示了两个不同的哲学在创建消息翻译:
1 2 3
美元翻译- >反式(Sob娱乐下载ymfony是伟大的);美元翻译- >反式(“ob娱乐下载symfony.great”);
在第一种方法,信息都写在缺省语言环境的语言(英语)。这一信息被用作“id”在创建翻译。
在第二个方法中,消息实际上是“关键词”,传达消息的想法。然后使用关键字信息的“id”任何翻译。在这种情况下,翻译必须为默认语言环境(即翻译ob娱乐下载symfony.great
来ob娱乐下载Symfony是伟大的
)。
第二种方法是方便的,因为消息键不会在每个翻译文件需要更改,如果你决定消息应该读“Symfony是真正伟大的”在默认语言环境。ob娱乐下载
使用哪个方法的选择完全取决于你,但经常被推荐的“关键字”格式。
此外,php
和yaml
文件格式支持嵌套的id,以避免重复自己,如果你使用关键字,而不是真正为您的id文本:
- YAML
- PHP
1 2 3 4 5 6 7 8
ob娱乐下载symfony:是:大:ob娱乐下载是伟大的惊人的:ob娱乐下载是令人惊异的有:包:ob娱乐下载有包用户:登录:登录
1 2 3 4 5 6 7 8 9 10 11 12 13 14
数组(sob娱乐下载ymfony的= >数组(“是”= >数组(“伟大的”= >Sob娱乐下载ymfony是伟大的,“神奇的”= >Sob娱乐下载ymfony是惊人的),“已经”= >数组(“包”= >Sob娱乐下载ymfony的包的),),“用户”= >数组(“登录”= >“登录”),);
多个层面被夷为平地到单独的id /翻译对通过添加一个点(。
各个层面之间),因此上面的示例是等价的:
- YAML
- PHP
1 2 3 4
ob娱乐下载symfony.is.great:ob娱乐下载是伟大的ob娱乐下载symfony.is.amazing:ob娱乐下载是令人惊异的ob娱乐下载symfony.has.bundles:ob娱乐下载有包user.login:登录
1 2 3 4 5 6
返回数组(“ob娱乐下载symfony.is.great”= >Sob娱乐下载ymfony是伟大的,“ob娱乐下载symfony.is.amazing”= >Sob娱乐下载ymfony是惊人的,“ob娱乐下载symfony.has.bundles”= >Sob娱乐下载ymfony的包的,“user.login”= >“登录”,);
多元化的案例
信息多元化是一个艰难的主题可能相当复杂的规则。例如,这是俄罗斯多元化的数学表示规则:
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
美元翻译- >transChoice (有一个苹果|有%数%苹果”,10,数组(“%数%”= >10));
第二个参数(10
在这个例子中)数量所描述的对象,用于确定使用哪个翻译和填充%数%
占位符。
基于给定的数字,译者选择合适的复数形式。在英语,大多数单词有单数形式时一个对象和一个复数形式对于所有其他数字(0、2、3…)。所以,如果数
是1
,译者将使用第一个字符串(有一个苹果
)作为翻译。否则它将使用有%数%苹果
。
这是法语翻译:
1
“有%数%苹果|有%数%土豆条的
即使字符串类似(它是由两个子串由管道分开),法国的规则是不同的:第一种形式(没有复数)时使用数
是0
或1
。因此,译者将自动使用第一个字符串(有%数%苹果
)当数
是0
或1
。
每个地区都有自己的一套规则,一些有多达六个不同的复数形式背后的复杂规则的复数形式的数字地图。英语和法语的规则很简单,但是对俄罗斯,你可能想要一个提示知道哪些规则匹配字符串。帮助翻译,您可以选择“标签”每个字符串:
1 2 3
一:一个苹果|有:有%数%苹果的“none_or_one:有%数%苹果|一些:有%数%土豆条的
标签是翻译的只提示,不影响逻辑用于确定使用哪一个复数形式。标签可以是任何描述性字符串,以冒号(:
)。标签也不需要相同的原始消息的翻译。
提示
标签是可选的,翻译不使用它们(译者只会得到一个字符串根据其位置的字符串)。
显式间隔多元化
兼职信息的最简单的方法是让译者使用内部逻辑来选择使用基于给定字符串。有时,你需要更多的控制或者想要一个不同的翻译为特定的情况下(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 (
左边的分隔符(
(包容)或]
(独家)。正确的分隔符(
(独家)或]
(包容)。旁边的数字,您可以使用负
和+正
无限。
迫使译者语言环境
翻译一个消息时,译者使用指定的区域或回退
现场如果有必要。你也可以手动指定地区用于翻译:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
美元翻译- >反式(Sob娱乐下载ymfony是伟大的,数组(),“消息”,“fr_FR”);美元翻译- >transChoice (“{0}没有苹果|{1}有一个苹果|)1,正[有%数%苹果',10,数组(“%数%”= >10),“消息”,“fr_FR”);
检索信息目录
如果您想使用相同的翻译目录以外的应用程序(例如,使用翻译在客户端),可以获取原始翻译信息。指定所需的语言环境:
1 2 3 4 5
美元目录=美元翻译- >getCatalogue (“fr_FR”);美元消息=美元目录- >所有();而(美元目录=美元目录- >getFallbackCatalogue ()) {美元消息= array_replace_recursive (美元目录- >所有(),美元消息);}
的美元的消息
变量将有以下结构:
1 2 3 4 5 6 7 8 9
数组(“消息”= >数组(“Hello world”= >“你好,兜售《世界报》”),“验证”= >数组(“价值不应该是空的= >“不doit的数值可能见的,“价值太长”= >”的美国东部时间太长”),);