Localization stages 2-3: drafts, publishing, translation editor

- games.main_version_id, version visibility (draft/published) and kind
  (original/translation/mod), version_history; migration 0002
- permissions translations.edit and versions.publish
- "Translate" creates a translation draft; publishing merges the changed
  languages into the main version in place (players keep their saves), the
  previous manifest goes to the history and can be restored
- translation API: overview with per-state stats, entries with filters,
  search and scene context, save, glossary, locale font, PO/CSV export/import
- translation editor page: languages and progress, lines and strings,
  filters, autosave, approve/outdated/fuzzy actions, glossary highlighting,
  "play from here" with the scene restored
- player: ?lang= and ?at= from the editor, per-locale font

(models.py and permissions.py for this landed earlier in 9ee3e1f)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mrleo1nidandClaude Opus 5.5 committed 2026-10-25 03:56:19 +03:00
1 parent 4e047f3aa0
commit ac164d1782
20 files changed
+2039 -298

No files matched your search

+31
View File
@@ -164,6 +164,37 @@ translate russian strings:
авторы ещё не перевели, а ~750 блоков на язык относятся к уже изменённым
английским репликам. Ren'Py их тоже не показывает.
Этапы 2 и 3 сделаны:
* у игры есть главная версия (`games.main_version_id`), у версий —
`visibility` (`draft`/`published`) и `kind` (`original`/`translation`/`mod`);
миграция `0002` проставила главную версию существующим играм;
* права `translations.edit` и `versions.publish`, у системной роли
moderator они включены;
* кнопка «Перевести» создаёт черновик-форк вида «перевод», «Опубликовать»
вливает изменённые языки **в саму главную версию**: её ID не меняется,
сохранения игроков остаются. Прежний манифест пишется в `version_history`
(`GET /api/versions/{id}/history`, откат —
`POST …/history/{hid}/restore`);
* редактор перевода `/versions/{id}/translate`:
* языки с прогрессом по состояниям, реплики и строки (имена, меню, текст
на экране);
* фильтры «к работе / не переведено / устарело / неточно / машинный /
переведено / одобрено», поиск, фильтр по файлу скрипта;
* автосохранение, Ctrl+Enter — к следующей строке;
* кнопки «одобрить» (только у публикующих), «актуально» для устаревших,
«неточно», «скопировать оригинал»;
* контекст строки: фон сцены, соседние реплики, «играть отсюда»
(`/play/{id}?at=<узел>&lang=<язык>`, картинка сцены восстанавливается);
* глоссарий с подсветкой терминов в оригинале;
* экспорт и импорт PO/CSV, шрифт для языка;
* API: `GET/PUT /api/versions/{id}/i18n[/{lang}]`, `…/entries`, `…/meta`,
`…/font`, `…/export`, `…/import`, `DELETE …/{lang}`.
Пока не сделано: UI истории версии (сейчас есть только API), картинки и
озвучка для отдельного языка, правка реплик прямо в плеере, машинный
предперевод (заложено только состояние `machine`).
Уже сконвертированные версии остаются без ID и без переводов, их нужно
переимпортировать. Пока в библиотеке только тестовые данные, отдельную
миграцию не делаем.