nl_langinfo()
Notre article présente la fonction PHP nl_langinfo(), utilisée pour récupérer des informations de localisation utiles pour travailler avec différentes langues.
La fonction PHP nl_langinfo() retourne une seule information spécifique à la locale — comme le nom abrégé d'un jour de la semaine, le format de date local ou le symbole monétaire — pour la locale actuellement active. C'est un simple wrapper autour de la fonction de bibliothèque C du même nom, donc les chaînes exactes qu'elle retourne sont déterminées par la base de données de locale de votre système d'exploitation, et non par PHP lui-même.
Cette page explique la syntaxe, les constantes d'élément les plus utiles, la façon dont nl_langinfo() réagit à setlocale(), et les avertissements de portabilité à connaître avant de s'y fier.
Syntaxe
string nl_langinfo ( int $item )La fonction prend un paramètre, $item : une constante entière qui désigne l'information souhaitée. Elle retourne la chaîne correspondante pour la locale actuellement sélectionnée, ou false si $item n'est pas valide.
L'idée importante est que vous passez la même constante quelle que soit la langue. nl_langinfo(ABDAY_1) demande toujours « le nom abrégé du premier jour de la semaine » ; que vous obteniez Sun, Dim ou So dépend entièrement de la locale définie avec setlocale(). C'est ce qui rend la fonction utile : votre code reste indépendant de la langue tandis que la sortie s'adapte.
Constantes d'élément courantes
Les constantes sont regroupées par catégorie. La plupart des systèmes les définissent ; certaines sont spécifiques à la plateforme.
| Constante | Description |
|---|---|
ABDAY_1 … ABDAY_7 | Noms abrégés des jours de la semaine, à partir du dimanche |
DAY_1 … DAY_7 | Noms complets des jours de la semaine |
ABMON_1 … ABMON_12 | Noms abrégés des mois |
MON_1 … MON_12 | Noms complets des mois |
D_T_FMT | Chaîne de format de date et d'heure (utilisée par strftime()) |
D_FMT | Chaîne de format de date |
T_FMT | Chaîne de format d'heure |
AM_STR / PM_STR | Chaînes pour AM et PM |
CRNCYSTR | Symbole monétaire et sa position |
YESEXPR / NOEXPR | Expressions régulières pour une réponse affirmative / négative |
Remarque :
DAY_netABDAY_nsont indexés à partir du dimanche, doncABDAY_1correspond au dimanche etABDAY_7au samedi.
Un exemple de base
Ici, setlocale() active la locale en_US, puis nl_langinfo(ABDAY_1) lit le nom abrégé du premier jour de la semaine (dimanche) pour cette locale.
Le résultat est :
SunComment la locale modifie le résultat
Comme la valeur de retour suit la locale active, changer de locale entre les appels vous donne une sortie traduite avec la même constante. Les constantes ne changent jamais — seul setlocale() change.
<?php
// English
setlocale(LC_ALL, 'en_US.UTF-8');
echo nl_langinfo(MON_1), "\n"; // January
// French — same constant, French output
setlocale(LC_ALL, 'fr_FR.UTF-8');
echo nl_langinfo(MON_1), "\n"; // janvierRésultat attendu (lorsque les deux locales sont installées sur le système) :
January
janvierSi une locale n'est pas installée, setlocale() retourne false et la locale précédente reste en vigueur, vous pouvez donc voir la langue précédente répétée. Vérifiez toujours la valeur de retour de setlocale() dans le code de production.
Lecture des formats de date et de devise
Deux des éléments les plus pratiques sont la chaîne de format date/heure et la chaîne de devise. Vous pouvez passer directement la chaîne de format à strftime() :
<?php
setlocale(LC_ALL, 'en_US.UTF-8');
$fmt = nl_langinfo(D_T_FMT); // locale's preferred date+time format
echo $fmt, "\n"; // e.g. %a %d %b %Y %r %Z
echo nl_langinfo(CRNCYSTR), "\n"; // e.g. -$ (currency symbol + position flag)Le premier caractère de CRNCYSTR indique où le symbole se place par rapport au nombre (- = avant, + = après, . = à la place du séparateur décimal). Pour le formatage monétaire complet, vous préférerez généralement localeconv() ou money_format(), qui exposent chaque détail numérique plutôt qu'une seule chaîne.
Portabilité et points d'attention
- Non disponible partout.
nl_langinfo()est indéfinie sous Windows et dans les builds PHP compilés sans le support Clanginfo. Protégez votre code avecfunction_exists('nl_langinfo')s'il doit fonctionner sur plusieurs plateformes. - La locale doit être réellement installée. La constante est résolue par rapport à la base de données de locale du système d'exploitation ; une locale non installée laisse silencieusement la précédente active.
setlocale()en premier. Sanssetlocale()explicite, vous obtenez ce que retourne la locale par défautC/POSIX— généralement de l'anglais basique sans fioritures de formatage.- Les constantes sont des entiers, pas des chaînes. Écrivez
nl_langinfo(ABDAY_1), pasnl_langinfo('ABDAY_1').
Fonctions associées
setlocale()— sélectionne la locale quenl_langinfo()utilise.localeconv()— retourne les règles de formatage numérique et monétaire sous forme de tableau.strftime()— formate une date en utilisant une chaîne de format de locale telle que celle provenant deD_T_FMT.money_format()— formate un nombre en devise pour la locale active.