Ce qui se passe
La série « New in Symfony 8.2 » consacre un billet au composant Translation et à son intégration avec Twig et les
formulaires. Le point central touche translation:extract.
L'extracteur voit enfin plus de messages
Jusqu'ici, la commande ne trouvait que les messages passés à trans(), t() ou new TranslatableMessage() sous
forme de chaînes littérales, de concaténations de littéraux ou de constantes de classe. Tout autre cas
échappait au catalogue, et la traduction manquante se découvrait en production. En 8.2, l'extracteur résout aussi :
- les ternaires et l'opérateur de coalescence nulle ;
- les expressions
match; - les chaînes interpolées ;
- les variables assignées plus haut ;
- les valeurs renvoyées par des méthodes, quand il connaît la classe de l'objet (
$this, paramètres et propriétés typés, cases d'enum, types de retour) et que la méthode est définie dans les chemins extraits.
Contribution de Guillaume Sainthillier. Côté Twig, il trouve aussi les messages passés à form_label(),
form_widget(), form_help() et form_row(), dans le domaine de la variable translation_domain, à défaut dans
le domaine par défaut. Le tag trans_default_domain est ignoré exprès, car les thèmes de formulaire ne s'en
servent pas pour traduire libellés et aides (Nicolas Grekas).
Les autres changements
- XLIFF, élément
<source>.translation:extracty écrivait la clé de traduction, alors que le format y attend le texte d'origine que voient traducteurs et outils. Symfony 8.2 le conserve au chargement et à l'écriture, et une nouvelle commande remplit les<source>avec les messages de la langue par défaut : pournavbar.homevalantHomeen anglais,<source>contiendraHome. Elle ne touche quetranslations/et les chemins deframework.translator.paths, jamais les fichiers des vendors ou des bundles (Nicolas Rigaud et mauricedefelicec24). - Domaine Twig pour tout le fichier.
trans_default_domainne couvre pas le corps des{% embed %}, compilés comme des gabarits séparés : unproduct.titlese traduisait danscatalog, unproduct.add_to_cartdansmessages. Le nouveau modificateurfor _selfapplique le domaine à tout le fichier, embeds et macros compris. Le domaine doit être une chaîne littérale, déclaré une seule fois, hors de tout bloc et avant toutembed; il ne s'étend pas aux gabarits inclus ou étendus (Matthias Pigulla). group_bydeChoiceType. Le callable peut renvoyer des objetsTranslatableInterface, commechoice_label(Valentin Salmeron).
Comment s'y prendre
- En passant à 8.2, relancez
translation:extractet comparez le catalogue : de nouveaux messages vont apparaître. - Si votre thème de formulaire surcharge le bloc
choice_widget_options, lisez le libellé du groupe danschoice.label, avec la clé de boucle en repli : la clé du tableau n'en est plus le libellé dès qu'on utilise des objets traduisibles. - Ajoutez
for _selfaux gabarits qui utilisent desembed, au lieu de répéter le domaine dans chaque corps.
Source : blog Symfony, en anglais.