Nazvy locales u glibc (nejen ceskych) a lokalizace vs. X - dlouhe

Vladimir Michl michlv na risc.upol.cz
Pátek Říjen 2 21:10:14 CEST 1998


On Thu, 1 Oct 1998, Petr Kolar wrote:

>    Co kdyz se nastavi cs_CZ.iso88592 a adresar je cs_CZ.ISO-8859-2? Mam 
> pocit, ze byl stejne nalezen. Ale mozna, ze to naslo az adresar cs, coz
> by vzhledem k popsanemu mechanismu nebyl zadny div.

 Myslim ze by to do cs_CZ.ISO-8859-2 vubec nelezlo. Protoze 
cs_CZ.iso88592 neni v aliasech, takze by toto oznaceni pouzil rovnou.
Proto pokud clovek pouzije oznaceni kodovani mel by pouzit jeho 
normalizovany tvar bez -_.

> >  Proc kdyz z aliasu ziskam cs_CZ.ISO8859-2, kde se to oreze?
> 
>    To nevim, ale pri nastaveni LANG=czech a chybejicim (nebo spatnem) radku 
> pro cs_CZ mi netscape hlasil, ze nemuze najit locale cs_CZ pro libX...

 To je divne. Ja jsem si s tim vcera doma trochu hral, a zjistil jsem, ze 
Xovy mechanizmus se velice podobny tomu z libc, tj. napred se hleda v 
aliasech oznaceni z prom. prostredi a podle vysledku se pak postupuje dale
locale.dir, compose.dir. To ze se ti to tak chovalo muze byt zpusobeno 
aliasem v X aliasech. Ja jsem ve svych nasel:

czech	cs_CS.ISO8859-2

a je mozne, ze se po aplikaci aliasu znovu diva, zda to neni alias a to 
opakuje tak dlouho, dokud to alias je.

> >  Pokud bude vse fungovat spravne tak by melo byt zcela jedno, zda 
> > nastavim czech nebo cs, alespon pro glibc. Ovsem otazkou je, zda chci 
> > upravovat locale.alias. Ale nemel by byt takovy problem udelat v nem 
> > zmeny a poslat vyvojarum glibc.
> 
>    To je prave to, co by se podle mne delat NEMELO! Staci se podivat na
> /usr/share/locale/locale.alias jaky je to pekny a konzistentni soubor
> - na rozdil od /usr/X11R6/lib/X11/locale/locale.alias. Myslim, ze neni 
> dobre zaneradit /usr/share/locale/locale.alias spoustou aliasu pro cestinu, 
> kdyz tam pro jine jazyky je jen jeden (nebo dva - danish/dansk).

 To czech se mi nelibi jednak ze programy neumi velice jednoduse zjistit 
spravne oznaceni locale (aliasy a hledani spravneho adresare) a zadruhe 
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.

>    Ted zkusim obhajit svuj navrh: Nevite jestli by fungovalo pokud nekdo 
> bude mit nastavene cs_CZ.unicode a katalogy zprav budou v cs v ISO-8859-2.
> Pak by asi muselo byt v katalogu poznamenano v jakem je kodovani a glibc
> by hlasky vybrane z katalogu v ISO-8859-2 musela pred pouzitim 
> prekonvertovat do unicode.

 Chce se to kouknout do zdrojaku glibc/intl. Ale mam takovy silny dojem, 
ze se proste vezme z katalogu jazykovy ekvivalent zpravy a neupravuje se.
Kodovani v katalogu ulozeno je a to v prvni zpravicce v polozce Content-Type.
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 v cs_CZ.iso88592.
> 
> Pak by asi musely byt i unicodove locales, ne?

 To neni problem. Staci vzit definici cs_CZ a pomoci localedef to 
prelozit. Akorat se misto ISO-8859-2 pouzije ISO10xxx (cislo nevim presne).
Vysledek bude pro unicode.

