# Localization Catalog ## Rules - Every user-facing string must be localizable - Stable key names only - English is the fallback locale - Swedish must be present at launch - Keys are mirrored in `contracts/localization/en.json` and `contracts/localization/sv.json` ## Current Keys | Key | Purpose | | --- | --- | | `app.name` | App name | | `common.continue` | Continue action | | `common.cancel` | Cancel action | | `common.close` | Close action | | `common.retry` | Retry action | | `common.loading` | Loading state | | `common.error_title` | Error title | | `common.ok` | OK action | | `onboarding.title` | Study intro title | | `onboarding.subtitle` | Study intro body | | `onboarding.consent_title` | Consent title | | `onboarding.consent_body` | Consent body | | `onboarding.language_title` | Language picker title | | `onboarding.start_session` | Start session CTA | | `feed.next_round_title` | Next round title | | `feed.next_round_body` | Next round body | | `feed.watch_preview` | Watch preview CTA | | `feed.round_ready` | Round ready label | | `round.countdown_label` | Countdown label | | `round.locked_label` | Locked label | | `round.selection_prompt` | Selection prompt | | `round.selection_confirmed` | Selection accepted | | `round.selection_submitting` | Selection submitting | | `round.odds_label` | Odds label | | `round.freeze_title` | Timer expired title | | `round.freeze_subtitle` | Timer expired subtitle | | `round.reveal_loading` | Reveal transition copy | | `round.yes` | Yes outcome | | `round.no` | No outcome | | `round.swipe_left` | Swipe left hint | | `round.swipe_right` | Swipe right hint | | `reveal.title` | Reveal title | | `reveal.subtitle` | Reveal subtitle | | `result.title` | Result title | | `result.user_selection` | Result selection label | | `result.outcome` | Result outcome label | | `result.next_round` | Next round CTA | | `settings.title` | Settings title | | `settings.subtitle` | Settings subtitle | | `settings.language` | Language setting | | `settings.enabled` | Enabled status | | `settings.haptics` | Haptics setting | | `settings.analytics` | Analytics setting | | `mode.demo` | Demo mode label | | `mode.live` | Live mode label | | `event.question.score` | Score event prompt | | `event.question.save` | Save event prompt | | `event.question.convert` | Convert event prompt | | `errors.generic` | Generic error copy | | `errors.network` | Network error copy | | `errors.playback` | Playback error copy | | `errors.session_expired` | Session expired copy | ## Validation - English and Swedish bundles must contain the same keys - Empty values are not allowed