Provided by:
po4a_0.33.3-1_all 
NAZWA
Locale::Po4a::TransTractor - Ogólny moduł wyodrębniania tłumaczeń.
OPIS
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.
Ta klasa jest przodkiem wszystkich parserów po4a używanych do
przetwarzania dokumentu w poszukiwaniu komunikatów do przetłumaczenia,
wyodrębniania ich do pliku po oraz zastępowania ich tłumaczeniami w
wyjściowym dokumencie.
Bardziej formalnie mówiąc, przyjmuje następujące argumenty jako
wejście:
- dokument do przetłumaczenia;
- plik po zawierający tłumaczenia do użycia.
Jako wynik dostajemy:
- inny plik po, czego wynikiem jest wyciągnięcie komunikatów możliwych
do przetłumaczenia z dokumentu wejściowego;
- przetłumaczony dokument o takiej samej strukturze, co dokument
wejściowy, ale ze wszystkimi komunikatami możliwymi do
przetłumaczenia zamienionymi na tłumaczenia znalezione w wejściowym
pliku po.
Graficzna reprezentacja tego procesu:
Dokument wejściowy --\ /--> Dokument wyjściowy
\ / (przetłumaczony)
+-> funkcja parse() ---+
/ \
Wejściowy po --------/ \--> Wyjściowy po
(wyodrębniony)
FUNKCJE, KTÓRE TWÓJ PARSER POWINIEN NADPISAĆ
parse()
Jest to miejsce, gdzie odbywa się cała praca: parsowanie dokumentów
wejściowych, generowanie wyjścia, wyodrębnianie komunikatów do
przetłumaczenia. Jest to bardzo proste, jeśli użyje się funkcji
opisanych poniżej, w sekcji "FUNKCJE WEWNĘTRZNE". Patrz także
sekcja "SKŁADNIA", zawierająca przykład.
Ta funkcja jest wywoływana przez poniższą funkcję proces(), ale
jeżeli wybierze się użycie funkcji new() i ręczenie się doda
zawartość do dokumentu, trzeba będzie wywołać tę funkcję samemu.
docheader()
Funkcja zwraca nagłówek, który powinien zostać dodany do
wygenerowanego dokumentu, odpowiednio przygotowany, tak żeby mógł
być komentarzem w języku docelowym. Aby dowiedzieć się, do czego to
służy, proszę przeczytać sekcję "Przekazywanie deweloperom wiedzy o
tłumaczeniu" w po4a(7).
SKŁADNIA
Następujący przykład przetwarza listę akapitów rozpoczynających się od
"<p>". Dla uproszczenia, zakładamy, że dokument jest dobrze
sformatowany, tj. występują tylko elementy "<p>" i są one umieszczone
na samym początku każdego akapitu.
sub parse {
my $self = shift;
PARAGRAPH: while (1) {
my ($paragraph,$pararef)=("","");
my $first=1;
my ($line,$lref)=$self->shiftline();
while (defined($line)) {
if ($line =~ m/<p>/ && !$first--; ) {
# Nie po raz pierwszy widzimy <p>.
# Włóż z powrotem bieżącą linię do wejścia,
# i dodaj zbudowany akapit do wyjścia
$self->unshiftline($line,$lref);
# Teraz, gdy dokument jest sformatowany, przetłumaczmy go:
# - Usunięcie początkowych tagów
$paragraph =~ s/^<p>//s;
# - dodanie do wyjścia początkowego elementu (nieprzetłumaczonego)
# i reszty akapitu (przetłumaczonej)
$self->pushline( "<p>"
. $document->translate($paragraph,$pararef)
);
next PARAGRAPH;
} else {
# Dodanie do akapitu
$paragraph .= $line;
$pararef = $lref unless(length($pararef));
}
# Ponowna inicjacja pętli
($line,$lref)=$self->shiftline();
}
# Nie dostaliśmy zdefiniowanej linii? Koniec pliku wejściowego.
return;
}
}
Po zaimplementowaniu funkcji parsującej, można użyć własnych klas
dokumentu, używając publicznego interfejsu zaprezentowanego w następnym
rozdziale.
INTERFEJS PUBLICZNY dla skryptów używających Twojego parsera
Konstruktor
process(%)
Funkcja zrobi w jednym uruchomieniu wszystko, co tylko trzeba
zrobić z dokumentem po4a. Jej argumenty muszą być umieszczone w
hashu. AKCJE:
a. Czyta wszystkie pliki określone w po_in_name
b. Czyta wszystkie oryginalne dokumenty określone w file_in_name
c. Przetwarza (parsuje) dokument
d. Dodaje i stosuje wszystkie podane załączniki
e. Zapisuje przetłumaczony dokument do file_out_name (jeśli podano)
f. Zapisuje wygenerowany plik po do po_out_name (jeśli podano)
ARGUMENTY, poza tymi akceptowanymi przez new() (z oczekiwanym
typem):
file_in_name (@)
Lista nazw plików, z których powinniśmy odczytać plik
wejściowy.
file_in_charset ($)
Kodowanie znaków dokumentu wejściowego (jeśli nie podano,
nastąpi próba określenia kodowania z dokumentu wejściowego).
file_out_name ($)
Nazwa pliku, do którego należy zapisać wynikowy dokument.
file_out_charset ($)
Kodowanie znaków wyjściowego dokumentu (jeśli nie podano,
będzie użyte kodowanie znaków pliku po).
po_in_name (@)
Lista nazw plików, z których powinniśmy odczytać wejściowe
pliki po zawierające tłumaczenia, które będą użyte podczas
tłumaczenia dokumentu.
po_out_name ($)
Nazwa pliku, do którego powinien być zapisany wynikowy plik po,
zawierający komunikaty wyciągnięte z dokumentu wejściowego.
addendum (@)
Lista nazw plików, z których powinniśmy odczytać pliki
załączników.
addendum_charset ($)
Kodowanie znaków załączników.
new(%)
Tworzy nowy dokument Po4a. Akceptowane opcje (będące w hashu):
verbose ($)
Ustawia gadatliwość.
debug ($)
Ustawia debugowanie.
Manipulowanie plikami z dokumentacją
read($)
Dodaje kolejny dokument wejściowy na koniec istniejącego dokumentu.
Argumentem jest nazwa pliku do odczytania.
Proszę zauważyć, że to niczego nie przetwarza. Należy użyć funkcji
parse() po zakończeniu pakowania plików wejściowych do dokumentu.
write($)
Zapisuje przetłumaczony dokument do pliku o podanej nazwie.
Manipulowanie plikami po
readpo($)
Dodaje zawartość pliku (którego nazwa jest podawana w argumencie)
do istniejącego pliku wejściowego po. Stara zawartość nie jest
tracona.
writepo($)
Zapisuje wygenerowany plik po do pliku o podanej nazwie.
stats()
Zwraca statystyki dotyczące tłumaczeń. Proszę zauważyć, że nie są
to te same statystyki, które wypisuje msgfmt --statistic. Tutaj są
to statystyki o obecnym wykorzystaniu pliku po, podczas gdy msgfmt
wyświetla status tego pliku. Funkcja jest opakowaniem funkcji
Locale::Po4a::Po::stats_get zastosowanej do wejściowego pliku po.
Przykład użycia:
[zwykłe użycie dokumentu po4a ...]
($percent,$hit,$queries) = $document->stats();
print "Znaleźliśmy tłumaczenia $percent\% ($hit z $queries) komunikatów.\n";
Manipulowanie załącznikami
addendum($)
Więcej informacji o tym, czym są załączniki, i jak tłumacze powinni
je pisać, można znaleźć w po4a(7). Aby dodać załącznik do
przetłumaczonego dokumentu, wystarczy po prostu tej funkcji
przekazać nazwę pliku, w którym się znajduje, i gotowe ;)
Funkcja zwraca liczbę nie będącą nullem lub błąd.
FUNKCJE WEWNĘTRZNE, używane do pisania parserów
Pobieranie wejścia, dostarczanie wyjścia
Dostarczone są cztery funkcje pobierania wejścia i zwracania wyjścia.
Są one bardzo podobne do shift/unshift i push/pop. Pierwsza para
dotyczy wejścia, a druga - wyjścia. Mnemonik: w wejściu interesuje Cię
pierwsza linia, co daje shift, a w wyjściu chcesz dostać wynik na
końcu, tak jak do robi push.
shiftline()
Funkcja zwraca kolejną linię z doc_in do przetworzenia oraz jej
odnośnik (spakowany jako tablica).
unshiftline($$)
Zwraca z powrotem linię dokumentu wejściowego i jej odnośnik.
pushline($)
Dodaje nową linię na koniec doc_out.
popline()
Pobiera ostatnio wstawioną linię z doc_out.
Zaznaczanie łańcuchów znaków jako możliwych do przetłumaczenia
Dostarczona jest jedna funkcja obsługująca tekst, który powinien być
przetłumaczony.
translate($$$)
Argumenty obowiązkowe:
- Łańcuch znaków do przetłumaczenia
- Odnośnik tego komunikatu (tj. pozycja w pliku wejściowym)
- Typ tego komunikatu (tj. tekstowy opis jego roli w strukturze;
używany w Locale::Po4a::Po::gettextization(); patrz także
po4a(7), sekcja Proces przeksztacania do formatu gettext: jak to
dziaa?)
Funkcja przyjmuje także kilka dodatkowych argumentów. Muszą być
zorganizowane jako hash. Na przykład:
$self->translate("string","ref","type",
'wrap' => 1);
wrap
flaga logiczna określająca, czy traktujemy białe znaki w
komunikacie jako nieistotne. Jeśli tak, to funkcja przed
wyszukaniem lub wyciągnięciem tłumaczenia kanonizuje komunikat,
a następnie zawija tekst tłumaczenia.
wrapcol
Kolumna, w której tekst powinien być zawijany (domyślnie: 76).
comment
Dodatkowy komentarz do dodania do wpisu.
Akcje:
- Dodaje nowy komunikat, odnośnik i typ do po_out.
- Zwraca tłumaczenie tekstu (znalezione w po_in), tak że parser
może zbudować doc_out.
- Obsługuje kodowania znaków, aby zmienić kodowanie komunikatów
przed wysłaniem do po_out i przed zwróceniem tłumaczeń.
Różne funkcje
verbose()
Zwraca informację, czy podczas uruchomienia TransTractora, podano
opcję verbose.
debug()
Zwraca informację, czy podczas uruchomienia TransTractora podano
opcję debug.
detected_charset($)
Mówi TransTractorowi, że w dokumencie źródłowym wykryto nowe
kodowanie znaków (podane jako pierwszy argument wywołania). Zwykle
kodowanie może być odczytane z nagłówka dokumentu. Pozostawione
będzie tylko pierwsze kodowanie znaków, pochodzące albo z
argumentów funkcji process(), albo z dokumentu.
get_out_charset()
Funkcja zwraca kodowanie znaków, które powinno być użyte w
dokumencie wyjściowym (zazwyczaj użyteczne do zamienienia wykrytego
kodowania znaków dokumentu wejściowego, tam gdzie został
znaleziony).
Użyje wyjściowego kodowania znaków podanego w linii poleceń. Jeśli
go nie podano, użyje kodowania znaków wejściowego pliku po, a
jeżeli jako to kodowanie w pliku był ustawiony domyślny tekst
"CHARSET", to zwróci kodowanie znaków wejściowego dokumentu, tak że
nie zostanie przeprowadzona żadna konwersja kodowań.
recode_skipped_text($)
Funkcja zwraca tekst przekazany jako argument przekodowany z
kodowania znaków dokumentu wejściowego na kodowanie znaków
dokumentu wyjściowego. Nie jest to potrzebne podczas tłumaczenia
komunikatu (translate() wszystko przekodowuje samodzielnie), ale
wtedy, gdy pominięto komunikat z dokumentu wejściowego, a dokument
wyjściowy powinien mieć spójne kodowanie znaków.
DALSZE WSKAZÓWKI
Mankamentem obecnego TransTractora jest brak obsługi dokumentów
zawierających wszystkie języki naraz, jak na przykład szablony debconf
lub pliki .desktop.
Aby rozwiązać ten problem, jedynymi potrzebnymi zmianami w interfejsie
są:
- pobieranie hasha jak po_in_name (lista dla języka)
- dodawanie argumentu do przetłumaczenia, wskazując język docelowy
- stworzenie funkcję pushline_all, która robiłaby pushline jej
zawartości dla wszystkich języków, używając składni podobnej do
składni map:
$self->pushline_all({ "Description[".$langcode."]=".
$self->translate($line,$ref,$langcode)
});
Zobaczymy, czy to wystarczy ;)
AUTORZY
Denis Barbier <barbier@linuxfr.org>
Martin Quinson (mquinson#debian.org)
Jordi Vilalta <jvprat@gmail.com>
TŁUMACZENIE
Robert Luberda <robert@debian.org>