From 899fccd45504de75fea56ef9245e7ef312da8df9 Mon Sep 17 00:00:00 2001 From: Till JS Date: Mon, 27 Apr 2026 01:03:00 +0200 Subject: [PATCH] =?UTF-8?q?i18n(uload):=20wire=20components=20+=20routes?= =?UTF-8?q?=20to=20namespace=20=E2=80=94=2067=20strings=20cleared?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Patches ListView, DetailView, /uload root page, /uload/links, /uload/analytics/[id], /uload/settings, /uload/tags. Locale JSONs landed in 812f3f7fa. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../web/src/routes/(app)/uload/+page.svelte | 178 ++++++++++-------- .../(app)/uload/analytics/[id]/+page.svelte | 128 +++++++++---- .../src/routes/(app)/uload/links/+page.svelte | 62 +++--- .../routes/(app)/uload/settings/+page.svelte | 35 ++-- .../src/routes/(app)/uload/tags/+page.svelte | 33 ++-- scripts/i18n-hardcoded-baseline.json | 7 - 6 files changed, 266 insertions(+), 177 deletions(-) diff --git a/apps/mana/apps/web/src/routes/(app)/uload/+page.svelte b/apps/mana/apps/web/src/routes/(app)/uload/+page.svelte index 4cf87cb2e..b088d74b0 100644 --- a/apps/mana/apps/web/src/routes/(app)/uload/+page.svelte +++ b/apps/mana/apps/web/src/routes/(app)/uload/+page.svelte @@ -117,30 +117,30 @@ if (!newUrl) return; if (!isValidUrl(newUrl)) { - toast.error('Bitte eine gueltige URL eingeben (mit https://)'); + toast.error($_('uload.page.err_invalid_url_input')); return; } const shortCode = newCustomCode || generateShortCode(); if (newCustomCode && !isValidCustomCode(newCustomCode)) { - toast.error('Custom Code darf nur Buchstaben, Zahlen, - und _ enthalten'); + toast.error($_('uload.page.err_invalid_custom_code')); return; } if (!(await isShortCodeUnique(shortCode))) { - toast.error(`Short Code "${shortCode}" ist bereits vergeben`); + toast.error($_('uload.page.err_short_code_taken', { values: { code: shortCode } })); return; } const maxClicks = newMaxClicks ? parseInt(newMaxClicks) : null; if (maxClicks !== null && maxClicks < 1) { - toast.error('Max Klicks muss mindestens 1 sein'); + toast.error($_('uload.page.err_max_clicks')); return; } if (newExpiresAt && new Date(newExpiresAt) <= new Date()) { - toast.error('Ablaufdatum muss in der Zukunft liegen'); + toast.error($_('uload.page.err_expires_past')); return; } @@ -165,7 +165,7 @@ }; await encryptRecord('links', newRow); await linkTable.add(newRow); - toast.success(`Link erstellt: ${shortCode}`); + toast.success($_('uload.page.toast_created', { values: { code: shortCode } })); newUrl = ''; newTitle = ''; newCustomCode = ''; @@ -195,18 +195,18 @@ if (!editingLink || !editUrl) return; if (!isValidUrl(editUrl)) { - toast.error('Bitte eine gueltige URL eingeben (mit https://)'); + toast.error($_('uload.page.err_invalid_url_input')); return; } const maxClicks = editMaxClicks ? parseInt(editMaxClicks) : null; if (maxClicks !== null && maxClicks < 1) { - toast.error('Max Klicks muss mindestens 1 sein'); + toast.error($_('uload.page.err_max_clicks')); return; } if (editExpiresAt && new Date(editExpiresAt) <= new Date()) { - toast.error('Ablaufdatum muss in der Zukunft liegen'); + toast.error($_('uload.page.err_expires_past')); return; } @@ -222,7 +222,7 @@ }; await encryptRecord('links', diff); await linkTable.update(editingLink.id, diff); - toast.success('Link aktualisiert'); + toast.success($_('uload.page.toast_updated')); editingLink = null; } @@ -231,14 +231,15 @@ } async function deleteLink(link: Link) { - if (!confirm(`"${link.title || link.shortCode}" wirklich loeschen?`)) return; + const name = link.title || link.shortCode; + if (!confirm($_('uload.page.confirm_delete', { values: { name } }))) return; await linkTable.delete(link.id); - toast.success('Link geloescht'); + toast.success($_('uload.page.toast_deleted')); } function copyShortUrl(code: string) { navigator.clipboard.writeText(getShortUrl(code)); - toast.success('Link kopiert!'); + toast.success($_('uload.page.toast_copied')); } function downloadQr(code: string) { @@ -256,7 +257,7 @@ - uLoad - Mana + {$_('uload.page.title')} @@ -267,10 +268,13 @@

uLoad

- {filteredLinks.length} Links - {#if folders.length > 0} - · {folders.length} Ordner - {/if} + {folders.length > 0 + ? $_('uload.page.counts', { + values: { links: filteredLinks.length, folders: folders.length }, + }) + : $_('uload.page.counts_no_folders', { + values: { links: filteredLinks.length }, + })}

@@ -278,13 +282,13 @@ href="/uload/links" class="rounded-lg border border-border-strong px-3 py-2 text-sm font-medium hover:bg-muted dark:border-border dark:hover:bg-muted" > - Alle Links + {$_('uload.page.all_links')}
@@ -296,7 +300,9 @@ >
- +
- +
- {$_('uload.page.label_custom_code')}
@@ -337,13 +346,13 @@ - Erweitert + {$_('uload.page.section_advanced')} {#if showAdvanced}
{$_('uload.page.label_expires')}
{$_('uload.page.label_password')}
{$_('uload.page.label_max_clicks')} @@ -388,43 +397,43 @@ - UTM-Parameter + {$_('uload.page.section_utm')} {#if showUtm}
{$_('uload.page.label_source')}
{$_('uload.page.label_medium')}
{$_('uload.page.label_campaign')}
@@ -437,7 +446,7 @@ disabled={!newUrl} class="rounded-lg bg-indigo-600 px-6 py-2.5 font-medium text-white transition-colors hover:bg-indigo-700 disabled:cursor-not-allowed disabled:opacity-50" > - Link erstellen + {$_('uload.page.action_create')}
@@ -453,18 +462,18 @@
{#if folders.length > 0}
- +
- +
/{editingLink.shortCode} - (nicht aenderbar) + {$_('uload.page.short_code_locked')}
-

UTM-Parameter

+

{$_('uload.page.section_utm')}

-

Erweitert

+

{$_('uload.page.section_advanced')}

- {$_('uload.page.label_expires')}
- +
- + @@ -713,14 +737,14 @@ onclick={() => (editingLink = null)} class="rounded-lg border border-border-strong px-4 py-2 text-sm font-medium hover:bg-muted dark:border-border dark:hover:bg-muted" > - Abbrechen + {$_('uload.page.action_cancel')}
@@ -742,7 +766,7 @@ role="none" >
-

QR-Code

+

{$_('uload.page.modal_qr_title')}

diff --git a/apps/mana/apps/web/src/routes/(app)/uload/analytics/[id]/+page.svelte b/apps/mana/apps/web/src/routes/(app)/uload/analytics/[id]/+page.svelte index eb8f8455c..5df24cf41 100644 --- a/apps/mana/apps/web/src/routes/(app)/uload/analytics/[id]/+page.svelte +++ b/apps/mana/apps/web/src/routes/(app)/uload/analytics/[id]/+page.svelte @@ -1,4 +1,5 @@ - Analytics - uLoad - Mana + {$_('uload.analytics_route.title')} - +
- +
-

Analytics

+

{$_('uload.analytics_route.heading')}

{#if link}

/{link.shortCode} @@ -100,35 +105,45 @@

{:else if !link}
-

Link nicht gefunden

+

{$_('uload.analytics_route.not_found')}

{:else}
-

Clicks

+

+ {$_('uload.analytics_route.stat_clicks')} +

{stats?.totalClicks ?? link.clickCount}

-

Unique

+

+ {$_('uload.analytics_route.stat_unique')} +

{stats?.uniqueVisitors ?? '-'}

-

Status

+

+ {$_('uload.analytics_route.stat_status')} +

{#if link.isActive} - Aktiv + {$_('uload.analytics_route.status_active')} {:else} - Inaktiv + {$_('uload.analytics_route.status_inactive')} {/if}

-

Erstellt

+

+ {$_('uload.analytics_route.stat_created')} +

{formatDate(new Date(link.createdAt))}

@@ -137,10 +152,13 @@
-

Link Details

+

+ {$_('uload.analytics_route.section_details')} +

- Ziel-URL + {$_('uload.analytics_route.label_target_url')} {#if link.title}
- Titel + {$_('uload.analytics_route.label_title')} {link.title}
{/if} {#if link.utmSource || link.utmMedium || link.utmCampaign}

- UTM-Parameter + {$_('uload.analytics_route.label_utm_params')}

{#if link.utmSource}
- Source: + {$_('uload.analytics_route.utm_source')} {link.utmSource}
{/if} {#if link.utmMedium}
- Medium: + {$_('uload.analytics_route.utm_medium')} {link.utmMedium}
{/if} {#if link.utmCampaign}
- Campaign: + {$_('uload.analytics_route.utm_campaign')} {link.utmCampaign}
{/if} @@ -185,20 +209,30 @@ {/if} {#if link.expiresAt}
- Laeuft ab + {$_('uload.analytics_route.label_expires_at')} {formatDate(new Date(link.expiresAt))}
{/if} {#if link.maxClicks}
- Max Klicks - {link.clickCount} / {link.maxClicks} + {$_('uload.analytics_route.label_max_clicks')} + {$_('uload.analytics_route.max_clicks_value', { + values: { used: link.clickCount, max: link.maxClicks }, + })}
{/if} {#if link.password}
- Passwortgeschuetzt - Ja + {$_('uload.analytics_route.label_password_protected')} + {$_('uload.analytics_route.yes')}
{/if}
@@ -207,7 +241,9 @@
-

Clicks ueber Zeit

+

+ {$_('uload.analytics_route.section_timeline')} +

{#each [7, 30, 90] as d} {/each}
@@ -244,15 +280,17 @@ {:else if !serverAvailable}

- Detaillierte Analytics sind verfuegbar, wenn der uLoad-Server verbunden ist. + {$_('uload.analytics_route.hint_no_server')}

- Lokaler Click-Count: {link.clickCount} + {$_('uload.analytics_route.hint_local_count', { + values: { count: link.clickCount }, + })}

{:else}

- Noch keine Daten fuer diesen Zeitraum + {$_('uload.analytics_route.empty_period')}

{/if}
@@ -262,13 +300,17 @@
-

Geraete

+

+ {$_('uload.analytics_route.section_devices')} +

{#if devices.length > 0}
{#each devices as d}
- {d.deviceType || 'Unbekannt'} + {d.deviceType || $_('uload.analytics_route.unknown')} {Math.round((d.count / totalDevices) * 100)}% @@ -283,38 +325,48 @@ {/each}
{:else} -

Keine Daten

+

+ {$_('uload.analytics_route.empty_no_data')} +

{/if}
-

Referrer

+

+ {$_('uload.analytics_route.section_referrers')} +

{#if referrers.length > 0}
{#each referrers.slice(0, 8) as r}
- {r.referer || 'Direkt'} + {r.referer || $_('uload.analytics_route.direct')} {r.count}
{/each}
{:else} -

Keine Daten

+

+ {$_('uload.analytics_route.empty_no_data')} +

{/if}
-

Laender

+

+ {$_('uload.analytics_route.section_countries')} +

{#if countries.length > 0}
{#each countries.slice(0, 8) as c}
- {c.country || 'Unbekannt'} + {c.country || $_('uload.analytics_route.unknown')} {Math.round((c.count / totalCountries) * 100)}% @@ -329,7 +381,9 @@ {/each}
{:else} -

Keine Daten

+

+ {$_('uload.analytics_route.empty_no_data')} +

{/if}
diff --git a/apps/mana/apps/web/src/routes/(app)/uload/links/+page.svelte b/apps/mana/apps/web/src/routes/(app)/uload/links/+page.svelte index 05f386a00..7c85301ed 100644 --- a/apps/mana/apps/web/src/routes/(app)/uload/links/+page.svelte +++ b/apps/mana/apps/web/src/routes/(app)/uload/links/+page.svelte @@ -1,4 +1,5 @@ - Alle Links - uLoad - Mana + {$_('uload.links_route.title')} @@ -139,13 +143,13 @@

- Alle Links + {$_('uload.links_route.heading')} {#if filteredLinks.length > 0} ({filteredLinks.length}) {/if} @@ -165,7 +169,9 @@ ? 'bg-indigo-600 text-white' : 'hover:bg-muted dark:border-border dark:hover:bg-muted'}" > - {selectMode ? 'Fertig' : 'Auswaehlen'} + {selectMode + ? $_('uload.links_route.action_select_done') + : $_('uload.links_route.action_select_start')}

@@ -180,18 +186,18 @@
{#if folders.length > 0} e.key === 'Enter' && createTag()} />
{$_('uload.tags_route.label_color')} - Erstellen + {$_('uload.tags_route.action_create')}
@@ -109,9 +110,11 @@ {#if !tags.value || tags.value.length === 0}
-

Noch keine Tags

+

+ {$_('uload.tags_route.empty_title')} +

- Erstelle Tags um deine Links zu organisieren. + {$_('uload.tags_route.empty_desc')}

{:else} @@ -151,7 +154,11 @@ {tag.name}
- {getUsageCount(tag.id)} Links + {$_('uload.tags_route.links_count', { + values: { count: getUsageCount(tag.id) }, + })}