跳到内容

如何翻译验证约束消息

编辑此页

在表单中使用的验证约束可以通过为 validators 翻译域 创建翻译资源来翻译其错误消息。

首先,运行以下命令安装 Symfony 翻译组件(如果它尚未安装在你的应用程序中)

1
$ composer require symfony/translation

假设你创建了一个普通的 PHP 对象,你需要在你应用程序的某处使用它

1
2
3
4
5
6
7
// src/Entity/Author.php
namespace App\Entity;

class Author
{
    public string $name;
}

通过任何受支持的方法添加约束。将 message 选项设置为翻译源文本。例如,要保证 $name 属性不为空,添加以下内容

1
2
3
4
5
6
7
8
9
10
// src/Entity/Author.php
namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class Author
{
    #[Assert\NotBlank(message: 'author.name.not_blank')]
    public string $name;
}

现在,在 translations/ 目录中创建一个 validators 目录文件

1
2
3
4
5
6
7
8
9
10
11
12
<!-- translations/validators/validators.en.xlf -->
<?xml version="1.0" encoding="UTF-8" ?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="author.name.not_blank">
                <source>author.name.not_blank</source>
                <target>Please enter an author name.</target>
            </trans-unit>
        </body>
    </file>
</xliff>

你可能需要在首次创建此文件后清除缓存(即使在开发环境​​中)。

提示

Symfony 也会为内置的验证消息创建翻译文件。你可以选择设置 enabled_locales 选项来限制你的应用程序中可用的语言环境。这将稍微提高性能,因为 Symfony 将仅为这些语言环境而不是所有语言环境生成翻译文件。

你还可以使用 TranslatableMessage 来构建你的违规消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use Symfony\Component\Translation\TranslatableMessage;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;

#[Assert\Callback]
public function validate(ExecutionContextInterface $context, mixed $payload): void
{
    // somehow you have an array of "fake names"
    $fakeNames = [/* ... */];

    // check if the name is actually a fake name
    if (in_array($this->getFirstName(), $fakeNames, true)) {
        $context->buildViolation(new TranslatableMessage('author.name.fake', [], 'validators'))
            ->atPath('firstName')
            ->addViolation()
        ;
    }
}

你可以在 专用章节 中了解有关可翻译消息的更多信息。

自定义翻译域

可以使用 FrameworkBundle 配置全局更改默认翻译域

1
2
3
4
# config/packages/validator.yaml
framework:
    validation:
        translation_domain: validation_errors

或者可以从约束验证器为特定违规行为自定义它

1
2
3
4
5
6
7
8
9
public function validate($value, Constraint $constraint): void
{
    // validation logic

    $this->context->buildViolation($constraint->message)
        ->setParameter('{{ string }}', $value)
        ->setTranslationDomain('validation_errors')
        ->addViolation();
}
这项工作,包括代码示例,根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本