From cf841580391310396e20c53fc82dbcf746f4c9dc Mon Sep 17 00:00:00 2001 From: Lars Gebhardt-Kusche Date: Wed, 26 Nov 2025 23:19:10 +0100 Subject: [PATCH] asd --- config/fileload.php | 71 +++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 31 deletions(-) diff --git a/config/fileload.php b/config/fileload.php index fdf8b65..6aa72b3 100644 --- a/config/fileload.php +++ b/config/fileload.php @@ -25,24 +25,37 @@ if (php_sapi_name() !== 'cli') { } // ----------------------------------------------------------- -// Helper: Browser-Sprache aus HTTP_ACCEPT_LANGUAGE +// Helper: Browser-Sprache aus HTTP_ACCEPT_LANGUAGE bestimmen // ----------------------------------------------------------- function usb_detect_browser_lang(array $availableLangs): ?string { - if (empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) || empty($availableLangs)) { + if (empty($availableLangs)) { return null; } - $raw = $_SERVER['HTTP_ACCEPT_LANGUAGE']; - $parts = explode(',', $raw); + $header = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? ''; + if ($header === '') { + return null; + } + + // z.B. "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7,it;q=0.6" + $parts = explode(',', $header); foreach ($parts as $part) { $part = trim($part); - if ($part === '') continue; + if ($part === '') { + continue; + } - // z.B. "de-DE;q=0.9" → "de-DE" - $langPart = explode(';', $part)[0]; - $code2 = strtolower(substr($langPart, 0, 2)); + // Sprache vor dem ; nehmen (z.B. "de-DE" oder "en-US") + $langTag = strtolower(explode(';', $part)[0]); + + if ($langTag === '') { + continue; + } + + // 2-Buchstaben-Code extrahieren + $code2 = substr($langTag, 0, 2); if (preg_match('/^[a-z]{2}$/', $code2) && isset($availableLangs[$code2])) { return $code2; @@ -53,19 +66,21 @@ function usb_detect_browser_lang(array $availableLangs): ?string } // ----------------------------------------------------------- -// 1) Sprache aus ?lang holen (nur 2-Buchstaben-Code validieren) +// 1) Sprache aus ?lang lesen (nur 2-Buchstaben-Code zulassen) // ----------------------------------------------------------- -$requestedLang = null; +$requestedLang = $_GET['lang'] ?? null; -if (isset($_GET['lang']) && is_string($_GET['lang'])) { - $tmp = strtolower($_GET['lang']); - if (preg_match('/^[a-z]{2}$/', $tmp)) { - $requestedLang = $tmp; +if (is_string($requestedLang)) { + $requestedLang = strtolower($requestedLang); + if (!preg_match('/^[a-z]{2}$/', $requestedLang)) { + $requestedLang = null; } +} else { + $requestedLang = null; } // ----------------------------------------------------------- -// 2) Verfügbare JSON-Sprachen aus /public/assets/i18n +// 2) Verfügbare JSON-Sprachen erkennen // ----------------------------------------------------------- $i18nDir = __DIR__ . '/../public/assets/i18n'; @@ -92,21 +107,20 @@ foreach ($langFiles as $file) { $meta = $json['meta'] ?? []; - // optional: meta.enabled === false → ausblenden (z.B. Templates) + // Option: nur Sprachen mit enabled=false ausblenden if (array_key_exists('enabled', $meta) && $meta['enabled'] === false) { continue; } - // Sprachcode aus meta.code oder Dateiname + // Sprachcode bestimmen (immer 2-Buchstaben) $code = strtolower($meta['code'] ?? basename($file, '.json')); - - // Nur 2-Buchstaben-Codes zulassen (de, en, fr, it, dk, es, ...) if (!preg_match('/^[a-z]{2}$/', $code)) { + // Sonderdateien (template.json etc.) ignorieren continue; } $label = $meta['label'] ?? strtoupper($code); - $flag = $meta['flag'] ?? '🏳️'; // Flag kommt primär aus JSON, sonst neutrale Flagge + $flag = $meta['flag'] ?? '🏳️'; $availableLangs[$code] = [ 'code' => $code, @@ -115,7 +129,7 @@ foreach ($langFiles as $file) { ]; } -// Falls wirklich gar keine Sprachdatei existiert → Minimal-Fallback +// Falls keine Sprachdateien gefunden wurden → Minimal-Fallback if (empty($availableLangs)) { $availableLangs = [ 'en' => [ @@ -128,20 +142,15 @@ if (empty($availableLangs)) { // ----------------------------------------------------------- // 3) Endgültige Sprache wählen nach deiner Priorität -// -// 1) ?lang=xx, wenn gültig & vorhanden -// 2) HTTP_ACCEPT_LANGUAGE (erste Sprache, 2 Buchstaben) -// 3) 'en', wenn vorhanden -// 4) sonst erste Sprache aus $availableLangs // ----------------------------------------------------------- $lang = null; -// 1) ?lang=xx (gültig & vorhanden) +// 1) ?lang=xx wird bevorzugt, wenn gültig + vorhanden if ($requestedLang && isset($availableLangs[$requestedLang])) { $lang = $requestedLang; } -// 2) Browser-Sprache aus HTTP_ACCEPT_LANGUAGE +// 2) Sonst HTTP_ACCEPT_LANGUAGE (Browser), erste passende Sprache if ($lang === null) { $browserLang = usb_detect_browser_lang($availableLangs); if ($browserLang !== null) { @@ -149,12 +158,12 @@ if ($lang === null) { } } -// 3) Wenn noch immer nichts → 'en', falls vorhanden +// 3) Wenn Browser-Sprache nicht existiert → 'en', wenn vorhanden if ($lang === null && isset($availableLangs['en'])) { $lang = 'en'; } -// 4) Wenn immer noch nichts → erste Sprache aus $availableLangs +// 4) Sonst: erste Sprache aus $availableLangs if ($lang === null) { $keys = array_keys($availableLangs); $lang = $keys[0] ?? 'en'; @@ -174,7 +183,7 @@ if (is_readable($activeLangFile)) { } // ----------------------------------------------------------- -// 5) Fallback-Sprache (en.json), falls vorhanden +// 5) Fallback-Sprache: immer EN, wenn vorhanden & nicht aktuell // ----------------------------------------------------------- $fallbackLangData = []; $fallbackFile = $i18nDir . '/en.json';