Pega el mensaje de origen en «Mensaje ICU de origen» y su traducción en «Mensaje ICU traducido». Ambas cadenas se leen como ICU MessageFormat, se compara su estructura y cada hallazgo aparece en su propia línea con el prefijo OK, CHECK o ERROR.
Los tres contadores sobre la lista indican cuántos argumentos declara cada mensaje y cuántos hallazgos se han encontrado. Todo se analiza en este navegador: no se sube nada y la página sigue funcionando sin conexión una vez cargada.
Los argumentos se emparejan por nombre entre los dos mensajes. Un argumento que solo existe en el origen es un ERROR, uno que solo existe en la traducción es un CHECK, y si el mismo nombre lleva un tipo distinto —plural en un mensaje y number en el otro— el informe lanza un CHECK con ambos tipos.
En los argumentos select se comparan las claves de rama una a una, de modo que una rama perdida o añadida en la traducción se indica con su nombre. Los argumentos plural y selectordinal deben conservar una rama other, y su ausencia es un ERROR atribuido al lado que la ha perdido. Los mensajes anidados dentro de una rama se analizan de forma recursiva, así que sus argumentos también se cuentan.
Las ramas de plural y selectordinal no se comparan una a una: un origen con one/other frente a una traducción que solo tiene other se considera compatible. El comprobador tampoco lee el texto traducido, ni comprueba qué categorías de plural necesita el idioma de destino (few, many…), ni renderiza el mensaje con valores.
Un informe en verde significa solo que los dos mensajes declaran los mismos argumentos y las mismas ramas select. Renderiza ambos con tu biblioteca de producción antes de publicar y ten en cuenta las reglas de plural del idioma de destino.
El analizador lee argumentos {name}, argumentos plural, selectordinal y select con sus ramas, offset:N en la cabecera de plural, mensajes anidados, el marcador # dentro de ramas plural y el entrecomillado con apóstrofos: dos apóstrofos representan uno literal y uno solo abre y cierra texto entrecomillado. Los tipos como number, date o time se registran por su nombre, así que un esqueleto como {value, number, ::percent} se acepta.
Un mensaje que no se puede leer detiene la ejecución con un ERROR en lugar de un informe: una { sin cerrar, una } sin pareja, un apóstrofo sin cerrar, un nombre de argumento que no empieza por letra o guion bajo, o una rama sin su bloque { … }.