]> granicus.if.org Git - icu/commitdiff
ICU-10884 Add abbreviated relative date format support.
authorTravis Keep <keep94@gmail.com>
Thu, 22 May 2014 22:46:53 +0000 (22:46 +0000)
committerTravis Keep <keep94@gmail.com>
Thu, 22 May 2014 22:46:53 +0000 (22:46 +0000)
X-SVN-Rev: 35744

12 files changed:
.gitattributes
icu4c/source/data/locales/en.txt
icu4c/source/data/locales/root.txt
icu4c/source/i18n/Makefile.in
icu4c/source/i18n/i18n.vcxproj
icu4c/source/i18n/i18n.vcxproj.filters
icu4c/source/i18n/reldatefmt.cpp
icu4c/source/i18n/sharedbreakiterator.cpp [new file with mode: 0644]
icu4c/source/i18n/sharedbreakiterator.h [new file with mode: 0644]
icu4c/source/i18n/unicode/reldatefmt.h
icu4c/source/test/intltest/reldatefmttest.cpp
icu4c/source/test/testdata/structLocale.txt

index e990c504352d06c9499548f7ea8dc6526634463c..a7405598779256c7a5378dbd1f4c5b427d9fb2da 100644 (file)
@@ -75,6 +75,8 @@ icu4c/source/extra/uconv/uconv.vcxproj.filters -text
 icu4c/source/i18n/i18n.vcxproj -text
 icu4c/source/i18n/i18n.vcxproj.filters -text
 icu4c/source/i18n/scientificformathelper.cpp -text
+icu4c/source/i18n/sharedbreakiterator.cpp -text
+icu4c/source/i18n/sharedbreakiterator.h -text
 icu4c/source/i18n/unicode/scientificformathelper.h -text
 icu4c/source/io/io.vcxproj -text
 icu4c/source/io/io.vcxproj.filters -text
index 6067a92b5de603720546d768d92e59cb04f45a95..ab72656b4a9864f245b697fbd121848d1df3ce4b 100644 (file)
@@ -6,9 +6,6 @@
 // * Source File: <path>/common/main/en.xml
 // *
 // ***************************************************************************
-/**
- * ICU <specials> source: <path>/common/main/en.xml
- */
 en{
     AuxExemplarCharacters{
         "[á à ă â å ä ã ā æ ç é è ĕ ê ë ē í ì ĭ î ï ī ñ ó ò ŏ ô ö ø ō œ ú ù ŭ û ü ū ÿ"
@@ -154,7 +151,7 @@ en{
             }
         }
     }
-    Version{"2.0.98.76"}
+    Version{"2.1.3.5"}
     calendar{
         buddhist{
             eras{
@@ -903,6 +900,42 @@ en{
                 }
             }
         }
+        day-narrow{
+            dn{"Day"}
+            relative{
+                "-1"{"yesterday"}
+                "0"{"today"}
+                "1"{"tomorrow"}
+            }
+            relativeTime{
+                future{
+                    one{"+{0} day"}
+                    other{"+{0} days"}
+                }
+                past{
+                    one{"-{0} day"}
+                    other{"-{0} days"}
+                }
+            }
+        }
+        day-short{
+            dn{"Day"}
+            relative{
+                "-1"{"yesterday"}
+                "0"{"today"}
+                "1"{"tomorrow"}
+            }
+            relativeTime{
+                future{
+                    one{"in {0} day"}
+                    other{"in {0} days"}
+                }
+                past{
+                    one{"{0} day ago"}
+                    other{"{0} days ago"}
+                }
+            }
+        }
         dayperiod{
             dn{"AM/PM"}
         }
@@ -916,6 +949,20 @@ en{
                 "1"{"next Friday"}
             }
         }
+        fri-narrow{
+            relative{
+                "-1"{"last F"}
+                "0"{"this F"}
+                "1"{"next F"}
+            }
+        }
+        fri-short{
+            relative{
+                "-1"{"last Fri."}
+                "0"{"this Fri."}
+                "1"{"next Fri."}
+            }
+        }
         hour{
             dn{"Hour"}
             relativeTime{
@@ -929,6 +976,32 @@ en{
                 }
             }
         }
+        hour-narrow{
+            dn{"h"}
+            relativeTime{
+                future{
+                    one{"+{0} h"}
+                    other{"+{0} h"}
+                }
+                past{
+                    one{"-{0} h"}
+                    other{"-{0} h"}
+                }
+            }
+        }
+        hour-short{
+            dn{"hr."}
+            relativeTime{
+                future{
+                    one{"in {0} hr."}
+                    other{"in {0} hr."}
+                }
+                past{
+                    one{"{0} hr. ago"}
+                    other{"{0} hr. ago"}
+                }
+            }
+        }
         minute{
             dn{"Minute"}
             relativeTime{
@@ -942,6 +1015,32 @@ en{
                 }
             }
         }
