Online Documentation Server
 ПОИСК
ods.com.ua Web
 КАТЕГОРИИ
Home
Programming
Net technology
Unixes
Security
RFC, HOWTO
Web technology
Data bases
Other docs

 

 ПОДПИСКА

 О КОПИРАЙТАХ
Вся предоставленная на этом сервере информация собрана нами из разных источников. Если Вам кажется, что публикация каких-то документов нарушает чьи-либо авторские права, сообщите нам об этом.




Как работает locale ? (пример Linux)

/* Несколько устаревшие сведения на 17 Dec 1997*/

Конкретный способ реализации locale может быть весьма различным в разных операционных системах, особенно для реализаций POSIX до 1996 года и переходных реализациий.

Стандарт POSIX 1996 сделан более переносимым и не зависящим от конкретной реализации, в нем можно стандартными средствами POSIX.2 :
- получить список возможных значений locale ('locale -a'). Все полученные значения являются известными системе и могут быть присвоены переменной окружения LANG=.
- определить новое значение локализации. установить его в систему (localedef). После этого он становится изветным системе и видимым по `locale -a`.

$ 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

/usr/share/locale/ это константа, определяющая каталог в котором хранится база локализации. Различно для различных операционных систем. Для Linux смотри LFSSND. Вообще-то IMHO должно использоваться _PATH_LOCALE из <paths.h>
ru_SU.KOI8-R/ подкаталог в базе докализации, где "ru_SU.KOI8-R" - значение локализации.
LC_XXXXX файл данных для загрузки в run-time libc для категории локализации LC_XXXXX. Иногда такой файл называется "объект локализации".

Если задана категория локализации LC_ALL, считываются _все_ файлы из /usr/share/locale/ru_SU.KOI8-R/* и если там найдутся файлы, имена которых совпадают с именами категорий локализации (LC_CTYPE, LC_COLLATE, e.t.c.) то они загружаются. Для остальных категорий остается значение по умолчанию "C".

Таким образом, при правильной установке локализации, должны существовать следующие каталоги: (пример)
$ ls /usr/share/locale/*
C
POSIX
ru_SU.KOI8-R
en_DK.ISO8859-1

* ПРИМЕЧАHИЕ: В полном POSIX.2 точно тот же результат даст :
$ locale -a
C
POSIX
ru_SU.KOI8-R
en_DK.ISO8859-1

Также должны существовать файлы ("объекты локализации") : (пример)
$ ls /usr/share/locale/ru_SU.KOI8-R/*
LC_CTYPE
LC_COLLATE
LC_MONETARY
LC_NUMERIC
LC_TIME

Теперь вопрос, как же изготовить данные файлы ? ;-) Самое простое, это взять их в дистрибутиве, на 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