Naprej Nazaj Kazalo

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

~> 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. 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.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

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

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 Kazalo