.\" Automatically generated by Pod::Man 4.10 (Pod::Simple 3.35) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" ======================================================================== .\" .IX Title "PO4A 7" .TH PO4A 7 "2020-08-19" "Po4a-hulpmiddelen" "Po4a-hulpmiddelen" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAAM" .IX Header "NAAM" po4a \- raamwerk voor de vertaling van documentatie en ander materiaal .SH "Inleiding" .IX Header "Inleiding" po4a (\s-1PO\s0 voor alles) vergemakkelijkt het onderhoud van de vertaling van documentatie via het gebruik van het klassieke gettext-gereedschap. De belangrijkste eigenschap van po4a is dat het de vertaling van de inhoud loskoppelt van de structuur van het document. .PP Dit document dient als een inleiding tot het po4a\-project met een focus op potentiële gebruikers die zich afvragen of ze dit hulpmiddel zouden gebruiken, en op nieuwsgierigen die willen begrijpen waarom de dingen zijn zoals ze zijn. .SH "Waarom po4a?" .IX Header "Waarom po4a?" De filosofie van Vrije Software is om de technologie echt voor iedereen beschikbaar te maken. Maar het licentie-aspect is niet het enige om in overweging te nemen: voor niet-Engelstaligen is niet-vertaalde software nutteloos. Daarom hebben we nog steeds wat werk te doen om software voor iedereen beschikbaar te maken. .PP Door de meeste projecten wordt deze situatie goed begrepen en iedereen is nu overtuigd van de noodzaak om alles te vertalen. Niettemin betekent het eigenlijke vertaalwerk een geweldige inspanning voor veel individuen, gehandicapt door kleine technische moeilijkheden. .PP Gelukkig wordt opensourcesoftware eigenlijk heel goed vertaald met behulp van de gettext gereedschapssuite. Dit gereedschap wordt gebruikt om de te vertalen tekstfragmenten uit een programma te extraheren en deze te vertalen tekstfragmenten aan te bieden in een gestandaardiseerde indeling (PO-bestanden genoemd, ofwel vertaalcatalogus). Een heel ecosysteem hulpmiddelen is ontstaan om vertalers te helpen bij het daadwerkelijk vertalen van deze PO-bestanden. Het resultaat wordt vervolgens door gettext gebruikt om tijdens de programmauitvoering de vertaalde berichten aan de eindgebruiker te tonen. .PP Met betrekking tot documentatie is de situatie nog steeds enigszins ontgoochelend. Op het eerste gezicht lijkt het vertalen van documentatie makkelijker dan een programma vertalen, aangezien het erop lijkt dat je gewoon het bronbestand met de documentatie moet kopiëren en moet beginnen met het vertalen van de inhoud. Wanneer de originele documentatie echter aangepast wordt, wordt het bijhouden van de wijzigingen al snel een nachtmerrie voor de vertalers. Indien deze taak manueel moet gebeuren is ze onaangenaam en foutgevoelig. .PP Verouderde vertalingen zijn vaak erger dan helemaal geen vertaling. Eindgebruikers kunnen misleid worden door documentatie die een verouderd gedrag van het programma beschrijft. Bovendien kunnen zij niet rechtstreeks in interactie treden met de onderhouders, omdat zij geen Engels spreken. Daarenboven kan de onderhouder het probleem niet oplossen, aangezien deze niet elke taal kan kennen waarin de documentatie vertaald werd. Deze moeilijkheden, vaak veroorzaakt door slecht gereedschap, kan de motivatie van vertaalvrijwilligers ondermijnen en zo leiden tot een verdere verergering van het probleem. .PP \&\fBHet doel van het po4a\-project is om het werk van documentatievertalers te vergemakkelijken\fR. In het bijzonder maakt het documentatievertalingen \&\fIonderhoudbaar\fR. .PP Het idee bestaat erin de gettext-aanpak te hergebruiken en aan te passen aan deze sector. Zoals dat met gettext het geval is, worden teksten geëxtraheerd uit hun originele locatie en aan vertalers voorgelegd als PO-vertaalcatalogi. De vertalers kunnen gebruik maken van het klassieke gettext-gereedschap om het te presteren werk op te volgen, om samen te werken en zich als team te organiseren. Daarna injecteert po4a de vertalingen rechtstreeks in de structuur van de documentatie om vertaalde bronbestanden te produceren die verwerkt en verspreid kunnen worden, net als de Engelse bestanden. Elke onvertaalde paragraaf blijft in het uiteindelijke document in het Engels staan, zodat er voor gezorgd wordt dat de eindgebruiker nooit een verouderde vertaling te zien krijgt in de documentatie. .PP Dit automatiseert het grootste deel van het zware werk van het onderhoud van vertalingen. Te weten komen welke paragrafen bijgewerkt moeten worden, wordt erg makkelijk, en het proces van het herordenen van elementen zonder dat er verder iets wijzigt, verloopt volledig automatisch. Ook kan specifieke verificatie toegepast worden om de kans op opmaakfouten, welke tot een defect document zouden leiden, te verkleinen. .PP Raadpleeg ook de \fB\s-1FAQ\s0\fR verder in dit document, voor een meer volledige lijst van de voor\- en nadelen van deze aanpak. .SS "Ondersteunde indelingen" .IX Subsection "Ondersteunde indelingen" Momenteel werd deze aanpak met succes toegepast voor verschillende soorten tekstopmaakindelingen: .IP "man (voldragen ontleder)" 4 .IX Item "man (voldragen ontleder)" De goede oude man-paginaindeling, welke door zoveel programma's gebruikt wordt. Ondersteuning door po4a is hier erg welkom, aangezien deze indeling enigszins moeilijk te gebruiken is en niet echt vriendelijk voor nieuwkomers. .Sp De module \fBLocale::Po4a::Man\fR\|(3pm) ondersteunt ook de mdoc-indeling, welke door de \s-1BSD\s0 man-pagina's gebruikt wordt (deze zijn ook redelijk gebruikelijk onder Linux). .IP "AsciiDoc (voldragen ontleder)" 4 .IX Item "AsciiDoc (voldragen ontleder)" Dit is een lichtgewicht opmaakindeling, bedoeld om het schrijven van documentatie te vergemakkelijken. Zij wordt bijvoorbeeld gebruikt voor het documenteren van het git-systeem. Deze man-pagina's worden vertaald met po4a. .IP "pod (voldragen ontleder)" 4 .IX Item "pod (voldragen ontleder)" Dit is de indeling voor de Perl Online Documentatie. De computertaal en de uitbreidingen ervan worden gedocumenteerd met behulp van deze indeling, net als de meeste bestaande Perl-scripts. Het maakt het makkelijk om de documentatie dicht bij de echte code te houden, door beide in te bedden in hetzelfde bestand. Het maakt het leven van programmeurs makkelijker, maar jammer genoeg niet dat van vertalers, tenzij u po4a gebruikt. .IP "sgml (voldragen ontleder)" 4 .IX Item "sgml (voldragen ontleder)" Zelfs als deze indeling tegenwoordig wordt vervangen door \s-1XML,\s0 wordt ze nog steeds gebruikt voor documenten van meer dan enkele schermen lang. Ze kan zelfs gebruikt worden voor volledige boeken. Het kan een hele uitdaging zijn om dergelijk lange documenten bij te werken. \fBdiff\fR blijkt vaak niet bruikbaar te zijn wanneer na het bijwerken het inspringen van de oorspronkelijke tekst opnieuw werd uitgevoerd. Gelukkig kan po4a u na dit proces behulpzaam zijn. .Sp Momenteel worden enkel DebianDoc en DocBook \s-1DTD\s0 ondersteund, maar iets anders ondersteunen is erg gemakkelijk. Het is zelfs mogelijk om zonder de code te wijzigen po4a te gebruiken bij een onbekende \s-1SGML DTD\s0 door de nodige informatie op te geven aan de commandoregel. Zie \fBLocale::Po4a::Sgml\fR\|(3pm) voor details. .IP "TeX / LaTeX (voldragen ontleder)" 4 .IX Item "TeX / LaTeX (voldragen ontleder)" De LaTeX-indeling is een heel belangrijke indeling voor documentatie in de vrije-softwarewereld evenals voor publicaties. .Sp De module \fBLocale::Po4a::LaTeX\fR\|(3pm) werd getest met de Python-documentatie , een boek en enkele presentaties. .IP "text (voldragen ontleder)" 4 .IX Item "text (voldragen ontleder)" De indeling Text is de basisindeling voor veel indelingen welke lange blokken tekst bevatten, waaronder Markdown, debian/changelog en debian/control. .Sp Dit ondersteunt de indeling die Static Site Generators, \s-1README\s0's en andere documentatiesystemen gebruiken en gemeen hebben. .IP "xml and \s-1XHMTL\s0 (vermoedelijk voldragen ontleder)" 4 .IX Item "xml and XHMTL (vermoedelijk voldragen ontleder)" De indeling \s-1XML\s0 is een basisindeling voor veel documentatie-indelingen. .Sp Momenteel worden DocBook \s-1DTD\s0 (zie \fBLocale::Po4a::Docbook\fR\|(3pm) voor details) en \s-1XHTML\s0 door po4a ondersteund. .IP "texinfo (zeer erg experimentele ontleder)" 4 .IX Item "texinfo (zeer erg experimentele ontleder)" Alle GNU-documentatie wordt in deze indeling geschreven (het is zelfs een vereiste om een officieel GNU-project te worden). De ondersteuning in po4a voor \fBLocale::Po4a::Texinfo\fR\|(3pm) zit nog steeds in zijn beginfase. Gelieve problemen en functieverzoeken te rapporteren. .IP "Andere ondersteunde indelingen" 4 .IX Item "Andere ondersteunde indelingen" Po4a kan ook overweg met enkele meer zeldzame of gespecialiseerde indelingen, zoals de documentatie over compilatieopties voor de 2.4+ Linux-kernels of de diagrammen die door het programma dia geproduceerd worden. Een nieuwe indeling toevoegen is vaak erg gemakkelijk en de belangrijkste taak bestaat erin een ontleder aan te brengen voor de beoogde indeling. Zie \fBLocale::Po4a::TransTractor\fR\|(3pm) voor meer informatie hierover. .IP "Niet-ondersteunde indelingen" 4 .IX Item "Niet-ondersteunde indelingen" Jammer genoeg biedt po4a nog geen ondersteuning voor verschillende documentaie-indelingen. Voor vele zou po4a makkelijk ondersteuning kunnen bieden. Het betreft indelingen die niet enkel voor documentatie gebruikt worden, zoals pakketbeschrijvingen (deb en rpm), vragen van pakketinstallatiescripts, changelogs van pakketten en alle gespecialiseerde bestandsformaten welke gebruikt worden door programma's zoals spelscenario's en wine-bronbestanden. .SH "Het gebruik van po4a" .IX Header "Het gebruik van po4a" Oorspronkelijk werd po4a gebouwd rond vier scripts, welke elk een specifieke taak vervullen. \fBpo4a\-gettextize\fR\|(1) helpt bij het opstarten van vertalingen en eventueel bij het converteren van bestaande vertaalprojecten naar po4a. \fBpo4a\-updatepo\fR\|(1) reflecteert de wijzigingen in de originele documentatie in de overeenkomstige po-bestanden. \fBpo4a\-translate\fR\|(1) bouwt een vertaald bronbestand uit de originele documentatie en het overeenkomstige PO-bestand. Daarnaast is er \fBpo4a\-normalize\fR\|(1) dat vooral nuttig is voor het debuggen van de po4a\-ontleders, omdat het een onvertaald document produceert vanuit het origineel. Het maakt het gemakkelijker om de door het parser-proces veroorzaakte probleempjes op te sporen. .PP De meeste projecten hebben enkel de functionaliteit van \fBpo4a\-updatepo\fR\|(1) en \fBpo4a\-translate\fR\|(1) nodig, maar deze scripts bleken in het gebruik omslachtig en foutgevoelig te zijn. Indien de te vertalen documentatie opgesplitst is in verschillende bronbestanden, is het moeilijk om de PO-bestanden up-to-date te houden en de documentatiebestanden correct te bouwen. Als antwoord hierop wordt een alles\-in\-ééngereedschap aangereikt: \&\fBpo4a\fR\|(1). Dit gereedschap vertrekt van een configuratiebestand dat de structuur van het vertaalproject beschrijft: de locatie van de PO-bestanden, de lijst van de te vertalen bestanden en de te gebruiken opties, en het automatiseert dit proces volledig. Wanneer u \fBpo4a\fR\|(1) uitvoert, werkt het niet enkel de PO-bestanden bij, maar het regenereert ook de vertaalbestanden welke dit nodig hebben. Indien alles reeds up-to-date is, verandert \&\fBpo4a\fR\|(1) geen enkel bestand. .PP In de rest van dit onderdeel vindt u een overzicht over hoe de scriptinterface van po4a wordt gebruikt. De meeste gebruikers zullen er waarschijnlijk de voorkeur aan geven het alles\-in\-ééngereedschap te gebruiken, dat beschreven wordt in de documentatie van \fBpo4a\fR\|(1). .SS "Grafisch overzicht van de po4a\-scripts" .IX Subsection "Grafisch overzicht van de po4a-scripts" Het volgende schema geeft een overzicht van hoe elk po4a\-script gebruikt kan worden. Hier is \fIhoofddocument.doc\fR een voorbeeldnaam voor de te vertalen documentatie; \fI\s-1XX\s0.doc\fR is hetzelfde document, vertaald in taal \s-1XX,\s0 terwijl \&\fIdoc.XX.po\fR de vertaalcatalogus van dat document is in taal \s-1XX.\s0 Auteurs van documentatie zullen zich hoofdzakelijk bezighouden met \fIhoofddocument.doc\fR (dit kan een man-pagina zijn, een XML-document, een asciidoc-bestand of iets dergelijks). De vertalers zullen zich hoofdzakelijk bezighouden met het PO-bestand, terwijl de eindgebruikers uitsluitend het bestand \fI\s-1XX\s0.doc\fR zullen zien. .PP .Vb 10 \& hoofddocument.doc \& | \& V \& +<\-\-\-\-\-<\-\-\-\-+<\-\-\-\-\-<\-\-\-\-\-<\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\->\-\-\-\-\-\-\-\->\-\-\-\-\-\-\-+ \& : | | : \&{vertaling} | { update van hoofddocument.doc } : \& : | | : \& XX.doc | V V \& (facultatief) | hoofddocument.doc \->\-\-\-\-\-\-\-\->\-\-\-\-\-\->+ \& : | (nieuw) | \& V V | | \& [po4a\-gettextize] doc.XX.po \-\->+ | | \& | (oud) | | | \& | ^ V V | \& | | [po4a\-updatepo] | \& V | | V \& vertaling.pot ^ V | \& | | doc.XX.po | \& | | (onnauwkeurig) | \& { vertaling } | | | \& | ^ V V \& | | {handmatig bewerken} | \& | | | | \& V | V V \& doc.XX.po \-\-\->\-\-\-\->+<\-\-\-<\-\- doc.XX.po addendum hoofddocument.doc \& (initieel) (up\-to\-date) (facultatief) (up\-to\-date) \& : | | | \& : V | | \& +\-\-\-\-\->\-\-\-\-\->\-\-\-\-\->\-\-\-\-\-\-> + | | \& | | | \& V V V \& +\-\-\-\-\-\->\-\-\-\-\-+\-\-\-\-\-\-<\-\-\-\-\-\-+ \& | \& V \& [po4a\-translate] \& | \& V \& XX.doc \& (up\-to\-date) .Ve .PP Dit schema is gecompliceerd, maar in de praktijk wordt enkel het rechterdeel gebruikt (waarbij \fBpo4a\-updatepo\fR\|(1) en \fBpo4a\-translate\fR\|(1) betrokken zijn) nadat het project opgezet en geconfigureerd is. .PP Het linkerdeel laat zien hoe \fBpo4a\-gettextize\fR\|(1) kan worden gebruikt om een bestaand vertaalproject te converteren naar de po4a\-infrastructuur. Dit script gebruikt een origineel document en zijn vertaalde tegenhanger en tracht het overeenkomstige PO-bestand te bouwen. Een dergelijke handmatige conversie is nogal omslachtig (zie de documentatie over \&\fBpo4a\-gettextize\fR\|(1) voor meer details), maar ze moet slechts eenmaal gebruikt worden om uw bestaande vertalingen om te zetten. Indien u geen te converteren vertalingen heeft, kunt u dit vergeten en u concentreren op het rechterdeel van het schema. .PP In de rechterbovenhoek wordt de actie van de oorspronkelijke auteur afgebeeld, welke de documentatie bijwerkt. Het middelste rechterdeel geeft de automatische acties van \fBpo4a\-updatepo\fR\|(1) weer. Het nieuwe materiaal wordt geëxtraheerd en vergeleken met de bestaande vertaling. De vorige vertaling wordt gebruikt voor de delen welke niet gewijzigd werden, terwijl de gedeeltelijk gewijzigde delen gekoppeld worden aan de vorige vertaling met de aanduiding \*(L"fuzzy\*(R" (onnauwkeurig), hetgeen aangeeft dat de vertaling moet bijgewerkt worden. Nieuw of grondig gewijzigd materiaal blijft onvertaald. .PP Vervolgens geeft het gerapporteerde \fIhandmatig bewerken\fR de actie van de vertalers weer, welke de PO-bestanden wijzigen om te voorzien in een vertaling voor elk origineel tekstfragment en alinea. Dit kan gebeuren met een specifieke editor, zoals de \fB\s-1GNOME\s0 Translation Editor\fR, \s-1KDE\s0's \&\fBLokalize\fR of \fBpoedit\fR, of met een online lokalisatieplatform, zoals \&\fBweblate\fR of \fBpootle\fR. Het resultaat van de vertaling is een aantal PO-bestanden, één per taal. Raadpleeg de gettext-documentatie voor meer details. .PP Het onderste deel van de afbeelding toont hoe \fBpo4a\-translate\fR\|(1) een vertaald brondocument creëert uit het originele document \&\fIhoofddocument.doc\fR en de vertaalcatalogus \fIdoc.XX.po\fR die door de vertalers bijgewerkt werd. De structuur van het document wordt hergebruikt, terwijl de originele inhoud vervangen wordt door de vertaalde tegenhanger. Facultatief kan een addendum gebruikt worden om aan de vertaling extra tekst toe te voegen. Dit wordt vaak gebruikt om de naam van de vertaler toe te voegen aan het uiteindelijke document. Zie hieronder voor details. .PP Zoals voordien reeds aangegeven werd, combineert het programma \fBpo4a\fR\|(1) de effecten van de aparte scripts en werkt de PO-bestanden en het vertaalde document bij in één beweging. De onderliggende logica blijft dezelfde. .SS "Beginnen met een nieuwe vertaling" .IX Subsection "Beginnen met een nieuwe vertaling" Indien u \fBpo4a\fR\|(1) gebruikt, bestaat er geen specifieke stap voor het starten van een vertaling. U moet gewoon de talen vermelden in het configuratiebestand en de ontbrekende PO-bestanden worden automatisch gecreëerd. Natuurlijk moet de vertaler dan voor de vertaling zorgen van alle inhoud uit uw documenten. \fBpo4a\fR\|(1) creëert ook een POT-bestand, hetgeen een PO-sjabloonbestand is. Potentiële vertalers kunnen uw project naar een nieuwe taal vertalen door dit bestand te hernoemen en te zorgen voor de vertaling ervan in hun taal. .PP Indien u verkiest om de individuele scripts apart te gebruiken, moet u \&\fBpo4a\-gettextize\fR\|(1) als volgt gebruiken om het POT-bestand te creëren. Dit bestand kan dan gekopieerd worden naar \fI\s-1XX\s0.po\fR om een nieuwe vertaling te starten. .PP .Vb 1 \& $ po4a\-gettextize \-\-format \-\-master \-\-po .Ve .PP Het hoofddocument wordt als invoer gebruikt, terwijl het POT-bestand de uitvoer van dit proces is. .SS "Wijzigingen in het originele document integreren" .IX Subsection "Wijzigingen in het originele document integreren" Het script dat daarvoor gebruikt moet worden is \fBpo4a\-updatepo\fR\|(1) (raadpleeg de erbij horende documentatie voor details): .PP .Vb 1 \& $ po4a\-updatepo \-\-format \-\-master \-\-po .Ve .PP Het hoofddocument wordt gebruikt als invoer, terwijl het PO-bestand bijgewerkt wordt: het wordt gebruikt als invoer en als uitvoer. .SS "Een vertaald document genereren" .IX Subsection "Een vertaald document genereren" Als u klaar bent met de vertaling, wilt u de vertaalde documentatie nemen en deze samen met het origineel verdelen naar de gebruikers. Daarvoor moet u het programma \fBpo4a\-translate\fR\|(1) als volgt gebruiken: .PP .Vb 1 \& $ po4a\-translate \-\-format \-\-master \-\-po \-\-localized .Ve .PP Zowel het hoofddocument als de PO-bestanden worden als invoer gebruikt, terwijl het gelokaliseerde bestand de uitvoer is van dit proces. .SS "Addenda gebruiken om extra tekst toe te voegen aan vertalingen" .IX Subsection "Addenda gebruiken om extra tekst toe te voegen aan vertalingen" Het toevoegen van nieuwe tekst aan de vertaling is waarschijnlijk het enige dat op de lange termijn gemakkelijker is wanneer u bestanden handmatig vertaalt :). Dit gebeurt wanneer u een extra onderdeel wilt toevoegen aan het vertaalde document, waarvoor in het originele document geen overeenkomstige inhoud bestaat. Het klassieke toepassingsgebied is erkenning geven aan het vertaalteam en aangeven hoe vertaalspecifieke problemen gemeld kunnen worden. .PP Met po4a moet u \fBaddendum\fR\-bestanden opgeven, die conceptueel beschouwd kunnen worden als patches die na verwerking toegepast worden op het gelokaliseerde document. Elk addendum moet als apart bestand aangereikt worden. De indeling ervan verschilt evenwel erg van klassieke patches. De eerste regel is een \fIheader-regel\fR, die het invoegpunt van het addendum definieert (met een helaas cryptische syntaxis \*(-- zie hieronder), terwijl de rest van het bestand woordelijk toegevoegd wordt op de aangegeven positie. .PP De header-regel moet beginnen met de tekst \fB\s-1PO4A\-HEADER:\s0\fR, gevolgd door een door puntkomma's gescheiden lijst van I B <=> I velden. .PP Bijvoorbeeld, de volgende header declareert een addendum dat helemaal aan het einde van de vertaling geplaatst moet worden. .PP .Vb 1 \& PO4A\-HEADER: mode=eof .Ve .PP De zaken zijn complexer wanneer u de extra inhoud wilt toevoegen in het midden van het document. De volgende header declareert bijvoorbeeld een addendum dat ingevoegd moet worden na de XML-sectie welke het tekstfragment \&\f(CW\*(C`Over dit document\*(C'\fR bevat in de vertaling. .PP .Vb 1 \& PO4A\-HEADER: position=About this document; mode=after; endboundary= .Ve .PP Wanneer po4a tracht een addendum toe te passen, zoekt het in de praktijk naar de eerste regel die overeenkomt met het \f(CW\*(C`position\*(C'\fR\-argument (dit kan een reguliere expressie zijn). Vergeet niet dat po4a hier rekening houdt met het \fBvertaalde\fR document. Deze documentatie is in het Nederlands (en de originele versie ervan in het Engels), maar uw regel zou er waarschijnlijk als volgt moeten uitzien, indien u van plan bent een addendum toe te passen op de Franse vertaling van het document. .PP .Vb 1 \& PO4A\-HEADER: position=À propos de ce document; mode=after; endboundary= .Ve .PP Nadat in het doeldocument de \f(CW\*(C`position\*(C'\fR gevonden werd, zoekt po4a naar de eerstvolgende regel na deze \f(CW\*(C`position\*(C'\fR welke overeenkomt met de opgegeven \&\f(CW\*(C`endboundary\*(C'\fR. Het addendum wordt ingevoegd net \fBna\fR deze regel (omdat we een \fIendboundary\fR opgaven, d.w.z. een begrenzing die de huidige sectie afsluit). .PP Exact hetzelfde effect kan bekomen worden met de volgende header, die gelijkwaardig is: .PP .Vb 1 \& PO4A\-HEADER: position=Over dit document; mode=after; beginboundary=
.Ve .PP Hier zoekt po4a naar de eerste regel die overeenkomt met \f(CW\*(C` na de regel die overeenkomt met \f(CW\*(C`Over dit document\*(C'\fR in de vertaling en voegt het addendum toe \fBvoor\fR die regel, omdat we een \fIbeginboundary\fR opgegeven hebben, d.w.z. een begrenzing welke het begin van de volgende sectie markeert. Deze header-regel vereist dus dat het addendum geplaatst wordt na de sectie waarin \f(CW\*(C`Over dit document\*(C'\fR voorkomt, en informeert po4a dat een sectie begint met een regel welke de tag \f(CW\*(C` bevat. Dit is het equivalent van het vorige voorbeeld, want wat u eigenlijk wilt is het addendum in te voegen na \f(CW\*(C` en voor \f(CW\*(C`. .PP U kunt de invoeging \fImode\fR ook instellen op de waarde \f(CW\*(C`before\*(C'\fR, met een vergelijkbare semantiek: het combineren van \f(CW\*(C`mode = before\*(C'\fR met een \&\f(CW\*(C`endboundary\*(C'\fR zal het addendum juist \fBna\fR de overeenkomstige begrenzing plaatsen, welke de laatst mogelijke begrenzing is voor de \f(CW\*(C`position\*(C'\fR. De combinatie van \f(CW\*(C`mode = before\*(C'\fR met een \f(CW\*(C`beginboundary\*(C'\fR zal het addendum juist \fBvoor\fR de overeenkomstige begrenzing plaatsen, welke de laatst mogelijke grensregel is vóór de \f(CW\*(C`position\*(C'\fR. .PP .Vb 7 \& Modus | Soort begrenzing | Gebruikte begrenzing | Invoegpunt tegenover begrenzing \& ========|===============|========================|========================================= \& \*(Aqbefore\*(Aq| \*(Aqendboundary\*(Aq | laatste voor \*(Aqposition\*(Aq | Juist na de geselecteerde begrenzing \& \*(Aqbefore\*(Aq|\*(Aqbeginboundary\*(Aq| laatste voor \*(Aqposition\*(Aq | Juist voor de geselecteerde begrenzing \& \*(Aqafter\*(Aq | \*(Aqendboundary\*(Aq | eerste na \*(Aqposition\*(Aq | Juist na de geselecteerde begrenzing \& \*(Aqafter\*(Aq |\*(Aqbeginboundary\*(Aq| eerste na \*(Aqposition\*(Aq | Juist voor de geselecteerde begrenzing \& \*(Aqeof\*(Aq | (geen) | n.v.t. | Einde van het bestand .Ve .PP \fIAanwijzingen en kneepjes in verband met addenda\fR .IX Subsection "Aanwijzingen en kneepjes in verband met addenda" .IP "\(bu" 4 Denk eraan dat dit reguliere expressies zijn. Indien u bijvoorbeeld het einde van een nroff-sectie wilt opzoeken welke eindigt met de regel \f(CW\*(C`.fi\*(C'\fR, moet u niet \f(CW\*(C`.fi\*(C'\fR gebruiken als \fBendboundary\fR, omdat dit een overeenkomst zal opleveren met \f(CW\*(C`the [fi]le\*(C'\fR, hetgeen duidelijk niet is wat u verwacht. De juiste \fBendboundary\fR in dit geval is: \f(CW\*(C`^\e.fi$\*(C'\fR. .IP "\(bu" 4 Witruimte \s-1IS\s0 belangrijk in de inhoud van de \f(CW\*(C`position\*(C'\fR en de begrenzingen. En dus zijn de twee volgende zinnen \fBverschillend\fR. De tweede zal slechts gevonden worden als er in het vertaalde document voldoende nakomende spaties zijn. .Sp .Vb 2 \& PO4A\-HEADER: position=Over dit document; mode=after; beginboundary=
\& PO4A\-HEADER: position=Over dit document ; mode=after; beginboundary=
.Ve .IP "\(bu" 4 Hoewel ruwweg zou kunnen aangenomen worden dat deze contextzoekfunctie werkt op elke regel van het \fBvertaalde\fR document, werkt het in feite op de interne gegevensreeks van het vertaalde document. Deze interne gegevensreeks kan een tekst zijn die een volledige alinea beslaat en meerdere regels bevat, of kan ook enkel een XML-tag zijn. Het exacte \fIinvoegpunt\fR van het addendum moet voor of na de interne gegevensreeks komen en kan er niet binnenin liggen. .IP "\(bu" 4 Geef het argument \fB\-vv\fR op aan po4a om te zien hoe de addenda aan de vertaling worden toegevoegd. Dit kan ook behulpzaam zijn voor het uitvoeren van po4a in debug-modus om de exacte gegevensreeks te bekijken wanneer het addendum niet toegevoegd wordt. .PP \fIVoorbeelden van addenda\fR .IX Subsection "Voorbeelden van addenda" .IP "\(bu" 4 Indien u na de volgende nroff-sectie iets wilt toevoegen: .Sp .Vb 1 \& .SH "AUTEURS" .Ve .Sp U moet een benadering in twee stappen selecteren door \fBmode = after\fR in te stellen. Vervolgens moet u de zoekopdracht beperken tot de regel na \&\fB\s-1AUTEURS\s0\fR met de reguliere expressie voor het argument \fBposition\fR. Daarna moet u het begin van de volgende sectie (d.w.z. \fB^\e.SH\fR) laten opzoeken met de reguliere expressie voor het argument \fBbeginboundary\fR. Het is te zeggen: .Sp .Vb 1 \& PO4A\-HEADER:mode=after;position=AUTEURS;beginboundary=\e.SH .Ve .IP "\(bu" 4 Indien u iets wilt toevoegen vlak na een bepaalde regel (bijv. na de regel \&\*(L"Copyright Grote Kerel\*(R"), gebruik dan een \fBposition\fR die met deze regel overeenkomt, \fBmode=after\fR en geef een \fBbeginboundary\fR op die met om het even welke regel overeenkomt. .Sp .Vb 1 \& PO4A\-HEADER:mode=after;position=Copyright Grote Kerel, 2004;beginboundary=^ .Ve .IP "\(bu" 4 Indien u iets wilt toevoegen aan het einde van het document, geef dan een \&\fBposition\fR op die overeenkomt met om het even welke regel van uw document (maar enkel één regel, omdat po4a niet zal aanvaarden dat de \fBposition\fR niet met één enkele regel overeenkomt), en geef een \fBendboundary\fR op die met niets overeenkomt. Gebruik hier geen eenvoudige tekenreeks, zoals \&\fB\*(L"\s-1EOF\*(R"\s0\fR, maar geef de voorkeur aan die welke minder kans maken om in uw document voor te komen. .Sp .Vb 1 \& PO4A\-HEADER:mode=after;position=Over dit document;beginboundary=VerzonnenPo4aBegrenzing .Ve .PP \fIEen meer gedetailleerd voorbeeld\fR .IX Subsection "Een meer gedetailleerd voorbeeld" .PP Origineel document (POD-indeling): .PP .Vb 7 \& |=head1 NAAM \& | \& |dummy \- een dummy\-programma \& | \& |=head1 AUTEUR \& | \& |ik .Ve .PP Dan zal het volgende addendum ervoor zorgen dat een sectie (in het Frans) over de vertaler toegevoegd wordt aan het eind van het bestand (\*(L"\s-1TRADUCTEUR\*(R"\s0 in het Frans betekent \*(L"\s-1VERTALER\*(R",\s0 en \*(L"moi\*(R" betekent \*(L"ik\*(R"). .PP .Vb 6 \& |PO4A\-HEADER:mode=after;position=AUTEUR;beginboundary=^=head \& | \& |=head1 TRADUCTEUR \& | \& |moi \& | .Ve .PP Om uw addendum voor de \s-1AUTEUR\s0 te plaatsen, gebruikt u de volgende header: .PP .Vb 1 \& PO4A\-HEADER:mode=after;position=NAAM;beginboundary=^=head1 .Ve .PP Dit werkt omdat de volgende regel die overeenkomt met de \fBbeginboundary\fR /^=head1/ na de sectie \*(L"\s-1NAME\*(R"\s0 (vertaald als \*(L"\s-1NAAM\*(R"\s0 in het Nederlands), die is welke de auteurs vermeldt. Dus zal het addendum tussen de beide secties geplaatst worden. Merk op dat indien later een andere sectie toegevoegd wordt tussen de secties \s-1NAAM\s0 en \s-1AUTEUR,\s0 po4a de addenda ten onrechte zal plaatsen voor de nieuwe sectie. .PP Om dit te vermijden, kunt u hetzelfde bereiken met behulp van \&\fBmode\fR=\fIbefore\fR: .PP .Vb 1 \& PO4A\-HEADER:mode=before;position=^=head1 AUTEUR .Ve .SH "Hoe werkt dit?" .IX Header "Hoe werkt dit?" Dit hoofdstuk geeft u een kort overzicht van de binnenkant van po4a, zodat u met meer zelfvertrouwen ons kunt helpen het te onderhouden en te verbeteren. Het kan u ook helpen te verstaan waarom het niet doet wat u verwachtte en hoe u uw problemen kunt oplossen. .PP De po4a\-architectuur is objectgeoriënteerd. De klasse \&\fBLocale::Po4a::TransTractor\fR\|(3pm) is de gemeenschappelijke voorouder van alle po4a\-ontleders. Deze vreemde naam komt door het feit dat het tegelijk belast is met de vertaling van het document en het extraheren van tekstfragmenten. .PP Meer formeel neemt het als invoer een te vertalen document plus een PO-bestand dat de te gebruiken vertalingen bevat en produceert het twee aparte uitvoerbestanden: een ander PO-bestand (als resultaat van de extractie van vertaalbare tekstfragmenten uit het invoerdocument) en een vertaald document (met dezelfde structuur als het invoerdocument, maar waarin alle vertaalbare tekstfragmenten vervangen werden met inhoud uit het invoer-PO-bestand). Hier volgt een grafische voorstelling ervan: .PP .Vb 6 \& Invoerdocument \-\-\e /\-\-\-> Uitvoerdocument \& \e TransTractor:: / (vertaald) \& +\-\->\-\- parse() \-\-\-\-\-\-\-\-+ \& / \e \& Invoer\-PO \-\-\-\-\-\-\-\-/ \e\-\-\-> Uitvoer\-PO \& (geëxtraheerd) .Ve .PP Dit kleine botje vormt de kern van de hele po4a\-architectuur. Indien u de invoer-PO en het uitvoerdocument weglaat, krijgt u \fBpo4a\-gettextize\fR. Indien u de beide invoerdocumenten geeft en de uitvoer-PO negeert, krijgt u \&\fBpo4a\-translate\fR. De \fBpo4a\fR aanroept tweemaal TransTractor en aanroept \&\fBmsgmerge \-U\fR tussen deze aanroepen van TransTractor in, om een totaaloplossing te bieden met één configuratiebestand. Raadpleeg \&\fBLocale::Po4a::TransTractor\fR\|(3pm) voor meer details. .SH "Openbronprojecten die po4a gebruiken" .IX Header "Openbronprojecten die po4a gebruiken" Hier volgt een zeer gedeeltelijke lijst met projecten die po4a in productie gebruiken voor hun documentatie. Indien u wenst dat uw project wordt toegevoegd aan de lijst, stuur dan gewoon een e\-mail (of een Merge Request). .IP "\(bu" 4 adduser (man): gereedschap voor het beheer van gebruikers en groepen. .IP "\(bu" 4 apt (man, docbook): pakketbeheerder in Debian. .IP "\(bu" 4 aptitude (docbook, svg): terminalgeoriënteerd pakketbeheerhulpmiddel voor Debian .IP "\(bu" 4 F\-Droid website (markdown): installeerbare catalogus van \s-1FOSS\s0 (Free and Open Source Software \- Vrije en openbronsoftware) toepassingssoftware voor het Android-platform. .IP "\(bu" 4 git (asciidoc): gedistribueerd versiebeheersysteem voor het volgen van wijzigingen in de broncode. .IP "\(bu" 4 Linux man-pagina's (man) .Sp Dit project voorziet in een infrastructuur voor het vertalen van veel man-pagina's naar verschillende talen, klaar om geïntegreerd te worden in verschillende belangrijke distributies (Arch Linux, Debian en derivativen, Fedora). .IP "\(bu" 4 Stellarium (\s-1HTML\s0): een vrij openbronplanetarium voor uw computer. po4a wordt gebruikt om de beschrijving van de lucht en de hemellichamen in verschillende culturen, te vertalen. .SH "FAQ" .IX Header "FAQ" .SS "Hoe spreekt men po4a uit?" .IX Subsection "Hoe spreekt men po4a uit?" Zelf spreek ik het uit als pouah , wat een Franse klanknabootsing is die men gebruikt voor bah :) Misschien heb ik een vreemd gevoel voor humor :) .SS "Hoe zit het met de andere vertaalhulpmiddelen voor documentatie die gebruik maken van gettext?" .IX Subsection "Hoe zit het met de andere vertaalhulpmiddelen voor documentatie die gebruik maken van gettext?" Voor zover ik weet bestaan er zo maar twee: .IP "\fBpoxml\fR" 4 .IX Item "poxml" Dit gereedschap werd ontwikkeld door mensen van \s-1KDE\s0 om DocBook \s-1XML\s0 te verwerken. Voor zover ik weet was dit het eerste programma dat te vertalen tekstfragmenten uit documentatie extraheerde naar PO-bestanden en deze na vertaling terug injecteerde. .Sp Het kan enkel \s-1XML\s0 verwerken, en enkel een specifieke \s-1DTD.\s0 Ik ben erg ongelukkig met de verwerking van lijsten welke terechtkomen in één grote msgid. Wanneer de lijst groot wordt, wordt het stuk moeilijker door te slikken. .IP "\fBpo-debiandoc\fR" 4 .IX Item "po-debiandoc" Dit door Denis Barbier gemaakt programma is een soort voorloper van de SGML-module van po4a, waardoor het min of meer achterhaald werd. Zoals de naam het zegt, verwerkt het enkel de DebianDoc \s-1DTD,\s0 hetgeen min of meer een achterhaalde \s-1DTD\s0 is. .PP De belangrijkste voordelen van po4a tegenover hen zijn het gemak waarmee extra inhoud toegevoegd kan worden (wat bij deze andere hulpmiddelen nog moeilijker is) en de mogelijkheid een gettextize-procedure uit te voeren. .SS "\s-1SAMENVATTING\s0 van de voordelen van een op gettext gebaseerde benadering" .IX Subsection "SAMENVATTING van de voordelen van een op gettext gebaseerde benadering" .IP "\(bu" 2 De vertalingen worden niet samen met het origineel opgeslagen, wat het mogelijk maakt na te gaan of vertalingen verouderd beginnen te raken. .IP "\(bu" 2 De vertalingen worden in aparte bestanden opgeslagen, wat interferentie tussen vertalers van verschillende talen voorkomt, zowel wanneer deze hun patch indienen als bij de keuze van de tekstcodering van de bestanden. .IP "\(bu" 2 Intern is het gebaseerd op \fBgettext\fR (maar \fBpo4a\fR biedt een heel eenvoudige interface, zodat u de interne werking niet moet kennen om het te gebruiken). Op die manier moeten we het wiel niet terug uitvinden, en omdat dit gereedschap zo ruim gebruikt wordt, mogen we aannemen dat het min of meer vrij van fouten is. .IP "\(bu" 2 Voor de eindgebruiker verandert er niets (behalve het feit dat vertalingen hopelijk beter onderhouden zullen worden). Het resulterende documentatiebestand dat verspreid wordt, is exact hetzelfde. .IP "\(bu" 2 Vertalers moeten geen nieuwe bestandsyntaxis leren en hun favoriete editor voor PO-bestanden (zoals de PO-modus in Emacs, Lokalize of Gtranslator) voldoet perfect. .IP "\(bu" 2 gettext biedt een eenvoudige manier om statistieken te bekomen over het gepresteerde werk, over wat nazicht en een update nodig heeft en over wat er nog moet gebeuren. Enkele voorbeelden zijn te vinden op deze adressen: .Sp .Vb 2 \& \- https://docs.kde.org/stable5/en/kdesdk/lokalize/project\-view.html \& \- http://www.debian.org/intl/l10n/ .Ve .PP Maar niet alles is rozengeur en deze aanpak heeft ook enkele nadelen waarmee we moeten omgaan. .IP "\(bu" 2 Addenda zijn… vreemd op het eerste gezicht. .IP "\(bu" 2 Het is niet mogelijk om de vertaalde tekst naar uw smaak aan te passen, zoals hier een paragraaf opsplitsen en er daar twee andere samenvoegen. Maar in zekere zin moet het hoe dan ook als een bug gemeld worden, wanneer er een probleem is met het origineel. .IP "\(bu" 2 Zelfs met een gemakkelijke interface blijft het een nieuw gereedschap dat mensen moeten leren gebruiken. .Sp Een van mijn dromen is om po4a op een of andere manier te integreren in Gtranslator of Lokalize. Wanneer een documentatiebestand geopend wordt, zouden de tekstfragmenten automatisch geëxtraheerd worden en een vertaald bestand + po-bestand zouden naar schijf geschreven worden. Indien we erin zouden slagen een \s-1MS\s0 Word(\s-1TM\s0)\-module te ontwikkelen (of minstens een RTF-module), zouden zelfs professionele vertalers er gebruik van maken. .SH "ZIE OOK" .IX Header "ZIE OOK" .IP "\(bu" 4 De documentatie over het alles\-in\-één gereedschap dat u zou moeten gebruiken: L . .IP "\(bu" 4 De documentatie van de individuele po4a\-scripts: \fBpo4a\-gettextize\fR\|(1), \&\fBpo4a\-updatepo\fR\|(1), \fBpo4a\-translate\fR\|(1), \fBpo4a\-normalize\fR\|(1). .IP "\(bu" 4 De extra ondersteunende scripts: \fBmsguntypot\fR\|(1), \fBpo4a\-display\-man\fR\|(1), \&\fBpo4a\-display\-pod\fR\|(1). .IP "\(bu" 4 De ontleders (parsers) voor elke indeling, in het bijzonder om te zien welke opties voor elke van hen mogelijk zijn: \fBLocale::Po4a::AsciiDoc\fR\|(3pm) \&\fBLocale::Po4a::Dia\fR\|(3pm), \fBLocale::Po4a::Guide\fR\|(3pm), \&\fBLocale::Po4a::Ini\fR\|(3pm), \fBLocale::Po4a::KernelHelp\fR\|(3pm), \&\fBLocale::Po4a::Man\fR\|(3pm), \fBLocale::Po4a::RubyDoc\fR\|(3pm), \&\fBLocale::Po4a::Texinfo\fR\|(3pm), \fBLocale::Po4a::Text\fR\|(3pm), \&\fBLocale::Po4a::Xhtml\fR\|(3pm), \fBLocale::Po4a::Yaml\fR\|(3pm), \&\fBLocale::Po4a::BibTeX\fR\|(3pm), \fBLocale::Po4a::Docbook\fR\|(3pm), \&\fBLocale::Po4a::Halibut\fR\|(3pm), \fBLocale::Po4a::LaTeX\fR\|(3pm), \&\fBLocale::Po4a::Pod\fR\|(3pm), \fBLocale::Po4a::Sgml\fR\|(3pm), \&\fBLocale::Po4a::TeX\fR\|(3pm), \fBLocale::Po4a::Wml\fR\|(3pm), \&\fBLocale::Po4a::Xml\fR\|(3pm). .IP "\(bu" 4 De implementatie van de basisinfrastructuur:: \&\fBLocale::Po4a::TransTractor\fR\|(3pm) (in het bijzonder van belang om de organisatie van de code te begrijpen), \fBLocale::Po4a::Chooser\fR\|(3pm), \&\fBLocale::Po4a::Po\fR\|(3pm), \fBLocale::Po4a::Common\fR\|(3pm). Bekijk ook het bestand \fI\s-1CONTRIBUTING\s0.md\fR in de broncodeboom. .SH "AUTEURS" .IX Header "AUTEURS" .Vb 2 \& Denis Barbier \& Martin Quinson (mquinson#debian.org) .Ve