webfactory/icu-translation-bundle

为Symfony应用程序中的翻译启用ICU消息格式化。

0.10.2 2023-01-19 15:25 UTC

README

Build Status Coverage Status

虽然Symfony翻译组件在大多数情况下都做得很好,但如果需要除了数字(例如性别)之外的条件或嵌套条件,使用起来可能会变得困难。这就是ICU翻译包发挥作用的地方。通过使用Unicode国际组件项目的标准消息格式,它增强了Symfony组件,增加了任意和嵌套条件,以及易于使用的本地化数字和日期格式化。增强是非侵入式的,即您不需要触摸您以前的消息,它们仍然可以按常规工作。

安装

假设您已经启用并配置了Symfony翻译组件,您只需通过composer安装该包,如下所示

php composer.phar require webfactory/icu-translation-bundle

(我们使用语义版本控制,因此,一旦有版本标记为1.0.0可用,您可能希望使用类似~1.0的版本字符串。)

像往常一样,在您的内核中启用该包

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new \Webfactory\IcuTranslationBundle\WebfactoryIcuTranslationBundle()
    );
    // ...
}

使用方法

要使用该包的增强功能,您需要在翻译消息中使用带大括号的特殊语法。以下示例展示了常见用例的这种语法。有关完整列表,请参阅包文档

使用参数类型进行数字格式化

在您的消息中,您可以在变量后指定“number”作为参数类型。如果是这样,输出将使用正确的千位分隔符和小数点进行本地化。以下是一个存储在“message-number”键下的示例消息。

1 mile = {mile_to_metres, number} metres

在控制器中,示例可能如下所示

$translator = $this->get('translator');
$output = $translator->trans(
    'message-number',
    array('%mile_to_metres%' => 1609.34)
);

例如,对于“en”区域设置,输出将是“1英里 = 1,609.34米”,而对于“de”区域设置,它将是“1英里 = 1.609,34米”(或带有适当翻译的“1 Meile = 1.609,34 Meter”)。

有关日期等其他参数类型的其他信息,请参阅包文档。

性别特定翻译

性别特定翻译是任意条件的特殊情况。条件通过变量后的关键字“select”表示,后跟可能的变量值及其相应的消息。以下是一个存储在“en”区域设置下的键“message-gender”的示例消息。

{gender, select,
    female {She spent all her money on horses}
    other {He spent all his money on horses}
}

如果您的控制器看起来像这样

$output = $translator->trans(
    'message-gender',
    array('%gender%' => 'male')
);

对于“en”区域设置,输出将是“他花光了所有的钱买马”。

为什么我们没有在消息中列出“female”和“male”作为可能的变量值,而是“female”和“other”?请在包文档中查找答案。

更易读的复数形式

虽然 Symfony的翻译组件已经支持复数形式,但我们认为ICU翻译包提供了一种更易读的方式。与条件类似,复数形式通过在变量后跟关键字“plural”来表示,后跟可能的变量值及其相应的消息。以下是一个存储在“en”区域下的“message-pluralization”键中的示例消息。

{number_of_participants, plural,
    =0 {Nobody is participating}
    =1 {One person participates}
    other {# persons are participating}
}

如果您的控制器看起来像这样

$output = $translator->trans(
    'message-pluralization',
    array('%number_of_participants%' => 2)
);

“en”区域的输出将是:“2人正在参与”。

注意,您可以区分精确数字(如“=0”)和Unicode通用区域数据仓库数字类别(如“other”)。另外,注意井号“#”现在会被变量的值所替代,在这个例子中是2。

现在您已经了解了ICU翻译包的功能,我们再次邀请您阅读包文档

变更日志

0.5.0 -> 0.6.0

引入了缺失参数的记录。

0.4.0 -> 0.5.0

通过删除支持PHP版本< 5.5时必要的词法分析器/解析器类和消息重写,提高了性能。

0.3.0 -> 0.4.0

现在支持Symfony 3。

0.2.3 -> 0.3.0

放弃了PHP 5.3和5.4的支持,增加了对PHP 7的支持。

0.2.2 -> 0.2.3

GracefulExceptionsDecorator现在记录所有类型的异常,而不仅仅是FormattingException的实例。

致谢、版权和许可证

版权所有 2012-2019 webfactory GmbH,波恩。代码在MIT许可证下发布。