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
:
Seveda
~> sort abc.tex abc abca abd abc ~> LANG=C LC_COLLATE=sl_SI.iso88592 sort abc.tex abc abca abc abd
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 sporocilamsgcmp
, ki primerja dva kataloga sporocilmsgmerge
, zdruzi star preveden katalog sporocil z novim, neprevedenimmsgfmt
, ki prenosen katalog sporocil prevede v binarno oblikomsgunfmt
, obratno od msgfmt
S kratkim zgledom ilustrirajmo, kako poteka pisanje lokaliziranega programa s paketom GNU gettext
.
#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); }
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.
# Slovenski prevod zgleda # Primoz Peterlin, <[email protected]> # 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 <[email protected]>\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"
msgfmt -v -o zgled.mo messages.po
gettext
nasel:
mv zgled.mo /usr/local/share/locale/sl/LC_MESSAGES
gcc -o zgled zgled.c -lintl
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
LANG=C ./zgled LANG=sl ./zgled LC_ALL=sl ./zgled LC_MESSAGES=sl ./zgled LC_CTYPE=sl ./zgled LC_ALL=sl_SI.iso88592 ./zgled
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 <[email protected]>
, nanj se lahko narocite tako, da na naslov 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!