Podpora gramatických javov v lokalizačných formátoch

Tvorba gramaticky správnych a zrozumiteľných prekladov textu v programe do rôznych jazykov nie je jednoduchá záležitosť. Rôzne jazyky majú svoje špecifiká a lokalizačný formát na ne musí byť pripravený. Vezmime si napríklad vetu v angličtine ako typickom zdrojovom jazyku „12 characters in the second row were deleted“ a jej prirodzený preklad do slovenčiny „V druhom riadku bolo odstránených 12 znakov“. Na tejto vete si môžeme všimnúť niekoľko špecifík. Prvým je, že čísla sa budú meniť podľa situácie, budeme ich teda nazývať parametrami. Druhým je zmenené poradie týchto parametrov, t.j. hodnoty „12“ a „second“ sú v preklade v opačnom poradí – „druhý“ a „12“. Tretím je zhoda číslovky a nominálnej frázy, v našom prípade to, že tvar slova „character“ v zdrojovom jazyku a slova „znak“ v cieľovom jazyku sa mení podľa hodnoty parametra (v príklade má hodnotu 12, zodpovedajúce tvary sú „characters“„znaky“). V tomto článku vysvetlíme, ako rôzne lokalizačné formáty umožňujú tieto špecifiká správne vyjadriť vo viacerých cieľových jazykoch. Priblížime si najpoužívanejšie formáty gettext a Java properties, ďalej XLIFF, ktorý je štandardom OASIS a v prípadoch, kde tieto formáty majú nedostatky uvedieme ako príklad formát MediaWiki. V rámci týchto formátov často existuje viacero spôsobov ako zapísať rovnaký jav, preto v tomto prehľadovom článku uvedieme len jeden typický spôsob.

Parametre

Program je postupnosť inštrukcií, ktorá daný vstup transformuje na výstup. Výstupom je typicky text vo forme statických šablón, do ktorých sa na určené miesto dosadzujú výstupné hodnoty. Toto miesto nazývame parametrom. Tieto šablóny je následne možné prekladať. Prekladateľ musí byť schopný zmeniť polohu parametra vo vete, aby vyjadril prirodzenú vetu v cieľovom jazyku. Parametre je možné rozlíšiť podľa typu informácie, ktorú nesú. Rozlišujú sa minimálne textové a číselné hodnoty, pričom číselné hodnoty môžu mať tiež množstvo typov (napr. prirodzené a desatinné čísla) v závislosti na ich reprezentácii v konkrétnom programovacom jazyku. Takéto rozlíšenie okrem iného informuje prekladateľa o type hodnoty, ktorú na danom mieste má očakávať. Konkrétna hodnota bude do šablóny doplnená až v čase zobrazenia šablóny. Jednoduchšie bude ukázať si to na našom príklade v niekoľkých formátoch tak, ako šablónu uvidí prekladateľ:

[gettext c-format]		%d characters in the %s row were deleted
[XLIFF]				<x id="1"/> characters in the <x id="2"/> row were deleted
[Java properties]		{0} characters in the {1} row were deleted
[MediaWiki]			$1 characters in the $2 row were deleted

V tomto zápise predpokladáme, že program druhý parameter nahradí za preložený reťazec v zodpovedajúcom tvare ( „druhý“). Poradové číslovky ( „first“, „second“ atď.) tu teda sú samostatné reťazce na preklad.

Zmena poradia parametrov

V hore uvedenom príklade vidíme, že náš prirodzený preklad do slovenčiny nezodpovedá poradiu týchto parametrov – v angličtine je prvý parameter počet znakov a druhý počet riadkov, pričom v slovenskom preklade by sme ich poradie potrebovali vymeniť. Všetky tu uvedené lokalizačné formáty podporujú zmenu poradia parametrov. Konkrétnu syntax opäť najlepšie uvidíme na príklade:

[gettext c-format]		V %2$s riadku bolo odstránených %1$d znakov
[XLIFF]				V <x id="2"/> riadku bolo odstránených <x id="1"/> znakov
[Java properties]		V {1} riadku bolo odstránených {0} znakov
[MediaWiki]			V $2 riadku bolo odstránených $1 znakov

Tvary množného čísla

Pretože hodnoty parametrov pri tvorbe šablóny a preklade nepoznáme, musíme počítať jednak s prípadom, že ovplyvnia príslušné podstatné meno, konkrétne či bude v singulári alebo pluráli. Ponúka sa jednoduché riešenie – ponúknuť na preklad dva reťazce – jeden v singulári a druhý v pluráli. Toto riešenie je však nedostatočné - dva tvary v skutočnosti nestačia, ako vidieť na príklade slovenčiny: 1 zmena, 3 zmeny, 6 zmien. V slovenčine napočítame 3 rôzne tvary a môžeme formulovať nasledovné pravidlo:

hodnota parametra tvar slova
1 zmena
2, 3, 4 zmeny
0, 5 a viac zmien

Podobné pravidlá majú iné jazyky a prevažne majú práve 3 tvary s rôznymi pravidlami. Preto aj lokalizačný formát musí toto vziať do úvahy a ponúknuť syntax, ktorá umožní všetky tvary vyjadriť. Tiež musí byť definované, ktorý jazyk používa ktoré pravidlo, alebo toto pravidlo musí byť v preklade explicitne uvedené a strojovo spracovateľné. V praxi teda vyzerá syntax prekladových súborov takto:

[gettext c-format]	
msgid "%d change"
msgid_plural "%d changes"
msgstr[0] "%d zmien"
msgstr[1] "%d zmena"
msgstr[2] "%d zmeny"
[XLIFF]
<group id="some.label" restype="x-gettext-plurals">
        <trans-unit id="change.label[0]">
                <source>{0} changes</source>
                <target>{0} zmien</target>
        </trans-unit>
        <trans-unit id="change.label[1]">
                <source>{0} change</source>
                <target>{0} zmiena</target>
        </trans-unit>
        <trans-unit id="change.label[2]">
                <source>{0} changes</source>
                <target>{0} zmeny</target>
        </trans-unit>
</group>
[Java properties]		{0,number} {0,choice,0#zmien|1#zmena|1<zmeny|4<zmien} 
[MediaWiki]			$1 {{PLURAL:$1|zmena|zmeny|zmien}}

Skloňovanie

Môže nastať situácia, že máme množinu slov, ktoré sa často používajú ako hodnoty parametrov. V jazykoch s väčším počtom pádov však nemôžeme jednoducho vložiť hodnotu parametra. Hodnota parametra sa musí dodržať pád, ktorý diktuje kontext vety – ten sa však nachádza v šablóne. Môžeme teda pre každý jazyk definovať jeho pády, pád uviesť v šablóne strojovo spracovateľným spôsobom a definovať hodnoty parametra v každom páde. To umožní odložiť výber správneho pádu až na čas výpisu reťazca, kedy je známe, aká hodnota parametra sa použije.

Väčšina lokalizačných formátov však túto syntax nepodporuje. Podporuje ju však MediaWiki:

[MediaWiki]		        Tu sa dozviete informácie o {{GRAMMAR:lokál|$1}}.

Podobne ako v predchádzajúcom prípade skloňovania, pri parametri nie je v čase prekladu známy ani rod parametra. Pre každý parameter ale môžeme definovať text, ktorý sa použije pri každom rode. Pokiaľ pre každú hodnotu parametra definujeme aj jej rod, výber správneho rodu môžeme opäť odložiť až do doby výpisu.

Aj táto syntax je podporovaná z uvedených formátov len v MediaWiki:

[MediaWiki]			$1 {{GENDER:$1|bol vložený|bola vložená|bolo vložené}}?

Záver

Každý lokalizačný formát podporuje nahradenie zdrojového textu za jeho ekvivalent v cieľovom jazyku. Ako sme si však ukázali, nestačí to na vytvorenie správneho, prirodzene znejúceho prekladu. Na rozdiel od statických dokumentov je špecifikom lokalizácie programov to, že hodnoty nie sú známe v čase prekladu, až v čase výpisu. Tieto neznáme však majú svoje gramatické kategórie a ovplyvňujú svoje bezprostredné okolie, ktoré sa nachádza v šablóne. Preto prekladateľ musí počítať so všetkými možnosťami a v šablóne ich uviesť, aby program počas výpisu dokázal automaticky zvoliť gramaticky správnu možnosť.

Podpora týchto gramatických javov musí byť zachytená aj v syntaxi lokalizačného formátu a ako sme si ukázali, nie všetky formáty podporujú všetky javy. Preto je na to potrebné myslieť už pri voľbe lokalizačného formátu, ktorý softvér bude na lokalizáciu používať. Ani jeden z formátov spomínaných v tomto článku nie je zlou voľbou, no pokiaľ chcete zvoliť iný formát ako tu uvedený, uistite sa, že podporuje tu uvedené gramatické javy. Formát MediaWiki nie je veľmi rozšírený, no ilustrujeme na ňom to, že existujú ďalšie gramatické javy, ktoré bežné lokalizačné formáty nepodporujú. Záleží už na konkrétnej situácii, či je vhodné ich v konkrétnom programe využiť.