By Abdelrahman Saed — Senior Mobile Engineer. Last updated: 2026-08-10.
Internationalization (i18n) in Flutter has improved significantly. The built-in flutter_localizations with ARB files is now good enough for most apps, but third-party packages offer simpler workflows for large translation sets.
Simple internationalization with JSON translation files — change locale at runtime without rebuild.
Strengths:
Tradeoffs:
Best for: Apps that want simple JSON-based translations without code generation.
Production note: We use easy_localization at iStoria for 10+ languages. The JSON workflow is far simpler than ARB files for our translation team, and runtime locale switching is essential for our bilingual (Arabic/English) audience.
Type-safe i18n with code generation — compile-time checking for missing translations.
Strengths:
Tradeoffs:
Best for: Apps that want compile-time safety for translations.
Production note: I have not used slang at iStoria (we chose easy_localization for its simpler JSON workflow), but the type-safe approach is superior for large translation sets.
Flutter's built-in i18n with ARB files and the gen-l10n tool — the official approach.
Strengths:
Tradeoffs:
Best for: Apps that want the official Flutter approach with no extra dependencies.
Production note: The official approach works but is more ceremony than easy_localization for our translation workflow. For apps with 2-3 languages and a developer managing translations, the built-in is fine.
Flutter handles RTL automatically when you set the locale to an RTL language (Arabic, Hebrew). Use Directionality.of(context) to check the current direction, and use EdgeInsetsDirectional / MarginDirectional instead of EdgeInsets / Margin for direction-aware spacing. At iStoria, full RTL support was built into the design system from day one.
Available for hire. Abdelrahman Saed is a Senior Mobile Engineer (Flutter) — open to full-time, fractional, contract, or advisory work. Hire me →
Book a 20-minute call · Download the CV (PDF) · See how I work