13.3.4. Упрощение использования
gettext()Вызов
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]));}Здесь мы хотели бы иметь возможность вывести переводы строк об авторских правах, если они доступны. Однако, как извлекающее устройство
xgettextgettext()/
* ПЛОХОЙ КОД: не будет компилироваться */static char *copyrights[] = { gettext("Copyright 2004, Jane Programmer"), gettext("Permission is granted ..."), /* ... Здесь куча легальностей */ NULL};13.3.4.1. Переносимые программы: "
gettext.hЗдесь мы предполагаем, что вы хотите написать программу, которая может использоваться вместе с библиотекой GNU
gettextПометка строк включает два шага. Первый заключается в использовании вспомогательного заголовка
gettext.hgettextgettext()#define ENABLELNLS 1 /* ENABLE_NLS должен быть true, чтобы gettext() работала */#include "gettext.h" /* Вместо <libintl.h> */Если макрос
ENABLE_NLSgettext.hgettext()gettext()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.");void copyright(void) { printf("%s\n", gettext(copyrights));}Обратите внимание, что мы сделали два изменения. Во-первых,
copyrightsgettext_noop()Второе изменение заключается в непосредственном выводе перевода в виде одной строки в
copyright()К этому времени вы, возможно, думаете: «Вот здорово, набирать каждый раз '
gettext(...)gettext.hgettext_()N_()#define ENABLE_NLS 1#include "gettext.h"#define _(msgid) gettext(msgid)#define N_(msgid) msgidТакой подход снижает накладные расходы по использованию
gettext()#include <stdio.h>#define ENABLE_NLS 1#include "gettext.h"