Začal jsem pátrat po příčinách této chyby. Zjistil jsem, že stejným způsobem se chová i program Pidgin (dříve Gaim). Tady existuje možnost, jak kontrolu pravopisu uschopnit. Jde to pomocí zásuvného modulu (pluginu) switch spell, který je pro distribuci Fedora obsažen v rpm balíčku purple-plugin_pack-pidgin. Tento plugin je primárně určený pro přepínání jazyka kontroly pravopisu při komunikaci v jiném jazyku než je nastaven v systému.
Oba tyto programy, Tomboy i Pidgin, využívají pro kontrolu pravopisu knihovnu GtkSpell. Tato knihovna umožňuje provádět kontrolu pravopisu v GtkTextView widgetu. Ve zdroji gtkspell.c v poslední revizi 1.26 jsem našel část (řádky 496-504) týkající se rozpoznání jazyka podle environment proměnné LANG. Příkaz na řádku 499 způsobí, že nedojde ke správnému rozpoznání všech jazyků začínajících písmenem 'c' nebo 'C'. Mezi nimi je i cs_CZ - čeština. Uvedený příkaz byl původně zamýšlen jako pojistka proti špatně zadané hodnotě proměnné LANG a její následné změně v GTK-knihovnách na implicitní hodnotu 'C' (viz. hlášení při chybné hodnotě proměnné LANG: Gtk-WARNING **: Locale not supported by C library. Using the fallback 'C' locale.). Bohužel takovýto chybný zápis způsobí nesprávnou identifikaci všech jazyků začínajících písmenem 'c' a nastavení jazyka pro kontrolu pravopisu na angličtinu.
if (lang == NULL) { lang = g_getenv("LANG"); if (lang) { if (g_strncasecmp(lang, "C", 1) == 0) lang = NULL; else if (lang[0] == 0) lang = NULL; } }
Kontrolou ostatních revizí zdrojového kódu gtkspell.c jsem zjistil, že toto chybné rozpoznání jazyka se táhne všemi revizemi od počátku uvedení kódu. Znamená to tedy, že se při použití knihovny GtkSpell nikdy správně nerozpoznala čeština. Pokud tedy někdy diakritika v programech Tomboy nebo Pidgin, či ostatních programech založených na Gtk a kontrole pravopisu pomocí knihovny GtKSpell, fungovala, muselo to být tím, že pro kontrolu pravopisu byl použitý jiný způsob než knihovna GtkSpell.
Oprava tohoto problému je možná úpravou zdrojového kódu gtkspell.c a následným přeložením knihovny GtkSpell. Vzhledem k závislosti na balíčcích GTK+ 2 a Enchant jsem se rozhodl pro jednoduchou opravu přímého patche knihovny /usr/lib/libgtkspell.so.0.0.0 v jejím binárním formátu. Nahradil jsem znak 'C'
Update - 15.5.2009: Oprava již existuje od 18.2.2009, ale dosud se neprojevila mezi aktualizacemi.
Žádné komentáře:
Okomentovat