From 74bf49552babfc5f181a667f2b68dcd133d2ccc6 Mon Sep 17 00:00:00 2001 From: Marcel Date: Fri, 27 Mar 2026 17:03:40 +0100 Subject: [PATCH] refactor: extract LanguageSwitcher into a reusable component Removes duplicated locale logic from +layout.svelte and AppNav.svelte. Context-specific sizing (text-xs/min-h-[44px]) stays in the wrapper via [&_button]: selectors so the component itself is layout-agnostic. Co-Authored-By: Claude Sonnet 4.6 --- .../lib/components/LanguageSwitcher.svelte | 18 +++++++++++++++ frontend/src/routes/+layout.svelte | 23 ++++--------------- frontend/src/routes/AppNav.svelte | 23 ++++--------------- 3 files changed, 28 insertions(+), 36 deletions(-) create mode 100644 frontend/src/lib/components/LanguageSwitcher.svelte diff --git a/frontend/src/lib/components/LanguageSwitcher.svelte b/frontend/src/lib/components/LanguageSwitcher.svelte new file mode 100644 index 00000000..e14029db --- /dev/null +++ b/frontend/src/lib/components/LanguageSwitcher.svelte @@ -0,0 +1,18 @@ + + +{#each locales as locale (locale)} + +{/each} diff --git a/frontend/src/routes/+layout.svelte b/frontend/src/routes/+layout.svelte index b213ae32..3dac8238 100644 --- a/frontend/src/routes/+layout.svelte +++ b/frontend/src/routes/+layout.svelte @@ -2,17 +2,13 @@ import './layout.css'; import { page } from '$app/state'; import { onMount } from 'svelte'; -import { setLocale, getLocale } from '$lib/paraglide/runtime'; +import LanguageSwitcher from '$lib/components/LanguageSwitcher.svelte'; import ThemeToggle from '$lib/components/ThemeToggle.svelte'; import AppNav from './AppNav.svelte'; import UserMenu from './UserMenu.svelte'; let { children, data } = $props(); -const locales = ['DE', 'EN', 'ES'] as const; -const localeMap = { DE: 'de', EN: 'en', ES: 'es' } as const; -const activeLocale = $derived(getLocale().toUpperCase()); - const isAdmin = $derived( data?.user?.groups?.some((g: { permissions: string[] }) => g.permissions.includes('ADMIN')) ); @@ -47,19 +43,10 @@ const userInitials = $derived.by(() => {
-