Страницы

Поиск по вопросам

пятница, 29 ноября 2019 г.

Android - использование Plurals в отношении секунд, минут, часов, дней

#android #строки


Приветствую!
Подскажите как правильнее использовать Plurals в отношении секунд, минут, часов,
дней для вывода времени которое "осталось" и "прошло" 


        секунд
        %1$d секунда
        %1$d секунды
        %1$d секунд
        %1$d секунд



zero, one, two - понятно, но к примеру few - это насколько я понимаю от 2х до 5,
а 5 уже будет не "секунды" и "секунд". И далее - с many, например 101 секунда, 102
секунды,... т.е. действовать должны правила для one, two.
Как учесть эту разницу?
    


Ответы

Ответ 1



Статья zero — строка для нуля, отсутствия чего-либо; в некоторых языках — ещё и для чисел, оканчивающихся нулём; one — строка для чисел, заканчивающихся на единицу; в некоторых языках — только для единицы; two — для чисел, заканчивающихся на двойку, или только для двойки; few— здесь, под словом «несколько», уже не скрывается конкретики, обработка полностью зависит от языковых правил; например, для русского языка это относится к числам, оканчивающимся на 2, 3 и 4 (именно так, несмотря на наличие правила «two»); many — аналогично, «неконкретная» категория, можно понимать её как «нечто побольше few»; в русском языке — от пятёрки и выше; other — всё остальное. Если кратко, то уникальные правила сформулированы для каждого языка в отдельности. В конце статьи есть пример, который должен развеють все недопонимания: нет андроидов %1$d андроид %1$d андроида %1$d андроида %1$d андроидов %1$d андроидов // Выведем данные в формате: 8 = many : 8 андроидов for (int i = 0; i < 30; i++) { String pluralTest = this.getResources().getQuantityString(R.plurals.plurals_1, i, i); String pluralAndroid = this.getResources().getQuantityString(R.plurals.plurals_2, i, i); android.util.Log.i("Plurals", pluralTest + " : " + pluralAndroid); } Результат: 0 = many : 0 андроидов 1 = one : 1 андроид 2 = few : 2 андроида 3 = few : 3 андроида 4 = few : 4 андроида 5 = many : 5 андроидов 6 = many : 6 андроидов 7 = many : 7 андроидов 8 = many : 8 андроидов 9 = many : 9 андроидов 10 = many : 10 андроидов 11 = many : 11 андроидов 12 = many : 12 андроидов 13 = many : 13 андроидов 14 = many : 14 андроидов 15 = many : 15 андроидов 16 = many : 16 андроидов 17 = many : 17 андроидов 18 = many : 18 андроидов 19 = many : 19 андроидов 20 = many : 20 андроидов 21 = one : 21 андроид 22 = few : 22 андроида 23 = few : 23 андроида 24 = few : 24 андроида 25 = many : 25 андроидов 26 = many : 26 андроидов 27 = many : 27 андроидов 28 = many : 28 андроидов 29 = many : 29 андроидов Итого, для русского языка: Для нуля используется zero Для чисел, заканчивающихся на 1(кроме чисел, заканчивающихся на 11) используется one Для чисел, заканчивающихся на 2(кроме чисел, заканчивающихся на 12) используется two (вот только в русском для этих чисел используется правило few) Для чисел, заканчивающихся на 3, 4 (кроме чисел, заканчивающихся на 13, 14) используется few Для всех остальных используется many other используется для других случаев, которых в русском языке нет. Несмотря на это, one и other - обязательный минимум, который должен всегда быть определен. В этой же статье описана проблема с plurals на API < 3.0. Там все plurals работают по правилам английского языка. Там же описано и решение этой проблемы - использовать библиотеку android-i18n-plurals, П. С. Все вышеописанное я взял из вышеперведенной статьи, и если осваивал именно по этой статье. Вопрос остался незакрытым то это означает только одно - плохо осваивал.

Ответ 2



Проблема решилась... забыл переименовать values в values-ru, а то у меня практически все числа попадали в OTHER. Всем спасибо, проблема решена

Ответ 3



Для русского языка one - это все числа, заканчивающиеся на 1, кроме 11. few - заканчивющиеся на 2 - 4, кроме 12 - 14. То есть проблем не будет. Для форматирования относительных дат, чтобы самому не возиться, можно воспользоваться DateUtils#getRelativeTimeSpanString() и другими методами этого класса. Так у вас будет текст не только для одного языка.

Ответ 4



Немного "покапитаню" если в вашей android ОС выбран Английский язык, то приложение будет искать папку values-en, если она не найдена, то будут браться ресурсы из папки values. Аналогично и для Русского языка, если язык ОС выбран русский, то ресурсы сначала будут искаться в values-ru, и если таковой не существует то возьмутся из values. Менять язык ОС - Настройки - Язык и ввод Для полного понимания вопроса, нужно почитать про локализацию приложений. http://developer.alexanderklimov.ru/android/locale.php

Ответ 5



Если на телефоне стоит английский язык - то при использовании plurals значение для кейса 2 будет заменено значением для zero. Это потому что в английском грамматическая форма для 0 и много одинаковая. И если это использовать в приложении где язык русский - то будет 2 Билетов а не 2 Билета

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

Отправить комментарий