Další Předchozí Obsah

3. Lokalizace textové konzoly

Petr Kolář Petr.Kolar@vslib.cz: 5. 1. 1999; Pavel Janík ml. Pavel.Janik@math.muni.cz: starší verze; a mnozí další

Pro lokalizaci textové konzole je třeba nastavit ovladač klávesnice, aby generoval kódy znaků podle požadovaného rozložení kláves, a ovladač displeje, aby umožňoval zobrazování národních znaků včetně písmen s diakritikou (s akcenty).

Ačkoli jádro Linuxu podporuje od verze 1.3.? Unicode umožňující současné používání nejen všech možných písmen s akcenty, ale i téměř všech světových abeced, v současnosti stále převažuje využívání osmibitových kódování.

Pro češtinu, slovenštinu, polštinu, maďarštinu, rumunštinu, slovinštinu, chorvatštinu, albánštinu a další východoevropské jazyky psané latinkou je určena znaková sada ISO-8859-2, známá také pod názvem ISO LATIN-2. Západoevropské jazyky naproti tomu používají kódování ISO-8859-1. Obě tato kódování jsou rozšířením kódu ASCII a shodují se i v některých dalších znacích, takže ISO-8859-2 lze používat například i pro němčinu.

Přestože kódování ISO-8859-2 je pro zmíněné jazyky mezinárodním standardem a preferovaným kódováním, v mnoha neunixových systémech se používají jiná kódování; v MS-Windows sada Windows-1250, která se bohužel v několika znacích odlišuje od ISO-8859-2, v systému MS-DOS, jeho klonech i v DOSových oknech MS-Windows kódová stránka 852 nazývaná též PC LATIN-2, která má ne-ASCII znaky kódovány zcela odlišně. Další kódování se používají v jednotlivých zemích (v České republice a na Slovensku je stále populární sada Kamenických), na jiných operačních systémech (Macintosh), pro některá zařízení (tiskárny) i programy (kódování Cork v TeXu).

Zatímco znaková sada ISO-8859-2 je určena pro několik jazyků, rozložení klávesnice je pro každý jazyk jiné. Standardní česká nebo slovenská klávesnice pro PC vycházející z českého psacího stroje je pro psaní textů, v nichž se vyskytují speciální "počítačové" znaky, dosti nepohodlná. Proto mnoho lidí používá různé "programátorské klávesnice", které bohužel nejsou standardizovány a jak ukázaly diskuse v konferenci linux, širší dohoda o jejich rozložení je téměř vyloučena.

Při zkoušení klávesnice nezapomeňte, že mnoha programům je třeba pomoci, aby pracovaly s osmibitovými znaky --- kapitola Lokalizace různých aplikací. Problémy by neměly být s editorem vi, proto nově nainstalovanou klávesnici testujte nejdříve v tomto editoru v režimu vkládání znaků.

Distribuce, kterou používáte, může mít podporu pro české prostředí už zabudovanou. Proto je vhodné nahlédnout nejprve do kapitoly  Jak počeštit různé distribuce a postupy popsané v následujících odstavcích zkoušet teprve pokud nenaleznete jednodušší řešení tam.

3.1 Zobrazování znaků v kódování ISO-8859-2

ISO-8859-2 fonty pro konzolu a program setfont, kterým se zavádí, jsou součástí balíku kbd už od dávných verzí Linuxu. Pokud v některé distribuci balík kbd není, je možné jej získat například na ftp://ftp.muni.cz/pub/linux/system/keyboards/kbd-0.96.tar.gz.

Pro adaptéry VGA a lepší stačí zavést font příkazem


setfont lat2-16.psf

(nikoli lat2-08.psf výšky 8, jak je doporučováno v dokumentaci k cs-tools), pro adaptéry EGA je vhodný font lat2-14.psf (může někdo potvrdit, že na adaptéru EGA program setfont funguje?). V novějších verzích kbd jsou pro ISO-8859-2 k dispozici ještě fonty iso02*. Pokud není použit program vtfontd, zavedení fontu se projeví na všech virtuálních terminálech (konzolách).

3.2 Národní klávesnice

Pokud na vašem systému není mapa české klávesnice, lze použít část balíku cs-tools ftp://ftp.muni.cz/pub/localization/linux/obsolete/cs-tools/cs-tools-0.19.tar.gz. Soubory *.map z adresáře console z tohoto balíku je třeba zkopírovat do adresáře /usr/lib/kbd/keytables. Zvolená mapa klávesnice se pak zavede příkazem


loadkeys cz-lat2

v některém ze startovacích skriptů. V distribuci Red Hat stačí uvést řádek KEYTABLE v souboru /etc/sysconfig/keyboard:

KEYTABLE="cz-prog"

Klávesnice fungují jako americké, do českého režimu se přepnou stisknutím klávesy Pause nebo držením klávesy AltGr (pravý Alt). Pro zpětné přepnutí lze použít opět Pause nebo držení AltGr.

Klávesnice z kbd údajně nefungují s jádry vývojové řady 2.1.x. Na počítačích s vývojovými jádry je nutné používat balík ucw popsaný dále.

