.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings.  \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
.    ds -- \(*W-
.    ds PI pi
.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
.    ds L" ""
.    ds R" ""
.    ds C` ""
.    ds C' ""
'br\}
.el\{\
.    ds -- \|\(em\|
.    ds PI \(*p
.    ds L" ``
.    ds R" ''
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el       .ds Aq '
.\"
.\" If the F register is turned on, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD.  Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.ie \nF \{\
.    de IX
.    tm Index:\\$1\t\\n%\t"\\$2"
..
.    nr % 0
.    rr F
.\}
.el \{\
.    de IX
..
.\}
.\" ========================================================================
.\"
.IX Title "PO4A 7"
.TH PO4A 7 "2013-08-21" "Narzędzia po4a" "Narzędzia po4a"
.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
.SH "NAZWA"
.IX Header "NAZWA"
po4a \- narzędzia do tłumaczeń dokumentacji i innych materiałów
.SH "Wstęp"
.IX Header "Wstęp"
Celem projektu po4a (\*(L"\s-1PO\s0 for anything\*(R") jest ułatwienie tłumaczeń (oraz, co
ciekawsze, zarządzania tłumaczeniami) przy użyciu narzędzi gettext w tych
obszarach, gdzie nie były używane, jak na przykład w obszarze dokumentacji.
.SH "Spis treści"
.IX Header "Spis treści"
Dokument jest zorganizowany następująco:
.IP "1. Dlaczego powinno się używać po4a? Jakie są jego zalety?" 4
.IX Item "1. Dlaczego powinno się używać po4a? Jakie są jego zalety?"
Ten rozdział wprowadzenia wyjaśnia motywy i filozofię projektu. Jeżeli
rozważasz użycie po4a do Twoich tłumaczeń, powinieneś najpierw przeczytać
ten rozdział.
.IP "2. Jak używać po4a?" 4
.IX Item "2. Jak używać po4a?"
Rozdział ten jest rodzajem podręcznika i próbuje odpowiedzieć na pytania
użytkowników, pozwalając lepiej zrozumieć cały proces. Odpowiada, jak
wykonać różne rzeczy w po4a, i służy jako wprowadzenie do dokumentacji
konkretnych narzędzi.
.RS 4
.IP "\s-1JAK\s0 zacząć nowe tłumaczenie?" 4
.IX Item "JAK zacząć nowe tłumaczenie?"
.PD 0
.IP "\s-1JAK\s0 zamienić tłumaczenie z powrotem do pliku dokumentacji?" 4
.IX Item "JAK zamienić tłumaczenie z powrotem do pliku dokumentacji?"
.IP "\s-1JAK\s0 zaktualizować tłumaczenie programem po4a?" 4
.IX Item "JAK zaktualizować tłumaczenie programem po4a?"
.IP "\s-1JAK\s0 skonwertować istniejące tłumaczenia do po4a?" 4
.IX Item "JAK skonwertować istniejące tłumaczenia do po4a?"
.IP "\s-1JAK\s0 dodać dodatkowy tekst do tłumaczeń (np. nazwisko tłumacza)?" 4
.IX Item "JAK dodać dodatkowy tekst do tłumaczeń (np. nazwisko tłumacza)?"
.IP "\s-1JAK\s0 to wszystko zrobić, wywołując tylko jeden program?" 4
.IX Item "JAK to wszystko zrobić, wywołując tylko jeden program?"
.IP "\s-1JAK\s0 dostosować po4a do własnych potrzeb?" 4
.IX Item "JAK dostosować po4a do własnych potrzeb?"
.RE
.RS 4
.RE
.IP "3. Jak to działa?" 4
.IX Item "3. Jak to działa?"
.PD
Ten rozdział zawiera krótki opis wewnętrznych mechanizmów po4a, tak że
będziesz miał więcej odwagi, aby pomóc nam w jego tworzeniu i
udoskonalaniu. Może także Ci pomóc w zrozumieniu, dlaczego nie działa tak,
jak byś tego oczekiwał, oraz jak rozwiązać napotkane problemy.
.IP "4. \s-1FAQ\s0" 4
.IX Item "4. FAQ"
Ten rozdział zawiera odpowiedzi na często zadawane pytania. Tak naprawdę,
większość tych pytań może być sformułowanych jako \*(L"Dlaczego po4a zostało
zaprojektowane tak, a nie inaczej?\*(R". Jeśli wydaje Ci się, że po4a nie jest
właściwym narzędziem do tłumaczenia dokumentacji, powinieneś rozważyć
przeczytanie tego rozdziału. Jeśli nie znajdziesz w nim odpowiedzi na swoje
pytanie, prosimy się z nami skontaktować poprzez listę dyskusyjną
<po4a\-devel@lists.alioth.debian.org>. Uwielbiamy znać opinie
użytkowników.
.IP "5. Specyficzne uwagi o modułach" 4
.IX Item "5. Specyficzne uwagi o modułach"
Ten rozdział opisuje rzeczy specyficzne dla każdego modułu, z punktu
widzenia zarówno tłumacza, jak i autora oryginalnego dokumentu. Czytając ten
rozdział, dowiesz się, kiedy dany moduł wykonuje tłumaczenia oraz jakich
zasad powinieneś przestrzegać, pisząc oryginalny dokument, aby uprościć
życie tłumaczom.
.Sp
W zasadzie, ta sekcja nie jest częścią tego dokumentu. Zamiast tego jest
umieszczana w dokumentacji każdego modułu. Pomaga to w zapewnieniu
aktualności tych informacji, trzymając kod i dokumentację razem.
.SH "Dlaczego używać po4a? Do czego jest on przydatny?"
.IX Header "Dlaczego używać po4a? Do czego jest on przydatny?"
Podoba mi się idea wolnego oprogramowania, pozwalającego każdemu na dostęp
do programów i ich kodów źródłowych. Będąc jednak Francuzem, jestem świadomy
tego, że licencja programu nie jest jedynym ograniczeniem otwartości
oprogramowania: nieprzetłumaczone oprogramowanie jest bezużyteczne dla ludzi
nieznających angielskiego, więc ciągle czeka na nas dużo pracy, żeby
udostępnić je każdej takiej osobie.
.PP
Świadomość tego problemu wśród osób związanych z oprogramowaniem open-source
ostatnio znacznie wzrosła. Wygraliśmy, jako tłumacze, pierwszą bitwę i
przekonaliśmy wszystkich o znaczeniu tłumaczeń. Niestety, to była ta
łatwiejsza część. Teraz musimy wykonać naszą pracę i przetłumaczyć wszystkie
te rzeczy.
.PP
Właściwie oprogramowanie typu open-source ma dość przyzwoity poziom
tłumaczeń, dzięki wspaniałemu pakietowi gettext, który ma możliwości
wyodrębniania z programu komunikatów do przetłumaczenia, przekazywania
tłumaczom plików w jednolitym formacie i używania wyników ich pracy do
pokazywania użytkownikowi przetłumaczonych komunikatów w czasie działania
programu.
.PP
W przypadku dokumentacji sytuacja jest trochę inna. Zbyt często się zdarza,
że tłumaczony dokument nie jest dostatecznie widoczny (nie jest
dystrybuowany jako część programu), jest tylko częściowy lub nie jest
aktualny. Ostatnia sytuacja jest najgorszą z możliwych. Przestarzałe
tłumaczenie, opisujące stare, już nieistniejące zachowanie programu, może
być o wiele gorsze dla użytkownika niż brak tłumaczenia w ogóle.
.SS "Problem do rozwiązania"
.IX Subsection "Problem do rozwiązania"
Tłumaczenie dokumentacji samo w sobie nie jest zbyt trudne. Teksty są dużo
dłuższe niż komunikaty wyświetlane przez program, więc ich tłumaczenie
zajmuje trochę więcej czasu, nie wymaga przy tym jednak żadnych umiejętności
technicznych. Trudniejszą częścią pracy jest zarządzanie
tłumaczeniem. Wykrywanie części, które się zmieniły i powinny być
zaktualizowane, jest bardzo trudne, podatne na błędy i wysoce
nieprzyjemne. Najprawdopodobniej wyjaśnia to, dlaczego tak wiele
przetłumaczonej dokumentacji nie jest aktualne.
.SS "Odpowiedzi po4a"
.IX Subsection "Odpowiedzi po4a"
Tak więc, celem po4a jest uczynienie tłumaczeń dokumentacji \fIłatwymi do
zarządzania\fR. Ideą jest wykorzystanie metodologii gettexta na tym nowym
polu. Tak jak w programie gettext, teksty są wyodrębniane z ich oryginalnych
miejsc, aby mogły w jednolitym formacie zostać zaprezentowane
tłumaczowi. Klasyczne narzędzia gettexta pomogą im uaktualnić ich pracę,
kiedy pojawi się nowa wersja oryginalnego dokumentu. W przeciwieństwie zaś
do klasycznego modelu gettext, tłumaczenia są wstawiane do struktury
oryginalnego dokumentu, tak żeby mogły być przetwarzane i dystrybuowane w
dokładnie taki sam sposób, co wersja angielska.
.PP
Dzięki temu stało się łatwiejsze znalezienie do przetłumaczenia zmienionych
części dokumentu. Innym plusem jest to, że w wypadku zasadniczej
reorganizacji struktury dokumentu, gdy rozdziały są przesuwane, łączone lub
dzielone, narzędzia wykonają prawie całą brudną robotę. Wyodrębnianie ze
struktury dokumentu tekstów do przetłumaczenia pozwala tłumaczom nie
przejmować się złożonością struktury dokumentu i zmniejsza szanse otrzymania
dokumentu o niepoprawnej strukturze (choć zawsze jest to możliwe).
.PP
W sekcji \fB\s-1FAQ\s0\fR poniżej opisano kompletną listę plusów i minusów tego
rozwiązania.
.SS "Obsługiwane formaty"
.IX Subsection "Obsługiwane formaty"
Obecnie rozwiązanie to zaimplementowano z sukcesem dla kilku formatów
tekstu:
.PP
\fIman\fR
.IX Subsection "man"
.PP
Format starych, dobrych stron podręcznika ekranowego, używanego przez wiele
programów. Obsługa tego formatu w po4a jest mile widziana, ponieważ ten
format jest raczej trudny w użyciu i niezbyt przyjazny dla nowych
użytkowników. Moduł \fILocale::Po4a::Man\fR\|(3pm) obsługuje również format
mdoc,używany przez strony podręcznika systemu \s-1BSD\s0 (całkiem często
występujących również pod Linuksem).
.PP
\fIpod\fR
.IX Subsection "pod"
.PP
Jest to format dokumentacji Perla. W ten sposób jest udokumentowany sam
język i jego rozszerzenia, a także większość istniejących skryptów
Perla. Łączenie dokumentacji i kodu w jednym pliku, pomaga utrzymywać
aktualność dokumentacji. Upraszcza to życie programisty, ale niestety, nie
tłumacza.
.PP
\fIsgml\fR
.IX Subsection "sgml"
.PP
Nawet jeśli jest obecnie wypierany przez \s-1XML\s0, ten format jest wciąż raczej
często używany w dokumentach o długości większej niż kilka ekranów. Pozwala
tworzyć kompletne książki. Aktualizowane tłumaczeń tak długich dokumentów
może być prawdziwym koszmarem. Program \fBdiff\fR bardzo często okazuje się
bezużyteczny, jeśli zmieni się struktura oryginalnego tekstu. Na szczęście,
z pomocą może przyjść po4a.
.PP
Obecnie obsługiwane są tylko \s-1DTD\s0 DebianDoc i docbook, ale dodanie obsługi
nowego typu jest bardzo proste. Jest nawet możliwe użycie po4a z nieznanym
\&\s-1DTD\s0 \s-1SGML\s0 bez zmiany kodu \- przez podanie wymaganych informacji w parametrach
linii poleceń. Szczegóły można znaleźć w \fILocale::Po4a::Sgml\fR\|(3pm).
.PP
\fITeX / LaTeX\fR
.IX Subsection "TeX / LaTeX"
.PP
Format LaTeX jest głównym formatem dokumentacji używanym w publikacjach
pisanych przez ludzi związanych ze światem wolnego oprogramowania. Moduł
\&\fILocale::Po4a::LaTeX\fR\|(3pm) był testowany na dokumentacji Pythona,
książce i kilku prezentacjach.
.PP
\fItexinfo\fR
.IX Subsection "texinfo"
.PP
Cała dokumentacja \s-1GNU\s0 jest pisana w tym formacie (i jest to nawet jedno z
wymagań stawianych projektom , które chcą stać się oficjalnymi projektami
\&\s-1GNU\s0). Wsparcie dla  \fILocale::Po4a::Texinfo\fR\|(3pm) jest wciąż w fazie
początkowej. Prosimy o zgłaszanie błędów i przesyłanie uwag dotyczących
brakujących funkcjonalności.
.PP
\fIxml\fR
.IX Subsection "xml"
.PP
\&\s-1XML\s0 jest formatem bazowym wielu innych formatów dokumentacji.
.PP
Obecnie po4a obsługuje DocBook \s-1DTD\s0. Szczegóły można znaleźć w
\&\fILocale::Po4a::Docbook\fR\|(3pm).
.PP
\fIinne\fR
.IX Subsection "inne"
.PP
Po4a może także obsługiwać kilka rzadszych lub bardziej specjalizowanych
formatów, takich jak dokumentacja opcji kompilacji jąder 2.4 lub diagramów
wyprodukowanych przez narzędzie dia. Dodanie nowego formatu jest często
bardzo proste, a głównym zadaniem jest napisanie parsera tego
formatu. Więcej informacji o tym można znaleźć w
\&\fILocale::Po4a::TransTractor\fR\|(3pm).
.SS "Formaty niewspierane"
.IX Subsection "Formaty niewspierane"
Niestety, po4a ciągle nie obsługuje kilku formatów dokumentacji.
.PP
Istnieje cała masa innych formatów, które byśmy chcieli obsługiwać w po4a, i
nie są to tylko formaty dokumentacji. W zasadzie, naszym celem jest
wypełnienie wszystkich dziur pozostawionych przez klasyczne narzędzia
gettext. Obejmuje to opisy pakietów (deb i rpm), pytania skryptów
instalacyjnych pakietów, logi zmian pakietów i wszystkie specjalizowane
formaty używane przez programy, jak na przykład scenariusze gier lub pliki
zasobów wine.
.SH "Jak używać po4a?"
.IX Header "Jak używać po4a?"
Rozdział ten jest rodzajem podręcznika i próbuje odpowiedzieć na pytania
użytkowników, pozwalając lepiej zrozumieć cały proces. Odpowiada, jak
wykonać różne rzeczy w po4a, i służy jako wprowadzenie do dokumentacji
konkretnych narzędzi.
.SS "Graficzne podsumowanie"
.IX Subsection "Graficzne podsumowanie"
Następujący schemat pokazuje poglądowo proces tłumaczenia dokumentacji z
użyciem po4a. Nie powinno się przejmować jego pozorną złożonością, która
wzięła się stąd, że pokazaliśmy tutaj \fIcały\fR proces. Po skonwertowaniu
projektu do po4a, istotna będzie tylko prawa część schematu.
.PP
Proszę zauważyć, że \fImaster.doc\fR występuje tu jako przykład pliku
dokumentacji do przetłumaczenia, a \fItłumaczenie.doc\fR jest odpowiadającym mu
tekstem przetłumaczonym. Rozszerzeniem może być  \fI.pod\fR, \fI.xml\fR lub
\&\fI.sgml\fR, zależnie od formatu pliku. Każdą część rysunku omówimy szczegółowo
w następnych sekcjach.
.PP
.Vb 10
\&                                   master.doc
\&                                       |
\&                                       V
\&     +<\-\-\-\-\-<\-\-\-\-+<\-\-\-\-\-<\-\-\-\-\-<\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\->\-\-\-\-\-\-\-\->\-\-\-\-\-\-\-+
\&     :           |                     |                        :
\&{tłumaczenie}    |            { aktualizacja master.doc }       :
\&     :           |                     |                        :
\&   XX.doc        |                     V                        V
\&(nieobowiązkowy) |                  master.doc \-\-\-\-\-\-\->\-\-\-\-\-\-\-\->+
\&     :           |                   (nowy)                     |
\&     V           V                     |                        |
\&  [po4a\-gettextize]   doc.XX.po\-\-\->+   |                        |
\&          |           (stary)      |   |                        |
\&          |              ^         V   V                        |
\&          |              |     [po4a\-updatepo]                  |
\&          V              |           |                          V
\&  tłumaczenie.pot        ^           V                          |
\&          |              |         doc.XX.po                    |
\&          |              |         (fuzzy)                      |
\&   { tłumaczenie }       |           |                          |
\&          |              ^           V                          V
\&          |              |     {ręczna edycja}                  |
\&          |              |           |                          |
\&          V              |           V                          V
\&      doc.XX.po \-\-\->\-\-\-\->+<\-\-\-<\-\-\-\- doc.XX.po  załącznik    master.doc
\&     (początkowy)                  (aktualny) (opcjonalny)  (aktualny)
\&          :                          |            |             |
\&          :                          V            |             |
\&          +\-\-\-\-\->\-\-\-\-\->\-\-\-\-\->\-\-\-\-\-\-> +            |             |
\&                                     |            |             |
\&                                     V            V             V
\&                                     +\-\-\-\-\-\->\-\-\-\-\-+\-\-\-\-\-\-<\-\-\-\-\-\-+
\&                                                  |
\&                                                  V
\&                                           [po4a\-translate]
\&                                                  |
\&                                                  V
\&                                                XX.doc
\&                                              (aktualny)
.Ve
.PP
Lewa część pokazuje konwersję tłumaczenia nie używającego jeszcze po4a do
tego systemu. Góra prawej części pokazuje akcje autora oryginału
(aktualizowanie dokumentacji). Środek prawej części obrazuje automatyczne
akcje po4a. Nowy materiał jest wyodrębniany i porównywany z istniejącymi
tłumaczeniami. Znajdowane są części, które się nie zmieniły, i dla nich
używane jest poprzednie tłumaczenie. Części zmodyfikowane tylko w
nieznacznym stopniu są także łączone z poprzednimi tłumaczeniami, ale
dodawany jest specjalny znacznik, mówiący, że tłumaczenie musi być
uaktualnione. Dół rysunku pokazuje sposób, w jaki jest budowany sformatowany
dokument.
.PP
Właściwie, jedyną ręczną operacją, którą musi wykonać tłumacz jest część
oznaczona {ręczna edycja}. Przykro nam, po4a tylko pomaga tłumaczyć, ale
niestety niczego za Ciebie nie przetłumaczy...
.SS "\s-1JAK\s0 zacząć nowe tłumaczenie?"
.IX Subsection "JAK zacząć nowe tłumaczenie?"
Ta sekcja opisuje kroki niezbędne do rozpoczęcia nowego tłumaczenia z
użyciem po4a. Konwertowanie istniejącego projektu do tego systemu opisano w
szczegółach w odpowiedniej sekcji.
.PP
Aby zacząć nowe tłumaczenie, używając po4a, należy wykonać następujące
kroki:
.IP "\-" 2
Wyciągnąć tekst do przetłumaczenia z oryginalnego dokumentu
<\fImaster.doc\fR> do nowego szablonu pliku
<\fItłumaczenie.pot\fR> (w formacie programu gettext). Aby to zrobić,
należy wywołać program \fBpo4a\-gettextize\fR w następujący sposób:
.Sp
.Vb 1
\&  $ po4a\-gettextize \-f <format> \-m <master.doc> \-p <tłumaczenie.pot>
.Ve
.Sp
<\fIformat\fR> jest oczywiście formatem używanym w dokumencie
\&\fImaster.doc\fR. Jak można oczekiwać, plikiem wyjściowym jest
\&\fItłumaczenie.pot\fR. Więcej szczegółów o dostępnych opcjach można znaleźć w
\&\fIpo4a\-gettextize\fR\|(1).
.IP "\-" 2
Przetłumaczyć to, co jest do przetłumaczenia. W tym celu należy zmienić
nazwę pliku \s-1POT\s0 na przykład na \fIdoc.XX.po\fR (gdzie \fI\s-1XX\s0\fR jest kodem \s-1ISO639\s0
języka, na który się tłumaczy, np. \fBfr\fR dla języka francuskiego) i edytować
powstały plik. Zazwyczaj dobrym pomysłem jest nienazywanie tego pliku
\&\fI\s-1XX\s0.po\fR, aby uniknąć pomylenia z tłumaczeniem komunikatów programu, ale
wybór należy do Ciebie. Proszę nie zapominać o uaktualnieniu nagłówków pliku
\&\s-1PO\s0; są one bardzo ważne.
.Sp
Do tłumaczenia można wykorzystać tryb \s-1PO\s0 Emacsa lub Vi, program Lokalize
(oparty na \s-1KDE\s0), Gtranslator (oparty na \s-1GNOME\s0) lub jakikolwiek inny program,
w zależności od upodobań tłumacza (np. Virtaal).
.Sp
Aby dowiedzieć się czegoś więcej, stanowczo powinno się przeczytać
dokumentację programu gettext, dostępną w pakiecie \fBgettext-doc\fR.
.SS "\s-1JAK\s0 zamienić tłumaczenie z powrotem do pliku dokumentacji?"
.IX Subsection "JAK zamienić tłumaczenie z powrotem do pliku dokumentacji?"
Po zakończeniu tłumaczenia zapewne należałoby wygenerować przetłumaczone
dokumenty i rozdystrybuować je wśród użytkowników, razem z oryginalnymi
dokumentami. Aby to zrobić, należy użyć programu \fIpo4a\-translate\fR\|(1) w ten
sposób (\fI\s-1XX\s0\fR jest kodem języka):
.PP
.Vb 1
\&  $ po4a\-translate \-f <format> \-m <master.doc> \-p <doc.XX.po> \-l <XX.doc>
.Ve
.PP
Jak wcześniej, <\fIformat\fR> jest formatem dokumentu
\&\fImaster.doc\fR. Jednak tym razem plik \s-1PO\s0, przekazany w opcji \fB\-p\fR, jest
częścią wejścia \- jest to Twoje tłumaczenie. Wyjście jest zapisywane w
\&\fI\s-1XX\s0.doc\fR.
.PP
Więcej szczegółów można znaleźć w <\fIpo4a\-translate\fR\|(1)>.
.SS "\s-1JAK\s0 zaktualizować tłumaczenie programem po4a?"
.IX Subsection "JAK zaktualizować tłumaczenie programem po4a?"
Aby zaktualizować tłumaczenie, gdy zmieni się oryginalny plik \fImaster.doc\fR,
należy użyć \fIpo4a\-updatepo\fR\|(1) w następujący sposób:
.PP
.Vb 1
\&  $ po4a\-updatepo \-f <format> \-m <nowy_master.doc> \-p <stary_doc.XX.po>
.Ve
.PP
(Więcej szczegółów można znaleźć w <\fIpo4a\-updatepo\fR\|(1)>).
.PP
Oczywiście ta operacja nie spowoduje automagicznego przetłumaczenia nowych
akapitów oryginalnego dokumentu. Należy ręcznie uaktualnić plik \s-1PO\s0. Podobnie
należy zaktualizować tłumaczenie akapitów, które się choć trochę
zmieniły. Aby mieć pewność, że żadnego z nich nie ominiesz, zostały one
zaznaczone jako \*(L"fuzzy\*(R" (niepewne) i zanim \fBpo4a\-translate\fR będzie mógł ich
użyć, to zaznaczenie musi zostać usunięte. Tak jak w przypadku pierwszego
tłumaczenia najlepiej jest użyć ulubionego edytora.
.PP
Kiedy plik \s-1PO\s0 będzie znowu aktualny, bez żadnych wpisów nieprzetłumaczonych
lub niepewnych (\*(L"fuzzy\*(R"), można wygenerować przetłumaczony plik
dokumentacji, tak jak to opisano w poprzedniej sekcji.
.SS "\s-1JAK\s0 skonwertować istniejące tłumaczenia do po4a?"
.IX Subsection "JAK skonwertować istniejące tłumaczenia do po4a?"
Często się zdarzało, że tłumaczyłeś dokument ręcznie dopóty, dopóki nie
nastąpiła większa reorganizacja oryginalnego dokumentu \fImaster.doc\fR. W tej
sytuacji, po kilku nieprzyjemnych próbach z diffem lub podobnymi
narzędziami, możesz zechcieć skonwertować dokument do po4a. Oczywiście
należy go skonwertować tak, aby nie utracić istniejących tłumaczeń. Nie
należy się obawiać, ten przypadek także jest obsługiwany przez po4a i jest
nazywany procesem przechodzenia do formatu gettext.
.PP
Kluczową kwestią jest to, aby struktura tłumaczonego dokumentu była taka
sama jak oryginału, tak żeby narzędzia mogły odpowiednio dopasować
zawartość.
.PP
Jeśli masz szczęście (tj. struktura obu dokumentów dokładnie do siebie
pasuje), wszystko zadziała bez żadnego problemu i będzie gotowe w ciągu paru
sekund. W przeciwnym razie możesz zrozumieć dlaczego ten proces ma taką
brzydką nazwę i przygotuj się na dość nieprzyjemną pracę. W każdym razie,
pamiętaj, że jest to cena za komfort, który później dostarczy po4a. Dobre w
tym wszystkim jest to, że trzeba to zrobić tylko raz.
.PP
Nie będę się długo nad tym rozwodził. Aby ułatwić proces, ważne jest
znalezienie dokładnie tej wersji oryginału, która była
przetłumaczona. Najlepiej, jeśli zanotowałeś sobie wersję z CVS-u dokumentu
użytego do tłumaczenia i jej nie modyfikowałeś w procesie tłumaczenia, tak
że możesz jej teraz użyć.
.PP
Nie zadziała to dobrze, jeśli użyje się uaktualnionego tekstu oryginału ze
starym tłumaczeniem. Pozostaje to możliwe, ale jest to trudniejsze i
naprawdę powinno się tego unikać, gdy tylko jest to możliwe. Jeżeli nie
udało Ci się znaleźć ponownie starego oryginału, to najlepszym rozwiązaniem
jest znalezienie kogoś, kto przeprowadzi za Ciebie proces przechodzenia na
format gettext (ale, proszę, niech nie będę to ja ;).
.PP
Być może zbytnio w tym momencie dramatyzuję. Jednak nawet, gdy proces się
nie udaje, pozostaje mimo wszystko szybszą drogą niż tłumaczenie wszystkiego
od nowa. Udało mi się przepuścić przez ten proces francuskie tłumaczenie
dokumentacji Perla w ciągu jednego dnia, nawet wtedy, gdy \fBwszystko\fR szło
źle. Było to ponad dwa megabajty tekstu, którego tłumaczenie od nowa
trwałoby miesiącami lub dłużej.
.PP
Proszę najpierw pozwolić mi wyjaśnić podstawy tej procedury, a potem powrócę
do wskazówek, co zrobić, gdy proces się nie udaje. Dla lepszego zrozumienia,
ponownie użyjemy powyższego przykładu.
.PP
Jeżeli jest dostępny stary plik \fImaster.doc\fR z odpowiadającymi mu
tłumaczeniami \fI\s-1XX\s0.doc\fR, przechodzenie do formatu gettext można zrobić
bezpośrednio do pliku \fIdoc.XX.po\fR bez ręcznego tłumaczenia pliku
\&\fItłumaczenie.pot\fR:
.PP
.Vb 1
\& $ po4a\-gettextize \-f <format> \-m <stary_oryginał.doc> \-l <XX.doc> \-p <doc.XX.po>
.Ve
.PP
Jeśli masz szczęście, to to wszystko. Stare tłumaczenia zostały
skonwertowane do po4a i można od razu zacząć ich aktualizowanie. Należy
tylko trzymając się procedury opisanej kilka sekcji wcześniej,
zsynchronizować plik \s-1PO\s0 z najnowszym oryginalnym dokumentem i odpowiednio
zaktualizować tłumaczenia.
.PP
Proszę zauważyć, że nawet jeśli wydaje się, że wszystko zadziałało
poprawnie, może się okazać, że jednak wystąpiły błędy podczas tego
procesu. Po4a nie rozumie przetwarzanych tekstów, więc nie może być być
pewne, że tłumaczenia są poprawnie przypisane do oryginałów. Dlatego
wszystkie komunikaty są oznaczone jako \*(L"fuzzy\*(R" (niepewne). Przed usunięciem
tych znaczników, proszę uważnie sprawdzić każde tłumaczenie.
.PP
Bardzo często struktury dokumentów nie pasują dokładnie do siebie, przez co
\&\fBpo4a\-gettextize\fR nie może poprawnie wykonać swojego zadania. W tym punkcie
gra toczy się o to, aby tak pozmieniać pliki, aby ich cholerne struktury
sobie odpowiadały.
.PP
Pomocne może być przeczytanie poniżej sekcji \fBProces przekształcania do
formatu gettext: jak to działa?\fR. Zrozumienie wewnętrznych procesów pomoże
wykonać zadanie. Plusem jest to, że w razie niepowodzenia,
\&\fBpo4a\-gettextize\fR głośno powie, co poszło źle, umożliwiając poznanie
komunikatów, które do siebie nie pasowały, ich pozycję w tekście i typ
każdego z nich. Co więcej, plik \s-1PO\s0 wygenerowany do tej pory, będzie
zachowany jako \fBgettextization.failed.po\fR.
.IP "\-" 4
Należy usunąć wszystkie dodatkowe części tłumaczenia, takie jak sekcja, w
której podano nazwisko tłumacza i podziękowania dla wszystkich ludzi, którzy
pomagali przy tłumaczeniu. Później takie części będzie można z powrotem
dodać, używając załączników, opisanych w następnym rozdziale.
.IP "\-" 4
Nie wahaj się edytować zarówno pliku oryginalnego, jak i jego
tłumaczenia. Najważniejszą rzeczą jest otrzymanie pliku \s-1PO\s0. Potem będzie
można go zaktualizować. Edytowanie tłumaczeń powinno być jednak preferowane,
ponieważ uprości to pewne rzeczy po zakończeniu się procesu przekształcania
na format gettext.
.IP "\-" 4
Jeśli jest taka potrzeba, należy usunąć kilka części oryginalnego dokumentu,
które nie są przetłumaczone. Później podczas synchronizowania \s-1PO\s0 z
dokumentem części te się pojawią same.
.IP "\-" 4
Jeśli w niewielkim stopniu zmieniłeś strukturę dokumentu (połączenie dwóch
akapitów, albo podzielenie innego akapitu), wycofaj te zmiany. Jeśli te
zmiany miały związek z problemami występującym w oryginalnym dokumencie,
powinieneś poinformować o nich jego autora. Korzyści z poprawienie ich tylko
w Twoim tłumaczeniu będzie miała tyko część społeczności. Co więcej, takie
poprawki nie są możliwe, gdy się używa po4a.
.IP "\-" 4
Czasami zawartości akapitów się zgadzają, ale ich typy nie. Poprawienie tego
zależy od formatu. W formatach \s-1POD\s0 i man, często bierze się to z tego, że
jeden z tych dwóch akapitów zawiera linię zaczynającą się od białego znaku,
a drugi \- nie. W tych formatach tekst takich akapitów nie może być zawijany
i dlatego występuje niezgodność typów. Rozwiązaniem jest usunięcie
spacji. Może to być także literówka w nazwie elementu.
.Sp
Podobnie, dwa akapity mogą zostać scalone razem w formacie \s-1POD\s0, jeżeli
rozdzielająca linia zawiera spacje lub kiedy brakuje pustej linii przed
linią ==item i zawartością tego elementu.
.IP "\-" 4
Czasami występuje rozsynchronizowanie między plikami i tłumaczenie jest
przypisane do złego akapitu oryginału. Jest to oznaka, że w rzeczywistości
problem leży w plikach. Proszę znaleźć w \fIgettextization.failed.po\fR
miejsce, gdzie zaczyna się rozsynchronizowanie, a następnie poprawić w tym
miejscu pliki wejściowe.
.IP "\-" 4
Czasami może się wydawać, że po4a zjadło jakąś część tekstu albo z
oryginału, albo z tłumaczenia. \fIgettextization.failed.po\fR wskazuje, że oba
pliki dokładnie do siebie pasowały, a przetwarzanie kończy się błędem
ponieważ nastąpiła próba dopasowania jakiegoś akapitu do akapitu po (lub
przed) tym właściwym, tak jakby ten właściwy się ulotnił. Można tylko kląć
na po4a, tak jak ja kląłem, gdy mi się to zdarzyło po raz pierwszy. Serio.
.Sp
Ta nieszczęśliwa sytuacja zdarza się, kiedy ten sam akapit jest powtórzony w
dokumencie. W tym przypadku nie jest tworzony nowy wpis w pliku \s-1PO\s0, ale
dodawane jest tylko nowe odwołanie do już istniejącego wpisu.
.Sp
Tak więc, kiedy ten sam akapit pojawia się dwa razy w oryginalnym
dokumencie, ale nie jest przetłumaczony w dokładnie ten sam sposób, można
mieć wrażenie, że ten akapit oryginału zniknął. Wystarczy usunąć nowe
tłumaczenie. Jeśli preferowałbyś usunięcie pierwszego z tych tłumaczeń, bo
drugie jest lepsze, po prostu przenieś drugie tłumaczenie w miejsce
pierwszego.
.Sp
Odwrotnie, jeśli dwa podobne, ale jednak różne, akapity były przetłumaczone
dokładnie tak samo, to jeden akapit tłumaczenia zniknie. Rozwiązaniem jest
dodanie głupiego tekstu do oryginalnego akapitu (takiego jak \*(L"różnię
się\*(R"). Nie trzeba się tego bać, takie rzeczy znikną podczas synchronizacji,
a kiedy taki tekst jest wystarczająco krótki, gettext dopasuje Twoje
tłumaczenie do istniejącego tekstu (oznaczając je jako niepewne [\*(L"fuzzy\*(R"],
czym nie powinno się przejmować, gdyż wszystkie komunikaty są tak oznaczone
zaraz po procesie przekształcania na format gettext).
.PP
Mamy nadzieję, że te porady pomogą w procesie przekształcania do formatu
gettext i w otrzymaniu pliku \s-1PO\s0. Można teraz ten plik zsynchronizować i
zacząć go tłumaczyć. Proszę zauważyć, że w wypadku długich plików, pierwsza
synchronizacja może zająć dużo czasu.
.PP
Na przykład, pierwsze wykonanie \fBpo4a\-updatepo\fR na francuskim tłumaczeniu
dokumentacji Perla (plik \s-1PO\s0 o rozmiarze 5.5 Mb) zajęło około dwóch dni na
komputerze 1Ghz G5. Tak, 48 godzin. Ale kolejne zajmują tylko kilkanaście
sekund na moim starym laptopie. Dzieje się tak, ponieważ na samym początku
większość msgid pliku \s-1PO\s0 nie pasuje do żadnego msgid w pliku \s-1POT\s0. Wymusza to
na programie gettext wyszukiwanie najbardziej zbliżonego msgid, używając
kosztownego algorytmu bliskości łańcuchów znaków.
.SS "\s-1JAK\s0 dodać dodatkowy tekst do tłumaczeń (np. nazwisko tłumacza)?"
.IX Subsection "JAK dodać dodatkowy tekst do tłumaczeń (np. nazwisko tłumacza)?"
Z powodu rozwiązań stosowanych przez gettext, zrobienie tego może być
trudniejsze w po4a niż było wcześniej, kiedy to plik był po prostu ręcznie
edytowany. Jednak pozostaje to możliwe, dzięki tak zwanym \fBzałącznikom\fR.
.PP
Dla lepszego zrozumienia można przyjąć, że załączniki są rodzajem łat
(patch) aplikowanych do przetłumaczonego dokumentu po zakończeniu
przetwarzania. Różnią się one od zwykłych łat (mają tylko jedną linię
kontekstu, która może zawierać wyrażenie regularne Perla, i mogą tylko
dodawać nowy tekst bez usuwania czegokolwiek), ale funkcjonalność jest taka
sama.
.PP
Celem jest danie tłumaczowi możliwości dołączenie do dokumentu dodatkowej
zawartości, która nie jest tłumaczeniem oryginalnego dokumentu. Najczęściej
używany jest do dodawania sekcji dotyczącej samego tłumaczenia, wypisania
współpracowników lub podania sposobu zgłaszania błędów znalezionych w
tłumaczeniu.
.PP
Załącznik musi być podany jako osobny plik, którego pierwsza linia zawiera
nagłówek określający, gdzie należy umieścić tekst załącznika. Reszta pliku
załącznika będzie umieszczona bez zmian w określonej pozycji wynikowego
dokumentu.
.PP
Składnia nagłówka jest całkiem sztywna: musi zaczynać się od tekstu
\&\fB\s-1PO4A\-HEADER:\s0\fR poprzedzającego rozdzieloną średnikami (\fB;\fR) listę pól
\&\fIklucz\fR\fB=\fR\fIwartość\fR. Spacje SĄ istotne. Proszę zauważyć, że nie można
użyć średników (\fB;\fR) w wartości, a ich cytowanie za pomocą odwrotnego
ukośnika nie pomaga.
.PP
Tak, brzmi to strasznie, ale poniższe przykłady powinny pomóc w napisaniu
odpowiedniej linii nagłówka. Aby zilustrować dyskusję, załóżmy, że chcemy
dodać sekcję \*(L"O tłumaczeniu\*(R" zaraz po sekcji \*(L"O dokumencie\*(R".
.PP
Kilka możliwych kluczy nagłówka:
.IP "\fBposition\fR (obowiązkowe)" 4
.IX Item "position (obowiązkowe)"
wyrażenie regularne. Załącznik będzie umieszczony w pobliżu linii pasującej
do wyrażenia regularnego. Proszę zauważyć, że mówimy tutaj o dokumencie
przetłumaczonym, a nie o oryginale. Jeśli więcej niż jedna linia pasuje do
tego wyrażenia, dodawanie załącznika się nie powiedzie. Istotnie, lepiej
jest zgłosić błąd niż wstawić załącznik w nieodpowiednie miejsc.
.Sp
Tę linię będziemy dalej nazywać \fIpunktem pozycji\fR. Punkt, w którym
załącznik jest dodawany nazwiemy \fIpunktem wstawienia\fR. Te dwa punkty są
blisko siebie, ale nie są sobie równe. Na przykład, aby dodać nową sekcję
łatwiej zaczepić \fIpunkt pozycji\fR na tytule poprzedniej sekcji i wytłumaczyć
programowi po4a, gdzie ta sekcja się kończy (należy pamiętać, że \fIpunkt
pozycji\fR jest podany przez wyrażenie regularne, które powinno dopasowywać
się do pojedynczej linii).
.Sp
Zależność miejsca \fIpunktu wstawienia\fR w stosunku do \fIpunkty pozycji\fR jest
określana przez pola \fBmode\fR, \fBbeginboundary\fR i \fBendboundary\fR, opisane
poniżej.
.Sp
W naszym przypadku byłoby to:
.Sp
.Vb 1
\&     position=<title>O dokumencie</title>
.Ve
.IP "\fBmode\fR (obowiązkowe)" 4
.IX Item "mode (obowiązkowe)"
Może być to jeden z następujących łańcuchów znaków: \fBbefore\fR (= przed) lub
\&\fBafter\fR (= po), określających pozycję dodatku w stosunku do \fIpunktu
pozycji\fR.
.Sp
Ponieważ chcemy nową sekcję umieścić pod tą, którą wyszukaliśmy, mamy:
.Sp
.Vb 1
\&     mode=after
.Ve
.IP "\fBbeginboundary\fR (używany, gdy \fBmode=after\fR i obowiązkowy w tym wypadku)" 4
.IX Item "beginboundary (używany, gdy mode=after i obowiązkowy w tym wypadku)"
.PD 0
.IP "\fBendboundary\fR (jak wyżej)" 4
.IX Item "endboundary (jak wyżej)"
.PD
wyrażenie regularne pasujące do końca sekcji, po której jest dodawany
załącznik.
.Sp
W trybie \fBafter\fR \fIpunkt wstawienia\fR jest za \fIpunktem pozycji\fR, ale nie
bezpośrednio za! Jest on umieszczony na końcu sekcji zaczynającej się w
\&\fIpunkcie pozycji\fR, czyli za albo przed linią pasującą do argumentu
\&\fI???\fR\fBboundary\fR w zależności od tego, czy było użyte \fBbeginboundary\fR, czy
\&\fBendboundary\fR.
.Sp
W rozpatrywanym przypadku możemy wybrać wskazanie końca dopasowywanej
sekcji, dodając:
.Sp
.Vb 1
\&   endboundary=</section>
.Ve
.Sp
albo możemy wskazać początek kolejnej sekcji w następujący sposób:
.Sp
.Vb 1
\&   beginboundary=<section>
.Ve
.Sp
W obu wypadkach załącznik będzie umieszczony po \fB</section>\fR, a
przed \fB<section>\fR. Ten pierwszy sposób działa lepiej, ponieważ
zadziała nawet wtedy, gdy dokument zostanie zreorganizowany.
.Sp
Obie formy istnieją ponieważ formaty dokumentacji są różne. Niektóre z nich
zawierają znacznik końca sekcji (tak jak \fB</section>\fR, której
właśnie użyliśmy), a inne (np. man) tego końca nie oznaczają w żaden
szczególny sposób. W pierwszym przypadku \fIboundary\fR powinno odpowiadać
\&\fIkońcowi sekcji\fR, tak że \fIpunkt wstawienia\fR następuje po niej. W drugim
przypadku \fIboundary\fR powinno pasować do \fIpoczątku następnej sekcji\fR, a
\&\fIpunkt wstawienia\fR powinien być umieszczony zaraz przed nią.
.PP
Może się to wydawać niejasne, następne przykłady powinny co nieco
wyklarować.
.ie n .IP "Podsumowując przykłady podane do tej pory: aby dodać sekcję ""O tłumaczeniu"" po sekcji ""O dokumencie"" w dokumencie \s-1SGML\s0, należy użyć jednej z poniższych linii nagłówka:" 2
.el .IP "Podsumowując przykłady podane do tej pory: aby dodać sekcję ``O tłumaczeniu'' po sekcji ``O dokumencie'' w dokumencie \s-1SGML\s0, należy użyć jednej z poniższych linii nagłówka:" 2
.IX Item "Podsumowując przykłady podane do tej pory: aby dodać sekcję O tłumaczeniu po sekcji O dokumencie w dokumencie SGML, należy użyć jednej z poniższych linii nagłówka:"
.Vb 2
\& PO4A\-HEADER: mode=after; position=O dokumencie; endboundary=</section>
\& PO4A\-HEADER: mode=after; position=O dokumencie; beginboundary=<section>
.Ve
.IP "Aby dodać coś po następującej sekcji nroff:" 2
.IX Item "Aby dodać coś po następującej sekcji nroff:"
.Vb 1
\&  .SH "AUTORZY"
.Ve
.Sp
powinno się ustawić \fBpositon\fR pasujące do tej linii oraz \fBbeginboundary\fR
pasujące do początku następnej sekcji (tj. \fB^\e.SH\fR). Załącznik zostanie
dodany \fBpo\fR \fIpunkcie pozycji\fR i zaraz \fBprzed\fR pierwszą linią pasującą do
\&\fBbeginboundary\fR. Czyli:
.Sp
.Vb 1
\& PO4A\-HEADER:mode=after;position=AUTORZY;beginboundary=\e.SH
.Ve
.ie n .IP "Aby zamiast dodawać całą sekcję, dodać coś do jakiejś sekcji (np. po ""Copyright Big Dude""), trzeba podać \fBposition\fR pasujące do tej linii i \fBbeginboundary\fR pasujące do jakiejkolwiek linii." 2
.el .IP "Aby zamiast dodawać całą sekcję, dodać coś do jakiejś sekcji (np. po ``Copyright Big Dude''), trzeba podać \fBposition\fR pasujące do tej linii i \fBbeginboundary\fR pasujące do jakiejkolwiek linii." 2
.IX Item "Aby zamiast dodawać całą sekcję, dodać coś do jakiejś sekcji (np. po Copyright Big Dude), trzeba podać position pasujące do tej linii i beginboundary pasujące do jakiejkolwiek linii."
.Vb 1
\& PO4A\-HEADER:mode=after;position=Copyright Big Dude, 2004;beginboundary=^
.Ve
.ie n .IP "Aby dodać coś na końcu dokumentu, należy podać \fBposition\fR pasujące do jakiejkolwiek linii pliku (ale tylko jednej linii. Po4a nie przetworzy tego, jeśli linia nie będzie unikatowa) i podać \fBendboundary\fR nie pasujące do niczego. Nie należy używać tutaj prostych tekstów jak \fB""\s-1EOF\s0""\fR, tylko takich, które mają małe szanse pojawienia się w dokumencie." 2
.el .IP "Aby dodać coś na końcu dokumentu, należy podać \fBposition\fR pasujące do jakiejkolwiek linii pliku (ale tylko jednej linii. Po4a nie przetworzy tego, jeśli linia nie będzie unikatowa) i podać \fBendboundary\fR nie pasujące do niczego. Nie należy używać tutaj prostych tekstów jak \fB``\s-1EOF\s0''\fR, tylko takich, które mają małe szanse pojawienia się w dokumencie." 2
.IX Item "Aby dodać coś na końcu dokumentu, należy podać position pasujące do jakiejkolwiek linii pliku (ale tylko jednej linii. Po4a nie przetworzy tego, jeśli linia nie będzie unikatowa) i podać endboundary nie pasujące do niczego. Nie należy używać tutaj prostych tekstów jak EOF, tylko takich, które mają małe szanse pojawienia się w dokumencie."
.Vb 1
\& PO4A\-HEADER:mode=after;position=<title>O dokumencie</title>;beginboundary=NieistniejąaLiniaPo4a
.Ve
.PP
W każdym wypadku należy pamiętać, że są to wyrażenia regularne. Na przykład,
aby dopasować koniec sekcji nroff, kończącej się linią
.PP
.Vb 1
\&  .fi
.Ve
.PP
nie należy używać \fB.fi\fR jako \fBendboundary\fR, ponieważ będzie on pasował do
\&\*(L"the[ fi]le\*(R" co raczej nie jest tym, czego można by oczekiwać. Poprawnym
\&\fBendboundary\fR w tym przypadku jest \fB^\e.fi$\fR.
.PP
Jeśli załącznik nie trafił tam, gdzie powinien, spróbuj przekazać narzędziom
po4a argument \fB\-vv\fR, który powinien pomóc wyjaśnić co się dzieje podczas
dodawania załącznika.
.PP
\fIBardziej szczegółowy przykład\fR
.IX Subsection "Bardziej szczegółowy przykład"
.PP
Oryginalny dokument (w formacie \s-1POD\s0):
.PP
.Vb 7
\& |=head1 NAZWA
\& |
\& |dummy \- fikcyjny program
\& |
\& |=head1 AUTOR
\& |
\& |ja
.Ve
.PP
Wtedy następujący dodatek spowoduje dodanie sekcji (w języku francuskim) na
koniec tego pliku (w jęz. francuskim \*(L"\s-1TRADUCTEUR\s0\*(R" oznacza \*(L"TŁUMACZ\*(R", a \*(L"moi\*(R"
znaczy \*(L"ja\*(R")
.PP
.Vb 5
\& |PO4A\-HEADER:mode=after;position=AUTEUR;beginboundary=^=head
\& |
\& |=head1 TRADUCTEUR
\& |
\& |moi
.Ve
.PP
Aby umieścić dodatek przed sekcją \s-1AUTOR\s0, należy użyć następującego nagłówka:
.PP
.Vb 1
\& PO4A\-HEADER:mode=after;position=NOM;beginboundary=^=head1
.Ve
.PP
To działa, ponieważ następną linią pasującą do \fBbeginboundary\fR /^=head1/ po
sekcji \*(L"\s-1NAZWA\s0\*(R" (przetłumaczonej na francuskie \*(L"\s-1NOM\s0\*(R") jest linia opisująca
autorów. Tak więc załącznik zostanie umieszczony pomiędzy obiema sekcjami.
.SS "\s-1JAK\s0 to wszystko zrobić, wywołując tylko jeden program?"
.IX Subsection "JAK to wszystko zrobić, wywołując tylko jeden program?"
Użytkownicy udowodnili, że takie użycie po4a jest narażone na błędy,
ponieważ należy we właściwym porządku wywołać dwa różne programy
(\fBpo4a\-updatepo\fR, a następnie \fBpo4a\-translate\fR), z których każdy wymaga
podania więcej niż 3 argumentów. Co więcej, w tym systemie było trudno użyć
tylko jednego pliku \s-1PO\s0 dla wszystkich dokumentów, kiedy użyto więcej niż
jednego formatu.
.PP
Program \fIpo4a\fR\|(1) zaprojektowano, aby rozwiązać te trudności. Kiedy tylko
projekt zostanie skonwertowany do tego systemu, można napisać prosty plik
konfiguracyjny opisujący miejsce położenia plików tłumaczeń (\s-1PO\s0 i \s-1POT\s0) i
oryginalnych dokumentów, ich formaty oraz miejsce, gdzie powinny trafiać
przetłumaczone dokumenty.
.PP
Uruchomienie \fIpo4a\fR\|(1) na tym pliku spowoduje zsynchronizowanie wszystkich
plików \s-1PO\s0 z oryginalnym dokumentem, tak żeby przetłumaczony dokument został
poprawnie wygenerowany. Oczywiście należy ten program wywołać dwa razy: raz
przed edytowaniem pliku \s-1PO\s0, żeby go zaktualizować, i raz po jego edycji, aby
otrzymać całkowicie aktualny przetłumaczony dokument . Tylko że potrzebujesz
zapamiętać tylko jedną komendę linii poleceń.
.SS "\s-1JAK\s0 dostosować po4a do własnych potrzeb?"
.IX Subsection "JAK dostosować po4a do własnych potrzeb?"
Moduły po4a mają opcje (określane przez \fB\-o\fR opcja), których można użyć,
żeby zmienić zachowanie modułów.
.PP
Możliwe jest także dostosowywanie modułu oraz modułu nowego / pochodnego /
zmodyfikowanego przez umieszczenie go w katalogu \fIlib/Locale/Po4a/\fR i
dodanie \fIlib\fR do ścieżki określonej w zmiennej środowiskowej \s-1PERLLIB\s0 lub
\&\s-1PERL5LIB\s0. Na przykład:
.PP
.Vb 1
\&   PERLLIB=$PWD/lib po4a \-\-previous po4a/po4a.cfg
.Ve
.PP
Uwaga: rzeczywista nazwa katalogu lib nie jest istotna.
.SH "Jak to działa?"
.IX Header "Jak to działa?"
Ten rozdział zawiera krótki opis wewnętrznych mechanizmów po4a, tak że
będziesz miał więcej odwagi, aby pomóc nam w jego tworzeniu i
udoskonalaniu. Może także Ci pomóc w zrozumieniu, dlaczego nie działa tak,
jak byś tego oczekiwał, oraz jak rozwiązać napotkane problemy.
.SS "Jak wyglądają szczegóły?"
.IX Subsection "Jak wyglądają szczegóły?"
Architektura po4a jest zorientowana obiektowo (w Perlu, czy to nie
eleganckie?). Wspólny przodek wszystkich klas parserów zwie się
TransTractor. Ta dziwna nazwa wzięła się stąd, że jest on odpowiedzialny za
tłumaczenie dokumentu i wydobywanie komunikatów.
.PP
Bardziej formalnie mówiąc, pobiera dokument do przetłumaczenia oraz plik \s-1PO\s0
zawierający tłumaczenia używany jako wejście podczas tworzenia dwóch
oddzielnych plików wyjściowych: innego pliku \s-1PO\s0 (wyniku wyodrębniania
komunikatów z dokumentu wejściowego) oraz przetłumaczonego dokumentu
(mającego taką samą strukturę jak plik wejściowy, ale ze wszystkimi
komunikatami zamienionymi na zawartość wejściowego pliku \s-1PO\s0). Poniżej jest
graficzne przedstawienie tego procesu:
.PP
.Vb 6
\&   Dokument wejściowy \-\e                          /\-> Dokument wyjściowy
\&                        \e      TransTractor::    /    (przetłumaczony)
\&                         +\-\->\-\-   parse()  \-\-\- \-+
\&                        /                        \e
\&   Wejściowy PO \-\-\-\-\-\-\-/                          \e\-\-\-> Wyjściowy PO
\&                                                        (wyodrębniony)
.Ve
.PP
Ta mała kość jest podstawą całej architektury po4a. Jeśli pominiesz
wejściowy plik \s-1PO\s0 i dokument wyjściowy, otrzymasz \fBpo4a\-gettextize\fR. Jeśli
podasz oba pliki wejściowe i zlekceważysz wyjściowy plik \s-1PO\s0, otrzymasz
\&\fBpo4a\-translate\fR.
.PP
\&\fITransTractor::parse()\fR jest wirtualną funkcją zaimplementowaną w każdym
module. Tutaj podano prosty przykład, żeby zobrazować jej
działanie. Przetwarza listę akapitów, z których każdy zaczyna się od
\&\fB<p>\fR.
.PP
.Vb 10
\&  1 sub parse {
\&  2   PARAGRAPH: while (1) {
\&  3     $my ($paragraph,$pararef,$line,$lref)=("","","","");
\&  4     $my $first=1;
\&  5     while (($line,$lref)=$document\->shiftline() && defined($line)) {
\&  6       if ($line =~ m/<p>/ && !$first\-\-; ) {
\&  7         $document\->unshiftline($line,$lref);
\&  8
\&  9         $paragraph =~ s/^<p>//s;
\& 10         $document\->pushline("<p>".$document\->translate($paragraph,$pararef));
\& 11
\& 12         next PARAGRAPH;
\& 13       } else {
\& 14         $paragraph .= $line;
\& 15         $pararef = $lref unless(length($pararef));
\& 16       }
\& 17     }
\& 18     return; # Nie otrzymano linii? Koniec pliku wejściowego.
\& 19   }
\& 20 }
.Ve
.PP
W linii 6. po raz drugi napotkaliśmy \fB<p>\fR. Oznacza to kolejny
akapit. Powinniśmy dlatego zwrócić otrzymaną linię do oryginalnego dokumentu
(linia 7.), a na wyjście dołożyć akapit zbudowany do tej pory. Po usunięciu
z niego początkowego \fB<p>\fR w linii 9., dokładamy ten element
połączony z tłumaczeniem reszty akapitu.
.PP
Funkcja \fItranslate()\fR jest bardzo fajna (cool ;)). Dodaje swoje argumenty na
koniec wynikowego pliku \s-1PO\s0 (ekstrakcja) i zwraca ich tłumaczenie, znalezione
w wejściowym pliku \s-1PO\s0 (tłumaczenie). Ponieważ jest używana jako część
argumentu \fIpushline()\fR, tłumaczenie ląduje w wynikowym dokumencie.
.PP
Czy to nie jest fajne? Jest możliwe zbudowanie kompletnego modułu po4a w
mniej niż 20 liniach, jeżeli tylko format jest wystarczająco prosty...
.PP
Więcej informacji o tym można znaleźć w
\&\fILocale::Po4a::TransTractor\fR\|(3pm).
.SS "Proces przekształcania do formatu gettext: jak to działa?"
.IX Subsection "Proces przekształcania do formatu gettext: jak to działa?"
Idea jest następująca: pobranie oryginalnego dokumentu i jego tłumaczenia i
powiedzenie, że n\-ty komunikat wyodrębniony z tłumaczenia jest tłumaczeniem
n\-tego komunikatu wyodrębnionego z oryginału. Aby to zadziałało, oba pliki
muszą mieć dokładnie taką samą strukturę. Na przykład, jeżeli pliki mają
poniższą strukturę, to jest raczej niemożliwe, by 4. komunikat tłumaczenia
(typu \*(L"rozdział\*(R") był tłumaczeniem 4. komunikatu oryginału (typu \*(L"akapit\*(R").
.PP
.Vb 1
\&   Oryginał         Tłumaczenie
\&
\&   rozdział          rozdział
\&      akapit            akapit
\&      akapit            akapit
\&      akapit         rozdział
\&   rozdział             akapit
\&      akapit            akapit
.Ve
.PP
Aby to osiągnąć, parsery po4a są używane zarówno na pliku oryginału, jak i
tłumaczenia, żeby utworzyć pliki \s-1PO\s0, a następnie jest budowany z nich trzeci
plik \s-1PO\s0 zawierający komunikaty z drugiego pliku jako tłumaczenia komunikatów
z pierwszego. Aby sprawdzić, że komunikaty, które ze sobą łączymy, są
rzeczywiście odpowiadającymi sobie tłumaczeniami, parsesy dokumentów w po4a
powinny umieszczać informacje o typach składniowych komunikatów
wyodrębnionych z dokumentu (wszystkie istniejące to robią, Twój też
powinien). Następnie te informacje są używane do sprawdzenia, że oba
dokumenty mają tę samą składnię. W poprzednim przykładzie pozwoliło nam to
wykryć, że 4. komunikat jest w jednym przypadku akapitem, a w drugim \-
tytułem rozdziału i zgłosić problem.
.PP
Teoretycznie byłoby możliwe zsynchronizowanie plików po wykryciu problemu
(tak, jak to robi \fBdiff\fR). Niestety, nie jest jasne, co zrobić z
komunikatami, które nie występując w jednym z plików, były przyczyną
rozsynchronizowania. Dlatego obecna implementacja nie stara się
synchronizować plików i zgłasza błąd, kiedy coś poszło źle, wymagając od
użytkownika ręcznego zmodyfikowania plików w celu rozwiązania problemu.
.PP
Nawet z tymi zabezpieczeniami, rzeczy mogą źle się potoczyć. Właśnie dlatego
wszystkie tłumaczenia odgadnięte w ten sposób są zaznaczane jako niepewne
(\*(L"fuzzy\*(R"), aby tłumacz je przejrzał i sprawdził.
.SS "Załącznik: Jak to działa?"
.IX Subsection "Załącznik: Jak to działa?"
Hmm, to całkiem proste. Tłumaczony dokument nie jest bezpośrednio zapisywany
na dysk, ale trzymany w pamięci, dopóki wszystkie załączniki nie zostaną
dodane. Wykorzystane algorytmy są raczej proste. Szukamy linii pasującej do
wyrażenia regularnego określającego pozycję i dodajemy załącznik przed tą
liną, jeśli tryb = \fBbefore\fR. Jeśli nie jesteśmy w tym trybie, to szukamy
następnej linii pasującej do ograniczenia i wstawiamy załącznik po tej
linii, jeśli jest to \fBendboundary\fR, lub przed nią, jeśli jest to
\&\fBbeginboundary\fR.
.SH "FAQ"
.IX Header "FAQ"
Ten rozdział zawiera odpowiedzi na często zadawane pytania. Tak naprawdę,
większość tych pytań może być sformułowanych jako \*(L"Dlaczego po4a zostało
zaprojektowane tak, a nie inaczej?\*(R". Jeśli wydaje Ci się, że po4a nie jest
właściwym narzędziem do tłumaczenia dokumentacji, powinieneś rozważyć
przeczytanie tego rozdziału. Jeśli nie znajdziesz w nim odpowiedzi na swoje
pytanie, prosimy się z nami skontaktować poprzez listę dyskusyjną
<po4a\-devel@lists.alioth.debian.org>. Uwielbiamy znać opinie
użytkowników.
.SS "Dlaczego trzeba tłumaczyć każdy akapit osobno?"
.IX Subsection "Dlaczego trzeba tłumaczyć każdy akapit osobno?"
Tak, w po4a, każdy akapit jest tłumaczony osobno (w zasadzie, to każdy moduł
o tym decyduje, ale wszystkie istniejące moduły tak robią i Twój także
powinien). Są dwie główne przyczyny takiego rozwiązania:
.IP "\(bu" 2
Kiedy techniczne części dokumentu są ukryte, tłumacz nie może w nich zrobić
bałaganu. Im mniej znaczników pokazujemy tłumaczowi, tym mniej błędów może
popełnić.
.IP "\(bu" 2
Przycinanie dokumentu pomaga odizolować zmiany w oryginalnym
dokumencie. Kiedy oryginał zostanie zmieniony, ten proces uprości wyszukanie
części tłumaczeń potrzebujących aktualizacji.
.PP
Nawet biorąc pod uwagę te plusy, niektórym ludziom nie podoba się osobne
tłumaczenie każdego akapitu. Postaram się odpowiedzieć na ich obawy:
.IP "\(bu" 2
Takie podejście sprawdziło się w projekcie \s-1KDE\s0, pozwalając temu zespołowi na
wyprodukowanie znacznej ilości przetłumaczonej i aktualnej dokumentacji.
.IP "\(bu" 2
Tłumacze mogą wciąż używać kontekstu tłumaczenia, ponieważ wszystkie
komunikaty w pliku \s-1PO\s0 są w takiej samej kolejności jak w oryginalnym
dokumencie. Tłumaczenie sekwencyjne jest podobne, niezależnie, czy używa się
po4a czy nie. I w każdym wypadku najlepszym sposobem otrzymania kontekstu
pozostaje skonwertowanie dokumentu do formatu dokumentu drukowanego,
ponieważ formaty źródłowe tekstu mogą nie być zbyt czytelne.
.IP "\(bu" 2
Takie podejście jest używany przez profesjonalnych tłumaczy. Zgadzam się,
mają oni trochę inne cele niż tłumacze oprogramowania open-source. Na
przykład możliwość łatwego zarządzania tłumaczeniem jest często dla nich
mniej istotna, ponieważ zawartość rzadko się zmienia.
.SS "Dlaczego nie podzielić na zdania (lub mniejsze części)?"
.IX Subsection "Dlaczego nie podzielić na zdania (lub mniejsze części)?"
Profesjonalne narzędzie tłumaczy czasami dzielą dokument na poszczególne
zdania, aby zmaksymalizować wykorzystanie wcześniejszych tłumaczeń i
zwiększyć szybkość tłumaczenia. Problemem jest jednak to, że w zależności od
kontekstu to samo zdanie może mieć kilka tłumaczeń.
.PP
Akapity są z definicji dłuższe niż zdania. Jeżeli w dwóch dokumentach ten
sam akapit występuje, to możemy założyć, że jego znaczenie (i tłumaczenie)
jest takie samo, niezależnie od kontekstu.
.PP
Dzielenie na części mniejsze niż zdania byłoby czymś \fBbardzo niedobrym\fR. Za
dużo miejsca by zajęło napisanie tu wyjaśnienie dlaczego, ale zainteresowany
czytelnik może na przykład przeczytać stronę podręcznika
\&\fILocale::Maketext::TPJ13\fR\|(3pm) (pochodzącą z
dokumentacji Perla). W skrócie, każdy język ma określone zasady składniowe i
nie istnieje taki sposób budowania zdań przez łączenie ich części, który by
działał dla wszystkich istniejących języków (lub nawet dla tylko 5 czy 10
najpopularniejszych).
.SS "Dlaczego nie umieścić oryginału jako komentarza do tłumaczenia (lub w inny sposób)?"
.IX Subsection "Dlaczego nie umieścić oryginału jako komentarza do tłumaczenia (lub w inny sposób)?"
Na pierwszy rzut oka gettext nie wydaje się być przeznaczony do wszystkich
rodzajów tłumaczeń. Na przykład nie wydawał się on być przystosowany do
debconfa, interfejsu wszystkich pakietów Debiana używanego do interakcji z
użytkownikiem podczas instalacji. W tym przypadku teksty do tłumaczenia były
całkiem krótkie (tuzin linii dla każdego pakietu) i było trudno umieścić
tłumaczenie w specjalnym pliku ponieważ musiało być dostępne jeszcze przed
zainstalowaniem pakietu.
.PP
To dlatego opiekun debconfa zdecydował zaimplementować inne rozwiązanie, w
którym tłumaczenia są umieszczane w tym samym pliku, co oryginał. Jest to
pociągające. Ktoś mógłby nawet chcieć coś takiego zrobić dla XML-a na
przykład. Mógłby on wyglądać tak:
.PP
.Vb 3
\& <section>
\&  <title lang="en">My title</title>
\&  <title lang="fr">Mon titre</title>
\&
\&  <para>
\&   <text lang="en">My text.</text>
\&   <text lang="fr">Mon texte.</text>
\&  </para>
\& </section>
.Ve
.PP
Jednak było to na tyle problematyczne, że obecnie jest używane rozwiązanie
oparte na plikach \s-1PO\s0. Tylko oryginalny tekst może być edytowany w pliku, a
tłumaczenia muszą się pojawić w plikach \s-1PO\s0, wyciągniętych z głównego
szablonu (łączonych z powrotem w czasie kompilacji pakietu). Ten stary
system jest potępiany z kilku powodów:
.IP "\(bu" 4
problemy w zarządzaniu
.Sp
Jeżeli kilku tłumaczy dostarczy łatę w tym samym czasie, będzie trudno
połączyć te łaty wszystkie razem.
.Sp
Jak wykryć te zmiany w oryginale, które muszą być zastosowane w
tłumaczeniach? Aby użyć programu diff, trzeba było zanotować wersję
oryginału, która została przetłumaczone. Tj. potrzebujesz pliku \s-1PO\s0 w Twoim
pliku.
.IP "\(bu" 4
problemy z kodowaniem znaków
.Sp
Rozwiązanie to jest dobre tylko dla europejskich języków, jednak
wprowadzenie koreańskiego, rosyjskiego lub arabskiego bardzo wszystko
komplikuje. Rozwiązaniem mógłby być \s-1UTF\s0, jednak wciąż jest z nim kilka
problemów.
.Sp
Co więcej takie problemy są trudne do wychwycenia (tj. tylko Koreańczycy
zauważą że kodowanie znaków w koreańskim tekście jest zepsute [bo tłumacz
był Rosjaninem]).
.PP
gettext rozwiązuje wszystkie te problemy razem.
.SS "Ale gettext nie został zaprojektowany do takiego użycia!"
.IX Subsection "Ale gettext nie został zaprojektowany do takiego użycia!"
To prawda, ale do tej pory nikt nie znalazł lepszego rozwiązania. Jedyną
znaną alternatywą jest ręczne tłumaczenie ze wszystkimi problemami w jego
zarządzaniu.
.SS "Co z innymi narzędziami do tłumaczeń dokumentacji wykorzystującymi gettext?"
.IX Subsection "Co z innymi narzędziami do tłumaczeń dokumentacji wykorzystującymi gettext?"
O ile mi wiadomo, są tylko dwa takie:
.IP "\fBpoxml\fR" 4
.IX Item "poxml"
Jest to narzędzie rozwijane przez ludzi z \s-1KDE\s0 obsługujące format DocBook
\&\s-1XML\s0. O ile mi wiadomo, był to pierwszy program wyciągający łańcuchy znaków
do przetłumaczenia z dokumentacji do plików \s-1PO\s0 i wstawiający je z powrotem
po przetłumaczeniu.
.Sp
Może on obsługiwać tylko \s-1XML\s0 i częściowo \s-1DTD\s0. Jestem bardzo niezadowolony z
obsługi list, które zostają umieszczone w jednym wielkim msgid. Kiedy lista
staje się długa, sprawa się komplikuje.
.IP "\fBpo-debiandoc\fR" 4
.IX Item "po-debiandoc"
Program utworzony przez Denisa Barbiera jest poprzednikiem modułu \s-1SGML\s0 po4a,
który w mniejszym bądź większym stopniu go zastępuje, czyniąc
przestarzałym. Zgodnie ze swą nazwą obsługuje tylko DebianDoc \s-1DTD\s0, który
jest \s-1DTD\s0 mniej lub bardziej przestarzałym.
.PP
Największą zaletą po4a nad nimi jest łatwość umieszczania dodatkowej
zawartości (co jest nawet gorsze tutaj) i przejścia na format gettext.
.SS "Przekazywanie deweloperom wiedzy o tłumaczeniu"
.IX Subsection "Przekazywanie deweloperom wiedzy o tłumaczeniu"
Próbując tłumaczyć dokumentację lub programy można napotkać trzy rodzaje
problemów: lingwistyczne (nie każdy mówi dwoma językami), techniczne (to
dlatego istnieje po4a) i ludzkie. Nie wszyscy deweloperzy rozumieją potrzebę
tłumaczeń. Nawet mając dobre chęci, mogą ignorować potrzebę upraszczania
pracy tłumaczy. Aby w tym pomóc, po4a dostarcza wiele dokumentacji, do
której można się odnosić.
.PP
Innym ważnym punktem jest to, że każdy plik z tłumaczeniem zaczyna się od
krótkiego komentarza określającego, czym jest ten plik i jak go
użyć. Powinno to pomóc deweloperom, zalanym tonami plików w różnych
językach, których nie znają, pomóc w poprawnym obsłużeniu tego.
.PP
W projekcie po4a przetłumaczone dokumenty nie są plikami
źródłowymi. Ponieważ jesteśmy przyzwyczajeni do tego, że pliki sgml są
plikami źródłowymi, łatwo jest o pomyłkę. Dlatego wszystkie pliki zawierają
taki nagłówek:
.PP
.Vb 12
\& |       ****************************************************
\& |       *         PLIK WYGENEROWANY, NIE EDYTOWAĆ          *
\& |       * TO NIE JEST PLIK ŹRÓDŁOWY, ALE WYNIK KOMPILACJI  *
\& |       ****************************************************
\& |
\& | Ten plik został wygenerowany przez po4a\-translate(1). Nie przechowuj go
\& | (na przykład w CVS\-ie), ale przechowuj plik PO, użyty jako plik źródłowy
\& | przez polecenie po4a\-translate.
\& |
\& | Tak naprawdę, potraktuj ten plik jako plik binarny, a plik PO jako zwykły
\& | plik źródłowy: jeśli plik PO zaginie, to będzie trudniej zachować aktualność
\& | tego tłumaczenia ;)
.Ve
.PP
Podobnie, to co należy zrobić ze zwykłymi plikami \s-1PO\s0 programu gettext, to
skopiować je do katalogu \fIpo/\fR. Ale \fBw przypadku plików zarządzanych przez
po4a to nie działa\fR. Największym ryzykiem tutaj jest to, że deweloper usunie
istniejące tłumaczenia jego programu wraz z tłumaczeniami dokumentacji. (Oba
nie mogą być przechowywane w jednym pliku \s-1PO\s0, ponieważ program wymaga
instalacji pliku tłumaczeń jako pliku mo, podczas gdy dokumentacja używa
tłumaczeń w czasie kompilacji). Dlatego pliki \s-1PO\s0 tworzone przez moduł
po-debiandoc zawierają poniższy nagłówek:
.PP
.Vb 10
\& #
\& #  RADY DLA DEWELOPERÓW:
\& #    \- nie trzeba ręcznie edytować plików POT i PO.
\& #    \- ten plik zawiera tłumaczenie Twoich szablonów confiteor.
\& #      Nie zastępuj tłumaczeń Twojego programu tym plikiem !!
\& #        (albo tłumacze będą na Ciebie wściekli)
\& #
\& #  RADY DLA TŁUMACZY:
\& #    Jeśli nie jesteś zaznajomiony z formatem PO, warto przeczytać
\& #    dokumentację pakietu gettext, zwłaszcza sekcje poświęcone
\& #    temu formatowi. Na przykład uruchom:
\& #         info \-n "(gettext)PO Files"
\& #         info \-n "(gettext)Heder Centry"
\& #
\& #    Informacje specyficzne po\-debconf są dostępne w
\& #            /usr/share/doc/po\-debconf/README\-trans
\& #        lub http://www.debian.org/intl/l10n/po\-debconf/README\-trans
\& #
.Ve
.SS "\s-1PODSUMOWANIE\s0 plusów i minusów rozwiązania opartego na gettext"
.IX Subsection "PODSUMOWANIE plusów i minusów rozwiązania opartego na gettext"
.IP "\(bu" 2
Tłumaczenia nie są trzymane wraz z oryginałem, co pozwala w prosty sposób
wykryć, czy tłumaczenia nie są przestarzałe.
.IP "\(bu" 2
Tłumaczenia są przechowywane w oddzielnych plikach, dzięki czemu tłumacze
różnych języków sobie nie przeszkadzają, zarówno kiedy podsyłają swoje
tłumaczenia, jak i kiedy zmieniają kodowanie znaków pliku.
.IP "\(bu" 2
Wewnętrznie jest oparty na pakiecie \fBgettext\fR (ale \fBpo4a\fR oferuje bardzo
prosty interfejs, tak że nie ma potrzeby poznawania wewnętrznych
mechanizmów, aby go użyć). W ten sposób, nie musimy ponownie wymyślać koła,
a ponieważ gettext jest szeroko używany, mamy nadzieję, że w większym lub
mniejszym stopniu jest wolny od błędów.
.IP "\(bu" 2
Z punktu widzenia końcowego użytkownika nic się nie zmieniło (poza tym, że
tłumaczenia są lepiej zarządzane). Wynikowe pliki z dokumentacją są tak samo
dystrybuowane.
.IP "\(bu" 2
Tłumacze nie muszą uczyć się składni nowego pliku i mogą po prostu użyć
swojego ulubionego edytora plików \s-1PO\s0 (jak tryb \s-1PO\s0 Emasca, Lokalize lub
Gtranslator).
.IP "\(bu" 2
gettext udostępnia prosty sposób otrzymania statystyk o tym, co zostało
zrobione, co powinno być przejrzane i zaktualizowane, a co jeszcze jest do
zrobienia. Przykłady można znaleźć \s-1POD\s0 tymi adresami:
.Sp
.Vb 2
\& \- http://kv\-53.narod.ru/kaider1.png
\& \- http://www.debian.org/intl/l10n/
.Ve
.PP
Nie wszystko złoto, co się świeci \- to podejście ma także kilka minusów, z
którymi musimy sobie poradzić.
.IP "\(bu" 2
Na pierwszy rzut oka załączniki są... dziwne.
.IP "\(bu" 2
Nie można dostosowywać tłumaczonego tekstu do własnych upodobań, na przykład
przez podzielenie w danym miejscu na akapity, połączenie dwóch innych
akapitów w jeden. Jednak w pewnym sensie, jeżeli jest jakiś problem z
oryginałem, powinno to zostać zgłoszone jako błąd.
.IP "\(bu" 2
Nawet mając łatwy interfejs, wciąż pozostaje nowym narzędziem, którego
trzeba się uczyć.
.Sp
Jednym z moich marzeń jest zintegrowanie w jakiś sposób po4a z programami
Gtranslator lub Lokalize. Kiedy plik \s-1SGML\s0 jest otwierany, komunikaty zostają
automatycznie wyciągane. Kiedy jest zamykany, przetłumaczony plik jest
zapisywany na dysk. Jeśli uda nam się zrobić moduł \s-1MS\s0 Word (\s-1TM\s0) (a
przynajmniej \s-1RFT\s0), to będą mogli go nawet używać profesjonalni tłumacze.
.SH "AUTORZY"
.IX Header "AUTORZY"
.Vb 2
\& Denis Barbier <barbier,linuxfr.org>
\& Martin Quinson (mquinson#debian.org)
.Ve
.SH "TŁUMACZENIE"
.IX Header "TŁUMACZENIE"
.Vb 1
\& Robert Luberda <robert@debian.org>
.Ve
