LOCALE::PO4A::TRANSTRACTOR.3PM(1) User Contributed Perl Documentation NUME Locale::Po4a::TransTractor - trans(lator -- ex)tractor generic. DESCRIERE Scopul proiectului po4a (PO pentru orice) este de a uura traducerile (i mai interesant, intreinerea traducerilor) folosind instrumente gettext in domenii in care nu erau ateptate, cum ar fi documentaia. Aceasta clasa este stramoul fiecarui analizator po4a utilizat pentru a analiza un document, pentru a cauta iruri traductibile, pentru a le extrage intr-un fiier PO i pentru a le inlocui cu traducerea lor in documentul de ieire. Mai formal, acesta primete urmatoarele argumente ca intrare: - un document de tradus; - un fiier PO care conine traducerile care urmeaza sa fie utilizate. Ca ieire, produce: - un alt fiier PO, care rezulta din extragerea irurilor traductibile din documentul de intrare; - un document tradus, cu aceeai structura ca cel de la intrare, dar cu toate irurile traductibile inlocuite cu traducerile gasite in fiierul PO furnizat la intrare. Iata o reprezentare grafica a acestui lucru: document intrare --\ /---> Document ieire \ / (tradus) +--> funcia parse() -----+ / \ PO intrare --------/ \---> PO ieire (extras) FUNCII PE CARE ANALIZATORUL TREBUIE SA LE SUPRASCRIE parse() Aici are loc toata munca: analizarea documentelor de intrare, generarea rezultatelor i extragerea irurilor traductibile. Acest lucru este destul de simplu folosind funciile furnizate prezentate in seciunea FUNCII INTERNE de mai jos. Consultai i seciunea SINOPSIS, care prezinta un exemplu. Aceasta funcie este apelata de funcia process() de mai jos, dar daca alegei sa utilizai funcia new() i sa adaugai manual coninut documentului, va trebui sa apelai aceasta funcie. docheader() Aceasta funcie returneaza antetul pe care ar trebui sa il adaugam documentului produs, citat corespunzator pentru a fi un comentariu in limba inta. Consultai seciunea Educarea dezvoltatorilor cu privire la traduceri, din po4a(7), pentru a afla la ce este buna aceasta funcie. SINOPSIS Urmatorul exemplu analizeaza o lista de paragrafe care incep cu ,,

". De dragul simplitaii, presupunem ca documentul este bine formatat, adica ca etichetele ,,

" sunt singurele etichete prezente i ca aceasta eticheta se afla chiar la inceputul fiecarui paragraf. 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/

