Překladač

Vedle práce s lokalizacemi musí mít Jet pochopitelně i mechanismus pro překládání textů. Přesněji řečeno pro sběr textů, jejich umisťování do slovníků a přípravě k následnému překladu do cílového jazyka, přesněji cílové lokalizace.

Ukažme si rovnou praktické použití:

$error Tr::_
    
'Something went wrong: %error%'
    [
        
'error' => $e->getMessage()
    ],
    
Tr::COMMON_DICTIONARY 
);

A rovnou si řekněme, že třída Jet\Tr je potomkem třídy Jet\Translator a metoda _ volá metodu getTranslation. Ovšem to by pak bylo nutné ve kódu používat toto:

echo Translator::getTranslation('Hello world!');

Takto můžete překladač používat také, ale přece jen je to až moc upovídané. Tedy ve zdrojovém kódu ukázkové aplikace najdete spíš toto:

echo Tr::_('Hello world!');

Překladač a lokalizace

Překlad musí samozřejmě být navázán na určitou lokalizaci. Ovšem překladač nespoléhá na nastavení lokalizace v rámci třídy Jet\Locale, ale drží si vlastní nastavení aktuální lokalizace. Proč tomu tak je? Teoreticky může nastat situace, kdy různé údaje (čísla, datumy a podobně) bude potřeba formátovat podle jiných pravidel - jiné lokalizace než podle té, která bude relevantní pro překladač. Patrně se nebude jednat o běžnou situaci, ale je nutné, aby taková situace byla řešitelná.

Z toho důvodu má třída Jet\Translator má metody setCurrentLocale a getCurrentLocale.

Pokud je aplikace postavená na Jet MVC, pak router nastavuje lokalizaci překladače automaticky dle zjištěné báze.

Slovníky překladače

Všechny překlady celé aplikace pochopitelně nemohou být na jedné hromadě (pokud se nejedná o mikroaplikaci). Překlady jsou standardně rozdělené do slovníků.

Krom toho že je slovník samozřejmě vázán na lokalizaci, pak má své jméno.

Se jménem aktuálního slovníku lze operovat metodami setCurrentDictionary a getCurrentDictionary třídy Jet\Translator.

Krom toho je možné použít název slovníku jako nepovinný parametr $dictionary metod getTranslation a _. Díky tomu je možné provést dílčí překlad pomocí určitého slovníku bez ohledu na aktuální nastavený slovník.

Třída Jet\Translator obsahuje konstantu COMMON_DICTIONARY. Tato konstanta má představovat jméno obecného slovníku. Obecný slovník je slovník, který má obsahovat obecné fráze ("Ano", "Ne", "Uložit", a tak dále), které budou společné pro všechny slovníky a naopak by bylo kontraproduktivní takové stále se opakující a stejné fráze umisťovat do různých slovníků.

To jak je realizováno ukládání slovníků je věcí backendu, konrétně výchozího backendu, pokud si nevyvinete vlastní backend.

Slovník samotný je reprezentován třídamy Jet\Translator_Dictionary a Jet\Translator_Dictionary_Phrase.

Aplikace postavená na Jet MVC se chová tak, že při obsluze obsahu, který poskytuje určitý aplikační modul je automaticky nastaven název slovníku na stejnou hodnotu jako je název aktuálního aplikačního modulu.

Přidávání frází do slovínků

Když se seznámíte s tím, jak backend ukládá slovníky, pak do slovníků pochopitelně můžete (a máte) ručně zasahovat. Doplňovat fráze, či mazat již nepoužívaná a hlavně tvořit překlady.

Ovšem ono přidávání frází během vývoje by byla pěkně otravná práce. Proto systém funguje tak, že nově nalezené fráze automaticky přidává do relevantních slovníků. Tedy ve zdrojovém kódu vaší aplikace použijete novou frázi a ta je automaticky přidána - samozřejmě zatím bez překladu.

Tato funkce je aktivní pouze pokud to umožňuje nastavení SysConf_Jet_Translator::getAutoAppendUnknownPhrase()

Doporučení při práci se slovníky a překlady

  • Slovník by měl určitě vznikat ve fázi vývoje a především během fáze testování aplikace. To že ve slovníku nic neschází (včetně chybových hlášek) je vlastně jedna z dobrých indikací toho, že aplikace prošla kompletním testováním.
  • Na produkční prostředí by měly být nahrány již hotové slovníky (kompletní a přeložené).
  • Z těchto důvodů by na produkčním prostředí mělo být vypnuté automatické přidávání frází do slovníků a soubory i adresář slovníků by měl být na produkčním prostředí nezapisovatelný - pouze pro čtení.

Dále doporučuji seznámit se celkově s třídou Jet\Translator a rovněž vřele doporučuji kouknout jak funguje výchozí backend - tak se dozvíte kde a jak jsou slovníky uloženy.

Předchozí kapitola
Balíčkovač CSS a JavaScript
Další kapitola
Jet\Translator