This commit is contained in:
2025-11-27 00:01:18 +01:00
parent 7f04c4e246
commit 11b908b3d9

View File

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