Locale.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. * Copyright (c) 2021, Tim Flynn <trflynn89@pm.me>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibJS/Runtime/GlobalObject.h>
  7. #include <LibJS/Runtime/Intl/Locale.h>
  8. #include <LibUnicode/Locale.h>
  9. namespace JS::Intl {
  10. Locale* Locale::create(GlobalObject& global_object, Unicode::LocaleID const& locale_id)
  11. {
  12. return global_object.heap().allocate<Locale>(global_object, locale_id, *global_object.intl_locale_prototype());
  13. }
  14. Vector<StringView> const& Locale::relevant_extension_keys()
  15. {
  16. // 14.2.2 Internal slots, https://tc39.es/ecma402/#sec-intl.locale-internal-slots
  17. // The value of the [[RelevantExtensionKeys]] internal slot is « "ca", "co", "hc", "kf", "kn", "nu" ».
  18. // If %Collator%.[[RelevantExtensionKeys]] does not contain "kf", then remove "kf" from %Locale%.[[RelevantExtensionKeys]].
  19. // If %Collator%.[[RelevantExtensionKeys]] does not contain "kn", then remove "kn" from %Locale%.[[RelevantExtensionKeys]].
  20. // FIXME: We do not yet have an Intl.Collator object. For now, we behave as if "kf" and "kn" exist, as test262 depends on it.
  21. static Vector<StringView> relevant_extension_keys { "ca"sv, "co"sv, "hc"sv, "kf"sv, "kn"sv, "nu"sv };
  22. return relevant_extension_keys;
  23. }
  24. // 14 Locale Objects, https://tc39.es/ecma402/#locale-objects
  25. Locale::Locale(Object& prototype)
  26. : Object(prototype)
  27. {
  28. }
  29. Locale::Locale(Unicode::LocaleID const& locale_id, Object& prototype)
  30. : Object(prototype)
  31. {
  32. set_locale(locale_id.to_string());
  33. for (auto const& extension : locale_id.extensions) {
  34. if (!extension.has<Unicode::LocaleExtension>())
  35. continue;
  36. for (auto const& keyword : extension.get<Unicode::LocaleExtension>().keywords) {
  37. if (keyword.key == "ca"sv) {
  38. set_calendar(keyword.value);
  39. } else if (keyword.key == "co"sv) {
  40. set_collation(keyword.value);
  41. } else if (keyword.key == "hc"sv) {
  42. set_hour_cycle(keyword.value);
  43. } else if (keyword.key == "kf"sv) {
  44. set_case_first(keyword.value);
  45. } else if (keyword.key == "kn"sv) {
  46. set_numeric(keyword.value.is_empty());
  47. } else if (keyword.key == "nu"sv) {
  48. set_numbering_system(keyword.value);
  49. }
  50. }
  51. break;
  52. }
  53. }
  54. }