vendredi 25 septembre 2026

À propos

Contact

Tests

Détecter les traductions manquantes d’une extension avec une règle CI

Une chaîne visible sans équivalent traduit finit toujours par être repérée par un client, jamais par contrôle interne. Une étape de pipeline automatise cette vérification.

Par Clément Hadrot • 8 mai 2022 • 4 min de lecture • Aucun commentaire
Détecter les traductions manquantes d'une extension avec une règle CI

Une extension de réservation de salles que nous livrons en français, anglais, néerlandais et allemand a reçu une réclamation d’un client belge : l’interface affichait par endroits des chaînes en anglais brut au milieu d’une interface néerlandaise. En creusant, dix-huit chaînes ajoutées lors des trois dernières mises à jour n’avaient jamais été transmises au traducteur, faute de processus systématique pour détecter ce type d’oubli avant publication.

Le contrôle manuel — relire chaque fichier .po à l’œil pour vérifier sa complétude — ne passe pas à l’échelle dès que plusieurs langues et plusieurs mises à jour se succèdent. Une étape de pipeline automatisée règle le problème une bonne fois.

Étape 1 — Régénérer le fichier .pot de référence

Le fichier .pot (Portable Object Template) contient l’ensemble des chaînes traduisibles détectées dans le code source, généré via WP-CLI :

wp i18n make-pot . languages/reservation-salles.pot --domain=reservation-salles

Cette commande scanne le code à la recherche de tous les appels à __(), _e(), _x() et leurs variantes, en s’appuyant sur le textdomain déclaré.

Étape 2 — Comparer chaque fichier .po au .pot de référence

L’outil msgcmp, fourni avec Gettext, compare deux fichiers de traduction et signale les chaînes présentes dans l’un mais absentes de l’autre :

#!/usr/bin/env bash
set -euo pipefail

wp i18n make-pot . /tmp/reference.pot --domain=reservation-salles --skip-js

for fichier_po in languages/*.po; do
  echo "Vérification de $fichier_po"
  msgcmp "$fichier_po" /tmp/reference.pot
done

msgcmp retourne un code de sortie non nul dès qu’une chaîne du .pot est absente du .po, ce qui suffit à faire échouer une étape de pipeline sans script d’analyse supplémentaire.

L'essentiel à retenir : Comparer les chaînes du fichier .pot aux fichiers .po livrés ; Faire échouer le pipeline sous un seuil de couverture défini ; Distinguer chaînes critiques et chaînes secondaires

Étape 3 — Définir un seuil plutôt qu’une exigence à 100 %

Exiger une traduction à 100 % dès l’ajout d’une chaîne bloquerait le pipeline entre le moment où un développeur ajoute une fonctionnalité et le moment où le traducteur externe la traite — un délai parfois de plusieurs jours. Une approche plus réaliste distingue deux niveaux de sévérité :

  • Une chaîne manquante dans une langue déjà annoncée comme « complète » sur le site de l’extension bloque le pipeline (régression sur un engagement existant).
  • Une chaîne manquante sur une traduction encore en cours ne bloque pas, mais génère un avertissement visible dans le rapport de pipeline.
if [ "$LANGUE_COMPLETE" = "true" ] && [ "$CHAINES_MANQUANTES" -gt 0 ]; then
  echo "::error::Traduction $fichier_po incomplète alors qu'elle est annoncée complète"
  exit 1
fi

Étape 4 — Intégrer la vérification au pipeline existant

name: Traductions

on: [pull_request]

jobs:
  verifier-traductions:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: sudo apt-get install -y gettext
      - run: wp i18n make-pot . /tmp/reference.pot --domain=reservation-salles
      - run: bash scripts/verifier-traductions.sh

Cas particulier des chaînes avec variables

Une vérification purement textuelle laisse passer un piège fréquent : une chaîne traduite dont l’ordre des espaces réservés (%s, %d) diffère de l’original, provoquant une erreur ou un texte incohérent à l’exécution. WP-CLI ne détecte pas ce cas par défaut ; une vérification complémentaire avec msgfmt --check permet de repérer les incohérences de formatage entre l’original et la traduction :

msgfmt --check-format languages/reservation-salles-nl_NL.po -o /dev/null

Une traduction manquante se voit tout de suite en recette côté client ; une traduction bancale avec un espace réservé mal placé se voit seulement en production, souvent après un message d’erreur incompréhensible pour l’utilisateur final.

Ce que cette vérification ne couvre pas

Cette règle contrôle la complétude et le formatage des fichiers de langue livrés, pas la déclaration correcte du textdomain lui-même dans l’en-tête du plugin ni son chargement via load_plugin_textdomain() — un problème différent, plus fondamental, qui empêcherait toute traduction de s’afficher même avec des fichiers .po parfaitement complets.

En résumé

Automatiser la détection des traductions manquantes transforme un contrôle qualité pénible et facilement oublié en une étape de pipeline silencieuse, qui ne se manifeste que lorsqu’un vrai problème existe. Sur l’extension de réservation de salles, cette règle a immédiatement révélé deux nouvelles chaînes non traduites ajoutées la semaine suivante — avant qu’aucun client ne les remarque cette fois.

Partager :

À propos de l'auteur

Clément Hadrot

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi