Книга: Linux программирование в примерах

13.3.7. Подготовка интернационализированных программ

13.3.7. Подготовка интернационализированных программ

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

1. Включите в свое приложение заголовочный файл gettext.h, добавьте определения для макросов _() и N_() в заголовочный файл, который включается во все ваши исходные файлы на С. Не забудьте определить именованную константу ENABLE_NLS.

2. Вызовите соответствующим образом setlocale(). Проще всего вызвать 'setlocale(LC_ALL, "")', но иногда приложению может потребоваться быть более разборчивым в отношении используемых категорий локали.

3. Выберите для приложения текстовый домен и установите его с помощью textdomain().

4. При тестировании свяжите текстовый домен с определенным каталогом при помощи bindtextdomain().

5. Используйте соответствующим образом strfmon(), strftime() и флаг '. Если нужна другая информация о локали, используйте nl_langinfo(), особенно в сочетании с strftime().

6. Пометьте все строки, которые должны быть переведены, соответствующими вызовами _() или N_().

Хотя некоторые не следует так помечать. Например, если вы используете getopt_long() (см. раздел 2.1.2 «Длинные опции GNU»), вы, вероятно, не захотите, чтобы имена длинных опций были помечены для перевода. Не требуют перевода и простые форматирующие строки наподобие "%d %dn", также как отладочные сообщения.

7. В нужных местах используйте ngettext() (или ее варианты) для значений, которые могут быть 1 или больше 1.

8. Упростите жизнь для своих переводчиков, используя строки с полными предложениями вместо замены слов с помощью %s и ?:. Например:

if (/* возникла ошибка */) { /* ВЕРНО */
 /* Использовать несколько строк для упрощения перевода. */
 if (input_type == INPUT_FILE)
  fprintf(stderr, _("%s: cannot read file: %sn"),
   argv[0], strerror(errno));
 else
  fprintf(stderr, _("%s: cannot read pipe: %sn"),
   argv[0], strerror(errno));

Это лучше, чем

if (/* возникла ошибка */) { /* НЕВЕРНО */
 fprintf(stderr, _("%s: cannot read %s: %sn"), argv[0],
 input_type == INPUT_FILE ? _("file") : _("pipe"),
 strerror(errno));
}

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

Оглавление книги


Генерация: 1.162. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз