Книга: Linux программирование в примерах
13.3.2. Перевод сообщений: gettext()
13.3.2. Перевод сообщений: gettext()
Следующим после установки текстового домена шагом является использование функции gettext()
(или ее разновидности) для каждой строки, которая должна быть переведена. Несколько функций предоставляют службы перевода:
#include <libintl.h> /* GLIBC */
char *gettext(const char *msgid);
char *dgettext(const char *domainname, const char *msgid);
char *dcgettext(const char *domainname, const char *msgid, int category);
Аргументы, используемые в этих функциях, следующие:
const char *msgid
Переводимая строка. Она действует в качестве ключа к базе данных переводов.
const char *domainname
Текстовый домен, из которого нужно получить перевод. Таким образом, хотя main()
вызвала textdomain()
для установки собственного домена приложения, сообщения могут быть получены из других текстовых доменов. (Это наиболее применимо к сообщениям, которые могли бы быть, например, в текстовом домене библиотеки от третьей стороны.)
int category
Одна из описанных ранее категорий доменов (LC_TIME
и т.п.). Доменом по умолчанию является то, что было раньше установлено с помощью textdomain()
(«messages
», если textdomain()
никогда не вызывалась). Категорией по умолчанию является LC_MESSAGES
. Предположим, main()
делает следующий вызов:
textdomain("killerapp");
Тогда 'gettext("my message")
' эквивалентно 'dgettext("killerapp", "my message")
'. Обе функции, в свою очередь, эквивалентны 'dcgettext("killerapp", "my message", LC_MESSAGES)
'.
В 99,9% времени бывает нужно использовать gettext()
. Однако, другие функции обеспечивают гибкость при работе с другими текстовыми доменами или категориями локалей. Скорее всего, эта гибкость потребуется при программировании библиотек, поскольку автономная библиотека почти наверняка будет использовать свой собственный текстовый домен.
Все функции возвращают строки. Строка является либо переводом данного msgid
, либо, если перевода не существует, первоначальной строкой. Таким образом, всегда имеется какой-нибудь вывод, даже если это первоначальное сообщение (предположительно на английском). Например:
/* Каноническая первая программа, локализованная версия. */
#include <stdio.h>
#include <locale.h>
#include <libintl.h>
int main(void) {
setlocale(LC_ALL, "");
printf("%sn", gettext("hello, world"));
return 0;
}
Хотя сообщение является простой строкой, мы не используем ее непосредственно в форматирующей строке printf()
, поскольку в общем перевод может содержать символы %
.
Вскоре, в разделе 13.3.4 «Упрощение использования gettext()
», мы увидим, как облегчить использование gettext()
в крупномасштабных, реальных программах.
- 13.3.1. Установка текстового домена: textdomain()
- 13.3.2. Перевод сообщений: gettext()
- 13.3.3. Работа с множественными числами: ngettext()
- 13.3.4. Упрощение использования gettext()
- 13.3.5. Перестановка порядка слов с помощью printf()
- 13.3.6. Тестирование переводов в персональном каталоге
- 13.3.7. Подготовка интернационализированных программ
- 13.3.8. Создание переводов
- 13.3. Динамический перевод сообщений программ
- 13.3.3. Работа с множественными числами: ngettext()
- 13.3.4. Упрощение использования gettext()
- 13.3.6. Тестирование переводов в персональном каталоге
- 13.3.8. Создание переводов
- 6.8. Мультиплексирование сообщений
- Перевод базы данных InterBase 6.x на 3-й диалект
- Алгоритм составления эффективных рекламных сообщений
- Можно ли при помощи горячих клавиш переводить компьютер в спящий режим?
- 8.2.1. Безопасность сообщений
- Фильтрация сообщений
- Прием и просмотр сообщений