Прежде всего: я новичок в Symfony4 и Twig. Тем не менее, я надеюсь, что прочитал документы, касающиеся моей проблемы. :)
Введение
Хорошо, моя цель - интегрировать компонент Symfony Form вместе с другими подходящими компонентами Symfony в существующее PHP-приложение. Форма, которую я создал, также использует компоненты Translation, Validator и Twig-Bridge. Я установил код, как это предлагается в официальных документах. Все работает, как и ожидалось, за исключением перевода сообщений об ограничениях, хотя метки форм переведены правильно.
Подробнее
Переводчик запускается с 'de'
языком. Резервные локали установлены на ['de']
. Переводы по умолчанию на немецком языке (xlf) из компонента Form и Validator загружаются первыми, а мои пользовательские переводы (yaml) следуют после и переопределяют первый при необходимости. Я настроил два домена перевода: сообщения и валидаторы.
Я проверил, что каталог содержит все немецкие сообщения по умолчанию, включая переводы ограничений. Это означает, что файлы перевода загружены правильно. Ручной перевод сообщения об ограничениях в контроллер или шаблон Twig работает нормально. Но автоматический перевод в шаблоне не удается.
Боюсь, это простая проблема с настройкой, но я понятия не имею, что еще я мог бы сделать, чтобы перевод работал. Мне кажется, что создание каждого поля формы по отдельности в шаблоне Twig не представляется возможным.
Поскольку кеш перевода отсутствует, проблема с кэшированием не может быть.
(validators.de.yaml)
// creating the custom constraint message
entity.name.not_blank: 'Bitte einen Namen eingeben!'
(Controller.php)
// creating the translator
$translator = new Translator('de');
$translator->setFallbackLocales(['de']);
$translator->addLoader('xlf', new XliffFileLoader());
$translator->addLoader('yml', new YamlFileLoader());
// adding default translations
$translator->addResource('xlf', "path/to/vendor/symfony/form/Resources/translations/validators.de.xlf", 'de', 'validators');
$translator->addResource('xlf', "path/to/validator/Resources/translations/validators.de.xlf", 'de', 'validators');
// adding custom translations
$translator->addResource('yml', "path/to/messages.de.yaml", 'de');
$translator->addResource('yml', "path/to/validators.de.yaml", 'de', 'validators');
…
// setting up Twig
$defaultFormTheme = 'bootstrap_4_layout.html.twig';
$appVariableReflection = new \ReflectionClass('\Symfony\Bridge\Twig\AppVariable');
$twig = new Environment(new FilesystemLoader(['/path/to/views', '/path/to/Resources/views/Form']));
$formEngine = new TwigRendererEngine([$defaultFormTheme], $twig);
$twig->addRuntimeLoader(
new FactoryRuntimeLoader([
FormRenderer::class => function () use($formEngine, $csrfManager) {
return new FormRenderer($formEngine, $csrfManager);
}
])
);
$twig->addExtension(new FormExtension());
$twig->addExtension(new TranslationExtension($translator));
…
// creating the form factory adding the Validator extension
$validator = Validation::createValidator();
$formFactory = Forms::createFormFactoryBuilder()
->addExtension(new ValidatorExtension($validator))
->getFormFactory();
…
// rendering the form using Twig
echo $this->getTwig()->render('form.html.twig', [
'form' => $form->createView()
]);
(Entity.php)
// setting up the EntityType form
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('name', TextType::class, [
'constraints' => [
new NotBlank(['message' => 'entity.name.not_blank'])
]
]);
}
Тесты и результаты
Сообщение об ограничении должно переводиться как " Bitte einen Namen eingeben! ", вместо этого отображается ключ сообщения " entity.name.not_blank ". Если в сообщении ограничения не указан ключ сообщения, это означает, что вместо * Dieser Wert sollte nicht leer sein."отображается это значение не должно быть пустым. ".
". *1044*
Тем не менее, следующее работает :
- перевод ключа сообщения вручную с
{% trans from 'validators' %}entity.name.not_blank{% endtrans %}
или {% trans from 'validators' %}This value should not be blank.{% endtrans %}
соответственно
- перевод тега ошибки, который предшествует сообщению об ограничении («ОШИБКА» правильно заменена на «FEHLER»)
- перевод меток
То, что я пробовал до сих пор, но не помогает :
{{ form_widget(form, {'translation_domain': 'validators'}) }}
{% trans_default_domain 'validators' %}
$session->set('_locale', 'de')
$this->getRequest()->setLocale('de')
Интересный факт: Тестирование сопоставимой установки с помощью инфраструктуры Symfony успешно . Но, к сожалению, рамки для меня не подходят.
Спасибо за чтение! Любой полезный комментарий высоко ценится. :)