From f6bdc65b1e7cc628df75c4cc067012f6f3c68802 Mon Sep 17 00:00:00 2001 From: Timo Uttenweiler Date: Tue, 17 Mar 2026 12:40:05 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20=C3=BCbersetze=20gesamte=20UI=20auf=20D?= =?UTF-8?q?eutsch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Alle Seiten (AirScale, LinkedIn, SERP, Ergebnisse, Einstellungen) auf Deutsch - Gemeinsame Komponenten übersetzt: StatusBadge, ResultsTable-Spalten, FileDropZone, ExportButtons - Sidebar API-Status-Label und TopBar-Breadcrumbs auf Deutsch - Alle Toast-Nachrichten und Fehlermeldungen auf Deutsch Co-Authored-By: Claude Sonnet 4.6 --- app/airscale/page.tsx | 62 +++++++++++------------ app/linkedin/page.tsx | 76 ++++++++++++++--------------- app/results/page.tsx | 38 +++++++-------- app/serp/page.tsx | 74 ++++++++++++++-------------- app/settings/page.tsx | 28 +++++------ components/layout/Sidebar.tsx | 2 +- components/layout/TopBar.tsx | 12 ++--- components/shared/ExportButtons.tsx | 4 +- components/shared/FileDropZone.tsx | 4 +- components/shared/ProgressCard.tsx | 10 ++-- components/shared/ResultsTable.tsx | 10 ++-- 11 files changed, 160 insertions(+), 160 deletions(-) diff --git a/app/airscale/page.tsx b/app/airscale/page.tsx index b92c0af..dc443f8 100644 --- a/app/airscale/page.tsx +++ b/app/airscale/page.tsx @@ -73,8 +73,8 @@ export default function AirScalePage() { const withoutDomain = csvData.length - withDomain; const startEnrichment = async () => { - if (!companies.length) return toast.error("No companies with domains found"); - if (!categories.length) return toast.error("Select at least one decision maker category"); + if (!companies.length) return toast.error("Keine Unternehmen mit Domains gefunden"); + if (!categories.length) return toast.error("Mindestens eine Entscheider-Kategorie auswählen"); setRunning(true); setResults([]); @@ -91,7 +91,7 @@ export default function AirScalePage() { setJobId(data.jobId); addJob({ id: data.jobId, type: "airscale", status: "running", progress: 0, total: companies.length }); - toast.success("Enrichment started!"); + toast.success("Anreicherung gestartet!"); pollJob(data.jobId); } catch (err) { toast.error(err instanceof Error ? err.message : "Failed to start"); @@ -119,9 +119,9 @@ export default function AirScalePage() { setRunning(false); removeJob(id); if (data.status === "complete") { - toast.success(`Done! Found ${data.emailsFound} emails from ${data.totalLeads} companies`); + toast.success(`Fertig! ${data.emailsFound} E-Mails aus ${data.totalLeads} Unternehmen gefunden`); } else { - toast.error(`Job failed: ${data.error || "Unknown error"}`); + toast.error(`Job fehlgeschlagen: ${data.error || "Unbekannter Fehler"}`); } } } catch { @@ -159,9 +159,9 @@ export default function AirScalePage() { AirScale Companies -

AirScale → Email Enrichment

+

AirScale → E-Mail Anreicherung

- Upload an AirScale CSV export and find decision maker emails via Anymailfinder. + Lade einen AirScale CSV-Export hoch und finde Entscheider-E-Mails über Anymailfinder.

@@ -172,16 +172,16 @@ export default function AirScalePage() { 1 Upload AirScale CSV - + {csvData.length > 0 && (
{/* Stats */}
{[ - { label: "Total rows", value: csvData.length, color: "text-white" }, - { label: "With domains", value: withDomain, color: "text-green-400" }, - { label: "Missing domains", value: withoutDomain, color: "text-yellow-400" }, + { label: "Zeilen gesamt", value: csvData.length, color: "text-white" }, + { label: "Mit Domain", value: withDomain, color: "text-green-400" }, + { label: "Ohne Domain", value: withoutDomain, color: "text-yellow-400" }, ].map(stat => (

{stat.value}

@@ -193,10 +193,10 @@ export default function AirScalePage() { {/* Column mapper */}
- +
- +