Locale.h 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. bool is_root { false };
  16. Optional<String> language {};
  17. Optional<String> script {};
  18. Optional<String> region {};
  19. Vector<String> variants {};
  20. };
  21. struct Keyword {
  22. String key {};
  23. Vector<String> types {};
  24. };
  25. struct LocaleExtension {
  26. Vector<String> attributes {};
  27. Vector<Keyword> keywords {};
  28. };
  29. struct TransformedField {
  30. String key;
  31. Vector<String> values {};
  32. };
  33. struct TransformedExtension {
  34. Optional<LanguageID> language {};
  35. Vector<TransformedField> fields {};
  36. };
  37. struct OtherExtension {
  38. char key {};
  39. Vector<String> values {};
  40. };
  41. using Extension = Variant<LocaleExtension, TransformedExtension, OtherExtension>;
  42. struct LocaleID {
  43. LanguageID language_id {};
  44. Vector<Extension> extensions {};
  45. Vector<String> private_use_extensions {};
  46. };
  47. // Note: These methods only verify that the provided strings match the EBNF grammar of the
  48. // Unicode identifier subtag (i.e. no validation is done that the tags actually exist).
  49. bool is_unicode_language_subtag(StringView);
  50. bool is_unicode_script_subtag(StringView);
  51. bool is_unicode_region_subtag(StringView);
  52. bool is_unicode_variant_subtag(StringView);
  53. Optional<LanguageID> parse_unicode_language_id(StringView);
  54. Optional<LocaleID> parse_unicode_locale_id(StringView);
  55. Optional<String> canonicalize_unicode_locale_id(LocaleID&);
  56. String const& default_locale();
  57. bool is_locale_available(StringView locale);
  58. Optional<StringView> get_locale_language_mapping(StringView locale, StringView language);
  59. Optional<StringView> get_locale_territory_mapping(StringView locale, StringView territory);
  60. Optional<StringView> get_locale_script_mapping(StringView locale, StringView script);
  61. Optional<StringView> get_locale_currency_mapping(StringView locale, StringView currency);
  62. Optional<StringView> resolve_language_alias(StringView language);
  63. Optional<StringView> resolve_territory_alias(StringView territory);
  64. Optional<StringView> resolve_script_tag_alias(StringView script_tag);
  65. Optional<StringView> resolve_variant_alias(StringView variant);
  66. Optional<StringView> resolve_subdivision_alias(StringView subdivision);
  67. String resolve_most_likely_territory(LanguageID const& language_id, StringView territory_alias);
  68. }