---
title: Localização no Flutter: ARB, intl e gen-l10n | Smartcat
description: Configure a localização no Flutter com arquivos ARB e gen-l10n: placeholders, plurais, intl x easy_localization, testes RTL e validação do processo de tradução.
canonical: https://pt.smartcat.com/flutter-localization/
language: pt
updated: 2026-11-03
---

# Localização no Flutter: ARB, intl e gen-l10n | Smartcat

## Localização no Flutter: arquivos ARB, intl e gen-l10n explicados

A localização no Flutter adapta as mensagens e a interface de um aplicativo para diferentes localidades. No processo nativo, o flutter_localizations oferece widgets do framework localizados, enquanto os recursos ARB e o gen-l10n geram a API AppLocalizations do aplicativo, e o intl dá suporte a mensagens e formatação sensíveis ao idioma.

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

- [Comece o teste grátis](https://smartcat.com/sign-up?main-cta3-flutter-localization)

## Configure o flutter_localizations e o gen-l10n

Este guia configura um pequeno exemplo em inglês e espanhol, explica os metadados das mensagens e compara as abordagens de pacotes mais comuns. Ele também mostra o que validar antes de conectar uma plataforma de tradução a um projeto Flutter.

Use um único gerador de localização e deixe explícitos os locais de entrada e saída. O exemplo abaixo pressupõe um aplicativo Flutter existente, com suas próprias restrições de SDK e configuração de projeto padrão.

Mescle as entradas relevantes no pubspec.yaml ; não duplique as seções dependencies ou flutter :

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

flutter:
generate: true Resolva as dependências com flutter pub get . A entrada intl: any segue o padrão oficial de configuração, permitindo que a resolução de dependências selecione a versão compatível com o SDK do Flutter; mantenha o lockfile do aplicativo e o processo normal de revisão de dependências.

Crie o l10n.yaml na raiz do projeto:

arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart Use o [guia de internacionalização do Flutter](https://docs.flutter.dev/ui/internationalization) atual para a configuração específica do SDK. No processo moderno, os arquivos de localização gerados ficam na árvore de código-fonte do aplicativo. O exemplo importa de lib/l10n ; evite copiar uma importação sintética antiga de package:flutter_gen para uma nova configuração. Veja a [nota de migração do código gerado](https://docs.flutter.dev/release/breaking-changes/flutter-generate-i10n-source).

## Escreva arquivos ARB com contexto e placeholders tipados

Um arquivo ARB é um pacote de recursos baseado em JSON que contém mensagens e metadados opcionais. Mantenha as chaves das mensagens estáveis, escreva mensagens completas e use os metadados para explicar como o texto é usado.

Crie o 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"}
}
}
} Crie o 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}}"
} O modelo contém os metadados de placeholders usados pelo gerador. O arquivo localizado preserva as chaves das mensagens, os nomes dos placeholders e os identificadores de select, alterando apenas a redação exibida ao usuário. Estes exemplos em espanhol ilustram o mecanismo; o texto de produção deve passar por revisão nativa no contexto real do produto.

Execute flutter gen-l10n depois de adicionar ou alterar recursos. Trate os erros do gerador como problemas de recursos que exigem ação e resolva-os antes de integrar os arquivos a um release.

## Conecte as mensagens geradas ao MaterialApp

Registre os delegates gerados e as localidades compatíveis e, em seguida, leia as mensagens localizadas a partir de um context abaixo do widget do aplicativo.

