Formation « Développer des blocs Gutenberg sur mesure avec React »

Internationalisation (i18n) : comment traduire nos blocs Gutenberg ?

Lecture : 14 minutes • 23

Dans ce cours on va voir comment gérer l’internationalisation de nos chaînes de texte en PHP et en JS afin que nos blocs puissent être traduits dans toutes les langues, et ça peut être vite galère, si on n’a pas la bonne technique.

La traduction de vos extensions de blocs peut vite être un calvaire, surtout que la procédure a pas mal changé avec le temps, et la documentation n’est pas forcément bien à jour.

Pour ne pas simplifier la tâche, il va falloir être en mesure de traduire les chaînes de texte en PHP, mais également celles en JavaScript, du côté de l’éditeur.

Dans ce cours, on va voir comment rendre tous vos textes traduisibles, qu’ils soient dans le PHP, dans le JS, ou même déclarés en PHP mais utilisés en JS. Le tout, sans devenir fou.

Voici notre feuille de route pour traduire nos blocs et notre extension WordPress :

  • Déclarer le Text domain et le Domain path en PHP ;
  • Rendre les chaînes PHP traduisibles via la fonction __() ;
  • Rendre les blocs traduisibles dans le JS grâce à la librairie @wordpress/i18n ;
  • Créer le dossier /languages qui accueillera les traductions ;
  • Générer le catalogue des traductions au format .pot via WP-CLI ;
  • Traduire les chaînes dans une nouvelle langue grâce à Loco translate ou PoEdit ;
  • Générer les fichiers de traductions .mo, .php et .json pour chaque situation ;
  • Lier les traductions aux blocs grâce à la fonction wp_set_script_translations() ;

Les traductions devraient alors fonctionner autant dans l’administration WordPress en PHP que dans l’éditeur Gutenberg en JS.

Pour cela, on va avoir besoin de WP-CLI, l’utilitaire de lignes de commandes fourni avec WordPress.

Abordons maintenant ça étape par étape :

Déclarer le textdomain et traduire le PHP

On va commencer avec la base de toute extension WordPress : déclarer le nécessaire pour la traduction des chaînes en PHP.

verrouillé Vidéo premium

Cette vidéo est réservée aux détenteurs de l’offre premium.
Envie de nous rejoindre ?

Choisir une formule

Aujourd’hui, c’est beaucoup plus simple qu’avant puisque ça se passe dans la déclaration des informations de l’extension, dans les commentaires PHP du premier fichier :

PHP
plugin.php

Il y a deux éléments importants à prendre en compte :

  • Text Domain qui permet d’isoler les traductions du reste de WordPress ;
  • Domain Path qui permet d’indiquer où trouver les traductions.

Si vous avez généré votre extension avec create-block, seul Text Domain sera présent. Il vous faudra alors ajouter Domain Path.

Pour écrire des chaînes de texte traduisibles en PHP, utilisez les fonctions __(), _e(), __x() ou même encore esc_html_e() pour échapper le texte en même temps… Voici un exemple :

PHP
plugin.php

Les fonctions comme __() et _e() et _esc_html_e() acceptent 2 arguments :

  • La chaîne de texte à traduire, que l’on définit habituellement en anglais par défaut ;
  • Le textdomain, qui doit être le même que celui déclaré au début de l’extension.

Le textdomain est très important dans un thème ou une extension, il permet d’isoler vos traductions et éviter les conflits avec des chaînes équivalentes de WordPress ou d’autres extensions.

Après tout, un texte dans votre extension n’aura peut-être pas le même sens ailleurs, et donc la même traduction dans un autre contexte.

Le saviez-vous ?

La fonction _e() permet d’afficher une valeur, c’est l’équivalent d’un echo, alors que __() renvoie simplement la valeur.

C’est tout ce dont on a besoin pour rendre nos textes traduisibles dans une extension classique en PHP. C’était la partie la plus simple et qui n’a quasiment pas changé depuis les débuts de WordPress.

Conseil

Désormais, on n’a plus besoin d’utiliser la fonction load_plugin_textdomain() pour déclarer ses traductions. le Domain Path suffit.

Attention

Par contre, n’utilisez pas Domain Path sur une extension destinée à être publiée sur le répertoire WordPress, car ce sera géré automatiquement par wordpress.org.

Rendre vos blocs traduisibles

Pour préparer vos blocs à la traduction, il y a quelques petites étapes à respecter.

verrouillé Vidéo premium

Cette vidéo est réservée aux détenteurs de l’offre premium.
Envie de nous rejoindre ?

Choisir une formule

Tout d’abord, il va falloir indiquer le même textdomain dans le block.json que dans l’extension :

