Gettext 的优点是易于翻译,但默认的 PHP 实现不是线程安全的。因此 Yii 使用自己的解包器,与 php 数组相比,处理时间显着增加。
由于我正在建立一个大容量、高交易量的站点,因此性能损失是不可接受的。此外,通过使用 APC,我们可以缓存 PHP 翻译,进一步提高性能。
因此,我的方法是使用 PHP 数组,但将翻译保存在数据库中以便于翻译,在更改翻译时生成所需的文件。
数据库与此类似:
TABLE Message // stores source language, updated by script
id INT UNSIGNED
category VARCHAR(20) // first argument to Yii::t()
key TEXT // second argument to Yii::t()
occurences TINYINT UNSIGNED // number of times found in sources
TABLE MessageTranslation // stores target language, translated by human
id INT UNSIGNED
language VARCHAR(3) // ISO 639-1 or 639-3, as used by Yii
messageId INT UNSIGNED // foreign key on Message table
value TEXT
version VARCHAR(15)
creationTime TIMESTAMP DEFAULT NOW()
lastModifiedTime TIMESTAMP DEFAULT NULL
lastModifiedUserId INT UNSIGNED
然后我修改了 CLI 工具 yiic 'message' 命令,将收集到的字符串转储到数据库中。
http://www.yiiframework.com/wiki/41/how-to-extend-yiic-shell-commands/
进入数据库后,可以设置一个简单的 CMS,为翻译人员提供一种简单的翻译方式,同时提供版本信息、恢复到旧版本、检查翻译人员的质量等......
另一个脚本,也是从 yiic 修改的,然后获取 DB 信息并将其编译为 PHP 数组。基本上是每种语言的两个表的 JOIN,然后使用 'Message'.'key' 和 'MessageTranslation'.'value' 作为(还有什么?) key => value ... 保存到名为 from 的文件由语言指定的文件夹中的消息'.'类别'。
Yii CPhpMessageSource 正常加载生成的文件。
对于图像,这就像将它们放在具有适当语言的文件夹中并在链接时获取应用程序语言一样简单。
<img src="/images/<?php echo Yii::app()->language; ?>/help_button.png">
请注意,在现实生活中,我写了一个小辅助方法来从语言字符串中剥离国家,'en_us' 应该是 'en'。