Configure breach monitoring and desktop integration
+
+
+
Breach Monitoring
+
+
+
Check passwords against Have I Been Pwned
+
Uses k-anonymity (only first 5 hash chars sent). Never sends full password.
+
+
+
+
+
+
Auto-check on password fields
+
Show breach indicator automatically when you enter a password
+
+
+
+
+
+
Show Soterios icon in password fields
+
Click to manually check any password
+
+
+
+
+
+
+
Desktop App Integration
+
+
+
Notify Soterios desktop app of leaks
+
Sends breach alerts to the desktop app via native messaging
+
+
+
+
+
+
Settings saved
+
+
+ Note: Desktop integration requires the Soterios native messaging host installed. The installer sets this up automatically. If desktop notifications don't work, reinstall Soterios or run node tools/install-native-host.js as admin.
+
';
+ document.getElementById('result').style.display = 'block';
+ } finally {
+ btn.disabled = false;
+ loader.classList.remove('active');
+ }
+});
+
+document.getElementById('openOptions').addEventListener('click', (e) => {
+ e.preventDefault();
+ chrome.runtime.openOptionsPage();
+});
+
+checkConnection();
+setInterval(checkConnection, 30000);
\ No newline at end of file
diff --git a/src/i18n/locales/ar.json b/src/i18n/locales/ar.json
index 0f0d252..dea3e18 100644
--- a/src/i18n/locales/ar.json
+++ b/src/i18n/locales/ar.json
@@ -786,12 +786,20 @@
"passwords.crackTimeDays": "{count} days",
"passwords.crackTimeYears": "{count} years",
"passwords.crackTimeCenturies": "{count} centuries",
- "health.malware.label": "Malware Scan Results",
- "health.malware.noScan": "No scan has been run yet.",
- "health.malware.clean": "No threats found in the most recent scan.",
- "health.malware.low": "{count} threat match(es) found in the most recent scan.",
- "health.malware.high": "{count} threat matches found in the most recent scan.",
- "health.scanRecency.label": "Scan Recency",
+ "health.malware.label": "نتائج فحص البرمجيات الخبيثة",
+ "health.malware.noScan": "لم يتم تشغيل أي فحص بعد.",
+ "health.malware.clean": "لم يتم العثور على تهديدات في آخر فحص.",
+ "health.malware.low": "تم العثور على {count} تطابق(ات) تهديد في آخر فحص.",
+ "health.malware.high": "تم العثور على {count} تطابقات تهديد في آخر فحص.",
+ "health.label.malware": "نتائج فحص البرمجيات الخبيثة",
+ "health.label.scanRecency": "حداثة الفحص",
+ "health.label.disk": "مساحة القرص",
+ "health.label.memory": "استخدام الذاكرة",
+ "health.label.load": "حمل وحدة المعالجة المركزية",
+ "health.label.uptime": "وقت تشغيل النظام",
+ "health.label.rtp": "الحماية في الوقت الفعلي",
+ "health.label.firewall": "جدار الحماية",
+ "health.scanRecency.label": "حداثة الفحص",
"health.scanRecency.recent": "Last scan ran within the last day.",
"health.scanRecency.daysAgo": "Last scan ran {days} day(s) ago.",
"health.disk.label": "Disk Space",
@@ -869,11 +877,29 @@
"audit.check.secureBoot.rec": "Enable Secure Boot in your UEFI/BIOS firmware settings.",
"audit.check.execPolicy.rec2": "Check execution policy with Get-ExecutionPolicy -List in PowerShell.",
"audit.check.bitlocker.rec2": "Check BitLocker status in Windows settings.",
- "scanIndicator.scanning": "Scanning…",
- "scanIndicator.complete": "Scan complete",
- "scanIndicator.canceled": "Scan canceled",
- "scanIndicator.failed": "Scan failed",
- "scanIndicator.threatsFound": "{count} threat(s) found",
+ "scanIndicator.scanning": "جاري الفحص…",
+ "scanIndicator.complete": "اكتمل الفحص",
+ "scanIndicator.canceled": "تم إلغاء الفحص",
+ "scanIndicator.failed": "فشل الفحص",
+ "scanIndicator.threatsFound": "تم العثور على {count} تهديد",
"dashboard.rtpTitle": "الحماية في الوقت الحقيقي",
- "firewall.detailDirection": "{direction} {est}"
+ "firewall.detailDirection": "{direction} {est}",
+ "health.reason.noScan": "لم يتم تشغيل أي فحص بعد.",
+ "health.reason.noThreats": "لم يتم العثور على تهديدات في أحدث فحص.",
+ "health.reason.threatsFound": "تم العثور على {count} تطابق للتهديدات في أحدث فحص.",
+ "health.reason.scanToday": "تم تشغيل آخر فحص خلال اليوم الماضي.",
+ "health.reason.scanDaysAgo": "تم تشغيل آخر فحص منذ {days} يوم.",
+ "health.reason.diskLowSpace": "مساحة منخفضة على: {volumes} ({pct}% مستخدم).",
+ "health.reason.diskNoVolumes": "لم يتم العثور على وحدات تخزين مرئية للمستخدم لتقييم القرص.",
+ "health.reason.diskHealthy": "جميع الوحدات سليمة (أعلى استخدام {pct}%).",
+ "health.reason.memoryUsage": "{pct}% من الذاكرة قيد الاستخدام.",
+ "health.reason.cpuLoad": "حمل المعالج عند {pct}%.",
+ "health.reason.uptimeToday": "أعيد التشغيل خلال اليوم الماضي.",
+ "health.reason.uptimeDays": "أعيد التشغيل منذ {days} يوم — ضمن النطاق الطبيعي.",
+ "health.reason.uptimeWeeks": "يعمل منذ {days} يوم دون إعادة تشغيل — يُنصح بإعادة التشغيل قريبًا للتحديثات.",
+ "health.reason.uptimeLong": "يعمل منذ {days} يوم دون إعادة تشغيل — يُنصح بإعادة التشغيل للتحديثات المعلقة.",
+ "health.reason.rtpActive": "الحماية في الوقت الحقيقي نشطة.",
+ "health.reason.rtpDisabled": "الحماية في الوقت الحقيقي معطلة.",
+ "health.reason.firewallActive": "جدار حماية Windows نشط.",
+ "health.reason.firewallDisabled": "جدار حماية Windows معطل."
}
\ No newline at end of file
diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json
index 3700ac7..a31cfc8 100644
--- a/src/i18n/locales/de.json
+++ b/src/i18n/locales/de.json
@@ -788,11 +788,19 @@
"passwords.crackTimeYears": "{count} years",
"passwords.crackTimeCenturies": "{count} centuries",
"health.malware.label": "Malware Scan Results",
- "health.malware.noScan": "No scan has been run yet.",
- "health.malware.clean": "No threats found in the most recent scan.",
- "health.malware.low": "{count} threat match(es) found in the most recent scan.",
- "health.malware.high": "{count} threat matches found in the most recent scan.",
- "health.scanRecency.label": "Scan Recency",
+ "health.malware.noScan": "Noch kein Scan ausgeführt.",
+ "health.malware.clean": "Keine Bedrohungen im letzten Scan gefunden.",
+ "health.malware.low": "{count} Bedrohungs-Treffer im letzten Scan.",
+ "health.malware.high": "{count} Bedrohungs-Treffer im letzten Scan.",
+ "health.label.malware": "Ergebnisse des Malware-Scans",
+ "health.label.scanRecency": "Scan-Aktualität",
+ "health.label.disk": "Festplattenplatz",
+ "health.label.memory": "Speichernutzung",
+ "health.label.load": "CPU-Auslastung",
+ "health.label.uptime": "Systemlaufzeit",
+ "health.label.rtp": "Echtzeitschutz",
+ "health.label.firewall": "Firewall",
+ "health.scanRecency.label": "Scan-Aktualität",
"health.scanRecency.recent": "Last scan ran within the last day.",
"health.scanRecency.daysAgo": "Last scan ran {days} day(s) ago.",
"health.disk.label": "Disk Space",
@@ -873,8 +881,26 @@
"scanIndicator.scanning": "Scanning…",
"scanIndicator.complete": "Scan complete",
"scanIndicator.canceled": "Scan canceled",
- "scanIndicator.failed": "Scan failed",
+ "scanIndicator.failed": "Scan fehlgeschlagen",
"scanIndicator.threatsFound": "{count} threat(s) found",
"dashboard.rtpTitle": "Echtzeitschutz",
- "firewall.detailDirection": "{direction} {est}"
+ "firewall.detailDirection": "{direction} {est}",
+ "health.reason.noScan": "Noch kein Scan ausgeführt.",
+ "health.reason.noThreats": "Keine Bedrohungen im letzten Scan gefunden.",
+ "health.reason.threatsFound": "{count} Bedrohungs-Treffer im letzten Scan.",
+ "health.reason.scanToday": "Letzter Scan lief innerhalb des letzten Tages.",
+ "health.reason.scanDaysAgo": "Letzter Scan vor {days} Tag(en).",
+ "health.reason.diskLowSpace": "Wenig Platz auf: {volumes} ({pct}% belegt).",
+ "health.reason.diskNoVolumes": "Keine benutzerseitigen Volumes für Disk-Scoring gefunden.",
+ "health.reason.diskHealthy": "Alle Volumes gesund (höchste Nutzung {pct}%).",
+ "health.reason.memoryUsage": "{pct}% des Speichers in Verwendung.",
+ "health.reason.cpuLoad": "CPU-Last bei {pct}%.",
+ "health.reason.uptimeToday": "Neugestartet innerhalb des letzten Tages.",
+ "health.reason.uptimeDays": "Neugestartet vor {days} Tag(en) — im normalen Bereich.",
+ "health.reason.uptimeWeeks": "Läuft seit {days} Tagen ohne Neustart — Neustart empfohlen für Updates.",
+ "health.reason.uptimeLong": "Läuft seit {days} Tagen ohne Neustart — Neustart empfohlen für ausstehende Updates.",
+ "health.reason.rtpActive": "Echtzeitschutz ist aktiv.",
+ "health.reason.rtpDisabled": "Echtzeitschutz ist deaktiviert.",
+ "health.reason.firewallActive": "Windows-Firewall ist aktiv.",
+ "health.reason.firewallDisabled": "Windows-Firewall ist deaktiviert."
}
\ No newline at end of file
diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json
index 1592cef..4f854cd 100644
--- a/src/i18n/locales/en.json
+++ b/src/i18n/locales/en.json
@@ -117,7 +117,22 @@
"settings.geoLookup.desc": "Resolve IP addresses to display a world map of active connections",
"settings.networkPerimeterMap.label": "Network Perimeter Map",
"settings.networkPerimeterMap.desc": "Show the live connection visualization on the Firewall page",
+"settings.browserExtension.label": "Browser Extension Integration",
+ "settings.browserExtension.desc": "Receive credential leak alerts from the Soterios browser extension (requires native messaging host)",
+ "settings.browserExtension.installing": "Installing native messaging host...",
+ "settings.browserExtension.installed": "Native messaging host installed. Install the extension from Chrome Web Store.",
+ "settings.browserExtension.installFailed": "Failed to install native host: {error}",
+ "settings.browserExtension.disabled": "Browser extension integration disabled",
"settings.colorScheme": "Color Scheme",
+ "tray.systemHealth": "System Health",
+ "tray.rtpActive": "RTP Active",
+ "tray.rtpOff": "RTP Off",
+ "tray.network": "Network",
+ "tray.quickScan": "Quick Scan",
+ "tray.openApp": "Open Soterios",
+ "tray.quit": "Quit",
+ "tray.lastScanAgo": "Last scan {ago}",
+ "tray.networkRxTx": "↓ {rx} KB/s ↑ {tx} KB/s",
"settings.theme.dark": "Dark",
"settings.theme.light": "Light",
"settings.theme.ocean": "Ocean",
@@ -833,6 +848,14 @@
"health.malware.clean": "No threats found in the most recent scan.",
"health.malware.low": "{count} threat match(es) found in the most recent scan.",
"health.malware.high": "{count} threat matches found in the most recent scan.",
+ "health.label.malware": "Malware Scan Results",
+ "health.label.scanRecency": "Scan Recency",
+ "health.label.disk": "Disk Space",
+ "health.label.memory": "Memory Usage",
+ "health.label.load": "CPU Load",
+ "health.label.uptime": "System Uptime",
+ "health.label.rtp": "Real-Time Protection",
+ "health.label.firewall": "Firewall",
"health.scanRecency.label": "Scan Recency",
"health.scanRecency.recent": "Last scan ran within the last day.",
"health.scanRecency.daysAgo": "Last scan ran {days} day(s) ago.",
diff --git a/src/i18n/locales/es.json b/src/i18n/locales/es.json
index 2d8048d..6be6467 100644
--- a/src/i18n/locales/es.json
+++ b/src/i18n/locales/es.json
@@ -795,6 +795,14 @@
"passwords.crackTimeDays": "{count} días",
"passwords.crackTimeYears": "{count} años",
"passwords.crackTimeCenturies": "{count} siglos",
+ "health.label.malware": "Resultados del escaneo de malware",
+ "health.label.scanRecency": "Recencia del escaneo",
+ "health.label.disk": "Espacio en disco",
+ "health.label.memory": "Uso de memoria",
+ "health.label.load": "Carga de CPU",
+ "health.label.uptime": "Tiempo de actividad del sistema",
+ "health.label.rtp": "Protección en tiempo real",
+ "health.label.firewall": "Firewall",
"health.malware.label": "Resultados del escaneo de malware",
"health.malware.noScan": "Aún no se ha ejecutado ningún escaneo.",
"health.malware.clean": "No se encontraron amenazas en el escaneo más reciente.",
@@ -808,7 +816,12 @@
"health.disk.noVolumes": "No se encontraron volúmenes orientados al usuario para la puntuación de disco.",
"health.disk.healthy": "Todos los volúmenes saludables (uso máximo {usage}%).",
"health.memory.label": "Uso de memoria",
- "health.reason.uptimeToday": "Reiniciado en el último día.",
+ "health.memory.reason": "{pct}% de memoria en uso.",
+ "health.load.label": "Carga de CPU",
+ "health.load.reason": "Carga de CPU al {pct}%.",
+ "health.uptime.label": "Tiempo de actividad del sistema",
+ "health.rtp.label": "Protección en tiempo real",
+ "health.firewall.label": "Firewall",
"health.reason.uptimeDays": "Reiniciado hace {days} día(s) — dentro del rango normal.",
"health.reason.uptimeWeeks": "Ejecutándose {days} días sin reiniciar — considere reiniciar pronto para aplicar actualizaciones pendientes.",
"health.reason.uptimeLong": "Ejecutándose {days} días sin reiniciar — se recomienda reiniciar para aplicar actualizaciones pendientes.",
@@ -823,6 +836,9 @@
"health.reason.diskHealthy": "Todos los volúmenes saludables (uso máximo {pct}%).",
"health.reason.memoryUsage": "{pct}% de memoria en uso.",
"health.reason.cpuLoad": "Carga de CPU al {pct}%.",
+ "health.reason.noScan": "Aún no se ha ejecutado ningún escaneo.",
+ "health.reason.noThreats": "No se encontraron amenazas en el escaneo más reciente.",
+ "health.reason.threatsFound": "Se encontraron {count} coincidencia(s) de amenaza en el escaneo más reciente.",
"audit.check.defender.name": "Windows Defender",
"audit.check.rtp.name": "Protección en tiempo real",
"audit.check.uac.name": "Control de cuentas de usuario (UAC)",
diff --git a/src/i18n/locales/fr.json b/src/i18n/locales/fr.json
index ae5881e..1c40d67 100644
--- a/src/i18n/locales/fr.json
+++ b/src/i18n/locales/fr.json
@@ -794,7 +794,15 @@
"health.malware.clean": "No threats found in the most recent scan.",
"health.malware.low": "{count} threat match(es) found in the most recent scan.",
"health.malware.high": "{count} threat matches found in the most recent scan.",
- "health.scanRecency.label": "Scan Recency",
+ "health.label.malware": "Résultats de l'analyse anti-malware",
+ "health.label.scanRecency": "Récence de l'analyse",
+ "health.label.disk": "Espace disque",
+ "health.label.memory": "Utilisation mémoire",
+ "health.label.load": "Charge CPU",
+ "health.label.uptime": "Temps d'activité système",
+ "health.label.rtp": "Protection en temps réel",
+ "health.label.firewall": "Pare-feu",
+ "health.scanRecency.label": "Récence de l'analyse",
"health.scanRecency.recent": "Last scan ran within the last day.",
"health.scanRecency.daysAgo": "Last scan ran {days} day(s) ago.",
"health.disk.label": "Disk Space",
@@ -819,46 +827,64 @@
"toast.scanProgressTitle": "Progression de l'analyse Soterios",
"audit.check.defender.enabled.msg": "Defender antivirus is enabled and running.",
"audit.check.defender.disabled.msg": "Defender antivirus is disabled!",
- "audit.check.defender.disabled.detail": "Antivirus protection is turned off.",
- "audit.check.rtp.active.msg": "Real-time protection is active.",
- "audit.check.rtp.off.msg": "Real-time protection is off!",
- "audit.check.rtp.active.detail": "Threats are blocked as they appear.",
- "audit.check.rtp.off.detail": "Your system is vulnerable to active threats.",
- "audit.check.uac.enabled.msg": "UAC is enabled.",
- "audit.check.uac.disabled.msg": "UAC is disabled! This is a severe security risk.",
- "audit.check.uac.enabled.detail": "UAC prompts before making system-level changes.",
- "audit.check.uac.disabled.detail": "All programs run with full administrator privileges.",
- "audit.check.updates.none.msg": "No pending updates.",
- "audit.check.updates.none.detail": "All available updates are installed.",
- "audit.check.bitlocker.encrypted.msg": "System drive is encrypted.",
- "audit.check.bitlocker.encrypted.detail": "Your data is protected if the device is lost or stolen.",
- "audit.check.bitlocker.notEncrypted.msg": "System drive is NOT encrypted.",
- "audit.check.bitlocker.unavailable.msg": "BitLocker status unavailable.",
- "audit.check.bitlocker.notEncrypted.detail": "Anyone with physical access can read your data.",
- "audit.check.bitlocker.unknown.detail": "Could not determine BitLocker protection status.",
- "audit.check.bitlocker.unknown.msg": "BitLocker status could not be determined.",
- "audit.check.bitlocker.unexpected.detail": "Unexpected BitLocker response format.",
- "audit.check.bitlocker.na.msg": "BitLocker is not available on this system.",
- "audit.check.bitlocker.na.detail": "Requires Windows Pro/Enterprise and a TPM chip.",
- "audit.check.execPolicy.remoteSigned.msg": "Policy: RemoteSigned",
- "audit.check.execPolicy.restricted.msg": "Policy: Restricted",
- "audit.check.execPolicy.allSigned.msg": "Policy: AllSigned",
- "audit.check.execPolicy.secure.detail": "Only signed or locally authored scripts can run.",
- "audit.check.execPolicy.insecure.detail": "Less restrictive execution policy may allow untrusted scripts.",
- "audit.check.secureBoot.enabled.msg": "Secure Boot is enabled.",
- "audit.check.secureBoot.disabled.msg": "Secure Boot is disabled!",
- "audit.check.secureBoot.enabled.detail": "Only trusted bootloaders can run during system startup.",
- "audit.check.secureBoot.disabled.detail": "System is vulnerable to bootkit attacks.",
- "audit.check.defender.parseError.msg": "Could not parse Defender status.",
- "audit.check.defender.queryError.msg": "Failed to query Defender status.",
- "audit.check.defender.queryError.detail": "The Get-MpComputerStatus cmdlet may not be available on this system.",
- "audit.check.uac.error.msg": "Could not check UAC status.",
- "audit.check.updates.parseError.msg": "Could not parse update status.",
- "audit.check.updates.parseError.detail": "Unexpected response from Windows Update query.",
- "audit.check.updates.queryError.msg": "Could not query update status.",
- "audit.check.updates.queryError.detail": "Windows Update may be disabled or the COM query timed out.",
- "audit.check.bitlocker.info.msg": "BitLocker status unavailable (may not be supported on this edition).",
- "audit.check.bitlocker.info.detail": "BitLocker requires Windows Pro or Enterprise.",
+ "audit.check.defender.disabled.detail": "La protection antivirus est désactivée.",
+ "audit.check.rtp.active.msg": "La protection en temps réel est active.",
+ "audit.check.rtp.off.msg": "La protection en temps réel est désactivée !",
+ "audit.check.rtp.active.detail": "Les menaces sont bloquées dès leur apparition.",
+ "audit.check.rtp.off.detail": "Votre système est vulnérable aux menaces actives.",
+ "audit.check.uac.enabled.msg": "UAC est activé.",
+ "audit.check.uac.disabled.msg": "UAC est désactivé ! C'est un risque de sécurité grave.",
+ "audit.check.uac.enabled.detail": "UAC demande confirmation avant les changements système.",
+ "audit.check.uac.disabled.detail": "Tous les programmes s'exécutent avec les privilèges d'administrateur complets.",
+ "audit.check.updates.none.msg": "Aucune mise à jour en attente.",
+ "audit.check.updates.none.detail": "Toutes les mises à jour disponibles sont installées.",
+ "audit.check.bitlocker.encrypted.msg": "Le disque système est chiffré.",
+ "audit.check.bitlocker.encrypted.detail": "Vos données sont protégées si l'appareil est perdu ou volé.",
+ "audit.check.bitlocker.notEncrypted.msg": "Le disque système N'EST PAS chiffré.",
+ "audit.check.bitlocker.unavailable.msg": "État BitLocker indisponible.",
+ "audit.check.bitlocker.notEncrypted.detail": "Quiconque a un accès physique peut lire vos données.",
+ "audit.check.bitlocker.unknown.detail": "Impossible de déterminer l'état de protection BitLocker.",
+ "audit.check.bitlocker.unknown.msg": "Impossible de déterminer l'état BitLocker.",
+ "audit.check.bitlocker.unexpected.detail": "Format de réponse BitLocker inattendu.",
+ "audit.check.bitlocker.na.msg": "BitLocker n'est pas disponible sur ce système.",
+ "audit.check.bitlocker.na.detail": "Nécessite Windows Pro/Entreprise et une puce TPM.",
+ "audit.check.execPolicy.remoteSigned.msg": "Stratégie : RemoteSigned",
+ "audit.check.execPolicy.restricted.msg": "Stratégie : Restricted",
+ "audit.check.execPolicy.allSigned.msg": "Stratégie : AllSigned",
+ "audit.check.execPolicy.secure.detail": "Seuls les scripts signés ou créés localement peuvent s'exécuter.",
+ "audit.check.execPolicy.insecure.detail": "Une stratégie d'exécution moins restrictive peut autoriser des scripts non fiables.",
+ "audit.check.secureBoot.enabled.msg": "Secure Boot est activé.",
+ "audit.check.secureBoot.disabled.msg": "Secure Boot est désactivé !",
+ "audit.check.secureBoot.enabled.detail": "Seuls les chargeurs de démarrage de confiance peuvent s'exécuter au démarrage.",
+ "audit.check.secureBoot.disabled.detail": "Le système est vulnérable aux attaques bootkit.",
+ "audit.check.defender.parseError.msg": "Impossible d'analyser l'état de Defender.",
+ "audit.check.defender.queryError.msg": "Échec de la requête d'état Defender.",
+ "audit.check.defender.queryError.detail": "Le cmdlet Get-MpComputerStatus peut ne pas être disponible sur ce système.",
+ "audit.check.uac.error.msg": "Impossible de vérifier l'état UAC.",
+ "audit.check.updates.parseError.msg": "Impossible d'analyser l'état des mises à jour.",
+ "audit.check.updates.parseError.detail": "Réponse inattendue de la requête Windows Update.",
+ "audit.check.updates.queryError.msg": "Impossible de consulter l'état des mises à jour.",
+ "audit.check.updates.queryError.detail": "Windows Update peut être désactivé ou la requête COM a expiré.",
+ "audit.check.bitlocker.info.msg": "État BitLocker indisponible (peut ne pas être supporté sur cette édition).",
+ "audit.check.bitlocker.info.detail": "BitLocker nécessite Windows Pro ou Entreprise.",
+ "health.reason.noScan": "Aucun scan n'a encore été exécuté.",
+ "health.reason.noThreats": "Aucune menace trouvée lors du scan le plus récent.",
+ "health.reason.threatsFound": "{count} correspondance(s) de menace trouvées dans le scan le plus récent.",
+ "health.reason.scanToday": "Le dernier scan a été exécuté dans la dernière journée.",
+ "health.reason.scanDaysAgo": "Le dernier scan a été exécuté il y a {days} jour(s).",
+ "health.reason.diskLowSpace": "Peu d'espace sur : {volumes} ({pct}% utilisé).",
+ "health.reason.diskNoVolumes": "Aucun volume visible par l'utilisateur trouvé pour l'évaluation du disque.",
+ "health.reason.diskHealthy": "Tous les volumes sains (utilisation max {pct}%).",
+ "health.reason.memoryUsage": "{pct}% de la mémoire utilisée.",
+ "health.reason.cpuLoad": "Charge CPU à {pct}%.",
+ "health.reason.uptimeToday": "Redémarré au cours de la dernière journée.",
+ "health.reason.uptimeDays": "Redémarré il y a {days} jour(s) — dans la normale.",
+ "health.reason.uptimeWeeks": "En fonctionnement depuis {days} jours sans redémarrage — envisager un redémarrage pour appliquer les mises à jour en attente.",
+ "health.reason.uptimeLong": "En fonctionnement depuis {days} jours sans redémarrage — un redémarrage est recommandé pour appliquer les mises à jour en attente.",
+ "health.reason.rtpActive": "La protection en temps réel est active.",
+ "health.reason.rtpDisabled": "La protection en temps réel est désactivée.",
+ "health.reason.firewallActive": "Le pare-feu Windows est actif.",
+ "health.reason.firewallDisabled": "Le pare-feu Windows est désactivé.",
"audit.check.execPolicy.error.msg": "PowerShell execution policy query failed.",
"audit.check.execPolicy.error.detail": "Unable to query execution policy.",
"audit.check.secureBoot.unknown.msg": "Secure Boot status could not be determined.",
diff --git a/src/i18n/locales/hi.json b/src/i18n/locales/hi.json
index fa06234..28ed942 100644
--- a/src/i18n/locales/hi.json
+++ b/src/i18n/locales/hi.json
@@ -793,7 +793,19 @@
"health.malware.clean": "No threats found in the most recent scan.",
"health.malware.low": "{count} threat match(es) found in the most recent scan.",
"health.malware.high": "{count} threat matches found in the most recent scan.",
- "health.scanRecency.label": "Scan Recency",
+ "health.label.malware": "मैलवेयर स्कैन परिणाम",
+ "health.label.scanRecency": "स्कैन रीसेंसी",
+ "health.label.disk": "डिस्क स्पेस",
+ "health.label.memory": "मेमोरी उपयोग",
+ "health.label.load": "CPU लोड",
+ "health.label.uptime": "सिस्टम अपटाइम",
+ "health.label.rtp": "रियल-टाइम प्रोटेक्शन",
+ "health.label.firewall": "फायरवॉल",
+ "health.malware.label": "मैलवेयर स्कैन परिणाम",
+ "health.malware.noScan": "कोई स्कैन नहीं चला।",
+ "health.malware.clean": "सबसे हाल के स्कैन में कोई खतरा नहीं मिला।",
+ "health.malware.low": "सबसे हाल के स्कैन में {count} खतरा मिलान मिले।",
+ "health.malware.high": "सबसे हाल के स्कैन में {count} खतरा मिलान मिले।",
"health.scanRecency.recent": "Last scan ran within the last day.",
"health.scanRecency.daysAgo": "Last scan ran {days} day(s) ago.",
"health.disk.label": "Disk Space",
diff --git a/src/i18n/locales/it.json b/src/i18n/locales/it.json
index 65da3ce..0efd86f 100644
--- a/src/i18n/locales/it.json
+++ b/src/i18n/locales/it.json
@@ -787,79 +787,87 @@
"passwords.crackTimeYears": "{count} years",
"passwords.crackTimeCenturies": "{count} centuries",
"health.malware.label": "Malware Scan Results",
- "health.malware.noScan": "No scan has been run yet.",
- "health.malware.clean": "No threats found in the most recent scan.",
- "health.malware.low": "{count} threat match(es) found in the most recent scan.",
- "health.malware.high": "{count} threat matches found in the most recent scan.",
- "health.scanRecency.label": "Scan Recency",
- "health.scanRecency.recent": "Last scan ran within the last day.",
- "health.scanRecency.daysAgo": "Last scan ran {days} day(s) ago.",
- "health.disk.label": "Disk Space",
- "health.disk.lowSpace": "Low space on: {volumes} ({usage}% used).",
- "health.disk.noVolumes": "No user-facing volumes found for disk scoring.",
- "health.disk.healthy": "All volumes healthy (highest usage {usage}%).",
- "health.memory.label": "Memory Usage",
- "health.memory.reason": "{pct}% of memory in use.",
- "health.load.label": "CPU Load",
- "health.load.reason": "CPU load at {pct}%.",
- "health.uptime.label": "System Uptime",
- "health.rtp.label": "Real-Time Protection",
+ "health.malware.noScan": "Nessun scansione è stata eseguita.",
+ "health.malware.clean": "Nessuna minaccia trovata nell'ultimo scansione.",
+ "health.malware.low": "Trovata/e {count} corrispondenza/e di minaccia nell'ultimo scansione.",
+ "health.malware.high": "Trovate {count} corrispondenze di minaccia nell'ultimo scansione.",
+ "health.label.malware": "Risultati scansione malware",
+ "health.label.scanRecency": "Recency scansione",
+ "health.label.disk": "Spazio su disco",
+ "health.label.memory": "Utilizzo memoria",
+ "health.label.load": "Carico CPU",
+ "health.label.uptime": "Uptime sistema",
+ "health.label.rtp": "Protezione in tempo reale",
+ "health.label.firewall": "Firewall",
+ "health.scanRecency.label": "Recency scansione",
+ "health.scanRecency.recent": "L'ultimo scansione è stato eseguito nell'ultimo giorno.",
+ "health.scanRecency.daysAgo": "L'ultimo scansione è stato eseguito {days} giorno fa.",
+ "health.disk.label": "Spazio su disco",
+ "health.disk.lowSpace": "Poco spazio su: {volumes} ({usage}% usato).",
+ "health.disk.noVolumes": "Nessun volume rivolto all'utente trovato per la valutazione del disco.",
+ "health.disk.healthy": "Tutti i volumi sani (uso massimo {usage}%).",
+ "health.memory.label": "Utilizzo memoria",
+ "health.memory.reason": "{pct}% di memoria in uso.",
+ "health.load.label": "Carico CPU",
+ "health.load.reason": "Carico CPU al {pct}%.",
+ "health.uptime.label": "Tempo di attività sistema",
+ "health.rtp.label": "Protezione in tempo reale",
"health.firewall.label": "Firewall",
"audit.check.defender.name": "Windows Defender",
- "audit.check.rtp.name": "Real-Time Protection",
- "audit.check.uac.name": "User Account Control (UAC)",
- "audit.check.updates.name": "Windows Updates",
- "audit.check.bitlocker.name": "BitLocker Drive Encryption",
+ "audit.check.rtp.name": "Protezione in tempo reale",
+ "audit.check.uac.name": "Controllo account utente (UAC)",
+ "audit.check.updates.name": "Aggiornamenti Windows",
+ "audit.check.bitlocker.name": "Crittografia unità BitLocker",
"audit.check.bitlocker.shortName": "BitLocker",
- "audit.check.execPolicy.name": "PowerShell Execution Policy",
- "audit.check.secureBoot.name": "Secure Boot",
+ "audit.check.execPolicy.name": "Criteri di esecuzione PowerShell",
+ "audit.check.secureBoot.name": "Avvio protetto",
"toast.scanProgressTitle": "Avanzamento scansione Soterios",
- "audit.check.defender.enabled.msg": "Defender antivirus is enabled and running.",
- "audit.check.defender.disabled.msg": "Defender antivirus is disabled!",
- "audit.check.defender.disabled.detail": "Antivirus protection is turned off.",
- "audit.check.rtp.active.msg": "Real-time protection is active.",
- "audit.check.rtp.off.msg": "Real-time protection is off!",
- "audit.check.rtp.active.detail": "Threats are blocked as they appear.",
- "audit.check.rtp.off.detail": "Your system is vulnerable to active threats.",
- "audit.check.uac.enabled.msg": "UAC is enabled.",
- "audit.check.uac.disabled.msg": "UAC is disabled! This is a severe security risk.",
- "audit.check.uac.enabled.detail": "UAC prompts before making system-level changes.",
- "audit.check.uac.disabled.detail": "All programs run with full administrator privileges.",
- "audit.check.updates.none.msg": "No pending updates.",
- "audit.check.updates.none.detail": "All available updates are installed.",
- "audit.check.bitlocker.encrypted.msg": "System drive is encrypted.",
- "audit.check.bitlocker.encrypted.detail": "Your data is protected if the device is lost or stolen.",
- "audit.check.bitlocker.notEncrypted.msg": "System drive is NOT encrypted.",
- "audit.check.bitlocker.unavailable.msg": "BitLocker status unavailable.",
- "audit.check.bitlocker.notEncrypted.detail": "Anyone with physical access can read your data.",
- "audit.check.bitlocker.unknown.detail": "Could not determine BitLocker protection status.",
- "audit.check.bitlocker.unknown.msg": "BitLocker status could not be determined.",
- "audit.check.bitlocker.unexpected.detail": "Unexpected BitLocker response format.",
- "audit.check.bitlocker.na.msg": "BitLocker is not available on this system.",
- "audit.check.bitlocker.na.detail": "Requires Windows Pro/Enterprise and a TPM chip.",
- "audit.check.execPolicy.remoteSigned.msg": "Policy: RemoteSigned",
- "audit.check.execPolicy.restricted.msg": "Policy: Restricted",
- "audit.check.execPolicy.allSigned.msg": "Policy: AllSigned",
- "audit.check.execPolicy.secure.detail": "Only signed or locally authored scripts can run.",
- "audit.check.execPolicy.insecure.detail": "Less restrictive execution policy may allow untrusted scripts.",
- "audit.check.secureBoot.enabled.msg": "Secure Boot is enabled.",
- "audit.check.secureBoot.disabled.msg": "Secure Boot is disabled!",
- "audit.check.secureBoot.enabled.detail": "Only trusted bootloaders can run during system startup.",
- "audit.check.secureBoot.disabled.detail": "System is vulnerable to bootkit attacks.",
- "audit.check.defender.parseError.msg": "Could not parse Defender status.",
- "audit.check.defender.queryError.msg": "Failed to query Defender status.",
- "audit.check.defender.queryError.detail": "The Get-MpComputerStatus cmdlet may not be available on this system.",
- "audit.check.uac.error.msg": "Could not check UAC status.",
- "audit.check.updates.parseError.msg": "Could not parse update status.",
- "audit.check.updates.parseError.detail": "Unexpected response from Windows Update query.",
- "audit.check.updates.queryError.msg": "Could not query update status.",
- "audit.check.updates.queryError.detail": "Windows Update may be disabled or the COM query timed out.",
- "audit.check.bitlocker.info.msg": "BitLocker status unavailable (may not be supported on this edition).",
- "audit.check.bitlocker.info.detail": "BitLocker requires Windows Pro or Enterprise.",
- "audit.check.execPolicy.error.msg": "PowerShell execution policy query failed.",
- "audit.check.execPolicy.error.detail": "Unable to query execution policy.",
- "audit.check.secureBoot.unknown.msg": "Secure Boot status could not be determined.",
- "audit.check.secureBoot.unknown.detail": "This check may not be supported on virtual machines or older hardware.",
+ "audit.check.defender.enabled.msg": "L'antivirus Defender è abilitato e in esecuzione.",
+ "audit.check.defender.disabled.msg": "L'antivirus Defender è disabilitato!",
+ "audit.check.defender.disabled.detail": "La protezione antivirus è disattivata.",
+ "audit.check.rtp.active.msg": "La protezione in tempo reale è attiva.",
+ "audit.check.rtp.off.msg": "La protezione in tempo reale è disattivata!",
+ "audit.check.rtp.active.detail": "Le minacce vengono bloccate non appena appaiono.",
+ "audit.check.rtp.off.detail": "Il tuo sistema è vulnerabile alle minacce attive.",
+ "audit.check.uac.enabled.msg": "UAC è abilitato.",
+ "audit.check.uac.disabled.msg": "UAC è disabilitato! Questo è un grave rischio per la sicurezza.",
+ "audit.check.uac.enabled.detail": "UAC richiede conferma prima di apportare modifiche a livello di sistema.",
+ "audit.check.uac.disabled.detail": "Tutti i programmi vengono eseguiti con privilegi di amministratore completi.",
+ "audit.check.updates.none.msg": "Nessun aggiornamento in sospeso.",
+ "audit.check.updates.none.detail": "Tutti gli aggiornamenti disponibili sono installati.",
+ "audit.check.bitlocker.encrypted.msg": "L'unità di sistema è crittografata.",
+ "audit.check.bitlocker.encrypted.detail": "I tuoi dati sono protetti se il dispositivo viene perso o rubato.",
+ "audit.check.bitlocker.notEncrypted.msg": "L'unità di sistema NON è crittografata.",
+ "audit.check.bitlocker.unavailable.msg": "Stato BitLocker non disponibile.",
+ "audit.check.bitlocker.notEncrypted.detail": "Chiunque abbia accesso fisico può leggere i tuoi dati.",
+ "audit.check.bitlocker.unknown.detail": "Impossibile determinare lo stato di protezione BitLocker.",
+ "audit.check.bitlocker.unknown.msg": "Impossibile determinare lo stato di BitLocker.",
+ "audit.check.bitlocker.unexpected.detail": "Formato risposta BitLocker inaspettato.",
+ "audit.check.bitlocker.na.msg": "BitLocker non è disponibile su questo sistema.",
+ "audit.check.bitlocker.na.detail": "Richiede Windows Pro/Enterprise e un chip TPM.",
+ "audit.check.execPolicy.remoteSigned.msg": "Criterio: RemoteSigned",
+ "audit.check.execPolicy.restricted.msg": "Criterio: Restricted",
+ "audit.check.execPolicy.allSigned.msg": "Criterio: AllSigned",
+ "audit.check.execPolicy.secure.detail": "Solo script firmati o creati localmente possono essere eseguiti.",
+ "audit.check.execPolicy.insecure.detail": "Criteri di esecuzione meno restrittivi possono permettere script non affidabili.",
+ "audit.check.secureBoot.enabled.msg": "Avvio sicuro è abilitato.",
+ "audit.check.secureBoot.disabled.msg": "Avvio sicuro è disabilitato!",
+ "audit.check.secureBoot.enabled.detail": "Solo bootloader fidati possono essere eseguiti durante l'avvio del sistema.",
+ "audit.check.secureBoot.disabled.detail": "Il sistema è vulnerabile agli attacchi bootkit.",
+ "audit.check.defender.parseError.msg": "Impossibile analizzare lo stato di Defender.",
+ "audit.check.defender.queryError.msg": "Impossibile interrogare lo stato di Defender.",
+ "audit.check.defender.queryError.detail": "Il cmdlet Get-MpComputerStatus potrebbe non essere disponibile su questo sistema.",
+ "audit.check.uac.error.msg": "Impossibile verificare lo stato UAC.",
+ "audit.check.updates.parseError.msg": "Impossibile analizzare lo stato degli aggiornamenti.",
+ "audit.check.updates.parseError.detail": "Risposta inaspettata dalla query Windows Update.",
+ "audit.check.updates.queryError.msg": "Impossibile interrogare lo stato degli aggiornamenti.",
+ "audit.check.updates.queryError.detail": "Windows Update potrebbe essere disabilitato o la query COM è scaduta.",
+ "audit.check.bitlocker.info.msg": "Stato BitLocker non disponibile (potrebbe non essere supportato in questa edizione).",
+ "audit.check.bitlocker.info.detail": "BitLocker richiede Windows Pro o Enterprise.",
+ "audit.check.execPolicy.error.msg": "Query criterio esecuzione PowerShell fallita.",
+ "audit.check.execPolicy.error.detail": "Impossibile interrogare il criterio di esecuzione.",
+ "audit.check.secureBoot.unknown.msg": "Impossibile determinare lo stato di avvio sicuro.",
+ "audit.check.secureBoot.unknown.detail": "Questa verifica potrebbe non essere supportata su macchine virtuali o hardware più vecchio.",
"audit.check.defender.rec": "Keep Windows Update enabled for automatic definition updates.",
"audit.check.rtp.rec": "Enable real-time protection in Windows Security settings.",
"audit.check.uac.rec": "Enable UAC via Control Panel > User Accounts > Change User Account Control settings.",
@@ -875,5 +883,22 @@
"scanIndicator.failed": "Scan failed",
"scanIndicator.threatsFound": "{count} threat(s) found",
"dashboard.rtpTitle": "Protezione in tempo reale",
- "firewall.detailDirection": "{direction} {est}"
+ "health.reason.noScan": "Nessun scan è stato eseguito.",
+ "health.reason.noThreats": "Nessuna minaccia trovata nell'ultimo scan.",
+ "health.reason.threatsFound": "Trovate {count} corrispondenza/e di minaccia nell'ultimo scan.",
+ "health.reason.scanToday": "L'ultimo scan è stato eseguito nell'ultimo giorno.",
+ "health.reason.scanDaysAgo": "L'ultimo scan è stato eseguito {days} giorno fa.",
+ "health.reason.diskLowSpace": "Poco spazio su: {volumes} ({pct}% usato).",
+ "health.reason.diskNoVolumes": "Nessun volume utente trovato per la valutazione disco.",
+ "health.reason.diskHealthy": "Tutti i volumi sani (uso massimo {pct}%).",
+ "health.reason.memoryUsage": "{pct}% di memoria in uso.",
+ "health.reason.cpuLoad": "Carico CPU al {pct}%.",
+ "health.reason.uptimeToday": "Riavviato nell'ultimo giorno.",
+ "health.reason.uptimeDays": "Riavviato {days} giorno fa — nella norma.",
+ "health.reason.uptimeWeeks": "In esecuzione da {days} giorni senza riavvio — considerare riavvio per aggiornamenti.",
+ "health.reason.uptimeLong": "In esecuzione da {days} giorni senza riavvio — riavvio consigliato per aggiornamenti.",
+ "health.reason.rtpActive": "Protezione in tempo reale attiva.",
+ "health.reason.rtpDisabled": "Protezione in tempo reale disabilitata.",
+ "health.reason.firewallActive": "Firewall Windows attivo.",
+ "health.reason.firewallDisabled": "Firewall Windows disabilitato."
}
\ No newline at end of file
diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json
index 59682d0..a527455 100644
--- a/src/i18n/locales/ja.json
+++ b/src/i18n/locales/ja.json
@@ -762,25 +762,33 @@
"passwords.crackTimeDays": "{count} days",
"passwords.crackTimeYears": "{count} years",
"passwords.crackTimeCenturies": "{count} centuries",
- "health.malware.label": "Malware Scan Results",
- "health.malware.noScan": "No scan has been run yet.",
- "health.malware.clean": "No threats found in the most recent scan.",
- "health.malware.low": "{count} threat match(es) found in the most recent scan.",
- "health.malware.high": "{count} threat matches found in the most recent scan.",
- "health.scanRecency.label": "Scan Recency",
- "health.scanRecency.recent": "Last scan ran within the last day.",
- "health.scanRecency.daysAgo": "Last scan ran {days} day(s) ago.",
- "health.disk.label": "Disk Space",
- "health.disk.lowSpace": "Low space on: {volumes} ({usage}% used).",
- "health.disk.noVolumes": "No user-facing volumes found for disk scoring.",
- "health.disk.healthy": "All volumes healthy (highest usage {usage}%).",
- "health.memory.label": "Memory Usage",
- "health.memory.reason": "{pct}% of memory in use.",
- "health.load.label": "CPU Load",
- "health.load.reason": "CPU load at {pct}%.",
- "health.uptime.label": "System Uptime",
- "health.rtp.label": "Real-Time Protection",
- "health.firewall.label": "Firewall",
+ "health.malware.high": "最新のスキャンで {count} 件の脅威マッチが検出されました。",
+ "health.label.malware": "マルウェア スキャン結果",
+ "health.label.scanRecency": "スキャン時効性",
+ "health.label.disk": "ディスク容量",
+ "health.label.memory": "メモリ使用率",
+ "health.label.load": "CPU 負荷",
+ "health.label.uptime": "システム稼働時間",
+ "health.label.rtp": "リアルタイム防護",
+ "health.label.firewall": "ファイアウォール",
+ "health.malware.label": "マルウェア スキャン結果",
+ "health.malware.noScan": "スキャンが実行されていません。",
+ "health.malware.clean": "最新のスキャンで脅威は検出されませんでした。",
+ "health.malware.low": "最新のスキャンで {count} 件の脅威マッチが検出されました。",
+ "health.malware.high": "最新のスキャンで {count} 件の脅威マッチが検出されました。",
+ "health.scanRecency.recent": "直近のスキャンは 1 日以内に実行されました。",
+ "health.scanRecency.daysAgo": "直近のスキャンは {days} 日前に実行されました。",
+ "health.disk.label": "ディスク容量",
+ "health.disk.lowSpace": "空き容量不足: {volumes} ({usage}% 使用中)。",
+ "health.disk.noVolumes": "ディスク評価用のユーザー向けボリュームが見つかりません。",
+ "health.disk.healthy": "すべてのボリューム正常 (最高使用率 {usage}%)。",
+ "health.memory.label": "メモリ使用率",
+ "health.memory.reason": "メモリ使用率 {pct}%。",
+ "health.load.label": "CPU 負荷",
+ "health.load.reason": "CPU 負荷 {pct}%。",
+ "health.uptime.label": "システム稼働時間",
+ "health.rtp.label": "リアルタイム防護",
+ "health.firewall.label": "ファイアウォール",
"audit.check.defender.name": "Windows Defender",
"audit.check.rtp.name": "Real-Time Protection",
"audit.check.uac.name": "User Account Control (UAC)",
@@ -851,5 +859,23 @@
"scanIndicator.failed": "Scan failed",
"scanIndicator.threatsFound": "{count} threat(s) found",
"dashboard.rtpTitle": "リアルタイム保護",
- "firewall.detailDirection": "{direction} {est}"
+ "firewall.detailDirection": "{direction} {est}",
+ "health.reason.noScan": "まだスキャンが実行されていません。",
+ "health.reason.noThreats": "直近のスキャンで脅威は検出されませんでした。",
+ "health.reason.threatsFound": "直近のスキャンで {count} 件の脅威が検出されました。",
+ "health.reason.scanToday": "最後のスキャンは過去 1 以内に実行されました。",
+ "health.reason.scanDaysAgo": "最後のスキャンは {days} 日前に実行されました。",
+ "health.reason.diskLowSpace": "空き容量不足: {volumes} ({pct}% 使用中)。",
+ "health.reason.diskNoVolumes": "ディスクスコアリング用のユーザー向けボリュームが見つかりません。",
+ "health.reason.diskHealthy": "すべてのボリューム正常 (最大使用率 {pct}%)。",
+ "health.reason.memoryUsage": "メモリ使用率 {pct}%。",
+ "health.reason.cpuLoad": "CPU 負荷 {pct}%。",
+ "health.reason.uptimeToday": "過去 1 日以内に再起動されました。",
+ "health.reason.uptimeDays": "{days} 日前に再起動 — 正常範囲内。",
+ "health.reason.uptimeWeeks": "{days} 日間再起動なし — 近いうちに再起動して更新を適用推奨。",
+ "health.reason.uptimeLong": "{days} 日間再起動なし — 保留中の更新を適用するため再起動推奨。",
+ "health.reason.rtpActive": "リアルタイム保護が有効です。",
+ "health.reason.rtpDisabled": "リアルタイム保護が無効です。",
+ "health.reason.firewallActive": "Windows ファイアウォールが有効です。",
+ "health.reason.firewallDisabled": "Windows ファイアウォールが無効です。"
}
\ No newline at end of file
diff --git a/src/i18n/locales/ko.json b/src/i18n/locales/ko.json
index 8400b0a..84bd323 100644
--- a/src/i18n/locales/ko.json
+++ b/src/i18n/locales/ko.json
@@ -786,13 +786,34 @@
"passwords.crackTimeHours": "{count} hours",
"passwords.crackTimeDays": "{count} days",
"passwords.crackTimeYears": "{count} years",
- "passwords.crackTimeCenturies": "{count} centuries",
- "health.malware.label": "Malware Scan Results",
- "health.malware.noScan": "No scan has been run yet.",
- "health.malware.clean": "No threats found in the most recent scan.",
- "health.malware.low": "{count} threat match(es) found in the most recent scan.",
- "health.malware.high": "{count} threat matches found in the most recent scan.",
- "health.scanRecency.label": "Scan Recency",
+ "passwords.crackTimeCenturies": "{count} 세기",
+ "health.malware.label": "맬웨어 검사 결과",
+ "health.malware.noScan": "아직 검사가 실행되지 않음.",
+ "health.malware.clean": "최근 검사에서 위협 없음 발견.",
+ "health.malware.low": "최근 검사에서 {count}개의 위협 매치 발견.",
+ "health.malware.high": "최근 검사에서 {count}개의 위협 매치 발견.",
+ "health.label.malware": "맬웨어 검사 결과",
+ "health.label.scanRecency": "검사 최신성",
+ "health.label.disk": "디스크 공간",
+ "health.label.memory": "메모리 사용량",
+ "health.label.load": "CPU 부하",
+ "health.label.uptime": "시스템 가동 시간",
+ "health.label.rtp": "실시간 보호",
+ "health.label.firewall": "방화벽",
+ "health.scanRecency.label": "검사 최신성",
+ "health.scanRecency.recent": "마지막 검사가 지난 하루 이내에 실행됨.",
+ "health.scanRecency.daysAgo": "마지막 검사가 {days}일 전 실행됨.",
+ "health.disk.label": "디스크 공간",
+ "health.disk.lowSpace": "공간 부족: {volumes} ({usage}% 사용됨).",
+ "health.disk.noVolumes": "디스크 점수 산정을 위한 사용자 대상 볼륨을 찾을 수 없음.",
+ "health.disk.healthy": "모든 볼륨 정상 (최고 사용량 {usage}%).",
+ "health.memory.label": "메모리 사용량",
+ "health.memory.reason": "{pct}% 메모리 사용 중.",
+ "health.load.label": "CPU 부하",
+ "health.load.reason": "CPU 부하 {pct}%.",
+ "health.uptime.label": "시스템 가동 시간",
+ "health.rtp.label": "실시간 보호",
+ "health.firewall.label": "방화벽",
"health.scanRecency.recent": "Last scan ran within the last day.",
"health.scanRecency.daysAgo": "Last scan ran {days} day(s) ago.",
"health.disk.label": "Disk Space",
diff --git a/src/i18n/locales/nl.json b/src/i18n/locales/nl.json
index ef957c2..f3ef1d8 100644
--- a/src/i18n/locales/nl.json
+++ b/src/i18n/locales/nl.json
@@ -789,7 +789,19 @@
"health.malware.clean": "No threats found in the most recent scan.",
"health.malware.low": "{count} threat match(es) found in the most recent scan.",
"health.malware.high": "{count} threat matches found in the most recent scan.",
- "health.scanRecency.label": "Scan Recency",
+ "health.label.malware": "Malware Scan Resultaten",
+ "health.label.scanRecency": "Scan Actualiteit",
+ "health.label.disk": "Schijfruimte",
+ "health.label.memory": "Geheugengebruik",
+ "health.label.load": "CPU Belasting",
+ "health.label.uptime": "Systeem Uptime",
+ "health.label.rtp": "Realtime Bescherming",
+ "health.label.firewall": "Firewall",
+ "health.malware.label": "Malware Scan Resultaten",
+ "health.malware.noScan": "Nog geen scan uitgevoerd.",
+ "health.malware.clean": "Geen bedreigingen gevonden in de laatste scan.",
+ "health.malware.low": "{count} bedreigingsmatch(es) gevonden in de laatste scan.",
+ "health.malware.high": "{count} bedreigingsmatches gevonden in de laatste scan.",
"health.scanRecency.recent": "Last scan ran within the last day.",
"health.scanRecency.daysAgo": "Last scan ran {days} day(s) ago.",
"health.disk.label": "Disk Space",
@@ -860,17 +872,35 @@
"audit.check.secureBoot.unknown.detail": "This check may not be supported on virtual machines or older hardware.",
"audit.check.defender.rec": "Keep Windows Update enabled for automatic definition updates.",
"audit.check.rtp.rec": "Enable real-time protection in Windows Security settings.",
- "audit.check.uac.rec": "Enable UAC via Control Panel > User Accounts > Change User Account Control settings.",
- "audit.check.updates.rec": "Open Settings > Windows Update and install pending updates.",
- "audit.check.bitlocker.rec": "Enable BitLocker via Control Panel > BitLocker Drive Encryption.",
- "audit.check.execPolicy.rec": "Consider setting to RemoteSigned: Set-ExecutionPolicy RemoteSigned -Scope LocalMachine",
- "audit.check.secureBoot.rec": "Enable Secure Boot in your UEFI/BIOS firmware settings.",
- "audit.check.execPolicy.rec2": "Check execution policy with Get-ExecutionPolicy -List in PowerShell.",
- "audit.check.bitlocker.rec2": "Check BitLocker status in Windows settings.",
+ "audit.check.uac.rec": "UAC inschakelen via Configuratiescherm > Gebruikersaccounts > Gebruikersaccountbeheer-instellingen wijzigen.",
+ "audit.check.updates.rec": "Open Instellingen > Windows Update en installeer wachtende updates.",
+ "audit.check.bitlocker.rec": "Schakel BitLocker in via Configuratiescherm > BitLocker-stationversleuteling.",
+ "audit.check.execPolicy.rec": "Overweeg in te stellen op RemoteSigned: Set-ExecutionPolicy RemoteSigned -Scope LocalMachine",
+ "audit.check.secureBoot.rec": "Schakel Secure Boot in via uw UEFI/BIOS-firmware-instellingen.",
+ "audit.check.execPolicy.rec2": "Controleer uitvoeringsbeleid met Get-ExecutionPolicy -List in PowerShell.",
+ "audit.check.bitlocker.rec2": "Controleer BitLocker-status in Windows-instellingen.",
+ "health.reason.noScan": "Nog geen scan uitgevoerd.",
+ "health.reason.noThreats": "Geen dreigingen gevonden in de laatste scan.",
+ "health.reason.threatsFound": "{count} dreigingsmatch(es) gevonden in de laatste scan.",
+ "health.reason.scanToday": "Laatste scan liep de afgelopen dag.",
+ "health.reason.scanDaysAgo": "Laatste scan liep {days} dag(en) geleden.",
+ "health.reason.diskLowSpace": "Wenig ruimte op: {volumes} ({pct}% in gebruik).",
+ "health.reason.diskNoVolumes": "Geen gebruikersgerichte volumes gevonden voor schijfscoring.",
+ "health.reason.diskHealthy": "Alle volumes gezond (hoogste gebruik {pct}%).",
+ "health.reason.memoryUsage": "{pct}% van het geheugen in gebruik.",
+ "health.reason.cpuLoad": "CPU-load op {pct}%.",
+ "health.reason.uptimeToday": "Herstart binnen de laatste dag.",
+ "health.reason.uptimeDays": "Herstart {days} dag(en) geleden — binnen normaal bereik.",
+ "health.reason.uptimeWeeks": "Draait {days} dagen zonder herstart — overweeg herstart voor updates.",
+ "health.reason.uptimeLong": "Draait {days} dagen zonder herstart — herstart aanbevolen voor updates.",
+ "health.reason.rtpActive": "Real-time bescherming is actief.",
+ "health.reason.rtpDisabled": "Real-time bescherming is uitgeschakeld.",
+ "health.reason.firewallActive": "Windows Firewall is actief.",
+ "health.reason.firewallDisabled": "Windows Firewall is uitgeschakeld.",
"scanIndicator.scanning": "Scanning…",
- "scanIndicator.complete": "Scan complete",
- "scanIndicator.canceled": "Scan canceled",
- "scanIndicator.failed": "Scan failed",
+ "scanIndicator.complete": "Scan voltooid",
+ "scanIndicator.canceled": "Scan geannuleerd",
+ "scanIndicator.failed": "Scan mislukt",
"scanIndicator.threatsFound": "{count} threat(s) found",
"dashboard.rtpTitle": "Realtime-bescherming",
"firewall.detailDirection": "{direction} {est}"
diff --git a/src/i18n/locales/pl.json b/src/i18n/locales/pl.json
index e36cc4b..b948d2c 100644
--- a/src/i18n/locales/pl.json
+++ b/src/i18n/locales/pl.json
@@ -792,7 +792,19 @@
"health.malware.clean": "No threats found in the most recent scan.",
"health.malware.low": "{count} threat match(es) found in the most recent scan.",
"health.malware.high": "{count} threat matches found in the most recent scan.",
- "health.scanRecency.label": "Scan Recency",
+ "health.label.malware": "Wyniki skanowania na złośliwe oprogramowanie",
+ "health.label.scanRecency": "Aktualność skanowania",
+ "health.label.disk": "Przestrzeń dyskowa",
+ "health.label.memory": "Użycie pamięci",
+ "health.label.load": "Obciążenie CPU",
+ "health.label.uptime": "Czas działania systemu",
+ "health.label.rtp": "Ochrona w czasie rzeczywistym",
+ "health.label.firewall": "Zapora",
+ "health.malware.label": "Wyniki skanowania na złośliwe oprogramowanie",
+ "health.malware.noScan": "Nie uruchomiono jeszcze żadnego skanowania.",
+ "health.malware.clean": "Nie znaleziono zagrożeń w ostatnim skanowaniu.",
+ "health.malware.low": "W ostatnim skanowaniu znaleziono {count} dopasowanie(ń) zagrożeń.",
+ "health.malware.high": "W ostatnim skanowaniu znaleziono {count} dopasowań zagrożeń.",
"health.scanRecency.recent": "Last scan ran within the last day.",
"health.scanRecency.daysAgo": "Last scan ran {days} day(s) ago.",
"health.disk.label": "Disk Space",
@@ -876,5 +888,23 @@
"scanIndicator.failed": "Scan failed",
"scanIndicator.threatsFound": "{count} threat(s) found",
"dashboard.rtpTitle": "Ochrona w czasie rzeczywistym",
- "firewall.detailDirection": "{direction} {est}"
+ "firewall.detailDirection": "{direction} {est}",
+ "health.reason.noScan": "Nie uruchomiono jeszcze żadnego skanowania.",
+ "health.reason.noThreats": "Nie znaleziono zagrożeń w ostatnim skanowaniu.",
+ "health.reason.threatsFound": "Znaleziono {count} dopasowanie(ń) zagrożeń w ostatnim skanowaniu.",
+ "health.reason.scanToday": "Ostatnie skanowanie uruchomiono w ciągu ostatniego dnia.",
+ "health.reason.scanDaysAgo": "Ostatnie skanowanie uruchomiono {days} dni temu.",
+ "health.reason.diskLowSpace": "Mało miejsca na: {volumes} ({pct}% zajęte).",
+ "health.reason.diskNoVolumes": "Nie znaleziono wolumenów użytkownika do oceny dysku.",
+ "health.reason.diskHealthy": "Wszystkie wolumeny zdrowe (największe zajęcie {pct}%).",
+ "health.reason.memoryUsage": "{pct}% pamięci w użyciu.",
+ "health.reason.cpuLoad": "Obciążenie CPU na {pct}%.",
+ "health.reason.uptimeToday": "Uruchomiono ponownie w ciągu ostatniego dnia.",
+ "health.reason.uptimeDays": "Uruchomiono ponownie {days} dni temu — w normie.",
+ "health.reason.uptimeWeeks": "System działa {days} dni bez restartu — rozważ restart dla aktualizacji.",
+ "health.reason.uptimeLong": "System działa {days} dni bez restartu — restart zalecany dla aktualizacji.",
+ "health.reason.rtpActive": "Ochrona w czasie rzeczywistym aktywna.",
+ "health.reason.rtpDisabled": "Ochrona w czasie rzeczywistym wyłączona.",
+ "health.reason.firewallActive": "Zapora Windows aktywna.",
+ "health.reason.firewallDisabled": "Zapora Windows wyłączona."
}
\ No newline at end of file
diff --git a/src/i18n/locales/pt-BR.json b/src/i18n/locales/pt-BR.json
index 5ba20ac..1fb064c 100644
--- a/src/i18n/locales/pt-BR.json
+++ b/src/i18n/locales/pt-BR.json
@@ -791,7 +791,32 @@
"health.malware.clean": "No threats found in the most recent scan.",
"health.malware.low": "{count} threat match(es) found in the most recent scan.",
"health.malware.high": "{count} threat matches found in the most recent scan.",
- "health.scanRecency.label": "Scan Recency",
+ "health.malware.label": "Resultados da verificação de malware",
+ "health.malware.noScan": "Nenhuma verificação foi executada ainda.",
+ "health.malware.clean": "Nenhuma ameaça encontrada na verificação mais recente.",
+ "health.malware.low": "{count} correspondência(s) de ameaça encontradas na verificação mais recente.",
+ "health.malware.high": "{count} correspondências de ameaça encontradas na verificação mais recente.",
+ "health.label.scanRecency": "Recência da verificação",
+ "health.label.disk": "Espaço em disco",
+ "health.label.memory": "Uso de memória",
+ "health.label.load": "Carga de CPU",
+ "health.label.uptime": "Tempo de atividade do sistema",
+ "health.label.rtp": "Proteção em tempo real",
+ "health.label.firewall": "Firewall",
+ "health.scanRecency.label": "Recência da verificação",
+ "health.scanRecency.recent": "Última verificação executada no último dia.",
+ "health.scanRecency.daysAgo": "Última verificação executada há {days} dia(s).",
+ "health.disk.label": "Espaço em disco",
+ "health.disk.lowSpace": "Pouco espaço em: {volumes} ({usage}% usado).",
+ "health.disk.noVolumes": "Nenhum volume voltado para o usuário encontrado para pontuação de disco.",
+ "health.disk.healthy": "Todos os volumes saudáveis (maior uso {usage}%).",
+ "health.memory.label": "Uso de memória",
+ "health.memory.reason": "{pct}% de memória em uso.",
+ "health.load.label": "Carga de CPU",
+ "health.load.reason": "Carga de CPU em {pct}%.",
+ "health.uptime.label": "Tempo de atividade do sistema",
+ "health.rtp.label": "Proteção em tempo real",
+ "health.firewall.label": "Firewall",
"health.scanRecency.recent": "Last scan ran within the last day.",
"health.scanRecency.daysAgo": "Last scan ran {days} day(s) ago.",
"health.disk.label": "Disk Space",
diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json
index 494c6ea..f2f7b19 100644
--- a/src/i18n/locales/ru.json
+++ b/src/i18n/locales/ru.json
@@ -785,13 +785,34 @@
"passwords.crackTimeHours": "{count} hours",
"passwords.crackTimeDays": "{count} days",
"passwords.crackTimeYears": "{count} years",
- "passwords.crackTimeCenturies": "{count} centuries",
- "health.malware.label": "Malware Scan Results",
- "health.malware.noScan": "No scan has been run yet.",
- "health.malware.clean": "No threats found in the most recent scan.",
- "health.malware.low": "{count} threat match(es) found in the most recent scan.",
- "health.malware.high": "{count} threat matches found in the most recent scan.",
- "health.scanRecency.label": "Scan Recency",
+ "passwords.crackTimeCenturies": "{count} веков",
+ "health.malware.label": "Результаты сканирования на вредоносное ПО",
+ "health.malware.noScan": "Сканирование еще не запускалось.",
+ "health.malware.clean": "Угроз не найдено в последнем сканировании.",
+ "health.malware.low": "Найдено {count} совпадение(я) с угрозами в последнем сканировании.",
+ "health.malware.high": "Найдено {count} совпадений с угрозами в последнем сканировании.",
+ "health.label.malware": "Результаты сканирования на вредоносное ПО",
+ "health.label.scanRecency": "Актуальность сканирования",
+ "health.label.disk": "Место на диске",
+ "health.label.memory": "Использование памяти",
+ "health.label.load": "Загрузка CPU",
+ "health.label.uptime": "Время работы системы",
+ "health.label.rtp": "Защита в реальном времени",
+ "health.label.firewall": "Брандмауэр",
+ "health.scanRecency.label": "Актуальность сканирования",
+ "health.scanRecency.recent": "Последнее сканирование запускалось в последний день.",
+ "health.scanRecency.daysAgo": "Последнее сканирование запускалось {days} день(дня/дней) назад.",
+ "health.disk.label": "Место на диске",
+ "health.disk.lowSpace": "Мало места: {volumes} ({usage}% используется).",
+ "health.disk.noVolumes": "Не найдено пользовательских томов для оценки диска.",
+ "health.disk.healthy": "Все тома в порядке (макс. загрузка {usage}%).",
+ "health.memory.label": "Использование памяти",
+ "health.memory.reason": "{pct}% памяти используется.",
+ "health.load.label": "Загрузка CPU",
+ "health.load.reason": "Загрузка CPU на уровне {pct}%.",
+ "health.uptime.label": "Время работы системы",
+ "health.rtp.label": "Защита в реальном времени",
+ "health.firewall.label": "Брандмауэр",
"health.scanRecency.recent": "Last scan ran within the last day.",
"health.scanRecency.daysAgo": "Last scan ran {days} day(s) ago.",
"health.disk.label": "Disk Space",
diff --git a/src/i18n/locales/tr.json b/src/i18n/locales/tr.json
index b62c621..999786f 100644
--- a/src/i18n/locales/tr.json
+++ b/src/i18n/locales/tr.json
@@ -791,7 +791,28 @@
"health.malware.clean": "No threats found in the most recent scan.",
"health.malware.low": "{count} threat match(es) found in the most recent scan.",
"health.malware.high": "{count} threat matches found in the most recent scan.",
- "health.scanRecency.label": "Scan Recency",
+ "health.label.malware": "Kötü Amaçlı Yazılım Tarama Sonuçları",
+ "health.label.scanRecency": "Tarama Yeniliği",
+ "health.label.disk": "Disk Alanı",
+ "health.label.memory": "Bellek Kullanımı",
+ "health.label.load": "CPU Yükü",
+ "health.label.uptime": "Sistem Çalışma Süresi",
+ "health.label.rtp": "Gerçek Zamanlı Koruma",
+ "health.label.firewall": "Güvenlik Duvarı",
+ "health.scanRecency.label": "Tarama Yeniliği",
+ "health.scanRecency.recent": "Son tarama son bir gün içinde çalıştırıldı.",
+ "health.scanRecency.daysAgo": "Son tarama {days} gün önce çalıştırıldı.",
+ "health.disk.label": "Disk Alanı",
+ "health.disk.lowSpace": "Az alan: {volumes} ({usage}% kullanım).",
+ "health.disk.noVolumes": "Disk puanlaması için kullanıcı karşıtı birim bulunamadı.",
+ "health.disk.healthy": "Tüm birimler sağlıklı (en yüksek kullanım {usage}%).",
+ "health.memory.label": "Bellek Kullanımı",
+ "health.memory.reason": "{pct}% bellek kullanımda.",
+ "health.load.label": "CPU Yükü",
+ "health.load.reason": "CPU yükü %{pct}%.",
+ "health.uptime.label": "Sistem Çalışma Süresi",
+ "health.rtp.label": "Gerçek Zamanlı Koruma",
+ "health.firewall.label": "Güvenlik Duvarı",
"health.scanRecency.recent": "Last scan ran within the last day.",
"health.scanRecency.daysAgo": "Last scan ran {days} day(s) ago.",
"health.disk.label": "Disk Space",
@@ -875,5 +896,23 @@
"scanIndicator.failed": "Scan failed",
"scanIndicator.threatsFound": "{count} threat(s) found",
"dashboard.rtpTitle": "Gerçek zamanlı koruma",
- "firewall.detailDirection": "{direction} {est}"
+ "firewall.detailDirection": "{direction} {est}",
+ "health.reason.noScan": "Henüz hiç tarama çalıştırılmadı.",
+ "health.reason.noThreats": "En son tarama da hiçbir tehdit bulunamadı.",
+ "health.reason.threatsFound": "En son taramada {count} tehdit eşleşmesi bulundu.",
+ "health.reason.scanToday": "Son tarama son bir gün içinde çalıştırıldı.",
+ "health.reason.scanDaysAgo": "Son tarama {days} gün önce çalıştırıldı.",
+ "health.reason.diskLowSpace": "Az yer: {volumes} ({usage}% kullanılıyor).",
+ "health.reason.diskNoVolumes": "Disk puanlaması için kullanıcı odaklı birim bulunamadı.",
+ "health.reason.diskHealthy": "Tüm birimler sağlıklı (en yüksek kullanım {usage}%).",
+ "health.reason.memoryUsage": "%{pct} bellek kullanımda.",
+ "health.reason.cpuLoad": "CPU yükü %{pct}%.",
+ "health.reason.uptimeToday": "Son bir gün içinde yeniden başlatıldı.",
+ "health.reason.uptimeDays": "{days} gün önce yeniden başlatıldı — normal aralıkta.",
+ "health.reason.uptimeWeeks": "{days} gündür yeniden başlatılmadan çalışıyor — bekleyen güncellemeler için yakında yeniden başlatmayı düşünün.",
+ "health.reason.uptimeLong": "{days} gündür yeniden başlatılmadan çalışıyor — bekleyen güncellemeleri uygulamak için yeniden başlatma önerilir.",
+ "health.reason.rtpActive": "Gerçek zamanlı koruma aktif.",
+ "health.reason.rtpDisabled": "Gerçek zamanlı koruma devre dışı.",
+ "health.reason.firewallActive": "Windows Güvenlik Duvarı aktif.",
+ "health.reason.firewallDisabled": "Windows Güvenlik Duvarı devre dışı."
}
\ No newline at end of file
diff --git a/src/main/healthSummary.js b/src/main/healthSummary.js
index df30525..692fc5a 100644
--- a/src/main/healthSummary.js
+++ b/src/main/healthSummary.js
@@ -19,10 +19,60 @@ async function getTrayHealthSummary(db, toolRegistry) {
}
const disk = result.data.breakdown?.disk;
+
+ // RTP status
+ let rtp = { enabled: false };
+ try {
+ const { RealTimeWatcher } = require('../security/RealTimeWatcher');
+ // Check if RTP is enabled in settings
+ const rtpEnabled = db.getSetting('feature.realtimeProtection', false);
+ rtp = { enabled: rtpEnabled };
+ } catch (_) {}
+
+ // Firewall status
+ let firewall = { active: false };
+ try {
+ const { execFile } = require('child_process');
+ const { promisify } = require('util');
+ const execFileAsync = promisify(execFile);
+ const { stdout } = await execFileAsync('netsh', ['advfirewall', 'show', 'allprofiles', 'state'], { timeout: 5000 });
+ firewall = { active: /ON|ENABLED/i.test(stdout) };
+ } catch (_) {}
+
+ // Network traffic history (last 24h)
+ let network = { rxKBs: 0, txKBs: 0, history: [], rx: [], tx: [] };
+ try {
+ const history = db.getNetworkHistory ? db.getNetworkHistory(24 * 60) : []; // last 24h, 1 sample per min
+ if (history.length) {
+ const latest = history[history.length - 1];
+ network.rxKBs = Math.round((latest.rx_bytes || 0) / 1024);
+ network.txKBs = Math.round((latest.tx_bytes || 0) / 1024);
+ // For sparkline: use last 60 samples, convert to KB/s
+ const recent = history.slice(-60);
+ network.rx = recent.map(h => (h.rx_bytes || 0) / 1024);
+ network.tx = recent.map(h => (h.tx_bytes || 0) / 1024);
+ network.history = recent.map(h => (h.tx_bytes + h.rx_bytes) / 1024);
+ }
+ } catch (_) {}
+
+ // Last scan info
+ let lastScan = null;
+ if (latest) {
+ lastScan = {
+ timestamp: latest.timestamp,
+ filesScanned: latest.files_scanned,
+ threatsFound: latest.threats_found
+ };
+ }
+
return {
score: result.data.score,
- detail: disk?.reason || 'Protection and resource summary ready.'
+ detail: disk?.reason || 'Protection and resource summary ready.',
+ rtp,
+ firewall,
+ network,
+ lastScan
};
}
-module.exports = { getTrayHealthSummary };
+module.exports = { getTrayHealthSummary };
\ No newline at end of file
diff --git a/src/main/main.js b/src/main/main.js
index a8c7aa2..bb52dc4 100644
--- a/src/main/main.js
+++ b/src/main/main.js
@@ -578,7 +578,27 @@ function buildAppMenu() {
app.setAppUserModelId('com.soterios.app');
+const gotTheLock = app.requestSingleInstanceLock();
+if (!gotTheLock) {
+ app.quit();
+ process.exit(0);
+}
+
+app.on('second-instance', (_event, commandLine) => {
+ if (mainWindow) {
+ if (mainWindow.isMinimized()) mainWindow.restore();
+ mainWindow.focus();
+ const url = commandLine.find(arg => arg.startsWith('soterios://'));
+ if (url) mainWindow.webContents.send('protocol-url', url);
+ }
+});
+
app.whenReady().then(async () => {
+ // Register custom protocol for browser extension communication
+ if (process.platform === 'win32') {
+ app.setAsDefaultProtocolClient('soterios');
+ }
+
const dbPath = path.join(app.getPath('userData'), 'soterios.db');
// File logging is opt-in via SOTERIOS_LOG_FILE (path or "1" for the default log file).
const logConfig = { level: process.env.SOTERIOS_LOG_LEVEL || 'info' };
diff --git a/src/ui/js/pages/settings.js b/src/ui/js/pages/settings.js
index b7499c9..9f5c7ad 100644
--- a/src/ui/js/pages/settings.js
+++ b/src/ui/js/pages/settings.js
@@ -119,6 +119,14 @@ window.Pages.settings = {
+
+