如何在Android上创建本地化的时间前的String

Dan*_*son 9 android localization

我正在审核Google I/O Session 2012应用程序并遇到了这个TODO

public static String getTimeAgo(long time, Context ctx) {
    if (time < 1000000000000L) {
        // if timestamp given in seconds, convert to millis
        time *= 1000;
    }

    long now = getCurrentTime(ctx);
    if (time > now || time <= 0) {
        return null;
    }

    // TODO: localize
    final long diff = now - time;
    if (diff < MINUTE_MILLIS) {
        return "just now";
    } else if (diff < 2 * MINUTE_MILLIS) {
        return "a minute ago";
    } else if (diff < 50 * MINUTE_MILLIS) {
        return diff / MINUTE_MILLIS + " minutes ago";
    } else if (diff < 90 * MINUTE_MILLIS) {
        return "an hour ago";
    } else if (diff < 24 * HOUR_MILLIS) {
        return diff / HOUR_MILLIS + " hours ago";
    } else if (diff < 48 * HOUR_MILLIS) {
        return "yesterday";
    } else {
        return diff / DAY_MILLIS + " days ago";
    }
}
Run Code Online (Sandbox Code Playgroud)

这让我想知道本地化的步骤是什么.

ian*_*ake 20

如果您不需要自定义字符串,还可以使用DateUtils.getRelativeTimeSpanString,它会生成如下字符串:

  • 42分钟前
  • 10秒前
  • 在1小时内

样品用法:

final CharSequence relativeTimeSpan = DateUtils.getRelativeTimeSpanString(time, now, 0);
Run Code Online (Sandbox Code Playgroud)


Dan*_*son 10

来自伊恩湖的回答:

final CharSequence relativeTimeSpan = DateUtils.getRelativeTimeSpanString(time, now, 0);
Run Code Online (Sandbox Code Playgroud)

DateUtils.getRelativeTimeSpanString生成如下内容:

  • 42分钟前
  • 10秒前
  • 在1小时内

或者,这将允许res使用给定的Context,通过Android 框架提供翻译,如果您从框架方法中获得所需的消息传递差异,则可以使用.

public static String getTimeAgo(long time, Context context) {
    if (time < 1000000000000L)
        // if timestamp given in seconds, convert to millis
        time *= 1000;

    final long now = getCurrentTime(context);
    if (time > now || time <= 0) return "";


    final Resources res = context.getResources();
    final long time_difference = now - time;
    if (time_difference < _A_MINUTE)
        return res.getString(R.string.just_now);
    else if (time_difference < 50 * _A_MINUTE)
        return res.getString(R.string.time_ago,
                             res.getQuantityString(R.plurals.minutes, (int) time_difference / _A_MINUTE, time_difference / _A_MINUTE));
    else if (time_difference < 24 * _AN_HOUR)
        return res.getString(R.string.time_ago,
                             res.getQuantityString(R.plurals.hours, (int) time_difference / _AN_HOUR, time_difference / _AN_HOUR));
    else if (time_difference < 48 * _AN_HOUR)
        return res.getString(R.string.yesterday);
    else
        return res.getString(R.string.time_ago,
                             res.getQuantityString(R.plurals.days, (int) time_difference / _A_DAY, time_difference / _A_DAY));
}
Run Code Online (Sandbox Code Playgroud)

我将常量定义为:

/** One second (in milliseconds) */
private static final int _A_SECOND = 1000;
/** One minute (in milliseconds) */
private static final int _A_MINUTE = 60 * _A_SECOND;
/** One hour (in milliseconds) */
private static final int _AN_HOUR = 60 * _A_MINUTE;
/** One day (in milliseconds) */
private static final int _A_DAY = 24 * _AN_HOUR;
Run Code Online (Sandbox Code Playgroud)

然后剩下的工作是复数和字符串资源的结构.

我的默认本地是en,所以res/values/strings.xml:

<!-- time ago strings -->
<string name="just_now">just now</string>
<string name="time_ago">%s ago</string>
<string name="yesterday">yesterday</string>
Run Code Online (Sandbox Code Playgroud)

然后res/values/plurals.xml:

<plurals name="minutes">
    <item quantity="one">a minute</item>
    <item quantity="other">%d minutes</item>
</plurals>

<plurals name="hours">
    <item quantity="one">an hour</item>
    <item quantity="other">%d hours</item>
</plurals>

<plurals name="days">
    <item quantity="one">a day</item>
    <item quantity="other">%d days</item>
</plurals>
Run Code Online (Sandbox Code Playgroud)

这种方法应该允许你定位语言的词汇和语法,因为不同的语言不仅对于像"分钟"这样的单词有不同的单词,而且它们对于如何根据数量复数单词也有不同的规则.因此,复数资源利用Android框架支持多元化本地化.剩下的就是提供翻译.