Jak funguje načítání znaků z klávesnice?

Při stisku klávesy, při držení v rytmu autorepeatu a při uvolnění klávesy generuje klávesnice na počítačích PC přerušení IRQ 1. Jádro načítá z portu 0x60 tak zvané scankódy kláves, což je jeden nebo celá posloupnost bytů. Například při stisku klávesy 'q' bude načteno 0x10 (16 desítkově), při uvolnění kód o 0x80 větší, tedy 0x90. Některé klávesy, jako např. Delete posílají dvoubajtové escape-scankódy 0xe0, 0xNN, klávesa Pause posloupnost 0xe1, 0x1d, 0x45. Jádro nejdříve scankódy převádí na tak zvané keykódy (funkce getkeycode v drivers/char/keyboard.c --- docela zajímavé čtení). Toto mapování lze měnit i na uživatelské úrovni, ale to má význam snad jenom při používání exotického hardware. Pro národní klávesnice je zajímavé další mapování, při němž se keykódy převádějí na kódy znaků. Od jádra verze 0.99pl10 lze implicitní mapu drivers/char/defkeymap.map měnit.

3.3 Alternativa: Balík ucw-cs-1.1.tar.gz

Tento balík využívá schopnosti jádra Linuxu pracovat se znaky v kódování Unicode. Pro zobrazování se používá zvláštní textový režim adaptérů EGA/VGA, který umožňuje současně zobrazit 512 různých znaků. Jako devátý bit kódu znaku se používá bit 3 barevných atributů. Tak je možné zobrazovat všechny znaky podle kódování ISO-8859-1 i ISO-8859-2 současně s rámečky, které mohou být na pozicích 0xB0 až 0xDF, pro něž adaptér VGA zdvojuje levý sloupec, aby byla šířka znaku 9 bodů. V budoucnosti by měl být použit grafický režim. Díky tomu se tento balík elegantně vyrovnává s problémy popsanými v kapitole Rámečky v~programech MC & spol. se zobrazují špatně.

Balík se nachází na ftp://atrey.karlin.mff.cuni.cz/pub/local/mj/linux/ucw-cs-1.1.tar.gz, jeho popis je na http://atrey.karlin.mff.cuni.cz/~mj/linuxcs/. Po rozbalení balíku se přepněte do adresáře ucw-cs-1.1 a zadejte


