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

Multilingue

get_locale contre determine_locale : deux fonctions cœur confondues

Définition claire de la différence entre la locale courante renvoyée par get_locale et la locale déterminée par le contexte de requête via determine_locale.

Par Clément Hadrot • 18 janvier 2025 • 4 min de lecture • Aucun commentaire
get_locale contre determine_locale : deux fonctions cœur confondues

Quelle est la différence exacte entre get_locale() et determine_locale() ? La question paraît anodine, mais la confusion entre ces deux fonctions cœur de WordPress explique une bonne partie des filtres de langue qui, sur le papier, semblent corrects mais n’ont jamais l’effet attendu en pratique.

get_locale : une lecture de l’état déjà établi

get_locale() renvoie la locale actuellement active pour l’exécution en cours. C’est une fonction de lecture : elle consulte une variable globale déjà positionnée, éventuellement modifiée en cours de route par switch_to_locale(), mais elle ne décide de rien elle-même. Appeler get_locale() très tôt dans le cycle de chargement de WordPress, avant que cette valeur ait été établie pour la requête, peut renvoyer une valeur par défaut qui ne correspond pas encore à ce que verra finalement le visiteur.

add_action( 'plugins_loaded', function () {
    error_log( get_locale() ); // Peut déjà être fiable ici selon le contexte
} );

determine_locale : le calcul de cette valeur

determine_locale(), introduite plus tard dans le cœur de WordPress, est la fonction responsable du calcul initial de cette locale pour une requête donnée. Elle applique une série de règles : locale de l’utilisateur connecté le cas échéant, préférences du site, filtres personnalisés accrochés sur le filtre determine_locale lui-même. C’est cette fonction qui, en interne, alimente ensuite ce que get_locale() viendra lire.

add_filter( 'determine_locale', function ( $locale ) {
    if ( pll_current_language() ) {
        return pll_current_language( 'locale' );
    }
    return $locale;
} );
L'essentiel à retenir : get_locale lit un état déjà fixé pour la requête en cours ; determine_locale calcule cette valeur en amont, avant que l'état ne soit figé ; Confondre les deux mène à des filtres qui n'ont jamais l'effet attendu

Un plugin multilingue comme Polylang ou WPML s’accroche précisément à ce filtre determine_locale pour imposer sa propre logique de détection de langue, en fonction de l’URL ou du sous-domaine consulté, avant que le reste de WordPress ne commence à charger les fichiers de traduction correspondants.

Pourquoi confondre les deux mène à des bugs silencieux

L’erreur la plus fréquente consiste à ajouter un filtre sur determine_locale en pensant modifier un comportement déjà en place, ou inversement à essayer de modifier la locale via un filtre sur un hook qui s’exécute après que determine_locale a déjà fait son travail et que les fichiers de traduction ont déjà été chargés en conséquence. Dans ce second cas, la valeur renvoyée par get_locale() change bien apparemment, mais les traductions déjà chargées en mémoire restent celles de l’ancienne locale, ce qui produit un site à moitié traduit dans une langue, à moitié dans une autre.

Ordre d’exécution à retenir

  1. determine_locale() s’exécute en tout début de cycle de requête, avant le chargement des fichiers de traduction.
  2. WordPress charge les fichiers .mo correspondant à la locale déterminée.
  3. get_locale() devient fiable et reflète cette locale pour le reste de la requête, jusqu’à un éventuel appel à switch_to_locale().

Cas d’usage typiques de chacune

  • determine_locale : utile pour un plugin multilingue qui doit imposer sa propre règle de détection de langue avant que quoi que ce soit d’autre ne se charge.
  • get_locale : utile partout ailleurs dans le code applicatif, pour adapter un affichage, un format de date, ou un choix conditionnel selon la langue active de la requête en cours.

Ce que cet article ne couvre pas

Le fonctionnement détaillé des différentes extensions multilingues (Polylang, WPML, TranslatePress) et leurs mécanismes internes propres de détection de langue ne sont pas traités ici : cet article se limite strictement à la distinction entre les deux fonctions cœur, indépendamment de tout plugin.

Une règle simple à garder en tête : determine_locale décide, get_locale constate. Confondre les deux revient à modifier un panneau indicateur après que la voiture a déjà pris la sortie.

En résumé

Distinguer clairement ces deux fonctions évite une classe entière de bugs de traduction incomplète ou de filtres sans effet observable. Avant d’ajouter un filtre lié à la langue, la première question à se poser est simple : cherche-t-on à influencer la décision initiale, ou à lire une décision déjà prise ?

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