| Locale::Po4a::TransTractor(3pm) | Narzędzia po4a | Locale::Po4a::TransTractor(3pm) |
Locale::Po4a::TransTractor - ogólny moduł wyodrębniania tłumaczeń.
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:
Jako wynik dostajemy:
Graficzna reprezentacja tego procesu:
Dokument wejściowy --\ /--> Dokument wyjściowy
\ / (przetłumaczony)
+-> funkcja parse() ---+
/ \
Wejściowy PO --------/ \--> Wyjściowy PO
(wyodrębniony)
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.
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;
# - push to output the leading tag (untranslated) and the
# rest of the paragraph (translated)
$self->pushline( "<p>"
. $self->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.
ARGUMENTY, poza tymi akceptowanymi przez new() (z oczekiwanym typem):
This array
"@{$self->{TT}{doc_in}}" holds this
input document data as an array of strings with alternating meanings.
* The string $textline holding each line of the
input text data.
* The string "$filename:$linenum"
holding its location and called as
"reference" ("linenum" starts
with 1).
Proszę zauważyć, że to niczego nie przetwarza. Należy użyć funkcji parse() po zakończeniu pakowania plików wejściowych do dokumentu.
This translated document data are provided by:
* "$self->docheader()" holding the
header text for the plugin, and
* "@{$self->{TT}{doc_out}}" holding
each line of the main translated text in the array.
[zwykłe użycie dokumentu po4a ...]
($percent,$hit,$queries) = $document->stats();
print "Znaleźliśmy tłumaczenia $percent\% ($hit z $queries) komunikatów.\n";
Funkcja zwraca liczbę nie będącą nullem lub błąd.
Dostarczone są cztery funkcje pobierania wejścia i zwracania wyjścia. Są one bardzo podobne do shift/unshift i push/pop w Perlu.
* Perl shift returns the first array item and drop it from the array. * Perl unshift prepends an item to the array as the first array item. * Perl pop returns the last array item and drop it from the array. * Perl push appends an item to the array as the last array item.
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.
Dostarczona jest jedna funkcja obsługująca tekst, który powinien być przetłumaczony.
Funkcja przyjmuje także kilka dodatkowych argumentów. Muszą być zorganizowane jako hash. Na przykład:
$self->translate("string","ref","type",
'wrap' => 1);
Akcje:
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ń.
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ą:
$self->pushline_all({ "Description[".$langcode."]=".
$self->translate($line,$ref,$langcode)
});
Zobaczymy, czy to wystarczy ;)
Denis Barbier <barbier@linuxfr.org> Martin Quinson (mquinson#debian.org) Jordi Vilalta <jvprat@gmail.com>
Robert Luberda <robert@debian.org>
| 2023-01-03 | Narzędzia po4a |