| j / k | Scroll down / up |
| gg | Scroll to top |
| G | Scroll to bottom |
| ⌘K / / | 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<Map<String, String>> load(Locale locale) async {
return await cache.load(locale)
?? await remote.load(locale) // saves to cache on success
?? await asset.load(locale); // always works
} {
"welcome": "Welcome, {name}!",
"retry": "Try again",
"commonError": "Something went wrong",
"emptyStateTitle": "No data yet",
"emptyStateDescription": "Pull down to refresh"
} Text(context.l10n.t('welcome', args: {'name': 'Amir'}))
// With TranslationKeys enum (type-safe)
Text(context.l10n.t(TranslationKeys.commonError)) AppStrings.welcome — forbidden).AppLocalization.t() only.