From 3c0ffa23bc81c753e78141cb517b17ff3b2d6f2a Mon Sep 17 00:00:00 2001 From: Ku6epXBOCTuK Date: Mon, 24 Aug 2026 18:51:48 +0500 Subject: [PATCH] docs: update plan --- docs/{ => archive}/plan-easy-wave3.md | 2 +- docs/plan-i18n.md | 57 +++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) rename docs/{ => archive}/plan-easy-wave3.md (99%) create mode 100644 docs/plan-i18n.md diff --git a/docs/plan-easy-wave3.md b/docs/archive/plan-easy-wave3.md similarity index 99% rename from docs/plan-easy-wave3.md rename to docs/archive/plan-easy-wave3.md index b202c89..4580105 100644 --- a/docs/plan-easy-wave3.md +++ b/docs/archive/plan-easy-wave3.md @@ -1,6 +1,6 @@ # План: третья волна EASY — трансформации, свет, SVG -> Статус: план к выполнению. +> **СТАТУС: ВЫПОЛНЕН 24.08.2026.** ## 1. Что получается diff --git a/docs/plan-i18n.md b/docs/plan-i18n.md new file mode 100644 index 0000000..21b3beb --- /dev/null +++ b/docs/plan-i18n.md @@ -0,0 +1,57 @@ +# План: i18n — русский и английский + +> Статус: план к выполнению. + +## 1. Что получается + +Сайт работает на двух языках: русский (базовый) и английский. Переключатель в шапке, выбор сохраняется в localStorage, тег `html lang` обновляется на клиенте. Переведено всё: каркас интерфейса, карточки инструментов, цепочки, поиск, тексты ошибок. Поиск находит инструменты по запросу на любом из двух языков независимо от активной локали. + +Каталог и поведение не меняются: ни новых инструментов, ни изменений логики существующих. + +## 2. Решения + +- Без сегментов языка в URL. Статика пререндерится на русском; переключение на клиенте, выбор живёт в localStorage. hreflang/canonical и вторая копия страниц для поисковиков — не в этой волне. +- Ядро не знает о локалях. Ошибки в core выбрасываются стабильными кодами (например ERR_BAD_HEX); перевод кода в человекочитаемый текст происходит в слое исполнителя/UI. +- Строки реестра живут в словарях, а не инлайн: словарь содержит секцию tools, ключ — id инструмента, внутри title, description, labels параметров и label'ы опций select. Реестр хранит только схему параметров и логику run. + +## 3. Структура i18n-модуля + +- web/src/lib/i18n/locale.svelte.ts — состояние активной локали (runes), персист в localStorage (ключ locale, guard на SSR), обновление document.documentElement.lang. +- web/src/lib/i18n/t.ts — функция перевода с фолбэком на базовый язык и интерполяцией переменных вида {n}. +- web/src/lib/i18n/ru.ts и en.ts — словари одного типа Dict; тип экспортируется из ru.ts, en.ts обязан ему соответствовать — пропущенные ключи ловятся на компиляции. +- Секции словаря: header, home, catalog, toolPage, chain, sourceCard, resultCard, paramsCard, textInput, textResult, download, infoPanel, dropZone, search, ui (aria кнопок слайдера и пипетки), categories, errors, tools. + +## 4. Этапы и проверки + +Каждый этап заканчивается зелёными test/check/build и ревью. + +- A. Инфраструктура — модуль состояния, функция перевода с фолбэком и интерполяцией, словари-скелеты со всеми секциями (заполнены header и categories как пилот), переключатель RU/EN в шапке, реактивный lang. Тесты: фолбэк на ru при отсутствии ключа в en, интерполяция, персист локали. +- B. Каркас интерфейса — перенос всех хардкод-строк компонентов и маршрутов в словари: layout (шапка, футер), главная (герой, «вернуть последний», title), каталог, карточки источника/результата/параметров, текстовый вход и результат, «Показать маску», DropZone/DropOverlay, кнопка скачивания (busyText), InfoPanel плюс форматирование чисел через тег локали вместо жёсткого ru-RU, ToolPage (легенды, «Шаг n», ошибки шага), ChainToolBlock, placeholder и пустой результат поиска, страницы инструмента (title, 404). Обёрточные сообщения исполнителя («Ошибка исполнения в воркере») — тоже здесь. +- C. Контент реестра — 69 инструментов: title/description/labels/options переезжают в tools-секцию обоих словарей; компоненты получают строки через хелперы toolTitle/paramLabel. Тест целостности: у каждого инструмента в каждом словаре непустые title/description, полный набор param-ключей и отсутствие лишних ключей. +- D. Поиск по любому языку — нормализация запроса и полей: нижний регистр, ё→е, снятие диакритики через NFD; скоринг против активной и базовой локали сразу, лучший балл побеждает; сортировка совпадений через Intl.Collator активной локали. Тесты нормализации: ё/е, диакритика, английский запрос при русской локали и наоборот. +- E. Ошибки на кодах — около 40 мест throw в core, registry, pipeline заменяются на коды; исполнитель переводит код в текст активной локали, неизвестные сообщения показываются как есть. Пять тестов, матчащих русские подстроки ошибок (executor, pipeline, registry, io, alpha), переходят на коды — это упрощает ассерты. Русские describe/it в тестах не трогаем. +- F. Итог — полный прогон, смоук чеклист §6, архивация плана. + +## 5. Смоук-чеклист + +1. Переключение RU/EN в шапке мгновенно меняет язык без перезагрузки; после перезагрузки выбор сохранён. +2. Тег html lang соответствует активной локали. +3. Главная, каталог, страница инструмента, цепочка из трёх звеньев — везде переведено, без смеси языков. +4. Форма параметров: подписи полей и опции select переведены у произвольных пяти инструментов из разных категорий. +5. Битый вход (некорректный HEX в тонировании, нулевой размер) показывает ошибку на активном языке. +6. Поиск: «повер» находит повороты при русской локали; «rotate» находит их же; при английской локали наоборот. Диакритика и ё не мешают совпадению. +7. Числа в панели информации отформатированы по локали. +8. Скачивание, пипетка, маски, слайдеры работают одинаково на обеих локалях — функциональность не задета. + +## 6. Критерии готовности + +- Оба словаря типобезопасны и полны; тест целостности секции tools зелёный. +- Ни одного пользовательского русского строки вне словарей (кроме тестовых describe/it). +- test/check/build зелёные, смоук пройден. + +## 7. Что сознательно не делаем + +- Сегменты языка в URL, prerender обеих локалей, hreflang/canonical. +- Транслитерация поисковых запросов ru-en. +- Третьи и дальнейшие языки (структура позволяет, добавление — отдельная волна). +- Перевод описаний коммитов, README и документации docs/.