Возникла задача – подружить gettext и кириллицу. Да к тому же еще и кириллицу в cp1251. И, что самое главное, оригинальные строки для перевода в кириллице.
Попробовав Zend_Translate ощутил несоответствие идее:
require_once("Zend/Translate.php");
$translate = new Zend_Translate('gettext', '/my/path/source-de.mo', 'de');
print $translate->_("Example")."\n";
Вот что должно произойти если нет /my/path/source-de.mo? Правильно, должно отобразиться “Example”. На самом же деле отображаются матюки об отсутствии .mo. Что есть неправильно.
Кроме того Zend_Translate не предоставляет никаких возможностей по работе с кодировками.
Хоть я и приверженец ZF, но тут он меня сильно разочаровал.
Так я вернулся к стандартному подходу, несколько доправив его. Итак, вот что получилось:
убедился что есть локаль ru_RU.cp1251 на сервере. В убунте если она отсутствует ее можно создать так:
Отлично. Теперь очередь php:
$language = 'ru_RU.cp1251';
putenv("LANG=$language");
setlocale(LC_ALL, $language);
$domain = 'messages';
bindtextdomain($domain, "./locale");
bind_textdomain_codeset ($domain, 'cp1251');
textdomain($domain);
echo gettext("мегастрока");
?>
По сравнению со стандартным примером тут появилась такая строка:
Это говорит, что все строки будут нам возвращаться в cp1251.
Далее мы выдираем на сервере все строки для перевода:
с указанием кодировки, в которой текст внутри, потому что по умолчанию gettext считает, что там ASCII.
Теперь внутри файла messages.po все лежит в UTF-8, и никаких проблем… если бы не cp1251, черт подери.
Вот так мы конвертаем его в cp1251. Полученый файл редактируем, добавляя перевод, и кроме того заменяем в нем строку:
на
Теперь переименовываем файл messages.po1251 и убираем из его имени 1251, затем делаем
и так получаем скомпилированый перевод. Который теперь работает
Наконец-то.
А вообще русские строки в качестве ключей работают чудесно и без такого шаманства если они в UTF8.