+        minute-narrow{
+            dn{"m"}
+            relativeTime{
+                future{
+                    one{"+{0} m"}
+                    other{"+{0} m"}
+                }
+                past{
+                    one{"-{0} m"}
+                    other{"-{0} m"}
+                }
+            }
+        }
+        minute-short{
+            dn{"min."}
+            relativeTime{
+                future{
+                    one{"in {0} min."}
+                    other{"in {0} min."}
+                }
+                past{
+                    one{"{0} min. ago"}
+                    other{"{0} min. ago"}
+                }
+            }
+        }
         mon{
             relative{
                 "-1"{"last Monday"}
@@ -949,6 +1048,20 @@ en{
                 "1"{"next Monday"}
             }
         }
+        mon-narrow{
+            relative{
+                "-1"{"last M"}
+                "0"{"this M"}
+                "1"{"next M"}
+            }
+        }
+        mon-short{
+            relative{
+                "-1"{"last Mon."}
+                "0"{"this Mon."}
+                "1"{"next Mon."}
+            }
+        }
         month{
             dn{"Month"}
             relative{
@@ -967,6 +1080,96 @@ en{
                 }
             }
         }
+        month-narrow{
+            dn{"mo."}
+            relative{
+                "-1"{"last mo."}
+                "0"{"this mo."}
+                "1"{"next mo."}
+            }
+            relativeTime{
+                future{
+                    one{"+{0} mo."}
+                    other{"+{0} mo."}
+                }
+                past{
+                    one{"-{0} mo."}
+                    other{"-{0} mo."}
+                }
+            }
+        }
+        month-short{
+            dn{"mo."}
+            relative{
+                "-1"{"last mo."}
+                "0"{"this mo."}
+                "1"{"next mo."}
+            }
+            relativeTime{
+                future{
+                    one{"in {0} mo."}
+                    other{"in {0} mo."}
+                }
+                past{
+                    one{"{0} mo. ago"}
+                    other{"{0} mo. ago"}
+                }
+            }
+        }
+        quarter{
+            dn{"Quarter"}
+            relative{
+                "-1"{"last quarter"}
+                "0"{"this quarter"}
+                "1"{"next quarter"}
+            }
+            relativeTime{
+                future{
+                    one{"in {0} quarter"}
+                    other{"in {0} quarters"}
+                }
+                past{
+                    one{"{0} quarter ago"}
+                    other{"{0} quarters ago"}
+                }
+            }
+        }
+        quarter-narrow{
+            dn{"qtr."}
+            relative{
+                "-1"{"last qtr."}
+                "0"{"this qtr."}
+                "1"{"next qtr."}
+            }
+            relativeTime{
+                future{
+                    one{"+{0} Q"}
+                    other{"+{0} Q"}
+                }
+                past{
+                    one{"-{0} Q"}
+                    other{"-{0} Q"}
+                }
+            }
+        }
+        quarter-short{
+            dn{"qtr."}
+            relative{
+                "-1"{"last qtr."}
+                "0"{"this qtr."}
+                "1"{"next qtr."}
+            }
+            relativeTime{
+                future{
+                    one{"in {0} qtr."}
+                    other{"in {0} qtrs."}
+                }
+                past{
+                    one{"{0} qtr. ago"}
+                    other{"{0} qtrs. ago"}
+                }
+            }
+        }
         sat{
             relative{
                 "-1"{"last Saturday"}
@@ -974,6 +1177,20 @@ en{
                 "1"{"next Saturday"}
             }
         }
+        sat-narrow{
+            relative{
+                "-1"{"last Sa"}
+                "0"{"this Sa"}
+                "1"{"next Sa"}
+            }
+        }
+        sat-short{
+            relative{
+                "-1"{"last Sat."}
+                "0"{"this Sat."}
+                "1"{"next Sat."}
+            }
+        }
         second{
             dn{"Second"}
             relative{
@@ -990,6 +1207,38 @@ en{
                 }
             }
         }
+        second-narrow{
+            dn{"s"}
+            relative{
+                "0"{"now"}
+            }
+            relativeTime{
+                future{
+                    one{"+{0} s"}
+                    other{"+{0} s"}
+                }
+                past{
+                    one{"-{0} s"}
+                    other{"-{0} s"}
+                }
+            }
+        }
+        second-short{
+            dn{"sec."}
+            relative{
+                "0"{"now"}
+            }
+            relativeTime{
+                future{
+                    one{"in {0} sec."}
+                    other{"in {0} sec."}
+                }
+                past{
+                    one{"{0} sec. ago"}
+                    other{"{0} sec. ago"}
+                }
+            }
+        }
         sun{
             relative{
                 "-1"{"last Sunday"}
@@ -997,6 +1246,20 @@ en{
                 "1"{"next Sunday"}
             }
         }
+        sun-narrow{
+            relative{
+                "-1"{"last Su"}
+                "0"{"this Su"}
+                "1"{"next Su"}
+            }
+        }
+        sun-short{
+            relative{
+                "-1"{"last Sun."}
+                "0"{"this Sun."}
+                "1"{"next Sun."}
+            }
+        }
         thu{
             relative{
                 "-1"{"last Thursday"}
@@ -1004,6 +1267,20 @@ en{
                 "1"{"next Thursday"}
             }
         }
+        thu-narrow{
+            relative{
+                "-1"{"last Th"}
+                "0"{"this Th"}
+                "1"{"next Th"}
+            }
+        }
+        thu-short{
+            relative{
+                "-1"{"last Thu."}
+                "0"{"this Thu."}
+                "1"{"next Thu."}
+            }
+        }
         tue{
             relative{
                 "-1"{"last Tuesday"}
@@ -1011,6 +1288,20 @@ en{
                 "1"{"next Tuesday"}
             }
         }
+        tue-narrow{
+            relative{
+                "-1"{"last Tu"}
+                "0"{"this Tu"}
+                "1"{"next Tu"}
+            }
+        }
+        tue-short{
+            relative{
+                "-1"{"last Tue."}
+                "0"{"this Tue."}
+                "1"{"next Tue."}
+            }
+        }
         wed{
             relative{
                 "-1"{"last Wednesday"}
@@ -1018,6 +1309,20 @@ en{
                 "1"{"next Wednesday"}
             }
         }
+        wed-narrow{
+            relative{
+                "-1"{"last W"}
+                "0"{"this W"}
+                "1"{"next W"}
+            }
+        }
+        wed-short{
+            relative{
+                "-1"{"last Wed."}
+                "0"{"this Wed."}
+                "1"{"next Wed."}
+            }
+        }
         week{
             dn{"Week"}
             relative{
@@ -1036,6 +1341,42 @@ en{
                 }
             }
         }
+        week-narrow{
+            dn{"wk."}
+            relative{
+                "-1"{"last wk."}
+                "0"{"this wk."}
+                "1"{"next wk."}
+            }
+            relativeTime{
+                future{
+                    one{"+{0} wk."}
+                    other{"+{0} wk."}
+                }
+                past{
+                    one{"-{0} wk."}
+                    other{"-{0} wk."}
+                }
+            }
+        }
+        week-short{
+            dn{"wk."}
+            relative{
+                "-1"{"last wk."}
+                "0"{"this wk."}
+                "1"{"next wk."}
+            }
+            relativeTime{
+                future{
+                    one{"in {0} wk."}
+                    other{"in {0} wk."}
+                }
+                past{
+                    one{"{0} wk. ago"}
+                    other{"{0} wk. ago"}
+                }
+            }
+        }
         weekday{
             dn{"Day of the Week"}
         }
@@ -1057,6 +1398,42 @@ en{
                 }
             }
         }
+        year-narrow{
+            dn{"yr."}
+            relative{
+                "-1"{"last yr."}
+                "0"{"this yr."}
+                "1"{"next yr."}
+            }
+            relativeTime{
+                future{
+                    one{"+{0} yr."}
+                    other{"+{0} yr."}
+                }
+                past{
+                    one{"-{0} yr."}
+                    other{"-{0} yr."}
+                }
+            }
+        }
+        year-short{
+            dn{"yr."}
+            relative{
+                "-1"{"last yr."}
+                "0"{"this yr."}
+                "1"{"next yr."}
+            }
+            relativeTime{
+                future{
+                    one{"in {0} yr."}
+                    other{"in {0} yr."}
+                }
+                past{
+                    one{"{0} yr. ago"}
+                    other{"{0} yr. ago"}
+                }
+            }
+        }
         zone{
             dn{"Time Zone"}
         }
index c31d25299caf02967798fc7bac7647f2b15a7b04..460065c8f6c6a775c459d5c771adcedcb03e5562 100644 (file)
@@ -182,7 +182,7 @@ root{
         }
         native{"latn"}
     }
-    Version{"2.0.97.37"}
+    Version{"2.1.2.21"}
     calendar{
         buddhist{
             AmPmMarkers:alias{"/LOCALE/calendar/gregorian/AmPmMarkers"}
@@ -2003,6 +2003,8 @@ root{
                 }
             }
         }
+        day-narrow:alias{"/LOCALE/fields/day-short"}
+        day-short:alias{"/LOCALE/fields/day"}
         dayperiod{
             dn{"Dayperiod"}
         }
@@ -2016,6 +2018,8 @@ root{
                 "1"{"next Friday"}
             }
         }
+        fri-narrow:alias{"/LOCALE/fields/fri-short"}
+        fri-short:alias{"/LOCALE/fields/fri"}
         hour{
             dn{"Hour"}
             relativeTime{
@@ -2027,6 +2031,8 @@ root{
                 }
             }
         }
+        hour-narrow:alias{"/LOCALE/fields/hour-short"}
+        hour-short:alias{"/LOCALE/fields/hour"}
         minute{
             dn{"Minute"}
             relativeTime{
@@ -2038,6 +2044,8 @@ root{
                 }
             }
         }
+        minute-narrow:alias{"/LOCALE/fields/minute-short"}
+        minute-short:alias{"/LOCALE/fields/minute"}
         mon{
             relative{
                 "-1"{"last Monday"}
@@ -2045,6 +2053,8 @@ root{
                 "1"{"next Monday"}
             }
         }
+        mon-narrow:alias{"/LOCALE/fields/mon-short"}
+        mon-short:alias{"/LOCALE/fields/mon"}
         month{
             dn{"Month"}
             relative{
@@ -2061,6 +2071,26 @@ root{
                 }
             }
         }
+        month-narrow:alias{"/LOCALE/fields/month-short"}
+        month-short:alias{"/LOCALE/fields/month"}
+        quarter{
+            dn{"Quarter"}
+            relative{
+                "-1"{"last quarter"}
+                "0"{"this quarter"}
+                "1"{"next quarter"}
+            }
+            relativeTime{
+                future{
+                    other{"+{0} Q"}
+                }
+                past{
+                    other{"-{0} Q"}
+                }
+            }
+        }
+        quarter-narrow:alias{"/LOCALE/fields/quarter-short"}
+        quarter-short:alias{"/LOCALE/fields/quarter"}
         sat{
             relative{
                 "-1"{"last Saturday"}
@@ -2068,6 +2098,8 @@ root{
                 "1"{"next Saturday"}
             }
         }
+        sat-narrow:alias{"/LOCALE/fields/sat-short"}
+        sat-short:alias{"/LOCALE/fields/sat"}
         second{
             dn{"Second"}
             relative{
@@ -2082,6 +2114,8 @@ root{
                 }
             }
         }
+        second-narrow:alias{"/LOCALE/fields/second-short"}
+        second-short:alias{"/LOCALE/fields/second"}
         sun{
             relative{
                 "-1"{"last Sunday"}
@@ -2089,6 +2123,8 @@ root{
                 "1"{"next Sunday"}
             }
         }
+        sun-narrow:alias{"/LOCALE/fields/sun-short"}
+        sun-short:alias{"/LOCALE/fields/sun"}
         thu{
             relative{
                 "-1"{"last Thursday"}
@@ -2096,6 +2132,8 @@ root{
                 "1"{"next Thursday"}
             }
         }
+        thu-narrow:alias{"/LOCALE/fields/thu-short"}
+        thu-short:alias{"/LOCALE/fields/thu"}
         tue{
             relative{
                 "-1"{"last Tuesday"}
@@ -2103,6 +2141,8 @@ root{
                 "1"{"next Tuesday"}
             }
         }
+        tue-narrow:alias{"/LOCALE/fields/tue-short"}
+        tue-short:alias{"/LOCALE/fields/tue"}
         wed{
             relative{
                 "-1"{"last Wednesday"}
@@ -2110,6 +2150,8 @@ root{
                 "1"{"next Wednesday"}
             }
         }
+        wed-narrow:alias{"/LOCALE/fields/wed-short"}
+        wed-short:alias{"/LOCALE/fields/wed"}
         week{
             dn{"Week"}
             relative{
@@ -2126,6 +2168,8 @@ root{
                 }
             }
         }
+        week-narrow:alias{"/LOCALE/fields/week-short"}
+        week-short:alias{"/LOCALE/fields/week"}
         weekday{
             dn{"Day of the Week"}
         }
@@ -2145,6 +2189,8 @@ root{
                 }
             }
         }
+        year-narrow:alias{"/LOCALE/fields/year-short"}
+        year-short:alias{"/LOCALE/fields/year"}
         zone{
             dn{"Zone"}
         }
index 2cff2ba940f493a06cf195a016aadda894f19c17..3dc5b5ffddad5b354eb6a9fd07dade1d3aa55470 100644 (file)
@@ -94,7 +94,7 @@ uspoof.o uspoof_impl.o uspoof_build.o uspoof_conf.o uspoof_wsconf.o decfmtst.o s
 ztrans.o zrule.o vzone.o fphdlimp.o fpositer.o locdspnm.o \
 decNumber.o decContext.o alphaindex.o tznames.o tznames_impl.o tzgnames.o \
 tzfmt.o compactdecimalformat.o gender.o region.o scriptset.o identifier_info.o \
-uregion.o reldatefmt.o quantityformatter.o measunit.o filteredbrk.o scientificformathelper.o
+uregion.o reldatefmt.o quantityformatter.o measunit.o filteredbrk.o scientificformathelper.o sharedbreakiterator.o
 
 ## Header files to install
 HEADERS = $(srcdir)/unicode/*.h
index c5572dbdaa7a0b55c269eaf8e27698b8d8e32cb2..a84256aa98595e81b185ae65c190f6a2e25413a4 100644 (file)
     </ClCompile>\r
     <ClCompile Include="reldtfmt.cpp" />\r
     <ClCompile Include="scientificformathelper.cpp" />\r
+    <ClCompile Include="sharedbreakiterator.cpp" />\r
     <ClCompile Include="selfmt.cpp" />\r
     <ClCompile Include="simpletz.cpp" />\r
     <ClCompile Include="scriptset.cpp" />\r
     </CustomBuild>\r
     <ClInclude Include="plurrule_impl.h" />\r
     <ClInclude Include="quantityformatter.h" />\r
+    <ClInclude Include="sharedbreakiterator.h" />\r
     <ClInclude Include="sharednumberformat.h" />\r
     <ClInclude Include="sharedpluralrules.h" />\r
     <CustomBuild Include="unicode\rbnf.h">\r
index eee83efeab0cbe11a77cbc19010ec589be8b51b0..73cacd2d822209d72e1e11387aec69ba5e32828f 100644 (file)
     <ClCompile Include="selfmt.cpp">\r
       <Filter>formatting</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="sharedbreakiterator.cpp">\r
+      <Filter>formatting</Filter>\r
+    </ClCompile>\r
     <ClCompile Include="simpletz.cpp">\r
       <Filter>formatting</Filter>\r
     </ClCompile>\r
     <ClInclude Include="reldtfmt.h">\r
       <Filter>formatting</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="sharedbreakiterator.h">\r
+      <Filter>formatting</Filter>\r
+    </ClInclude>\r
     <ClInclude Include="sharednumberformat.h">\r
       <Filter>formatting</Filter>\r
     </ClInclude>\r
index 1832c4428f3b5feaf9e95041cb8dd59e06dc6074..c982a5f81265415a7512b6e6dfb7e4ef899b88ae 100644 (file)
@@ -18,6 +18,7 @@
 #include "unicode/msgfmt.h"
 #include "unicode/decimfmt.h"
 #include "unicode/numfmt.h"
+#include "unicode/brkiter.h"
 #include "lrucache.h"
 #include "uresimp.h"
 #include "unicode/ures.h"
 #include "charstr.h"
 
 #include "sharedptr.h"
+#include "sharedbreakiterator.h"
 #include "sharedpluralrules.h"
 #include "sharednumberformat.h"
 
+#define RELDATE_STYLE_FULL 0
+#define RELDATE_STYLE_SHORT 1
+#define RELDATE_STYLE_NARROW 2
+#define RELDATE_STYLE_COUNT 3 
+
 // Copied from uscript_props.cpp
 #define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof((array)[0]))
 
 static icu::LRUCache *gCache = NULL;
 static UMutex gCacheMutex = U_MUTEX_INITIALIZER;
+static UMutex gBrkIterMutex = U_MUTEX_INITIALIZER;
 static icu::UInitOnce gCacheInitOnce = U_INITONCE_INITIALIZER;
 
 U_CDECL_BEGIN
@@ -50,6 +58,20 @@ U_CDECL_END
 
 U_NAMESPACE_BEGIN
 
+static int32_t getStyleIndex(UDateFormatStyle style) {
+    switch (style) {
+        case UDAT_FULL:
+        case UDAT_LONG:
+            return 0;
+        case UDAT_MEDIUM:
+            return 1;
+        case UDAT_SHORT:
+            return 2;
+        default:
+            return 0;
+    }
+}
+
 // RelativeDateTimeFormatter specific data for a single locale
 class RelativeDateTimeCacheData: public SharedObject {
 public:
@@ -57,11 +79,11 @@ public:
     virtual ~RelativeDateTimeCacheData();
 
     // no numbers: e.g Next Tuesday; Yesterday; etc.
-    UnicodeString absoluteUnits[UDAT_ABSOLUTE_UNIT_COUNT][UDAT_DIRECTION_COUNT];
+    UnicodeString absoluteUnits[RELDATE_STYLE_COUNT][UDAT_ABSOLUTE_UNIT_COUNT][UDAT_DIRECTION_COUNT];
 
     // has numbers: e.g Next Tuesday; Yesterday; etc. For second index, 0
     // means past e.g 5 days ago; 1 means future e.g in 5 days.
-    QuantityFormatter relativeUnits[UDAT_RELATIVE_UNIT_COUNT][2];
+    QuantityFormatter relativeUnits[RELDATE_STYLE_COUNT][UDAT_RELATIVE_UNIT_COUNT][2];
 
     void adoptCombinedDateAndTime(MessageFormat *mfToAdopt) {
         delete combinedDateAndTime;
@@ -330,105 +352,226 @@ static void addWeekDay(
             status);
 }
 
-static UBool loadUnitData(
+static void addTimeUnits(
         const UResourceBundle *resource,
+        const char *path, const char *pathShort, const char *pathNarrow,
+        UDateRelativeUnit relativeUnit,
+        UDateAbsoluteUnit absoluteUnit,
         RelativeDateTimeCacheData &cacheData,
         UErrorCode &status) {
     addTimeUnit(
+        resource,
+        path,
+        cacheData.relativeUnits[0][relativeUnit],
+        cacheData.absoluteUnits[0][absoluteUnit],
+        status);
+    addTimeUnit(
+        resource,
+        pathShort,
+        cacheData.relativeUnits[1][relativeUnit],
+        cacheData.absoluteUnits[1][absoluteUnit],
+        status);
+    addTimeUnit(
+        resource,
+        pathNarrow,
+        cacheData.relativeUnits[2][relativeUnit],
+        cacheData.absoluteUnits[2][absoluteUnit],
+        status);
+}
+
+static void initRelativeUnits(
+        const UResourceBundle *resource,
+        const char *path, const char *pathShort, const char *pathNarrow,
+        UDateRelativeUnit relativeUnit,
+        QuantityFormatter relativeUnits[][UDAT_RELATIVE_UNIT_COUNT][2],
+        UErrorCode &status) {
+    initRelativeUnit(
             resource,
-            "fields/day",
-            cacheData.relativeUnits[UDAT_RELATIVE_DAYS],
-            cacheData.absoluteUnits[UDAT_ABSOLUTE_DAY],
+            path,
+            relativeUnits[0][relativeUnit],
             status);
-    addTimeUnit(
+    initRelativeUnit(
             resource,
-            "fields/week",
-            cacheData.relativeUnits[UDAT_RELATIVE_WEEKS],
-            cacheData.absoluteUnits[UDAT_ABSOLUTE_WEEK],
+            pathShort,
+            relativeUnits[1][relativeUnit],
             status);
-    addTimeUnit(
+    initRelativeUnit(
             resource,
-            "fields/month",
-            cacheData.relativeUnits[UDAT_RELATIVE_MONTHS],
-            cacheData.absoluteUnits[UDAT_ABSOLUTE_MONTH],
+            pathNarrow,
+            relativeUnits[2][relativeUnit],
             status);
-    addTimeUnit(
+}
+
+static void addWeekDays(
+        const UResourceBundle *resource,
+        const char *path, const char *pathShort, const char *pathNarrow,
+        const UnicodeString daysOfWeek[][7],
+        UDateAbsoluteUnit absoluteUnit,
+        UnicodeString absoluteUnits[][UDAT_ABSOLUTE_UNIT_COUNT][UDAT_DIRECTION_COUNT],
+        UErrorCode &status) {
+    addWeekDay(
             resource,
-            "fields/year",
-            cacheData.relativeUnits[UDAT_RELATIVE_YEARS],
-            cacheData.absoluteUnits[UDAT_ABSOLUTE_YEAR],
+            path,
+            daysOfWeek[0],
+            absoluteUnit,
+            absoluteUnits[0],
             status);
-    initRelativeUnit(
+    addWeekDay(
             resource,
-            "fields/second",
-            cacheData.relativeUnits[UDAT_RELATIVE_SECONDS],
+            pathShort,
+            daysOfWeek[1],
+            absoluteUnit,
+            absoluteUnits[1],
             status);
-    initRelativeUnit(
+    addWeekDay(
             resource,
-            "fields/minute",
-            cacheData.relativeUnits[UDAT_RELATIVE_MINUTES],
+            pathNarrow,
+            daysOfWeek[2],
+            absoluteUnit,
+            absoluteUnits[2],
             status);
-    initRelativeUnit(
+}
+
+static UBool loadUnitData(
+        const UResourceBundle *resource,
+        RelativeDateTimeCacheData &cacheData,
+        UErrorCode &status) {
+    addTimeUnits(
             resource,
-            "fields/hour",
-            cacheData.relativeUnits[UDAT_RELATIVE_HOURS],
+            "fields/day", "fields/day-short", "fields/day-narrow",
+            UDAT_RELATIVE_DAYS,
+            UDAT_ABSOLUTE_DAY,
+            cacheData,
+            status);
+    addTimeUnits(
+            resource,
+            "fields/week", "fields/week-short", "fields/week-narrow",
+            UDAT_RELATIVE_WEEKS,
+            UDAT_ABSOLUTE_WEEK,
+            cacheData,
+            status);
+    addTimeUnits(
+            resource,
+            "fields/month", "fields/month-short", "fields/month-narrow",
+            UDAT_RELATIVE_MONTHS,
+            UDAT_ABSOLUTE_MONTH,
+            cacheData,
+            status);
+    addTimeUnits(
+            resource,
+            "fields/year", "fields/year-short", "fields/year-narrow",
+            UDAT_RELATIVE_YEARS,
+            UDAT_ABSOLUTE_YEAR,
+            cacheData,
+            status);
+    initRelativeUnits(
+            resource,
+            "fields/second", "fields/second-short", "fields/second-narrow",
+            UDAT_RELATIVE_SECONDS,
+            cacheData.relativeUnits,
+            status);
+    initRelativeUnits(
+            resource,
+            "fields/minute", "fields/minute-short", "fields/minute-narrow",
+            UDAT_RELATIVE_MINUTES,
+            cacheData.relativeUnits,
+            status);
+    initRelativeUnits(
+            resource,
+            "fields/hour", "fields/hour-short", "fields/hour-narrow",
+            UDAT_RELATIVE_HOURS,
+            cacheData.relativeUnits,
             status);
     getStringWithFallback(
             resource,
             "fields/second/relative/0",
-            cacheData.absoluteUnits[UDAT_ABSOLUTE_NOW][UDAT_DIRECTION_PLAIN],
+            cacheData.absoluteUnits[0][UDAT_ABSOLUTE_NOW][UDAT_DIRECTION_PLAIN],
+            status);
+    getStringWithFallback(
+            resource,
+            "fields/second-short/relative/0",
+            cacheData.absoluteUnits[1][UDAT_ABSOLUTE_NOW][UDAT_DIRECTION_PLAIN],
             status);
-    UnicodeString daysOfWeek[7];
+    getStringWithFallback(
+            resource,
+            "fields/second-narrow/relative/0",
+            cacheData.absoluteUnits[2][UDAT_ABSOLUTE_NOW][UDAT_DIRECTION_PLAIN],
+            status);
+    UnicodeString daysOfWeek[3][7];
     readDaysOfWeek(
             resource,
             "calendar/gregorian/dayNames/stand-alone/wide",
-            daysOfWeek,
+            daysOfWeek[0],
             status);
-    addWeekDay(
+    readDaysOfWeek(
+            resource,
+            "calendar/gregorian/dayNames/stand-alone/short",
+            daysOfWeek[1],
+            status);
+    readDaysOfWeek(
+            resource,
+            "calendar/gregorian/dayNames/stand-alone/narrow",
+            daysOfWeek[2],
+            status);
+    addWeekDays(
             resource,
             "fields/mon/relative",
+            "fields/mon-short/relative",
+            "fields/mon-narrow/relative",
             daysOfWeek,
             UDAT_ABSOLUTE_MONDAY,
             cacheData.absoluteUnits,
             status);
-    addWeekDay(
+    addWeekDays(
             resource,
             "fields/tue/relative",
+            "fields/tue-short/relative",
+            "fields/tue-narrow/relative",
             daysOfWeek,
             UDAT_ABSOLUTE_TUESDAY,
             cacheData.absoluteUnits,
             status);
-    addWeekDay(
+    addWeekDays(
             resource,
             "fields/wed/relative",
+            "fields/wed-short/relative",
+            "fields/wed-narrow/relative",
             daysOfWeek,
             UDAT_ABSOLUTE_WEDNESDAY,
             cacheData.absoluteUnits,
             status);
-    addWeekDay(
+    addWeekDays(
             resource,
             "fields/thu/relative",
+            "fields/thu-short/relative",
+            "fields/thu-narrow/relative",
             daysOfWeek,
             UDAT_ABSOLUTE_THURSDAY,
             cacheData.absoluteUnits,
             status);
-    addWeekDay(
+    addWeekDays(
             resource,
             "fields/fri/relative",
+            "fields/fri-short/relative",
+            "fields/fri-narrow/relative",
             daysOfWeek,
             UDAT_ABSOLUTE_FRIDAY,
             cacheData.absoluteUnits,
             status);
-    addWeekDay(
+    addWeekDays(
             resource,
             "fields/sat/relative",
+            "fields/sat-short/relative",
+            "fields/sat-narrow/relative",
             daysOfWeek,
             UDAT_ABSOLUTE_SATURDAY,
             cacheData.absoluteUnits,
             status);
-    addWeekDay(
+    addWeekDays(
             resource,
             "fields/sun/relative",
+            "fields/sun-short/relative",
+            "fields/sun-narrow/relative",
             daysOfWeek,
             UDAT_ABSOLUTE_SUNDAY,
             cacheData.absoluteUnits,
@@ -522,57 +665,127 @@ static UBool getFromCache(
     return U_SUCCESS(status);
 }
 
-RelativeDateTimeFormatter::RelativeDateTimeFormatter(UErrorCode& status)
-        : cache(NULL), numberFormat(NULL), pluralRules(NULL) {
-    init(Locale::getDefault(), NULL, status);
+RelativeDateTimeFormatter::RelativeDateTimeFormatter(UErrorCode& status) :
+        fCache(NULL),
+        fNumberFormat(NULL),
+        fPluralRules(NULL),
+        fStyle(UDAT_FULL),
+        fContext(UDISPCTX_CAPITALIZATION_NONE),
+        fOptBreakIterator(NULL) {
+    init(NULL, NULL, status);
 }
 
 RelativeDateTimeFormatter::RelativeDateTimeFormatter(
-        const Locale& locale, UErrorCode& status)
-        : cache(NULL), numberFormat(NULL), pluralRules(NULL) {
-    init(locale, NULL, status);
+        const Locale& locale, UErrorCode& status) :
+        fCache(NULL),
+        fNumberFormat(NULL),
+        fPluralRules(NULL),
+        fStyle(UDAT_FULL),
+        fContext(UDISPCTX_CAPITALIZATION_NONE),
+        fOptBreakIterator(NULL),
+        fLocale(locale) {
+    init(NULL, NULL, status);
 }
 
 RelativeDateTimeFormatter::RelativeDateTimeFormatter(
-        const Locale& locale, NumberFormat *nfToAdopt, UErrorCode& status)
-        : cache(NULL), numberFormat(NULL), pluralRules(NULL) {
-    init(locale, nfToAdopt, status);
+        const Locale& locale, NumberFormat *nfToAdopt, UErrorCode& status) :
+        fCache(NULL),
+        fNumberFormat(NULL),
+        fPluralRules(NULL),
+        fStyle(UDAT_FULL),
+        fContext(UDISPCTX_CAPITALIZATION_NONE),
+        fOptBreakIterator(NULL),
+        fLocale(locale) {
+    init(nfToAdopt, NULL, status);
+}
+
+RelativeDateTimeFormatter::RelativeDateTimeFormatter(
+        const Locale& locale,
+        NumberFormat *nfToAdopt,
+        UDateFormatStyle styl,
+        UDisplayContext capitalizationContext,
+        UErrorCode& status) :
+        fCache(NULL),
+        fNumberFormat(NULL),
+        fPluralRules(NULL),
+        fStyle(styl),
+        fContext(capitalizationContext),
+        fOptBreakIterator(NULL),
+        fLocale(locale) {
+    if (U_FAILURE(status)) {
+        return;
+    }
+    if ((capitalizationContext >> 8) != UDISPCTX_TYPE_CAPITALIZATION) {
+        status = U_ILLEGAL_ARGUMENT_ERROR;
+        return;
+    }
+    if (capitalizationContext == UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE) {
+        BreakIterator *bi = BreakIterator::createSentenceInstance(locale, status);
+        if (U_FAILURE(status)) {
+            return;
+        }
+        init(nfToAdopt, bi, status);
+    } else {
+        init(nfToAdopt, NULL, status);
+    }
 }
 
 RelativeDateTimeFormatter::RelativeDateTimeFormatter(
         const RelativeDateTimeFormatter& other)
-        : cache(other.cache),
-          numberFormat(other.numberFormat),
-          pluralRules(other.pluralRules) {
-    cache->addRef();
-    numberFormat->addRef();
-    pluralRules->addRef();
+        : fCache(other.fCache),
+          fNumberFormat(other.fNumberFormat),
+          fPluralRules(other.fPluralRules),
+          fStyle(other.fStyle),
+          fContext(other.fContext),
+          fOptBreakIterator(other.fOptBreakIterator),
+          fLocale(other.fLocale) {
+    fCache->addRef();
+    fNumberFormat->addRef();
+    fPluralRules->addRef();
+    if (fOptBreakIterator != NULL) {
+      fOptBreakIterator->addRef();
+    }
 }
 
 RelativeDateTimeFormatter& RelativeDateTimeFormatter::operator=(
         const RelativeDateTimeFormatter& other) {
     if (this != &other) {
-        SharedObject::copyPtr(other.cache, cache);
-        SharedObject::copyPtr(other.numberFormat, numberFormat);
-        SharedObject::copyPtr(other.pluralRules, pluralRules);
+        SharedObject::copyPtr(other.fCache, fCache);
+        SharedObject::copyPtr(other.fNumberFormat, fNumberFormat);
+        SharedObject::copyPtr(other.fPluralRules, fPluralRules);
+        SharedObject::copyPtr(other.fOptBreakIterator, fOptBreakIterator);
+        fStyle = other.fStyle;
+        fContext = other.fContext;
+        fLocale = other.fLocale;
     }
     return *this;
 }
 
 RelativeDateTimeFormatter::~RelativeDateTimeFormatter() {
-    if (cache != NULL) {
-        cache->removeRef();
+    if (fCache != NULL) {
+        fCache->removeRef();
     }
-    if (numberFormat != NULL) {
-        numberFormat->removeRef();
+    if (fNumberFormat != NULL) {
+        fNumberFormat->removeRef();
     }
-    if (pluralRules != NULL) {
-        pluralRules->removeRef();
+    if (fPluralRules != NULL) {
+        fPluralRules->removeRef();
+    }
+    if (fOptBreakIterator != NULL) {
+        fOptBreakIterator->removeRef();
     }
 }
 
 const NumberFormat& RelativeDateTimeFormatter::getNumberFormat() const {
-    return **numberFormat;
+    return **fNumberFormat;
+}
+
+UDisplayContext RelativeDateTimeFormatter::getCapitalizationContext() const {
+    return fContext;
+}
+
+UDateFormatStyle RelativeDateTimeFormatter::getFormatStyle() const {
+    return fStyle;
 }
 
 UnicodeString& RelativeDateTimeFormatter::format(
@@ -587,13 +800,25 @@ UnicodeString& RelativeDateTimeFormatter::format(
     }
     int32_t bFuture = direction == UDAT_DIRECTION_NEXT ? 1 : 0;
     FieldPosition pos(FieldPosition::DONT_CARE);
-    return cache->relativeUnits[unit][bFuture].format(
+    if (fOptBreakIterator == NULL) {
+        return fCache->relativeUnits[getStyleIndex(fStyle)][unit][bFuture].format(
             quantity,
-            **numberFormat,
-            **pluralRules,
+            **fNumberFormat,
+            **fPluralRules,
             appendTo,
             pos,
             status);
+    }
+    UnicodeString result;
+    fCache->relativeUnits[getStyleIndex(fStyle)][unit][bFuture].format(
+            quantity,
+            **fNumberFormat,
+            **fPluralRules,
+            result,
+            pos,
+            status);
+    adjustForContext(result);
+    return appendTo.append(result);
 }
 
 UnicodeString& RelativeDateTimeFormatter::format(
@@ -606,7 +831,12 @@ UnicodeString& RelativeDateTimeFormatter::format(
         status = U_ILLEGAL_ARGUMENT_ERROR;
         return appendTo;
     }
-    return appendTo.append(cache->absoluteUnits[unit][direction]);
+    if (fOptBreakIterator == NULL) {
+      return appendTo.append(fCache->absoluteUnits[getStyleIndex(fStyle)][unit][direction]);
+    }
+    UnicodeString result(fCache->absoluteUnits[getStyleIndex(fStyle)][unit][direction]);
+    adjustForContext(result);
+    return appendTo.append(result);
 }
 
 UnicodeString& RelativeDateTimeFormatter::combineDateAndTime(
@@ -614,33 +844,49 @@ UnicodeString& RelativeDateTimeFormatter::combineDateAndTime(
     UnicodeString& appendTo, UErrorCode& status) const {
     Formattable args[2] = {timeString, relativeDateString};
     FieldPosition fpos(0);
-    return cache->getCombinedDateAndTime()->format(
+    return fCache->getCombinedDateAndTime()->format(
             args, 2, appendTo, fpos, status);
 }
 
+void RelativeDateTimeFormatter::adjustForContext(UnicodeString &str) const {
+    if (fOptBreakIterator == NULL
+        || str.length() == 0 || !u_islower(str.char32At(0))) {
+        return;
+    }
+
+    // Must guarantee that one thread at a time accesses the shared break
+    // iterator.
+    Mutex lock(&gBrkIterMutex);
+    str.toTitle(
+            fOptBreakIterator->get(),
+            fLocale,
+            U_TITLECASE_NO_LOWERCASE | U_TITLECASE_NO_BREAK_ADJUSTMENT);
+}
+
 void RelativeDateTimeFormatter::init(
-        const Locale &locale, NumberFormat *nfToAdopt, UErrorCode &status) {
+        NumberFormat *nfToAdopt,
+        BreakIterator *biToAdopt,
+        UErrorCode &status) {
     LocalPointer<NumberFormat> nf(nfToAdopt);
-    if (!getFromCache(locale.getName(), cache, status)) {
+    LocalPointer<BreakIterator> bi(biToAdopt);
+    if (!getFromCache(fLocale.getName(), fCache, status)) {
         return;
     }
-    SharedObject::copyPtr(
-            PluralRules::createSharedInstance(
-                    locale, UPLURAL_TYPE_CARDINAL, status),
-            pluralRules);
+    const SharedPluralRules *pr = PluralRules::createSharedInstance(
+            fLocale, UPLURAL_TYPE_CARDINAL, status);
     if (U_FAILURE(status)) {
         return;
     }
-    pluralRules->removeRef();
+    SharedObject::copyPtr(pr, fPluralRules);
+    pr->removeRef();
     if (nf.isNull()) {
-       SharedObject::copyPtr(
-               NumberFormat::createSharedInstance(
-                       locale, UNUM_DECIMAL, status),
-               numberFormat);
+       const SharedNumberFormat *shared = NumberFormat::createSharedInstance(
+               fLocale, UNUM_DECIMAL, status);
         if (U_FAILURE(status)) {
             return;
         }
-        numberFormat->removeRef();
+        SharedObject::copyPtr(shared, fNumberFormat);
+        shared->removeRef();
     } else {
         SharedNumberFormat *shared = new SharedNumberFormat(nf.getAlias());
         if (shared == NULL) {
@@ -648,7 +894,18 @@ void RelativeDateTimeFormatter::init(
             return;
         }
         nf.orphan();
-        SharedObject::copyPtr(shared, numberFormat);
+        SharedObject::copyPtr(shared, fNumberFormat);
+    }
+    if (bi.isNull()) {
+        SharedObject::clearPtr(fOptBreakIterator);
+    } else {
+        SharedBreakIterator *shared = new SharedBreakIterator(bi.getAlias());
+        if (shared == NULL) {
+            status = U_MEMORY_ALLOCATION_ERROR;
+            return;
+        }
+        bi.orphan();
+        SharedObject::copyPtr(shared, fOptBreakIterator);
     }
 }
 
diff --git a/icu4c/source/i18n/sharedbreakiterator.cpp b/icu4c/source/i18n/sharedbreakiterator.cpp
new file mode 100644 (file)
index 0000000..8fa6010
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+*******************************************************************************
+* Copyright (C) 2013-2014, International Business Machines Corporation and    *
+* others. All Rights Reserved.                                                *
+*******************************************************************************
+*
+* File RELDATEFMTTEST.CPP
+*
+*******************************************************************************
+*/
+#include "sharedbreakiterator.h"
+#include "unicode/brkiter.h"
+
+U_NAMESPACE_BEGIN
+
+SharedBreakIterator::~SharedBreakIterator() {
+  delete ptr;
+}
+
+U_NAMESPACE_END
+
diff --git a/icu4c/source/i18n/sharedbreakiterator.h b/icu4c/source/i18n/sharedbreakiterator.h
new file mode 100644 (file)
index 0000000..cae34af
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+******************************************************************************
+* Copyright (C) 2014, International Business Machines
+* Corporation and others.  All Rights Reserved.
+******************************************************************************
+* sharedbreakiterator.h
+*/
+
+#ifndef __SHARED_BREAKITERATOR_H__
+#define __SHARED_BREAKITERATOR_H__
+
+#include "unicode/utypes.h"
+#include "sharedobject.h"
+
+U_NAMESPACE_BEGIN
+
+class BreakIterator;
+
+// SharedBreakIterator encapsulates a shared BreakIterator. Because
+// BreakIterator has mutable semantics, clients must ensure that all uses
+// of a particular shared BreakIterator is protected by the same mutex
+// ensuring that only one thread at a time gets access to that shared
+// BreakIterator. Clients can accomplish this by creating a mutex for all
+// uses of break iterator within a particular class. Then objects of that
+// class may then freely share break iterators among themselves. However,
+// these shared break iterators must never be exposed outside of that class.
+class U_I18N_API SharedBreakIterator : public SharedObject {
+public:
+    SharedBreakIterator(BreakIterator *biToAdopt) : ptr(biToAdopt) { }
+    virtual ~SharedBreakIterator();
+
+    BreakIterator *get() const { return ptr; }
+    BreakIterator *operator->() const { return ptr; }
+    BreakIterator &operator*() const { return *ptr; }
+private:
+    BreakIterator *ptr;
+    SharedBreakIterator(const SharedBreakIterator &);
+    SharedBreakIterator &operator=(const SharedBreakIterator &);
+};
+
+U_NAMESPACE_END
+
+#endif
index ee7a176e5adebb8fe97f787aadec25bd04954e42..bbff21194c21f5594f49c521f54fe84d203e2fd2 100644 (file)
@@ -14,6 +14,9 @@
 
 #include "unicode/utypes.h"
 #include "unicode/uobject.h"
+#include "unicode/udisplaycontext.h"
+#include "unicode/udat.h"
+#include "unicode/locid.h"
 
 /**
  * \file
@@ -220,10 +223,10 @@ typedef enum UDateDirection {
 
 U_NAMESPACE_BEGIN
 
-class Locale;
 class RelativeDateTimeCacheData;
 class SharedNumberFormat;
 class SharedPluralRules;
+class SharedBreakIterator;
 class NumberFormat;
 class UnicodeString;
 
@@ -295,8 +298,6 @@ class UnicodeString;
  *
  * @draft ICU 53
  */
-
-
 class U_I18N_API RelativeDateTimeFormatter : public UObject {
 public:
 
@@ -325,6 +326,29 @@ public:
     RelativeDateTimeFormatter(
         const Locale& locale, NumberFormat *nfToAdopt, UErrorCode& status);
 
+    /**
+     * Create RelativeDateTimeFormatter with given locale, NumberFormat,
+     * and capitalization context.
+     *
+     * @param locale the locale
+     * @param nfToAdopt Constructed object takes ownership of this pointer.
+     *   It is an error for caller to delete this pointer or change its
+     *   contents after calling this constructor. Caller may pass NULL for
+     *   this argument if they want default number format behavior.
+     * @param style the format style. The UDAT_RELATIVE bit field has no effect.
+     * @param capitalizationContext The capitalization context must start with
+     *  U_DISPCTX_CAPITALIZATION_. Otherwise status is set to
+     *  U_ILLEGAL_ARGUMENT_ERROR
+     * @status Any error is returned here. 
+     * @draft ICU 53
+     */
+    RelativeDateTimeFormatter(
+            const Locale& locale,
+            NumberFormat *nfToAdopt,
+            UDateFormatStyle style,
+            UDisplayContext capitalizationContext,
+            UErrorCode& status);
+
     /**
      * Copy constructor.
      * @draft ICU 53
@@ -409,11 +433,32 @@ public:
      */
     const NumberFormat& getNumberFormat() const;
 
+    /**
+     * Returns the capitalization context.
+     *
+     * @draft ICU 54
+     */
+    UDisplayContext getCapitalizationContext() const;
+
+    /**
+     * Returns the format style.
+     *
+     * @draft ICU 54
+     */
+    UDateFormatStyle getFormatStyle() const;
 private:
-    const RelativeDateTimeCacheData* cache;
-    const SharedNumberFormat *numberFormat;
-    const SharedPluralRules *pluralRules;
-    void init(const Locale &, NumberFormat *nfToAdopt, UErrorCode &status);
+    const RelativeDateTimeCacheData* fCache;
+    const SharedNumberFormat *fNumberFormat;
+    const SharedPluralRules *fPluralRules;
+    UDateFormatStyle fStyle;
+    UDisplayContext fContext;
+    const SharedBreakIterator *fOptBreakIterator;
+    Locale fLocale;
+    void init(
+            NumberFormat *nfToAdopt,
+            BreakIterator *brkIter,
+            UErrorCode &status);
+    void adjustForContext(UnicodeString &) const;
 };
 
 U_NAMESPACE_END
index ce2ffc0aea6cfe329e0d878ce09e35ced87dfa4d..eeda64c6d6f13f0ea7af48f459eba4b33b75424f 100644 (file)
@@ -98,6 +98,186 @@ static WithQuantityExpected kEnglish[] = {
         {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "2 years ago"} 
 };
 
+static WithQuantityExpected kEnglishCaps[] = {
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "In 0 seconds"},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "In 0.5 seconds"},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "In 1 second"},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "In 2 seconds"},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "In 0 minutes"},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "In 0.5 minutes"},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "In 1 minute"},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "In 2 minutes"},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "In 0 hours"},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "In 0.5 hours"},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "In 1 hour"},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "In 2 hours"},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "In 0 days"},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "In 0.5 days"},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "In 1 day"},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "In 2 days"},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "In 0 weeks"},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "In 0.5 weeks"},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "In 1 week"},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "In 2 weeks"},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "In 0 months"},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "In 0.5 months"},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "In 1 month"},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "In 2 months"},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "In 0 years"},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "In 0.5 years"},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "In 1 year"},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "In 2 years"},
+                
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0 seconds ago"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0.5 seconds ago"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "1 second ago"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "2 seconds ago"},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0 minutes ago"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0.5 minutes ago"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "1 minute ago"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "2 minutes ago"},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0 hours ago"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0.5 hours ago"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "1 hour ago"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "2 hours ago"},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0 days ago"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0.5 days ago"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "1 day ago"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "2 days ago"},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0 weeks ago"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0.5 weeks ago"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "1 week ago"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "2 weeks ago"},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0 months ago"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0.5 months ago"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "1 month ago"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "2 months ago"},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0 years ago"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0.5 years ago"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "1 year ago"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "2 years ago"} 
+};
+
+static WithQuantityExpected kEnglishShort[] = {
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0 sec."},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.5 sec."},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 1 sec."},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 2 sec."},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 0 min."},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 0.5 min."},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 1 min."},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "in 2 min."},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 0 hr."},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 0.5 hr."},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 1 hr."},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "in 2 hr."},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 0 days"},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 0.5 days"},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 1 day"},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "in 2 days"},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 0 wk."},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 0.5 wk."},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 1 wk."},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "in 2 wk."},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 0 mo."},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 0.5 mo."},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 1 mo."},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "in 2 mo."},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 0 yr."},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 0.5 yr."},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 1 yr."},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "in 2 yr."},
+                
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0 sec. ago"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "0.5 sec. ago"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "1 sec. ago"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "2 sec. ago"},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0 min. ago"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "0.5 min. ago"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "1 min. ago"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "2 min. ago"},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0 hr. ago"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "0.5 hr. ago"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "1 hr. ago"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "2 hr. ago"},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0 days ago"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "0.5 days ago"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "1 day ago"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "2 days ago"},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0 wk. ago"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "0.5 wk. ago"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "1 wk. ago"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "2 wk. ago"},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0 mo. ago"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "0.5 mo. ago"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "1 mo. ago"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "2 mo. ago"},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0 yr. ago"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "0.5 yr. ago"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "1 yr. ago"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "2 yr. ago"} 
+};
+
+static WithQuantityExpected kEnglishNarrow[] = {
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "+0 s"},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "+0.5 s"},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "+1 s"},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "+2 s"},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "+0 m"},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "+0.5 m"},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "+1 m"},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MINUTES, "+2 m"},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "+0 h"},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "+0.5 h"},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "+1 h"},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_HOURS, "+2 h"},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "+0 days"},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "+0.5 days"},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "+1 day"},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, "+2 days"},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "+0 wk."},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "+0.5 wk."},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "+1 wk."},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_WEEKS, "+2 wk."},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "+0 mo."},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "+0.5 mo."},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "+1 mo."},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_MONTHS, "+2 mo."},
+        {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "+0 yr."},
+        {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "+0.5 yr."},
+        {1.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "+1 yr."},
+        {2.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_YEARS, "+2 yr."},
+                
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "-0 s"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "-0.5 s"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "-1 s"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_SECONDS, "-2 s"},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "-0 m"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "-0.5 m"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "-1 m"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MINUTES, "-2 m"},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "-0 h"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "-0.5 h"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "-1 h"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_HOURS, "-2 h"},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "-0 days"},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "-0.5 days"},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "-1 day"},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_DAYS, "-2 days"},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "-0 wk."},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "-0.5 wk."},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "-1 wk."},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_WEEKS, "-2 wk."},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "-0 mo."},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "-0.5 mo."},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "-1 mo."},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_MONTHS, "-2 mo."},
+        {0.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "-0 yr."},
+        {0.5, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "-0.5 yr."},
+        {1.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "-1 yr."},
+        {2.0, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, "-2 yr."} 
+};
+
 static WithQuantityExpected kEnglishDecimal[] = {
         {0.0, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.0 seconds"},
         {0.5, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_SECONDS, "in 0.5 seconds"},
@@ -167,6 +347,174 @@ static WithoutQuantityExpected kEnglishNoQuantity[] = {
         {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "now"}
 };
 
+static WithoutQuantityExpected kEnglishNoQuantityCaps[] = {
+        {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, ""},
+                
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, "Tomorrow"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEEK, "Next week"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "Next month"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, "Next year"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, "Next Monday"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_TUESDAY, "Next Tuesday"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEDNESDAY, "Next Wednesday"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_THURSDAY, "Next Thursday"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_FRIDAY, "Next Friday"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SATURDAY, "Next Saturday"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, "Next Sunday"},
+        
+        {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, ""},
+        
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, "Yesterday"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEEK, "Last week"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "Last month"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_YEAR, "Last year"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONDAY, "Last Monday"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_TUESDAY, "Last Tuesday"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEDNESDAY, "Last Wednesday"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_THURSDAY, "Last Thursday"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_FRIDAY, "Last Friday"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SATURDAY, "Last Saturday"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, "Last Sunday"},
+         
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, "Today"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEEK, "This week"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONTH, "This month"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_YEAR, "This year"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONDAY, "This Monday"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_TUESDAY, "This Tuesday"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEDNESDAY, "This Wednesday"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_THURSDAY, "This Thursday"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "This Friday"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "This Saturday"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "This Sunday"},
+        
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "Day"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "Week"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONTH, "Month"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_YEAR, "Year"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONDAY, "Monday"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_TUESDAY, "Tuesday"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEDNESDAY, "Wednesday"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_THURSDAY, "Thursday"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "Friday"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "Saturday"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "Sunday"},
+        
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "Now"}
+};
+
+static WithoutQuantityExpected kEnglishNoQuantityShort[] = {
+        {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, ""},
+                
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, "tomorrow"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEEK, "next wk."},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "next mo."},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, "next yr."},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, "next Mon."},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_TUESDAY, "next Tue."},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEDNESDAY, "next Wed."},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_THURSDAY, "next Thu."},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_FRIDAY, "next Fri."},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SATURDAY, "next Sat."},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, "next Sun."},
+        
+        {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, ""},
+        
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, "yesterday"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEEK, "last wk."},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "last mo."},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_YEAR, "last yr."},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONDAY, "last Mon."},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_TUESDAY, "last Tue."},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEDNESDAY, "last Wed."},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_THURSDAY, "last Thu."},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_FRIDAY, "last Fri."},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SATURDAY, "last Sat."},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, "last Sun."},
+         
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, "today"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEEK, "this wk."},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONTH, "this mo."},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_YEAR, "this yr."},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONDAY, "this Mon."},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_TUESDAY, "this Tue."},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEDNESDAY, "this Wed."},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_THURSDAY, "this Thu."},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "this Fri."},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "this Sat."},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "this Sun."},
+        
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "day"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "wk."},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONTH, "mo."},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_YEAR, "yr."},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONDAY, "Mo"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_TUESDAY, "Tu"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEDNESDAY, "We"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_THURSDAY, "Th"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "Fr"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "Sa"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "Su"},
+        
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "now"}
+};
+
+static WithoutQuantityExpected kEnglishNoQuantityNarrow[] = {
+        {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, ""},
+                
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, "tomorrow"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEEK, "next wk."},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONTH, "next mo."},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_YEAR, "next yr."},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_MONDAY, "next M"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_TUESDAY, "next Tu"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_WEDNESDAY, "next W"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_THURSDAY, "next Th"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_FRIDAY, "next F"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SATURDAY, "next Sa"},
+        {UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, "next Su"},
+        
+        {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, ""},
+        
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, "yesterday"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEEK, "last wk."},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONTH, "last mo."},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_YEAR, "last yr."},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_MONDAY, "last M"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_TUESDAY, "last Tu"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_WEDNESDAY, "last W"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_THURSDAY, "last Th"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_FRIDAY, "last F"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SATURDAY, "last Sa"},
+        {UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, "last Su"},
+         
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, "today"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEEK, "this wk."},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONTH, "this mo."},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_YEAR, "this yr."},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_MONDAY, "this M"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_TUESDAY, "this Tu"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_WEDNESDAY, "this W"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_THURSDAY, "this Th"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_FRIDAY, "this F"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SATURDAY, "this Sa"},
+        {UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, "this Su"},
+        
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_DAY, "day"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEEK, "wk."},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONTH, "mo."},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_YEAR, "yr."},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_MONDAY, "M"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_TUESDAY, "T"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_WEDNESDAY, "W"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_THURSDAY, "T"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_FRIDAY, "F"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SATURDAY, "S"},
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, "S"},
+        
+        {UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, "now"}
+};
+
 static WithoutQuantityExpected kSpanishNoQuantity[] = {
         {UDAT_DIRECTION_NEXT_2, UDAT_ABSOLUTE_DAY, "pasado ma\\u00F1ana"},
         {UDAT_DIRECTION_LAST_2, UDAT_ABSOLUTE_DAY, "antes de ayer"}
@@ -180,21 +528,40 @@ public:
     void runIndexedTest(int32_t index, UBool exec, const char *&name, char *par=0);
 private:
     void TestEnglish();
+    void TestEnglishCaps();
+    void TestEnglishShort();
+    void TestEnglishNarrow();
     void TestSerbian();
+    void TestSerbianFallback();
     void TestEnglishNoQuantity();
+    void TestEnglishNoQuantityCaps();
+    void TestEnglishNoQuantityShort();
+    void TestEnglishNoQuantityNarrow();
     void TestSpanishNoQuantity();
     void TestFormatWithQuantityIllegalArgument();
     void TestFormatWithoutQuantityIllegalArgument();
     void TestCustomNumberFormat();
+    void TestGetters();
     void TestCombineDateAndTime();
+    void TestBadDisplayContext();
+    void RunTest(
+            const Locale& locale,
+            const WithQuantityExpected* expectedResults,
+            int32_t expectedResultLength);
     void RunTest(
             const Locale& locale,
+            UDateFormatStyle style,
             const WithQuantityExpected* expectedResults,
             int32_t expectedResultLength);
     void RunTest(
             const Locale& locale,
             const WithoutQuantityExpected* expectedResults,
             int32_t expectedResultLength);
+    void RunTest(
+            const Locale& locale,
+            UDateFormatStyle style,
+            const WithoutQuantityExpected* expectedResults,
+            int32_t expectedResultLength);
     void RunTest(
             const RelativeDateTimeFormatter& fmt,
             const WithQuantityExpected* expectedResults,
@@ -230,13 +597,22 @@ void RelativeDateTimeFormatterTest::runIndexedTest(
     }
     TESTCASE_AUTO_BEGIN;
     TESTCASE_AUTO(TestEnglish);
+    TESTCASE_AUTO(TestEnglishCaps);
+    TESTCASE_AUTO(TestEnglishShort);
+    TESTCASE_AUTO(TestEnglishNarrow);
     TESTCASE_AUTO(TestSerbian);
+    TESTCASE_AUTO(TestSerbianFallback);
     TESTCASE_AUTO(TestEnglishNoQuantity);
+    TESTCASE_AUTO(TestEnglishNoQuantityCaps);
+    TESTCASE_AUTO(TestEnglishNoQuantityShort);
+    TESTCASE_AUTO(TestEnglishNoQuantityNarrow);
     TESTCASE_AUTO(TestSpanishNoQuantity);
     TESTCASE_AUTO(TestFormatWithQuantityIllegalArgument);
     TESTCASE_AUTO(TestFormatWithoutQuantityIllegalArgument);
     TESTCASE_AUTO(TestCustomNumberFormat);
+    TESTCASE_AUTO(TestGetters);
     TESTCASE_AUTO(TestCombineDateAndTime);
+    TESTCASE_AUTO(TestBadDisplayContext);
     TESTCASE_AUTO_END;
 }
 
@@ -244,14 +620,75 @@ void RelativeDateTimeFormatterTest::TestEnglish() {
     RunTest("en", kEnglish, LENGTHOF(kEnglish));
 }
 
+void RelativeDateTimeFormatterTest::TestEnglishCaps() {
+    UErrorCode status = U_ZERO_ERROR;
+    RelativeDateTimeFormatter fmt(
+            "en",
+            NULL,
+            UDAT_FULL,
+            UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE,
+            status);
+    RelativeDateTimeFormatter fmt3(status);
+
+    // Test assignment and copy constructor with capitalization on.
+    RelativeDateTimeFormatter fmt2(fmt);
+    fmt3 = fmt2;
+    assertSuccess("", status);
+    RunTest(fmt3, kEnglishCaps, LENGTHOF(kEnglishCaps), "en caps");
+}
+
+void RelativeDateTimeFormatterTest::TestEnglishShort() {
+    RunTest("en", UDAT_MEDIUM, kEnglishShort, LENGTHOF(kEnglishShort));
+}
+
+void RelativeDateTimeFormatterTest::TestEnglishNarrow() {
+    RunTest("en", UDAT_SHORT, kEnglishNarrow, LENGTHOF(kEnglishNarrow));
+}
+
 void RelativeDateTimeFormatterTest::TestSerbian() {
     RunTest("sr", kSerbian, LENGTHOF(kSerbian));
 }
 
+void RelativeDateTimeFormatterTest::TestSerbianFallback() {
+    RunTest("sr", UDAT_SHORT, kSerbian, LENGTHOF(kSerbian));
+}
+
 void RelativeDateTimeFormatterTest::TestEnglishNoQuantity() {
     RunTest("en", kEnglishNoQuantity, LENGTHOF(kEnglishNoQuantity));
 }
 
+void RelativeDateTimeFormatterTest::TestEnglishNoQuantityCaps() {
+    UErrorCode status = U_ZERO_ERROR;
+    RelativeDateTimeFormatter fmt(
+            "en",
+            NULL,
+            UDAT_FULL,
+            UDISPCTX_CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE,
+            status);
+    assertSuccess("", status);
+    RunTest(
+            fmt,
+            kEnglishNoQuantityCaps,
+            LENGTHOF(kEnglishNoQuantityCaps),
+            "en caps no quantity");
+}
+
+void RelativeDateTimeFormatterTest::TestEnglishNoQuantityShort() {
+    RunTest(
+            "en",
+            UDAT_MEDIUM,
+            kEnglishNoQuantityShort,
+            LENGTHOF(kEnglishNoQuantityShort));
+}
+
+void RelativeDateTimeFormatterTest::TestEnglishNoQuantityNarrow() {
+    RunTest(
+            "en",
+            UDAT_SHORT,
+            kEnglishNoQuantityNarrow,
+            LENGTHOF(kEnglishNoQuantityNarrow));
+}
+
 void RelativeDateTimeFormatterTest::TestSpanishNoQuantity() {
     RunTest("es", kSpanishNoQuantity, LENGTHOF(kSpanishNoQuantity));
 }
@@ -305,6 +742,27 @@ void RelativeDateTimeFormatterTest::TestCustomNumberFormat() {
 
 }
 
+void RelativeDateTimeFormatterTest::TestGetters() {
+    UErrorCode status = U_ZERO_ERROR;
+    RelativeDateTimeFormatter fmt(
+            "en",
+            NULL,
+            UDAT_SHORT,
+            UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE,
+            status);
+    RelativeDateTimeFormatter fmt3(status);
+
+    // copy and assignment.
+    RelativeDateTimeFormatter fmt2(fmt);
+    fmt3 = fmt2;
+    assertEquals("style", UDAT_SHORT, fmt3.getFormatStyle());
+    assertEquals(
+            "context",
+            UDISPCTX_CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE,
+            fmt3.getCapitalizationContext());
+    assertSuccess("", status);
+}
+
 void RelativeDateTimeFormatterTest::TestCombineDateAndTime() {
     UErrorCode status = U_ZERO_ERROR;
     RelativeDateTimeFormatter fmt("en", status);
@@ -324,6 +782,16 @@ void RelativeDateTimeFormatterTest::TestCombineDateAndTime() {
     }
 }
     
+void RelativeDateTimeFormatterTest::TestBadDisplayContext() {
+    UErrorCode status = U_ZERO_ERROR;
+    RelativeDateTimeFormatter fmt(
+            "en", NULL, UDAT_FULL, UDISPCTX_STANDARD_NAMES, status);
+    if (status != U_ILLEGAL_ARGUMENT_ERROR) {
+        errln("Expected U_ILLEGAL_ARGUMENT_ERROR, got %s", u_errorName(status));
+    }
+}
+    
+
 
 void RelativeDateTimeFormatterTest::RunTest(
         const Locale& locale,
@@ -334,7 +802,22 @@ void RelativeDateTimeFormatterTest::RunTest(
     if (U_FAILURE(status)) {
         dataerrln("Unable to create format object - %s", u_errorName(status));
         return;
-   }
+    }
+    RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
+}
+
+void RelativeDateTimeFormatterTest::RunTest(
+        const Locale& locale,
+        UDateFormatStyle style,
+        const WithQuantityExpected* expectedResults,
+        int32_t expectedResultLength) {
+    UErrorCode status = U_ZERO_ERROR;
+    RelativeDateTimeFormatter fmt(
+            locale, NULL, style, UDISPCTX_CAPITALIZATION_NONE, status);
+    if (U_FAILURE(status)) {
+        dataerrln("Unable to create format object - %s", u_errorName(status));
+        return;
+    }
     RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
 }
 
@@ -351,6 +834,21 @@ void RelativeDateTimeFormatterTest::RunTest(
     RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
 }
 
+void RelativeDateTimeFormatterTest::RunTest(
+        const Locale& locale,
+        UDateFormatStyle style,
+        const WithoutQuantityExpected* expectedResults,
+        int32_t expectedResultLength) {
+    UErrorCode status = U_ZERO_ERROR;
+    RelativeDateTimeFormatter fmt(
+            locale, NULL, style, UDISPCTX_CAPITALIZATION_NONE, status);
+    if (U_FAILURE(status)) {
+        dataerrln("Unable to create format object - %s", u_errorName(status));
+        return;
+    }
+    RunTest(fmt, expectedResults, expectedResultLength, locale.getName());
+}
+
 void RelativeDateTimeFormatterTest::RunTest(
         const RelativeDateTimeFormatter& fmt,
         const WithQuantityExpected* expectedResults,
index ae6b52e727e5630bbf2d4588d3ae2946f02fb27f..f6d5e5bfcb1fea9acba6e342199d148ab263e203 100644 (file)
@@ -3983,6 +3983,66 @@ structLocale:table(nofallback){
                 }
             }
         }
