Замены для gettext

Мы используем gettext для переводов в нашем продукте, но у него было много проблем:

  • Не могу использовать язык, если система не поддерживает его.

В Solaris 9 Sparc, если мы сбросим среду на различные английские локали, сообщение все равно не будет переведено, если на машине нет соответствующей локали. Файл перевода присутствует, но мы не можем получить к нему доступ.

  • Использует среду для разработки языка

Это вызывает проблемы на серверах, которые хотят переводить сообщения на разные языки. Теоретически, это может быть полностью поточно-ориентированная, распараллеливаемая операция, но gettext означает, что мы должны иметь глобальную блокировку перевода.

  • Не могу установить язык по умолчанию

Под этим я не подразумеваю текст в коде. Мы используем MsgID в коде, поэтому я хочу иметь возможность указать запасной перевод, к которому нужно перейти, если текущая среда, определяющая язык, недоступна. Но gettext не позволяет этого - я должен попробовать, а затем перезагрузить среду, прежде чем она будет предписывать смотреть на другой перевод. (Использование MsgID не было моим выбором - я хотел следовать стандартам gettext и использовать английский в качестве идентификаторов, но я был отвергнут, и было бы очень сложно изменить его сейчас)

  • Возвращаемое кодирование варьируется между UTF-8 и текущим локальным кодированием.

Я не имею в виду.po файлы - они все в UTF-8 (раздражает, что msgfmt не обрабатывает спецификацию, а что угодно). Я имею в виду вывод gettext ngettext и т. Д., Которые находятся в UTF-8 (независимо от локальной / терминальной кодировки) в AIX и HPUX, но локальная кодировка в Solaris/Linux/FreeBSD, хотя это может быть связано с проблемами iconv?

В любом случае было бы неплохо не иметь специального кода для разных платформ - мне придется выяснить, смогу ли я получить bind_textdomain_codeset(domain,codepage); чтобы помочь против этой проблемы.


Кто-нибудь знает библиотеки перевода с открытым исходным кодом, которые предоставляют более полезный интерфейс?

5 ответов

Мы используем пакеты ресурсов ICU и очень довольны этим. Интерфейс ICU не "современный", но он мощный, основополагающие принципы надежны, а пакет ресурсов (с помощью инструмента genrb) довольно гибкий. Его возможности форматирования сообщений также хороши.

О ваших конкретных комментариях:

Не могу использовать язык, если система не поддерживает его.

Я не понимаю этого. Это может быть связано с тем, что единственный "опыт", который я имею с gettext, - это чтение его документации.

Использует среду для разработки языка

Интерфейс ICU принимает Locale в качестве ввода, поэтому у вас есть полный контроль. Он также имеет понятие "локаль по умолчанию", если вам это удобнее.

Не могу установить язык по умолчанию

В отделении интенсивной терапии предусмотрен сложный резервный механизм, включающий пакет "по умолчанию"

Возвращаемое кодирование варьируется между UTF-8 и текущим локальным кодированием.

String ResourceBundle s (возможны и другие типы данных) всегда представлены как UnicodeString, которая внутренне кодируется в UTF-16. UTF-32 с UnicodeString довольно прост, поскольку его интерфейс предоставляет несколько методов, позволяющих манипулировать им на уровне кода. Для других кодировок возможно преобразование кода.

1. Не могу использовать язык, если система не поддерживает его.

Неправильно. Вы можете вручную указать язык. Использование переменной окружения LANGUAGE

int main()
{
      setlocale(LC_ALL,"");
      setenv("LANGUAGE","foo");
}

Это работает, даже если локаль не существует (вы когда-нибудь видели язык foo?)

2. Использует среду для разработки языка

В чем проблема с этим? Это дает пользователю больше контроля.

3. Не могу установить язык по умолчанию

Неправильно, см. Выше.

4. Кодировка, которая возвращается, варьируется между UTF-8 и текущей локальной кодировкой.

Неправильно, см bind_textdomain_codeset(domain,codepage);

Моя сильная рекомендация - оставайтесь с gettext. Это один из наиболее поддерживаемых и лучших инструментов. Переводчики будут благодарны за использование нормального и полезного инструмента.

Есть еще один важный момент: отличная поддержка множественных форм, которая довольно плохо поддерживается в инструментах, не основанных на gettext.


Существует только 1 ограничение gettext - вы не можете использовать более одного языка для каждого процесса. Переключение языка не безопасно. К счастью, большинство программ, которые общаются с людьми, говорят на одном языке.

Это может быть ограничением только для многопоточных сервисов.

РЕДАКТИРОВАТЬ: Но даже это не настоящая проблема. Я однажды реализовал многопоточную версию gettext для своего проекта. См. http://art-blog.no-ip.info/cppcms/blog/post/16, на основании mo читатель файлов.

Вы также можете преобразовывать пакеты ресурсов ICU в и из формата XLIFF на основе XML для перевода.

Переключение языка в браузере Google Chrome сделано очень аккуратно. Возможно переключение между языками во время работы программы. Я не знаю, какую систему они используют, но, возможно, стоит изучить ее, так как это браузер с открытым исходным кодом.

Не могу использовать язык, если система не поддерживает его.

Это не имеет никакого отношения к GNU gettext - потому что оно обрабатывает только часть перевода. Но это правда, что если система не может отображать китайские иероглифы, у вас будут проблемы с Китаем.

Использует среду для разработки языка

Это хороший выбор, но вы всегда можете установить язык самостоятельно, переопределяя среду. Таким образом, вы можете использовать любой язык в зависимости от вашего выбора.

Не могу установить язык по умолчанию

Это неверно - язык по умолчанию всегда является встроенным языком, и если вы хотите использовать другой язык, просто переключитесь на него. Это просто не может быть проще, чем одна строка кода.

Возвращаемое кодирование варьируется между UTF-8 и текущим локальным кодированием.

Если вы в состоянии выбрать инструмент интернационализации, то вы также можете выбрать, какую кодировку символов вы хотите использовать для своих текстов. Некоторые проекты используют utf-8 для всех языков (мои предпочтения), некоторые используют кодировку локали.

Кто-нибудь знает библиотеки перевода с открытым исходным кодом, которые предоставляют более полезный интерфейс?

Нет, извините - я не вижу проблем с GNU gettext:-)

Другие вопросы по тегам