Yandex Metrika
sanches.free 19 просмотров

Региональные настройки в Bitrix D7: \Bitrix\Main\Context\Culture

Зачем отдельный объект Culture

В D7 строковые представления дат на витрине и в административке не должны жёстко прошиваться в шаблонах: они зависят от языка сайта и выбранных шаблонов в региональных настройках. За это отвечает \Bitrix\Main\Context\Culture — объект с полями вроде FORMAT_DATE, FORMAT_DATETIME, FORMAT_NAME, CHARSET, DIRECTION, WEEK_START. Его удобно читать из текущего Context или поднимать из таблицы b_culture через ORM.

Текущие региональные настройки хита

Для активного запроса достаточно взять культуру у singleton-контекста приложения:

$culture = \Bitrix\Main\Context::getCurrent()->getCulture();

В отладке вы увидите набор полей (языковой код, сортировка, форматы, признак направления RTL и т.д.). На продакшене не печатайте объект целиком в публичный вывод — это лишний шум и утечка конфигурации.

Свой экземпляр на время задачи

Иногда нужно временно отформатировать данные по правилам другой локали (отчёт, выгрузка, письмо). Создайте отдельный объект с нужным набором полей и при необходимости передайте его в Context::setCulture() — но делайте это точечно, чтобы не сломать компоненты, завязанные на глобальные форматы текущего сайта:

use Bitrix\Main\Context\Culture;

$culture = new Culture([
    'FORMAT_DATE' => 'MM/DD/YYYY',
    'FORMAT_DATETIME' => 'MM/DD/YYYY HH:MI:SS',
    'FORMAT_NAME' => '#NAME# #LAST_NAME#',
    'CHARSET' => 'UTF-8',
    'DIRECTION' => 'Y',
    'WEEK_START' => 0,
]);

Загрузка из базы по идентификатору

Метод Culture::wakeUp($cultureId) восстанавливает объект по числовому ID записи региональных настроек. Удобно, когда у вас в настройках модуля или в пользовательских полях хранится ссылка на конкретную строку таблицы культур, а не символьный код языка сайта:

$cultureId = 1;
$culture = \Bitrix\Main\Context\Culture::wakeUp($cultureId);

Геттеры форматов и кодировки

На практике чаще всего нужны человекочитаемые строки формата для DateTime или отображения имени пользователя по шаблону из административной части:

$charset = $culture->getCharset();
$dateFormat = $culture->getDateFormat();
$dateTimeFormat = $culture->getDateTimeFormat();

Состав полей синхронизирован с тем, что задаётся в настройках языков интерфейса; не дублируйте те же литералы в своём коде, если уже есть объект Culture.

Справочник всех культур в системе

ORM-таблица \Bitrix\Main\Localization\CultureTable повторяет содержимое b_culture. Типичный разбор без лишней логики:

$result = \Bitrix\Main\Localization\CultureTable::getList();
while ($row = $result->fetch()) {
    // ID, CODE, NAME, FORMAT_DATE, FORMAT_DATETIME, ...
}

Используйте выборку, когда строите селекты «язык/формат» в собственных модулях или сверяете доступные культуры с мультиязычностью сайта.

Практические замечания

  • Глобальная подмена культуры на весь хит без причины опасна для кешируемых фрагментов и компонентов, которые читают форматы при первой инициализации.
  • В агентах и CLI-скриптах контекст может быть не тем же, что у веб-запроса: при необходимости явно инициализируйте сайт и язык до чтения getCulture().
  • Для HTTP-деталей запроса (а не только форматов) смотрите обзор Context::getCurrent() целиком: там же getRequest(), getSite() и язык интерфейса.

Итог

Минимальный набор API: Context::getCurrent()->getCulture() для текущих форматов, конструктор Culture или wakeUp() для явных профилей, getDateFormat() / getDateTimeFormat() / getCharset() для интеграции с вашим кодом и CultureTable::getList() для перебора записей справочника.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии