# 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
