Мы используем gettext для переводов в нашем продукте, но у него было много проблем:
- Невозможно использовать язык, если система не поддерживает его.
В Solaris 9 Sparc, если мы сбросим среду на различные английские локали, сообщение все равно не будет переведено, если на машине нет соответствующей локали. Файл перевода присутствует, но мы не можем получить к нему доступ.
- Использует среду для разработки языка
Это вызывает проблемы на серверах, которые хотят переводить сообщения на разные языки. Теоретически, это может быть полностью поточно-ориентированная, распараллеливаемая операция, но gettext означает, что мы должны иметь глобальную блокировку вокруг перевода.
- Невозможно установить язык по умолчанию
Под этим я не подразумеваю текст в коде. Мы используем MsgID в коде, поэтому я хочу иметь возможность указать запасной перевод, к которому нужно перейти, если текущая среда, определяющая язык, недоступна. Но gettext не позволяет этого - я должен попробовать, а затем перезагрузить среду, прежде чем она будет предписывать смотреть на другой перевод.
(Использование MsgID не было моим выбором - я хотел следовать стандартам gettext и использовать английский в качестве идентификаторов, но я был отвергнут, и было бы очень сложно изменить его сейчас)
- Кодировка, которая возвращается, варьируется между UTF-8 и текущей локальной кодировкой.
Я не имею в виду .po-файлы - они все в UTF-8 (раздражает, что msgfmt не обрабатывает BOM, но что угодно). Я имею в виду вывод gettext ngettext и т. Д., Которые находятся в UTF-8 (независимо от локальной / терминальной кодировки) в AIX и HPUX, но локальные в Solaris / Linux / FreeBSD, хотя это может быть связано с проблемами iconv?
В любом случае было бы неплохо не иметь специального кода для разных платформ - мне придется выяснить, смогу ли я получить bind_textdomain_codeset(domain,codepage);
, чтобы помочь в решении этой проблемы.
Кто-нибудь знает библиотеки перевода с открытым исходным кодом, которые предоставляют более полезный интерфейс?