logo oujood
🔍

Fonction nl_langinfo() PHP : Maîtriser la localisation et les formats régionaux

Apprenez à utiliser nl_langinfo() pour récupérer les informations de configuration locale (locale) telles que les noms de jours, mois, symboles monétaires et formats de date selon la langue du système

OUJOOD.COM

Comprendre la fonction nl_langinfo() en PHP


PHP references des fonctions PHP

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

nl_langinfo() — Récupère des informations détaillées sur la langue et la configuration locale du système

La fonction nl_langinfo() : Un outil puissant pour la localisation

Définition et utilisation de nl_langinfo()

La fonction nl_langinfo() permet de récupérer des informations spécifiques sur la configuration locale (locale) du système. Cette fonction PHP native est essentielle pour créer des applications multilingues et adaptées aux conventions régionales de formatage des dates, nombres et devises.

Concrètement, nl_langinfo() interroge la locale active définie via setlocale() et retourne une chaîne de caractères contenant l'information demandée. Elle est particulièrement utile pour obtenir les noms localisés des jours et mois, les symboles monétaires régionaux, ou les formats de date adaptés à chaque langue.

Cette fonction retourne une chaîne de caractères contenant l'information demandée en cas de succès, ou FALSE en cas d'échec (élément invalide ou locale non supportée).

Syntaxe de nl_langinfo()
string nl_langinfo(int $element)
 
Paramètre Description

$element

Obligatoire. Spécifie quelle information de localisation retourner. Accepte une constante prédéfinie parmi les catégories LC_TIME (temps), LC_MONETARY (monétaire), LC_NUMERIC (numérique), LC_MESSAGES (messages) et LC_CTYPE (caractères). Consultez le tableau ci-dessous pour la liste complète des constantes disponibles.

Constantes nl_langinfo() - Guide complet des éléments de localisation

Constante

Description détaillée

Constantes de la catégorie LC_TIME - Informations temporelles et calendrier localisé :

ABDAY_(1-7)

Nom abrégé du jour de la semaine selon la locale (ex: "Lun", "Mar", "Mer" en français). Numérotation de 1 (dimanche) à 7 (samedi).

DAY_(1-7)

Nom complet du jour de la semaine dans la langue de la locale active (DAY_1 = Dimanche, DAY_2 = Lundi, etc.). Idéal pour afficher des calendriers localisés.

ABMON_(1-12)

Nom abrégé du mois de l'année selon la convention locale (ex: "Jan", "Fév", "Mar" en français). De 1 (janvier) à 12 (décembre).

MON_(1-12)

Nom complet du mois de l'année dans la langue configurée (ex: "Janvier", "Février"). Essentiel pour l'affichage de dates complètes localisées.

AM_STR

Chaîne pour Ante Meridiem (avant midi). Retourne "AM" en anglais, "م" en arabe, selon la locale.

PM_STR

Chaîne pour Post Meridiem (après midi). Retourne "PM" en anglais, utilisé pour le format 12 heures.

D_T_FMT

Format de date et heure combinées utilisable avec strftime(). Retourne le format standard de la locale pour représenter simultanément date et heure (ex: "%a %d %b %Y %T %Z").

D_FMT

Format de date uniquement compatible avec strftime(). Retourne le format standard de date de la locale (ex: "%d/%m/%Y" pour la France, "%m/%d/%Y" pour les USA).

T_FMT

Format d'heure seulement pour utilisation avec strftime(). Retourne le format horaire de la locale (ex: "%H:%M:%S" pour format 24h).

T_FMT_AMPM

Format d'heure 12 heures avec AM/PM utilisable avec strftime(). Intègre les indicateurs ante/post meridian selon les conventions locales.

ERA

Désignation de l'ère alternative (ex: calendrier japonais avec ères impériales, calendrier bouddhiste thaïlandais).

ERA_YEAR

Année dans le format d'ère de substitution. Utilisé pour les calendriers alternatifs nécessitant un comptage spécifique des années.

ERA_D_T_FMT

