« Zusammenfassung der Bestellung » s’affichait à la place de « Résumé de la commande » sur l’écran de paiement d’un client francophone de la boutique d’artisanat Laine et Chêne, qui vend des articles en bois et en laine à travers plusieurs pays européens. Le site WordPress, pourtant traduit en quatre langues avec Polylang, laissait échapper cette dernière étape du tunnel d’achat vers une langue qui n’était pas celle du visiteur.
Ce symptôme, ponctuel en apparence, touchait en réalité une part significative des commandes internationales, l’écran de paiement s’affichant systématiquement dans la langue du siège du prestataire de paiement plutôt que dans celle du visiteur.
Symptôme : tout est traduit, sauf l’écran de paiement
Le catalogue, le panier, le formulaire de commande : tout s’affichait correctement dans la langue choisie par le visiteur jusqu’à l’étape précédant le paiement. Seul l’écran hébergé par le prestataire de paiement, où le visiteur saisit ses coordonnées bancaires, s’affichait systématiquement en allemand, quelle que soit la langue de navigation choisie sur le site.
Diagnostic : un paramètre de locale jamais transmis

L’inspection du code d’intégration a révélé que l’appel à l’API du prestataire de paiement, déclenché au moment de créer la session de paiement, ne transmettait aucun paramètre de langue. Le prestataire appliquait alors une langue par défaut définie au niveau du compte marchand, réglé sur l’allemand lors de la création du compte, sans lien avec la langue réellement affichée sur le site au moment de la commande.
// Avant correctif : aucune locale transmise
$session = $client->checkoutSessions->create([
'amount' => $order->get_total(),
'currency' => 'eur',
'success_url' => $order->get_checkout_order_received_url(),
]);
Correctif : transmettre la locale WordPress active
Le correctif consiste à récupérer la locale active au moment de la création de la commande, via determine_locale(), puis à la convertir au format attendu par l’API du prestataire, en règle générale un code ISO à deux lettres :
// Après correctif
$locale = substr( determine_locale(), 0, 2 );
$session = $client->checkoutSessions->create([
'amount' => $order->get_total(),
'currency' => 'eur',
'success_url' => $order->get_checkout_order_received_url(),
'locale' => $locale,
]);
La fonction determine_locale() tient compte du réglage multilingue actif sur le site, y compris lorsqu’il repose sur un sous-dossier ou un domaine distinct par langue, ce qui évite de coder en dur une correspondance entre URL et langue.
Prévention : tester jusqu’au bout du tunnel
Ce type d’erreur passe souvent inaperçu parce que les tests s’arrêtent au formulaire de commande, sans aller jusqu’à l’écran réel de saisie bancaire hébergé par le prestataire. La prévention la plus fiable consiste à intégrer un test de bout en bout, dans chaque langue supportée, jusqu’à l’affichage effectif de l’écran de paiement.
- Créer une commande de test dans chaque langue supportée par le site
- Aller jusqu’à l’écran de paiement hébergé, pas seulement jusqu’au formulaire
- Vérifier la locale transmise dans les journaux de l’appel API, pas seulement à l’affichage
Un tunnel d’achat n’est vraiment testé que lorsqu’on l’a suivi jusqu’à l’écran que le prestataire de paiement affiche lui-même, pas jusqu’à la dernière page que le site contrôle directement.
Ce que ce cas révèle plus largement
La frontière entre ce que le site WordPress affiche et ce qu’un service tiers affiche à sa place est souvent invisible pour l’équipe de développement, qui teste naturellement jusqu’où elle a la main. Chaque intégration de service externe dans un tunnel d’achat multilingue mérite une vérification explicite de la transmission de la langue, plutôt qu’une supposition qu’elle se propage automatiquement.
En résumé
Un récapitulatif de commande affiché dans la mauvaise langue signale presque toujours un paramètre de locale manquant dans un appel API vers un service externe, pas un problème de traduction du site lui-même. Vérifier ce paramètre, et tester chaque langue jusqu’à l’écran final du prestataire, évite ce genre de désagrément pour les visiteurs internationaux.