Книга: 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));
}
Как только что показано, хорошей мыслью является включение комментария, сообщающего о намеренном использовании нескольких строк, чтобы упростить перевод сообщений.
- 13.3.1. Установка текстового домена: textdomain()
- 13.3.2. Перевод сообщений: gettext()
- 13.3.3. Работа с множественными числами: ngettext()
- 13.3.4. Упрощение использования gettext()
- 13.3.5. Перестановка порядка слов с помощью printf()
- 13.3.6. Тестирование переводов в персональном каталоге
- 13.3.7. Подготовка интернационализированных программ
- 13.3.8. Создание переводов
- 13.3. Динамический перевод сообщений программ
- 8.2. Языки программирования Виды программирований
- 1.1. Введение в объектно-ориентированное программирование
- 11.2. СВОЙСТВА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
- СТРУКТУРА ПРОСТОЙ ПРОГРАММЫ
- ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ
- 6.2. Типичные ошибки при проведении программ продвижения и варианты их устранения
- Системное программное обеспечение
- 6.9. Подготовка данных для расчета прибыльности
- Язык программирования Python
- 1.2.5. Пример программы
- 24.7. Использование программы-твикера