Как описать продолжительность в 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 и т. д.)