From 85a8bf93ad34cb9518f0cfa2de4d92c2708c7f30 Mon Sep 17 00:00:00 2001 From: WBT112 <98946003+WBT112@users.noreply.github.com> Date: Tue, 16 Dec 2025 18:01:20 +0100 Subject: [PATCH 01/12] Added german translation --- server/locales/de.json | 107 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 server/locales/de.json diff --git a/server/locales/de.json b/server/locales/de.json new file mode 100644 index 0000000..74f31e6 --- /dev/null +++ b/server/locales/de.json @@ -0,0 +1,107 @@ +{ + "index.pagetitle": "Analyze your page against web performance best practice rules and using metrics", + "index.pagedescription": "Wie schnell ist deine Seite? Wie gut folt es Vorgaben zur Seitenperfoemnce? Finde es durch die Nutzung von sitespeed.io heraus.", + + "index.button.analyze": "Analysieren", + "index.button.backtostart": "Zurück zum Start", + "index.tab.settings": "Einstellungen", + "index.tab.extras": "Extras", + "index.tab.cli": "Kommandozeilenargumente", + "index.tab.scripting": "Scripting", + + "index.tab.settings.location": "Ort", + "index.tab.settings.testtype": "Testtyp", + "index.tab.settings.browser": "Browser", + "index.tab.settings.emulatedmobile": "Mobilgerät simulieren", + "index.tab.settings.connectivity": "Verbindung", + "index.tab.settings.device": "Gerät", + "index.tab.settings.iterations": "Wiederholungen", + "index.tab.settings.placeholder": "URL zum testen eintragen. Der hostname muss passen ", + + "index.tab.cli.addargs": "Kommandozeilenargumente hinzufügen", + "index.tab.cli.clioptions": "Optionen", + "index.tab.cli.placeholder": "Parameter wie --cpu", + + "index.tab.extras.sustainable": "Nachhaltigkeitstests", + "index.tab.extras.axe": "Zugfänglichkeitstests", + "index.tab.extras.crux": "CrUx Daten", + "index.tab.extras.lighthouse": "Lighthouse", + "index.tab.extras.labelplaceholder": "Das Label deines Tests", + + "index.tab.scripting.scriptname": "Name deines Skripts, der Name muss regex [-a-zA-Z0-9\\._-] entsprechen", + "index.tab.scripting.recommendation": "Autovervollständigen/code vervollständigen funktioniert am besten in VS Code", + "index.tab.scripting.documentation": "Dokumentation", + + "index.waitingtestrunners": "Wartet darauf, dass die Testrunner online kommen.", + "index.refresh": "Aktualisieren", + + "index.waitingtorunnext": "Wartet...", + "index.inqueue": "Es sind %s Jobs in der Warteschlange und dein Job ist Platz %s in der Warteschlange", + + "search.button.lasthour": "Letzte Stunde", + "search.button.today": "Heute", + "search.button.yesterday": "Gestern", + "search.button.lastweek": "Letzte Woche", + "search.button.help": "Hilfe", + "search.button.compare": "Vergleiche", + "search.button.search": "Suche", + "search.button.next": "Nächster", + "search.button.previous": "Vorheriger", + "search.button.clear": "Löschen", + "search.input.placeholder": "Schreibe die URL und nutze Kommandos wie date: %s", + + "search.help.heading": "Kommandos durchsuchen", + "search.help.description": "Du kannst du Suchkommandos kombinieren. Um den test für eine URL, Datum und browser zu suchen kannst du wie folgt vorgehen", + "search.help.bydate" : "Datum des Testlaufes.", + "search.help.beforedate" : "Tests die vor diesem Datum gelaufen sind.", + "search.help.afterdate" : "TTests die nach diesem Datum gelaufen sind.", + "search.help.bylabel" : "Tests nach Label suchen", + "search.help.byday": "Du kannst: today|yesterday|lastweek|lastmonth nutzen um die Tests, die dann gelaufen sind zu suchen.", + "search.help.bybrowser": "Suche Tests nach Browser: chrome, firefox, edge, safari", + "search.help.byscriptname": "Suche Tests nach Skriptname", + "search.help.bylocation": "Suche Tests nach Ort", + "search.help.bystatus": "Suche Tests nach Status", + "search.help.bytesttype": "Suche Tests nach Testtyp: desktop, emulatedMobile or android.", + "search.help.byurl": "Suche Tests nach URL. Die URL muss mit http starten und die Suche sucht nach einem gleichen Wert. Um nach teilweisen URLs zu suchen nutze das url: Kommando.", + "search.help.byurlwithwildcard":"Suche Tests nach URL. Die URL wird mit einem Platzhalter vor Beginn und Ende gesucht, so dass auch Teile gefunden werden. Zum Beispiel wird %s %s finden.", + + "search.result.urlscriptname": "URL/Skript Name", + "search.result.label": "Label", + "search.result.rundate": "Datum von Lauf/Hinzugefügt", + "search.result.location": "Ort", + "search.result.type": "Typ", + "search.result.status": "Status", + "search.result.browser": "Browser", + "search.result.actions": "Aktionen", + "search.result.nomatch": "Keine Tests, die den Suchkriterien entsprechen gefunden.", + "search.result.showing": "Zeige %s - %s von %s", + "search.result.slug": "Slug", + "search.result.of": "von", + "search.pagetitle": "Suche nach Tests", + "search.pagedescription": "Hier kannst du nach abgeschlossenen Tests suchen.", + + "error.validation.missingurlorscripting": "Du musst entweder eine URL angeben oder Scripting nutzen.", + "error.validation.missinglocation": "Fehlender Ort", + "error.validation.missingtesttype": "Fehlender Testtyp", + "error.validation.nomatchingtestwithid": "Es gibt keine Tests mit der ID %s", + "error.missingresultbaseurl":"Missing resultBaseURL setup for sitespeeed.io. You need to fix that in your configuration. Eventuell fehlt auch das HTTP/HTTP(S) Protokoll (http://)", + "error.testfailed": "Der Testlauf ist fehlgeschlagen", + "error.parsingscript": "Skript konnte nicht verarbeitet werden", + "error.urlnotvalid": "Die URL %s ist keine valide URL", + "error.nonmatchingdomain": "Die URL %s passt nicht zum konfigurierten regex für den Hostnamen %s", + "error.missingkey": "Kein key wurde gesetzt", + "error.keynotvalid": "Falscher Key %s", + "error.missinglocation": "Fehlender Ort", + "error.nonexistingqueue": "Nicht existierende Warteschlange", + + "navigationbar.search": "Suche", + "navigationbar.home": "Home", + + "edit.title": "Test editieren oder erneut starten", + "edit.description": "Du kannst deinen test erneut starten, die URL ändern oder einen Alias für den test ändern/hinzufügen. Wenn du die URL änderst und den Test erneut startest, wird der Test die gleichen Einstellungen wie vorher nutzen.", + "edit.urlscript": "URL/Skriptname:", + "edit.label": "Label:", + "edit.button.save": "Änderungen speicherne", + "edit.button.rerun": "Test neu starten", + "edit.button.cancel": "Abbrechen" +} From 12bfd8bc68018f6e66be05280e88a6fb532395da Mon Sep 17 00:00:00 2001 From: WBT112 Date: Tue, 16 Dec 2025 21:01:05 +0100 Subject: [PATCH 02/12] Fixed some errors in translation and made it shorter. --- server/locales/de.json | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/server/locales/de.json b/server/locales/de.json index 74f31e6..b04c5b8 100644 --- a/server/locales/de.json +++ b/server/locales/de.json @@ -1,6 +1,6 @@ { - "index.pagetitle": "Analyze your page against web performance best practice rules and using metrics", - "index.pagedescription": "Wie schnell ist deine Seite? Wie gut folt es Vorgaben zur Seitenperfoemnce? Finde es durch die Nutzung von sitespeed.io heraus.", + "index.pagetitle": "Teste deine Seite gegen Performance-Vorgaben und nutze Geschwindigkeitsmetriken", + "index.pagedescription": "Wie schnell ist deine Seite? Wie gut folgt sie den Vorgaben zur Seitenperformance? Finde es durch die Nutzung von sitespeed.io heraus.", "index.button.analyze": "Analysieren", "index.button.backtostart": "Zurück zum Start", @@ -16,64 +16,64 @@ "index.tab.settings.connectivity": "Verbindung", "index.tab.settings.device": "Gerät", "index.tab.settings.iterations": "Wiederholungen", - "index.tab.settings.placeholder": "URL zum testen eintragen. Der hostname muss passen ", + "index.tab.settings.placeholder": "URL zum Testen eintragen. Der Hostname muss passen.", "index.tab.cli.addargs": "Kommandozeilenargumente hinzufügen", "index.tab.cli.clioptions": "Optionen", "index.tab.cli.placeholder": "Parameter wie --cpu", "index.tab.extras.sustainable": "Nachhaltigkeitstests", - "index.tab.extras.axe": "Zugfänglichkeitstests", - "index.tab.extras.crux": "CrUx Daten", + "index.tab.extras.axe": "Zugänglichkeitstests", + "index.tab.extras.crux": "CrUX-Daten", "index.tab.extras.lighthouse": "Lighthouse", "index.tab.extras.labelplaceholder": "Das Label deines Tests", "index.tab.scripting.scriptname": "Name deines Skripts, der Name muss regex [-a-zA-Z0-9\\._-] entsprechen", - "index.tab.scripting.recommendation": "Autovervollständigen/code vervollständigen funktioniert am besten in VS Code", + "index.tab.scripting.recommendation": "Autovervollständigen/Code-Vervollständigen funktioniert am besten in VS Code", "index.tab.scripting.documentation": "Dokumentation", - "index.waitingtestrunners": "Wartet darauf, dass die Testrunner online kommen.", + "index.waitingtestrunners": "Wartet darauf, dass die Testrunner online sind.", "index.refresh": "Aktualisieren", "index.waitingtorunnext": "Wartet...", - "index.inqueue": "Es sind %s Jobs in der Warteschlange und dein Job ist Platz %s in der Warteschlange", + "index.inqueue": "Es sind %s Jobs in der Warteschlange, dein Job ist auf Platz %s.", "search.button.lasthour": "Letzte Stunde", "search.button.today": "Heute", "search.button.yesterday": "Gestern", "search.button.lastweek": "Letzte Woche", "search.button.help": "Hilfe", - "search.button.compare": "Vergleiche", + "search.button.compare": "Vergleichen", "search.button.search": "Suche", "search.button.next": "Nächster", "search.button.previous": "Vorheriger", "search.button.clear": "Löschen", - "search.input.placeholder": "Schreibe die URL und nutze Kommandos wie date: %s", + "search.input.placeholder": "Gib die URL ein und nutze Kommandos wie date: %s", "search.help.heading": "Kommandos durchsuchen", - "search.help.description": "Du kannst du Suchkommandos kombinieren. Um den test für eine URL, Datum und browser zu suchen kannst du wie folgt vorgehen", + "search.help.description": "Du kannst Suchkommandos kombinieren. Um den Test für eine URL, ein Datum und einen Browser zu suchen, kannst du wie folgt vorgehen.", "search.help.bydate" : "Datum des Testlaufes.", "search.help.beforedate" : "Tests die vor diesem Datum gelaufen sind.", - "search.help.afterdate" : "TTests die nach diesem Datum gelaufen sind.", + "search.help.afterdate" : "Tests, die nach diesem Datum gelaufen sind.", "search.help.bylabel" : "Tests nach Label suchen", - "search.help.byday": "Du kannst: today|yesterday|lastweek|lastmonth nutzen um die Tests, die dann gelaufen sind zu suchen.", + "search.help.byday": "Du kannst today|yesterday|lastweek|lastmonth nutzen, um Tests aus diesen Zeiträumen zu suchen.", "search.help.bybrowser": "Suche Tests nach Browser: chrome, firefox, edge, safari", "search.help.byscriptname": "Suche Tests nach Skriptname", "search.help.bylocation": "Suche Tests nach Ort", "search.help.bystatus": "Suche Tests nach Status", "search.help.bytesttype": "Suche Tests nach Testtyp: desktop, emulatedMobile or android.", "search.help.byurl": "Suche Tests nach URL. Die URL muss mit http starten und die Suche sucht nach einem gleichen Wert. Um nach teilweisen URLs zu suchen nutze das url: Kommando.", - "search.help.byurlwithwildcard":"Suche Tests nach URL. Die URL wird mit einem Platzhalter vor Beginn und Ende gesucht, so dass auch Teile gefunden werden. Zum Beispiel wird %s %s finden.", + "search.help.byurlwithwildcard":"Suche Tests nach URL. Die URL wird mit einem Platzhalter vor Beginn und Ende gesucht, sodass auch Teile gefunden werden. Zum Beispiel wird %s %s finden.", "search.result.urlscriptname": "URL/Skript Name", "search.result.label": "Label", - "search.result.rundate": "Datum von Lauf/Hinzugefügt", + "search.result.rundate": "Datum des Laufs/Hinzugefügt", "search.result.location": "Ort", "search.result.type": "Typ", "search.result.status": "Status", "search.result.browser": "Browser", "search.result.actions": "Aktionen", - "search.result.nomatch": "Keine Tests, die den Suchkriterien entsprechen gefunden.", + "search.result.nomatch": "Keine Tests gefunden, die den Suchkriterien entsprechen.", "search.result.showing": "Zeige %s - %s von %s", "search.result.slug": "Slug", "search.result.of": "von", @@ -84,12 +84,12 @@ "error.validation.missinglocation": "Fehlender Ort", "error.validation.missingtesttype": "Fehlender Testtyp", "error.validation.nomatchingtestwithid": "Es gibt keine Tests mit der ID %s", - "error.missingresultbaseurl":"Missing resultBaseURL setup for sitespeeed.io. You need to fix that in your configuration. Eventuell fehlt auch das HTTP/HTTP(S) Protokoll (http://)", + "error.missingresultbaseurl":"resultBaseURL ist für sitespeed.io nicht gesetzt. Bitte in der Konfiguration ergänzen (inkl. http:// oder https://).", "error.testfailed": "Der Testlauf ist fehlgeschlagen", "error.parsingscript": "Skript konnte nicht verarbeitet werden", "error.urlnotvalid": "Die URL %s ist keine valide URL", "error.nonmatchingdomain": "Die URL %s passt nicht zum konfigurierten regex für den Hostnamen %s", - "error.missingkey": "Kein key wurde gesetzt", + "error.missingkey": "Kein Schlüssel wurde gesetzt", "error.keynotvalid": "Falscher Key %s", "error.missinglocation": "Fehlender Ort", "error.nonexistingqueue": "Nicht existierende Warteschlange", @@ -98,10 +98,10 @@ "navigationbar.home": "Home", "edit.title": "Test editieren oder erneut starten", - "edit.description": "Du kannst deinen test erneut starten, die URL ändern oder einen Alias für den test ändern/hinzufügen. Wenn du die URL änderst und den Test erneut startest, wird der Test die gleichen Einstellungen wie vorher nutzen.", + "edit.description": "Du kannst deinen Test erneut starten, die URL ändern oder einen Alias für den Test ändern/hinzufügen. Wenn du die URL änderst und den Test erneut startest, nutzt der Test die gleichen Einstellungen wie vorher.", "edit.urlscript": "URL/Skriptname:", "edit.label": "Label:", - "edit.button.save": "Änderungen speicherne", + "edit.button.save": "Änderungen speichern", "edit.button.rerun": "Test neu starten", "edit.button.cancel": "Abbrechen" } From 3a930f70244f0a80ccb2baad6da3b73df1a2690a Mon Sep 17 00:00:00 2001 From: Tobi <98946003+WBT112@users.noreply.github.com> Date: Fri, 19 Dec 2025 09:21:34 +0100 Subject: [PATCH 03/12] Lazy load locale from runtime config --- server/src/util/text.js | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/server/src/util/text.js b/server/src/util/text.js index e50bd2a..0285289 100644 --- a/server/src/util/text.js +++ b/server/src/util/text.js @@ -1,12 +1,35 @@ import nconf from 'nconf'; import y18n from 'y18n'; import { getBaseFilePath } from './fileutil.js'; -const locale = nconf.get('localization:defaultLocale'); -const directory = - nconf.get('localization:directory') || getBaseFilePath('./locales'); -const myy18n = y18n({ updateFiles: false, locale, directory }); +let myy18n; + +function getLocale() { + // Locale from runtime config (env via compose) with fallback to config defaults. + // Note: We init lazily so env/config is loaded before y18n is created (initialized too early and is stuck on defaults). + return ( + nconf.get('localization:defaultLocale') || + 'en' + ); +} + +function getLocalesDirectory() { + // Directory from runtime config with fallback to config defaults. Lazy init for the same reason as above. + return ( + nconf.get('localization:directory') || + getBaseFilePath('./locales') + ); +} + +function getI18nInstance() { + if (!myy18n) { + const locale = getLocale(); + const directory = getLocalesDirectory(); + myy18n = y18n({ updateFiles: false, locale, directory }); + } + return myy18n; +} export function getText(key, ...arguments_) { - return myy18n.__(key, ...arguments_); + return getI18nInstance().__(key, ...arguments_); } From 6b9b814b6b9a6c88fc22e3b4b7a367a5246c892e Mon Sep 17 00:00:00 2001 From: Tobi <98946003+WBT112@users.noreply.github.com> Date: Fri, 19 Dec 2025 09:22:38 +0100 Subject: [PATCH 04/12] Added Environment for Locale and HOMEURL --- .env | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.env b/.env index 80130b8..3aef83c 100644 --- a/.env +++ b/.env @@ -22,4 +22,8 @@ MINIO_MC_DOCKER_VERSION=RELEASE.2024-10-08T09-37-26Z RESULT_BASE_URL="http://127.0.0.1:9000/sitespeedio" SITESPEED_IO_CONTAINER="sitespeedio/sitespeed.io:39" VALID_TEST_DOMAINS=".*" -LOCATION_NAME="default" \ No newline at end of file +LOCATION_NAME="default" +# Report logo target on results page (goes to sitespeed.io --html.homeUrl via compose -> server env -> job config) +SITESPEED_IO_HTML_HOMEURL="http://127.0.0.1:3000/" +# Set default locale +LOCALIZATION_DEFAULTLOCALE=de From fcfbabe19f61eb868bd56b9c42757809385e0532 Mon Sep 17 00:00:00 2001 From: Tobi <98946003+WBT112@users.noreply.github.com> Date: Fri, 19 Dec 2025 09:25:03 +0100 Subject: [PATCH 05/12] Added default locale and HomeURL as environment variables --- docker-compose.app.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docker-compose.app.yml b/docker-compose.app.yml index eb2618f..516d43d 100644 --- a/docker-compose.app.yml +++ b/docker-compose.app.yml @@ -11,6 +11,8 @@ services: database_password: ${POSTGRES_PASSWORD} database_port: 5432 validTestDomains: ${VALID_TEST_DOMAINS} + localization_defaultLocale: ${LOCALIZATION_DEFAULTLOCALE} + sitespeed.io_html_homeurl: ${SITESPEED_IO_HTML_HOMEURL} ports: - "3000:3000" networks: @@ -46,4 +48,4 @@ services: - minio - sitespeed.io-server networks: - - skynet \ No newline at end of file + - skynet From 2b801cded5ab1415fbadc0285c8eb138c94cdc01 Mon Sep 17 00:00:00 2001 From: WBT112 Date: Fri, 19 Dec 2025 09:28:01 +0100 Subject: [PATCH 06/12] Revert "Fixed some errors in translation and made it shorter." This reverts commit 12bfd8bc68018f6e66be05280e88a6fb532395da. --- server/locales/de.json | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/server/locales/de.json b/server/locales/de.json index b04c5b8..74f31e6 100644 --- a/server/locales/de.json +++ b/server/locales/de.json @@ -1,6 +1,6 @@ { - "index.pagetitle": "Teste deine Seite gegen Performance-Vorgaben und nutze Geschwindigkeitsmetriken", - "index.pagedescription": "Wie schnell ist deine Seite? Wie gut folgt sie den Vorgaben zur Seitenperformance? Finde es durch die Nutzung von sitespeed.io heraus.", + "index.pagetitle": "Analyze your page against web performance best practice rules and using metrics", + "index.pagedescription": "Wie schnell ist deine Seite? Wie gut folt es Vorgaben zur Seitenperfoemnce? Finde es durch die Nutzung von sitespeed.io heraus.", "index.button.analyze": "Analysieren", "index.button.backtostart": "Zurück zum Start", @@ -16,64 +16,64 @@ "index.tab.settings.connectivity": "Verbindung", "index.tab.settings.device": "Gerät", "index.tab.settings.iterations": "Wiederholungen", - "index.tab.settings.placeholder": "URL zum Testen eintragen. Der Hostname muss passen.", + "index.tab.settings.placeholder": "URL zum testen eintragen. Der hostname muss passen ", "index.tab.cli.addargs": "Kommandozeilenargumente hinzufügen", "index.tab.cli.clioptions": "Optionen", "index.tab.cli.placeholder": "Parameter wie --cpu", "index.tab.extras.sustainable": "Nachhaltigkeitstests", - "index.tab.extras.axe": "Zugänglichkeitstests", - "index.tab.extras.crux": "CrUX-Daten", + "index.tab.extras.axe": "Zugfänglichkeitstests", + "index.tab.extras.crux": "CrUx Daten", "index.tab.extras.lighthouse": "Lighthouse", "index.tab.extras.labelplaceholder": "Das Label deines Tests", "index.tab.scripting.scriptname": "Name deines Skripts, der Name muss regex [-a-zA-Z0-9\\._-] entsprechen", - "index.tab.scripting.recommendation": "Autovervollständigen/Code-Vervollständigen funktioniert am besten in VS Code", + "index.tab.scripting.recommendation": "Autovervollständigen/code vervollständigen funktioniert am besten in VS Code", "index.tab.scripting.documentation": "Dokumentation", - "index.waitingtestrunners": "Wartet darauf, dass die Testrunner online sind.", + "index.waitingtestrunners": "Wartet darauf, dass die Testrunner online kommen.", "index.refresh": "Aktualisieren", "index.waitingtorunnext": "Wartet...", - "index.inqueue": "Es sind %s Jobs in der Warteschlange, dein Job ist auf Platz %s.", + "index.inqueue": "Es sind %s Jobs in der Warteschlange und dein Job ist Platz %s in der Warteschlange", "search.button.lasthour": "Letzte Stunde", "search.button.today": "Heute", "search.button.yesterday": "Gestern", "search.button.lastweek": "Letzte Woche", "search.button.help": "Hilfe", - "search.button.compare": "Vergleichen", + "search.button.compare": "Vergleiche", "search.button.search": "Suche", "search.button.next": "Nächster", "search.button.previous": "Vorheriger", "search.button.clear": "Löschen", - "search.input.placeholder": "Gib die URL ein und nutze Kommandos wie date: %s", + "search.input.placeholder": "Schreibe die URL und nutze Kommandos wie date: %s", "search.help.heading": "Kommandos durchsuchen", - "search.help.description": "Du kannst Suchkommandos kombinieren. Um den Test für eine URL, ein Datum und einen Browser zu suchen, kannst du wie folgt vorgehen.", + "search.help.description": "Du kannst du Suchkommandos kombinieren. Um den test für eine URL, Datum und browser zu suchen kannst du wie folgt vorgehen", "search.help.bydate" : "Datum des Testlaufes.", "search.help.beforedate" : "Tests die vor diesem Datum gelaufen sind.", - "search.help.afterdate" : "Tests, die nach diesem Datum gelaufen sind.", + "search.help.afterdate" : "TTests die nach diesem Datum gelaufen sind.", "search.help.bylabel" : "Tests nach Label suchen", - "search.help.byday": "Du kannst today|yesterday|lastweek|lastmonth nutzen, um Tests aus diesen Zeiträumen zu suchen.", + "search.help.byday": "Du kannst: today|yesterday|lastweek|lastmonth nutzen um die Tests, die dann gelaufen sind zu suchen.", "search.help.bybrowser": "Suche Tests nach Browser: chrome, firefox, edge, safari", "search.help.byscriptname": "Suche Tests nach Skriptname", "search.help.bylocation": "Suche Tests nach Ort", "search.help.bystatus": "Suche Tests nach Status", "search.help.bytesttype": "Suche Tests nach Testtyp: desktop, emulatedMobile or android.", "search.help.byurl": "Suche Tests nach URL. Die URL muss mit http starten und die Suche sucht nach einem gleichen Wert. Um nach teilweisen URLs zu suchen nutze das url: Kommando.", - "search.help.byurlwithwildcard":"Suche Tests nach URL. Die URL wird mit einem Platzhalter vor Beginn und Ende gesucht, sodass auch Teile gefunden werden. Zum Beispiel wird %s %s finden.", + "search.help.byurlwithwildcard":"Suche Tests nach URL. Die URL wird mit einem Platzhalter vor Beginn und Ende gesucht, so dass auch Teile gefunden werden. Zum Beispiel wird %s %s finden.", "search.result.urlscriptname": "URL/Skript Name", "search.result.label": "Label", - "search.result.rundate": "Datum des Laufs/Hinzugefügt", + "search.result.rundate": "Datum von Lauf/Hinzugefügt", "search.result.location": "Ort", "search.result.type": "Typ", "search.result.status": "Status", "search.result.browser": "Browser", "search.result.actions": "Aktionen", - "search.result.nomatch": "Keine Tests gefunden, die den Suchkriterien entsprechen.", + "search.result.nomatch": "Keine Tests, die den Suchkriterien entsprechen gefunden.", "search.result.showing": "Zeige %s - %s von %s", "search.result.slug": "Slug", "search.result.of": "von", @@ -84,12 +84,12 @@ "error.validation.missinglocation": "Fehlender Ort", "error.validation.missingtesttype": "Fehlender Testtyp", "error.validation.nomatchingtestwithid": "Es gibt keine Tests mit der ID %s", - "error.missingresultbaseurl":"resultBaseURL ist für sitespeed.io nicht gesetzt. Bitte in der Konfiguration ergänzen (inkl. http:// oder https://).", + "error.missingresultbaseurl":"Missing resultBaseURL setup for sitespeeed.io. You need to fix that in your configuration. Eventuell fehlt auch das HTTP/HTTP(S) Protokoll (http://)", "error.testfailed": "Der Testlauf ist fehlgeschlagen", "error.parsingscript": "Skript konnte nicht verarbeitet werden", "error.urlnotvalid": "Die URL %s ist keine valide URL", "error.nonmatchingdomain": "Die URL %s passt nicht zum konfigurierten regex für den Hostnamen %s", - "error.missingkey": "Kein Schlüssel wurde gesetzt", + "error.missingkey": "Kein key wurde gesetzt", "error.keynotvalid": "Falscher Key %s", "error.missinglocation": "Fehlender Ort", "error.nonexistingqueue": "Nicht existierende Warteschlange", @@ -98,10 +98,10 @@ "navigationbar.home": "Home", "edit.title": "Test editieren oder erneut starten", - "edit.description": "Du kannst deinen Test erneut starten, die URL ändern oder einen Alias für den Test ändern/hinzufügen. Wenn du die URL änderst und den Test erneut startest, nutzt der Test die gleichen Einstellungen wie vorher.", + "edit.description": "Du kannst deinen test erneut starten, die URL ändern oder einen Alias für den test ändern/hinzufügen. Wenn du die URL änderst und den Test erneut startest, wird der Test die gleichen Einstellungen wie vorher nutzen.", "edit.urlscript": "URL/Skriptname:", "edit.label": "Label:", - "edit.button.save": "Änderungen speichern", + "edit.button.save": "Änderungen speicherne", "edit.button.rerun": "Test neu starten", "edit.button.cancel": "Abbrechen" } From a426489eb1be794bc1f29079e58b6a4285de3251 Mon Sep 17 00:00:00 2001 From: WBT112 Date: Fri, 19 Dec 2025 09:28:15 +0100 Subject: [PATCH 07/12] Revert "Added german translation" This reverts commit 85a8bf93ad34cb9518f0cfa2de4d92c2708c7f30. --- server/locales/de.json | 107 ----------------------------------------- 1 file changed, 107 deletions(-) delete mode 100644 server/locales/de.json diff --git a/server/locales/de.json b/server/locales/de.json deleted file mode 100644 index 74f31e6..0000000 --- a/server/locales/de.json +++ /dev/null @@ -1,107 +0,0 @@ -{ - "index.pagetitle": "Analyze your page against web performance best practice rules and using metrics", - "index.pagedescription": "Wie schnell ist deine Seite? Wie gut folt es Vorgaben zur Seitenperfoemnce? Finde es durch die Nutzung von sitespeed.io heraus.", - - "index.button.analyze": "Analysieren", - "index.button.backtostart": "Zurück zum Start", - "index.tab.settings": "Einstellungen", - "index.tab.extras": "Extras", - "index.tab.cli": "Kommandozeilenargumente", - "index.tab.scripting": "Scripting", - - "index.tab.settings.location": "Ort", - "index.tab.settings.testtype": "Testtyp", - "index.tab.settings.browser": "Browser", - "index.tab.settings.emulatedmobile": "Mobilgerät simulieren", - "index.tab.settings.connectivity": "Verbindung", - "index.tab.settings.device": "Gerät", - "index.tab.settings.iterations": "Wiederholungen", - "index.tab.settings.placeholder": "URL zum testen eintragen. Der hostname muss passen ", - - "index.tab.cli.addargs": "Kommandozeilenargumente hinzufügen", - "index.tab.cli.clioptions": "Optionen", - "index.tab.cli.placeholder": "Parameter wie --cpu", - - "index.tab.extras.sustainable": "Nachhaltigkeitstests", - "index.tab.extras.axe": "Zugfänglichkeitstests", - "index.tab.extras.crux": "CrUx Daten", - "index.tab.extras.lighthouse": "Lighthouse", - "index.tab.extras.labelplaceholder": "Das Label deines Tests", - - "index.tab.scripting.scriptname": "Name deines Skripts, der Name muss regex [-a-zA-Z0-9\\._-] entsprechen", - "index.tab.scripting.recommendation": "Autovervollständigen/code vervollständigen funktioniert am besten in VS Code", - "index.tab.scripting.documentation": "Dokumentation", - - "index.waitingtestrunners": "Wartet darauf, dass die Testrunner online kommen.", - "index.refresh": "Aktualisieren", - - "index.waitingtorunnext": "Wartet...", - "index.inqueue": "Es sind %s Jobs in der Warteschlange und dein Job ist Platz %s in der Warteschlange", - - "search.button.lasthour": "Letzte Stunde", - "search.button.today": "Heute", - "search.button.yesterday": "Gestern", - "search.button.lastweek": "Letzte Woche", - "search.button.help": "Hilfe", - "search.button.compare": "Vergleiche", - "search.button.search": "Suche", - "search.button.next": "Nächster", - "search.button.previous": "Vorheriger", - "search.button.clear": "Löschen", - "search.input.placeholder": "Schreibe die URL und nutze Kommandos wie date: %s", - - "search.help.heading": "Kommandos durchsuchen", - "search.help.description": "Du kannst du Suchkommandos kombinieren. Um den test für eine URL, Datum und browser zu suchen kannst du wie folgt vorgehen", - "search.help.bydate" : "Datum des Testlaufes.", - "search.help.beforedate" : "Tests die vor diesem Datum gelaufen sind.", - "search.help.afterdate" : "TTests die nach diesem Datum gelaufen sind.", - "search.help.bylabel" : "Tests nach Label suchen", - "search.help.byday": "Du kannst: today|yesterday|lastweek|lastmonth nutzen um die Tests, die dann gelaufen sind zu suchen.", - "search.help.bybrowser": "Suche Tests nach Browser: chrome, firefox, edge, safari", - "search.help.byscriptname": "Suche Tests nach Skriptname", - "search.help.bylocation": "Suche Tests nach Ort", - "search.help.bystatus": "Suche Tests nach Status", - "search.help.bytesttype": "Suche Tests nach Testtyp: desktop, emulatedMobile or android.", - "search.help.byurl": "Suche Tests nach URL. Die URL muss mit http starten und die Suche sucht nach einem gleichen Wert. Um nach teilweisen URLs zu suchen nutze das url: Kommando.", - "search.help.byurlwithwildcard":"Suche Tests nach URL. Die URL wird mit einem Platzhalter vor Beginn und Ende gesucht, so dass auch Teile gefunden werden. Zum Beispiel wird %s %s finden.", - - "search.result.urlscriptname": "URL/Skript Name", - "search.result.label": "Label", - "search.result.rundate": "Datum von Lauf/Hinzugefügt", - "search.result.location": "Ort", - "search.result.type": "Typ", - "search.result.status": "Status", - "search.result.browser": "Browser", - "search.result.actions": "Aktionen", - "search.result.nomatch": "Keine Tests, die den Suchkriterien entsprechen gefunden.", - "search.result.showing": "Zeige %s - %s von %s", - "search.result.slug": "Slug", - "search.result.of": "von", - "search.pagetitle": "Suche nach Tests", - "search.pagedescription": "Hier kannst du nach abgeschlossenen Tests suchen.", - - "error.validation.missingurlorscripting": "Du musst entweder eine URL angeben oder Scripting nutzen.", - "error.validation.missinglocation": "Fehlender Ort", - "error.validation.missingtesttype": "Fehlender Testtyp", - "error.validation.nomatchingtestwithid": "Es gibt keine Tests mit der ID %s", - "error.missingresultbaseurl":"Missing resultBaseURL setup for sitespeeed.io. You need to fix that in your configuration. Eventuell fehlt auch das HTTP/HTTP(S) Protokoll (http://)", - "error.testfailed": "Der Testlauf ist fehlgeschlagen", - "error.parsingscript": "Skript konnte nicht verarbeitet werden", - "error.urlnotvalid": "Die URL %s ist keine valide URL", - "error.nonmatchingdomain": "Die URL %s passt nicht zum konfigurierten regex für den Hostnamen %s", - "error.missingkey": "Kein key wurde gesetzt", - "error.keynotvalid": "Falscher Key %s", - "error.missinglocation": "Fehlender Ort", - "error.nonexistingqueue": "Nicht existierende Warteschlange", - - "navigationbar.search": "Suche", - "navigationbar.home": "Home", - - "edit.title": "Test editieren oder erneut starten", - "edit.description": "Du kannst deinen test erneut starten, die URL ändern oder einen Alias für den test ändern/hinzufügen. Wenn du die URL änderst und den Test erneut startest, wird der Test die gleichen Einstellungen wie vorher nutzen.", - "edit.urlscript": "URL/Skriptname:", - "edit.label": "Label:", - "edit.button.save": "Änderungen speicherne", - "edit.button.rerun": "Test neu starten", - "edit.button.cancel": "Abbrechen" -} From f7d0858c55824c8f4c8c56793deeaeabe01c2287 Mon Sep 17 00:00:00 2001 From: WBT112 Date: Fri, 19 Dec 2025 09:34:25 +0100 Subject: [PATCH 08/12] Changed default lcoale to en --- .env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env b/.env index 3aef83c..087199d 100644 --- a/.env +++ b/.env @@ -26,4 +26,4 @@ LOCATION_NAME="default" # Report logo target on results page (goes to sitespeed.io --html.homeUrl via compose -> server env -> job config) SITESPEED_IO_HTML_HOMEURL="http://127.0.0.1:3000/" # Set default locale -LOCALIZATION_DEFAULTLOCALE=de +LOCALIZATION_DEFAULTLOCALE=en From f00e45c3d4c237ed7c08c63b1a10e93819366891 Mon Sep 17 00:00:00 2001 From: WBT112 Date: Fri, 19 Dec 2025 16:35:18 +0100 Subject: [PATCH 09/12] Make linter happy hopefully --- server/src/util/text.js | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/server/src/util/text.js b/server/src/util/text.js index 0285289..69650a3 100644 --- a/server/src/util/text.js +++ b/server/src/util/text.js @@ -7,18 +7,12 @@ let myy18n; function getLocale() { // Locale from runtime config (env via compose) with fallback to config defaults. // Note: We init lazily so env/config is loaded before y18n is created (initialized too early and is stuck on defaults). - return ( - nconf.get('localization:defaultLocale') || - 'en' - ); + return nconf.get('localization:defaultLocale') || 'en'; } function getLocalesDirectory() { // Directory from runtime config with fallback to config defaults. Lazy init for the same reason as above. - return ( - nconf.get('localization:directory') || - getBaseFilePath('./locales') - ); + return nconf.get('localization:directory') || getBaseFilePath('./locales'); } function getI18nInstance() { From 348b71ad4fda0ac27d86fff7a209d7c9436c3e5b Mon Sep 17 00:00:00 2001 From: WBT112 Date: Tue, 23 Dec 2025 19:14:53 +0100 Subject: [PATCH 10/12] Resolved conflict, changed .env to locale, added config to yaml files --- .env | 2 +- docker-compose.app.yml | 2 +- server/config/default.yaml | 7 +++++-- server/docker/dockerdefault.yaml | 9 ++++++++- server/src/util/text.js | 29 ++++++----------------------- 5 files changed, 21 insertions(+), 28 deletions(-) diff --git a/.env b/.env index df89350..855686d 100644 --- a/.env +++ b/.env @@ -26,4 +26,4 @@ LOCATION_NAME="default" # Report logo target on results page (goes to sitespeed.io --html.homeUrl via compose -> server env -> job config) SITESPEED_IO_HTML_HOMEURL="http://127.0.0.1:3000/" # Set default locale -LOCALIZATION_DEFAULTLOCALE=en +LOCALIZATION_LOCALE=en diff --git a/docker-compose.app.yml b/docker-compose.app.yml index 516d43d..7cc3e30 100644 --- a/docker-compose.app.yml +++ b/docker-compose.app.yml @@ -11,7 +11,7 @@ services: database_password: ${POSTGRES_PASSWORD} database_port: 5432 validTestDomains: ${VALID_TEST_DOMAINS} - localization_defaultLocale: ${LOCALIZATION_DEFAULTLOCALE} + localization_locale: ${LOCALIZATION_LOCALE} sitespeed.io_html_homeurl: ${SITESPEED_IO_HTML_HOMEURL} ports: - "3000:3000" diff --git a/server/config/default.yaml b/server/config/default.yaml index 33f830f..4f5d3d6 100644 --- a/server/config/default.yaml +++ b/server/config/default.yaml @@ -75,7 +75,7 @@ dateformat: "YYYY-MM-DD HH:mm:ss" # You can localize the text localization: - defaultLocale: en + locale: en # You can also configure where the text is stored # directory: ./locales @@ -104,4 +104,7 @@ queue: # If you don't setup a default sitespeed.io configuration, you can add # your sitespeed.io configuration directly in this block -sitespeed.io: \ No newline at end of file +sitespeed.io: + # Link target for the logo in generated HTML reports. + html: + homeurl: "http://127.0.0.1:4000/" diff --git a/server/docker/dockerdefault.yaml b/server/docker/dockerdefault.yaml index 4a6dad5..1a4b817 100644 --- a/server/docker/dockerdefault.yaml +++ b/server/docker/dockerdefault.yaml @@ -72,7 +72,7 @@ dateformat: "YYYY-MM-DD HH:mm:ss" # You can localize the text localization: - defaultLocale: en + locale: en # You can also configure where the text is stored # directory: ./locales @@ -97,3 +97,10 @@ admin: queue: removeOnComplete: 50 removeOnFail: 50 + +# If you don't setup a default sitespeed.io configuration, you can add +# your sitespeed.io configuration directly in this block +sitespeed.io: + # Link target for the logo in generated HTML reports. + html: + homeurl: "http://127.0.0.1:4000/" diff --git a/server/src/util/text.js b/server/src/util/text.js index 917b8c3..08ac45e 100644 --- a/server/src/util/text.js +++ b/server/src/util/text.js @@ -1,29 +1,12 @@ import { nconf } from '../config.js'; import y18n from 'y18n'; import { getBaseFilePath } from './fileutil.js'; +const locale = nconf.get('localization:locale'); +const directory = + nconf.get('localization:directory') || getBaseFilePath('./locales'); -let myy18n; - -function getLocale() { - // Locale from runtime config (env via compose) with fallback to config defaults. - // Note: We init lazily so env/config is loaded before y18n is created (initialized too early and is stuck on defaults). - return nconf.get('localization:defaultLocale') || 'en'; -} - -function getLocalesDirectory() { - // Directory from runtime config with fallback to config defaults. Lazy init for the same reason as above. - return nconf.get('localization:directory') || getBaseFilePath('./locales'); -} - -function getI18nInstance() { - if (!myy18n) { - const locale = getLocale(); - const directory = getLocalesDirectory(); - myy18n = y18n({ updateFiles: false, locale, directory }); - } - return myy18n; -} +const myy18n = y18n({ updateFiles: false, locale, directory }); export function getText(key, ...arguments_) { - return getI18nInstance().__(key, ...arguments_); -} + return myy18n.__(key, ...arguments_); +} \ No newline at end of file From ba20376707038ae7e848ca63cdd7571997001eaf Mon Sep 17 00:00:00 2001 From: WBT112 Date: Tue, 23 Dec 2025 19:17:23 +0100 Subject: [PATCH 11/12] fix lint --- server/src/util/text.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/src/util/text.js b/server/src/util/text.js index 08ac45e..3424f57 100644 --- a/server/src/util/text.js +++ b/server/src/util/text.js @@ -1,6 +1,7 @@ import { nconf } from '../config.js'; import y18n from 'y18n'; import { getBaseFilePath } from './fileutil.js'; + const locale = nconf.get('localization:locale'); const directory = nconf.get('localization:directory') || getBaseFilePath('./locales'); @@ -9,4 +10,4 @@ const myy18n = y18n({ updateFiles: false, locale, directory }); export function getText(key, ...arguments_) { return myy18n.__(key, ...arguments_); -} \ No newline at end of file +} From 8e78693ba9a29e70b67122ae0f7a315f24a62473 Mon Sep 17 00:00:00 2001 From: WBT112 Date: Sat, 27 Dec 2025 09:07:58 +0100 Subject: [PATCH 12/12] Change default port to 3000 --- server/config/default.yaml | 2 +- server/docker/dockerdefault.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/config/default.yaml b/server/config/default.yaml index 4f5d3d6..cc93d11 100644 --- a/server/config/default.yaml +++ b/server/config/default.yaml @@ -107,4 +107,4 @@ queue: sitespeed.io: # Link target for the logo in generated HTML reports. html: - homeurl: "http://127.0.0.1:4000/" + homeurl: "http://127.0.0.1:3000/" diff --git a/server/docker/dockerdefault.yaml b/server/docker/dockerdefault.yaml index 4f4aaae..7514c7c 100644 --- a/server/docker/dockerdefault.yaml +++ b/server/docker/dockerdefault.yaml @@ -103,4 +103,4 @@ queue: sitespeed.io: # Link target for the logo in generated HTML reports. html: - homeurl: "http://127.0.0.1:4000/" + homeurl: "http://127.0.0.1:3000/"