W3docs

setlocale()

Article sur la fonction PHP setlocale(), utilisée pour définir les informations de locale courante et produire une sortie adaptée à chaque pays.

La fonction PHP setlocale() définit la locale courante d'un script — l'ensemble des règles culturelles qui déterminent comment le texte est trié, comment les nombres et les devises sont formatés, et comment les dates sont orthographiées. Une locale est identifiée par une chaîne telle que en_US (anglais américain) ou de_DE (allemand), généralement associée à un encodage de caractères comme .utf8.

On utilise setlocale() dès qu'une même base de code doit produire une sortie qui « semble naturelle » dans plusieurs pays : 1,234.56 pour un utilisateur américain mais 1.234,56 pour un utilisateur allemand, January versus Januar, etc.

Syntaxe

setlocale(int $category, string $locale, string ...$locales): string|false

Elle peut également accepter un seul tableau de locales à la place d'une liste :

setlocale(int $category, array $locale): string|false

Paramètres

  • $category — le groupe de comportements dépendants de la locale à modifier. Passez l'une des constantes LC_* :

    ConstanteAffecte
    LC_ALLToutes les catégories à la fois
    LC_COLLATEComparaison et tri de chaînes (voir strcoll())
    LC_CTYPEClassification des caractères et conversion de casse
    LC_MONETARYFormatage des devises (voir money_format())
    LC_NUMERICSéparateur décimal pour les nombres
    LC_TIMEFormatage de la date et de l'heure (voir strftime())
    LC_MESSAGESFormatage des messages système (non disponible sous Windows)
  • $locale — la chaîne de locale à appliquer, par ex. 'en_US.utf8'. Trois valeurs spéciales sont utiles :

    • "" (chaîne vide) — utiliser la locale provenant des variables d'environnement du serveur.
    • "0" — ne rien changer ; simplement retourner le paramètre courant pour cette catégorie.
    • null — identique à "0".
  • ...$locales — solutions de repli optionnelles. PHP essaie chaque nom dans l'ordre et applique le premier que le système d'exploitation a effectivement installé.

Elle retourne le nom de la locale définie en cas de succès, ou false si aucune des locales demandées n'est disponible.

Exemple de base

<?php
$result = setlocale(LC_ALL, 'en_US.utf8');

if ($result !== false) {
    echo "Locale set to: $result";
} else {
    echo "Requested locale is not installed.";
}
?>

setlocale() retourne la nouvelle chaîne de locale en cas de succès ou false en cas d'échec, aussi vérifiez toujours la valeur de retour — une locale manquante échoue silencieusement et laisse votre formatage incorrect plutôt que de lever une erreur.

Fournir des solutions de repli

Les noms de locales diffèrent selon les systèmes d'exploitation (en_US.utf8 sous Linux, English_United States.1252 sous Windows). Lister plusieurs noms permet au même script de fonctionner partout — PHP utilise la première correspondance installée :

<?php
$locale = setlocale(
    LC_ALL,
    'en_US.UTF-8',                 // Linux / macOS
    'en_US.utf8',
    'English_United States.1252'   // Windows
);

echo $locale ?: 'No English locale available';
?>

Pourquoi la locale est importante : le formatage des nombres

Après avoir défini LC_NUMERIC (ou LC_ALL), les fonctions qui respectent la locale produisent une sortie spécifique à la culture. Ici, les séparateurs décimal et des milliers suivent les conventions allemandes :

<?php
setlocale(LC_ALL, 'de_DE.utf8', 'de_DE', 'German_Germany.1252');

$info = localeconv();
echo $info['decimal_point'];   // ,
echo "\n";
echo $info['thousands_sep'];   // .
?>

localeconv() relit les règles numériques et monétaires de la locale active, ce qui est la façon la plus sûre de formater les nombres manuellement. Notez que number_format() de PHP ne lit pas la locale — vous lui passez les séparateurs explicitement.

Pièges courants

  • La locale doit être installée sur le serveur. setlocale() ne réussit que pour les locales que le système d'exploitation connaît. Sur une machine Debian/Ubuntu, vous pourriez avoir besoin de locale-gen de_DE.UTF-8 && update-locale.
  • Elle est globale au processus, non thread-safe. Le paramètre affecte tout le processus PHP, alors évitez de le modifier de manière concurrente dans des SAPIs multi-threadés.
  • Elle ne modifie pas echo ni printf() pour les flottants. Utilisez sprintf() avec précaution ; le séparateur décimal de la locale peut surprendre les fonctions qui construisent du SQL ou du JSON. Réinitialisez avec setlocale(LC_NUMERIC, 'C') autour de ce type de code.
  • money_format() a été supprimée en PHP 8.0. Pour les devises, préférez la classe NumberFormatter de l'extension intl.

Pratique

Pratique
Quel est le but de la fonction setlocale() en PHP ?
Quel est le but de la fonction setlocale() en PHP ?
Was this page helpful?