Symfony:不断收到有关缺少翻译的通知

瓦里耶夫

我正在使用symfony 3.4.19,并且有2种语言的翻译:英语en Dutch。我正在使用这个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
        );
    }
}

目前,我不在任何地方存储提交的数据,我只是想确保翻译工作正常。

因此,当我转到/ register时,可以看到带有TRANSLATED字段的表单。并且在调试栏中没有关于缺少翻译的通知:在此处输入图片说明

提交表单后,我还获得了带有翻译字段的表单,但是这次在调试栏中,我还收到了缺少翻译的通知: 在此处输入图片说明

请注意,所有翻译(字段和消息)都可以正常工作。在config.yml中,我将后备语言环境设置为'en',而当前语言环境设置为'nl'。

在此处输入图片说明

缺少翻译: 在此处输入图片说明

我真的不明白为什么我会一直看到这些通知。有任何想法吗?

更新:

Now I've got rid of security.en.yml and security.nl.yml and created for test purpose only the app/Resources/translations/validators.en.yml with this content:

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

Further I've modified validation messages in the UserDTO class:

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;
}

In register.html.twig I've removed {% trans_default_domain 'security' %} and made the form without field translations:

<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>

And again after submitting the form I get those annoying notifications: 在此处输入图片说明

What am I doing wrong? I just follow step by step the official symfony guide :(

dbrumann

The problem is a bit hidden in your last screenshot. The validation constraints will not use the default translation domain from your template. These messages are pulled from the validators domain by default.

An option could be to duplicate the message keys in a new file for validators-domain our you could change the default domain for validation messages. As far as I know, this is done by overwriting the parameter %validator.translation_domain% e.g. in your services.yaml or in your config.yaml:

# app/config/config.yaml

parameters:
    validator.translation_domain: security

framework:
    ...

Since those are really validation errors I think it would make more sense to keep those messages inside the validators domain and just use this domain selectively in your template:

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

or split up the placeholders and the validation messages into separate translation domains (and files).

编辑以澄清问题:首先,验证程序将翻译您的消息,而不是查找翻译,因此翻译是原始密钥。然后,此“翻译”将传递到模板中的错误处理中,并在其中与当前域一起翻译。因此,基本上,您的问题是在双重翻译验证消息时有些隐蔽的尝试。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

不断收到有关xdebug的邮件

警告:缺少翻译的关键:“”;

收到有关Cron作业失败的通知

是否可以收到有关阻止连接尝试的通知?

迅速收到有关剪贴板更改的通知

不断收到有关Git中SSH密码短语的提示

我不断收到有关 discord.js 中 .position 的错误

我不断收到有关传递参数的警告,使指针从整数转换而无需强制转换

纵观者不断收到来自客户的有关“此”关键字的警告?

应用是否会收到有关忽略推送通知的通知?

有关翻译引擎的信息

没有收到有关大文件的AWS S3 PUT事件的通知

使iOS Action Extension收到有关主机应用已激活的通知

Node.js收到有关高内存使用情况的通知

收到有关用户已禁用iOS上的联系人的通知

如何收到有关已安装Flatpak应用程序新版本的更新通知?

在Mac上未收到有关自定义记录区的CloudKit推送通知

Azure DevOps YAML如何收到有关新任务版本的通知

我收到有关多个IP被SSH阻止的通知,我是否应该担心?

如何在Outlook 2010中收到有关传入RSS源的通知?

收到有关开关陈述的声明

通知有关MySQL中的更改

获取有关流程终止的通知

有关重要日志记录的通知

Android Studio在更新后显示错误(缺少翻译)

应用未在控制台中缺少翻译

每次我使用ssh时,都会收到有关登录尝试失败的通知。如何停止呢?

如何在不使用apt的情况下收到有关Debian软件包更新的通知?

如何在Prometheus运算符中收到有关配置重载器错误的通知或警报?