Format date et heure selon l'ère alternative (chaîne de formatage compatible strftime() pour calendriers spéciaux).

ERA_D_FMT

Format de date dans l'ère de substitution (chaîne utilisable avec strftime()).

ERA_T_FMT

Format d'heure dans l'ère alternative (chaîne compatible strftime()).

Constantes de la catégorie LC_MONETARY - Informations monétaires et formatage des devises :

INT_CURR_SYMBOL

Symbole monétaire international au format ISO 4217 (ex: "EUR " pour euro, "USD " pour dollar américain).

CURRENCY_SYMBOL

Symbole de devise local utilisé dans le pays (ex: "€" pour euro, "$" pour dollar, "£" pour livre sterling).

CRNCYSTR

Alias de CURRENCY_SYMBOL. Retourne le même symbole de devise locale.

MON_DECIMAL_POINT

Caractère séparateur décimal monétaire (ex: "," en France, "." aux USA pour les montants).

MON_THOUSANDS_SEP

Séparateur des milliers pour valeurs monétaires (ex: " " espace en France, "," aux USA pour grouper les milliers).

MON_GROUPING

Règle de groupement des chiffres monétaires. Définit comment regrouper les chiffres (généralement par groupes de 3).

POSITIVE_SIGN

Signe pour les montants positifs (souvent chaîne vide ou "+" selon la locale).

NEGATIVE_SIGN

Signe pour les montants négatifs (généralement "-" dans la plupart des locales).

INT_FRAC_DIGITS

Nombre de décimales pour format international (généralement 2 pour la plupart des devises).

FRAC_DIGITS

Nombre de décimales pour format local de la devise (2 pour euro/dollar, 0 pour yen japonais).

P_CS_PRECEDES

Retourne 1 si le symbole de devise précède une valeur positive, 0 sinon (ex: "$100" vs "100$").

P_SEP_BY_SPACE

Retourne 1 si un espace sépare le symbole de devise d'une valeur positive, 0 sinon (ex: "100 €" vs "100€").

N_CS_PRECEDES

Retourne 1 si le symbole de devise précède une valeur négative, 0 si il la suit.

N_SEP_BY_SPACE

Retourne 1 si un espace sépare le symbole de devise d'une valeur négative, 0 sinon.

P_SIGN_POSN

Position du signe pour valeurs positives/négatives :

  • 0 : Parenthèses entourent la quantité et le symbole de devise (ex: "(100€)")
  • 1 : Le signe précède la quantité et le symbole (ex: "-100€")
  • 2 : Le signe suit la quantité et le symbole (ex: "100€-")
  • 3 : Le signe précède immédiatement le symbole de devise (ex: "-€100")
  • 4 : Le signe suit immédiatement le symbole de devise (ex: "€-100")

N_SIGN_POSN

Constantes de la catégorie LC_NUMERIC - Formatage numérique et conventions d'affichage des nombres :

DECIMAL_POINT

Caractère séparateur décimal pour les nombres (ex: "," en France, "." aux USA et pays anglophones).

RADIXCHAR

Alias de DECIMAL_POINT. Retourne le même séparateur décimal que DECIMAL_POINT.

THOUSANDS_SEP

Séparateur des milliers pour nombres (ex: " " espace en France, "," aux USA, "." en Allemagne pour regrouper les chiffres par trois).

THOUSEP

Alias de THOUSANDS_SEP. Retourne le même séparateur de milliers.

GROUPING

Règle de groupement numérique définissant comment regrouper les chiffres dans les nombres (habituellement groupes de 3 chiffres).

Constantes de la catégorie LC_MESSAGES - Messages système et réponses utilisateur localisées :

YESEXPR

Expression régulière pour détecter une réponse affirmative selon la locale (ex: reconnaître "oui", "yes", "si", etc.).

NOEXPR

Expression régulière pour détecter une réponse négative dans la langue locale (ex: reconnaître "non", "no", "nein", etc.).

YESSTR

Chaîne d'affichage pour la réponse affirmative (ex: "oui" en français, "yes" en anglais).