JSON
block.json

Vous pourriez indiquer un textdomain unique par bloc, mais ça présente peu d’intérêt et ça demanderait plus de manipulations pour les traductions.

Ensuite, dans edit.js, vous pouvez traduire vos chaînes grâce à la fonction __() du package @wordpress/i18n :

JSX
edit.js

Au final, c’est quasiment comme en PHP. On n’utilisera par contre que __() et pas _e(), car en JS la gestion du template est différente : tout est retourné via la fonction return() à React et c’est lui qui s’occupera d’injecter ça dans le DOM ensuite.

Le saviez-vous ?

i18n veut dire « internationalization » : il y a 18 lettres entre le premier i et le dernier n.

Générer le catalogue de traductions (.pot)

Maintenant, on va devoir générer un catalogue de tous les textes traduisibles présents dans notre extension, que ce soit en PHP ou en JS.

verrouillé Vidéo premium

Cette vidéo est réservée aux détenteurs de l’offre premium.
Envie de nous rejoindre ?

Choisir une formule

Et pour cela, on va utiliser une commande WP-CLI.

Si vous utilisez Local WP, ça va être très simple. Affichez le panneau de gestion de votre site et cliquez sur « Site shell » en haut, sous le titre du site.

Le bouton Site Shell de Local WP, qui permet d'ouvrir un terminal avec WP-CLI intégré.
Le bouton « Site shell » permet d’ouvrir un terminal avec WP-CLI intégré

Votre terminal préféré devrait s’ouvrir. Vous pouvez d’ailleurs le configurer dans les réglages de LocalWP. Pour ma part, j’utilise Hyper lorsque je suis hors IDE.

Le terminal affiche des informations sur WP-CLI une fois lancé, permettant de valider son bon fonctionnement.
Notre terminal et les commandes qu’on va exécuter

Voici les 3 commandes que l’on va exécuter :

Shell

La première commande permet de nous déplacer dans le dossier de notre extension. Pensez à modifier selon le nom de votre dossier d’extension.

La seconde commande permet de créer le dossier qui accueillera nos traductions dans l’extension et que l’on nomme /languages/. Vous pourriez tout à fait créer ce dossier à la main depuis votre éditeur de code ou votre explorateur de fichiers.

La troisième permet de lancer la génération du fichier catalogue qui contiendra toutes les chaînes à traduire. Vous pouvez nommer le fichier .pot comme vous le souhaitez, mais c’est une bonne idée de lui donner le même nom que le textdomain.

Conseil

Gardez le terminal ouvert, car on aura besoin d’exécuter d’autres commandes un peu plus tard.

Traduire les chaînes avec Loco Translate

Maintenant que notre catalogue de traductions est prêt, on va pouvoir créer à partir de celui-ci une traduction pour la langue française dans un premier temps.

verrouillé Vidéo premium

Cette vidéo est réservée aux détenteurs de l’offre premium.
Envie de nous rejoindre ?

Choisir une formule

Pour cela, installez l’extension gratuite Loco Translate sur votre site local. On va créer le fichier de traduction et traduire les textes grâce à elle.

Loco Translate

Loco Translate

Translate WordPress plugins and themes directly in your browser. Versatile PO file editor with integrated AI translation providers.

Par Tim W

Vous pourriez tout aussi bien utiliser le logiciel PoEdit, mais vous allez voir que c’est bien plus pratique avec Loco car il va compiler automatiquement les fichiers nécessaires !

Une fois l’extension installée et activée, rendez-vous dans Loco Translate > Accueil et cliquez sur votre extension dans la liste des extensions actives.

La page d'accueil de Loco Translate
On peut voir le Text domain que l’on a défini

Ensuite, cliquez sur « Nouvelle langue » et vous arriverez sur cette interface :

L'interface d'ajout d'une nouvelle langue nous demande de choisir la langue, puis ensuite l'emplacement où placer la traduction.
Sélectionnez le français et placez la traduction dans l’extension

Dans un premier temps, choisissez la langue à créer. Je sélectionne « French (France) » qui correspond à fr_FR.

Ensuite, il faut choisir un emplacement. On va placer le fichier dans notre extension. Sélectionnez donc « Auteur ».

Lorsqu’on souhaite traduire une extension que l’on a téléchargé sur le répertoire, on sélectionnera plutôt « Système », afin que nos traductions personnalisées ne soient pas écrasées lors de la prochaine mise à jour.

Mais dans notre cas, comme c’est notre extension, on va vouloir versionner la traduction avec le reste du code.

Cliquez ensuite sur « Commencer la traduction ».

