Aller au contenu

Symfony 3.4 : traduire les erreurs du validateur

Note : ceci n'a été testé que sur Symfony 3.4. Cependant, si le problème existe encore sur Symfony 4 ou Symfony 5, il est probable que la solution fonctionne aussi.

Voici la méthode indiquée par Symfony pour capturer les erreurs d'une valeur donnée :

$constraints = ...;

$validator = Validation::createValidator();
$violations = $validator->validate($line, $constraints);

Documentation :

Problème : cela retourne des erreurs en anglais, comme par exemple « This field is missing. », peu importe la langue du site.

Après analyse de la méthode statique Validation::createValidator(), on remarque qu'elle crée un ValidatorBuilder puis ensuite qu'elle appelle dessus la méthode getValidator. Voir le code.

En analysant la classe ValidatorBuilder, on remarque un attribut translator. Aussi, on retrouve la méthode getValidator.

On voit dans la méthode getValidator que l'absence de translator la force à créer un « faux traducteur ». Voir le code.

L'idée consite donc à créer le ValidatorBuilder par nous-même puis à lui fournir le translator désiré. En parallèle, on en profite pour lui fournir le domaine de traduction 'validators' afin qu'il utilise les traductions intégrées à Symfony :

$constraints = ...;

$validatorBuilder = Validation::createValidatorBuilder();
$validatorBuilder->setTranslator($this->get('translator'));
$validatorBuilder->setTranslationDomain('validators');

$validator = $validatorBuilder->getValidator();

$violations = $validator->validate($line, $constraints);

Ainsi, les erreurs seront bien dans la langue du site.