This commit is contained in:
2025-11-26 23:26:20 +01:00
parent cf84158039
commit e81ed22245

View File

@@ -30,15 +30,17 @@ if (php_sapi_name() !== 'cli') {
function usb_detect_browser_lang(array $availableLangs): ?string
{
if (empty($availableLangs)) {
error_log('[i18n] Browser-Lang: keine availableLangs abbrechen');
return null;
}
$header = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? '';
error_log('[i18n] HTTP_ACCEPT_LANGUAGE: ' . $header);
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) {
@@ -47,17 +49,24 @@ function usb_detect_browser_lang(array $availableLangs): ?string
continue;
}
// Sprache vor dem ; nehmen (z.B. "de-DE" oder "en-US")
// Sprache vor dem ; nehmen (z.B. "de-DE", "en-US")
$langTag = strtolower(explode(';', $part)[0]);
if ($langTag === '') {
continue;
}
// 2-Buchstaben-Code extrahieren
// 2-Buchstaben-Code extrahieren (de, en, fr, …)
$code2 = substr($langTag, 0, 2);
if (preg_match('/^[a-z]{2}$/', $code2) && isset($availableLangs[$code2])) {
if (!preg_match('/^[a-z]{2}$/', $code2)) {
continue;
}
$exists = array_key_exists($code2, $availableLangs) ? 'yes' : 'no';
error_log("[i18n] Browser-Lang-Kandidat: {$code2} (exists: {$exists})");
if (isset($availableLangs[$code2])) {
return $code2;
}
}
@@ -79,6 +88,8 @@ if (is_string($requestedLang)) {
$requestedLang = null;
}
error_log('[i18n] requestedLang (GET): ' . var_export($requestedLang, true));
// -----------------------------------------------------------
// 2) Verfügbare JSON-Sprachen erkennen
// -----------------------------------------------------------
@@ -95,20 +106,21 @@ $availableLangs = [];
foreach ($langFiles as $file) {
$raw = @file_get_contents($file);
if ($raw === false) {
error_log('i18n: Konnte Datei nicht lesen: ' . $file);
error_log('[i18n] Konnte Datei nicht lesen: ' . $file);
continue;
}
$json = json_decode($raw, true);
if (!is_array($json)) {
error_log('i18n: Ungültiges JSON in ' . $file . ' :: ' . json_last_error_msg());
error_log('[i18n] Ungültiges JSON in ' . $file . ' :: ' . json_last_error_msg());
continue;
}
$meta = $json['meta'] ?? [];
// Option: nur Sprachen mit enabled=false ausblenden
// Optional: nur Sprachen mit enabled=false ausblenden
if (array_key_exists('enabled', $meta) && $meta['enabled'] === false) {
error_log('[i18n] Sprache deaktiviert (enabled=false) in ' . $file);
continue;
}
@@ -116,6 +128,7 @@ foreach ($langFiles as $file) {
$code = strtolower($meta['code'] ?? basename($file, '.json'));
if (!preg_match('/^[a-z]{2}$/', $code)) {
// Sonderdateien (template.json etc.) ignorieren
error_log('[i18n] Ignoriere Datei mit unpassendem Code: ' . $file);
continue;
}
@@ -129,8 +142,11 @@ foreach ($langFiles as $file) {
];
}
error_log('[i18n] availableLangs keys: ' . implode(', ', array_keys($availableLangs)));
// Falls keine Sprachdateien gefunden wurden → Minimal-Fallback
if (empty($availableLangs)) {
error_log('[i18n] WARN: keine Sprachdateien gefunden, fallback auf en');
$availableLangs = [
'en' => [
'code' => 'en',
@@ -148,6 +164,7 @@ $lang = null;
// 1) ?lang=xx wird bevorzugt, wenn gültig + vorhanden
if ($requestedLang && isset($availableLangs[$requestedLang])) {
$lang = $requestedLang;
error_log('[i18n] Auswahl: requestedLang übernommen: ' . $lang);
}
// 2) Sonst HTTP_ACCEPT_LANGUAGE (Browser), erste passende Sprache
@@ -155,20 +172,25 @@ if ($lang === null) {
$browserLang = usb_detect_browser_lang($availableLangs);
if ($browserLang !== null) {
$lang = $browserLang;
error_log('[i18n] Auswahl: Browser-Lang übernommen: ' . $lang);
}
}
// 3) Wenn Browser-Sprache nicht existiert → 'en', wenn vorhanden
if ($lang === null && isset($availableLangs['en'])) {
$lang = 'en';
error_log('[i18n] Auswahl: Fallback auf en, da kein Match');
}
// 4) Sonst: erste Sprache aus $availableLangs
if ($lang === null) {
$keys = array_keys($availableLangs);
$lang = $keys[0] ?? 'en';
error_log('[i18n] Auswahl: Fallback auf erste Sprache: ' . $lang);
}
error_log('[i18n] FINAL LANG: ' . $lang);
// -----------------------------------------------------------
// 4) Aktive Sprachdatei laden
// -----------------------------------------------------------
@@ -179,7 +201,11 @@ if (is_readable($activeLangFile)) {
$json = json_decode(@file_get_contents($activeLangFile), true);
if (is_array($json)) {
$activeLangData = $json;
} else {
error_log('[i18n] Aktive JSON nicht array: ' . $activeLangFile);
}
} else {
error_log('[i18n] Aktive Sprachdatei nicht lesbar: ' . $activeLangFile);
}
// -----------------------------------------------------------
@@ -192,6 +218,8 @@ if ($lang !== 'en' && is_readable($fallbackFile)) {
$json = json_decode(@file_get_contents($fallbackFile), true);
if (is_array($json)) {
$fallbackLangData = $json;
} else {
error_log('[i18n] Fallback-JSON (en) nicht array: ' . $fallbackFile);
}
}