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

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

Жанры

Linux программирование в примерах
Шрифт:

unsigned long int n

Число имеющихся элементов.

Список сообщений каждой локали указывает, как переводить множественные числа. [145] Функция

ngettext
(и ее варианты) проверяет
n
и на основании спецификации в списке сообщений возвращает соответствующий перевод
msgid
. Если в списке нет перевода для
msgid
, или находясь в локали «С»,
ngettext
возвращает
msgid
, если '
n == 1
';
в противном случае она возвращает
msgid_plural
. Таким образом, наш пример ошибочных слов выглядит следующим образом:

145

Подробности приведены в документации GNU

gettext
. Здесь мы концентрируемся на потребностях разработчика, а не переводчика — Примеч. автора.

printf("%s\n", ngettext("%d word misspelled", "%d words misspelled", nwords), nwords);

Обратите внимание, что

nwords
должен быть передан
ngettext
для выбора форматирующей строки, а затем
printf
для форматирования. Вдобавок, будьте осмотрительны и не используйте макрос или выражение, значение которого каждый раз изменяется, как в случае '
n++
'! Такое может случиться, если вы осуществляете глобальное редактирование, добавляя вызовы
ngettext
и не обращая на это внимания.

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]));

}

Здесь мы хотели бы иметь возможность вывести переводы строк об авторских правах, если они доступны. Однако, как извлекающее устройство

xgettext
предполагает найти эти строки? Мы не можем заключить их в вызовы
gettext
, поскольку это не будет работать во время компиляции:

/

* ПЛОХОЙ КОД: не будет компилироваться */

static char *copyrights[] = {

 gettext("Copyright 2004, Jane Programmer"),

 gettext("Permission is granted ..."),

 /* ...
Здесь куча легальностей */

 NULL

};

13.3.4.1. Переносимые программы: "

gettext.h
"

Здесь мы предполагаем, что вы хотите написать программу, которая может использоваться вместе с библиотекой GNU

gettext
на любой системе Unix, а не только GNU/Linux. Следующий раздел описывает, что сделать для программ только для GNU/Linux.

Пометка строк включает два шага. Первый заключается в использовании вспомогательного заголовка

gettext.h
, который поставляется с дистрибутивом GNU
gettext
. Этот файл обрабатывает несколько проблем переносимости и компиляции, упрощая использование
gettext
в ваших собственных программах:

#define ENABLELNLS 1 /* ENABLE_NLS должен быть true, чтобы gettext работала */

#include "gettext.h" /* Вместо <libintl.h> */

Если макрос

ENABLE_NLS
не определен [146] или установлен в ноль,
gettext.h
развертывает вызовы
gettext
в первый аргумент. Это делает возможным перенос кода, использующего
gettext
, на системы, в которых не установлены ни GNU
gettext
, ни собственная их версия. Помимо прочего, этот заголовочный файл определяет следующий макрос:

/* Вызов псевдофункции, который служит в качестве маркера для

146

Этот макрос обычно определяется автоматически программой

configure
, либо в специальном заголовке, либо в командной строке компилятора
configure
создается с помощью Autoconf и Automake — Примеч. автора.

автоматического извлечения сообщений, но не осуществляющий вызов

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"

 /* ... Здесь куча легальностей */

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

Дважды одаренный. Том III

Тарс Элиан
3. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
юмористическое фэнтези
5.00
рейтинг книги
Дважды одаренный. Том III

На границе империй. Том 7. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 7. Часть 4

Путь домой

Поселягин Владимир Геннадьевич
3. Четвертое измерение
Фантастика:
попаданцы
альтернативная история
6.44
рейтинг книги
Путь домой

Искатель 1

Шиленко Сергей
1. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 1

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

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

Старшеклассник без клана. Апелляция кибер аутсайдера 3

Афанасьев Семён
3. Старшеклассник без клана. Апелляция аутсайдера
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Старшеклассник без клана. Апелляция кибер аутсайдера 3

Жена неверного ректора Полицейской академии

Удалова Юлия
Любовные романы:
любовно-фантастические романы
4.25
рейтинг книги
Жена неверного ректора Полицейской академии

Найденыш

Шмаков Алексей Семенович
2. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Найденыш

Чужак из ниоткуда

Евтушенко Алексей Анатольевич
1. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужак из ниоткуда

Идеальный мир для Лекаря 7

Сапфир Олег
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 7

Кукловод

Злобин Михаил
2. О чем молчат могилы
Фантастика:
боевая фантастика
8.50
рейтинг книги
Кукловод

Газлайтер. Том 20

Володин Григорий Григорьевич
20. История Телепата
Фантастика:
боевая фантастика
аниме
попаданцы
5.00
рейтинг книги
Газлайтер. Том 20

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

Панежин Евгений
1. Наследие Маозари
Фантастика:
рпг
попаданцы
аниме
5.80
рейтинг книги
Наследие Маозари

Ненаглядная жена его светлости

Зика Натаэль
Любовные романы:
любовно-фантастические романы
6.23
рейтинг книги
Ненаглядная жена его светлости