feat: übersetze gesamte UI auf Deutsch
- 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 <noreply@anthropic.com>
This commit is contained in:
@@ -52,7 +52,7 @@ export default function ResultsPage() {
|
||||
setJobs(data.jobs || []);
|
||||
setStats(data.stats || { totalLeads: 0, totalEmails: 0, avgHitRate: 0, totalJobs: 0 });
|
||||
} catch {
|
||||
toast.error("Failed to load job history");
|
||||
toast.error("Job-Verlauf konnte nicht geladen werden");
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
@@ -62,9 +62,9 @@ export default function ResultsPage() {
|
||||
try {
|
||||
await fetch(`/api/jobs/${id}`, { method: "DELETE" });
|
||||
setJobs(prev => prev.filter(j => j.id !== id));
|
||||
toast.success("Job deleted");
|
||||
toast.success("Job gelöscht");
|
||||
} catch {
|
||||
toast.error("Failed to delete job");
|
||||
toast.error("Job konnte nicht gelöscht werden");
|
||||
}
|
||||
};
|
||||
|
||||
@@ -81,18 +81,18 @@ export default function ResultsPage() {
|
||||
<div className="relative rounded-2xl bg-gradient-to-r from-green-600/10 to-blue-600/10 border border-[#1e1e2e] p-6 overflow-hidden">
|
||||
<div className="absolute inset-0 bg-gradient-to-br from-green-500/5 to-transparent" />
|
||||
<div className="relative">
|
||||
<h1 className="text-2xl font-bold text-white">Results & History</h1>
|
||||
<p className="text-gray-400 mt-1 text-sm">All past enrichment jobs and their results.</p>
|
||||
<h1 className="text-2xl font-bold text-white">Ergebnisse & Verlauf</h1>
|
||||
<p className="text-gray-400 mt-1 text-sm">Alle vergangenen Anreicherungsjobs und ihre Ergebnisse.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Stats cards */}
|
||||
<div className="grid grid-cols-4 gap-4">
|
||||
{[
|
||||
{ label: "Total Jobs", value: stats.totalJobs, color: "text-white" },
|
||||
{ label: "Total Leads", value: stats.totalLeads.toLocaleString(), color: "text-blue-400" },
|
||||
{ label: "Emails Found", value: stats.totalEmails.toLocaleString(), color: "text-green-400" },
|
||||
{ label: "Avg Hit Rate", value: `${stats.avgHitRate}%`, color: "text-purple-400" },
|
||||
{ label: "Jobs gesamt", value: stats.totalJobs, color: "text-white" },
|
||||
{ label: "Leads gesamt", value: stats.totalLeads.toLocaleString(), color: "text-blue-400" },
|
||||
{ label: "E-Mails gefunden", value: stats.totalEmails.toLocaleString(), color: "text-green-400" },
|
||||
{ label: "Ø Trefferquote", value: `${stats.avgHitRate}%`, color: "text-purple-400" },
|
||||
].map(stat => (
|
||||
<Card key={stat.label} className="bg-[#111118] border-[#1e1e2e] p-5">
|
||||
<p className={`text-2xl font-bold ${stat.color}`}>{stat.value}</p>
|
||||
@@ -104,14 +104,14 @@ export default function ResultsPage() {
|
||||
{/* Jobs table */}
|
||||
<Card className="bg-[#111118] border-[#1e1e2e] overflow-hidden">
|
||||
<div className="flex items-center justify-between px-6 py-4 border-b border-[#1e1e2e]">
|
||||
<h2 className="font-semibold text-white">Job History</h2>
|
||||
<h2 className="font-semibold text-white">Job-Verlauf</h2>
|
||||
<Button
|
||||
variant="outline"
|
||||
size="sm"
|
||||
onClick={loadJobs}
|
||||
className="border-[#2e2e3e] text-gray-300 hover:bg-[#1a1a28]"
|
||||
>
|
||||
<RefreshCw className="w-3.5 h-3.5 mr-1.5" /> Refresh
|
||||
<RefreshCw className="w-3.5 h-3.5 mr-1.5" /> Aktualisieren
|
||||
</Button>
|
||||
</div>
|
||||
|
||||
@@ -124,22 +124,22 @@ export default function ResultsPage() {
|
||||
) : jobs.length === 0 ? (
|
||||
<EmptyState
|
||||
icon={BarChart3}
|
||||
title="No jobs yet"
|
||||
description="Run an enrichment job from any of the pipeline tabs to see results here."
|
||||
title="Noch keine Jobs"
|
||||
description="Starte einen Anreicherungsjob über einen der Pipeline-Tabs, um Ergebnisse zu sehen."
|
||||
/>
|
||||
) : (
|
||||
<div className="overflow-x-auto">
|
||||
<table className="w-full text-sm">
|
||||
<thead>
|
||||
<tr className="border-b border-[#1e1e2e] bg-[#0d0d18]">
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Type</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Job ID</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Started</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Typ</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Job-ID</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Gestartet</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Status</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Leads</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Emails</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Hit Rate</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Actions</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">E-Mails</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Trefferquote</th>
|
||||
<th className="px-4 py-3 text-left text-xs font-medium text-gray-400 uppercase tracking-wider">Aktionen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
Reference in New Issue
Block a user