Наши
Сайдбары
   
IRC-канал
Linuxportal.ru
   
Импорт новостей
 
Вход Быстрая регистрация На главную

Поиск:
 
   БИБЛИОТЕКА
     Другие статьи этого раздела:
 

    X-сервер
Другие разделы библиотеки:
   БИБЛИОТЕКА X-сервер    
Автор статьи: geekkoo
Дата: 18.08.2003

Русский в X-ах.

Что нужно?

Понятное дело Хы (версия >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.utf8
export LC_ALL=ru_RU.utf8

)

Единственная проблема - найти шрифты в соответствующей кодировке. Для этого можно просто перекодировать scalable шрифты - *.ttf и *.pfb (c bitmapped шрифтами такой фокус у меня не получился). (Примечание - Как установить truetype фонты написано в дополнении к этому постингу Ananasом.) Идея состоит в том, чтобы дописать в файл /usr/X11R6/lib/X11/fonts/FONT_TYPE/fonts.scale (который либо поставляется вместе с шрифтами, либо вам придется создать его с помощью программки ttmkfdir) имена фонтов, соответствующих имеющимся шрифтам, но с кодировкой -microsoft-utf8. Вот простой tcl скрипт, который автоматизирует эту задачу:
#!/usr/bin/tclsh
set FScale [open ./fonts.scale "r+"]
while {![eof $FScale]} {
#substitute all fonts with koi8-r at the end with utf8 and #append them to fonts.scale 
    if { [regsub -all -- {koi8-r$} [gets $FScale] {microsoft-utf8} newfont]>0}
 {
        puts $FScale $newfont
    }
}
close $FScale

Теперь заставим Xserver переписать базу данных шрифтов
mkfontdir
mkfontdir -e /usr/X11R6/lib/X11/fonts/encodings 
xset fp rehash

и запускаем xedit -fn *-microsoft-utf8

Упражнение для желающих - Создайте локаль и шрифты для досовской кодировки.

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



Все статьи раздела "X-сервер"