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);
Надеюсь, это поможет!!!