Překládání formulářů a šablon
Pokud programujete vícejazyčnou aplikaci, budete nejspíš potřebovat stejnou stránku nebo formulář vykreslit v různých jazykových mutacích.
Nette Framework k tomuto účelu definuje rozhraní pro překlad Nette\Localization\Translator, které má
jedinou metodu translate()
. Ta přijímá zprávu $message
, což zpravidla bývá řetězec, a
libovolné další parametry. Úkolem je vrátit přeložený řetězec.
V Nette není žádná výchozí implementace, můžete si vybrat podle svých potřeb z několika hotových řešeních, které najdete na Componette. V jejich dokumentaci se dozvíte, jak translator konfigurovat.
K objektu translatoru se potom ve svém kódu dostanete tak, že si jej necháte předat pomocí dependency injection.
Od nette/utils verze 3.2 je název rozhraní Nette\Localization\Translator
, tedy bez prefixu I
.
Překlad formulářů
Formuláře podporují vypisování textů přes translator. Předáme jim ho pomocí metody
setTranslator()
:
$form->setTranslator($translator);
Od této chvíle se nejen všechny popisky, ale i všechny chybové hlášky nebo položky select boxů přeloží do jiného jazyka.
U jednotlivých formulářových prvků je přitom možné nastavit jiný překladač nebo překládání úplně vypnout
hodnotou null
:
$form->addSelect('carModel', 'Model:', $cars)
->setTranslator(null);
U validačních pravidel se translatoru předávají i specifické parametry, například u pravidla:
$form->addPassword('password', 'Heslo:')
->addCondition($form::MIN_LENGTH, 'Heslo musí mít alespoň %d znaků', 8);
se volá translator s těmito parametry:
$translator->translate('Heslo musí mít alespoň %d znaků', 8);
a tedy může zvolit správný tvar plurálu u slova znaky
podle počtu.
Překlad šablon
Šablonám Latte lze nastavit překladač jako filtr:
$latte->addFilter('translate', [$translator, 'translate']);
V presenterech lze použít i metodou setTranslator()
:
protected function beforeRender(): void
{
// ...
$this->template->setTranslator($translator);
}
Poté lze překladač používat jako jiné filtry:
<a href="basket">{='Košík'|translate}</a>
<span>{$item|translate}</span>
Je k dispozici i zkratka v podobně podtržítkové značky:
<a href="basket">{_'Košík'}</a>
<span>{_$item}</span>
Pro překlad části šablony existuje párová značka {translate}
(od Latte 2.11, dříve se používala značka
{_}
):
<a href="order">{translate}Objednávka{/translate}</a>