翻译

5.2版本
保持 没有维护的

翻译

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

//文本*总是*打印英文回声“Hello World”;//可以翻译成最终用户的语言或//默认为英语回声美元的翻译->反式(“Hello World”);

请注意

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

翻译过程有几个步骤:

  1. 启用和配置欧宝娱乐app下载地址Symfony的翻译服务;
  2. 摘要字符串(即“消息”)通过将它们括起来呼叫翻译(“基本的翻译“);
  3. 创建翻译资源/文件对于应用程序中翻译每条消息的每个受支持的语言环境;
  4. 决定,设置和管理用户的区域设置对于请求和可选择在用户的整个会话中

安装

首先,运行此命令在使用之前安装转换器:

1
美元作曲家需要symfony /翻译欧宝娱乐app下载地址

配置

上面的命令创建了一个初始配置文件,你可以在其中定义应用程序的默认语言环境和翻译文件所在的目录:

  • yaml.
    1 2 3 4 5
    #配置/包/ translation.yaml框架:default_locale.:'en'翻译:default_path.:'%kernel.project_dir%/翻译'
  • XML
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    < !--config/packages/translation.xml -->< ?encoding="UTF-8"<容器xmlns =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”XMLNS:Framework =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd“>缺省语言环境=“en”><框架:翻译><框架:默认路径>'%kernel.project_dir%/翻译'< /框架:默认路径><! -  ...  - >< /框架:配置>> < /容器
  • PHP
    1 2 3 4 5 6
    / /配置/包/ translation.php美元的容器->loadfromextension.(“框架”,('default_locale'= >'en',“翻译”= >(“default_path”= >'%kernel.project_dir%/翻译'),// ......]);

翻译中使用的语言环境是存储在请求中的语言环境。这通常通过_locale属性(参见区域设置和URL)。

基本的翻译

文本的翻译是通过翻译服务(欧宝娱乐app下载地址Symfony \翻译组件\ \翻译)。翻译翻译一块文本(称为消息), 使用反式()方法。例如,假设你正在转换一个来自控制器内部的静态消息:

// ......使用欧宝娱乐app下载地址Symfony \ \翻译\ TranslatorInterface合同;公共函数指数(翻译接口美元的翻译){翻译=美元的翻译->反式(S欧宝娱乐app下载地址ymfony是伟大的);// ......}

当此代码运行时,Symfony将尝试基于欧宝娱乐app下载地址语言环境的用户。要做到这一点,您需要告诉Symfony如何通过一个“翻译资源”来翻译消欧宝娱乐app下载地址息,这个“翻译资源”通常是一个包含给定区域设置的翻译集合的文件。这个翻译“字典”可以以几种不同的格式创建:

  • yaml.
    1 2
    #翻译/ messages.fr.yaml欧宝娱乐app下载地址symfony是伟大的:我Symfon欧宝娱乐app下载地址y
  • XML
    1 2 3 4 5 6 7 8 9 10 11 12
    < !--翻译/消息。fr.xlf -->< ?encoding="UTF-8"< xliffversion =“1.2”xmlns =“urn: oasis:名称:tc: xliff文档:1.2”><文件源语=“en”数据类型=“纯文本”原始=“file.ext”><身体>< trans-unitID =“欧宝娱乐app下载地址symfony_is_great”><源>欧宝娱乐app下载地址symfony是伟大的> < /来源<目标>我Symfon欧宝娱乐app下载地址y> < /目标< /身体>> < /文件< / xliff >
  • PHP
    1 2 3 4
    / /翻译/ messages.fr.php返回(S欧宝娱乐app下载地址ymfony是伟大的= >“j'aime 欧宝娱乐app下载地址symfony”,];

有关这些文件应位的信息,请参阅翻译资源/文件名和位置

现在,如果用户的语言环境是法语(例如法语)。fr_FRfr_BE),该信息将被翻译成j'aime.欧宝娱乐app下载地址。你也可以在你的模板

使用真实或关键字消息

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

美元的翻译->反式(S欧宝娱乐app下载地址ymfony是伟大的);美元的翻译->反式(“欧宝娱乐app下载地址symfony.great”);

在第一个方法中,消息是用默认区域设置的语言(本例中是英语)编写的。然后,当创建翻译时,该消息被用作“id”。

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

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

使用哪个方法的选择完全取决于你,但是“关键字”格式通常是建议多语言应用程序,而对于共享包包含翻译资源我们建议真正的消息,那么您的应用程序可以选择禁用翻译层,你将看到一个可读的信息。

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

  • yaml.
    1 2 3 4 5 6 7 8 9 10 11 12
    欧宝娱乐app下载地址::# id是sym欧宝娱乐app下载地址fone,很好伟大的:欧宝娱乐app下载地址symfony是伟大的# id是sym欧宝娱乐app下载地址fone,是,很棒的惊人:欧宝娱乐app下载地址Symfony是惊人的具有:#id是symf欧宝娱乐app下载地址ony.has.bundles捆绑:欧宝娱乐app下载地址Symfony已经包用户:# id是user.login登录:登录
  • PHP
    12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
    (s欧宝娱乐app下载地址ymfony的= >('是'= >(// id是sym欧宝娱乐app下载地址fony.is.great“伟大的”= >S欧宝娱乐app下载地址ymfony是伟大的,// id是sym欧宝娱乐app下载地址fony.is.Azing“神奇的”= >S欧宝娱乐app下载地址ymfony是惊人的,),'具有'= >(// id是sym欧宝娱乐app下载地址fony.has.bundles'捆绑'= >S欧宝娱乐app下载地址ymfony的包的,),),“用户”= >(// id为user.login“登录”= >“登录”,),];

翻译过程

为实际翻译消息,Symfony在使用欧宝娱乐app下载地址反式()方法:

  1. 语言环境对当前用户,其中存储的请求是确定的;
  2. 对象定义的翻译资源将加载已翻译消息的目录(例如大集合)语言环境(如。fr_FR)。的消息回退场所如果尚未存在,也加载并添加到目录中。最终结果是翻译的大“字典”。此目录在生产中缓存,以最大限度地减少性能影响。
  3. 如果消息位于目录中,则返回转换。如果不是,则转换器返回原始消息。

提示

翻译不属于默认域的字符串时(消息的第三个参数,必须指定域反式():

美元的翻译->反式(S欧宝娱乐app下载地址ymfony是伟大的,[],“管理”);

消息格式

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

// ......翻译=美元的翻译->反式(“你好”$名称);

但是,由于翻译器将尝试查找包括变量部分的消息,因此无法为此字符串进行翻译是不可能的(例如,“你好瑞恩”“你好,法比安”)。

基于某些变量,另一个并发症是当您有可能或可能不是复数的翻译时:

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

为了管理这些情况,Symfony遵循欧宝娱乐app下载地址ICU MessageFormat.语法使用PHP的MessageFormatter.类。更多信息请参见如何使用ICU MessageFormat翻译消息

可翻译对象

5.2版中的新增功能:Symfony 5.2中引入了可翻译对象。欧宝娱乐app下载地址

有时,翻译模板中的内容很麻烦,因为您需要每个内容的原始消息、翻译参数和翻译域。在控制器或服务中进行转换可以简化模板,但需要在应用程序的不同部分注入转换器服务,并在测试中模拟它。

而不是在创建时翻译字符串,您可以使用“可翻译对象”,而不是“可翻译对象”,这是一个“可翻译对象”欧宝娱乐app下载地址Symfony \ \翻译\ TranslatableMessage组件类。该对象存储在需要时完全转换其内容所需的所有信息:

使用欧宝娱乐app下载地址Symfony \ \翻译\ TranslatableMessage组件;//第一个参数是必需的,它是原始消息美元的消息=translatablemessage.('欧宝娱乐app下载地址symfony很棒!');//可选的第二个参数定义翻译参数和//可选的第三个参数是翻译域$地位=translatablemessage.(“order.status”,(“%地位%”= >$订单->的getStatus()),“存储”);

模板现在简单多了,因为您可以将可翻译对象传递给反式筛选:

1 2
<h1>{{消息|反式}}h1><p>{{状态|反式}}p>

提示

还有一个t()函数,可以在Twig和PHP中使用,作为创建可翻译对象的快捷方式。

模板的翻译

大多数时候,翻译发生在模板中。欧宝娱乐app下载地址Symfony为Twig和PHP模板提供了本地支持。

使用Twig标记

欧宝娱乐app下载地址Symfony提供了一个专门的Twig标签反式帮助信息翻译静态文本块:

1
{%反式%}你好% %{%endtrans.%}

警告

% var %使用标记在Twig模板中进行翻译时,需要占位符表示法。

提示

如果您需要使用百分比字符(%),通过加倍转义:{%反式%} %:%百分%%%{%endtrans.%}

您还可以指定消息域并传递一些其他变量:

1 2 3
{%反式{'%名称%':“法”}“应用程序”%}你好% %{%endtrans.%}{%反式{'%名称%':“法”}“应用程序”进入“fr”%}你好% %{%endtrans.%}

使用树枝滤波器

反式过滤器可用于转换变量文本和复杂的表达式:

1 2 3
{{消息|反式}}{{消息|反式({'%名称%':“法”},“应用程序”)}}

提示

使用翻译标记或过滤器具有相同的效果,但有一个细微的区别:自动输出转义仅应用于使用过滤器的翻译。换句话说,如果你需要确定你翻译的信息是不是输出转义后,必须应用过滤后的翻译过滤:

1 2 3 4 5 6 7 8 9 10
{#在标签之间转换的文本不会转义#}{%反式%}<h3>喷火h3>{%endtrans.%}{%消息=“foo < h3 > < / h3 >”%}{#Strings和通过过滤器翻译的变量默认逃逸#}{{消息|反式|}}{{'

酒吧'|反式|}}

提示

您可以使用单个标记设置整个枝条模板的翻译域:

1
{%trans_default_domain“应用程序”%}

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

PHP模板

通过PHP模板可以访问翻译服务翻译帮手:

1
< ?=$视图(“翻译”]->反式(S欧宝娱乐app下载地址ymfony是伟大的)? >

强迫翻译语言环境

在翻译消息时,转换器使用指定的语言环境或回退现场如果有必要。你也可以手动指定用于翻译的语言环境:

美元的翻译->反式(S欧宝娱乐app下载地址ymfony是伟大的,[],“消息”,'fr_fr');

自动提取翻译内容和更新目录

翻译应用程序时最耗时的任务是提取所有要翻译的模板内容,并保持所有翻译文件的同步。欧宝娱乐app下载地址Symfony包含一个命令翻译:更新这将帮助你完成以下任务:

1 2 3 4 5 6 7 8
#显示所有应该翻译成法语的消息美元PHP bin/console翻译#使用该地区缺少的字符串更新法语翻译文件美元PHP bin/console翻译#查看命令帮助,查看其选项(前缀、输出格式、域、排序等)美元PHP BIN / CONSOLE翻译:更新--help

翻译:更新命令查找丢失的翻译:

  • 存储在模板/目录(或在中定义的任何其他目录)twig.default_path.twig.paths.配置选项);
  • 任何注入或注入的PHP文件/类自动装配翻译服务,并调用反式()方法。

翻译资源/文件名和位置

欧宝娱乐app下载地址symfony在以下默认位置查找消息文件(即翻译):

  • 翻译/目录(在项目的根目录);
  • 资源/翻译/任何捆绑的目录。

这里列出了优先级最高的位置。也就是说,您可以覆盖第一个目录中的包的翻译消息。

覆盖机制在键级工作:只有被覆盖的键需要在一个更高优先级的消息文件中列出。当在消息文件中没有找到密钥时,翻译程序将自动退回到较低优先级的消息文件。

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

  • :域是将消息组织成组的一种方式。除非应用程序的各个部分显式地彼此分离,否则建议只使用默认值消息域(如。messages.en.yaml)。
  • 语言环境:翻译的语言环境(例如en_GB,, 等等);
  • 装载机: Symf欧宝娱乐app下载地址ony应该如何加载和解析文件(例如。xlf,php,yaml., 等等)。

加载器可以是任何已注册加载器的名称。默认情况下,Symfon欧宝娱乐app下载地址y提供了许多加载器:

  • .yaml:yaml文件
  • .xlf: XLIFF文件;
  • .php.:返回PHP数组;
  • .csv.: CSV文件;
  • . json: JSON文件;
  • . ini: INI文件;
  • .dat,r:ICU资源包;
  • .mo.:机器对象格式;
  • .po.:可移植的对象格式;
  • .qt.QT翻译XML文件;

选择使用的装载机的选择完全取决于您,是一种味道。建议的选项是使用YAML进行简单的项目,如果您正在使用专门的程序或团队生成翻译,则使用Xliff。

警告

每次创建一个消息目录(或安装包含翻译目录的捆绑包),请务必清除您的缓存,以便symfony可以发现新的翻译资源:欧宝娱乐app下载地址

1
美元PHP BIN / CONSOLE缓存:清除

请注意

属性添加其他目录path配置中的选项:

  • yaml.
    1 2 3 4 5
    #配置/包/ translation.yaml框架:翻译:path:-'%kernel.project_dir%/ custom / path / to / translations'
  • XML
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    < !--config/packages/translation.xml -->< ?encoding="UTF-8"<容器xmlns =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”XMLNS:Framework =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xmlns: xsi =“http://www.w3.org/2001/XMLSchema-Instance”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd“><框架:配置><框架:翻译><框架:路径>% kernel.project_dir % /定制/道路/ /翻译> < /框架:路径< /框架:配置>> < /容器
  • PHP
    1 2 3 4 5 6 7 8
    / /配置/包/ translation.php美元的容器->loadfromextension.(“框架”,(“翻译”= >(“路径”= >('%kernel.project_dir%/ custom / path / to / translations',),),]);

请注意

控件的自定义类还可以在数据库或任何其他存储中存储翻译欧宝娱乐app下载地址symfony \ component \译文\ loader \ loaderInterface接口。看到translation.loader标签获取更多信息。

处理用户的区域设置

翻译是基于用户的语言环境进行的。读如何使用用户的区域设置了解更多关于如何处理它。

回退翻译的地方

假设用户的语言环境是es_AR你在翻译钥匙欧宝娱乐app下载地址伟大的。为了找到西班牙语翻译,Symfony实际上检查了几个地区的翻译资源欧宝娱乐app下载地址:

  1. 首先,symf欧宝娱乐app下载地址ony寻找翻译es_AR(阿根廷西班牙语)翻译资源(例如:messages.es_AR.yaml);

  2. 如果没有找到,Symfony会在父语言环欧宝娱乐app下载地址境中查找翻译,而父语言环境是仅针对某些语言环境自动定义的。在本例中,父区域设置是es_419(拉丁美洲西班牙语);

  3. 如果没有找到,Symfony会在一个欧宝娱乐app下载地址西文(西班牙语)翻译资源(例如messages.es.yaml);

  4. 如果仍然没有找到翻译,Symfony使用欧宝娱乐app下载地址回退选项,可按如下方式配置:

    • yaml.
      1 2 3 4 5
      #配置/包/ translation.yaml框架:翻译:回退:('en']#……
    • XML
      12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
      < !--config/packages/translation.xml -->< ?encoding="UTF-8"<容器xmlns =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi =“http://www.w3.org/2001/XMLSchema-instance”XMLNS:Framework =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation =“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services/services-1.0.xsdhttp://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony.https://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd“><框架:配置><框架:翻译><框架:后备>< /框架:后备><! -  ...  - >< /框架:配置>> < /容器
    • PHP
      1 2 3 4 5
      / /配置/包/ translation.php美元的容器->loadfromextension.(“框架”,(“翻译”= >(“回退”= >('en']],// ......]);

请注意

当Symf欧宝娱乐app下载地址ony在给定的语言环境中找不到翻译时,它会将丢失的翻译添加到日志文件中。有关详细信息,请参见记录

翻译数据库内容

数据库内容的翻译应由Doctrine通过可翻译扩展或者是可翻译行为(PHP 5.4+)。有关更多信息,请参阅这些库的文档。欧宝体育电话

调试翻译

当您使用不同语言的许多翻译信息时,可能很难跟踪哪些翻译丢失了,哪些不再使用了。读如何找到缺失或未使用的翻译消息要了解如何识别这些消息。

总结

有了Symfony欧宝娱乐app下载地址 Translation组件,创建国际化应用程序不再是一个痛苦的过程,可以归结为以下步骤:

  • 申请中的抽象消息通过包装反式()方法;
  • 通过创建翻译消息文件将每个消息转换为多个地区。欧宝娱乐app下载地址Symfony发现并处理每个文件,因为它的名称遵循特定的约定;
  • 管理用户的语言环境,该语言环境存储在请求中,但也可以在用户会话中进行设置。

这项工作,包括代码样本,是在一个创作共用BY-SA 3.0许可证。