Локал - КАКВОТО Е - Как работи локалът (пример за Linux)
/* Леко остаряла информация към 1 декември 1998 г. */
За операционната системаLinux има много версии наLinux libc, работещи едновременно, с различна степен на поддръжка наlocale. По-долу е даден кратък преглед на версиите наLinux libc.
Исторически погледнато,Linux libc води началото си от безплатната библиотекаGNU libc (glibc ), която в най-новата си стабилна версия (GNU libc 1.0.9) нямаше поддръжка за другилокали освен "C " и следователно не можеше да ги променя. Тази библиотека роди клонаLinux libc 4.x.x и 5.x.x, който непрекъснато се подобряваше, пренаписваше и, в допълнение към други полезни функции, постепенно придобиlocale инструменти.
В старата, най-нова a.out (не-ELF) библиотека,Linux libc 4.7.5, беше възможно да се превключи към другиlocale стойности, но само към тези, посочени по време на компилирането на библиотеката. За автоматично генериране на *.c файлове с описания на параметрите за локализация бяха използвани специални помощни програми (имплементация от Николай Саух) /* Силно подобни на стария SCO UNIX */.
Във версия ELFLinux libc 5.0.9 (която стана доста широко разпространена в дистрибуциите Slackware 2.x, RedHat и Caldera 1.x с ядрото Linux 1.2.13-ELF), е възможно да се зададат всякакви стойности за локализация.
Но първо трябва да разгледаме малко имплементациятаlocale в модерната библиотекаLinux libc.
Името на файла за четене се конструира динамично:
/usr/share/locale /ru_RU.KOI8-R /LC_XXXXX
/usr/share/locale/ | е константа, която дефинирадиректорията, в която се съхранява базата за локализация. Различни за различните операционни залисистеми. ЗаLinux вижтеLFSSND. За Intractive UNIX: /lib/locale. Всъщност IMHO _PATH_LOCALE трябва да се използва от |
Така, ако локализацията е настроена правилно, трябва да съществуват следните директории: (пример)$ ls /usr/share/locale/* C POSIX en_RU.KOI8-R en_DK.ISO-8859-1 .
* ЗАБЕЛЕЖКА: В пъленPOSIX.2 помощната програма за локализиране ще даде абсолютно същия резултат:$ локал -a C POSIX ru_RU.KOI8-R en_DK.ISO-8859-1 .
Файловете ("обекти за локализация") също трябва да съществуват: (пример)$ ls /usr/share/locale/ru_RU.KOI8-R/* LC_CTYPE LC_COLLATE LC_MONETARY LC_NUMERIC LC_TIME
Сега въпросът е откъде получавате тези файлове? ;-) Вижте Как да зададете локал .
Във версията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 (ELF), която съдържа напълно функционална системаlocale. Но, за съжаление, дистрибуцията на RedHat не включваше файлове "localization objects" за български езикru_RU.KOI8-R.
Въпреки това,GNU libc също еволюира, за да включва GNU libc 2.0, поддържащлокал според стандартаPOSIX 1996. Беше пренесен къмLinux и скоропоявиха се дистрибуции, които използватGNU libc 2.0.x вместоLinux libc. Например дистрибуцията на RedHat Linux 5.2 (Apollo) (на glibc 2.0.7) включва всички необходими помощни програми и "обекти за локализация" -ru_RU (в ISO8859-5) иru_SU (KOI8-R). Въпреки че не беше без проблеми.
В библиотекатаLinux libc 5.4.x, която взе много отGNU libc 2.0.x, е внедрена следващата версия на кода, локал 2, и обектите за локализация (файлове) от версиите наLinux libc 5.0.x - 5.3.X вече не са подходящи. Въпреки това, поради обединяването наPOSIX 1996, тези файлове могат лесно да бъдат получени от текстовото описание на локализацията и файла за дефиниране на набор от знаци.
В момента разработката на библиотекатаLinux libc е спряна (на версията
5.4.38), и общата посока на развитие --> сливане и превключване към библиотекатаglibc2. Но тъй като има толкова много приложения, които работят сLinux libc, трябва да имате две версии на библиотеката на вашата система:Linux libc, нареченаlibc5 (например версия 5.3.12) иGNU libc (напримерglibc версия 2.1), нареченаlibc6.