From 243fed8e1e3e7ccf98d8dfe45a0bf49bdb109881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juho=20Fors=C3=A9n?= Date: Thu, 18 Jun 2026 09:32:36 +0000 Subject: [PATCH 1/2] Implement i18n and localize to Finnish --- extension/Makefile | 2 +- extension/_locales/en/messages.json | 23 ++++++++++++++ extension/_locales/fi/messages.json | 47 +++++++++++++++++++++++++++++ extension/manifest.json | 5 +-- extension/pages/error.html | 20 ++++++------ extension/pages/error.js | 19 ++++++++++-- extension/src/webcat/ui.ts | 6 ++-- 7 files changed, 103 insertions(+), 19 deletions(-) create mode 100644 extension/_locales/en/messages.json create mode 100644 extension/_locales/fi/messages.json diff --git a/extension/Makefile b/extension/Makefile index a6f68b6..dd6e6cf 100644 --- a/extension/Makefile +++ b/extension/Makefile @@ -2,7 +2,7 @@ DIST := ../dist OUT := $(DIST)/webcat-extension.zip OUT_TEST := $(DIST)/webcat-extension-test.zip -INPUTS := manifest.json dist/bundle.js dist/hooks/content.js icons pages data +INPUTS := manifest.json dist/bundle.js dist/hooks/content.js icons pages data _locales FIXED_MTIME := 198001010000 all: package package-test diff --git a/extension/_locales/en/messages.json b/extension/_locales/en/messages.json new file mode 100644 index 0000000..a846aaa --- /dev/null +++ b/extension/_locales/en/messages.json @@ -0,0 +1,23 @@ +{ + "advanced": { + "message": "Advanced" + }, + "hideAdvanced": { + "message": "Hide advanced" + }, + "thisSite": { + "message": "this site" + }, + "webcatVerificationSuccessful": { + "message": "WEBCAT verification successful" + }, + "webcatVerificationFailed": { + "message": "WEBCAT verification failed" + }, + "webcatIsRunning": { + "message": "WEBCAT is running" + }, + "webcatIsUnavailable": { + "message": "WEBCAT unavailable on this site." + } +} diff --git a/extension/_locales/fi/messages.json b/extension/_locales/fi/messages.json new file mode 100644 index 0000000..963e89c --- /dev/null +++ b/extension/_locales/fi/messages.json @@ -0,0 +1,47 @@ +{ + "warningSecurityRisk": { + "message": "Varoitus: Tietoturvariski" + }, + "didNotVerify": { + "message": "Ei varmennettu" + }, + "errorShortDesc": { + "message": "WEBCAT ei voinut varmentaa, että koodi, jonka $1 tarjoili, vastaa allekirjoitettua manifestia, joten sivu estettiin." + }, + "thisSite": { + "message": "tämä sivusto" + }, + "advanced": { + "message": "Lisätietoja" + }, + "hideAdvanced": { + "message": "Piilota lisätiedot" + }, + "goBack": { + "message": "Palaa takaisin" + }, + "whatYouCanDo": { + "message": "Ongelma johtuu sivustosta, ei verkkoyhteydestäsi. Koodi tai ympäristö, jonka sivusto tarjoili, ei vastaa sen kehittäjien kryptografista allekirjoitusta, joten WEBCAT esti sivun pitääkseen sinut turvassa. Voit ilmoittaa ongelmasta sivuston omistajalle, tai jos luulet tämän olevan bugi, raportoida sen $1." + }, + "webcatRepository": { + "message": "WEBCATin tietovarastoon" + }, + "file": { + "message": "Tiedosto: $1" + }, + "errorCode": { + "message": "Virhekoodi: $1" + }, + "webcatVerificationSuccessful": { + "message": "WEBCAT-varmennus onnistui" + }, + "webcatVerificationFailed": { + "message": "WEBCAT-varmennus epäonnistui" + }, + "webcatIsRunning": { + "message": "WEBCAT on käynnissä" + }, + "webcatIsUnavailable": { + "message": "WEBCAT ei käytettävissä tällä sivustolla." + } +} diff --git a/extension/manifest.json b/extension/manifest.json index 649dd27..0ee4142 100644 --- a/extension/manifest.json +++ b/extension/manifest.json @@ -47,6 +47,7 @@ "48": "icons/light/webcat.SVG", "128": "icons/light/webcat.SVG" }, - "default_title": "WEBCAT unavailable on this site." - } + "default_title": "__MSG_webcatIsUnavailable__" + }, + "default_locale": "en" } diff --git a/extension/pages/error.html b/extension/pages/error.html index f5550ea..f6711c8 100644 --- a/extension/pages/error.html +++ b/extension/pages/error.html @@ -11,41 +11,41 @@ - Warning: Security Risk + Warning: Security Risk
-

Did not verify

+

Did not verify

-

+

WEBCAT could not verify that the code served by - this site matches its signed manifest, so + this site matches its signed manifest, so the page was blocked.

