Plurals ресурсы. Множественное число.

В Android системе есть ресурс <plurals>. Он упрощает поддержку строк, требующих согласования с числительными. Нет необходимости обрабатывать их склонение в программном коде, когда это можно сделать прямо в ресурсах.

В процессе написания приложения TwitterApp мы столкнулись с проблемой употребления строк, требующих согласования с числительными. Типичный её пример: 21 читатель, но 4 читателя. Т.е. необходимо употреблять правильную форму слова в зависимости от числа, в контексте которого слово употребляется. Интересно, задумывались ли о таких мелочах разработчики официального Twitter-клиента?

 

 

Отличное решение, Twitter!

Обратимся к официальной документации.

Давайте рассмотрим решение проблемы на примере нашего приложения. До этого в файле strings.xml лежала строка следующего вида:

<resources>
    <item name="following_hint">Читатели</item>
</resources>

В Android системе есть ресурс типа <plurals> (англ. множественный), с помощью которого можно вывести строку в зависимости от входного параметра (числа).

В документации описаны возможные значения:

zero — значения для нуля , отсутствия чего-либо;

one — строка для чисел, которые являются единицей или заканчиваются на единицу; В русскому языке под этот пункт попадают числа 21, 31, 41 и т.д.

two — для чисел, заканчивающихся на двойку или только для двойки в зависимости от языка;

fewнесколько. Числа, которые попадают под этот пункт, зависят от конкретного языка и перечислены в документации. Например, для русского языка это относится к числам, оканчивающимся на 2, 3 и 4 (несмотря на наличие правила two);

many — множественное число. Также может меняться в зависимости от языка. Для русского языка — от пятёрки и выше (но учитывая, что числа типа 21,31,41 попадают под значение one);

other — остальные варианты.

В нашем случае необходимо изменить код в ресурсах на следующий.

<resources>
    <plurals name="following_hint">
        <item quantity="one">%d Читатель</item>
        <item quantity="few">%d Читателя</item>
        <item quantity="many">%d Читателей</item>
    </plurals>
</resources>

Вот и всё. %d означает, что мы будем передавать число, как параметр.

В Activity для получения необходимой строки используется метод getQuantityString(int resId, int quantity, Object… formatArgs), принимающий в качестве параметров ссылку на сам ресурс, а также дважды количество подписчиков: первое используется для выбора подходящей строки, а второе для вставки на место %d. Если ваша строка не использует форматирование, то и передавать третий параметр необходимости нет.

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.user_info_activity_layout);

        for (int i = 0; i < 12; i++) {
            String followersCount = getResources().getQuantityString(R.plurals.following_count, i, i);
            Log.d("PluralsTest", followersCount);
        }
   }

В результате получаем:

com.dev.andrtwitter D/PluralsTest: 0 Читателей
com.dev.andrtwitter D/PluralsTest: 1 Читатель
com.dev.andrtwitter D/PluralsTest: 2 Читателя
com.dev.andrtwitter D/PluralsTest: 3 Читателя
com.dev.andrtwitter D/PluralsTest: 4 Читателя
com.dev.andrtwitter D/PluralsTest: 5 Читателей
com.dev.andrtwitter D/PluralsTest: 6 Читателей
com.dev.andrtwitter D/PluralsTest: 7 Читателей
com.dev.andrtwitter D/PluralsTest: 8 Читателей
com.dev.andrtwitter D/PluralsTest: 9 Читателей
com.dev.andrtwitter D/PluralsTest: 10 Читателей
com.dev.andrtwitter D/PluralsTest: 11 Читателей

Вот такое элегантное решение предоставляет нам Android SDK.

Урок создан: 05 ноября 2017 | Просмотров: 489 | Автор: Алексей Петров | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 06 ноября 2017 в 21:38

    Анатолий С.

    DevColibri возрождается. Жаль что на wordpress, вот бы на Jekyll все перенести.

    • 06 ноября 2017 в 21:40

      Анатолий С.

      Кстати где статьи из самописной платформы? Утеряны навсегда?

      • 07 ноября 2017 в 10:32

        Alex Barchuk

        Jekyll есть http://jedicode.co это журнальчик по Java который я веду, а Андроид будет тут от соответствующих специалистов.

  • 07 ноября 2017 в 08:12

    Захар

    Ура ура, больше андройда