Android Plural Strings с несколькими параметрами

В строках Android вы можете определить множественные числа для обработки переводов в зависимости от фактического числа, поданного в строку, как описано здесь. Строки также позволяют задавать множественные позиционные параметры, аналогичные тем, что sprintf делает на многих языках.

Однако рассмотрим следующую строку:

<resources>
    <string name="remaining">%1$d hours and %2$d minutes remaining.</string>
</resources>

Он содержит два числа, как бы преобразовать это в множественное число в Android? Все примеры всегда работают только с одним параметром. Возможно ли это?

Ответ 1

getQuantityString имеет перегруженную версию, которая принимает идентификатор String, количество и varargs объекта, который вы можете использовать для форматирования вашей строки. Хотя кажется возможным использовать множественное число, для меня это звучит странно для времени. Вы можете использовать вспомогательные методы, содержащиеся в DateUtil, которые уже локализованы и заботятся о единственном/множественном числе, а затем дополнить вашу строку результатами этих вспомогательных методов. Например. getRelativeTimeSpanString

<plurals name="number_of_emails">
    <item quantity="one">%d email</item>
    <item quantity="other">%d emails</item>
</plurals>

<plurals name="number_of_messages">
    <item quantity="one">%d message</item>
    <item quantity="other">%d messages</item>
</plurals>

и затем вы можете использовать getQuantityString, чтобы получить две части и объединить их в одну.

Ответ 2

В предыдущем ответе используется конкатенация строк, которая неверна с точки зрения i18n. Для исходной строки "% 1 $ d часов и% 2 $ d минут осталось". использование конкатенации строк приведет к переводу "оставшихся" до конца, что может не подходить для некоторых языков.

Мое решение будет:

<resources>
     <string name="remaining">Time remaining: Hours:%1$d Minutes:%2$d.</string>
</resources>

Или, возможно, с заголовком "Оставшееся время".

Это решение упоминается в http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling

Часто можно избежать количественных строк, используя количественно-нейтральные формулировки, такие как "Книги: 1"

Ответ 3

strings.xml

<plurals name="lbl_items_selected">
    <item quantity="one">%d item out of %d items Selected</item>
    <item quantity="other">%d items out of %d items Selected</item>
</plurals>

Kotlin File

resources.getQuantityString(
    R.plurals.lbl_items_selected, //plural from strings.xml file
    size, //quantity 
    size, //var arg - first parameter
    allItemCount //var arg - second parameter
)

это вернет:

если размер = 1:1 элемент из 10 (allItemCount) выбранных элементов

если размер = 2 (или более): 2 (заданный размер) выбранных элемента из 10 (allItemCount)

Ответ 4

Хорошо, вот как это работает. Создайте тег множественного числа под значениями /strings.xml следующим образом:

<resources>
    <plurals name="remaining">
        <item quantity="one">%1$d hours and</item>
        <item quantity="other">%2$d minutes remaining.</item>
    </plurals>
</resources>

Затем в действии:

Resources res = getResources();
String myString = res.getQuantityString(R.plurals.remaining, count, count);

Надеюсь, это поможет!!!