NOSTR

Chaîne d'affichage pour la réponse négative (ex: "non" en français, "no" en anglais).

Constantes de la catégorie LC_CTYPE - Informations sur l'encodage et jeu de caractères :

CODESET

Retourne le nom du jeu de caractères utilisé par la locale (ex: "UTF-8", "ISO-8859-1", "Windows-1252"). Essentiel pour gérer correctement l'encodage des textes.


Exemples pratiques d'utilisation de nl_langinfo()

Exemple 1 : Récupérer les noms des jours de la semaine

Cet exemple montre comment obtenir les noms localisés des jours pour créer un calendrier multilingue :

<?php
// Définir la locale française
setlocale(LC_TIME, 'fr_FR.UTF-8', 'fra');

// Récupérer les noms complets des jours
for ($i = 1; $i <= 7; $i++) {
    echo nl_langinfo(constant("DAY_$i")) . "\n";
}
// Affiche : Dimanche, Lundi, Mardi, Mercredi, Jeudi, Vendredi, Samedi

// Récupérer les noms abrégés des jours
echo "\nNoms abrégés :\n";
for ($i = 1; $i <= 7; $i++) {
    echo nl_langinfo(constant("ABDAY_$i")) . " ";
}
// Affiche : Dim Lun Mar Mer Jeu Ven Sam
?>

Exemple 2 : Afficher le symbole de devise locale

Découvrez comment récupérer les symboles monétaires pour formater correctement les prix :

<?php
// Configuration locale française
setlocale(LC_MONETARY, 'fr_FR.UTF-8');

// Obtenir le symbole de devise local
$symbole_local = nl_langinfo(CURRENCY_SYMBOL);
echo "Symbole de devise : $symbole_local\n"; 
// Affiche : €

// Obtenir le code de devise international
$symbole_international = nl_langinfo(INT_CURR_SYMBOL);
echo "Code international : $symbole_international\n"; 
// Affiche : EUR 

// Vérifier si le symbole précède ou suit le montant
$precede = nl_langinfo(P_CS_PRECEDES);
$espace = nl_langinfo(P_SEP_BY_SPACE);
echo "Format : " . ($precede ? "Symbole avant" : "Symbole après");
echo " - Espace : " . ($espace ? "oui" : "non");
// En France : Symbole après - Espace : oui → "100 €"
?>

Exemple 3 : Obtenir le format de date locale

Apprenez à récupérer le format de date standard selon la région :

<?php
// Définir différentes locales pour comparaison
$locales = ['fr_FR.UTF-8', 'en_US.UTF-8', 'de_DE.UTF-8'];

foreach ($locales as $locale) {
    setlocale(LC_TIME, $locale);
    
    // Récupérer le format de date
    $format_date = nl_langinfo(D_FMT);
    echo "Locale $locale : $format_date\n";
    
    // Récupérer le format date et heure
    $format_datetime = nl_langinfo(D_T_FMT);
    echo "Format complet : $format_datetime\n\n";
}
// France : %d/%m/%Y (jour/mois/année)
// USA : %m/%d/%Y (mois/jour/année)
// Allemagne : %d.%m.%Y (jour.mois.année)
?>

Exemple 4 : Obtenir les séparateurs numériques locaux

Cet exemple illustre comment récupérer les séparateurs décimaux et de milliers pour formater correctement les nombres :

<?php
// Configuration locale française
setlocale(LC_NUMERIC, 'fr_FR.UTF-8');

// Récupérer le séparateur décimal
$separateur_decimal = nl_langinfo(DECIMAL_POINT);
echo "Séparateur décimal : '$separateur_decimal'\n"; 
// Affiche : ','

// Récupérer le séparateur des milliers
$separateur_milliers = nl_langinfo(THOUSANDS_SEP);
echo "Séparateur milliers : '" . ($separateur_milliers ?: ' ') . "'\n"; 
// Affiche : ' ' (espace)

