From e4264a826a2cfe0ca0c94f08e37c62c050c5e4c3 Mon Sep 17 00:00:00 2001 From: haytenf Date: Fri, 16 Aug 2024 12:11:24 -0400 Subject: [PATCH] CLDR-10347 show one example for each day period, excluding midnight (#3949) --- .../unicode/cldr/test/ExampleGenerator.java | 29 +++++++++++---- .../cldr/unittest/TestExampleGenerator.java | 36 +++++++++++++++++++ 2 files changed, 58 insertions(+), 7 deletions(-) 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 913e4884462..e3641e07fa9 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 @@ -168,7 +168,6 @@ public class ExampleGenerator { private static final Date DATE_SAMPLE2; private static final Date DATE_SAMPLE3; - private static final Date DATE_SAMPLE4; static { Calendar calendar = Calendar.getInstance(ZONE_SAMPLE, ULocale.ENGLISH); @@ -180,8 +179,6 @@ public class ExampleGenerator { calendar.set(1999, 8, 5, 7, 0, 0); // 1999-09-05 07:00:00 DATE_SAMPLE3 = calendar.getTime(); - calendar.set(1999, 8, 5, 23, 0, 0); // 1999-09-05 23:00:00 - DATE_SAMPLE4 = calendar.getTime(); } static final List CURRENCY_SAMPLES = @@ -2597,7 +2594,6 @@ private String handleDateFormatItem(String xpath, String value, boolean showCont String numbersOverride = parts.findAttributeValue("pattern", "numbers"); SimpleDateFormat sdf = icuServiceBuilder.getDateFormat(calendar, value, numbersOverride); - sdf.setTimeZone(ZONE_SAMPLE); String defaultNumberingSystem = cldrFile.getWinningValue("//ldml/numbers/defaultNumberingSystem"); String timeSeparator = @@ -2609,6 +2605,7 @@ private String handleDateFormatItem(String xpath, String value, boolean showCont dfs.setTimeSeparatorString(timeSeparator); sdf.setDateFormatSymbols(dfs); if (id == null || id.indexOf('B') < 0) { + sdf.setTimeZone(ZONE_SAMPLE); // Standard date/time format, or availableFormat without dayPeriod if (value.contains("MMM") || value.contains("LLL")) { // alpha month, do not need context examples @@ -2626,9 +2623,27 @@ private String handleDateFormatItem(String xpath, String value, boolean showCont } } else { List examples = new ArrayList<>(); - examples.add(sdf.format(DATE_SAMPLE3)); - examples.add(sdf.format(DATE_SAMPLE)); - examples.add(sdf.format(DATE_SAMPLE4)); + DayPeriodInfo dayPeriodInfo = + supplementalDataInfo.getDayPeriods( + DayPeriodInfo.Type.format, cldrFile.getLocaleID()); + Set dayPeriods = + new LinkedHashSet(dayPeriodInfo.getPeriods()); + for (DayPeriod dayPeriod : dayPeriods) { + if (dayPeriod.equals( + DayPeriod.midnight)) { // suppress midnight, see ICU-12278 bug + continue; + } + R3 info = + dayPeriodInfo.getFirstDayPeriodInfo(dayPeriod); + if (info != null) { + int time = + ((info.get0() + info.get1()) + / 2); // dayPeriod endpoints overlap, midpoint to + // disambiguate + String formatted = sdf.format(time); + examples.add(formatted); + } + } return formatExampleList(examples.toArray(new String[0])); } } 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 a239a63f518..6eca391675e 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 @@ -1123,6 +1123,42 @@ private void checkDayPeriod( checkPathValue(exampleGenerator, path, cldrFile.getStringValue(path), expected); } + public void TestAllDayPeriods() { // excludes midnight, see ICU-12278 + checkDayPeriodsForLocale( + "en", + "Bhm", + "〖3:00 at night〗〖9:00 in the morning〗〖12:00 noon〗〖3:00 in the afternoon〗〖7:30 in the evening〗"); + checkDayPeriodsForLocale( + "it", + "Bhm", + "〖3:00 di notte〗〖9:00 di mattina〗〖12:00 mezzogiorno〗〖3:00 di pomeriggio〗〖9:00 di sera〗"); + checkDayPeriodsForLocale( + "de", + "Bhm", + "〖2:30 nachts〗〖7:30 morgens〗〖11:00 vorm.〗〖12:30 mittags〗〖3:30 nachm.〗〖9:00 abends〗"); + checkDayPeriodsForLocale("zh", "Bhm", "〖凌晨2:30〗〖早上6:30〗〖上午10:00〗〖中午12:30〗〖下午4:00〗〖晚上9:30〗"); + checkDayPeriodsForLocale( + "am", + "EBhm", + "〖ሐሙስ በሌሊት 3:00〗〖ሐሙስ ጥዋት 9:00〗〖ሐሙስ ቀትር 12:00〗〖ሐሙስ ከሰዓት 3:00〗〖ሐሙስ በምሽት 9:00〗"); + checkDayPeriodsForLocale( + "hi", + "EBhms", + "〖गुरु रात 2:00:00〗〖गुरु सुबह 8:00:00〗〖गुरु दोपहर 2:00:00〗〖गुरु शाम 6:00:00〗"); + } + + public void checkDayPeriodsForLocale(String localeId, String pattern, String expected) { + ExampleGenerator exampleGenerator = getExampleGenerator(localeId); + String path = + "//ldml/dates/calendars/calendar[@type=\"gregorian\"]" + + "/dateTimeFormats/availableFormats/dateFormatItem" + + "[@id=\"" + + pattern + + "\"]"; + String message = "Day periods with pattern \"" + pattern + "\""; + checkValue(message, expected, exampleGenerator, path); + } + /** * Test that getExampleHtml returns same output for same input regardless of order in which it * is called with different inputs.