翻译

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.4,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

翻译

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

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

请注意

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

翻译过程有几个步骤:

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

安装

首先,运行这个命令在使用前安装翻译:

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

配置

前面的命令创建一个初始配置文件,您可以定义应用程序的缺省语言环境和翻译文件所在的目录:

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/包/ translation.yaml框架:default_locale:“en”翻译:default_path:' % kernel.project_dir % /翻译'

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

基本的翻译

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

1 2 3 4 5 6 7 8 9
/ /……使用欧宝娱乐app下载地址\合同\翻译\TranslatorInterface;公共函数指数(TranslatorInterface美元翻译){美元翻译=美元翻译- >反式(S欧宝娱乐app下载地址ymfony是伟大的);/ /……}

运行这段代码时,Symfony将尝试翻译消息基欧宝娱乐app下载地址于“Symfony是伟大的”语言环境的用户。为此,您需要告诉Symfony如何翻译消息通过“翻译资源”,这通常是一欧宝娱乐app下载地址个文件,它包含一组翻译对于一个给定的语言环境。这种“字典”的翻译可以在几种不同的格式:

  • YAML
  • XML
  • PHP
1 2
#翻译/ messages.fr.yaml欧宝娱乐app下载地址Symfony是伟大的:欧宝娱乐app下载地址

这些文件应该安装在哪里的信息,明白了翻译

现在,如果用户的语言环境是法国人的语言(如。fr_FRfr_BE),消息将被翻译成我Symfon欧宝娱乐app下载地址y。你也可以翻译你的消息模板

使用真实的或关键字信息

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

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

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

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

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

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

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

  • YAML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12
欧宝娱乐app下载地址symfony:是:# id是sym欧宝娱乐app下载地址fony.is.great大:欧宝娱乐app下载地址伟大的# id是sym欧宝娱乐app下载地址fony.is.amazing惊人的:欧宝娱乐app下载地址令人惊异的有:# id是sym欧宝娱乐app下载地址fony.has.bundles包:欧宝娱乐app下载地址用户:# id是user.login登录:登录

翻译过程

翻译的消息,当使用Symfony使用以下过程欧宝娱乐app下载地址反式()方法:

  1. 语言环境当前用户的存储在请求决定;
  2. 目录(例如大集合)翻译的翻译信息加载资源的定义语言环境(如。fr_FR)。的消息回退场所也加载并添加到目录如果他们不存在。最终的结果是一个大型的“词典”翻译。这个目录缓存的生产性能的影响降到最低。
  3. 如果消息位于目录,返回翻译。如果没有,翻译返回原始消息。

提示

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

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

消息格式

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

1 2
/ /……美元翻译=美元翻译- >反式(“你好”美元的名字);

然而,这个字符串创建一个翻译是不可能的因为翻译将尝试查找消息包括可变部分(如“你好瑞恩”“你好,法比安”)。

另一个问题是当你有可能是也可能不是复数翻译,基于一些变量:

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

来管理这些情况下,Symfony遵循欧宝娱乐app下载地址ICU MessageFormat通过使用PHP的语法messageformat类。阅读更多关于这个如何使用ICU MessageFormat翻译消息

4.2

支持ICU MessageFormat是在Symfony 4.2中引入的。欧宝娱乐app下载地址在这之前,多元化管理的transChoice ()方法。

翻译的模板

大多数时候,翻译出现在模板。欧宝娱乐app下载地址Symfony提供本机支持树枝和PHP模板。

使用树枝标记

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

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

transchoice标签自动获取%数%从当前上下文变量,将其传递到翻译。这种机制只适用后当你使用一个占位符% var %模式。

4.2

transchoice标签是弃用,因为Symfony 4.2和5.0将欧宝娱乐app下载地址被删除。使用ICU MessageFormat反式标签代替。

谨慎

% 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日‘%名称%’:‘法’},“应用程序”)}}

4.2

transchoice过滤器是弃用,因为Symfony 4.2和5.0将被删欧宝娱乐app下载地址除。使用ICU MessageFormat反式过滤器。

提示

使用翻译标记或过滤器具有相同的效果,但有一个微妙的差异:自动输出逃避只是使用一个过滤器应用于翻译。换句话说,如果你需要确保你的信息是翻译输出了,你必须应用翻译后过滤器过滤:

