Перейти к содержанию

Локализация (i18n)

Система полностью локализована на русский / английский / китайский. Это критично: посредники могут быть китайцами (работают с товаром в Китае), а клиенты — в основном русскоязычные.

Два механизма

flowchart TB
    subgraph Статика
        S1["$t('key', 'RU fallback')"] --> S2[translations таблица + удалённый словарь]
    end
    subgraph Динамика
        D1[Данные из БД / тексты посредника] --> D2[Google Translate]
        D2 --> D3[translation_cache]
    end

1. Статические строки интерфейса

$t('key', 'RU fallback') — RU всегда берётся из фолбэка компонента, EN/CN подгружаются:

  • GET /lang/{locale} — словарь по локали (клиентский загрузчик);
  • POST /locale — переключение локали в сессии (middleware SetLocale);
  • ?lang= / ?locale= в URLSetLocale читает язык из query-параметра (значения ru/en/cn) и запоминает в сессии. Используется ссылками с лендинга (/agent/login?lang=en), чтобы система открывалась сразу на нужном языке.

В шаблонах — $t, в <script setup>inject('t') (для confirm/prompt/alert).

2. Автоперевод динамики

Динамические данные (имена статусов, справочники, тексты посредника, имена групп прав) переводятся на лету через Google Translate (DynamicLocalizationService, TranslateService::localizeMany), с кэшем в translation_cache (дедуп по строке). cnzh-CN.

  • Системные/справочные DB-данные (одинаковые у всех) → server-side перевод в контроллере.
  • Каталоги-справочники переводятся на язык зрителя на выводе (cn-посредник ввёл → русскому клиенту по-русски, и наоборот).
  • Данные пользователя (имена клиентов/сотрудников) — не переводятся.
  • Поля ввода посредника (его тексты о доставке) — не переводятся (канонический источник); перевод применяется только в display-контекстах.

Хранилище переводов

  • translations — локальный overlay поверх удалённого словаря (translate.taomaster.ru). Локальные значения имеют приоритет. is_long=true — длинные тексты (баннеры, оферты), не перезатираются при pull.
  • translation_cache — кэш автопереводов Google.

Модель «pull»: CRM держит копию словаря; в админке (/admin/translations, редактируемый Filament-ресурс) — правка ru/en/cn любого ключа + кнопка «Обновить с translate.taomaster.ru».

Команды

Команда Назначение
translations:pull Подтянуть словарь с удалённого сервиса
translations:scan-ui Сканировать $t('key','RU') в resources/js и зарегистрировать ключи
translations:seed-ui Детерминированно засеять curated-словарь статических UI-ключей (Google + ручные правки)
translations:seed-banners Засеять длинные тексты баннеров заказа (EN/CN)

Реактивность смены языка

Переключение языка делает router.post('/locale', {preserveState:false}) → пропсы пере-рендерятся и серверный автоперевод динамики подставляется. Для мгновенной статики есть window.__taoSetLocale(loc).

Статус

Полное обёртывание UI-строк (≈ 935+ ключей) завершено по всем страницам и общим компонентам. Динамические лейблы статусов переводятся через префиксы-ключи (ost. заказ, sst. отгрузка, dst. груз, ist. счёт, bst. выкуп, ast. прибытие). Остаточная мелочь — HTML печати этикеток (RU).