Provided by: po4a_0.57-2_all bug

NAZWA

       po4a - narzędzia do tłumaczeń dokumentacji i innych materiałów

Wstęp

       Celem projektu po4a ("PO for anything") 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.

Spis treści

       Dokument jest zorganizowany następująco:

       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ł.

       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.

           JAK zacząć nowe tłumaczenie?
           JAK zamienić tłumaczenie z powrotem do pliku dokumentacji?
           JAK zaktualizować tłumaczenie programem po4a?
           JAK skonwertować istniejące tłumaczenia do po4a?
           JAK dodać dodatkowy tekst do tłumaczeń (np. nazwisko tłumacza)?
           JAK to wszystko zrobić, wywołując tylko jeden program?
           JAK dostosować po4a do własnych potrzeb?
       3. 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.

       4. FAQ
           Ten rozdział zawiera odpowiedzi na często zadawane pytania. Tak naprawdę, większość tych  pytań  może
           być  sformułowanych  jako "Dlaczego po4a zostało zaprojektowane tak, a nie inaczej?". 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ą   <devel@lists.po4a.org>.   Uwielbiamy   znać   opinie
           użytkowników.

       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.

           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.

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.

       Ś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.

       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.

       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.

   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.

   Odpowiedzi po4a
       Tak  więc,  celem  po4a  jest  uczynienie  tłumaczeń  dokumentacji  łatwymi  do  zarządzania.  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.

       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).

       W sekcji FAQ poniżej opisano kompletną listę plusów i minusów tego rozwiązania.

   Obsługiwane formaty
       Obecnie rozwiązanie to zaimplementowano z sukcesem dla kilku formatów tekstu:

       man

       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ł Locale::Po4a::Man(3pm) obsługuje również format mdoc,używany przez strony
       podręcznika systemu BSD (całkiem często występujących również pod Linuksem).

       pod

       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.

       sgml

       Nawet jeśli jest obecnie wypierany przez XML, 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 diff bardzo często okazuje się bezużyteczny,
       jeśli zmieni się struktura oryginalnego tekstu. Na szczęście, z pomocą może przyjść po4a.

       Obecnie obsługiwane są tylko DTD DebianDoc i docbook, ale dodanie obsługi nowego typu jest bardzo proste.
       Jest nawet możliwe użycie po4a z nieznanym DTD SGML bez zmiany kodu - przez podanie wymaganych informacji
       w parametrach linii poleceń. Szczegóły można znaleźć w Locale::Po4a::Sgml(3pm).

       TeX / LaTeX

       Format LaTeX jest głównym formatem dokumentacji używanym w publikacjach pisanych przez  ludzi  związanych
       ze  światem wolnego oprogramowania. Moduł Locale::Po4a::LaTeX(3pm) był testowany na dokumentacji Pythona,
       książce i kilku prezentacjach.

       texinfo

       Cała dokumentacja GNU jest pisana w tym formacie (i jest to nawet jedno z wymagań stawianych projektom  ,
       które  chcą  stać  się oficjalnymi projektami GNU). Wsparcie dla  Locale::Po4a::Texinfo(3pm) jest wciąż w
       fazie  początkowej.  Prosimy  o  zgłaszanie   błędów   i   przesyłanie   uwag   dotyczących   brakujących
       funkcjonalności.

       xml

       XML jest formatem bazowym wielu innych formatów dokumentacji.

       Obecnie po4a obsługuje DocBook DTD. Szczegóły można znaleźć w Locale::Po4a::Docbook(3pm).

       inne

       Po4a   może  także  obsługiwać  kilka  rzadszych  lub  bardziej  specjalizowanych  formatów,  takich  jak
       dokumentacja opcji kompilacji jąder Linuksa 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 Locale::Po4a::TransTractor(3pm).

   Formaty niewspierane
       Niestety, po4a ciągle nie obsługuje kilku formatów dokumentacji.

       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.

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.

   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 cały proces. Po
       skonwertowaniu projektu do po4a, istotna będzie tylko prawa część schematu.

       Proszę zauważyć, że master.doc występuje tu  jako  przykład  pliku  dokumentacji  do  przetłumaczenia,  a
       tłumaczenie.doc  jest  odpowiadającym  mu tekstem przetłumaczonym. Rozszerzeniem może być  .pod, .xml lub
       .sgml, zależnie od formatu pliku. Każdą część rysunku omówimy szczegółowo w następnych sekcjach.

                                          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)

       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.

       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…

   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.

       Aby zacząć nowe tłumaczenie, używając po4a, należy wykonać następujące kroki:

       - Wyciągnąć  tekst  do  przetłumaczenia  z  oryginalnego  dokumentu <master.doc> do nowego szablonu pliku
         <tłumaczenie.pot> (w formacie programu gettext). Aby to zrobić, należy wywołać program  po4a-gettextize
         w następujący sposób:

           $ po4a-gettextize -f <format> -m <master.doc> -p <tłumaczenie.pot>

         <format>  jest  oczywiście  formatem  używanym  w  dokumencie  master.doc. Jak można oczekiwać, plikiem
         wyjściowym  jest  tłumaczenie.pot.  Więcej  szczegółów   o   dostępnych   opcjach   można   znaleźć   w
         po4a-gettextize(1).

       - Przetłumaczyć  to, co jest do przetłumaczenia. W tym celu należy zmienić nazwę pliku POT na przykład na
         doc.XX.po (gdzie XX jest kodem ISO 639-1 języka, na który się tłumaczy, np. fr dla języka francuskiego)
         i edytować powstały plik. Zazwyczaj dobrym pomysłem jest nienazywanie tego  pliku  XX.po,  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 PO; są one bardzo ważne.

         Do tłumaczenia można wykorzystać tryb PO Emacsa lub Vi, program Lokalize (oparty na  KDE),  Gtranslator
         (oparty na GNOME) lub jakikolwiek inny program, w zależności od upodobań tłumacza (np. Virtaal).

         Aby  dowiedzieć  się  czegoś  więcej,  stanowczo  powinno się przeczytać dokumentację programu gettext,
         dostępną w pakiecie gettext-doc.

   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
       po4a-translate(1) w ten sposób (XX jest kodem języka):

         $ po4a-translate -f <format> -m <master.doc> -p <doc.XX.po> -l <XX.doc>

       Jak wcześniej, <format> jest formatem dokumentu master.doc. Jednak tym razem plik PO, przekazany w  opcji
       -p, jest częścią wejścia - jest to Twoje tłumaczenie. Wyjście jest zapisywane w XX.doc.

       Więcej szczegółów można znaleźć w <po4a-translate(1)>.

   JAK zaktualizować tłumaczenie programem po4a?
       Aby  zaktualizować tłumaczenie, gdy zmieni się oryginalny plik master.doc, należy użyć po4a-updatepo(1) w
       następujący sposób:

         $ po4a-updatepo -f <format> -m <nowy_master.doc> -p <stary_doc.XX.po>

       (Więcej szczegółów można znaleźć w <po4a-updatepo(1)>)

       Oczywiście  ta  operacja  nie  spowoduje  automagicznego  przetłumaczenia  nowych  akapitów  oryginalnego
       dokumentu.  Należy  ręcznie uaktualnić plik PO. 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
       "fuzzy"  (niepewne) i zanim po4a-translate 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.

       Kiedy plik PO będzie znowu aktualny, bez żadnych wpisów  nieprzetłumaczonych  lub  niepewnych  ("fuzzy"),
       można wygenerować przetłumaczony plik dokumentacji, tak jak to opisano w poprzedniej sekcji.

   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 master.doc. 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.

       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ść.

       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.

       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ć.

       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 ;).

       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 wszystko szło źle.  Było
       to ponad dwa megabajty tekstu, którego tłumaczenie od nowa trwałoby miesiącami lub dłużej.

       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.

       Jeżeli  jest  dostępny  stary plik master.doc z odpowiadającymi mu tłumaczeniami XX.doc, przechodzenie do
       formatu  gettext  można  zrobić  bezpośrednio  do  pliku  doc.XX.po  bez   ręcznego   tłumaczenia   pliku
       tłumaczenie.pot:

        $ po4a-gettextize -f <format> -m <stary_oryginał.doc> -l <XX.doc> -p <doc.XX.po>

       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 PO z najnowszym oryginalnym dokumentem i odpowiednio zaktualizować tłumaczenia.

       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 "fuzzy" (niepewne). Przed usunięciem tych znaczników, proszę uważnie sprawdzić każde tłumaczenie.

       Bardzo często struktury dokumentów nie pasują dokładnie do siebie,  przez  co  po4a-gettextize  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.

       Pomocne może być przeczytanie poniżej sekcji Proces przekształcania do formatu gettext: jak  to  działa?.
       Zrozumienie  wewnętrznych  procesów  pomoże  wykonać  zadanie.  Plusem jest to, że w razie niepowodzenia,
       po4a-gettextize 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 PO wygenerowany do tej pory, będzie
       zachowany jako gettextization.failed.po.

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

       -   Nie wahaj się edytować zarówno pliku oryginalnego, jak i jego tłumaczenia. Najważniejszą rzeczą  jest
           otrzymanie  pliku  PO.  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.

       -   Jeśli  jest  taka  potrzeba,  należy  usunąć  kilka  części  oryginalnego  dokumentu,  które  nie  są
           przetłumaczone. Później podczas synchronizowania PO z dokumentem części te się pojawią same.

       -   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 ;)

       -   Czasami  zawartości  akapitów  się  zgadzają, ale ich typy nie. Poprawienie tego zależy od formatu. W
           formatach POD 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.

           Podobnie, dwa akapity mogą zostać scalone razem w formacie POD, jeżeli  rozdzielająca  linia  zawiera
           spacje lub kiedy brakuje pustej linii przed linią ==item i zawartością tego elementu.

       -   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
           gettextization.failed.po  miejsce,  gdzie zaczyna się rozsynchronizowanie, a następnie poprawić w tym
           miejscu pliki wejściowe.

       -   Czasami może się wydawać, że po4a zjadło jakąś część tekstu albo z  oryginału,  albo  z  tłumaczenia.
           gettextization.failed.po  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.

           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 PO, ale dodawane jest tylko nowe odwołanie do już
           istniejącego wpisu.

           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.

           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  "różnię  się"). 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 ["fuzzy"], czym nie powinno się przejmować, gdyż wszystkie komunikaty są
           tak oznaczone zaraz po procesie przekształcania na format gettext).

       Mamy nadzieję, że te porady pomogą w procesie przekształcania do formatu gettext i w otrzymaniu pliku PO.
       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.

       Na przykład, pierwsze wykonanie po4a-updatepo na francuskim tłumaczeniu dokumentacji  Perla  (plik  PO  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 PO nie pasuje do  żadnego  msgid  w  pliku  POT.  Wymusza  to  na  programie  gettext  wyszukiwanie
       najbardziej zbliżonego msgid, używając kosztownego algorytmu bliskości łańcuchów znaków.

   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
       załącznikom.

       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.

       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.

       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.

       The  header  line  which  specify  context  has  a  pretty  rigid  syntax:  It must begin with the string
       PO4A-HEADER:, followed by a  semi-colon  (;)  separated  list  of  key=value  fields.  White  spaces  ARE
       important.  Note  that  you  cannot use the semi-colon char (;) in the value, and that quoting it doesn't
       help.  Optionally, spaces ( ) may be inserted before key for readability.

       Although this context search may be considered  to  operate  roughly  on  each  line  of  the  translated
       document,  it  actually  operates  on the internal data string of the translated document.  This internal
       data string may be a text spanning a paragraph containing multiple lines or  may  be  a  XML  tag  itself
       alone.   The  exact  insertion point of the addendum must be before or after the internal data string and
       can not be within the internal data string.

       The actual internal data string of the translated document can be visualized by executing po4a  in  debug
       mode.

       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ę "O tłumaczeniu" zaraz po sekcji "O dokumencie".

       Kilka możliwych kluczy nagłówka:

       mode (obowiązkowe)
           It can be either the string before or after.

           If mode=before, the insertion point is determined by one step regex match specified by  the  position
           argument  regex.  The insertion point is immediately before the uniquely matched internal data string
           of the translated document.

           If mode=after, the insertion point is determined by two step regex matches specified by the  position
           argument regex; and by the beginboundary or endboundary argument regex.

           Since there may be multiple sections for the assumed case, let's use 2 step approach.

                mode=after

       position (obowiązkowe)
           A Perl regexp for specifying the context.

           If  more than one internal data strings match this expression (or none), the search for the insertion
           point and addition of the addendum will fail. It is indeed better to report an error  than  inserting
           the addendum at the wrong location.

           If  mode=before,  the  insertion point is specified to be immediately before the internal data string
           uniquely matching the position argument regex.

           If mode=after, the search for the insertion point is narrowed down to the  data  after  the  internal
           data  string  uniquely  matching  the  position argument regex.  The exact insertion point is further
           specified by the beginboundary or endboundary.

           In our case, we need to skip several preceding sections by narrowing down search  using  the  section
           title string.

                position=O dokumencie

           (In reality, you need to use the translated section title string here, instead.)

       beginboundary (używany, gdy mode=after i obowiązkowy w tym wypadku)
       endboundary (jak wyżej)
           A second Perl regexp required only when mode=after. The addendum will be placed immediately before or
           after  the  first  internal  data  string  matching the beginboundary or endboundary argument regexp,
           respectively.

           W rozpatrywanym przypadku możemy wybrać wskazanie końca dopasowywanej sekcji, dodając:

              endboundary=</section>

           albo możemy wskazać początek kolejnej sekcji w następujący sposób:

              beginboundary=<section>

           In both cases, our addendum will be placed after the </section> and before the <section>.  The  first
           one is better since it will work even if the document gets reorganized.

           Obie  formy istnieją ponieważ formaty dokumentacji są różne. Niektóre z nich zawierają znacznik końca
           sekcji (tak jak </section>, 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 boundary powinno odpowiadać końcowi sekcji, tak że
           punkt wstawienia następuje po niej. W drugim przypadku boundary powinno pasować do początku następnej
           sekcji, a punkt wstawienia powinien być umieszczony zaraz przed nią.

       Może się to wydawać niejasne, następne przykłady powinny co nieco wyklarować.

       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:
          PO4A-HEADER: mode=after; position=O dokumencie; endboundary=</section>
          PO4A-HEADER: mode=after; position=O dokumencie; beginboundary=<section>

       Aby dodać coś po następującej sekcji nroff:
           .SH "AUTORZY"

         You should select two step approach by setting mode=after.  Then you should narrow down search  to  the
         line  after AUTHORS with the position argument regex.  Then, you should match the beginning of the next
         section (i.e., ^\.SH) with the beginboundary argument regex. That is to say:

          PO4A-HEADER:mode=after;position=AUTORZY;beginboundary=\.SH

       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.
          PO4A-HEADER:mode=after;position=Copyright Big Dude, 2004;beginboundary=^

       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.
          PO4A-HEADER:mode=after;position=O dokumencie;beginboundary=NieistniejąaLiniaPo4a

       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ą

         .fi

       nie  należy  używać  .fi  jako endboundary, ponieważ będzie on pasował do "the[ fi]le" co raczej nie jest
       tym, czego można by oczekiwać. Poprawnym endboundary w tym przypadku jest ^\.fi$.

       Jeśli załącznik nie trafił tam, gdzie powinien, spróbuj przekazać narzędziom  po4a  argument  -vv,  który
       powinien pomóc wyjaśnić co się dzieje podczas dodawania załącznika.

       Bardziej szczegółowy przykład

       Oryginalny dokument (w formacie POD):

        |=head1 NAZWA
        |
        |dummy - fikcyjny program
        |
        |=head1 AUTOR
        |
        |ja

       Wtedy  następujący  dodatek  spowoduje  dodanie sekcji (w języku francuskim) na koniec tego pliku (w jęz.
       francuskim "TRADUCTEUR" oznacza "TŁUMACZ", a "moi" znaczy "ja").

        |PO4A-HEADER:mode=after;position=AUTEUR;beginboundary=^=head
        |
        |=head1 TRADUCTEUR
        |
        |moi
        |

       Aby umieścić dodatek przed sekcją AUTOR, należy użyć następującego nagłówka:

        PO4A-HEADER:mode=after;position=NOM;beginboundary=^=head1

       This works because  the  next  line  matching  the  beginboundary  /^=head1/  after  the  section  "NAME"
       (translated  to  "NOM" in French), is the one declaring the authors. So, the addendum will be put between
       both sections. Note that if another section is added between NAME and AUTHOR sections  later,  po4a  will
       wrongfully put the addenda before the new section.

       To avoid this you may accomplish the same using mode=before:

        PO4A-HEADER:mode=before;position=^=head1 AUTEUR

   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 (po4a-updatepo, a następnie po4a-translate), 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 PO dla
       wszystkich dokumentów, kiedy użyto więcej niż jednego formatu.

       Program po4a(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ń (PO i
       POT) i oryginalnych dokumentów, ich formaty oraz miejsce, gdzie powinny trafiać przetłumaczone dokumenty.

       Uruchomienie po4a(1) na  tym  pliku  spowoduje  zsynchronizowanie  wszystkich  plików  PO  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  PO, ż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ń.

   JAK dostosować po4a do własnych potrzeb?
       Moduły po4a mają opcje (określane przez -o opcja), których można użyć, żeby zmienić zachowanie modułów.

       You  can  also  edit the source code of the existing modules or even write your own modules. To make them
       visible to po4a, copy your modules into a path called "/bli/blah/blu/lib/Locale/Po4a/"  and  then  adding
       the path "/bli/blah/blu" in the "PERLIB" or "PERL5LIB" environment variable. For example:

          PERLLIB=$PWD/lib po4a --previous po4a/po4a.cfg

       Uwaga: rzeczywista nazwa katalogu lib nie jest istotna.

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.

   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.

       Bardziej  formalnie  mówiąc,  pobiera  dokument  do  przetłumaczenia oraz plik PO zawierający tłumaczenia
       używany jako wejście podczas tworzenia dwóch oddzielnych plików  wyjściowych:  innego  pliku  PO  (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
       PO). Poniżej jest graficzne przedstawienie tego procesu:

          Dokument wejściowy -\                          /-> Dokument wyjściowy
                               \      TransTractor::    /    (przetłumaczony)
                                +-->--   parse()  --- -+
                               /                        \
          Wejściowy PO -------/                          \---> Wyjściowy PO
                                                               (wyodrębniony)

       This  little  bone  is  the  core  of  all the po4a architecture. If you omit the input PO and the output
       document, you get po4a-gettextize. If you provide both  input  and  disregard  the  output  PO,  you  get
       po4a-translate.   The  po4a  calls  TransTractor  twice  and calls msgmerge -U between these TransTractor
       invocations to provide one-stop solution with a single configuration file.

       TransTractor::parse() 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 <p>.

         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 }

       On  line  6 and 7, we encounter "shiftline()" and "unshiftline()".  These help you to read and unread the
       head of internal input data stream of master document into the line string and its reference.  Here,  the
       reference  is  provided  by a string "$filename:$linenum".  Please remember Perl only has one dimensional
       array data structure.  So codes handling the internal input data stream line are a bit cryptic.

       W linii 6. po raz drugi napotkaliśmy <p>. 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  <p>  w linii 9., dokładamy ten element połączony z tłumaczeniem reszty
       akapitu.

       Funkcja translate() jest bardzo fajna (cool ;)). Dodaje swoje argumenty na  koniec  wynikowego  pliku  PO
       (ekstrakcja)  i  zwraca  ich  tłumaczenie,  znalezione w wejściowym pliku PO (tłumaczenie). Ponieważ jest
       używana jako część argumentu pushline(), tłumaczenie ląduje w wynikowym dokumencie.

       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…

       Więcej informacji o tym można znaleźć w Locale::Po4a::TransTractor(3pm).

   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  "rozdział")  był
       tłumaczeniem 4. komunikatu oryginału (typu "akapit").

          Oryginał         Tłumaczenie

          rozdział          rozdział
             akapit            akapit
             akapit            akapit
             akapit         rozdział
          rozdział             akapit
             akapit            akapit

       Aby  to  osiągnąć,  parsery  po4a są używane zarówno na pliku oryginału, jak i tłumaczenia, żeby utworzyć
       pliki PO, a następnie jest budowany z nich trzeci plik PO 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.

       Teoretycznie  byłoby  możliwe  zsynchronizowanie  plików  po  wykryciu  problemu (tak, jak to robi diff).
       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.

       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 ("fuzzy"), aby tłumacz je przejrzał i sprawdził.

   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  =  before.  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 endboundary, lub przed nią, jeśli jest to beginboundary.

