From b24b9c0a656629bc6e01ca57bbf861b0a7870bc3 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Thu, 14 Jul 2022 14:43:29 -0400 Subject: [PATCH] LibUnicode: Fallback to per-locale default calendars When patterns, symbols, etc. for a requested calendar are not found, use the locale's default calendar. --- .../GenerateUnicodeDateTimeFormat.cpp | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp index fc412bd15b..c0dfece74b 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibUnicode/GenerateUnicodeDateTimeFormat.cpp @@ -2089,21 +2089,32 @@ static CalendarData const* find_calendar_data(StringView locale, StringView cale if (!locale_value.has_value()) return nullptr; - auto calendar_keyword = keyword_ca_from_string(calendar); - if (!calendar_keyword.has_value()) - return {}; - - auto calendar_value = keyword_to_calendar(*calendar_keyword); - if (!calendar_value.has_value()) - return {}; - auto locale_index = to_underlying(*locale_value) - 1; // Subtract 1 because 0 == Locale::None. - size_t calendar_index = to_underlying(*calendar_value); - auto const& calendar_indices = s_locale_calendars.at(locale_index); - calendar_index = calendar_indices[calendar_index]; - return &s_calendars[calendar_index]; + auto lookup_calendar = [&](auto calendar_name) -> CalendarData const* { + auto calendar_keyword = keyword_ca_from_string(calendar_name); + if (!calendar_keyword.has_value()) + return nullptr; + + auto calendar_value = keyword_to_calendar(*calendar_keyword); + if (!calendar_value.has_value()) + return nullptr; + + size_t calendar_index = to_underlying(*calendar_value); + calendar_index = calendar_indices[calendar_index]; + + return &s_calendars[calendar_index]; + }; + + if (auto const* calendar_data = lookup_calendar(calendar)) + return calendar_data; + + auto default_calendar = get_preferred_keyword_value_for_locale(locale, "ca"sv); + if (!default_calendar.has_value()) + return nullptr; + + return lookup_calendar(*default_calendar); } Optional get_calendar_date_format(StringView locale, StringView calendar)