[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 Извлечение текстовых строк из программы

Для интернационализации текста сообщений программы необходимо
просмотреть весь исходный код в поиске встроенных текстовых констант и
заменить их вызовами gettxt(3C). exstr(1) помогает автоматизировать
большую часть этой задачи. Программа exstr(1) выполняет две функции:
.    Генерирует список символьных строк, используемых программой.
.    Модифицирует исходный текст для использования gettxt(3C).
При запуске с опцией -e extstr(1) выдает в стандартный вывод список
всех строк, используемых в исходном файле. Каждая строка выводится
вместе с информацией, определяющей имя исходного файла, номер строки и
начальный символ в строке файла. Вывод осуществляется в виде
разделенных двоеточиями полей, каждый объект на новой строке.
Для замены встроенных символьных строк вызовами gettxt(3C), необходимо
перенаправить вывод exstr(1) в файл. Затем пользователь должен
отредактировать этот файл, введя в каждой строке значения в два пустых
поля (поля 4 и 5). Это имя файла сообщений и идентификатор сообщения,
соответственно. В этом примере файл сообщений называется DB и
находится в директории LC_MESSAGES соответствующей локали.
Идентификатор (номер) первого сообщения равен 1, а следующего - 3.
Важно просмотреть вывод exstr(1) и убедиться, что он состоит только из
строк, для которых требуется интернационализация. Например, строка,
содержащая путевое имя какого-либо файла вряд ли будет кандидатом для
замены на вызов gettxt(3C). Кроме того, строки, используемые для
инициализации статических и внешних переменных не могут быть заменены
вызовом функции. Например,
char buf[] = "%s: Not Found";

не может быть замещено вызовом gettxt(3C), поскольку инициализация
внешнего массива происходит во время компиляции. Программы, содержащие
такие строки, для интернационализации необходимо модифицировать так,
чтобы позволить замену ссылок на строки на вызовы функций.
               ИЗВЛЕЧЕНИЕ ТЕКСТОВЫХ СТРОК ИЗ ПРОГРАММЫ


     #include <unistd.h>
     #include <stdio.h>
     #include <stdlib.h>
     #include <fcntl.h>
     main(int argc, char *argv[])
     {
        int fd;
        char *message;

        message = "argument list too long";
        if ((fd = open(argv[1], O_RDONLY)) < 0) {
            fprintf(stderr, "%s can't open file %s\n",
                argv[0], argv[1]);
            exit(0);
        }

        /* rest of program */
     }



$ exstr -e db.c
db.c:11:13:::argument list too long
db.c:14:23:::%s can't open file %s\n
$ exstr -e db.c > db.msgs

(edit db.msgs)
$ cat db.msgs
db.c:11:13:DB:1:argument list too long
db.c:14:23:DB:3:%s can't open file %s\n