/* * Copyright (c) 2021-2023, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include namespace Locale { enum class Era : u8 { BC, AD, }; enum class Month : u8 { January, February, March, April, May, June, July, August, September, October, November, December, }; enum class Weekday : u8 { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, }; enum class DayPeriod : u8 { AM, PM, Noon, Morning1, Morning2, Afternoon1, Afternoon2, Evening1, Evening2, Night1, Night2, }; enum class HourCycle : u8 { H11, H12, H23, H24, }; enum class CalendarPatternStyle : u8 { Narrow, Short, Long, Numeric, TwoDigit, ShortOffset, LongOffset, ShortGeneric, LongGeneric, }; struct CalendarPattern { enum class Field { Era, Year, Month, Weekday, Day, DayPeriod, Hour, Minute, Second, FractionalSecondDigits, TimeZoneName, }; template void for_each_calendar_field_zipped_with(CalendarPattern const& other, Callback&& callback) { callback(era, other.era, Field::Era); callback(year, other.year, Field::Year); callback(month, other.month, Field::Month); callback(weekday, other.weekday, Field::Weekday); callback(day, other.day, Field::Day); callback(day_period, other.day_period, Field::DayPeriod); callback(hour, other.hour, Field::Hour); callback(minute, other.minute, Field::Minute); callback(second, other.second, Field::Second); callback(fractional_second_digits, other.fractional_second_digits, Field::FractionalSecondDigits); callback(time_zone_name, other.time_zone_name, Field::TimeZoneName); } String skeleton {}; String pattern {}; Optional pattern12 {}; Optional hour_cycle {}; // https://unicode.org/reports/tr35/tr35-dates.html#Calendar_Fields Optional era {}; Optional year {}; Optional month {}; Optional weekday {}; Optional day {}; Optional day_period {}; Optional hour {}; Optional minute {}; Optional second {}; Optional fractional_second_digits {}; Optional time_zone_name {}; }; struct CalendarRangePattern : public CalendarPattern { enum class Field { Era, Year, Month, Day, AmPm, DayPeriod, Hour, Minute, Second, FractionalSecondDigits, }; Optional field {}; String start_range {}; StringView separator {}; String end_range {}; }; enum class CalendarFormatType : u8 { Date, Time, DateTime, }; struct CalendarFormat { CalendarPattern full_format {}; CalendarPattern long_format {}; CalendarPattern medium_format {}; CalendarPattern short_format {}; }; enum class CalendarSymbol : u8 { DayPeriod, Era, Month, Weekday, }; struct TimeZoneFormat { StringView symbol_ahead_sign {}; StringView symbol_ahead_separator {}; StringView symbol_behind_sign {}; StringView symbol_behind_separator {}; StringView gmt_format {}; StringView gmt_zero_format {}; }; HourCycle hour_cycle_from_string(StringView hour_cycle); StringView hour_cycle_to_string(HourCycle hour_cycle); CalendarPatternStyle calendar_pattern_style_from_string(StringView style); StringView calendar_pattern_style_to_string(CalendarPatternStyle style); Optional hour_cycle_region_from_string(StringView hour_cycle_region); ErrorOr> get_regional_hour_cycles(StringView region); ErrorOr> get_locale_hour_cycles(StringView locale); ErrorOr> get_default_regional_hour_cycle(StringView locale); Optional minimum_days_region_from_string(StringView minimum_days_region); Optional get_regional_minimum_days(StringView region); ErrorOr> get_locale_minimum_days(StringView locale); Optional first_day_region_from_string(StringView first_day_region); Optional get_regional_first_day(StringView region); ErrorOr> get_locale_first_day(StringView locale); Optional weekend_start_region_from_string(StringView weekend_start_region); Optional get_regional_weekend_start(StringView region); ErrorOr> get_locale_weekend_start(StringView locale); Optional weekend_end_region_from_string(StringView weekend_end_region); Optional get_regional_weekend_end(StringView region); ErrorOr> get_locale_weekend_end(StringView locale); ErrorOr combine_skeletons(StringView first, StringView second); ErrorOr> get_calendar_date_format(StringView locale, StringView calendar); ErrorOr> get_calendar_time_format(StringView locale, StringView calendar); ErrorOr> get_calendar_date_time_format(StringView locale, StringView calendar); ErrorOr> get_calendar_format(StringView locale, StringView calendar, CalendarFormatType type); ErrorOr> get_calendar_available_formats(StringView locale, StringView calendar); ErrorOr> get_calendar_default_range_format(StringView locale, StringView calendar); ErrorOr> get_calendar_range_formats(StringView locale, StringView calendar, StringView skeleton); ErrorOr> get_calendar_range12_formats(StringView locale, StringView calendar, StringView skeleton); ErrorOr> get_calendar_era_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Era value); ErrorOr> get_calendar_month_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Month value); ErrorOr> get_calendar_weekday_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, Weekday value); ErrorOr> get_calendar_day_period_symbol(StringView locale, StringView calendar, CalendarPatternStyle style, DayPeriod value); ErrorOr> get_calendar_day_period_symbol_for_hour(StringView locale, StringView calendar, CalendarPatternStyle style, u8 hour); ErrorOr format_time_zone(StringView locale, StringView time_zone, CalendarPatternStyle style, AK::Time time); Optional get_time_zone_name(StringView locale, StringView time_zone, CalendarPatternStyle style, TimeZone::InDST in_dst); Optional get_time_zone_format(StringView locale); }