feat: copy management — react-i18next adopted, Settings migrated (goal 0032) - #19
Merged
Conversation
…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
enabled auto-merge (squash)
August 12, 2026 12:44
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
react-i18nextv17.0.11 +i18nextv26.3.6 (locked research verdict indocs/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)frontend/src/locales/en/(common,app,composition,configure,views), init infrontend/src/app/i18n.tswired frommain.tsxSettingsView.tsxas the proof-of-pattern slice (views.json'ssettingsnamespace +common.json's shared verbs)docs/goals/BACKLOG.md(app/,composition/,configure/,views/minus Settings) — goal 0032 stays OPEN, not archived, per its own Plan step 3eslint-plugin-i18nextevaluated, 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 decisionTest plan
go vet/golangci-lint/go test -race -cover/go build(desktop + server) — all greennpm run lint/npm run boundaries/npm run test(vitest, incl. newapp/i18n.test.ts) /tsc --noEmit— all greennpx playwright test e2e/settings.spec.ts(6/6 passed, unchanged assertions — translated text matches original English exactly)Co-Authored-By: Claude Sonnet 5 noreply@anthropic.com
https://claude.ai/code/session_018pkViCNAuZp2vBv2K9AbUh