Signatur
Beschreibung
nl_langinfo() fragt Informationen über die aktuell gesetzte Locale ab. Im Gegensatz zu localeconv(), das numerische und Währungsformatierungen zurückgibt, erlaubt nl_langinfo() den gezielten Zugriff auf einzelne Locale-Elemente – etwa die vollständigen Namen der Wochentage, Monatsnamen, das bevorzugte Datum-/Uhrzeitformat oder den Zeichensatz der Locale.
Die Funktion basiert auf dem POSIX-Standard nl_langinfo() und ist auf Unix-ähnlichen Systemen (Linux, macOS) verfügbar. Unter Windows steht sie nicht zur Verfügung. Vor dem Aufruf sollte die gewünschte Locale mit setlocale() gesetzt werden, da nl_langinfo() die aktuell aktive Locale verwendet.
Als Parameter wird eine der vordefinierten Konstanten übergeben, wie ABDAY_1 (Kurzname des ersten Wochentags), DAY_1 bis DAY_7 (vollständige Wochentagnamen), MON_1 bis MON_12 (Monatsnamen), D_FMT (bevorzugtes Datumsformat), T_FMT (bevorzugtes Zeitformat), CODESET (Zeichensatz) u. v. m.
Die Funktion ist nützlich, wenn Anwendungen lokalisierte Ausgaben erzeugen müssen, ohne auf externe Bibliotheken wie intl zurückgreifen zu können. Für portable Lösungen empfiehlt sich jedoch die Intl-Extension, da diese plattformunabhängig arbeitet.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $item Pflicht | int | Eine vordefinierte Konstante, die das abzufragende Locale-Element bestimmt. Beispiele: ABDAY_1–ABDAY_7 (Kurzwochentage), DAY_1–DAY_7 (vollständige Wochentage), MON_1–MON_12 (Monatsnamen), ABMON_1–ABMON_12 (Kurzmonatsnamen), D_FMT, T_FMT, D_T_FMT, CODESET, RADIXCHAR, THOUSEP, YESSTR, NOSTR u. a. |
Rückgabewert
item-Wert oder fehlende Unterstützung des Systems) wird false zurückgegeben.Beispiele
Wochentagnamen und Monatsnamen der deutschen Locale abfragen
<?php
// Deutsche Locale setzen (muss auf dem System installiert sein)
setlocale(LC_ALL, 'de_DE.UTF-8');
// Vollständige Wochentagnamen ausgeben (DAY_1 = Sonntag nach POSIX-Standard)
$tage = [DAY_1, DAY_2, DAY_3, DAY_4, DAY_5, DAY_6, DAY_7];
foreach ($tage as $tag) {
echo nl_langinfo($tag) . "\n";
}
echo "---\n";
// Monatsnamen ausgeben
for ($i = MON_1; $i <= MON_12; $i++) {
echo nl_langinfo($i) . "\n";
}
Datums-/Zeitformat und Zeichensatz der Locale ermitteln
<?php
setlocale(LC_ALL, 'de_DE.UTF-8');
// Bevorzugtes Datum-/Zeit-Format
echo 'Datum-Format: ' . nl_langinfo(D_FMT) . "\n";
echo 'Zeit-Format: ' . nl_langinfo(T_FMT) . "\n";
echo 'Datum+Zeit-Format: '. nl_langinfo(D_T_FMT) . "\n";
echo 'Zeichensatz: ' . nl_langinfo(CODESET) . "\n";
echo 'Dezimaltrennzeichen: ' . nl_langinfo(RADIXCHAR) . "\n";
echo 'Tausendertrennzeichen: ' . nl_langinfo(THOUSEP) . "\n";
// Aktuelles Datum mit lokalem Format ausgeben
$format = nl_langinfo(D_FMT);
echo 'Heute: ' . strftime($format) . "\n";
// Wichtig · Fallstricke
Plattformverfügbarkeit: nl_langinfo() ist nicht auf Windows-Systemen verfügbar. Auf Windows existiert die Funktion nicht, was bei plattformübergreifenden Projekten berücksichtigt werden muss. Eine Alternative ist die Intl-Extension (z. B. IntlDateFormatter), die plattformunabhängig funktioniert.
Locale muss installiert sein: Die gewünschte Locale muss auf dem Betriebssystem installiert sein (z. B. locale-gen de_DE.UTF-8 unter Debian/Ubuntu), sonst fällt setlocale() zurück und nl_langinfo() liefert Daten der Standard-Locale (meist englisch).
POSIX-Wochentag-Zählung: DAY_1 entspricht nach POSIX-Standard dem Sonntag, DAY_2 dem Montag usw. – das weicht von der ISO-8601-Konvention (Montag = erster Tag) ab und kann zu Verwirrung führen.
strftime() ist ab PHP 8.1 veraltet: Die Kombination mit nl_langinfo(D_FMT) und strftime() zur Datumsformatierung funktioniert, jedoch ist strftime() seit PHP 8.1 als deprecated markiert. Als Alternative bietet sich IntlDateFormatter an.