L'interface de traduction de Loco Translate dans WordPress. Les textes de notre extensions sont tous listés.
L’interface de traduction de Loco Translate

Vous devriez voir apparaître toutes les chaînes de votre extension, autant celles présentes en PHP que celles écrites dans les fichiers JS.

Effectuez quelques traductions en cliquant sur une ligne et en saisissant une traduction dans le champ en bas de l’interface, puis cliquez sur « Enregistrez ».

Certains textes sont précédés d’une vignette grise, qui donne du contexte. En regardant de plus près, on remarque que ce sont les textes du fichier block.json de nos blocs !

WordPress permet donc de traduire le titre, la description, et même les mots-clés des blocs.

Notez par ailleurs la présence du bouton « Synchroniser » qui nous sera très utile lorsqu’on aura ajouté de nouvelle chaînes à notre extension.

On va maintenant aller jeter un œil du côté du dossier /languages/ de notre site. On peut remarquer que plusieurs fichiers ont été générés automatiquement par Loco :

Les fichiers de traductions générés par Loco Translate dans le dossier languages de notre extension
Plusieurs fichiers ont été créés : certains en .mo, d’autres en .php ou encore .json

Parmi les fichiers, voici leur usage :

  • .pot : catalogue originel contenant toutes les chaînes à traduire ;
  • .po : fichier contenant les traductions dans une langue particulière ;
  • .mo : version compilée de la traduction, plus légère, qui sera utilisée par le site ;
  • .php : les traductions des chaînes PHP qui seront utilisé dans l’éditeur en JS ;
  • .json : contient les traductions des blocs en JS ;
  • .po~ : sauvegardes automatiques faites par Loco Translate.

Ça en fait pas mal des fichiers ! Voici quelques explications supplémentaires pour bien comprendre :

Les fichiers .mo seront utilisés en PHP exclusivement. Ils sont compilés et donc plus légers à charger et exécuter. Il faut un module spécial pour les lire, c’est pour ça que ce n’est pas une solution viable pour les traductions JS dans le navigateur.

Les traductions des blocs, que vous avez déclarées dans des fichiers JavaScript, sont placées dans des fichiers JSON qui suivent le format standard JED. Il va y avoir un fichier par bloc, ne vous inquiétez donc pas si vous retrouvez de nombreux fichiers dans le dossier /languages/ au bout d’un moment.

Et on retrouve enfin également des traductions dans un fichier PHP. Ça commence à bien faire ! On a traité PHP et JS déjà, du coup il sert à quoi celui-là ?

En fait, il sert à transmettre des traductions déclarées en PHP vers l’éditeur, par exemple lorsque vous déclarez une nouvelle catégorie de blocs :

PHP
plugin.php

Dans cet exemple, cette chaîne déclarée en PHP sera en fait utilisée par l’éditeur Gutenberg, en front et donc en JS :

La chaîne de texte a été définie en PHP mais elle est utilisée par Gutenberg avec du JS.
Le nom de la catégorie de mes blocs

C’est pour cela que ce fichier existe.

Pas d’inquiétude en tous cas : tout est automatisé. WordPress sait quelles chaînes placer dans quels fichiers, et tout est généré automatiquement par Loco lors de l’enregistrement.

Conseil

Ce qu’il faut retenir ici, c’est que Loco Translate génère tous les fichiers nécessaires pour afficher les traductions. Préférez-le donc à PoEdit.

Générer les traductions PHP et JSON

Si vous avez suivi mes conseils et que vous avez utilisé Loco Translate dans l’étape précédente, il n’y a rien à faire de plus dans cette partie, car ce dernier s’est occupé de générer tous les fichiers .mo, .php et même .json automatiquement !

verrouillé Vidéo premium

Cette vidéo est réservée aux détenteurs de l’offre premium.
Envie de nous rejoindre ?

Choisir une formule

Mais si ce n’est pas le cas, ou que vous souhaitez comprendre ce qu’il se passe sous le capot, voici comment générer les fichiers de traduction soi-même.

Pour cela, reprenez le terminal qui contient WP-CLI (celui de votre éditeur n’y accède pas directement) et exécutez les instructions suivantes :

Shell

C’est grâce aux 2 sous-commandes make-php et make-json de la commande i18n de WP-CLI que va opérer la magie !

Leur rôle est de générer les fichiers .php et .json de chaque bloc dans le dossier /languages/.

D’ailleurs, les noms de fichiers JSON suivent le modèle : {texdomain}-{lang}-{md5}.json. WordPress génère automatiquement un md5 du nom du script rattaché au bloc, mais d’après la documentation, vous pourriez avoir un nom plus explicite. Cela dit, ça n’a pas d’intérêt puisque la génération est automatisée ici.