O exemplo a seguir deve ficar em lib/main.dart depois da geração:

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 tem acesso às localizações fornecidas pelo MaterialApp . Solicitar AppLocalizations a partir do context do widget externo faria a busca acima do provider criado por esse widget. A [documentação da API Localizations](https://api.flutter.dev/flutter/widgets/Localizations-class.html) explica como os recursos localizados ficam disponíveis para os descendentes. A API gerada deixa visível no código a diferença entre uma mensagem simples e uma mensagem com argumentos. appTitle é acessado como um valor; welcomeName , savedBooks e readingState recebem os valores necessários para montar suas mensagens.

## Trate plurais e mensagens select com cuidado

As mensagens de plural escolhem a redação de acordo com uma quantidade e a gramática da localidade de destino. As mensagens select escolhem um ramo a partir de um identificador fornecido pelo aplicativo. Preserve a sintaxe e os identificadores ao traduzir o texto exibido em cada ramo.

Plurais

No exemplo, =0 fornece uma frase explícita para o estado vazio. Os ramos one e other cobrem as formas usadas pelos idiomas do exemplo; eles não são um modelo universal para todas as localidades de destino. Dê ao revisor contexto suficiente para fornecer as formas exigidas pelo idioma e pelos valores que seu app pode gerar.

Mensagens select

Valores como active e paused são identificadores do programa. Traduzir esses identificadores desconectaria o recurso do código que os fornece. O ramo other dá à mensagem uma alternativa para valores que não correspondem a nenhum ramo nomeado.

Mensagens completas

Evite concatenar fragmentos, como um verbo traduzido, um número e um substantivo traduzido. Uma mensagem completa permite que o idioma de destino controle a ordem das palavras. Explique no briefing os valores, os intervalos esperados e o contexto da tela para que os revisores avaliem a frase como os usuários a verão.

## Compare os pacotes de localização do Flutter

Escolha um pacote pelo formato dos recursos, pela arquitetura do aplicativo e pelas necessidades de manutenção. Os pacotes abaixo seguem convenções diferentes; adotar mais de um gerador para as mesmas mensagens cria ambiguidade desnecessária.

| | Abordagem | Recursos típicos | Geração de código | Abordagem de plurais | Indicado quando

| gen-l10n nativo | ARB | Gera acessores Dart tipados | Sintaxe de mensagens no estilo ICU | Você quer o processo oficial de recursos do Flutter

| easy_localization | JSON por padrão, com outros loaders disponíveis | Ferramentas de geração opcionais | APIs de plural do pacote e regras sensíveis à localidade | Você prefere as convenções dele para carregamento de assets e gestão de localidades

| Traduções do GetX | Mapas indexados por localidade no processo básico documentado | Não é necessária para a API básica de mapas | trPlural usa chaves de singular e plural; avalie gramáticas mais complexas separadamente | Seu aplicativo já usa GetX e o modelo de tradução dele atende aos requisitos

Consulte a [documentação do easy_localization](https://pub.dev/packages/easy_localization) e a [documentação do GetX](https://pub.dev/packages/get) atuais antes de escolher. Teste o comportamento de fallback, os parâmetros, as categorias de plural e os processos de extração com suas mensagens reais. Uma API prática para strings em inglês não comprova a cobertura de todos os idiomas que você pretende lançar.

O intl não é uma plataforma concorrente de gestão de traduções. Ele fornece utilitários de internacionalização usados pelos processos de localização. O gen-l10n gera acessores do aplicativo a partir de recursos ARB. O [pacote intl_utils](https://pub.dev/packages/intl_utils), separado, também gera código de localização, mas sua página estava marcada como descontinuada quando verificada em 30 de outubro de 2026. Verifique o status de manutenção antes de adotá-lo em um novo projeto.

## Teste a troca de localidade, RTL e a expansão do texto

Teste tanto a correção dos recursos quanto o comportamento do texto traduzido na interface. Um parse de JSON ou uma geração de código bem-sucedidos não garantem que uma tela seja compreensível e utilizável.

Troca de localidade

Para uma verificação pontual durante o desenvolvimento, defina MaterialApp.locale com um valor compatível, como const Locale('es') . Para um seletor de idioma em produção, mantenha a localidade escolhida no estado do aplicativo, salve a preferência de acordo com os requisitos do produto e ofereça uma opção para seguir o idioma do sistema. Valide uma preferência salva em relação às localidades que a versão atual do app realmente suporta.

Layouts da direita para a esquerda

Use APIs de layout direcional para os elementos que devem seguir a direção de leitura. Verifique espaçamentos, alinhamento, elementos de navegação e conteúdo com direções mistas em uma localidade real da direita para a esquerda. Não presuma que todo ícone deve ser espelhado: uma seta de navegação direcional e um símbolo da marca têm significados diferentes.

Expansão do texto

Teste traduções longas e tamanhos de texto maiores. Confira botões, abas, diálogos, estados vazios, erros e layouts estreitos. Inclua valores dinâmicos, como nomes longos e números, para que o layout seja verificado com a mensagem que os usuários realmente vão receber.

Use uma matriz de testes prática:

| | Verificação | Exemplo

| Cobertura dos recursos | Toda chave obrigatória do modelo tem um valor localizado ou um fallback intencional

| Argumentos das mensagens | Os nomes e tipos dos placeholders continuam compatíveis com os métodos gerados

| Comportamento de quantidades | Zero, um e valores que acionam as formas adicionais do idioma de destino

| Comportamento de select | Estados conhecidos e um valor inesperado que chega a other

| Comportamento da localidade | Idioma do sistema, seleção explícita, reinicialização e preferência não suportada

| Layout | Texto expandido, fontes grandes e conteúdo da direita para a esquerda

| Sentido | Revisão nativa das jornadas de usuário mais importantes

Para o lado linguístico do processo, use o [processo de testes de localização](https://www.smartcat.com/software-localization/testing/). Mantenha a aprovação linguística e os resultados dos testes funcionais visíveis como evidências separadas do release.

## Planeje a localização do Flutter web e a descoberta separadamente

O Flutter web pode usar recursos localizados do aplicativo, mas localizar a interface não cria automaticamente um site multilíngue pronto para SEO. A seleção de idioma, o roteamento, os metadados e a descoberta do conteúdo continuam sendo decisões de arquitetura.

O [FAQ do Flutter para web](https://docs.flutter.dev/platform-integration/web/faq) descreve o foco em experiências de aplicativo e recomenda uma abordagem orientada a documentos para conteúdo web estático e rico em texto. Considere páginas separadas em HTML para marketing, ajuda e conteúdo editorial quando elas precisarem ter bom desempenho na busca orgânica.

Mantenha a terminologia alinhada entre o app e essas páginas públicas. Quem chega pela busca deve reconhecer o nome do recurso ao passar da landing page localizada para o aplicativo, mesmo quando as duas superfícies usam sistemas de renderização diferentes.

## Valide um processo de tradução de ARB antes de escalá-lo

Trate o ARB como um recurso estruturado do aplicativo, não apenas como um arquivo de valores de texto. Uma entrega de tradução precisa preservar chaves, metadados, placeholders e sintaxe das mensagens e devolver arquivos que passem pela geração e pelos testes do app.

Os formatos de projetos de software documentados pelo Smartcat incluem importações de JSON, YAML, XML do Android, .strings do iOS e LocJSON. A documentação consultada para este guia não confirma suporte nativo a ARB nem um processo testado de conversão de ARB para JSON. Não presuma que mudar a extensão de um arquivo comprova a compatibilidade. Consulte a [documentação de projetos de software](https://help.smartcat.com/create-a-software-localization-project/).

Use o roteiro a seguir como um procedimento de validação proposto, junto com sua equipe de implementação, e não como uma receita de conector já testada:

- Escolha uma amostra representativa

Selecione uma pequena amostra de ARB com strings simples, metadados, placeholders tipados, plurais e selects.

- Confirme a importação e a exportação

Confirme com a equipe de produto o método de importação e exportação compatível, incluindo o tratamento dos metadados @ e das mensagens ICU.

- Forneça ativos linguísticos e contexto

Forneça um glossário, memória de tradução quando fizer sentido e um contexto claro para cada mensagem.

- Traduza e proteja a estrutura

Traduza e revise o texto exibido ao usuário, protegendo os identificadores e a estrutura do programa.

- Compare e restaure

Compare os recursos devolvidos com o contrato da origem e restaure-os nos caminhos esperados do projeto.

- Gere e teste

Execute flutter gen-l10n , a análise estática e os testes relevantes no ambiente com a versão fixada do SDK do projeto.

- Revise e registre

Revise a interface localizada e registre a versão da origem aprovada.

Automatize a sincronização do repositório somente depois que esse ciclo completo funcionar. Defina quem cuida das alterações na origem, como o status de revisão é invalidado e como os artefatos gerados são gerenciados. Mantenha os recursos ARB sob controle de versão como fonte da verdade do processo do aplicativo.

Revise seu processo de tradução no Flutter

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

## Falhas comuns e o que verificar primeiro

| | Sintoma | Primeira verificação

| A importação gerada não é encontrada | A geração foi concluída com sucesso e a importação corresponde ao caminho de saída configurado

| AppLocalizations.of(context) não está disponível | O context está abaixo do provider de localização do aplicativo

| Um método de mensagem tem argumentos inesperados | Os metadados de placeholders do modelo e a API gerada

| Um select sempre mostra o fallback | O identificador do aplicativo corresponde exatamente ao ramo do recurso

| Uma localidade está faltando | Arquivos de recursos, localidades compatíveis e configuração de resolução de localidade

| A tradução quebra depois da exportação | Chaves, validade do JSON, metadados e sintaxe ICU sobreviveram ao ciclo completo

Corrija o primeiro contrato quebrado em vez de editar o Dart gerado manualmente. O código gerado pode ser recriado; um reparo manual nele provavelmente vai desaparecer na próxima vez que os recursos mudarem.

## Perguntas frequentes

### O que é um arquivo ARB no Flutter?

Um Application Resource Bundle é um arquivo baseado em JSON que contém mensagens localizadas e metadados opcionais. O processo gen-l10n do Flutter usa recursos ARB para gerar uma API de localização em Dart. Os metadados podem descrever a mensagem e seus placeholders, dando a desenvolvedores e tradutores um contrato mais claro para cada chave.

### Qual é a diferença entre gen-l10n e intl_utils?

Ambos geram código de localização a partir de recursos ARB, mas são ferramentas separadas, com convenções de configuração e saída diferentes. O gen-l10n faz parte do processo nativo do Flutter. A página do pacote intl_utils estava marcada como descontinuada quando verificada para este guia, então confirme o status de manutenção antes de escolhê-lo para uma nova implementação.

### Como devo traduzir arquivos ARB?

Traduza as mensagens exibidas ao usuário preservando chaves estáveis, identificadores de placeholders, metadados e a estrutura exigida das mensagens. Use um processo que atenda a esses requisitos e, depois, execute a geração e os testes do aplicativo nos arquivos devolvidos. A revisão nativa deve avaliar o sentido e o contexto, além da validade estrutural.

### O Smartcat suporta placeholders e plurais em ARB?

A documentação de projetos de software consultada aqui não confirma suporte nativo a ARB nem um caminho de conversão testado que preserve todos os recursos do ARB. Confirme o método de importação e exportação com a equipe de produto e valide um ciclo completo representativo antes de adotá-lo. O suporte genérico a JSON, por si só, não comprova a compatibilidade com ARB.

### A localização no Flutter funciona na web?

Aplicativos Flutter web podem usar recursos localizados e seleção de localidade. A descoberta na busca é uma questão à parte: conteúdo público de marketing e de ajuda pode se beneficiar de uma arquitetura baseada em HTML. Teste o roteamento, a seleção de idioma e os metadados da sua experiência web específica, em vez de presumir que a configuração de localização para mobile resolve o SEO na web.

Não encontrou sua resposta? [Fale com um especialista em localização](https://www.smartcat.com/book-a-demo/?main-cta4-flutter-localization)

Torne sua entrega de tradução tão confiável quanto o contrato dos seus recursos

Traga uma pequena amostra de ARB e as verificações que seu build exige. Revise o processo antes de escalá-lo para todos os idiomas e releases.

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

- [Conheça a localização de apps móveis](https://www.smartcat.com/software-localization/mobile-apps/)
