aboutsummaryrefslogtreecommitdiffstats
path: root/apps/kit/src/lib/components/locale-switcher.svelte
blob: 39d61689f12ec64a1096c89387ea49013da5b279 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<script lang="ts">
    import {browser} from "$app/environment";
    import {page} from "$app/stores";
    import {setLocale, locale} from "$lib/i18n/i18n-svelte";
    import type {Locales} from "$lib/i18n/i18n-types";
    import {locales} from "$lib/i18n/i18n-util";
    import {loadLocaleAsync} from "$lib/i18n/i18n-util.async";

    const switchLocale = async (
        newLocale: Locales,
        updateHistoryState = true,
    ) => {
        if (!newLocale || $locale === newLocale) return;

        // load new dictionary from server
        await loadLocaleAsync(newLocale);

        // select locale
        setLocale(newLocale);

        // update `lang` attribute
        document.querySelector("html")?.setAttribute("lang", newLocale);

        //TODO set cookie that persists the locale
    };

    // update locale when navigating via browser back/forward buttons
    const handlePopStateEvent = async ({state}: PopStateEvent) =>
        switchLocale(state.locale, false);

    // update locale when page store changes
    $: if (browser) {
        const lang = $page.params.lang as Locales;
        switchLocale(lang, false);
    }
</script>

<svelte:window on:popstate={handlePopStateEvent}/>

<ul>
    {#each locales as l}
        <li>
            <button
                    type="button"
                    class:active={l === $locale}
                    on:click={() => switchLocale(l)}
            >
                {l}
            </button>
        </li>
    {/each}
</ul>