phpmyadmin / twig-i18n-extension
通过 gettext 库为 Twig 提供国际化支持
Requires
- php: ^7.2 || ^8.0
- twig/twig: ^1.42.3|^2.0|^3.0
Requires (Dev)
- phpmyadmin/coding-standard: ^3.0.0
- phpmyadmin/motranslator: ^5.2
- phpstan/phpstan: ^1.9.4
- phpunit/phpunit: ^7 || ^8 || ^9
README
i18n 扩展向 Twig 添加了 gettext 支持。它定义了一个标签,trans。
代码状态
安装
可以通过在命令行中运行以下命令通过 Composer 安装此库
composer require phpmyadmin/twig-i18n-extension
配置
在开始使用 trans 块之前,您需要注册此扩展
use PhpMyAdmin\Twig\Extensions\I18nExtension; $twig->addExtension(new I18nExtension());
注意:在渲染任何国际化模板之前,您必须配置 gettext 扩展。以下是一个简单的 PHP 文档 中的配置示例
// Set language to French putenv('LC_ALL=fr_FR'); setlocale(LC_ALL, 'fr_FR'); // Specify the location of the translation tables bindtextdomain('myAppPhp', 'includes/locale'); bind_textdomain_codeset('myAppPhp', 'UTF-8'); // Choose domain textdomain('myAppPhp');
注意!
i18n 扩展仅在 PHP gettext 扩展被启用时才能工作。
使用方法
使用 trans 块来标记模板中的可翻译部分
{% trans "Hello World!" %}
{% trans string_var %}
{% trans %}
Hello World!
{% endtrans %}
在可翻译字符串中,您可以嵌入变量
{% trans %}
Hello {{ name }}!
{% endtrans %}
在 gettext 查找过程中,这些占位符将被转换。 {{ name }} 变为 %name%,因此此字符串的 gettext msgid 将是 Hello %name%!。
注意
{% trans "Hello {{ name }}!" %} 不是一个有效的语句。
如果您需要应用过滤器到变量,您首先需要将结果分配给一个变量
{% set name = name|capitalize %}
{% trans %}
Hello {{ name }}!
{% endtrans %}
要使可翻译字符串复数化,请使用 plural 块
{% trans %}
Hey {{ name }}, I have one apple.
{% plural apple_count %}
Hey {{ name }}, I have {{ count }} apples.
{% endtrans %}
plural 标签应提供用于选择正确字符串的 count。在可翻译字符串中,特殊的 count 变量始终包含计数值(此处为 apple_count 的值)。
要为翻译者添加注释,请使用 notes 块
{% trans %}
Hey {{ name }}, I have one apple.
{% plural apple_count %}
Hey {{ name }}, I have {{ count }} apples.
{% notes %}
This is shown in the user menu. This string should be shorter than 30 chars
{% endtrans %}
您可以使用或不需要 plural 来使用 notes。一旦您的模板编译完成,您应该配置 gettext 解析器以获得类似以下内容:xgettext --add-comments=notes
在表达式或标签中,您可以使用 trans 过滤器来翻译简单的字符串或变量
{{ var|default(default_value|trans) }}
表达式或标签中的复杂翻译
可以使用 trans 标签和 trans 过滤器来进行翻译。过滤器的功能较弱,因为它只能用于简单的变量或字符串。对于更复杂的情况,如复数化,您可以使用两步策略
{# assign the translation to a temporary variable #} {% set default_value %} {% trans %} Hey {{ name }}, I have one apple. {% plural apple_count %} Hey {{ name }}, I have {{ count }} apples. {% endtrans %} {% endset %} {# use the temporary variable within an expression #} {{ var|default(default_value|trans) }}
提取模板字符串
如果您使用 Twig I18n 扩展,您可能需要在某个时候提取模板字符串。
使用 Poedit 2
Poedit 2 原生支持从 Twig 文件中提取,无需额外设置(Pro 版本)。
使用 xgettext 或 Poedit 1
不幸的是,xgettext 工具不能原生理解 Twig 模板,基于它的工具(如 Poedit 的免费版本)也不能。但有一个简单的解决方案:因为 Twig 将模板转换为 PHP 文件,所以您可以在模板缓存上使用 xgettext。
创建一个脚本,强制为所有模板生成缓存。以下是一个简单的示例来帮助您入门
use Twig\Environment; use Twig\Loader\FilesystemLoader; use PhpMyAdmin\Twig\Extensions\I18nExtension; $tplDir = __DIR__ . '/templates'; $tmpDir = '/tmp/cache/'; $loader = new FilesystemLoader($tplDir); // force auto-reload to always have the latest version of the template $twig = new Environment($loader, [ 'auto_reload' => true, 'cache' => $tmpDir, ]); $twig->addExtension(new I18nExtension()); // configure Twig the way you want // iterate over all your templates foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($tplDir), RecursiveIteratorIterator::LEAVES_ONLY) as $file) { // force compilation if ($file->isFile()) { $twig->loadTemplate(str_replace($tplDir . '/', '', $file)); } }
使用标准 xgettext 工具,就像您使用纯 PHP 代码一样
xgettext --default-domain=messages -p ./locale --from-code=UTF-8 -n --omit-header -L PHP /tmp/cache/*.php
另一个解决方案是使用 Twig Gettext Extractor 并直接从 Poedit 提取模板字符串。
历史
该项目于2019年由phpMyAdmin团队分叉,因为虽然它已被 Twig 项目 放弃,但仍然在phpMyAdmin中使用。
如果您觉得这项工作很有用,或者有pull request想要贡献,请在我们 Github 上找到我们。