I 14 av våra 42 språk är pluralformen som kallas "one" inte bara för 1
Språk
En apps sträng "One habit left today" har en pluralpartner, "%d habits left today". Android väljer mellan dem efter kategori: engelska använder "one" för 1 och "other" för allt annat. På ryska används kategorin "one" för 1, 21, 31, 41 och så vidare. Vår översättningskontroll fick fel på det två gånger samma dag, en gång i varje riktning.
Den korrekta översättningen som den avvisade
Den 2 november körde vi vårt översättningsverktygspaket på sin exempelapp igen. För ryskt "one" skrev modellen "Осталась %d привычка на сегодня": "%d habit left today", med siffran. Vår kontroll jämförde den med engelskans "one"-form, hittade en %d som engelskan inte hade, och avvisade den som en påhittad platshållare. Modellen hade rätt. En användare med 21 kvarvarande vanor får denna form, så den måste visa siffran. Vi ändrade kontrollen: en form får lägga till antalet som engelskans "other"-form använder. Nästa körning skrev alla 350 strängarna i exemplet.
Den felaktiga översättningen som den hade godkänt
Samma kontroll släppte igenom det motsatta. Om modellen hade skrivit "Осталась одна привычка" ("one habit left"), gick inget förlorat i strängen, så den godkändes, och användaren med 21 kvarvarande vanor hade fått veta att hen har en. Den gamla regeln tillät vilken "one"-form som helst att ta bort siffran, eftersom "one" på engelska bara är 1.
Nu vet kontrollen vilka siffror varje kategori täcker, från CLDR, de Unicode-pluralregler som Android och ICU använder. En form för en kategori som täcker flera siffror måste visa siffran. En form för en enda siffra får utelämna den: tyskt "one" är bara 1, så "Noch eine Gewohnheit" är bra där.
Där "one" inte bara är 1
I 14 av de 41 målspråk som CLDR:s data i Babel 2.10 känner till, täcker "one" mer än siffran 1:
- 1, 21, 31, 41…: Ryska, ukrainska, serbiska, makedonska.
- 0 och 1: Franska, portugisiska, persiska, armeniska, kannada, punjabi, amhariska. "Une habitude restante" skulle visas för 0 vanor.
- 1 och 11: Skotsk gaeliska. 1, 101, 201…: Slovenska, vars "two" också är 102 och 202.
- Alla siffror som inte slutar på 4, 6 eller 9: Filippinska.
I ICU-meddelanden ändrar en egen gren detta. Med =0{…} i meddelandet lämnas franskt "one" med bara 1, och kontrollen tar hänsyn till det.
Kontrollerat mot Androids egna strängar
Innan vi levererade regeln körde vi den på pluralmeddelandena i Androids ramverkssträngar: 897 översättningar på 39 av våra språk. Den flaggade inga. Googles översättare satte in talet i varje gren som täcker flera tal, inklusive ryska "one", även där engelskan ger 1 en egen gren. När vi tog bort talet ur en rysk "one"-gren för hand sa kontrollen att formen också används för 21, 31, 41 och 51.
Regeln finns i translation-checks 1.2.0, gratis på GitHub, för ICU-meddelanden, och i Polyglot 1.2.0 för både Android-pluraler och ICU-meddelanden. De andra kontroller vi lade till i veckan finns i anteckningen om bokstäver från ett annat skriftspråk.