LDP/LDP/howto/docbook/Slovak-HOWTO/gettext.sgml

232 lines
8.6 KiB
Plaintext

<!--DOCTYPE section PUBLIC "-//OASIS//DTD DocBook V4.1//EN"-->
<!-- $Id$ -->
<section id="gettext">
<title id="gettext.title">Prekladanie aplikácií do slovenčiny</title>
<para>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.</para>
<para>V <acronym>GNU</acronym> 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!</para>
<para>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ý.</para>
<section id="gettext.gettext">
<title id="gettext.gettext.title">GNU gettext</title>
<para>Knižnica <application><acronym>GNU</acronym> gettext</application> 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 <acronym>C</acronym>. 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.</para>
<para>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ť <acronym>PO</acronym> súbory na súbory
<acronym>MO</acronym> a naopak, spájať <acronym>PO</acronym> 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.</para>
</section> <!-- gettext.gettext -->
<section id="gettext.writing">
<title>Písanie aplikácie s podporou pre gettext</title>
<para>V ďalších kapitolách budeme používať nasledovný príklad zdrojového kódu v jazyku
<acronym>C</acronym>.</para>
<programlisting>
#include &lt;stdlib.h>
#include &lt;string.h>
#include &lt;stdio.h>
#include &lt;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(&amp;curtime));
return EXIT_SUCCESS;
}
</programlisting>
<section id="gettext.writing.setlocale">
<title>Funkcia <function>setlocale()</function></title>
<para>Aby funkcie z knižnice <application>gettext</application>, aký preklad majú hľadať, teda
akú hodnotu má premenná <envar>LC_MESSAGES</envar>, musíme na začiatku programu zavolať
funkciu <function>setlocale()</function>.</para>
<para>Syntax funkcie <function>setlocale()</function> je nasledovný:
<funcsynopsis>
<funcprototype>
<funcdef>char *<function>setlocale</function></funcdef>
<paramdef>int <parameter>category</parameter></paramdef>
<paramdef>const char *<parameter>locale</parameter></paramdef>
</funcprototype>
</funcsynopsis></para>
<para>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.
<programlisting>
setlocale(LC_ALL, NULL);
</programlisting></para>
<para>Takto postavená funkcia nastaví miestne nastavenia programu podľa premenných
<envar>LC_*</envar>. Funkcie knižnice <application>gettext</application> sa potom tejto
istej funkcie opýtajú:
<programlisting>
ext = setlocale(LC_MESSAGES, NULL);
</programlisting>
a dostanú odpoveď typu <computeroutput>sk_SK.ISO-8859-2</computeroutput>. V tom prípade sa
budú hľadať súbory s preloženými hláškami v adresároch
<simplelist>
<member>
<filename class="directory">/usr/share/locale/sk_SK.ISO-8859-2/LC_MESSAGES/</filename>
</member>
<member>
<filename class="directory">/usr/share/locale/sk_SK/LC_MESSAGES/</filename>
</member>
<member>
<filename class="directory">/usr/share/locale/sk/LC_MESSAGES/</filename>
</member>
</simplelist>
pričom časť <filename class="directory">/usr/share/locale/</filename> sa dá zmeniť (o tom
potom).</para>
<para>V ktorom z týchto adresárov (v tomto poradí) nájde súbor so svojimi hláškami, z toho ich
bude ťahať.</para>
</section> <!-- gettext.writing.setlocale -->
<section id="gettext.writing.functions">
<title>Funkcia <function>textdomain()</function></title>
<para>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 <function>textdomain()</function>. Jej syntax je:
<funcsynopsis>
<funcprototype>
<funcdef>char *<function>textdomain</function></funcdef>
<paramdef>const char *<parameter>domainname</parameter></paramdef>
</funcprototype>
</funcsynopsis></para>
<para>Argument <parameter>domainname</parameter> udáva meno takzvanej
<emphasis>domény</emphasis> programu. Kedykoľvek nastane požiadavka na preložený reťazec,
tento sa bude hľadať v súbore <filename>domainname.mo</filename> v niektorom zo spomínaných
adresárov.</para>
<para>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.</para>
<informalexample>
<programlisting>
#include &lt;stdlib.h>
#include &lt;string.h>
#include &lt;stdio.h>
#include &lt;time.h>
#include &lt;libintl.h> // hlavičkový súbor knižnice gettext
#include &lt;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;
}
</programlisting>
</informalexample>
</section> <!-- gettext.writing.domainname -->
<section>
<title>Funkcia <function>gettext()</function></title>
<para>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.</para>
<para>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.</para>
</section> <!-- gettext.writing.gettext -->
</section> <!-- gettext.writing -->
<section>
<title>Formát PO súboru</title>
<para></para>
</section>
<section>
<title>Komentáre</title>
<para></para>
</section>
<section>
<title>PO Template</title>
<para></para>
</section>
<section>
<title>Vytváranie POT súboru</title>
<para></para>
</section>
</section>