Як перекладати повідомлення обмежень валідації

Дата оновлення перекладу 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();
}