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_1 … ABDAY_7 | Сокращённые названия дней недели, начиная с воскресенья |
DAY_1 … DAY_7 | Полные названия дней недели |
ABMON_1 … ABMON_12 | Сокращённые названия месяцев |
MON_1 … MON_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— суббота.
Базовый пример
Здесь 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, скомпилированных без поддержки Clanginfo. Используйте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()— форматирует число как валюту для активной локали.