Автор статьи: geekkoo Дата: 18.08.2003
Что нужно?
Понятное дело Хы (версия >4.0.0), и не stripped версия glibc (это та что тянет на 100Мб с лишним, и которая требуется при компиляции программ). Я не буду рассматривать руссификацию KDE, тк он тащит с собой собственную локаль и обычно настройка русского через Панель ни у кого затруднений не вызывает. В то же время если у вас возник вопрос Почему у меня в КДЕшных программах все хорошо, а в обычном xedit ничего не печетается, то вам стоит прочитать этот текст.
Проблемы.
Вообще говоря проблемы с русским возникают по разным причинам.
1. Проблема - я могу видеть русский текст, но не могу ввести ничего по русски - курсор просто стоит на месте. Ответ - настраивайте локаль
2. Проблема - вместо русского повсюду кракозябры. Ответ - ставьте шрифты.
3. А вот в Гноме и ГТК программах ... - Тут разговор отдельный.
4. Раскладка не переключается - настраивайте.
В запущенных случаях возможны комбинации симптомов.
Переключатель раскладки
Проще воспользоваться программой XF86Setup. В итоге у вас должен получиться файл /etc/X11/XF86Config c секцией наподобии этой-
Section "InputDevice"
Identifier "Keyboard1"
Driver "Keyboard"
Option "XkbRules" "xfree86"
Option "XkbModel" "pc105"
Option "XkbLayout" "ru"
Option "XkbOptions" "grp:ctrl_shift_toggle,grp_led:scroll"
EndSection
Пояснения- XkbRules - правила по которым из последущих опций строятся параметры клавиатуры - геометрия, раскладка, charmap. xfree86 - это файл, который находится в /usr/X11R6/lib/X11/xkb/rules. XkbOptions - переключатель раскладок Ctrl+Shift, при переключении на русскую раскладку включается LED Scroll. В этой опции можно выбрать другие варианты
grp:switcр
grp:toggle
grp:shift_toggle
grp:ctrl_shift_toggle
grp:caps_toggle
grp:ctrl_alt_toggle
grp:alt_shift_toggle
grp:menu_toggle
grp_led:num
grp_led:caps
grp_led:scroll
Шрифты
Русские шрифты также необходимо прописать в файле XF86Config в Section "Files". Простые bitmapped шрифты от cronyx включены в стандаотную поставку xfree86. Вписываем путь к ним в указанную секцию
FontPath "/usr/X11R6/lib/X11/fonts/local/"
Чтобы х-овые приложения могли использовать эти шрифты, нужно запускать приложения с ключом -fn <нужный фонт> или (что в принципе то-же самое) отредактировать ваш файл ресурсов ~/.Xdefaults. Вот как например будет выглядеть запись для xeditа (чтобы тот по умолчанию использовал times roman в кодировке koi8-r):
xedit*Font : -cronyx-times-medium-r-*-*-14-*-*-*-*-*-koi8-r
Локаль
Теперь попробуйте написать что-нибудь на русском. Запустите xterm и в командной строке наберите команду
export LC_ALL=ru_RU.KOI8-R
затем запустите
xedit -fn -cronyx-times-medium-r-*-*-14-*-*-*-*-*-koi8-r
(или отредактируйте файл ресурсов), переключайтесь на русскую клавиатуру и печатайте. Получилось? Если курсор просто стоит на месте и никаких букв не видно, то это признак, что такой локали у вас нет (загляните в директорию /usr/lib/locale - если такая локаль существует, то там должна находится папка с названием локали). Впрочем, при отсутствии нужной локали вы получите предупреждение (Warning: locale not supported by C library, locale unchanged).
Определите локаль. Для этого как раз и понадобится unstripped версия glibc.
cd /usr/share/i18n
Там находятся две папки с исходниками для локалей (locales) и charmaps (charmaps). "Откомпилируйте" локаль командой (ru_RU, KOI8-R - файлы из locales и charmaps соответственно)
localedef -f KOI8-R -i ru_RU ru_RU.koi8-r
Затем переименуйте (или сделайте линк) вновь созданную папку /usr/lib/locale/ru_RU.koi8-r в /usr/lib/locale/ru_RU.KOI8-R (для Х-ов это не особенно важно, тк они понимают оба названия, но при руссификации консольных программ могут возникнуть проблемы).
В принципе все уже настроено. Несколько заключительных штрихов.
Для troubleshootingа можно использовать программку xev. Запускаете ее, наводите курсор на ее окошко и печатаете. При этом в окне xterma должны появляться надписи типа:
KeyRelease event, serial 27, synthetic NO, window 0x1a00001,
root 0x2b, subw 0x0, time 178246257, (91,139), root:(271,191),
state 0x2000, keycode 44 (keysym 0x6cf, Cyrillic_o), same_screen YES,
XLookupString gives 1 characters: "о"
Слово Cyrillic_o означает как раз, что ввод русского текста у вас настроен правильно. Если такого не происходит, то что-то у вас не так.
Просмотреть текущую локаль можно командой locale (разумеется)
$ locale
LANG=POSIX
LC_CTYPE="ru_RU.KOI8-R"
LC_NUMERIC="POSIX"
LC_TIME="ru_RU.KOI8-R"
LC_COLLATE="ru_RU.KOI8-R"
LC_MONETARY="ru_RU.KOI8-R"
LC_MESSAGES="POSIX"
LC_PAPER="ru_RU.KOI8-R"
LC_NAME="ru_RU.KOI8-R"
LC_ADDRESS="ru_RU.KOI8-R"
LC_TELEPHONE="ru_RU.KOI8-R"
LC_MEASUREMENT="ru_RU.KOI8-R"
LC_IDENTIFICATION="ru_RU.KOI8-R"
LC_ALL=ru_RU.KOI8-R
Как видите у меня отдельные пункты (LC_NUMERIC, LC_MESSAGES) имеют значения POSIX. Сделал я это для того чтобы иметь точку в качестве знака дробного числа, и интерфейс программ на английском (мне так удобнее).
Теперь осталось вписать все настройки в скрипты инициализаци. Открывайте /etc/profile, ищите где у вас определяется локаль и редактируйте:
export LC_ALL=ru_RU.KOI8-R
export LC_ALL=
export LC_NUMERIC=POSIX
export LC_MESSAGES=POSIX
Вторая русская локаль (небольшое отступление)
Иногда бывает нужно просматривать и читать тексты сделанные в windose кодировке (и не заморачиваться при этом с iconv туда и обратно). В принципе сведений, приведенных в предыдущем параграфе, достаточно, чтобы вы смогли определить вторую локаль (Ответ:
localedef -f СP1251 -i ru_RU ru_RU.cp1251
export LC_ALL=ru_RU.cp1251
)
Единственная проблема - найти шрифты в соответствующей кодировке. Для этого можно просто перекодировать scalable шрифты - *.ttf и *.pfb (c bitmapped шрифтами такой фокус у меня не получился). (Примечание - Как установить truetype фонты написано в дополнении к этому постингу Ananasом.) Идея состоит в том, чтобы дописать в файл /usr/X11R6/lib/X11/fonts/FONT_TYPE/fonts.scale (который либо поставляется вместе с шрифтами, либо вам придется создать его с помощью программки ttmkfdir) имена фонтов, соответствующих имеющимся шрифтам, но с кодировкой -microsoft-cp1251. Вот простой tcl скрипт, который автоматизирует эту задачу:
#!/usr/bin/tclsh
set FScale [open ./fonts.scale "r+"]
while {![eof $FScale]} {
#substitute all fonts with koi8-r at the end with cp1251 and #append them to fonts.scale
if { [regsub -all -- {koi8-r$} [gets $FScale] {microsoft-cp1251} newfont]>0}
{
puts $FScale $newfont
}
}
close $FScale
Теперь заставим Xserver переписать базу данных шрифтов
mkfontdir
mkfontdir -e /usr/X11R6/lib/X11/fonts/encodings
xset fp rehash
и запускаем xedit -fn *-microsoft-cp1251
Упражнение для желающих - Создайте локаль и шрифты для досовской кодировки.
Gnome и GTK+
С GTK+ программами существует единственная проблема - они не понимают X-resource-ов ( и соответственно ключа -fn). По этому поводу было уже высказано немало флейма, так что не буду повторяться. Вместо файлов ~/.Xdefaults разработчики ГТК предлагают сходную функциональность через файлы gtkrc. Кроме того некоторые разработчики программ под gtk, "забывают" вызывать функцию gtk_set_locale, необходимую для того, чтобы программа могла использовать системные настройки локали (но тут уже ничего не поделаешь).
Функциональность файлов gtkrc, правда, при этом оказывается урезанной - в них можно установливать картинки для фона, цвета, шрифты, и вообщем-то все (таким образом устроена поддержка тем). При этом rc файлы считываются в следующей последовательности - сначала общесистемные /opt/gnome/share/gtkrc, затем читается файл специфичный для выбранной локали (для русской например это будет /opt/gnome/share/gtkrc.ru - если таковой имеется) и в заключении файл пользователя ~/.gtkrc (у меня это просто линк на файл с темой /opt/gnome/share/themes/StepPastel/gtkrc). В сущности все что нужно - это прописать "правильные" (те с кириллическими символами) шрифты в любом из этих файлов, но при этом убедится, что эти фонты не переопределяются в других gtkrc файлах (так что лучше всего это делать в ~/.gtkrc).
CopyLeft geekkoo
Дополнение от Logvinon
Хотелось бы немного добавить к данному тексту.
X11 расширяют для себя понятия локали, и, соотвественно, хранят свои расширения в каталоге, например:
/usr/lib/X11/locale
Каждая локаль, известная X11, хранится в своем каталоге и состоит из трех файлов, например:
koi8-r/Compose
koi8-r/XI18N_OBJS
koi8-r/XLC_LOCALE
Все файлы текстовые и делаются руками в обычном редакторе по аналогии с существующими.
Надо еще обратить внимание на файлы locale.alias и locale.dir. Структура и назначение их проста и, главное, описана в начале файлов. Заковырка только в одном, в файле locale.dir строки записываются в двух экземплярах, например:
koi8-r/XLC_LOCALE ru_RU.KOI8-R
koi8-r/XLC_LOCALE: ru_RU.KOI8-R
Проверить локаль на поддержку X11 можно простой программкой:
#include
#include
#include
int main() {
printf("Locale:\n%s\nis%s supported\n",
setlocale(LC_ALL,""),
XSupportsLocale()?"":" NOT");
}
Далее, в файле XLC_LOCALE в секции XLC_CHARSET_DEFINE описывается charset, используемый XKB (XIM_methods). Вот здесь наступает некоторое разочарование, все charset'ы предопределены и добавить новый (загружаемый) пока невозможно. Список доступных charset'ов можно посмотреть, например, при помощи:
luit -list
Среди выведенного списка отсутствует CP866, поэтому честно сделать Досовскую кодировку, используя стандартный XKB, увы, не получается. А если не честно, то это уже совсем другая история. :)
Дополнение от Ananas'а
добавлю и свои 5 копеек в эту сокровищницу мысли :)
Подключение TrueType шрифтов (для Х > 4.0):
1. скопировать шрифты в куда надо (например - /usr/X11R6/lib/X11/fonts/ttf)
2. в этой директории выполнить команду ttmkfdir -o fonts.scale
3. там же выполнить mkfontdir
4. прописать путь к шрифтам в /etc/X11/XF86Config[-4] или /etc/X11/fs/config (если используется xfs)
5. перезапустить Х-сервер или xfs
|