From 3515383ddaab697cca8156521170b375ec71a176 Mon Sep 17 00:00:00 2001 From: haytenf Date: Wed, 2 Oct 2024 08:48:05 -0700 Subject: [PATCH] CLDR-5854 Add-examples-for-relative-dates-and-times (#4060) --- .../unicode/cldr/test/ExampleGenerator.java | 58 +++++++++++++++++++ .../cldr/unittest/TestExampleGenerator.java | 30 ++++++++++ 2 files changed, 88 insertions(+) diff --git a/tools/cldr-code/src/main/java/org/unicode/cldr/test/ExampleGenerator.java b/tools/cldr-code/src/main/java/org/unicode/cldr/test/ExampleGenerator.java index 3cdc88c387c..62e3ce503ae 100644 --- a/tools/cldr-code/src/main/java/org/unicode/cldr/test/ExampleGenerator.java +++ b/tools/cldr-code/src/main/java/org/unicode/cldr/test/ExampleGenerator.java @@ -326,6 +326,19 @@ public void setCachingEnabled(boolean enabled) { } }; + // map relativeTimePattern counts to numeric examples + public static final Map COUNTS = + new HashMap() { + { + put("zero", "0"); + put("one", "1"); + put("two", "2"); + put("few", "3"); + put("many", "5"); + put("other", "10"); + } + }; + public CLDRFile getCldrFile() { return cldrFile; } @@ -540,6 +553,10 @@ private void constructExampleHtmlExtended(String xpath, String value, List examples) { examples.add(sdf.format(sample)); } + /* Add relative date/time examples, choosing appropriate + * patterns as needed for relative dates vs relative times. + * Additionally, for relativeTimePattern items, ensure that + * numeric example corresponds to the count represented by the item. + */ + private void handleRelative( + String xpath, XPathParts parts, String value, List examples) { + String skeleton; + String type = parts.findAttributeValue("field", "type"); + if (type.startsWith("hour")) { + skeleton = "Hm"; + } else if (type.startsWith("minute") || type.startsWith("second")) { + skeleton = "ms"; + } else if (type.startsWith("year") + || type.startsWith("month") + || type.startsWith("quarter")) { + skeleton = "yMMMM"; + } else { + skeleton = "MMMMd"; + } + String checkPath = + "//ldml/dates/calendars/calendar[@type=\"gregorian\"]/dateTimeFormats/availableFormats/dateFormatItem[@id=\"" + + skeleton + + "\"]"; + String dateFormat = cldrFile.getWinningValue(checkPath); + SimpleDateFormat sdf = icuServiceBuilder.getDateFormat("gregorian", dateFormat); + String sampleDate = sdf.format(DATE_SAMPLE); + String example1 = + value.substring(0, 1).toUpperCase() + value.substring(1) + " (" + sampleDate + ")"; + String example2 = sampleDate + " (" + value + ")"; + if (parts.contains("relativeTimePattern")) { // has placeholder + String count = parts.getAttributeValue(-1, "count"); + String exampleCount = COUNTS.get(count); + examples.add(invertBackground(format(setBackground(example1), exampleCount))); + examples.add(invertBackground(format(setBackground(example2), exampleCount))); + } else { + examples.add(format(example1)); + examples.add(format(example2)); + } + } + /** * @param elementToOverride the element that is to be overridden * @param element the overriding element diff --git a/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestExampleGenerator.java b/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestExampleGenerator.java index 121390a1be1..c85d1eb4a03 100644 --- a/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestExampleGenerator.java +++ b/tools/cldr-code/src/test/java/org/unicode/cldr/unittest/TestExampleGenerator.java @@ -1800,6 +1800,36 @@ public void TestQuarterFormats() { "//ldml/dates/calendars/calendar[@type=\"gregorian\"]/quarters/quarterContext[@type=\"stand-alone\"]/quarterWidth[@type=\"abbreviated\"]/quarter[@type=\"4\"]"); } + public void TestRelative() { + ExampleGenerator exampleGeneratorIt = getExampleGenerator("it"); + ExampleGenerator exampleGeneratorAm = getExampleGenerator("am"); + checkValue( + "it relative day type 2", + "〖Dopodomani (5 settembre)〗〖5 settembre (dopodomani)〗", + exampleGeneratorIt, + "//ldml/dates/fields/field[@type=\"day\"]/relative[@type=\"2\"]"); + checkValue( + "it relative hour future-other", + "〖Tra ❬10❭ ore (18:25)〗〖18:25 (tra ❬10❭ ore)〗", + exampleGeneratorIt, + "//ldml/dates/fields/field[@type=\"hour\"]/relativeTime[@type=\"future\"]/relativeTimePattern[@count=\"other\"]"); + checkValue( + "it relative year past-one", + "〖❬1❭ anno fa (settembre 1999)〗〖settembre 1999 (❬1❭ anno fa)〗", + exampleGeneratorIt, + "//ldml/dates/fields/field[@type=\"year\"]/relativeTime[@type=\"past\"]/relativeTimePattern[@count=\"one\"]"); + checkValue( + "am relative month future-one", + "〖በ❬1❭ ወር ውስጥ (ሴፕቴምበር 1999)〗〖ሴፕቴምበር 1999 (በ❬1❭ ወር ውስጥ)〗", + exampleGeneratorAm, + "//ldml/dates/fields/field[@type=\"month\"]/relativeTime[@type=\"future\"]/relativeTimePattern[@count=\"one\"]"); + checkValue( + "am relative month future-other", + "〖በ❬10❭ ወራት ውስጥ (ሴፕቴምበር 1999)〗〖ሴፕቴምበር 1999 (በ❬10❭ ወራት ውስጥ)〗", + exampleGeneratorAm, + "//ldml/dates/fields/field[@type=\"month\"]/relativeTime[@type=\"future\"]/relativeTimePattern[@count=\"other\"]"); + } + static final class MissingKey implements Comparable { final SectionId sectionId; final PageId pageId;