Перейти к содержанию

Работа с языковыми фразами

Как работает

Битрикс не хранит все фразы в памяти сразу. Он использует механизм ленивого чтения:

  • Если не была ранее загружена в self::$messages[$language][$code] — запускается механизм поиска фразы self::loadLazy($code, $language)
  • Найденная фраза записывается в self::$messages[$language][$code]
  • Возвращается найденное значение
  • При следующих обращениях возвращается значение из self::$messages[$language][$code]

  • \Bitrix\Main\Localization\Loc::loadMessages() — регистрирует путь в массиве

self::$lazyLoadFiles[$file] = $file;

Ленивый поиск фраз — 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() — ищет и прогружает языковые фразы. Возвращет результаты прогрузки в виде массива.