2

我正在编写小应用程序,我需要在 i18n 中编写体育赛事的持续时间。我使用 PrettyTime 库作为日期,但是当我尝试使用 DateUtils 或 PrettyTime 时,我遇到了问题..

例如,我想说持续时间是 2 分钟。我需要一些方法将它传递给支持 i18n 并接受毫秒并返回字符的库。

在android中,我们有:

com.android.internal.R.plurals.duration_minutes

但我无法从我的应用程序访问它。有什么方法可以使用正确的方式而不是为所有语言编写自己的复数吗?

谢谢

4

1 回答 1

1

我不确定您在 Android-DateUtils 和 PrettyTime-library 的上下文中谈论的是哪些问题。但我确信 Android-DateUtils 并不能完美地管理各种语言的复数规则(尤其不是奴隶语言或阿拉伯语,因为它只知道单数和一种复数形式,这太简单了)。参见例如这个Android-issue。关于 PrettyTime-library,如果您考虑阿拉伯语,同样的反对意见也是有效的 - 请参阅源代码

我的建议:

试用我的库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); // ٣٠ دقيقة

该解决方案目前支持约 90 种语言(比 PrettyTime 库中的多)和三种文本宽度(完整、缩写或窄)。自动包含准确的复数处理。Time4A 使用自己的基于 CLDR-data 的语言资源(独立于 Android)。但是您可以通过定义自己的资产(在 UTF-8 中)来覆盖这些资源。

关于标准化:我刚刚展示了您在问题中描述的变体。但是,在 Time4A(J) 中,还有更多方法可以标准化持续时间。此页面将为您提供如何使用该功能的更多想法。

如果您仍然想念某些语言,请告诉我,我将在 Time4A 的下一个版本中支持它。当前支持的语言可以在教程中找到。

于 2015-08-26T10:49:47.453 回答