# Traduire les emails d’une extension tierce sans toucher à son code source

> Une extension de réservation envoyait ses emails de confirmation en anglais, sans option de traduction native. Voici la méthode pour les traduire sans modifier son code.

- Auteur : Clément Hadrot
- Publié le : 2025-11-19
- Mis à jour le : 2025-11-19
- Catégorie : Multilingue
- URL : https://wpmoderne.dev.wordpress-developpement.fr/multilingue/traduire-emails-extension-tierce-sans-code/

## L’essentiel

- Le problème vient de chaînes construites en PHP avec des variables interpolées
- La solution capture le HTML final de l'email plutôt que les chaînes sources
- La méthode fonctionne pour toute extension qui déclenche un hook avant envoi

Un centre de thalassothérapie utilise une extension de réservation en ligne pour gérer ses créneaux de soins, en complément de WooCommerce pour la vente de forfaits. Cette extension, développée par un petit éditeur spécialisé, envoie des emails de confirmation de réservation entièrement codés en dur en anglais dans son code PHP, sans aucune option de traduction native ni fichier `.pot` exploitable par un système classique de traduction WordPress.

Contrairement au cas des emails WooCommerce natifs, déjà traités par ailleurs, cette extension ne s'appuie pas sur le système de templates surchargeables de WooCommerce ni sur des fonctions `__()` correctement internationalisées : les chaînes sont construites directement par concaténation dans une fonction PHP unique, ce qui rend impossible toute traduction par les moyens habituels (fichier de langue, String Translation classique sur des chaînes isolées).

## Pourquoi les méthodes habituelles ne fonctionnaient pas

Un extrait du code source de l'extension (consulté avec l'accord du client, dans le cadre du contrat de maintenance) montrait le problème concret :

```
function envoyer_email_confirmation( $reservation ) {
    $corps = 'Hello ' . $reservation['prenom'] . ',' . "\n\n";
    $corps .= 'Your booking for ' . $reservation['soin'] . ' on ' . $reservation['date'] . ' is confirmed.';
    wp_mail( $reservation['email'], 'Booking confirmation', $corps );
}
```

Chaque chaîne est mélangée à des variables dynamiques (prénom, soin, date), ce qui empêche d'enregistrer « Hello » et « is confirmed » comme deux chaînes traduisibles séparées via l'API de String Translation classique : le contexte grammatical se perdrait à la traduction, en particulier vers des langues où l'ordre des mots diffère du français ou de l'anglais.

## La méthode retenue : intercepter le HTML final

> L'essentiel à retenir : Le problème vient de chaînes construites en PHP avec des variables interpolées ; La solution capture le HTML final de l'email plutôt que les chaînes sources ; La méthode fonctionne pour toute extension qui déclenche un hook avant envoi

Plutôt que de chercher à traduire des fragments de chaînes, nous avons choisi d'intercepter le contenu complet de l'email juste avant son envoi, via le hook `wp_mail`, natif à WordPress et déclenché par n'importe quel appel à `wp_mail()` quelle que soit son origine :

```
add_filter( 'wp_mail', function ( $args ) {
    if ( 'Booking confirmation' !== $args['subject'] ) {
        return $args;
    }

    $langue = apply_filters( 'wpml_current_language', null );

    if ( 'fr' === $langue ) {
        $args['subject'] = 'Confirmation de votre réservation';
        $args['message'] = traduire_email_reservation_fr( $args['message'] );
    }

    return $args;
}, 20 );
```

La fonction `traduire_email_reservation_fr()` applique une série de remplacements par expressions régulières sur des motifs stables du gabarit anglais, en préservant les variables dynamiques :

```
function traduire_email_reservation_fr( $message ) {
    $message = preg_replace(
        '/Hello ([^,]+),/',
        'Bonjour $1,',
        $message
    );

    $message = preg_replace(
        '/Your booking for (.+) on (.+) is confirmed\./',
        'Votre réservation pour $1 le $2 est confirmée.',
        $message
    );

    return $message;
}
```

### Le point délicat : trouver le bon hook

Le hook `wp_mail` a été préféré à `wp_mail_content_type` ou à une surcharge de `wp_mail()` elle-même, car il permet de modifier l'ensemble des arguments (sujet, corps, destinataire, en-têtes) en un seul point d'entrée, sans dépendre de la manière dont l'extension appelle la fonction en interne. C'est aussi le point d'interception le plus stable dans le temps : il fait partie du cœur de WordPress et n'est pas concerné par les mises à jour de l'extension tierce.

## Variantes selon la robustesse recherchée

- **Site avec deux langues seulement** : la méthode par expressions régulières présentée ici suffit largement, à condition de documenter précisément les motifs attendus ;
- **Site avec plus de trois langues** : préférer un tableau de correspondance de motifs par langue plutôt que d'empiler des fonctions `traduire_email_reservation_xx()` séparées, pour centraliser la maintenance ;
- **Extension mettant à jour régulièrement ses gabarits d'email** : ajouter un test automatisé qui envoie un email de test après chaque mise à jour de l'extension, pour vérifier que les motifs de correspondance n'ont pas changé.

## Limites de la méthode

Cette approche reste fragile face à une mise à jour de l'extension qui changerait la formulation anglaise du gabarit : une simple modification de ponctuation suffirait à casser la correspondance par expression régulière, sans erreur visible autre qu'un email qui repasserait silencieusement en anglais. Nous avons donc ajouté une alerte de supervision qui journalise chaque email dont le remplacement n'a pas abouti, pour détecter rapidement une régression après mise à jour de l'extension.

> Intercepter le résultat final plutôt que la source est souvent la seule option face à une extension fermée, mais cette solution doit toujours être accompagnée d'une supervision, faute de quoi elle se dégrade silencieusement à la première mise à jour.

## En résumé

Sans toucher une seule ligne du code de l'extension, ce site propose désormais des emails de confirmation entièrement traduits en français pour ses clients francophones. La méthode, bien que moins élégante qu'une traduction native, présente l'avantage de fonctionner avec n'importe quelle extension tierce du moment qu'elle utilise la fonction standard `wp_mail()` de WordPress, ce qui couvre la grande majorité des cas rencontrés en pratique.
