Locale.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. /*
  2. * Copyright (c) 2021, Tim Flynn <trflynn89@pm.me>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Optional.h>
  8. #include <AK/String.h>
  9. #include <AK/StringView.h>
  10. #include <AK/Variant.h>
  11. #include <AK/Vector.h>
  12. #include <LibUnicode/Forward.h>
  13. namespace Unicode {
  14. struct LanguageID {
  15. String to_string() const;
  16. bool is_root { false };
  17. Optional<String> language {};
  18. Optional<String> script {};
  19. Optional<String> region {};
  20. Vector<String> variants {};
  21. };
  22. struct Keyword {
  23. String key {};
  24. Vector<String> types {};
  25. };
  26. struct LocaleExtension {
  27. Vector<String> attributes {};
  28. Vector<Keyword> keywords {};
  29. };
  30. struct TransformedField {
  31. String key;
  32. Vector<String> values {};
  33. };
  34. struct TransformedExtension {
  35. Optional<LanguageID> language {};
  36. Vector<TransformedField> fields {};
  37. };
  38. struct OtherExtension {
  39. char key {};
  40. Vector<String> values {};
  41. };
  42. using Extension = Variant<LocaleExtension, TransformedExtension, OtherExtension>;
  43. struct LocaleID {
  44. String to_string() const;
  45. template<typename ExtensionType>
  46. void remove_extension_type()
  47. {
  48. auto tmp_extensions = move(extensions);
  49. for (auto& extension : tmp_extensions) {
  50. if (!extension.has<ExtensionType>())
  51. extensions.append(move(extension));
  52. }
  53. }
  54. LanguageID language_id {};
  55. Vector<Extension> extensions {};
  56. Vector<String> private_use_extensions {};
  57. };
  58. // Note: These methods only verify that the provided strings match the EBNF grammar of the
  59. // Unicode identifier subtag (i.e. no validation is done that the tags actually exist).
  60. bool is_unicode_language_subtag(StringView);
  61. bool is_unicode_script_subtag(StringView);
  62. bool is_unicode_region_subtag(StringView);
  63. bool is_unicode_variant_subtag(StringView);
  64. bool is_type_identifier(StringView);
  65. Optional<LanguageID> parse_unicode_language_id(StringView);
  66. Optional<LocaleID> parse_unicode_locale_id(StringView);
  67. Optional<String> canonicalize_unicode_locale_id(LocaleID&);
  68. String const& default_locale();
  69. bool is_locale_available(StringView locale);
  70. Optional<StringView> get_locale_language_mapping(StringView locale, StringView language);
  71. Optional<StringView> get_locale_territory_mapping(StringView locale, StringView territory);
  72. Optional<StringView> get_locale_script_mapping(StringView locale, StringView script);
  73. Optional<StringView> get_locale_currency_mapping(StringView locale, StringView currency);
  74. Optional<StringView> resolve_language_alias(StringView language);
  75. Optional<StringView> resolve_territory_alias(StringView territory);
  76. Optional<StringView> resolve_script_tag_alias(StringView script_tag);
  77. Optional<StringView> resolve_variant_alias(StringView variant);
  78. Optional<StringView> resolve_subdivision_alias(StringView subdivision);
  79. String resolve_most_likely_territory(LanguageID const& language_id, StringView territory_alias);
  80. }