Em 14 dos nossos 42 idiomas, a forma plural chamada "one" não é apenas para 1
Idiomas
A string de um app "One habit left today" tem uma parceira plural, "%d habits left today". O Android escolhe entre elas por categoria: o inglês usa "one" para 1 e "other" para todo o resto. Em russo, a categoria "one" é usada para 1, 21, 31, 41 e assim por diante. Nossa verificação de tradução errou isso duas vezes no mesmo dia, uma em cada direção.
A tradução correta que ela recusou
Em 2 de novembro, executamos novamente nosso kit de tradução no app de exemplo. Para "one" em russo, o modelo escreveu "Осталась %d привычка на сегодня": "%d habit left today", com o número. Nossa verificação comparou com a forma "one" em inglês, encontrou um %d que o inglês não tinha e recusou como um placeholder inventado. O modelo estava certo. Um usuário com 21 hábitos restantes recebe esta forma, então ela precisa mostrar o número. Mudamos a verificação: uma forma pode adicionar a contagem que a forma "other" em inglês usa. A próxima execução escreveu todas as 350 strings do exemplo.
A tradução errada que ela teria aprovado
A mesma verificação deixou passar o oposto. Se o modelo tivesse escrito "Осталась одна привычка" ("one habit left"), nada na string seria perdido, então passou, e o usuário com 21 hábitos restantes teria sido informado de que tem um. A regra antiga permitia que qualquer forma "one" omitisse o número, porque em inglês "one" é apenas 1.
Agora a verificação sabe quais números cada categoria cobre, a partir do CLDR, as regras de plural do Unicode que o Android e o ICU usam. Uma forma para uma categoria que cobre vários números deve mostrar o número. Uma forma para um único número pode omiti-lo: "one" em alemão é apenas 1, então "Noch eine Gewohnheit" está correto lá.
Onde "one" não é apenas 1
Em 14 dos 41 idiomas de destino que os dados do CLDR no Babel 2.10 conhecem, "one" cobre mais do que o número 1:
- 1, 21, 31, 41…: russo, ucraniano, sérvio, macedônio.
- 0 e 1: francês, português, persa, armênio, canarês, punjabe, amárico. "Une habitude restante" seria mostrado para 0 hábitos.
- 1 e 11: gaélico escocês. 1, 101, 201…: esloveno, cujo "two" também é 102 e 202.
- Todo número que não termina em 4, 6 ou 9: filipino.
Nas mensagens do ICU, um ramo próprio altera isso. Com =0{…} na mensagem, "one" em francês fica apenas com 1, e a verificação leva isso em conta.
Verificado em relação às próprias strings do Android
Antes de publicar a regra, executamo-la nas mensagens com plural nas strings de framework do Android: 897 traduções em 39 dos nossos idiomas. Ela não sinalizou nenhuma. Os tradutores da Google colocaram o número em todas as ramificações que cobrem vários números, incluindo a ramificação "um" em russo, mesmo onde o inglês dá uma ramificação própria para 1. Quando removemos manualmente o número de uma ramificação "um" em russo, a verificação indicou que a forma também é usada para 21, 31, 41 e 51.
A regra está no translation-checks 1.2.0, gratuito no GitHub, para mensagens ICU, e no Polyglot 1.2.0 para plurais do Android e mensagens ICU. As outras verificações que adicionamos esta semana estão na nota sobre letras de outro alfabeto.