Locale and glibc-2.2.x

Программы, работаюцие с locale нормальным образом, через вызовы
glibc, требуют скомпиленных файлов locale. При этом должны выполняться
три требования:

1. Файлы locale должны компилиться командой localedef, которая идет
вместе с glibc-2.2.x. Я не проверял детально, с какой версии проходит
грань совместимости, но, во всяком случае, сильно старые скомпиленные
locale с новыми glibc не работают.

2. Скомпиленные файлы locale должны располагаться в директории
/usr/lib/locale/normalized_locale_name/

3. Имя директории normalized_locale_name должно быть образовано по
следующим правилам:
  - начало имени должно быть в форме ru_RU.
  - имя суффикса (после точки) опускается в нижний регистр и из него
    выкидываются все тире.

Таким образом, для стандартного имени ru_RU.KOI8-R формируется директория
ru_RU.koi8r, в которую glibc будет смотреть при попытках установить ЛЮБУЮ
locale, которая сводится к такой форме. Т.е., например, установки locale
в ru_RU.KOI8-R, ru_RU.koi8-r, ru_RU.koi8r, ru_RU.kOi-8-R реально будут
приводить к работе с одной и той же ru_RU.koi8r.

Важным практическим следствием такого поведения является то, что glibc
НЕ БУДЕТ смотреть в директорию ru_RU.KOI8-R при попытке установить такую
locale. Т.е., если рядом с директорией ru_RU.koi8r положить другую директорию
ru_RU.KOI8-R (с другой locale), то это не произведет никакого эффекта -
к этой директории через glibc просто не будет обращений.

Возможно, однако, что некоторые старые программы используют locale явно, или
явно слинкованы со старой libc. Такие программы могут искать locale ru_RU.KOI8-R
в директории /usr/share/locale/ru_RU.KOI8-R (именно так, по точному имени,
без новых правил приведения имени). В связи с этим наиболее надежным способом
установки locale сейчас является такой:

1. Основной реальной директорией, в которой живет locale, является /usr/lib/locale.
/usr/share/locale должна быть симлинком на /usr/lib/locale (хотя и неважно,
кто является реальной директорией, а кто симлинком. Но лучше придерживаться именно
данного правила - это экономит одно обращение к диску на каждую установку
locale, т.к. не надо считывать симлинк).

2. Сама locale изготовляется командой
      localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
При этом будут использованы исходники /usr/share/i18n/locales/ru_RU и
/usr/share/i18n/charmaps/KOI8-R.
В директории /usr/lib/locale образуется директория ru_RU.koi8r.

3. Сделать ln -s ru_RU.koi8r ru_RU.KOI8-R для заведомо корректной работы
старых программ.

Comments and questions to Evgeny Rodichev, er@sai.msu.su
Last updated 17.06.2002.
Back to my home page
Back to SAI home page