From 11b908b3d949d36cf84028745f4499aeac5f34a9 Mon Sep 17 00:00:00 2001 From: Lars Gebhardt-Kusche Date: Thu, 27 Nov 2025 00:01:18 +0100 Subject: [PATCH] lang --- public/assets/js/lang.js | 71 +++++++++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 22 deletions(-) diff --git a/public/assets/js/lang.js b/public/assets/js/lang.js index fde6806..08c3bd3 100644 --- a/public/assets/js/lang.js +++ b/public/assets/js/lang.js @@ -14,7 +14,7 @@ const supportedLangs = Object.keys(availableLangs); // Sprache, die PHP in fileload.php ermittelt hat - let currentLang = i18nConfig.current || usbConfig.lang || "en"; + let currentLang = (i18nConfig.current || usbConfig.lang || "en").toLowerCase(); // Wenn PHP eine Sprache setzt, die nicht in available ist, nimm erste verfügbare if (!supportedLangs.includes(currentLang) && supportedLangs.length > 0) { @@ -49,7 +49,8 @@ function applyDomainPlaceholders(text) { if (typeof text !== "string") return text; - const domains = window.appDomains || {}; + // Primär aus usbConfig.domains, Fallback auf window.appDomains + const domains = usbConfig.domains || window.appDomains || {}; const replacements = { "{{primary_domain}}": domains.primaryDomain || "usbcheck.it", "{{primary_url}}": @@ -71,31 +72,48 @@ // 4) Initiale Sprache bestimmen // // Priorität: - // a) PHP (usbConfig.i18n.current / usbConfig.lang) - // b) URL ?lang= (falls gültig und in available) + // a) URL ?lang= (falls gültig und in available) + // b) PHP (usbConfig.i18n.current / usbConfig.lang) // c) localStorage (falls gültig) - // d) erste verfügbare Sprache + // d) 'en', wenn vorhanden + // e) erste verfügbare Sprache // --------------------------------------------- function getInitialLang() { const urlParams = new URLSearchParams(window.location.search); - const paramLang = urlParams.get("lang"); + const paramLang = (urlParams.get("lang") || "").toLowerCase(); + + // a) URL-Parameter, wenn gültig if (paramLang && supportedLangs.includes(paramLang)) { return paramLang; } - const stored = localStorage.getItem("usbcheck_lang"); - if (stored && supportedLangs.includes(stored)) { - return stored; + // b) Server-seitig ermittelte Sprache (inkl. HTTP_ACCEPT_LANGUAGE) + const serverLang = (i18nConfig.current || usbConfig.lang || "").toLowerCase(); + if (serverLang && supportedLangs.includes(serverLang)) { + return serverLang; } - if (supportedLangs.includes(currentLang)) { - return currentLang; + // c) localStorage, falls gültig + const stored = (localStorage.getItem("usbcheck_lang") || "").toLowerCase(); + if (stored) { + if (supportedLangs.includes(stored)) { + return stored; + } + // ungültigen alten Wert aufräumen + localStorage.removeItem("usbcheck_lang"); } + // d) Wenn 'en' existiert → nimm 'en' + if (supportedLangs.includes("en")) { + return "en"; + } + + // e) Sonst erste verfügbare Sprache if (supportedLangs.length > 0) { return supportedLangs[0]; } + // Worst-Case (sollte nie eintreten) return "en"; } @@ -103,11 +121,18 @@ // 5) i18n JSON per Fetch laden // --------------------------------------------- async function loadLangFile(lang) { + const code = (lang || "").toLowerCase(); + if (!supportedLangs.includes(code)) { + console.warn("i18n: unsupported language in loadLangFile:", code); + translations = {}; + return; + } + try { - const res = await fetch(`/assets/i18n/${lang}.json`, { + const res = await fetch(`/assets/i18n/${code}.json`, { cache: "no-store", }); - if (!res.ok) throw new Error(`Failed to load /assets/i18n/${lang}.json`); + if (!res.ok) throw new Error(`Failed to load /assets/i18n/${code}.json`); const raw = await res.json(); translations = flattenTranslations(raw); } catch (err) { @@ -147,9 +172,11 @@ // availableLangs[code] = { code, label, flag } // --------------------------------------------- function updateLangCurrentLabel(lang) { - const info = availableLangs[lang] || { - code: lang, - label: lang.toUpperCase(), + const code = (lang || "").toLowerCase(); + + const info = availableLangs[code] || { + code: code || "en", + label: (code || "en").toUpperCase(), flag: "", }; @@ -171,22 +198,22 @@ // --------------------------------------------- // 8) Sprache setzen // - // Neu: // - akzeptiert JEDE Sprache, die in availableLangs liegt // - speichert in localStorage // - schreibt ?lang= in die URL // - lädt Seite neu, damit PHP + JS synchron sind // --------------------------------------------- async function setLang(lang) { - if (!supportedLangs.includes(lang)) { - console.warn("Unsupported language:", lang, supportedLangs); + const code = (lang || "").toLowerCase(); + if (!supportedLangs.includes(code)) { + console.warn("Unsupported language:", code, supportedLangs); return; } // URL-Parameter setzen const url = new URL(window.location.href); - url.searchParams.set("lang", lang); - localStorage.setItem("usbcheck_lang", lang); + url.searchParams.set("lang", code); + localStorage.setItem("usbcheck_lang", code); // komplette Seite neu laden, // damit PHP (fileload.php) + Meta-Tags + JS-Konfig konsistent sind @@ -197,7 +224,7 @@ // 9) DOM Ready // --------------------------------------------- document.addEventListener("DOMContentLoaded", async function () { - // Initiale Sprache (kombiniert aus PHP, URL, localStorage) + // Initiale Sprache (kombiniert aus URL, PHP, localStorage) currentLang = getInitialLang(); updateLangCurrentLabel(currentLang);