Prekladanie aplikácií do slovenčiny V podaktorých operačných systémoch sa to robí tak, že výrobca si v každej krajine objedná firmu, ktorá preloží hlášky priamo v zdrojovom kóde a nanovo ho skompiluje. Výhodou je, že preklad je draho zaplatený a teda poväčšinou profesionálny, konzultovaný s linguistami a inými istami. Horšie je, že občas sa niekto so zdrojákmi hrá viac ako je nutné (alebo nechtiac preloží kúsok z nich) a potom národné verzie majú iné vlastnosti (a padavosť) ako verzia pôvodná. Navyše, ak sa pritrafí nejaká chybička prekladu, oprava nehrozí do najbližšej major verzie. V GNU operačných systémoch sa to robí tak, že výrobca napíše aplikáciu, pričom na začiatok pridá desať riadkov kódu a každú hlášku uzavrie do makra. Potom to skompiluje, jedným príkazom vytvorí súbor so všetkými hláškami v programe a celé to vypustí. Ktokoľvek -- od Eskimáka s laptopom v iglu, cez Slováka s 386 v garzónke, až po arabského emira s dvojprocesorovou Alphou v desaťposchodovom paláci -- potom jednoducho preloží reťazce v spomínanom súbore, spustí jeden príkaz a má danú aplikáciu pripravenú pre svoj jazyk. Nastaví premennú, spustí pôvodnú binárku -- tú istú, ktorá predtým bežala po anglicky -- a už je doma! Neviem, ktorý postup sa vám páči viac, ale ak nechcete naštvať nejakého Albánca alebo nebodaj Kolumbijčana, používajte v Linuxe ten druhý.
GNU gettext Knižnica GNU gettext je tým zázračným nástrojom, ktorý tak uľahčuje úpravu aplikácií pre krajiny, kde sa nehovorí po anglicky. Na niektorých systémoch ju nájdete ako samostatnú knižnicu (libintl.a), na iných je priamo súčasťou štandardnej knižnice jazyka C. Obsahuje zo desať funkcií, z ktorých sa používajú asi tak dve. To je však dôležité len pre programátorov, ktorý pri návrhu a tvorbe softvéru nesmú zabudnúť používať tieto funkcie. Pre prekladateľa sú dôležitejšie programy, ktoré sa nachádzajú v balíku gettext. Je to niekoľko nástrojov, pomocou ktorých možno prevádzať PO súbory na súbory MO a naopak, spájať PO súbory, atď. Keď je aplikácia napísaná s použitím funkcií knižnice gettext a používa ich správne, potom je vďaka týmto nástrojom možný preklad do ľubovoľného jazyka.
Písanie aplikácie s podporou pre gettext V ďalších kapitolách budeme používať nasledovný príklad zdrojového kódu v jazyku C. #include <stdlib.h> #include <string.h> #include <stdio.h> #include <time.h> int main(int argc, char **argv) { int i; char *suffix; time_t curtime; if (argc > 2) suffix = "s"; else suffix = ""; printf("Got %d argument%s.\n", argc - 1, suffix); if (argc > 1) { puts("List of arguments:"); for (i = 1; i < argc; i++) { if (i == 1) suffix = "st"; else if (i == 2) suffix = "nd"; else if (i == 3) suffix = "rd"; else suffix = "th"; printf("\t%d%s %s\n", i, suffix, argv[i]); } } curtime = time(NULL); printf("Exiting at: %s", ctime(&curtime)); return EXIT_SUCCESS; }
Funkcia <function>setlocale()</function> Aby funkcie z knižnice gettext, aký preklad majú hľadať, teda akú hodnotu má premenná LC_MESSAGES, musíme na začiatku programu zavolať funkciu setlocale(). Syntax funkcie setlocale() je nasledovný: char *setlocale int category const char *locale Všetko, čo o tejto funkcii potrebujete vedieť, nájdete v jej manuálovej stránke. Pre potreby tohto dokumentu si povieme len toľko, že prakticky každý (rozumný) program obsahuje niekde na začiatku riadok. setlocale(LC_ALL, NULL); Takto postavená funkcia nastaví miestne nastavenia programu podľa premenných LC_*. Funkcie knižnice gettext sa potom tejto istej funkcie opýtajú: ext = setlocale(LC_MESSAGES, NULL); a dostanú odpoveď typu sk_SK.ISO-8859-2. V tom prípade sa budú hľadať súbory s preloženými hláškami v adresároch /usr/share/locale/sk_SK.ISO-8859-2/LC_MESSAGES/ /usr/share/locale/sk_SK/LC_MESSAGES/ /usr/share/locale/sk/LC_MESSAGES/ pričom časť /usr/share/locale/ sa dá zmeniť (o tom potom). V ktorom z týchto adresárov (v tomto poradí) nájde súbor so svojimi hláškami, z toho ich bude ťahať.
Funkcia <function>textdomain()</function> Ale adresár stačiť nebude. Potrebujeme určiť aj meno súboru, v ktorom sa hlášky nachádzajú. Na to slúži funkcia textdomain(). Jej syntax je: char *textdomain const char *domainname Argument domainname udáva meno takzvanej domény programu. Kedykoľvek nastane požiadavka na preložený reťazec, tento sa bude hľadať v súbore domainname.mo v niektorom zo spomínaných adresárov. Doplňme si teda do nášho programu všetko, čo je potrebné na to, aby vedel, v ktorom adresári a konkrétne v ktorom súbore sa majú hľadať preložené hlášky. #include <stdlib.h> #include <string.h> #include <stdio.h> #include <time.h> #include <libintl.h> // hlavičkový súbor knižnice gettext #include <locale.h> // setlocale() int main(int argc, char **argv) { int i; char *suffix; time_t curtime; setlocale(LC_ALL, NULL); // nastaví informácie o miestnych nastaveniach textdomain("example"); // nastaví "doménu" programu if (argc > 2) suffix = "s"; else ... return EXIT_SUCCESS; }
Funkcia <function>gettext()</function> Aj keď už vieme, v ktorom súbore nájdeme preložené hlásenia programu, samé od seba sa za behu nedoplnia. Navyše, mali by sme určiť, ktoré presne hlášky chceme mať preložené. Napríklad, debugovacie informácie určené len pre programátorov sa zväčša neprekladajú. Formátovacie reťazce pre printf, ktoré neobsahujú text na preloženie, tiež nie je nutné ukazovať prekladateľovi. Ktoré reťazce majú byť dostupné prekladateľom na preklad, o tom rozhoduje programátor. Samozrejme, niekedy na niečo pozabudne a často sa stáva, že prekladatelia sa musia stať na chvíľu progamátormi, aby bol daný program "preložiteľný" do ich jazyka.
Formát PO súboru
Komentáre
PO Template
Vytváranie POT súboru