/ && !$first--; ) { # Nu este prima data cand vedem

. # Repunei linia curenta in intrare, # i punei paragraful construit la ieire. $self->unshiftline($line,$lref); # Acum ca documentul este format, traducei-l: # - Eliminai eticheta de inceput $paragraph =~ s/^

//s; # - Introducei pentru a afia eticheta de inceput (netradusa) # i restul paragrafului (tradus) $self->pushline( "

" . $self->translate($paragraph,$pararef) ); next PARAGRAPH; } else { # Adaugai la paragraf $paragraph .= $line; $pararef = $lref unless(length($pararef)); } # Reiniializai bucla ($line,$lref)=$self->shiftline(); } # Nu ai obinut o linie definita? Sfaritul fiierului de intrare. return; } } Odata ce ai implementat funcia de analizare, putei utiliza clasa dvs. de documente, folosind interfaa publica prezentata in seciunea urmatoare. INTERFAA PUBLICA pentru scripturile care utilizeaza analizatorul dvs. Constructor process(%) Aceasta funcie poate face tot ce avei nevoie sa facei cu un document po4a intr-o singura invocare. Argumentele sale trebuie sa fie impachetate ca o serie de elemente asociative. ACIUNI: a. Citete toate fiierele PO specificate in po_in_name b. Citete toate documentele originale specificate in file_in_name c. Analizeaza documentul d. Citete i aplica toate actele adiionale (addendele) specificate e. Scrie documentul tradus la file_out_name (daca este dat) f. Scrie fiierul PO extras la po_out_name (daca este dat) ARGUMENTE, in afara de cele acceptate de new() (cu tipul ateptat): file_in_name (@) Lista de nume de fiiere din care trebuie sa citim documentul de intrare. file_in_charset ($) Setul de caractere utilizat in documentul de intrare (daca nu este specificat, se utilizeaza UTF-8). file_out_name ($) Numele fiierului in care trebuie sa scriem documentul de ieire. file_out_charset ($) Setul de caractere utilizat in documentul de ieire (daca nu este specificat, se utilizeaza UTF-8). po_in_name (@) Lista de nume de fiiere din care trebuie citite fiierele PO de intrare, care conin traducerea ce va fi utilizata pentru a traduce documentul. po_out_name ($) Numele fiierului in care trebuie sa scriem fiierul PO de ieire, care conine irurile extrase din documentul de intrare. addendum (@) Lista de nume de fiiere din care trebuie sa citim addenda. addendum_charset ($) Setul de caractere pentru addenda. new(%) Creeaza un nou document po4a. Opiuni acceptate (in seria de elemente asociative trecuta ca parametru): verbose ($) Stabilete nivelul de detaliere al informaiilor. debug ($) Definete depanarea. wrapcol ($) Coloana la care ar trebui sa incadram textul in documentul de ieire (implicit: 76). Valoarea negativa inseamna sa nu se incadreze liniile deloc (fara intreruperi de linie). De asemenea, accepta urmatoarele opiuni pentru fiierele Po subiacente: porefs, copyright-holder, msgid-bugs-address, package-name, package-version, wrap-po. Manipularea fiierelor de documente read($$$) Adauga un alt document de intrare de date la sfaritul matricei existente "@{$self->{TT}{doc_in}}". Aceasta funcie are doua argumente obligatorii i unul opional. * Numele fiierului care urmeaza sa fie citit pe disc; * Numele care trebuie utilizat ca nume de fiier la construirea referinei in fiierul PO; * Setul de caractere care trebuie utilizat pentru a citi fiierul respectiv (UTF-8 in mod implicit) Aceasta matrice "@{$self->{TT}{doc_in}}" conine datele acestui document de intrare ca o matrice de iruri de caractere cu semnificaii alternante. * irul $textline conine fiecare linie a datelor text de intrare. * irul "$filename:$linenum" conine locaia acestuia i se numete ,,referina" ("linenum" incepe cu 1). Va rugam sa reinei ca aceasta nu analizeaza nimic. Ar trebui sa utilizai funcia parse() atunci cand ai terminat cu impachetarea fiierelor de intrare in document. write($) Scrie documentul tradus in fiierul specificat. Aceste date de document traduse sunt furnizate de: * "$self->docheader()" care conine textul antetului pentru modul i * "@{$self->{TT}{doc_out}}" care conine fiecare linie a textului principal tradus in matrice. Manipularea fiierelor PO readpo($) Adauga coninutul unui fiier (al carui nume este trecut ca argument) la PO de intrare existent. Coninutul vechi nu este eliminat. writepo($) Scrie fiierul PO extras la numele de fiier dat. stats() Returneaza cateva statistici despre traducerea efectuata pana in prezent. Va rugam sa reinei ca nu sunt aceleai statistici ca cele afiate de <>. Aici, este vorba de statistici despre utilizarea recenta a fiierului PO, in timp ce <> raporteaza starea fiierului. Este o funcie de invaluire pentru funcia Locale::Po4a::Po::stats_get aplicata la fiierul PO de intrare. Exemplu de utilizare: [utilizarea normala a documentului po4a...] ($percent,$hit,$queries) = $document->stats(); print "Am gasit traduceri pentru $percent\% ($hit din $queries) de iruri.\n"; Manipularea addendelor addendum($) Va rugam sa consultai po4a(7) pentru mai multe informaii despre ce sunt addendele i cum ar trebui sa le scrie traducatorii. Pentru a aplica un addendum documentului tradus, pur i simplu trecei numele sau de fiier la aceasta funcie i ai terminat ;) Aceasta funcie returneaza un numar intreg nenul in caz de eroare. FUNCII INTERNE utilizate pentru scrierea analizatorilor derivativi Obinerea intrarilor, furnizarea ieirilor Sunt furnizate patru funcii pentru a obine intrare i a returna ieire. Acestea sunt foarte asemanatoare cu shift/unshift i push/pop din Perl. * Perl shift returneaza primul element din matrice i il elimina din matrice. * Perl unshift antepune un element in matrice ca primul element din matrice. * Perl pop returneaza ultimul element al matricei i il elimina din matrice. * Perl push adauga un element in matrice ca ultim element al matricei. Prima pereche este despre intrare, in timp ce a doua este despre ieire. Mnemonic: la intrare, suntei interesat de prima linie, ceea ce ofera shift(), iar la ieire dorii sa adaugai rezultatul la sfarit, aa cum face push(). shiftline() Aceasta funcie returneaza prima linie care urmeaza sa fie analizata i referina corespunzatoare (impachetata ca o matrice) din matricea "@{$self->{TT}{doc_in}}" i elimina aceste prime doua elemente ale matricei. Aici, referina este furnizata de un ir "$filename:$linenum". unshiftline($$) Deplaseaza ultima linie deplasata a documentului de intrare i referina corespunzatoare inapoi la inceputul "{$self->{TT}{doc_in}}". pushline($) Introduce o linie noua la sfaritul "{$self->{TT}{doc_out}}". popline() Extrage ultima linie introdusa de la sfaritul "{$self->{TT}{doc_out}}". Marcarea irurilor de caractere ca traductibile O funcie este furnizata pentru a gestiona textul care trebuie tradus. translate($$$) Argumente obligatorii: - Un ir de caractere de tradus - Referina acestui ir de caractere (de exemplu, poziia in fiierul de intrare) - Tipul acestui ir (adica descrierea textuala a rolului sau structural; utilizat in Locale::Po4a::Po::gettextization(); vezi i po4a(7), seciunea Gettextizarea: cum funcioneaza?) Aceasta funcie poate primi i cateva argumente suplimentare. Acestea trebuie sa fie organizate ca p serie de elemente asociative. De exemplu: $self->translate("string","ref","type", 'wrap' => 1); wrap argument boolean care indica daca putem considera ca spaiile albe din ir nu sunt importante. Daca da, funcia canonizeaza irul de caractere inainte de a cauta o traducere sau de a-l extrage i include traducerea. wrapcol coloana la care trebuie sa se incadreze (implicit: valoarea lui wrapcol specificata la crearea TransTractor sau 76). Valoarea negativa va fi sustrasa din valoarea implicita. comment un comentariu suplimentar pentru a adauga la intrare. Aciuni: - Trimite irul, referina i tipul in po_out. - Returneaza traducerea irului de caractere (aa cum se gasete in po_in) astfel incat analizatorul sa poata construi doc_out. - Gestioneaza seturile de caractere pentru a recodifica irurile inainte de a le trimite la po_out i inainte de a returna traducerile. Diverse funcii verbose() Returneaza daca opiunea ,,verbose" (de detaliere a informaiilor) a fost trecuta in timpul crearii TransTractor. debug() Returneaza daca opiunea ,,debug" (de depanare) a fost trecuta in timpul crearii TransTractor. get_in_charset() Aceasta funcie returneaza setul de caractere care a fost furnizat ca set de caractere principal get_out_charset() Aceasta funcie va returna setul de caractere care trebuie utilizat in documentul de ieire (de obicei util pentru a inlocui setul de caractere detectat in documentul de intrare, in cazul in care acesta a fost gasit). Aceasta va utiliza setul de caractere de ieire specificat in linia de comanda. Daca nu a fost specificat, va utiliza setul de caractere al PO de intrare, iar daca PO de intrare are valoarea implicita ,,CHARSET", va returna setul de caractere al documentului de intrare, astfel incat sa nu fie efectuata nicio codificare. PERSPECTIVE Un neajuns al TransTractor-ului actual este ca nu poate gestiona documente traduse care conin toate limbile, cum ar fi abloanele ,,debconf" sau fiierele ,,.desktop". Pentru a aborda aceasta problema, singurele modificari de interfaa necesare sunt: - luarea unui tabel de elemente asociate ca po_in_name (o lista pentru fiecare limba) - adaugarea unui argument la traducere pentru a indica limba inta - crearea unei funcii pushline_all*(, care ar face ,,pushline" din coninutul sau pentru toate limbile, folosind o sintaxa de tip harta: $self->pushline_all({ "Description[".$langcode."]=". $self->translate($line,$ref,$langcode) }); Vom vedea daca este suficient ;) AUTORI Denis Barbier Martin Quinson (mquinson#debian.org) Jordi Vilalta perl v5.42.0 2025-11-22 LOCALE::PO4A::TRANSTRACTOR.3PM(1)