marcing/motranslator

使用 Gettext MO 文件进行 PHP 翻译的 API

4.0 2018-02-12 13:22 UTC

This package is not auto-updated.

Last update: 2024-09-25 11:33:54 UTC


README

使用 Gettext MO 文件进行 PHP 翻译的 API。

Build Status codecov.io Scrutinizer Code Quality Packagist

特性

  • 所有字符串都存储在内存中,以便快速查找
  • 快速加载 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 的翻译。使用自定义格式通常会给翻译者增加另一个障碍,我们希望使他们的贡献变得容易。