В 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 ресурсы. Множественное число"
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.
DevColibri возрождается. Жаль что на wordpress, вот бы на Jekyll все перенести.
Кстати где статьи из самописной платформы? Утеряны навсегда?
Jekyll есть http://jedicode.co это журнальчик по Java который я веду, а Андроид будет тут от соответствующих специалистов.
Ура ура, больше андройда