使用翻译工具
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.3,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
使用翻译工具
假设您想要翻译字符串“ob娱乐下载Symfony很棒”法国:
1 2 3 4 5 6 7 8 9 10
使用ob娱乐下载\组件\翻译\翻译;使用ob娱乐下载\组件\翻译\加载程序\ArrayLoader;$翻译=新翻译(“fr_FR”);$翻译->addLoader (“数组”,新ArrayLoader ());$翻译->addResource (“数组”,数组(“ob娱乐下载Symfony太棒了!”= >“J \”艾梅Syob娱乐下载mfony !”),“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>
请注意
在使用PHP重新构造完整消息时,占位符可以采用任何形式strtr函数.但是,%…%
推荐使用Twig的表单,以避免在使用Twig时出现问题。
正如你所看到的,创建一个翻译是一个两步的过程:
- 方法对需要翻译的消息进行抽象处理
翻译
. - 为您选择支持的每种语言环境中的消息创建翻译。
第二步是通过创建定义任意数量不同地区的翻译的消息目录来完成的。
创建翻译
创建翻译文件是“本地化”(通常缩写为本地化)的重要组成部分L10n).翻译文件由一系列针对给定域和语言环境的id-translation对组成。源是单个翻译的标识符,可以是主语言环境中的消息(例如。“ob娱乐下载Symfony很棒”)或唯一标识符(例如:ob娱乐下载symfony.great
-请参阅下面的侧栏)。
可以用几种不同的格式创建翻译文件,推荐使用XLIFF格式。这些文件由一个加载器类解析。
- XML
- YAML
- PHP
12 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 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
“有一个苹果|有%count%苹果”
要翻译多元化的消息,请使用transChoice ()方法:
1 2 3 4 5
$翻译->transChoice (“有一个苹果|有%count%苹果”,10,数组(“%数%”= >10));
第二个参数(10
在本例中)是数量对象的转换,并用于确定要使用哪种翻译以及填充%数%
占位符。
根据给定的数字,翻译人员选择正确的复数形式。在英语中,当只有一个宾语时,大多数单词都是单数形式,而所有其他数字都是复数形式(0,2,3…)。所以,如果数
是1
,翻译器将使用第一个字符串(有一个苹果
)作为翻译。否则它会使用有%count%苹果
.
以下是法语翻译:
1
“Il y a %count% pomme|Il y a %count% pommes”
即使字符串看起来很相似(它由两个由管道隔开的子字符串组成),法语的规则是不同的:当使用第一种形式(没有复数形式)时数
是0
或1
.因此,翻译器将自动使用第一个字符串(Il y %count% pomme
)当数
是0
或1
.
每个地区都有自己的一套规则,有些地区有多达六种不同的复数形式,并有复杂的规则,哪些数字对应哪些复数形式。对于英语和法语,规则非常简单,但是对于俄语,您可能需要一个提示来知道哪个规则匹配哪个字符串。为了帮助翻译人员,你可以选择“标记”每个字符串:
1 2 3
“one:有一个苹果|some:有%count%苹果”none_or_one: Il y %count% pomme|some: Il y %count% pommes”
这些标签实际上只是给翻译人员的提示,并不影响用来决定使用哪种复数形式的逻辑。标签可以是任何以冒号结尾的描述性字符串(:
).原始消息中的标记也不需要与翻译后的相同。
提示
因为标签是可选的,所以翻译器不会使用它们(翻译器只会根据它在字符串中的位置获得一个字符串)。
显式区间复数
将消息复数化最简单的方法是让Translator使用内部逻辑根据给定的数字选择要使用的字符串。有时,您需要更多的控制,或者想要对特定情况进行不同的翻译(例如0
,或者当计数为负数时,例如)。对于这种情况,你可以使用显式的数学间隔:
1
{0}没有苹果|{1}有一个苹果|]1,19]有%count%苹果|[20,Inf[有许多苹果'
时间间隔遵循ISO 31-11符号。上面的字符串指定了四个不同的间隔:完全正确0
,完全1
,三分之一的
,20.
甚至更高。
您还可以混合显式数学规则和标准规则。在这种情况下,如果计数没有匹配到特定的间隔,则在删除显式规则后,标准规则生效:
1
{0}没有苹果|[20,Inf[有很多苹果|有一个苹果|a_few:有%count%苹果'
例如,对于1
苹果,标准规则有一个苹果
将被使用。为三分之一的
苹果,第二个标准规则有%count%苹果
将被选中。
一个时间间隔可以表示一个有限的数字集:
1
{1, 2, 3, 4}
或两个数之间的数:
1 2
[1, +Inf[]-1,2[
左边的分隔符可以是[
(包容)或]
(独家)。正确的分隔符可以是[
(独家)或]
(包容)。除了数字,你还可以用负
而且+正
为了无限。
强制译者的语言环境
在翻译消息时,翻译器将使用指定的区域设置或回退
现场(如果需要的话)。你也可以手动指定要用于翻译的语言环境:
12 3 4 5 6 7 8 9 10 11 12 13 14
$翻译->反式(“ob娱乐下载Symfony很棒”,数组(),“消息”,“fr_FR”);$翻译->transChoice ({0}没有苹果|{1}有一个苹果|]1,Inf[有%count%苹果',10,数组(“%数%”= >10),“消息”,“fr_FR”);