feat: generate translator credits offline from the committed file

Makes docs/changelog/translators.json self-sufficient so a release no longer
needs to re-query Crowdin:

- sinceLastTag entries now carry each translator's languages ({user, languages}),
  recorded by the --seed run.
- Default mode (no flags) is offline: it generates the "## Translations" block
  straight from the committed file — reading sinceLastTag, grouping by the stored
  languages, and resolving npubs via the mappings registry. No token, no network.
- --seed/--raw remain the online paths (CI seeding / debugging). curl + git +
  credentials are only required there; the offline path needs just jq.

RELEASE_OPS now points at the tokenless `scripts/translators.sh` for the
changelog credits.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FWQWVdWLAwBUBX2gJ55y6b
This commit is contained in:
Claude
2026-06-19 16:02:47 +00:00
parent 6b30486667
commit 765c1dfd7e
3 changed files with 103 additions and 78 deletions
+3 -3
View File
@@ -9,9 +9,9 @@
" matches the Crowdin user id.",
"",
"sinceLastTag: a rolling snapshot of who has translated since the last release",
" tag. Refreshed on every --seed run; do not hand-edit. At release time the",
" changelog '## Translations' block is generated from this window and",
" resolved to npubs via mappings (anyone still blank is flagged UNMAPPED).",
" tag. Each entry is { user, languages }. Refreshed on every --seed run; do",
" not hand-edit. The changelog '## Translations' block is generated offline",
" from this list and resolved to npubs via mappings (blanks flagged UNMAPPED).",
"",
"Example mapping (replace with a real Crowdin username):",
" \"vitorpamplona\": \"npub1gcxzte5zlkncx26j68ez60fzkvtkm9e0vrwdcvsjakxf9mu9qewqlfnj5z\""