| 
									
										
										
										
											2021-09-02 08:32:43 -04:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2021, Tim Flynn <trflynn89@pm.me> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <LibJS/Runtime/GlobalObject.h>
 | 
					
						
							|  |  |  | #include <LibJS/Runtime/Intl/Locale.h>
 | 
					
						
							| 
									
										
										
										
											2021-09-02 18:23:39 -04:00
										 |  |  | #include <LibUnicode/Locale.h>
 | 
					
						
							| 
									
										
										
										
											2021-09-02 08:32:43 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace JS::Intl { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-02 18:23:39 -04:00
										 |  |  | Locale* Locale::create(GlobalObject& global_object, Unicode::LocaleID const& locale_id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     return global_object.heap().allocate<Locale>(global_object, locale_id, *global_object.intl_locale_prototype()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-02 08:32:43 -04:00
										 |  |  | // 14 Locale Objects, https://tc39.es/ecma402/#locale-objects
 | 
					
						
							|  |  |  | Locale::Locale(Object& prototype) | 
					
						
							|  |  |  |     : Object(prototype) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-02 18:23:39 -04:00
										 |  |  | Locale::Locale(Unicode::LocaleID const& locale_id, Object& prototype) | 
					
						
							|  |  |  |     : Object(prototype) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     set_locale(locale_id.to_string()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (auto const& extension : locale_id.extensions) { | 
					
						
							|  |  |  |         if (!extension.has<Unicode::LocaleExtension>()) | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for (auto const& keyword : extension.get<Unicode::LocaleExtension>().keywords) { | 
					
						
							|  |  |  |             if (keyword.key == "ca"sv) { | 
					
						
							| 
									
										
										
										
											2021-09-08 15:25:35 -04:00
										 |  |  |                 set_calendar(keyword.value); | 
					
						
							| 
									
										
										
										
											2021-09-02 18:23:39 -04:00
										 |  |  |             } else if (keyword.key == "co"sv) { | 
					
						
							| 
									
										
										
										
											2021-09-08 15:25:35 -04:00
										 |  |  |                 set_collation(keyword.value); | 
					
						
							| 
									
										
										
										
											2021-09-02 18:23:39 -04:00
										 |  |  |             } else if (keyword.key == "hc"sv) { | 
					
						
							| 
									
										
										
										
											2021-09-08 15:25:35 -04:00
										 |  |  |                 set_hour_cycle(keyword.value); | 
					
						
							| 
									
										
										
										
											2021-09-02 18:23:39 -04:00
										 |  |  |             } else if (keyword.key == "kf"sv) { | 
					
						
							| 
									
										
										
										
											2021-09-08 15:25:35 -04:00
										 |  |  |                 set_case_first(keyword.value); | 
					
						
							| 
									
										
										
										
											2021-09-02 18:23:39 -04:00
										 |  |  |             } else if (keyword.key == "kn"sv) { | 
					
						
							| 
									
										
										
										
											2021-09-08 15:25:35 -04:00
										 |  |  |                 set_numeric(keyword.value.is_empty()); | 
					
						
							| 
									
										
										
										
											2021-09-02 18:23:39 -04:00
										 |  |  |             } else if (keyword.key == "nu"sv) { | 
					
						
							| 
									
										
										
										
											2021-09-08 15:25:35 -04:00
										 |  |  |                 set_numbering_system(keyword.value); | 
					
						
							| 
									
										
										
										
											2021-09-02 18:23:39 -04:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-02 08:32:43 -04:00
										 |  |  | } |