# ISSUE-226 — Shared key-map + locale-kontrakt (backend/frontend) ## Source of truth - Single shared artifact: `shared/i18n/lobby.json` - Ownership is documented under `contract.ownership` in the same artifact. ## Locale contract Defined under `contract.locale`: - default locale: `en` - supported locales: `en`, `da` - fallback rule: use default locale when requested locale is unsupported or a key translation is missing. ## Shared backend→frontend key-map Defined under `contract.backend_to_frontend_error_keys`. Examples: - `session_not_found -> session_not_found` - `session_not_joinable -> join_failed` - `round_start_invalid_phase -> start_round_failed` This allows backend error codes to remain stable while frontend copy keys stay UX-oriented. ## da/en example values From `shared/i18n/lobby.json`: - `frontend.errors.session_code_required.en = "Session code is required."` - `frontend.errors.session_code_required.da = "Sessionskoden er påkrævet."` ## Verification - Backend: `python manage.py test lobby.tests.I18nResolverTests` - Frontend: `npm test -- --run tests/lobby-i18n.contract.test.ts`