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": "संकुचित करें",
"expand": "विस्तार करें",
"open": "खोलें"
},
"mcpSettings": {
"title": "MCP सेटिंग्स",
"description": "API कुंजियाँ प्रबंधित करें और बाहरी टूल कॉन्फ़िगर करें",
"whatIsMcp": {
"title": "MCP क्या है?",
"description": "मॉडल कॉन्टेक्स्ट प्रोटोकॉल (MCP) एक खुला प्रोटोकॉल है जो AI मॉडल को बाहरी टूल और डेटा स्रोतों के साथ सुरक्षित रूप से इंटरैक्ट करने में सक्षम बनाता है। MCP के साथ, आप Claude Code, Cursor या N8N जैसे टूल को अपने Keep Notes इंस्टेंस से कनेक्ट करके प्रोग्रामेटिक रूप से अपने नोट्स को पढ़ सकते हैं, बना सकते हैं और व्यवस्थित कर सकते हैं।",
"learnMore": "MCP के बारे में और जानें"
},
"serverStatus": {
"title": "सर्वर स्थिति",
"running": "चल रहा है",
"stopped": "रुका हुआ",
"mode": "मोड",
"url": "URL"
},
"apiKeys": {
"title": "API कुंजियाँ",
"description": "API कुंजियाँ बाहरी टूल को MCP के माध्यम से आपके नोट्स तक पहुँचने की अनुमति देती हैं। अपनी कुंजियों को गोपनीय रखें।",
"generate": "नई कुंजी जनरेट करें",
"empty": "अभी तक कोई API कुंजी नहीं। शुरू करने के लिए एक जनरेट करें।",
"active": "सक्रिय",
"revoked": "निरस्त",
"revoke": "निरस्त करें",
"delete": "हटाएँ",
"createdAt": "बनाई गई",
"lastUsed": "अंतिम उपयोग",
"never": "कभी नहीं",
"confirmRevoke": "क्या आप वाकई इस कुंजी को निरस्त करना चाहते हैं? इसका उपयोग करने वाले टूल की पहुँच हट जाएगी।",
"confirmDelete": "क्या आप वाकई इस कुंजी को स्थायी रूप से हटाना चाहते हैं?"
},
"createDialog": {
"title": "API कुंजी जनरेट करें",
"description": "बाहरी टूल को अपने नोट्स से कनेक्ट करने के लिए एक नई API कुंजी बनाएँ।",
"nameLabel": "कुंजी का नाम",
"namePlaceholder": "उदा. Claude Code, Cursor, N8N",
"generating": "जनरेट हो रहा है...",
"generate": "जनरेट करें",
"successTitle": "API कुंजी जनरेट हो गई",
"successDescription": "अपनी API कुंजी अभी कॉपी करें। आप इसे दोबारा नहीं देख पाएँगे।",
"copy": "कॉपी करें",
"copied": "कॉपी हो गई!",
"done": "हो गया"
},
"configInstructions": {
"title": "कॉन्फ़िगरेशन निर्देश",
"description": "इन टूल को कॉन्फ़िगर करने के लिए अपनी API कुंजी का उपयोग करें।",
"claudeCode": {
"title": "Claude Code",
"description": "इसे अपनी Claude Code MCP कॉन्फ़िगरेशन फ़ाइल में जोड़ें:"
},
"cursor": {
"title": "Cursor",
"description": "इसे अपनी Cursor MCP सेटिंग्स में जोड़ें:"
},
"n8n": {
"title": "N8N",
"description": "अपने N8N MCP नोड में इन क्रेडेंशियल का उपयोग करें:"
}
}
}
}