O sistema de internacionalização é baseado em arquivos JSON e uma classe centralizada AppI18n que gerencia as traduções. O sistema suporta textos simples, textos com parâmetros e pluralização.
Arquitetura do Sistema
Estrutura de Arquivos
assets/
i18n/
pt_BR.json # Arquivo de traduções em português
en_US.json # Arquivo de traduções em inglês
es_ES.json # Arquivo de traduções em espanhol
lib/
core/
i18n/
app_i18n.dart # Classe principal de gerenciamento
enums/
language.dart # Enum com idiomas suportados
tools/
i18n_validator/ # Ferramenta de validação
Exemplo de organização do Arquivo JSON
Organização Hierárquica
O exemplo abaixo mostra a estrutura do arquivo pt_BR.json.
Importante: Todos os arquivos de idioma (pt_BR.json, en_US.json, es_ES.json) devem ter as mesmas chaves na mesma estrutura. Apenas os valores devem ser traduzidos. Por exemplo:
pt_BR.json: "hello": "Olá, {}!"
en_US.json: "hello": "Hello, {}!"
es_ES.json: "hello": "¡Hola, {}!"
Convenções de Nomenclatura
Caminhos: Use camelCase para chaves
Hierarquia: Organize por módulo/funcionalidade
app.common: Textos compartilhados
app.features.{feature}: Textos específicos de funcionalidade
accessibility: Textos para acessibilidade
Plurais: Use objetos com chaves one e many
Parameters: Use {} apenas quando você pretende passar parâmetros para a string. Se colocar {} no JSON mas não passar o parâmetro correspondente, o placeholder {} permanecerá visível no texto final
Classe AppI18n
A classe AppI18n é responsável por:
Carregar arquivos de tradução
Fornecer métodos para buscar textos
Gerenciar mudança de idioma
Notificar mudanças via ChangeNotifier
Método init()
Inicializa o sistema de tradução:
Processo:
Detecta idioma atual do dispositivo ou usa preferência salva
Busca uma tradução simples no arquivo JSON usando um caminho pontilhado.
Uso:
2. Método getPlural(String path, int count, {List<String>? params})
Busca traduções com pluralização baseada na quantidade.
Uso:
Regras de Pluralização:
count == 1: usa a chave "one"
count != 1: usa a chave "many"
Integração com Widgets
Widgets Base
O sistema usa widgets base que automaticamente injetam AppI18n via Provider:
AppStatelessWidget
AppStatefulWidget
Exemplo de Uso em Widget
Boas Práticas
1. Organização de Chaves
2. Uso de Parâmetros
3. Pluralização
Troubleshooting
Problemas Comuns
Texto não aparece: Verificar se a chave existe no JSON
Parâmetros não substituídos: Verificar se params está sendo passado
Pluralização não funciona: Verificar estrutura one/many no JSON
Sistema de Validação
A ferramenta em tools/i18n_validator/ verifica se todas as strings usadas no código existem nos arquivos de tradução.
Comando de execução
execute 'dart run tools/i18n_validator/main.dart' para validar strings usadas nos arquivos .dart
Como Funciona
1. Validadores
SingleTextValidator: Verifica uso de i18n.get()
PluralTextValidator: Verifica uso de i18n.getPlural()
2. Processo de Validação
Busca Arquivos: Encontra todos os .dart em lib/ e .json em assets/i18n/
Extrai Chaves: Usa regex para encontrar chamadas i18n.get() e i18n.getPlural()
Valida Existência: Verifica se cada chave existe no JSON
Valida Estrutura: Para plurais, verifica se tem one e many
Conclusão
Este sistema de internacionalização oferece uma estrutura robusta e escalável para aplicações Flutter. Com arquivos JSON hierárquicos, validação e integração transparente via Provider, garante consistência entre idiomas e facilita a manutenção. A separação clara entre lógica de tradução e interface, combinada com widgets base que injetam automaticamente as dependências, proporciona uma experiência de desenvolvimento fluida e organizada para aplicativos com suporte à diferentes idiomas.