Symfony: продолжайте получать уведомления о пропущенных переводах - PullRequest
0 голосов
/ 18 декабря 2018

Я использую 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 %}

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

В контроллере есть 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
        );
    }
}

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

Поэтому, когда я захожу / регистрируюсь, я вижу форму с полями ПЕРЕВОДОВ, как и ожидалось.А в панели отладки нет уведомлений о пропущенных переводах: enter image description here

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

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

enter image description here

Пропущенные переводы: enter image description here

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

ОБНОВЛЕНИЕ:

Теперь я избавился от security.en.yml и security.nl.yml и создал для тестирования только приложение /Ресурсы / переводы / 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 IЯ удалил {% 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>

И снова после отправки формы я получаю эти раздражающие уведомления: enter image description here

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

1 Ответ

0 голосов
/ 18 декабря 2018

Проблема немного скрыта на вашем последнем скриншоте.Ограничения проверки не будут использовать домен перевода по умолчанию из вашего шаблона.Эти сообщения по умолчанию извлекаются из домена 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") }}">

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...