WP-CLI est un outil très puissant d’automatisation pour les agences. Si vous ne connaissez pas encore, consultez la documentation globale. Vous verrez que vous pouvez installer WordPress, des extensions, modifier des options, remplacer des URL… et bien d’autres grâce à lui.

Et si vous voulez en savoir plus sur les commandes i18n, consultes les documentations de make-php et make-json.

Conseil

WP-CLI peut vous faire gagner énormément de temps en automatisant certaines tâches répétitives de WordPress grâce aux lignes de commande, que vous pourriez très bien intégrer dans votre process de CI/CD par exemple.

Lier les traductions JS aux blocs

Tout est presque prêt pour afficher nos traductions. Mais il reste une dernière étape : on va devoir lier les traductions à nos blocs.

verrouillé Vidéo premium

Cette vidéo est réservée aux détenteurs de l’offre premium.
Envie de nous rejoindre ?

Choisir une formule

Pour cela, on va ajouter ce code, branché sur le hook init de WordPress, dans le fichier PHP principal de notre extension :

PHP
plugin.php

C’est la fonction wp_set_script_translation() qui est la clé ici. Elle permet de lier notre fichier de traduction JSON au script qui pilote le bloc dans l’éditeur. Elle possède 3 paramètres :

  • $handle : le nom du script qui exécute le bloc dans l’éditeur ;
  • $textdomain : le text domain du bloc, qui est le même que l’extension ;
  • $path : le chemin vers le dossier de langues, dans notre cas /languages/.

Le handle est le nom unique donné au script. Problème : on ne le connait pas puisqu’il a été généré automatiquement par WordPress.

Heureusement pour nous, on va pouvoir le récupérer grâce à la fonction generate_block_asset_handle(). Cette fonction a 2 paramètres :

  • $block_name : le nom unique du bloc, tel que défini dans le block.json ;
  • $field_name : le type de script que l’on vise. Ici editorScript.

Dans cet exemple, j’ai mis le nom du premier bloc que l’on a réalisé : capitainewp/base.

On doit ensuite indiquer editorScript car dans le block.json, il nous arrive de définir plusieurs scripts :

JSON
block.json

Ce paramètre nous permet donc de cibler le bon handle de script.

Résultat : si on ajoute un var_dump() dans notre PHP, on verra que le handle affiché est : capitainewp-base-editor-script.

Parfait ! Les traductions vont fonctionner… mais pour notre premier bloc uniquement. Maintenant, on ne va pas faire ça à la main pour chaque bloc : on va automatiser.

Information

Si vous avez déclaré un script pour l’Interactivity API et que celui-ci affiche de chaînes de texte en front, il faudra également le déclarer avec wp_set_script_translations() mais avec la valeur viewScriptModule cette fois.

Une boucle pour tous les blocs de notre extension

Pour lier les traductions à chacun de nos blocs automatiquement, on va écrire une fonction qui va charger toutes les traductions de blocs pour nous ! Voici le code :

PHP
plugin.php

On commence par charger le manifeste PHP qui contient la liste de tous les blocs. Pour rappel, ce fichier est généré automatiquement à la compilation de create-blocks.

On va ensuite itérer dans chaque bloc. On commence par vérifier que le bloc a bien son script editorScript, pour éviter de générer des erreurs. En théorie, ce sera toujours le cas puisque c’est le script qui permet d’afficher le bloc dans l’éditeur. Sans lui, pas de bloc, mais restons prudents !

Ensuite, on utilise la fonction wp_set_script_translations() en définissant :

  • Le bon handle à partir du nom du bloc via $block_data['name'] ;
  • Le textdomain ne change pas d’un bloc à l’autre ;
  • Ni le dossier des langues qui sera toujours /languages/.

Information

WordPress sait automatiquement quel JSON rattacher à chaque bloc, grâce au md5 dans le nom de fichier.

On peut vérifier dans l’inspecteur lorsqu’on est dans l’interface de Gutenberg :

L'inspecteur du navigateur montre bien les traductions affichées juste avant l'appel du script du bloc dans le HTML.
Les traductions apparaissent bien juste avant l’appel du script

Ici, on voit que les traductions sont listées juste avant l’appel du script qui exécute le bloc dans l’éditeur. Et il n’y a que les traductions concernant ce bloc en particulier !

Ok, quelle aventure ! Avec tout ça, bonne nouvelle, vos traductions devraient apparaître dans l’éditeur.

Résoudre les problèmes

Ça ne fonctionne pas ? C’est pas de chance hein ! Heureusement, j’ai quelques astuces pour vous aider.

verrouillé Vidéo premium

