W3docs

nl_langinfo()

Статья о функции PHP nl_langinfo(), которая возвращает локализованную информацию: аббревиатуры дней, форматы дат, символы валют и другое.

Функция PHP nl_langinfo() возвращает отдельный фрагмент локально-специфичной информации — например, сокращённое название дня недели, локальный формат даты или символ валюты — для текущей активной локали. Это тонкая обёртка над одноимённой функцией библиотеки C, поэтому точные строки, которые она возвращает, определяются базой данных локалей вашей операционной системы, а не самим PHP.

На этой странице объясняются синтаксис, наиболее полезные константы элементов, поведение nl_langinfo() при использовании setlocale(), а также предостережения о переносимости, которые следует знать перед тем, как полагаться на эту функцию.

Синтаксис

string nl_langinfo ( int $item )

Функция принимает один параметр, $item: целочисленную константу, которая обозначает запрашиваемый фрагмент информации. Она возвращает соответствующую строку для текущей выбранной локали или false, если $item недействителен.

Важная идея в том, что вы передаёте одну и ту же константу вне зависимости от языка. nl_langinfo(ABDAY_1) всегда запрашивает «сокращённое название первого дня недели»; получите ли вы Sun, Dim или So — полностью зависит от локали, установленной с помощью setlocale(). Именно это делает функцию полезной: ваш код остаётся независимым от языка, а вывод адаптируется.

Распространённые константы элементов

Константы сгруппированы по категориям. Большинство систем определяют их; некоторые специфичны для отдельных платформ.

КонстантаОписание
ABDAY_1ABDAY_7Сокращённые названия дней недели, начиная с воскресенья
DAY_1DAY_7Полные названия дней недели
ABMON_1ABMON_12Сокращённые названия месяцев
MON_1MON_12Полные названия месяцев
D_T_FMTСтрока формата даты и времени (как используется в strftime())
D_FMTСтрока формата даты
T_FMTСтрока формата времени
AM_STR / PM_STRСтроки для AM и PM
CRNCYSTRСимвол валюты и его позиция
YESEXPR / NOEXPRРегулярные выражения для утвердительного / отрицательного ответа

Примечание: DAY_n и ABDAY_n индексируются с воскресенья, поэтому ABDAY_1 — воскресенье, а ABDAY_7 — суббота.

Базовый пример

php— editable, runs on the server

Здесь setlocale() активирует локаль en_US, затем nl_langinfo(ABDAY_1) считывает сокращённое название первого дня недели (воскресенье) для этой локали.

Вывод:

Sun

Как локаль влияет на результат

Поскольку возвращаемое значение отслеживает активную локаль, смена локали между вызовами даёт переведённый вывод при использовании той же константы. Константы никогда не меняются — меняется только setlocale().

<?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";   // janvier

Ожидаемый вывод (если обе локали установлены в системе):

January
janvier

Если локаль не установлена, setlocale() возвращает false и предыдущая локаль остаётся активной, поэтому вы можете увидеть повторение предыдущего языка. Всегда проверяйте возвращаемое значение setlocale() в производственном коде.

Чтение форматов даты и валюты

Два наиболее практичных элемента — строка формата даты/времени и строка валюты. Строку формата можно передавать прямо в 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)

Начальный символ CRNCYSTR указывает, где символ располагается относительно числа (- = перед, + = после, . = вместо десятичной точки). Для полного денежного форматирования обычно лучше использовать localeconv() или money_format(), которые предоставляют все числовые детали, а не единственную строку.

Переносимость и предостережения

  • Доступна не везде. nl_langinfo() не определена в Windows и в сборках PHP, скомпилированных без поддержки C langinfo. Используйте function_exists('nl_langinfo') для проверки, если ваш код должен работать кросс-платформенно.
  • Локаль должна быть установлена. Константа разрешается по базе данных локалей ОС; неустановленная локаль незаметно оставляет в силе предыдущую.
  • Сначала setlocale(). Без явного вызова setlocale() вы получите то, что возвращает локаль C/POSIX по умолчанию — обычно простой английский без каких-либо форматирующих удобств.
  • Константы — целые числа, а не строки. Пишите nl_langinfo(ABDAY_1), а не nl_langinfo('ABDAY_1').

Связанные функции

  • setlocale() — выбирает локаль, из которой читает nl_langinfo().
  • localeconv() — возвращает правила числового и денежного форматирования в виде массива.
  • strftime() — форматирует дату с использованием строки формата локали, например полученной из D_T_FMT.
  • money_format() — форматирует число как валюту для активной локали.

Практика

Практика
Что делает функция nl_langinfo() в PHP?
Что делает функция nl_langinfo() в PHP?
Was this page helpful?