0068. Сайт документации и одиннадцать языков консоли
Статус: accepted. Owner: Ian Panaev. Дата: 2026-10-05.
Контекст
Пользовательская документация жила в README и в инженерных документах docs/ на русском. README накапливал историю изменений и расходился с кодом: «стадия 0.2», «сторонние протоколы не эмулируются» при работающих OCI, Git LFS и npm, «RU/EN-консоль». Пользователю негде было найти установку, работу с клиентами и справочник API по разделам, с поиском и на своём языке. Консоль говорила на двух языках, документация — на одном.
Решение
Сайт wiki/ (VitePress) публикуется на GitHub Pages: https://proanima.github.io/Arkvory/.
- Разделы: начало работы, установка и обновление, работа с Arkvory, клиенты и протоколы, эксплуатация, HTTP API, справочник API, справка; порядок задаёт
wiki/.vitepress/structure.ts. - Исходный язык — английский; переводы лежат в
wiki/<code>/с теми же страницами и id заголовков. Раздел для разработчиков — копияdocs/на русском, на других языках он помечен «на русском» и не переводится (AGENTS.md). - Справочник API и страница ошибок генерируются перед каждой сборкой (
scripts/wiki.mjs) из OpenAPI, политик операций и кодов ошибок. Тексты для читателей хранятся вwiki/i18n/api/<code>.jsonвместе с исходным текстом, с которого они написаны (en). Изменился контракт или английский текст — страница показывает источник, аtests/wiki.test.mjsпадает, пока текст не обновлён. Расхождение справочника с API обнаруживается тестом. - Подписи элементов консоли в страницах — ключи словаря (
[[ui:key]]), сборка подставляет текст на языке страницы. Переименованный или удалённый ключ ломает сборку. - Поиск локальный (MiniSearch), слова режутся
Intl.Segmenter, так что китайский и японский ищутся по словам. - Сборка — гейт
docs(verify и release), отдельное задание CI. Workflowpages.ymlсобирает толькоmain; правоpages: writeесть только у задачи публикации, которая не выполняет код репозитория (scripts/policy/pages-workflow.mjs).
Языки консоли: английский, русский, испанский, французский, немецкий, португальский (Бразилия), китайский (упрощённый), японский, корейский, хинди, арабский (справа налево). Один список — apps/web/src/languages.ts; сайт читает его же.
- Английский и русский в бандле. Остальные словари —
apps/web/locales/<code>.json(у каждого текста — английский оригинал, с которого он переведён); сборка кладёт тексты вpublic/locales/, консоль загружает словарь при выборе языка. - Маршрут
GET /console/locales/:fileотдаёт только имя из двух строчных латинских букв с.json: имя проверяется до обращения к файловой системе, с той же CSP, что и остальная консоль. Это статический маршрут консоли, не часть/api/v1. - Не загрузился словарь — консоль остаётся на текущем языке (при запуске — английский); отсутствующий в файле текст показывается по-английски.
- Арабский:
<html dir="rtl">до первой отрисовки, логические свойства CSS; числа — латинскими цифрами (ar-u-nu-latn), как размеры и порты рядом.
Альтернативы
- Документация в README и
docs/. Нет разделов, поиска и языков; именно это и разошлось. - Перевести
docs/. Инженерные документы меняются с кодом; их перевод на десять языков устаревал бы быстрее, чем пишется. Пользователю нужен другой текст: задача, шаги, ограничения. - Сайт внутри сервера (
/docs/). Работал бы без интернета, но добавил бы десятки мегабайт в каждый пакет и ещё одну поверхность сервера. Ссылка из консоли ведёт на опубликованный сайт; для закрытых сетей сайт собирается из исходников (npm run wiki -- build). - Все словари консоли в бандле. Каждый язык добавил бы ~80 КБ к первой загрузке для всех.
- VitePress 1.6. Тянет уязвимую в dev-сервере ветку vite 5, и
npm audit --audit-level=highпадает; выбрана 2.0.0-alpha с vite 8 и чистым аудитом. Сайт статический, в рантайм сервера не попадает.
Последствия
- Новый текст консоли добавляется в английский и русский словари, затем во все
apps/web/locales/*.json; тест называет каждый непереведённый или устаревший текст. - Страница вики, изменённая по-английски, меняется в тех же коммитах во всех полностью переведённых языках (
COMPLETE: английский, русский, испанский, немецкий, китайский, хинди, корейский, французский и португальский); тест называет страницу, id заголовка, метку или блок кода, которых не хватает. Остальные языки показывают английскую страницу-заглушку (с предупреждением на их языке) там, где перевода ещё нет; заглушки в git, их актуальность проверяет тест. - Установщик Windows, мастер удалённой установки и
arkvoryctlостаются на английском и русском; отзывы в хаб уходят с языкомruилиen(контракт хаба). - Публикация сайта требует включить GitHub Pages с источником «GitHub Actions» в настройках репозитория.
Проверка
tests/web-locales.test.mjs (словари, плейсхолдеры, выбор языка, RTL), tests/wiki.test.mjs (страницы, id, метки, тексты сайта, глоссарий, справочник API), tests/integration/sdk.test.mjs (маршрут словарей, отказ для чужих имён), tests/pages-policy.test.mjs (права workflow), гейт docs (сборка без битых ссылок), браузерный сценарий консоли во всех языках.