Cette vidéo est réservée aux détenteurs de l’offre premium.
Envie de nous rejoindre ?

Choisir une formule

Vider la build et redémarrer le compilateur

Première règle en informatique : dans le doute, reboot ! Si ça ne fonctionne pas :

  1. coupez le compilateur avec « CTRL + C » ;
  2. Profitez-en pour vous rendre dans le dossier /build/ et videz tout ;
  3. Faites de même dans /languages/. Vous pouvez toutefois omettre le .pot et les .po pour éviter d’avoir à refaire toutes les traductions.
  4. Redémarrez le compilateur avec la commande npm start.

En général, ça devrait faire ses preuves !

Vérifier le textdomain

Mais si ça ne fonctionne toujours pas, vérifiez que vous avez indiqué le bon text domain de partout :

  • Au début du plugin dans les commentaires ;
  • Dans la fonction wp_set_script_translations() ;
  • Dans les chaînes PHP et JS des blocs…

La moindre petite inconsistance dans votre code pourrait avoir des effets néfastes.

Attention

Mettez toujours le text domain sous forme d’une chaîne de caractères lisible, par exemple "capitainewp-blocks". Ne mettez jamais une variable (ou constante) à la place dans l’espoir de gagner du temps, car les outils de parsing des traductions ne fonctionneraient plus correctement.

Vérifier les noms des dossiers

Personnellement, j’ai perdu une journée car j’avais mis des espaces dans mes noms de dossiers de blocs dans /src/. Pourtant la règle est toute simple, c’est la même qu’avec les slugs :

  • Pas d’accent ;
  • Pas de caractère spécial ;
  • Pas d’espace.

Même si ça ne pose pas de problème pour le compilateur, et que vos blocs fonctionneront dans l’éditeur, les traductions, elles, ne fonctionneront pas !

On résume le tout

Bravo, vous avez survécu jusque là. Je vous avoue que cette histoire d’internationalisation n’est pas simple du tout. J’ai moi-même passé plusieurs jours, malgré les documentations, à comprendre tous les mystères avant de trouver la bonne approche.

verrouillé Vidéo premium

Cette vidéo est réservée aux détenteurs de l’offre premium.
Envie de nous rejoindre ?

Choisir une formule

On va donc résumer toutes les étapes :

La première fois uniquement

La toute première fois, il faudra d’abord ajouter le Domain Path dans le fichier PHP principal du plugin, et vérifier le Text Domain :

PHP
plugin.php

Ensuite, il faudra ajouter la fonction universelle pour lier les traductions aux scripts des blocs :

PHP
plugin.php

Dans vos blocs, importez la fonction __() de traductions de vos chaînes et utilisez-les partout où vous avez un texte statique à traduire :

JSX
edit.js

Une fois vos blocs créés, il faudra lancer quelques commandes grâce à WP-CLI :

Shell
Terminal WP-CLI

Enfin, on traduit les chaînes grâce à Loco Translate qui s’occupe de générer les fichiers JSON et PHP contenant les traductions.

Si vous préférez utiliser PoEdit, il faudra alors lancer quelques dernières commandes :

Shell
Terminal WP-CLI

Avec ça, vos traductions doivent fonctionner !

Les fois suivantes

Lorsque vous ajouterez de nouvelles chaînes dans vos blocs, il faudra mettre à jour le catalogue et les fichiers de traductions. Voici la méthodologie :

Commencez tout d’abord par mettre à jour le catalogue .pot en relançant la commande :

Shell
Terminal WP-CLI

Allez ensuite dans Loco Translate et cliquez sur « Synchroniser », puis traduisez les nouvelles chaînes qui devraient apparaître dans la liste :

Le bouton permettant de synchroniser les chaînes du catalogue .pot vers la traduction de la langue en cours.
Le bouton « Synchroniser » ajoute les nouvelles chaînes du catalogue vers votre fichier de langue .po

Concrètement, Loco translate va lire le catalogue .pot pour récupérer les chaînes manquantes et les ajouter à votre langue en cours dans le .po pour que vous puissiez les traduire.

Enfin, si vous n’utilisez pas Loco translate, générez à la main les fichiers de traduction :

Shell
Terminal WP-CLI

Et voilà, vous avez votre procédure pour mettre à jour vos traductions à tout moment !

Attention

Pensez bien à regénérer le catalogue et les fichiers de traductions pour prendre en compte toute nouvelle chaîne ajoutée récemment dans vos blocs.

Extensions à destination du répértoire WP

Si vous réalisez une extension gratuite ou freemium à destination du répertoire des extensions de WordPress, tout va être beaucoup plus simple.

verrouillé Vidéo premium

