Книга: Linux программирование в примерах
13.6. Резюме
13.6. Резюме
• Интернационализация и локализация программ подпадают под общее название поддержки родного языка. Широко распространенными сокращениями являются i18n, l10n и NLS. Центральным является понятие локали, которая позволяет настраивать набор символов, отображение даты, времени, денежных и числовых величин в соответствии с принятыми для данного языка и в данной стране нормами.
• Использование локали устанавливается с помощью функции setlocale()
. Различные категории локали предоставляют доступ к различным видам информации локали. Не использующие локаль программы действуют, как если бы они находились в локали «С», которая выдает типичные для систем Unix до NLS результаты: 7-разрядный ASCII, английские названия месяцев и дней и т.д. Локаль «POSIX» эквивалентна локали «С».
• Сравнение строк с учетом локали осуществляется функцией strcoll()
или комбинацией strxfrm()
и strcmp()
. Возможности библиотеки предоставляют доступ к сведениям о локали (localeconv()
и nl_langinfo()
), а также к специфического для локали форматирования (strfmon()
, strftime()
и printf()
).
• Обратной стороной получения относящейся к локали информации является вывод сообщений на местном языке. Модель catgets()
System V, хотя и стандартизована POSIX, трудна для использования и поэтому не рекомендуется.[151] Вместо этого GNU gettext
реализует и расширяет оригинальный замысел Solaris.
• При использовании gettext()
оригинальная строка сообщения на английском действует в качестве ключа в двоичном файле перевода, из которого получается перевод строки. Каждое приложение указывает уникальный текстовый домен таким образом, чтобы gettext()
могла найти нужный файл с переводом (известный как «список сообщений»). Текстовый домен устанавливается с помощью функции textdomain()
. При тестировании или иной надобности местоположение списка сообщений можно изменить с помощью функции bindtextdomain()
.
• gettext()
и ее варианты предоставляют доступ к переводам в различных текстовых доменах или различных категориях локалей. Вдобавок, функция ngettext()
и ее варианты дают возможность делать правильные переводы множественных чисел, не перегружая разработчика. Указатель положения в спецификаторе формата printf()
дает возможность перевода форматирующих строк, аргументы которых должны выводиться в другом порядке, чем они располагаются в строке.
• На практике GNU программы используют для пометки переводимых строк в исходных файлах заголовочный файл gettext.h
и макросы _()
и N_()
. Такая практика обеспечивает удобочитаемость исходного кода и возможность его поддержки, предоставляя в то же время преимущества интернационализации и локализации.
• GNU gettext
предоставляет многочисленные инструменты для создания и управления базами данных переводов (переносимых объектных файлов) и их двоичными эквивалентами (объектными файлами сообщений).
• Наконец, стоит быть в курсе проблем наборов символов и их представлений. Поставщики программного обеспечения не могут больше позволить себе предполагать, что их пользователи хотят работать лишь на одном языке.