Квадратные скобки в формате наименования каталога показывают, что некоторые части названия каталога локали могут быть опущены. Зачастую название состоит просто из языка (language) и страны (territory). Следовательно, каталог en_US является каталогом локали для англоговорящих Соединенных Штатов, а fr_CH — каталогом локали для франкоговорящего региона Швейцарии.
CH означает Confoederatio Helvetica, латинское (и в силу этого нейтрального по языку для данной местности) название Швейцарии. Имея четыре официальных национальных языка, Швейцария в плане региональных настроек аналогична стране с несколькими часовыми поясами.
Когда в программе указывается, какую именно локаль использовать, мы, по сути, определяем название одного из подкаталогов, находящихся в каталоге /usr/share/locale. Если локаль, определенная в программе, не соответствует в точности названию каталога локали, библиотека языка C ведет поиск соответствия путем разбора компонентов из заданной локали в следующем порядке.
1. Кодировка символов (codeset).
2. Нормализованная кодировка символов (normalized codeset).
3. Страна (territory).
4. Модификатор (modifier).
Нормализованная кодировка символов представляет собой версию имени кодировки символов, в которой удалены все символы, не являющиеся буквами и цифрами, все буквы приведены к нижнему регистру и для получившейся строки указан префикс iso. Цель нормализации — обработка вариаций в регистре букв и пунктуации (например, в дополнительных дефисах) имен кодировок символов.
Например, если для программы локаль запрошена как fr_CH.utf-8, но каталога локали под таким названием не существует, то для такой локали подойдет каталог fr_CH, если таковой обнаружится. Если каталога с названием fr_CH не будет, то будет использован каталог локали fr. В маловероятном случае отсутствия каталога fr функция setlocale(), которая вскоре будет рассмотрена, сообщит об ошибке.
Альтернативные способы указания локали для программы определяются в файле /usr/share/locale/locale.alias. Подробности можно найти на странице руководства locale.aliases(5).
Как показано в табл. 10.2, в каждом подкаталоге локали имеется стандартный набор файлов с указаниями норм, принятых для данной локали. Относительно сведений, приведенных в этой таблице, следует сделать несколько пояснений.
• В файле LC_COLLATE устанавливается набор правил, описывающих порядок следования символов в их наборе (то есть «алфавитный» порядок для набора символов). Эти правила определяют работу функций strcoll(3) и strxfrm(3). Даже языки, основанные на латинице, не следуют одним и тем же правилам сортировки. Например, в ряде европейских языков имеются дополнительные буквы, которые иногда при сортировке могут следовать за буквой Z. К другим особым случаям можно отнести испанскую двухбуквенную последовательность ll, которая сортируется как одна буква, следующая за буквой l, и немецкие символы умлаутов, такие как «д», которая соответствует сочетанию ae и сортируется как эти две буквы.
• Каталог LC_MESSAGES является одним шагом по направлению к интернационализации сообщений, выводимых программой. Расширенная интернационализация сообщений программы может быть выполнена путем использования либо каталогов сообщений (см. страницы руководства catopen(3) и catgets(3)), либо GNU API gettext (доступного по адресу http://www.gnu.org/).
В версии glibc под номером 2.2.2 введено несколько новых, нестандартных категорий локали. В LC_ADDRESS определяются правила зависящих от локали представлений почтовых адресов. В LC_IDENTIFICATION указывается информация, идентифицирующая локаль. В LC_MEASUREMENT определяется местная система мер (например, метрическая или дюймовая). В LC_NAME устанавливаются местные правила представления личных имен и титулов. В LC_PAPER определяется стандартный для данной местности размер бумаги (например, принятый в США формат Letter или формат A4, используемый в большинстве других стран). В LC_TELEPHONE задаются правила для местного представления внутренних и международных телефонных номеров, а также международного префикса страны и префикса выхода на международную телефонную сеть.
Таблица 10.2. Содержимое подкаталогов локали
Имя файла — Назначение
LC_CTYPE — Файл содержит классификацию символов (см. isalpha(3)) и правила, применяемые при преобразовании регистра
LC_COLLATE — Файл включает правила сортировки набора символов
LC_MONETARY — Файл содержит правила форматирования денежных величин (см. localeconv(3) и <locale.h>)
LC_NUMERIC — Файл содержит правила форматирования для чисел, не являющихся денежными величинами (см. localeconv(3) и <locale.h>)
LC_TIME — Файл включает правила форматирования для даты и времени