flutter-internationalization
Skill106 starsChanged 7 months agoMITView on GitHub
Add, fix, audit, and maintain Flutter internationalization with gen-l10n, ARB files, AppLocalizations, flutter_localizations, intl formatting, plural/select messages, RTL support, locale-specific number/date formatting, and localization build errors. Use when asked to add l10n or i18n, translate Flutter UI text, configure l10n.yaml, manage ARB translations, migrate away from package:flutter_gen imports, or troubleshoot generated localization code.
In this repository10 other files it gives its agents.
- agents-md-generatorSkill
- dart-driftSkill
- flutter-adaptive-uiSkill
- flutter-animationsSkill
- flutter-architectureSkill
- flutter-driftSkill
- flutter-duit-bduiSkill
- flutter-navigationSkill
- flutter-networkingSkill
- flutter-testingSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
22 rules. About 0 are common, 14 are distinctive, and 8 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈14
Distinctive · estimate
This author's own choices. Worth a look.
8
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 29
Use gen-l10n for new work, most migrations, ARB management, plural/select messages, generated AppLocalizations, and Material/Cupertino apps.
- Very specific: line 31
Use legacy intl_translation only when the project already uses Intl.message() plus generated messages_all.dart, or the user explicitly asks …
- Distinctive: line 35
Use custom map-based localizations only for tiny prototypes or existing code that intentionally avoids code generation.
- Distinctive: line 38
If the project has an existing localization setup, follow its paths, class names, locale list, and generation style before introducing …
- Very specific: line 48
Use the decision guide to choose gen-l10n, legacy intl_translation, or a custom fallback.
- Distinctive: line 50
Read only the routed references needed for the task.
- Very specific: line 52
add flutter_localizations and intl:any when missing.
- Very specific: line 54
create or update l10n.yaml.
- Distinctive: line 55
create or update ARB files with descriptions and placeholder metadata.
- Distinctive: line 87
Use source imports that match the generated location, commonly:
- Distinctive: line 93
Prefer generated lists when possible:
- Very specific: line 100
If generated files are written to a custom output-dir, update imports to that directory.
- Distinctive: line 109
keep generated files and imports consistent with the existing project.
- Distinctive: line 110
run extraction before generation.
- Very specific: line 120
If this workflow is not already present, explain why gen-l10n is the safer default.
- Distinctive: line 125
Do not invent translations.
- Distinctive: line 128
Do not concatenate localized strings.
- Distinctive: line 130
Do not manually format numbers, currency, percentages, dates, or times when gen-l10n placeholder formatting can do it.
- Very specific: line 132
Do not add synthetic-package: true.
- Distinctive: line 137
Keep translator-facing descriptions and examples in the template ARB file.
- Distinctive: line 143
Always validate a completed localization change:
- Distinctive: line 147
every new ARB key exists in the template file and needed locale files.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Flutter Internationalization
You are a Flutter localization implementer. Make localized apps build, generate, and read naturally across target locales.
Principle 0
Generated localization code must match the current Flutter project and SDK. Do
not copy stale package:flutter_gen imports or enable synthetic-package; use
source-generated AppLocalizations imports unless the project proves it is on an
older pinned Flutter workflow.
Decision Guide
- Use
gen-l10nfor new work, most migrations, ARB management, plural/select messages, generatedAppLocalizations, and Material/Cupertino apps. - Use legacy
intl_translationonly when the project already usesIntl.message()plus generatedmessages_all.dart, or the user explicitly asks to keep that workflow. Confirmintl_translationis a dependency before running its generators. - Use custom map-based localizations only for tiny prototypes or existing code that intentionally avoids code generation. Name this limitation in the final response.
- If the project has an existing localization setup, follow its paths, class names, locale list, and generation style before introducing defaults.
Workflow
- Inspect
pubspec.yaml,l10n.yaml, existing*.arbfiles, generated imports,MaterialApp/CupertinoAppsetup, and current translation usage. - Identify the requested change: bootstrap l10n, add a locale, replace hardcoded UI text, add placeholders/plurals/selects, format values, fix generation, or migrate stale imports/config.
- Use the decision guide to choose
gen-l10n, legacyintl_translation, or a custom fallback. Prefer the smallest change that fits the existing project. - Read only the routed references needed for the task.
- Make the localization change:
- add
flutter_localizationsandintl:anywhen missing; - set
flutter: generate: true; - create or update
l10n.yaml; - create or update ARB files with descriptions and placeholder metadata;
- wire
AppLocalizationsintoMaterialApporCupertinoApp; - replace hardcoded UI strings with generated getters or methods.
- add
- Generate and validate with
flutter gen-l10n. Then run the narrowest relevant project check, usuallyflutter analyzeor affected tests. - Report changed files, generated behavior, validation run, and any locales or translation gaps that remain.
Resource Routing
| Task | Read or use | Why |
Configure or debug l10n.yaml, generated output paths, nullable getters, deferred loading, or untranslated tracking | references/l10n-config.md | Current gen-l10n options and safe defaults |
| Create or repair ARB messages, placeholders, plurals, selects, escaping, or metadata | references/arb-format.md | ARB schema patterns and translator context rules |
| Add number, currency, percent, or date/time formatting | references/number-date-formats.md | Supported NumberFormat and DateFormat values |
| Bootstrap a new gen-l10n setup or run a smoke fixture | assets/l10n.yaml, assets/app_en.arb | Reusable minimal templates |
gen-l10n Contract
For new gen-l10n setup, the minimum current configuration is:
flutter:
generate: truearb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dartUse source imports that match the generated location, commonly:
import 'l10n/app_localizations.dart';Prefer generated lists when possible:
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,If generated files are written to a custom output-dir, update imports to that
directory. Do not import package:flutter_gen/gen_l10n/app_localizations.dart
unless the local project is intentionally pinned to an older Flutter workflow.
Legacy Intl Fallback
When preserving Intl.message():
- require
intl_translationin dev dependencies before extraction/generation; - keep generated files and imports consistent with the existing project;
- run extraction before generation;
- on Windows or shells without wildcard expansion, list ARB files explicitly.
Typical commands:
dart run intl_translation:extract_to_arb --output-dir=lib/l10n lib/main.dart
dart run intl_translation:generate_from_arb --output-dir=lib/l10n --no-use-deferred-loading lib/main.dart lib/l10n/intl_*.arbIf this workflow is not already present, explain why gen-l10n is the safer
default.
Constraints
- Do not invent translations. If target-language text is not supplied, add clear placeholder translations only when the user approved that, or report the missing translations.
- Do not concatenate localized strings. Use placeholders, plural, or select messages.
- Do not manually format numbers, currency, percentages, dates, or times when gen-l10n placeholder formatting can do it.
- Do not add
synthetic-package: true; current Flutter marks synthetic package generation as deprecated and unavailable. - Set
nullable-getter: falseonly when the project accepts non-null generated getter behavior. Otherwise keep the project default and use the required null handling in code. - Keep translator-facing descriptions and examples in the template ARB file.
- For RTL locales, check text direction, layout assumptions, mirrored icons, and locale-specific widgets.
Validation
Always validate a completed localization change:
flutter gen-l10nsucceeds with the project'sl10n.yaml;- generated import paths compile;
- every new ARB key exists in the template file and needed locale files;
- placeholders in translated ARB values match template metadata;
- plural/select messages include
other; - number/date placeholders use supported formats from
references/number-date-formats.md; - relevant
flutter analyzeor tests pass, or blockers are reported.
For skill maintenance, also check YAML frontmatter, local markdown links, JSON
validity for ARB assets, YAML validity for l10n.yaml, resource routing, and
layer coherence between SKILL.md, references, and assets.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

