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:
Timo Uttenweiler
2026-03-17 12:40:05 +01:00
parent 7486517827
commit f6bdc65b1e
11 changed files with 160 additions and 160 deletions

View File

@@ -104,7 +104,7 @@ export default function SettingsPage() {
body: JSON.stringify(body),
});
if (!res.ok) throw new Error("Save failed");
toast.success("Credentials saved successfully");
toast.success("Zugangsdaten erfolgreich gespeichert");
setCreds(prev => {
const next = { ...prev };
for (const service of Object.keys(body)) {
@@ -113,7 +113,7 @@ export default function SettingsPage() {
return next;
});
} catch {
toast.error("Failed to save credentials");
toast.error("Zugangsdaten konnten nicht gespeichert werden");
} finally {
setSaving(false);
}
@@ -126,11 +126,11 @@ export default function SettingsPage() {
const res = await fetch(`/api/credentials/test?service=${service}`);
const data = await res.json() as { ok: boolean };
update(service, "testResult", data.ok ? "ok" : "fail");
if (data.ok) toast.success(`${service} connection verified`);
else toast.error(`${service} connection failed — check your key`);
if (data.ok) toast.success(`${service}-Verbindung erfolgreich`);
else toast.error(`${service}-Verbindung fehlgeschlagen — API-Key prüfen`);
} catch {
update(service, "testResult", "fail");
toast.error("Connection test failed");
toast.error("Verbindungstest fehlgeschlagen");
} finally {
update(service, "testing", false);
}
@@ -140,9 +140,9 @@ export default function SettingsPage() {
<div className="max-w-2xl space-y-6">
{/* Header */}
<div>
<h1 className="text-2xl font-bold text-white">Settings</h1>
<h1 className="text-2xl font-bold text-white">Einstellungen</h1>
<p className="text-gray-400 mt-1 text-sm">
API credentials are encrypted with AES-256 and stored locally in SQLite.
API-Zugangsdaten werden mit AES-256 verschlüsselt und lokal in SQLite gespeichert.
</p>
</div>
@@ -158,11 +158,11 @@ export default function SettingsPage() {
<div className="flex items-center gap-2 mt-1">
{state.saved ? (
<span className="flex items-center gap-1 text-xs text-green-400">
<CheckCircle2 className="w-3.5 h-3.5" /> Configured
<CheckCircle2 className="w-3.5 h-3.5" /> Konfiguriert
</span>
) : (
<span className="flex items-center gap-1 text-xs text-red-400">
<XCircle className="w-3.5 h-3.5" /> Not configured
<XCircle className="w-3.5 h-3.5" /> Nicht konfiguriert
</span>
)}
</div>
@@ -221,17 +221,17 @@ export default function SettingsPage() {
className="border-[#2e2e3e] hover:border-blue-500/50 text-gray-300"
>
{state.testing ? (
<><Loader2 className="w-3.5 h-3.5 mr-1.5 animate-spin" /> Testing...</>
) : "Test Connection"}
<><Loader2 className="w-3.5 h-3.5 mr-1.5 animate-spin" /> Teste...</>
) : "Verbindung testen"}
</Button>
{state.testResult === "ok" && (
<span className="flex items-center gap-1 text-xs text-green-400">
<CheckCircle2 className="w-3.5 h-3.5" /> Connected
<CheckCircle2 className="w-3.5 h-3.5" /> Verbunden
</span>
)}
{state.testResult === "fail" && (
<span className="flex items-center gap-1 text-xs text-red-400">
<XCircle className="w-3.5 h-3.5" /> Failed
<XCircle className="w-3.5 h-3.5" /> Fehlgeschlagen
</span>
)}
</div>
@@ -245,7 +245,7 @@ export default function SettingsPage() {
onClick={saveAll}
className="bg-gradient-to-r from-blue-500 to-purple-600 hover:from-blue-600 hover:to-purple-700 text-white font-medium px-8 shadow-lg hover:shadow-blue-500/25 transition-all"
>
{saving ? <><Loader2 className="w-4 h-4 mr-2 animate-spin" /> Saving...</> : "Save All Credentials"}
{saving ? <><Loader2 className="w-4 h-4 mr-2 animate-spin" /> Speichern...</> : "Alle Zugangsdaten speichern"}
</Button>
</div>
);