install -c -o root -g root -m 644 fonts/* /usr/lib/kbd/consolefonts
install -c -o root -g root -m 644 keymaps/* /usr/lib/kbd/keytables
install -c -o root -g root -m 755 mapscrnuni/mapscrnuni /usr/local/bin
install -c -o root -g root -m 644 mapscrnuni/latin2.table /usr/lib/kbd/consoletrans

do startovacích skriptů /etc/rc* je nutné přidat příkazy


setfont ucw16.psf
mapscrnuni < /usr/lib/kbd/consoletrans/latin2.table
loadkeys cs-head cz-type cs-compose

a do souborů /etc/profile a /etc/csh.cshrc nebo $HOME/.bashrc a $HOME/.cshrc, případně do /etc/issue je nutné přidat příkaz, který zajistí přepnutí na uživatelské mapování obrazovky:


/bin/echo -en "\033(K"

Pokud se při spuštění programu loadkeys objeví chybové hlášení jako

Keymap 12: Permission denied

je nutné zadat tento příkaz jako root. Zdá se, že loadkeys spuštěný obyčejným uživatelem neumí zvětšit konverzní tabulku pro klávesnici v jádře, a výsledkem je zmíněné hlášení.

Balík je zajímavý tím, že mapa klávesnice je rozdělena do několika souborů, které příkaz loadkeys spojí a zavede jako jednu mapu. Na místě cz-type.map (český psací stroj) lze použít cs-ucw.map (písmena s akcenty se píšou se stisknutým Caps Lock), cz-prog.map (česká programátorská), sk-type.map (slovenský psací stroj) nebo sk-prog.map (slovenská programátorská), podle toho, komu co vyhovuje.

3.4 Tipy a problémy

Vypadnutí fontu při přepnutí do X a zpět

U některých X-serverů dojde při přepnutí z virtuálního terminálu do X a zpět k vypadnutí konzolového fontu. Situaci lze řešit opětovným ručním zavedením fontu, nebo je možné použít program vtfontd - ftp://ftp.excom.spb.su/pub/linux/Utils/Console/vtfontd-1.0.1.tar.gz, který také umožňuje používat na jednotlivých konzolách různé fonty.

V Midnight Commanderu nelze přepínat fonty

Inu tento problém vlastně ani není problémem, je to samozřejmost, protože v mc nejsme na virtuální konzole, ale na normálním terminálu ttypx, tudíž nemáme právo použít ioctl PIO_FONT, protože nejsme ani vlastníkem tty, ani superuživatelem (drivers/char/vt.c řádek 212 --- opět velmi zajímavé čtení).

Rámečky v programech MC & spol. se zobrazují špatně

Při používání některých programů (jako například Midnight Commanderu) bývají problémy se zobrazováním rámečků. U Midnight Commanderu je možné použít parametr -a, který způsobí, že mc bude pro zobrazování rámečků používat ASCII znaky +, - a |, což sice nepůsobí příliš esteticky, ale je to rozhodně lepší, než když se místo rámečků zobrazují písmena.

Vzhledem k tomu, že programy používající čárovou grafiku jako MC nebo MenuConfig jádra, jsou po nainstalování českých fontů na textovou konzolu Linuxu nečitelné, je nutné použít font, který tyto rámečky obsahuje, a upravit nastavení databází termcap a terminfo. Již upravené databáze jsou ke stažení na URL http://linux-cz.inecnet.cz/ftp/mc/.

Tyto databáze je nutno zkopírovat termcap do /etc/termcap a terminfo do /usr/lib/terminfo/l/linux a znovu se přihlásit. Ke konverzi mezi zdrojovou a binární podobou terminfo slouží příkazy infocmp a tic. I potom mohou být problémy způsobené tím, že u videoadaptéru VGA jsou znaky s kódy 0xB0 až 0xDF vyhrazeny pro rámečky a VGA při zobrazování zdvojuje pravý sloupec každého z těchto znaků, aby se dosáhlo šířky znaku 9 pixelů, ale u znakových sad ISO-8859-2 jsou na těchto pozicích běžné znaky. Elegantním řešením je použití unikódových fontů Martina Mareše popsaných v kapitole ucw .

Snadné přepínání češtiny a angličtiny

Pokud nepoužíváte klávesnici, která umožňuje přepínání mezi dvěma režimy (čeština nebo slovenština a angličtina), můžete pro přepínání používat následující dva skripty, které zajistí i přepnutí fontů.

Skripty budou samozřejmě fungovat pouze tehdy, budete-li mít nainstalovánu podporu národní klávesnice a ISO-8859-2 znaky pro konzolu. Přitom je nutné pamatovat, že zatímco klávesnice se přepíná pouze pro jednu virtuální konzolu, fonty (není-li použito vtfontd) se přepínají pro všechny.

Český text je i po nastavení správného fontu nečitelný

Příčinou může být, že text je v jiném kódování. Text je třeba překódovat pomocí utility cstocs popsané v kapitole cstocs do kódování ISO-8859-2 a poté jej prohlížet a editovat standardním způsobem. Nebo případně, vznikl-li tento font na jednom z Billových produktů, můžete použít k prohlížení font upravený tak, aby zobrazoval správně české znaky, jak v kódování CP1250 (Windoze), tak i ISO-8859-2 (unixové OS). Tento font opět najdete někde na ftp://ftp.inet.cz/.

Lepší konzolové fonty

Vzhled fontů z balíku kbd je dost špatný, velká písmena s akcenty jsou nižší než bez akcentů, pokud si chce někdo vytvořit vlastní font, může mu pomoci tento popis:

Soubory s fontem jsou umístěny v /usr/lib/kbd/consolefonts. Používají se dva formáty těchto souborů, formát psf, který je popsán v souboru file:/usr/lib/kbd/consolefonts/psffiles.doc, a ještě jednodušší formát, který nepoužívá žádnou hlavičku, a soubory obsahují prostě obrazy všech 256 znaků uložených v pořadí podle kódů znaků. Pro každý znak z fontu je v souboru tolik bytů, kolik bodů je výška fontu (včetně volných řádků nahoře a dole; nejčastěji 8 až 16 bodů), první byte odpovídá hornímu řádku znaku. Každý znak má šířku 8 bodů, nejvyšší bit se zobrazuje vlevo.

Je také možné použít editor fontů chedit, který se nachází na ftp://ftp.fi.muni.cz/pub/linux/apps/misc/chedit.tar.gz. Je poněkud zastaralý a umí editovat pouze fonty ve formátu psf.

Změna qwerty na qwertz

Obě české klávesové mapy, tedy cz-lat2.map i cz-lat2-prog.map, mají standardní rozložení qwerty, jste-li zvyklí na rozložení qwertz, není nic jednoduššího než zaměnit písmenka 'y' a 'z' v klávesové mapě, tedy v souboru cz-lat2.map, případně cz-lat2-prog.map:

...
keycode 21 =
z~...
keycode 44 = y
...

Jediný dvojhmat z Woken, který znám, je Alt+Shift...

Ano, tento dvojhmat je mým prvním stisknutím klávesnice, jestliže jsem nucen sedět u počítače s Billovým OS. (Doufám, že se autoři skutečných operačních systému neurazí.) Slouží k přepnutí se mezi primární a sekundární klávesnicí. Pro některé skalní příznivce firmy SoftMicro jsem přichystal úpravu cz-lat2.map:

upravíme řádek s keycode 42 (klávesa Shift)

keycode 42 = Shift Shift Shift Shift Shift Shift Shift Shift AltGr_Lock\
 Shift AltGr_Lock Shift Shift Shift Shift Shift Shift

...vše samozřejmě na jednom řádku. Potom již bude kombinace LeftShift+LeftAlt fungovat stejně jako klávesa Pause, tedy pro přepínání klávesnic.

Zdroje

Použité materiály


Další Předchozí Obsah