Locale.h 2.0 KB

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