Локализация (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— переключение локали в сессии (middlewareSetLocale);?lang=/?locale=в URL —SetLocaleчитает язык из query-параметра (значенияru/en/cn) и запоминает в сессии. Используется ссылками с лендинга (/agent/login?lang=en), чтобы система открывалась сразу на нужном языке.
В шаблонах — $t, в <script setup> — inject('t') (для confirm/prompt/alert).
2. Автоперевод динамики¶
Динамические данные (имена статусов, справочники, тексты посредника, имена групп прав) переводятся на лету через Google Translate (DynamicLocalizationService, TranslateService::localizeMany), с кэшем в translation_cache (дедуп по строке). cn → zh-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).