qcubed / i18n
用于翻译PHP文件的全面i18n项目。
Requires
- php: >=5.5.0
- psr/simple-cache: ^1.0
Requires (Dev)
- phpunit/phpunit: 4.8.*
This package is not auto-updated.
Last update: 2024-09-15 02:35:38 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文件,因此可以帮助完成这项工作。