|
Как работает locale ? (пример Linux)/* Несколько устаревшие сведения на 17 Dec 1997*/ Конкретный способ реализации locale может быть весьма различным в разных операционных системах, особенно для реализаций POSIX до 1996 года и переходных реализациий. Стандарт POSIX 1996 сделан более
переносимым и не зависящим от
конкретной реализации, в нем можно
стандартными средствами POSIX.2 : $ localedef -c -i locales/ru_RU -f ISO_8859-5:1988 ru_RU Причем все эти действия не различаюся от системы к системе (POSIX.2) и их внутренняя реализация скрыта от пользователя. Если в системе не предустановлено нужное нам значение локализации, оно может быть добавлено в систему с помощью localedef путем компиляции специальных (текстовых) файлов описания параметров локализации и charmap. /* в полном POSIX.2; подробнее в следующей версии документа*/ Для операцонной системы Linux имеют хождение одновременно множество версий Linux libc, с различной степенью поддержки locale. Hиже приведен краткий обзор версий Linux libc. Исторически, Linux libc ведет свое происхождение от free библиотеки GNU libc, которая в своей последней стабильной версии ( GNU libc 1.0.9 ) не имела поддержки других locale кроме "C" и соответственно не имела возможности их менять. Эта библиотека, дав ветвь Linux libc 4.x.x и 5.x.x постоянно переписывалась и кроме других полезных возможностей постепенно приобрела и средства locale. В старой, последней a.out (не-ELF) библиотеке, Linux libc 4.7.5 была возможность переключаться на другие значения locale, но только на заданные в процессе компиляции библиотеки. Для автоматической генерции *.c файлов с описаниями параметров локализации применялись специальные утилиты (реализация Nikolay Saukh ) В ELF версии Linux libc 5.0.9 (получившей довольно широкое распространение в дистрибутивах Slackware 2.x, RedHat и Caldera 1.x с ядром Linux 1.2.13-ELF) появилась возможность задавать любые значения локализации. Hо сначало надо немного обратится к реализации locale в библиотеке Linux libc. Как мы выяснили ранее, различным категориям локализации могут быть присвоены различные значения и причем в разное время - разные. Естественно предположить, что они как-то куда-то динамически загружаются. И действительно, вызов setlocale(LC_XXXXX,"ru_SU.KOI8-R") будет пытаться открыть файл "/usr/share/locale/ru_SU.KOI8-R/LC_XXXXX" и считать его внутрь структуры в run-time части libc. Это все происходит совершенно прозрачно для пользователя. Имя файла для считывания конструируется динамически : /usr/share/locale/ru_SU.KOI8-R/LC_XXXXX
Если задана категория локализации LC_ALL, считываются _все_ файлы из /usr/share/locale/ru_SU.KOI8-R/* и если там найдутся файлы, имена которых совпадают с именами категорий локализации (LC_CTYPE, LC_COLLATE, e.t.c.) то они загружаются. Для остальных категорий остается значение по умолчанию "C". Таким образом, при правильной
установке локализации, должны
существовать следующие каталоги:
(пример) * ПРИМЕЧАHИЕ: В полном POSIX.2 точно
тот же результат даст : Также должны существовать файлы
("объекты локализации") :
(пример) Теперь вопрос, как же изготовить данные файлы ? ;-) Самое простое, это взять их в дистрибутиве, на ftp-сайтах или у знакомых. Можно изготовить их с помощью localedef. Hужно положить эти файлы (объекты локализации) в нужное место и добавить строки ( например в /etc/profile): LANG={язык}; export LANG . Все ! В упомянутой версии Linux libc 5.0.9 подсистема locale работала именно так, однако не было утилит для создания загружаемых "объектов локализации". Те утилиты, которые входили в ее состав, генерировали объекты только для 4.4 BSD lite libc (почему ? ). Рабочие утилиты localedef и locale, появились начиная с версии Linux libc 5.1.x. А начиная с 5.2.1x - в Linux libc уже есть все необходимое для работы с locale в соответствии с POSIX.2 . В широко распространенных дистрибутивах RedHat Linux 4.1 и 4.2 применяется библиотека Linux libc 5.3.12 содержащая вполне работоспособную систему locale. Однако, к сожалению, в дистрибутив RedHat не входили файлы "объекты локализации" для ru_RU.KOI8-R. Однако GNU Libc также развивалась и появилась версия GNU Libc 2.0 поддерживающая locale по стандарту POSIX 1996. Она была портирована для Linux и вероятно скоро появятся дистрибутивы, использующие GNU Libc 2.0.x вместо Linux libc. В библиотеке Linux libc 5.4.x, многое взявшей от GNU Libc 2.0.x реализована следующая версия кода, locale 2, и объекты локализации (файлы) от версий Linux libc 5.0.x - 5.3.x) уже не годятся. Однако, благодаря унификации POSIX 1996, эти файлы можно легко получить из текстового описания локализации и файла описания набора символов (charmap). |
|||||||||||||||||||||||
With any suggestions or questions please feel free to contact us |