Locale.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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. // 14 Locale Objects, https://tc39.es/ecma402/#locale-objects
  15. Locale::Locale(Object& prototype)
  16. : Object(prototype)
  17. {
  18. }
  19. Locale::Locale(Unicode::LocaleID const& locale_id, Object& prototype)
  20. : Object(prototype)
  21. {
  22. set_locale(locale_id.to_string());
  23. for (auto const& extension : locale_id.extensions) {
  24. if (!extension.has<Unicode::LocaleExtension>())
  25. continue;
  26. for (auto const& keyword : extension.get<Unicode::LocaleExtension>().keywords) {
  27. if (keyword.key == "ca"sv) {
  28. set_calendar(keyword.value);
  29. } else if (keyword.key == "co"sv) {
  30. set_collation(keyword.value);
  31. } else if (keyword.key == "hc"sv) {
  32. set_hour_cycle(keyword.value);
  33. } else if (keyword.key == "kf"sv) {
  34. set_case_first(keyword.value);
  35. } else if (keyword.key == "kn"sv) {
  36. set_numeric(keyword.value.is_empty());
  37. } else if (keyword.key == "nu"sv) {
  38. set_numbering_system(keyword.value);
  39. }
  40. }
  41. break;
  42. }
  43. }
  44. }