| j / k | Scroll down / up |
| gg | Scroll to top |
| G | Scroll to bottom |
| / | Open search |
| ? | Show this help |
| Esc | Close search / help |
| n / N | Next / previous section |
| h | Go to landing |
| d | Go to docs |
| : | Command mode — type section name |
Press ? or Esc to close
Loaded once at startup, cached locally, refreshed from remote when available. UI always reads from context.l10n — it never knows where strings came from.
| Step | Source | When used |
|---|---|---|
| 1 | Cache | Always tried first — instant load, zero network wait |
| 2 | Remote | Cache miss or stale — fetches fresh strings (API / Firebase Remote Config) |
| 3 | Asset | Fallback — bundled JSON, always available, never fails |
Future
// assets/i18n/en.json — flat key → ICU string
{
"welcome": "Welcome, {name}!",
"retry": "Try again"
}Text(context.l10n.t('welcome', args: {'name': 'Amir'}))app start / locale change
→ LocalizationCubit.changeLocale()
→ LocalizationRepository.load()
→ cache? → yes: use it
→ no: remote? → yes: use + save cache
→ no: asset → always works
→ AppLocalization emitted
→ MaterialApp rebuilds
→ all context.l10n calls updatedAppStrings.welcome — forbidden).AppLocalization.t() only.