翻译

编辑本页

翻译

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

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

请注意

这个词语言环境大致指用户的语言和国家。它可以是应用程序用来管理翻译和其他格式差异(例如货币格式)的任何字符串。的ISO 639 - 1语言代码,一个下划线(_),然后ISO 3166-1 alpha-2国家代码(如。fr_FR法语/法国)。

翻译过程有几个步骤:

  1. 启用和配置ob娱乐下载Symfony的翻译服务;
  2. 抽象字符串(例如:的调用来封装它们翻译(“翻译”);
  3. 创建翻译资源/文件对于翻译应用程序中每条消息的受支持的语言环境;
  4. 确定,设置和管理用户的语言环境对于请求和可选的在用户的整个会话上

安装

首先,在使用转换器之前,运行这个命令来安装它:

1
作曲家需要交响乐/翻译ob娱乐下载

配置

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

  • 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
/ /……使用ob娱乐下载合同翻译TranslatorInterface公共函数指数(TranslatorInterface翻译翻译翻译->反式(“ob娱乐下载Symfony很棒”);/ /……

运行这段代码时,Symfony将尝试基于“Syob娱乐下载mfony is great”翻译消息语言环境用户的。为此,您需要告诉Symfony如何通过“翻译资源”翻译消息,“翻译资源ob娱乐下载”通常是一个包含给定语言环境的翻译集合的文件。这个翻译“字典”可以用几种不同的格式创建:

  • YAML
  • XML
  • PHP
1 2
#翻译/ messages.fr.yamlob娱乐下载Symfony很棒:ob娱乐下载

有关这些文件应位于何处的信息,请参见翻译

现在,如果用户所在地区的语言是法语(例如;fr_FRfr_BE),讯息会被翻译成我Symfonob娱乐下载y.你也可以在你的模板

使用真实消息或关键字消息

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

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

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

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

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

选择使用哪种方法完全取决于您,但“关键字”格式通常推荐用于多语言应用程序,而对于包含翻译资源的共享包,我们推荐使用真实消息,因此您的应用程序可以选择禁用翻译层,并且您将看到可读的消息。

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

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

翻译过程

属性时,Symfony使用以下过程来实际翻译消息ob娱乐下载反式()方法:

  1. 语言环境当前用户的,哪个存储在请求上;
  2. 类定义的翻译资源中加载翻译消息的目录(例如大的集合)语言环境(如。fr_FR).来自回退场所如果它们还不存在,也会加载并添加到目录中。最终的结果是一个巨大的翻译“字典”。此目录在生产中缓存,以最小化性能影响。
  3. 如果消息位于目录中,则返回翻译。如果不是,翻译器将返回原始消息。

提示

当翻译不在默认域中的字符串时(消息),则必须将域指定为的第三个参数反式()

1
翻译->反式(“ob娱乐下载Symfony很棒”[],“管理”);

消息格式

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

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

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

另一个复杂的问题是,当你的翻译可能是复数,也可能不是复数,这取决于一些变量:

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

为了管理这些情况,Symfony遵循ob娱乐下载ICU MessageFormat语法messageformat类。阅读更多如何使用ICU MessageFormat翻译消息

提示

如果你在翻译文件中不使用ICU MessageFormat语法,传递一个名为“%count%”的参数来选择消息的最佳复数形式:

1
{{message|trans({'%name%': '…', '%count%': 1}, 'app')}}

消息属性的值必须包含此消息的所有不同版本参数。例如:

1
{0}%name%没有苹果|{1}%name%有一个苹果|]1,Inf[%name%有%count%苹果

可翻译的对象

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

属性的一个实例“可翻译对象”,而不是在创建时翻译字符串TranslatableMessage类。该对象存储在需要时完全转换其内容所需的所有信息:

1 2 3 4 5 6 7
使用ob娱乐下载组件翻译TranslatableMessage//第一个参数是必需的,它是原始消息消息TranslatableMessage (“ob娱乐下载Symfony太棒了!”);//第二个可选参数定义了转换参数和//可选的第三个参数是翻译域状态TranslatableMessage (“order.status”, (“%地位%”= >订单->getStatus ()),“存储”);

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

1 2
<h1>{{message|trans}}h1><p>{{status|trans}}p>

提示

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

模板中的翻译

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

使用小树枝标签

ob娱乐下载Symfony提供了一个专门的Twig标记反式帮助翻译的信息静态文本块

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

谨慎

% var %在Twig模板中使用标签翻译时,需要使用占位符符号。

提示

如果需要使用百分比字符(),通过加倍来转义它:{% trans %}百分比:%%% %%{% endtrans %}

你也可以指定消息域并传递一些额外的变量:

1 2 3
{%反式使用{'%name%': 'Fabien'} from 'app' %}你好% %{%endtrans%}{%反式用{'%name%': 'Fabien'} from 'app' into 'fr' %}你好% %{%endtrans%}

使用树枝过滤器

反式滤镜可以用来翻译变量文本复杂表达式:

1 2 3
{{message|trans}}{{message|trans({'%name%': 'Fabien'}, 'app')}}

提示

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

1 2 3 4 5 6 7 8 9 10
{#标签之间翻译的文本永远不会转义#}{%反式%}<h3>喷火h3>{%endtrans%}{%消息= '

foo

' %}
默认情况下,通过过滤器转换的字符串和变量将转义#}{{消息反式| |}}{{'酒吧< h3 > < / h3 > |反式|}}

提示

你可以用一个标签为整个Twig模板设置翻译域:

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

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

强制译者的语言环境

在翻译消息时,翻译人员将使用指定的区域设置或回退现场(如果需要的话)。你也可以手动指定要用于翻译的语言环境:

1 2 3 4 5 6
翻译->反式(“ob娱乐下载Symfony很棒”[],“消息”“fr_FR”);

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

翻译应用程序时最耗时的任务是提取要翻译的所有模板内容,并保持所有翻译文件的同步。ob娱乐下载Symfony包含一个名为翻译:提取这可以帮助你完成以下任务:

1 2 3 4 5 6 7 8
#显示所有应该翻译为法语的消息PHP bin/控制台翻译#更新法语翻译文件,使用该语言环境中缺少的字符串PHP bin/控制台翻译#检查命令帮助查看它的选项(前缀,输出格式,域,排序等)PHP bin/控制台翻译:extract——.帮助

翻译:提取命令查找以下文件中缺失的翻译:

  • 存储在模板/目录中定义的任何其他目录twig.default_path而且twig.paths配置选项);
  • 任何PHP文件/类注入自动装配翻译服务并调用反式()方法。
  • 中存储的任何PHP文件/类src /创建的目录翻译方法使用构造函数或t ()方法或调用反式()方法。
  • 中存储的任何PHP文件/类src /使用的目录约束属性*消息命名参数(s)。

6.2

Symfony 6.2引入了对使用约束属性的PHP文件/类的支持。ob娱乐下载

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

ob娱乐下载Symfony在以下默认位置查找消息文件(即翻译):

  • 翻译/目录(在项目的根目录);
  • 翻译/目录中的任何包(以及它们的资源/翻译/目录,不再推荐用于包)。

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

覆盖机制在键级别上工作:只有被覆盖的键需要列在优先级更高的消息文件中。当在消息文件中没有找到键时,转换器将自动退回到优先级较低的消息文件。

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

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

加载器可以是任何已注册加载器的名称。默认情况下,Symfonob娱乐下载y提供了许多基于以下文件扩展名选择的加载器:

6.1

.xliffSymfony 6.1中引入了文件扩展名支持。ob娱乐下载

选择使用哪个加载器完全取决于您,这是一个品味问题。建议在简单项目中使用YAML,如果使用专门的程序或团队生成翻译,则使用XLIFF。

谨慎

每次创建消息目录(或安装包含翻译目录的包),请确保清除缓存,以便Symfony可以发现新的翻译资源:ob娱乐下载

1
PHP bin/控制台缓存:清除

请注意

属性可以添加其他目录路径配置中的选项:

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

请注意

类的自定义类实现,也可以将翻译存储在数据库或任何其他存储中LoaderInterface接口。看到内置的Symfonob娱乐下载y服务标签标签以获取更多信息。

翻译服务提供商

当使用外部翻译人员翻译应用程序时,必须经常向他们发送要翻译的新内容,并将结果合并回应用程序中。

Symfony提供了与多个第三方翻译服务(如Crowdin或Loob娱乐下载kalise)的集成,而不是手动完成。您可以上传和下载(称为“推送”和“拉取”)翻译到这些服务,并在应用程序中自动合并结果。

安装和配置第三方提供程序

在将翻译推/拉到第三方提供商之前,您必须安装与该提供商集成的包:

提供者 安装与
Crowdin 编译器需要symfony/crowob娱乐下载din-translation-provider
疯子(localise.biz) 作曲家需要symfony/本地化翻ob娱乐下载译提供者
Lokalise 作曲家需要symfony/lokaob娱乐下载lise-translation-provider

每个库包含一个ob娱乐下载Symfony Flex配方这将添加配置示例到您的.env文件。例如,假设您想使用Loco。首先,安装:

1
作曲家需要symfony/本地化翻ob娱乐下载译提供者

现在在你的.env可以取消注释的文件:

1 2
# .envLOCO_DSN =疯子:/ / API_KEY@default

LOCO_DSN不是一个真正的address:这是一种方便的格式,可以将大部分配置工作卸载到Symfony。ob娱乐下载的疯子scheme激活你刚刚安装的Loco提供程序,它知道如何通过Loco推送和拉取翻译。的只有你需要改变的部分是API_KEY占位符。

下表显示了每个提供商可用的DSN格式的完整列表:

若要启用翻译提供程序,请在您的.env文件和配置供应商选择:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/包/ translation.yaml框架:翻译:提供者:疯子:dsn:' % env (LOCO_DSN) %域:(“信息”)地区:(“en”,“fr”

提示

方法之后使用locale格式作为提供程序ISO 639 - 1(如。"en"或"fr"),则必须设置自定义语言名称设置中的Lokalise,以覆盖默认值(该值跟随在ISO 639 - 1后面是一个大写字母的子代码,指定国家品种(例如。“GB”或“US”根据ISO 3166-1 alpha-2))。

推拉翻译

在配置访问翻译提供程序的凭据之后,现在可以使用以下命令来推送(上传)和拉取(下载)翻译:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#推送所有本地翻译到Loco提供商的地区和领域#在config/packages/translation中配置。yaml文件。#它将更新提供者上已经存在的翻译。PHP bin/控制台翻译:push loco——force#推送新的本地翻译到Loco提供商的法语地区#和validators域。#它将**不会**更新提供者上已经存在的翻译。PHP bin/控制台翻译:推送loco—locale fr—域验证器#推送新的本地翻译并删除提供商的翻译#在法语地区和validators域的本地文件中不再存在。#它将**不会**更新提供者上已经存在的翻译。PHP bin/控制台翻译:push loco—delete-missing—locales fr—域验证器#检查命令帮助查看它的选项(格式,域,区域设置等)PHP bin/控制台翻译:push——帮助
12 3 4 5 6 7 8 9 10 11 12
#将所有提供商的翻译文件拉到本地文件中#在config/packages/translation中配置。yaml文件。#它将完全覆盖您的本地文件。PHP bin/控制台翻译:pull loco——force#从Loco提供程序中提取新的法语翻译到本地文件# locale和validators域。它不会覆盖你的本地文件,只会添加新的翻译。PHP bin/控制台翻译:拉loco—locale fr—域验证器#检查命令帮助查看它的选项(格式,域,区域设置,intl-icu等)PHP bin/控制台翻译:pull——帮助

处理用户的语言环境

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

备用翻译区域设置

假设用户的语言环境是es_AR你在转换键ob娱乐下载Symfony很棒.为了找到西班牙语翻译,Symfony实际上检查了几个地区的翻译资源ob娱乐下载:

  1. 首先,Symfob娱乐下载ony在es_AR(阿根廷西班牙语)翻译资源(例如:messages.es_AR.yaml);
  2. 如果没有找到,Symfony将在父语言环ob娱乐下载境中查找翻译,父语言环境仅为某些语言环境自动定义。在本例中,父区域设置为es_419(拉丁美洲西班牙语);
  3. 如果没有找到,Symfony将在ob娱乐下载西文(西班牙语)翻译资源(例如:messages.es.yaml);
  4. 如果仍然没有找到翻译,Symfony将使用ob娱乐下载回退选项,可配置如下:

    • YAML
    • XML
    • PHP
    1 2 3 4 5
    #配置/包/ translation.yaml框架:翻译:回退:(“en”)#……

请注意

当Symfob娱乐下载ony在给定的语言环境中找不到翻译时,它将把缺少的翻译添加到日志文件中。详细信息请参见框架配置参考(FrameworkBundle)

以编程方式切换语言环境

6.1

LocaleSwitcher在Symfony 6.1中引入。ob娱乐下载

有时,为了运行一些代码,您需要动态地更改应用程序的区域设置。想象一个控制台命令,它用不同的语言呈现电子邮件的Twig模板。只有在呈现这些模板时才需要更改区域设置。

LocaleSwitcher类允许您立即更改的区域设置:

  • 标记的所有服务kernel.locale_aware
  • \地区:setDefault ()
  • 如果请求可用,则_locale请求属性。
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
使用ob娱乐下载组件翻译LocaleSwitcherSomeService私人LocaleSwitcherlocaleSwitcher公共函数__construct(LocaleSwitcherlocaleSwitcher->localeSwitcher =localeSwitcher;}公共函数someMethod()//你可以像这样得到当前应用程序的语言环境:currentLocale->localeSwitcher->getLocale ();//你可以像这样设置整个应用程序的语言环境://(从现在开始,应用程序将使用'fr'(法语)作为/ /语言环境;包括用于翻译Twig模板的默认语言环境)->localeSwitcher->setLocale (“fr”);//将应用程序的当前区域设置为配置的默认区域//在config/packages/translation。Yaml,通过选项'default_locale'->localeSwitcher->重置();//你也可以使用特定的语言环境来运行一些代码//更改应用程序其余部分的区域设置->localeSwitcher->runWithLocale (“西文”函数()//例如,在这里使用'es'(西班牙语)语言环境渲染一些Twig模板});/ /……}}

当使用自动装配,输入提示任何控制器或服务参数LocaleSwitcher类注入语言环境切换器服务。否则,请手动配置服务并注入translation.locale_switcher服务。

翻译数据库内容

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

调试翻译

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

总结

使用Symfonyob娱乐下载 Translation组件,创建国际化应用程序不再是一个痛苦的过程,可以归结为以下步骤:

  • 抽象应用程序中的消息,方法是将每个消息包装在反式()方法;
  • 通过创建翻译消息文件将每条消息翻译成多个地区。ob娱乐下载Symfony发现并处理每个文件,因为它的名称遵循特定的约定;
  • 管理用户的语言环境,该语言环境存储在请求中,但也可以在用户的会话中设置。
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
ob娱乐下载Symfony 6.2支持通过苏禄人
ob娱乐下载Symfony 6.2支持通过Les-Tilleuls.coop