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

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

Жанры

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

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

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

Проданная Истинная. Месть по-драконьи

Белова Екатерина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Проданная Истинная. Месть по-драконьи

Я еще не царь

Дрейк Сириус
25. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я еще не царь

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4

Черный Маг Императора 8

Герда Александр
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 8

Инженерный Парадокс

Cyberdawn
1. Инженерный Парадокс
Фантастика:
боевая фантастика
аниме
фэнтези
5.00
рейтинг книги
Инженерный Парадокс

Кодекс Императора V

Сапфир Олег
5. Кодекс Императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Императора V

Культивация зельевара

Крынов Макс
6. Культивация без насилия
Фантастика:
рпг
уся
сказочная фантастика
5.00
рейтинг книги
Культивация зельевара

Я еще князь. Книга XX

Дрейк Сириус
20. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще князь. Книга XX

Гримуар темного лорда II

Грехов Тимофей
2. Гримуар темного лорда
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар темного лорда II

Курсант: Назад в СССР 4

Дамиров Рафаэль
4. Курсант
Фантастика:
попаданцы
альтернативная история
7.76
рейтинг книги
Курсант: Назад в СССР 4

Дворянин

Злотников Роман Валерьевич
2. Император и трубочист
Фантастика:
боевая фантастика
альтернативная история
5.00
рейтинг книги
Дворянин

Зеркало силы

Кас Маркус
3. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Зеркало силы

Московское золото и нежная попа комсомолки. Часть Пятая

Хренов Алексей
5. Летчик Леха
Фантастика:
попаданцы
5.00
рейтинг книги
Московское золото и нежная попа комсомолки. Часть Пятая

Матабар

Клеванский Кирилл Сергеевич
1. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар