qcubed/i18n

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

v4.0.1-alpha 2017-07-06 20:59 UTC

README

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

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

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

互联网上有很多针对PHP的翻译工具。问题是它们分布广泛,深深嵌入到现有的框架中,并且只解决部分问题,有时甚至解决得不好。

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

有php-gettext,它可以稍微改进一些事情,但并不全面,仍然需要.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的实现。)直接从目录中读取.pot文件。无需缓存即可工作,但如果您提供缓存则更好。

提供临时目录,它将.pot文件转换为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文件,因此可以帮助完成这项工作。