| @ -1,933 +0,0 @@ | |||||
| /* | |||||
| * ----------------------------------------------------------------------- | |||||
| * 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"); | |||||
| } | |||||
| } | |||||
| } | |||||