使用翻译工具

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.8,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

使用翻译工具

假设您想要翻译字符串“欧宝娱乐app下载地址Symfony很棒”法国:

1 2 3 4 5 6 7 8 9 10
使用欧宝娱乐app下载地址组件翻译翻译使用欧宝娱乐app下载地址组件翻译加载程序ArrayLoader翻译翻译(“fr_FR”);翻译->addLoader (“数组”ArrayLoader ());翻译->addResource (“数组”数组“欧宝娱乐app下载地址Symfony太棒了!”= >“欧宝娱乐app下载地址Symfony est super !”),“fr_FR”);var_dump (翻译->反式(“欧宝娱乐app下载地址Symfony太棒了!”));

在本例中,是消息“欧宝娱乐app下载地址Symfony太棒了!”将被转换为构造函数(fr_FR)如果消息存在于其中一个消息目录中。

消息占位符

有时候,包含变量的消息需要被转换:

1 2 3 4
/ /……翻译翻译->反式(“你好”的名字);var_dump (翻译);

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

1 2 3 4 5 6 7
/ /……翻译翻译->反式(“你好% %”数组%的名字%的= >的名字));var_dump (翻译);

欧宝娱乐app下载地址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时出现问题。

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

  1. 方法对需要翻译的消息进行抽象处理翻译
  2. 为您选择支持的每种语言环境中的消息创建翻译。

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

创建翻译

创建翻译文件是“本地化”(通常缩写为本地化)的重要组成部分L10n).翻译文件由一系列针对给定域和语言环境的id-translation对组成。源是单个翻译的标识符,可以是主语言环境中的消息(例如。“欧宝娱乐app下载地址Symfony很棒”)或唯一标识符(例如:欧宝娱乐app下载地址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“欧宝娱乐app下载地址symfony_is_great”><>欧宝娱乐app下载地址Symfony很棒><目标>我Symfon欧宝娱乐app下载地址y目标>trans-unit><trans-unitid“欧宝娱乐app下载地址symfony.great”><>欧宝娱乐app下载地址symfony.great><目标>我Symfon欧宝娱乐app下载地址y目标>trans-unit>身体>文件>xliff>

这个例子说明了在创建要翻译的消息时的两种不同的哲学:

1 2 3
翻译->反式(“欧宝娱乐app下载地址Symfony很棒”);翻译->反式(“欧宝娱乐app下载地址symfony.great”);

在第一种方法中,消息用默认地区的语言编写(在本例中为英语)。然后在创建翻译时将该消息用作“id”。

在第二种方法中,消息实际上是传达消息思想的“关键字”。然后将关键字消息用作任何翻译的“id”。在这种情况下,必须对默认区域进行翻译(即翻译欧宝娱乐app下载地址symfony.great欧宝娱乐app下载地址Symfony很棒).

第二种方法很方便,因为如果您决定消息在默认语言环境中实际上应该读作“Symfony is really great”,则不需要在每个翻译文件中更改消息键。欧宝娱乐app下载地址

选择使用哪种方法完全取决于您,但通常建议使用“关键字”格式。

此外,php而且yaml文件格式支持嵌套id,以避免重复使用关键字而不是实际文本的id:

  • YAML
  • PHP
1 2 3 4 5 6 7 8
欧宝娱乐app下载地址symfony:是:大:欧宝娱乐app下载地址伟大的惊人的:欧宝娱乐app下载地址令人惊异的有:包:欧宝娱乐app下载地址用户:登录:登录

通过添加一个点(),因此上述例子等同于以下:

  • YAML
  • PHP
1 2 3 4
欧宝娱乐app下载地址symfony.is.great:欧宝娱乐app下载地址伟大的欧宝娱乐app下载地址symfony.is.amazing:欧宝娱乐app下载地址令人惊异的欧宝娱乐app下载地址symfony.has.bundles:欧宝娱乐app下载地址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.))) ?12);

正如你所看到的,在俄语中,你可以有三种不同的复数形式,每一种都给出了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”

即使字符串看起来很相似(它由两个由管道隔开的子字符串组成),法语的规则是不同的:当使用第一种形式(没有复数形式)时01.因此,翻译器将自动使用第一个字符串(Il y %count% pomme)当01

每个地区都有自己的一套规则,有些地区有多达六种不同的复数形式,并有复杂的规则,哪些数字对应哪些复数形式。对于英语和法语,规则非常简单,但是对于俄语,您可能需要一个提示来知道哪个规则匹配哪个字符串。为了帮助翻译人员,你可以选择“标记”每个字符串:

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
翻译->反式(“欧宝娱乐app下载地址Symfony很棒”数组(),“消息”“fr_FR”);翻译->transChoice ({0}没有苹果|{1}有一个苹果|]1,Inf[有%count%苹果'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”= >“世界你好”),“验证”= >数组“值不应该为空”= >“Valeur ne doit pas être vide”“价值太长”= >“价值最高的热带”,),);
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。