Qué compara la herramienta
- Formatos de Apple:
%@, %1$@, %d, %ld, %lld, %.2f, %u, %i y %s, posición por posición. %% es texto.
- Placeholders ICU de Flutter:
{name}, incluso dentro de las ramas plural y select.
Las conversiones poco comunes como %e o %x se ignoran a propósito, para que un texto como "20%en" no se tome por un error.
Los errores más frecuentes
- Un especificador omitido: nada falla, pero el nombre o el número desaparece de la pantalla.
- Un tipo cambiado:
%lld sustituido por %@ lee un entero como un objeto, con riesgo de cierre inesperado.
- Un orden cambiado sin posiciones: para reordenar, numera cada argumento (
%1$@, %2$@); mezclar numerados y sin numerar es un comportamiento indefinido.
- "20 % de descuento": el espacio antes del signo de porcentaje, que la RAE recomienda en español (y que es obligatorio en francés), hace que
% d se lea como un especificador. Duplica el signo: %%.
- Un placeholder ICU renombrado:
{count} convertido en {nombre} cambia la API de todos los idiomas en Flutter.
Estos casos se detallan en la guía sobre especificadores de formato de iOS y en la guía sobre placeholders ICU.
Limitaciones de la herramienta
La herramienta compara placeholders, no el significado: no detecta dos %@ intercambiados cuando los argumentos no están numerados, ni una frase mal traducida. No interpreta el escape con apóstrofos de ICU (la opción use-escaping de Flutter): '{' se lee como una llave. Compara una cadena cada vez; para un archivo completo, usa el verificador de claves faltantes ARB o un editor que verifique cada clave.