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「消息」命令轉儲收集串到DB。
http://www.yiiframework.com/wiki/41/how-to-extend-yiic-shell-commands/
一旦在DB,一個簡單的CMS可以設置爲譯者提供一個簡單的方法來翻譯,並在同一時間提供版本信息,回覆到舊版本,檢查翻譯的質量,等等。
另一個腳本,也從yiic修改,然後採取數據庫信息和編譯到PHP數組。基本上是每種語言的兩個表的JOIN,然後使用'Message','key'和'MessageTranslation','value'作爲(還有什麼?)key => value ...來保存到名爲'消息'。'category'在由語言指定的文件夾中。
Yii CPhpMessageSource正常載入生成的文件。
對於圖像,這很簡單,只需將它們放置在具有適當語言的文件夾中,並在鏈接時獲取應用程序語言即可。
<img src="/images/<?php echo Yii::app()->language; ?>/help_button.png">
請注意,在現實生活中,我寫了一個小幫手方法從語言字符串中剝離國家,'en_us'應該是'en'。
問題與GetText IMO是他們很難維護和保持更新也可以遇到原子問題。我首選的方法是數據庫,因此您可以即時更新消息。如果你真的渴望速度GetText更快,否則數據庫是要走的路。 – Atherion 2013-01-04 19:24:22
注意:我建議不要使用沒有緩存的GettextMessageSource。純PHP PHP的gettext性能比php數組慢(yii2本身使用php數組),因爲它重複讀取文件,但是使用php gettext擴展(vs gettext純php代碼)比php數組快一些,但使用php ext需要服務器重啓爲每個變化。 http://mel.melaxis.com/devblog/2006/04/10/benchmarking-php-localization-is-gettext-fast-enough/ – Alix 2016-09-05 08:23:33