Organização em conformidade com o GDPR

Organização certificada ISO 27001

Organização em conformidade com o SOC II

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

Agende uma demo

Traga uma pequena amostra de ARB e as verificações que seu build exige

Iniciar teste grátis

Iniciar teste grátis

15 dias grátis, sem cartão de crédito

Projeto de localização de software no Smartcat mostrando o progresso da tradução por idioma de destino

Mais de 80 das maiores empresas do mundo escolheram o Smartcat

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 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.

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 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.

AbordagemRecursos típicosGeração de códigoAbordagem de pluraisIndicado quando
gen-l10n nativoARBGera acessores Dart tipadosSintaxe de mensagens no estilo ICUVocê quer o processo oficial de recursos do Flutter
easy_localizationJSON por padrão, com outros loaders disponíveisFerramentas de geração opcionaisAPIs de plural do pacote e regras sensíveis à localidadeVocê prefere as convenções dele para carregamento de assets e gestão de localidades
Traduções do GetXMapas indexados por localidade no processo básico documentadoNão é necessária para a API básica de mapastrPlural usa chaves de singular e plural; avalie gramáticas mais complexas separadamenteSeu aplicativo já usa GetX e o modelo de tradução dele atende aos requisitos

Consulte a documentação do easy_localization e a documentação do GetX 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, 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çãoExemplo
Cobertura dos recursosToda chave obrigatória do modelo tem um valor localizado ou um fallback intencional
Argumentos das mensagensOs nomes e tipos dos placeholders continuam compatíveis com os métodos gerados
Comportamento de quantidadesZero, um e valores que acionam as formas adicionais do idioma de destino
Comportamento de selectEstados conhecidos e um valor inesperado que chega a other
Comportamento da localidadeIdioma do sistema, seleção explícita, reinicialização e preferência não suportada
LayoutTexto expandido, fontes grandes e conteúdo da direita para a esquerda
SentidoRevisão nativa das jornadas de usuário mais importantes

Para o lado linguístico do processo, use o processo de testes de localização. 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 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.

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:

  1. Escolha uma amostra representativa

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

  2. 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.

  3. 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.

  4. Traduza e proteja a estrutura

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

  5. Compare e restaure

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

  6. 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.

  7. 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

Falhas comuns e o que verificar primeiro

SintomaPrimeira verificação
A importação gerada não é encontradaA 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ívelO context está abaixo do provider de localização do aplicativo
Um método de mensagem tem argumentos inesperadosOs metadados de placeholders do modelo e a API gerada
Um select sempre mostra o fallbackO identificador do aplicativo corresponde exatamente ao ramo do recurso
Uma localidade está faltandoArquivos de recursos, localidades compatíveis e configuração de resolução de localidade
A tradução quebra depois da exportaçãoChaves, 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

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.