| LOCALE::PO4A::TRANSTRACTOR.3PM(1) | User Contributed Perl Documentation | LOCALE::PO4A::TRANSTRACTOR.3PM(1) |
NAMN¶
Locale::Po4a::TransTractor – generisk trans(lator ex)tractor.
BESKRIVNING¶
Målet med po4a-projektet (PO för allt) är att underlätta översättningar (och, ännu mer intressant, underhållet av översättningar) med hjälp av gettext-verktyg på områden där de inte förväntades användas, såsom dokumentation.
Denna klass är föregångaren till alla po4a-parsers som används för att analysera ett dokument, söka efter översättningsbara strängar, extrahera dem till en PO-fil och ersätta dem med deras översättning i utdatadokumentet.
Mer formellt tar den följande argument som indata:
- ett dokument att översätta;
- en PO-fil som innehåller de översättningar som ska användas.
Som utdata producerar den:
- en annan PO-fil, som är resultatet av extraheringen av översättningsbara strängar från indatadokumentet;
- ett översatt dokument med samma struktur som det ursprungliga, men där alla översättningsbara strängar har ersatts med översättningarna i den PO-fil som angetts som indata.
Här är en grafisk representation av detta:
Input document --\ /---> Output document
\ / (translated)
+-> parse() function -----+
/ \
Input PO --------/ \---> Output PO
(extracted)
FUNKTIONER SOM DIN PARSARE BÖR ÖVERSKRIVA¶
- parse()
- Det är här allt arbete utförs: analys av indata,
generering av utdata och extrahering av översättningsbara
strängar. Detta är ganska enkelt med hjälp av de
funktioner som presenteras i avsnittet INTERNAL FUNCTIONS nedan. Se
även SYNOPSIS, som innehåller ett exempel.
Denna funktion anropas av funktionen process() nedan, men om du väljer att använda funktionen new() och lägga till innehåll manuellt i ditt dokument måste du själv anropa denna funktion.
- docheader()
- Denna funktion returnerar den rubrik som vi ska lägga till i det producerade dokumentet, korrekt citerad för att vara en kommentar på målspråket. Se avsnittet Educating developers about translations, från po4a(7), för information om vad den är bra för.
SYNOPSIS¶
Följande exempel analyserar en lista med stycken som börjar med "<p>". För enkelhetens skull antar vi att dokumentet är välformaterat, dvs. att '<p>" är de enda taggarna som finns, och att denna tagg finns i början av varje stycke.
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--; ) {
# Inte första gången vi ser <p>.
# Sätt tillbaka den aktuella raden i indata,
# och lägg den byggda paragrafen till utdata
$self->unshiftline($line,$lref);
# Nu när dokumentet är format, översätt det:
# - Ta bort den inledande taggen
$paragraph =~ s/^<p>//s;
# - skicka den inledande taggen (oöversatt) och
# resten av stycket (översatt) till utdata
$self->pushline( "<p>"
. $self->translate($paragraph,$pararef)
);
nästa PARAGRAF;
} else {
# Lägg till i paragrafen
$paragraph .= $line;
$pararef = $lref unless(length($pararef));
}
# Starta om slingan
($line,$lref)=$self->shiftline();
}
# Fick du inte en definierad rad? Slut på inmatningsfilen.
return;
}
}
När du har implementerat parse-funktionen kan du använda din dokumentklass med hjälp av det offentliga gränssnittet som presenteras i nästa avsnitt.
Som standard läser din dokumentklass endast från den fil som användaren tillhandahåller. För att hantera filinkludering (t.ex. med \include i LaTeX eller liknande) måste du anropa read() för varje fil som ska inkluderas. Se modulen Tex.pm för ett exempel på en överskriven read()-funktion som inte bara laddar huvudfilen utan också söker efter inkluderingsförfrågningar och elegant lägger till de inkluderade filerna i raden av rader som ska analyseras. De inkluderade filerna infogas i det översatta dokumentet av modulen Tex.pm: allt innehåll placeras i det översatta dokumentet istället för att skapa separata filer för översättningen av inkluderade filer. Detta är något suboptimalt, särskilt om en inkluderad fil används i många filer, men att ändra detta skulle vara ganska komplicerat och ingen dokumentklass gör det hittills. Det skulle innebära att man överbelastar write()-funktionen som ansvarar för att skriva innehållet till den producerade lokaliserade filen, men jag är inte säker på att användningsfördelen skulle vara värd kodkomplexiteten. Lokaliserade filer är värdelösa filer som kan tas bort från disken när dokumentkompileringen är klar, så slöseriet med utrymme är mycket diskutabelt.
Observera att det är valfritt att använda read() för att lägga till innehåll i listan och shiftline() för att hämta detta innehåll. Modulen Sgml.pm använder till exempel inte denna mekanism, eftersom den istället använder en extern parser. Kontrollera funktionen read() från Sgml.pm för att se hur filnamnen sparas i en privat array och hur parse() sedan åsidosätts för att inte använda de klassiska parsningsfunktionerna utan istället en SGML-specifik parse_file(). Den senare funktionen skiljer sig mycket från resten av po4a-kodbasen, eftersom allt grovjobb utförs av den externa binären "onsgmls".
PUBLIC INTERFACE för skript som använder din parser¶
Konstruktör¶
- process (%)
- Denna funktion kan göra allt du behöver göra med ett po4a-dokument i ett enda anrop. Dess argument måste packas som en hash. ÅTGÄRDER:
- a.
- Läser alla PO-filer som anges i po_in_name
- b.
- Läser alla originaldokument som anges i file_in_name
- c.
- Analyserar dokumentet
- d.
- Läser och tillämpar alla angivna tillägg
- e.
- Skriver det översatta dokumentet till file_out_name (om angivet)
- f.
- Skriver den extraherade PO-filen till po_out_name (om angivet)
ARGUMENT, förutom de som accepteras av new() (med förväntad typ):
- fil_i_namn (@)
- Lista över filnamn där vi ska läsa in dokumentet.
- file_in_charset ($)
- Teckenuppsättning som används i indatadokumentet (om det inte anges, använd UTF-8).
- filnamn_ut ($)
- Filnamn där vi ska skriva ut dokumentet.
- file_out_charset ($)
- Teckenuppsättning som används i utdatadokumentet (om det inte anges, använd UTF-8).
- po_in_name (@)
- Lista över filnamn där vi ska läsa in PO-filerna, som innehåller översättningen som kommer att användas för att översätta dokumentet.
- po_out_name ($)
- Filnamn där vi ska skriva ut PO-filen, som innehåller strängarna som extraherats från indokumentet.
- addendum (@)
- Lista över filnamn där vi ska läsa tilläggen från.
- addendum_charset ($)
- Teckenuppsättning för tillägget.
- ny(%)
- Skapa ett nytt po4a-dokument. Godkända flaggor (i hash som skickas som parameter):
- verbos ($)
- Ställer in detaljeringsgraden.
- felsökning ($)
- Ställer in felsökningen.
- wrapcol ($)
- Den kolumn där vi ska bryta texten i utdatadokumentet (standard:
76).
Det negativa värdet innebär att raderna inte ska brytas alls.
Det accepterar också följande flaggor för underliggande Po-filer: porefs, copyright-holder, msgid-bugs-address, package-name, package-version, wrap-po.
Manipulera dokumentfiler¶
- läs ($$$)
- Lägg till ytterligare ett indatadokument i slutet av den befintliga
matrisen "@{$self->{TT}{doc_in}}".
Denna funktion tar två obligatoriska argument och ett valfritt.
* Filnamnet som ska läsas på disken.
* Namnet som ska användas som filnamn när referensen skapas i PO-filen.
* Teckenuppsättningen som ska användas för att läsa filen (UTF-8 som standard)Denna matris "@{$self->{TT}{doc_in}}" innehåller data från det inmatade dokumentet som en matris av strängar med alternerande betydelser.
* Strängen $textline innehåller varje rad i den inmatade textdata.
* Strängen "$filename:$linenum" innehåller dess plats och kallas
"referens" ("linenum" börjar med 1).Observera att den inte analyserar något. Du bör använda funktionen parse() när du är klar med att packa inmatningsfilerna i dokumentet.
- skriv($)
- Skriv det översatta dokumentet till det angivna filnamnet.
Dessa översatta dokumentdata tillhandahålls av:
* "$self->docheader()" som innehåller rubriktexten för tillägget, och
* "@{$self->{TT}{doc_out}}" som innehåller varje rad av den huvudsakliga översatta texten i arrayen.
Manipulera PO-filer¶
- readpo($)
- Lägg till innehållet i en fil (vars namn anges som argument) till den befintliga inmatnings-PO:n. Det gamla innehållet raderas inte.
- writepo($)
- Skriv den extraherade PO-filen till det angivna filnamnet.
- stats()
- Returnerar statistik om den översättning som hittills har
gjorts. Observera att det inte är samma statistik som den som
skrivs ut av msgfmt --statistic. Här är det statistik om den
senaste användningen av PO-filen, medan msgfmt rapporterar filens
status. Det är ett skalprogram till funktionen
Locale::Po4a::Po::stats_get som tillämpas på den inmatade
PO-filen. Exempel på användning:
[normal användning av po4a-dokumentet...] ($percent,$hit,$queries) = $document->stats(); print "Vi hittade översättningar för $percent\% ($hit från $queries) av strängar.\n";
Manipulering av tillägg¶
- addendum($)
- Se po4a(7) för mer information om vad tillägg
är och hur översättare ska skriva dem. För att
tillämpa ett tillägg på det översatta
dokumentet, skicka bara dess filnamn till denna funktion så
är du klar ;)
Denna funktion returnerar ett icke-null-heltal vid fel.
INTERNA FUNKTIONER som används för att skriva derivatparsers¶
Få input, ge output¶
Fyra funktioner tillhandahålls för att hämta inmatning och returnera utdata. De liknar mycket shift/unshift och push/pop i Perl.
* Perl shift returnerar det första arrayelementet och tar bort det från arrayen. * Perl unshift lägger till ett element i början av arrayen som det första arrayelementet. * Perl pop returnerar det sista arrayelementet och tar bort det från arrayen. * Perl push lägger till ett element i slutet av arrayen som det sista arrayelementet.
Det första paret handlar om inmatning, medan det andra handlar om utmatning. Mnemoteknik: vid inmatning är du intresserad av den första raden, vad shift ger, och vid utmatning vill du lägga till ditt resultat i slutet, precis som push gör.
- shiftline()
- Denna funktion returnerar den första raden som ska analyseras och dess motsvarande referens (packad som en array) från arrayen "@{$self->{TT}{doc_in}}" och tar bort dessa två första arrayelement. Här tillhandahålls referensen av en sträng "$filename:$linenum".
- unshiftline($$)
- Återställer den senast flyttade raden i indokumentet och dess motsvarande referens tillbaka till början av "{$self->{TT}{doc_in}}".
- pushline($)
- Skicka en ny rad till slutet av "{$self->{TT}{doc_out}}".
- popline()
- Ta bort den sista raden från slutet av "{$self->{TT}{doc_out}}".
Markera strängar som översättningsbara¶
En funktion tillhandahålls för att hantera texten som ska översättas.
- translate($$$)
- Obligatoriska argument:
- En sträng att översätta
- Referensen för denna sträng (dvs. position i inmatningsfilen)
- Denna strängs typ (dvs. den textuella beskrivningen av dess strukturella roll; används i Locale::Po4a::Po::gettextization(); se även po4a(7), avsnitt Gettextization: hur fungerar det?)
Denna funktion kan också ta några extra argument. De måste organiseras som en hash. Till exempel:
$self->translate("string","ref","type",
'wrap' => 1);
- wrap
- boolean som anger om vi kan anse att blanktecken i strängen inte är viktiga. Om ja, kanoniserar funktionen strängen innan den söker efter en översättning eller extraherar den, och sluter in översättningen.
- wrapcol
- den kolumn där vi ska bryta (standard: värdet för
B-<wrapcol> t som angavs vid skapandet av TransTractor eller 76).
Det negativa värdet kommer att subtraheras från standardvärdet.
- comment
- en extra kommentar att lägga till i inlägget.
Åtgärder:
- Skickar strängen, referensen och typen till po_out.
- Returnerar översättningen av strängen (som finns i po_in) så att parsern kan bygga doc_out.
- Hanterar teckenuppsättningarna för att omkodera strängarna innan de skickas till po_out och innan översättningarna returneras.
Övriga funktioner¶
- verbose()
- Returnerar om flaggan verbose angavs vid skapandet av TransTractor.
- debug()
- Returnerar om felsökningsflaggan överfördes under skapandet av TransTractor.
- get_in_charset()
- Denna funktion returnerar det teckenuppsättningsformat som angavs som huvudteckenuppsättningsformat
- get_out_charset()
- Denna funktion returnerar den teckenuppsättning som ska
användas i utdatadokumentet (vanligtvis användbart
för att ersätta den teckenuppsättning som
upptäckts i indatadokumentet där den har hittats).
Den använder den teckenuppsättning som anges i kommandoraden. Om ingen teckenuppsättning anges används teckenuppsättningen i den inmatade PO:n, och om den inmatade PO:n har standardteckenuppsättningen "CHARSET" returneras teckenuppsättningen i det inmatade dokumentet, så att ingen kodning utförs.
FRAMTIDA RIKTNINGAR¶
En brist hos den nuvarande TransTractor är att den inte kan hantera översatta dokument som innehåller alla språk, såsom debconf-mallar eller .desktop-filer.
För att lösa detta problem behövs endast följande gränssnittsändringar:
- ta en hash som po_in_name (en lista per språk)
- lägg till ett argument för översättning för att ange målspråket
- skapa en pushline_all-funktion, som skulle skapa en pushline av dess
innehåll för alla språk, med hjälp av en
kartliknande syntax:
$self->pushline_all({ "Description[".$langcode."]=". $self->translate($line,$ref,$langcode) });
Vi får se om det räcker ;)
UPPHOVSPERSONER¶
Denis Barbier <barbier@linuxfr.org> Martin Quinson (mquinson#debian.org) Jordi Vilalta <jvprat@gmail.com>
| 2026-03-23 | perl v5.42.0 |