Как описать продолжительность в Android?

Я пишу небольшое приложение, и мне нужно написать продолжительность спортивного события в i18n. Я использую библиотеку PrettyTime для даты, но когда я пытаюсь использовать DateUtils или PrettyTime, у меня возникают проблемы..

Например, я хочу сказать, что продолжительность составляет 2 минуты. Мне нужен какой-то способ передать его в библиотеку, которая поддерживает i18n, принимает миллисекунды и возвращает символы.

В андроиде у нас есть:

com.android.internal.R.plurals.duration_minutes

Но я не могу получить к нему доступ из своего приложения. Есть ли способ сделать это, используя правильный путь и не писать собственные множественные числа для всех языков?

Спасибо

1 ответ

Я не уверен, о каких проблемах вы говорите в контексте Android-DateUtils и PrettyTime-библиотеки. Но я точно знаю, что Android-DateUtils не может полностью управлять правилами множественного числа различных языков (особенно не рабских или арабских, потому что он знает только единственное число и одну форму множественного числа, которая слишком проста). Смотрите, например, этот Android-выпуск. Что касается библиотеки PrettyTime, то же возражение справедливо, если учесть арабский язык - см. Источник.

Моя рекомендация:

Попробуйте мою библиотеку Time4A (новая AAR-библиотека). Затем вы можете использовать этот код для обработки миллисекундного ввода и создания локализованной минутной строки:

// input
long millis = 1770123;

// create a duration
Duration<ClockUnit> duration = Duration.of(millis, ClockUnit.MILLIS); 

// normalization to (rounded) minutes
duration = duration.with(ClockUnit.MINUTES.rounded());

String s = PrettyTime.of(Locale.ENGLISH).print(duration, TextWidth.WIDE);
System.out.println(s); // 30 minutes

Пример для корейского (ответ на комментарий @Gabe Sechan):

String s = PrettyTime.of(new Locale("ko")).print(duration, TextWidth.WIDE);
System.out.println(s); // 30분 (korean translation of "30 minutes")

Пример для арабского (справа налево):

String s = PrettyTime.of(new Locale("ar")).print(duration, TextWidth.WIDE);
System.out.println(s); // ٣٠ دقيقة

В настоящее время это решение поддерживает 56 языков (больше, чем в библиотеке PrettyTime) и три ширины текста (полный, сокращенный или узкий). Точная обработка множественного числа включается автоматически. Time4A использует собственные языковые ресурсы на основе CLDR-данных (независимо от Android). Но вы можете переопределить эти ресурсы, определив свои собственные активы (в UTF-8).

Насчет нормализации: я только что показал вариант, который вы описали в своем вопросе. Однако есть много способов нормализовать продолжительность в Time4A(J). Эта страница даст вам больше идей, как использовать эту функцию.

Если вы все еще скучаете по некоторым языкам, просто скажите мне, и я буду поддерживать его в следующих версиях Time4A. В настоящее время поддерживается (в обозначении ISO-639-1):

Я люблю тебя, как я тебя люблю, когда я делаю это, я думаю, что это так и есть, я думаю, что это все, что я делаю. tr uk ur uz vi zh (и некоторые специфичные для страны локали, например, zh_TW, en_GB и т. д.)

Другие вопросы по тегам