webfactory / icu-translation-bundle
为Symfony应用程序中的翻译启用ICU消息格式化。
Requires
- php: ^7.4 | 8.0.* | 8.1.*
- ext-intl: *
- lib-icu: >=4.8
- jms/parser-lib: ^1.0.0
- psr/log: ^1.0
- symfony/config: ^4.3|^5.0
- symfony/dependency-injection: ^4.4|^5.0
- symfony/finder: ^3.4.31|^4.0|^5.0
- symfony/framework-bundle: ^4.4|^5.0
- symfony/http-kernel: ^4.4|^5.0
- symfony/translation: ^4.2|^5.0
- symfony/translation-contracts: ^2.0|^3.0
- twig/twig: ^1.42|^2.0|^3.0
Requires (Dev)
- phpunit/phpunit: ^8.5 | ^9.0
- symfony/monolog-bundle: ^3.4.31
- symfony/phpunit-bridge: >= 5.0
- symfony/twig-bundle: ^3.4.31|^4.0|^5.0
- symfony/yaml: ^4.4|^5.0
README
虽然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许可证下发布。