feat(phase2): localization EN/RU + additional widget types

- Add svelte-i18n with 224 translation keys (English + Russian)
- Language switcher in header (EN/RU toggle, persists to localStorage)
- Extract all hardcoded strings from 37 component/page files
- Add 4 new widget types: Bookmark, Note (markdown), Embed (iframe), Status
- WidgetRenderer dispatches by type, WidgetGrid supports full-width widgets
- Type-specific config forms in board editor
- Install marked for markdown rendering
This commit is contained in:
2026-03-24 23:18:05 +03:00
parent bf4e5089ee
commit 477c0e4d52
52 changed files with 1776 additions and 395 deletions
+6 -5
View File
@@ -1,32 +1,33 @@
<script lang="ts">
import { t } from 'svelte-i18n';
import type { PageData } from './$types.js';
let { data }: { data: PageData } = $props();
</script>
<svelte:head>
<title>Web App Launcher</title>
<title>{$t('app_title')}</title>
</svelte:head>
<div class="flex min-h-[60vh] items-center justify-center p-6">
<div class="text-center">
<h1 class="text-4xl font-bold text-foreground">Web App Launcher</h1>
<h1 class="text-4xl font-bold text-foreground">{$t('app_title')}</h1>
{#if data.user}
<p class="mt-4 text-muted-foreground">
Welcome, {data.user.displayName}. No default board is configured yet.
{$t('home.welcome', { values: { name: data.user.displayName } })}
</p>
<div class="mt-6 flex items-center justify-center gap-3">
<a
href="/boards"
class="rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90"
>
View Boards
{$t('home.view_boards')}
</a>
<a
href="/apps"
class="rounded-md border border-border px-4 py-2 text-sm font-medium text-foreground hover:bg-accent"
>
Browse Apps
{$t('home.browse_apps')}
</a>
</div>
{/if}