| 
									
										
										
										
											2023-11-19 01:05:15 +01:00
										 |  |  | <script lang="ts"> | 
					
						
							| 
									
										
										
										
											2023-12-12 19:18:50 +01:00
										 |  |  |   // Languages in the language itself | 
					
						
							|  |  |  |   import native from "../../assets/language_native.json" | 
					
						
							|  |  |  |   // Translated languages | 
					
						
							|  |  |  |   import language_translations from "../../assets/language_translations.json" | 
					
						
							| 
									
										
										
										
											2023-11-19 01:05:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-12 19:18:50 +01:00
										 |  |  |   import { Store, UIEventSource } from "../../Logic/UIEventSource" | 
					
						
							|  |  |  |   import Locale from "../i18n/Locale" | 
					
						
							|  |  |  |   import { LanguageIcon } from "@babeard/svelte-heroicons/solid" | 
					
						
							|  |  |  |   import Dropdown from "../Base/Dropdown.svelte" | 
					
						
							|  |  |  |   import { twMerge } from "tailwind-merge" | 
					
						
							|  |  |  |   import Translations from "../i18n/Translations" | 
					
						
							| 
									
										
										
										
											2023-12-19 23:02:02 +01:00
										 |  |  |   import { ariaLabel } from "../../Utils/ariaLabel" | 
					
						
							| 
									
										
										
										
											2023-11-19 01:05:15 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-12 19:18:50 +01:00
										 |  |  |   /** | 
					
						
							| 
									
										
										
										
											2023-11-19 01:05:15 +01:00
										 |  |  |    * Languages one can choose from | 
					
						
							|  |  |  |    * Defaults to _all_ languages known by MapComplete | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2023-12-01 15:23:28 +01:00
										 |  |  |   export let availableLanguages: string[] = Object.keys(native) | 
					
						
							| 
									
										
										
										
											2023-11-19 01:05:15 +01:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * EventStore to assign to, defaults to 'Locale.langauge' | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2023-12-01 15:23:28 +01:00
										 |  |  |   export let assignTo: UIEventSource<string> = Locale.language | 
					
						
							| 
									
										
										
										
											2023-12-12 19:18:50 +01:00
										 |  |  |   export let preferredLanguages: Store<string[]> = undefined | 
					
						
							| 
									
										
										
										
											2023-12-01 15:23:28 +01:00
										 |  |  |   let preferredFiltered: string[] = undefined | 
					
						
							|  |  |  |   preferredLanguages?.addCallbackAndRunD((preferredLanguages) => { | 
					
						
							|  |  |  |     let lng = navigator.language | 
					
						
							| 
									
										
										
										
											2023-11-19 01:05:15 +01:00
										 |  |  |     if (lng === "en-US") { | 
					
						
							| 
									
										
										
										
											2023-12-01 15:23:28 +01:00
										 |  |  |       lng = "en" | 
					
						
							| 
									
										
										
										
											2023-11-19 01:05:15 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |     if (preferredLanguages?.indexOf(lng) < 0) { | 
					
						
							| 
									
										
										
										
											2023-12-01 15:23:28 +01:00
										 |  |  |       preferredLanguages?.push(lng) | 
					
						
							| 
									
										
										
										
											2023-11-19 01:05:15 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-12-01 15:23:28 +01:00
										 |  |  |     preferredFiltered = preferredLanguages?.filter((l) => availableLanguages.indexOf(l) >= 0) | 
					
						
							|  |  |  |   }) | 
					
						
							| 
									
										
										
										
											2023-12-12 19:18:50 +01:00
										 |  |  |   export let clss: string = undefined | 
					
						
							| 
									
										
										
										
											2023-12-01 15:23:28 +01:00
										 |  |  |   let current = Locale.language | 
					
						
							| 
									
										
										
										
											2023-11-19 01:05:15 +01:00
										 |  |  | </script> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | {#if availableLanguages?.length > 1} | 
					
						
							| 
									
										
										
										
											2023-12-19 22:08:00 +01:00
										 |  |  |   <form class={twMerge("flex max-w-full items-center pr-4", clss)}> | 
					
						
							| 
									
										
										
										
											2023-12-23 22:21:27 +01:00
										 |  |  |     <label class="neutral-label flex max-w-full" use:ariaLabel={Translations.t.general.pickLanguage}> | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |       <LanguageIcon class="mr-1 h-4 w-4 shrink-0" aria-hidden="true" /> | 
					
						
							| 
									
										
										
										
											2023-12-12 19:18:50 +01:00
										 |  |  |       <Dropdown cls="max-w-full" value={assignTo}> | 
					
						
							|  |  |  |         {#if preferredFiltered} | 
					
						
							|  |  |  |           {#each preferredFiltered as language} | 
					
						
							|  |  |  |             <option value={language} class="font-bold"> | 
					
						
							|  |  |  |               {native[language] ?? ""} | 
					
						
							|  |  |  |               {#if language !== $current} | 
					
						
							|  |  |  |                 ({language_translations[language]?.[$current] ?? language}) | 
					
						
							|  |  |  |               {/if} | 
					
						
							|  |  |  |             </option> | 
					
						
							|  |  |  |           {/each} | 
					
						
							|  |  |  |           <option disabled /> | 
					
						
							|  |  |  |         {/if} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |         {#each availableLanguages.filter((l) => l !== "_context") as language} | 
					
						
							| 
									
										
										
										
											2023-11-19 01:05:15 +01:00
										 |  |  |           <option value={language} class="font-bold"> | 
					
						
							|  |  |  |             {native[language] ?? ""} | 
					
						
							|  |  |  |             {#if language !== $current} | 
					
						
							| 
									
										
										
										
											2023-12-12 19:18:50 +01:00
										 |  |  |               {#if language_translations[language]?.[$current] !== undefined} | 
					
						
							| 
									
										
										
										
											2023-12-21 01:46:18 +01:00
										 |  |  |                 ({language_translations[language]?.[$current] + " - " + language ?? language}) | 
					
						
							| 
									
										
										
										
											2023-12-12 19:18:50 +01:00
										 |  |  |               {:else} | 
					
						
							|  |  |  |                 ({language}) | 
					
						
							|  |  |  |               {/if} | 
					
						
							| 
									
										
										
										
											2023-11-19 01:05:15 +01:00
										 |  |  |             {/if} | 
					
						
							|  |  |  |           </option> | 
					
						
							|  |  |  |         {/each} | 
					
						
							| 
									
										
										
										
											2023-12-12 19:18:50 +01:00
										 |  |  |       </Dropdown> | 
					
						
							|  |  |  |     </label> | 
					
						
							| 
									
										
										
										
											2023-11-19 01:05:15 +01:00
										 |  |  |   </form> | 
					
						
							|  |  |  | {/if} |