In 14 delle nostre 42 lingue, la forma plurale chiamata "one" non è solo per 1

Lingue

La stringa di un'app "One habit left today" ha una forma plurale partner, "%d habits left today". Android sceglie tra loro per categoria: l'inglese usa "one" per 1 e "other" per tutto il resto. In russo la categoria "one" è usata per 1, 21, 31, 41 e così via. Il nostro controllo di traduzione lo ha sbagliato due volte lo stesso giorno, una volta in ogni direzione.

La traduzione corretta che ha rifiutato

Il 2 novembre abbiamo eseguito di nuovo il nostro kit di traduzione sulla sua app di esempio. Per il russo "one" il modello ha scritto "Осталась %d привычка на сегодня": "%d habit left today", con il numero. Il nostro controllo l'ha confrontata con la forma inglese "one", ha trovato un %d che l'inglese non aveva e l'ha rifiutata come placeholder inventato. Il modello aveva ragione. Un utente con 21 abitudini rimaste riceve questa forma, quindi deve mostrare il numero. Abbiamo modificato il controllo: una forma può aggiungere il conteggio che la forma inglese "other" usa. L'esecuzione successiva ha scritto tutte le 350 stringhe dell'esempio.

La traduzione errata che avrebbe superato

Lo stesso controllo ha lasciato passare l'opposto. Se il modello avesse scritto "Осталась одна привычка" ("one habit left"), nulla nella stringa era perso, quindi è passata, e all'utente con 21 abitudini rimaste sarebbe stato detto che ne ha una. La vecchia regola permetteva a qualsiasi forma "one" di omettere il numero, perché in inglese "one" è solo 1.

Ora il controllo sa quali numeri copre ogni categoria, da CLDR, le regole di pluralità Unicode che Android e ICU usano. Una forma per una categoria che copre più numeri deve mostrare il numero. Una forma per un singolo numero può ometterlo: il "one" tedesco è solo 1, quindi "Noch eine Gewohnheit" va bene lì.

Dove "one" non è solo 1

In 14 delle 41 lingue di destinazione che i dati di CLDR in Babel 2.10 conosce, "one" copre più del numero 1:

Nei messaggi ICU un ramo proprio cambia questo. Con =0{…} nel messaggio, il "one" francese resta solo per 1, e il controllo ne tiene conto.

Controllato rispetto alle stringhe di Android

Prima di pubblicare la regola, l'abbiamo eseguita sui messaggi plurali nelle stringhe di framework di Android: 897 traduzioni in 39 delle nostre lingue. Non ha segnalato nulla. I traduttori di Google hanno inserito il numero in ogni ramo che copre più numeri, incluso il "uno" russo, anche dove l'inglese riserva un ramo proprio a 1. Quando abbiamo rimosso manualmente il numero da un ramo "uno" russo, il controllo ha indicato che la forma è usata anche per 21, 31, 41 e 51.

La regola è in translation-checks 1.2.0, gratuita su GitHub, per i messaggi ICU, e in Polyglot 1.2.0 per i plurali Android e i messaggi ICU. Gli altri controlli aggiunti questa settimana sono in la nota sulle lettere di un altro alfabeto.

Aggiornato: