// public/assets/js/lang.js
(function () {
const supportedLangs = ["de", "en", "it", "fr"];
let translations = {};
// Mapping für Flaggen + Label im Header
const langMeta = {
de: { flag: "🇩🇪", label: "DE" },
en: { flag: "🇬🇧", label: "EN" }, // oder 🇺🇸 wenn dir lieber
it: { flag: "🇮🇹", label: "IT" },
fr: { flag: "🇫🇷", label: "FR" }
};
function flattenTranslations(obj, prefix = "") {
const result = {};
Object.keys(obj).forEach((key) => {
const value = obj[key];
const newKey = prefix ? `${prefix}_${key}` : key;
if (value && typeof value === "object" && !Array.isArray(value)) {
Object.assign(result, flattenTranslations(value, newKey));
} else {
result[newKey] = value;
}
});
return result;
}
async function loadLangFile(lang) {
try {
const res = await fetch(`/assets/i18n/${lang}.json`, { cache: "no-store" });
if (!res.ok) throw new Error(`Failed to load /assets/i18n/${lang}.json`);
const data = await res.json();
translations = flattenTranslations(data);
} catch (err) {
console.error("i18n load error:", err);
translations = {};
}
}
function getInitialLang() {
const urlParams = new URLSearchParams(window.location.search);
const paramLang = urlParams.get("lang");
if (paramLang && supportedLangs.includes(paramLang)) return paramLang;
const stored = localStorage.getItem("usbcheck_lang");
if (stored && supportedLangs.includes(stored)) return stored;
const navLang = (navigator.language || "en").slice(0, 2).toLowerCase();
if (supportedLangs.includes(navLang)) return navLang;
return "en";
}
function applyTranslations() {
document.documentElement.setAttribute("lang", getCurrentLang());
document.querySelectorAll("[data-i18n]").forEach((node) => {
const key = node.getAttribute("data-i18n");
if (!key || !translations[key]) return;
let value = translations[key];
// {year}-Placeholder ersetzen (für footer_copy etc.)
if (typeof value === "string" && value.includes("{year}")) {
const year = new Date().getFullYear();
value = value.replace("{year}", year);
}
node.innerHTML = value;
});
}
function getCurrentLang() {
const urlParams = new URLSearchParams(window.location.search);
const paramLang = urlParams.get("lang");
if (paramLang && supportedLangs.includes(paramLang)) return paramLang;
const stored = localStorage.getItem("usbcheck_lang");
if (stored && supportedLangs.includes(stored)) return stored;
return "en";
}
function updateLangCurrentLabel(lang) {
const meta = langMeta[lang] || { flag: "", label: lang.toUpperCase() };
const node = document.getElementById("langCurrentLabel") || document.getElementById("langCurrent");
if (!node) return;
if (meta.flag) {
node.innerHTML = `${meta.flag}${meta.label}`;
} else {
node.textContent = meta.label;
}
}
async function setLang(lang) {
if (!supportedLangs.includes(lang)) return;
localStorage.setItem("usbcheck_lang", lang);
// URL-Parameter ohne Reload aktualisieren
const url = new URL(window.location.href);
url.searchParams.set("lang", lang);
window.history.replaceState({}, "", url.toString());
await loadLangFile(lang);
applyTranslations();
updateLangCurrentLabel(lang);
}
document.addEventListener("DOMContentLoaded", async function () {
const initialLang = getInitialLang();
// Header-Label initial
updateLangCurrentLabel(initialLang);
// Übersetzungen laden und anwenden
await loadLangFile(initialLang);
applyTranslations();
// Dropdown-Elemente
const langCurrent = document.getElementById("langCurrent");
const langMenu = document.getElementById("langMenu");
// Dropdown öffnen/schließen
if (langCurrent && langMenu) {
langCurrent.addEventListener("click", function (e) {
e.stopPropagation();
langMenu.classList.toggle("hidden");
});
document.addEventListener("click", function (e) {
if (!langMenu.classList.contains("hidden")) {
if (!langMenu.contains(e.target) && !langCurrent.contains(e.target)) {
langMenu.classList.add("hidden");
}
}
});
langMenu.addEventListener("click", function (e) {
const pill = e.target.closest(".lang-pill");
if (pill) {
langMenu.classList.add("hidden");
}
});
}
// Sprachumschaltung / Klick auf .lang-pill
document.addEventListener("click", function (e) {
const btn = e.target.closest(".lang-pill");
if (btn) {
const lang = btn.getAttribute("data-lang");
setLang(lang);
}
});
// Login / Avatar – UI-Dummy wie vorher
const loginButton = document.getElementById("loginButton");
const userAvatar = document.getElementById("userAvatar");
const avatarInitials = document.getElementById("avatarInitials");
if (loginButton && userAvatar) {
loginButton.addEventListener("click", function () {
loginButton.classList.add("hidden");
userAvatar.classList.remove("hidden");
if (avatarInitials && !avatarInitials.textContent.trim()) {
avatarInitials.textContent = "UC";
}
});
userAvatar.addEventListener("click", function () {
alert("Account-Menü Platzhalter – hier später Profil/Logout etc. einbauen.");
});
}
});
})();