Опубликован: 15.06.2004 | Доступ: свободный | Студентов: 2557 / 712 | Оценка: 4.35 / 3.96 | Длительность: 27:47:00
ISBN: 978-5-9556-0011-6
Лекция 13:

Языково-культурная среда

Средства для работы с каталогами сообщений

Развитые средства для работы с каталогами сообщений ( диагностических, информационных), выдаваемых приложениями, вынесены в расширение XSI стандарта POSIX-2001. Идея этих средств состоит в том, чтобы в интернационализированных программах фигурировали не сами сообщения, а их идентификаторы в каталоге, который для каждой языково-культурной среды может быть своим.

Стандарт не специфицирует формат каталогов сообщений, но предлагает служебную программу gencat для их генерации по исходному описанию:

gencat каталог файл_сообщений ...

Аргумент каталог задает маршрутное имя, под которым будет сохранен результат генерации.

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

$set идентификатор_набора_сообщений комментарий

Задает идентификатор набора для дальнейших сообщений. Идентификатором служит целое число в диапазоне [1, NL_SETMAX]. В пределах одного исходного файла сообщений идентификаторы должны задаваться в порядке возрастания. Подразумеваемым является набор NL_SETD (см. <nl_types.h> ).

идентификатор_сообщения текст_сообщения

Идентификатором сообщения (в пределах набора) служит целое число в диапазоне [1, NL_MSGMAX]. В пределах одного набора идентификаторы сообщений задаются в порядке возрастания. Длина текста сообщения должна лежать в диапазоне [0, NL_TEXTMAX].

Отметим, что генерируемые каталоги сообщений могут иметь двоичный формат и, следовательно, нуждаться в перегенерации при переносе на другие системы. Иными словами, и здесь (как и везде в стандарте POSIX) речь идет о мобильности на уровне исходных текстов.

В прикладной программе работа с каталогами сообщений осуществляется посредством функций catopen(), catgets() и catclose() (см. листинг 13.21).

#include <nl_types.h>
nl_catd catopen (const char *name, int oflag);
char *catgets (nl_catd catd, int set_id,
	int msg_id, const char *s);
int catclose (nl_catd catd);
13.21. Описание функций catopen(), catgets() и catclose().

Функция catopen() открывает каталог сообщений и возвращает его дескриптор. Когда цепочка символов, на которую указывает аргумент name, содержит /, она трактуется как полное маршрутное имя. В противном случае (если пренебречь деталями) используется маршрут, зависящий от имени и реализации, а также от значения переменной окружения LANG (если аргумент oflag равен нулю) или LC_MESSAGES (если oflag равен NL_CAT_LOCALE ).

К сожалению, рекомендации по расположению каталогов сообщений на момент написания данного текста еще не были выработаны. Стандарт POSIX-2001 ограничился замечанием о том, что авторам приложений следует соблюдать осторожность, дабы избежать конфликтов с другими приложениями и стандартными служебными программами.

Дескриптор, выданный функцией catopen(), используется в вызове catgets() для чтения сообщения под номером msg_id из набора с номером set_id. Аргумент s указывает на подразумеваемую цепочку символов, которая будет возвращена catgets() в качестве результата, если запрошенное сообщение не удастся прочитать из каталога.

Функция catclose() закрывает каталог сообщений.

Антон Коновалов
Антон Коновалов

В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13
Планируется ли актуализация материалов данного очень полезного курса?