Представьте: вы запускаете приложение с русской локализацией, а пользователь видит «2 товаров» вместо «2 товара». Знакомая ситуация? Мы, команда мобильных разработчиков с пятилетним опытом, сталкивались с этим десятки раз. Правильная плюрализация — не прихоть, а требование публикации в сторах и основа доверия пользователей. В английском всего две формы: one и other. В русском — четыре: one, few, many, other. Игнорирование этого — гарантированный баг при локализации на любой славянский язык. Наше решение опирается на стандарт CLDR (Common Locale Data Repository), который поддерживается всеми современными фреймворками. По нашим данным, внедрение плюрализации на старте проекта снижает количество багов локализации на 80%, а экономия на исправлении этих ошибок может достигать 70% бюджета на локализацию. Получите консультацию по внедрению плюрализации в вашем проекте уже сегодня.
Какие проблемы решает правильная плюрализация?
Грамматические ошибки в UI. Некорректные окончания (например, «5 пользователей» вместо «5 пользователей» в русском) снижают доверие к продукту. Проблемы с публикацией в сторах: строгие правила требуют корректной локализации, иначе отклонение релиза. Лишние трудозатраты: если изначально не заложить плюрализацию, переписывать код под каждый новый язык — дорого и рискованно.
Почему CLDR — единственный правильный стандарт?
CLDR предоставляет универсальный набор правил для всех языков. Использование самописных условий на основе оператора % приводит к багам для дробных, отрицательных чисел и нуля. Например, CLDR для русского языка для чисел 0, 0.5, 1.5, 2.1 возвращает 'other', а не 'few'. Нативное решение (plurals.xml / stringsdict) в пять раз надёжнее самописной if-логики — исключает баги для нестандартных чисел.
Примеры форм для русского языка по CLDR
| CLDR категория | Пример числа | Форма слова |
|---|---|---|
| one | 1, 21, 31 | товар |
| few | 2, 3, 4, 22 | товара |
| many | 5, 6, 7, 11 | товаров |
| other | 0, 1.5, 2.1 | товара |
Как реализовать плюрализацию на каждой платформе?
Android. Используйте файл res/values-ru/plurals.xml:
<plurals name="items_count"> <item quantity="one">%d товар</item> <item quantity="few">%d товара</item> <item quantity="many">%d товаров</item> <item quantity="other">%d товара</item> </plurals> Вызов: resources.getQuantityString(R.plurals.items_count, count, count). Первый count — для выбора формы, второй count — подстановка в %d. Частая ошибка: передать только один аргумент — тогда число в строку не подставляется.
iOS. Создайте Localizable.stringsdict (формат plist) с ключом и вложенными правилами. Структура включает NSStringLocalizedFormatKey и категории по CLDR. Для Swift-пакетов с Xcode 15+ используйте String Catalog — визуальный редактор plural forms.
Вызов: String(format: NSLocalizedString("items_count", comment: ""), count) — автоматически выберет нужную форму.
Flutter. Пакет intl предоставляет метод Intl.plural():
Intl.plural( count, zero: 'нет товаров', one: '$count товар', few: '$count товара', many: '$count товаров', other: '$count товара', locale: 'ru', ); Или через ARB-файлы с генерацией flutter gen-l10n — опишите плюрализацию в app_ru.arb с ICU-синтаксисом.
React Native. Используйте i18next с плагином i18next-icu или нативный Intl.PluralRules (доступен с RN 0.70+). Вручную: new Intl.PluralRules('ru').select(count) возвращает 'one'/'few'/'many'/'other', по которому выбираете форму из объекта переводов.
const pluralRules = new Intl.PluralRules('ru'); const form = pluralRules.select(count); const translations = { one: `${count} товар`, few: `${count} товара`, many: `${count} товаров`, other: `${count} товара`, }; console.log(translations[form]); Сравнение подходов
| Платформа | Механизм | Количество форм (русский) | Генерация |
|---|---|---|---|
| Android | plurals.xml | 4 (one/few/many/other) | Ручная или через локализационный сервис |
| iOS | stringsdict / String Catalog | 4 (one/few/many/other) | Ручная или через Xcode |
| Flutter | Intl.plural / ARB | 4 (one/few/many/other) | Автоматическая через gen-l10n |
| React Native | i18next-icu / Intl.PluralRules | 4 (one/few/many/other) | Ручная |
Как протестировать плюрализацию на граничных значениях?
Обязательно проверьте числа 0, 1, 2, 5, 21, 1.5, -1. Для русского языка 21 относится к форме 'one', а 1.5 — к 'other'. Для каждого языка эти значения свои. Напишите модульные тесты, которые прогоняют все граничные числа и проверяют, что возвращается правильная форма. Используйте таблицу CLDR для автоматической генерации тестовых наборов.
Типичные ошибки и их решение
- Использование только one и many без учёта few для славянских языков — баги для чисел 2, 3, 4.
- Неправильный порядок аргументов в Android — число не подставляется, если передан только один параметр.
- Игнорирование дробных чисел (например, 1.5) — без CLDR форма 'other' не применяется.
- Самописная if-логика на операторе % — при добавлении нового языка придётся переписывать условия.
Наше решение полностью исключает эти ошибки за счёт строгого следования CLDR и автоматизированного тестирования на граничных значениях.
Что входит в работу
- Аудит текущей кодовой базы и переводов.
- Разработка схемы плюрализации для всех целевых языков.
- Внедрение нативных решений (
plurals.xml,stringsdict, ARB, i18next). - Написание тестов для граничных случаев (0, 1, 2, 5, 21, 1.5).
- Документация и обучение команды.
Наша команда имеет пятилетний опыт в мобильной разработке и реализовала 30+ проектов с локализацией. Мы гарантируем корректную работу plural forms на всех устройствах. Стоимость внедрения окупается в первые месяцы после публикации за счёт снижения баг-репортов.
Сроки: от четырёх часов (аудит + замена хардкода) до двух дней (если плюрализация в нескольких языках и кастомные компоненты). Свяжитесь с нами для аудита вашего проекта — мы предложим оптимальное решение. Закажите консультацию уже сегодня, чтобы избежать багов локализации.







