Lokalizacija

Uvod

Namjena ovog dokumenta je da opise osnovne korake oko lokalizacije open source programa.

Što je lokalizacija ?

Lokalizacija je operacija kojom se već internacionalizirani softver prilagodjava jezicnom i kulturnom okolisu korisnika. Iako se lokalizacija većinom sastoji u prevodjenju softvera na "domaći" jezik ona takodjer ukljucuje i prilagodjavanje raznih drugih tehnikalija poput prikaza datuma (datum 20.12.1999. u Americi ce biti prikazan kao 12/20/1999 ili Japanu 1999/12/20), redoslijed abecede itd. Skup pravila i prijevoda se obicno naziva lokal (na engleskom locale).

Čemu lokalizacija ?

Dosta ljudi će se priupitati "Čemu lokalizacija ? Ja izvrsno poznajem engleski." Odgovor je da vecina korisnika softvera ipak ne zna engleski dovoljno dobro ili ne zna uopce. I njima je potrebno dozvoliti da uzivaju blagodati softvera. Takodjer vecini ljudi koji i znaju engleski puno je draze vidjeti naredbe ili tekstove na vlastitom jeziku umjesto na engleskom.

Što je GNU gettext ?

GNU gettext je skup alata i usluznih programa koji se koristi kod lokalizacije softvera. Primarno je namjenjen projektima razvoja open source softvera.

Jedan od glavnih ciljeva GNU gettexta je da omoguci programerima da sto lakse dodaju internacionalnu podrsku u svoje programe. Drugi cilj je da lokalizatorima omoguci sto lakse dodavanje novih lokalizacija. Primjerice nijedan program koji podrzava GNU gettext nije potrebno rekompilirati ako zelimo dodati novu lokalizaciju.

Kako je specificiranje oblika datuma, redoslijeda abecede itd. posao koji je samo jednom potrebno napraviti za odredjeni lokal u daljnjem tekstu fokusirati cemo se na prevodjenje programa buduci da je to najzahtjevniji dio posla.

Kako ukljuciti podršku za lokalizaciju u moj program ?

