Setlocale в PHP — настройка локали для вывода даты и времени
Функция setlocale() в PHP позволяет настроить локаль, используемую для форматирования даты и времени. Это важно, когда нужно отобразить дату или время на разных языках в одном приложении.
По умолчанию PHP использует локаль, установленную на сервере. Часто это английский язык. Чтобы показать дату на русском, нужно вызвать setlocale():
Установка локали на русский язык
Для вывода даты на русском языке используем:
setlocale(LC_TIME, 'ru_RU.UTF-8');
Это установит локаль на русский язык с кодировкой UTF-8. После этого функции date() и strftime() будут возвращать дату по-русски.
Пример вывода даты на разных языках
Рассмотрим пример вывода одной и той же даты на английском и русском:
// Выводим дату по-английски echo date('j F Y'); // 7 October 2022 // Выводим дату по-русски setlocale(LC_TIME, 'ru_RU.UTF-8'); echo date('j F Y'); // 7 октября 2022
Как видно, с помощью setlocale() можно легко переключаться между локалями.
Поддержка Unicode и UTF-8
Многие локали требуют кодировку UTF-8 для корректного отображения. Поэтому после названия языка нужно указывать ".UTF-8".
Например, для украинского языка будет "uk_UA.UTF-8". Без UTF-8 символы могут отображаться некорректно.
Вывод даты в разных форматах
Функция strftime() позволяет гибко форматировать дату и время. Например, вывести время в формате "15:20":
setlocale(LC_TIME, 'ru_RU.UTF-8'); echo strftime('%H:%M');
Поддерживается множество форматов - можно выводить день недели, месяц, год, часы, минуты и секунды в любом порядке.
Вывод денежных сумм с separators
Чтобы вывести денежную сумму в правильном формате (например, 1 234,56 руб.), используйте функцию money_format():
setlocale(LC_MONETARY, 'ru_RU.UTF-8'); echo money_format('%n', 1234.56);
Форматирование валюты тоже зависит от локали. Поэтому нужно setlocale(LC_MONETARY, 'ru_RU.UTF-8').
Локализация веб-приложений
В веб-приложениях часто нужна поддержка нескольких языков. Это называется локализацией.
Можно хранить переводы в файле translations.php, а выбор языка реализовать через $_SESSION.
При этом в каждом файле в начале прописываем setlocale(LC_ALL, $_SESSION['locale']). Это позволит выводить даты и числа в правильном формате для выбранного языка.
Использование intl
Для более продвинутой локализации в PHP есть расширение intl. Оно позволяет:
- Форматировать числа, даты и валюты для нужной локали
- Сравнивать и сортировать строки по правилам языка
- Работать со строками на разных языках
intl содержит класс Locale, который упрощает работу с локалями. Но setlocale() тоже полезна для простых задач.
Региональные настройки операционной системы
Локаль, установленная в PHP с помощью setlocale(), обычно соответствует региональным настройкам операционной системы. Например, если в Windows установлен русский язык, то setlocale(LC_ALL, '') выберет русскую локаль.
Поэтому при разработке локализованных приложений нужно учитывать настройки OC пользователей. Либо задавать локаль явно в коде вне зависимости от региональных параметров.
Работа с файловой системой
При работе с файловой системой тоже важно учитывать кодировку. Если имена файлов на кириллице, то и скрипт должен использовать UTF-8.
Для этого в начале скрипта после setlocale() нужно добавить:
mb_internal_encoding('UTF-8');
Это установит кодировку по умолчанию для мультибайтовых строк в PHP.
Поддержка нескольких языков
Для приложений, которые поддерживают несколько языков, удобно хранить переводы в отдельных файлах вида:
- messages.en.php - английский
- messages.ru.php - русский
- messages.de.php - немецкий
А в коде подключать нужный файл в зависимости от выбранной локали.
include "messages.{$_SESSION['locale']}.php";
Это избавит от условий и switch в коде для выбора языка.
Локализация фронтенда
Для локализации фронтенда можно использовать JavaScript.
Библиотеки вроде i18next позволяют загружать словари с переводом через AJAX и подставлять текст на нужном языке.
Такой подход дает возможность переключать язык прямо на клиенте, без обращения к серверу.
Тестирование локализованных приложений
При тестировании локализованных приложений важно проверять:
- Корректность перевода текста
- Форматы даты и времени
- Разделители в числах и валютах
- Сортировку строк
- Кодировки при работе с файлами
Нужно тщательно тестировать приложение для каждой поддерживаемой локали и OC (Windows, Linux, MacOS).
Готовые решения
Для сложных многоязычных проектов имеет смысл использовать готовые решения, такие как:
- Плагин WPML для WordPress
- Модуль i18n для Yii2
- Библиотека laravel-localization для Laravel
Это сэкономит время и избавит от рутины при локализации крупных систем.