vendredi 25 septembre 2026

À propos

Contact

Multilingue

Adresses postales multilingues : corriger le format d’affichage sur WooCommerce

Un client vend en France, en Allemagne et au Japon, et ses adresses de livraison s'affichent avec l'ordre américain. Voici comment corriger le format sans toucher aux traductions des emails.

Par Clément Hadrot • 25 mars 2022 • 5 min de lecture • Aucun commentaire
Adresses postales multilingues : corriger le format d'affichage sur WooCommerce

Un client vendant du mobilier sur mesure vers l’Allemagne, l’Espagne et le Japon nous a signalé un problème étrange : ses factures PDF affichaient « Musterstraße 12, 10115, Berlin » alors que le format allemand attendu place le code postal avant la ville, sur une ligne distincte. Le site tournait sous WPML avec trois langues actives, et l’équipe pensait naturellement à un souci de traduction. Ce n’en était pas un.

Le format d’une adresse postale dépend du pays de livraison, pas de la langue d’affichage du site. Un client japonais consultant la version anglaise du site doit tout de même voir son adresse dans l’ordre japonais si c’est vers le Japon que le colis part. Confondre les deux logiques est l’erreur la plus fréquente que nous corrigeons sur ce type de projet.

Comprendre où WooCommerce définit les formats d’adresse

WooCommerce embarque une classe WC_Countries qui contient une méthode get_address_formats(). Elle retourne un tableau associatif où chaque clé est un code pays ISO à deux lettres et chaque valeur une chaîne définissant l’ordre des champs :

public function get_address_formats() {
    return apply_filters('woocommerce_localisation_address_formats', array(
        'default' => "{company}\n{name}\n{address_1}\n{address_2}\n{city}\n{state}\n{postcode}\n{country}",
        'JP'      => "{postcode}\n{country}\n{state}\n{city}\n{address_1}\n{address_2}\n{company}\n{name}",
        'DE'      => "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{country}",
    ));
}

Ce tableau existe déjà pour une trentaine de pays sans qu’aucune configuration ne soit nécessaire. Le format japonais, par exemple, inverse complètement l’ordre par rapport au format par défaut : code postal et pays d’abord, nom du destinataire en dernier. C’est exactement ce que WooCommerce applique automatiquement dès que le pays de livraison sélectionné est « JP ».

Le vrai problème : un thème qui court-circuite le format

L'essentiel à retenir : Le format d'adresse dépend du pays livré, pas de la langue du site ; WooCommerce fournit déjà des formats par pays à activer ; Le filtre woocommerce_localisation_address_formats corrige les cas restants

Dans le cas de notre client, le thème avait été personnalisé pour afficher les adresses de facturation dans les emails de commande via un template surchargé (woocommerce/emails/email-addresses.php) qui concaténait les champs à la main, sans passer par WC()->countries->get_formatted_address(). Résultat : peu importe le pays de livraison, l’adresse s’affichait toujours dans l’ordre « nom, rue, ville, code postal, pays ».

La correction ne touche à aucune chaîne traduite : elle consiste à revenir à la fonction native, qui respecte déjà le format localisé :

<?php
$address = WC()->countries->get_formatted_address( $order->get_address( 'shipping' ) );
echo wp_kses_post( nl2br( $address ) );

Une fois ce template restauré, chaque pays de livraison retrouve son format correct sans intervention supplémentaire, quelle que soit la langue active grâce à WPML.

Ajuster ou ajouter un format non couvert

Certains pays ne sont pas listés dans le tableau par défaut, ou le format fourni ne correspond pas aux usages postaux réels souhaités par le client (par exemple un client suisse qui veut afficher le canton). Le filtre woocommerce_localisation_address_formats permet d’ajouter ou de surcharger une entrée sans toucher au cœur de WooCommerce :

add_filter( 'woocommerce_localisation_address_formats', function( $formats ) {
    $formats['CH'] = "{company}\n{name}\n{address_1}\n{address_2}\n{postcode} {city}\n{state}\n{country}";
    return $formats;
});

Les placeholders disponibles sont {name}, {company}, {address_1}, {address_2}, {city}, {state}, {postcode} et {country}. Le nom du pays affiché, lui, provient d’un tableau distinct que WPML String Translation peut traduire si besoin, mais ce sujet ne concerne pas la structure de l’adresse.

Variantes selon le contexte du projet

Trois situations reviennent régulièrement dans nos projets :

  • Vente B2B avec numéro de TVA : ajouter un placeholder personnalisé nécessite de passer aussi par woocommerce_formatted_address_replacements pour injecter la valeur correspondante.
  • Adresses de retrait en magasin : le format d’adresse du magasin reste fixe (celui du pays d’implantation), indépendamment du pays du client, ce qui appelle un traitement séparé du panier.
  • Export vers un transporteur tiers : certains connecteurs de transport (API dédiées) exigent leur propre structure de champs, distincte du format d’affichage WooCommerce ; ne pas réutiliser get_formatted_address() pour l’export API, seulement pour l’affichage.

Un piège avec les caractères d’adresse en alphabet non latin

Pour les livraisons vers le Japon, certains clients saisissent leur adresse en kanji dans le champ « adresse ligne 2 », en plus de la romanisation dans « adresse ligne 1 ». Le format japonais natif de WooCommerce gère très bien cette double ligne, à condition que le champ ne soit pas tronqué par une limite de caractères ajoutée côté thème — nous avons dû relever une limite fixée arbitrairement à 40 caractères sur ce projet.

Avant de soupçonner un problème de traduction sur une adresse mal affichée, vérifiez toujours si un template a été surchargé sans passer par get_formatted_address(). C’est la cause dans la grande majorité des cas que nous traitons.

En résumé

Le format postal d’une adresse WooCommerce se règle par pays de livraison, indépendamment de la langue du site, et WooCommerce couvre déjà nativement une trentaine de formats. Le vrai travail consiste souvent à s’assurer qu’aucun template personnalisé ne contourne la fonction native get_formatted_address(), et à compléter le tableau via le filtre dédié pour les pays absents ou les besoins spécifiques du client. La traduction des libellés d’adresse (nom du pays, mentions légales) reste un chantier séparé, à traiter avec WPML String Translation le cas échéant.

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