Jazykové mutace v SunLight CMS 8
Sunlight je jeden ze systémů, který pracuje s jazykem. Ať už se jedná o celý CMS, nebo o pluginy, které ho rozšiřují - vždy je možnost přizpůsobit web do různých jazyků.
Jak to funguje?
Systém používá jednoduché pole v php souboru, kde je na každém řádku klíč k danému překladu. Základní jazykové balíčky (extendy) jsou v českém a anglickém jazyce a jsou umístěny ve složce Languages (\plugins\languages). Každý jazyk má svoji složku (adresář) pojmenovaný podle zásad ISO Code. Například čeština má název adresáře cs a angličtina en.
Velmi zajímavá informace ohledně ISO code je i zde: RSS-Specific Language Codes. Zde se například dozvíme, jak rozlišit evropskou francouzštinu od kanadské.
Ale podívejme se, jak to funguje. Ve složce cs najdeme tři soubory: admin_dictionary.php, dictionary.php a plugin.json. admin_dictionary.php je php skript pro administrační část Sunlight, dictionary.php pro veřejnou a soubor plugin.json inicializuje tento jazyk v celém systému Sunlight, tedy jako extend (plugin). U dalších jazykových balíčků (např. en) přibude další složka class, ve které je soubor EnglishLanguage.php. Je to třída, která určuje vlastnost jazyka, který se do dystému přidává. V tomto případě má název EnglishLanguage. Pro němčinu by to bylo DeutscheLanguage, pro francouzštinu FrancaisLanguage. A tak podobně. Proč to není u českého jazyka? Protože to je systémový jazyk v českém CMS systému.
Poznámka od Jirky Daňka: Ty třídy navíc jsou tam proto, protože jiné státy používají jiné oddělovače měn, desetinných čísel a tohle řeší správné formátování výpisu
Podívejte se na zápis v souboru plugin.json na decimal_point a thousands_separator.
{
"class": "EnglishLanguage",
"iso_code": "en",
"decimal_point": ".",
"thousands_separator": ","
}
Ukázka kódu php souborů
<?php
return [
'admin.link.site' => 'Zobrazit stránky',
'admin.link.newwin' => 'Nové okno',
'admin.link.home' => 'zpět na hlavní stranu',
'admin.denied' => 'Nemáte dostatečná práva pro vstup do administrace.',
'admin.busy_overlay.text' => 'Prosím čekejte',
'admin.iplog' => 'Log IP adres',
'admin.moduleunavailable' => 'Modul není dostupný.',
'admin.menu.index' => 'Přehled',
//...
//...
//...
];
Vidíme zde pole, kde na každém řádku je jednotlivý klíč k dannému výrazu nebo textu. Je to vlastně velmi jednoduché. Z těchto language souborů pak čerpá každý skript, nebo funkce a tak dále. Soubory jazykových balíčků se ukládají v UTF8 bez BOM kódování. To umožní používat diakritiku a další speciální znaky u jiných jazyků, než je angličtina (italština, španělština …). Čeština, němčina, francouzština, ale například také turečtina a další jazyky obsahují své speciální znaky a diakritiku. Proto je nezbytné soubory uložit jako UTF8.
Jak vypadá zápis v nějakém pluginu nebo v základním systému
Stěžejní je funkce _lang() zabudovaná v Sunlight. Například název tlačítka pro chystaný extend bude vypadat takto: _lang('downloadmanager.settings.download')
Všiměme si, před slovem lang je podtržítko. To je velmi důležité.
Poznámka od Jirky Daňka: Funkce _lang() je dostupná globálně bez nutnosti importu
Následující obrázek ukazuje tlačítkové menu pro download manager ve Správě obsahu. Použitý lang kód je vyznačen zeleným rámečkem.

Registrace v pluginu
A nyní se podíváme na zápis langs v souboru plugin.json. K čemu to vlastně slouží? Když se podíváme do dokumentace jak má vypadat klíč langs, vidíme přesně popsáno a jaké vlastnosti zápis obsahuje. Ale pro lepší ujasnění bych rád napsal, jak mi to vysvětlil Jirka Daněk.
Ukázka struktury kódu:
"langs": {
"klic": "slozka"
},
V dokumentaci vidíme jako klíč název my_plugin. Většinou to může být název vámi vytvářeného pluginu. Dále tam vidíme název lang, což v tomto případě je název složky umístěné v kořenu pluginu. Můžete si ji pojmenovat i jinak, ale je dobré dodržet určité zásady psaní pluginů a pojmenovat takovou složku jako lang.
Uvedu to na příkladu u extendu pro Download Manager (ještě neexistuje veřejně). V předchozím obrázku jsme viděli různá tlačítka s českými názvy. V jakémkoliv pluginu je potřeba použít funkci _lang(). Když chcete zobrazit nějaký přeložený text, do této funkce vložíte klíč (řetězec) z překladových slovníků. Například takto:
_lang('downloadmanager.module.title')
V tomto případě jsem použil překlad názvu pluginu Download Manager z jazykového slovníku pluginu. Proto je před textem module.title klíč (uvedený v souboru plugin.json) - downloadmanager. Jedná se o prefix daného jazykové sady. Ale v jazykovém souboru klíč uveden není:
'module.title' => 'Download Manager',
Ovšem, pokud bychom chtěli použít nějaký systémový překlad (např. pro všeobecná tlačítka a tak podobně), není potřeba klíč pluginu vkládat. Systém SL si danný řetězec najde sám.
Například název tlačítka Nahrát soubor má v admin_dictionary.php řetězec:
'admin.fman.menu.upload' => 'Nahrát soubor',
V tomto případě využíváme systémového překladu a klíč downloadmanager není potřeba vkládat. Zápis bude vypadat takto:
_lang('admin.fman.menu.upload')
Závěr
Když si to shrneme. Pro využití systémových překladů není potřeba vkládat klíč uvedený v plugin.json. Ale pro překlady konkrétní a specifické vlastnosti pluginu (které jsou naskriptovány přímo v jazykových souborech danného pluginu - většinou ve složce lang) už klíč musíme použít. Tím systém SL ví, kam má šáhnout a kde danný řetězec najít.