Cette vidéo est réservée aux détenteurs de l’offre premium.
Envie de nous rejoindre ?

Choisir une formule

En effet, WordPress dispose d’une interface, GlotPress, qui permet de traduire en ligne les chaînes PHP et JS de votre extension, permettant ainsi à la communauté de contribuer à la traduction de votre extension.

Voici à quoi ressemble l’interface :

Le site wordpress.org permet de traduire les chaînes des extensions directement en ligne.
L’interface de traduction en ligne des extensions WordPress

Il faudra par contre demander à des modérateurs de valider vos traductions (même si c’est votre extension) et il faudra bien respecter quelques règles typographiques.

Vous pourrez demander une vérification et une validation de vos traductions sur le Slack WordPress Francophone, dans le channel #traductions.

Le Slack WordPress FR regroupe la communauté française des contributeurs à la traduction dans le salon #traductions.
Le channel #Traductions, d’où vous pourrez demander la validation de vos traductions

Du coup, dans ce cas de figure, vous n’aurez pas besoin de définir le Domain Path dans votre fichier PHP principal :

PHP
plugin.php

On fait cela car WordPress enverra les traductions de l’extension au site automatiquement et dans le dossier /wp-content/languages/.

Le saviez-vous ?

En séparant les traductions de l’extension, WordPress permet à un site de télécharger de nouvelles traductions sans attendre une nouvelle mise à jour de l’extension. Malin !

Ensuite, il faudra simplifier la fonction de liaison des traductions au bloc :

PHP
plugin.php

Plus besoin de charger les traductions pour chaque bloc, WordPress s’occupe de tout. Et normalement, tout est bon !

Attention

Ceci est valable pour les plugins gratuits et freemium uniquement. WordPress n’hébergeant pas les extensions payantes, il faudra vous occuper de leur extension vous-même, comme on l’a vu dans ce cours.

Conseil

N’hésitez pas à contribuer sur d’autres extensions, si l’envie vous prend de les traduire. De cette manière, votre effort profitera à toute la communauté francophone !


Ce cours était intense, et beaucoup se sont cassé les dents sur cette internationalisation des blocs, à cause de changements de fonctionnements à répétition au fil des années et une documentation pas toujours à jour.

Avec la méthode présentée dans ce cours, vous devriez vous en sortir sans problème !

Dans le prochain cours, on va voir comment déployer notre extension en production mais aussi comment ajouter notre extension sur le répertoire officiel de WordPress.

23

