mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-30 07:05:24 +00:00
* fix(sso): send the PKCE verifier for GitHub login (#1534) * fix(remote-desktop): clip cursor overflow without disabling zoom (#1535) * test(remote-desktop): preserve sessions beyond one hour (#1536) * fix(hosts): expose controls for overflowing editor tabs (#1537) * fix(hosts): expose controls for overflowing editor tabs * test(hosts): mock resize observation in admin panel tests * fix(status): skip TCP probes while host sessions are active (#1538) * fix(database): batch session activity persistence (#1539) * docs(api): describe cookie and API key authentication (#1540) * fix(snippets): repair missing note column on SQLite upgrades (#1541) * fix(docker): retain stored SSH credential association (#1543) * fix(file-manager): render transfer toasts without plugin hooks (#1546) * feat(hosts): keep compact row actions inline (#1547) * fix(auth): allow retrying unavailable second-factor interfaces (#1549) * fix(auth): reject unresolved legacy identity provisioning (#1550) * fix(desktop): ship the plugin SDK inside Mac App Store builds (#1551) * fix(tmux): pass full session info to the terminal's session picker (#1552) The tmux.sessions service reduced detected sessions to bare names, but the picker reads session.name, so every entry rendered blank and selecting one sent an empty name, which created a new session instead of attaching. * fix(ssh): read force keyboard-interactive as a boolean when resolving hosts (#1553) The column holds the text "true"/"false", and the resolver passed it through as-is. The string "false" is truthy, so the password provider treated every saved host as forced keyboard-interactive and left the password out. Jump hops are built straight from the resolved host, so a password hop whose server doesn't offer keyboard-interactive failed with "All configured authentication methods failed". * fix(database): batch database saves for bulk host writes (#1554) * fix(database): yield to the event loop between database saves Each SQLite save serializes and encrypts the whole database into new buffers, which V8 only releases once the event loop turns. Boot migrations and bulk host import write plugin settings per host and per key in an awaited loop, so hundreds of full copies piled up and the container ran out of memory. * fix(database): save once per bulk host write instead of once per row On SQLite every repository write force-saves the whole database. Boot plugin data migrations, host defaults materialization and the bulk host routes write one row per host per setting, so they serialized and encrypted the full database hundreds of times in a row. DatabaseSaveTrigger.batched wraps a function so force saves made while it runs collapse into a single save when it finishes. Nested scopes fold into the outer one, and work that outlives its scope saves normally. * feat(hosts): add instance-wide predefined tag suggestions (#1548) * feat(hosts): add shared predefined tag suggestions * style(hosts): format tag catalog routes * test(database): advance fake timers past the save yield (#1555) * fix(i18n): complete Simplified Chinese core and plugin translations (#1542) * fix(i18n): complete Chinese onboarding and navigation labels * fix(i18n): translate remaining Chinese core and plugin interfaces * fix(i18n): translate host editor tab overflow controls * fix(i18n): use consistent Chinese fleet terminology * fix(i18n): localize hardcoded controls and plugin views * fix(i18n): translate built-in homepage widget catalog * test(homepage): follow translated timezone placeholder * fix(i18n): translate plugin-provided homepage widgets * fix(i18n): localize feature settings section titles * fix: 2.8 oidc accounts unable to sign in after upgrading (#1381) * fix: plugins losing the saved ssh login when copying a host (#1391) * fix: fleets, proxmox and automations not getting the host sudo password * fix: host imports running a defaults pass and metrics restart per host (#1384) * fix: high cpu from status probes and full database saves on every sample (#1300) * fix: user data export freezing the server (#1393) * fix: op:// secret references rejected as ssh keys on credentials (#1394) * fix: slow file deletes from the trash lookups on every delete (#1390) * fix: add openapi docs and error handling to host tag routes * test: compare download stream buffers directly so it stops timing out * chore: drop em dash from host row comment * chore: update release notes for 2.9.1 * fix: restore space to add host tags and redesign predefined tags editor * fix: host key silently accepted when the host is missing from the database (#1397) * fix: clearer host login failed status label and fix its translations (#1396) * chore: add host key and status label fixes to release notes * fix: sso and ldap provider dialogs overflowing the screen and using mismatched toggles * chore: increment ver * fix(audit): store plugin entries with no acting user as a null user_id (#1556) Plugin audit entries written outside a request used the literal "system" as user_id. That column references users.id, so the insert was refused (Postgres logs it as an FK violation) and the entry was silently dropped. Write null instead and keep "system" / plugin:<id> in username. * chore: add sso/ldap dialog and audit log fixes to release notes * fix: tunnels and host settings missing from shared hosts on desktop * fix: remote desktop logins missing from shared hosts on desktop * fix: simplify host status to online/offline and keep it live without a refresh * chore: sync Crowdin translations for 2.9.1 --------- Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
316 lines
15 KiB
JSON
316 lines
15 KiB
JSON
{
|
|
"nav": {
|
|
"hostMetrics": "مقاييس المضيف"
|
|
},
|
|
"hostMetrics": {
|
|
"cpu": "المعالج",
|
|
"memory": "الذاكرة",
|
|
"disk": "القرص",
|
|
"network": "الشبكة",
|
|
"uptime": "مدة التشغيل",
|
|
"processes": "العمليات",
|
|
"available": "المتاح",
|
|
"free": "الخالي",
|
|
"connecting": "جارٍ الاتصال...",
|
|
"connectionFailed": "فشل الاتصال بالخادم",
|
|
"naCpus": "غير متوفر",
|
|
"cpuCores_one": "{{count}} نواة",
|
|
"cpuCores_other": "{{count}} نوى",
|
|
"cpuUsage": "استخدام المعالج",
|
|
"memoryUsage": "استخدام الذاكرة",
|
|
"diskUsage": "استخدام القرص",
|
|
"selectFilesystem": "حدد نظام الملفات",
|
|
"temperature": "درجة الحرارة",
|
|
"highestTemperature": "أعلى درجة حرارة",
|
|
"primaryTemperatureSensor": "المستشعر الأساسي",
|
|
"gpu": {
|
|
"title": "وحدة معالجة الرسومات",
|
|
"noDevice": "لم يتم الكشف عن وحدة معالجة رسومات NVIDIA. قم بتثبيت برنامج تشغيل NVIDIA (يوفر nvidia-smi) لعرض مقاييس وحدة معالجة الرسومات.",
|
|
"driver": "السائق {{version}}",
|
|
"utilization": "استخدام",
|
|
"memory": "ذاكرة الوصول العشوائي للفيديو",
|
|
"temperature": "درجة حرارة",
|
|
"power": "قوة",
|
|
"fan": "معجب",
|
|
"processes": "عمليات وحدة معالجة الرسومات",
|
|
"noProcesses": "لا توجد عمليات تستخدم وحدة معالجة الرسومات (GPU)."
|
|
},
|
|
"failedToFetchHostConfig": "فشل جلب تكوين المضيف",
|
|
"serverOffline": "الخادم غير متصل",
|
|
"cannotFetchMetrics": "لا يمكن جلب المؤشرات من خادم غير متصل",
|
|
"totpFailed": "فشل التحقق من TOTP",
|
|
"noneAuthNotSupported": "مقاييس المضيف لا تدعم نوع المصادقة 'none'.",
|
|
"noHostSelected": "لم يتم تحديد مضيف",
|
|
"load": "الحمل",
|
|
"systemInfo": "معلومات النظام",
|
|
"hostname": "اسم المضيف",
|
|
"operatingSystem": "نظام التشغيل",
|
|
"kernel": "النواة",
|
|
"seconds": "ثوانٍ",
|
|
"networkInterfaces": "واجهات الشبكة",
|
|
"noInterfacesFound": "لم يتم العثور على واجهات شبكة",
|
|
"noProcessesFound": "لم يتم العثور على عمليات",
|
|
"processesTotal": "الإجمالي",
|
|
"processesRunning": "قيد التشغيل",
|
|
"loginStats": "إحصائيات تسجيل الدخول عبر SSH",
|
|
"noRecentLoginData": "لا توجد بيانات تسجيل دخول حديثة",
|
|
"ports": {
|
|
"title": "المنافذ المستمعة",
|
|
"protocol": "البروتوكول",
|
|
"port": "المنفذ",
|
|
"address": "العنوان",
|
|
"process": "العملية",
|
|
"search": "بحث في المنافذ...",
|
|
"allProtocols": "الكل",
|
|
"noData": "لا توجد بيانات للمنافذ المستمعة"
|
|
},
|
|
"firewall": {
|
|
"title": "جدار الحماية",
|
|
"inactive": "غير نشط",
|
|
"policy": "السياسة",
|
|
"rules": "قواعد",
|
|
"noRules": "لا توجد قواعد في هذه السلسلة",
|
|
"noData": "لا توجد بيانات لجدار الحماية",
|
|
"action": "الإجراء",
|
|
"protocol": "البروتوكول",
|
|
"port": "المنفذ",
|
|
"source": "المصدر",
|
|
"anywhere": "أي مكان",
|
|
"chains": "السلاسل"
|
|
},
|
|
"loadAvg": "متوسط التحميل",
|
|
"swap": "التبديل",
|
|
"architecture": "المعمارية",
|
|
"refresh": "تحديث",
|
|
"retry": "إعادة المحاولة",
|
|
"customize": "تخصيص التخطيط",
|
|
"reset": "إعادة تعيين",
|
|
"tabLive": "مباشر",
|
|
"editModeInstructions": "اسحب البطاقات لإعادة ترتيبها، واسحب الحافة السفلية لتغيير حجمها، واستخدم زر العرض لتغيير امتداد البطاقة. أضف البطاقات أو أزلها أدناه.",
|
|
"managers": {
|
|
"services": "الخدمات",
|
|
"processInspector": "مفتش العمليات",
|
|
"logViewer": "عارض السجلات",
|
|
"cron": "مهام كرون",
|
|
"packages": "الحزم",
|
|
"ssl": "شهادات SSL",
|
|
"firewall": "جدار الحماية",
|
|
"users": "المستخدمون والأذونات",
|
|
"healthCheck": "فحوصات الصحة",
|
|
"diskBreakdown": "تفصيل القرص",
|
|
"systemdTimers": "المؤقتات",
|
|
"topMemory": "الأعلى استهلاكًا للذاكرة",
|
|
"noData": "لا توجد بيانات",
|
|
"sudoHint": "قم بتعيين كلمة مرور sudo لهذا المضيف في محرر المضيف لتمكين الإجراءات المميزة.",
|
|
"filter": "تصفية...",
|
|
"start": "بدء",
|
|
"stop": "إيقاف",
|
|
"restart": "إعادة تشغيل",
|
|
"actionDone": "تم تحديث {{name}}",
|
|
"actionFailed": "فشل الإجراء",
|
|
"signalSent": "تم إرسال إشارة إلى PID {{pid}}",
|
|
"killHint": "نقرة: إنهاء (SIGTERM). نقرة بزر الماوس الأيمن: إنهاء إجباري (SIGKILL).",
|
|
"working": "جارٍ العمل...",
|
|
"update": "تحديث",
|
|
"upgradeAll": "ترقية الكل",
|
|
"allUpToDate": "كل شيء محدث",
|
|
"save": "حفظ",
|
|
"command": "أمر",
|
|
"enabled": "مفعل",
|
|
"cronSaved": "تم تحديث crontab",
|
|
"clients": "العملاء",
|
|
"dryRun": "تشغيل تجريبي",
|
|
"renew": "تجديد",
|
|
"noAcmeClient": "لم يتم العثور على عميل ACME (certbot أو acme.sh) على هذا المضيف.",
|
|
"addInputRule": "إضافة قاعدة INPUT",
|
|
"firewallWarning": "التغييرات مؤقتة حتى يتم حفظها. احذر من قفل وصولك.",
|
|
"ruleApplied": "تم تطبيق القاعدة",
|
|
"invalidPort": "أدخل منفذًا صالحًا (1-65535)",
|
|
"newUsername": "اسم مستخدم جديد",
|
|
"addUser": "إضافة",
|
|
"deleteUser": "حذف المستخدم",
|
|
"noHealthChecks": "لم يتم تكوين فحوصات الصحة بعد.",
|
|
"follow": "متابعة",
|
|
"noLogData": "لا توجد مخرجات سجل.",
|
|
"tree": "شجري",
|
|
"enableDisable": "تفعيل / تعطيل عند الإقلاع",
|
|
"grantSudo": "منح sudo",
|
|
"revokeSudo": "سحب sudo",
|
|
"sslIssueCert": "إصدار شهادة",
|
|
"sslExpired": "منتهية الصلاحية",
|
|
"sslInDays": "خلال {{days}} يومًا",
|
|
"sslNeedDomain": "أدخل نطاقًا واحدًا على الأقل",
|
|
"sslIssued": "تم إصدار الشهادة",
|
|
"sslDomainsPlaceholder": "example.com, www.example.com",
|
|
"sslHttpStandalone": "HTTP (مستقل)",
|
|
"sslHttpWebroot": "HTTP (webroot)",
|
|
"sslDns": "DNS",
|
|
"sslDnsProvider": "مزود DNS (مثل cloudflare)",
|
|
"sslIssueHint": "يجب أن تكون بيانات اعتماد مزود DNS قد تم تكوينها مسبقًا على المضيف.",
|
|
"sslRevoke": "إلغاء الشهادة",
|
|
"sslRevoked": "تم إلغاء الشهادة",
|
|
"sslRevokeConfirm": "هل تريد إلغاء الشهادة \"{{name}}\" وإزالتها؟ لا يمكن التراجع عن هذا الإجراء.",
|
|
"healthRun": "تشغيل",
|
|
"healthName": "الاسم",
|
|
"healthTarget": "المضيف / العنوان",
|
|
"healthAddCheck": "إضافة فحص",
|
|
"healthSaved": "تم حفظ فحوصات الصحة",
|
|
"healthMissingFields": "يتطلب كل فحص اسمًا وهدفًا",
|
|
"logFile": "ملف",
|
|
"logUnit": "وحدة",
|
|
"logCustomPath": "مسار مخصص تحت /var/log (اختياري)",
|
|
"logGrep": "تصفية السطور...",
|
|
"firewallPersist": "حفظ القواعد",
|
|
"firewallPersisted": "تم حفظ قواعد جدار الحماية",
|
|
"wireguard": "WireGuard",
|
|
"wgNotInstalled": "WireGuard غير مثبت على هذا المضيف",
|
|
"wgNoInterfaces": "لا توجد واجهات WireGuard مُعدّة",
|
|
"wgInterfaceUp": "رفع",
|
|
"wgInterfaceDown": "إنزال",
|
|
"wgBringingUp": "جارٍ رفع {{name}}...",
|
|
"wgBringingDown": "جارٍ إنزال {{name}}...",
|
|
"wgInterfaceUpDone": "{{name}} مرفوع",
|
|
"wgInterfaceDownDone": "{{name}} منزّل",
|
|
"wgListenPort": "المنفذ",
|
|
"wgPublicKey": "المفتاح العام",
|
|
"wgEndpoint": "نقطة النهاية",
|
|
"wgAllowedIPs": "عناوين IP المسموح بها",
|
|
"wgLastHandshake": "آخر مصافحة",
|
|
"wgHandshakeNever": "أبدًا",
|
|
"wgTransfer": "نقل",
|
|
"wgNoPeers": "لا يوجد نظراء"
|
|
}
|
|
},
|
|
"metricsHistory": {
|
|
"title": "سجل المقاييس",
|
|
"historySuffix": "السجل",
|
|
"cpuMemoryDisk": "وحدة المعالجة المركزية / الذاكرة / القرص",
|
|
"network": "الشبكة",
|
|
"download": "استقبال",
|
|
"upload": "إرسال",
|
|
"noData": "لا توجد بيانات تاريخية متاحة لهذا النطاق الزمني.",
|
|
"custom": "مخصص",
|
|
"to": "إلى",
|
|
"apply": "تطبيق",
|
|
"viewHistory": "عرض السجل"
|
|
},
|
|
"hosts": {
|
|
"tabHostMetrics": "مقاييس المضيف",
|
|
"metricsCollectionLabel": "تجميع المقاييس",
|
|
"enableMetricsLabel": "تمكين المقاييس",
|
|
"enableMetricsDesc": "تجميع مقاييس وحدة المعالجة المركزية والذاكرة والقرص وغيرها من هذا المضيف",
|
|
"useGlobalMetrics": "استخدام الفاصل الزمني العام",
|
|
"useGlobalMetricsDesc": "تجاوز باستخدام فترة المقاييس على مستوى الخادم",
|
|
"metricsIntervalS": "فترة المقاييس (ثانية)",
|
|
"metricsIntervalDesc2": "الثواني بين لقطات المقاييس",
|
|
"excludedMountsLabel": "التركيبات المستثناة",
|
|
"monitoredMountsLabel": "مسارات مراقبة مخصصة",
|
|
"monitoredMountsDesc": "أضف المسارات التي لا يتم عرضها كعمليات ربط منفصلة، بما في ذلك مسارات Home Assistant المرتبطة مثل /config.",
|
|
"monitoredMountPathPlaceholder": "المسار (/config، /mnt/data)",
|
|
"monitoredMountLabelPlaceholder": "وسم (اختياري)",
|
|
"addMonitoredMount": "إضافة مسار",
|
|
"excludedMountsDesc": "إخفاء نقاط التحميل المحددة أو أنواع أنظمة الملفات (مثل nfs و cifs) من استخدام القرص والتنبيهات لهذا المضيف.",
|
|
"excludedMountsPlaceholder": "مسار التثبيت (/mnt/nas) أو نوع نظام الملفات (nfs، cifs)",
|
|
"excludedMountsEmpty": "لم يتم استبعاد أي وحدات تخزين. يتم عرض جميع أنظمة الملفات المكتشفة.",
|
|
"addExcludedMount": "إضافة",
|
|
"visibleWidgets": "الأدوات المرئية",
|
|
"widgetsMovedToHostMetrics": "تتم الآن إضافة البطاقات وترتيبها وتغيير حجمها مباشرةً في علامة تبويب مقاييس المضيف. افتح مقاييس المضيف لهذا المضيف واستخدم تخصيص لاختيار البطاقات التي ستظهر.",
|
|
"hostNotFound": "المضيف غير موجود",
|
|
"loadingHost": "جارٍ تحميل المضيف..."
|
|
},
|
|
"onboarding": {
|
|
"feature_metrics": "المقاييس والتنبيهات",
|
|
"feature_metrics_desc": "تتبع أداء وحدة المعالجة المركزية والذاكرة والقرص بمرور الوقت، واحصل على تنبيهات عند حدوث مشاكل فيها."
|
|
},
|
|
"admin": {
|
|
"metricsHistoryRetention": "الاحتفاظ بسجل المقاييس",
|
|
"metricsHistoryRetentionRange": "من 1 إلى 90 يومًا",
|
|
"days": "أيام"
|
|
},
|
|
"homepage": {
|
|
"noData": "لا توجد بيانات",
|
|
"showCurrentValue": "إظهار القيمة الحالية",
|
|
"chartMetric": "المقياس",
|
|
"metricRange": "النطاق",
|
|
"host": "المضيف",
|
|
"loading": "جار التحميل...",
|
|
"metricCpu": "CPU",
|
|
"metricDisk": "القرص",
|
|
"metricHostname": "اسم المضيف",
|
|
"metricKernel": "النواة",
|
|
"metricMemory": "الذاكرة",
|
|
"metricNetwork": "الشبكة",
|
|
"metricOs": "نظام التشغيل",
|
|
"metricProcesses": "العمليات",
|
|
"metricProcessesRunning": "قيد التشغيل",
|
|
"metricProcessesTotal": "إجمالي",
|
|
"metricUptime": "وقت التشغيل",
|
|
"metricsNotAvailable": "المقاييس غير متوفرة",
|
|
"noHostSelected": "لم يتم تحديد أي مضيف",
|
|
"selectHost": "اختيار مضيف..."
|
|
},
|
|
"terminalStatus": {
|
|
"unavailable": "الإحصائيات المباشرة غير متوفرة"
|
|
},
|
|
"dashboard": {
|
|
"cpu": "المعالج",
|
|
"ram": "الذاكرة"
|
|
},
|
|
"dashboardTab": {
|
|
"disk": "القرص"
|
|
},
|
|
"terminal": {
|
|
"connected": "متصل"
|
|
},
|
|
"permissions": {
|
|
"use": {
|
|
"title": "استخدام مقاييس المضيف",
|
|
"description": "يمكنك عرض مقاييس المضيف واستخدام مديري المضيف (الخدمات والحزم وجدار الحماية والمزيد) على المضيفين الذين يمكنك الوصول إليهم."
|
|
}
|
|
},
|
|
"settings": {
|
|
"admin": {
|
|
"metricsInterval": {
|
|
"label": "فاصل القياسات (بالثواني)",
|
|
"description": "عدد مرات أخذ عينات من المضيف الذي تتم مشاهدته، ما لم يحدد المضيف الفاصل الزمني الخاص به."
|
|
},
|
|
"historyRetentionDays": {
|
|
"label": "مدة الاحتفاظ بالسجل (بالأيام)",
|
|
"description": "مدة الاحتفاظ بعينات المقاييس في مخططات التاريخ."
|
|
},
|
|
"enabledForNewHosts": {
|
|
"label": "تم تفعيل المقاييس للمضيفين الجدد",
|
|
"description": "ما إذا كانت الأجهزة المضيفة الجديدة تبدأ بتفعيل خاصية جمع البيانات الإحصائية."
|
|
}
|
|
},
|
|
"user": {
|
|
"temperatureUnit": {
|
|
"label": "وحدة قياس درجة الحرارة",
|
|
"description": "كيفية عرض درجات الحرارة في مقاييس المضيف.",
|
|
"celsius": "درجة مئوية",
|
|
"fahrenheit": "فهرنهايت"
|
|
}
|
|
},
|
|
"host": {
|
|
"metricsEnabled": {
|
|
"label": "جمع المقاييس"
|
|
},
|
|
"metricsInterval": {
|
|
"label": "فاصل القياسات (بالثواني)"
|
|
},
|
|
"enabledWidgets": {
|
|
"label": "الأدوات المُفعّلة"
|
|
},
|
|
"excludedMounts": {
|
|
"label": "التركيبات المستثناة"
|
|
},
|
|
"monitoredMounts": {
|
|
"label": "المسارات المراقبة"
|
|
}
|
|
}
|
|
},
|
|
"plugin": {
|
|
"name": "Host Metrics"
|
|
}
|
|
}
|