Работа с языковыми фразами
Как работает
Битрикс не хранит все фразы в памяти сразу. Он использует механизм ленивого чтения:
- Если не была ранее загружена в
self::$messages[$language][$code]— запускается механизм поиска фразыself::loadLazy($code, $language) - Найденная фраза записывается в
self::$messages[$language][$code] - Возвращается найденное значение
-
При следующих обращениях возвращается значение из
self::$messages[$language][$code] -
\Bitrix\Main\Localization\Loc::loadMessages()— регистрирует путь в массиве
Ленивый поиск фраз — Loc::loadLazy
Сперва с помощью debug_backtrace определяется, из какого файла был вызван Loc::getMessage(). Этот файл добавляется в self::$lazyLoadFiles[$currentFile] = $currentFile;. Видимо, сделано для обратной совместимости.
Далее запускается Loc::loadLanguageFile() — по имени файла битрикс пытается найти ленговые фразы. Для этого он рекурсивно поднимается вверх по структуре каталогов в поисках директории lang.
Если при рекурсивном поиске директория lang не найдена, возвращается пустой массив.
Если же директория lang найдена, Bitrix формирует возможные пути к языковым файлам по следующему правилу: берётся путь относительно каталога lang, добавляется код языка, а затем остаток пути, полученный в результате подъёма по структуре каталогов.
Например, для файла $_SERVER['DOCUMENT_ROOT'] . '/local/lib/Services/Api/UserService.php' возможны следующие варианты расположения языковых файлов:
$_SERVER['DOCUMENT_ROOT'] . '/local/lang/ru/lib/Services/Api/UserService.php'$_SERVER['DOCUMENT_ROOT'] . '/local/lib/lang/ru/Services/Api/UserService.php'
Поля класса Loc
Loc::$messages— найденные фразы. Хранится в форматеself::$messages[$language][$code] = 'Значение фразы'Loc::$lazyLoadFiles— массив путей файлов, которые указываются вLoc::loadMessages(). Тут хранятсяLoc::$triedFiles— массив файлов, для которых был прогнан механизм чтения и обработки
Методы
Loc::loadMessages()— Нормализует путь до файла и помещает путь вself::$lazyLoadFiles[$file] = $file;. Не запускает логики поиска и чтения файлов. Поиск и прогрузка происходит в момент вызоваLoc::getMessage(). Ничего не возвращает.Loc::loadLanguageFile()— ищет и прогружает языковые фразы. Возвращет результаты прогрузки в виде массива.