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