Разделы Написать в Telegram

Подсчёт использования фраз

Считает, в скольких файлах проекта встречается каждая фраза словаря. Запускается на экране Обслуживание, вкладка «Неиспользуемые фразы», шаг 1 «Подсчитать использование».

Как устроен прогон

Две фазы, обе — короткими шагами.

  1. Обход дерева. Каждый шаг просматривает не больше 40 файлов и не дольше 8 секунд, прибавляет найденное к счётчикам и запоминает, на каком файле остановился. Следующий шаг продолжает с этого места.
  2. Запись. Когда дерево пройдено, счётчики записываются в словарь пачками с курсором.

Промежуточное состояние хранится во временном файле, а не в сессии, и блокировка сессии освобождается сразу — другие вкладки админки не подвисают.

Раньше первый шаг обходил всё дерево проекта за один запрос и мог держать процесс PHP несколько минут. На большом проекте это упиралось в таймауты сервера, поэтому с 8.1.1 обход нарезан.

«Начать» заново — значит с нуля. Незаконченный прогон при повторном запуске не продолжается, а сбрасывается: иначе повторный клик дописал бы счётчики поверх старых, и каждая фраза посчиталась бы дважды.

Что именно ищется

Два набора образцов.

Вызовы модуля — Lang::get и LANG_VAR с кодом фразы в кавычках, с полным именем пространства имён и без него.

Штатные вызовы Битрикса — GetMessage, Loc::getMessage и прямое обращение к массиву сообщений.

Код длиннее 250 символов не учитывается. Файл с вхождением считается один раз, сколько бы раз фраза в нём ни встретилась.

Образцы ожидают одинарные кавычки вокруг кода; для двойных у вызовов модуля есть отдельная ветка.

Точка расширения

Если у вас своя обёртка над словарём, добавьте её образец в список образцов первого набора — метод CodeScanner::getPassAPatterns().

Без этого все фразы, выведенные через обёртку, будут числиться неиспользуемыми и попадать в кандидаты на удаление. См. Своя обёртка для переводов.

Исключения путей

Список исключённых каталогов лежит в сканере; обычно достаточно дописать туда свой путь.

Исключаются загрузки, кеш, каталоги зависимостей и сам модуль. Последнее существенно: внутри модуля кодов фраз много, и без исключения счётчики были бы завышены у всех служебных фраз.

Чего индексатор не может

Он читает текст файлов, а не выполняет их. Поэтому код фразы, собранный в программе из кусков, он не видит в принципе, и такие фразы всегда числятся неиспользуемыми.

Это не недоработка, а граница метода. Выполнять код проекта, чтобы узнать, какие фразы он позовёт, нельзя ни при каких обстоятельствах.