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|falseElle peut également accepter un seul tableau de locales à la place d'une liste :
setlocale(int $category, array $locale): string|falseParamètres
-
$category— le groupe de comportements dépendants de la locale à modifier. Passez l'une des constantesLC_*:Constante Affecte 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 delocale-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
echoniprintf()pour les flottants. Utilisezsprintf()avec précaution ; le séparateur décimal de la locale peut surprendre les fonctions qui construisent du SQL ou du JSON. Réinitialisez avecsetlocale(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 classeNumberFormatterde l'extensionintl.