Linux Slackware Энциклопедия от А до Я
Сайт посвящен свободно распространяемому ПО и Linux Slackware в частности.
Разделы:
Раздел/Тема
Главная -> Настройка -> Русификация и локализация консоли.

Русификация - один из самых больных вопросов для тех, кто первый раз устанавливает Slackware. Эта процедура отличается от таковых в Red Hat и его клонах. В сети можно найти много способов того, как это сделать и порой сложно дать ответ на вопрос - какой же из них правильный, какой лучше. Сейчас мы рассмотрим несколько способов как это сделать. Они отличаются по степени сложности и следуют от простого к сложному. Все процедуры по локализации и русификации проводятся в каталогах /etc/rc.d/ и /etc/profile.d/. Также нужно сразу оговориться, что должен быть установлен пакет из раздела "l" glibc-i18n-2.3.2-noarch-6.tgz

Первый способ.

Этот способ подойдет тем, кто не хочет что-либо менять в конфигах или опасается что-либо испортить.
Итак, смысл состоит в том, что вы скидываете вот этот скрипт russian.sh в каталог /etc/profile.d/ и он при каждой загрузке автоматом выставит шрифт Cyr_a8x16 раскладку клавиатуры ru4 с переключением по Caps Lock и карту соответствия koi2alt. Также изменятся переменные, отвечающие за локализацию. Вот листинг:

#!/bin/sh if [ notset.$DISPLAY != notset. ]; then echo "Welcome to xterm" else if [ $TERM = xterm ]; then echo "Welcome to xterm" else loadkeys /usr/share/kbd/keymaps/i386/qwerty/ru4.map.gz setfont /usr/share/kbd/consolefonts/Cyr_a8x16.psfu.gz mapscrn /usr/share/kbd/consoletrans/koi2alt echo -ne "\033(K" echo "Use the CapsLock key to swith ..." fi fi export LANG=ru_RU.KOI8-R export LC_ALL=ru_RU.KOI8-R export NLSPATH=/usr/share/locale/ru_RU export LESSCHARSET=koi8-r export LC_CTYPE=ru_RU.KOI8-R export LC_NUMERIC=POSIX export COLORTERM= export TERTMINFO=/usr/lib/terminfo # For Russian GostScript export GS_OPTIONS=-dNOPLATFONTS export GS_PATH=/usr/share/gostscript/fonts

В результате получаем русский ввод и русскоязычное меню и даже русский help и man в некоторых программах. О том как расширить этот список в следующий раз. Как добавить проверку орфографии уже написал.

Второй способ.

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

Первое, что я попрошу вас сделать - не полениться и набрать в консоли (не в Иксах!)

$ loadkeys /usr/share/kbd/keymaps/i386/qwerty/ru4.map.gz
$ setfont /usr/share/kbd/consolefonts/Cyr_a8x16.psfu.gz
$ mapscrn /usr/share/kbd/consoletrans/koi2alt
$ echo -ne "\033(K"

Проделайте эту операцию, т.к. она необходима для дальнейших действий. Только что вы сделали невероятное! Теперь, нажав на CapsLock, можно набирать русский текст!

Теперь можно приступать к изучению:

Локаль лежит в директории /usr/share/i18n/locales/
Таблицы символов рядышком /usr/share/i18n/charmap/
Раскладки клавиатуры /usr/share/kbd/keymaps/i386/qwerty/
Консольные шрифты /usr/share/kbd/consolefonts/
Таблицы перекодировки /usr/share/kbd/consoletrans/

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

Локаль. В МС открываем любой файл в директории локалей, например, ru_RU и видим, что локаль - это ничто иное как описание форматов даты, времени, дней недели, денежных единиц, адресов, телефонов и проч. Все это записано в двухбайтовом формате unicode, на что указывает бука U перед шестнадцатиричными кодами.