1 2 3 4 5 6 7 8 9 10
{#标记之间的文本翻译从来不是逃脱了#}{%反式%}<h3>喷火< /h3>{%endtrans%}{%消息= ' < h3 > foo < / h3 > ' %}{#通过一个过滤器字符串和变量翻译默认了#}{{消息反式| |}}{{< h3 > < / h3 >酒吧的反式| |}}

提示

你可以设置整个树枝模板的翻译领域一个标签:

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

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

PHP模板

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

1 2 3 4 5 6 7
< ?=美元视图(“翻译”]- >反式(S欧宝娱乐app下载地址ymfony是伟大的)? >< ?=美元视图(“翻译”]- >transChoice (“{0}没有苹果|{1}有一个苹果|)1,正[有%数%苹果',10,(“%数%”= >10])? >

迫使译者语言环境

翻译一个消息时,译者使用指定的区域或回退现场如果有必要。你也可以手动指定地区用于翻译:

1 2 3 4 5 6
美元翻译- >反式(S欧宝娱乐app下载地址ymfony是伟大的[],“消息”,“fr_FR”);

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

最耗时的任务当翻译应用程序提取所有的模板内容要翻译和保持所有的翻译文件同步。欧宝娱乐app下载地址Symfony包括一个命令翻译:更新可以帮助你与这些任务:

1 2 3 4 5 6 7 8
#显示所有的消息应该翻译为法语美元php bin /控制台翻译:更新——将消息转储fr#更新法语翻译文件丢失的字符串的语言环境美元php bin /控制台翻译:更新——迫使fr#查看命令帮助看到其选项(前缀、输出格式、域、排序等)美元php bin /控制台翻译:更新—帮助

翻译:更新命令寻找失踪的翻译:

4.3

失踪的提取翻译字符串从PHP文件是在Symfony 4.3中引入的。欧宝娱乐app下载地址

翻译资源/文件名称和位置

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

  1. 翻译/在项目的根目录();
  2. src /资源/ <包名称> /翻译/目录;
  3. 资源/翻译/目录里面的包。

4.2

使用src /资源/ <包名称> /翻译/目录存储翻译在Symfony 4.2中被弃用。欧宝娱乐app下载地址使用目录中定义的default_path选项(这是翻译/默认情况下)。

这里列出的位置是最高的优先级。也就是说,您可以重写翻译消息包的任何两个目录。

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

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

  • :域信息组织到组织的一种方式。除非应用程序的部分是明确分开,建议只使用默认值消息域(如。messages.en.yaml)。
  • 语言环境:翻译的语言环境(如en_GB,等);
  • 加载程序:Symfo欧宝娱乐app下载地址ny如何加载和解析文件(如。xlf,php,yaml等等)。

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

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

使用哪个装载机的选择完全取决于你,是一种品味。推荐的选择是使用YAML对于简单的项目,如果你使用XLIFF生成翻译与专业项目或团队。

谨慎

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

1
美元php bin /控制台缓存:清楚

请注意

您可以添加其他目录路径配置选项:

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/包/ translation.yaml框架:翻译:道路:- - - - - -' % kernel.project_dir % /定制/道路/ /翻译'

请注意

你也可以翻译存储在一个数据库,或任何其他存储通过提供一个自定义类实现LoaderInterface接口。看到内置Symfony欧宝娱乐app下载地址服务标签标签的更多信息。

4.3

从4.3 Symfony开始欧宝娱乐app下载地址,当您创建一个新的翻译文件(或安装一个包,包括翻译文件),你不需要清除缓存的命令php bin /控制台缓存:清楚当你必须做在之前的Symfony的版本。欧宝娱乐app下载地址

处理用户的语言环境

翻译会根据用户的语言环境。读如何处理用户的语言环境了解更多关于如何处理它。

回退翻译的地方

想象一下,用户的区域设置es_AR那你翻译的关键欧宝娱乐app下载地址Symfony是伟大的。寻找西班牙语翻译,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
    • XML
    • PHP
    1 2 3 4 5
    #配置/包/ translation.yaml框架:翻译:回退:(“en”)#……

4.4

在Sy欧宝娱乐app下载地址mfony的版本在4.4之前,回退选择是初始化为(英语)在没有显式配置。从4.4 Symfony开始欧宝娱乐app下载地址,这个选项是相同的值作为初始化的default_locale选择。

请注意

当Symf欧宝娱乐app下载地址ony不能找到一个翻译在给定的区域,它将缺失的翻译添加到日志文件中。有关详细信息,请参见框架配置引用(FrameworkBundle)

翻译数据库内容

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

调试翻译

当你有许多工作在不同语言翻译消息,很难跟踪哪些翻译是失踪,哪些不习惯了。读如何找到丢失或未使用的翻译消息吗找出如何识别这些消息。

总结

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

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