diff --git a/Userland/Libraries/LibUnicode/Locale.cpp b/Userland/Libraries/LibUnicode/Locale.cpp index 2e77b3f0eb..d3c9b434e0 100644 --- a/Userland/Libraries/LibUnicode/Locale.cpp +++ b/Userland/Libraries/LibUnicode/Locale.cpp @@ -765,6 +765,40 @@ Optional __attribute__((weak)) get_locale_short_date_field_mapping(S Optional __attribute__((weak)) get_locale_narrow_date_field_mapping(StringView, StringView) { return {}; } Optional __attribute__((weak)) get_locale_key_mapping(StringView, StringView) { return {}; } +// https://www.unicode.org/reports/tr35/tr35-39/tr35-general.html#Display_Name_Elements +Optional format_locale_for_display(StringView locale, LocaleID locale_id) +{ + auto language_id = move(locale_id.language_id); + VERIFY(language_id.language.has_value()); + + auto patterns = Unicode::get_locale_display_patterns(locale); + if (!patterns.has_value()) + return {}; + + auto primary_tag = get_locale_language_mapping(locale, *language_id.language).value_or(*language_id.language); + Optional script; + Optional region; + + if (language_id.script.has_value()) + script = get_locale_script_mapping(locale, *language_id.script).value_or(*language_id.script); + if (language_id.region.has_value()) + region = get_locale_territory_mapping(locale, *language_id.region).value_or(*language_id.region); + + Optional secondary_tag; + + if (script.has_value() && region.has_value()) + secondary_tag = patterns->locale_separator.replace("{0}"sv, *script).replace("{1}"sv, *region); + else if (script.has_value()) + secondary_tag = *script; + else if (region.has_value()) + secondary_tag = *region; + + if (!secondary_tag.has_value()) + return primary_tag; + + return patterns->locale_pattern.replace("{0}"sv, primary_tag).replace("{1}"sv, *secondary_tag); +} + Vector get_locale_key_mapping_list(StringView locale, StringView keyword) { if (keyword == "hc"sv) { diff --git a/Userland/Libraries/LibUnicode/Locale.h b/Userland/Libraries/LibUnicode/Locale.h index ececdba063..e4d0589a70 100644 --- a/Userland/Libraries/LibUnicode/Locale.h +++ b/Userland/Libraries/LibUnicode/Locale.h @@ -158,6 +158,7 @@ Optional list_pattern_type_from_string(StringView list_pattern_ Optional list_pattern_style_from_string(StringView list_pattern_style); Optional get_locale_display_patterns(StringView locale); +Optional format_locale_for_display(StringView locale, LocaleID locale_id); Optional get_locale_language_mapping(StringView locale, StringView language); Optional get_locale_territory_mapping(StringView locale, StringView territory);