Deal — единая кодовая база
ci / build-test (push) Canceled after 0s

SaaS-мониторинг Telegram: ядро (модули Cards/Kanban/Pipeline/Tenants/Settings/
Discovery, Api, Infrastructure), сервисы telegram/ai/ml/storage, фронт Vue,
контракты и grpc-hosting, деплой-конфиги (dev/prod/observability/CI-раннер),
Gitea Actions CI, документация (ТЗ, техдок, api-map, код-стайл, планы, бэклог).

Текущее состояние: все этапы роадмапа 0–12 закрыты, сборка 5 sln 0/0,
тесты 1340/130/52/38/9 зелёные.
This commit is contained in:
Rustam Khalimov
2026-09-11 23:56:47 +03:00
commit 27c7831910
1383 changed files with 158436 additions and 0 deletions
@@ -0,0 +1,27 @@
# SDD ledger — plan: docs/superpowers/plans/2026-09-10-deal-stage11-i18n.md
Проект НЕ git: фиксация — отчёты задач и этот ledger.
## Решение владельца (2026-09-10)
Только русский; переключатель языка и второй язык на этом этапе НЕ делались — оставлены в бэклоге
(делаем при появлении потребности). Задача — вынести строки в
ресурсы (архитектура готова к добавлению языка позже). Визуал/тексты — 1:1.
## Todos
- [x] T1: i18n-ядро (t/locale/словари, фолбэк ru)
- [x] T2: Словарь ru (инвентаризация по областям)
- [x] T3: Миграция основного приложения на t()
- [x] T4: Миграция оператор-консоли и /join
- [x] T5: Локализация ошибок/статусов
- [x] T6: Проверки (линтер кириллицы вне словарей, build)
- [x] T7: Доки и STATUS
## В бэклоге (делаем при появлении потребности)
- Переключатель языка в UI и второй язык.
- Форматтеры Intl/плюрализация — вместе с языком.
## Task status
- 2026-09-10: этап 11 выполнен (урезанный объём). Ядро `src/frontend/src/i18n/` (index.js, locales/ru.js,
locales/ru.data.js, errors.js); строки вынесены: 1039 ключей в 13 областях, 1209 ссылок `t()/$t()` в 65
файлах. `npm run build` — зелёный; `npm run lint:i18n` — зелёный. Временные кодимод-скрипты удалены.
Переключателя языка в UI нет (по решению владельца). См. task-report.md.
@@ -0,0 +1,80 @@
# Task report — Дейл, этап 11: локализация (i18n, урезанный объём)
Дата: 2026-09-10. План: `docs/superpowers/plans/2026-09-10-deal-stage11-i18n.md`.
## Итог
Все пользовательские строки фронтенда вынесены из компонентов/вьюх/store в словари-ресурсы.
Язык один — русский; **переключателя языка в UI нет и второго языка нет** (решение владельца).
Архитектура готова к добавлению языка позже без правок компонентов. Отображаемые тексты — 1:1.
- `npm run build`**зелёный** (vite build, `✓ built`).
- `npm run lint:i18n`**зелёный** («кириллических пользовательских строк вне словарей не найдено»).
- Словарь: **1039 ключей** в **13 областях**; **1209 ссылок** `t()/$t()` в **65** файлах `src/**/*.{vue,js}`.
## Структура `src/frontend/src/i18n/`
```
src/i18n/
index.js — ядро: t(key, params), реактивный locale (default ru),
setLocale(), registerLocale(), availableLocales(), useI18n(),
Vue-плагин ($t в шаблонах). Фолбэк: активный язык → ru → сам ключ.
errors.js — localizeError(err, fallbackKey): HTTP-статусы/сеть → ключи errors/*,
осмысленный {detail} бэка и неизвестное — как есть.
locales/
ru.js — словарь сообщений (единственный источник текстов).
ru.data.js — языковой контент-каталог (валюты, AI-провайдеры, дефолтные
промпты, категории/шаблоны промптов), реэкспортируется из src/data.js.
```
Подключение: `main.js``createApp(App).use(i18n)`. Алиас Vite `@ → src` (без новых зависимостей)
для единого импорта `@/i18n/index.js`.
## Области ключей (`ru.js`)
`common/` `nav/` `search/` `cards/` `drawer/` `columns/` `settings/` `channels/` `processing/`
`auth/` `operator/` `join/` `errors/` (+ вложенные подразделы). Разбивка по количеству ключей:
settings 260, common 156, channels 146, operator 144, cards 75, processing 74, drawer 56,
columns 48, nav 30, join 28, auth 7, search 2, errors 13.
## Что сделано по задачам
- **T1. Ядро i18n** — `src/i18n/index.js` без внешних зависимостей: `t(key, params)` с подстановкой
`{name}`, реактивный `locale` (default `ru`), `setLocale()` (готов, UI нет), `registerLocale()`,
загрузка словарей, фолбэк на `ru`. Плагин даёт шаблонам `$t(...)`.
- **T2. Словарь ru** — инвентаризация строк по областям; значения 1:1 с исходными. Языковой контент
из `src/data.js` (валюты, провайдеры, промпты, категории) перенесён в `locales/ru.data.js`.
- **T3. Миграция основного приложения** — компоненты, вьюхи и store-слайсы (`store/*.js`) переведены
на `t()`/`$t()`; строки в store тоже вынесены.
- **T4. Оператор-консоль и `/join`** — все разделы консоли и `JoinView` мигрированы.
- **T5. Ошибки/статусы** — `i18n/errors.js` маппит известные HTTP-статусы и сетевые сбои на `errors/*`;
точка применения — `errMsg` в `store/core.js`. Неизвестный текст бэка показывается как есть.
- **T6. Проверки** — `scripts/i18n-lint.mjs` + `npm run lint:i18n`: падает на кириллицу в пользовательских
строках вне `src/i18n/locales/**`; корректно пропускает JS/HTML-комментарии, regex-литералы и строки
с директивой `i18n-ignore`. `npm run build` — зелёный.
- **T7. Доки** — обновлены `docs/user-guide/Инструкция-пользователя-Дейл.md` (раздел «Язык интерфейса»,
без упоминания переключателя) и `docs/technical/Техническая-документация-Дейл.md` (раздел 14: устройство
i18n и пошаговая инструкция «как добавить язык позже»). Это единственные правки вне `src/frontend`.
## Ключевые решения и нюансы
- **Технические строки не локализованы**: dev-лог в `Icon.vue` и служебные значения помечены
`i18n-ignore`; тексты причин отказа бэкенда в `JoinView` оставлены как данные-ключи карты подсказок.
- **Плюрализация не вводилась** (отложено): множественные формы по-прежнему выбираются в коде
(`... === 1 ? 'файл' : 'файлов'`), но уже через ключи словаря.
- **Дубли значений устранены** переназначением ссылок (общие строки — в `common/`).
Единственное «дублирование» — `errors.badGateway`/`errors.network` (разные по смыслу статусы).
## Осталось / отложено (по решению владельца)
- Переключатель языка в UI и второй язык (en) — по запросу.
- Перевод дат/чисел/валют на `Intl` и плюрализация — вместе с будущим языком.
- Константы, вычисляемые один раз при загрузке модуля (контент-каталог `ru.data.js`, карты подсказок),
держат язык, выбранный на старте; для полноценного «горячего» переключения их потребуется обернуть
в `computed`. На текущем этапе (один язык) поведение идентично прежнему.
## Валидация
- `cd C:\telbase\src\frontend && npm run build``✓ built in ~1.2s` (единственное замечание — предупреждение
Vite о размере чанка >500 kB; словарь расширил бандл, на сборку не влияет).
- `npm run lint:i18n``✓ i18n: кириллических пользовательских строк вне словарей не найдено.`