52.2. Программисту

52.2.1. Механизмы

Данный раздел описывает как добавить языковую поддержку в программе или библиотеке, которая является частью дистрибутива Postgres Pro. В настоящий момент это относится только к программам на языке С.

Добавление языковой поддержки для программы

  1. Вставьте этот код в начало программы:

    #ifdef ENABLE_NLS
    #include <locale.h>
    #endif
    
    ...
    
    #ifdef ENABLE_NLS
    setlocale(LC_ALL, "");
    bindtextdomain("progname", LOCALEDIR);
    textdomain("progname");
    #endif

    (progname фактически может быть выбрана произвольно.)

  2. Везде, где сообщение нуждается в переводе, необходимо вставить вызов gettext(). Например:

    fprintf(stderr, "panic level %d\n", lvl);

    нужно заменить на:

    fprintf(stderr, gettext("panic level %d\n"), lvl);

    (gettext определяется как холостая команда, если NLS поддержка не настроена.)

    Это часто приводит к немалой путанице. Один из распространённых подходов в этом случае:

    #define _(x) gettext(x)

    Ещё одно решение допустимо, если программа часто выполняет обмен данными через одну или несколько функций, таких как ereport() в серверном процессе. Тогда вы выполняете внутренний вызов функции gettext для каждой входящей строки.

  3. Добавьте файл nls.mk в каталог с исходными кодами программы. Данный файл будет считаться сборочным файлом (makefile). В нём необходимо выполнить присвоение значений для следующих переменных:

    CATALOG_NAME

    Имя программы, которое указано в вызове textdomain().

    AVAIL_LANGUAGES

    Список выполненных переводов (изначально пустой).

    GETTEXT_FILES

    Список файлов, которые содержат подлежащие переводу строки, т. е. помеченные gettext или альтернативным решением. В итоге, в него будут включены почти все исходные файлы программы. Если список станет слишком длинным, можно первый "file" сделать + а второе слово — файлом, который содержит по одному имени файла на строку.

    GETTEXT_TRIGGERS

    Утилитам, которые генерируют каталоги сообщений для работы переводчиков, должно быть известно, какие вызовы функции содержат строки, подлежащие переводу. По умолчанию распознаются только вызовы gettext(). Если вы использовали _ или другие идентификаторы, необходимо перечислить их здесь. Если подлежащая переводу строка не является первым аргументом, необходимо, чтобы элемент имел форму func:2 (для второго аргумента). Если функция поддерживает сообщения в форме множественного числа, элемент должен выглядеть следующим образом func:1,2 (идентификация аргументов в виде сообщений в форме единственного и множественного числа).

Система сборки автоматически соберёт и установит каталоги сообщений.

52.2.2. Рекомендации по написанию сообщений

Ниже описаны некоторые рекомендации по написанию сообщений, которые легко перевести.