# gettext, le filtre méconnu qui permet de corriger une chaîne sans toucher au .po

> Une chaîne traduite gênante, venue d'une extension tierce, sans avoir à régénérer tout un fichier de traduction ni à forker le plugin. Le filtre gettext s'en charge.

- Auteur : WordPress Développement
- Publié le : 2021-01-29
- Mis à jour le : 2021-01-29
- Catégorie : Multilingue
- URL : https://www.wpmoderne.fr/multilingue/filtre-gettext-corriger-chaine/

## L’essentiel

- Le filtre gettext intercepte chaque chaîne juste avant affichage
- Fonctionne même sur les extensions dont on ne maîtrise pas le code
- Ne modifie ni le fichier .po ni le fichier .mo d'origine

`add_filter( 'gettext', 'corriger_ma_chaine', 10, 3 );` — cette seule ligne suffit à intercepter n'importe quelle chaîne traduite affichée par WordPress, y compris celles produites par une extension tierce dont le code source reste totalement intouché. C'est la solution la plus rapide face à une traduction maladroite, incohérente avec le vocabulaire du site, ou tout simplement fausse, sans passer par la case fichier de traduction.

Ce filtre existe depuis longtemps dans le cœur de WordPress, mais reste largement sous-utilisé, souvent parce que les développeurs pensent à tort qu'il faut nécessairement modifier un fichier .po pour corriger une chaîne, quitte à devoir maintenir un fork de plugin pour un simple mot mal choisi.

## Le problème typique : une chaîne qu'on ne peut pas éditer proprement

Imaginons une extension de formulaire de contact qui affiche « Envoyer le message » sur son bouton de soumission, alors que la charte éditoriale du site impose « Envoyer ma demande ». Éditer directement le fichier .po de l'extension fonctionne, jusqu'à la prochaine mise à jour du plugin, qui écrase purement et simplement ce fichier avec la version d'origine, faisant disparaître la correction sans prévenir personne.

Une extension de traduction visuelle complète peut résoudre ce cas, mais representerait un outil disproportionné pour corriger une seule chaîne. Le filtre `gettext`, lui, s'installe dans le thème actif ou une extension maison, survit à toutes les mises à jour du plugin ciblé, et ne touche à aucun fichier appartenant à ce plugin.

## Comment le filtre fonctionne réellement

Chaque fois que WordPress traduit une chaîne via `__()`, `_e()` ou leurs variantes, le résultat passe par le filtre `gettext` avant d'être renvoyé au code appelant. Ce filtre reçoit trois arguments : la traduction déjà appliquée, la chaîne source originale en anglais, et le domaine de texte du plugin ou thème d'origine.

> L'essentiel à retenir : Le filtre gettext intercepte chaque chaîne juste avant affichage ; Fonctionne même sur les extensions dont on ne maîtrise pas le code ; Ne modifie ni le fichier .po ni le fichier .mo d'origine

```
add_filter( 'gettext', 'wpm_corriger_bouton_contact', 10, 3 );

function wpm_corriger_bouton_contact( $traduction, $source, $domaine ) {
    if ( 'mon-plugin-contact' === $domaine
        && 'Envoyer le message' === $traduction ) {
        return 'Envoyer ma demande';
    }

    return $traduction;
}
```

La condition sur le domaine de texte n'est pas optionnelle : sans elle, le filtre s'appliquerait à toutes les chaînes du site portant exactement le même texte, y compris celles venant d'autres extensions ou du thème, ce qui pourrait provoquer des corrections indésirables ailleurs.

## Variante utile : cibler un pluriel avec ngettext

Pour les chaînes construites avec `_n()`, un filtre frère existe, nommé `ngettext`, qui reçoit un argument supplémentaire pour le nombre évalué. Il s'utilise exactement de la même manière, avec la même logique de vérification du domaine de texte avant toute substitution.

- `gettext` pour les chaînes simples issues de `__()` et `_e()`.
- `ngettext` pour les chaînes au pluriel issues de `_n()`.
- `gettext_with_context` pour les chaînes désambiguïsées avec `_x()`.

## Précautions avant de généraliser cette approche

Ce filtre reste un outil de correction ponctuelle, pas une méthode de traduction complète d'un plugin entier. Multiplier les conditions dans une même fonction pour corriger dix ou vingt chaînes différentes finit par produire un code difficile à maintenir, où chaque mise à jour du plugin ciblé impose de revérifier que les chaînes sources n'ont pas changé entre-temps.

> Un repère simple pour savoir quand s'arrêter : au-delà de trois ou quatre corrections sur un même plugin, il devient plus raisonnable de fournir un vrai fichier de traduction complémentaire plutôt que d'empiler les conditions dans un filtre.

## En résumé

Le filtre gettext offre une solution chirurgicale à un problème très courant : corriger une chaîne gênante sans dépendre d'un fichier de traduction fragile, écrasé à chaque mise à jour de l'extension d'origine. Utilisé avec parcimonie, en vérifiant toujours le domaine de texte concerné, il évite bien des forks de plugins pour un simple mot mal choisi dans une interface qu'on ne maîtrise pas entièrement.
