Doc:Dev/Jazykove preklady
Autor: Juraj Šimlovič
Jazykové preklady má na starosti statická trieda Lang, ktorá slúži predovšetkým ako factory pre potomkov triedy Language implementujúce konkrétne jazyky, napr. angličtinu (LanguageEN) alebo slovenčinu (LanguageSK). Druhou podstatnou časťou jazykových prekladov je trieda Messages, ktorá definuje správy ako číselné konštanty.
Preklad informácie
Trieda Lang ponúka prístup k aktuálne zvolenému jazyku, tj. k vybranému potomkovi triedy Language. Ten obsahuje metódy na preklad dátumu a času (TranslateDate(), TranslateTime(), TranslateMonth(), TranslateAge(), atd.); metódy na preklad názvov krajín (TranslateAllCountries()); a v neposlednej rade metódu na preklad celých správ (TranslateMessage()).
Samotná trieda Lang síce žiaden konkrétny jazyk neovláda, avšak v prípade, že aktuálne zvolený jazyk nejakú informáciu nevie preložiť, pokúsi sa Lang informáciu preložiť aspoň do angličtiny (zavolá si k tomu triedu LanguageEN, ktorá by mala zvládnuť preložiť všetky potrebné informácie).
Preklad správ
Preklad správy zabezpečujú potomkovia triedy Language vďaka jednoznačnému očíslovania. Trieda Messages definuje pre každú správu v systéme unikátne číslo. Každá správa ma okrem svojho významu pridelený i počet a význam jej parametrov. Trieda, ktorá potrebuje nejakú správu preložiť do aktuálneho jazyka jednoducho zavolá Lang::TranslateMessage() s číslom danej správy doplnenými o prípadné parametre. Ako výsledok dostane reťazec v požadovanom (prípadne anglickom) jazyku.
Číslovky, podmienky, linky
I am the Lord thy God. Thou shalt have no other gods before me. |
Pretože jazyky bývajú ohybné (skloňovateľné, časovateľné, a pod.), o skutočnom preklade nerozhoduje generická trieda na základe nejakej look-up tabuľky preložených správ, ale samotný objekt implementujúci daný jazyk. Ten síce používa look-up tabuľku preložených správ, tieto správy však podporujú špeciálnu syntax, ktorá umožňuje ich tvarovanie podľa zadaných parametrov.
Vhodným príkladom je správa o tom, že hromadná akcia, ktorú užívateľ požadoval sa nepodarila. Takáto správa znie napríklad ‘Selected photos (5, 6, 7) could not be deleted.’ V prípade jednej fotky by však bola táto správa gramaticky nesprávne. Systém by mal reagovať spôsobom ‘Selected photo (5) could not be deleted.’
Aby toho bola naša aplikácia schopná, vytvorili sme si vlastnú syntax pre správy, ktorá vyššie uvedenú správu zvládne preložiť v oboch prípadoch správne. V našej syntaxi by sa táto správa zapísala ako ‘Selected photo%p0{|s} (%i0) could not be deleted.’, kde %p0{|s} znamená rozhodnutie podľa počtu prvkov v parametri 0 a %i0 tieto prvky zreťazí pomocou čiarok a prípadne slovíčka and.
Okrem rozhodovania sa o množnom čísle naša syntax správ podporuje tiež rozhodovanie sa na základe pravdy/nepravdy, kladných/záporných hodnôt, zvláda prekladať sub-správy alebo vytvárať XHTML linky na ďalšie stránky podľa potreby. Časť logiky aplikácie sme takto jednoducho preniesli priamo do syntaxe správ. Zaujímavým a vyčerpávajúcim spôsobom je toto využité napríklad na stránke štatistík.
Poznámka: Kompletný popis syntaxe a jej možností sa nachádza v dokumentácií triedy MessagesEN (ktorá zároveň obsahuje i tabuľku všetkých anglických správ).