# ISSUE-279 — i18n MVP close-out note Issue: **#279** (`[READY][#175][P5] MVP close-out note: migration/changelog + release-readiness checklist for i18n`) ## Scope Dette dokument lukker MVP-sporet for issue #175 med tre konkrete ting: 1. en migrationsnote for release/deploy, 2. changelog-indhold der kan genbruges i næste release-note, 3. en release-readiness checkliste for i18n, forankret i et verificeret snapshot af `main` ved reviewtidspunktet. Repo-state ved review-opdatering: - `main` peger nu på merge commit `1bc4c27` (PR #283), og inkluderer også PR #282 via merge commit `6ad5430`. - Denne note er opdateret mod repo-tilstanden verificeret 2026-03-13 UTC, ikke en løbende garanti for senere `main`-ændringer. - Denne revision afløser de tidligere snapshot-antagelser fra PR-historikken, hvor #282/#283 endnu ikke var landet. - Der er ingen åbne release-afklaringer tilbage for PR #282/#283; begge er allerede landet på `main`. ## Current i18n MVP state on `main` Følgende er allerede til stede på `main`: - **Shared contract** i `shared/i18n/lobby.json` - default locale: `en` - supported locales: `en`, `da` - fælles frontend/backend keyspace + fallback-regler - **Django bootstrap** via `partyhub/i18n_bootstrap.py` og `partyhub/settings.py` - `LocaleMiddleware` aktiv - `LANGUAGE_CODE` + `LANGUAGES` bootstrappes fra shared catalog - **Backend locale/error flow** via `lobby/i18n.py` - normalisering af locale-tags - locale-aware fejlpayload med `error_code`, `error`, `locale` - fallback til `en` når locale eller oversættelse mangler - **Angular MVP wiring** via - `frontend/shared/i18n/lobby-loader.ts` - `frontend/angular/src/app/lobby-i18n.ts` - host/player shells med locale switch og shared copy-opslag - **Drift/parity guardrails** - `shared/i18n/key-manifest.json` - `scripts/check_i18n_drift.py` - frontend parity/contract tests - **Existing documentation/artifacts** - `docs/I18N_ARCHITECTURE.md` - `docs/ISSUE-175-I18N-SHARED-CONTRACT-ARTIFACT.md` - `docs/ISSUE-225-BACKEND-I18N-BASELINE-ARTIFACT.md` - `docs/ISSUE-257-SHARED-I18N-KEYSPACE-FRONTEND-LOADER-ARTIFACT.md` - `docs/ISSUE-207-I18N-AUDIO-SMOKE-ARTIFACT.md` - `docs/i18n-drift-check.md` ## Migration note for release ### Schema impact **Der er ingen nye Django-migrations i selve i18n-MVP-sporet på `main`.** Den i18n-relaterede leverance ligger i shared catalog, locale-bootstrap, error-payload-kontrakt, Angular wiring og test/documentation. Den kræver derfor ikke en særskilt i18n-database-migration for at gå i release. ### Release/deploy expectation Selv om issue #279 ikke introducerer schemaændringer, skal release-flow stadig følge repoets generelle migreringsgate: ```bash python manage.py makemigrations --check --dry-run python manage.py migrate --check --noinput ``` Hvorfor: release-policyen kræver, at vi undgår code/schema drift, og staging-smoke-suiten forventer eksplicit migration consistency check. ### Praktisk migrationskonklusion Til release-notes/deploy-runbook kan i18n-sporet beskrives sådan her: - **Migration impact:** none for i18n MVP itself - **Deploy requirement:** run standard Django migration consistency checks anyway - **Rollback note:** rollback er primært kode-/asset-baseret (shared catalog, frontend bundles, backend locale resolver), ikke schema-baseret ## Suggested changelog content Følgende tekst kan bruges direkte i næste unreleased/release-sektion: ```markdown ### i18n - Shared da/en lobby i18n contract is now wired across Django and Angular MVP flows via `shared/i18n/lobby.json`. - Backend error payloads expose stable locale-aware fields (`error_code`, `error`, `locale`) with fallback to English for unsupported locales. - Angular host/player shells now consume shared i18n copy, persist preferred locale, and keep audio-policy messaging aligned with the shared catalog. - Added repo guardrails for i18n drift/parity through the shared key manifest, drift checker, and focused frontend/backend contract tests. - Release migration impact for the i18n MVP is **none** beyond the standard Django migration consistency checks. ``` Kort version til annoterede release-notes: ```markdown ## i18n MVP close-out - Shared da/en contract is active across backend + Angular MVP shell. - Locale fallback remains `en` for unsupported requests and missing translations. - No i18n-specific schema migration is required; keep standard `migrate --check --noinput` in release verification. ``` ## Release-readiness checklist for i18n Status er vurderet mod verificeret snapshot `main@1bc4c27` (reviewet 2026-03-13 UTC, inkl. PR #282/#283). ### 1) Shared contract and locale behavior - [x] Shared catalog findes i `shared/i18n/lobby.json`. - [x] Default/supported locales er dokumenteret og implementeret som `en` + `da`. - [x] Backend bruger shared contract til locale-aware fejlbeskeder. - [x] Frontend/Angular bruger shared loader + shared keyspace. - [x] Fallback-regel til `en` er dokumenteret og testet. ### 2) Verification artifacts and local checks - [x] Arkitektur-note findes: `docs/I18N_ARCHITECTURE.md`. - [x] Baseline artifact for issue #175 findes. - [x] Backend artifact for issue #225 findes. - [x] Frontend/shared loader artifact for issue #257 findes. - [x] Drift-check dokumentation findes i `docs/i18n-drift-check.md`. - [x] Parity artifact fra issue #277 er på `main` via PR #282 (merge commit `6ad5430`). ### 3) Code readiness on current branch topology - [x] Angular MVP host/player i18n flow er på `main` (PR #281). - [x] Shared locale/bootstrap wiring er på `main`. - [x] Django i18n hardening fra issue #275 er på `main` via PR #283 (merge commit `1bc4c27`). - [x] PR #283 er ikke længere en separat release-afklaring; hardeningen er allerede indarbejdet på `main`. ### 4) Release gate before shipping i18n as “done” - [x] PR #282 er allerede merged, så parity-artifact-status er afklaret på `main`. - [x] PR #283 er allerede merged, så backend hardening-status er afklaret på `main`. - [ ] Kør drift-check fra repo root: ```bash python3 scripts/check_i18n_drift.py ``` - [ ] Kør backend i18n regressions: ```bash . .venv/bin/activate && python manage.py test \ partyhub.tests_i18n_bootstrap \ lobby.tests.I18nResolverTests ``` - [ ] Kør frontend shared-contract/parity checks: ```bash cd frontend && npm test -- --run \ tests/lobby-loader.parity.test.ts \ tests/lobby-i18n.contract.test.ts ``` - [ ] Kør Angular MVP locale smoke: ```bash cd frontend/angular && npm test -- --run \ src/app/lobby-i18n.spec.ts \ src/app/i18n-mvp-flow-smoke.spec.ts \ src/app/features/host/host-shell.component.spec.ts \ src/app/features/player/player-shell.component.spec.ts ``` - [ ] Bekræft standard migration consistency gate: ```bash . .venv/bin/activate && python manage.py makemigrations --check --dry-run . .venv/bin/activate && python manage.py migrate --check --noinput ``` - [ ] Følg `docs/RELEASE_POLICY.md`: staging deploy, `/healthz`, smoke-resultat og changelog-reference før tag. ## Close-out conclusion **Konklusion:** i18n-MVP'en er implementeret på `main`, og issue #279 leverer den manglende release-/migration-closeout dokumentation uden nye kodeændringer i app-logikken. PR #282 (parity artifact) og PR #283 (Django i18n hardening) er nu begge merged på `main`, så close-out-noten, changelog-teksten og release-readiness-checklisten kan behandles som indbyrdes konsistente for det verificerede snapshot. Det betyder, at de resterende release-gates for i18n nu er de almindelige verificeringstrin (drift-check, backend/frontend-smoke, migrations-konsistens, staging deploy og changelog-reference) — ikke længere afklaring af om #282/#283 skal lande.