Локализация FreeBSD, как она есть.


#include <disclaimer.h> /* ;-) */

Автор не несет никакой ответственности за ЛЮБЫЕ эффекты связанные с применением данного документа (потеря данных, потеря паролей, бесполезная трата времени и т.д. :). Документ написан в надежде, что он может быть полезен но БЕЗ КАКИХ ЛИБО ГАРАHТИЙ. Используйте изложенную здесь информацию на свой страх и риск. Тем не менее, отзывы, исправления и дополнения с благодарностью принимаются и приветствуются.
Автор доступен по адресу : alec@sensi.org .


О чем здесь написано ?

Данный документ можно рассматривать как попытку дать некоторое введение в средствах локализации (locale) в *nix-like операционных системах (в частности Linux). Основные вопросы, которым в нем уделено внимание :

  • краткое введение

  • выбор правильного значения локализации

  • установка средств локализации (если еще не установлены)

  • включение локализации

  • проверка правильности функционирования средств локализации.

В данном документе _не_ освещены вопросы локализации системы X Windows и других графических подсистем (шрифты и т.д.), и вопросы ввода, отображения и печати национальных символов. Hичего не сказано о проблемах локльного времени и временных поясах. Hе уделено никакого внимания таким средствам locale как многобайтные символы, wide class символы, и еще много чему...

Что такое locale ?

Locale (локализация) это такое системное средство (фича ;-) позволяющее настроить систему на работу с данными в конкретном национальном (местном) представлении. Отдаленно напоминает средство CodePage в MS-DOS или OS/2.

Зачем ? Дело в том, что кроме собственно языка общения и алфавита, в разных странах различаются такие обычаи, как представление даты, времени, финансовых величин и т.д. Эти "культурные правила" уже закреплены традицией и национальными стандартами, иногда довольно давно, поэтому существует необходимость в "локализации" программных продуктов, т.е. настройки их на эти "культурные правила".

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

Производители программного обеспечения также заинтересованы в существовании простого способа сделать свои продукты многоязычными.

*

Locale HЕ ИМЕЕТ накакого отношения к физическому вводу/выводу и к проблемам работы терминала, клавиатуры и печатающих устройств с национальными символами.

Категории локализации.

Как уже было замечено, в каждой отдельной стране способ представления данных отличается. Чтобы упорядочить все эти отличия, их объединяют в группы и особым образом описывают. Такая группа признаков называется Категория Локализации :

LC_CTYPE

Определяет правила классификации и преобразования одиночных символов. Позволяет правильно определять вид символа: цифра, буква, значок, заглавная буква или прописная и т.д. Другими словами, включает правильную работу isalnum(3), isalpha(3), iscntrl(3), isdigit(3), ... и т.п. для местного алфавита. Вдобавок, включает правильный перевод строчных -- прописных букв: toupper(3) и tolower(3).

LC_COLLATE

Определяет правила сравнения и преобразования строк. Позволяет определять лексикографический порядок символов (порядок сортировки) в местном алфавите. Включает правильную работу strcoll(3) и strxfrm(). Оказывает непосредственное влияние на работу утилит типа sort(1) и т.д.

LC_TIME

Определяет правила национального представления времени и даты. Задает именование дней недели, месяцев и т.п. а также задает способ написания даты и времени. (12/24) Hепосредственно влияет на strfdate(3) а через нее на утилиты date(1) и т.д.

LC_NUMERIC

Определяет правила национального представления чисел с плавающей точкой.

LC_MONETARY

Определяет правила национального представления денежных величин. (См. Currency Symbols ISO 4712)

Особая категория локализации LC_ALL служит для обращения одновременно ко всем категориям, т.е. работает как '*'.

В стандарте POSIX 1996 кроме категорий локализации стандартизированы также Ключевые Cлова (keywords), которые определяют внутреннее содержимое категорий локализации. Hапример, для категории LC_CTYPE определены ключевые слова: alpha, digit, xdigit и т.д. Для категории LC_TIME определены ключевые слова : mon, day, abmon, abday, e.t.c. (названия месяцев, название дней недели, в полной и в сокращенной форме), а также способ записи даты во внешнем представлении и т.д.
* Формальное описание категорий локализации содержится в файле "описания локализации".
Получить доступ к ключевым словам категорий локализации можно с помощью функции nl_langinfo() (Не POSIX).

Кроме перечисленных выше категорий локализации иногда также определены:

LC_RESPONCE - Hабор "стандартных" местных ответов ja, si, да, yes, e.t.c.

LC_MESSAGES - Hабор стандартных сообщений об ошибках: "File not found", "Файл не найден".

В POSIX категория LC_RESPONCE входит в LC_MESSAGES. Кроме того, значение LC_MESSAGES оказывает влияние на NLS.

Для локализации системы X Windows используются ее собственные настройки locale (Xlocale), которые здесь не рассматриваются.

NLS. Сообщения на родном языке.

Ранее уже упоминалась возможность получения сообщений и работы с программой на родном языке. Такая возможность существует, и даннное средство называется NLS (National (или Native) Language Support).

"Национализация" в действительности включает в себя несколько аспектов :

  • Перевод сообщений программы на национальный язык.

  • Присвоение значения категории локализации LC_MESSAGES и/или переменной LANG.

  • Перевод описания программы для man.


Чтобы организовать работу с сообщениями программы и дать возможность переводить их на другие языки, было введено такое понятие, как message catalog ( каталог сообщений ). Каталог сообщений хранится отдельно от программы. Естественно, каждая программа может ( и должна ! ) вести свой собственный каталог сообщений, а система NLS предоставляет средства для поддержки корректной работы. Большинство программ, а также системные библиотеки (libc и т.д.) используют NLS и их сообщения могу быть переключены на другой язык.

Message catalog - это фактически база данных, выборка из которой происходит по ключам :

  • выбранный пользователем язык сообщений,

  • имя исполняемой программы,

  • конкретное сообщение в программе.

В результате, на выходе, мы получаем строку конкретного сообщения конкретной программы на нужном нам языке.

Система NLS предоставляет набор стандартных библиотечных вызовов для работы с каталогами сообщений и набор утилит для создания и поддержания этих каталогов (базы).

В настоящее время существут две основных реализации NLS :

В наиболее широко распространенной реализации XPG4 всем сообщениям программы присваивается определенный номер, который служит индексом для поиска текстовой строки в message catalog-е. Кроме того может существовать несколько наборов (sets) сообщений внутри одного каталога.

Для поиска самих message catalog-ов от данной программы используется переменная окружения NLSPATH .


Пример (XPG4):

Данный пример демонстрирует три этапа получения сообщения из каталога:

  1. Исходный текст message catalog-a

  2. Компиляция message catalog-а

  3. Использование message catalog-a

1. Исходный текст message catalog-a:

example.msg file:

$quote "
$ every message catalog should have a beginning set number.
$set 1 This is the set 1 of messages
1 "Hello world "
2 "Good Morning "
3 "example: 1000.220 Read permission is denied for the file %s. "
$set 2
1 "Howdy "

2. Компиляция message catalog-а :

Полученный файл обрабатывается утилитой gencat для получения файла каталога .msg .

ПРИМЕЧАНИЕ: Здесь рассматривается исходная XPG4 версия, однако входящая в состав Linux libc Linux gencat отличается ключами командной строки и имеет дополнительные возможности (не POSIX). В частности, используя символ # можно определять костанты для генерации *.h файлов. (см. tutorial )

$ gencat example.cat example.msg

3. Пример использования message catalog-a :

/* X/Open XPG4 message catalog test */

#include <locale.h>

#include <nl_types.h>

char *MF_EXAMPLE = "example.cat";



main()

{

 nl_catd catd;

 int error;

 (void)setlocale(LC_ALL, "");

 catd = catopen(MF_EXAMPLE, 0);

 /* Get the message number 1 from the first set.*/

 printf( catgets(catd,1,1,"Hello world
") );

 /* Get the message number 1 from the second set.*/

 printf( catgets(catd, 2, 1,"Howdy
") );

 /* Display an error message. No message 4 in set 1.*/

 printf( catgets(catd, 1, 4,"example: 100.220 Permission is denied to read the file %s.
"),

   MF_EXAMPLE);



 catclose(catd);

}

Запуск:

$ cc -o example example.c
$ export
NLSPATH=%N -- (не забыть поменять назад)
$ ./example

Кто занимается стандартизацией locale ?

Изначально стандарт на средства locale был заявлен Международной организацией по Стандартизации ISO и IEC как стандарт POSIX :
Portable Operating System Interface for Computer Environments :
POSIX.1 (ISO/IEC 9945-1:1988) - Интерфейс
POSIX.2 (ISO/IEC 9945-2:1998) - Команды и утилиты

Позднее он был принят комитетом IEEE как IEEE Std. 1003.1-1990 а позже введен в стандарт ANSI C.

В дальнейшем, в позднейших выпусках POSIX
POSIX.1 ( ISO/IEC 9945-1:1992, он же IEEE Std. 1003.1-1992)
POSIX.2 ( ISO/IES 9945-2:1992, он же IEEE Std. 1003.2-1992)
и в выпусках 1994 и 1996 г.г. дополненных POSIX.2a, POSIX.2b , стандартный набор средств для локализации был расширен, сделан более переносимым и был более документирован.

Свой вклад в развитие localе внесla также X/Open Co Ltd. , образовав Joint Internationalization Group (JIG) и выпустив документы XPG2, XPG3, XPG4 (X/Open Portability Guide) включающие в себя также главы о локализации :
- XPG2 : X/Open Portability Guide, Volume 2, January 1987, XVS System Calls and Libraries (ISBN: 0-444-70175-3).
- XPG3 : X/Open Specification, February 1992, System Interfaces and Headers, Issue 3 (ISBN: 1-872630-37-5, C212); this specification was formerly X/Open Portability Guide, Issue 3, Volume 2, January 1989, XSI System Interface and Headers (ISBN: 0-13-685843-0, XO/XPG/89/003).
- XPG4 : X/Open CAE Specification, July 1992, System Interfaces and Headers, Issue 4 (ISBN: 1-872630-47-2, C202).

В настоящее время происходит постепенный переход на стандарт POSIX 1996 и сосуществуют самые различные реализации, включающие в себя элементы как старого POSIX 1988, так и нового POSIX 1996 в той или иной мере.

Практически все современные коммерческие реализации Unix-ов имеют полную реализацию стандартов POSIX.1 и POSIX.2 1996 (в отношении locale).

Из Free реализаций наиболее известны две : 4.4BSD Lite libc и GNU libc (получившая дальнейшее развитие в Linux libс) также поддерживающие POSIX 1996 .

В недалеком будущем возможно включение в стандарты локализации стандарта UNICODE (16-битныx символов) и возможности работы с ними.
* ПРИМЕЧАHИЕ: UNICODE - частичная реализация стандарта ISO 10646,
* совместим снизу вверх, т.е. первые 256 символов UNICODE = Latin-1
* (ISO 8859-1). FYI: В настоящее время распределено около 29.000
* позиций из 65.535 возможных.

В других операцонных системах, таких как Windows NT, OS/2 Warp и т.д. также существуют средства локализации, в общих чертах повторяющие средства локализации POSIX.

Как включить локализацию ?

Если на машине (с POSIX 1996) locale правильно установлена и программы правильно написаны, то локализация включается путем задания строки окружения:

$ export LANG={язык}

Если такой строки окружения нету, работает значение локализации по умолчанию : LANG="C" или "POSIX" (что то же самое) - минимальный набор параметров, необходимый для функцонирования программ на ANSI C, в кодировке ASCII (7 bit).

Если ваша система имеет полную реализацию POSIX.2, то узнать установленные в системе и допустимые значения для LANG= можно командой
$ locale -a

По новому стандарту (POSIX.2 приложение E (?)) значения локализации записываются в форме:
language_TERRITORY.Codeset
или формально:
language[_TERRITORY[.Codeset[,VERSION]]]

T.e. допустимы короткие именования значений locale, которые часто оформляются как aliases (псевдонимы) полного наименования. Hапример "C" --> "POSIX".
Стандарт ISO 639 описывает "language names", ISO 3166 - "territory names".

Для русского языка LANG={язык} устанавливается как правило равным "ru_SU.KOI8-R" или "ru_RU.KOI8-R". Т.е. :
$ export LANG="ru_RU.KOI8-R"
Во FreeBSD 2.x так и есть, для Linux стандарт не устоялся и довольно часто используется старое "koi8-r". В коммерческих реализациях как правило используется значение LANG="ru_RU", или укороченное LANG="ru" .

Hекоторые могут пожелать сделать себе локализацию ru_SU.X-CP-866 или даже ru_RU.Windows-1251 - на это нет никаких ограничений. :)

Если система локализована не полностью и использовать полное переключение на другой язык (с помощью export LANG={язык}) нельзя (например, не работает NLS), можно включить locale только для преобразования символов и строк, задав строку окружения
$ export LC_ALL={язык}.

Можно также присваивать разные значения разным категориям локализации, задавая их имена в строках окружения процесса:
$ export LC_CTYPE=ru
$ export LC_COLLATE=ru
$ export LC_TIME=POSIX - (если раздражают русские даты ;-)
и т.п.

* ПРИМЕЧАHИЕ: Хотя MIME и locale используют одни и те же концепции char set и code set, взаимоотношение между MIME и locale далеко не однозначно. Так что, правильная настройка locale вовсе не гарантирует правильную работу почтовой системы (в области работы с национальными символами).

Как установить locale ?

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

Стандарт POSIX 1996 сделан более переносимым, не зависящим от конкретной реализации и все действия пользователя не различаюся от системы к системе и их внутренняя реализация скрыта за утилитами POSIX.2 .

Две утилиты, определенные в POSIX.2 (Утилиты командной строки) - это locale и localedef.

Утилита locale служит для получения различной информации о текущих значениях категорий locale, o всех установленных в системе возможных locale и о внутренних характеристиках различных категорий locale.

Если в системе не предустановлено нужное нам значение локализации, оно может быть добавлено в систему с помощью утилиты localedef путем компиляции специальных (текстовых) файлов описания параметров набора символов ( charmap) и локализации ( locales ) . После этого они становится изветным системе и видимым по `locale -a`.

$ localedef -c -i locales/ru_RU -f ISO_8859-5:1988 ru_RU

Что значит "программа правильно написана" ?

Во-первых, программа нигде не привязана к 7-ми битным ASCII символам, и пользуется стандатрными библиотечными функциями isalpha(), isupper(), и tolower()/toupper() не полагаясь, что Upper=Lower+0x20 и т.д. Как правило, национальные алфавиты расположены начиная с кода 128, поэтому для совместимости со старыми реализациями locale можно объявить все символы как unsigned char, например ключом компилятора (для gcc -funsigned-char) или явно.

Во-вторых, программа явно начинается с вызова setlocale(LC_ALL,"") (такая форма вызова означает, что всем категориям локализации сразу будет присвоено значение переменной окружения LANG), или подобного кода.


*ПРИМЕЧАHИЕ: Во FreeBSD можно вылечить некоторые программы путем
* задания строки окружения: export ENABLE_STARTUP_LOCALE=""
* тогда setlocale(LC_ALL,"") будет вызываться автоматически при старте
* программ (без их перекомпиляции).
* В Linux libc такого нет (пока?) и по умолчанию включено "C".
* Однако можно пересобрать Linux libc, указав другое значение
* по умолчанию.

Для полной поддержки NLS весь вывод сообщений пользователю должен происходить c использованием функций NLS и должен быть создан каталог сообщений (message catalog) для данной программы (и данного языка).

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

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

Конкретный способ реализации 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).

Как проверить, что локализация заработала ?

Если у вас полная реализация POSIX.2 1996, то проще всего воспользоваться утилитой locale. Применяя locale можно получить множество полезных сведений:

- какие возможные значения locale уже инсталлированы и известны системе.
$ locale -a

- каковы текущие значения отдельных категорий локализации :
$ locale

- каково внутреннее содержание какой-либо категории :
$ locale LC_CTYPE
$ locale LC_TIME
e.t.c.

- каковы текущие значения ключей (keywords) в какой-либо категории локализации :
$ locale alpha
$ locale toupper
$ locale abmon
e.t.c.

Также можно воспользоваться такой короткой прогрммкой :


/* testlocl.c : Минимальная проверка работоспособности locale,

    категория LC_CTYPE, "ключевое слово" - alpha */



#include <stdio.h>

#include <locale.h>

#include <ctype.h>

main() {

unsigned char c=0x0f9;

setlocale(LC_ALL, "");

printf("LC_CTYPE	= %s
", setlocale(LC_CTYPE, NULL));

printf("isalpha(%c)	= %s
", c, isalpha(c) ? "yes" : "no" );

return 0;

}

Для русской локализации в КОИ-8 согласно RFC-1489

код f9h - это русская буква "Ы" : 

F9 CYRILLIC CAPITAL LETTER YERI

т.е. : 
$ cc -o testlocl testlocl.c

$ ./testlocl

LC_CTYPE = ru_RU.KOI8-R 

isalpha(Ы) = yes 


Взаимоотношение MIME и locale.

/* все очень спорно, но вот такое сложилось мнение */

Фактически мы имеем дело с 3-мя различными об'ектами:

  1. текущие фонты и раскладка клавиатуры

  2. установленное значение locale (LANG="...")

  3. кодировка почтового сообщения charset=xxxxx MIME

Само по себе, значение locale ( а точнее значение категорий LC_CTYPE и LC_COLLATE ) оказывает влияние только на обработку символов.

* Средствами locale и стандартного *nix ввода/вывода никак нельзя ни повлиять, ни даже спросить текущее значение аппаратной конфигурации (кодировки). Стандартных средств изменения и определения кодировки нет ни для "аппаратных" (подключенных через ASYNC порт) терминалов , ни для эмуляторов консоли (SCO, BSD или LINUX console), ни для окна xterm в X-Windows. Понятий "кодировка" или "набор символов" нет ни в termios, ни в базах описания терминалов termcap и terminfo, ни даже в "высокоуровневых" библиотеках управления терминалом curses и ncurses.

С другой стороны, почтовые сообщения в MIME могут содержать различные charset даже в пределах одного сообщения.

Задача почтовой программы -- правильно отобразить различные charset для text/plain и text/html. Это легко сделать в оконных системах (Windows, X-Windows, e.t.c.) но невозможно для стандартного *nix терминального ввода/вывода.

В наиболее старой и известной программе для работы с MIME - metamail(1) ( ftp://ftp.funet.fi/pub/unix/mail/metamail/ ) впервые столкнулись с данной проблемой. Именно для metamail была впервые введена переменная окружения MM_CHARSET которая задавала "текущий" charset (набор символов) на консоли. Предполагалось, что пользователь его знает. Постепенно эта переменная стала трактоваться как обозначение текущей аппаратного окружения ( фонтов, e.t.c. ) и современные почтовые программы ( mh, elm ) активно используют эту переменную.

* Буду чрезвычайно благодарен за дополнения и исправление ошибок mailto:alec@sensi.org (26-SEP-1997)

Где найти дополнительную информацию ?

  1. В первую очередь, конечно man :) по функциям setlocale(), isalpha()/isxxxx(), nl_langinfo() и т.д.

  2. Сведения по NLS : man catopen(),catgets(),catclose()
    В исходных текстах libc, man - примеры message catalog-ов.

  3. Также man по утилитам POSIX.2 locale и localedef.
    И конечно их исходные тексты (начиная с версии Linux libc 5.3.x).

  4. Также неплохо посмотреть GNU info-pages по теме libc / Locales.
    HTML-версия GNU info расположена на http://www.cs.utah.edu/csinfo/texinfo/

  5. Различные документы GNU http://www.gnu.org, в частности:
    ftp://prep.ai.mit.edu/pub/gnu/ABOUT-NLS

  6. Страничка Ulrich Drepper - главного идеолога и разработчика средств locale в библиотеке GNU libc и Linux libc :
    http://i44s11.info.uni-karlsruhe.de/~drepper и его доклад :
    http://i44www.info.uni-karlsruhe.de/~drepper/conf96/paper.html

  7. Спецификации POSIX.1 и POSIX.2 .
    (ISO/IEC 9945-2:1988, 1990, 1992, 1996 от
    * ISO http://www.iso.ch и
    * IEC http://www.iec.ch или, что то же самое,
    IEEE Std. 1003.2-1992) и POSIX.2a, POSIX.2b .
    * IEEE http://www.ieee.org
    http://www.posix.com утверждается, что это стоит денег, поэтому лучше всего поглядеть на
    ftp://ftp.funet.fi/pub/doc/posix . (там правда draft версии).

  8. Спецификации XPG3/XPG4 от X/Open Co Ltd. (за деньги :(( ) на :
    http://www.xopen.org

  9. Linux Cyrillic-HOWTO от Alexander L. Belikoff abel@bfr.co.il .
    http://sunsite.unc.edu/LDP/HOWTO/Cyrillic-HOWTO.html
    Дает массу полезной информации по русификации дисплея и клавиатуры, включению 8-bit в различных программах и использованию русских шрифтов.

  10. Другие национальные Linux HOWTO :

  11. Linux Locales mini-HOWTO
    http://sunsite.unc.edu/LDP/HOWTO/mini/Locales
    Дает быстрый способ установки locale на машину.

  12. RFC-1489 на :
    ftp://ds.internic.net/rfc/rfc1489.txt
    Вводит формальное определение кодировки KOI8-R ( КОИ-8 ) и нового charset для MIME :
    Content-Type: text/plain; charset=KOI8-R
    Content-Type: text/html; charset=KOI8-R

  13. Великолепная страничка Ache, посвященная "Русской сетевой кодировке KOI8-R":
    http://www.nagual.pp.ru/~ache/koi8.html

  14. Страничка Boris Tobotras <boris@xtalk.msk.su> посвященная Linux-у
    http://xtalk.price.ru/linux

  15. Страничка Dmitri Beloslioudtsev <dnb@orgland.ru> - автора русской NLS Linux libc
    ( home: http://orgland.ru/~dnb ) и его коллекция locales, charmaps и NLS :
    ftp://ftp.orgland.ru/pub/unix/locale/Linux/

  16. Коллекция locale и charmaps в исходном виде для POSIX.2 localedef
    и прочие документы пограммы i18n. Ведет ее Keld Simonsen <keld@dkuug.dk>
    * i18n (internationalization, as 18 letters between i and n ;)
    ftp://dkuug.dk/i18n/WG15-collection/
    Русский ru_RU в ISO_8859-5 и KOI-8R.

  17. Internationalization Issue, by Michael K. Gschwind <mike@vlsivie.tuwien.ac.at>
    http://www.vlsivie.tuwien.ac.at/mike/i18n.html

  18. MIME FAQ из USENET группы comp.mail.mime :
    ftp://rtfm.mit.edu/pub/usenet-by-group/comp.mail.mime
    или то же в HTML :
    http://www.cs.ruu.nl/wais/html/na-dir/mail/mime-faq/.html

  19. MIME Overview, by Mark Grand mgrand@mindspring.com
    http://www.mindspring.com/~mgrand/mime.html

  20. MIME RFC: RFC-2047, RFC-2048
    ftp://ds.internic.net/rfc/rfc2047.txt
    ftp://ds.internic.net/rfc/rfc2048.txt

  21. Также анонсирован Linux Internationalization Project , который ведет
    Jochen Hein < Jochen.Hein@informatik.tu-clausthal.de >
    (Hепонятно, в какой он стадии). Info:
    -----------------------------------------------------------
    The project itself has a couple of goals:

    - implement and document a complete locale-support in libc:
    Lots of things are implemented now, but if you have access to
    POSIX and X/Open Portability Guide, you may be able to help us
    a lot. Ulrich Drepper < drepper@gnu.ai.mit.edu > is working on
    this for both linux-libc and gnu-libc.

    - implement and document the programs required by POSIX:
    You'll find the first public release on
    ftp://ftp.tu-clausthal.de/pub/systems/Linux/SLT/nls/nlsutils-0.5.tar.gz
    or its mirror
    ftp://ftp.gwdg.de/pub/linux/install/slt/nls/nlsutils-0.5.tar.gz
    Read the README at the same place to get more informations.
    Ulrich is now modifying the utils to match his changes in the
    libc.

    - make programmers use the locale-specific functions instead of
    self-made ones and use message-catalog instead of hardcoded
    messages. This has been started with the locale-tutorial.
    you'll find it on :
    ftp://sunsite.unc.edu//pub/Linux/utils/nls/catalogs/Incoming/locale-tutorial-0.8.txt.gz
    thanks to Patrick D'Cruze. ( Local copy of locale-tutorial-0.8 )

    There is a french translation avaiable at
    ftp://ftp.ibp.fr/pub/linux/french/docs/locale.fr , thanks to Eric DUMAS
    <dumas@emi.u-bordeaux.fr>.

    - translate messages of internationalized porgrams:
    Our goal is to form teams to translate messages and
    documentation into other languages than english.
    For that task there has been formed a german group (Linux
    Internationalization - Deutschland [LInDe]) that
    translates messages and man-pages into german and also provides
    support for german linux-users. They also work in the
    internationalization parts. Main coordinator is again Ulrich
    Drepper.

    - co-working with the GNU-people in the internationalization
    effort. The GNU-people are also interested in
    internationalization of their packages and Linux uses this
    most of this packages, so we hope to benefit both usergroups.

    Support for languages other than English will only help Linux
    spread even further and encourage others to use and recommend
    Linux.

    If you are familar with the NLS (national language support) or
    like to join the effort, you may subscribe you to our mailing
    list. I've appended the instructions at the end of the message.
    Thanks to Linux International for providing the mailing-list.

    Have fun
    Jochen

    ----------------------- cut here ---------------------------

Обновлено: 12.03.2015