FAQ

       Ten rozdział zawiera odpowiedzi na często zadawane pytania. Tak naprawdę, większość tych pytań  może  być
       sformułowanych  jako  "Dlaczego po4a zostało zaprojektowane tak, a nie inaczej?". 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ą <devel@lists.po4a.org>. Uwielbiamy znać opinie użytkowników.

   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:

       • 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ć.

       • Przycinanie  dokumentu  pomaga  odizolować  zmiany  w  oryginalnym  dokumencie. Kiedy oryginał zostanie
         zmieniony, ten proces uprości wyszukanie części tłumaczeń potrzebujących aktualizacji.

       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:

       • Takie  podejście  sprawdziło  się w projekcie KDE, pozwalając temu zespołowi na wyprodukowanie znacznej
         ilości przetłumaczonej i aktualnej dokumentacji.

       • Tłumacze mogą wciąż używać kontekstu tłumaczenia, ponieważ wszystkie komunikaty w pliku PO 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.

       • 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.

   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ń.

       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.

       Dzielenie na części mniejsze niż zdania  byłoby  czymś  bardzo  niedobrym.  Za  dużo  miejsca  by  zajęło
       napisanie  tu  wyjaśnienie  dlaczego,  ale  zainteresowany  czytelnik  może na przykład przeczytać stronę
       podręcznika Locale::Maketext::TPJ13(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).

   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.

       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:

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

       Jednak  było  to  na tyle problematyczne, że obecnie jest używane rozwiązanie oparte na plikach PO. Tylko
       oryginalny tekst może być edytowany w pliku, a tłumaczenia muszą się pojawić w plikach PO,  wyciągniętych
       z głównego szablonu (łączonych z powrotem w czasie kompilacji pakietu). Ten stary system jest potępiany z
       kilku powodów:

       •   problemy w zarządzaniu

           Jeżeli  kilku  tłumaczy  dostarczy  łatę w tym samym czasie, będzie trudno połączyć te łaty wszystkie
           razem.

           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 PO
           w Twoim pliku ;)

       •   problemy z kodowaniem znaków

           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ć UTF, jednak wciąż jest
           z nim kilka problemów.

           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]).

       gettext rozwiązuje wszystkie te problemy razem.

   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.

   Co z innymi narzędziami do tłumaczeń dokumentacji wykorzystującymi gettext?
       O ile mi wiadomo, są tylko dwa takie:

       poxml
           Jest to narzędzie rozwijane przez ludzi z KDE obsługujące format DocBook XML. O ile mi  wiadomo,  był
           to  pierwszy  program  wyciągający  łańcuchy  znaków do przetłumaczenia z dokumentacji do plików PO i
           wstawiający je z powrotem po przetłumaczeniu.

           Może on obsługiwać tylko XML i częściowo DTD. Jestem  bardzo  niezadowolony  z  obsługi  list,  które
           zostają umieszczone w jednym wielkim msgid. Kiedy lista staje się długa, sprawa się komplikuje.

       po-debiandoc
           Program  utworzony  przez Denisa Barbiera jest poprzednikiem modułu SGML 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
           DTD, który jest DTD mniej lub bardziej przestarzałym.

       Największą  zaletą  po4a  nad  nimi jest łatwość umieszczania dodatkowej zawartości (co jest nawet gorsze
       tutaj) i przejścia na format gettext.

   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ć.

       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.

       In the po4a project, translated documents are not source files anymore, in the sense that these files are
       not  the  preferred form of the work for making modifications to it. Since this is rather unconventional,
       that's a source of easy mistakes. That's why all files present this header:

        |       ****************************************************
        |       *         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 ;)

       Podobnie, to co należy zrobić ze zwykłymi plikami PO programu gettext, to skopiować je do  katalogu  po/.
       Ale  w  przypadku  plików  zarządzanych  przez po4a to nie działa. 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 PO, ponieważ program wymaga instalacji pliku tłumaczeń jako pliku mo,
       podczas gdy dokumentacja używa tłumaczeń w czasie kompilacji). Dlatego pliki PO tworzone przez moduł  po-
       debiandoc zawierają poniższy nagłówek:

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

   PODSUMOWANIE plusów i minusów rozwiązania opartego na gettext
       • Tłumaczenia  nie  są trzymane wraz z oryginałem, co pozwala w prosty sposób wykryć, czy tłumaczenia nie
         są przestarzałe.

       • 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.

       • Wewnętrznie  jest  oparty  na pakiecie gettext (ale po4a 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.

       • 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.

       • Tłumacze  nie  muszą  uczyć  się  składni nowego pliku i mogą po prostu użyć swojego ulubionego edytora
         plików PO (jak tryb PO Emasca, Lokalize lub Gtranslator).

       • 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źć POD tymi adresami:

          - https://docs.kde.org/stable5/en/kdesdk/lokalize/project-view.html
          - http://www.debian.org/intl/l10n/

       Nie wszystko złoto, co się świeci - to podejście ma także kilka minusów, z którymi musimy sobie poradzić.

       • Na pierwszy rzut oka załączniki są… dziwne.

       • 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.

       • Nawet mając łatwy interfejs, wciąż pozostaje nowym narzędziem, którego trzeba się uczyć.

         One of my dreams would be to integrate somehow po4a to Gtranslator or Lokalize.  When  a  documentation
         file is opened, the strings are automatically extracted, and a translated file + po file can be written
         to  disk. If we manage to do an MS Word (TM) module (or at least RTF) professional translators may even
         use it.

AUTORZY

        Denis Barbier <barbier,linuxfr.org>
        Martin Quinson (mquinson#debian.org)

TŁUMACZENIE

        Robert Luberda <robert@debian.org>

Narzędzia po4a                                     2020-04-15                                            PO4A(7)