perf: optimize MCP server (O(1) auth, compact JSON, trashedAt fix) + memento-note performance (lazy loading, server-side filtering, XSS fixes, dead code removal, security hardening)
All checks were successful
Deploy to Production / Build and Deploy (push) Successful in 1m35s

MCP Server:
- Fix validateApiKey: O(1) direct lookup by shortId instead of loading all keys
- Add trashedAt:null filter to ALL note queries (trashed notes leaked in results)
- Compact JSON output (~40% smaller responses)
- Bounded session cache (Map with MAX_SESSIONS=500) to prevent memory leaks
- PostgreSQL connection pooling (connection_limit=10)
- Rewrite all 22 tool descriptions in clear English
- Fix /sse fallback to proper 307 redirect

memento-note Performance:
- loading=lazy on all note images
- Split notebooksRefreshKey from global refreshKey (note CRUD no longer re-fetches notebooks)
- Remove searchKey from trash count deps (no re-fetch on every keystroke)
- Server-side notebookId filter in getAllNotes() (biggest win)
- Skip collaborator fetch for non-shared notes (eliminates N+1 API calls)
- next/dynamic for MarkdownContent + 4 modals (code-split remark/rehype/KaTeX)
- Memoize DOMPurify sanitize with useMemo

Security:
- XSS: DOMPurify sanitize in note-card and note-history-modal
- Auth anti-enumeration: uniform errors in auth.ts
- CRON_SECRET mandatory on cron endpoints
- Rate limiting on login (5 attempts/min per email)
- Centralized API auth helpers (requireAuth/requireAdmin)
- randomize-labels changed GET→POST
- Removed debug endpoints (/api/debug/config, /api/debug/test-chat)

Cleanup:
- Removed dead code: .backup-keep, settings-backup, fix-*.js, debug-theme, fix-labels route
- Removed sensitive console.error in auth.ts
- Ollama fetchWithTimeout (30s/60s AbortController)
- i18n: full Arabic translation, Farsi missing keys
- Masonry drag-and-drop fix (localOrderMap, cross-section block)
- Sidebar notebook tooltip on truncation
This commit is contained in:
Antigravity
2026-05-03 18:41:38 +00:00
parent aee4b17306
commit 718f4c6900
58 changed files with 13249 additions and 7474 deletions

View File

@@ -26,21 +26,21 @@
"sending": "جاري الإرسال...",
"sendResetLink": "إرسال رابط إعادة التعيين",
"backToLogin": "العودة إلى تسجيل الدخول",
"signOut": "Sign out",
"signOut": "تسجيل الخروج",
"confirmPassword": "تأكيد كلمة المرور",
"confirmPasswordPlaceholder": "أعد إدخال كلمة المرور"
},
"sidebar": {
"notes": "Notes",
"reminders": "Reminders",
"labels": "Labels",
"editLabels": "Edit labels",
"notes": "الملاحظات",
"reminders": "التذكيرات",
"labels": "التسميات",
"editLabels": "تعديل التسميات",
"newNoteTabs": "ملاحظة جديدة",
"newNoteTabsHint": "إنشاء ملاحظة في هذا الدفتر",
"noLabelsInNotebook": "لا توجد تسميات في هذا الدفتر",
"archive": "Archive",
"trash": "Trash",
"clearFilter": "Remove filter"
"archive": "الأرشيف",
"trash": "المهملات",
"clearFilter": "إزالة الفلتر"
},
"notes": {
"title": "الملاحظات",
@@ -88,8 +88,8 @@
"itemOrMediaRequired": "الرجاء إضافة عنصر واحد على الأقل أو وسائط",
"noteCreated": "تم إنشاء الملاحظة بنجاح",
"noteCreateFailed": "فشل في إنشاء الملاحظة",
"deleted": "Note deleted",
"deleteFailed": "Failed to delete note",
"deleted": "تم حذف الملاحظة",
"deleteFailed": "فشل حذف الملاحظة",
"aiAssistant": "مساعد الذكاء الاصطناعي",
"changeSize": "تغيير الحجم",
"backgroundOptions": "خيارات الخلفية",
@@ -176,10 +176,10 @@
"history": "السجل",
"historyRestored": "تم استعادة النسخة",
"historyEnabled": "تم تفعيل السجل",
"historyDisabledTitle": "Version history",
"historyDisabledTitle": "سجل النسخ",
"historyDisabledDesc": "السجل معطل لحسابك.",
"historyEnabledTitle": "History enabled!",
"historyEnabledDesc": "Versions of this note will now be recorded.",
"historyEnabledTitle": "تم تفعيل السجل!",
"historyEnabledDesc": "سيتم الآن تسجيل نسخ هذه الملاحظة.",
"enableHistory": "تفعيل السجل",
"historyEmpty": "لا توجد نسخ متاحة",
"historySelectVersion": "اختر نسخة لمعاينة محتواها",
@@ -188,32 +188,37 @@
"sortDateAsc": "التاريخ (الأقدم)",
"sortTitleAsc": "العنوان أ ← ي",
"sortTitleDesc": "العنوان ي ← أ",
"suggestTitle": "AI title",
"generateTitleFromImage": "Generate title from image",
"titleGenerated": "Title generated",
"content": "Content",
"restore": "Restore",
"createFailed": "Failed to create note",
"updateFailed": "Failed to update note",
"archived": "Note archived",
"archiveFailed": "Failed to archive",
"sort": "Sort",
"confirmDeleteTitle": "Delete note",
"leftShare": "Share removed",
"dismissed": "Note dismissed from recent",
"generalNotes": "General Notes",
"suggestTitle": "عنوان بالذكاء الاصطناعي",
"generateTitleFromImage": "إنشاء عنوان من الصورة",
"titleGenerated": "تم إنشاء العنوان",
"content": "المحتوى",
"restore": "استعادة",
"createFailed": "فشل إنشاء الملاحظة",
"updateFailed": "فشل تحديث الملاحظة",
"archived": "تم أرشفة الملاحظة",
"archiveFailed": "فشل الأرشفة",
"sort": "ترتيب",
"confirmDeleteTitle": "حذف الملاحظة",
"leftShare": "تمت إزالة المشاركة",
"dismissed": "تمت إزالة الملاحظة من الحديثة",
"generalNotes": "الملاحظات العامة",
"noteType": "نوع الملاحظة",
"typeText": "نص",
"typeMarkdown": "ماركداون",
"typeRichText": "نص منسق",
"typeChecklist": "قائمة مراجعة",
"convertedToRichText": "Converted to rich text",
"conversionFailed": "Conversion failed, staying in Markdown",
"convertedToRichText": "تم التحويل إلى نص منسق",
"conversionFailed": "فشل التحويل، البقاء في Markdown",
"richTextPlaceholder": "اكتب ملاحظة...",
"switchTypeTitle": "تغيير نوع الملاحظة؟",
"switchTypeWarning": "قد يفقد بعض التنسيق عند التحويل إلى {type}.",
"switchTypeContentPreserved": "سيتم الحفاظ على المحتوى كنص عادي.",
"switchType": "تحويل إلى {type}"
"switchType": "تحويل إلى {type}",
"deleteVersionDesc": "لا يمكن التراجع عن هذا الإجراء. سيتم حذف النسخة نهائياً من السجل.",
"compareVersions": "مقارنة",
"currentVersion": "الحالي",
"diffSelectHint": "انقر على نسختين في القائمة للمقارنة بينهما",
"diffTitle": "المقارنة"
},
"pagination": {
"previous": "←",
@@ -221,81 +226,81 @@
"next": "→"
},
"labels": {
"title": "Labels",
"filter": "Filter by Label",
"manage": "Manage Labels",
"manageTooltip": "Manage Labels",
"changeColor": "Change Color",
"changeColorTooltip": "Change color",
"delete": "Delete",
"deleteTooltip": "Delete label",
"confirmDelete": "Are you sure you want to delete this label?",
"newLabelPlaceholder": "Create new label",
"namePlaceholder": "Enter label name",
"addLabel": "Add label",
"createLabel": "Create label",
"labelName": "Label name",
"labelColor": "Label color",
"manageLabels": "Manage labels",
"manageLabelsDescription": "Add or remove labels for this note. Click on a label to change its color.",
"selectedLabels": "Selected Labels",
"allLabels": "All Labels",
"clearAll": "Clear all",
"filterByLabel": "Filter by label",
"tagAdded": "Tag \"{tag}\" added",
"showLess": "Show less",
"showMore": "Show more",
"editLabels": "Edit Labels",
"editLabelsDescription": "Create, edit colors, or delete labels.",
"noLabelsFound": "No labels found.",
"loading": "Loading...",
"notebookRequired": "⚠️ Labels are only available in notebooks. Move this note to a notebook first.",
"count": "{count} labels",
"noLabels": "No labels",
"confirmDeleteShort": "Confirm?",
"labelRemoved": "Label \"{label}\" removed"
"title": "التسميات",
"filter": "تصفية حسب التسمية",
"manage": "إدارة التسميات",
"manageTooltip": "إدارة التسميات",
"changeColor": "تغيير اللون",
"changeColorTooltip": "تغيير اللون",
"delete": "حذف",
"deleteTooltip": "حذف التسمية",
"confirmDelete": "هل أنت متأكد أنك تريد حذف هذه التسمية؟",
"newLabelPlaceholder": "إنشاء تسمية جديدة",
"namePlaceholder": "أدخل اسم التسمية",
"addLabel": "إضافة تسمية",
"createLabel": "إنشاء تسمية",
"labelName": "اسم التسمية",
"labelColor": "لون التسمية",
"manageLabels": "إدارة التسميات",
"manageLabelsDescription": "إضافة أو إزالة تسميات لهذه الملاحظة. انقر على التسمية لتغيير لونها.",
"selectedLabels": "التسميات المحددة",
"allLabels": "جميع التسميات",
"clearAll": "مسح الكل",
"filterByLabel": "تصفية حسب التسمية",
"tagAdded": "تمت إضافة الوسم \"{tag}\"",
"showLess": "عرض أقل",
"showMore": "عرض المزيد",
"editLabels": "تعديل التسميات",
"editLabelsDescription": "إنشاء أو تعديل الألوان أو حذف التسميات.",
"noLabelsFound": "لم يتم العثور على تسميات.",
"loading": "جاري التحميل...",
"notebookRequired": "⚠️ التسميات متاحة فقط في الدفاتر. انقل هذه الملاحظة إلى دفتر أولاً.",
"count": "{count} تسميات",
"noLabels": "لا توجد تسميات",
"confirmDeleteShort": "تأكيد؟",
"labelRemoved": "تمت إزالة التسمية \"{label}\""
},
"search": {
"placeholder": "Search",
"searchPlaceholder": "Search your notes...",
"semanticInProgress": "AI search in progress...",
"semanticTooltip": "AI semantic search",
"searching": "Searching...",
"noResults": "No results found",
"resultsFound": "{count} notes found",
"exactMatch": "Exact match",
"related": "Related",
"placeholder": "بحث",
"searchPlaceholder": "ابحث في ملاحظاتك...",
"semanticInProgress": "بحث الذكاء الاصطناعي جارٍ...",
"semanticTooltip": "بحث دلالي بالذكاء الاصطناعي",
"searching": "جاري البحث...",
"noResults": "لم يتم العثور على نتائج",
"resultsFound": "تم العثور على {count} ملاحظات",
"exactMatch": "تطابق تام",
"related": "ذات صلة",
"disabledAdmin": "البحث معطل في وضع المسؤول"
},
"collaboration": {
"emailPlaceholder": "Enter email address",
"addCollaborator": "Add collaborator",
"removeCollaborator": "Remove collaborator",
"owner": "Owner",
"canEdit": "Can edit",
"canView": "Can view",
"shareNote": "Share note",
"shareWithCollaborators": "Share with collaborators",
"addCollaboratorDescription": "Add people to collaborate on this note by their email address.",
"viewerDescription": "You have access to this note. Only the owner can manage collaborators.",
"emailAddress": "Email address",
"enterEmailAddress": "Enter email address",
"invite": "Invite",
"peopleWithAccess": "People with access",
"noCollaborators": "No collaborators yet. Add someone above!",
"noCollaboratorsViewer": "No collaborators yet.",
"pendingInvite": "Pending Invite",
"pending": "Pending",
"remove": "Remove",
"unnamedUser": "Unnamed User",
"done": "Done",
"willBeAdded": "{email} will be added as collaborator when note is created",
"alreadyInList": "This email is already in the list",
"nowHasAccess": "{name} now has access to this note",
"accessRevoked": "Access has been revoked",
"errorLoading": "Error loading collaborators",
"failedToAdd": "Failed to add collaborator",
"failedToRemove": "Failed to remove collaborator"
"emailPlaceholder": "أدخل عنوان البريد الإلكتروني",
"addCollaborator": "إضافة متعاون",
"removeCollaborator": "إزالة متعاون",
"owner": "المالك",
"canEdit": "يمكنه التعديل",
"canView": "يمكنه العرض",
"shareNote": "مشاركة الملاحظة",
"shareWithCollaborators": "المشاركة مع المتعاونين",
"addCollaboratorDescription": "أضف أشخاصاً للتعاون في هذه الملاحظة عبر عنوان بريدهم الإلكتروني.",
"viewerDescription": "لديك صلاحية الوصول إلى هذه الملاحظة. فقط المالك يمكنه إدارة المتعاونين.",
"emailAddress": "عنوان البريد الإلكتروني",
"enterEmailAddress": "أدخل عنوان البريد الإلكتروني",
"invite": "دعوة",
"peopleWithAccess": "الأشخاص الذين لديهم صلاحية الوصول",
"noCollaborators": "لا يوجد متعاونون بعد. أضف شخصاً أعلاه!",
"noCollaboratorsViewer": "لا يوجد متعاونون بعد.",
"pendingInvite": "دعوة معلقة",
"pending": "معلق",
"remove": "إزالة",
"unnamedUser": "مستخدم بدون اسم",
"done": "تم",
"willBeAdded": "سيتم إضافة {email} كمتعاون عند إنشاء الملاحظة",
"alreadyInList": "هذا البريد الإلكتروني موجود بالفعل في القائمة",
"nowHasAccess": "{name} لديه الآن صلاحية الوصول إلى هذه الملاحظة",
"accessRevoked": "تم إلغاء صلاحية الوصول",
"errorLoading": "خطأ في تحميل المتعاونين",
"failedToAdd": "فشل في إضافة المتعاون",
"failedToRemove": "فشل في إزالة المتعاون"
},
"ai": {
"analyzing": "الذكاء الاصطناعي يحلل...",
@@ -417,14 +422,17 @@
"transformationsDesc": "التحويلات — مطبقة مباشرة في الملاحظة",
"writeMinWordsAction": "اكتب 5 كلمات على الأقل لتفعيل إجراءات الذكاء الاصطناعي.",
"processingAction": "جاري المعالجة...",
"noImagesError": "No images in this note",
"overview": "Overview",
"noImagesError": "لا توجد صور في هذه الملاحظة",
"overview": "نظرة عامة",
"action": {
"clarify": "توضيح",
"shorten": "تقصير",
"improve": "تحسين",
"toMarkdown": "إلى Markdown",
"describeImages": "Describe images"
"describeImages": "وصف الصور",
"fixGrammar": "تصحيح القواعد",
"translate": "ترجمة",
"explain": "شرح"
},
"openAssistant": "فتح مساعد الذكاء الاصطناعي",
"poweredByMomento": "مدعوم من Momento AI",
@@ -440,8 +448,50 @@
"insightsTab": "رؤى",
"aiCopilot": "مساعد ذكي",
"suggestTitle": "اقتراح عنوان بالذكاء الاصطناعي",
"generateTitleFromImage": "Generate title from image",
"titleGenerated": "Title generated from image"
"generateTitleFromImage": "إنشاء عنوان من الصورة",
"titleGenerated": "تم إنشاء العنوان من الصورة",
"wordCountMin": "الرجاء تحديد {min} كلمات على الأقل لإعادة الصياغة (حالياً {current} كلمة)",
"wordCountMax": "الرجاء تحديد {max} كلمة كحد أقصى لإعادة الصياغة (حالياً {current} كلمة)",
"resourceTab": "المصدر",
"aiNoteTitle": "ملاحظة الذكاء الاصطناعي",
"injectReplace": "استبدال",
"injectReplaceTitle": "استبدال محتوى الملاحظة بهذه الرسالة",
"injectComplete": "إكمال",
"injectCompleteTitle": "إكمال الملاحظة بهذه الرسالة (ذكاء اصطناعي)",
"injectMerge": "دمج",
"injectMergeTitle": "دمج مع الملاحظة (ذكاء اصطناعي)",
"imagesCount": "{count} صور",
"resource": {
"failedToLoadUrl": "فشل تحميل هذا الرابط",
"pageLoaded": "تم تحميل الصفحة: {title}",
"pageLoadError": "خطأ في تحميل الصفحة",
"pasteOrUrlFirst": "الصق نصاً أو حمّل رابطاً أولاً",
"enrichError": "خطأ في الإثراء",
"enrichErrorShort": "خطأ في الإثراء",
"contentApplied": "تم تطبيق المحتوى على الملاحظة ✓",
"fromChat": "💬 من الدردشة",
"replacement": "↓ استبدال",
"completedByAI": "✦ أكمله الذكاء الاصطناعي",
"mergedByAI": "⟳ دمجه الذكاء الاصطناعي",
"rendered": "تم العرض",
"cancel": "إلغاء",
"applyToNote": "تطبيق على الملاحظة",
"urlLabel": "رابط URL (اختياري)",
"resourceText": "نص المصدر",
"resourcePlaceholder": "الصق النص هنا (ماركداون، HTML، نص عادي…)",
"words": "كلمات",
"integrationMode": "وضع التكامل",
"modeReplace": "استبدال",
"modeReplaceDesc": "مباشر، بدون ذكاء اصطناعي",
"modeComplete": "إكمال",
"modeCompleteDesc": "يضيف بدون إعادة كتابة",
"modeMerge": "دمج",
"modeMergeDesc": "يعيد الكتابة ويكامل",
"aiProcessing": "جاري المعالجة بالذكاء الاصطناعي…",
"preview": "معاينة",
"generatePreview": "إنشاء معاينة",
"emptyNoteHint": "💡 الملاحظة فارغة — سيتم دمج محتوى المصدر مباشرة."
}
},
"titleSuggestions": {
"available": "اقتراحات العنوان",
@@ -533,16 +583,16 @@
"confirmFusion": "تأكيد الدمج",
"success": "تم دمج الملاحظات بنجاح!",
"error": "فشل في دمج الملاحظات",
"generateError": "Failed to generate fusion",
"noContentReturned": "No fusion content returned from API",
"unknownDate": "Unknown date"
"generateError": "فشل في إنشاء الدمج",
"noContentReturned": "لم يتم إرجاع محتوى دمج من API",
"unknownDate": "تاريخ غير معروف"
}
},
"notification": {
"accept": "Accept",
"accepted": "Share accepted",
"decline": "Decline",
"noNotifications": "No new notifications",
"accept": "قبول",
"accepted": "تم قبول المشاركة",
"decline": "رفض",
"noNotifications": "لا توجد إشعارات جديدة",
"shared": "شارك \"{title}\"",
"untitled": "بدون عنوان",
"notifications": "الإشعارات",
@@ -603,24 +653,24 @@
"about": "حول",
"version": "الإصدار",
"settingsSaved": "تم حفظ الإعدادات",
"cardSizeMode": "Note Size",
"cardSizeModeDescription": "Choose between variable sizes or uniform size",
"selectCardSizeMode": "Select display mode",
"cardSizeVariable": "Variable sizes (small/medium/large)",
"cardSizeUniform": "Uniform size",
"cardSizeMode": "حجم الملاحظة",
"cardSizeModeDescription": "اختر بين أحجام متغيرة أو حجم موحد",
"selectCardSizeMode": "اختر وضع العرض",
"cardSizeVariable": "أحجام متغيرة (صغير/متوسط/كبير)",
"cardSizeUniform": "حجم موحد",
"settingsError": "خطأ في حفظ الإعدادات",
"maintenance": "Maintenance",
"maintenanceDescription": "Tools to maintain your database health",
"cleanTags": "Clean Orphan Tags",
"cleanTagsDescription": "Remove tags that are no longer used by any notes",
"maintenance": "الصيانة",
"maintenanceDescription": "أدوات للحفاظ على صحة قاعدة البيانات",
"cleanTags": "تنظيف الوسوم اليتيمة",
"cleanTagsDescription": "إزالة الوسوم التي لم تعد مستخدمة في أي ملاحظة",
"cleanupDone": "تمت مزامنة {created} تسمية، حذف {deleted} يتيمة",
"cleanupNothing": "لا حاجة لأي إجراء — التسميات متزامنة بالفعل مع ملاحظاتك",
"cleanupWithErrors": "بعض العمليات فشلت",
"cleanupError": "تعذر تنظيف التسميات",
"indexingComplete": "اكتملت الفهرسة: تمت معالجة {count} ملاحظة",
"indexingError": "خطأ أثناء الفهرسة",
"semanticIndexing": "Semantic Indexing",
"semanticIndexingDescription": "Generate vectors for all notes to enable intent-based search",
"semanticIndexing": "الفهرسة الدلالية",
"semanticIndexingDescription": "إنشاء متجهات لجميع الملاحظات لتفعيل البحث القائم على النية",
"profile": "الملف الشخصي",
"searchNoResults": "لم يتم العثور على إعدادات مطابقة",
"languageAuto": "الكشف التلقائي",
@@ -670,10 +720,10 @@
"fontSizeDescription": "قم بضبط حجم الخط لتحسين القراءة. ينطبق هذا على جميع النصوص في الواجهة.",
"fontSizeUpdateSuccess": "تم تحديث حجم الخط بنجاح",
"fontSizeUpdateFailed": "فشل في تحديث حجم الخط",
"showRecentNotes": "Show Recent Notes Section",
"showRecentNotesDescription": "Display recent notes (last 7 days) on the main page",
"recentNotesUpdateSuccess": "Recent notes setting updated successfully",
"recentNotesUpdateFailed": "Failed to update recent notes setting"
"showRecentNotes": "عرض قسم الملاحظات الحديثة",
"showRecentNotesDescription": "عرض الملاحظات الحديثة (آخر 7 أيام) في الصفحة الرئيسية",
"recentNotesUpdateSuccess": "تم تحديث إعدادات الملاحظات الحديثة بنجاح",
"recentNotesUpdateFailed": "فشل تحديث إعدادات الملاحظات الحديثة"
},
"aiSettings": {
"title": "إعدادات الذكاء الاصطناعي",
@@ -695,7 +745,15 @@
"providerDesc": "اختر مزود الذكاء الاصطناعي المفضل",
"providerAutoDesc": "Ollama عند توفره، OpenAI كبديل",
"providerOllamaDesc": "خصوصية 100%، يعمل محليًا",
"providerOpenAIDesc": "الأكثر دقة، يتطلب مفتاح API"
"providerOpenAIDesc": "الأكثر دقة، يتطلب مفتاح API",
"aiNote": "ملاحظة الذكاء الاصطناعي",
"aiNoteDesc": "تفعيل زر دردشة الذكاء الاصطناعي وأدوات تحسين النص",
"languageDetection": "اكتشاف اللغة",
"languageDetectionDesc": "يكتشف تلقائياً لغة ملاحظاتك",
"autoLabeling": "اقتراحات التسميات",
"autoLabelingDesc": "يقترح ويطبق التسميات تلقائياً على ملاحظاتك",
"noteHistory": "سجل الملاحظة",
"noteHistoryDesc": "تفعيل لقطات النسخ والاستعادة من السجل"
},
"general": {
"loading": "جاري التحميل...",
@@ -717,9 +775,9 @@
"error": "حدث خطأ",
"operationSuccess": "نجحت العملية",
"operationFailed": "فشلت العملية",
"testConnection": "Test Connection",
"clean": "Clean",
"indexAll": "Index All",
"testConnection": "اختبار الاتصال",
"clean": "تنظيف",
"indexAll": "فهرسة الكل",
"preview": "معاينة"
},
"colors": {
@@ -752,7 +810,9 @@
"markDone": "وضع علامة مكتمل",
"markUndone": "وضع علامة غير مكتمل",
"todayAt": "اليوم في {time}",
"tomorrowAt": "غداً في {time}"
"tomorrowAt": "غداً في {time}",
"clearCompleted": "مسح المكتملة",
"viewAll": "عرض جميع التذكيرات"
},
"notebook": {
"create": "إنشاء دفتر",
@@ -783,7 +843,7 @@
"confidence": "ثقة",
"savingReminder": "خطأ في حفظ التذكير",
"removingReminder": "خطأ في إزالة التذكير",
"generatingDescription": "Please wait..."
"generatingDescription": "يرجى الانتظار..."
},
"notebookSuggestion": {
"title": "النقل إلى {name}؟",
@@ -797,10 +857,10 @@
"admin": {
"title": "لوحة تحكم المشرف",
"userManagement": "إدارة المستخدمين",
"chat": "AI Chat",
"lab": "The Lab",
"agents": "Agents",
"workspace": "Workspace",
"chat": "دردشة الذكاء الاصطناعي",
"lab": "المختبر",
"agents": "الوكلاء",
"workspace": "مساحة العمل",
"settings": "إعدادات المشرف",
"security": {
"title": "إعدادات الأمان",
@@ -896,14 +956,14 @@
"description": "تكوين إرسال البريد الإلكتروني لإشعارات الوكلاء وإعادة تعيين كلمة المرور.",
"provider": "مزود البريد الإلكتروني",
"saveSettings": "حفظ إعدادات البريد الإلكتروني",
"status": "Service Status",
"keySet": "key configured",
"activeAuto": "Auto mode: Resend will be used first, SMTP as fallback.",
"activeSmtp": "Auto mode: SMTP will be used (Resend not configured).",
"noneConfigured": "No email service configured. Set up Resend or SMTP.",
"activeProvider": "Active provider",
"testOk": "test passed",
"testFail": "test failed"
"status": "حالة الخدمة",
"keySet": "تم تكوين المفتاح",
"activeAuto": "الوضع التلقائي: سيتم استخدام Resend أولاً، ثم SMTP كبديل.",
"activeSmtp": "الوضع التلقائي: سيتم استخدام SMTP (Resend غير مكوّن).",
"noneConfigured": "لم يتم تكوين خدمة بريد إلكتروني. قم بإعداد Resend أو SMTP.",
"activeProvider": "المزود النشط",
"testOk": "نجح الاختبار",
"testFail": "فشل الاختبار"
},
"smtp": {
"title": "تكوين SMTP",
@@ -937,9 +997,9 @@
"deleteFailed": "فشل الحذف",
"roleUpdateSuccess": "تم تحديث دور المستخدم إلى {role}",
"roleUpdateFailed": "فشل تحديث الدور",
"demote": "تخفيض",
"promote": "ترقية",
"confirmDelete": "Are you sure? This action cannot be undone.",
"demote": "تخفيض إلى مستخدم",
"promote": "ترقية إلى مشرف",
"confirmDelete": "هل أنت متأكد؟ لا يمكن التراجع عن هذا الإجراء.",
"table": {
"name": "الاسم",
"email": "البريد الإلكتروني",
@@ -1182,7 +1242,7 @@
"notesViewLabel": "عرض الملاحظات",
"notesViewTabs": "علامات تبويب (نمط OneNote)",
"notesViewMasonry": "بطاقات (شبكة)",
"selectTheme": "Select theme",
"selectTheme": "اختر المظهر",
"fontFamilyLabel": "عائلة الخطوط",
"fontFamilyDescription": "اختر الخط المستخدم في جميع أنحاء التطبيق",
"selectFontFamily": "Inter مُحسّن لسهولة القراءة، النظام يستخدم الخط الأصلي لنظام التشغيل",
@@ -1248,12 +1308,12 @@
},
"diagnostics": {
"title": "التشخيص",
"description": "Check your AI provider connection status",
"description": "تحقق من حالة اتصال مزود الذكاء الاصطناعي",
"configuredProvider": "المزود المكوّن",
"apiStatus": "حالة API",
"operational": "Operational",
"errorStatus": "Error",
"checking": "Checking...",
"operational": "يعمل",
"errorStatus": "خطأ",
"checking": "جاري التحقق...",
"testDetails": "تفاصيل الاختبار:",
"troubleshootingTitle": "نصائح استكشاف الأخطاء:",
"tip1": "تأكد من تشغيل Ollama (ollama serve)",
@@ -1376,10 +1436,10 @@
"subtitle": "أتمتة مهام المراقبة والبحث الخاصة بك",
"newAgent": "وكيل جديد",
"myAgents": "وكلائي",
"searchPlaceholder": "Search agents...",
"filterAll": "All",
"newBadge": "New",
"noResults": "No agents match your search.",
"searchPlaceholder": "البحث عن وكلاء...",
"filterAll": "الكل",
"newBadge": "جديد",
"noResults": "لا يوجد وكلاء يطابقون بحثك.",
"noAgents": "لا يوجد وكلاء",
"noAgentsDescription": "أنشئ أول وكيل لك أو ثبّت قالبًا أدناه لأتمتة مهام المراقبة.",
"types": {
@@ -1423,8 +1483,8 @@
"researchTopicPlaceholder": "مثال: أحدث التطورات في الذكاء الاصطناعي",
"notifyEmail": "إشعار بالبريد الإلكتروني",
"notifyEmailHint": "استلام بريد إلكتروني بنتائج الوكيل بعد كل تشغيل",
"includeImages": "Include images",
"includeImagesHint": "Extract images from scraped pages and attach them to the generated note"
"includeImages": "تضمين الصور",
"includeImagesHint": "استخراج الصور من الصفحات المجمعة وإرفاقها بالملاحظة المولدة"
},
"frequencies": {
"manual": "يدوي",
@@ -1434,19 +1494,19 @@
"monthly": "شهري"
},
"schedule": {
"nextRun": "Next run",
"pending": "Pending trigger",
"time": "Time",
"dayOfWeek": "Day of week",
"dayOfMonth": "Day of month",
"nextRun": "التنفيذ التالي",
"pending": "في انتظار التشغيل",
"time": "الوقت",
"dayOfWeek": "يوم الأسبوع",
"dayOfMonth": "يوم الشهر",
"days": {
"mon": "Monday",
"tue": "Tuesday",
"wed": "Wednesday",
"thu": "Thursday",
"fri": "Friday",
"sat": "Saturday",
"sun": "Sunday"
"mon": "الاثنين",
"tue": "الثلاثاء",
"wed": "الأربعاء",
"thu": "الخميس",
"fri": "الجمعة",
"sat": "السبت",
"sun": "الأحد"
}
},
"status": {
@@ -1478,8 +1538,8 @@
"installSuccess": "تم تثبيت \"{name}\"",
"installError": "خطأ أثناء التثبيت",
"saveError": "خطأ في الحفظ",
"autoRunSuccess": "Agent \"{name}\" executed automatically with success",
"autoRunError": "Agent \"{name}\" failed during automatic execution"
"autoRunSuccess": "تم تنفيذ الوكيل \"{name}\" تلقائياً بنجاح",
"autoRunError": "فشل الوكيل \"{name}\" أثناء التنفيذ التلقائي"
},
"templates": {
"title": "القوالب",
@@ -1593,7 +1653,7 @@
"searching": "جاري البحث...",
"noNotesFoundForContext": "لم يتم العثور على ملاحظات ذات صلة لهذا السؤال. أجب باستخدام معرفتك العامة.",
"webSearch": "بحث الويب",
"timeoutWarning": "Response is taking longer than expected..."
"timeoutWarning": "الاستجابة تستغرق وقتاً أطول من المتوقع..."
},
"labHeader": {
"title": "المختبر",
@@ -1611,10 +1671,81 @@
"deleteSpace": "حذف المساحة",
"deleted": "تم حذف المساحة",
"deleteError": "خطأ في الحذف",
"rename": "Rename"
"rename": "إعادة تسمية"
},
"lab": {
"initializing": "تهيئة المساحة",
"loadingIdeas": "جاري تحميل أفكارك..."
},
"richTextEditor": {
"slashHint": "↑↓ تنقل · Enter إدراج · Tab تبديل القسم",
"slashLoading": "الذكاء الاصطناعي يفكر...",
"slashTabAll": "الكل",
"slashCatBasic": "كتل أساسية",
"slashCatMedia": "وسائط",
"slashCatFormatting": "تنسيق",
"slashCatAi": "ملاحظة ذكاء اصطناعي",
"insertImage": "إدراج صورة",
"imageUrlPlaceholder": "https://example.com/image.png",
"preview": "معاينة",
"cancel": "إلغاء",
"insert": "إدراج",
"slashText": "نص",
"slashTextDesc": "فقرة بسيطة",
"slashH1": "عنوان 1",
"slashH1Desc": "عنوان قسم كبير",
"slashH2": "عنوان 2",
"slashH2Desc": "عنوان قسم متوسط",
"slashH3": "عنوان 3",
"slashH3Desc": "عنوان قسم صغير",
"slashBullet": "قائمة نقطية",
"slashBulletDesc": "قائمة غير مرتبة",
"slashNumbered": "قائمة مرقمة",
"slashNumberedDesc": "قائمة مرقمة مرتبة",
"slashTodo": "قائمة مهام",
"slashTodoDesc": "مهام ب مربع اختيار",
"slashQuote": "اقتباس",
"slashQuoteDesc": "التقاط اقتباس",
"slashCode": "كتلة كود",
"slashCodeDesc": "مقتطف كود",
"slashDivider": "فاصل",
"slashDividerDesc": "فاصل أفقي",
"slashImage": "صورة",
"slashImageDesc": "تضمين صورة من رابط",
"slashAlignLeft": "محاذاة لليسار",
"slashAlignLeftDesc": "محاذاة النص لليسار",
"slashAlignCenter": "توسيط",
"slashAlignCenterDesc": "توسيط النص",
"slashAlignRight": "محاذاة لليمين",
"slashAlignRightDesc": "محاذاة النص لليمين",
"slashSuperscript": "نص مرتفع",
"slashSuperscriptDesc": "نص فوق خط الأساس",
"slashSubscript": "نص منخفض",
"slashSubscriptDesc": "نص تحت خط الأساس",
"slashClarify": "توضيح",
"slashClarifyDesc": "جعل النص أوضح",
"slashShorten": "اختصار",
"slashShortenDesc": "تكثيف النص",
"slashImprove": "تحسين",
"slashImproveDesc": "تحسين الأسلوب",
"slashExpand": "توسيع",
"slashExpandDesc": "توسيع وإثراء النص",
"imageModalTitle": "إدراج صورة",
"imageModalPreview": "معاينة",
"imageModalCancel": "إلغاء",
"imageModalInsert": "إدراج",
"imageModalInvalidUrl": "الرجاء إدخال رابط صالح",
"imageModalLoadFailed": "فشل تحميل الصورة",
"linkPlaceholder": "الصق أو اكتب رابطاً...",
"bold": "عريض",
"italic": "مائل",
"underline": "تسطير",
"strike": "يتوسطه خط",
"code": "كود",
"highlight": "تمييز",
"superscript": "نص مرتفع",
"subscript": "نص منخفض",
"addBlock": "إضافة كتلة",
"placeholder": "اكتب '/' للأوامر..."
}
}
}

View File

@@ -429,7 +429,10 @@
"shorten": "خلاصه کردن",
"improve": "بهبود",
"toMarkdown": "به مارک‌داون",
"describeImages": "توصیف تصاویر"
"describeImages": "توصیف تصاویر",
"fixGrammar": "اصلاح گرامر",
"translate": "ترجمه",
"explain": "توضیح"
},
"openAssistant": "باز کردن دستیار هوش مصنوعی",
"poweredByMomento": "پشتیبانی شده توسط Momento AI",