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.

É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.