Home PHP Les nouveautés du composant traduction avec Symfony 7.2

Les nouveautés du composant traduction avec Symfony 7.2

  Guillaume 8 min 15 novembre 2024

Depuis Symfony 2.x, le framework propose la commande translation:extract pour extraire tout le contenu traduisible des templates Twig et du code PHP.

Si vous n’êtes pas familier avec le composant traduction de Symfony, je vous invite à consulter la documentation officielle.

 

Pour parcourir ces nouveautés j’ai créé un mini projet en Symfony 7.2 avec un Controller et un template Twig qui contiennent tous deux des traductions à compléter.

Controller :

Les traductions ont été ajoutées en désordre afin d’utiliser une nouvelle fonctionnalité plus tard.

class TranslationController extends AbstractController
{
    #[Route('/translation', name: 'app_translation')]
    public function index(TranslatorInterface $translator): Response
    {
        return $this->render('translation/translation.html.twig', [
            'bTranslation' => $translator->trans('B translation'),
            'dTranslation' => $translator->trans('D translation'),
            'eTranslation' => $translator->trans('E translation'),
            'cTranslation' => $translator->trans('C translation'),
            'aTranslation' => $translator->trans('A translation'),
        ]);
    }
}

Twig :

{% extends 'base.html.twig' %}

{% block title %}{{ 'Traduction List' | trans }}{% endblock %}

{% block body %}
    <h1>{{ 'Traduction List' | trans }}</h1>

    <div class="table-container">
        <table class="styled-table">
            <thead>
                <tr>
                    <th>{{ 'Translation' | trans }}</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>{{ aTranslation | trans }}</td>
                </tr>
                <tr>
                    <td>{{ bTranslation | trans }}</td>
                </tr>
                <tr>
                    <td>{{ cTranslation | trans }}</td>
                </tr>
                <tr>
                    <td>{{ dTranslation | trans }}</td>
                </tr>
                <tr>
                    <td>{{ eTranslation | trans }}</td>
                </tr>
                <tr>
                    <td>{{ 'F translation' | trans }}</td>
                </tr>
                <tr>
                    <td>{{ 'G translation' | trans }}</td>
                </tr>
                <tr>
                    <td>{{ 'H translation' | trans }}</td>
                </tr>
                <tr>
                    <td>{{ 'I translation' | trans }}</td>
                </tr>
            </tbody>
        </table>
    </div>
{% endblock %}

 

Tri par ordre alphabétique des traductions

Grâce à Daniel Gorgan, la commande translation:extract inclut désormais une option --sort (asc ou desc) pour afficher le contenu traduit trié alphabétiquement lors de l’affichage des messages dans le terminal :

php bin/console translation:extract --dump-messages --sort=asc fr

J’avais sciemment déclaré mes traductions dans le désordre dans le template et dans le code.

Après cette commande nous voyons que l’output de la commande affiche les traductions dans l’ordre alphabétique croissant :

Translation Messages Extractor and Dumper
=========================================

 // Generating "fr" translation files for "default directory"

 // Parsing templates...

 // Loading translation files...


Messages extracted for domain "messages" (12 messages)
------------------------------------------------------

 * A translation
 * B translation
 * C translation
 * D translation
 * E translation
 * F translation
 * G translation
 * H translation
 * I translation
 * Translation List
 * Translation

 // Xliff output version is 1.2

 [OK] 11 messages were successfully extracted.

Depuis Symfony 7.2, cette option s’applique également aux fichiers de traduction. En l’utilisant en combinaison avec l’option --force, vous pouvez maintenant trier le contenu du fichier de traduction par ordre alphabétique :

php bin/console translation:extract --force --sort=asc fr 

 

Exemple d’une partie de fichier de traduction en français après la commande :

<trans-unit id="lU4h.T_" resname="A translation">
        <source>A translation</source>
        <target>__A translation</target>
</trans-unit>
<trans-unit id="ZftTJli" resname="B translation">
        <source>B translation</source>
        <target>__B translation</target>
</trans-unit>
<trans-unit id="6mkfs_r" resname="C translation">
        <source>C translation</source>
        <target>__C translation</target>
</trans-unit>
<trans-unit id="tKv3R_1" resname="D translation">
        <source>D translation</source>
        <target>__D translation</target>
      </trans-unit>
<trans-unit id=".yKC.mD" resname="E translation">
        <source>E translation</source>
        <target>__E translation</target>
<trans-unit/>

Comme vous pouvez le constater les traductions ont été créées dans l’ordre alphabétique.

Les développeurs gagnent ainsi en visibilité lors de la complétion des traductions notamment pour les applications web avec des milliers de traductions.

 