- - + +
diff --git a/extension/pages/error.js b/extension/pages/error.js index aec47ab..3899b5c 100644 --- a/extension/pages/error.js +++ b/extension/pages/error.js @@ -1,10 +1,23 @@ document.addEventListener("DOMContentLoaded", () => { + function localize(container) { + container.querySelectorAll("[data-i18n]").forEach((el) => { + const substitutions = Array.from(el.children).map((child) => child.outerHTML); + const msg = browser.i18n.getMessage(el.getAttribute("data-i18n"), substitutions); + if (msg === "") { + return; + } + el.innerHTML = msg; + localize(el); + }); + } + localize(document); + const params = new URLSearchParams(location.hash.slice(1)); const code = params.get("code") || "UNKNOWN"; const host = params.get("host") || ""; const file = params.get("file") || ""; - setText("error-host", host || "this site"); + setText("error-host", host || browser.i18n.getMessage("thisSite")); setText("debug-code", code); if (file) { @@ -18,8 +31,8 @@ document.addEventListener("DOMContentLoaded", () => { advancedPanel.hidden = !advancedPanel.hidden; advancedButton.setAttribute("aria-expanded", String(!advancedPanel.hidden)); advancedButton.textContent = advancedPanel.hidden - ? "Advanced" - : "Hide advanced"; + ? browser.i18n.getMessage("advanced") + : browser.i18n.getMessage("hideAdvanced"); }); // The error page took a history slot diff --git a/extension/src/webcat/ui.ts b/extension/src/webcat/ui.ts index 81be380..a8f6c64 100644 --- a/extension/src/webcat/ui.ts +++ b/extension/src/webcat/ui.ts @@ -19,7 +19,7 @@ export function setIcon(tabId: number) { tabId: tabId, path: `icons/${theme}/webcat.SVG`, }); - browser.pageAction.setTitle({ tabId, title: "WEBCAT is running" }); + browser.pageAction.setTitle({ tabId, title: browser.i18n.getMessage("webcatIsRunning") }); } export function setOKIcon(tabId: number, delegation?: string) { @@ -43,7 +43,7 @@ export function setOKIcon(tabId: number, delegation?: string) { path: `icons/${theme}/webcat-ok.SVG`, }); - let message = "WEBCAT verification successful"; + let message = browser.i18n.getMessage("webcatVerificationSuccessful"); if (delegation) { message += ` (${delegation})`; } @@ -69,7 +69,7 @@ export function setErrorIcon(tabId: number) { }); browser.pageAction.setTitle({ tabId: tabId, - title: "WEBCAT verification failed", + title: browser.i18n.getMessage("webcatVerificationFailed"), }); } From 89181427df95c9845eaf80f9c8f23c27dc370630 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juho=20Fors=C3=A9n?= Date: Thu, 18 Jun 2026 09:38:47 +0000 Subject: [PATCH 2/2] Lint --- extension/_locales/en/messages.json | 42 +++++++------- extension/_locales/fi/messages.json | 90 ++++++++++++++--------------- extension/pages/error.html | 31 +++++++--- extension/pages/error.js | 9 ++- extension/src/webcat/ui.ts | 5 +- 5 files changed, 101 insertions(+), 76 deletions(-) diff --git a/extension/_locales/en/messages.json b/extension/_locales/en/messages.json index a846aaa..18246bb 100644 --- a/extension/_locales/en/messages.json +++ b/extension/_locales/en/messages.json @@ -1,23 +1,23 @@ { - "advanced": { - "message": "Advanced" - }, - "hideAdvanced": { - "message": "Hide advanced" - }, - "thisSite": { - "message": "this site" - }, - "webcatVerificationSuccessful": { - "message": "WEBCAT verification successful" - }, - "webcatVerificationFailed": { - "message": "WEBCAT verification failed" - }, - "webcatIsRunning": { - "message": "WEBCAT is running" - }, - "webcatIsUnavailable": { - "message": "WEBCAT unavailable on this site." - } + "advanced": { + "message": "Advanced" + }, + "hideAdvanced": { + "message": "Hide advanced" + }, + "thisSite": { + "message": "this site" + }, + "webcatVerificationSuccessful": { + "message": "WEBCAT verification successful" + }, + "webcatVerificationFailed": { + "message": "WEBCAT verification failed" + }, + "webcatIsRunning": { + "message": "WEBCAT is running" + }, + "webcatIsUnavailable": { + "message": "WEBCAT unavailable on this site." + } } diff --git a/extension/_locales/fi/messages.json b/extension/_locales/fi/messages.json index 963e89c..bdc38c0 100644 --- a/extension/_locales/fi/messages.json +++ b/extension/_locales/fi/messages.json @@ -1,47 +1,47 @@ { - "warningSecurityRisk": { - "message": "Varoitus: Tietoturvariski" - }, - "didNotVerify": { - "message": "Ei varmennettu" - }, - "errorShortDesc": { - "message": "WEBCAT ei voinut varmentaa, että koodi, jonka $1 tarjoili, vastaa allekirjoitettua manifestia, joten sivu estettiin." - }, - "thisSite": { - "message": "tämä sivusto" - }, - "advanced": { - "message": "Lisätietoja" - }, - "hideAdvanced": { - "message": "Piilota lisätiedot" - }, - "goBack": { - "message": "Palaa takaisin" - }, - "whatYouCanDo": { - "message": "Ongelma johtuu sivustosta, ei verkkoyhteydestäsi. Koodi tai ympäristö, jonka sivusto tarjoili, ei vastaa sen kehittäjien kryptografista allekirjoitusta, joten WEBCAT esti sivun pitääkseen sinut turvassa. Voit ilmoittaa ongelmasta sivuston omistajalle, tai jos luulet tämän olevan bugi, raportoida sen $1." - }, - "webcatRepository": { - "message": "WEBCATin tietovarastoon" - }, - "file": { - "message": "Tiedosto: $1" - }, - "errorCode": { - "message": "Virhekoodi: $1" - }, - "webcatVerificationSuccessful": { - "message": "WEBCAT-varmennus onnistui" - }, - "webcatVerificationFailed": { - "message": "WEBCAT-varmennus epäonnistui" - }, - "webcatIsRunning": { - "message": "WEBCAT on käynnissä" - }, - "webcatIsUnavailable": { - "message": "WEBCAT ei käytettävissä tällä sivustolla." - } + "warningSecurityRisk": { + "message": "Varoitus: Tietoturvariski" + }, + "didNotVerify": { + "message": "Ei varmennettu" + }, + "errorShortDesc": { + "message": "WEBCAT ei voinut varmentaa, että koodi, jonka $1 tarjoili, vastaa allekirjoitettua manifestia, joten sivu estettiin." + }, + "thisSite": { + "message": "tämä sivusto" + }, + "advanced": { + "message": "Lisätietoja" + }, + "hideAdvanced": { + "message": "Piilota lisätiedot" + }, + "goBack": { + "message": "Palaa takaisin" + }, + "whatYouCanDo": { + "message": "Ongelma johtuu sivustosta, ei verkkoyhteydestäsi. Koodi tai ympäristö, jonka sivusto tarjoili, ei vastaa sen kehittäjien kryptografista allekirjoitusta, joten WEBCAT esti sivun pitääkseen sinut turvassa. Voit ilmoittaa ongelmasta sivuston omistajalle, tai jos luulet tämän olevan bugi, raportoida sen $1." + }, + "webcatRepository": { + "message": "WEBCATin tietovarastoon" + }, + "file": { + "message": "Tiedosto: $1" + }, + "errorCode": { + "message": "Virhekoodi: $1" + }, + "webcatVerificationSuccessful": { + "message": "WEBCAT-varmennus onnistui" + }, + "webcatVerificationFailed": { + "message": "WEBCAT-varmennus epäonnistui" + }, + "webcatIsRunning": { + "message": "WEBCAT on käynnissä" + }, + "webcatIsUnavailable": { + "message": "WEBCAT ei käytettävissä tällä sivustolla." + } } diff --git a/extension/pages/error.html b/extension/pages/error.html index f6711c8..7338bd8 100644 --- a/extension/pages/error.html +++ b/extension/pages/error.html @@ -22,13 +22,21 @@

Did not verify

WEBCAT could not verify that the code served by - this site matches its signed manifest, so - the page was blocked. + this site matches + its signed manifest, so the page was blocked.

- - + +
diff --git a/extension/pages/error.js b/extension/pages/error.js index 3899b5c..0d0e552 100644 --- a/extension/pages/error.js +++ b/extension/pages/error.js @@ -1,8 +1,13 @@ document.addEventListener("DOMContentLoaded", () => { function localize(container) { container.querySelectorAll("[data-i18n]").forEach((el) => { - const substitutions = Array.from(el.children).map((child) => child.outerHTML); - const msg = browser.i18n.getMessage(el.getAttribute("data-i18n"), substitutions); + const substitutions = Array.from(el.children).map( + (child) => child.outerHTML, + ); + const msg = browser.i18n.getMessage( + el.getAttribute("data-i18n"), + substitutions, + ); if (msg === "") { return; } diff --git a/extension/src/webcat/ui.ts b/extension/src/webcat/ui.ts index a8f6c64..2c4f123 100644 --- a/extension/src/webcat/ui.ts +++ b/extension/src/webcat/ui.ts @@ -19,7 +19,10 @@ export function setIcon(tabId: number) { tabId: tabId, path: `icons/${theme}/webcat.SVG`, }); - browser.pageAction.setTitle({ tabId, title: browser.i18n.getMessage("webcatIsRunning") }); + browser.pageAction.setTitle({ + tabId, + title: browser.i18n.getMessage("webcatIsRunning"), + }); } export function setOKIcon(tabId: number, delegation?: string) {