У 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:

У повідомленнях 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-повідомлень. Інші перевірки, які ми додали цього тижня, описані в примітці про літери іншого письма.

Оновлено: