old-www/HOWTO/Slovenian-HOWTO-5.html

273 lines
9.0 KiB
HTML

<!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 &lt;locale.h>
#include &lt;stdio.h>
#include &lt;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, &lt;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 &lt;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>&lt;sl@li.org&gt;</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>