lang
This commit is contained in:
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user