Перевод форм и шаблонов
При создании многоязычного приложения вам, вероятно, потребуется отобразить одну и ту же страницу или форму на разных языках.
Фреймворк 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>