Internacionalización en Flutter: ejercicio resuelto con flutter_localizations y archivos ARB
Internacionalización en Flutter: ejercicio resuelto con flutter_localizations y archivos ARB
La internacionalización (i18n) en Flutter se basa en flutter_localizations + el generador de código gen-l10n. Los archivos ARB (Application Resource Bundle) son el formato estándar para las traducciones: un JSON anotado que el generador convierte en clases Dart tipadas.
Enunciado
Implementa una app multiidioma que:
- Soporte inglés y español mediante archivos ARB.
- Use
AppLocalizationsgenerado automáticamente conflutter gen-l10n. - Muestre traducciones con argumentos variables (nombre de usuario).
- Use pluralización correcta (
itemCount). - Muestre la fecha formateada según el locale activo.
Dependencias y configuración
pubspec.yaml
l10n.yaml (en la raíz del proyecto)
lib/l10n/app_es.arb
lib/l10n/app_en.arb
Después de crear los archivos ARB, ejecuta:
Esto genera lib/gen/app_localizations.dart (o dentro de .dart_tool/flutter_gen/).
Solución completa
Estructura de archivos ARB
| Campo | Uso |
|---|---|
@@locale | Declara el idioma del archivo ("es", "en") |
"key": "value" | Traducción simple |
"@key" | Metadatos de la clave (description, placeholders) |
{param} | Argumento de tipo String posicional |
{count, plural, ...} | Pluralización según ICU MessageFormat |
{date} con "type": "DateTime" | Fecha formateada con intl según el locale |
Errores frecuentes
- Olvidar
flutter: generate: trueenpubspec.yaml: sin esta línea,flutter gen-l10nno genera los archivos Dart y el import deAppLocalizationsno existe. - Usar
AppLocalizations.of(context)sin el!: en unMaterialAppcorrectamente configurado nunca devuelve null dentro del árbol de widgets. Usa!o comprueba null solo si hay pantallas fuera del árbol de localización. - No añadir
GlobalMaterialLocalizations.delegate: sin este delegate, los strings nativos de Material (botón “OK”, “Cancelar”, el picker de fechas) no se traducen aunque tu contenido sí lo esté. - ARB con sintaxis incorrecta de plurales: el formato ICU es
{count, plural, =0{...} =1{...} other{...}}. Elotheres obligatorio — si lo omites,gen-l10nfalla con un error críptico.
Aplicación práctica
Cualquier app publicada en múltiples mercados necesita i18n: apps de productividad, e-commerce y herramientas SaaS. La clave es implementarlo desde el principio — retrofit de i18n en una app grande es costoso.
Siguiente ejercicio recomendado
Práctica guiada y siguiente paso
FAQ
¿Debo usar gen-l10n o el paquete intl_utils?
gen-l10n es la solución oficial del equipo de Flutter y no requiere dependencias extra. intl_utils es una alternativa popular con integración con VS Code y Android Studio, pero introduce una dependencia de desarrollo adicional. Para proyectos nuevos, usa gen-l10n.
¿Cómo funciona la pluralización en idiomas con más de dos formas?
ICU MessageFormat soporta las categorías zero, one, two, few, many, other. El locale determina cuántas formas usa un idioma: el inglés solo usa one/other, el polaco usa one/few/many/other. La librería intl gestiona automáticamente la selección según el locale.
¿Los archivos ARB se pueden compartir con otras plataformas?
Sí. ARB es también el formato estándar de Flutter Web, macOS y Desktop. Algunos equipos reutilizan los mismos archivos ARB en Android (con android-arb-plugin) y en proyectos iOS/macOS de forma semiautomática.