<script lang="ts"> // Languages in the language itself import native from "../../assets/language_native.json"; // Translated languages import language_translations from "../../assets/language_translations.json"; import { UIEventSource } from "../../Logic/UIEventSource"; import Locale from "../i18n/Locale"; import { LanguageIcon } from "@babeard/svelte-heroicons/solid"; import Dropdown from "../Base/Dropdown.svelte"; /** * Languages one can choose from * Defaults to _all_ languages known by MapComplete */ export let availableLanguages: string[] = Object.keys(native); /** * EventStore to assign to, defaults to 'Locale.langauge' */ export let assignTo: UIEventSource<string> = Locale.language; export let preferredLanguages: UIEventSource<string[]> = undefined; let preferredFiltered: string[] = undefined; preferredLanguages?.addCallbackAndRunD(preferredLanguages => { let lng = navigator.language; if (lng === "en-US") { lng = "en"; } if (preferredLanguages?.indexOf(lng) < 0) { preferredLanguages?.push(lng); } preferredFiltered = preferredLanguages?.filter(l => availableLanguages.indexOf(l) >= 0); }); let current = Locale.language; </script> {#if availableLanguages?.length > 1} <form class="flex items-center"> <LanguageIcon class="h-4 w-4 mr-1" /> <Dropdown 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></option> {/if} {#each availableLanguages as language} <option value={language} class="font-bold"> {native[language] ?? ""} {#if language !== $current} ({(language_translations[language]?.[$current] + " - " + language) ?? language}) {/if} </option> {/each} </Dropdown> </form> {/if}