marcing / motranslator
使用 Gettext MO 文件进行 PHP 翻译的 API
4.0
2018-02-12 13:22 UTC
Requires
- php: >=5.3.0
- symfony/expression-language: ^4.0 || ^3.2 || ^2.8
Requires (Dev)
- apigen/apigen: ^4.1
- phpunit/php-code-coverage: *
- phpunit/phpunit: ~4.8 || ~5.7 || ~6.5
README
使用 Gettext MO 文件进行 PHP 翻译的 API。
特性
- 所有字符串都存储在内存中,以便快速查找
- 快速加载 MO 文件
- 用于读取 MO 文件的低级 API
- Gettext API 的仿真
- 不使用
eval()
进行复数方程
限制
- 不适用于您不想存储在内存中的大型 MO 文件
- 输入和输出编码必须匹配(最好是 UTF-8)
安装
请使用 Composer 进行安装
composer require phpmyadmin/motranslator
文档
API 文档可在 https://develdocs.phpmyadmin.net/motranslator/ 找到。
对象 API 使用方法
// Create loader object $loader = new PhpMyAdmin\MoTranslator\Loader(); // Set locale $loader->setlocale('cs'); // Set default text domain $loader->textdomain('domain'); // Set path where to look for a domain $loader->bindtextdomain('domain', __DIR__ . '/data/locale/'); // Get translator $translator = $loader->getTranslator(); // Now you can use Translator API (see below)
低级 API 使用方法
// Directly load the mo file $translator = new PhpMyAdmin\MoTranslator\Translator('./path/to/file.mo'); // Now you can use Translator API (see below)
翻译器 API 使用方法
// Translate string echo $translator->gettext('String'); // Translate plural string echo $translator->ngettext('String', 'Plural string', $count); // Translate string with context echo $translator->pgettext('Context', 'String'); // Translate plural string with context echo $translator->npgettext('Context', 'String', 'Plural string', $count);
Gettext 兼容性使用方法
// Load compatibility layer PhpMyAdmin\MoTranslator\Loader::loadFunctions(); // Configure _setlocale(LC_MESSAGES, 'cs'); _textdomain('phpmyadmin'); _bindtextdomain('phpmyadmin', __DIR__ . '/data/locale/'); _bind_textdomain_codeset('phpmyadmin', 'UTF-8'); // Use functions echo _gettext('Type'); echo __('Type'); // It also support other Gettext functions _dnpgettext($domain, $msgctxt, $msgid, $msgidPlural, $number); _dngettext($domain, $msgid, $msgidPlural, $number); _npgettext($msgctxt, $msgid, $msgidPlural, $number); _ngettext($msgid, $msgidPlural, $number); _dpgettext($domain, $msgctxt, $msgid); _dgettext($domain, $msgid); _pgettext($msgctxt, $msgid);
历史
这个库基于 php-gettext。它添加了一些性能改进以及使用 Composer 安装的能力。
动机
创建这个库的动机包括
- php-gettext 库不再维护
- 它不与最新的 PHP 版本兼容(phpMyAdmin 已修补版本)
- 它依赖于
eval()
函数进行复数方程,这可能会带来严重的安全问题,请参阅 CVE-2016-6175 - 无法使用 Composer 安装
- 在库中有改进性能的空间
为什么不用 PHP 的本地 gettext?
我们尝试过,但这不是一个可行的解决方案
- 您无法使用系统未知的区域设置,这是您无法从网络应用程序中控制的事情。这对于最小化虚拟化容器来说更加棘手。
- 更改 MO 文件通常会导致 PHP 分段错误。它(或者更确切地说,Gettext 库)缓存了 MO 文件的标题,如果它的内容发生变化(例如,新版本上传到服务器),它试图使用旧引用访问新数据。这是一个长期存在的错误: https://bugs.php.net/bug.php?id=45943
为什么使用 Gettext 而不是 JSON、YAML 或其他格式?
我们希望翻译者能够使用他们喜欢的工具,并且我们希望我们能够使用 Gettext 提供的广泛工具,例如 使用 Weblate 的基于 Web 的翻译。使用自定义格式通常会给翻译者增加另一个障碍,我们希望使他们的贡献变得容易。