O que a ferramenta compara
- Formatos da Apple:
%@, %1$@, %d, %ld, %lld, %.2f, %u, %i e %s, posição por posição. %% é texto.
- Placeholders ICU do Flutter:
{name}, inclusive dentro dos ramos plural e select.
Conversões raras como %e ou %x são ignoradas de propósito, para que um texto como "20%en" não seja tomado por erro.
Os erros mais comuns
- Um especificador removido: nada trava, mas o nome ou o número some da tela.
- Um tipo alterado:
%lld substituído por %@ lê um inteiro como objeto, com risco de crash.
- Uma ordem alterada sem posições: para reordenar, numere todos os argumentos (
%1$@, %2$@); misturar numerados e não numerados é comportamento indefinido.
- "20 % de remise" em francês: o espaço antes do sinal de porcentagem, exigido pela tipografia francesa, faz
% d ser lido como especificador. Duplique o sinal: %%.
- Um placeholder ICU renomeado:
{count} transformado em {nombre} muda a API de todos os locales no Flutter.
Esses casos estão detalhados no guia sobre especificadores de formato do iOS e no guia sobre placeholders ICU.
Limitações da ferramenta
A ferramenta compara placeholders, não o sentido: ela não detecta dois %@ trocados quando os argumentos não são numerados, nem uma frase mal traduzida. Ela não interpreta o escape de apóstrofos do ICU (a opção use-escaping do Flutter): '{' é lido como uma chave. Ela compara uma string de cada vez; para um arquivo inteiro, use o verificador de chaves ausentes em ARB ou um editor que verifique todas as chaves.