Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

#include <libintl.h> /* GLIBC */

char* textdomain(const char *domainname)

Каждый компонент должен вызывать эту функцию со строкой, указывающей на текстовый домен, в составе первоначальной инициализации в

main
. Возвращаемое значение является текущим текстовым доменом. Если аргумент
domainname
равен
NULL
, возвращается текущий домен; в противном случае, он устанавливается в указанное значение, а последнее возвращается. Возвращаемое значение
NULL
указывает на какую-нибудь разновидность ошибки.

Если текстовый домен не установлен с помощью

textdomain
, по умолчанию используется «
messages
».

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("%s\n", gettext("hello, world"));

 return 0;

}

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

printf
, поскольку в общем перевод может содержать символы
%
.

Вскоре, в разделе 13.3.4 «Упрощение использования

gettext
», мы увидим, как облегчить использование
gettext
в крупномасштабных, реальных программах.

13.3.3. Работа с множественными числами:

ngettext

Перевод во множественном числе доставляет дополнительные трудности. Простой код мог бы выглядеть примерно так:

printf("%d word%s misspelled\n", nwords, nwords > 1 ? "s" : "");

/* или */

printf("%d %s misspelled\n", nwords, nwords == 1 ? "word" : "words").

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

s
для большинства слов). Во-вторых, во многих языках, особенно в Восточной Европе, имеются несколько форм множественного числа, каждая из которых указывает на то, сколько объектов обозначает форма. Соответственно даже код наподобие следующего не будет достаточным:

if (nwords == l)

 printf("one word misspelled\n");

else

 printf("%d words misspelled\n", nwords);

Решением является параллельный набор процедур специально для форматирования множественных значений:

#include <libintl.h> /* GLIBC */

char *ngettext(const char *msgid, const char *msgid_plural,

 unsigned long int n);

char *dngettext(const char *domainname, const char *msgid,

 const char *msgid_plural, unsigned long int n);

char *dcngettext(const char *domainname, const char *nmgid,

 const char *msgid_plural, unsigned long int n,

 int category)

Помимо первоначального аргумента

msgid
, эти функции принимают дополнительные аргументы:

const char *msgid_plural

Строка по умолчанию для использования в качестве множественного числа. Вскоре будут примеры.

Поделиться:
Популярные книги

Газлайтер. Том 20

Володин Григорий Григорьевич
20. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Газлайтер. Том 20

Барон нарушает правила

Ренгач Евгений
3. Закон сильного
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Барон нарушает правила

Рассвет русского царства

Грехов Тимофей
1. Новая Русь
Документальная литература:
историческая литература
5.00
рейтинг книги
Рассвет русского царства

Надуй щеки!

Вишневский Сергей Викторович
1. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки!

Дважды одаренный. Том IV

Тарс Элиан
4. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
7.00
рейтинг книги
Дважды одаренный. Том IV

Боярич Морозов

Шелег Дмитрий Витальевич
3. Наследник старого рода
Фантастика:
героическая фантастика
боевая фантастика
альтернативная история
7.12
рейтинг книги
Боярич Морозов

Старая школа рул

Ромов Дмитрий
1. Второгодка
Фантастика:
альтернативная история
6.00
рейтинг книги
Старая школа рул

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Снайпер

Поселягин Владимир Геннадьевич
3. Жнец
Фантастика:
боевая фантастика
попаданцы
5.60
рейтинг книги
Снайпер

Битва за Изнанку

Билик Дмитрий Александрович
7. Бедовый
Фантастика:
городское фэнтези
мистика
5.00
рейтинг книги
Битва за Изнанку

Вперед в прошлое 8

Ратманов Денис
8. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 8

Хозяин Стужи 4

Петров Максим Николаевич
4. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 4

Вперед в прошлое 4

Ратманов Денис
4. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое 4

Хозяин оков III

Матисов Павел
3. Хозяин Оков
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин оков III