qcubed-4/i18n

用于翻译PHP文件的全面i18n项目。

安装: 118

依赖者: 3

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 0

开放问题: 0

类型:qcubed-library

dev-master 2022-11-04 01:47 UTC

This package is auto-updated.

Last update: 2024-09-04 05:42:55 UTC


README

尝试为PHP构建一个全面、独立的语言翻译工具。

这最初是Raúl Ferràs(raul.ferras@gmail.com)的优秀作品的分支。
https://github.com/raulferras/PHP-po-parser)的代码已移动到本存储库的单独部分,并也采用MIT许可。此项目基于该工作。

为什么还需要另一个翻译工具?

互联网上有许多PHP翻译工具。问题是它们分散各地,嵌入到现有框架深处,并且只解决部分问题,有时效果并不好。

金标准GNU的gettext相当过时,需要离线预编译(po文件到.mo文件),将这些文件放置在特殊格式的层次结构中(这使得使用Composer实现翻译文件变得相当困难),并且需要将你正在翻译的语言包安装到操作系统。

有php-geettext,它稍微改进了一些,但并不全面,仍然需要.mo文件才能运行。

目标

  • 独立。任何人都可以使用它而无需其他产品。它目前作为顶层单例实现,但可以很容易地修改为使用注入容器(如果需要的话)。
  • Composer兼容。.po语言文件现在可以与composer库一起分发,并可以轻松地包含到更大的应用程序中。允许您将目录映射到域名,并期望Packagist库将域名映射到与它们的包名相同的域名,从而使包能够轻松访问其自身的翻译。
  • 标准兼容。PSR-1、PSR-2和PSR-4兼容,支持模块使用PSR-16 SimpleCache进行缓存(更多内容请见下文)。

实现

每个实现的详细描述可在每个文件的标题中找到。以下为一般描述。

您需要在项目中包含工具目录中的i18n.inc.php文件,以便您可以在源代码中直接使用_t和_tp函数调用翻译。这将使一切变得简单易用。

GettextTranslator

使用PHP内建的GNU gettext翻译模块。不是最佳选择,但如果您有.mo文件,这是一种很好的方法。

SimpleCacheTranslator

可以使用PSR-16兼容的简单缓存作为存储翻译的地方(我们目前正在开发APCu和Redis的实现)。直接从目录中读取(po文件)。没有缓存也可以工作,但如果您提供缓存将更好。

提供临时目录,它将把(po文件转换为json并将其缓存,使后续读取更快。

典型用法

设置

$cache = new MyCache();
$translator = new \QCubed\I18n\SimpleCacheTranslator($cache);

$translator->bindDomain('package/subpackage', __VENDOR_DIR__ . "/package/subpackage/I18n") // directory of .po files
	->bindDomain('project', __PROJECT_DIR__ . "/I18n") // pointer to your specific translations
	->setDefaultDomain('project') // get translations from here if no domain is specified
	->setCache($cache)
	->setTempDir($tempDirPath);

\QCubed\I18n\TranslationService::instance()->setTranslator($translator);
\QCubed\I18n\TranslationService::instance()->setLanguage('es'); //Make a particular language the active language.

包含辅助库

对于应用程序

include ("i18n-app.inc.php");

如果您正在开发将被其他应用程序使用的库

include ("i18n-lib.inc.php");

获取翻译

$str = _t("Hello");	// translate Hello into the currently active translation using the default domain (that is, the .po file from your project for the default language)
$str = _t("Hello", "package/subpackage", "a context"); // get a translation using a domain and context
$str = _tp("A Hello to your", "Many hellos to you", $n);	// Do a plural translation based on the integer $n
$str = _tp("A Hello to your", "Many hellos to you", $n, "package/subpackage", "a context");	// Do a plural translation based on the integer $n with domain and context

路线图

  • 实现一个基于https://github.com/sevenval/SHMT的超快翻译版本。
  • 引入一些代码,通过搜索PHP文件并构建.pot文件。已经有代码做这件事。首先尝试php-gettext。
  • 第一步,实现代码以自动将字符串包裹在_t()中以进行文件本地化。
  • 为具有多个复数形式的语言实现语言特定的复数形式。同样,代码已经存在以帮助实现这一点,只需将其拉入即可。
  • 可以参考或引入其他有用的代码,例如用于更新和合并 .po 文件,可能通过使用 .po 注释来关联字符串的来源实现部分自动化。这里包含的 PoParser 库可以写入 PO 文件,因此也可以帮助实现这一点。