[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Средства работы с сообщениями - Информация для программистов

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

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

Описание Средств работы с сообщениями приведено в следующих разделах:

Создание исходного файла сообщений

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

Для того чтобы создать исходный файл сообщений, откройте файл в любом текстовом редакторе. Введите идентификационный номер или символьный идентификатор сообщения. Затем введите текст сообщения, как показано в следующем примере:

1 message-text   $       (этому сообщению присвоен номер)
2 message-text   $       (этому сообщению присвоен номер)
OUTMSG message-text  $   (у этого сообщения есть символьный \
                          идентификатор OUTMSG)
4 message-text   $       (этому сообщению присвоен номер)

Правила использования

При создании исходных файлов сообщений следуйте приведенным ниже правилам:

Добавление комментариев в исходные файлы сообщений

В любое место исходного файла сообщений, за исключением текста сообщения, можно добавить комментарий. После знака доллара ($), обозначающего комментарий, должен присутствовать хотя бы один пробел или символ табуляции. Ниже приведен пример комментария:

$ Это комментарий.

При создании каталогов сообщений из исходных файлов комментарии опускаются.

Комментарии могут помочь программистам в работе с сообщениями, переводчикам - в переводе, а создателям сообщений - в редактировании и регистрации сообщений. Комментарии позволяют помещать в исходные файлы описания переменных, таких как %s, %c и %d. Например, вы можете указать, что переменная обозначает имя пользователя, файла, каталога или значение флага. Комментарии также применяются для обозначения устаревших сообщений.

Для удобства работы комментарии рекомендуется располагать непосредственно после сообщений, к которым они относятся, а не в конце каталога сообщений. Комментарии, относящиеся ко всему набору, следует располагать сразу после директивы $set.

Разбиение сообщений на строки

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

5 Этот текст относится к сообщению \
номер 5.

Эти две строки определяют одно сообщение:

Этот текст относится к сообщению номер 5.

Примечание: Применение нескольких пробелов после номера или идентификатора сообщения поддерживается только в Средствах работы с сообщениями. Наличие нескольких пробелов может отрицательно повлиять на переносимость исходных файлов сообщений.

Использование специальных символов в сообщениях

Символ обратной косой черты (\) позволяет вставлять в сообщения специальные символы. Можно использовать следующие символы:

\n Новая строка.
\t Горизонтальная табуляция.
\v Вертикальная табуляция.
\b Забой.
\r Возврат каретки.
\f Перевод страницы.
\\ Обратная косая черта (\).
\ddd Однобайтовый символ с восьмеричным кодом ddd.

Примечание: можно указать одну, две или три восьмеричные цифры. Однако, если после такого специального символа следуют цифры, то код необходимо дополнить до трех цифр незначащими нулями. Например, восьмеричный код знака доллара ($) - 44. Для того чтобы вывести текст "$5,00", нужно указать \0445,00, а не \445,00, так как во втором случае 5 будет интерпретироваться как часть восьмеричного числа.
\xdd Однобайтовый символ с шестнадцатеричным кодом dd. Для правильного вывода текста необходимо применять незначащие нули (см. примечание для \ddd).
\xdddd Двухбайтовый символ с шестнадцатеричным кодом dddd. Для правильного вывода текста необходимо применять незначащие нули (см. примечание для \ddd).

Определение ограничителя текста сообщений

Директива $quote исходного файла сообщений позволяет определить символ, который будет использоваться в качестве ограничителя текста сообщений. Этот символ должен принадлежать набору ASCII. Формат директивы:

$quote [символ] [комментарий]

Определенный таким образом символ указывается до и после текста сообщения. В приведенном ниже примере директива $quote определяет в качестве ограничителя знак подчеркивания (_), а затем отключает его перед последним сообщением:

$quote _   В качестве ограничителя используется знак подчеркивания
$set MSFAC         Средства работы с сообщениями - символьные идентификаторы
SYM_FORM   _Символьные идентификаторы могут включать алфавитно-цифровые \
символы и знаки подчеркивания (\_) \n_
SYM_LEN    _Длина символьных идентификаторов может составлять\
до 65 символов  \n_
5              _Символьные и числовые идентификаторы могут применяться совместно \n_
$quote
MSG_H     Не забудьте включить файл _msg_h_ в программу \n

Последняя директива $quote в предыдущем примере отключает действие знака подчеркивания.

В приведенном ниже примере директива $quote определяет в качестве ограничителя двойные кавычки ("). Ограничитель должен быть первым символом после идентификатора сообщения и пробелов. Любой текст после следующего вхождения ограничителя игнорируется.

$quote "   В качестве ограничителя используются двойные кавычки
$set 10            Средства работы с сообщениями - сообщения о директиве quote
1   "Директива $quote позволяет задать символ, \
\n ограничивающий текст сообщений"
2   "Для того чтобы использовать символ \"quote\" в сообщении, \n \
поставьте перед ним символ \\ "
3   Для того чтобы использовать символ "quote" в сообщении, \n \
можно указать сообщения без применения ограничителя, т.е. введя \
\n другой символ после ИД сообщения и пробелов
$quote
4   Для отключения этого механизма необходимо \n \
ввести директиву $quote без \n\
аргументов

В этом примере показано два способа добавления символа-ограничителя в текст сообщения:

Пример также иллюстрирует следующее:

Присвоение номеров наборам и идентификаторам сообщений

Каждому набору сообщений необходимо присвоить номер или символьный идентификатор. Директива $set позволяет задать идентификатор набора сообщений:

$set n [комментарий ]

Значение n определяет номер набора и может изменяться от 1 до NL_SETMAX. Вместо номера можно указать символьный идентификатор. В набор включаются все сообщения между текущей и следующей директивами $set. По умолчанию номер набора равен 1. Номера наборов должны следовать в возрастающем порядке, но не обязательно подряд. Пропущенным номерам будут соответствовать пустые наборы. Однако большие пропуски в нумерации наборов приводят к снижению эффективности и скорости работы, как и применение нескольких номеров наборов в каталоге сообщений.

В директиве $set можно также указать комментарий:

$set 10  Сообщения об ошибках связи

$set OUTMSGS  Сообщения об ошибках вывода

В AIX многие наборы сообщений носят название MS_PROG, где MS обозначает Message Set (набор сообщений), а PROG соответствует имени программы или утилиты. Например:

$set MS_WC  Набор сообщений утилиты wc

$set MS_XLC1  Набор сообщений 1 компилятора C для AIX

$set MS_XLC2  Набор сообщений 2 компилятора C для AIX

Удаление сообщений из каталога

Директива $delset позволяет удалить из существующего каталога все сообщения, входящие в указанный набор:

$delset n [комментарий ]

Номер набора определяется значением n должна быть размещена в соответствии с порядком наборов, определенных директивами $set в исходном файле. В директиве $delset можно указать комментарий.

Длина текста сообщения

Директива $len позволяет задать максимальную длину выводимого на экран текста сообщений:

$len [ n [ комментарий ] ]

Если значение n не указано, или директива $len отсутствует, длина текста сообщений ограничивается значением NL_TEXTMAX . Длина выводимого текста определяет максимально допустимое число байт в сообщении. Последующие директивы $len переопределяют предыдущие установки. Значение n не может быть больше NL_TEXTMAX.

Содержимое текста сообщений

Информация о причине и способах исправления

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

Исходное сообщение: Недопустимый аргумент.

Исправленное сообщение: Задайте год в диапазоне от 1 до 9999.

Сообщения, аналогичные приведенному выше: Недопустимый аргумент, вряд ли могут помочь пользователю, в то время как сообщение Укажите в командной строке не более 2 файлов говорит пользователю, что именно он должен исправить. Так, сообщение Слишком длинная строка не несет информации о способе исправления. Гораздо лучше сообщение Длина строки не должна превышать 20 символов.

Примеры исходных файлов сообщений

  1. В приведенном ниже примере исходного файла сообщений в качестве идентификаторов сообщений и наборов сообщений используются числа:

    $ Пример исходного файла сообщений.
    $ Определить символ-ограничитель.
    $quote "
    $set 1 Набор сообщений 1.
    1 "Отсутствуют права на чтение указанного файла\n"
    2 "Файлы %1$s и %2$s совпадают\n"
    3 "Здравствуйте!\n"
    $ Определить символ-ограничитель
    $quote '
    $set 2 Набор сообщений 2.
    1       'fieldef: Невозможно открыть %1$s \n'
    2       'Здравствуйте!\n'
    
  2. В приведенном ниже примере исходного файла сообщений в качестве идентификаторов сообщений и наборов сообщений используются символьные идентификаторы:

    $ Пример исходного файла сообщений.
    $ Определить символ-ограничитель.
    $quote "
    $set MS_SET1 Набор сообщений 1.
    MSG_1   "У указанного файла нет прав на чтение\n"
    MSG_2   "Файлы %1$s и %2$s совпадают\n"
    MSG_3   "Добрый день\n"
    $Define the quote character
    $quote
    $set 2 Набор сообщений 2.
    $EMSG_1 'fieldef: Невозможно открыть %1$s\n'
    $EMSG_2 'Добрый день!\n'
    
  3. Ниже показано, каким образом символьные идентификаторы упрощают использование сообщений в программе:

    catgets(cd, 1, 1, "сообщение по умолчанию")
    

    catgets(cd, MS_SET1, MSG_1, "сообщение по умолчанию")
    

Создание каталога сообщений

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

Для создания каталога сообщений необходимо обработать исходный файл сообщений с помощью утилиты gencat

средств работы с сообщениями. Эта команда может применяться тремя способами:

Предыдущий пример эквивалентен следующим командам:

mkcatdefs x x.msg | gencat x.cat

Если каталог сообщений, указанный в параметре ФайлКаталога существует, то команда gencat

изменит существующий каталог в соответствии с исходным файлом сообщений. Если такой каталог отсутствует, команда gencat создаст файл каталога с именем, указанным в параметре ФайлКаталога.

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

будет считывать исходные данные из стандартного ввода.

Размеры каталогов

Размер каталога сообщений может быть произвольным. Максимальное число наборов в каталоге, сообщений в каталоге и байт в сообщении определяется следующими макроопределениями, описанными в файле /usr/include/limits.h:

NL_SETMAX Максимальное число наборов сообщений, определяемых директивой $set . При превышении значения NL_SETMAX команда gencat

выдает сообщение об ошибке и не создает (обновляет) каталог.

NL_MSGMAX Максимально допустимое число идентификаторов сообщений в системе. При превышении значения NL_MSGMAX команда gencat

выдает сообщение об ошибке и не создает (обновляет) каталог.

NL_TEXTMAX Максимальное число байт в тексте сообщения. При превышении значения NL_TEXTMAX команда gencat

выдает сообщение об ошибке и не создает (обновляет) каталог.

Примеры

  1. Этот пример иллюстрирует создание каталога сообщений на основе исходного файла, содержащего идентификационные номера сообщений. Ниже приведен текст исходного файла сообщений hello.msg:

    $ file: hello.msg
    $set 1    prompts
    1 Укажите ваше имя.
    2 Здравствуйте, %s \n
    $ Конец файла hello.msg
    

    Для создания каталога сообщений hello.cat на основе файла hello.msg введите:

    gencat hello.cat hello.msg
    
  2. Этот пример иллюстрирует создание каталога сообщений на основе исходного файла, содержащего символьные идентификаторы сообщений. Ниже приведен текст исходного файла сообщений hello.msg с символьными идентификаторами наборов и сообщений:

    $ file: hello.msg
    $quote "
    $set PROMPTS
    PLEASE  "Введите имя."
    HELLO   "Здравствуйте, %s \n"
    $ end of file: hello.msg
    

    Ниже приведен текст исходного файла msgerrs.msg с сообщениями об ошибках, на которые можно ссылаться по их символьным идентификаторам:

    $ file: msgerrs.msg
    $quote "
    $set CAT_ERRORS
    MAXOPEN  "Невозможно открыть каталог сообщений %s \n \
    Уже открыто максимально допустимое число каталогов "
    NOT_EX "Файл %s не является исполняемым \n "
    $set MSG_ERRORS
    NOT_FOUND "Сообщение %1$d, набор %2$d, не найдено \n "
    $ Конец файла msgerrs.msg
    

    Для обработки исходных файлов hello.msg и msgerrs введите:

    runcat hello hello.msg
    runcat msgerrs msgerrs.msg /usr/lib/nls/msg/$LANG/msgerrs.cat
    

    Команда runcat

    вызывает команды mkcatdefs и gencat. Первый вызов команды runcat считывает исходный файл hello.msg и использует первый параметр, hello, для создания каталога сообщений hello.cat и файла определений hello_msg.h.

    Файл hello_msg.h содержит определения символьных имен для каталога сообщений, наборов и идентификаторов сообщений. Символьным именем каталога hello.cat является MF_HELLO. Это имя создается автоматически командой mkcatdefs

    средств работы с сообщениями.

    Второй вызов команды runcat

    считывает исходный файл сообщений msgerrs.msg и использует первый параметр, msgerrs, для создания файла определений msgerrs_msg.h.

    Так как в вызове команды присутствует третий параметр, /usr/lib/nls/msg/$LANG/msgerrs.cat, команда runcat

    использует его в качестве имени каталога. Этот параметр является полным путем к файлу каталога, с которым должна работать команда runcat. Символьным именем каталога msgerrs.cat является MF_MSGERRS.

Вывод сообщений вне прикладной программы

Перечисленные ниже команды позволяют выводить сообщения вне прикладной программы. Эти команды существуют только в операционной системе AIX.

dspcat

Выводит сообщения, хранящиеся в указанном каталоге сообщений. Следующая команда выводит сообщения из каталога x.cat:

dspcat x.cat
dspmsg

Показывает выбранное сообщение из каталога. Следующая команда выводит сообщение из каталога x.cat, имеющее идентификационный номер 1 и номер набора 2:

dspmsg x.cat -s 2 1

Команду dspmsg можно использовать в сценариях оболочки для вывода сообщений из каталога.

Вывод сообщений из прикладной программы

Для использования Средств работы с сообщениями в программе должны присутствовать следующие элементы:

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

setlocale

Устанавливает локаль. Укажите переменную среды LC_ALL или LC_MESSAGES в вызове функции setlocale для выбора каталога сообщений в соответствии с установленным в системе языком.
catopen

Открывает заданный каталог сообщений и возвращает дескриптор каталога, который применяется при чтении сообщений из каталога.
catgets

Считывает сообщение из каталога после успешного вызова функции catopen.
printf Преобразует, форматирует и записывает текст сообщения в стандартный поток вывода (stdout).
catclose

Закрывает заданный каталог сообщений.

Следующая программа на языке C (hello) открывает каталог hello.cat с помощью функции catopen, считывает из него сообщения с помощью функции catgets, показывает их с помощью функции printf, а затем закрывает каталог с помощью функции catclose.

/* Программа: Привет */
#include <nl_types.h>
#include <locale.h>
nl_catd      catd;
main()
{
/*  инициализация локали  */
setlocale (LC_ALL, "");
/* открыть каталог */
catd=catopen("hello.cat",NL_CAT_LOCALE);
printf(catgets(catd,1,1,"Здравствуйте!"));
catclose(catd);                     /* закрыть каталог */
exit(0);
}

В этом примере функция catopen

обращается к каталогу hello.cat по имени файла. В связи с этим необходимо правильно задать значение переменной среды NLSPATH. Если функция catopen успешно открывает каталог, функция catgets

возвращает указатель на заданное сообщение из каталога hello.cat. Если каталог не существует или заданное сообщение отсутствует, то catgets выводит указанный по умолчанию текст Здравствуйте!

Переменная среды NLSPATH - Описание

Переменная среды NLSPATH определяет список каталогов файловой системы, в которых будет выполняться поиск каталогов сообщений. Функция catopen для открытия каталога сообщений выполняет поиск в этих каталогах в порядке, заданном переменной. Если функции не удается обнаружить заданный каталог сообщений, она возвращает указанное в программе сообщение по умолчанию. В файле /etc/environment определен список каталогов NLSPATH по умолчанию.

Чтение программных сообщений по умолчанию

Все функции, отвечающие за чтение сообщений, возвращают заданный в программе текст по умолчанию, если сообщение не удается получить по какой-либо причине. Как правило, в качестве сообщений по умолчанию применяются краткие сообщения без номеров. Пользователи, которые предпочитают работать с сообщениями по умолчанию, могут указать в категории LC_MESSAGES локаль C или сбросить переменную среды NLSPATH. Когда не установлена ни одна из переменных LC_ALL,

категория LC_MESSAGES по умолчанию использует локаль C.

Настройка иерархии языков

Пользователи, работающие с несколькими языками, могут задать приоритет языков для ввода сообщений. Информация о настройке приоритета языков для всей системы и для отдельных пользователей приведена в описании команды chlang и в разделе "Изменение языковой среды" книги Руководство по управлению системой AIX 5L версии 5.1: Операционная система и устройства, а также в справке по программе SMIT. Для того чтобы задать иерархию языков средствами SMIT, введите команду быстрого доступа

smit mlang 

в командной строке.

Выберите Изменить / Показать иерархию языков

или

Введите в командной строке:

smit

Выберите Системная среда

Выберите Управление языковой средой

Выберите Изменить / Показать иерархию языков

Пример получения сообщения из каталога

Этот пример состоит из трех частей: исходного файла сообщений, команды, применяемой для создания файла каталога сообщений, и программы, которая использует этот каталог.

  1. Ниже приведен текст исходного файла сообщений example.msg:

    $quote "
    $ В любом каталоге сообщений должен быть определен начальный номер набора.
    $set MS_SET1
    MSG1 "Здравствуйте!\n"
    MSG2 "Доброе утро!\n"
    ERRMSG1 "Пример: 1000.220 Чтение файла
    %s запрещено.\n"
    $set MS_SET2
    MSG3 "Как поживаете?\n"
    
  2. Приведенная ниже команда использует исходный файл сообщений example.msg для создания файла заголовка example.h и каталога сообщений example.cat в текущем каталоге:

    runcat example example.msg
    
  3. Следующая программа подключает файл заголовка example.h и обращается к каталогу сообщений example.cat:

    #include <locale.h>
    #include <nl_types.h>
    #include "example_msg.h" /* содержит определения для
                               символьных идентификаторов */
    main()
    {
            nl_catd      catd;
            int error;
     
            (void)setlocale(LC_ALL, "");
     
            catd = catopen(MF_EXAMPLE, NL_CAT_LOCALE);
            /*
            ** Получить сообщение 1 из первого набора.
            */
            printf( catgets(catd,MS_SET1,MSG1,"Здравствуйте!\n") );
     
            /*
            ** Получить сообщение 1 из второго набора.
            */
            printf( catgets(catd, MS_SET2, MSG3,"Как вы поживаете?\n") );
            /*
            ** Выдать сообщение об ошибке.
            */
            printf( catgets(catd, MS_SET1, ERRMSG1,"Пример: 100.220
                    Чтение файла %s запрещено.\n") ,
                    filename);
            catclose(catd);
    }
    

Связанная информация

Глава 16, Поддержка национальных языков, Средства работы с сообщениями - Информация для программистов, Создание исходного файла сообщений, Создание каталога сообщений, Список функций поддержки национальных языков.

Изменение языковой среды в книге Руководство по управлению системой AIX 5L версии 5.1: Операционная система и устройства.

Команды chlang, dspcat, dspmsg, gencat, lslpp, mkcatdefs, runcat.

Файл environment.

Функция catclose, catgets, catopen, printf.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]