asd
This commit is contained in:
@@ -25,17 +25,36 @@ if (php_sapi_name() !== 'cli') {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------
|
// -----------------------------------------------------------
|
||||||
// Helper: Browser-Sprache aus HTTP_ACCEPT_LANGUAGE bestimmen
|
// Kleine Helper-Funktion für internes Logging + HTML-Debug
|
||||||
|
// -----------------------------------------------------------
|
||||||
|
function usb_i18n_debug_log(string $msg): void
|
||||||
|
{
|
||||||
|
// 1) In eine eigene Log-Datei schreiben (im config/-Ordner)
|
||||||
|
$logFile = __DIR__ . '/i18n_debug.log';
|
||||||
|
$line = '[' . date('Y-m-d H:i:s') . '] ' . $msg . PHP_EOL;
|
||||||
|
@file_put_contents($logFile, $line, FILE_APPEND);
|
||||||
|
|
||||||
|
// 2) optional auch ins PHP error_log
|
||||||
|
@error_log('[i18n] ' . $msg);
|
||||||
|
|
||||||
|
// 3) Bei ?debug_i18n=1 zusätzlich HTML-Kommentar ausgeben
|
||||||
|
if (isset($_GET['debug_i18n']) && $_GET['debug_i18n'] == '1') {
|
||||||
|
echo "<!-- [i18n] " . htmlspecialchars($msg, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8') . " -->\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------
|
||||||
|
// Browser-Sprache aus HTTP_ACCEPT_LANGUAGE bestimmen
|
||||||
// -----------------------------------------------------------
|
// -----------------------------------------------------------
|
||||||
function usb_detect_browser_lang(array $availableLangs): ?string
|
function usb_detect_browser_lang(array $availableLangs): ?string
|
||||||
{
|
{
|
||||||
if (empty($availableLangs)) {
|
if (empty($availableLangs)) {
|
||||||
error_log('[i18n] Browser-Lang: keine availableLangs – abbrechen');
|
usb_i18n_debug_log('Browser-Lang: keine availableLangs – abbrechen');
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$header = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? '';
|
$header = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? '';
|
||||||
error_log('[i18n] HTTP_ACCEPT_LANGUAGE: ' . $header);
|
usb_i18n_debug_log('HTTP_ACCEPT_LANGUAGE: ' . $header);
|
||||||
|
|
||||||
if ($header === '') {
|
if ($header === '') {
|
||||||
return null;
|
return null;
|
||||||
@@ -51,20 +70,18 @@ function usb_detect_browser_lang(array $availableLangs): ?string
|
|||||||
|
|
||||||
// Sprache vor dem ; nehmen (z.B. "de-DE", "en-US")
|
// Sprache vor dem ; nehmen (z.B. "de-DE", "en-US")
|
||||||
$langTag = strtolower(explode(';', $part)[0]);
|
$langTag = strtolower(explode(';', $part)[0]);
|
||||||
|
|
||||||
if ($langTag === '') {
|
if ($langTag === '') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2-Buchstaben-Code extrahieren (de, en, fr, …)
|
// 2-Buchstaben-Code extrahieren
|
||||||
$code2 = substr($langTag, 0, 2);
|
$code2 = substr($langTag, 0, 2);
|
||||||
|
|
||||||
if (!preg_match('/^[a-z]{2}$/', $code2)) {
|
if (!preg_match('/^[a-z]{2}$/', $code2)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$exists = array_key_exists($code2, $availableLangs) ? 'yes' : 'no';
|
$exists = array_key_exists($code2, $availableLangs) ? 'yes' : 'no';
|
||||||
error_log("[i18n] Browser-Lang-Kandidat: {$code2} (exists: {$exists})");
|
usb_i18n_debug_log("Browser-Lang-Kandidat: {$code2} (exists: {$exists})");
|
||||||
|
|
||||||
if (isset($availableLangs[$code2])) {
|
if (isset($availableLangs[$code2])) {
|
||||||
return $code2;
|
return $code2;
|
||||||
@@ -88,7 +105,7 @@ if (is_string($requestedLang)) {
|
|||||||
$requestedLang = null;
|
$requestedLang = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
error_log('[i18n] requestedLang (GET): ' . var_export($requestedLang, true));
|
usb_i18n_debug_log('requestedLang (GET): ' . var_export($requestedLang, true));
|
||||||
|
|
||||||
// -----------------------------------------------------------
|
// -----------------------------------------------------------
|
||||||
// 2) Verfügbare JSON-Sprachen erkennen
|
// 2) Verfügbare JSON-Sprachen erkennen
|
||||||
@@ -106,13 +123,13 @@ $availableLangs = [];
|
|||||||
foreach ($langFiles as $file) {
|
foreach ($langFiles as $file) {
|
||||||
$raw = @file_get_contents($file);
|
$raw = @file_get_contents($file);
|
||||||
if ($raw === false) {
|
if ($raw === false) {
|
||||||
error_log('[i18n] Konnte Datei nicht lesen: ' . $file);
|
usb_i18n_debug_log('Konnte Datei nicht lesen: ' . $file);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
$json = json_decode($raw, true);
|
$json = json_decode($raw, true);
|
||||||
if (!is_array($json)) {
|
if (!is_array($json)) {
|
||||||
error_log('[i18n] Ungültiges JSON in ' . $file . ' :: ' . json_last_error_msg());
|
usb_i18n_debug_log('Ungültiges JSON in ' . $file . ' :: ' . json_last_error_msg());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,7 +137,7 @@ foreach ($langFiles as $file) {
|
|||||||
|
|
||||||
// Optional: nur Sprachen mit enabled=false ausblenden
|
// Optional: nur Sprachen mit enabled=false ausblenden
|
||||||
if (array_key_exists('enabled', $meta) && $meta['enabled'] === false) {
|
if (array_key_exists('enabled', $meta) && $meta['enabled'] === false) {
|
||||||
error_log('[i18n] Sprache deaktiviert (enabled=false) in ' . $file);
|
usb_i18n_debug_log('Sprache deaktiviert (enabled=false) in ' . $file);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,7 +145,7 @@ foreach ($langFiles as $file) {
|
|||||||
$code = strtolower($meta['code'] ?? basename($file, '.json'));
|
$code = strtolower($meta['code'] ?? basename($file, '.json'));
|
||||||
if (!preg_match('/^[a-z]{2}$/', $code)) {
|
if (!preg_match('/^[a-z]{2}$/', $code)) {
|
||||||
// Sonderdateien (template.json etc.) ignorieren
|
// Sonderdateien (template.json etc.) ignorieren
|
||||||
error_log('[i18n] Ignoriere Datei mit unpassendem Code: ' . $file);
|
usb_i18n_debug_log('Ignoriere Datei mit unpassendem Code: ' . $file);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,11 +159,11 @@ foreach ($langFiles as $file) {
|
|||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
error_log('[i18n] availableLangs keys: ' . implode(', ', array_keys($availableLangs)));
|
usb_i18n_debug_log('availableLangs keys: ' . implode(', ', array_keys($availableLangs)));
|
||||||
|
|
||||||
// Falls keine Sprachdateien gefunden wurden → Minimal-Fallback
|
// Falls keine Sprachdateien gefunden wurden → Minimal-Fallback
|
||||||
if (empty($availableLangs)) {
|
if (empty($availableLangs)) {
|
||||||
error_log('[i18n] WARN: keine Sprachdateien gefunden, fallback auf en');
|
usb_i18n_debug_log('WARN: keine Sprachdateien gefunden, fallback auf en');
|
||||||
$availableLangs = [
|
$availableLangs = [
|
||||||
'en' => [
|
'en' => [
|
||||||
'code' => 'en',
|
'code' => 'en',
|
||||||
@@ -164,7 +181,7 @@ $lang = null;
|
|||||||
// 1) ?lang=xx wird bevorzugt, wenn gültig + vorhanden
|
// 1) ?lang=xx wird bevorzugt, wenn gültig + vorhanden
|
||||||
if ($requestedLang && isset($availableLangs[$requestedLang])) {
|
if ($requestedLang && isset($availableLangs[$requestedLang])) {
|
||||||
$lang = $requestedLang;
|
$lang = $requestedLang;
|
||||||
error_log('[i18n] Auswahl: requestedLang übernommen: ' . $lang);
|
usb_i18n_debug_log('Auswahl: requestedLang übernommen: ' . $lang);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2) Sonst HTTP_ACCEPT_LANGUAGE (Browser), erste passende Sprache
|
// 2) Sonst HTTP_ACCEPT_LANGUAGE (Browser), erste passende Sprache
|
||||||
@@ -172,24 +189,24 @@ if ($lang === null) {
|
|||||||
$browserLang = usb_detect_browser_lang($availableLangs);
|
$browserLang = usb_detect_browser_lang($availableLangs);
|
||||||
if ($browserLang !== null) {
|
if ($browserLang !== null) {
|
||||||
$lang = $browserLang;
|
$lang = $browserLang;
|
||||||
error_log('[i18n] Auswahl: Browser-Lang übernommen: ' . $lang);
|
usb_i18n_debug_log('Auswahl: Browser-Lang übernommen: ' . $lang);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 3) Wenn Browser-Sprache nicht existiert → 'en', wenn vorhanden
|
// 3) Wenn Browser-Sprache nicht existiert → 'en', wenn vorhanden
|
||||||
if ($lang === null && isset($availableLangs['en'])) {
|
if ($lang === null && isset($availableLangs['en'])) {
|
||||||
$lang = 'en';
|
$lang = 'en';
|
||||||
error_log('[i18n] Auswahl: Fallback auf en, da kein Match');
|
usb_i18n_debug_log('Auswahl: Fallback auf en, da kein Match');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4) Sonst: erste Sprache aus $availableLangs
|
// 4) Sonst: erste Sprache aus $availableLangs
|
||||||
if ($lang === null) {
|
if ($lang === null) {
|
||||||
$keys = array_keys($availableLangs);
|
$keys = array_keys($availableLangs);
|
||||||
$lang = $keys[0] ?? 'en';
|
$lang = $keys[0] ?? 'en';
|
||||||
error_log('[i18n] Auswahl: Fallback auf erste Sprache: ' . $lang);
|
usb_i18n_debug_log('Auswahl: Fallback auf erste Sprache: ' . $lang);
|
||||||
}
|
}
|
||||||
|
|
||||||
error_log('[i18n] FINAL LANG: ' . $lang);
|
usb_i18n_debug_log('FINAL LANG: ' . $lang);
|
||||||
|
|
||||||
// -----------------------------------------------------------
|
// -----------------------------------------------------------
|
||||||
// 4) Aktive Sprachdatei laden
|
// 4) Aktive Sprachdatei laden
|
||||||
@@ -202,10 +219,10 @@ if (is_readable($activeLangFile)) {
|
|||||||
if (is_array($json)) {
|
if (is_array($json)) {
|
||||||
$activeLangData = $json;
|
$activeLangData = $json;
|
||||||
} else {
|
} else {
|
||||||
error_log('[i18n] Aktive JSON nicht array: ' . $activeLangFile);
|
usb_i18n_debug_log('Aktive JSON nicht array: ' . $activeLangFile);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
error_log('[i18n] Aktive Sprachdatei nicht lesbar: ' . $activeLangFile);
|
usb_i18n_debug_log('Aktive Sprachdatei nicht lesbar: ' . $activeLangFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------
|
// -----------------------------------------------------------
|
||||||
@@ -219,7 +236,7 @@ if ($lang !== 'en' && is_readable($fallbackFile)) {
|
|||||||
if (is_array($json)) {
|
if (is_array($json)) {
|
||||||
$fallbackLangData = $json;
|
$fallbackLangData = $json;
|
||||||
} else {
|
} else {
|
||||||
error_log('[i18n] Fallback-JSON (en) nicht array: ' . $fallbackFile);
|
usb_i18n_debug_log('Fallback-JSON (en) nicht array: ' . $fallbackFile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user