Skip to content

feat: copy management — react-i18next adopted, Settings migrated (goal 0032) - #19

Merged
alicoding merged 1 commit into
mainfrom
goal/0032-copy-management
Aug 12, 2026
Merged

feat: copy management — react-i18next adopted, Settings migrated (goal 0032)#19
alicoding merged 1 commit into
mainfrom
goal/0032-copy-management

Conversation

@alicoding

Copy link
Copy Markdown
Owner

Summary

  • Adopts react-i18next v17.0.11 + i18next v26.3.6 (locked research verdict in docs/goals/0032-copy-management.md: plain i18n over every headless-CMS candidate, all disqualified by SPEC §1.1's no-hosted-service/no-daemon constraint)
  • Namespace-per-bounded-context JSON under frontend/src/locales/en/ (common, app, composition, configure, views), init in frontend/src/app/i18n.ts wired from main.tsx
  • Migrates SettingsView.tsx as the proof-of-pattern slice (views.json's settings namespace + common.json's shared verbs)
  • Remaining ~39 hardcoded-copy files tracked as four Standing tech-debt entries in docs/goals/BACKLOG.md (app/, composition/, configure/, views/ minus Settings) — goal 0032 stays OPEN, not archived, per its own Plan step 3
  • eslint-plugin-i18next evaluated, deliberately deferred (would fail the lint gate across every still-unmigrated file rather than guard new code)
  • docs/SPEC.md §1.3 records the adopt decision

Test plan

  • go vet / golangci-lint / go test -race -cover / go build (desktop + server) — all green
  • npm run lint / npm run boundaries / npm run test (vitest, incl. new app/i18n.test.ts) / tsc --noEmit — all green
  • npx playwright test e2e/settings.spec.ts (6/6 passed, unchanged assertions — translated text matches original English exactly)
  • Lefthook pre-commit suite green on the actual commit

Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
https://claude.ai/code/session_018pkViCNAuZp2vBv2K9AbUh

…l 0032)

Owner-observed 40/72 .tsx files carrying inline hardcoded copy with no
i18n library. Research settled on plain i18n over a headless CMS (every
git-native CMS candidate needs a hosted OAuth intermediary or a local
daemon, disqualified by SPEC §1.1): react-i18next v17.0.11 + i18next
v26.3.6, namespace-per-bounded-context JSON under
frontend/src/locales/en/ mirroring frontend/src's own folders, init in
app/i18n.ts wired from main.tsx.

Migrated SettingsView.tsx as the proof-of-pattern slice (views.json's
settings namespace + common.json's shared verbs); existing
e2e/settings.spec.ts assertions pass unchanged since translated text
matches the original English exactly. Added app/i18n.test.ts (init
loads, t() resolves keys, interpolation).

The remaining ~39 files are tracked as four Standing tech-debt entries
in BACKLOG.md (app/, composition/, configure/, views/ minus Settings),
each independently DoR/DoD-shaped. eslint-plugin-i18next evaluated and
deliberately deferred — its no-literal-string rule would fail the lint
gate across every still-unmigrated file rather than guard new code
alone.

Goal 0032 left OPEN (not archived) per its own Plan step 3 — the
migration is intentionally staged, not silently dropped.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018pkViCNAuZp2vBv2K9AbUh
@alicoding
alicoding enabled auto-merge (squash) August 12, 2026 12:44
@alicoding
alicoding merged commit c9bcbbd into main Aug 12, 2026
16 checks passed
@alicoding
alicoding deleted the goal/0032-copy-management branch August 12, 2026 12:50
alicoding added a commit that referenced this pull request Aug 15, 2026
…l 0032) (#19)

Owner-observed 40/72 .tsx files carrying inline hardcoded copy with no
i18n library. Research settled on plain i18n over a headless CMS (every
git-native CMS candidate needs a hosted OAuth intermediary or a local
daemon, disqualified by SPEC §1.1): react-i18next v17.0.11 + i18next
v26.3.6, namespace-per-bounded-context JSON under
frontend/src/locales/en/ mirroring frontend/src's own folders, init in
app/i18n.ts wired from main.tsx.

Migrated SettingsView.tsx as the proof-of-pattern slice (views.json's
settings namespace + common.json's shared verbs); existing
e2e/settings.spec.ts assertions pass unchanged since translated text
matches the original English exactly. Added app/i18n.test.ts (init
loads, t() resolves keys, interpolation).

The remaining ~39 files are tracked as four Standing tech-debt entries
in BACKLOG.md (app/, composition/, configure/, views/ minus Settings),
each independently DoR/DoD-shaped. eslint-plugin-i18next evaluated and
deliberately deferred — its no-literal-string rule would fail the lint
gate across every still-unmigrated file rather than guard new code
alone.

Goal 0032 left OPEN (not archived) per its own Plan step 3 — the
migration is intentionally staged, not silently dropped.


Claude-Session: https://claude.ai/code/session_018pkViCNAuZp2vBv2K9AbUh

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant