Словарь целиком: DictionaryRepository

Lang::get() отдаёт одну фразу. Когда нужна выборка или служебная операция, работают напрямую с хранилищем:

use mrLexndr\Translate\Repository\DictionaryRepository;

Основные методы

getByCode(string $code): ?array — читает запись целиком, со всеми языками. Берёт из файлового кеша; если кеша нет, собирает его заново.

add(string $code, ?string $fallback): void — заводит запись. Гонку двух параллельных запросов, пытающихся создать один код, ловит сам: нарушение уникального индекса перехватывается и пишется в журнал, исключение наружу не выбрасывается. Для вызывающего кода это означает, что add() можно звать, не оборачивая в проверку «а вдруг уже создали».

regenerateCacheFile(string $lang): void — пересобирает файл словаря для языка. Запись идёт во временный файл с последующим переименованием, под блокировкой. После захвата блокировки метод ещё раз проверяет, не собрал ли файл другой процесс, — иначе десяток одновременных запросов устроил бы десяток последовательных пересборок подряд.

cleanCacheDir() и Lang::cleanCache() — не удаляют кеш немедленно. Они ставят отметку «устарел», а пересборка происходит лениво, при первом чтении. Разница существенна: синхронное удаление на сайте под нагрузкой означает, что все текущие запросы разом обнаружат пустой кеш и кинутся его строить.

Где используется фраза

\mrLexndr\Translate\Lang::findUsages($search);

Возвращает список относительных путей файлов, где встречается строка. На этом построена вкладка «Где используется» — она появляется не на экране словаря, а на карточке записи highload-блока.

Вкладка требует права на чтение в модуле. Висит она на форме ядра, и раньше единственным условием были права на модуль highload-блоков: человек с запретом на mrlexndr.translate вкладку всё равно получал, а по ссылке запускал обход всего сайта и видел список путей файлов проекта. Теперь право спрашивается до первого обращения к словарю и к сканеру.

Внутри два пути. Если в системе есть grep, зовётся он: на больших проектах это заметно быстрее обхода средствами PHP. Иначе идёт рекурсивный обход с отсечением исключённых каталогов на уровне рекурсии.

Тот же механизм считает UF_USAGE_COUNT при индексации — и наследует те же ограничения: находятся только явные вызовы с кодом в кавычках, в файлах PHP.

Кеш и его цена

Словарь кешируется файлом на язык, и файл читается на каждом запросе страницы. Поэтому размер словаря — это время отклика сайта, а не только место на диске.

Отсюда правило: не заводите в словаре то, что словарём не является. Тексты карточек товаров живут в инфоблоках, а не здесь.