Почему автоматический перевод сообщений об ограничениях не срабатывает в twig / symfony? - PullRequest
0 голосов
/ 25 мая 2019

Прежде всего: я новичок в 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 успешно . Но, к сожалению, рамки для меня не подходят.

Спасибо за чтение! Любой полезный комментарий высоко ценится. :)

...