Два наречја
Увод
Може се рећи да је српски језик понешто необичан, у односу на многе ближе и даље језике, по томе што се, с лингвистичке тачке гледишта, говори у два равноправна наречја и пише са два равноправна писма. То значи да коју год од резултујуће четири усмено-писмене комбинације да користи, одређени говорник може за себе рећи да се служи стандардним српским језиком. Питање је, онда, колико се за једно рачунарско окружење може рећи да је „потпуно преведено на српски“, ако, рецимо, подржава тачно једно наречје и писмо — односно, ако не подржава три четвртине језичког стандарда.
У преводима слободног софтвера на српски, до сада, мало је било проблема са подршком за оба писма. Захваљујући могућности једноставног пресловљавања са ћирилице на латиницу, свако веће тело превода рутински долази на оба писма. Обезбеђивање оба наречја, међутим, показало се повишом пречком, услед два основна проблема. С једне стране, у превођењу учествују махом говорници екавског наречја као матерњег, па су такви и преводи. С друге стране, иако би се превод дао ијекавизовати много брже него што је требало да се преведе на екавски, не би било лако одржавати га, односно пратити током времена измене у изворном материјалу и екавском преводу.
Поменута два проблема доводе до тога да малобројни преводилац-ијекавац, који у данашње време обично одлично познаје и екавски, радије улаже напоре у побољшање тог и таквог екавског превода. Пре него да расипа напоре додатно преводећи на, с техничког гледишта, замало па „још један језик“, од чега овај „претходни“ неће имати никакве користи. Стога, систем за рад на оба наречја који ће бити описан у наредним редовима, тежи да постигне:
- лаку и отпорну на погрешке ијекавизацију чистог екавског текста,
- што лакше одржавање оба наречја превода према променама у извору, и
- у односу на рад само на једном, већи квалитет превода за оба наречја.
Почетна ијекавизација
С обзиром на претходна разматрања, полази се од претпоставке да се оба наречја добијају тако што се текст прво преведе на екавски, па се затим ијекавизује — али, тако да на крају заиста једина разлика између оба текста буде наречје. Ово последње захтева образложење: пошто се ради о темама из рачунарског миљеа, а не о уличном жаргону Београда или Бањалуке, очекује се да један текст исти осим по наречју буде једнако пристао за становнике оба поменута града.
Преведени екавски текст налази се у ПО датотекама, које су обичне текстуалне уз нешто очигледне синтаксе (видети одељак о основној техници). Главна идеја је да се не прави засебан скуп ијекавских ПО датотека, већ да се екавске допуне до хибридних ијекавско-екавских, и потом се као такве и одржавају. У тренуцима када превод треба испоручити уз наступајуће издање софтвера, из хибридних аутоматски се граде крајње екавске и ијекавске ПО датотеке.
Како се ствара хибридни превод? Ради лакшег праћења ко шта ради, узмимо да сарађују два преводиоца: Јово, који је ијекавац, и Ера, екавац. Почнимо од примера чисто екавске ПО датотеке по имену story.po, коју је превео Ера, и три поруке у њој (грешка у преводу прве је намерна):
#: prologue.cpp:10 msgid "A record of the Witch River" msgstr "Белешка о Вештичој реци" #: chapter1.cpp:20 msgid "Activities on the dig" msgstr "Делатности на ископини" #: chapter2.cpp:30 msgid "The discovery" msgstr "Откриће"
Јово се баца на ијекавизовање ових превода. Притом може, и свакако је пожељно, да исправи и уочене недостатке, нпр. да дода недостајуће ј у првој поруци. Превод тако постаје чист ијекавски:
#: prologue.cpp:10 msgid "A record of the Witch River" msgstr "Биљешка о Вјештичјој ријеци" #: chapter1.cpp:20 msgid "Activities on the dig" msgstr "Дјелатности на ископини" #: chapter2.cpp:30 msgid "The discovery" msgstr "Откриће"
Превод се чува у ризници система за управљање верзијама, тако да се почетној екавској датотеци још увек може приступити. Ово користи скрипта pohybdl, која упоређивањем почетне и измењене датотеке ствара хибридни превод, и уграђује га назад у ПО датотеку. Јово је сада извршава и добија:
$ pohybdl svn story.po -------------------- story.po:395(#42) #: prologue.cpp:10 msgid "A record of the Witch River" msgstr "Белешка о {-Вештичој-}{+Вештичјој+} реци" $
Први аргумент, овде svn, задаје подложни систем за управљање верзијама, да би скрипта знала како да се домогне почетне датотеке. Затим следи путања измењене датотеке коју треба хибридизовати. Међутим, story.po после овога неће бити измењена, а излаз говори зашто.
За сваку измењену поруку, pohybdl одстрањује све разлике између почетног и измењеног текста које се могу подвести под ијекавизацију, реконструисавши тако нови екавски текст; ако се почетни и нови екавски текстови разликују, порука се исписује. Ако бар једна порука има овакву разлику, отказује се хибридизација датотеке. Свакој исписаној поруци претходи раздвајач (ниска цртица) и положај поруке, дат путањом датотеке и бројем реда и редним бројем поруке у њој. Затим следи тело поруке, са угњежденим разликама између почетног и новог екавског текста: уклоњени делови текста омотани су у {-...-} а додати делови у {+...+}.
Јово се прегледом овог излаза може уверити да су све промене у екавском преводу намерне, односно да није начинио грешку при ијекавизацији. Пошто се уверио, Јово поново извршава pohybdl уз опцију -a (--accept-changes), чиме се хибридизовани превод уграђује назад у ПО датотеку без обзира на измене у екавском тексту:
$ pohybdl svn story.po -a ! story.po (2) $
У излазу се даје путања измењене датотеке и колико порука у њој је хибридизовано.
Датотека story.po ће после овога садржати:
#: prologue.cpp:10 msgid "A record of the Witch River" msgstr "Б‹иљешка о В›јештичјој р›ијеци" #: chapter1.cpp:20 msgid "Activities on the dig" msgstr "Д›јелатности на ископини" #: chapter2.cpp:30 msgid "The discovery" msgstr "Откриће"
Одавде се види структура хибридног превода. На рефлексу јата у ијекавској речи умеће се значка, један од четири знака ›, ‹, ▹, ◃. Из хибридног превода, чист ијекавски превод аутоматски добија се простим избацивањем значака, а екавски се реконструише пресликавањима ›ије→е, ›је→е, ‹иј→еј, ‹ио→ео, ‹иљ→ел, ‹ље→ле, ‹ње→не, и још понеким ређим (са значкама ▹ и ◃).
Јово на крају предаје хибридизовану ПО датотеку у ризницу, али тако да припише себи да је свим преводима прегледао хибридизацију. Ово ради скрипта poascribe:
$ poascribe reviewed -t hybdl story.po
Обе скрипте, и pohybdl и poascribe, уместо једне ПО датотеке могу примити било који број путања датотека и директоријума. Јово тако може да ијекавизује мноштво малих ПО датотека, па да их онда скупа хибридизује и преда у ризницу.
Поред тога што је остварен превод на оба наречја, описаним поступком постигнуто је и то да екавски превод буде још једном прегледан на очигледне грешке, а да грешке у куцању при ијекавизацији буду на месту уочене и исправљене.
Узајамно одржавање
Хибридизовани превод треба ажурирати како долази до промена и допуна у енглеском извору. Претпоставимо да су измењени изворни текстови прве две поруке из претходних примера, и да је Ера узео да доради превод. Нажалост, Ера је ијекавски слушао само у Чолићевим песмама, а више и не памти да ли је довршио „Дервиша и смрт“ кад га је читао за лектиру. Али га то неће спречити да успешно вршља по хибридизованом преводу.
Пошто се датотека story.po стопи са најновијим енглеским шаблоном (основна техника пружа детаље о овоме), Ера у датотеци види следеће:
#: prologue.cpp:10 #, fuzzy #| msgid "{-A record-}{+Records+} of the Witch River" msgid "Records of the Witch River" msgstr "Б‹иљешка о В›јештичјој р›ијеци" #: chapter1.cpp:20 #, fuzzy #| msgid "{-Activities-}{+Part of activities+} on the dig" msgid "Part of activities on the dig" msgstr "Д›јелатности на ископини"
Коментари са заставицом #, fuzzy указују да је енглески извор измењен. У претходним изворним пољима дато је шта се тачно променило у извору, истим системом угњеждених разлика. Ера на основу овога доправи преводе по екавском наречју, не осврћући се на то што су хибридни. За неке речи му је, наравно, очигледно како их може изменити без уклањања значака и ијекавског. Заставицу #, fuzzy и претходна изворна поља уклони. На крају испадне:
#: prologue.cpp:10 msgid "Records of the Witch River" msgstr "Б‹иљешке о В›јештичјој р›ијеци" #: chapter1.cpp:20 msgid "Part of activities on the dig" msgstr "Део д›јелатности на ископини"
Види се да је после Ериних измена прва порука остала правилно хибридизована, док другој недостаје ијекавски на првој речи. Ера свеједно преда поруке у ризницу, приписавши измене себи:
$ poascribe modified story.po
Недуго потом, наилази Јово да доради хибридизацију превода који је Ера допунио. Главно је да Јово сада не мора да прође кроз сваку поруку, као што је учинио при почетној хибридизацији. Уместо тога, једном наредбом може да обележи тачно оне поруке које су измењене или додате откако је последњи прегледана хибридизације, и да добије разлику од последње прегледане до тренутне верзије поруке:
$ poascribe diff -F sr:reduce/words_ic_lw -s tmodar:::hybdl story.po
Опција -F задаје филтер sr:reduce/words_ic_lw, који из превода уклања све што није написано ћирилицом и претвара сва слова у мала, да би се занемариле промене небитне за ијекавизацију. Опција -s задаје бирач tmodar:::hybdl који налази све поруке чији је превод измењен (под филтером) после последњег прегледа хибридизације. Ово у ПО датотеку угради:
#: prologue.cpp:10 #, ediff msgid "{-A record-}{+Records+} of the Witch River" msgstr "{-Б‹иљешка-}{+Б‹иљешке+} о В›јештичјој р›ијеци" #: chapter1.cpp:20 #, ediff msgid "{-Activities-}{+Part of activities+} on the dig" msgstr "{-Д›јелатности-}{+Део д›јелатности+} на ископини"
Угњежденим разликама представљене су како измене у извору, које Јову нису занимљиве, тако и у преводу. Јово одавде јасно види да је превод прве поруке измењен тачно како треба. У другој поруци види да првој речи у новој верзији превода недостаје ијекавски облик, те га дода:
#: chapter1.cpp:20 #, ediff msgid "{-Activities-}{+Part of activities+} on the dig" msgstr "{-Д›јелатности-}{+Дио д›јелатности+} на ископини"
Јово не треба ручно да уклања угњеждене разлике, а посебно не сме да уклања заставицу ediff. Пошто заврши са доправљањем превода, Јово провуче датотеку кроз хибридизациону скрипту и преда је с приписивањем у ризницу, тачно као после почетне хибридизације:
$ pohybdl svn story.po ... $ pohybdl svn story.po -a # ако треба прихватити измене ... $ poascribe reviewed -t hybdl story.po
Овиме је круг редовног одржавања превода затворен.
Зачкољице и напомене
Претходно изнесени поступак чини главнину посла око израде хибридног превода, али треба поменути и неке повремене додатне захвате, и објаснити позадину неких техничких решења.
Приписивање измена и прегледа
Техничко срце система очигледно је наредба poascribe. Њена основна намена је контрола квалитета превода, праћењем ко је шта мењао и прегледао. Одређене поруке у ПО датотеци одређени преводилац може у неком тренутку изменити или прегледати, што себи приписује поднаредбама modified, reviewed. Поднаредбе у обзир узимају поруке одређене комбинацијом бирача̂ и филтера̂, опције -s ... и -F ... (ако бирач није изричито задат, користи се подразумевани за дату поднаредбу). У било ком тренутку, поднаредбом diff може се добити разлика између тренутне и неке раније верзије поруке, опет изабране комбинацијом бирача и филтера.
Приписивање ради тако што за сваку нормалну ПО датотеку одржава приписну ПО датотеку, која садржи све тренутне и претходне верзије порука, на основу којих се реконструишу затражене разлике. На пример, ако се нормалне (тј. хибридизоване) ПО датотеке налазе у директоријуму translation, приписне могу бити у translation-ascript, тако да цело стабло изгледа овако:
translation/ story.po puzzle.po ... translation-ascript/ story.po puzzle.po ...
Као и сам превод, и приписне ПО датотеке држе се у ризници система за управљање верзијама.
Наредба poascribe део је Пологије, експерименталног пакета за специјалне обраде над ПО датотекама. Може се добавити из субверзијске ризнице КДЕ-а, на адреси svn://anonsvn.kde.org/home/kde/trunk/l10n-support/pology.
Још неке употребе приписивања
Измењене поруке се не могу приписати пре него што се измене предају у ризницу система за управљање верзијама. poascribe ће упозорити кад измене нису предате у ризницу, одбивши да их припише. Зато је потребно или ручно предати измењене ПО датотеке пре примене poascribe, или, боље, наложити poascribe да их сама преда. Томе служи опција -c (--commit) при појединачним позивима, а може се и учинити подразумеваним понашањем кроз глобалну корисничку поставу Пологије (горњи примери претпостављају ово).
Ради праћења измена чак и преко промена у изворном енглеском тексту, као и праћења застаревања и оживљавања порука, после сваког стапања са шаблонима треба приписати измене резервисаном кориснику fuzzy:
$ <стопи-са-шаблонима> $ poascribe modified -u fuzzy ...
Важно: Да би приписивање по стапању имало жељени ефекат, неопходно је да се каталози стапају уз опцију --previous при msgmerge.
Аутоматска ијекавизација
Изложени систем хибридизације планиран је уз претпоставку да на располагању не стоји никакав алат за аутоматску ијекавизацију. Уколико би се такав алат ипак нашао, могао би се глатко укључити у поступак хибридизације. Јово би прво прогурао ПО датотеку кроз ијекавизатор, па тек онда пошао да прегледа поруке. Уз претпоставку да је ијекавизатор иоле пристојан, то би Јову значајно скратило посао.
Даље, ако већ аутоматски ијекавизатор не постоји на почетку, могао би се постепено градити како напредује хибридизација — као што се од хибридизованог превода може аутоматски добити било екавски било ијекавски, тако се могу сакупљати пресликавања екавски→ијекавски (одн. хибридизовани). Аутомат би скупљао сирове парове, а човек би их могао повремено уопштавати; нпр. сирово пресликавање подразумевану→подразум›ијевану, могло би се афиксно уопштити као подразумев-→подразум›ијев-, и сл. Ова би правила потом користила скрипта за аутоматску хибридизацију, на начин описан у претходном пасусу. Дакле, што би хибридизација више напредовала, то би Јово све мање ручно, а све више аутоматски хибридизовали.