From 9adf6283b75a187b96796b892fd128e300f429a4 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Fri, 15 Jun 2012 16:01:30 -0400 Subject: [PATCH] Revised TimeUtils for localization --- src/com/gitblit/utils/TimeUtils.java | 85 ++++++++++++++++++++++++++++++++---------- 1 files changed, 65 insertions(+), 20 deletions(-) diff --git a/src/com/gitblit/utils/TimeUtils.java b/src/com/gitblit/utils/TimeUtils.java index 662025b..7f69562 100644 --- a/src/com/gitblit/utils/TimeUtils.java +++ b/src/com/gitblit/utils/TimeUtils.java @@ -15,9 +15,11 @@ */ package com.gitblit.utils; +import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; +import java.util.ResourceBundle; /** * Utility class of time functions. @@ -35,6 +37,16 @@ public static final long ONEDAY = ONEHOUR * 24L; public static final long ONEYEAR = ONEDAY * 365L; + + private final ResourceBundle translation; + + public TimeUtils() { + this(null); + } + + public TimeUtils(ResourceBundle translation) { + this.translation = translation; + } /** * Returns true if date is today. @@ -67,21 +79,21 @@ * @param days * @return duration as string in days, months, and/or years */ - public static String duration(int days) { + public String duration(int days) { if (days <= 60) { - return days + (days > 1 ? " days" : " day"); + return (days > 1 ? translate(days, "gb.duration.days", "{0} days") : translate("gb.duration.oneDay", "1 day")); } else if (days < 365) { int rem = days % 30; - return ((days / 30) + (rem >= 15 ? 1 : 0)) + " months"; + return translate(((days / 30) + (rem >= 15 ? 1 : 0)), "gb.duration.months", "{0} months"); } else { int years = days / 365; int rem = days % 365; - String yearsString = years + (years > 1 ? " years" : " year"); + String yearsString = (years > 1 ? translate(years, "gb.duration.years", "{0} years") : translate("gb.duration.oneYear", "1 year")); if (rem < 30) { if (rem == 0) { return yearsString; } else { - return yearsString + (rem >= 15 ? ", 1 month" : ""); + return yearsString + (rem >= 15 ? (", " + translate("gb.duration.oneMonth", "1 month")): ""); } } else { int months = rem / 30; @@ -89,8 +101,8 @@ if (remDays >= 15) { months++; } - String monthsString = yearsString + ", " + months - + (months > 1 ? " months" : " month"); + String monthsString = yearsString + ", " + + (months > 1 ? translate(months, "gb.duration.months", "{0} months") : translate("gb.duration.oneMonth", "1 month")); return monthsString; } } @@ -155,6 +167,14 @@ return days; } + public String today() { + return translate("gb.time.today", "today"); + } + + public String yesterday() { + return translate("gb.time.yesterday", "yesterday"); + } + /** * Returns the string representation of the duration between now and the * date. @@ -162,7 +182,7 @@ * @param date * @return duration as a string */ - public static String timeAgo(Date date) { + public String timeAgo(Date date) { return timeAgo(date, false); } @@ -172,7 +192,7 @@ * @param date * @return the css class */ - public static String timeAgoCss(Date date) { + public String timeAgoCss(Date date) { return timeAgo(date, true); } @@ -184,7 +204,7 @@ * @param css * @return the string representation of the duration OR the css class */ - private static String timeAgo(Date date, boolean css) { + private String timeAgo(Date date, boolean css) { if (isToday(date) || isYesterday(date)) { int mins = minutesAgo(date, true); if (mins >= 120) { @@ -193,15 +213,18 @@ } int hours = hoursAgo(date, true); if (hours > 23) { - return "yesterday"; + return yesterday(); } else { - return hours + " hours ago"; + return translate(hours, "gb.time.hoursAgo", "{0} hours ago"); } } if (css) { return "age0"; } - return mins + " min" + (mins > 1 ? "s" : "") + " ago"; + if (mins > 2) { + return translate(mins, "gb.time.minsAgo", "{0} mins ago"); + } + return translate("gb.time.justNow", "just now"); } else { int days = daysAgo(date); if (css) { @@ -215,13 +238,13 @@ } if (days < 365) { if (days <= 30) { - return days + " days ago"; + return translate(days, "gb.time.daysAgo", "{0} days ago"); } else if (days <= 90) { int weeks = days / 7; if (weeks == 12) { - return "3 months ago"; + return translate(3, "gb.time.monthsAgo", "{0} months ago"); } else { - return weeks + " weeks ago"; + return translate(weeks, "gb.time.weeksAgo", "{0} weeks ago"); } } int months = days / 30; @@ -229,21 +252,43 @@ if (weeks >= 2) { months++; } - return months + " months ago"; + return translate(months, "gb.time.monthsAgo", "{0} months ago"); } else if (days == 365) { - return "1 year ago"; + return translate("gb.time.oneYearAgo", "1 year ago"); } else { int yr = days / 365; days = days % 365; int months = (yr * 12) + (days / 30); if (months > 23) { - return yr + " years ago"; + return translate(yr, "gb.time.yearsAgo", "{0} years ago"); } else { - return months + " months ago"; + return translate(months, "gb.time.monthsAgo", "{0} months ago"); } } } } + + private String translate(String key, String defaultValue) { + String value = defaultValue; + if (translation != null && translation.containsKey(key)) { + String aValue = translation.getString(key); + if (!StringUtils.isEmpty(aValue)) { + value = aValue; + } + } + return value; + } + + private String translate(int val, String key, String defaultPattern) { + String pattern = defaultPattern; + if (translation != null && translation.containsKey(key)) { + String aValue = translation.getString(key); + if (!StringUtils.isEmpty(aValue)) { + pattern = aValue; + } + } + return MessageFormat.format(pattern, val); + } /** * Convert a frequency string into minutes. -- Gitblit v1.9.1