---
title: Localización en Flutter: ARB, intl y gen-l10n | Smartcat
description: Configura la localización de Flutter con archivos ARB y gen-l10n: marcadores de posición, plurales, intl frente a easy_localization, pruebas RTL y verificación del proceso de traducción.
canonical: https://es.smartcat.com/flutter-localization/
language: es
updated: 2026-11-03
---

# Localización en Flutter: ARB, intl y gen-l10n | Smartcat

## Localización en Flutter: archivos ARB, intl y gen-l10n explicados

La localización en Flutter adapta los mensajes y la interfaz de una aplicación a distintas configuraciones regionales. En el flujo integrado, flutter_localizations ofrece widgets del framework localizados, mientras que los recursos ARB y gen-l10n generan la API AppLocalizations de la aplicación, e intl se encarga de los mensajes y formatos que dependen del idioma.

- [Reserva una demo](https://www.smartcat.com/book-a-demo/?main-cta2-flutter-localization)

- [Prueba gratis](https://smartcat.com/sign-up?main-cta3-flutter-localization)

## Configura flutter_localizations y gen-l10n

Esta guía configura un pequeño ejemplo en inglés y español, explica los metadatos de los mensajes y compara los enfoques de paquetes más habituales. También muestra qué validar antes de conectar una plataforma de traducción a un proyecto Flutter.

Usa un único generador de localización y define explícitamente sus ubicaciones de entrada y salida. El ejemplo siguiente parte de una aplicación Flutter existente con sus propias restricciones de SDK y una configuración de proyecto normal.

Combina las entradas relevantes en pubspec.yaml ; no dupliques las secciones dependencies ni flutter :

dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: any

flutter:
generate: true Resuelve las dependencias con flutter pub get . La entrada intl: any sigue el patrón de configuración oficial y permite que la resolución de dependencias seleccione la versión compatible con el SDK de Flutter; conserva el lockfile de la aplicación y tu proceso habitual de revisión de dependencias.

Crea l10n.yaml en la raíz del proyecto:

arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart Usa la [guía de internacionalización de Flutter](https://docs.flutter.dev/ui/internationalization) actual para la configuración específica del SDK. En el flujo moderno, los archivos de localización generados forman parte del árbol de código fuente de la aplicación. El ejemplo importa desde lib/l10n ; evita copiar en una configuración nueva un import sintético antiguo de package:flutter_gen . Consulta la [nota de migración del código generado](https://docs.flutter.dev/release/breaking-changes/flutter-generate-i10n-source).

## Escribe archivos ARB con contexto y marcadores de posición tipados

Un archivo ARB es un paquete de recursos basado en JSON que contiene mensajes y metadatos opcionales. Mantén estables las claves de los mensajes, escribe mensajes completos y usa los metadatos para explicar cómo se utiliza el texto.

Crea lib/l10n/app_en.arb :

{
"@@locale": "en",
"appTitle": "Reading room",
"@appTitle": {
"description": "Title of the sample reading application"
},
"welcomeName": "Welcome, {name}",
"@welcomeName": {
"description": "Greeting on the home screen",
"placeholders": {
"name": {"type": "String", "example": "Sam"}
}
},
"savedBooks": "{count, plural, =0{No saved books} one{1 saved book} other{{count} saved books}}",
"@savedBooks": {
"description": "Number of books saved to the user's library",
"placeholders": {
"count": {"type": "int"}
}
},
"readingState": "{state, select, active{Reading now} paused{Reading paused} other{Ready to read}}",
"@readingState": {
"description": "Reading status; state is active, paused or another value",
"placeholders": {
"state": {"type": "String"}
}
}
} Crea lib/l10n/app_es.arb :

{
"@@locale": "es",
"appTitle": "Sala de lectura",
"welcomeName": "Te damos la bienvenida, {name}",
"savedBooks": "{count, plural, =0{No hay libros guardados} one{1 libro guardado} other{{count} libros guardados}}",
"readingState": "{state, select, active{Leyendo ahora} paused{Lectura en pausa} other{Todo listo para leer}}"
} La plantilla contiene los metadatos de los marcadores de posición que usa el generador. El archivo localizado conserva las claves de los mensajes, los nombres de los marcadores y los identificadores de select, y solo cambia el texto visible para el usuario. Estos ejemplos en español ilustran el mecanismo; el texto de producción debe pasar por una revisión nativa en su contexto real de producto.

Ejecuta flutter gen-l10n después de añadir o cambiar recursos. Trata los errores del generador como problemas de recursos que hay que corregir y resuélvelos antes de integrar los archivos en una versión.

## Conecta los mensajes generados a MaterialApp

Registra los delegados generados y las configuraciones regionales compatibles; después, lee los mensajes localizados desde un contexto situado por debajo del widget de la aplicación.

El siguiente ejemplo va en lib/main.dart después de la generación:

import 'package:flutter/material.dart';
import 'l10n/app_localizations.dart';

void main() => runApp(const ReadingApp());

class ReadingApp extends StatelessWidget {
const ReadingApp({super.key});

@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
home: const ReadingHome(),
);
}
}

class ReadingHome extends StatelessWidget {
const ReadingHome({super.key});

@override
Widget build(BuildContext context) {
final messages = AppLocalizations.of(context)!;
return Scaffold(
appBar: AppBar(title: Text(messages.appTitle)),
body: Padding(
padding: const EdgeInsetsDirectional.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(messages.welcomeName('Sam')),
Text(messages.savedBooks(3)),
Text(messages.readingState('active')),
],
),
),
);
}
} ReadingHome tiene acceso a las localizaciones que proporciona MaterialApp . Si pides AppLocalizations desde el contexto del widget exterior, la búsqueda se hará por encima del proveedor que crea ese widget. La [documentación de la API Localizations](https://api.flutter.dev/flutter/widgets/Localizations-class.html) explica cómo se ponen los recursos localizados a disposición de los descendientes. La API generada hace visible en el código la diferencia entre un mensaje simple y un mensaje con argumentos. appTitle se usa como un valor; welcomeName , savedBooks y readingState reciben los valores necesarios para construir sus mensajes.

## Gestiona los plurales y los mensajes select con cuidado

Los mensajes con plural eligen el texto según una cantidad y la gramática de la configuración regional de destino. Los mensajes select eligen una rama a partir de un identificador que proporciona la aplicación. Conserva la sintaxis y los identificadores y traduce el texto que muestra cada rama.

Plurales

En el ejemplo, =0 proporciona una frase explícita para el estado vacío. Las ramas one y other cubren las formas que usan los idiomas de ejemplo; no son una plantilla universal para cualquier configuración regional. Da al revisor contexto suficiente para que aporte las formas que requiere el idioma y los valores que puede producir tu app.

Mensajes select

Valores como active y paused son identificadores del programa. Traducirlos desconectaría el recurso del código que los proporciona. La rama other ofrece un mensaje alternativo para cualquier valor que no coincida con una rama con nombre.

Mensajes completos

Evita concatenar fragmentos como un verbo traducido, una cifra y un sustantivo traducido. Un mensaje completo permite al idioma de destino controlar el orden de las palabras. Explica en las instrucciones los valores, los rangos esperados y el contexto de la pantalla para que los revisores evalúen la frase tal como la verán los usuarios.

## Compara los paquetes de localización para Flutter

Elige un paquete según el formato de recursos, la arquitectura de la aplicación y las necesidades de mantenimiento. Los paquetes siguientes tienen convenciones distintas; usar más de un generador para los mismos mensajes crea una ambigüedad innecesaria.

| | Enfoque | Recursos habituales | Generación de código | Gestión de plurales | Útil cuando

| gen-l10n integrado | ARB | Genera accesores Dart tipados | Sintaxis de mensajes de estilo ICU | Quieres el flujo de recursos oficial de Flutter

| easy_localization | JSON por defecto, con cargadores adicionales disponibles | Herramientas de generación opcionales | API de plurales del paquete y reglas según la configuración regional | Prefieres sus convenciones de carga de recursos y gestión de configuraciones regionales

| Traducciones de GetX | Mapas indexados por configuración regional en su flujo básico documentado | No es necesaria para la API básica de mapas | trPlural usa claves de singular y plural; evalúa por separado las gramáticas más complejas | Tu aplicación ya usa GetX y su modelo de traducción cumple los requisitos

Consulta la [documentación actual de easy_localization](https://pub.dev/packages/easy_localization) y la [documentación de GetX](https://pub.dev/packages/get) antes de elegir. Prueba con tus mensajes reales el comportamiento de respaldo, los parámetros, las categorías de plural y los flujos de extracción. Que una API sea cómoda para las cadenas en inglés no demuestra que cubra todos los idiomas que vas a lanzar.

intl no es una plataforma de gestión de traducciones alternativa. Proporciona utilidades de internacionalización que usan los flujos de localización. gen-l10n genera accesores de la aplicación a partir de recursos ARB. El [paquete intl_utils](https://pub.dev/packages/intl_utils), independiente, también genera código de localización, pero su página figuraba como discontinuada cuando se consultó el 30 de octubre de 2026. Comprueba su estado de mantenimiento antes de adoptarlo en un proyecto nuevo.

## Prueba el cambio de idioma, RTL y la expansión del texto

Prueba tanto la corrección de los recursos como el comportamiento del texto traducido en la interfaz. Que el JSON se analice bien o que la generación de código funcione no garantiza que una pantalla sea comprensible y usable.

Cambio de configuración regional

Para una comprobación rápida durante el desarrollo, asigna a MaterialApp.locale un valor compatible como const Locale('es') . Para un selector de idioma en producción, guarda la configuración elegida en el estado de la aplicación, conserva la preferencia según los requisitos de tu producto y ofrece la opción de seguir el idioma del sistema. Valida la preferencia guardada con las configuraciones regionales que realmente admite la versión actual de la app.

Diseños de derecha a izquierda

Usa API de diseño direccional para los elementos que deben seguir el sentido de lectura. Comprueba márgenes, alineación, elementos de navegación y contenido con direcciones mixtas en una configuración regional real de derecha a izquierda. No des por hecho que todos los iconos deben reflejarse: una flecha de navegación y un símbolo de marca tienen significados distintos.

Expansión del texto

Prueba traducciones largas y tamaños de texto mayores. Revisa botones, pestañas, cuadros de diálogo, estados vacíos, errores y diseños estrechos. Incluye valores dinámicos como nombres largos y cifras para comprobar el diseño con el mensaje que recibirán realmente los usuarios.

Usa una matriz de pruebas práctica:

| | Comprobación | Ejemplo

| Cobertura de recursos | Cada clave obligatoria de la plantilla tiene un valor localizado o un respaldo intencionado

| Argumentos de los mensajes | Los nombres y tipos de los marcadores siguen siendo compatibles con los métodos generados

| Comportamiento con cantidades | Cero, uno y valores que activan las formas adicionales del idioma de destino

| Comportamiento de select | Estados conocidos más un valor inesperado que llegue a other

| Comportamiento de la configuración regional | Idioma del sistema, selección explícita, reinicio y preferencia no compatible

| Diseño | Texto expandido, tamaños de fuente grandes y contenido de derecha a izquierda

| Significado | Revisión nativa de los recorridos de usuario importantes

Para la parte lingüística del proceso, usa el [proceso de pruebas de localización](https://www.smartcat.com/software-localization/testing/). Mantén la aprobación lingüística y los resultados de las pruebas funcionales visibles como evidencias separadas de la versión.

## Planifica por separado la localización web en Flutter y la visibilidad en buscadores

Flutter web puede usar recursos localizados de la aplicación, pero localizar la interfaz no crea automáticamente un sitio web multilingüe preparado para SEO. La selección de idioma, el enrutamiento, los metadatos y la visibilidad del contenido siguen siendo decisiones de arquitectura.

Las [preguntas frecuentes sobre web](https://docs.flutter.dev/platform-integration/web/faq) de Flutter explican que se centra en experiencias de aplicación y recomiendan un enfoque orientado a documentos para el contenido web estático y con mucho texto. Plantéate usar páginas HTML independientes para marketing, ayuda y contenido editorial cuando necesiten posicionarse en la búsqueda orgánica.

Mantén la terminología alineada entre la app y esas páginas públicas. Un visitante que llega desde un buscador debe reconocer el nombre de la función al pasar de la página de destino localizada a la aplicación, aunque ambas superficies usen sistemas de renderizado distintos.

## Valida un proceso de traducción de ARB antes de ampliarlo

Trata ARB como un recurso estructurado de la aplicación, no como un simple archivo de textos. Una entrega de traducción debe conservar las claves, los metadatos, los marcadores de posición y la sintaxis de los mensajes, y devolver archivos que superen la generación y las pruebas de la app.

Entre los formatos documentados de Smartcat para proyectos de software figuran JSON, YAML, Android XML, iOS .strings y las importaciones LocJSON. La documentación revisada para esta guía no confirma la compatibilidad nativa con ARB ni un flujo probado de conversión de ARB a JSON. No supongas que cambiar la extensión de un archivo demuestra la compatibilidad. Consulta la [documentación de proyectos de software](https://help.smartcat.com/create-a-software-localization-project/).

Usa lo siguiente como procedimiento de validación propuesto con tu equipo de implementación, no como una receta de conector ya probada:

- Elige una muestra representativa

Selecciona una pequeña muestra ARB con cadenas simples, metadatos, marcadores de posición tipados, plurales y selects.

- Confirma la importación y la exportación

Confirma con el equipo de producto el método de importación y exportación compatible, incluido el tratamiento de los metadatos @ y los mensajes ICU.

- Aporta recursos lingüísticos y contexto

Proporciona un glosario, una memoria de traducción cuando proceda y un contexto claro para cada mensaje.

- Traduce y protege la estructura

Traduce y revisa el texto visible para el usuario protegiendo los identificadores del programa y la estructura.

- Compara y restaura

Compara los recursos devueltos con el contrato de origen y restáuralos en las rutas del proyecto esperadas.

- Genera y prueba

Ejecuta flutter gen-l10n , el análisis estático y las pruebas pertinentes en el entorno con la versión de SDK fijada del proyecto.

- Revisa y registra

Revisa la interfaz localizada y registra la versión de origen aprobada.

Automatiza la sincronización con el repositorio solo cuando ese ciclo completo funcione. Define quién gestiona los cambios del origen, cómo se invalida el estado de revisión y cómo se gestionan los artefactos generados. Mantén los recursos ARB bajo control de versiones como fuente de verdad del flujo de la aplicación.

Revisa tu proceso de traducción para Flutter

- [Reserva una demo](https://www.smartcat.com/book-a-demo/?main-cta1-flutter-localization)

## Fallos habituales y qué comprobar primero

| | Síntoma | Primera comprobación

| No se encuentra el import generado | La generación se ejecutó correctamente y el import coincide con la ruta de salida configurada

| AppLocalizations.of(context) no está disponible | El contexto está por debajo del proveedor de localización de la aplicación

| Un método de mensaje tiene argumentos inesperados | Los metadatos de marcadores de la plantilla y la API generada

| Un select siempre muestra el valor alternativo | El identificador de la aplicación coincide exactamente con la rama del recurso

| Falta una configuración regional | Archivos de recursos, configuraciones regionales compatibles y configuración de resolución

| La traducción falla después de exportar | Las claves, la validez del JSON, los metadatos y la sintaxis ICU se conservaron en el ciclo completo

Corrige el primer contrato roto en lugar de editar a mano el código Dart generado. El código generado se puede volver a generar; una corrección manual en él probablemente desaparecerá la próxima vez que cambien los recursos.

## Preguntas frecuentes

### ¿Qué es un archivo ARB en Flutter?

Un Application Resource Bundle es un archivo basado en JSON que contiene mensajes localizados y metadatos opcionales. El flujo gen-l10n de Flutter usa recursos ARB para generar una API de localización en Dart. Los metadatos pueden describir el mensaje y sus marcadores de posición, lo que ofrece a desarrolladores y traductores un contrato más claro para cada clave.

### ¿Qué diferencia hay entre gen-l10n e intl_utils?

Ambos generan código de localización a partir de recursos ARB, pero son herramientas distintas con convenciones de configuración y salida diferentes. gen-l10n forma parte del flujo integrado de Flutter. La página del paquete intl_utils figuraba como discontinuada cuando se consultó para esta guía, así que comprueba su estado de mantenimiento antes de elegirlo para una nueva implementación.

### ¿Cómo debo traducir los archivos ARB?

Traduce los mensajes visibles para el usuario conservando las claves estables, los identificadores de los marcadores, los metadatos y la estructura de mensaje necesaria. Usa un proceso que cumpla esos requisitos y, después, ejecuta la generación y las pruebas de la aplicación con los archivos devueltos. La revisión nativa debe evaluar el significado y el contexto, además de la validez estructural.

### ¿Admite Smartcat los marcadores de posición y plurales de ARB?

La documentación de proyectos de software revisada aquí no confirma la compatibilidad nativa con ARB ni una vía de conversión probada que conserve todas sus funciones. Confirma el método de importación y exportación con el equipo de producto y valida un ciclo completo representativo antes de adoptarlo. La compatibilidad genérica con JSON no demuestra por sí sola la compatibilidad con ARB.

### ¿Funciona la localización de Flutter en la web?

Las aplicaciones Flutter web pueden usar recursos localizados y selección de configuración regional. La visibilidad en buscadores es otra cuestión: el contenido público de marketing y ayuda puede beneficiarse de una arquitectura basada en HTML. Prueba el enrutamiento, la selección de idioma y los metadatos de tu experiencia web concreta en lugar de suponer que la configuración de localización móvil resuelve el SEO web.

¿No encuentras tu respuesta? [Habla con un especialista en localización](https://www.smartcat.com/book-a-demo/?main-cta4-flutter-localization)

Haz que tu entrega de traducción sea tan fiable como tu contrato de recursos

Trae una pequeña muestra ARB y las comprobaciones que requiere tu compilación. Revisa el proceso antes de ampliarlo a todos los idiomas y versiones.

- [Reserva una demo](https://www.smartcat.com/book-a-demo/?main-cta5-flutter-localization)

- [Descubre la localización de apps móviles](https://www.smartcat.com/software-localization/mobile-apps/)
