Skip to content

Переводчик

ADP автоматически перехватывает вызовы переводчика в вашем приложении и записывает каждый запрос — включая отсутствующие переводы. Изменения кода не требуются.

TranslatorCollector

TranslatorCollectorAppDevPanel\Kernel\Collector\TranslatorCollectorCaptures translation lookups during request execution.final Kernel · class · implements SummaryCollectorInterface реализует 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}.Kernel · interface · extends CollectorInterface и фиксирует каждый запрос перевода во время выполнения запроса.

TranslationRecord

Каждый вызов перевода создаёт DTO TranslationRecordAppDevPanel\Kernel\Collector\TranslationRecordClass TranslationRecord.readonly Kernel · class:

ПолеТипОписание
categorystringДомен/группа перевода (например, messages, app, validation)
localestringЦелевая локаль (например, en, de, fr)
messagestringИсходный идентификатор сообщения / ключ перевода
translation?stringПереведённая строка или null, если перевод отсутствует
missingbooltrue, если перевод не найден
fallbackLocale?stringИспользованная резервная локаль (если применимо)

Собранные данные

getCollected() возвращает:

php
[
    '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() возвращает:

php
[
    'translator' => [
        'total' => 2,
        'missing' => 1,
    ],
]

Определение отсутствующих переводов

Каждый proxy фреймворка определяет отсутствие перевода по-разному, но логика единообразна: если переводчик возвращает исходный идентификатор сообщения без изменений, перевод считается отсутствующим.

ФреймворкМетод определения
Symfonytrans() возвращает $id без изменений
Laravelget() возвращает $key без изменений
Yii 3translate() возвращает $id без изменений
Yii 2MessageSource::translate() возвращает false

Proxy фреймворков

Каждый адаптер предоставляет proxy переводчика, который оборачивает нативный переводчик фреймворка и передаёт данные в TranslatorCollectorAppDevPanel\Kernel\Collector\TranslatorCollectorCaptures translation lookups during request execution.final Kernel · class · implements SummaryCollectorInterface. Proxy регистрируются автоматически — ручная настройка не требуется.

Symfony — SymfonyTranslatorProxyAppDevPanel\Adapter\Symfony\Proxy\SymfonyTranslatorProxyDecorates Symfony's TranslatorInterface to feed translation lookups to TranslatorCollector.final Adapter/Symfony · class · implements TranslatorInterface

Декорирует 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 proxiesfinal Adapter/Symfony · class · implements CompilerPassInterface с помощью паттерна setDecoratedService() Symfony.

php
// Все вызовы 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.final Adapter/Laravel · class · implements Translator

Декорирует Illuminate\Contracts\Translation\Translator. Перехватывает вызовы get() и choice().

Подключение: Регистрируется через $app->extend('translator', ...) в сервис-провайдере.

php
// Все хелперы перевода перехватываются
__('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.final Adapter/Yii3 · class · implements TranslatorInterface

Декорирует Yiisoft\Translator\TranslatorInterface. Перехватывает вызовы translate().

Подключение: Регистрируется как trackedService в params.php — система proxy-сервисов адаптера автоматически выполняет декорирование.

php
// Все вызовы 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.final Adapter/Yii2 · class · extends I18N

Расширяет yii\i18n\I18N и переопределяет translate(). Заменяет компонент приложения i18n.

Подключение: Модуль заменяет Yii::$app->i18n экземпляром proxy, копируя существующую конфигурацию переводов.

php
// Все вызовы Yii::t() перехватываются
Yii::t('app', 'welcome', [], 'de');
  • Вызывает $messageSource->translate() напрямую — возвращает false при отсутствии (надёжнее сравнения строк)
  • Безопасен без коллектора (null-safe $this->collector?->logTranslation())

Конфигурация

Перехват переводов включён по умолчанию, когда активен TranslatorCollectorAppDevPanel\Kernel\Collector\TranslatorCollectorCaptures translation lookups during request execution.final Kernel · class · implements SummaryCollectorInterface. Дополнительная настройка не требуется.

yaml
# config/packages/app_dev_panel.yaml
app_dev_panel:
    collectors:
        translator: true    # включён по умолчанию

Панель во фронтенде

TranslatorPanel в интерфейсе отладки отображает:

  • Значок сводки — общее количество переводов и количество отсутствующих
  • Таблица переводов — все записанные переводы с категорией, локалью, сообщением, переведённым значением и статусом
  • Фильтры — фильтрация по локали, категории или статусу отсутствия
  • Подсветка отсутствующих — отсутствующие переводы визуально выделены для быстрого обнаружения

Выпущено под лицензией MIT.