// Exemple pratique de formatage d'un nombre
$nombre = 1234567.89;
$parties = explode('.', (string)$nombre);
$entier = $parties[0];
$decimal = $parties[1] ?? '';

// Formater avec les conventions locales
$entier_formate = number_format((float)$entier, 0, '', $separateur_milliers);
$nombre_formate = $entier_formate . $separateur_decimal . $decimal;
echo "Nombre formaté : $nombre_formate\n";
// Affiche : 1 234 567,89 (format français)
?>

Exemple 5 : Vérifier l'encodage de caractères

Découvrez comment identifier le jeu de caractères utilisé par la locale active :

<?php
// Définir une locale
setlocale(LC_CTYPE, 'fr_FR.UTF-8');

// Obtenir le nom du jeu de caractères
$encodage = nl_langinfo(CODESET);
echo "Encodage actuel : $encodage\n"; 
// Affiche généralement : UTF-8

// Utilisation pratique pour la conversion d'encodage
if ($encodage !== 'UTF-8') {
    echo "Attention : L'encodage n'est pas UTF-8\n";
    // Appliquer une conversion si nécessaire
} else {
    echo "Encodage UTF-8 confirmé - Aucune conversion nécessaire\n";
}
?>

Exemple 6 : Gérer les réponses oui/non localisées

Apprenez à valider les entrées utilisateur selon la langue avec les expressions régulières locales :

<?php
// Configuration de la locale
setlocale(LC_MESSAGES, 'fr_FR.UTF-8');

// Récupérer les expressions régulières pour oui/non
$regex_oui = nl_langinfo(YESEXPR);
$regex_non = nl_langinfo(NOEXPR);

echo "Expression pour 'oui' : $regex_oui\n";
echo "Expression pour 'non' : $regex_non\n";

// Fonction pour valider une réponse utilisateur
function valider_reponse($reponse) {
    $regex_oui = nl_langinfo(YESEXPR);
    $regex_non = nl_langinfo(NOEXPR);
    
    if (preg_match("/$regex_oui/i", $reponse)) {
        return true; // Réponse affirmative détectée
    } elseif (preg_match("/$regex_non/i", $reponse)) {
        return false; // Réponse négative détectée
    }
    return null; // Réponse non reconnue
}

// Test de validation
$reponses_test = ['oui', 'Oui', 'O', 'non', 'Non', 'N'];
foreach ($reponses_test as $rep) {
    $resultat = valider_reponse($rep);
    echo "'$rep' => " . ($resultat === true ? "OUI" : ($resultat === false ? "NON" : "?")) . "\n";
}
?>

Exemple 7 : Application complète - Affichage multilingue de date et montant

Un exemple pratique et complet qui combine plusieurs fonctionnalités de nl_langinfo() :

<?php
// Fonction pour afficher une date et un montant selon la locale
function afficher_infos_localisees($locale_code, $montant) {
    // Configurer toutes les catégories de locale
    setlocale(LC_ALL, $locale_code);
    
    echo "\n=== Locale : $locale_code ===\n";
    
    // 1. Afficher la date actuelle dans le format local
    $format_date = nl_langinfo(D_FMT);
    $date_formatee = strftime($format_date);
    echo "Date locale : $date_formatee\n";
    
    // 2. Afficher le jour de la semaine complet
    $numero_jour = (int)strftime('%u') + 1; // Convertir 1-7 (Lun-Dim) en 2-8 puis ajuster
    if ($numero_jour == 8) $numero_jour = 1; // Dimanche
    $nom_jour = nl_langinfo(constant("DAY_$numero_jour"));
    echo "Jour : $nom_jour\n";
    
    // 3. Formater le montant avec la devise locale
    $symbole = nl_langinfo(CURRENCY_SYMBOL);
    $decimal = nl_langinfo(MON_DECIMAL_POINT);
    $milliers = nl_langinfo(MON_THOUSANDS_SEP);
    $precede = nl_langinfo(P_CS_PRECEDES);
    $espace = nl_langinfo(P_SEP_BY_SPACE);
    
    // Formater le montant
    $montant_formate = number_format($montant, 2, $decimal, $milliers);
    
    // Construire le format complet selon les règles locales
    if ($precede) {
        $affichage = $symbole . ($espace ? ' ' : '') . $montant_formate;
    } else {
        $affichage = $montant_formate . ($espace ? ' ' : '') . $symbole;
    }
    
    echo "Montant : $affichage\n";
    
    // 4. Afficher l'encodage utilisé
    $encodage = nl_langinfo(CODESET);
    echo "Encodage : $encodage\n";
}

