2002-02-05 03:50:45 +00:00
|
|
|
|
<!--DOCTYPE section PUBLIC "-//OASIS//DTD DocBook V4.1//EN"-->
|
2002-02-06 18:59:03 +00:00
|
|
|
|
<!-- $Id$ -->
|
2002-02-05 03:50:45 +00:00
|
|
|
|
|
|
|
|
|
<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 <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<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 <stdlib.h>
|
|
|
|
|
#include <string.h>
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <time.h>
|
|
|
|
|
|
|
|
|
|
#include <libintl.h> // hlavi<76>kov<6F> s<>bor kni<6E>nice gettext
|
|
|
|
|
#include <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>
|
|
|
|
|
|