Le WordPress d'aujourd'hui, décodé pour les développeurs

Multilingue

determine_locale : comment WordPress choisit la langue avant un plugin

Avant qu'un plugin multilingue n'entre en jeu, un filtre du cœur a déjà tranché la langue. Voici son fonctionnement exact et l'ordre de priorité qu'il applique.

Par WordPress Développement • 4 juillet 2020 • 4 min de lecture • Aucun commentaire
determine_locale : comment WordPress choisit la langue avant un plugin

Comment WordPress décide-t-il, dès les premières lignes de wp-settings.php, quelle langue servir à un visiteur, alors qu’aucun plugin de traduction n’est encore chargé ? La réponse tient dans une fonction du cœur, determine_locale(), qui tranche la question bien avant que WPML, Polylang ou tout autre outil n’ait la moindre chance d’intervenir.

Cette fonction est peu documentée pour ce qu’elle fait réellement : elle ne traduit rien, elle choisit seulement un identifiant de langue (une chaîne comme fr_FR ou en_US) qui servira ensuite de base à tout le reste du chargement des traductions. Comprendre son ordre de priorité évite bien des surprises quand un plugin multilingue semble « ignoré » sur certaines pages.

Ce que fait réellement determine_locale()

La fonction est appelée très tôt, avant le chargement des extensions actives, depuis wp-includes/l10n.php. Son rôle est simple à énoncer : renvoyer une chaîne de locale unique qui sera utilisée pour charger les fichiers .mo correspondants. Elle applique un ordre de priorité fixe :

  • la variable de requête l, si elle est présente et qu’il s’agit d’un contexte d’administration ou de connexion
  • la locale associée à l’utilisateur connecté, stockée en base dans les métadonnées utilisateur
  • la locale générale du site, définie dans les réglages ou par la constante WPLANG

Ce classement explique un comportement souvent mal compris : un utilisateur connecté avec une préférence de langue personnelle verra cette préférence l’emporter sur la langue par défaut du site, même sur le front, dans certains contextes.

Le filtre determine_locale et son point d’entrée

Le filtre porte le même nom que la fonction qui l’expose : determine_locale. Il reçoit la locale calculée par le cœur et permet de la remplacer entièrement. C’est ce point précis que les extensions multilingues accrochent pour imposer leur propre logique, fondée sur l’URL, un cookie ou un sous-domaine.

add_filter( 'determine_locale', function( $locale ) {
    if ( isset( $_COOKIE['site_lang'] ) ) {
        $allowed = array( 'fr_FR', 'en_US', 'es_ES' );
        if ( in_array( $_COOKIE['site_lang'], $allowed, true ) ) {
            return $_COOKIE['site_lang'];
        }
    }
    return $locale;
}, 20 );

Le paramètre de priorité compte ici davantage que d’habitude : un plugin de traduction accroche presque toujours ce filtre à une priorité élevée, précisément pour passer après la logique par défaut et avoir le dernier mot. Un filtre maison ajouté sans réfléchir à la priorité peut donc être écrasé silencieusement.

L'essentiel à retenir : Le filtre determine_locale s'exécute avant les plugins de traduction ; La variable de requête l passe devant le cookie et l'utilisateur ; Trois sources de langue, un seul filtre pour arbitrer

Pièges observés en pratique

Un cache de page qui fige la locale

Le filtre s’exécute à chaque requête PHP, mais si une page complète est servie depuis un cache statique (fichier HTML généré), la locale calculée au moment de la génération reste figée dans le contenu servi. Le symptôme classique : un visiteur change de langue via un cookie, mais reçoit toujours la version mise en cache dans l’ancienne langue jusqu’à expiration du cache.

Confusion entre locale du site et locale de l’utilisateur

Sur un site multi-auteurs, chaque compte peut avoir sa propre langue d’administration, réglée dans son profil. Cette langue n’a aucun rapport avec la langue affichée au public : elle ne s’applique qu’à l’interface d’administration, jamais au contenu du site vitrine. Confondre les deux mène à des correctifs appliqués au mauvais endroit.

Cas d’usage légitimes d’un filtre maison

Écrire son propre filtre sur determine_locale a du sens pour des besoins simples : un site bilingue sans catalogue de contenu à dupliquer, où seule l’interface change (libellés, formulaires, notifications), peut se contenter de ce mécanisme sans installer d’extension complète. C’est un choix pertinent quand le contenu éditorial reste identique dans les deux langues et que seule la coquille change.

Avant d’ajouter un filtre sur determine_locale, vérifiez toujours qu’aucune extension active n’accroche déjà ce hook : deux filtres concurrents à la même priorité produisent un résultat imprévisible selon l’ordre de chargement des extensions.

En résumé

Le filtre determine_locale est le point d’entrée le plus bas niveau pour influencer la langue d’un site WordPress, bien avant qu’un plugin de traduction ne prenne le relais. Sa priorité d’exécution, la distinction entre locale utilisateur et locale de site, et l’interaction avec un éventuel cache de page sont les trois points à vérifier en premier lorsqu’un comportement de langue semble incohérent. Maîtriser ce mécanisme du cœur rend le diagnostic des problèmes multilingues nettement plus rapide, quelle que soit l’extension utilisée par la suite.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi