В 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 помещают число в каждую ветку, охватывающую несколько чисел, включая русскую ветку «one», даже там, где в английском языке для 1 есть отдельная ветка. Когда мы вручную убрали число из одной русской ветки «one», проверка сообщила, что эта форма также используется для 21, 31, 41 и 51.
Правило включено в translation-checks 1.2.0, бесплатно на GitHub, для ICU-сообщений, и в Polyglot 1.2.0 для множественных форм Android и ICU-сообщений. Другие проверки, добавленные на этой неделе, описаны в заметке о буквах другого алфавита.