Переводчик
ADP автоматически перехватывает вызовы переводчика в вашем приложении и записывает каждый запрос — включая отсутствующие переводы. Изменения кода не требуются.
TranslatorCollector
TranslatorCollectorAppDevPanel\Kernel\Collector\TranslatorCollectorCaptures translation lookups during request execution. реализует SummaryCollectorInterfaceAppDevPanel\Kernel\Collector\SummaryCollectorInterfaceSummary data collector responsibility is to collect summary data for a collector. Summary is used to display a list of previous requests and select one to display full info. Its data set is specific to the list and is reduced compared to full data collected in {@see CollectorInterface}. и фиксирует каждый запрос перевода во время выполнения запроса.
TranslationRecord
Каждый вызов перевода создаёт DTO TranslationRecordAppDevPanel\Kernel\Collector\TranslationRecordClass TranslationRecord.:
| Поле | Тип | Описание |
|---|---|---|
category | string | Домен/группа перевода (например, messages, app, validation) |
locale | string | Целевая локаль (например, en, de, fr) |
message | string | Исходный идентификатор сообщения / ключ перевода |
translation | ?string | Переведённая строка или null, если перевод отсутствует |
missing | bool | true, если перевод не найден |
fallbackLocale | ?string | Использованная резервная локаль (если применимо) |
Собранные данные
getCollected() возвращает:
[
'translations' => [
['category' => 'messages', 'locale' => 'de', 'message' => 'welcome', 'translation' => 'Willkommen!', 'missing' => false, 'fallbackLocale' => null],
['category' => 'messages', 'locale' => 'de', 'message' => 'goodbye', 'translation' => null, 'missing' => true, 'fallbackLocale' => null],
],
'missingCount' => 1,
'totalCount' => 2,
'locales' => ['de'],
'categories' => ['messages'],
]Сводка
getSummary() возвращает:
[
'translator' => [
'total' => 2,
'missing' => 1,
],
]Определение отсутствующих переводов
Каждый proxy фреймворка определяет отсутствие перевода по-разному, но логика единообразна: если переводчик возвращает исходный идентификатор сообщения без изменений, перевод считается отсутствующим.
| Фреймворк | Метод определения |
|---|---|
| Symfony | trans() возвращает $id без изменений |
| Laravel | get() возвращает $key без изменений |
| Yii 3 | translate() возвращает $id без изменений |
| Yii 2 | MessageSource::translate() возвращает false |
Proxy фреймворков
Каждый адаптер предоставляет proxy переводчика, который оборачивает нативный переводчик фреймворка и передаёт данные в TranslatorCollectorAppDevPanel\Kernel\Collector\TranslatorCollectorCaptures translation lookups during request execution.. Proxy регистрируются автоматически — ручная настройка не требуется.
Symfony — SymfonyTranslatorProxyAppDevPanel\Adapter\Symfony\Proxy\SymfonyTranslatorProxyDecorates Symfony's TranslatorInterface to feed translation lookups to TranslatorCollector.
Декорирует Symfony\Contracts\Translation\TranslatorInterface. Перехватывает вызовы trans().
Подключение: Регистрируется через CollectorProxyCompilerPassAppDevPanel\Adapter\Symfony\DependencyInjection\CollectorProxyCompilerPassCompiler pass that: 1. Collects all tagged collectors and injects them into the Debugger 2. Decorates PSR services (Logger, EventDispatcher, HttpClient) with proxies с помощью паттерна setDecoratedService() Symfony.
// Все вызовы trans() перехватываются автоматически
$translator->trans('welcome', [], 'messages', 'de');- Домен по умолчанию:
messages(когда$domainравенnull) - Использует трейт
ProxyDecoratedCallsдля проброса методов
Laravel — LaravelTranslatorProxyAppDevPanel\Adapter\Laravel\Proxy\LaravelTranslatorProxyDecorates Laravel's Translator to feed translation lookups to TranslatorCollector.
Декорирует Illuminate\Contracts\Translation\Translator. Перехватывает вызовы get() и choice().
Подключение: Регистрируется через $app->extend('translator', ...) в сервис-провайдере.
// Все хелперы перевода перехватываются
__('messages.welcome');
trans('messages.welcome');
Lang::get('messages.welcome');- Разбирает точечную нотацию ключей Laravel:
group.key→ категорияgroup, сообщениеkey - JSON-переводы (без точки): категория по умолчанию
messages - Использует трейт
ProxyDecoratedCallsдля проброса методов
Yii 3 — TranslatorInterfaceProxyAppDevPanel\Adapter\Yii3\Collector\Translator\TranslatorInterfaceProxyDecorates Yiisoft TranslatorInterface to feed translation lookups to TranslatorCollector.
Декорирует Yiisoft\Translator\TranslatorInterface. Перехватывает вызовы translate().
Подключение: Регистрируется как trackedService в params.php — система proxy-сервисов адаптера автоматически выполняет декорирование.
// Все вызовы translate() перехватываются
$translator->translate('welcome', [], 'app', 'de');- Категория по умолчанию:
app(когда$categoryравенnullиwithDefaultCategory()не вызывался) - Поддерживает иммутабельные
withDefaultCategory()иwithLocale()черезclone
Yii 2 — I18NProxyAppDevPanel\Adapter\Yii2\Proxy\I18NProxyDecorates Yii 2's I18N component to feed translation lookups to TranslatorCollector.
Расширяет yii\i18n\I18N и переопределяет translate(). Заменяет компонент приложения i18n.
Подключение: Модуль заменяет Yii::$app->i18n экземпляром proxy, копируя существующую конфигурацию переводов.
// Все вызовы Yii::t() перехватываются
Yii::t('app', 'welcome', [], 'de');- Вызывает
$messageSource->translate()напрямую — возвращаетfalseпри отсутствии (надёжнее сравнения строк) - Безопасен без коллектора (null-safe
$this->collector?->logTranslation())
Конфигурация
Перехват переводов включён по умолчанию, когда активен TranslatorCollectorAppDevPanel\Kernel\Collector\TranslatorCollectorCaptures translation lookups during request execution.. Дополнительная настройка не требуется.
# config/packages/app_dev_panel.yaml
app_dev_panel:
collectors:
translator: true # включён по умолчаниюПанель во фронтенде
TranslatorPanel в интерфейсе отладки отображает:
- Значок сводки — общее количество переводов и количество отсутствующих
- Таблица переводов — все записанные переводы с категорией, локалью, сообщением, переведённым значением и статусом
- Фильтры — фильтрация по локали, категории или статусу отсутствия
- Подсветка отсутствующих — отсутствующие переводы визуально выделены для быстрого обнаружения