|
Next
Previous
Contents
Z izrazom locale 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.
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:
LC_CTYPE (znaki, ki predstavljajo abecedo)
LC_COLLATE (vrstni red znakov v abecedi)
LC_TIME (izpis datuma in ure)
LC_NUMERIC (izpis stevilcnih vrednosti)
LC_MONETARY (izpis valute)
LC_MESSAGES (komunikacije z uporabnikom)
LC_ALL 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 gettext . Prevedeni katalogi sporocil, ki jih
uporablja mehanizem gettext se navadno nahajajo v podimenikih
imenika /usr/share/locale/.
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 textutils ,
fileutils ipd.
Z nastavitvijo spremenljivke LANG na slovenski locale se
spremenijo vsi prilastki:
~> date
Sat Oct 19 22:32:04 METDST 1996
~> LANG=sl_SI.iso88592 date
Sob, 19 okt 1996 22:32:04
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
LC_COLLATE :
~> sort abc.tex
abc
abca
abd
abc
~> LANG=C LC_COLLATE=sl_SI.iso88592 sort abc.tex
abc
abca
abc
abd
Seveda LC_COLLATE 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...
Spremenljivka LANG ima v splosnem obliko:
LANG=jezik[_drzava[.nabor]]
Pri tem je jezik dvocrkovna koda jezika, kot jo doloca
standard
ISO 639, drzava pa dvocrkovna koda drzave,
dolocena s standardom
ISO 3166.
Zgled za slovenscino, kot se govori v Sloveniji in pise s kodnim
naborom ISO 8859-2, je torej
LANG=sl_SI.iso88592
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
LANG=sl
Paket GNU gettext ponuja nekaj orodij za lokalizacijo:
xgettext , ki iz izvorne kode izlusci sporocila
msgcmp , ki primerja dva kataloga sporocil
msgmerge , zdruzi star preveden katalog sporocil z
novim, neprevedenim
msgfmt , ki prenosen katalog sporocil prevede v binarno
obliko
msgunfmt , obratno od msgfmt
S kratkim zgledom ilustrirajmo, kako poteka pisanje lokaliziranega
programa s paketom GNU gettext .
- Najprej napisemo program zgled.c. Pri pisanju
programa ze vkljucimo mehanizme internacionalizacije:
#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);
}
- Z ukazom
xgettext iz izvorne kode izluscimo izpise na
zaslon:
xgettext zgled.c
S tem smo ustvarili datoteko messages.po. To je obicajna
besedilna datoteka, ki vsebuje skelet prevodov sporocil.
- Datoteko messages.po z urejevalnikom dopolnimo s
prevodi, recimo takole:
# 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"
- Popravljeno prenosljivo datoteko s sporocili (angl. portable
message file) messages.po prevedemo v binarno obliko:
msgfmt -v -o zgled.mo messages.po
- Binarno datoteko prestavimo v imenik, kjer jo bo
gettext nasel:
mv zgled.mo /usr/local/share/locale/sl/LC_MESSAGES
- Program prevedemo in povezemo s knjiznico libintl.a:
gcc -o zgled zgled.c -lintl
- Pa poskusimo, kaksna je razlika!
LANG=C ./zgled
LANG=sl ./zgled
LC_ALL=sl ./zgled
LC_MESSAGES=sl ./zgled
LC_CTYPE=sl ./zgled
LC_ALL=sl_SI.iso88592 ./zgled
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 LC_CTYPE namesto uporabljene
LC_MESSAGES .
Se dve opombi: imenik, kamor prestavimo katalog sporocil, se mora
ujemati z imenikom LOCALEDIR , navedenim v izvorni
kodi. Tezavo, da GNU gettext razume ``sl'' in
``sl_SI.iso88592'' kot razlicna locala, je pisec teh vrstic resil z
simbolno povezavo v imeniku /usr/local/share/locale:
ln -s sl sl_SI.iso88592
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:
enscript , fileutils , gettext ,
grep , hello , recode in tar .
Z nastavitvijo spremenljivke okolja
LANG=sl
bodo programi iz teh paketov izpisovali slovenska sporocila
namesto angleskih.
Razprava o poslovenjenju projekta GNU poteka med prejemniki
elektronskega spiska <sl@li.org> , nanj se lahko
narocite tako, da na naslov
sl-request@li.org posljete vrstico
subscribe
v telesu sporocila.
Pomoc prostovoljcev, ki bi prevedli preostale pakete, ali pa se
samo zavezali za vzdrzevanje ze prevedenih, je nadvse zazelena.
Vabljeni!
Next
Previous
Contents
|