Nazvy locales u glibc (nejen ceskych) a lokalizace vs. X
Vladimir Michl
michlv na risc.upol.cz
Úterý Říjen 6 13:00:11 CEST 1998
On Mon, 5 Oct 1998, Petr Kolar wrote:
> Ne, soubor locale.alias je soucasti glibc (je ve zdrojacich v adresari
> intl).
Uz jsem si take vsiml. Bohuzel Linux mam doma, takze se nemuzu primo
podivat, kdyz na neco narazim.
> > zdrojacich glibc jsem take nevidel zadne locale.alias). To proc maji v
> > Red Hatu neco tak a druhe onak, podle me nema zadny hlubsi smysl. V
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > Debianu je vse tak, ze katalogy jsou v cs, hu, de, ... a locales v cs_CZ,
> ^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^
> > hu_HU, de_DE, ... (oznaceni jsem si zrovna vymyslel). Proc to takhle v
> > Debianu je je snad jasne.
>
> Tady si protirecite. V obou zminenych distribucich je to stejne
> (krome toho, ze v Redhatu se omylem misty nekde pouziva cz misto cs),
> takze si myslim, ze to neni zalezitost distribuce, ale locales a glibc.
Doma jsem se potom dival, a nasel jsem nekolik adresaru xx_XX (asi 3) k nimz
nebyl adresar xx. Kdyz jsem se podival do jednoho adresare xx_XX/LC_MESSAGES
nasel jsem tam pouze jediny soubor SYS_LC_MESSAGES. Takze duvod proc
neexistuji adresare xx je asi ten, ze neexistuji katalogy pro dotycny jazyk.
> Podle toho jak je to ve zdrajacich k X, ve vasem programku, i v kousku,
> ktery posilal Zdenek Kabelac <kabi na fi.muni.cz> dne Mon, 7 Sep 1998 16:54:51
> +0200 (MEST) se Subject: Re: Bug nalezen: isprint() + X11 programovani,
> je videt, ze X aplikace nejdrive nahlednou do normalnich locales a pak do
> Xlocales a pak snad jeste jednou do locales.
Svuj test jsem cerpal prave z pristevku Zdenka Kabelace. Problem je ten,
ze v X11/Xlocale.h se pri nadefinovanem makru X_LOCALE, nadefinuje makro
#define setlocale _Xsetlocale
ktere odstrani puvodni volani setlocale z glibc a misto nej se vola
funkce _Xsetlocale, ve ktere se uz glibc-ove setlocale nevola (strace
na priklad neregistruje zadny pristup do /usr/share/locale). To by pak
melo pusobit (a pusobi) problem s nastavenim prostredi glibc pro dotycny
jazyk. V prikladu je to videt pri tisku datumu.
Ted jak se divam na priklad, tak jedna chybova hlaska je zavadejici:
I18N: Locale not supported by C library, locale unchanged
protoze ona je pravdiva pouze v pripade, kdyz neni definovano X_LOCALE.
Prikladam opravenou verzi.
> > To czech se mi nelibi jednak ze programy neumi velice jednoduse zjistit
> > spravne oznaceni locale (aliasy a hledani spravneho adresare) a zadruhe
>
> O to se snad obvykle postaraji knihovni funkce (vyjimkou je asi
> hledani zminenych Xresources a man stranek).
Prave o ty mi slo.
> > ze czech nevyhovuje norme XPG4. Ve zdrojaku glibc/locale/setlocale.h
> > take uvadi jeste jednu varianu oznaceni a ted si nejsem jist, zda ji to
> > nevyhovuje, ale asi ne.
>
> Kde to nevyhovuje norme XPG4? Jako jmeno locale, nebo jako to, co
> uzivatel nastavuje do promennych prostredi LC_* a LANG (tj. jako alias).
No LC_* a LANG by se meli nastavovat na jazyk[_ZEME[.kodovani]], pricemz
by vse melo byt podle norem. Ale mozna je to pouze moje predstava. Uz si
nepamatuju, kde jsem to cetl.
> > Osobne by me zajimalo jak moc trivialni ci nikoli by byla ta konverze, kdyz
> > uvazime, ze by musela byt univerzalni z jakehokoliv kodovani do unicode.
> > Podle me je to stejne zbytecne. Da se to vyresit velice jednoduse i bez
> > teto konverze.
>
> Locales ale snad obsahuji popis znakove sady ISO-8859-2, takze konverze
> by nemela delat problemy...
No jo, ale popis je v symbolicke podobe v /usr/share/i18n/charmaps.
Jinde v pouzitelne podobe, co ja vim, neni. Pro prekodovani by se definice
znakove sady a UNICODU musela natahnout do pameti a udelat konverzni
tabulku do UNICODE coz zabere cas a pamet. Jinak to resitelne je.
> > Dalsi vec se tyka X. Chovani ktere popisu se projevuje i na prilozenem
> > testovacim programku. Staci jej prelozit nasledovne:
> >
> > gcc -o loctest loctest.c -L/usr/X11R6/lib -lX11
>
> Bohuzel se me ho nedari pod Red hat 5.1 vubec prelozit. Stale mele
> undefined reference to '_Xsetlocale'.
Zkousel jsem ten priklad prelozit pod Digital UNIXem 4.0 a narazil jsem
na stejny problem. Chyba v programu to ale neni. Je to nejaka
nekonzistence mezi X11/Xlocale.h a Xlib. Pokud se zakomentuje X_LOCALE,
pak jde vse prelozit, ma to ale hacek, neinicializuje se lokalizace v X,
aspon me.
Vlada
**********************************************************************
* Name: Vladimir Michl Student of Palacky University *
* E-mail: Vladimir.Michl na upol.cz, MichlV na risc.upol.cz *
* Web: http://www.upol.cz/~michlv *
* Adress: U skoly 292 *
* Velky Tynec *
* 783 72 *
* Czech Republic *
**********************************************************************
------------- další část ---------------
#define ORIG_LOCALE
#define X_LOCALE
#include <stdio.h>
#include <time.h>
#ifdef ORIG_LOCALE
# include <X11/Xlocale.h>
#else
# include <locale.h>
char *_Xsetlocale(int /* category */,const char* /* name */);
#endif
int main(int argc, char **argv)
{
char *s;
char date[50];
time_t tm;
/* Locale setting taken from XtSetLanguageProc */
if (!(s = setlocale(LC_ALL, "")))
#ifdef X_LOCALE
fprintf(stderr, "I18N: Locale not supported by Xlib library, "
"locale unchanged\n");
#else
fprintf(stderr, "I18N: Locale not supported by C library, "
"locale unchanged\n");
#endif
#ifndef ORIG_LOCALE
if (!(s = _Xsetlocale(0 /* LC_ALL */, "")))
fprintf(stderr, "I18N: Locale not supported by Xlib library, "
"locale unchanged\n");
#endif
if (!XSupportsLocale()) {
fprintf(stderr, "I18N: Locale not supported by Xlib, "
"locale set to C\n");
s = setlocale(LC_ALL, "C");
}
if (!XSetLocaleModifiers(""))
fprintf(stderr, "I18N: X locale modifiers not supported, "
"using default\n");
tm = time(NULL);
strftime(date, 50, "%c", localtime(&tm));
printf("%s\n", date);
}
Další informace o konferenci Linux