This commit is contained in:
2025-11-28 02:46:51 +01:00
parent 99ad78dbe4
commit aae6006656
4 changed files with 192 additions and 149 deletions

View File

@@ -1,7 +1,14 @@
// public/assets/js/header.js // public/assets/js/header.js
document.addEventListener('DOMContentLoaded', function () { document.addEventListener("DOMContentLoaded", function () {
// -------------------------------------------------- // --------------------------------------------------
// Sprachauflösung: basiert NUR auf usbConfig / i18n // Sprachauflösung: basiert auf derselben Logik wie lang.js
//
// Priorität:
// a) ?lang= in der URL
// b) localStorage (usbcheck_lang)
// c) Browsersprache
// d) 'en' wenn vorhanden
// e) erste verfügbare Sprache
// -------------------------------------------------- // --------------------------------------------------
const cfg = window.usbConfig || {}; const cfg = window.usbConfig || {};
const i18nCfg = cfg.i18n || {}; const i18nCfg = cfg.i18n || {};
@@ -9,79 +16,99 @@ document.addEventListener('DOMContentLoaded', function () {
const availCodes = Object.keys(availLangs); const availCodes = Object.keys(availLangs);
function normalizeLang(code) { function normalizeLang(code) {
if (!code) return ''; if (!code) return "";
return String(code).slice(0, 2).toLowerCase(); return String(code).slice(0, 2).toLowerCase();
} }
function detectBrowserLang() {
const nav = window.navigator || {};
const candidates = [];
if (Array.isArray(nav.languages)) {
candidates.push(...nav.languages);
}
if (typeof nav.language === "string") {
candidates.push(nav.language);
}
if (typeof nav.userLanguage === "string") {
candidates.push(nav.userLanguage);
}
for (const raw of candidates) {
const code = normalizeLang(raw);
if (availCodes.includes(code)) {
return code;
}
}
return null;
}
function resolveCurrentLang() { function resolveCurrentLang() {
const url = new URL(window.location.href); const url = new URL(window.location.href);
const urlLang = normalizeLang(url.searchParams.get('lang')); const urlLang = normalizeLang(url.searchParams.get("lang"));
// 1) ?lang= aus der URL, wenn gültig // a) ?lang= aus der URL, wenn gültig
if (urlLang && availCodes.includes(urlLang)) { if (urlLang && availCodes.includes(urlLang)) {
return urlLang; return urlLang;
} }
// 2) localStorage (vom lang.js gesetzt) // b) localStorage (vom lang.js gesetzt)
const stored = normalizeLang(localStorage.getItem('usbcheck_lang')); const stored = normalizeLang(localStorage.getItem("usbcheck_lang"));
if (stored && availCodes.includes(stored)) { if (stored && availCodes.includes(stored)) {
return stored; return stored;
} }
if (stored && !availCodes.includes(stored)) {
// 3) PHP-Konfig (fileload/app_config) localStorage.removeItem("usbcheck_lang");
const cfgLang = normalizeLang(i18nCfg.current || cfg.lang);
if (cfgLang && availCodes.includes(cfgLang)) {
return cfgLang;
} }
// 4) <html lang="..."> // c) Browsersprache
const docLang = normalizeLang(document.documentElement.getAttribute('lang')); const browserLang = detectBrowserLang();
if (docLang && availCodes.includes(docLang)) { if (browserLang) {
return docLang; return browserLang;
} }
// 5) Fallback: en, wenn vorhanden // d) Fallback: en, wenn vorhanden
if (availCodes.includes('en')) { if (availCodes.includes("en")) {
return 'en'; return "en";
} }
// 6) sonst erste verfügbare Sprache // e) Sonst erste verfügbare Sprache
if (availCodes.length > 0) { if (availCodes.length > 0) {
return availCodes[0]; return availCodes[0];
} }
// 7) absolute Notlösung // f) absolute Notlösung
return 'en'; return "en";
} }
// -------------------------------------------------- // --------------------------------------------------
// LOGIN-BUTTON → /login mit redirect + lang // LOGIN-BUTTON → /login mit redirect + lang
// -------------------------------------------------- // --------------------------------------------------
const loginBtn = document.getElementById('loginButton'); const loginBtn = document.getElementById("loginButton");
if (loginBtn) { if (loginBtn) {
loginBtn.addEventListener('click', function (event) { loginBtn.addEventListener("click", function (event) {
event.preventDefault(); event.preventDefault();
const currentPath = window.location.pathname || '/'; const currentPath = window.location.pathname || "/";
const currentQuery = window.location.search || ''; const currentQuery = window.location.search || "";
const redirect = currentPath + currentQuery; const redirect = currentPath + currentQuery;
const lang = resolveCurrentLang(); const lang = resolveCurrentLang();
// Wenn wir bereits auf /login sind → nur zum #auth scrollen // Wenn wir bereits auf /login sind → nur zum #auth scrollen
if (currentPath === '/login' || currentPath === '/login/') { if (currentPath === "/login" || currentPath === "/login/") {
const authEl = document.getElementById('auth'); const authEl = document.getElementById("auth");
if (authEl) { if (authEl) {
authEl.scrollIntoView({ behavior: 'smooth', block: 'start' }); authEl.scrollIntoView({ behavior: "smooth", block: "start" });
} }
return; return;
} }
// Sonst: auf Login-Seite mit lang + redirect-Parameter // Sonst: auf Login-Seite mit lang + redirect-Parameter
const url = '/login/?lang=' + encodeURIComponent(lang) + const url = "/login/?lang=" + encodeURIComponent(lang) +
'&redirect=' + encodeURIComponent(redirect) + "&redirect=" + encodeURIComponent(redirect) +
'#auth'; "#auth";
window.location.href = url; window.location.href = url;
}); });
@@ -90,21 +117,21 @@ document.addEventListener('DOMContentLoaded', function () {
// -------------------------------------------------- // --------------------------------------------------
// AVATAR-MENÜ (userAvatar / userMenu) // AVATAR-MENÜ (userAvatar / userMenu)
// -------------------------------------------------- // --------------------------------------------------
const avatarBtn = document.getElementById('userAvatar'); const avatarBtn = document.getElementById("userAvatar");
const userMenu = document.getElementById('userMenu'); const userMenu = document.getElementById("userMenu");
if (avatarBtn && userMenu) { if (avatarBtn && userMenu) {
avatarBtn.addEventListener('click', function (event) { avatarBtn.addEventListener("click", function (event) {
event.stopPropagation(); event.stopPropagation();
userMenu.classList.toggle('hidden'); userMenu.classList.toggle("hidden");
const expanded = avatarBtn.getAttribute('aria-expanded') === 'true'; const expanded = avatarBtn.getAttribute("aria-expanded") === "true";
avatarBtn.setAttribute('aria-expanded', expanded ? 'false' : 'true'); avatarBtn.setAttribute("aria-expanded", expanded ? "false" : "true");
}); });
// Klick außerhalb schließt Menü // Klick außerhalb schließt Menü
document.addEventListener('click', function (event) { document.addEventListener("click", function (event) {
if (userMenu.classList.contains('hidden')) { if (userMenu.classList.contains("hidden")) {
return; return;
} }
@@ -112,8 +139,8 @@ document.addEventListener('DOMContentLoaded', function () {
const clickedAvatarButton = avatarBtn.contains(event.target); const clickedAvatarButton = avatarBtn.contains(event.target);
if (!clickedInsideMenu && !clickedAvatarButton) { if (!clickedInsideMenu && !clickedAvatarButton) {
userMenu.classList.add('hidden'); userMenu.classList.add("hidden");
avatarBtn.setAttribute('aria-expanded', 'false'); avatarBtn.setAttribute("aria-expanded", "false");
} }
}); });
} }
@@ -122,9 +149,9 @@ document.addEventListener('DOMContentLoaded', function () {
// LOGOUT-MODAL // LOGOUT-MODAL
// -------------------------------------------------- // --------------------------------------------------
const logoutButtons = document.querySelectorAll('[data-logout-link="true"]'); const logoutButtons = document.querySelectorAll('[data-logout-link="true"]');
const backdrop = document.getElementById('logoutModalBackdrop'); const backdrop = document.getElementById("logoutModalBackdrop");
const btnConfirm = document.getElementById('logoutConfirm'); const btnConfirm = document.getElementById("logoutConfirm");
const btnCancel = document.getElementById('logoutCancel'); const btnCancel = document.getElementById("logoutCancel");
let logoutTarget = null; let logoutTarget = null;
@@ -132,64 +159,64 @@ document.addEventListener('DOMContentLoaded', function () {
logoutTarget = targetHref || null; logoutTarget = targetHref || null;
if (!backdrop) return; if (!backdrop) return;
backdrop.classList.remove('hidden'); backdrop.classList.remove("hidden");
document.body.classList.add('overflow-hidden'); document.body.classList.add("overflow-hidden");
} }
function hideLogoutModal() { function hideLogoutModal() {
if (!backdrop) return; if (!backdrop) return;
backdrop.classList.add('hidden'); backdrop.classList.add("hidden");
document.body.classList.remove('overflow-hidden'); document.body.classList.remove("overflow-hidden");
logoutTarget = null; logoutTarget = null;
} }
if (logoutButtons.length && backdrop && btnConfirm && btnCancel) { if (logoutButtons.length && backdrop && btnConfirm && btnCancel) {
logoutButtons.forEach(function (btn) { logoutButtons.forEach(function (btn) {
btn.addEventListener('click', function (event) { btn.addEventListener("click", function (event) {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
const href = btn.getAttribute('data-logout-href') const href = btn.getAttribute("data-logout-href")
|| btn.getAttribute('href') || btn.getAttribute("href")
|| '/auth/logout'; || "/auth/logout";
showLogoutModal(href); showLogoutModal(href);
// Avatar-Menü beim Öffnen des Modals schließen // Avatar-Menü beim Öffnen des Modals schließen
if (userMenu && !userMenu.classList.contains('hidden')) { if (userMenu && !userMenu.classList.contains("hidden")) {
userMenu.classList.add('hidden'); userMenu.classList.add("hidden");
if (avatarBtn) { if (avatarBtn) {
avatarBtn.setAttribute('aria-expanded', 'false'); avatarBtn.setAttribute("aria-expanded", "false");
} }
} }
}); });
}); });
// Bestätigen → weiter zur Logout-URL // Bestätigen → weiter zur Logout-URL
btnConfirm.addEventListener('click', function () { btnConfirm.addEventListener("click", function () {
if (logoutTarget) { if (logoutTarget) {
window.location.href = logoutTarget; window.location.href = logoutTarget;
} else { } else {
window.location.href = '/auth/logout'; window.location.href = "/auth/logout";
} }
}); });
// Abbrechen → Modal schließen // Abbrechen → Modal schließen
btnCancel.addEventListener('click', function () { btnCancel.addEventListener("click", function () {
hideLogoutModal(); hideLogoutModal();
}); });
// Klick auf Hintergrund schließt Modal (außer man klickt auf die Card) // Klick auf Hintergrund schließt Modal (außer man klickt auf die Card)
backdrop.addEventListener('click', function (event) { backdrop.addEventListener("click", function (event) {
const card = backdrop.querySelector('.max-w-sm'); const card = backdrop.querySelector(".max-w-sm");
if (card && !card.contains(event.target)) { if (card && !card.contains(event.target)) {
hideLogoutModal(); hideLogoutModal();
} }
}); });
// ESC-Taste schließt Modal // ESC-Taste schließt Modal
document.addEventListener('keydown', function (event) { document.addEventListener("keydown", function (event) {
if (event.key === 'Escape' && !backdrop.classList.contains('hidden')) { if (event.key === "Escape" && !backdrop.classList.contains("hidden")) {
hideLogoutModal(); hideLogoutModal();
} }
}); });

View File

@@ -1,5 +1,4 @@
// public/assets/js/lang.js // public/assets/js/lang.js
(function () { (function () {
// --------------------------------------------- // ---------------------------------------------
// 1) Basis-Config aus PHP (app_config.php) // 1) Basis-Config aus PHP (app_config.php)
@@ -7,25 +6,16 @@
const usbConfig = window.usbConfig || {}; const usbConfig = window.usbConfig || {};
const i18nConfig = usbConfig.i18n || {}; const i18nConfig = usbConfig.i18n || {};
// Map: { de: {code, label, flag}, en: {...}, dk: {...}, ... } // Map: { de: {code, label, flag}, en: {...}, ... }
const availableLangs = i18nConfig.available || {}; const availableLangs = i18nConfig.available || {};
// Liste der unterstützten Sprachen als Codes // Liste der unterstützten Sprachen als Codes
const supportedLangs = Object.keys(availableLangs); const supportedLangs = Object.keys(availableLangs);
// Sprache, die PHP in fileload.php ermittelt hat // Aktuelle Sprache (wird unten per getInitialLang() gesetzt)
let currentLang = (i18nConfig.current || usbConfig.lang || "en").toLowerCase(); let currentLang = "en";
// Wenn PHP eine Sprache setzt, die nicht in available ist, nimm erste verfügbare
if (!supportedLangs.includes(currentLang) && supportedLangs.length > 0) {
currentLang = supportedLangs[0];
}
// Fallback, wenn gar nichts da ist
if (!currentLang) {
currentLang = "en";
}
// Translations-Map (geflacht)
let translations = {}; let translations = {};
// --------------------------------------------- // ---------------------------------------------
@@ -68,13 +58,39 @@
}, text); }, text);
} }
// ------------------------------------------------
// 4) Browsersprache erkennen (2-Buchstaben-Code)
// ------------------------------------------------
function detectBrowserLang() {
const nav = window.navigator || {};
const candidates = [];
if (Array.isArray(nav.languages)) {
candidates.push(...nav.languages);
}
if (typeof nav.language === "string") {
candidates.push(nav.language);
}
if (typeof nav.userLanguage === "string") {
candidates.push(nav.userLanguage);
}
for (const raw of candidates) {
const code = (raw || "").slice(0, 2).toLowerCase();
if (supportedLangs.includes(code)) {
return code;
}
}
return null;
}
// --------------------------------------------- // ---------------------------------------------
// 4) Initiale Sprache bestimmen // 5) Initiale Sprache bestimmen
// //
// Priorität: // Priorität:
// a) URL ?lang= (falls gültig und in available) // a) URL ?lang= (falls gültig)
// b) PHP (usbConfig.i18n.current / usbConfig.lang) // b) localStorage (explizit gewählte Sprache)
// c) localStorage (falls gültig) // c) Browsersprache
// d) 'en', wenn vorhanden // d) 'en', wenn vorhanden
// e) erste verfügbare Sprache // e) erste verfügbare Sprache
// --------------------------------------------- // ---------------------------------------------
@@ -87,22 +103,22 @@
return paramLang; return paramLang;
} }
// b) Server-seitig ermittelte Sprache (inkl. HTTP_ACCEPT_LANGUAGE) // b) localStorage (vom User über Switcher gewählt)
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(); const stored = (localStorage.getItem("usbcheck_lang") || "").toLowerCase();
if (stored) { if (stored) {
if (supportedLangs.includes(stored)) { if (supportedLangs.includes(stored)) {
return stored; return stored;
} }
// ungültigen alten Wert aufräumen // Ungültigen alten Wert aufräumen
localStorage.removeItem("usbcheck_lang"); localStorage.removeItem("usbcheck_lang");
} }
// c) Browsersprache
const browserLang = detectBrowserLang();
if (browserLang) {
return browserLang;
}
// d) Wenn 'en' existiert → nimm 'en' // d) Wenn 'en' existiert → nimm 'en'
if (supportedLangs.includes("en")) { if (supportedLangs.includes("en")) {
return "en"; return "en";
@@ -118,7 +134,7 @@
} }
// --------------------------------------------- // ---------------------------------------------
// 5) i18n JSON per Fetch laden // 6) i18n JSON per Fetch laden
// --------------------------------------------- // ---------------------------------------------
async function loadLangFile(lang) { async function loadLangFile(lang) {
const code = (lang || "").toLowerCase(); const code = (lang || "").toLowerCase();
@@ -142,7 +158,7 @@
} }
// --------------------------------------------- // ---------------------------------------------
// 6) Data-i18n-Texte einsetzen // 7) Data-i18n-Texte einsetzen
// --------------------------------------------- // ---------------------------------------------
function applyTranslations() { function applyTranslations() {
document.documentElement.setAttribute("lang", currentLang); document.documentElement.setAttribute("lang", currentLang);
@@ -166,10 +182,7 @@
} }
// --------------------------------------------- // ---------------------------------------------
// 7) Label + Flag im Button aktualisieren // 8) Label + Flag im Button aktualisieren
//
// Nutzt ausschließlich availableLangs aus PHP:
// availableLangs[code] = { code, label, flag }
// --------------------------------------------- // ---------------------------------------------
function updateLangCurrentLabel(lang) { function updateLangCurrentLabel(lang) {
const code = (lang || "").toLowerCase(); const code = (lang || "").toLowerCase();
@@ -196,35 +209,32 @@
} }
// --------------------------------------------- // ---------------------------------------------
// 8) Sprache setzen // 9) Sprache setzen (via Switcher)
// //
// - akzeptiert JEDE Sprache, die in availableLangs liegt // - akzeptiert nur Sprachen aus availableLangs
// - 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) { function setLang(lang) {
const code = (lang || "").toLowerCase(); const code = (lang || "").toLowerCase();
if (!supportedLangs.includes(code)) { if (!supportedLangs.includes(code)) {
console.warn("Unsupported language:", code, supportedLangs); console.warn("Unsupported language:", code, supportedLangs);
return; return;
} }
// URL-Parameter setzen
const url = new URL(window.location.href); const url = new URL(window.location.href);
url.searchParams.set("lang", code); url.searchParams.set("lang", code);
localStorage.setItem("usbcheck_lang", code); localStorage.setItem("usbcheck_lang", code);
// komplette Seite neu laden,
// damit PHP (fileload.php) + Meta-Tags + JS-Konfig konsistent sind
window.location.href = url.toString(); window.location.href = url.toString();
} }
// --------------------------------------------- // ---------------------------------------------
// 9) DOM Ready // 10) DOM Ready
// --------------------------------------------- // ---------------------------------------------
document.addEventListener("DOMContentLoaded", async function () { document.addEventListener("DOMContentLoaded", async function () {
// Initiale Sprache (kombiniert aus URL, PHP, localStorage) // Initiale Sprache (kombiniert aus URL, localStorage, Browser)
currentLang = getInitialLang(); currentLang = getInitialLang();
updateLangCurrentLabel(currentLang); updateLangCurrentLabel(currentLang);
@@ -263,33 +273,11 @@
if (btn) { if (btn) {
const lang = btn.getAttribute("data-lang"); const lang = btn.getAttribute("data-lang");
if (lang) { if (lang) {
// Nur wenn data-lang gesetzt ist → JS-gesteuerter Wechsel
setLang(lang); setLang(lang);
e.preventDefault();
} }
} }
}); });
// (Login / Avatar Dummy kann bleiben unverändert)
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";
}
});
if (userAvatar) {
userAvatar.addEventListener("click", function () {
alert(
"Account-Menü Platzhalter hier später Profil/Logout etc. einbauen."
);
});
}
}
}); });
})(); })();

