printf("%s\n", ngettext("%d word misspelled", "%d words misspelled", nwords), nwords);
Обратите внимание, что nwords
должен быть передан ngettext()
для выбора форматирующей строки, а затем printf()
для форматирования. Вдобавок, будьте осмотрительны и не используйте макрос или выражение, значение которого каждый раз изменяется, как в случае 'n++
'! Такое может случиться, если вы осуществляете глобальное редактирование, добавляя вызовы ngettext()
и не обращая на это внимания.
Вызов gettext()
в исходном коде программы служит двум целям. Во-первых, он осуществляет перевод во время исполнения, что является в конце концов главным. Однако, он служит также для xgettext
читает исходный код программы и извлекает все оригинальные строки, которые нужно перевести. (Далее в главе мы кратко рассмотрим это.)
Рассмотрим все-таки случай, когда статические строки не используются непосредственно:
static char *copyrights[] = {
"Copyright 2004, Jane Programmer",
"Permission is granted ...",
/* ... Здесь куча легальностей */
NULL
};
void copyright(void) {
int i;
for (i = 0; copyrights[i] != NULL, i++)
printf("%s\n", gettext(copyrights[i]));
}
Здесь мы хотели бы иметь возможность вывести переводы строк об авторских правах, если они доступны. Однако, как извлекающее устройство xgettext
предполагает найти эти строки? Мы не можем заключить их в вызовы gettext()
, поскольку это не будет работать во время компиляции:
/* ПЛОХОЙ КОД: не будет компилироваться */
static char *copyrights[] = {
gettext("Copyright 2004, Jane Programmer"),
gettext("Permission is granted ..."),
/* ... Здесь куча легальностей */
NULL
};
Здесь мы предполагаем, что вы хотите написать программу, которая может использоваться вместе с библиотекой GNU gettext
на любой системе Unix, а не только GNU/Linux. Следующий раздел описывает, что сделать для программ только для GNU/Linux.
Пометка строк включает два шага. Первый заключается в использовании вспомогательного заголовка gettext.h
, который поставляется с дистрибутивом GNU gettext
. Этот файл обрабатывает несколько проблем переносимости и компиляции, упрощая использование gettext()
в ваших собственных программах:
#define ENABLELNLS 1 /* ENABLE_NLS должен быть true, чтобы gettext() работала */
#include "gettext.h" /* Вместо
Если макрос ENABLE_NLS
не определен[146] или установлен в ноль, gettext.h
развертывает вызовы gettext()
в первый аргумент. Это делает возможным перенос кода, использующего gettext()
, на системы, в которых не установлены ни GNU gettext
, ни собственная их версия. Помимо прочего, этот заголовочный файл определяет следующий макрос:
/* Вызов псевдофункции, который служит в качестве маркера для
автоматического извлечения сообщений, но не осуществляющий вызов
gettext(). Перевод времени исполнения осуществляется в другом
месте кода. Аргумент String должен быть символической строкой.
Сцепленные строки и другие строковые выражения не будут работать.
Разворачивание макроса не параметризовано, так что он подходит для
инициализации статических переменных 'char[]' или 'const char[]'. */
#define gettext_noop(String) String
Комментарий самодостаточен. С помощью этого макроса мы можем теперь перейти ко второму шагу. Мы перепишем код следующим образом:
#define ENABLE_NLS 1
#include "gettext.h"
static char copyrights[] =
gettext_noop("Copyright 2004, Jane Programmer\n"
"Permission is granted ...\n"
/* ... Здесь куча легальностей */
"So there.");