Вход/Регистрация
Linux программирование в примерах
вернуться

Роббинс Арнольд

Шрифт:

}

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
, указатели ширины полей и точности. Вот правила для использования указателей положения:

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

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

• Если в форматирующей строке используется N– й аргумент, в этой строке должны использоваться также все аргументы до N. Соответственно, следующее неверно

printf("%3$s %1$s\n", "hello", "cruel", "world")
;

• Ссылка на определенный аргумент может быть сделана указателем положения несколько раз. Не позиционные спецификаторы формата всегда движутся через список аргументов последовательно.

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

"The %s %s looks at you enquiringly.\n"
, на французский мог бы быть:

"Le %2$s %1$s te regarde d'un aire interrogateur.\n"

(Даже этот перевод не совершенен: артикль «Le» имеет род. Подготовка программы к переводу трудная задача!)

13.3.6. Тестирование переводов в персональном каталоге

Коллекция сообщений в программе называется списком сообщений (message catalog). Этот термин применяется также к каждому из переводов сообщений на другой язык. Когда программа установлена, каждый перевод также устанавливается в стандартное место, где

gettext
может во время исполнения найти нужный перевод.

  • Читать дальше
  • 1
  • ...
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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