+        day-narrow{
+            dn{"Day"}
+            relative{
+                "-3"{""}
+                "-2"{""}
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+                "2"{""}
+                "3"{""}
+            }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
+        }
+        day-short{
+            dn{"Day"}
+            relative{
+                "-3"{""}
+                "-2"{""}
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+                "2"{""}
+                "3"{""}
+            }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
+        }
         dayperiod{
             dn{"Dayperiod"}
             relative{
@@ -3991,23 +4051,318 @@ structLocale:table(nofallback){
                 "1"{""}
             }
         }
-        era{
-            dn{"Era"}
+        era{
+            dn{"Era"}
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
+        fri{
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
+        fri-narrow{
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
+        fri-short{
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
+        hour{
+            dn{"Hour"}
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
+        }
+        hour-narrow{
+            dn{"Hour"}
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
+        }
+        hour-short{
+            dn{"Hour"}
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
+        }
+        minute{
+            dn{"Minute"}
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
+        }
+        minute-narrow{
+            dn{"Minute"}
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
+        }
+        minute-short{
+            dn{"Minute"}
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
+        }
+        mon{
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
+        mon-narrow{
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
+        mon-short{
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
+        month{
+            dn{"Month"}
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
+        }
+        month-narrow{
+            dn{"Month"}
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
+        }
+        month-short{
+            dn{"Month"}
             relative{
                 "-1"{""}
                 "0"{""}
                 "1"{""}
             }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
         }
-        fri{
+        quarter{
+            dn{""}
             relative{
                 "-1"{""}
                 "0"{""}
                 "1"{""}
             }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
         }
-        hour{
-            dn{"Hour"}
+        quarter-narrow{
+            dn{""}
             relative{
                 "-1"{""}
                 "0"{""}
@@ -4032,8 +4387,8 @@ structLocale:table(nofallback){
                 }
             }
         }
-        minute{
-            dn{"Minute"}
+        quarter-short{
+            dn{""}
             relative{
                 "-1"{""}
                 "0"{""}
@@ -4058,15 +4413,29 @@ structLocale:table(nofallback){
                 }
             }
         }
-        mon{
+        sat{
             relative{
                 "-1"{""}
                 "0"{""}
                 "1"{""}
             }
         }
-        month{
-            dn{"Month"}
+        sat-narrow{
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
+        sat-short{
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
+        second{
+            dn{"Second"}
             relative{
                 "-1"{""}
                 "0"{""}
@@ -4091,14 +4460,33 @@ structLocale:table(nofallback){
                 }
             }
         }
-        sat{
+        second-narrow{
+            dn{"Second"}
             relative{
                 "-1"{""}
                 "0"{""}
                 "1"{""}
             }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
         }
-        second{
+        second-short{
             dn{"Second"}
             relative{
                 "-1"{""}
@@ -4131,6 +4519,20 @@ structLocale:table(nofallback){
                 "1"{""}
             }
         }
+        sun-narrow{
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
+        sun-short{
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
         thu{
             relative{
                 "-1"{""}
@@ -4138,6 +4540,20 @@ structLocale:table(nofallback){
                 "1"{""}
             }
         }
+        thu-narrow{
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
+        thu-short{
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
         tue{
             relative{
                 "-1"{""}
@@ -4145,6 +4561,20 @@ structLocale:table(nofallback){
                 "1"{""}
             }
         }
+        tue-narrow{
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
+        tue-short{
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
         wed{
             relative{
                 "-1"{""}
@@ -4152,6 +4582,20 @@ structLocale:table(nofallback){
                 "1"{""}
             }
         }
+        wed-narrow{
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
+        wed-short{
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+        }
         week{
             dn{"Week"}                    
             relative{
@@ -4178,6 +4622,58 @@ structLocale:table(nofallback){
                 }
             }
         }
+        week-narrow{
+            dn{"Week"}                    
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
+        }
+        week-short{
+            dn{"Week"}                    
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
+        }
         weekday{
             dn{"Day of the Week"}
             relative{
@@ -4212,6 +4708,58 @@ structLocale:table(nofallback){
                 }
             }
         }
+        year-narrow{
+            dn{"Year"}                    
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
+        }
+        year-short{
+            dn{"Year"}                    
+            relative{
+                "-1"{""}
+                "0"{""}
+                "1"{""}
+            }
+            relativeTime{
+                future{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+                past{
+                    zero{""}
+                    one{""}
+                    two{""}
+                    few{""}
+                    many{""}
+                    other{""}
+                }
+            }
+        }
         zone{
             dn{"Zone"}
             relative{