Add files via upload

This commit is contained in:
Kenneth Hendricks 2026-01-25 14:55:11 -05:00 committed by GitHub
parent b19ef1853e
commit 7e980f10fd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
13 changed files with 2188 additions and 62 deletions

View file

@ -0,0 +1,270 @@
{
"extensionName": {
"message": "FMHY SafeGuard",
"description": "Name of the extension"
},
"extensionDescription": {
"message": "Schützen Sie Ihr Surfen mit Echtzeit-Sicherheitsprüfungen von Websites, unterstützt durch die FMHY-Filterliste.",
"description": "Description of the extension"
},
"checkingSiteStatus": {
"message": "Website-Status wird überprüft...",
"description": "Loading message in popup"
},
"reason": {
"message": "Grund",
"description": "Label for unsafe site reason"
},
"fmhyNote": {
"message": "FMHY-Hinweis",
"description": "Label for FMHY notes section"
},
"thinkMistake": {
"message": "Denken Sie, das ist ein Fehler?",
"description": "Feedback prompt"
},
"letUsKnow": {
"message": "Lassen Sie es uns wissen",
"description": "Link text for reporting issues"
},
"poweredBy": {
"message": "Unterstützt von",
"description": "Footer text"
},
"fmhyFilterlist": {
"message": "FMHY Filterlist",
"description": "Filterlist name"
},
"statusUnsafe": {
"message": "$DOMAIN$ ist als <strong>unsicher</strong> markiert. Es wird empfohlen, diese Seite zu meiden.",
"description": "Unsafe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusPotentiallyUnsafe": {
"message": "$DOMAIN$ ist <strong>potenziell unsicher</strong>. Gehen Sie mit Vorsicht vor.",
"description": "Potentially unsafe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusFmhy": {
"message": "$DOMAIN$ ist eine <strong>FMHY</strong>-bezogene Seite. Sie können vertrauen.",
"description": "FMHY site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "fmhy.net"
}
}
},
"statusSafe": {
"message": "$DOMAIN$ ist <strong>sicher</strong> zum Surfen.",
"description": "Safe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusStarred": {
"message": "$DOMAIN$ ist eine <strong>markierte</strong> Seite.",
"description": "Starred site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusUnknown": {
"message": "$DOMAIN$ ist nicht in unserer Datenbank.",
"description": "Unknown site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusNoData": {
"message": "Website-Status kann nicht überprüft werden. Bitte versuchen Sie es später erneut.",
"description": "No data available message"
},
"warningPageTitle": {
"message": "FMHY SafeGuard - Warnung",
"description": "Warning page title"
},
"warningText": {
"message": "Diese Seite wurde als <strong>unsicher</strong> markiert.",
"description": "Warning page main text"
},
"warningRecommendation": {
"message": "Es wird empfohlen, diese Seite zu meiden.",
"description": "Warning page recommendation"
},
"goBack": {
"message": "Zurück (Empfohlen)",
"description": "Go back button text"
},
"proceedAnyway": {
"message": "Trotzdem fortfahren",
"description": "Proceed button text"
},
"settingsTitle": {
"message": "FMHY SafeGuard Einstellungen",
"description": "Settings page title"
},
"filterlistStatistics": {
"message": "Filterlisten-Statistiken",
"description": "Settings section title"
},
"lastUpdated": {
"message": "Zuletzt aktualisiert:",
"description": "Last updated label"
},
"unsafeSites": {
"message": "Unsichere Seiten",
"description": "Stat label"
},
"potentiallyUnsafeSites": {
"message": "Potenziell unsichere Seiten",
"description": "Stat label"
},
"safeSites": {
"message": "Sichere Seiten",
"description": "Stat label"
},
"nextUpdateScheduled": {
"message": "Nächste Aktualisierung geplant für:",
"description": "Update schedule label"
},
"theme": {
"message": "Design",
"description": "Theme setting title"
},
"themeDescription": {
"message": "Wählen Sie Ihren bevorzugten Darstellungsmodus",
"description": "Theme setting description"
},
"systemDefault": {
"message": "Systemstandard",
"description": "Theme option"
},
"darkMode": {
"message": "Dunkler Modus",
"description": "Theme option"
},
"amoled": {
"message": "AMOLED",
"description": "Theme option"
},
"lightMode": {
"message": "Heller Modus",
"description": "Theme option"
},
"warningPage": {
"message": "Warnseite",
"description": "Setting title"
},
"warningPageDescription": {
"message": "Warnseite für unsichere Seiten anzeigen",
"description": "Setting description"
},
"linkHighlighting": {
"message": "Link-Hervorhebung",
"description": "Setting title"
},
"linkHighlightingDescription": {
"message": "Sichere und unsichere Links auf Webseiten visuell hervorheben",
"description": "Setting description"
},
"highlightSafeLinks": {
"message": "Sichere Links hervorheben (grün)",
"description": "Setting option"
},
"highlightUnsafeLinks": {
"message": "Unsichere Links hervorheben (rot)",
"description": "Setting option"
},
"showWarningBanners": {
"message": "Warnbanner neben unsicheren Links anzeigen",
"description": "Setting option"
},
"safeLinkColor": {
"message": "Farbe für sichere Links",
"description": "Setting option"
},
"unsafeLinkColor": {
"message": "Farbe für unsichere Links",
"description": "Setting option"
},
"autoUpdateFilterlist": {
"message": "Filterliste automatisch aktualisieren",
"description": "Setting title"
},
"autoUpdateDescription": {
"message": "Sicherheitsfilter automatisch aktualisieren",
"description": "Setting description"
},
"daily": {
"message": "Täglich",
"description": "Update frequency option"
},
"weekly": {
"message": "Wöchentlich",
"description": "Update frequency option"
},
"monthly": {
"message": "Monatlich",
"description": "Update frequency option"
},
"domainManagement": {
"message": "Domain-Verwaltung",
"description": "Setting title"
},
"domainManagementDescription": {
"message": "Domains manuell zu sicheren oder unsicheren Listen hinzufügen",
"description": "Setting description"
},
"safeDomains": {
"message": "Sichere Domains (eine pro Zeile)",
"description": "Textarea label"
},
"unsafeDomains": {
"message": "Unsichere Domains (eine pro Zeile)",
"description": "Textarea label"
},
"saveSettings": {
"message": "Einstellungen speichern",
"description": "Save button text"
},
"settingsSaved": {
"message": "Einstellungen erfolgreich gespeichert!",
"description": "Success notification"
},
"openSettings": {
"message": "Einstellungen öffnen",
"description": "Settings button tooltip"
},
"language": {
"message": "Sprache",
"description": "Language setting title"
},
"languageDescription": {
"message": "Wählen Sie Ihre bevorzugte Sprache",
"description": "Language setting description"
},
"autoDetect": {
"message": "Automatisch erkennen",
"description": "Auto-detect language option"
}
}

View file

@ -0,0 +1,270 @@
{
"extensionName": {
"message": "FMHY SafeGuard",
"description": "Name of the extension"
},
"extensionDescription": {
"message": "Protect your browsing with real-time website safety checks powered by the FMHY Filterlist.",
"description": "Description of the extension"
},
"checkingSiteStatus": {
"message": "Checking site status...",
"description": "Loading message in popup"
},
"reason": {
"message": "Reason",
"description": "Label for unsafe site reason"
},
"fmhyNote": {
"message": "FMHY Note",
"description": "Label for FMHY notes section"
},
"thinkMistake": {
"message": "Think this is a mistake?",
"description": "Feedback prompt"
},
"letUsKnow": {
"message": "Let us know",
"description": "Link text for reporting issues"
},
"poweredBy": {
"message": "Powered by",
"description": "Footer text"
},
"fmhyFilterlist": {
"message": "FMHY Filterlist",
"description": "Filterlist name"
},
"statusUnsafe": {
"message": "$DOMAIN$ is flagged as <strong>unsafe</strong>. It's recommended to avoid this site.",
"description": "Unsafe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusPotentiallyUnsafe": {
"message": "$DOMAIN$ is <strong>potentially unsafe</strong>. Proceed with caution.",
"description": "Potentially unsafe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusFmhy": {
"message": "$DOMAIN$ is an <strong>FMHY</strong> related site. Proceed confidently.",
"description": "FMHY site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "fmhy.net"
}
}
},
"statusSafe": {
"message": "$DOMAIN$ is <strong>safe</strong> to browse.",
"description": "Safe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusStarred": {
"message": "$DOMAIN$ is a <strong>starred</strong> site.",
"description": "Starred site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusUnknown": {
"message": "$DOMAIN$ is not in our database.",
"description": "Unknown site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusNoData": {
"message": "Unable to check site status. Please try again later.",
"description": "No data available message"
},
"warningPageTitle": {
"message": "FMHY SafeGuard - Warning",
"description": "Warning page title"
},
"warningText": {
"message": "This site has been flagged as <strong>unsafe</strong>.",
"description": "Warning page main text"
},
"warningRecommendation": {
"message": "It's recommended to avoid this site.",
"description": "Warning page recommendation"
},
"goBack": {
"message": "Go Back (Recommended)",
"description": "Go back button text"
},
"proceedAnyway": {
"message": "Proceed Anyway",
"description": "Proceed button text"
},
"settingsTitle": {
"message": "FMHY SafeGuard Settings",
"description": "Settings page title"
},
"filterlistStatistics": {
"message": "Filterlist Statistics",
"description": "Settings section title"
},
"lastUpdated": {
"message": "Last Updated:",
"description": "Last updated label"
},
"unsafeSites": {
"message": "Unsafe Sites",
"description": "Stat label"
},
"potentiallyUnsafeSites": {
"message": "Potentially Unsafe Sites",
"description": "Stat label"
},
"safeSites": {
"message": "Safe Sites",
"description": "Stat label"
},
"nextUpdateScheduled": {
"message": "Next update scheduled for:",
"description": "Update schedule label"
},
"theme": {
"message": "Theme",
"description": "Theme setting title"
},
"themeDescription": {
"message": "Choose your preferred appearance mode",
"description": "Theme setting description"
},
"systemDefault": {
"message": "System Default",
"description": "Theme option"
},
"darkMode": {
"message": "Dark Mode",
"description": "Theme option"
},
"amoled": {
"message": "AMOLED",
"description": "Theme option"
},
"lightMode": {
"message": "Light Mode",
"description": "Theme option"
},
"warningPage": {
"message": "Warning Page",
"description": "Setting title"
},
"warningPageDescription": {
"message": "Show warning page for unsafe sites",
"description": "Setting description"
},
"linkHighlighting": {
"message": "Link Highlighting",
"description": "Setting title"
},
"linkHighlightingDescription": {
"message": "Visually highlight safe and unsafe links in web pages",
"description": "Setting description"
},
"highlightSafeLinks": {
"message": "Highlight safe links (green)",
"description": "Setting option"
},
"highlightUnsafeLinks": {
"message": "Highlight unsafe links (red)",
"description": "Setting option"
},
"showWarningBanners": {
"message": "Show warning banners next to unsafe links",
"description": "Setting option"
},
"safeLinkColor": {
"message": "Safe link color",
"description": "Setting option"
},
"unsafeLinkColor": {
"message": "Unsafe link color",
"description": "Setting option"
},
"autoUpdateFilterlist": {
"message": "Auto-Update Filterlist",
"description": "Setting title"
},
"autoUpdateDescription": {
"message": "Automatically update security filters",
"description": "Setting description"
},
"daily": {
"message": "Daily",
"description": "Update frequency option"
},
"weekly": {
"message": "Weekly",
"description": "Update frequency option"
},
"monthly": {
"message": "Monthly",
"description": "Update frequency option"
},
"domainManagement": {
"message": "Domain Management",
"description": "Setting title"
},
"domainManagementDescription": {
"message": "Manually add domains to safe or unsafe lists",
"description": "Setting description"
},
"safeDomains": {
"message": "Safe Domains (one per line)",
"description": "Textarea label"
},
"unsafeDomains": {
"message": "Unsafe Domains (one per line)",
"description": "Textarea label"
},
"saveSettings": {
"message": "Save Settings",
"description": "Save button text"
},
"settingsSaved": {
"message": "Settings saved successfully!",
"description": "Success notification"
},
"openSettings": {
"message": "Open Settings",
"description": "Settings button tooltip"
},
"language": {
"message": "Language",
"description": "Language setting title"
},
"languageDescription": {
"message": "Choose your preferred language",
"description": "Language setting description"
},
"autoDetect": {
"message": "Auto-detect",
"description": "Auto-detect language option"
}
}

View file

@ -0,0 +1,270 @@
{
"extensionName": {
"message": "FMHY SafeGuard",
"description": "Name of the extension"
},
"extensionDescription": {
"message": "Protege tu navegación con verificaciones de seguridad de sitios web en tiempo real impulsadas por la lista de filtros de FMHY.",
"description": "Description of the extension"
},
"checkingSiteStatus": {
"message": "Verificando estado del sitio...",
"description": "Loading message in popup"
},
"reason": {
"message": "Razón",
"description": "Label for unsafe site reason"
},
"fmhyNote": {
"message": "Nota de FMHY",
"description": "Label for FMHY notes section"
},
"thinkMistake": {
"message": "¿Crees que es un error?",
"description": "Feedback prompt"
},
"letUsKnow": {
"message": "Avísanos",
"description": "Link text for reporting issues"
},
"poweredBy": {
"message": "Desarrollado por",
"description": "Footer text"
},
"fmhyFilterlist": {
"message": "FMHY Filterlist",
"description": "Filterlist name"
},
"statusUnsafe": {
"message": "$DOMAIN$ está marcado como <strong>inseguro</strong>. Se recomienda evitar este sitio.",
"description": "Unsafe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusPotentiallyUnsafe": {
"message": "$DOMAIN$ es <strong>potencialmente inseguro</strong>. Procede con precaución.",
"description": "Potentially unsafe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusFmhy": {
"message": "$DOMAIN$ es un sitio relacionado con <strong>FMHY</strong>. Procede con confianza.",
"description": "FMHY site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "fmhy.net"
}
}
},
"statusSafe": {
"message": "$DOMAIN$ es <strong>seguro</strong> para navegar.",
"description": "Safe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusStarred": {
"message": "$DOMAIN$ es un sitio <strong>destacado</strong>.",
"description": "Starred site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusUnknown": {
"message": "$DOMAIN$ no está en nuestra base de datos.",
"description": "Unknown site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusNoData": {
"message": "No se puede verificar el estado del sitio. Por favor, inténtalo de nuevo más tarde.",
"description": "No data available message"
},
"warningPageTitle": {
"message": "FMHY SafeGuard - Advertencia",
"description": "Warning page title"
},
"warningText": {
"message": "Este sitio ha sido marcado como <strong>inseguro</strong>.",
"description": "Warning page main text"
},
"warningRecommendation": {
"message": "Se recomienda evitar este sitio.",
"description": "Warning page recommendation"
},
"goBack": {
"message": "Volver (Recomendado)",
"description": "Go back button text"
},
"proceedAnyway": {
"message": "Continuar de todos modos",
"description": "Proceed button text"
},
"settingsTitle": {
"message": "Configuración de FMHY SafeGuard",
"description": "Settings page title"
},
"filterlistStatistics": {
"message": "Estadísticas de la lista de filtros",
"description": "Settings section title"
},
"lastUpdated": {
"message": "Última actualización:",
"description": "Last updated label"
},
"unsafeSites": {
"message": "Sitios inseguros",
"description": "Stat label"
},
"potentiallyUnsafeSites": {
"message": "Sitios potencialmente inseguros",
"description": "Stat label"
},
"safeSites": {
"message": "Sitios seguros",
"description": "Stat label"
},
"nextUpdateScheduled": {
"message": "Próxima actualización programada para:",
"description": "Update schedule label"
},
"theme": {
"message": "Tema",
"description": "Theme setting title"
},
"themeDescription": {
"message": "Elige tu modo de apariencia preferido",
"description": "Theme setting description"
},
"systemDefault": {
"message": "Predeterminado del sistema",
"description": "Theme option"
},
"darkMode": {
"message": "Modo oscuro",
"description": "Theme option"
},
"amoled": {
"message": "AMOLED",
"description": "Theme option"
},
"lightMode": {
"message": "Modo claro",
"description": "Theme option"
},
"warningPage": {
"message": "Página de advertencia",
"description": "Setting title"
},
"warningPageDescription": {
"message": "Mostrar página de advertencia para sitios inseguros",
"description": "Setting description"
},
"linkHighlighting": {
"message": "Resaltado de enlaces",
"description": "Setting title"
},
"linkHighlightingDescription": {
"message": "Resaltar visualmente enlaces seguros e inseguros en páginas web",
"description": "Setting description"
},
"highlightSafeLinks": {
"message": "Resaltar enlaces seguros (verde)",
"description": "Setting option"
},
"highlightUnsafeLinks": {
"message": "Resaltar enlaces inseguros (rojo)",
"description": "Setting option"
},
"showWarningBanners": {
"message": "Mostrar banners de advertencia junto a enlaces inseguros",
"description": "Setting option"
},
"safeLinkColor": {
"message": "Color de enlace seguro",
"description": "Setting option"
},
"unsafeLinkColor": {
"message": "Color de enlace inseguro",
"description": "Setting option"
},
"autoUpdateFilterlist": {
"message": "Actualización automática de la lista de filtros",
"description": "Setting title"
},
"autoUpdateDescription": {
"message": "Actualizar automáticamente los filtros de seguridad",
"description": "Setting description"
},
"daily": {
"message": "Diariamente",
"description": "Update frequency option"
},
"weekly": {
"message": "Semanalmente",
"description": "Update frequency option"
},
"monthly": {
"message": "Mensualmente",
"description": "Update frequency option"
},
"domainManagement": {
"message": "Gestión de dominios",
"description": "Setting title"
},
"domainManagementDescription": {
"message": "Agregar dominios manualmente a las listas de seguros o inseguros",
"description": "Setting description"
},
"safeDomains": {
"message": "Dominios seguros (uno por línea)",
"description": "Textarea label"
},
"unsafeDomains": {
"message": "Dominios inseguros (uno por línea)",
"description": "Textarea label"
},
"saveSettings": {
"message": "Guardar configuración",
"description": "Save button text"
},
"settingsSaved": {
"message": "¡Configuración guardada correctamente!",
"description": "Success notification"
},
"openSettings": {
"message": "Abrir configuración",
"description": "Settings button tooltip"
},
"language": {
"message": "Idioma",
"description": "Language setting title"
},
"languageDescription": {
"message": "Elige tu idioma preferido",
"description": "Language setting description"
},
"autoDetect": {
"message": "Detectar automáticamente",
"description": "Auto-detect language option"
}
}

View file

@ -0,0 +1,270 @@
{
"extensionName": {
"message": "FMHY SafeGuard",
"description": "Name of the extension"
},
"extensionDescription": {
"message": "Protégez votre navigation avec des vérifications de sécurité des sites web en temps réel, alimentées par la liste de filtres FMHY.",
"description": "Description of the extension"
},
"checkingSiteStatus": {
"message": "Vérification du statut du site...",
"description": "Loading message in popup"
},
"reason": {
"message": "Raison",
"description": "Label for unsafe site reason"
},
"fmhyNote": {
"message": "Note FMHY",
"description": "Label for FMHY notes section"
},
"thinkMistake": {
"message": "Vous pensez que c'est une erreur ?",
"description": "Feedback prompt"
},
"letUsKnow": {
"message": "Faites-le nous savoir",
"description": "Link text for reporting issues"
},
"poweredBy": {
"message": "Propulsé par",
"description": "Footer text"
},
"fmhyFilterlist": {
"message": "FMHY Filterlist",
"description": "Filterlist name"
},
"statusUnsafe": {
"message": "$DOMAIN$ est signalé comme <strong>dangereux</strong>. Il est recommandé d'éviter ce site.",
"description": "Unsafe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusPotentiallyUnsafe": {
"message": "$DOMAIN$ est <strong>potentiellement dangereux</strong>. Procédez avec prudence.",
"description": "Potentially unsafe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusFmhy": {
"message": "$DOMAIN$ est un site lié à <strong>FMHY</strong>. Vous pouvez faire confiance.",
"description": "FMHY site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "fmhy.net"
}
}
},
"statusSafe": {
"message": "$DOMAIN$ est <strong>sûr</strong> pour naviguer.",
"description": "Safe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusStarred": {
"message": "$DOMAIN$ est un site <strong>favori</strong>.",
"description": "Starred site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusUnknown": {
"message": "$DOMAIN$ n'est pas dans notre base de données.",
"description": "Unknown site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusNoData": {
"message": "Impossible de vérifier le statut du site. Veuillez réessayer plus tard.",
"description": "No data available message"
},
"warningPageTitle": {
"message": "FMHY SafeGuard - Avertissement",
"description": "Warning page title"
},
"warningText": {
"message": "Ce site a été signalé comme <strong>dangereux</strong>.",
"description": "Warning page main text"
},
"warningRecommendation": {
"message": "Il est recommandé d'éviter ce site.",
"description": "Warning page recommendation"
},
"goBack": {
"message": "Retour (Recommandé)",
"description": "Go back button text"
},
"proceedAnyway": {
"message": "Continuer quand même",
"description": "Proceed button text"
},
"settingsTitle": {
"message": "Paramètres FMHY SafeGuard",
"description": "Settings page title"
},
"filterlistStatistics": {
"message": "Statistiques de la liste de filtres",
"description": "Settings section title"
},
"lastUpdated": {
"message": "Dernière mise à jour :",
"description": "Last updated label"
},
"unsafeSites": {
"message": "Sites dangereux",
"description": "Stat label"
},
"potentiallyUnsafeSites": {
"message": "Sites potentiellement dangereux",
"description": "Stat label"
},
"safeSites": {
"message": "Sites sûrs",
"description": "Stat label"
},
"nextUpdateScheduled": {
"message": "Prochaine mise à jour prévue pour :",
"description": "Update schedule label"
},
"theme": {
"message": "Thème",
"description": "Theme setting title"
},
"themeDescription": {
"message": "Choisissez votre mode d'apparence préféré",
"description": "Theme setting description"
},
"systemDefault": {
"message": "Par défaut du système",
"description": "Theme option"
},
"darkMode": {
"message": "Mode sombre",
"description": "Theme option"
},
"amoled": {
"message": "AMOLED",
"description": "Theme option"
},
"lightMode": {
"message": "Mode clair",
"description": "Theme option"
},
"warningPage": {
"message": "Page d'avertissement",
"description": "Setting title"
},
"warningPageDescription": {
"message": "Afficher la page d'avertissement pour les sites dangereux",
"description": "Setting description"
},
"linkHighlighting": {
"message": "Mise en évidence des liens",
"description": "Setting title"
},
"linkHighlightingDescription": {
"message": "Mettre en évidence visuellement les liens sûrs et dangereux sur les pages web",
"description": "Setting description"
},
"highlightSafeLinks": {
"message": "Mettre en évidence les liens sûrs (vert)",
"description": "Setting option"
},
"highlightUnsafeLinks": {
"message": "Mettre en évidence les liens dangereux (rouge)",
"description": "Setting option"
},
"showWarningBanners": {
"message": "Afficher des bannières d'avertissement à côté des liens dangereux",
"description": "Setting option"
},
"safeLinkColor": {
"message": "Couleur des liens sûrs",
"description": "Setting option"
},
"unsafeLinkColor": {
"message": "Couleur des liens dangereux",
"description": "Setting option"
},
"autoUpdateFilterlist": {
"message": "Mise à jour automatique de la liste de filtres",
"description": "Setting title"
},
"autoUpdateDescription": {
"message": "Mettre à jour automatiquement les filtres de sécurité",
"description": "Setting description"
},
"daily": {
"message": "Quotidien",
"description": "Update frequency option"
},
"weekly": {
"message": "Hebdomadaire",
"description": "Update frequency option"
},
"monthly": {
"message": "Mensuel",
"description": "Update frequency option"
},
"domainManagement": {
"message": "Gestion des domaines",
"description": "Setting title"
},
"domainManagementDescription": {
"message": "Ajouter manuellement des domaines aux listes sûres ou dangereuses",
"description": "Setting description"
},
"safeDomains": {
"message": "Domaines sûrs (un par ligne)",
"description": "Textarea label"
},
"unsafeDomains": {
"message": "Domaines dangereux (un par ligne)",
"description": "Textarea label"
},
"saveSettings": {
"message": "Enregistrer les paramètres",
"description": "Save button text"
},
"settingsSaved": {
"message": "Paramètres enregistrés avec succès !",
"description": "Success notification"
},
"openSettings": {
"message": "Ouvrir les paramètres",
"description": "Settings button tooltip"
},
"language": {
"message": "Langue",
"description": "Language setting title"
},
"languageDescription": {
"message": "Choisissez votre langue préférée",
"description": "Language setting description"
},
"autoDetect": {
"message": "Détection automatique",
"description": "Auto-detect language option"
}
}

View file

@ -0,0 +1,270 @@
{
"extensionName": {
"message": "FMHY SafeGuard",
"description": "Name of the extension"
},
"extensionDescription": {
"message": "FMHYフィルターリストを使用したリアルタイムのウェブサイト安全性チェックでブラウジングを保護します。",
"description": "Description of the extension"
},
"checkingSiteStatus": {
"message": "サイトの状態を確認中...",
"description": "Loading message in popup"
},
"reason": {
"message": "理由",
"description": "Label for unsafe site reason"
},
"fmhyNote": {
"message": "FMHYート",
"description": "Label for FMHY notes section"
},
"thinkMistake": {
"message": "間違いだと思いますか?",
"description": "Feedback prompt"
},
"letUsKnow": {
"message": "お知らせください",
"description": "Link text for reporting issues"
},
"poweredBy": {
"message": "提供:",
"description": "Footer text"
},
"fmhyFilterlist": {
"message": "FMHY Filterlist",
"description": "Filterlist name"
},
"statusUnsafe": {
"message": "$DOMAIN$ は<strong>危険</strong>としてフラグが立てられています。このサイトを避けることをお勧めします。",
"description": "Unsafe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusPotentiallyUnsafe": {
"message": "$DOMAIN$ は<strong>潜在的に危険</strong>です。注意して進んでください。",
"description": "Potentially unsafe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusFmhy": {
"message": "$DOMAIN$ は<strong>FMHY</strong>関連のサイトです。安心して進んでください。",
"description": "FMHY site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "fmhy.net"
}
}
},
"statusSafe": {
"message": "$DOMAIN$ は<strong>安全</strong>に閲覧できます。",
"description": "Safe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusStarred": {
"message": "$DOMAIN$ は<strong>お気に入り</strong>のサイトです。",
"description": "Starred site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusUnknown": {
"message": "$DOMAIN$ はデータベースにありません。",
"description": "Unknown site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusNoData": {
"message": "サイトの状態を確認できません。後でもう一度お試しください。",
"description": "No data available message"
},
"warningPageTitle": {
"message": "FMHY SafeGuard - 警告",
"description": "Warning page title"
},
"warningText": {
"message": "このサイトは<strong>危険</strong>としてフラグが立てられています。",
"description": "Warning page main text"
},
"warningRecommendation": {
"message": "このサイトを避けることをお勧めします。",
"description": "Warning page recommendation"
},
"goBack": {
"message": "戻る(推奨)",
"description": "Go back button text"
},
"proceedAnyway": {
"message": "それでも続行",
"description": "Proceed button text"
},
"settingsTitle": {
"message": "FMHY SafeGuard 設定",
"description": "Settings page title"
},
"filterlistStatistics": {
"message": "フィルターリスト統計",
"description": "Settings section title"
},
"lastUpdated": {
"message": "最終更新:",
"description": "Last updated label"
},
"unsafeSites": {
"message": "危険なサイト",
"description": "Stat label"
},
"potentiallyUnsafeSites": {
"message": "潜在的に危険なサイト",
"description": "Stat label"
},
"safeSites": {
"message": "安全なサイト",
"description": "Stat label"
},
"nextUpdateScheduled": {
"message": "次回更新予定:",
"description": "Update schedule label"
},
"theme": {
"message": "テーマ",
"description": "Theme setting title"
},
"themeDescription": {
"message": "お好みの外観モードを選択してください",
"description": "Theme setting description"
},
"systemDefault": {
"message": "システムデフォルト",
"description": "Theme option"
},
"darkMode": {
"message": "ダークモード",
"description": "Theme option"
},
"amoled": {
"message": "AMOLED",
"description": "Theme option"
},
"lightMode": {
"message": "ライトモード",
"description": "Theme option"
},
"warningPage": {
"message": "警告ページ",
"description": "Setting title"
},
"warningPageDescription": {
"message": "危険なサイトに警告ページを表示",
"description": "Setting description"
},
"linkHighlighting": {
"message": "リンクのハイライト",
"description": "Setting title"
},
"linkHighlightingDescription": {
"message": "ウェブページ上の安全なリンクと危険なリンクを視覚的にハイライト",
"description": "Setting description"
},
"highlightSafeLinks": {
"message": "安全なリンクをハイライト(緑)",
"description": "Setting option"
},
"highlightUnsafeLinks": {
"message": "危険なリンクをハイライト(赤)",
"description": "Setting option"
},
"showWarningBanners": {
"message": "危険なリンクの横に警告バナーを表示",
"description": "Setting option"
},
"safeLinkColor": {
"message": "安全なリンクの色",
"description": "Setting option"
},
"unsafeLinkColor": {
"message": "危険なリンクの色",
"description": "Setting option"
},
"autoUpdateFilterlist": {
"message": "フィルターリストの自動更新",
"description": "Setting title"
},
"autoUpdateDescription": {
"message": "セキュリティフィルターを自動的に更新",
"description": "Setting description"
},
"daily": {
"message": "毎日",
"description": "Update frequency option"
},
"weekly": {
"message": "毎週",
"description": "Update frequency option"
},
"monthly": {
"message": "毎月",
"description": "Update frequency option"
},
"domainManagement": {
"message": "ドメイン管理",
"description": "Setting title"
},
"domainManagementDescription": {
"message": "安全または危険なリストにドメインを手動で追加",
"description": "Setting description"
},
"safeDomains": {
"message": "安全なドメイン1行に1つ",
"description": "Textarea label"
},
"unsafeDomains": {
"message": "危険なドメイン1行に1つ",
"description": "Textarea label"
},
"saveSettings": {
"message": "設定を保存",
"description": "Save button text"
},
"settingsSaved": {
"message": "設定が正常に保存されました!",
"description": "Success notification"
},
"openSettings": {
"message": "設定を開く",
"description": "Settings button tooltip"
},
"language": {
"message": "言語",
"description": "Language setting title"
},
"languageDescription": {
"message": "お好みの言語を選択してください",
"description": "Language setting description"
},
"autoDetect": {
"message": "自動検出",
"description": "Auto-detect language option"
}
}

View file

@ -0,0 +1,270 @@
{
"extensionName": {
"message": "FMHY SafeGuard",
"description": "Name of the extension"
},
"extensionDescription": {
"message": "Proteja sua navegação com verificações de segurança de sites em tempo real, alimentadas pela lista de filtros FMHY.",
"description": "Description of the extension"
},
"checkingSiteStatus": {
"message": "Verificando status do site...",
"description": "Loading message in popup"
},
"reason": {
"message": "Motivo",
"description": "Label for unsafe site reason"
},
"fmhyNote": {
"message": "Nota FMHY",
"description": "Label for FMHY notes section"
},
"thinkMistake": {
"message": "Acha que é um erro?",
"description": "Feedback prompt"
},
"letUsKnow": {
"message": "Avise-nos",
"description": "Link text for reporting issues"
},
"poweredBy": {
"message": "Desenvolvido por",
"description": "Footer text"
},
"fmhyFilterlist": {
"message": "FMHY Filterlist",
"description": "Filterlist name"
},
"statusUnsafe": {
"message": "$DOMAIN$ está marcado como <strong>inseguro</strong>. É recomendado evitar este site.",
"description": "Unsafe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusPotentiallyUnsafe": {
"message": "$DOMAIN$ é <strong>potencialmente inseguro</strong>. Prossiga com cautela.",
"description": "Potentially unsafe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusFmhy": {
"message": "$DOMAIN$ é um site relacionado ao <strong>FMHY</strong>. Prossiga com confiança.",
"description": "FMHY site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "fmhy.net"
}
}
},
"statusSafe": {
"message": "$DOMAIN$ é <strong>seguro</strong> para navegar.",
"description": "Safe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusStarred": {
"message": "$DOMAIN$ é um site <strong>destacado</strong>.",
"description": "Starred site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusUnknown": {
"message": "$DOMAIN$ não está em nosso banco de dados.",
"description": "Unknown site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusNoData": {
"message": "Não foi possível verificar o status do site. Por favor, tente novamente mais tarde.",
"description": "No data available message"
},
"warningPageTitle": {
"message": "FMHY SafeGuard - Aviso",
"description": "Warning page title"
},
"warningText": {
"message": "Este site foi marcado como <strong>inseguro</strong>.",
"description": "Warning page main text"
},
"warningRecommendation": {
"message": "É recomendado evitar este site.",
"description": "Warning page recommendation"
},
"goBack": {
"message": "Voltar (Recomendado)",
"description": "Go back button text"
},
"proceedAnyway": {
"message": "Continuar mesmo assim",
"description": "Proceed button text"
},
"settingsTitle": {
"message": "Configurações do FMHY SafeGuard",
"description": "Settings page title"
},
"filterlistStatistics": {
"message": "Estatísticas da lista de filtros",
"description": "Settings section title"
},
"lastUpdated": {
"message": "Última atualização:",
"description": "Last updated label"
},
"unsafeSites": {
"message": "Sites inseguros",
"description": "Stat label"
},
"potentiallyUnsafeSites": {
"message": "Sites potencialmente inseguros",
"description": "Stat label"
},
"safeSites": {
"message": "Sites seguros",
"description": "Stat label"
},
"nextUpdateScheduled": {
"message": "Próxima atualização agendada para:",
"description": "Update schedule label"
},
"theme": {
"message": "Tema",
"description": "Theme setting title"
},
"themeDescription": {
"message": "Escolha seu modo de aparência preferido",
"description": "Theme setting description"
},
"systemDefault": {
"message": "Padrão do sistema",
"description": "Theme option"
},
"darkMode": {
"message": "Modo escuro",
"description": "Theme option"
},
"amoled": {
"message": "AMOLED",
"description": "Theme option"
},
"lightMode": {
"message": "Modo claro",
"description": "Theme option"
},
"warningPage": {
"message": "Página de aviso",
"description": "Setting title"
},
"warningPageDescription": {
"message": "Mostrar página de aviso para sites inseguros",
"description": "Setting description"
},
"linkHighlighting": {
"message": "Destaque de links",
"description": "Setting title"
},
"linkHighlightingDescription": {
"message": "Destacar visualmente links seguros e inseguros em páginas da web",
"description": "Setting description"
},
"highlightSafeLinks": {
"message": "Destacar links seguros (verde)",
"description": "Setting option"
},
"highlightUnsafeLinks": {
"message": "Destacar links inseguros (vermelho)",
"description": "Setting option"
},
"showWarningBanners": {
"message": "Mostrar banners de aviso ao lado de links inseguros",
"description": "Setting option"
},
"safeLinkColor": {
"message": "Cor do link seguro",
"description": "Setting option"
},
"unsafeLinkColor": {
"message": "Cor do link inseguro",
"description": "Setting option"
},
"autoUpdateFilterlist": {
"message": "Atualização automática da lista de filtros",
"description": "Setting title"
},
"autoUpdateDescription": {
"message": "Atualizar automaticamente os filtros de segurança",
"description": "Setting description"
},
"daily": {
"message": "Diariamente",
"description": "Update frequency option"
},
"weekly": {
"message": "Semanalmente",
"description": "Update frequency option"
},
"monthly": {
"message": "Mensalmente",
"description": "Update frequency option"
},
"domainManagement": {
"message": "Gerenciamento de domínios",
"description": "Setting title"
},
"domainManagementDescription": {
"message": "Adicionar domínios manualmente às listas de seguros ou inseguros",
"description": "Setting description"
},
"safeDomains": {
"message": "Domínios seguros (um por linha)",
"description": "Textarea label"
},
"unsafeDomains": {
"message": "Domínios inseguros (um por linha)",
"description": "Textarea label"
},
"saveSettings": {
"message": "Salvar configurações",
"description": "Save button text"
},
"settingsSaved": {
"message": "Configurações salvas com sucesso!",
"description": "Success notification"
},
"openSettings": {
"message": "Abrir configurações",
"description": "Settings button tooltip"
},
"language": {
"message": "Idioma",
"description": "Language setting title"
},
"languageDescription": {
"message": "Escolha seu idioma preferido",
"description": "Language setting description"
},
"autoDetect": {
"message": "Detectar automaticamente",
"description": "Auto-detect language option"
}
}

View file

@ -0,0 +1,270 @@
{
"extensionName": {
"message": "FMHY SafeGuard",
"description": "Name of the extension"
},
"extensionDescription": {
"message": "Защитите свой браузер с помощью проверки безопасности сайтов в реальном времени на основе списка фильтров FMHY.",
"description": "Description of the extension"
},
"checkingSiteStatus": {
"message": "Проверка статуса сайта...",
"description": "Loading message in popup"
},
"reason": {
"message": "Причина",
"description": "Label for unsafe site reason"
},
"fmhyNote": {
"message": "Заметка FMHY",
"description": "Label for FMHY notes section"
},
"thinkMistake": {
"message": "Думаете, это ошибка?",
"description": "Feedback prompt"
},
"letUsKnow": {
"message": "Сообщите нам",
"description": "Link text for reporting issues"
},
"poweredBy": {
"message": "Работает на",
"description": "Footer text"
},
"fmhyFilterlist": {
"message": "FMHY Filterlist",
"description": "Filterlist name"
},
"statusUnsafe": {
"message": "$DOMAIN$ отмечен как <strong>небезопасный</strong>. Рекомендуется избегать этот сайт.",
"description": "Unsafe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusPotentiallyUnsafe": {
"message": "$DOMAIN$ <strong>потенциально небезопасен</strong>. Действуйте с осторожностью.",
"description": "Potentially unsafe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusFmhy": {
"message": "$DOMAIN$ — сайт, связанный с <strong>FMHY</strong>. Можете доверять.",
"description": "FMHY site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "fmhy.net"
}
}
},
"statusSafe": {
"message": "$DOMAIN$ <strong>безопасен</strong> для просмотра.",
"description": "Safe site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusStarred": {
"message": "$DOMAIN$ — <strong>избранный</strong> сайт.",
"description": "Starred site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusUnknown": {
"message": "$DOMAIN$ отсутствует в нашей базе данных.",
"description": "Unknown site message",
"placeholders": {
"domain": {
"content": "$1",
"example": "example.com"
}
}
},
"statusNoData": {
"message": "Не удалось проверить статус сайта. Пожалуйста, попробуйте позже.",
"description": "No data available message"
},
"warningPageTitle": {
"message": "FMHY SafeGuard - Предупреждение",
"description": "Warning page title"
},
"warningText": {
"message": "Этот сайт отмечен как <strong>небезопасный</strong>.",
"description": "Warning page main text"
},
"warningRecommendation": {
"message": "Рекомендуется избегать этот сайт.",
"description": "Warning page recommendation"
},
"goBack": {
"message": "Вернуться (Рекомендуется)",
"description": "Go back button text"
},
"proceedAnyway": {
"message": "Продолжить всё равно",
"description": "Proceed button text"
},
"settingsTitle": {
"message": "Настройки FMHY SafeGuard",
"description": "Settings page title"
},
"filterlistStatistics": {
"message": "Статистика списка фильтров",
"description": "Settings section title"
},
"lastUpdated": {
"message": "Последнее обновление:",
"description": "Last updated label"
},
"unsafeSites": {
"message": "Небезопасные сайты",
"description": "Stat label"
},
"potentiallyUnsafeSites": {
"message": "Потенциально небезопасные сайты",
"description": "Stat label"
},
"safeSites": {
"message": "Безопасные сайты",
"description": "Stat label"
},
"nextUpdateScheduled": {
"message": "Следующее обновление запланировано на:",
"description": "Update schedule label"
},
"theme": {
"message": "Тема",
"description": "Theme setting title"
},
"themeDescription": {
"message": "Выберите предпочитаемый режим оформления",
"description": "Theme setting description"
},
"systemDefault": {
"message": "Системная",
"description": "Theme option"
},
"darkMode": {
"message": "Тёмная тема",
"description": "Theme option"
},
"amoled": {
"message": "AMOLED",
"description": "Theme option"
},
"lightMode": {
"message": "Светлая тема",
"description": "Theme option"
},
"warningPage": {
"message": "Страница предупреждения",
"description": "Setting title"
},
"warningPageDescription": {
"message": "Показывать страницу предупреждения для небезопасных сайтов",
"description": "Setting description"
},
"linkHighlighting": {
"message": "Подсветка ссылок",
"description": "Setting title"
},
"linkHighlightingDescription": {
"message": "Визуально выделять безопасные и небезопасные ссылки на веб-страницах",
"description": "Setting description"
},
"highlightSafeLinks": {
"message": "Выделять безопасные ссылки (зелёным)",
"description": "Setting option"
},
"highlightUnsafeLinks": {
"message": "Выделять небезопасные ссылки (красным)",
"description": "Setting option"
},
"showWarningBanners": {
"message": "Показывать предупреждающие баннеры рядом с небезопасными ссылками",
"description": "Setting option"
},
"safeLinkColor": {
"message": "Цвет безопасной ссылки",
"description": "Setting option"
},
"unsafeLinkColor": {
"message": "Цвет небезопасной ссылки",
"description": "Setting option"
},
"autoUpdateFilterlist": {
"message": "Автообновление списка фильтров",
"description": "Setting title"
},
"autoUpdateDescription": {
"message": "Автоматически обновлять фильтры безопасности",
"description": "Setting description"
},
"daily": {
"message": "Ежедневно",
"description": "Update frequency option"
},
"weekly": {
"message": "Еженедельно",
"description": "Update frequency option"
},
"monthly": {
"message": "Ежемесячно",
"description": "Update frequency option"
},
"domainManagement": {
"message": "Управление доменами",
"description": "Setting title"
},
"domainManagementDescription": {
"message": "Вручную добавлять домены в списки безопасных или небезопасных",
"description": "Setting description"
},
"safeDomains": {
"message": "Безопасные домены (по одному на строку)",
"description": "Textarea label"
},
"unsafeDomains": {
"message": "Небезопасные домены (по одному на строку)",
"description": "Textarea label"
},
"saveSettings": {
"message": "Сохранить настройки",
"description": "Save button text"
},
"settingsSaved": {
"message": "Настройки успешно сохранены!",
"description": "Success notification"
},
"openSettings": {
"message": "Открыть настройки",
"description": "Settings button tooltip"
},
"language": {
"message": "Язык",
"description": "Language setting title"
},
"languageDescription": {
"message": "Выберите предпочитаемый язык",
"description": "Language setting description"
},
"autoDetect": {
"message": "Автоопределение",
"description": "Auto-detect language option"
}
}

178
src/js/i18n.js Normal file
View file

@ -0,0 +1,178 @@
// i18n helper for FMHY SafeGuard
// This script handles internationalization for HTML pages
(function() {
const browserAPI = typeof browser !== "undefined" ? browser : chrome;
// Cache for loaded translations
let translations = {};
let currentLanguage = "en";
// Supported languages
const SUPPORTED_LANGUAGES = ["en", "es", "ru", "de", "pt", "fr", "ja"];
// Get the user's preferred language from storage
async function getPreferredLanguage() {
try {
const { language } = await browserAPI.storage.local.get("language");
if (language && language !== "auto" && SUPPORTED_LANGUAGES.includes(language)) {
return language;
}
} catch (e) {
console.error("Error getting language preference:", e);
}
// Fall back to browser language or English
const browserLang = browserAPI.i18n.getUILanguage().split("-")[0];
return SUPPORTED_LANGUAGES.includes(browserLang) ? browserLang : "en";
}
// Load translations from JSON file
async function loadTranslations(lang) {
if (translations[lang]) {
return translations[lang];
}
try {
const url = browserAPI.runtime.getURL(`_locales/${lang}/messages.json`);
const response = await fetch(url);
if (response.ok) {
translations[lang] = await response.json();
return translations[lang];
}
} catch (e) {
console.error(`Error loading translations for ${lang}:`, e);
}
// Fall back to English if loading fails
if (lang !== "en") {
return loadTranslations("en");
}
return {};
}
// Get a message from loaded translations
function getMessageFromTranslations(key, substitutions) {
const langData = translations[currentLanguage] || translations["en"] || {};
const entry = langData[key];
if (!entry || !entry.message) {
// Fall back to browser API
return browserAPI.i18n.getMessage(key, substitutions) || key;
}
let message = entry.message;
// Handle substitutions (e.g., $DOMAIN$)
if (substitutions) {
const subs = Array.isArray(substitutions) ? substitutions : [substitutions];
subs.forEach((sub, index) => {
// Replace $1, $2, etc. and named placeholders
message = message.replace(new RegExp(`\\$${index + 1}`, "g"), sub);
if (entry.placeholders) {
Object.keys(entry.placeholders).forEach((name) => {
const placeholder = entry.placeholders[name];
if (placeholder.content === `$${index + 1}`) {
message = message.replace(new RegExp(`\\$${name.toUpperCase()}\\$`, "g"), sub);
}
});
}
});
}
return message;
}
// Apply translations to elements with data-i18n attribute
function applyTranslations() {
// Translate elements with data-i18n attribute (text content)
document.querySelectorAll("[data-i18n]").forEach((element) => {
const key = element.getAttribute("data-i18n");
const message = getMessageFromTranslations(key);
if (message && message !== key) {
element.textContent = message;
}
});
// Translate elements with data-i18n-html attribute (innerHTML)
document.querySelectorAll("[data-i18n-html]").forEach((element) => {
const key = element.getAttribute("data-i18n-html");
const message = getMessageFromTranslations(key);
if (message && message !== key) {
element.innerHTML = message;
}
});
// Translate placeholders
document.querySelectorAll("[data-i18n-placeholder]").forEach((element) => {
const key = element.getAttribute("data-i18n-placeholder");
const message = getMessageFromTranslations(key);
if (message && message !== key) {
element.placeholder = message;
}
});
// Translate titles (tooltips)
document.querySelectorAll("[data-i18n-title]").forEach((element) => {
const key = element.getAttribute("data-i18n-title");
const message = getMessageFromTranslations(key);
if (message && message !== key) {
element.title = message;
}
});
// Translate page title
const titleElement = document.querySelector("title[data-i18n]");
if (titleElement) {
const key = titleElement.getAttribute("data-i18n");
const message = getMessageFromTranslations(key);
if (message && message !== key) {
document.title = message;
}
}
}
// Promise that resolves when i18n is ready
let readyResolve;
const readyPromise = new Promise(resolve => { readyResolve = resolve; });
// Initialize i18n system
async function init() {
currentLanguage = await getPreferredLanguage();
await loadTranslations(currentLanguage);
// Also load English as fallback
if (currentLanguage !== "en") {
await loadTranslations("en");
}
applyTranslations();
readyResolve(); // Signal that i18n is ready
}
// Run initialization when DOM is ready
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", init);
} else {
init();
}
// Expose functions globally for use in other scripts
window.i18n = {
getMessage: getMessageFromTranslations,
applyTranslations: applyTranslations,
setLanguage: async function(lang) {
if (SUPPORTED_LANGUAGES.includes(lang) || lang === "auto") {
if (lang === "auto") {
const browserLang = browserAPI.i18n.getUILanguage().split("-")[0];
currentLanguage = SUPPORTED_LANGUAGES.includes(browserLang) ? browserLang : "en";
} else {
currentLanguage = lang;
}
await loadTranslations(currentLanguage);
applyTranslations();
}
},
getCurrentLanguage: function() {
return currentLanguage;
},
ready: readyPromise
};
})();

View file

@ -292,9 +292,9 @@
<body>
<div class="header">
<div class="title">
<h1>FMHY SafeGuard</h1>
<h1 data-i18n="extensionName">FMHY SafeGuard</h1>
</div>
<button class="settings-button" id="settingsButton" title="Open Settings">
<button class="settings-button" id="settingsButton" data-i18n-title="openSettings" title="Open Settings">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path
d="M12 15.5A3.5 3.5 0 0 1 8.5 12 3.5 3.5 0 0 1 12 8.5a3.5 3.5 0 0 1 3.5 3.5 3.5 3.5 0 0 1-3.5 3.5m7.43-2.53c.04-.32.07-.65.07-.97 0-.32-.03-.65-.07-.97l2.11-1.63c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.31-.61-.22l-2.49 1c-.52-.39-1.06-.73-1.69-.98l-.37-2.65c-.04-.24-.25-.42-.5-.42h-4c-.25 0-.46.18-.5.42l-.37 2.65c-.63.25-1.17.59-1.69.98l-2.49-1c-.22-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64L4.57 12c-.04.32-.07.65-.07.97 0 .32.03.65.07.97l-2.11 1.63c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.31.61.22l2.49-1c.52.39 1.06.73 1.69.98l.37 2.65c.04.24.25.42.5.42h4c.25 0 .46-.18.5-.42l.37-2.65c.63-.25 1.17-.59 1.69-.98l2.49 1c.22-.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.63Z" />
@ -303,7 +303,7 @@
</div>
<div id="status-container">
<img id="status-icon" class="status-image" src="safe.png" alt="Status Icon" />
<p id="status-message">Checking site status...</p>
<p id="status-message" data-i18n="checkingSiteStatus">Checking site status...</p>
</div>
<p id="error-message"></p>
<div id="reason-container">
@ -313,7 +313,7 @@
<path d="M12 9v4"></path>
<path d="M12 17h.01"></path>
</svg>
Reason
<span data-i18n="reason">Reason</span>
</div>
<div id="reason-content"></div>
</div>
@ -325,23 +325,24 @@
<line x1="16" y1="13" x2="8" y2="13" />
<line x1="16" y1="17" x2="8" y2="17" />
</svg>
FMHY Note
<span data-i18n="fmhyNote">FMHY Note</span>
</div>
<div id="note-content"></div>
</div>
<div id="feedback">
<p>
Think this is a mistake?
<a href="https://github.com/fmhy/FMHY-SafeGuard/issues" target="_blank">Let us know</a>.
<span data-i18n="thinkMistake">Think this is a mistake?</span>
<a href="https://github.com/fmhy/FMHY-SafeGuard/issues" target="_blank" data-i18n="letUsKnow">Let us know</a>.
</p>
</div>
<div id="footer">
<p>
Powered by
<a href="https://github.com/fmhy/FMHYFilterlist" target="_blank">FMHY Filterlist</a>
<span data-i18n="poweredBy">Powered by</span>
<a href="https://github.com/fmhy/FMHYFilterlist" target="_blank" data-i18n="fmhyFilterlist">FMHY Filterlist</a>
</p>
</div>
<script src="../js/i18n.js"></script>
<script src="index.js"></script>
</body>

View file

@ -18,6 +18,11 @@ document.addEventListener("DOMContentLoaded", async () => {
// Apply theme
await applyTheme();
// Wait for i18n to be ready
if (window.i18n && window.i18n.ready) {
await window.i18n.ready;
}
// Check site status immediately
await checkSiteStatus();
@ -283,21 +288,24 @@ document.addEventListener("DOMContentLoaded", async () => {
reasonContainer.classList.remove("visible");
}
// Use i18n for status messages if available
const getMessage = window.i18n ? window.i18n.getMessage : (key, sub) => null;
switch (status) {
case "unsafe":
message = `${displayUrl} is flagged as <strong>unsafe</strong>. It's recommended to avoid this site.`;
message = getMessage("statusUnsafe", displayUrl) || `${displayUrl} is flagged as <strong>unsafe</strong>. It's recommended to avoid this site.`;
break;
case "potentially_unsafe":
message = `${displayUrl} is <strong>potentially unsafe</strong>. Proceed with caution.`;
message = getMessage("statusPotentiallyUnsafe", displayUrl) || `${displayUrl} is <strong>potentially unsafe</strong>. Proceed with caution.`;
break;
case "fmhy":
message = `${displayUrl} is an <strong>FMHY</strong> related site. Proceed confidently.`;
message = getMessage("statusFmhy", displayUrl) || `${displayUrl} is an <strong>FMHY</strong> related site. Proceed confidently.`;
break;
case "safe":
message = `${displayUrl} is <strong>safe</strong> to browse.`;
message = getMessage("statusSafe", displayUrl) || `${displayUrl} is <strong>safe</strong> to browse.`;
break;
case "starred":
message = `${displayUrl} is a <strong>starred</strong> site.`;
message = getMessage("statusStarred", displayUrl) || `${displayUrl} is a <strong>starred</strong> site.`;
break;
case "extension_page":
if (displayUrl.startsWith(warningPageUrl)) {
@ -314,10 +322,10 @@ document.addEventListener("DOMContentLoaded", async () => {
}
break;
case "no_data":
message = `No data available for <strong>${displayUrl}</strong>.`;
message = getMessage("statusNoData") || `No data available for <strong>${displayUrl}</strong>.`;
break;
default:
message = `An unknown status was received for <strong>${displayUrl}</strong>.`;
message = getMessage("statusUnknown", displayUrl) || `${displayUrl} is not in our database.`;
}
updateUI(status, message);

View file

@ -4,7 +4,7 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>FMHY SafeGuard - Settings</title>
<title data-i18n="settingsTitle">FMHY SafeGuard - Settings</title>
<link rel="icon" type="image/x-icon" href="../res/ext_icon_144.png" />
<style>
@font-face {
@ -324,6 +324,7 @@
.select-wrapper {
position: relative;
display: inline-block;
width: 160px;
}
select {
@ -336,7 +337,7 @@
font-size: 0.9rem;
color: var(--text-primary);
cursor: pointer;
min-width: 200px;
width: 100%;
}
/* Dark theme specific select styling */
@ -494,29 +495,29 @@
<body>
<div class="container">
<h1 class="title">FMHY SafeGuard Settings</h1>
<h1 class="title" data-i18n="settingsTitle">FMHY SafeGuard Settings</h1>
<div class="settings-card">
<!-- Filterlist Stats -->
<div class="settings-section">
<div class="section-header">
<div class="section-title">Filterlist Statistics</div>
<div class="section-title" data-i18n="filterlistStatistics">Filterlist Statistics</div>
<div class="last-updated">
Last Updated: <span id="lastUpdated">Today at 2:56:48 PM</span>
<span data-i18n="lastUpdated">Last Updated:</span> <span id="lastUpdated">Today at 2:56:48 PM</span>
</div>
</div>
<div class="stats-container">
<div class="stat-card">
<div class="stat-label">Unsafe Sites</div>
<div class="stat-label" data-i18n="unsafeSites">Unsafe Sites</div>
<div class="stat-value" id="unsafeFilterCount">266</div>
</div>
<div class="stat-card">
<div class="stat-label">Potentially Unsafe Sites</div>
<div class="stat-label" data-i18n="potentiallyUnsafeSites">Potentially Unsafe Sites</div>
<div class="stat-value" id="potentiallyUnsafeFilterCount">46</div>
</div>
<div class="stat-card">
<div class="stat-label">Safe Sites</div>
<div class="stat-label" data-i18n="safeSites">Safe Sites</div>
<div class="stat-value" id="safeSiteCount">21901</div>
</div>
</div>
@ -534,17 +535,41 @@
<div class="settings-section">
<div class="settings-grid">
<div>
<h2 class="section-title">Theme</h2>
<p class="section-description">
<h2 class="section-title" data-i18n="theme">Theme</h2>
<p class="section-description" data-i18n="themeDescription">
Choose your preferred appearance mode
</p>
</div>
<div class="select-wrapper">
<select id="themeSelect">
<option value="system">System Default</option>
<option value="dark">Dark Mode</option>
<option value="amoled">AMOLED</option>
<option value="light">Light Mode</option>
<option value="system" data-i18n="systemDefault">System Default</option>
<option value="dark" data-i18n="darkMode">Dark Mode</option>
<option value="amoled" data-i18n="amoled">AMOLED</option>
<option value="light" data-i18n="lightMode">Light Mode</option>
</select>
</div>
</div>
</div>
<!-- Language Settings -->
<div class="settings-section">
<div class="settings-grid">
<div>
<h2 class="section-title" data-i18n="language">Language</h2>
<p class="section-description" data-i18n="languageDescription">
Choose your preferred language
</p>
</div>
<div class="select-wrapper">
<select id="languageSelect">
<option value="auto" data-i18n="autoDetect">Auto-detect</option>
<option value="en">English</option>
<option value="es">Español</option>
<option value="ru">Русский</option>
<option value="de">Deutsch</option>
<option value="pt">Português</option>
<option value="fr">Français</option>
<option value="ja">日本語</option>
</select>
</div>
</div>
@ -554,8 +579,8 @@
<div class="settings-section">
<div class="settings-grid">
<div>
<h2 class="section-title">Warning Page</h2>
<p class="section-description">
<h2 class="section-title" data-i18n="warningPage">Warning Page</h2>
<p class="section-description" data-i18n="warningPageDescription">
Show warning page for unsafe sites
</p>
</div>
@ -568,14 +593,14 @@
<!-- Link Highlighting Settings -->
<div class="settings-section">
<h2 class="section-title">Link Highlighting</h2>
<p class="section-description">
<h2 class="section-title" data-i18n="linkHighlighting">Link Highlighting</h2>
<p class="section-description" data-i18n="linkHighlightingDescription">
Visually highlight safe and unsafe links in web pages
</p>
<div class="settings-grid" style="margin-top: 10px;">
<div>
<p class="section-description" style="margin: 0;">
<p class="section-description" style="margin: 0;" data-i18n="highlightSafeLinks">
Highlight safe links (green)
</p>
</div>
@ -587,7 +612,7 @@
<div class="settings-grid" style="margin-top: 15px;">
<div>
<p class="section-description" style="margin: 0;">
<p class="section-description" style="margin: 0;" data-i18n="highlightUnsafeLinks">
Highlight unsafe links (red)
</p>
</div>
@ -599,7 +624,7 @@
<div class="settings-grid" style="margin-top: 15px;">
<div>
<p class="section-description" style="margin: 0;">
<p class="section-description" style="margin: 0;" data-i18n="showWarningBanners">
Show warning banners next to unsafe links
</p>
</div>
@ -611,7 +636,7 @@
<div class="settings-grid" style="margin-top: 15px;">
<div>
<p class="section-description" style="margin: 0;">
<p class="section-description" style="margin: 0;" data-i18n="safeLinkColor">
Safe link color
</p>
</div>
@ -621,7 +646,7 @@
<div class="settings-grid" style="margin-top: 15px;">
<div>
<p class="section-description" style="margin: 0;">
<p class="section-description" style="margin: 0;" data-i18n="unsafeLinkColor">
Unsafe link color
</p>
</div>
@ -634,16 +659,16 @@
<div class="settings-section">
<div class="settings-grid">
<div>
<h2 class="section-title">Auto-Update Filterlist</h2>
<p class="section-description">
<h2 class="section-title" data-i18n="autoUpdateFilterlist">Auto-Update Filterlist</h2>
<p class="section-description" data-i18n="autoUpdateDescription">
Automatically update security filters
</p>
</div>
<div class="select-wrapper">
<select id="updateFrequency">
<option value="daily">Daily</option>
<option value="weekly">Weekly</option>
<option value="monthly">Monthly</option>
<option value="daily" data-i18n="daily">Daily</option>
<option value="weekly" data-i18n="weekly">Weekly</option>
<option value="monthly" data-i18n="monthly">Monthly</option>
</select>
</div>
</div>
@ -651,14 +676,14 @@
<!-- Domain Management -->
<div class="settings-section">
<h2 class="section-title">Domain Management</h2>
<p class="section-description">
<h2 class="section-title" data-i18n="domainManagement">Domain Management</h2>
<p class="section-description" data-i18n="domainManagementDescription">
Manually add domains to safe or unsafe lists
</p>
<div style="display: flex; gap: 20px; margin-top: 15px;">
<div style="flex: 1;">
<p class="section-description" style="margin-bottom: 5px; font-weight: bold;">
<p class="section-description" style="margin-bottom: 5px; font-weight: bold;" data-i18n="safeDomains">
Safe Domains (one per line)
</p>
<textarea id="trustedDomains" rows="6"
@ -666,7 +691,7 @@
</div>
<div style="flex: 1;">
<p class="section-description" style="margin-bottom: 5px; font-weight: bold;">
<p class="section-description" style="margin-bottom: 5px; font-weight: bold;" data-i18n="unsafeDomains">
Unsafe Domains (one per line)
</p>
<textarea id="untrustedDomains" rows="6"
@ -678,7 +703,7 @@
<!-- Save Button Section -->
<div style="text-align: center; margin-top: 20px;">
<button id="saveSettings" class="btn">
<button id="saveSettings" class="btn" data-i18n="saveSettings">
Save Settings
</button>
</div>
@ -686,14 +711,15 @@
<div id="notification" class="notification" style="display: none"></div>
<div class="footer">
<p>FMHY SafeGuard <span id="versionNumber"></p>
<p><span data-i18n="extensionName">FMHY SafeGuard</span> <span id="versionNumber"></span></p>
<p>
Powered by
<a href="https://github.com/fmhy/FMHYFilterlist" target="_blank">FMHY Filterlist</a>
<span data-i18n="poweredBy">Powered by</span>
<a href="https://github.com/fmhy/FMHYFilterlist" target="_blank" data-i18n="fmhyFilterlist">FMHY Filterlist</a>
</p>
</div>
</div>
<script src="../js/i18n.js"></script>
<script src="settings-page.js"></script>
</body>

View file

@ -7,6 +7,7 @@ document.addEventListener("DOMContentLoaded", () => {
// Get all DOM elements
const themeSelect = document.getElementById("themeSelect");
const languageSelect = document.getElementById("languageSelect");
const warningToggle = document.getElementById("warningToggle");
const updateFrequency = document.getElementById("updateFrequency");
const saveButton = document.getElementById("saveSettings");
@ -216,6 +217,7 @@ document.addEventListener("DOMContentLoaded", () => {
try {
const settings = await browserAPI.storage.local.get([
"theme",
"language",
"showWarning",
"updateFrequency",
"lastUpdated",
@ -234,6 +236,11 @@ document.addEventListener("DOMContentLoaded", () => {
themeSelect.value = settings.theme || "system";
applyTheme(settings.theme || "system");
// Set language
if (languageSelect) {
languageSelect.value = settings.language || "auto";
}
warningToggle.checked = settings.showWarning !== false;
// Set updateFrequency with fallback to "daily"
@ -330,6 +337,7 @@ document.addEventListener("DOMContentLoaded", () => {
try {
const newSettings = {
theme: themeSelect.value,
language: languageSelect ? languageSelect.value : "auto",
showWarning: warningToggle.checked,
updateFrequency: updateFrequency.value,
highlightTrusted: highlightTrustedToggle.checked,
@ -405,6 +413,20 @@ document.addEventListener("DOMContentLoaded", () => {
});
}
// Apply language change immediately when selected
if (languageSelect) {
languageSelect.addEventListener("change", async (e) => {
const newLang = e.target.value;
// Save to storage immediately
await browserAPI.storage.local.set({ language: newLang });
// Apply translations if i18n is available
if (window.i18n && window.i18n.setLanguage) {
await window.i18n.setLanguage(newLang === "auto" ?
(browserAPI.i18n.getUILanguage().split("-")[0]) : newLang);
}
});
}
window
.matchMedia("(prefers-color-scheme: dark)")
.addEventListener("change", (e) => {

View file

@ -4,8 +4,9 @@
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>FMHY SafeGuard - Warning</title>
<title data-i18n="warningPageTitle">FMHY SafeGuard - Warning</title>
<link rel="icon" type="image/x-icon" href="../res/ext_icon_144.png" />
<script src="../js/i18n.js"></script>
<script src="warning-page.js"></script>
<style>
@font-face {
@ -181,33 +182,33 @@
<body>
<div class="container">
<h1 class="title">FMHY SafeGuard</h1>
<h1 class="title" data-i18n="extensionName">FMHY SafeGuard</h1>
<div class="warning-card">
<img src="../res/icons/unsafe.png" alt="Warning" class="warning-icon" id="warningIcon" />
<p class="url" id="unsafeUrl"></p>
<p class="warning-text">
This site has been flagged as <strong>unsafe</strong>.<br />
It's recommended to avoid this site.
<span data-i18n-html="warningText">This site has been flagged as <strong>unsafe</strong>.</span><br />
<span data-i18n="warningRecommendation">It's recommended to avoid this site.</span>
</p>
<p class="reason-text" id="reasonContainer"
style="display: none; color: #a0a0a0; font-size: 0.9em; margin-bottom: 1.5rem; padding: 0.75rem; background: rgba(255,68,68,0.1); border-radius: 8px; border-left: 3px solid var(--danger);">
<strong>Reason:</strong> <span id="reasonText"></span>
</p>
<div class="buttons">
<button class="btn btn-secondary" id="goBack">
<button class="btn btn-secondary" id="goBack" data-i18n="goBack">
Go Back (Recommended)
</button>
<button class="btn btn-primary" id="proceed">Proceed Anyway</button>
<button class="btn btn-primary" id="proceed" data-i18n="proceedAnyway">Proceed Anyway</button>
</div>
</div>
<div class="footer">
<p>
Think this is a mistake?
<a href="https://github.com/fmhy/FMHY-SafeGuard/issues" target="_blank">Let us know</a>
<span data-i18n="thinkMistake">Think this is a mistake?</span>
<a href="https://github.com/fmhy/FMHY-SafeGuard/issues" target="_blank" data-i18n="letUsKnow">Let us know</a>
</p>
<p>
Powered by
<a href="https://github.com/fmhy/FMHYFilterlist" target="_blank">FMHY Filterlist</a>
<span data-i18n="poweredBy">Powered by</span>
<a href="https://github.com/fmhy/FMHYFilterlist" target="_blank" data-i18n="fmhyFilterlist">FMHY Filterlist</a>
</p>
</div>
</div>