Questions, réponses et commentaires

  1. David Dufour

    Le 29 avril 2021

    J’ai fait tout ça. Ceci a généré un fichier json par bloc (J’en ai 2) et j’ajoute wp_set_script_translations pour chaque bloc. Cependant, ma traduction ne fonctionne pas plus. Une idée?

    1. Maxime BJ

      Le 29 avril 2021

      Normalement, tu ne devrais avoir qu’un seul wp_set_script_translations dans ton extension. Vérifie que tu as bien un fichier dans /build/index.asset.php

      1. David Dufour

        Le 30 avril 2021

        Même si j’ai plusieurs fichiers de blocs. La commande qui génère des fichiers json pour les langues a créé 2 fichiers. Et on doit passer le $handle
        (string) (Required) Script handle the textdomain will be attached to.

        1. Maxime BJ

          Le 30 avril 2021

          Oui car au final il n’y a qu’un seul script compilé à la fin pour l’ensemble de tes blocs, donc un seul appel aux traductions. Ensuite, il ira chercher le bon json en fonction du bon bloc et de la langue.

  2. David Dufour

    Le 30 avril 2021

    Voici mon code avec la modification que tu as parlé:

    function register_scripts_block_editor_assets(){
    if ( ! function_exists( ‘register_block_type’ ) ) {
    // Gutenberg is not active.
    return;
    }

    $dir = CHACHA_FOLDER . ‘/assets/js/blocks/’;
    $blocks = array_filter( glob( $dir.’*’ ), ‘is_file’ );
    foreach( $blocks as $block ){
    $type = str_replace( $dir,  », $block );
    $type = str_replace( ‘.js’,  », $type );
    wp_enqueue_script(
    $type,
    plugins_url( ‘/assets/js/blocks/’.$type.’.js’, CHACHA_FILE ),
    [ ‘wp-edit-post’, ‘wp-i18n’ ],
    CHACHA_VERSION
    );
    }

    // Add language json file to script
    wp_set_script_translations( ‘column’, ‘chacha-gutenberg’, plugin_dir_path( __FILE__ ) . ‘lang’ );
    }

    1. Maxime BJ

      Le 30 avril 2021

      En fait, tu ne dois pas toucher le reste du code (généré par create-block) en dehors du paramètre que j’ajoute dans wp_set_script_translation. Le reste est déjà bon et fonctionnel de base.

      1. David Dufour

        Le 30 avril 2021

        Tu as un moyen qu’on puisse se parler plus efficacement?
        Btw, j’apprécie énormément ton aide. Nous sommes nouveau sur Gutenberg et nous aimons beaucoup le concept.

        1. Maxime BJ

          Le 30 avril 2021

          J’ai fait un channel #capitainewp sur le slack WordPress FR si jamais. Je ne suis pas hyper dispo en ce moment mais ce sera plus simple pour partager ton code. Essaie de voir si la traduction fonctionne avec mon plugin de ressources (dispo en début de formation) car j’avais fait la bonne config et tu devrais pouvoir comparer pour voir où ça plante.

  3. Pierre Lejeune

    Le 13 mai 2022

    Bonjour capitaine,

    Afin d’améliorer un plug-in de blocs customisés Gutenberg, je me suis penché sur l’internationalisation de contenu en suivant ton article.

    Tout fonctionne à merveille mais je m’interroge sur la commande que tu partages en fin d’article : « wp i18n make-json capitainewp-gut-bases-fr_FR.po –no-purge »… Il ne manque pas un tiret à l’option « -no-purge » ?
    WP-CLI ne reconnaît pas « -no-purge » comme option de commande, mais comme argument pour le répertoire de destination, ce qui est particulièrement gênant puisque non seulement, le fichier de destination n’a pas/peu de sémantique, mais en plus le fichier « .po » est « purgé ».

    Pour le reste, rien à redire ! Je te remercie pour tes contenus de qualités !

    1. Maxime BJ

      Le 13 mai 2022

      Oui en effet, c’est bien un double tiret qu’il faut mettre. C’est ce que j’ai mis dans l’éditeur, mais pour une raison obscure l’un d’entre-eux est supprimé à l’affichage en front.

  4. Romain

    Le 27 octobre 2022

    En créant avec guten-block, il y a une erreur sur le handle du Script dans le tuto. Ce n’est pas // slug du plugin suivi de block-editor mais suivi de -editor-script.
    Après j’ai les étapes décrites, j’arrive à entrer des traductions pour le script, mais ça n’affiche pas les traductions. 🙁

    1. Romain

      Le 27 octobre 2022

      Le gros problème, c’est que Loco translate, comme la ligne de commande, ne ciblent pas le fichier .js sorti par le processus de transcompilation. Au lieu de ça ils pointent vers les sources, lesquelles ne sont jamais chargées. Que faire ?

      1. Maxime BJ

        Le 30 octobre 2022

        Avant de générer le .js, tu vas générer le .pot, c’est lui qu’il faut regarder pour voir toutes les chaines. Tu peux utiliser POEdit si Loco ne fait pas l’affaire.

      2. Romain

        Le 27 octobre 2022

        Du coup, la seule solution qui a abouti est de réunir les fichiers json en seul, et de remplacer le md5 par le handle du script compilé. Le hook est ici. https://localise.biz/wordpress/plugin/hooks/loco_compile_single_json

        Maintenant, j’aimerai vraiment beaucoup comprendre la méthode qui semble standard.

        Qu’est-ce qu’il faut faire pour que wp_set_script_translations envoie bien les fichiers de traduction au script?

        Le répertoire des langues est le bon, les fichiers .json sont là mais rien ne charge.

        1. Maxime BJ

          Le 30 octobre 2022

          Avec la technique officielle, tu n’as pas besoin de solutions tierces pour t’en sortir. Certes c’est un peu complexe et un peu chiant, mais ça doit fonctionner si tu suis bien toutes les étapes.

  5. Klemart3D

    Le 23 novembre 2022

    Par défaut, l’installation de wp-cli par un gestionnaire de paquet (type brew sur macOS) installe la dernière version de php (8.1 à ce jour) mais l’exécution de la commande de traduction génère des erreurs de ce type :
    `Deprecated: preg_split(): Passing null to parameter #3 ($limit) of type int is deprecated` ou `Parse error: syntax error, unexpected fully qualified name « \Syntax\Node\Expression », expecting « , » or « ; »`
    En repassant sur une version php antérieure (ex 7.4) cela fonctionne correctement.

  6. Thanh

    Le 1 mars 2023

    Hello,

    j’ai refait la manipulation plusieurs fois, et rien n’y fait. Mon interface n’est pas traduite une fois que j’ai passé l’étape de génération des JSON.

    Dans d’autres tuto sur le net, il est parfois question de faire appel à la fonction load_plugin_textdomain();

    Est-qu’il existe un dépôt github pour voir l’ensemble des fichiers du plugins ?

    Merci !

    1. Maxime BJ

      Le 1 mars 2023

      Il se peut qu’il y ait eu (encore) des changements de ce côté là. Je t’invite à regarder la documentation officielle pour voir s’ils expliquent autre chose : https://developer.wordpress.org/block-editor/how-to-guides/internationalization/.

      Mais on est d’accord, c’est pas aussi simple que ça le devrait.

      1. Thanh

        Le 3 mars 2023

        Merci beaucoup, je vais refaire une passe alors 🙂

  7. Valentin

    Le 27 avril 2023

    Bonjour,
    après avoir suivit la formation, j’essaie depuis quelque jours de traduire le plugin de block gutenberg. J’ai repris ton dépôt github, ajouté les quelques lignes appelant la fonction wp_set_script_translations() et j’ai traduit quelques chaines avec loco-translate. J’arrive à traduire les termes PHP mais ceux dans les fichiers (index, edit, save) ne se traduisent pas. J’ai vu que loco-translate génère beaucoup de fichiers .json, je ne sais pas si ça pose problème. As tu une idée de pourquoi la traduction n’est pas prise en compte dans le plugin ?

    1. Maxime BJ

      Le 27 avril 2023

      Peut-être que la procédure officielle a changé (ça change souvent, c’est dur à suivre). Dans le précédent commentaire, j’ai mis le lien vers la documentation officielle. Il y aura peut-être un indice. En tous cas c’est normal qu’il y ait beaucoup de fichiers json générés oui. C’est comme ça que sont livrées les traductions en JS.

  8. Joffrey

    Le 2 septembre 2023

    De mon côté j’ai rencontré un problème un peu bizarre, la traduction de mes blocs ne fonctionnait pas.

    J’ai fait plusieurs erreurs :
    – générer le fichier .pot à partir de PoEdit
    – je n’avais pas déclaré `wp_set_script_translations` pour chaque bloc

    Problème rencontré : la commande `wp i18n make-json` générait 2 fichiers json pour chacun de mes bloc.
    En fait cette commande créait un fichier différent pour chaque fichier js contenant des chaines à traduire.
    En comparant les hash générés, j’ai pu déterminer qu’ils correspondaient au fichiers suivant pour chacun de mes blocs :
    `./src/block-name/index.js` et `./src/block-name/edit.js`

    Du coup WP ne pouvait pas afficher mes traductions car il cherchait un fichier .json avec un hash correspondant au fichier `./build/block-name/index.js`

    Bref, mes conseils pour faire en sorte que ça marche si vous avez des soucis :

    **N’UTILISEZ PAS PoEdit pour créer votre fichier textdomain.pot**
    **Excluez le répertoire `./src` lorsque vous créez le fichier `.pot`**

    1) Créez le fichier .pot à partir de la commande `wp i18n make-pot` et excluez le répertoire `./src`
    Exemple : `wp i18n make-pot ./ ./languages/textdomain-blocks.pot –exclude=’src’`

    2) Mettez à jour vos fichiers .po à partir du fichier `textdomain-blocks.pot` que vous venez de créer (vous pouvez utiliser PoEdit ici)

    3) Passez en revue / mettez à jour les traductions dans vos fichiers .po

    4) Supprimez tous les fichiers de traduction .json du répertoire de langue de votre plugin/thème

    5) Exécutez la commande `wp i18n make-json textdomain-fr_FR.po –no-purge`

    6) Dans votre code, assurez-vous d’appeler la fonction `wp_set_script_translations` pour chaque bloc que vous avez avec le bon handle : block name (‘name’) dans le fichier block.json où il faut remplacer le `/` par `-`.
    Vous pouvez utiliser cette fonction pour le faire : `generate_block_asset_handle( ‘textdomain/mon-bloc-1’ );` donnera ‘textdomain-mon-bloc-1’ à utiliser dans la fontion `wp_set_script_translations`
    Exemple :
    wp_set_script_translations( ‘textdomain-mon-bloc-1’, ‘textdomain’, plugin_dir_path( __FILE__ ) . ‘languages’ );
    wp_set_script_translations( ‘textdomain-mon-bloc-2’, ‘textdomain’, plugin_dir_path( __FILE__ ) . ‘languages’ );

    Les traductions devraient fonctionner.

    1. Maxime BJ

      Le 3 septembre 2023

      Merci pour ta contribution. Il faut que je revois ce cours en effet, ça doit être plus stable aujourd’hui pour les traductions. C’était encore un peu chaotique à l’époque où j’ai écris ces cours.

Laisser un commentaire