🇦🇹Internacionalização Própria

Sistema de Internacionalização (i18n)

Visão Geral

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

  1. Caminhos: Use camelCase para chaves

  2. Hierarquia: Organize por módulo/funcionalidade

    • app.common: Textos compartilhados

    • app.features.{feature}: Textos específicos de funcionalidade

    • accessibility: Textos para acessibilidade

  3. Plurais: Use objetos com chaves one e many

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

  1. Detecta idioma atual do dispositivo ou usa preferência salva

  2. Carrega arquivo JSON correspondente

  3. Notifica listeners sobre mudança

Inicialização do Sistema

No AppWidget

Na Injeção de Dependência

Métodos Principais

1. Método get(String path, {List<String>? params})

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

  1. Texto não aparece: Verificar se a chave existe no JSON

  2. Parâmetros não substituídos: Verificar se params está sendo passado

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

  1. Busca Arquivos: Encontra todos os .dart em lib/ e .json em assets/i18n/

  2. Extrai Chaves: Usa regex para encontrar chamadas i18n.get() e i18n.getPlural()

  3. Valida Existência: Verifica se cada chave existe no JSON

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

Last updated