Таблицы символов. Опять берем и смотрим любимый файл KOI8-R.gz. Что видим? Правильно - соответствие символа в формате unicode и кода нажатия клавиши. Из курса информатики все должны тут же вспомнить, что коду 13 (0Dh) соответствует нажатие Enter.

Раскладки клавиатуры. Вот и добрались до интересного. Вы уже наверное догадались, что мы сейчас сделаем. Точно, посмотрим что внутри файлов ru*.map.gz. Для этого в МС нажимаем F3 (шутка). Надеюсь теперь никто не будет задавать вопросов типа "А какая раскладка соответствует переключению Alt+Shift?". Поясню только, что altgr означает альтернативную группу, в нашем случае русскую. Внимательно изучив файл ru4.map.gz, я обнаружил недокументированную, но очень полезную фичу. Если нажать и удерживать правый Alt, то можно писать в альтернативной раскладке не фиксируя ее, что очень удобно при наборе смешанного текста.
Давайте попробуем сделать свою комбинацию переключения между раскладками. Думаю не каждому по душе доступные. Для начала выберем пациента из имеющихся раскладок. Пусть это будет многострадальный ru4.map.gz, скопируем и переименуем его.

$ cp /usr/share/kbd/keymaps/i386/qwerty/ru4.map.gz /tmp/
$ gzip -d ru4.map.gz 
$ cp ru4.map ru5.map
Далее открываем наш файл в любимом редакторе. Структура файла довольно проста. Слева код клавиши - справа действие. Код клавиши можно дополнять фиксацией спецклавиш Crtl, Alt, Shift. Как я уже писал, altgr определяет действие в альтернативной раскладке. Нас интересуют коды:

58 CapsLock
42 левый Shift
54 правый Shift
56 левый Alt
100 правый Alt
29 левый Ctrl
97 правый Ctrl
Пробуем свои силы. Например, я хочу, шутки ради, переключаться простым нажатием левого шифта. Для этого я ищу строчку:
keycode 42 = Shift
и меняю ее на
keycode 42 = AltGr_Lock
Сохраняю, выхожу и набираю:
loadkeys /tmp/ru5.map
Теперь проверяем - работает? Если нет, перечитываем с начала, если да, идем дальше. Надеюсь применить фантазию вы сможете. Не забудем вернуть все как было и продублируем эту строчку 2 раза, добавив впереди для первой строчки или alt или control, а для второй еще и altgr чтобы сделать реверс. Получаем соответственно переключение по Alt+Shift или Ctrl+Shift.
keycode 42 = Shift
control keycode 42 = AltGr_Lock
altgr control keycode 42 = AltGr_Lock
Не забудем вернуть CapsLock на законное место. Ищем строчки:
keycode 58 =AltGr_Lock
shift keycode 58 = Caps_Lock
altgr shift keycode 58 = Caps_Lock
Теперь уже не сложно догадаться, что вместо них должна остаться одна строчка:
keycode 58 =Caps_Lock

Все, заметаем следы и кладем на место.


$ gzip ru5.map
$ su
Password: 
# mv ru5.map.gz /usr/share/kbd/keymaps/i386/qwerty/
# exit
exit
$ rm ru4.map 

Вот что у меня получилось ru5.map. Попробуйте и вы.

Консольные шрифты. Просто шрифты. Особо тут сказать нечего, кроме разве что одного. Обычно выбирают между следующими шрифтами:
koi8r-8x16.gz
koi8u-8x16.gz
Cyr_a8x16.psfu.gz
Я расположил их в порядке от худшего к лучшему. Как ни странно, но применение первого шрифта - худший выбор. Такие ходовые программы как MC выглядят с ним ужасно, а начертание резко контрастирует с привычными латинскими буквами. Второй уже не имеет таких проблем и даже умеет отображать многострадальную русскую "ё". Оба этих шрифта не требуют загрузки таблицы перекодировки, т.е. команду mapscrn можно не выполнять. И третий, по-моему лучший шрифт. Буква "а" в названии шрифта не случайна. Она обозначает, что шрифт имеет альтернативную группу и что для его использования необходима таблица перекодировки. Т.е. шрифт содержит в себе как бы 2 шрифта на каждую таблицу - латинских и русских символов. Если вы не загрузите таблицу перекодировки, то вместо русского получите псевдографику. Этот шрифт позволяет добиться неискаженного вида всех консольных программ, т.к. содержит в себе стандартную псевдографику. Единственный недостаток - отсутствие буквы "ё".

