| PO4A.7(1) | User Contributed Perl Documentation | PO4A.7(1) |
po4a - радни оквир за превод документације и осталог материјала
po4a (PO for anything [PO за било шта]) олакшава одржавање превода докумената употребом класичних gettext алата. Главна особина po4a је да раскида везу између садржаја превода и структуре његовог документа.
Овај документ служи као увод у po4a који се обраћа потенцијалним корисницима који разматрају да ли да употребе овај алат и радозналима који желе да разумеју зашто су ствари онакве какве су.
Филозофија Слободног Софтвера је да се технологија заиста учини доступном свима. Али лиценцирање није једина брига: непреведени слободни софтвер је бескористан корисницима који не говоре енглески језик. Стога, имамо да одрадимо још посла како би софтвер био доступан свима.
Многи пројекти су добро разумели ову ситуацију и сада су сви убеђени у неопходност превођења свега. Ипак, само превођење представља огроман напор многих појединаца, отежан малим техничким потешкоћама.
На сву срећу, софтвер Отвореног Кода се уствари врло добро преводи употребом gettext свите алата. Они се користе за издвајање стрингова који треба да се преведу и за њихово представљање у стандардизованом формату (који се зове PO фајлови, или каталози превода). Појавио се читав екосистем алата који помажу преводиоцима да заиста преведу ове PO фајлове. gettext у време извршавања користи резултат превођења да крајњим корисницима прикаже преведене поруке.
Што се тиче документације, ситуација је још увек донекле разочаравајућа. На први поглед превођење документације може да изгледа лакше него превођење програма, јер се чини да је само потребно да ископирате изворни фајл документације и почнете да преводите садржај. Међутим, када се оригинална документација измени, праћење промена се брзо претвара у ноћну мору за преводиоце. Ако се ради ручно, овај задатак је непријатан и склон грешкама.
Застарели преводи су често гори од ситуације када уопште нема превода. Крајњи корисницу могу да буду заварани документацијом која описује старо понашање програма. Уз то, они не могу да имају директну интеракцију са одржаваоцима јер не говоре енглески језик. А одржаваоци такође не могу да поправе проблем јер не знају сваки језик на који је њихова документација преведена. Ове потешкоће, које су често последица лошег избора алата, могу да поткопају мотивацију преводиоца волонтера, чиме се проблем додатно погоршава.
Циљ po4a пројекта је да олакша рад преводиоцима документације. Тачније, он омогућава одржавање превода документације.
Идеја је да се искористи и прилагоди gettext приступ овом пољу. Као са gettext, текстови се издвајају из својих оригиналних локација и представљају преводиоцима као PO каталози превода. Преводиоци могу да искористе класичне gettext алате да прате рад који треба да се уради, сарађују и да се организују у тимове. po4a затим умеће преводе директно у структуру документације и тако прави преведене изворне фајлове који могу да се обраде и дистрибуирају на исти начин као и енглески фајлови. Сваки пасус који није преведен остаје на енглеском у излазном документу, па се на тај начин обезбеђује да крајњи корисници никада не виде застарели превод у документацији.
Ово аутоматизује већину незгодног посла у одржавању превода. Откривање пасуса које је потребно освежити постаје веома једноставно и процес је потпуно аутоматизован када је редослед елемента преуређен без даљих измена. Такође може да се користи и одређена верификација како би се умањила могућност грешака форматирања због којих би се документ искварио.
Молимо да такође погледате и ЧПП ниже у овом документу да бисте видели комплетнију листу добрих и лоших страна овог приступа.
Тренутно је овај приступ успешно имплементиран на неколико врста формата за форматирање текста:
Модул Locale::Po4a::Man(3pm) такође подржава и mdoc формат који користе BSD man стране (оне су такође прилично уобичајене и на Linux системима).
За још детаља, погледајте Locale::Po4a::AsciiDoc.
За више детаља, погледајте Locale::Po4a::Pod.
Тренутно су подржани само DebianDoc и DocBook DTD описи, али додавање подршке за неки нови је заиста једноставно. Чак је могуће да се употреби po4a на непознатом SGML DTD без измене кода достављајући неопходне информације преко командне линије. Погледајте Locale::Po4a::Sgml(3pm) за више детаља.
Модул Locale::Po4a::LaTeX(3pm) је тестиран са Python документацијом, књигом и неким презентацијама.
Ово подржава уобичајене формате који се користе за Генераторе Статичког Сајта, ПРОЧИТАЈМЕ, и остале системе документације. Погледајте Locale::Po4a::Text(3pm) за више детаља.
po4a тренутно подржава DocBook DTD (погледајте Locale::Po4a::Docbook(3pm) за више детаља) и XHTML.
За више детаља, погледајте Locale::Po4a::BibTex.
За више детаља, погледајте Locale::Po4a:Docbook.
За више детаља, погледајте Locale::Po4a:Guide.
За више детаља, погледајте <Locale::Po4a::Wml>.
За више детаља, погледајте Locale::Po4a::Yaml.
За више детаља, погледајте Locale::Po4a::RubyDoc.
За више детаља, погледајте Locale::Po4a:Halibut.
За више детаља, погледајте Locale::Po4a::Ini.
Најједноставнији начин да овај алат употребите у свом пројекту је да напишете конфигурациони фајл за po4a програм и да онда имате интеракцију само за овим програмом. Молимо вас да прочитате његову документацију, налази се у po4a(1). Остатак овог одељка наводи више детаља битних напредним корисницима програма po4a који желе да продубе своје разумевање.
Обавезно најпре прочитајте po4a(1) пре овог врло детаљног одељка да бисте имали упрошћени преглед процеса рада са програмом po4a. Вратите се овде када желите да погледате застрашујућу комплетну слику, са скоро свим детаљима.
На схеми која следи даје мастер.doc име дато као пример документације која треба да се преведе; XX.doc је тај исти документ преведен на језик XX док је doc.XX.po каталог превода за тај документ на језику XX. Аутори документације ће углавном да се баве са мастер.doc (што може да буде manстрана, XML документ, AsciiDoc фајл, итд.); преводиоци ће углавном да се фокусирају на PO фајл, док ће крајњи корисници да виде само фајл XX.doc.
Прелази са угластим заградама као што је "[po4a ажурира po]" представљају извршавање po4a алата, док прелази са витичастим заградама као што је "{ажурирање мастер.doc}" представљају ручну измену фајлова пројекта.
мастер.doc
|
V
+<-----<----+<-----<-----<--------+------->-------->-------+
: | | :
{превођење} | {ажурирање мастер.doc} :
: | | :
XX.doc | V V
(опционално) | мастер.doc ->-------->------>+
: | (нови) |
V V | |
[po4a-gettextize] doc.XX.po -->+ | |
| (стари) | | |
| ^ V V |
| | [po4a ажурира po] |
V | | V
превод.pot ^ V |
| | doc.XX.po |
| | (fuzzy) |
{превођење} | | |
| ^ V V
| | {ручно уређивање} |
| | | |
V | V V
doc.XX.po --->---->+<---<-- doc.XX.po додатак мастер.doc
(иницијални) (ажуриран) (опционално) (ажуриран)
: | | |
: V | |
+----->----->----->------> + | |
| | |
V V V
+------>-----+------<------+
|
V
[po4a ажурира преводе]
|
V
XX.doc
(ажуриран)
Да поновимо, ова схема је веома компликована. Погледајте po4a(1) да видите упрошћени преглед.
Леви део приказује како po4a-gettextize(1) може да се употреби за конверзију постојећег пројекта превода у po4a инфраструктуру. Ова скрипта узима оригинални документ и његов документ његовог превода, па покушава да изгради одговарајући PO фајл. Таква ручна конверзија је прилично незграпна (за више детаља, погледајте po4a-gettextize(1) документацију), али је неопходно да се обави само једном како би се конвертовали ваши постојећи преводи. Ако немате никакве преводе за конверзију, можете да заборавите на све ово и да се фокусирате на десни део схеме.
У врху десног дела је приказана акција оригиналног аутора, освежавање документације. Средњи десни део приказује аутоматска ажурирања фајлова превода: нови материјал се издваја и пореди са постојећим преводом. За делове који се нису изменили користиће се претходни превод, док се делимично измењени делови повезују са претходним преводом помоћу „fuzzy” ознаке која означава да превод мора да се ажурира. Нови или доста измењени материјал се оставља непреведен.
Затим, ручно уређивање означава радњу преводилаца,који мењају PO фајлове како би обезбедили преводе за сваки оригинални стринг и пасус. Ово може да се обави било употребом специјализованог едитора као што је GNOME Translation Editor, KDE-ов Lokalize или poedit, било употребом платформе за локализацију на мрежи као што је weblate или pootle. Резултат превода је скуп PO фајлова, по један за сваки језик. За више детаља, молимо вас погледајте gettext документацију.
Доњи део слике приказује како po4a креира преведени изворни документ из мастер.doc оригиналног документа и doc.XX.po каталога превода који су преводиоци ажурирали. Поново се искоришћава структура документа, док се оригинални садржај замењује својим одговарајућим преводом. Необавезно, може да се употреби додатак како би се превод допунио неким додатним текстом. Ово се често користи да се дода име преводиоца финалном документу. Погледајте ниже за још детаља.
Када се покрене, po4a аутоматски ажурира и фајлове превода и преведене фајлове документације.
Ако почињете од нуле, потребно је само да напишете конфигурациони фајл за po4a и спремни сте. За фајлове који недостају се аутоматски креирају одговарајући шаблони, тако да сарадници могу почети да преводе ваш пројекат на свој језик. Молимо вас да погледате po4a(1). Тамо се налази туторијал за брзи почетак, као и сви детаљи.
Ако имате постојећи превод, нпр, фајл документације који је ручно преведен, алатом po4a-gettextize његов садржај можете да интегришете у po4a процес рада. Овај задатак је донекле напоран (као што је описано у man страници алата), али једном када се ваш пројекат конвертује у po4a процес рада, све ће се ажурирати аутоматски.
Једном када се подеси, покретање po4a је довољно да се ажурирају и PO фајлови за превођење и преведени документи. Програму po4a можете да проследите "--no-translations" ако не желите да се ажурирају преводи (односно да се ажурирају само PO фајлови) или "--no-update" ако не желите да се ажурирају PO фајлови (односно да се ажурирају само преводи). Ово отприлике одговара појединачним po4a-updatepo и po4a-translate скриптама које су сада застареле (погледајте „Зашто су појединачне скрипте застареле” у ЧПП испод).
Додавање новог текста преводу је вероватно једина ствар која је једноставнија на дуже стазе у случају када фајлове преводите ручно :). Ове се дешава када желите да додате допунски одељак преведеном документу, који не одговара никаквом садржају оригиналног документа. Класични случај употребе је за одавање признања преводилачком тиму, као и да се наведе начин за пријаву проблема који се тичу превода.
Са po4a, морате да наведете додатак фајлове, на које концептуално може да се гледа као на закрпе које се примењују над локализованим документом након обраде. Сваки додатак мора да се достави као посебан фајл, чији формат је међутим, веома различит у односу на класичне закрпе. Прва линија је линија заглавља, која дефинише тачку уметања додатка (нажалост са криптичном синтаксом -- погледајте ниже) док се остатак фајла умеће дословно на одређену позицију.
Линија заглавља мора да почне са стрингом PO4A-HEADER:, након чега следи листа кључ=вредност поља раздвојених са тачка запета знацима.
На пример, следеће заглавље декларише додатак који мора да се постави на сам крај превода.
PO4A-HEADER: mode=eof
Ствари постају компликованије када додатни садржај желите да поставите у средину документа. Наредно заглавље декларише додатак који у превод мора да се постави након XML одељка који садржи стринг "У вези овог документа".
PO4A-HEADER: position=У вези овог документа; mode=after; endboundary=</section>
У пракси, када покушава да примени додатак, програм po4a тражи прву линију која задовољава "position" аргумент (то може да буде регизраз). Не заборавите да po4a овде разматра преведени документ. Ова документација је на српском језику, али ваша линија би вероватно требало да изгледа као што следи, у случају да намеравате да свој додатак уметнете у француски превод.
PO4A-HEADER: position=À propos de ce document; mode=after; endboundary=</section>
Онда када се у циљном документу пронађе "position", програм po4a тражи следећу линију након "position" која се подудара са наведеним "endboundary". Додатак се умеће непосредно иза те линије (јер смо задали endboundary, тј. границу на којој се завршава текући одељак).
Потпуно исти ефекат би могао да се добије следећим еквивалентним заглављем:
PO4A-HEADER: position=У вези овог документа; mode=after; beginboundary=<section>
Овде програм po4a тражи у преводу прву линију која се подудара са "<section>" након линије која се подудара са "У вези овог документа", и умеће додатак испред те линије, јер смо задали beginboundary, тј. границу која означава почетак наредног одељка. Тако да ова линија заглавља захтева да се додатак постави иза одељка који садржи "У вези овог документа", и обавештава програм po4a да одељак започиње линијом која садржи ознаку "<section>". Ово је еквивалентно са претходним примером јер, у суштини, оно што заиста желите је да уметнете овај додатак иза "</section>" или испред "<section>".
Можете такође да поставите режим уметања mode на вредност "before", са сличном семантиком: комбиновање "mode=before" са "endboundary" ће да постави додатак непосредно иза пронађене границе, то јест последње потенцијалне граничне линије испред "position". Комбиновање "mode=before" са "beginboundary" ће да постави додатак непосредно испред пронађене границе, то јест последње потенцијалне граничне линије испред "position".
Режим | Врста границе | Употребљена граница | Место уметања гледано у односу на границу ========|===============|=============================|=========================================== 'before'| 'endboundary' | последња испред 'position' | Непосредно иза изабране границе 'before'|'beginboundary'| последња испред 'position' | Непосредно испред изабране границе 'after' | 'endboundary' | прва иза 'position' | Непосредно иза изабране границе 'after' |'beginboundary'| прва иза 'position' | Непосредно испред изабране границе 'eof' | (ништа) | нема | Крај фајла
Савети и трикови у вези додатака
PO4A-HEADER: position=У вези овог документа; mode=after; beginboundary=<section>
PO4A-HEADER: position=У вези овог документа ; mode=after; beginboundary=<section>
Примери додатака
.SH "AUTHORS"
Требало би да изаберете приступ у два корака постављањем mode=after. Затим би требало да сузите претрагу на линију након AUTHORS регуларним изразом за аргумент position. Затим би требало да пронађете почетак наредног одељка (нпр. ^\.SH) помоћу регуларног израза за аргумент beginboundary. Дакле:
PO4A-HEADER:mode=after;position=AUTHORS;beginboundary=\.SH
PO4A-HEADER:mode=after;position=Права умножавања Велики Даса, 2004;beginboundary=^
PO4A-HEADER:mode=after;position=У вези овог документа;beginboundary=ЛажнаPo4aГраница
Детаљнији пример
Оригинални документ (POD форматиран):
|=head1 NAME | |dummy - a dummy program | |=head1 AUTHOR | |me
Затим, следећи додатак ће обезбедити да се одељак (на француском) у вези преводиоца дода на крај фајла (на француском "TRADUCTEUR" значи "TRANSLATOR", а "moi" значи "me").
|PO4A-HEADER:mode=after;position=AUTEUR;beginboundary=^=head | |=head1 TRADUCTEUR | |moi |
Да бисте уметнули свој додатак испред AUTHOR, употребите следеће заглавље:
PO4A-HEADER:mode=after;position=NOM;beginboundary=^=head1
Ово функционише јер је наредна линија која се подудара са beginboundary "/^=head1/" иза одељка "NAME" (преведено на "NOM" у француском), она која наводи ауторе. Дакле, додатак ће да се постави између ова два одељка. Приметите да ако се касније дода још један одељак између NAME и AUTHOR одељака, програм po4a ће погрешно да постави додатак испред тог новог одељка.
Да бисте ово спречили, исти резултат можете да постигнете употребом mode=before:
PO4A-HEADER:mode=before;position=^=head1 AUTEUR
Ово поглавље ће да вам представи кратак преглед унутрашњих процеса у програму po4a, тако да нам можете са више самопоуздања помоћи да га одржавамо и унапређујемо. Такође може да вам помогне да разумете зашто не ради нешто што очекујете, као и да вам представи начине за решавање ваших проблема у раду са програмом.
У језгру po4a пројекта, класа Locale::Po4a::TransTractor(3pm) је заједнички предак за све po4a парсере. Ово чудно име је последица чињенице да је она у исто време задужена и за превођење документа и за издвајање стрингова.
Формалније речено, она узима документ који треба да се преведе као и PO фајл који садржи преводе који треба да се користе као улаз, а генерише два одвојена излаза: други PO фајл (произашао као резултат издвајања преводивих стрингова из улазног документа), и преведени документ (са истом структуром као и улазни документ, али са свим преводивим стринговима замењеним садржајем улазног PO). Ево графичке представе овога:
Улазни документ --\ /---> Излазни документ
\ TransTractor:: / (преведен)
+-->-- parse() --------+
/ \
Улазни PO --------/ \---> Излазни PO
(издвојен)
Ова мала кост је срж целе po4a архитектуре. Ако наведете оба улаза и одбаците излазни PO, добијате po4a-translate. Ако уместо тода одбаците излазни документ, добијате po4a-updatepo. Програм po4a користи први TransTractor да добије ажурирани POT фајл (одбацујући излазне документе), затим позива msgmerge -U да ажурира PO фајлове превода на диску и изграђује други TransTractor са овим ажурираним PO фајловима да би ажурирао излазне документе. Укратко, po4a обезбеђује решење које у једном кораку ажурира све што је потребно, уз употребу само једног конфигурационог фајла.
po4a-gettextize такође користи два TransTractor-а, али на другачији начин: он изграђује по један TransTractor за сваки језик, па онда изграђује нови PO фајл чији су msgid стрингови msgid стрингови оригиналног документа, а msgstr стрингови msgid стрингови преведеног документа. Да би се обезбеило да се стрингови подударени на овакав начин и заиста подударају, потребно је много труда, као што је описано у po4a-gettextize(1).
Сви po4a парсери формата се имплементирају преко TransTractor. Неки од њих су врло једноставни, као што су Text, Markdown и AsciiDoc. Они читају једну по једну линију користећи TransTractor::shiftline(), акумулирају садржаје пасуса или шта већ. Онда када се стринг у потпуности парсира, парсер користи TransTractor::translate() да (1) уметне овај стринг у излазни PO фајл и (2) преузме превод из улазног PO фајла. Парсер затим гура резултат у излазни фајл користећи TransTractor::pushline().
Неки други парсеру су сложенији јер се за анализу улазног документа ослањају на спољни парсер. Xml, HTML, SGML и Pod парсери су изграђени преко SAX парсера. Они декларишу функције повратног позива на догађаје као што је „Пронашао сам нови наслов чији је садржај следеће” којима ажурирају излазни документ и излазне POT фајлове у сагласности са садржајем на улазу користећи TransTractor::translate() и TransTractor::pushline(). Yaml парсер је сличан, али ипак различит: он серијализује структуру података коју прави YAML::Tiny парсер. То је разлог што Yaml модул програма po4a не успева да декларише линије референци: парсер не чува локацију сваког стринга у улазном фајлу, тако да једино можемо навести „$filename:1” као стринг локације. Парсери засновани на SAX користе глобале и остале трикове за чување референци на имена фајлова и бројеве линија.
Један посебан проблем настаје услед кодирања фајла и BOM маркера. Прости парсеру могу да забораве на проблем, то се обрађује у TransTractor::read() (користи се интерно за читање линија улазног документа), али модули који се ослањају на спољни парсер морају обезбедити да се сви фајлови читају одговарајућим PerlIO слојем за декодирање. Најједноставнији начин је да сами отворите фајл, па да свом спољном парсеру проследите ручку фајла, или директно комплетни стринг. Погледајте Pod::read() и Pod::parse() на пример. Садржај који чита TransTractor се игнорише, али се спољном парсеру прослеђује свежа ручка фајла. Важан део је "<:encoding($charset)" режим који се прослеђује open() perl функцији.
Класа Locale::Po4a::Po(3pm) је задужена за учитавање и употребу PO и POT фајлова. Тачније, можете да читате фајл, додајете ставке, преузимате преводи gettext() методом, уписујете PO у фајл. Напредније функције као што је спајање PO фајла у односу на POT фајл или потврђивање фајла се делегирају програмима msgmerge и msgfmt редом.
Чак и ако никада раније нисте дали допринос ниједном пројекту Отвореног кода, добродошли: вољни смо да вам помогнемо и да овде будемо ваш ментор. Данас po4a најбоље одржавају његови корисници. Пошто нам недостаје радне снаге, покушавамо да пројекат учинимо приступачнијим тако што унапређујемо документацију и аутоматске тестове тако да осетите поузданост приликом давања доприноса пројекту. За више детаља, молимо вас да погледате CONTRIBUTING.md фајл.
Следи веома делимична листа пројеката који за своју документацију у продукцији користе po4a. Ако свој пројекат желите да додате на ову листу, само нам пошаљите мејл (или Merge захтев).
Овај пројекат обезбеђује инфраструктуру за превођење многих manстраница на различите језике, спремне за интеграцију у неколико главних дистрибуција (Arch Linux, Debian и из њега изведене, Fedora).
Ја га лично изговарам као pouah <https://en.wiktionary.org/wiki/pouah>, што је француска ономатопејска реч коју користимо уместо бљак :) Вероватно имам чудан смисао за хумор :)
Заиста, po4a-updatepo и po4a-translate су застареле, сада се користи само po4a. Разлог је тај што po4a може да се користи као директна замена за ове скритпте, тако да постоји много дуплираног кода. Појединачне скрипте имају око 150 линија кода док програм po4a има 1200 линија, тако да раде много тога додатно, а не само опште интерне ствари. Резултат дуплирања кода су багови који се јављају у ове верзије и за које је потребна исправка на два места. Један пример таквог дупликата су багови #1022216 у Дебијану и проблем #442 на GitHub који су имали потпуно исту исправку, али једну у po4a а другу у po4a-updatepo.
На дуже стазе, желео бих да укинем појединачне скрипте и да одржавам само једну верзију овог кода. Оно што је сигурно је то да се појединачне скрипте више неће унепређивати, тако да ће само po4a добијати нове функционалности. С друге стране, нема хитности око застаревања. Планирам да појединачне скрипте чувам што је могуће дуже, барем до 2030. године. Ако ваш пројекат у 2030. још увек користи po4a-updatepo и po4a-translate можда ћете наићи на проблем.
Можда у неком тренутки и укинемо застаревање ових скрипти, ако рефакторисање сведе диплирање кода на нулу. Ако имате идеју (или још боље: закрпу), ваша помоћ је добродошла.
Има их неколико. Ево вероватно непотпуне листе, са још алата који су близу хоризонта.
Он може да ради само са XML форматом, и само са одређеним DTD. Посебно нисам задовољан начином на који обрађује листе, које на крају постају један велики msgid. Када листа постане велика, залогај постаје тежак за гутање.
Главне предности програма po4a над њима је једноставност уметања додатног садржаја (која је тамо још гора) и могућност постизања gettextизације.
- https://docs.kde.org/stable5/en/kdesdk/lokalize/project-view.html
- http://www.debian.org/intl/l10n/
Али није све тако сјајно, овај приступ има и неке лоше стране са којима морамо да се носимо.
Један од мојих снова би био да некако интегришемо po4a у Gtranslator или Lokalize. Када се фајл документације отвори, стрингови се аутоматски издвоје, и преведени фајл + po фајл могу да се упишу на диск. Ако успемо да урадимо MS Word (TM) модул (или макар RTF) можда би га чак користили и професионални преводиоци.
Дени Барбије <barbier,linuxfr.org> Мартин Квинсон (mquinson#debian.org)
| 2024-08-06 | perl v5.38.2 |