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

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

Жанры

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

 "So there.");

void copyright(void) {

 printf("%s\n", gettext(copyrights));

}

Обратите внимание, что мы сделали два изменения. Во-первых,

copyrights
теперь является одной длинной строкой, созданной с использованием возможности конкатенации строк стандартного C. Эта простая строка затем включена в вызов
gettext_noop
. Нам нужна одна строка, чтобы легальности могли быть переведены в виде одного элемента

Второе изменение заключается в непосредственном выводе перевода в виде одной строки в

copyright
.

К этому времени вы, возможно, думаете: «Вот здорово, набирать каждый раз '

gettext(...)
' довольно неприятно». Ну, вы правы. Это не только создает лишнюю работу по набиванию, но также и затрудняет чтение исходного кода. Соответственно, когда вы используете заголовочный файл
gettext.h
, руководство GNU
gettext
рекомендует включить два других макроса с именами
_
и
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"

#define _(msgid) gettext(msgid)

#define N_(msgid) msgid

...

static char copyrights[] =

 N_("Copyright 2004, Jane Programmer\n"

 "Permission is granted ...\n"

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

 "So there.");

void copyright(void) {

 printf("%s\n", gettext(copyrights));

}

int main(void) {

 setlocale(LC_ALL, ""); /* gettext.h gets <locale.h> for us too */

 printf("%s\n", _("hello, world"));

 copyright;

 exit(0);

}

Эти макросы скромны, и на практике все GNU программы, использующие GNU

gettext
, следуют этому соглашению. Если вы собираетесь использовать GNU
gettext
, вам тоже нужно следовать этому соглашению.

13.3.4.2. Только GLIBC:

<libintl.h>

Для программ, которые будут использоваться лишь на системах с GLIBC, использование заголовочных файлов и макросов похоже, но проще:

#include <stdio.h>

#include <libintl.h>

#define _(msgid) gettext(msgid)

#define N_(msgid) msgid

/* ... все остальное то же ... */

Как мы видели ранее, заголовочный файл

<libintl.h>
объявляет
gettext
и другие функции. Вам все равно нужно определять
_
и
N_
, но не нужно беспокоиться о
ENABLE_NLS
или включении с исходным кодом вашей программы файла
gettext.h
.

13.3.5. Перестановка порядка слов с помощью

printf

Иногда при переводах порядок слов, естественный для английского языка, не подходит в других языках. Например, на английском прилагательные идут перед определяемыми существительными, а на многих других языках — после. Таким образом, следующий код представляет проблему:

char *animal_color, *animal;

if (...) {

 animal_color = _("brown");

 animal = _("cat");

} else if (...) {

 ...

} else {

 ...

}

printf(_("the %s %s looks at you enquiringly.\n"), animal_color, color);

Здесь форматирующая строка,

animal_color
и
animal
неудачно включены в вызов
gettext
. Однако, после перевода утверждение будет неверным, поскольку порядок аргументов не может быть изменен во время исполнения.

Чтобы обойти это, версия семейства

printf
POSIX (но не ISO С) допускает использовать в описателе формата указатель положения. Он принимает форму десятичного числа, за которым следует символ
$
, сразу после начального символа
%
. Например
printf("%2$s, %1s\n", "world", "hello")
;

Указатель положения обозначает аргумент из списка, который следует использовать, отсчет начинается с 1 и не включает саму форматирующую строку. Этот пример выводит знаменитое сообщение '

hello, world
' в правильном порядке.

GLIBC и Solaris реализуют эту возможность. Поскольку это часть POSIX, если

printf
вашего поставщика Unix не реализует ее, она вскоре должна появиться.

За указателем положения могут следовать любые обычные флаги

printf
, указатели ширины полей и точности. Вот правила для использования указателей положения:

• Форма с указателем положения не может смешиваться с формой без нее. Другими словами, или каждый указатель формата включает указатель положения, или ни один его не включает. Конечно,

%%
может использоваться всегда.

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

Большая Гонка

Кораблев Родион
16. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Большая Гонка

Магнат

Шимохин Дмитрий
4. Подкидыш
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Магнат

Воронцов. Перезагрузка. Книга 2

Тарасов Ник
2. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Воронцов. Перезагрузка. Книга 2

Кай из рода красных драконов 2

Бэд Кристиан
2. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов 2

На границе империй. Том 7

INDIGO
7. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
6.75
рейтинг книги
На границе империй. Том 7

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

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

Студент из прошлого тысячелетия

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

Страж Кодекса

Романов Илья Николаевич
1. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса

Наследник

Майерс Александр
3. Династия
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наследник

Наследник Теней

Лазарь
3. Хозяин Теней
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наследник Теней

Афганский рубеж 2

Дорин Михаил
2. Рубеж
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Афганский рубеж 2

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

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

Моров. Том 1 и Том 2

Кощеев Владимир
1. Моров
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Моров. Том 1 и Том 2

Эволюционер из трущоб. Том 3

Панарин Антон
3. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
6.00
рейтинг книги
Эволюционер из трущоб. Том 3