> > stejny jazyk vice kodovani (tj. bylo by spravcem serveru narizeno jedno),
> > pak je navrzene reseni dobre (tj. katalogy v cs, definice locales v
> > cs_CZ). I kdyz mi trochu vadi nemoznost (alespon teoreticka) pouzivat 
> > zaroven iso88592 a UNICODE. 
> 
>    Myslim, ze glibc je konstruovana tak, aby toto slo (pravdepodobne i 
> takove veci jako treba cestina (nejak orezana) v prostredi ISO-8859-1).

 Staci vytvorit locales a katalogy v ISO-8859-1 a to neni v podstate zadny
problem. Glibc je to jedno jake je kodovani diky algoritmu 
prohledavani adresaru. Staci vhodne nastavit 
promene prostredi (LC_ALL=cs_CZ.ISO-8859-1) a spravne definice umistit do 
/usr/src/locale/cs_CZ.iso88591, pripadne katalogy do cs.iso88591.

> > Ted jeste jak nastavit LC_ALL (nebo podobne). Nastaveni na czech ma 
> > jeden neprijemny dusledek na man a podobne aplikace a na hledani resources 
> > u X. Man bude ceske stranky hledat v adresari /usr/man/czech, misto v 
> > adresari /usr/man/cs nebo /usr/man/cs.iso88592. Taktez resources se budou 
> > hledat v adresarich ./czech/, /usr/lib/X11/czech/app-defaults misto
> > v ./cs/, /usr/lib/X11/cs/app-defaults/ nebo /cs.iso88592/, ...
> 
> Minimalne u manualovych stranek je vyjimka v poradi v jakem se pouzivaji
> LC_ALL, LC_*, LANG - i kdyz nastavite vsechny LC_* na czech a LANG na cs,
> tak se stranky /usr/man/cs najdou. Nezkousel jsem, jak je to u Xresources.
> Man je jenom jeden program, a je mozna spatne...

 Ja jsem se do zdrojaku man nedival, ale je mozne ze preferuje LANG. Po 
experimentech v X jsem narazil na to, ze ony berou pri hledani resources 
pouze promenou LANG. Pokud neni nastavena, tak se o hledani lokalizovanych 
resources ani nepokousi. Ted je otazkou zda to tak ma byt, nebo zda je to 
chyba.

> > Je to z toho duvodu, ze jedine misto, kde muze aplikace sehnat oznaceni 
> > locales je v promenych prostredi, a nikomu se nechce delat slozite 
> > hledani spravneho oznaceni (hledani adresaru, aliasu). Proste vezmou to co 
> > je v promenych prostredi, a pouziji to. Lepe by bylo, pokud by existovala 
> > funkce glibc, ktere by se dodal seznam adresaru, a ona by vratila seznam
> > existujicich adresaru pro dotycny jazyk (napr: /usr/man -> /usr/man/cs,
> > /usr/man/cs.iso88592).
> 
>    Pokud by...
 Mozna az budu mit nekdy cas a naladu, tak bych mohl navrhnout vyvojarum 
libintl (puvodne soucast gettextu, ted uz soucast glibc) toto vylepseni.
Navic by se tim zabyly dve mouchy jednou ranou. Jednak lepsi pristup pro 
aplikace typu man (potreba ruznych adresaru v zavislosti na jazyku)
k lokalizaci a zadruhe by tento kod sel vyuzit zaroven pro hledani 
locales i katalogu (zatim je, pokud jsem dobre videl, pro oboje zvlastni 
kod, ktery je ale uplne stejny). 

> > 2, vice kodovani:
> >    LC_ALL=cs.iso88592
> >    upravit locale.alias, glibc, X11
>              ^^^^^^^^^^^^  ^^^^^

Tady jem to spatne napsal melo byt: upravit locale.alias pro glibc a X11.