// Tester avec différentes locales
$montant_test = 1234.56;

afficher_infos_localisees('fr_FR.UTF-8', $montant_test);
// Sortie attendue : 1 234,56 €

afficher_infos_localisees('en_US.UTF-8', $montant_test);
// Sortie attendue : $1,234.56

afficher_infos_localisees('de_DE.UTF-8', $montant_test);
// Sortie attendue : 1.234,56 €

afficher_infos_localisees('ja_JP.UTF-8', $montant_test);
// Sortie attendue : ¥1,235 (le yen n'utilise pas de décimales)
?>

Cas d'utilisation pratiques de nl_langinfo() en développement web

La fonction nl_langinfo() trouve de nombreuses applications dans le développement d'applications web internationales :

  • Sites e-commerce multilingues : Afficher les prix avec les symboles de devise et formats appropriés à chaque pays
  • Systèmes de réservation : Présenter les dates dans le format familier aux utilisateurs (JJ/MM/AAAA vs MM/JJ/AAAA)
  • Applications de gestion : Formater automatiquement les nombres selon les conventions régionales
  • Calendriers et agendas : Afficher les noms de jours et mois dans la langue de l'utilisateur
  • Interfaces de validation : Reconnaître les réponses utilisateur (oui/non) dans différentes langues
  • Rapports financiers internationaux : Adapter le formatage des montants et devises selon la locale

Bonnes pratiques et conseils d'utilisation

Vérifier la disponibilité de la locale

Toujours vérifier que setlocale() a réussi avant d'utiliser nl_langinfo() :

<?php
// Tentative de configuration de la locale
$locale_definie = setlocale(LC_ALL, 'fr_FR.UTF-8', 'fr_FR', 'fra');

if ($locale_definie === false) {
    // La locale demandée n'est pas disponible sur le système
    echo "Erreur : locale française non disponible\n";
    // Utiliser une locale de secours
    setlocale(LC_ALL, 'C'); // Locale par défaut
} else {
    // La locale a été configurée avec succès
    echo "Locale active : " . setlocale(LC_ALL, 0) . "\n";
    $info = nl_langinfo(CURRENCY_SYMBOL);
}
?>

Combiner avec d'autres fonctions de localisation

nl_langinfo() fonctionne en synergie avec d'autres fonctions PHP de localisation :

  • setlocale() : Définit la locale avant d'utiliser nl_langinfo()
  • strftime() : Utilise les formats retournés par D_FMT, T_FMT, etc.
  • localeconv() : Alternative qui retourne un tableau complet d'informations locales
  • number_format() : Peut être combiné avec les séparateurs de nl_langinfo()
  • money_format() : Pour un formatage monétaire complet automatique

Notes importantes et limitations

Disponibilité selon les plateformes

Limitation majeure : nl_langinfo() ne fonctionne PAS sur les plates-formes Windows. Cette fonction dépend des bibliothèques système POSIX qui ne sont pas disponibles nativement sous Windows.

Solutions alternatives pour Windows :

  • Utiliser localeconv() qui fonctionne sur toutes les plateformes
  • Créer une table de correspondance manuelle des informations de locale
  • Utiliser des bibliothèques externes comme intl (extension Internationalization)
  • Implémenter une couche d'abstraction qui détecte la plateforme
<?php
// Fonction compatible multi-plateformes
function obtenir_symbole_devise($locale) {
    if (function_exists('nl_langinfo')) {
        // Linux/Unix/Mac : utiliser nl_langinfo()
        setlocale(LC_MONETARY, $locale);
        return nl_langinfo(CURRENCY_SYMBOL);
    } else {
        // Windows : utiliser localeconv()
        setlocale(LC_MONETARY, $locale);
        $conv = localeconv();
        return $conv['currency_symbol'];
    }
}

