Cole a mensagem de origem em “Mensagem ICU de origem” e a tradução em “Mensagem ICU traduzida”. As duas strings são lidas como ICU MessageFormat, a estrutura é comparada e cada achado aparece em sua própria linha, com o prefixo OK, CHECK ou ERROR.
Os três contadores acima da lista mostram quantos argumentos cada mensagem declara e quantos achados foram encontrados. Tudo é analisado neste navegador: nada é enviado e a página continua funcionando offline depois de carregada.
Os argumentos são emparelhados por nome entre as duas mensagens. Um argumento que existe apenas na origem é um ERROR, um que existe apenas na tradução é um CHECK, e quando o mesmo nome tem um tipo diferente — plural em uma mensagem e number na outra — o relatório gera um CHECK nomeando os dois tipos.
Nos argumentos select as chaves de ramificação são comparadas uma a uma, então uma ramificação removida ou acrescentada na tradução é indicada com seu nome. Argumentos plural e selectordinal precisam manter uma ramificação other, e a ausência dela é um ERROR atribuído ao lado que a perdeu. Mensagens aninhadas dentro de uma ramificação são analisadas recursivamente, então os argumentos internos também são contados.
As ramificações de plural e selectordinal não são comparadas uma a uma: uma origem com one/other contra uma tradução que só tem other é considerada compatível. O verificador também não lê o texto traduzido, não confere quais categorias de plural o idioma de destino exige (few, many…) e não renderiza a mensagem com valores.
Um relatório verde significa apenas que as duas mensagens declaram os mesmos argumentos e as mesmas ramificações select. Renderize as duas com sua biblioteca de produção antes de publicar e leve em conta as regras de plural do idioma de destino.
O analisador lê argumentos {name}, argumentos plural, selectordinal e select com suas ramificações, offset:N no cabeçalho de plural, mensagens aninhadas, o marcador # dentro de ramificações plural e o uso de apóstrofos: dois apóstrofos representam um literal, e um único abre e fecha texto entre apóstrofos. Tipos como number, date ou time são registrados pelo nome, então um esqueleto como {value, number, ::percent} é aceito.
Uma mensagem que não pode ser lida interrompe a execução com um ERROR em vez de um relatório: uma { sem fechamento, uma } sem par, um apóstrofo sem fechamento, um nome de argumento que não começa com letra ou sublinhado, ou uma ramificação sem seu bloco { … }.