O sistema de localização nativo do Flutter utiliza arquivos Application Resource Bundle (ARB) e o pacote intl para oferecer experiências totalmente nativas em qualquer idioma. Este guia abrange desde a configuração do projeto e detalhes do formato ARB até troca de idioma, pluralização e automação de traduções com l10n.dev.
Localização Flutter é a abordagem oficial para adaptar seu app para múltiplos idiomas e regiões. Baseia-se em arquivos ARB para armazenar strings traduzidas e no gerador de código flutter_gen para produzir acessores Dart com tipagem segura. Em tempo de execução, o Flutter seleciona o arquivo ARB correto com base na localidade do dispositivo — sem necessidade de reiniciar ao trocar de idioma programaticamente.
O pipeline de localização do Flutter é guiado por dois arquivos de configuração: pubspec.yaml e l10n.yaml. Ative a geração de código no pubspec.yaml e aponte o Flutter para o diretório dos seus arquivos ARB.
Adicione flutter_localizations e intl como dependências e ative a flag generate para que o Flutter gere automaticamente as classes Dart de localização a partir dos seus arquivos ARB.
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: any
flutter:
generate: trueColoque um arquivo l10n.yaml na raiz do seu projeto para configurar o diretório ARB, o arquivo modelo e o nome do arquivo de saída gerado.
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dartARB (Application Resource Bundle) é um formato baseado em JSON projetado especificamente para internacionalização Flutter. Cada chave corresponde a uma string traduzível, e chaves de metadados opcionais (prefixadas com @) contêm descrições, definições de espaços reservados e contexto para tradutores.
{
"@@locale": "en",
"@@last_modified": "2026-01-15T10:30:00Z",
"appTitle": "My App",
"@appTitle": {
"description": "The title of the application"
},
"welcome": "Welcome, {name}!",
"@welcome": {
"description": "Welcome message shown on the home screen",
"placeholders": {
"name": {
"type": "String",
"example": "Alice"
}
}
},
"unreadMessages": "{count, plural, =0{No unread messages} =1{1 unread message} other{{count} unread messages}}",
"@unreadMessages": {
"description": "Number of unread messages",
"placeholders": {
"count": {
"type": "int"
}
}
}
}Após a tradução, as strings da interface são localizadas enquanto a estrutura dos metadados permanece intacta. O l10n.dev atualiza @@locale e @@last_modified automaticamente.
{
"@@locale": "fr",
"@@last_modified": "2026-01-15T10:30:01Z",
"appTitle": "Mon Application",
"@appTitle": {
"description": "The title of the application"
},
"welcome": "Bienvenue, {name} !",
"@welcome": {
"description": "Welcome message shown on the home screen",
"placeholders": {
"name": {
"type": "String",
"example": "Alice"
}
}
},
"unreadMessages": "{count, plural, =0{Aucun message non lu} =1{1 message non lu} other{{count} messages non lus}}",
"@unreadMessages": {
"description": "Number of unread messages",
"placeholders": {
"count": {
"type": "int"
}
}
}
}Arquivos ARB seguem um padrão simples de nomeação: um prefixo (por padrão app_) seguido do código da localidade e a extensão .arb. Flutter e l10n.dev usam underscores para separar códigos de idioma e região.
# Default pattern (recommended)
app_en.arb
app_fr.arb
app_en_US.arb # Locale with region (underscore format)
app_zh_CN.arb # Chinese Simplified
# Custom prefix patterns also supported
my_app_en.arb
my_app_fr.arb
# Note: ARB files use underscores, not hyphens
# ✓ app_en_US.arb
# ✗ app_en-US.arbOrganize todos os seus arquivos ARB dentro de uma pasta dedicada l10n dentro de lib/. O gerador de código do Flutter os detecta automaticamente com base na configuração arb-dir do l10n.yaml e gera classes Dart prontas para uso.
lib/
├── l10n/
│ ├── app_en.arb ← Source (English)
│ ├── app_fr.arb ← French
│ ├── app_de.arb ← German
│ ├── app_ja.arb ← Japanese
│ ├── app_zh_CN.arb ← Chinese Simplified
│ └── app_es.arb ← Spanish
├── main.dart
└── ...
# Generated output (do not edit manually)
.dart_tool/
└── flutter_gen/
└── gen_l10n/
└── app_localizations.dartConecte a classe Dart de localização gerada ao MaterialApp fornecendo localizationsDelegates e supportedLocales. O Flutter então resolve os dados ARB corretos para a localidade do dispositivo.
Passe os quatro delegates necessários — seu AppLocalizations.delegate gerado mais os três delegates do SDK Flutter — e liste todas as localidades que seu app suporta. Use AppLocalizations.of(context)! em qualquer lugar da árvore de widgets para acessar strings traduzidas.
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'My App',
// Required delegates
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
// Supported locales
supportedLocales: AppLocalizations.supportedLocales,
home: const HomePage(),
);
}
}
// Use in a widget
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
final l10n = AppLocalizations.of(context)!;
return Scaffold(
appBar: AppBar(title: Text(l10n.appTitle)),
body: Center(child: Text(l10n.welcome('Alice'))),
);
}
}O Flutter permite trocar a localidade do app em tempo de execução atualizando a propriedade locale do MaterialApp. Um padrão comum é armazenar um Locale em um StatefulWidget ou solução de gerenciamento de estado e expor um callback para alterá-lo. A árvore de widgets se reconstrói automaticamente com a nova localidade.
// Manage locale state at the app level
class MyApp extends StatefulWidget {
const MyApp({super.key});
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Locale _locale = const Locale('en');
void _changeLocale(Locale locale) {
setState(() => _locale = locale);
}
@override
Widget build(BuildContext context) {
return MaterialApp(
locale: _locale,
localizationsDelegates: const [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: AppLocalizations.supportedLocales,
home: SettingsPage(onLocaleChange: _changeLocale),
);
}
}
// Language selector widget
class LanguageSelector extends StatelessWidget {
final void Function(Locale) onLocaleChange;
const LanguageSelector({super.key, required this.onLocaleChange});
@override
Widget build(BuildContext context) {
return DropdownButton<Locale>(
value: Localizations.localeOf(context),
items: AppLocalizations.supportedLocales
.map((locale) => DropdownMenuItem(
value: locale,
child: Text(locale.toLanguageTag()),
))
.toList(),
onChanged: (locale) {
if (locale != null) onLocaleChange(locale);
},
);
}
}Flutter usa a sintaxe de mensagens ICU para pluralização dentro dos arquivos ARB. O pacote intl lida com todas as categorias plurais do CLDR, aplicando automaticamente a forma correta conforme as regras do idioma alvo.
{
"cartItems": "{count, plural, =0{Your cart is empty} =1{1 item in your cart} other{{count} items in your cart}}",
"@cartItems": {
"description": "Cart item count",
"placeholders": {
"count": { "type": "int" }
}
},
"daysLeft": "{days, plural, =1{1 day left} other{{days} days left}}",
"@daysLeft": {
"description": "Days remaining",
"placeholders": {
"days": { "type": "int" }
}
}
}O l10n.dev foi criado para funcionar perfeitamente com o fluxo de trabalho ARB do Flutter. Faça upload do seu arquivo ARB fonte e receba traduções precisas e corretamente estruturadas de volta:
Use o pacote npm ai-l10n para traduzir seu arquivo ARB fonte via linha de comando ou como parte de um pipeline CI/CD. Instale uma vez e traduza para qualquer número de idiomas com um único comando.
# Install the CLI
npm install ai-l10n
# Translate your source ARB to multiple languages
npx ai-l10n translate lib/l10n/app_en.arb \
--languages fr,de,ja,zh_CN,es,koVocê pode conectar o ai-l10n diretamente ao seu processo de build do Flutter para que as traduções estejam sempre atualizadas antes que o aplicativo seja compilado. Duas abordagens comuns são um script no package.json ou um Makefile.
Adicione um script de tradução e use o gancho de ciclo de vida prebuild do npm para executá-lo automaticamente antes de cada build. Execute npm run build:android (ou build:ios / build:web) e o ai-l10n traduzirá primeiro, depois passará o processo para o Flutter.
{
"scripts": {
"translate": "ai-l10n translate lib/l10n/app_en.arb --languages fr,de,ja,zh_CN,es,ko --update",
"prebuild": "npm run translate",
"build:android": "flutter build apk",
"build:ios": "flutter build ios",
"build:web": "flutter build web"
}
}Se sua equipe usa Make, declare um alvo (target) de tradução e faça com que cada alvo de build dependa dele. Executar make build-android (ou build-ios / build-all) traduzirá todos os idiomas de destino antes de invocar o flutter build.
LANGUAGES = fr,de,ja,zh_CN,es,ko
translate:
npx ai-l10n translate lib/l10n/app_en.arb --languages $(LANGUAGES) --update
build-android: translate
flutter build apk
build-ios: translate
flutter build ios
build-web: translate
flutter build web
build-all: translate
flutter build apk
flutter build ios
flutter build webPara integração CI/CD, atualizações incrementais, tradução em lote de múltiplos arquivos e exemplos de workflow no GitHub Actions, veja o Guia de Automação de Localização.
A extensão l10n.dev para VS Code traz a tradução de arquivos ARB Flutter diretamente para seu editor. Clique com o botão direito em qualquer arquivo ARB e traduza para seus idiomas alvo sem sair do VS Code.
Aqui está um exemplo ao vivo de tradução de um arquivo ARB Flutter para uzbeque dentro do VS Code:

Pronto para alcançar usuários globais? Você pode traduzir arquivos ARB diretamente no workspace l10n.dev, automatizar com o CLI npm ou traduzir direto no VS Code:
Descubra por que a tradução potencializada por IA é melhor para arquivos i18n do que métodos tradicionais
Integre a localização potencializada por IA diretamente em seu pipeline CI/CD
Traga a localização por IA para seu fluxo de trabalho com nossas extensões e plugins
Obrigado por usar o l10n.dev para localizar seu app Flutter! 🚀
Se este guia ajudou você, compartilhe com outros desenvolvedores Flutter que precisam alcançar um público global.
Juntos, podemos tornar apps Flutter mais inclusivos e prontos para o mundo.