В 14 от нашите 42 езика множествената форма, наречена „one“, не е само за 1
Езици
Низът на приложението „One habit left today“ има партньор за множествено число, „%d habits left today“. Android избира между тях по категория: английският използва „one“ за 1 и „other“ за всичко останало. На руски категорията „one“ се използва за 1, 21, 31, 41 и т.н. Нашата проверка за превод сбърка това два пъти в един и същи ден, по веднъж в двете посоки.
Правилният превод, който отхвърли
На 2 ноември стартирахме нашия комплект за превод отново върху примерното приложение. За руското „one“ моделът написа „Осталась %d привычка на сегодня“: „%d habit left today“, с числото. Нашата проверка го сравни с английската форма „one“, откри %d, което английският нямаше, и го отхвърли като измислен плейсхолдър. Моделът беше прав. Потребител с 21 останали навици получава тази форма, затова тя трябва да показва числото. Променихме проверката: форма може да добави броя, който английската форма „other“ използва. Следващото изпълнение написа всички 350 низа на примера.
Грешният превод, който щеше да мине
Същата проверка пропусна обратното. Ако моделът беше написал „Осталась одна привычка“ („one habit left“), нищо в низа не беше загубено, затова мина, и потребителят с 21 останали навици щеше да му се каже, че има един. Старото правило позволяваше на всяка форма „one“ да премахне числото, защото на английски „one“ е само 1.
Сега проверката знае кои числа покрива всяка категория, от CLDR, правилата за множествено число на Unicode, които Android и ICU използват. Форма за категория, която покрива няколко числа, трябва да показва числото. Форма за единично число може да го пропусне: немското „one“ е само 1, затова „Noch eine Gewohnheit“ е наред там.
Където „one“ не е само 1
В 14 от 41-те целеви езика, които данните на CLDR в Babel 2.10 познава, „one“ покрива повече от числото 1:
- 1, 21, 31, 41…: руски, украински, сръбски, македонски.
- 0 и 1: френски, португалски, персийски, арменски, каннада, пенджабски, амхарски. „Une habitude restante“ би се показвало за 0 навици.
- 1 и 11: шотландски келтски. 1, 101, 201…: словенски, чиято форма „two“ е също за 102 и 202.
- Всяко число, което не завършва на 4, 6 или 9: филипински.
В ICU съобщенията отделен клон променя това. С =0{…} в съобщението, френското „one“ остава само за 1, и проверката отчита това.
Проверено спрямо собствените низове на Android
Преди да пуснем правилото, го пуснахме върху съобщенията за множествено число в рамковите низове на Android: 897 превода на 39 от нашите езици. То не маркира нито едно. Преводачите на Google поставят числото във всеки клон, който покрива няколко числа, включително руския клон за "едно", дори когато английският отделя клон за 1. Когато премахнахме числото ръчно от един руски клон за "едно", проверката каза, че формата се използва и за 21, 31, 41 и 51.
Правилото е в translation-checks 1.2.0, безплатно в GitHub, за ICU съобщения, и в Polyglot 1.2.0 както за множествено число в Android, така и за ICU съобщения. Другите проверки, които добавихме тази седмица, са в бележката за букви от друга азбука.