Как переводить сообщения ограничений валидации
Дата обновления перевода 2024-07-29
Как переводить сообщения ограничений валидации
Если вы используете ограничения валидации с компонентном формы (form), тогда
перевод сообщений об ошибках очень прост: создайте ресурс переводя для
домена переводов validators
.
Во-первых, установите компонент Symfony Translation (если он еще не установлен в вашем приложении), запустив следующую команду:
1
$ composer require symfony/translation
Представьте, что вы создали старый добрый PHP-объект, который вам нужно использовать где-либо в вашем приложении:
1 2 3 4 5 6 7
// src/Entity/Author.php
namespace App\Entity;
class Author
{
public $name;
}
Добавьте ограничения через любой из поддержваемых методов. Установите опцию
сообщений в тексте источника перевода.Например, чтобы гарантировать, что свойство
$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;
}
Теперь, создайте файл каталога valdiators
в каталоге app/Resources/translations
:
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>Пожалуйста, введите имя автора.</target>
</trans-unit>
</body>
</file>
</xliff>
Вам может понадобиться очистить ваш кеш (даже в окружени разработки) после создания этого файла в первый раз.
Tip
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
{
// каким-то образом у вас есть массив "фальшивых имен"
$fakeNames = [/* ... */];
// проверить, является ли имя на самом деле фальшивым
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
{
// логика валидации
$this->context->buildViolation($constraint->message)
->setParameter('{{ string }}', $value)
->setTranslationDomain('validation_errors')
->addViolation();
}