如何翻译验证约束消息
在表单中使用的验证约束可以通过为 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 许可获得许可。