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 v tej
izdaji spisa HOWTO so že preverjeni in pobrani z Linuxa (paketi GNU
textutils
, fileutils
ipd.), ki pa mora imeti
nameščeno knjižnico GNU libc 2.0 ali kasnejšo izdajo. Če katerega od
primerov pisec ni uspel preveriti na Linuxu, je na to posebej
opozorjeno.
Z nastavitvijo spremenljivke LANG
ali LC_ALL
na
slovenski locale se spremenijo vsi prilastki, spreminjamo pa jih lahko
tudi vsakega posebej:
~> cal February 2000 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ~> date Sun Feb 13 20:16:07 CET 2000 ~> LC_ALL=sl_SI.iso88592 cal februar 2000 ne po to sr pe so 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ~> LC_TIME=sl_SI date ned feb 13 20:16:22 CET 2000
Lahko pa jih spreminjamo tudi vsakega posebej. Če bi želili obdržati
angleške izpise, obliko datuma, decimalno piko ipd., želeli pa
bi, da gre urejanje črk po slovenski abecedi, bi spremenili samo
LC_COLLATE
(urejanje po izkušnjah pisca z GNU libc 2.1 še
vedno ne deluje):
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. Prepoznavanje takih
primerov 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
Vsaj tako naj bi bilo v teoriji. Praksa na Linuxu se navadno majčkeno
razlikuje: v imeniku /usr/share/locale/sl so shranjeni
samo katalogi sporočil iz kategorije LC_MESSAGES
, podatki iz
vseh ostalih kategorij pa so v imeniku
/usr/share/locale/sl_SI. Zaradi tega moramo postaviti
spremenljivko LANG
(ali LC_ALL
) na vrednost
sl_SI
(ali sl_SI.iso88592
), spremenljivko
LC_MESSAGES
pa na sl
:
LANG=sl_SI LC_MESSAGES=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 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 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!