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

232 lines
8.6 KiB
Plaintext
Raw Normal View History

<!--DOCTYPE section PUBLIC "-//OASIS//DTD DocBook V4.1//EN"-->
<!-- $Id$ -->
<section id="gettext">
<title id="gettext.title">Prekladanie aplik<69>ci<63> do sloven<65>iny</title>
<para>V podaktor<6F>ch opera<72>n<EFBFBD>ch syst<73>moch sa to rob<6F> tak, <20>e v<>robca si v ka<6B>dej krajine objedn<64>
firmu, ktor<6F> prelo<6C><6F> hl<68><6C>ky priamo v zdrojovom k<>de a nanovo ho skompiluje. V<>hodou je, <20>e
preklad je draho zaplaten<65> a teda pov<6F><76><EFBFBD>inou profesion<6F>lny, konzultovan<61> s linguistami a in<69>mi
istami. Hor<6F>ie je, <20>e ob<6F>as sa niekto so zdroj<6F>kmi hr<68> viac ako je nutn<74> (alebo nechtiac prelo<6C><6F>
k<>sok z nich) a potom n<>rodn<64> verzie maj<61> in<69> vlastnosti (a padavos<6F>) ako verzia p<>vodn<64>.
Navy<76>e, ak sa pritraf<61> nejak<61> chybi<62>ka prekladu, oprava nehroz<6F> do najbli<6C><69>ej major
verzie.</para>
<para>V <acronym>GNU</acronym> opera<72>n<EFBFBD>ch syst<73>moch sa to rob<6F> tak, <20>e v<>robca nap<61><70>e aplik<69>ciu,
pri<72>om na za<7A>iatok prid<69> desa<73> riadkov k<>du a ka<6B>d<EFBFBD> hl<68><6C>ku uzavrie do makra. Potom to
skompiluje, jedn<64>m pr<70>kazom vytvor<6F> s<>bor so v<>etk<74>mi hl<68><6C>kami v programe a cel<65> to vypust<73>.
Ktoko<6B>vek -- od Eskim<69>ka s laptopom v iglu, cez Slov<6F>ka s 386 v garz<72>nke, a<> po arabsk<73>ho emira
s dvojprocesorovou Alphou v desa<73>poschodovom pal<61>ci -- potom jednoducho prelo<6C><6F> re<72>azce v
spom<6F>nanom s<>bore, spust<73> jeden pr<70>kaz a m<> dan<61> aplik<69>ciu pripraven<65> pre svoj jazyk. Nastav<61>
premenn<6E>, spust<73> p<>vodn<64> bin<69>rku -- t<> ist<73>, ktor<6F> predt<64>m be<62>ala po anglicky -- a u<> je
doma!</para>
<para>Neviem, ktor<6F> postup sa v<>m p<><70>i viac, ale ak nechcete na<6E>tva<76> nejak<61>ho Alb<6C>nca alebo
nebodaj Kolumbij<69>ana, pou<6F><75>vajte v Linuxe ten druh<75>.</para>
<section id="gettext.gettext">
<title id="gettext.gettext.title">GNU gettext</title>
<para>Kni<6E>nica <application><acronym>GNU</acronym> gettext</application> je t<>m z<>zra<72>n<EFBFBD>m
n<>strojom, ktor<6F> tak u<>ah<61>uje <20>pravu aplik<69>ci<63> pre krajiny, kde sa nehovor<6F> po anglicky. Na
niektor<6F>ch syst<73>moch ju n<>jdete ako samostatn<74> kni<6E>nicu (libintl.a), na in<69>ch je priamo
s<><73>as<61>ou <20>tandardnej kni<6E>nice jazyka <acronym>C</acronym>. Obsahuje zo desa<73> funkci<63>, z
ktor<6F>ch sa pou<6F><75>vaj<61> asi tak dve. To je v<>ak d<>le<6C>it<69> len pre program<61>torov, ktor<6F> pri n<>vrhu
a tvorbe softv<74>ru nesm<73> zabudn<64><6E> pou<6F><75>va<76> tieto funkcie.</para>
<para>Pre prekladate<74>a s<> d<>le<6C>itej<65>ie programy, ktor<6F> sa nach<63>dzaj<61> v bal<61>ku gettext. Je to
nieko<6B>ko n<>strojov, pomocou ktor<6F>ch mo<6D>no prev<65>dza<7A> <acronym>PO</acronym> s<>bory na s<>bory
<acronym>MO</acronym> a naopak, sp<73>ja<6A> <acronym>PO</acronym> s<>bory, at<61>. Ke<4B> je aplik<69>cia
nap<61>san<61> s pou<6F>it<69>m funkci<63> kni<6E>nice gettext a pou<6F><75>va ich spr<70>vne, potom je v<>aka t<>mto
n<>strojom mo<6D>n<EFBFBD> preklad do <20>ubovo<76>n<EFBFBD>ho jazyka.</para>
</section> <!-- gettext.gettext -->
<section id="gettext.writing">
<title>P<>sanie aplik<69>cie s podporou pre gettext</title>
<para>V <20>al<61><6C>ch kapitol<6F>ch budeme pou<6F><75>va<76> nasledovn<76> pr<70>klad zdrojov<6F>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<6E>nice <application>gettext</application>, ak<61> preklad maj<61> h<>ada<64>, teda
ak<61> hodnotu m<> premenn<6E> <envar>LC_MESSAGES</envar>, mus<75>me na za<7A>iatku programu zavola<6C>
funkciu <function>setlocale()</function>.</para>
<para>Syntax funkcie <function>setlocale()</function> je nasledovn<76>:
<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, <20>o o tejto funkcii potrebujete vedie<69>, n<>jdete v jej manu<6E>lovej str<74>nke. Pre
potreby tohto dokumentu si povieme len to<74>ko, <20>e prakticky ka<6B>d<EFBFBD> (rozumn<6D>) program obsahuje
niekde na za<7A>iatku riadok.
<programlisting>
setlocale(LC_ALL, NULL);
</programlisting></para>
<para>Takto postaven<65> funkcia nastav<61> miestne nastavenia programu pod<6F>a premenn<6E>ch
<envar>LC_*</envar>. Funkcie kni<6E>nice <application>gettext</application> sa potom tejto
istej funkcie op<6F>taj<61>:
<programlisting>
ext = setlocale(LC_MESSAGES, NULL);
</programlisting>
a dostan<61> odpove<76> typu <computeroutput>sk_SK.ISO-8859-2</computeroutput>. V tom pr<70>pade sa
bud<75> h<>ada<64> s<>bory s prelo<6C>en<65>mi hl<68><6C>kami v adres<65>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<72>om <20>as<61> <filename class="directory">/usr/share/locale/</filename> sa d<> zmeni<6E> (o tom
potom).</para>
<para>V ktorom z t<>chto adres<65>rov (v tomto porad<61>) n<>jde s<>bor so svojimi hl<68><6C>kami, z toho ich
bude <20>aha<68>.</para>
</section> <!-- gettext.writing.setlocale -->
<section id="gettext.writing.functions">
<title>Funkcia <function>textdomain()</function></title>
<para>Ale adres<65>r sta<74>i<EFBFBD> nebude. Potrebujeme ur<75>i<EFBFBD> aj meno s<>boru, v ktorom sa hl<68><6C>ky
nach<63>dzaj<61>. Na to sl<73><6C>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<75>va meno takzvanej
<emphasis>dom<6F>ny</emphasis> programu. Kedyko<6B>vek nastane po<70>iadavka na prelo<6C>en<65> re<72>azec,
tento sa bude h<>ada<64> v s<>bore <filename>domainname.mo</filename> v niektorom zo spom<6F>nan<61>ch
adres<65>rov.</para>
<para>Dopl<70>me si teda do n<><6E>ho programu v<>etko, <20>o je potrebn<62> na to, aby vedel, v ktorom
adres<65>ri a konkr<6B>tne v ktorom s<>bore sa maj<61> h<>ada<64> prelo<6C>en<65> hl<68><6C>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<76>kov<6F> s<>bor kni<6E>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<61> inform<72>cie o miestnych nastaveniach
textdomain("example"); // nastav<61> "dom<6F>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<6B> u<> vieme, v ktorom s<>bore n<>jdeme prelo<6C>en<65> hl<68>senia programu, sam<61> od seba sa
za behu nedoplnia. Navy<76>e, mali by sme ur<75>i<EFBFBD>, ktor<6F> presne hl<68><6C>ky chceme ma<6D> prelo<6C>en<65>.
Napr<70>klad, debugovacie inform<72>cie ur<75>en<65> len pre program<61>torov sa zv<7A><76><EFBFBD>a neprekladaj<61>.
Form<72>tovacie re<72>azce pre printf, ktor<6F> neobsahuj<75> text na prelo<6C>enie, tie<69> nie je nutn<74>
ukazova<76> prekladate<74>ovi.</para>
<para>Ktor<6F> re<72>azce maj<61> by<62> dostupn<70> prekladate<74>om na preklad, o tom rozhoduje program<61>tor.
Samozrejme, niekedy na nie<69>o pozabudne a <20>asto sa st<73>va, <20>e prekladatelia sa musia sta<74> na
chv<68><76>u progam<61>tormi, aby bol dan<61> program "prelo<6C>ite<74>n<EFBFBD>" do ich jazyka.</para>
</section> <!-- gettext.writing.gettext -->
</section> <!-- gettext.writing -->
<section>
<title>Form<72>t PO s<>boru</title>
<para></para>
</section>
<section>
<title>Koment<6E>re</title>
<para></para>
</section>
<section>
<title>PO Template</title>
<para></para>
</section>
<section>
<title>Vytv<74>ranie POT s<>boru</title>
<para></para>
</section>
</section>