Ukljucivanje podrske za lokalizaciju u C/C++ sastoji se od 3 koraka
 
  • Ukljucivanje podrske za lokalizaciju u svaki programski modul

  •  

     

    To ce te uciniti tako da na pocetku svake datoteku dodate

    #include <libintl.h>
  • Inicijalizacija podataka lokala

  •  

     

    Inicijalizacija je ista u gotovo svim programima i postize se sa slijedecim kodom

    int
    main (argc, argv)
    int argc;
    char argv;
    {
      ...
      setlocale (LC_ALL, ""); 
      bindtextdomain (PACKAGE, LOCALEDIR);
      textdomain (PACKAGE);
    ...
    }
    PACKAGE i LOCALEDIR moraju biti specificirani ili u config.h ili Makefileu.
     
  • Oznacavanje prijevoda u izvornom kodu

  •  

     

    Nakon svega potrebno je oznaciti sve izraze koje je potrebno prevesti. Naime programer moze odluciti koje prijevode je potrebno prevesti a koje ne. Za detaljne upute kako to uciniti procitajte GNU gettext upute.

    Pocetno prevodjenje

    Prevodjenje internacionaliziranih programa uistinu je jednostavno. Pomocu xgettext programa svaki internacionalizirani program stvoriti ce jednu ili vise tzv. PO template datoteka (.pot). PO template datoteka je predlozak sa popisom svih fraza koje se koriste u programu koje je potrebno prevesti. Nakon sto se datoteka prevede ona gubi T (template) buduci da vise nije predlozak nego stvarni prijevod pa se tada naziva PO datotekom.

    Prvi korak kod prevodjenja sastoji se u uredjenju zaglavlja. Zaglavlje sadrzi osnove informacijama o PO datoteci kao primjerice zaglavlje jedne od PO datoteka koristene u sklopu KDE (Kool Desktop Environment http://www.kde.org ) lokalizacije.

    # Copyright (C) 1998 Free Software Foundation, Inc. 
    # Vladimir Vuksan , 1998. 
    # 
    msgid "" 
    msgstr "" 
    "Project-Id-Version: kdebase\n" 
    "POT-Creation-Date: 1999-01-15 01:15+0100\n" 
    "PO-Revision-Date: 1998-11-22 20:00-0500\n" 
    "Last-Translator: Vladimir Vuksan \n" 
    "Language-Team: Croatian \n" 
    "MIME-Version: 1.0\n" 
    "Content-Type: text/plain; charset=iso-8859-2\n" 
    "Content-Transfer-Encoding: 8bit\n"
    Znaci zaglavlje sadrzi informacije o prvom prevodiocu, zadnjim prevodiocima, kada je datoteka prevedena, kada je POT datoteka stvorena, kojim se skupom znakova koristimo itd. Vaznost ovih informacija je da pruzi nekome drugome uvid u to kakve su osnovne znacajke hrvatskog lokala i da omoguci bilo kome da direktno kontaktira prevodioca u slucaju da je nesto potrebno ispraviti.

    Daljnji dio datoteke sastojati ce se od parova slijedeceg oblika

    msgid "Open File"
    msgstr ""
    msgid je izraz na izvornom jeziku u kojem je program napisan (obicno engleski) dok je msgstr izraz na ciljanom jeziku (npr. na hrvatskom). Primjerice u gornjem slucaju upisali bi "Otvori datoteku" umjesto "" npr.
    msgid "Open File"
    msgstr "Otvori datoteku"
    U nekim slučajevima tekst će se protezati na više redaka. npr.

    msgid ""
    "There is no command enabled\n"
    "in the configuration file.\n"
    "\n"

    U tom slucaju moramo pratiti format kakav je u orginalnom prijevodu i nas tekst prelomiti na doticni broj linija npr.

    msgstr ""
    "Nijedna komanda iz konfiguracijske\n"
    "datoteke nije uključena\n"
    "\n"
    Treći slučaj je kada se kao dio prijevoda koriste varijable. Npr. ako autor programa zeli ispisati tekući datum on/a će iskoristiti slijedeću konstrukciju
    msgid "Date: %s"
    Naš prijevod bi naravno u tom slučaju bio
    msgstr "Datum: %s"
    Jedan od razloga zašto autor primjerice nije samo stavio "Date: " i onda direktno u kodu pozivao datum je da razni jezici imaju razne formate za prikazivanje datuma. Primjerice u hrvatskom jeziku mi mozemo reći "Datum je: xxx" ili "xxx je današnji datum". Neki drugi jezici mogu iskoristiti drugi format pa je prilikom programiranja uputno uzeti u obzir i druge jezike čija je jezična sintaksa drugačija.

    Obnavljanje prijevoda

    Nazalost nakon inicijalnog prevodjenja posao s lokalizacijom nije gotov. Naime ukoliko autor programa odluči promijeniti dio programa ili odluci dodati novi dio, previodioc ce morati obnoviti prijevode. Primjerice prilikom svake promjene xgettext će sve "upitne" prijevode označiti komentarom fuzzy. Fuzzy znači da gettext nije potpuno siguran da li je promjenom programa promijenjen i smisao prijevoda te će pokušati pogoditi značenje prijevoda. Prijevodi koji su označeni kao fuzzy neće biti korišteni u programu nego će program koristiti izvorni engleski izraz. Primjerice fuzzy prijevod će izgledati ovako
    #: kmaddrbookdlg.cpp:178 kmmainwin.cpp:386 kmmainwin.cpp:420 main.cpp:339
    #, fuzzy
    msgid "Open file"
    msgstr "Otvori"
    Budući da "Otvori" nije ispravan prijevod moramo ga ispraviti tako da upišemo "Otvori datoteku". Jedina preostala stvar je da obrišemo fuzzy liniju budući da je prijevod sada ispravan i želimo da ga program koristi npr.
    #: kmaddrbookdlg.cpp:178 kmmainwin.cpp:386 kmmainwin.cpp:420 main.cpp:339
    msgid "Open file"
    msgstr "Otvori datoteku"
    Xgettext ce također označiti i prijevode koji se više ne koriste i ostaviti ih kao komentare u slijedećem obliku.
    #~ msgid "&Ok"
    #~ msgstr "&U redu"
    Ove nepotrebne prijevode možete slobodno obrisati ili ostaviti u datoteci za buducu referencu.
     

    Korištenje prijevoda u programima

    Kako je datoteka sa prijevodima u tekstualnom obliku (prilagodjena ljudima) vecina programa trpjela bi znacajno usporenje kada bi ih morali direktno koristiti. Radi toga GNU gettext dolazi sa programom msgfmt koji se koristi za prevodjenje PO datoteka u binarni format MO. MO datoteka je hash tabela sa svim prijevodima iz PO datoteke koje je program u stanju puno ucinkovitije koristiti. Primjerice ukoliko zelimo prevesti datoteku programx.po trebamo izvrsiti slijedecu naredbu
    msgfmt -o programx.mo programx.po
    Ukoliko postoje greske u PO datoteci msgfmt ce ispisati o kakvoj se gresci radi i na kojoj se liniji greska pojavila. Ako je sve u redu rezultirajucu MO datoteku potrebno je iskopirati u direktorij u kojem se nalaze svi ostali prijevodi. Primjerice GNOME stavlja sve prijevode za hrvatski lokal u direktorij
    /usr/share/locale/hr/LC_MESSAGES
    KDE u
    /opt/kde/share/locale/hr/LC_MESSAGES
    itd.

    Ukoliko je okolisna varijabla LANG podesena prilikom slijedeceg pokretanja programa umjesto engleskih izraza imati ce te hrvatski prijevod.

    Lokalizacijski projekti u Hrvatskoj

    Trenutno lokalizacijska grupa HULKa radi na prijevodu KDEa ( http://www.kde.org/ ) i GNOMEa ( http://www.gnome.org/ ). Veliki dio posla oko prevođenja Linux LDP dokumenata (HOWTO i FAQ) učinila je Meta grupa XV gimnazije u Zagrebu ( http://meta.mioc.hr/ ). Ukoliko se želite pridružiti najbolje je da se pretplatite na lokalizacijsku pretplatnu listu i to tako da posaljete e-mail na

    lokalizacija-subscribe@linux.hr

    i raspitate se sa projekte na kojima se trenutno radi.

    Referenca

     Upute o GNU gettextu


    Vladimir Vuksan vuksan@veus.hr