Словарь целиком: 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.
Кеш и его цена
Словарь кешируется файлом на язык, и файл читается на каждом запросе страницы. Поэтому размер словаря — это время отклика сайта, а не только место на диске.
Отсюда правило: не заводите в словаре то, что словарём не является. Тексты карточек товаров живут в инфоблоках, а не здесь.