<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> <HEAD> <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9"> <TITLE>Slovenian HOWTO: Slovenski locale</TITLE> <LINK HREF="Slovenian-HOWTO-6.html" REL=next> <LINK HREF="Slovenian-HOWTO-4.html" REL=previous> <LINK HREF="Slovenian-HOWTO.html#toc5" REL=contents> </HEAD> <BODY> <A HREF="Slovenian-HOWTO-6.html">Next</A> <A HREF="Slovenian-HOWTO-4.html">Previous</A> <A HREF="Slovenian-HOWTO.html#toc5">Contents</A> <HR> <H2><A NAME="locale"></A> <A NAME="s5">5. Slovenski locale</A></H2> <P>Z izrazom <EM>locale</EM> oznacujemo skupek lastnosti programskega okolja, odvisnih od jezikovnega in kulturnega okolja uporabnika. Mednje sodi informacija o tem, kateri znaki so crke in kaksen je njihov vrstni red, nacin izpisa datuma in ure, izbiro locila v zapisu decimalnih stevil (vejica oz. pika), zapis valute in sporocila programov uporabniku. <P>Programski vmesnik za internacionalizacijo in lokalizacijo na sistemih, zdruzljivih s standardi POSIX, je definiran v standardu ISO/IEC 9899 (Programski jezik ISO C) ter IEEE 1003.2 (POSIX.2). Informacije, pomembne za lokalizacijo, razvrsca v sest kategorij: <UL> <LI><CODE>LC_CTYPE</CODE> (znaki, ki predstavljajo abecedo)</LI> <LI><CODE>LC_COLLATE</CODE> (vrstni red znakov v abecedi)</LI> <LI><CODE>LC_TIME</CODE> (izpis datuma in ure)</LI> <LI><CODE>LC_NUMERIC</CODE> (izpis stevilcnih vrednosti)</LI> <LI><CODE>LC_MONETARY</CODE> (izpis valute)</LI> <LI><CODE>LC_MESSAGES</CODE> (komunikacije z uporabnikom)</LI> </UL> <P><CODE>LC_ALL</CODE> zajema vseh nastetih sest kategorij. Medtem ko projekt GNU pri izvedbi prvih petih kategorijah zvesto sledi standardu, se je v sesti odlocil za njegovo razsiritev. Standardizacijski komite se namrec ni mogel zediniti okrog izvedbe ravnanja s prevodi sporocil, zato je standard v tej tocki prakticno neuporaben: doloca le prevode za ``da'' in ``ne''. Projekt GNU je zato razvil svojo metodo, to je paket GNU <CODE>gettext</CODE>. Prevedeni katalogi sporocil, ki jih uporablja mehanizem <CODE>gettext</CODE> se navadno nahajajo v podimenikih imenika /usr/share/locale/. <P>Sledi nekaj primerov odziva poslovenjenega sistema. Primeri so pobrani s HP-UX, ker je lokalizacija Linuxa zaenkrat se v teku -- knjiznica GNU libc 2.0 in kasnejse izpeljanke sicer ze ponujajo okvir za lokalizacijo, izvedba pa zaenkrat se zaostaja, zato koncepta zaenkrat se ne moremo ilustrirati s programi iz paketov <CODE>textutils</CODE>, <CODE>fileutils</CODE> ipd. <P>Z nastavitvijo spremenljivke <CODE>LANG</CODE> na slovenski locale se spremenijo vsi prilastki: <BLOCKQUOTE><CODE> <PRE> ~> date Sat Oct 19 22:32:04 METDST 1996 ~> LANG=sl_SI.iso88592 date Sob, 19 okt 1996 22:32:04 </PRE> </CODE></BLOCKQUOTE> <P>Lahko pa jih spreminjamo tudi vsakega posebej. Ce zelimo obdrzati angleske izpise, obliko datuma, decimalno piko ipd., zeleli pa bi, da gre urejanje crk po slovenski abecedi, spremenimo samo <CODE>LC_COLLATE</CODE>: <BLOCKQUOTE><CODE> <PRE> ~> sort abc.tex abc abca abd abc ~> LANG=C LC_COLLATE=sl_SI.iso88592 sort abc.tex abc abca abc abd </PRE> </CODE></BLOCKQUOTE> Seveda <CODE>LC_COLLATE</CODE> ne resi vseh problemov v zvezi z urejanjem. Pri razvrscanju kastiljskih kraljev bi, recimo, zeleli, da pride Alfonz IX. za Alfonzem VIII. in pred Alfonzem X. Kar pa je verjetno ze problem za umetno inteligenco... <P>Spremenljivka <CODE>LANG</CODE> ima v splosnem obliko: <BLOCKQUOTE> <CODE>LANG=<EM>jezik</EM>[_<EM>drzava</EM>[.<EM>nabor</EM>]]</CODE> </BLOCKQUOTE> Pri tem je <EM>jezik</EM> dvocrkovna koda jezika, kot jo doloca standard <A HREF="http://sizif.mf.uni-lj.si/linux/cee/std/ISO_639.html">ISO 639</A>, <EM>drzava</EM> pa dvocrkovna koda drzave, dolocena s standardom <A HREF="http://sizif.mf.uni-lj.si/linux/cee/std/ISO_3166.html">ISO 3166</A>. Zgled za slovenscino, kot se govori v Sloveniji in pise s kodnim naborom ISO 8859-2, je torej <BLOCKQUOTE><CODE> LANG=sl_SI.iso88592 </CODE></BLOCKQUOTE> Dolocitev drzave in nabora znakov je neobvezna (pomembna je seveda pri jezikih, ki se govorijo v vec drzavah; kaksen locale uporabljajo Slovenci v zamejstvu, je piscu teh vrstic neznano), tako lahko pisemo na kratko <BLOCKQUOTE><CODE> LANG=sl </CODE></BLOCKQUOTE> <P> <H2><A NAME="prog-intl"></A> <A NAME="ss5.1">5.1 Programiranje z GNU gettext</A> </H2> <P>Paket GNU <CODE>gettext</CODE> ponuja nekaj orodij za lokalizacijo: <UL> <LI><CODE>xgettext</CODE>, ki iz izvorne kode izlusci sporocila</LI> <LI><CODE>msgcmp</CODE>, ki primerja dva kataloga sporocil</LI> <LI><CODE>msgmerge</CODE>, zdruzi star preveden katalog sporocil z novim, neprevedenim</LI> <LI><CODE>msgfmt</CODE>, ki prenosen katalog sporocil prevede v binarno obliko</LI> <LI><CODE>msgunfmt</CODE>, obratno od <CODE>msgfmt</CODE></LI> </UL> <P>S kratkim zgledom ilustrirajmo, kako poteka pisanje lokaliziranega programa s paketom GNU <CODE>gettext</CODE>. <P> <OL> <LI>Najprej napisemo program zgled.c. Pri pisanju programa ze vkljucimo mehanizme internacionalizacije: <HR> <PRE> #include <locale.h> #include <stdio.h> #include <libintl.h> #define PACKAGE "zgled" #define LOCALEDIR "/usr/local/share/locale" char main() { setlocale (LC_MESSAGES, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); printf("%s\n", gettext("This is a short example.")); printf("%s\n", gettext("Author: Primoz Peterlin")); return(0); } </PRE> <HR> </LI> <LI>Z ukazom <CODE>xgettext</CODE> iz izvorne kode izluscimo izpise na zaslon: <BLOCKQUOTE><CODE> xgettext zgled.c </CODE></BLOCKQUOTE> S tem smo ustvarili datoteko messages.po. To je obicajna besedilna datoteka, ki vsebuje skelet prevodov sporocil. </LI> <LI>Datoteko messages.po z urejevalnikom dopolnimo s prevodi, recimo takole: <HR> <PRE> # Slovenski prevod zgleda # Primoz Peterlin, <primoz.peterlin@biofiz.mf.uni-lj.si> # msgid "" msgstr "" "Project-Id-Version: zgled 1.0\n" "POT-Creation-Date: 1998-12-06 14:05:53+0100\n" "PO-Revision-Date: 1998-12-06 15:00:00+0100\n" "Last-Translator: Primoz Peterlin <peterlin@biofiz.mf.uni-lj.si>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-2\n" "Content-Transfer-Encoding: 8bit\n" "Xgettext-Options: \n" "Files: zgled.c\n" #: zgled.c:13 msgid "This is a short example." msgstr "To je kratek zgled." #: zgled.c:14 msgid "Author: Primoz Peterlin" msgstr "Avtor: Primoz Peterlin" </PRE> <HR> </LI> <LI>Popravljeno prenosljivo datoteko s sporocili (angl. portable message file) messages.po prevedemo v binarno obliko: <BLOCKQUOTE><CODE> msgfmt -v -o zgled.mo messages.po </CODE></BLOCKQUOTE> </LI> <LI>Binarno datoteko prestavimo v imenik, kjer jo bo <CODE>gettext</CODE> nasel: <BLOCKQUOTE><CODE> mv zgled.mo /usr/local/share/locale/sl/LC_MESSAGES </CODE></BLOCKQUOTE> </LI> <LI>Program prevedemo in povezemo s knjiznico libintl.a: <BLOCKQUOTE><CODE> gcc -o zgled zgled.c -lintl </CODE></BLOCKQUOTE> </LI> <LI>Pa poskusimo, kaksna je razlika! <BLOCKQUOTE><CODE> <PRE> LANG=C ./zgled LANG=sl ./zgled LC_ALL=sl ./zgled LC_MESSAGES=sl ./zgled LC_CTYPE=sl ./zgled LC_ALL=sl_SI.iso88592 ./zgled </PRE> </CODE></BLOCKQUOTE> V prvem in zadnjem primeru je izpisano sporocilo anglesko, v predzadnjem pa verjetno tudi. V prvem zato, ker smo eksplicitno zahtevali locale ``C'', v zadnjem pa zato, ker smo zahtevali locale ``sl_SI.iso88592'', v katerem ni prevoda sporocil -- to namrec obstaja za locale ``sl''. V predzadnjem zgledu smo uporabili pravi locale, a irelevantno kategorijo <CODE>LC_CTYPE</CODE> namesto uporabljene <CODE>LC_MESSAGES</CODE>. </LI> </OL> <P>Se dve opombi: imenik, kamor prestavimo katalog sporocil, se mora ujemati z imenikom <CODE>LOCALEDIR</CODE>, navedenim v izvorni kodi. Tezavo, da GNU <CODE>gettext</CODE> razume ``sl'' in ``sl_SI.iso88592'' kot razlicna locala, je pisec teh vrstic resil z simbolno povezavo v imeniku /usr/local/share/locale: <BLOCKQUOTE><CODE> ln -s sl sl_SI.iso88592 </CODE></BLOCKQUOTE> <P> <H2><A NAME="gnu-intl"></A> <A NAME="ss5.2">5.2 Poslovenjenje katalogov sporocil</A> </H2> <P>V teku je internacionalizacija projekta GNU (programi iz projekta GNU predstavljajo znaten del celotnega sistema Linux in vecino tistega, s cimer se sooca koncni uporabnik). Trenutno so v slovenscino ze prevedena sporocila za naslednje pakete GNU: <CODE>enscript</CODE>, <CODE>fileutils</CODE>, <CODE>gettext</CODE>, <CODE>grep</CODE>, <CODE>hello</CODE>, <CODE>recode</CODE> in <CODE>tar</CODE>. Z nastavitvijo spremenljivke okolja <BLOCKQUOTE><CODE> LANG=sl </CODE></BLOCKQUOTE> bodo programi iz teh paketov izpisovali slovenska sporocila namesto angleskih. <P>Razprava o poslovenjenju projekta GNU poteka med prejemniki elektronskega spiska <CODE><sl@li.org></CODE>, nanj se lahko narocite tako, da na naslov <A HREF="mailto:sl-request@li.org">sl-request@li.org</A> posljete vrstico <BLOCKQUOTE><CODE> subscribe </CODE></BLOCKQUOTE> v telesu sporocila. <P>Pomoc prostovoljcev, ki bi prevedli preostale pakete, ali pa se samo zavezali za vzdrzevanje ze prevedenih, je nadvse zazelena. Vabljeni! <P> <HR> <A HREF="Slovenian-HOWTO-6.html">Next</A> <A HREF="Slovenian-HOWTO-4.html">Previous</A> <A HREF="Slovenian-HOWTO.html#toc5">Contents</A> </BODY> </HTML>