Текстовый домен, из которого нужно получить перевод. Таким образом, хотя 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
#include
#include
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
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
Строка по умолчанию для использования в качестве множественного числа. Вскоре будут примеры.
unsigned long int n
Число имеющихся элементов.
Список сообщений каждой локали указывает, как переводить множественные числа.[145]
Функцияngettext() (и ее варианты) проверяет n и на основании спецификации в списке сообщений возвращает соответствующий перевод msgid. Если в списке нет перевода для msgid, или находясь в локали «С», ngettext() возвращает msgid, если 'n == 1'; в противном случае она возвращает msgid_plural. Таким образом, наш пример ошибочных слов выглядит следующим образом:Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT