Як перекладати повідомлення обмежень валідації
Дата оновлення перекладу 2024-06-07
Як перекладати повідомлення обмежень валідації
Якщо ви використовуєте обмеження валідації з компонентном Form, тоді
переклад повідомлень про помилки дуже простий: створіть ресурс перекладу
для домена перекладів 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 $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>Please enter an author name.</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();
}