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.