Gettext因其易于翻译而很好,但默认的PHP实现不是线程安全的。因此,Yii使用自己的解包器,与php数组相比,大大增加了处理时间。
由于我正在建立一个高容量,高交易量的网站,因此性能下降是不可接受的。此外,通过使用APC,我们可以缓存PHP转换,进一步提高性能。
因此,我的方法是使用PHP数组,但为了便于翻译,将翻译保留在数据库中,在翻译更改时生成所需的文件。
DB与此类似:
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' 命令,将收集的字符串转储到 DB 中。
http://www.yiiframework.com/wiki/41/how-to-extend-yiic-shell-commands/
进入数据库后,可以设置一个简单的CMS,为翻译人员提供一种简单的翻译方法,同时提供版本控制信息,恢复到旧版本,检查翻译人员的质量等...
另一个脚本,也是从 yiic 修改而来的,然后获取 DB 信息并将其编译为 PHP 数组。基本上是每种语言的两个表的JOIN,然后使用'Message'构建一个数组。键'和'消息翻译'。value' as (what else?) key => value ...保存到以“消息”命名的文件。按语言指定的文件夹中的类别。
生成的文件由 Yii CPhpMessageSource 正常加载。
对于图像,这就像将它们放在具有正确语言的文件夹中并在链接时获取应用程序语言一样简单。
<img src="/images/<?php echo Yii::app()->language; ?>/help_button.png">
请注意,在现实生活中,我写了一个小助手方法,从语言字符串中剥离出国家,“en_us”应该是“en”。