Перевод форм и шаблонов

При создании многоязычного приложения вам, вероятно, потребуется отобразить одну и ту же страницу или форму на разных языках.

Фреймворк Nette определяет для этой цели интерфейс перевода Nette\Localization\Translator, который имеет единственный метод translate(). Он получает $message, которое обычно является строкой, и любые другие параметры. Его задача — вернуть переведенную строку.

В Nette нет реализации по умолчанию, вы можете выбрать из нескольких готовых решений в соответствии с вашими потребностями, которые вы найдете на Componette. О том, как настроить транслятор, читайте в документации.

Затем вы можете получить транслятор в своем коде, передав его с помощью внедрения зависимостей.

Начиная с версии nette/utils 3.2, имя интерфейса — Nette\Localization\Translator, то есть без префикса I.

Перевод форм

Формы поддерживает перевод текста через транслятор. Вы устанавливаете его с помощью метода setTranslator():

$form->setTranslator($translator);

С этого момента все ярлыки, а также все сообщения об ошибках или элементы поля выбора переводятся на другой язык.

Для отдельных элементов управления формы по-прежнему можно установить другой транслятор или полностью отключить перевод, используя значение null:

$form->addSelect('carModel', 'Model:', $cars)
	->setTranslator(null);

Для правил валидации переводчику также передаются определенные параметры, например, для правила:

$form->addPassword('password', 'Password:')
	->addCondition($form::MinLength, 'Password must be at least %d characters long', 8);

вызывается транслятор со следующими параметрами:

$translator->translate('Password must be at least %d characters long', 8);

и таким образом может выбрать правильную форму множественного числа слова characters в соответствии с числом.

Перевод шаблонов

Метод setTranslator() также может быть использован в презентерах:

protected function beforeRender(): void
{
	// ...
	$this->template->setTranslator($translator);
}

Затем транслятор можно использовать в качестве других фильтров:

<a href="basket">{='Basket'|translate}</a>
<span>{$item|translate}</span>

Существует также аббревиатура — тег подчеркивания:

<a href="basket">{_'Basket'}</a>
<span>{_$item}</span>

Вы можете использовать альтернативную парную нотацию:

<a href="order">{_}Order{/_}</a>