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.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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