Z izrazom locale označujemo skupek lastnosti programskega okolja, odvisnih od jezikovnega in kulturnega okolja uporabnika. Mednje sodi informacija o tem, kateri znaki so črke in kakšen je njihov vrstni red, način izpisa datuma in ure, izbiro ločila v zapisu decimalnih števil (vejica oz. pika), zapis valute in sporočila programov uporabniku.
Programski vmesnik za internacionalizacijo in lokalizacijo na sistemih, združljivih s standardi POSIX, je definiran v standardu ISO/IEC 9899 (Programski jezik ISO C) ter IEEE 1003.2 (POSIX.2). Informacije, pomembne za lokalizacijo, razvršča v šest kategorij:
LC_CTYPE (znaki, ki predstavljajo abecedo)LC_COLLATE (vrstni red znakov v abecedi)LC_TIME (izpis datuma in ure)LC_NUMERIC (izpis številčnih vrednosti)LC_MONETARY (izpis valute)LC_MESSAGES (komunikacije z uporabnikom)LC_ALL zajema vseh naštetih šest kategorij. Medtem ko projekt
GNU pri izvedbi prvih petih kategorijah zvesto sledi standardu, se je
v šesti odločil za njegovo razširitev. Standardizacijski komite se
namreč ni mogel zediniti okrog izvedbe ravnanja s prevodi sporočil,
zato je standard v tej točki praktično neuporaben: določa le prevode
za ``da'' in ``ne''. Projekt GNU je zato razvil svojo metodo, to je
paket GNU gettext. Prevedeni katalogi sporočil, 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 še v teku -- knjižnica
GNU libc 2.0 in kasnejše izpeljanke sicer že ponujajo okvir za
lokalizacijo, izvedba pa zaenkrat še zaostaja, zato koncepta zaenkrat
še 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. Če želimo obdržati
angleške izpise, obliko datuma, decimalno piko ipd., želeli pa
bi, da gre urejanje črk po slovenski abecedi, spremenimo samo
LC_COLLATE:
Seveda~> sort abc.tex abc abca abd abč ~> LANG=C LC_COLLATE=sl_SI.iso88592 sort abc.tex abc abca abč abd
LC_COLLATE ne reši vseh problemov v zvezi z urejanjem.
Pri razvrščanju kastiljskih kraljev bi, recimo, želeli, da pride Alfonz IX.
za Alfonzem VIII. in pred Alfonzem X. Kar pa je verjetno že problem za
umetno inteligenco...
Spremenljivka LANG ima v splošnem obliko:
LANG=jezik[_država[.nabor]]
Pri tem je jezik dvočrkovna koda jezika, kot jo določa
standard
ISO 639, država pa dvočrkovna koda države,
določena s standardom
ISO 3166.
Zgled za slovenščino, kot se govori v Sloveniji in piše s kodnim
naborom ISO 8859-2, je torej
LANG=sl_SI.iso88592Določitev države in nabora znakov je neobvezna (pomembna je seveda pri jezikih, ki se govorijo v več državah; kakšen locale uporabljajo Slovenci v zamejstvu, je piscu teh vrstic neznano), tako lahko pišemo na kratko
LANG=sl
Paket GNU gettext ponuja nekaj orodij za lokalizacijo:
xgettext, ki iz izvorne kode izlušči sporočilamsgcmp, ki primerja dva kataloga sporočilmsgmerge, združi star preveden katalog sporočil z
novim, neprevedenimmsgfmt, ki prenosen katalog sporočil prevede v binarno
oblikomsgunfmt, obratno od msgfmtS 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 izluščimo izpise na
zaslon:
xgettext zgled.cS tem smo ustvarili datoteko messages.po. To je običajna besedilna datoteka, ki vsebuje skelet prevodov sporočil.
# Slovenski prevod zgleda # Primož 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: Primož Peterlin"
msgfmt -v -o zgled.mo messages.po
gettext našel:
mv zgled.mo /usr/local/share/locale/sl/LC_MESSAGES
gcc -o zgled zgled.c -lintl
V prvem in zadnjem primeru je izpisano sporočilo angleško, 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 sporočil -- to namreč obstaja za locale ``sl''. V predzadnjem zgledu smo uporabili pravi locale, a irelevantno kategorijoLANG=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.
Še dve opombi: imenik, kamor prestavimo katalog sporočil, se mora
ujemati z imenikom LOCALEDIR, navedenim v izvorni
kodi. Težavo, da GNU gettext razume ``sl'' in
``sl_SI.iso88592'' kot različna locala, je pisec teh vrstic rešil 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 večino
tistega, s čimer se sooča končni uporabnik). Trenutno so v
slovenščino že prevedena sporočila za naslednje pakete GNU:
enscript, fileutils, gettext,
grep, hello, recode in tar.
Z nastavitvijo spremenljivke okolja
LANG=slbodo programi iz teh paketov izpisovali slovenska sporočila namesto angleških.
Razprava o poslovenjenju projekta GNU poteka med prejemniki
elektronskega spiska <sl@li.org>, nanj se lahko
naročite tako, da na naslov
sl-request@li.org pošljete vrstico
subscribev telesu sporočila.
Pomoč prostovoljcev, ki bi prevedli preostale pakete, ali pa se samo zavezali za vzdrževanje že prevedenih, je nadvse zaželena. Vabljeni!