webui/src/routes/+layout.svelte

81 lines
2 KiB
Svelte
Raw Normal View History

2023-11-17 00:05:35 +00:00
<script lang="ts">
import {
Collapse,
Dropdown,
DropdownItem,
2023-11-19 19:27:22 +00:00
DropdownMenu,
DropdownToggle,
Nav,
NavItem,
NavLink,
Navbar,
NavbarBrand
2023-11-17 00:05:35 +00:00
} from 'sveltestrap';
2023-11-17 18:10:46 +00:00
import { page } from '$app/stores';
2023-11-23 01:04:20 +00:00
import { locale, locales, isLoading } from 'svelte-i18n';
2023-11-17 00:05:35 +00:00
export const setLocale = (lang: string) => () => {
locale.set(lang);
localStorage.setItem('locale', lang);
};
export const getFlagEmoji = (languageCode: string): string | null => {
const flagMap: { [key: string]: string } = {
en: '🇬🇧', // English flag emoji
nl: '🇳🇱', // Dutch flag emoji
es: '🇪🇸' // Spanish flag emoji
};
// Convert the language code to lowercase for case-insensitive matching
const lowercaseCode = languageCode.toLowerCase();
// Check if the language code is in the flagMap
2023-11-19 19:27:22 +00:00
if (Object.prototype.hasOwnProperty.call(flagMap, lowercaseCode)) {
return flagMap[lowercaseCode];
} else {
// Return null for unsupported language codes
return null;
}
};
2023-11-23 01:04:20 +00:00
let languageNames = {};
2023-11-23 01:04:20 +00:00
locale.subscribe(() => {
let newLanguageNames = new Intl.DisplayNames([$locale], { type: 'language' });
2023-11-23 01:04:20 +00:00
for (let l: string of $locales) {
languageNames[l] = newLanguageNames.of(l);
}
});
2023-11-17 00:05:35 +00:00
</script>
<Navbar expand="md">
<NavbarBrand>&#8383;TClock</NavbarBrand>
<Collapse navbar expand="md">
<Nav class="me-auto" navbar>
<NavItem>
<NavLink href="/" active={$page.url.pathname === '/'}>Home</NavLink>
2023-11-17 00:05:35 +00:00
</NavItem>
<NavItem>
<NavLink href="/api" active={$page.url.pathname === '/api'}>API</NavLink>
2023-11-17 00:05:35 +00:00
</NavItem>
</Nav>
2023-11-23 01:04:20 +00:00
{#if !$isLoading}
2023-11-24 23:42:37 +00:00
<Dropdown id="nav-language-dropdown" inNavbar>
2023-11-23 01:14:12 +00:00
<DropdownToggle nav caret>{getFlagEmoji($locale)} {languageNames[$locale]}</DropdownToggle>
<DropdownMenu end>
{#each $locales as locale}
<DropdownItem on:click={setLocale(locale)}
>{getFlagEmoji(locale)} {languageNames[locale]}</DropdownItem
>
{/each}
</DropdownMenu>
</Dropdown>
2023-11-23 01:04:20 +00:00
{/if}
2023-11-17 00:05:35 +00:00
</Collapse>
</Navbar>
<!-- +layout.svelte -->
<slot />