Naprej Nazaj Vsebina

5. Slovenski locale

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_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:

~> sort abc.tex 
abc
abca
abd
abč
~> LANG=C LC_COLLATE=sl_SI.iso88592 sort abc.tex
abc
abca
abč
abd
Seveda 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.iso88592
Določ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

5.1 Programiranje z GNU gettext

Paket GNU gettext ponuja nekaj orodij za lokalizacijo:

S kratkim zgledom ilustrirajmo, kako poteka pisanje lokaliziranega programa s paketom GNU gettext.

  1. Najprej napišemo program zgled.c. Pri pisanju programa že vključimo 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);
    }
    

  2. Z ukazom xgettext iz izvorne kode izluščimo izpise na zaslon:
    xgettext zgled.c
    S tem smo ustvarili datoteko messages.po. To je običajna besedilna datoteka, ki vsebuje skelet prevodov sporočil.
  3. Datoteko messages.po z urejevalnikom dopolnimo s prevodi, recimo takole:
    # 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"
    

  4. Popravljeno prenosljivo datoteko s sporočili (angl. portable message file) messages.po prevedemo v binarno obliko:
    msgfmt -v -o zgled.mo messages.po
  5. Binarno datoteko prestavimo v imenik, kjer jo bo gettext našel:
    mv zgled.mo /usr/local/share/locale/sl/LC_MESSAGES
  6. Program prevedemo in povežemo s knjižnico libintl.a:
    gcc -o zgled zgled.c -lintl
  7. Pa poskusimo, kakšna 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 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 kategorijo 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

5.2 Poslovenjenje katalogov sporočil

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=sl
bodo 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

subscribe
v 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!


Naprej Nazaj Vsebina