Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

• Если в форматирующей строке используется N– й аргумент, в этой строке должны использоваться также все аргументы до N. Соответственно, следующее неверно

printf("%3$s %1$s\n", "hello", "cruel", "world")
;

• Ссылка на определенный аргумент может быть сделана указателем положения несколько раз. Не позиционные спецификаторы формата всегда движутся через список аргументов последовательно.

Эта возможность не предназначена для непосредственного использования программистами приложений, она скорее для переводчиков. Например, перевод предыдущей форматирующей строки,

"The %s %s looks at you enquiringly.\n"
, на французский мог бы быть:

"Le %2$s %1$s te regarde d'un aire interrogateur.\n"

(Даже этот перевод не совершенен: артикль «Le» имеет род. Подготовка программы к переводу трудная задача!)

13.3.6. Тестирование переводов в персональном каталоге

Коллекция сообщений в программе называется списком сообщений (message catalog). Этот термин применяется также к каждому из переводов сообщений на другой язык. Когда программа установлена, каждый перевод также устанавливается в стандартное место, где

gettext
может во время исполнения найти нужный перевод.

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

bindtextdomain
дает
gettext
альтернативное место для поиска переводов:

#include <libintl.h> /* GLIBC */

char *bindtextdomain(const char *domainname,

const char *dirname);

Полезные каталоги включают '

.
' для текущего каталога и
/tmp
. Может оказаться удобным также получить каталог из переменной окружения, подобно этому:

char *td_dir;

setlocale(LC_ALL, "");

textdomain("killerapp");

if ((td_dir = getenv("KILLERAPP_TD_DIR")) != NULL)

 bindtextdomain("killerapp", td_dir);

bindtextdomain
должна быть вызвана до вызовов любой из функций из семейства
gettext
. Мы увидим пример ее использования в разделе 13.3.8 «Создание переводов»

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 %d\n
", также как отладочные сообщения.

7. В нужных местах используйте

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

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

%s
и
?:
. Например:

if (/* возникла ошибка */) { /* ВЕРНО */

 /* Использовать несколько строк для упрощения перевода. */

 if (input_type == INPUT_FILE)

fprintf(stderr, _("%s: cannot read file: %s\n"),

argv[0], strerror(errno));

 else

fprintf(stderr, _("%s: cannot read pipe: %s\n"),

argv[0], strerror(errno));

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

if (/* возникла ошибка */) { /* НЕВЕРНО */

 fprintf(stderr, _("%s: cannot read %s: %s\n"), argv[0],

 input_type == INPUT_FILE ? _("file") : _("pipe"),

 strerror(errno));

}

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

13.3.8. Создание переводов

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

ch06-echodate.c
из раздела 6.1.4 «Преобразование разложенного времени в
time_t
»:

/* ch13-echodate.c --- демонстрация переводов */

#include <stdio.h>

#include <time.h>

Поделиться:
Популярные книги

Перешагнуть пропасть

Муравьёв Константин Николаевич
1. Перешагнуть пропасть
Фантастика:
боевая фантастика
космическая фантастика
8.38
рейтинг книги
Перешагнуть пропасть

Изгой Проклятого Клана. Том 4

Пламенев Владимир
4. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 4

Афганский рубеж

Дорин Михаил
1. Рубеж
Фантастика:
попаданцы
альтернативная история
7.50
рейтинг книги
Афганский рубеж

Золотой ворон

Сакавич Нора
5. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Золотой ворон

Натиск

Осадчук Алексей Витальевич
12. Последняя жизнь
Фантастика:
аниме
фэнтези
попаданцы
6.20
рейтинг книги
Натиск

Бастард Императора. Том 12

Орлов Андрей Юрьевич
12. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 12

Неучтенный элемент. Том 10

NikL
10. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 10

Кукловод

Майерс Александр
4. Династия
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кукловод

Лекарь Империи

Карелин Сергей Витальевич
1. Лекарь Империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
попаданцы
5.00
рейтинг книги
Лекарь Империи

География растений

Гумбольдт Александр
Классики естествознания
Научно-образовательная:
ботаника
7.50
рейтинг книги
География растений

На границе империй. Том 10. Часть 8

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 8

Точка Бифуркации IV

Смит Дейлор
4. ТБ
Фантастика:
героическая фантастика
городское фэнтези
попаданцы
5.00
рейтинг книги
Точка Бифуркации IV

Александри В. Стихотворения. Эминеску М. Стихотворения. Кошбук Д. Стихотворения. Караджале И.-Л. Потерянное письмо. Рассказы. Славич И. Счастливая мельница

Эминеску Михай
126. Библиотека всемирной литературы
Поэзия:
поэзия
5.00
рейтинг книги
Александри В. Стихотворения. Эминеску М. Стихотворения. Кошбук Д. Стихотворения. Караджале И.-Л. Потерянное письмо. Рассказы. Славич И. Счастливая мельница

Матабар VIII

Клеванский Кирилл Сергеевич
8. Матабар
Проза:
магический реализм
5.00
рейтинг книги
Матабар VIII