Таблица перекодировки. Довольно интересная и непонятная штука. Смысл ее станет понятным, если вы откроете любой файлик и посмотрите что внутри. Эта таблица показывает, например, в koi2alt, какому коду символа кодировки cp866 соответствует код этого же символа в кодировке koi8-r. На основе таких вот таблиц работают все программы перекодировщики как под винь, так и под линь. На многих форумах я вижу дебаты по поводу локализации с использованием unicode. Предлагаю всем внимательно взглянуть на файлы этого каталога, авось кому-то и поможет. Мне кажется, что пока рвать когти и переходить на UTF-8 немного рановато, еще не все программы готовы к такому переходу. Однако, сподвижки в эту сторону уже очевидны.

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

Русификация.
Базовыми скриптами для этих целей считаются:

/etc/rc.d/rc.font
/etc/rc.d/rc.keymap

Теперь у вас достаточный багаж знаний, чтобы самим подправить эти скрипты (не забудьте про mapscrn). Приведу вам пример своих.

/etc/rc.d/rc.font

#!/bin/sh
setfont -v Cyr_a8x16.psfu.gz
mapscrn /usr/share/kbd/consoletrans/koi2alt
for i in 1 2 3 4 5 6; do
echo -ne "\033(K" >/dev/tty$i
done
Если честно, то я не разбирался с "магической" комбинацией "\033(K", но очевидно, что это некий переключатель, ибо без него работать ничего не будет. А цикл нужен для того, чтобы русский ввод был доступен на всех 6-ти (по-умолчанию) консолях.

/etc/rc.d/rc.keymap

#!/bin/sh
# Load the keyboard map. More maps are in /usr/share/kbd/keymaps.
if [ -x /usr/bin/loadkeys ]; then
/usr/bin/loadkeys ru4.map
fi

Локализация.
Общая процедура довольно проста. Необходимо подправить файлы /etc/profile.d/lang.sh и lang.csh, оставив в них кроме заголовка лишь строчку:

export LANG=ru_RU.KOI8-R
и
setenv LANG ru_RU.KOI8-R
соответственно, хотя второй, по-моему не применяется, т.к. по дефолту sh.
Следующая строчка заменяет разделитель дробной части с русской запятой на стандартную точку:
export LC_NUMERIC=POSIX
Для того, чтобы все сообщения, меню и прочее все же осталось на английском добавьте строчку:
export LC_MESSAGES=POSIX
Это были самые интересные переменные, а вот остальные. Можно и с ними немного поиграть.
LC_IDENTIFICATION
LC_CTYPE
LC_COLLATE
LC_TIME
LC_MONETARY
LC_PAPER
LC_NAME
LC_ADDRESS
LC_TELEPHONE
После проделанной работы, можете насладиться русскоязычными меню, HELPом, MANом и русскими вставками при выводе многих других программ.

Вообще все "компьютерщики" довольно веселый народ. А уж работая в свободных системах иногда можно от смеха живот надорвать. Мне доводилось находить очень ржачные вещи не только на русском, но и на английском языке. Убедиться в этом можно заглянув в файл /usr/share/locale/ru/man. Обычно самые смешные корки прячут куда-нибудь подальше, например, в бинарный файл.

Хотел еще что-то написать, но забыл что, если у кого будут идеи на счет того, чего тут не хватает, любые дополнения или может замечания - черкните в форум. А вообще, надо признать, статья получилась довольно объемной. Не за горами ее продолжение, но уже для Иксов.

Gena 4.11.2004