mirror of https://github.com/tLDP/LDP
232 lines
8.6 KiB
Plaintext
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 <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;
|
|
}
|
|
</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 <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;
|
|
}
|
|
</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>
|
|
|