Способ проектирования ПО (включая ОС), при котором возможность многоязыковой поддержки закладывается с самого начала, принято называть интернационализацией (кстати, загадочное i18n - это просто сокращение для слова internationalization: i - потом еще 18 букв - n, аналогично, l10n = localization). При интернационализации программного обеспечения КОД не зависит от национальных особенностей. Все языково-зависимые данные сосредотачиваются в особых "объектах локализации", которые разбиты на функциональные группы: категории локализации. При таком подходе локализация - это процесс настройки программной системы на особенности конкретной страны.
В стандарте POSIX (Portable Operating System) были определены средства локализации, которые состоят из следующих компонент:
• набор библиотечных ( libc) вызовов (locale API): setlocale(), isalpha(), toupper(), и т.д;
• исходные тексты описания средств локализации, в том числе файл(ы) описания кодировки (Character Set Definition File);
• наборы данных для локализации, которые в Linux размещаются в каталогах /usr/share/i18n/* и /usr/share/locale/*;
• утилита для получения информации о средствах локализации: locale;
• утилита для изготовления (компиляции) объектов локализации: localedef;
• переменные окружения, для управления средствами локализации: LANG, LC_ALL, LC_CTYPE, LC_TIME, LC_COLLATE, LC_NUMERIC и LC_MONETARY (они соответствуют категориям локализации).
В табл.11.1 кратко перечислено, на что именно влияет та или иная из этих переменных (или категорий локализации).
Таблица 11.1. Категории локализации.
Категория |
Описание |
LC_CTYPE |
Определяет правила классификации и преобразования одиночных символов . Позволяет правильно определять вид символа: цифра, буква, значок, заглавная буква или прописная и т.д. Другими словами, включает правильную работу системных вызовов isalnum(), isalpha(), iscntrl(), isdigit(),… и т.п. для местного алфавита. Вдобавок, включает правильный перевод строчных - прописных букв: toupper() и tolower() |
LC_COLLATE |
Определяет правила сравнения и преобразования строк . Позволяет определять лексикографический порядок символов (порядок сортировки) в местном алфавите. Включает правильную работу strcoll() и strxfrm() . Оказывает непосредственное влияние на работу утилит типа sort и т.д. |
LC_TIME |
Определяет правила национального представления времени и даты . Задает именование дней недели, месяцев и т.п. а также задает способ написания даты и времени (12/24). Hепосредственно влияет на strftime() , а через нее на утилиты date и т.д. |
LC_NUMERIC |
Определяет правила национального представления чисел с плавающей точкой. Влияет на strtod() и форматы %f и %g printf(), scanf() |
LC_MONETARY |
Определяет правила национального представления денежных величин |
Особая переменная LC_ALL служит для обращения одновременно ко всем категориям.
Заметим, что включение средств локализации изменяет также некоторые пути поиска, в частности, пути поиска к файлам помощи (man-страницам), так что вначале команда man ищет переведенные man-страницы и только при их отсутствии выдает информацию на английском.
Подводя краткий итог всему вышеизложенному, можно сказать, что процедура русификации системы состоит из следующих этапов:
• настройка средств локализации;
• русификация текстового режима (консоли);
• русификация графического режима;
• русификация используемого ПО;
• русификация процесса печати.
В последующих разделах каждый из этих этапов рассматривается по отдельности.
11.2. Настройка системных средств локализации
11.2.1. Проверка наличия средств локализации
Современные дистрибутивы Linux (а тем более русифицированные) по умолчанию содержат системные средства локализации, перечисленные в предыдущем разделе.
Чтобы убедиться в этом, проверьте, что у вас имеются каталоги /usr/share/locale/* и /usr/share/i18n/*, а также файл /etc/sysconfig/i18n.
Кроме того, дайте команду
[user]$ locale
В ответ вы должны получить значения, присвоенные переменным окружения для управления средствами локализации. Я, например, увидел следующее:
LANG=ru
LC_CTYPE="ru_RU.KOI8-R"
LC_NUMERIC="ru_RU.KOI8-R"
LC_TIME="ru_RU.KOI8-R"
LC_COLLATE="ru_RU.KOI8-R"
LC_MONETARY="ru_RU.KOI8-R"
LC_MESSAGES="ru_RU.KOI8-R"
LC_ALL=ru_RU.KOI8-R
Можно также дать команду locale с параметром, совпадающим с именем одной из переменных окружения, например:
[user]$ locale LC_TIME
(но я не берусь объяснить то, что вы увидите).
Читать дальше