feat: RTL/i18n, AI translate+undo, no-refresh saves, settings perf

- RTL: force dir=rtl on LabelFilter, NotesViewToggle, LabelManagementDialog
- i18n: add missing keys (notifications, privacy, edit/preview, AI translate/undo)
- Settings pages: convert to Server Components (general, appearance) + loading skeleton
- AI menu: add Translate option (10 languages) + Undo AI button in toolbar
- Fix: saveInline uses REST API instead of Server Action → eliminates all implicit refreshes in list mode
- Fix: NotesTabsView notes sync effect preserves selected note on content changes
- Fix: auto-tag suggestions now filter already-assigned labels
- Fix: color change in card view uses local state (no refresh)
- Fix: nav links use <Link> for prefetching (Settings, Admin)
- Fix: suppress duplicate label suggestions already on note
- Route: add /api/ai/translate endpoint
This commit is contained in:
Sepehr Ramezani
2026-04-15 23:48:28 +02:00
parent 39671c6472
commit b6a548acd8
68 changed files with 5014 additions and 485 deletions

View File

@@ -997,5 +997,65 @@
"collapse": "Zusammenklappen",
"expand": "Erweitern",
"open": "Öffnen"
},
"mcpSettings": {
"title": "MCP-Einstellungen",
"description": "API-Schlüssel verwalten und externe Tools konfigurieren",
"whatIsMcp": {
"title": "Was ist MCP?",
"description": "Das Model Context Protocol (MCP) ist ein offenes Protokoll, das es KI-Modellen ermöglicht, sicher mit externen Tools und Datenquellen zu interagieren. Mit MCP können Sie Tools wie Claude Code, Cursor oder N8N mit Ihrer Keep Notes-Instanz verbinden, um Ihre Notes programmgesteuert zu lesen, zu erstellen und zu organisieren.",
"learnMore": "Mehr über MCP erfahren"
},
"serverStatus": {
"title": "Serverstatus",
"running": "Aktiv",
"stopped": "Gestoppt",
"mode": "Modus",
"url": "URL"
},
"apiKeys": {
"title": "API-Schlüssel",
"description": "API-Schlüssel ermöglichen externen Tools den Zugriff auf Ihre Notes über MCP. Halten Sie Ihre Schlüssel geheim.",
"generate": "Neuen Schlüssel generieren",
"empty": "Noch keine API-Schlüssel. Generieren Sie einen, um zu beginnen.",
"active": "Aktiv",
"revoked": "Widerrufen",
"revoke": "Widerrufen",
"delete": "Löschen",
"createdAt": "Erstellt",
"lastUsed": "Zuletzt verwendet",
"never": "Nie",
"confirmRevoke": "Sind Sie sicher, dass Sie diesen Schlüssel widerrufen möchten? Tools, die ihn verwenden, verlieren den Zugriff.",
"confirmDelete": "Sind Sie sicher, dass Sie diesen Schlüssel dauerhaft löschen möchten?"
},
"createDialog": {
"title": "API-Schlüssel generieren",
"description": "Erstellen Sie einen neuen API-Schlüssel, um externe Tools mit Ihren Notes zu verbinden.",
"nameLabel": "Schlüsselname",
"namePlaceholder": "z.B. Claude Code, Cursor, N8N",
"generating": "Wird generiert...",
"generate": "Generieren",
"successTitle": "API-Schlüssel generiert",
"successDescription": "Kopieren Sie Ihren API-Schlüssel jetzt. Sie können ihn später nicht mehr einsehen.",
"copy": "Kopieren",
"copied": "Kopiert!",
"done": "Fertig"
},
"configInstructions": {
"title": "Konfigurationsanleitung",
"description": "Verwenden Sie Ihren API-Schlüssel zur Konfiguration dieser Tools.",
"claudeCode": {
"title": "Claude Code",
"description": "Fügen Sie dies zur MCP-Konfigurationsdatei von Claude Code hinzu:"
},
"cursor": {
"title": "Cursor",
"description": "Fügen Sie dies zu Ihren Cursor MCP-Einstellungen hinzu:"
},
"n8n": {
"title": "N8N",
"description": "Verwenden Sie diese Anmeldeinformationen in Ihrem N8N MCP-Knoten:"
}
}
}
}