// Utilisation sécurisée
$symbole = obtenir_symbole_devise('fr_FR.UTF-8');
echo "Symbole : $symbole";
?>

Dépendance aux locales système installées

Les locales disponibles dépendent du système d'exploitation. Une locale peut fonctionner sur un serveur mais pas sur un autre :

<?php
// Lister les locales disponibles (Linux/Unix)
// Commande shell : locale -a

// Fonction pour tester plusieurs variantes de locale
function definir_locale_francaise() {
    $variantes = [
        'fr_FR.UTF-8',
        'fr_FR.utf8',
        'fr_FR',
        'french',
        'fra'
    ];
    
    foreach ($variantes as $locale) {
        if (setlocale(LC_ALL, $locale) !== false) {
            return $locale; // Locale trouvée et définie
        }
    }
    
    return false; // Aucune locale française disponible
}

$locale_active = definir_locale_francaise();
if ($locale_active) {
    echo "Locale française active : $locale_active\n";
} else {
    echo "Aucune locale française trouvée sur ce système\n";
}
?>

Alternatives modernes : L'extension Intl

Pour les nouveaux projets PHP, l'extension Intl (Internationalization) est recommandée comme alternative moderne à nl_langinfo() :

<?php
// Exemple avec l'extension Intl (PHP 5.3+)
// Avantages : fonctionne sur Windows, plus de fonctionnalités

// Formater une date selon la locale
$fmt = new IntlDateFormatter(
    'fr_FR',
    IntlDateFormatter::FULL,
    IntlDateFormatter::NONE
);
echo $fmt->format(time()) . "\n";
// Affiche : lundi 23 décembre 2024

// Formater un montant avec devise
$fmt_montant = new NumberFormatter('fr_FR', NumberFormatter::CURRENCY);
echo $fmt_montant->formatCurrency(1234.56, 'EUR') . "\n";
// Affiche : 1 234,56 €

// Obtenir le symbole de devise
$fmt_devise = new NumberFormatter('fr_FR', NumberFormatter::CURRENCY);
$symbole = $fmt_devise->getSymbol(NumberFormatter::CURRENCY_SYMBOL);
echo "Symbole : $symbole\n";
// Affiche : €
?>

Ressources complémentaires pour la localisation PHP

Pour approfondir vos connaissances sur la localisation et l'internationalisation en PHP :

  • setlocale() : Configurer la locale active du script
  • localeconv() : Obtenir un tableau complet d'informations de formatage
  • strftime() : Formater une date selon la locale (note : dépréciée en PHP 8.1)
  • money_format() : Formater des montants monétaires (retiré en PHP 8.0)
  • Extension Intl : Solution moderne et complète pour l'internationalisation
  • NumberFormatter : Classe Intl pour formater nombres et devises
  • IntlDateFormatter : Classe Intl pour formater les dates

Conclusion sur nl_langinfo()

La fonction nl_langinfo() reste un outil précieux pour accéder rapidement aux informations de localisation sur les systèmes Unix/Linux. Bien qu'elle présente des limitations (incompatibilité Windows, dépendance aux locales système), elle offre un moyen simple et efficace d'obtenir des détails sur le formatage régional.

Pour les applications modernes nécessitant une compatibilité maximale, privilégiez l'extension Intl qui offre des fonctionnalités similaires avec une meilleure portabilité. Toutefois, nl_langinfo() conserve sa pertinence dans les environnements Unix/Linux et pour les scripts nécessitant un accès léger aux paramètres de locale.

La maîtrise de la localisation est essentielle pour développer des applications web professionnelles capables de s'adapter automatiquement aux conventions culturelles et linguistiques de vos utilisateurs internationaux.



Par carabde | Créé le 22 Août 2014 | Mis à jour le 23 novembre 2025