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

Это сэкономит время и избавит от рутины при локализации крупных систем.

Комментарии