> >    katalogy v /usr/share/locale/cs.iso88592
> >    locales v /usr/share/locale/cs_CZ.iso88592
> >    ceske man stranky v /usr/man/cs.iso88592 - prevzato z LC_ALL
> >    ceske resources v /usr/lib/X11/cs.iso88592/app-defaults - LC_ALL
> 
>    Mne prave pripada, ze v pripade locales jsou autori glibc jedini, co 
> vedi, co delaji. Takze bych hledal chyby spise v X, aplikacich, RedHatu
> apod. Take se tim nevysvetluje fakt, ktery u mne vedl k napsani puvodni
> zpravy: proc jsou v RedHatu (jak to vypada jinde - Debian apod.?)
> v /usr/share/locale adresare da a da_DK, es a es_ES, fi a fi_FI, hu a 
> hu_HU, atd. a katalogy zprav jsou v da, es fi, hu apod., zatimco ostatni
> locales v da_DK, es_ES, fi_FI, hu_HU atd.. To snad neni chyba RedHatu, to 
> musi mit nejaky duvod...

 No ja Red Hat nemam, takze mohu pouze posoudit Debinovske reseni.
Ale jeste drive. Definici souboru /usr/share/locale/locale.alias a obsah 
tohoto adresare si podle me resi kazda distribuce zvlast (alespon jsem
zadne doporuceni nikde v glibc nevidel, no ani jsem moc nehledal. Ve 
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.

>    Ale locale v libc spis nefunguji nez funguji (dlouhodobe problemy
> s LC_TIME a tridenim jenom co vim ja).

 Jo, ale co funguje, tak by melo fungovat zhruba na stejnem principu.
Ale pokud clovek chce s lokalizaci pracovat, a na tom se asi shodneme, je 
lepe pouzivat glibc.


Na zaver teto dlouhe odpovedi jeste nekolik zajimavosti z meho 
experimentovani.

Kdyz jsem si hral s tim, kam umistit katalogy (mel jsem pouze jeden 
katalog k manu), tak pokud jsem ho dal do /usr/share/locale/cs/LC_MESSAGES
tak mi man krasne mluvil cesky. Pokud jsem jej umistil do 
/usr/share/locale/cs.iso88592/LC_MESSAGES, tak jiz cesky nemluvil. 
Zajimave na tom je, ze kdyz jsem se pomoci strace podival, kde jej hledal,
zjistil jsem, ze jej dokonce nasel a otevrel.


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

Ted to chovani:
Pokud je definovano X_LOCALE se vlozime <X11/Xlocale.h> a v programu 
nasledne volame setlocale(), tak se spravne nastavi
podpora pro ten konkretni jazyk v X. Bohuzel se neinicializuje podpora v 
glibc a funkce strftime(), isalpha(), ..., nebo hledani 
katalogu nefunguji spravne. Pokud X_LOCALE definovano neni, 
neinicializuje se podpora v X, ale inicializuje s podpora v glibc.
Takze strftime(), isalpha(), katalogy funguji, ale asi bude problem s X 
(input metody se inicializuji na iso8859-1). Jedine reseni jak se mi 
podarilo zprovoznit oboje, je podivat se do X11/Xlocale.h a vysledek 
vidite v testu pri zakomentovanem ORIG_LOCALE.

Nezavisle na tomto se _vzdy_ ceske resources hledali. Jim asi staci, aby 
byla nastavena promena LANG.

Ted by me zajimalo jestli to tak ma byt, nebo zda je to chyba. Podle me 
by to melo fungovat nasledovne:

Neni pouzito setlocale - nehledaji se ani ceske resources.
Je pousuto setlocale - hledaji se ceske resources, inicializuje se 
podpora v X inicializije se podpora v glibc.

Na tech resources bych tak moc netrval.

Mam Debian 2.0 a nevim jak jsou zde kompilovany X. Problem s lokalizaci 
tudiz muze byt zpusoben distribuci. Zajimalo by me, jakq se bude testovaci 
program chovat u Vas. Na chovani je treba pouzit strace a divat se co 
program otevira. Do /usr/lib/X11/locale/C se X program diva vzdy, i kdyz 
pak nastavuje jinou lokalizaci.

					Vlada Michl
**********************************************************************
*  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 1
#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, "")))
	  fprintf(stderr, "I18N: Locale not supported by C library, "
		  "locale unchanged\n");
#ifndef ORIG_LOCALE
	if (!(s = _Xsetlocale(0 /* LC_ALL */, "")))
	  fprintf(stderr, "I18N: Locale not supported by X11 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