Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
#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_TIMEtextdomain()messagestextdomain()LC_MESSAGESmain()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.3. Работа с множественными числами:
ngettext()Перевод во множественном числе доставляет дополнительные трудности. Простой код мог бы выглядеть примерно так:
printf("%d word%s misspelledn", nwords, nwords > 1 ? "s" : "");/* или */printf("%d %s misspelledn", nwords, nwords == 1 ? "word" : "words").Это подходит для английского языка, но перевод становится трудным. Во-первых, во многих языках множественное число не образуется с такой же легкостью, как в английском (добавлением суффикса
sif (nwords == l) printf("one word misspelledn");else printf("%d words misspelledn", 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)Помимо первоначального аргумента
msgidconst char *msgid_pluralСтрока по умолчанию для использования в качестве множественного числа. Вскоре будут примеры.
unsigned long int nЧисло имеющихся элементов.
Список сообщений каждой локали указывает, как переводить множественные числа. [145] Функция
ngettext()nmsgidmsgidngettext()msgidn == 1msgid_pluralprintf("%sn", ngettext("%d word misspelled", "%d words misspelled", nwords), nwords);Обратите внимание, что
nwordsngettext()printf()n++ngettext()