Nouveau format des traductions à compléter

Par défaut, lorsque la commande translation:extract trouve un nouveau contenu, elle crée une nouvelle entrée de traduction en utilisant le même contenu comme source et comme traduction en attente. Par exemple, si votre application utilise le format XLIFF pour les traductions et que les templates utilisent des clés de traduction au lieu de contenu réel, vous verrez des entrées comme celle-ci dans le fichier de traduction :

<trans-unit id="lU4h.T_" resname="A translation">
    <source>A translation</source>
    <target>__A translation</target>
</trans-unit>
<trans-unit id="ZftTJli" resname="B translation">
    <source>B translation</source>
    <target>__B translation</target>
</trans-unit>

Le préfixe __ est ajouté pour vous aider à repérer rapidement le contenu non traduit dans votre application. Avec la version 7.2, vous pouvez également laisser la traduction en attente complètement vide lors de la création de nouvelles entrées dans le fichier de traduction.

Pour ce faire, Jawira Portugal a introduit la nouvelle option --no-fill dans Symfony 7.2.

Je vais maintenant créer les traductions en espagnol avec cette option (toujours par ordre alphabétique) :

php bin/console translation:extract --force --sort=asc --no-fill es

On remarque que les nouvelles entrée de traductions ont cette forme :

<trans-unit id="lU4h.T_" resname="A translation">
        <source>A translation</source>
        <target></target>
</trans-unit>
<trans-unit id="ZftTJli" resname="B translation">
        <source>B translation</source>
        <target></target>
</trans-unit>

Les développeurs peuvent identifier clairement toutes les traductions manquante en recherchant « <target><target/> » au lieu de « __ ».

Lors de la complétion de ces traductions j’ai gagné au moins une dizaine de secondes sur 11 traductions car je n’avais pas besoin de supprimer la valeur par défaut dans les balises target.

Le gain de temps devient important lors de l’ajout de nombreuses traductions ou d’une nouvelle langue.

 

Le nouveau linter de traductions

Avant les linters, lorsqu’une configuration de traduction (yaml, xliff, etc..) était erronée il était parfois difficile de retrouver la ligne où se trouvait l’erreur de configuration.

Les linters sont des outils d’analyse de code statique utilisés pour repérer les erreurs, notamment les problèmes de syntaxe et de style. Symfony inclut plusieurs commandes de linter pour vérifier les fichiers de configuration YAML lint:yaml, les services du container lint:container, les templates Twig lint:twig, et même la syntaxe des fichiers de traduction XLIFF lint:xliff.

Depuis la contribution de Hugo Alliaume sur Symfony 7.2,  un nouveau linter permet de vérifier le contenu des traductions. Contrairement à la commande lint:xliff, cette nouvelle commande lint:translations vérifie toutes vos traductions, quel que soit le format de traduction supporté :

php bin/console lint:translations

Pour limiter le linter aux locales de votre choix l’option --locale peut être utilisée:

php bin/console lint:translations --locale=en --locale=es

A titre d’exemple, je vais maintenant enlever des caractères dans l’entrée de ma traduction en espagnol « C translation »

Exemple de rendu d’une erreur de traduction dans le terminal :
  --------- -------------------------------- -------- 
   Locale    Domains                          Valid? 
  --------- -------------------------------- -------- 
   fr       messages                            Yes 
   es        messages                            No 
  --------- -------------------------------- -------- 
 
  Errors for locale "es"
  -------------------------------------------- 
  Translation key "C translation" is invalid: 
 
  [ERROR] Invalid message format (error #65807): msgfmt_create: message formatter 
          creation failed: U_DEFAULT_KEYWORD_MISSING

Comme vous pouvez le voir la traduction erronée est directement identifiée sur la clé « C translation ». Les développeurs identifient désormais clairement où est le problème et peuvent corriger rapidement la traduction.

 

👉 Les améliorations apportées à la gestion des traductions dans Symfony 7.2 représentent un véritable gain de temps pour les développeurs. Les nouvelles options de tri et de formatage, avec notamment l’option --no-fill, permettent de gérer les fichiers de traduction de manière plus efficace. En complément , le nouveau linter lint:translations offre un niveau de contrôle supplémentaire pour repérer les erreurs de format plus rapidement.

 

Sources

https://symfony.com/blog/new-in-symfony-7-2-translations-linter

https://symfony.com/blog/new-in-symfony-7-2-improved-translation-extractor

https://symfony.com/doc/7.2/translation.html

Lire les articles similaires

Laisser un commentaire

Social Share Buttons and Icons powered by Ultimatelysocial