Symfony: продолжайте получать уведомления об отсутствующих переводах

Я использую Symfony 3.4.19 и имею переводы на 2 языка: английский и голландский. я использую этот Руководство Symfony по переводу проверочных сообщений

Вот часть моего UserDTO с утверждениями и переводами сообщений:

class UserDTO
{
/**
* @var string
*
* @Assert\NotNull(message="security.registration.firstname.required", groups={"createUser", "updateUser"})
* @Assert\NotBlank(message="security.registration.firstname.required", groups={"createUser", "updateUser"})
*/
private $firstname;

/**
* @var string
*
* @Assert\NotNull(message="security.registration.lastname.required", groups={"createUser", "updateUser"})
* @Assert\NotBlank(message="security.registration.lastname.required", groups={"createUser", "updateUser"})
*/
private $lastname;

/**
* @var string
*
* @Assert\NotNull(message="security.registration.email.required", groups={"createUser", "updateUser"})
* @Assert\NotBlank(message="security.registration.email.required", groups={"createUser", "updateUser"})
* @Assert\Email(message="security.registration.email.format", groups={"createUser", "updateUser"})
*/
private $email;

/**
* @var string
*
* @Assert\NotNull(message="security.registration.password.required", groups={"createUser", "updateUser"})
* @Assert\NotBlank(message="security.registration.password.required", groups={"createUser", "updateUser"})
*/
private $plainPassword;
}

Итак, у меня есть 2 файла перевода: security.en.yml

"Username could not be found.": "Wrong email or password!""Invalid credentials.": "Wrong email or password!"security:
login:
email: 'Email'
password: 'Password'
registration:
firstname:
title: 'Firstname'
required: 'A firstname is required'
lastname:
title: 'Lastname'
required: 'A lastname is required'
email:
title: 'Email'
required: 'An email is required'
format: 'Wrong email format'
password:
title: 'Password'
required: 'A password is required'

и security.nl.yml:

"Username could not be found.": "Verkeerd email of wachtwoord!""Invalid credentials.": "Verkeerd email of wachtwoord!"security:
login:
email: 'Email'
password: 'Wachtwoord'
registration:
firstname:
title: 'Voornaam'
required: 'Voornaam is verplicht'
lastname:
title: 'Achternaam'
required: 'Achternaam is verplicht'
email:
title: 'Email'
required: 'Email is verplicht'
format: 'Verkeerd email formaat'
password:
title: 'Wachtwoord'
required: 'Wachtwoord is verplicht'

Также я не использую конструктор форм Symfony, поэтому просто отправляю форму, созданную в шаблоне ветки:

{% trans_default_domain 'security' %}

{% extends 'base.html.twig' %}

{% block stylesheets %}
{{ parent() }}
<link href="{{ asset('css/project/registration.css') }}" rel="stylesheet"/>
{% endblock %}

{% block javascripts %}
{{ parent() }}
{% endblock %}

{% block body %}
{{ include('component/main-navbar.html.twig') }}

<div>
<h2>Create new account</h2>

{% if errors is defined %}
<div class="alert alert-danger">
<ul>
{% for error in errors %}
<li>{{ error|trans }}</li>
{% endfor %}
</ul>
</div>
{% endif %}

<form action="/register" method="post">
<input type="text" name="firstname" placeholder="{{ 'security.registration.firstname.title'|trans }}">
<input type="text" name="lastname" placeholder="{{ 'security.registration.lastname.title'|trans }}">
<input type="text" name="email" placeholder="{{ 'security.registration.email.title'|trans }}">
<input type="text" name="plainPassword" placeholder="{{ 'security.registration.password.title'|trans }}">
<button type="submit" class="btn btn-success btn-sm float-right">Login <span class="fa fa-lock"></span>
</button>
</form>
</div>

{{ include('component/footer.html.twig') }}
{% endblock %}

Как вы можете видеть в верхней части шаблона, я явно установил область перевода, т.е. ‘безопасность’.

В контроллере у меня есть 2 метода. Первый — просто для представления, а второй — для отправки формы.

public function registrationPageAction(Request $request)
{
return new Response(
$this->twigService->render(
'security/register.html.twig',
[
'error' => []
]
),
200
);
}

Отправка формы:

