|
|
@ -0,0 +1,933 @@ |
|
|
|
/* |
|
|
|
* ----------------------------------------------------------------------- |
|
|
|
* Copyright © 2013-2015 Meno Hochschild, <http://www.menodata.de/> |
|
|
|
* ----------------------------------------------------------------------- |
|
|
|
* This file (UnitPatterns.java) is part of project Time4J. |
|
|
|
* |
|
|
|
* Time4J is free software: You can redistribute it and/or modify it |
|
|
|
* under the terms of the GNU Lesser General Public License as published |
|
|
|
* by the Free Software Foundation, either version 2.1 of the License, or |
|
|
|
* (at your option) any later version. |
|
|
|
* |
|
|
|
* Time4J is distributed in the hope that it will be useful, |
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
|
|
* GNU Lesser General Public License for more details. |
|
|
|
* |
|
|
|
* You should have received a copy of the GNU Lesser General Public License |
|
|
|
* along with Time4J. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
* ----------------------------------------------------------------------- |
|
|
|
*/ |
|
|
|
|
|
|
|
package com.henninghall.date_picker; |
|
|
|
|
|
|
|
import net.time4j.CalendarUnit; |
|
|
|
import net.time4j.ClockUnit; |
|
|
|
import net.time4j.IsoUnit; |
|
|
|
import net.time4j.base.ResourceLoader; |
|
|
|
import net.time4j.format.PluralCategory; |
|
|
|
import net.time4j.format.RelativeTimeProvider; |
|
|
|
import net.time4j.format.TextWidth; |
|
|
|
import net.time4j.format.UnitPatternProvider; |
|
|
|
|
|
|
|
import java.util.Collections; |
|
|
|
import java.util.EnumMap; |
|
|
|
import java.util.HashMap; |
|
|
|
import java.util.Locale; |
|
|
|
import java.util.Map; |
|
|
|
import java.util.MissingResourceException; |
|
|
|
import java.util.concurrent.ConcurrentHashMap; |
|
|
|
import java.util.concurrent.ConcurrentMap; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* <p>Offers localized time unit patterns for formatting of durations. </p> |
|
|
|
* |
|
|
|
* @author Meno Hochschild |
|
|
|
* @since 3.0 |
|
|
|
* @see UnitPatternProvider |
|
|
|
*/ |
|
|
|
public final class UnitPatterns { |
|
|
|
|
|
|
|
//~ Statische Felder/Initialisierungen -------------------------------- |
|
|
|
|
|
|
|
private static final int MIN_LIST_INDEX = 2; |
|
|
|
private static final int MAX_LIST_INDEX = 7; |
|
|
|
|
|
|
|
private static final ConcurrentMap<Locale, UnitPatterns> CACHE = |
|
|
|
new ConcurrentHashMap<Locale, UnitPatterns>(); |
|
|
|
private static final IsoUnit[] UNIT_IDS = { |
|
|
|
CalendarUnit.YEARS, |
|
|
|
CalendarUnit.MONTHS, |
|
|
|
CalendarUnit.WEEKS, |
|
|
|
CalendarUnit.DAYS, |
|
|
|
ClockUnit.HOURS, |
|
|
|
ClockUnit.MINUTES, |
|
|
|
ClockUnit.SECONDS, |
|
|
|
ClockUnit.MILLIS, |
|
|
|
ClockUnit.MICROS, |
|
|
|
ClockUnit.NANOS |
|
|
|
}; |
|
|
|
private static final UnitPatternProvider PROVIDER; |
|
|
|
private static final UnitPatternProvider FALLBACK; |
|
|
|
|
|
|
|
static { |
|
|
|
FALLBACK = new FallbackProvider(); |
|
|
|
UnitPatternProvider p = null; |
|
|
|
|
|
|
|
for (UnitPatternProvider tmp : ResourceLoader.getInstance().services(UnitPatternProvider.class)) { |
|
|
|
p = tmp; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
if (p == null) { |
|
|
|
p = FALLBACK; |
|
|
|
} |
|
|
|
|
|
|
|
PROVIDER = p; |
|
|
|
} |
|
|
|
|
|
|
|
//~ Instanzvariablen -------------------------------------------------- |
|
|
|
|
|
|
|
private final Locale locale; |
|
|
|
private final Map<IsoUnit, Map<TextWidth, Map<PluralCategory, String>>> patterns; |
|
|
|
private final Map<IsoUnit, Map<PluralCategory, String>> past; |
|
|
|
private final Map<IsoUnit, Map<PluralCategory, String>> future; |
|
|
|
private final Map<IsoUnit, Map<PluralCategory, String>> shortPast; |
|
|
|
private final Map<IsoUnit, Map<PluralCategory, String>> shortFuture; |
|
|
|
private final Map<Integer, Map<TextWidth, String>> list; |
|
|
|
private final String now; |
|
|
|
private final String yesterday; |
|
|
|
private final String today; |
|
|
|
private final String tomorrow; |
|
|
|
|
|
|
|
//~ Konstruktoren ----------------------------------------------------- |
|
|
|
|
|
|
|
private UnitPatterns(Locale language) { |
|
|
|
super(); |
|
|
|
|
|
|
|
this.locale = language; |
|
|
|
|
|
|
|
Map<IsoUnit, Map<TextWidth, Map<PluralCategory, String>>> map = |
|
|
|
new HashMap<IsoUnit, Map<TextWidth, Map<PluralCategory, String>>>(10); |
|
|
|
Map<IsoUnit, Map<PluralCategory, String>> mapPast = |
|
|
|
new HashMap<IsoUnit, Map<PluralCategory, String>>(10); |
|
|
|
Map<IsoUnit, Map<PluralCategory, String>> mapFuture = |
|
|
|
new HashMap<IsoUnit, Map<PluralCategory, String>>(10); |
|
|
|
Map<IsoUnit, Map<PluralCategory, String>> mapShortPast = |
|
|
|
new HashMap<IsoUnit, Map<PluralCategory, String>>(10); |
|
|
|
Map<IsoUnit, Map<PluralCategory, String>> mapShortFuture = |
|
|
|
new HashMap<IsoUnit, Map<PluralCategory, String>>(10); |
|
|
|
Map<Integer, Map<TextWidth, String>> mapList = |
|
|
|
new HashMap<Integer, Map<TextWidth, String>>(10); |
|
|
|
|
|
|
|
for (IsoUnit unit : UNIT_IDS) { |
|
|
|
// Standard-Muster |
|
|
|
Map<TextWidth, Map<PluralCategory, String>> tmp1 = |
|
|
|
new EnumMap<TextWidth, Map<PluralCategory, String>>(TextWidth.class); |
|
|
|
for (TextWidth width : TextWidth.values()) { |
|
|
|
Map<PluralCategory, String> tmp2 = |
|
|
|
new EnumMap<PluralCategory, String>(PluralCategory.class); |
|
|
|
for (PluralCategory cat : PluralCategory.values()) { |
|
|
|
tmp2.put(cat, lookup(language, unit, width, cat)); |
|
|
|
} |
|
|
|
tmp1.put(width, Collections.unmodifiableMap(tmp2)); |
|
|
|
} |
|
|
|
map.put( |
|
|
|
unit, |
|
|
|
Collections.unmodifiableMap(tmp1)); |
|
|
|
|
|
|
|
if (!Character.isDigit(unit.getSymbol())) { // no subseconds |
|
|
|
// Vergangenheit |
|
|
|
Map<PluralCategory, String> tmp3 = |
|
|
|
new EnumMap<PluralCategory, String>(PluralCategory.class); |
|
|
|
for (PluralCategory cat : PluralCategory.values()) { |
|
|
|
tmp3.put(cat, lookup(language, unit, false, false, cat)); |
|
|
|
} |
|
|
|
mapPast.put( |
|
|
|
unit, |
|
|
|
Collections.unmodifiableMap(tmp3)); |
|
|
|
Map<PluralCategory, String> tmp3a = |
|
|
|
new EnumMap<PluralCategory, String>(PluralCategory.class); |
|
|
|
for (PluralCategory cat : PluralCategory.values()) { |
|
|
|
tmp3a.put(cat, lookup(language, unit, false, true, cat)); |
|
|
|
} |
|
|
|
mapShortPast.put( |
|
|
|
unit, |
|
|
|
Collections.unmodifiableMap(tmp3a)); |
|
|
|
|
|
|
|
// Zukunft |
|
|
|
Map<PluralCategory, String> tmp4 = |
|
|
|
new EnumMap<PluralCategory, String>(PluralCategory.class); |
|
|
|
for (PluralCategory cat : PluralCategory.values()) { |
|
|
|
tmp4.put(cat, lookup(language, unit, true, false, cat)); |
|
|
|
} |
|
|
|
mapFuture.put( |
|
|
|
unit, |
|
|
|
Collections.unmodifiableMap(tmp4)); |
|
|
|
Map<PluralCategory, String> tmp4a = |
|
|
|
new EnumMap<PluralCategory, String>(PluralCategory.class); |
|
|
|
for (PluralCategory cat : PluralCategory.values()) { |
|
|
|
tmp4a.put(cat, lookup(language, unit, true, true, cat)); |
|
|
|
} |
|
|
|
mapShortFuture.put( |
|
|
|
unit, |
|
|
|
Collections.unmodifiableMap(tmp4a)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Liste |
|
|
|
for (int i = MIN_LIST_INDEX; i <= MAX_LIST_INDEX; i++) { |
|
|
|
Integer index = Integer.valueOf(i); |
|
|
|
Map<TextWidth, String> tmp5 = |
|
|
|
new EnumMap<TextWidth, String>(TextWidth.class); |
|
|
|
for (TextWidth width : TextWidth.values()) { |
|
|
|
tmp5.put(width, lookup(language, width, index)); |
|
|
|
} |
|
|
|
mapList.put( |
|
|
|
index, |
|
|
|
Collections.unmodifiableMap(tmp5)); |
|
|
|
} |
|
|
|
|
|
|
|
this.patterns = Collections.unmodifiableMap(map); |
|
|
|
this.past = Collections.unmodifiableMap(mapPast); |
|
|
|
this.future = Collections.unmodifiableMap(mapFuture); |
|
|
|
this.shortPast = Collections.unmodifiableMap(mapShortPast); |
|
|
|
this.shortFuture = Collections.unmodifiableMap(mapShortFuture); |
|
|
|
this.list = Collections.unmodifiableMap(mapList); |
|
|
|
|
|
|
|
String n; |
|
|
|
|
|
|
|
String y = ""; |
|
|
|
String t1 = ""; |
|
|
|
String t2 = ""; |
|
|
|
|
|
|
|
try { |
|
|
|
n = PROVIDER.getNowWord(language); |
|
|
|
|
|
|
|
if (PROVIDER instanceof RelativeTimeProvider) { |
|
|
|
RelativeTimeProvider rp = RelativeTimeProvider.class.cast(PROVIDER); |
|
|
|
y = rp.getYesterdayWord(language); |
|
|
|
t1 = rp.getTodayWord(language); |
|
|
|
t2 = rp.getTomorrowWord(language); |
|
|
|
} |
|
|
|
} catch (MissingResourceException mre) { |
|
|
|
n = FALLBACK.getNowWord(language); // should not happen |
|
|
|
} |
|
|
|
|
|
|
|
this.now = n; |
|
|
|
this.yesterday = y; |
|
|
|
this.today = t1; |
|
|
|
this.tomorrow = t2; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
//~ Methoden ---------------------------------------------------------- |
|
|
|
|
|
|
|
/** |
|
|
|
* <p>Factory method as constructor replacement. </p> |
|
|
|
* |
|
|
|
* @param lang language setting |
|
|
|
* @return chached instance |
|
|
|
*/ |
|
|
|
public static UnitPatterns of(Locale lang) { |
|
|
|
|
|
|
|
if (lang == null) { |
|
|
|
throw new NullPointerException("Missing language."); |
|
|
|
} |
|
|
|
|
|
|
|
UnitPatterns p = CACHE.get(lang); |
|
|
|
|
|
|
|
if (p == null) { |
|
|
|
p = new UnitPatterns(lang); |
|
|
|
UnitPatterns old = CACHE.putIfAbsent(lang, p); |
|
|
|
if (old != null) { |
|
|
|
p = old; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return p; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* <p>Yields a unit pattern which optionally contains a placeholder |
|
|
|
* of the form "{0}" standing for the count of units. </p> |
|
|
|
* |
|
|
|
* @param width text width (ABBREVIATED as synonym for SHORT) |
|
|
|
* @param category plural category |
|
|
|
* @param unit associated iso unit |
|
|
|
* @return unit pattern |
|
|
|
*/ |
|
|
|
String getPattern( |
|
|
|
TextWidth width, |
|
|
|
PluralCategory category, |
|
|
|
IsoUnit unit |
|
|
|
) { |
|
|
|
|
|
|
|
checkNull(width, category); |
|
|
|
return this.patterns.get(unit).get(width).get(category); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* <p>Yields a unit pattern which optionally contains a placeholder |
|
|
|
* of the form "{0}" standing for the count of units in the |
|
|
|
* past. </p> |
|
|
|
* |
|
|
|
* @param category plural category |
|
|
|
* @param abbreviated using short form or not |
|
|
|
* @param unit associated iso unit |
|
|
|
* @return unit pattern in the past |
|
|
|
* @since 3.6/4.4 |
|
|
|
*/ |
|
|
|
String getPatternInPast( |
|
|
|
PluralCategory category, |
|
|
|
boolean abbreviated, |
|
|
|
IsoUnit unit |
|
|
|
) { |
|
|
|
|
|
|
|
checkNull(category); |
|
|
|
|
|
|
|
if (abbreviated) { |
|
|
|
return this.shortPast.get(unit).get(category); |
|
|
|
} else { |
|
|
|
return this.past.get(unit).get(category); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* <p>Yields a unit pattern which optionally contains a placeholder |
|
|
|
* of the form "{0}" standing for the count of units in the |
|
|
|
* future. </p> |
|
|
|
* |
|
|
|
* @param category plural category |
|
|
|
* @param abbreviated using short form or not |
|
|
|
* @param unit associated iso unit |
|
|
|
* @return unit pattern in the future |
|
|
|
* @since 3.6/4.4 |
|
|
|
*/ |
|
|
|
String getPatternInFuture( |
|
|
|
PluralCategory category, |
|
|
|
boolean abbreviated, |
|
|
|
IsoUnit unit |
|
|
|
) { |
|
|
|
|
|
|
|
checkNull(category); |
|
|
|
|
|
|
|
if (abbreviated) { |
|
|
|
return this.shortFuture.get(unit).get(category); |
|
|
|
} else { |
|
|
|
return this.future.get(unit).get(category); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* <p>Yields the localized word for the current time ("now"). </p> |
|
|
|
* |
|
|
|
* @return String |
|
|
|
*/ |
|
|
|
String getNowWord() { |
|
|
|
|
|
|
|
return this.now; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* <p>Yields the localized word for "yesterday". </p> |
|
|
|
* |
|
|
|
* @return String (maybe empty) |
|
|
|
* @since 3.6/4.4 |
|
|
|
*/ |
|
|
|
String getYesterdayWord() { |
|
|
|
|
|
|
|
return this.yesterday; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* <p>Yields the localized word for "today". </p> |
|
|
|
* |
|
|
|
* @return String (maybe empty) |
|
|
|
* @since 3.6/4.4 |
|
|
|
*/ |
|
|
|
public String getTodayWord() { |
|
|
|
|
|
|
|
return this.today; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* <p>Yields the localized word for "tomorrow". </p> |
|
|
|
* |
|
|
|
* @return String (maybe empty) |
|
|
|
* @since 3.6/4.4 |
|
|
|
*/ |
|
|
|
String getTomorrowWord() { |
|
|
|
|
|
|
|
return this.tomorrow; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* <p>Constructs a localized list pattern suitable for the use in |
|
|
|
* {@link java.text.MessageFormat#format(String, Object[])}. </p> |
|
|
|
* |
|
|
|
* @param width text width (ABBREVIATED as synonym for SHORT) |
|
|
|
* @param size count of list items |
|
|
|
* @return message format pattern with placeholders {0}, {1}, ..., {x}, ... |
|
|
|
* @throws IllegalArgumentException if size is smaller than 2 |
|
|
|
*/ |
|
|
|
String getListPattern( |
|
|
|
TextWidth width, |
|
|
|
int size |
|
|
|
) { |
|
|
|
|
|
|
|
if (width == null) { |
|
|
|
throw new NullPointerException("Missing width."); |
|
|
|
} |
|
|
|
|
|
|
|
if ( |
|
|
|
(size >= MIN_LIST_INDEX) |
|
|
|
&& (size <= MAX_LIST_INDEX) |
|
|
|
) { |
|
|
|
return this.list.get(Integer.valueOf(size)).get(width); |
|
|
|
} |
|
|
|
|
|
|
|
return lookup(this.locale, width, size); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static void checkNull(PluralCategory category) { |
|
|
|
|
|
|
|
if (category == null) { |
|
|
|
throw new NullPointerException("Missing plural category."); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static void checkNull( |
|
|
|
TextWidth width, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (width == null) { |
|
|
|
throw new NullPointerException("Missing text width."); |
|
|
|
} |
|
|
|
|
|
|
|
checkNull(category); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static char getID(IsoUnit unit) { |
|
|
|
|
|
|
|
char unitID = unit.getSymbol(); |
|
|
|
|
|
|
|
if (unit == ClockUnit.MINUTES) { |
|
|
|
return 'N'; |
|
|
|
} |
|
|
|
|
|
|
|
return unitID; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static String lookup( |
|
|
|
Locale language, |
|
|
|
IsoUnit unit, |
|
|
|
TextWidth width, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
try { |
|
|
|
return lookup(PROVIDER, language, getID(unit), width, category); |
|
|
|
} catch (MissingResourceException mre) { // should not happen |
|
|
|
return lookup(FALLBACK, language, getID(unit), width, category); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static String lookup( |
|
|
|
UnitPatternProvider p, |
|
|
|
Locale language, |
|
|
|
char unitID, |
|
|
|
TextWidth width, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
switch (unitID) { |
|
|
|
case 'Y': |
|
|
|
return p.getYearPattern(language, width, category); |
|
|
|
case 'M': |
|
|
|
return p.getMonthPattern(language, width, category); |
|
|
|
case 'W': |
|
|
|
return p.getWeekPattern(language, width, category); |
|
|
|
case 'D': |
|
|
|
return p.getDayPattern(language, width, category); |
|
|
|
case 'H': |
|
|
|
return p.getHourPattern(language, width, category); |
|
|
|
case 'N': |
|
|
|
return p.getMinutePattern(language, width, category); |
|
|
|
case 'S': |
|
|
|
return p.getSecondPattern(language, width, category); |
|
|
|
case '3': |
|
|
|
return p.getMilliPattern(language, width, category); |
|
|
|
case '6': |
|
|
|
return p.getMicroPattern(language, width, category); |
|
|
|
case '9': |
|
|
|
return p.getNanoPattern(language, width, category); |
|
|
|
default: |
|
|
|
throw new UnsupportedOperationException("Unit-ID: " + unitID); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static String lookup( |
|
|
|
Locale language, |
|
|
|
IsoUnit unit, |
|
|
|
boolean future, |
|
|
|
boolean abbreviated, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
try { |
|
|
|
return lookup(PROVIDER, language, getID(unit), future, abbreviated, category); |
|
|
|
} catch (MissingResourceException mre) { // should not happen |
|
|
|
return lookup(FALLBACK, language, getID(unit), future, abbreviated, category); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static String lookup( |
|
|
|
UnitPatternProvider p, |
|
|
|
Locale language, |
|
|
|
char unitID, |
|
|
|
boolean future, |
|
|
|
boolean abbreviated, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (abbreviated && (p instanceof RelativeTimeProvider)) { |
|
|
|
RelativeTimeProvider rp = RelativeTimeProvider.class.cast(p); |
|
|
|
switch (unitID) { |
|
|
|
case 'Y': |
|
|
|
return rp.getShortYearPattern(language, future, category); |
|
|
|
case 'M': |
|
|
|
return rp.getShortMonthPattern(language, future, category); |
|
|
|
case 'W': |
|
|
|
return rp.getShortWeekPattern(language, future, category); |
|
|
|
case 'D': |
|
|
|
return rp.getShortDayPattern(language, future, category); |
|
|
|
case 'H': |
|
|
|
return rp.getShortHourPattern(language, future, category); |
|
|
|
case 'N': |
|
|
|
return rp.getShortMinutePattern(language, future, category); |
|
|
|
case 'S': |
|
|
|
return rp.getShortSecondPattern(language, future, category); |
|
|
|
default: |
|
|
|
throw new UnsupportedOperationException("Unit-ID: " + unitID); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
switch (unitID) { |
|
|
|
case 'Y': |
|
|
|
return p.getYearPattern(language, future, category); |
|
|
|
case 'M': |
|
|
|
return p.getMonthPattern(language, future, category); |
|
|
|
case 'W': |
|
|
|
return p.getWeekPattern(language, future, category); |
|
|
|
case 'D': |
|
|
|
return p.getDayPattern(language, future, category); |
|
|
|
case 'H': |
|
|
|
return p.getHourPattern(language, future, category); |
|
|
|
case 'N': |
|
|
|
return p.getMinutePattern(language, future, category); |
|
|
|
case 'S': |
|
|
|
return p.getSecondPattern(language, future, category); |
|
|
|
default: |
|
|
|
throw new UnsupportedOperationException("Unit-ID: " + unitID); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static String lookup( |
|
|
|
Locale language, |
|
|
|
TextWidth width, |
|
|
|
int size |
|
|
|
) { |
|
|
|
|
|
|
|
try { |
|
|
|
return PROVIDER.getListPattern(language, width, size); |
|
|
|
} catch (MissingResourceException mre) { // should not happen |
|
|
|
return FALLBACK.getListPattern(language, width, size); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
//~ Innere Klassen ---------------------------------------------------- |
|
|
|
|
|
|
|
private static class FallbackProvider |
|
|
|
implements UnitPatternProvider { |
|
|
|
|
|
|
|
//~ Methoden ------------------------------------------------------ |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getYearPattern( |
|
|
|
Locale lang, |
|
|
|
TextWidth width, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getEnglishPattern("year", "yr", "y", width, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getUnitPattern("y"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getMonthPattern( |
|
|
|
Locale lang, |
|
|
|
TextWidth width, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getEnglishPattern("month", "mth", "m", width, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getUnitPattern("m"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getWeekPattern( |
|
|
|
Locale lang, |
|
|
|
TextWidth width, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getEnglishPattern("week", "wk", "w", width, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getUnitPattern("w"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getDayPattern( |
|
|
|
Locale lang, |
|
|
|
TextWidth width, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getEnglishPattern("day", "day", "d", width, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getUnitPattern("d"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getHourPattern( |
|
|
|
Locale lang, |
|
|
|
TextWidth width, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getEnglishPattern("hour", "hr", "h", width, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getUnitPattern("h"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getMinutePattern( |
|
|
|
Locale lang, |
|
|
|
TextWidth width, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getEnglishPattern("minute", "min", "m", width, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getUnitPattern("min"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getSecondPattern( |
|
|
|
Locale lang, |
|
|
|
TextWidth width, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getEnglishPattern("second", "sec", "s", width, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getUnitPattern("s"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getYearPattern( |
|
|
|
Locale lang, |
|
|
|
boolean future, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getRelativeEnglishPattern("year", future, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getRelativePattern("y", future); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getMonthPattern( |
|
|
|
Locale lang, |
|
|
|
boolean future, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getRelativeEnglishPattern("month", future, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getRelativePattern("m", future); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getWeekPattern( |
|
|
|
Locale lang, |
|
|
|
boolean future, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getRelativeEnglishPattern("week", future, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getRelativePattern("w", future); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getDayPattern( |
|
|
|
Locale lang, |
|
|
|
boolean future, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getRelativeEnglishPattern("day", future, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getRelativePattern("d", future); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getHourPattern( |
|
|
|
Locale lang, |
|
|
|
boolean future, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getRelativeEnglishPattern("hour", future, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getRelativePattern("h", future); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getMinutePattern( |
|
|
|
Locale lang, |
|
|
|
boolean future, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getRelativeEnglishPattern("minute", future, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getRelativePattern("min", future); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getSecondPattern( |
|
|
|
Locale lang, |
|
|
|
boolean future, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getRelativeEnglishPattern("second", future, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getRelativePattern("s", future); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getNowWord(Locale lang) { |
|
|
|
|
|
|
|
return "now"; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static String getEnglishPattern( |
|
|
|
String wide, |
|
|
|
String abbr, |
|
|
|
String narrow, |
|
|
|
TextWidth width, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
switch (width) { |
|
|
|
case WIDE: |
|
|
|
return getPluralPattern(wide, category); |
|
|
|
case ABBREVIATED: |
|
|
|
case SHORT: |
|
|
|
return getPluralPattern(abbr, category); |
|
|
|
case NARROW: |
|
|
|
return "{0}" + narrow; |
|
|
|
default: |
|
|
|
throw new UnsupportedOperationException(width.name()); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static String getPluralPattern( |
|
|
|
String unit, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
String plural = (category == PluralCategory.ONE ? "" : "s"); |
|
|
|
return "{0} " + unit + plural; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static String getUnitPattern(String unit) { |
|
|
|
|
|
|
|
return "{0} " + unit; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static String getRelativeEnglishPattern( |
|
|
|
String unit, |
|
|
|
boolean future, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
String plural = (category == PluralCategory.ONE ? "" : "s"); |
|
|
|
|
|
|
|
if (future) { |
|
|
|
return "in {0} " + unit + plural; |
|
|
|
} else { |
|
|
|
return "{0} " + unit + plural + " ago"; |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
private static String getRelativePattern( |
|
|
|
String unit, |
|
|
|
boolean future |
|
|
|
) { |
|
|
|
|
|
|
|
return ((future ? "+" : "-") + "{0} " + unit); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getListPattern( |
|
|
|
Locale lang, |
|
|
|
TextWidth width, |
|
|
|
int size |
|
|
|
) { |
|
|
|
|
|
|
|
if (size < 2) { |
|
|
|
throw new IllegalArgumentException( |
|
|
|
"Size must be greater than 1."); |
|
|
|
} |
|
|
|
|
|
|
|
StringBuilder sb = new StringBuilder(size * 5); |
|
|
|
|
|
|
|
for (int i = 0; i < size; i++) { |
|
|
|
sb.append('{'); |
|
|
|
sb.append(i); |
|
|
|
sb.append('}'); |
|
|
|
|
|
|
|
if (i < size - 1) { |
|
|
|
sb.append(", "); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return sb.toString(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getMilliPattern( |
|
|
|
Locale lang, |
|
|
|
TextWidth width, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getEnglishPattern( |
|
|
|
"millisecond", "msec", "ms", width, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getUnitPattern("ms"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getMicroPattern( |
|
|
|
Locale lang, |
|
|
|
TextWidth width, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getEnglishPattern( |
|
|
|
"microsecond", "µsec", "µs", width, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getUnitPattern("µs"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public String getNanoPattern( |
|
|
|
Locale lang, |
|
|
|
TextWidth width, |
|
|
|
PluralCategory category |
|
|
|
) { |
|
|
|
|
|
|
|
if (lang.getLanguage().equals("en")) { |
|
|
|
return getEnglishPattern( |
|
|
|
"nanosecond", "nsec", "ns", width, category); |
|
|
|
} |
|
|
|
|
|
|
|
return getUnitPattern("ns"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |