Информации о локали содержится в иерархии каталогов, которая находится в каталоге /usr/share/locale (или в некоторых дистрибутивах в каталоге /usr/lib/locale). Каждый имеющийся в этом каталоге подкаталог хранит информацию о конкретном месте (в географическом смысле). Эти каталоги называются с использованием следующего соглашения:
В качестве language используется двухбуквенный код языка по стандарту ISO, а в качестве territory — двухбуквенный код страны по стандарту ISO. Компонент codeset обозначает кодировку символов. Компонент modifier предоставляет средства, позволяющие отличить друг от друга несколько каталогов с локалями, чьи языки, территории и кодировки символов совпадают. Примером полного имени каталога с локалями может служить de_DE.utf-8@euro, которое соответствует следующим региональным настройкам: немецкий язык, Германия, кодировка символов UTF-8, в качестве денежного знака используется евро.
Квадратные скобки в формате наименования каталога показывают, что некоторые части названия каталога локали могут быть опущены. Зачастую название состоит просто из языка (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/).