В 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.
ПОХОЖИЕ ПУБЛИКАЦИИ
- None Found
4 комментариев к статье "Plurals ресурсы. Множественное число"