In 14 van onze 42 talen is de meervoudsvorm die "one" heet niet alleen voor 1
Talen
Een app-string "One habit left today" heeft een meervoudspartner, "%d habits left today". Android kiest tussen deze vormen op basis van categorie: Engels gebruikt "one" voor 1 en "other" voor alles anders. In het Russisch wordt de categorie "one" gebruikt voor 1, 21, 31, 41 enzovoort. Onze vertaalcontrole had dat op dezelfde dag twee keer fout, één keer in elke richting.
De juiste vertaling die het weigerde
Op 2 november draaiden we onze vertaalkit opnieuw op de voorbeeldapp. Voor het Russische "one" schreef het model "Осталась %d привычка на сегодня": "%d habit left today", met het getal. Onze controle vergeleek dit met de Engelse "one"-vorm, vond een %d die het Engels niet had, en weigerde het als een verzonnen placeholder. Het model had gelijk. Een gebruiker met nog 21 gewoontes krijgt deze vorm, dus het getal moet erin staan. We hebben de controle aangepast: een vorm mag het aantal toevoegen dat de Engelse "other"-vorm gebruikt. De volgende run schreef alle 350 strings van de voorbeeldapp.
De verkeerde vertaling die het zou hebben goedgekeurd
Dezelfde controle liet het tegenovergestelde door. Als het model "Осталась одна привычка" ("one habit left") had geschreven, ging er niets van de string verloren, dus het werd goedgekeurd, en de gebruiker met nog 21 gewoontes zou te horen krijgen dat hij er nog één heeft. De oude regel stond toe dat elke "one"-vorm het getal weglaat, omdat in het Engels "one" alleen voor 1 staat.
Nu weet de controle welke getallen elke categorie dekt, uit CLDR, de Unicode meervoudsregels die Android en ICU gebruiken. Een vorm voor een categorie die meerdere getallen dekt, moet het getal tonen. Een vorm voor een enkel getal mag het weglaten: Duits "one" is alleen 1, dus "Noch eine Gewohnheit" is daar prima.
Waar "one" niet alleen 1 is
In 14 van de 41 doeltalen die CLDR's data in Babel 2.10 kent, dekt "one" meer dan alleen het getal 1:
- 1, 21, 31, 41…: Russisch, Oekraïens, Servisch, Macedonisch.
- 0 en 1: Frans, Portugees, Perzisch, Armeens, Kannada, Punjabi, Amhaars. "Une habitude restante" zou getoond worden bij 0 gewoontes.
- 1 en 11: Schots-Gaelisch. 1, 101, 201…: Sloveens, waarvan "two" ook 102 en 202 is.
- Elk getal dat niet eindigt op 4, 6 of 9: Filipijns.
In ICU-berichten verandert een eigen tak dit. Met =0{…} in het bericht blijft Frans "one" alleen voor 1, en de controle houdt daar rekening mee.
Gecheckt tegen Androids eigen strings
Voordat we de regel uitbrachten, hebben we deze uitgevoerd op de meervoudsberichten in de framework-strings van Android: 897 vertalingen in 39 van onze talen. Er werd niets gemarkeerd. De vertalers van Google zetten het getal in elke tak die meerdere getallen dekt, inclusief het Russische "one", zelfs waar Engels 1 een eigen tak geeft. Toen we het getal handmatig uit één Russische "one"-tak haalden, gaf de controle aan dat de vorm ook wordt gebruikt voor 21, 31, 41 en 51.
De regel staat in translation-checks 1.2.0, gratis op GitHub, voor ICU-berichten, en in Polyglot 1.2.0 voor zowel Android-meervouden als ICU-berichten. De andere controles die we deze week hebben toegevoegd, staan in de notitie over letters uit een ander schrift.