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, затем берет информацию о БД и компилирует ее в массивы PHP. В основном это соединение двух таблиц для каждого языка, затем создайте массив, используя 'Message'. 'Key' и 'MessageTranslation'. 'Value' как (что еще?) Сообщение '.' Category 'в папке, указанной языком.
Созданные файлы загружаются как обычно Yii CPhpMessageSource.
Для изображений это было так же просто, как поместить их в папки с соответствующим языком и получить язык приложения при связывании.
<img src="/images/<?php echo Yii::app()->language; ?>/help_button.png">
Обратите внимание, что в реальной жизни я написал небольшой вспомогательный метод, чтобы отделить страну от языковой строки: 'en_us' должно быть 'en'.