public function registrationSubmitAction(Request $request)
{
$submittedFormData = $request->request->all();

$userDTO = new UserDTO();
$userDTO->setFirstname($submittedFormData['firstname'])
->setLastname($submittedFormData['lastname'])
->setEmail($submittedFormData['email'])
->setPlainPassword($submittedFormData['plainPassword']);

$fieldErrors = $this->validator->validate($userDTO, null, ['createUser']);

$errors = [];
if (count($fieldErrors) > 0)
{
foreach ($fieldErrors as $error)
{
$errors[] = $error->getMessage();
}

return new Response(
$this->twigService->render(
'security/register.html.twig',
[
'errors' => $errors
]
),
200
);
}
}

В настоящее время я нигде не храню отправленные данные, я просто хочу быть уверенным, что переводы работают нормально.

Поэтому, когда я захожу / регистрируюсь, я вижу форму с переведенными полями, как и ожидалось. А в панели отладки нет уведомлений об отсутствующих переводах:
введите описание изображения здесь

После отправки формы у меня также есть форма с переведенными полями, но на этот раз в панели отладки у меня также есть уведомление об отсутствующих переводах:
введите описание изображения здесь

Обратите внимание, что все переводы (поля и сообщения) работают нормально. В config.yml у меня установлена ​​резервная локаль ‘en’, а текущая локаль установлена ​​на ‘nl’.

введите описание изображения здесь

Недостающие переводы:
введите описание изображения здесь

Я действительно не понимаю, почему я продолжаю видеть эти уведомления. Есть идеи?

ОБНОВИТЬ:

Теперь я избавился от security.en.yml и security.nl.yml и создал для тестирования только приложение / Resources / translations / validators.en.yml со следующим содержимым:

firstname: 'Firstname is needed'
lastname: 'Lastname is needed'
email: 'Email is needed'
emailformat: 'Wrong email format'
password: 'Password is needed'

Далее я изменил сообщения проверки в классе UserDTO:

class UserDTO
{
/**
* @var string
*
* @Assert\NotNull(message="firstname", groups={"createUser", "updateUser"})
* @Assert\NotBlank(message="firstname", groups={"createUser", "updateUser"})
*/
private $firstname;

/**
* @var string
*
* @Assert\NotNull(message="lastname", groups={"createUser", "updateUser"})
* @Assert\NotBlank(message="lastname", groups={"createUser", "updateUser"})
*/
private $lastname;

/**
* @var string
*
* @Assert\NotNull(message="email", groups={"createUser", "updateUser"})
* @Assert\NotBlank(message="email", groups={"createUser", "updateUser"})
* @Assert\Email(message="emailformat", groups={"createUser", "updateUser"})
*/
private $email;

/**
* @var string
*
* @Assert\NotNull(message="password", groups={"createUser", "updateUser"})
* @Assert\NotBlank(message="password", groups={"createUser", "updateUser"})
*/
private $plainPassword;
}

В register.html.twig я удалил {% trans_default_domain ‘security’%} и сделал форму без перевода полей:

<form action="/register" method="post">
<input type="text" name="firstname" placeholder="Firstname">
<input type="text" name="lastname" placeholder="Lastname">
<input type="text" name="email" placeholder="Email">
<input type="text" name="plainPassword" placeholder="Password">
<button type="submit" class="btn btn-success btn-sm float-right">Login <span class="fa fa-lock"></span>
</button>
</form>

И снова после отправки формы я получаю эти надоедливые уведомления:
введите описание изображения здесь

Что я делаю неправильно? Я просто следую пошаговому руководству Symfony 🙁

2

Решение

Проблема немного скрыта на вашем последнем скриншоте. Ограничения проверки не будут использовать домен перевода по умолчанию из вашего шаблона. Эти сообщения извлекаются из validators домен по умолчанию.

Возможен вариант дублирования ключей сообщения в новом файле для домена validators. Вы можете изменить домен по умолчанию для сообщений проверки. Насколько я знаю, это делается путем перезаписи параметра %validator.translation_domain% например в вашем services.yaml или в вашем config.yaml:

# app/config/config.yaml

parameters:
validator.translation_domain: security

framework:
...

Так как это действительно ошибки валидации, я думаю, что было бы более целесообразно хранить эти сообщения внутри домена валидаторов и просто использовать этот домен выборочно в вашем шаблоне:

<input type="text" name="firstname" placeholder="{{ 'security.registration.firstname.title'|trans(domain="validators") }}">

или разделить заполнители и сообщения проверки на отдельные домены перевода (и файлы).

отредактируйте для уточнения: сначала валидатор переведет ваши сообщения, а не найдет перевод, и поэтому перевод является исходным ключом. Этот «перевод» затем передается в вашу обработку ошибок в вашем шаблоне, где он переводится с вашим текущим доменом. В общем, ваша проблема — это несколько скрытая попытка дважды перевести сообщения проверки.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector