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
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:
@@ -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": "اكتب '/' للأوامر..."
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -429,7 +429,10 @@
|
||||
"shorten": "خلاصه کردن",
|
||||
"improve": "بهبود",
|
||||
"toMarkdown": "به مارکداون",
|
||||
"describeImages": "توصیف تصاویر"
|
||||
"describeImages": "توصیف تصاویر",
|
||||
"fixGrammar": "اصلاح گرامر",
|
||||
"translate": "ترجمه",
|
||||
"explain": "توضیح"
|
||||
},
|
||||
"openAssistant": "باز کردن دستیار هوش مصنوعی",
|
||||
"poweredByMomento": "پشتیبانی شده توسط Momento AI",
|
||||
|
||||
Reference in New Issue
Block a user