diff --git a/config/fileload.php b/config/fileload.php index 5dd6035..fdf8b65 100644 --- a/config/fileload.php +++ b/config/fileload.php @@ -25,36 +25,47 @@ if (php_sapi_name() !== 'cli') { } // ----------------------------------------------------------- -// 1) Sprache aus GET (optional) ermitteln +// Helper: Browser-Sprache aus HTTP_ACCEPT_LANGUAGE // ----------------------------------------------------------- -$lang = $_GET['lang'] ?? null; - -if (is_string($lang)) { - $lang = strtolower($lang); - if (!preg_match('/^[a-z]{2}$/', $lang)) { - $lang = null; +function usb_detect_browser_lang(array $availableLangs): ?string +{ + if (empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) || empty($availableLangs)) { + return null; } -} else { - $lang = null; -} -// ----------------------------------------------------------- -// 1b) Browser-Sprache aus HTTP_ACCEPT_LANGUAGE -// ----------------------------------------------------------- -$browserLang = null; -if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { - $accept = $_SERVER['HTTP_ACCEPT_LANGUAGE']; - $parts = explode(',', $accept); - if (!empty($parts[0])) { - $primary = strtolower(trim($parts[0])); - if (preg_match('/^([a-z]{2})/', $primary, $m)) { - $browserLang = $m[1]; // z.B. "de" aus "de-DE" + $raw = $_SERVER['HTTP_ACCEPT_LANGUAGE']; + $parts = explode(',', $raw); + + foreach ($parts as $part) { + $part = trim($part); + if ($part === '') continue; + + // z.B. "de-DE;q=0.9" → "de-DE" + $langPart = explode(';', $part)[0]; + $code2 = strtolower(substr($langPart, 0, 2)); + + if (preg_match('/^[a-z]{2}$/', $code2) && isset($availableLangs[$code2])) { + return $code2; } } + + return null; } // ----------------------------------------------------------- -// 2) Verfügbare JSON-Sprachen erkennen +// 1) Sprache aus ?lang holen (nur 2-Buchstaben-Code validieren) +// ----------------------------------------------------------- +$requestedLang = null; + +if (isset($_GET['lang']) && is_string($_GET['lang'])) { + $tmp = strtolower($_GET['lang']); + if (preg_match('/^[a-z]{2}$/', $tmp)) { + $requestedLang = $tmp; + } +} + +// ----------------------------------------------------------- +// 2) Verfügbare JSON-Sprachen aus /public/assets/i18n // ----------------------------------------------------------- $i18nDir = __DIR__ . '/../public/assets/i18n'; @@ -79,29 +90,23 @@ foreach ($langFiles as $file) { continue; } - // meta ist optional $meta = $json['meta'] ?? []; - // Optional: Sprachen mit enabled=false ausblenden + // optional: meta.enabled === false → ausblenden (z.B. Templates) if (array_key_exists('enabled', $meta) && $meta['enabled'] === false) { continue; } - // Sprachcode bestimmen (meta.code oder Dateiname) + // Sprachcode aus meta.code oder Dateiname $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)) { - // Sonderdatei (z.B. template.json) ignorieren continue; } - // Label: aus meta.label oder Fallback = strtoupper(code) $label = $meta['label'] ?? strtoupper($code); - - // Flag: ausschließlich aus meta.flag oder neutrale Flagge, - // KEINE festen Mappings mehr für de/en/fr/it - $flag = $meta['flag'] ?? '🏳️'; + $flag = $meta['flag'] ?? '🏳️'; // Flag kommt primär aus JSON, sonst neutrale Flagge $availableLangs[$code] = [ 'code' => $code, @@ -110,39 +115,51 @@ foreach ($langFiles as $file) { ]; } -// Falls keine Sprachdateien gefunden wurden → Minimal-Fallback +// Falls wirklich gar keine Sprachdatei existiert → Minimal-Fallback if (empty($availableLangs)) { $availableLangs = [ 'en' => [ 'code' => 'en', 'label' => 'English', - 'flag' => '🇬🇧', + 'flag' => '🏳️', ], ]; } // ----------------------------------------------------------- -// 3) Endgültige Sprache bestimmen (ohne harte Standardsprachen) +// 3) Endgültige Sprache wählen nach deiner Priorität // -// Reihenfolge: -// a) ?lang=xx → wenn gültig und in available -// b) Browser-Sprache → wenn in available -// c) 'en', wenn vorhanden -// d) sonst: erste verfügbare Sprache +// 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 // ----------------------------------------------------------- -if ($lang && isset($availableLangs[$lang])) { - // GET-Parameter ist gültig, nichts weiter tun -} else { - if ($browserLang && isset($availableLangs[$browserLang])) { +$lang = null; + +// 1) ?lang=xx (gültig & vorhanden) +if ($requestedLang && isset($availableLangs[$requestedLang])) { + $lang = $requestedLang; +} + +// 2) Browser-Sprache aus HTTP_ACCEPT_LANGUAGE +if ($lang === null) { + $browserLang = usb_detect_browser_lang($availableLangs); + if ($browserLang !== null) { $lang = $browserLang; - } elseif (isset($availableLangs['en'])) { - $lang = 'en'; - } else { - $keys = array_keys($availableLangs); - $lang = $keys[0] ?? 'en'; } } +// 3) Wenn noch immer nichts → 'en', falls vorhanden +if ($lang === null && isset($availableLangs['en'])) { + $lang = 'en'; +} + +// 4) Wenn immer noch nichts → erste Sprache aus $availableLangs +if ($lang === null) { + $keys = array_keys($availableLangs); + $lang = $keys[0] ?? 'en'; +} + // ----------------------------------------------------------- // 4) Aktive Sprachdatei laden // ----------------------------------------------------------- @@ -157,7 +174,7 @@ if (is_readable($activeLangFile)) { } // ----------------------------------------------------------- -// 5) Fallback-Sprache (EN), falls vorhanden +// 5) Fallback-Sprache (en.json), falls vorhanden // ----------------------------------------------------------- $fallbackLangData = []; $fallbackFile = $i18nDir . '/en.json';