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