View File

@@ -2,24 +2,39 @@
// src/auth/login.php // src/auth/login.php
// wird durch public/auth/login.php aufgerufen // wird durch public/auth/login.php aufgerufen
// Nur POST zulassen // Basis-Setup: Session, $pdo, flash_*, Sprachlogik etc.
require_once $_SERVER['DOCUMENT_ROOT']. '/../config/fileload.php';
// Sprache aus der zentralen Sprachlogik holen
// (fileload.php sollte $GLOBALS['lang'] anhand von URL, Session, Browser etc. setzen)
$lang = $GLOBALS['lang'] ?? 'en';
// Nur POST zulassen alles andere zurück zur Login-Seite
if ($_SERVER['REQUEST_METHOD'] !== 'POST') { if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
$lang = $_GET['lang'] ?? 'de'; $target = '/login/?lang=' . urlencode($lang) . '&view=login#auth';
header('Location: /login/?lang=' . urlencode($lang) . '&view=login#auth'); header('Location: ' . $target);
exit; exit;
} }
// Basis-Setup: Session, $pdo, flash_*, Config etc. // ---------------------------------------------------------
require_once __DIR__ . '/../../config/fileload.php';
// Form-Daten einsammeln // Form-Daten einsammeln
$lang = $_POST['lang'] ?? 'de'; // ---------------------------------------------------------
$email = trim((string)($_POST['email'] ?? '')); $email = trim((string)($_POST['email'] ?? ''));
$password = (string)($_POST['password'] ?? ''); $password = (string)($_POST['password'] ?? '');
$redirect = $_POST['redirect'] ?? '/'; $redirect = $_POST['redirect'] ?? '/';
// (Optional) Falls das Formular noch ein <input name="lang"> hat,
// kannst du das nutzen, falls kein $GLOBALS['lang'] gesetzt ist:
if (empty($lang) && !empty($_POST['lang'])) {
$lang = substr((string)$_POST['lang'], 0, 2);
}
// Minimal-Validierung // Minimal-Validierung
if ($email === '' || !filter_var($email, FILTER_VALIDATE_EMAIL) || $password === '') { if (
$email === '' ||
!filter_var($email, FILTER_VALIDATE_EMAIL) ||
$password === ''
) {
flash_set('error', 'Bitte E-Mail-Adresse und Passwort eingeben.', 'login'); flash_set('error', 'Bitte E-Mail-Adresse und Passwort eingeben.', 'login');
header('Location: /login/?lang=' . urlencode($lang) . '&view=login#auth'); header('Location: /login/?lang=' . urlencode($lang) . '&view=login#auth');
exit; exit;

View File

@@ -2,21 +2,33 @@
// src/auth/register.php // src/auth/register.php
// Wird durch public/auth/register.php aufgerufen // Wird durch public/auth/register.php aufgerufen
// Basis-Setup: Session, $pdo, flash_*, Sprachlogik etc.
require_once $_SERVER['DOCUMENT_ROOT']. '/../config/fileload.php';
// Sprache aus zentraler Sprachlogik holen
$lang = $GLOBALS['lang'] ?? 'en';
// Nur POST zulassen alles andere zurück zur Login-/Register-Ansicht
if ($_SERVER['REQUEST_METHOD'] !== 'POST') { if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
$lang = $_GET['lang'] ?? 'de'; $target = '/login/?lang=' . urlencode($lang) . '&view=register#auth';
header('Location: /login/?lang=' . urlencode($lang) . '&view=register#auth'); header('Location: ' . $target);
exit; exit;
} }
// Benötigt: $pdo, flash(), Session → via fileload // ---------------------------------------------------------
require_once __DIR__ . '/../../config/fileload.php'; // Form-Daten einsammeln
// ---------------------------------------------------------
$lang = $_POST['lang'] ?? 'de';
$name = trim((string)($_POST['name'] ?? '')); $name = trim((string)($_POST['name'] ?? ''));
$email = trim((string)($_POST['email'] ?? '')); $email = trim((string)($_POST['email'] ?? ''));
$password = (string)($_POST['password'] ?? ''); $password = (string)($_POST['password'] ?? '');
$redirect = $_POST['redirect'] ?? '/'; $redirect = $_POST['redirect'] ?? '/';
// Optional: Falls aus irgendeinem Grund $lang noch leer ist,
// kannst du (z.B. beim ersten Request) auf ein hidden-Feld im Formular zurückgreifen.
if (empty($lang) && !empty($_POST['lang'])) {
$lang = substr((string)$_POST['lang'], 0, 2);
}
/* --------------------------------------------------------- /* ---------------------------------------------------------
VALIDIERUNG VALIDIERUNG
--------------------------------------------------------- */ --------------------------------------------------------- */
@@ -125,7 +137,6 @@ $_SESSION['user'] = [
'initials' => $initials, 'initials' => $initials,
]; ];
/* --------------------------------------------------------- /* ---------------------------------------------------------
ERFOLGSMELDUNG + REDIRECT ERFOLGSMELDUNG + REDIRECT
--------------------------------------------------------- */ --------------------------------------------------------- */
@@ -138,9 +149,11 @@ if ($target === '' || !str_starts_with($target, '/')) {
$target = '/'; $target = '/';
} }
// Sprache anhängen, falls noch nicht vorhanden
if (strpos($target, 'lang=') === false) {
$separator = (strpos($target, '?') === false) ? '?' : '&'; $separator = (strpos($target, '?') === false) ? '?' : '&';
$target .= $separator . 'lang=' . urlencode($lang); $target .= $separator . 'lang=' . urlencode($lang);
}
header('Location: ' . $target); header('Location: ' . $target);
exit; exit;