From fe6ec6e0afc9e48fddc7308290f8a42c34127226 Mon Sep 17 00:00:00 2001 From: AlacrisDevs Date: Sat, 7 Feb 2026 10:16:13 +0200 Subject: [PATCH] i18n: add Paraglide messages for all events pages (EN + ET) --- messages/en.json | 71 +++++++++++++- messages/et.json | 71 +++++++++++++- src/routes/[orgSlug]/+layout.svelte | 2 +- src/routes/[orgSlug]/events/+page.svelte | 63 ++++++------ .../events/[eventSlug]/+layout.svelte | 21 ++-- .../[orgSlug]/events/[eventSlug]/+page.svelte | 98 +++++++++---------- 6 files changed, 232 insertions(+), 94 deletions(-) diff --git a/messages/en.json b/messages/en.json index bdd2a21..2f9bed3 100644 --- a/messages/en.json +++ b/messages/en.json @@ -251,5 +251,74 @@ "entity_kanban_column": "column", "entity_member": "member", "entity_role": "role", - "entity_invite": "invite" + "entity_invite": "invite", + "entity_event": "event", + "nav_events": "Events", + "events_title": "Events", + "events_subtitle": "Organize and manage your events", + "events_new": "New Event", + "events_create": "Create Event", + "events_empty_title": "No events yet", + "events_empty_desc": "Create your first event to get started", + "events_no_dates": "No dates set", + "events_tab_all": "All Events", + "events_tab_planning": "Planning", + "events_tab_active": "Active", + "events_tab_completed": "Completed", + "events_tab_archived": "Archived", + "events_status_planning": "Planning", + "events_status_active": "Active", + "events_status_completed": "Completed", + "events_status_archived": "Archived", + "events_form_name": "Event Name", + "events_form_name_placeholder": "e.g., Summer Conference 2026", + "events_form_description": "Description", + "events_form_description_placeholder": "Brief description of the event...", + "events_form_start_date": "Start Date", + "events_form_end_date": "End Date", + "events_form_venue": "Venue", + "events_form_venue_placeholder": "e.g., Convention Center", + "events_form_venue_address_placeholder": "Venue address", + "events_form_color": "Color", + "events_form_select_color": "Select color {color}", + "events_creating": "Creating...", + "events_saving": "Saving...", + "events_deleting": "Deleting...", + "events_updated": "Event updated", + "events_created": "Event \"{name}\" created", + "events_deleted": "Event deleted", + "events_delete_title": "Delete Event?", + "events_delete_desc": "This will permanently delete {name} and all its data. This action cannot be undone.", + "events_delete_confirm": "Delete Event", + "events_days_ago": "{count} days ago", + "events_today": "Today!", + "events_tomorrow": "Tomorrow", + "events_in_days": "In {count} days", + "events_overview": "Overview", + "events_modules": "Modules", + "events_details": "Event Details", + "events_start_date": "Start Date", + "events_end_date": "End Date", + "events_venue": "Venue", + "events_not_set": "Not set", + "events_all_events": "All Events", + "events_team": "Team", + "events_team_count": "Team ({count})", + "events_team_manage": "Manage", + "events_team_empty": "No team members assigned yet", + "events_more_members": "+{count} more", + "events_mod_tasks": "Tasks", + "events_mod_tasks_desc": "Manage tasks, milestones, and progress", + "events_mod_files": "Files", + "events_mod_files_desc": "Documents, contracts, and media", + "events_mod_schedule": "Schedule", + "events_mod_schedule_desc": "Event timeline and program", + "events_mod_budget": "Budget", + "events_mod_budget_desc": "Income, expenses, and tracking", + "events_mod_guests": "Guests", + "events_mod_guests_desc": "Guest list and registration", + "events_mod_team": "Team", + "events_mod_team_desc": "Team members and shift scheduling", + "events_mod_sponsors": "Sponsors", + "events_mod_sponsors_desc": "Sponsors, partners, and deliverables" } \ No newline at end of file diff --git a/messages/et.json b/messages/et.json index deba226..b3be0d3 100644 --- a/messages/et.json +++ b/messages/et.json @@ -251,5 +251,74 @@ "entity_kanban_column": "veeru", "entity_member": "liikme", "entity_role": "rolli", - "entity_invite": "kutse" + "entity_invite": "kutse", + "entity_event": "ürituse", + "nav_events": "Üritused", + "events_title": "Üritused", + "events_subtitle": "Korralda ja halda oma üritusi", + "events_new": "Uus üritus", + "events_create": "Loo üritus", + "events_empty_title": "Üritusi pole veel", + "events_empty_desc": "Loo oma esimene üritus alustamiseks", + "events_no_dates": "Kuupäevad määramata", + "events_tab_all": "Kõik üritused", + "events_tab_planning": "Planeerimisel", + "events_tab_active": "Aktiivne", + "events_tab_completed": "Lõpetatud", + "events_tab_archived": "Arhiveeritud", + "events_status_planning": "Planeerimisel", + "events_status_active": "Aktiivne", + "events_status_completed": "Lõpetatud", + "events_status_archived": "Arhiveeritud", + "events_form_name": "Ürituse nimi", + "events_form_name_placeholder": "nt Suvekonverents 2026", + "events_form_description": "Kirjeldus", + "events_form_description_placeholder": "Ürituse lühikirjeldus...", + "events_form_start_date": "Alguskuupäev", + "events_form_end_date": "Lõppkuupäev", + "events_form_venue": "Toimumiskoht", + "events_form_venue_placeholder": "nt Konverentsikeskus", + "events_form_venue_address_placeholder": "Toimumiskoha aadress", + "events_form_color": "Värv", + "events_form_select_color": "Vali värv {color}", + "events_creating": "Loomine...", + "events_saving": "Salvestamine...", + "events_deleting": "Kustutamine...", + "events_updated": "Üritus uuendatud", + "events_created": "Üritus \"{name}\" loodud", + "events_deleted": "Üritus kustutatud", + "events_delete_title": "Kustuta üritus?", + "events_delete_desc": "See kustutab jäädavalt ürituse {name} ja kõik selle andmed. Seda toimingut ei saa tagasi võtta.", + "events_delete_confirm": "Kustuta üritus", + "events_days_ago": "{count} päeva tagasi", + "events_today": "Täna!", + "events_tomorrow": "Homme", + "events_in_days": "{count} päeva pärast", + "events_overview": "Ülevaade", + "events_modules": "Moodulid", + "events_details": "Ürituse andmed", + "events_start_date": "Alguskuupäev", + "events_end_date": "Lõppkuupäev", + "events_venue": "Toimumiskoht", + "events_not_set": "Määramata", + "events_all_events": "Kõik üritused", + "events_team": "Meeskond", + "events_team_count": "Meeskond ({count})", + "events_team_manage": "Halda", + "events_team_empty": "Meeskonnaliikmeid pole veel määratud", + "events_more_members": "+{count} veel", + "events_mod_tasks": "Ülesanded", + "events_mod_tasks_desc": "Halda ülesandeid, verstaposte ja edenemist", + "events_mod_files": "Failid", + "events_mod_files_desc": "Dokumendid, lepingud ja meedia", + "events_mod_schedule": "Ajakava", + "events_mod_schedule_desc": "Ürituse ajakava ja programm", + "events_mod_budget": "Eelarve", + "events_mod_budget_desc": "Tulud, kulud ja jälgimine", + "events_mod_guests": "Külalised", + "events_mod_guests_desc": "Külaliste nimekiri ja registreerimine", + "events_mod_team": "Meeskond", + "events_mod_team_desc": "Meeskonnaliikmed ja vahetuste planeerimine", + "events_mod_sponsors": "Sponsorid", + "events_mod_sponsors_desc": "Sponsorid, partnerid ja kohustused" } \ No newline at end of file diff --git a/src/routes/[orgSlug]/+layout.svelte b/src/routes/[orgSlug]/+layout.svelte index 51a7d42..9cffd9e 100644 --- a/src/routes/[orgSlug]/+layout.svelte +++ b/src/routes/[orgSlug]/+layout.svelte @@ -125,7 +125,7 @@ : []), { href: `/${data.org.slug}/events`, - label: "Events", + label: m.nav_events(), icon: "celebration", }, { diff --git a/src/routes/[orgSlug]/events/+page.svelte b/src/routes/[orgSlug]/events/+page.svelte index e1d0e80..16bd286 100644 --- a/src/routes/[orgSlug]/events/+page.svelte +++ b/src/routes/[orgSlug]/events/+page.svelte @@ -6,6 +6,7 @@ import type { SupabaseClient } from "@supabase/supabase-js"; import type { Database } from "$lib/supabase/types"; import { toasts } from "$lib/stores/ui"; + import * as m from "$lib/paraglide/messages"; interface EventItem { id: string; @@ -48,13 +49,13 @@ let newEventColor = $state("#00A3E0"); let creating = $state(false); - const statusTabs = [ - { value: "all", label: "All Events", icon: "apps" }, - { value: "planning", label: "Planning", icon: "edit_note" }, - { value: "active", label: "Active", icon: "play_circle" }, - { value: "completed", label: "Completed", icon: "check_circle" }, - { value: "archived", label: "Archived", icon: "archive" }, - ]; + const statusTabs = $derived([ + { value: "all", label: m.events_tab_all(), icon: "apps" }, + { value: "planning", label: m.events_tab_planning(), icon: "edit_note" }, + { value: "active", label: m.events_tab_active(), icon: "play_circle" }, + { value: "completed", label: m.events_tab_completed(), icon: "check_circle" }, + { value: "archived", label: m.events_tab_archived(), icon: "archive" }, + ]); const presetColors = [ "#00A3E0", @@ -100,7 +101,7 @@ start: string | null, end: string | null, ): string { - if (!start && !end) return "No dates set"; + if (!start && !end) return m.events_no_dates(); if (start && !end) return formatDate(start); if (!start && end) return `Until ${formatDate(end)}`; return `${formatDate(start)} — ${formatDate(end)}`; @@ -134,7 +135,7 @@ if (error) throw error; - toasts.success(`Event "${created.name}" created`); + toasts.success(m.events_created({ name: created.name })); showCreateModal = false; resetForm(); goto(`/${data.org.slug}/events/${created.slug}`); @@ -166,7 +167,7 @@ - Events | {data.org.name} + {m.events_title()} | {data.org.name}
@@ -175,9 +176,9 @@ class="flex items-center justify-between px-6 py-5 border-b border-light/5" >
-

Events

+

{m.events_title()}

- Organize and manage your events + {m.events_subtitle()}

{#if isEditor} @@ -191,7 +192,7 @@ style="font-size: 20px; font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 20;" >add - New Event + {m.events_new()} {/if} @@ -228,9 +229,9 @@ style="font-size: 64px; font-variation-settings: 'FILL' 0, 'wght' 300, 'GRAD' 0, 'opsz' 48;" >celebration -

No events yet

+

{m.events_empty_title()}

- Create your first event to get started + {m.events_empty_desc()}

{#if isEditor} {/if}
@@ -346,18 +347,18 @@ onclick={(e) => e.target === e.currentTarget && (showCreateModal = false)} role="dialog" aria-modal="true" - aria-label="Create Event" + aria-label={m.events_create()} >
-

Create Event

+

{m.events_create()}

@@ -457,7 +458,7 @@
{m.events_form_color()}
{#each presetColors as color} @@ -469,7 +470,7 @@ : 'border-transparent hover:border-light/30'}" style="background-color: {color}" onclick={() => (newEventColor = color)} - aria-label="Select color {color}" + aria-label={m.events_form_select_color({ color })} > {/each}
@@ -487,14 +488,14 @@ resetForm(); }} > - Cancel + {m.btn_cancel()}
diff --git a/src/routes/[orgSlug]/events/[eventSlug]/+layout.svelte b/src/routes/[orgSlug]/events/[eventSlug]/+layout.svelte index 006bbde..702a6bb 100644 --- a/src/routes/[orgSlug]/events/[eventSlug]/+layout.svelte +++ b/src/routes/[orgSlug]/events/[eventSlug]/+layout.svelte @@ -3,6 +3,7 @@ import { Avatar } from "$lib/components/ui"; import type { Snippet } from "svelte"; import type { Event, EventMember } from "$lib/api/events"; + import * as m from "$lib/paraglide/messages"; interface Props { data: { @@ -30,43 +31,43 @@ const modules = $derived([ { href: basePath, - label: "Overview", + label: m.events_overview(), icon: "dashboard", exact: true, }, { href: `${basePath}/tasks`, - label: "Tasks", + label: m.events_mod_tasks(), icon: "task_alt", }, { href: `${basePath}/files`, - label: "Files", + label: m.events_mod_files(), icon: "folder", }, { href: `${basePath}/schedule`, - label: "Schedule", + label: m.events_mod_schedule(), icon: "calendar_today", }, { href: `${basePath}/budget`, - label: "Budget", + label: m.events_mod_budget(), icon: "account_balance_wallet", }, { href: `${basePath}/guests`, - label: "Guests", + label: m.events_mod_guests(), icon: "groups", }, { href: `${basePath}/team`, - label: "Team", + label: m.events_mod_team(), icon: "badge", }, { href: `${basePath}/sponsors`, - label: "Sponsors", + label: m.events_mod_sponsors(), icon: "handshake", }, ]); @@ -155,7 +156,7 @@

- Team ({data.eventMembers.length}) + {m.events_team_count({ count: String(data.eventMembers.length) })}

{#each data.eventMembers.slice(0, 8) as member} @@ -189,7 +190,7 @@ style="font-size: 16px; font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 16;" >arrow_back - All Events + {m.events_all_events()} diff --git a/src/routes/[orgSlug]/events/[eventSlug]/+page.svelte b/src/routes/[orgSlug]/events/[eventSlug]/+page.svelte index 619c30a..a2832a3 100644 --- a/src/routes/[orgSlug]/events/[eventSlug]/+page.svelte +++ b/src/routes/[orgSlug]/events/[eventSlug]/+page.svelte @@ -6,6 +6,7 @@ import type { Database } from "$lib/supabase/types"; import { toasts } from "$lib/stores/ui"; import type { Event, EventMember } from "$lib/api/events"; + import * as m from "$lib/paraglide/messages"; interface Props { data: { @@ -63,74 +64,74 @@ `/${data.org.slug}/events/${data.event.slug}`, ); - const statusOptions = [ - { value: "planning", label: "Planning", icon: "edit_note", color: "text-amber-400" }, - { value: "active", label: "Active", icon: "play_circle", color: "text-emerald-400" }, - { value: "completed", label: "Completed", icon: "check_circle", color: "text-blue-400" }, - { value: "archived", label: "Archived", icon: "archive", color: "text-light/40" }, - ]; + const statusOptions = $derived([ + { value: "planning", label: m.events_status_planning(), icon: "edit_note", color: "text-amber-400" }, + { value: "active", label: m.events_status_active(), icon: "play_circle", color: "text-emerald-400" }, + { value: "completed", label: m.events_status_completed(), icon: "check_circle", color: "text-blue-400" }, + { value: "archived", label: m.events_status_archived(), icon: "archive", color: "text-light/40" }, + ]); const moduleCards = $derived([ { href: `${basePath}/tasks`, - label: "Tasks", + label: m.events_mod_tasks(), icon: "task_alt", - description: "Manage tasks, milestones, and progress", + description: m.events_mod_tasks_desc(), color: "text-emerald-400", bg: "bg-emerald-400/10", }, { href: `${basePath}/files`, - label: "Files", + label: m.events_mod_files(), icon: "folder", - description: "Documents, contracts, and media", + description: m.events_mod_files_desc(), color: "text-blue-400", bg: "bg-blue-400/10", }, { href: `${basePath}/schedule`, - label: "Schedule", + label: m.events_mod_schedule(), icon: "calendar_today", - description: "Event timeline and program", + description: m.events_mod_schedule_desc(), color: "text-purple-400", bg: "bg-purple-400/10", }, { href: `${basePath}/budget`, - label: "Budget", + label: m.events_mod_budget(), icon: "account_balance_wallet", - description: "Income, expenses, and tracking", + description: m.events_mod_budget_desc(), color: "text-amber-400", bg: "bg-amber-400/10", }, { href: `${basePath}/guests`, - label: "Guests", + label: m.events_mod_guests(), icon: "groups", - description: "Guest list and registration", + description: m.events_mod_guests_desc(), color: "text-pink-400", bg: "bg-pink-400/10", }, { href: `${basePath}/team`, - label: "Team", + label: m.events_mod_team(), icon: "badge", - description: "Team members and shift scheduling", + description: m.events_mod_team_desc(), color: "text-teal-400", bg: "bg-teal-400/10", }, { href: `${basePath}/sponsors`, - label: "Sponsors", + label: m.events_mod_sponsors(), icon: "handshake", - description: "Sponsors, partners, and deliverables", + description: m.events_mod_sponsors_desc(), color: "text-orange-400", bg: "bg-orange-400/10", }, ]); function formatDate(dateStr: string | null): string { - if (!dateStr) return "Not set"; + if (!dateStr) return m.events_not_set(); return new Date(dateStr).toLocaleDateString(undefined, { weekday: "short", month: "long", @@ -146,10 +147,10 @@ const diff = Math.ceil( (start.getTime() - now.getTime()) / (1000 * 60 * 60 * 24), ); - if (diff < 0) return `${Math.abs(diff)} days ago`; - if (diff === 0) return "Today!"; - if (diff === 1) return "Tomorrow"; - return `In ${diff} days`; + if (diff < 0) return m.events_days_ago({ count: String(Math.abs(diff)) }); + if (diff === 0) return m.events_today(); + if (diff === 1) return m.events_tomorrow(); + return m.events_in_days({ count: String(diff) }); } async function handleSave() { @@ -171,7 +172,7 @@ if (error) throw error; - toasts.success("Event updated"); + toasts.success(m.events_updated()); editing = false; // Refresh the page data goto(`/${data.org.slug}/events/${data.event.slug}`, { @@ -194,7 +195,7 @@ if (error) throw error; - toasts.success("Event deleted"); + toasts.success(m.events_deleted()); goto(`/${data.org.slug}/events`); } catch (e: any) { toasts.error(e.message || "Failed to delete event"); @@ -299,7 +300,7 @@ class="px-3 py-1.5 text-body-sm text-light/60 hover:text-white transition-colors" onclick={() => (editing = false)} > - Cancel + {m.btn_cancel()} {:else}
@@ -388,7 +389,7 @@ {/if} -

Modules

+

{m.events_modules()}

@@ -421,7 +422,7 @@

- Event Details + {m.events_details()}

@@ -432,7 +433,7 @@ >

- Start Date + {m.events_start_date()}

{formatDate(data.event.start_date)} @@ -446,7 +447,7 @@ >event

-

End Date

+

{m.events_end_date()}

{formatDate(data.event.end_date)}

@@ -460,7 +461,7 @@ >location_on
-

Venue

+

{m.events_venue()}

{data.event.venue_name}

@@ -479,12 +480,12 @@

- Team ({data.eventMembers.length}) + {m.events_team_count({ count: String(data.eventMembers.length) })}

Manage{m.events_team_manage()}
@@ -518,12 +519,12 @@ href="{basePath}/team" class="text-body-sm text-primary hover:underline text-center pt-1" > - +{data.eventMembers.length - 6} more + {m.events_more_members({ count: String(data.eventMembers.length - 6) })} {/if} {#if data.eventMembers.length === 0}

- No team members assigned yet + {m.events_team_empty()}

{/if}
@@ -543,17 +544,14 @@ e.target === e.currentTarget && (showDeleteConfirm = false)} role="dialog" aria-modal="true" - aria-label="Delete Event" + aria-label={m.events_delete_title()} >
-

Delete Event?

+

{m.events_delete_title()}

- This will permanently delete {data.event.name} - and all its data. This action cannot be undone. + {m.events_delete_desc({ name: data.event.name })}