diff --git a/config/staging/fileload.php b/config/staging/fileload.php index b97e3e6..0132667 100644 --- a/config/staging/fileload.php +++ b/config/staging/fileload.php @@ -2,26 +2,105 @@ ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); -// Nur im Web-Kontext (nicht in CLI-Skripten) + +// ----------------------------------------------------------- +// Session starten +// ----------------------------------------------------------- if (php_sapi_name() !== 'cli') { - // Session nur starten, wenn noch keine läuft if (session_status() === PHP_SESSION_NONE) { - // Optional: Session-Konfiguration vor session_start session_name('usbcheck_session'); session_set_cookie_params([ - 'lifetime' => 0, // Session-Cookie + 'lifetime' => 0, 'path' => '/', - 'domain' => '', // leer = aktuelle Domain + 'domain' => '', 'secure' => (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off'), 'httponly' => true, - 'samesite' => 'Lax', // oder 'Strict' falls du sehr streng sein willst + 'samesite' => 'Lax', ]); session_start(); } } -require_once __DIR__ . "/config.php"; -require_once __DIR__ . "/db.php"; + +// ----------------------------------------------------------- +// 1) Sprache bestimmen (vor dem Laden der JSON-Dateien!) +// ----------------------------------------------------------- +$lang = $_GET['lang'] ?? null; +$lang = strtolower($lang); + +if (!preg_match('/^[a-z]{2}$/', $lang)) { + $lang = null; +} + +// ----------------------------------------------------------- +// 2) Verfügbare JSON-Sprachen erkennen +// ----------------------------------------------------------- +$i18nDir = __DIR__ . '/../public/assets/i18n'; +$langFiles = glob($i18nDir . '/*.json') ?: []; + +$availableLangs = []; + +foreach ($langFiles as $file) { + $json = json_decode(file_get_contents($file), true); + if (!$json || !isset($json['meta'])) continue; + + $meta = $json['meta']; + $code = strtolower($meta['code'] ?? basename($file, ".json")); + + $availableLangs[$code] = [ + 'code' => $code, + 'label' => $meta['label'] ?? strtoupper($code), + 'flag' => $meta['flag'] ?? '🏳️' + ]; +} + +// Falls Sprache ungültig → erste verfügbare Sprache wählen +if (!$lang || !isset($availableLangs[$lang])) { + $lang = array_key_first($availableLangs) ?: 'en'; +} + +// ----------------------------------------------------------- +// 3) Aktive Sprachdatei laden +// ----------------------------------------------------------- +$activeLangFile = $i18nDir . '/' . $lang . '.json'; +$activeLangData = []; + +if (is_readable($activeLangFile)) { + $json = json_decode(file_get_contents($activeLangFile), true); + if (is_array($json)) { + $activeLangData = $json; + } +} + +// ----------------------------------------------------------- +// 4) Fallback-Sprache (EN) +// ----------------------------------------------------------- +$fallbackLangData = []; +$fallbackFile = $i18nDir . '/en.json'; + +if ($lang !== 'en' && is_readable($fallbackFile)) { + $json = json_decode(file_get_contents($fallbackFile), true); + if (is_array($json)) { + $fallbackLangData = $json; + } +} + +// ----------------------------------------------------------- +// 5) Globale i18n-Struktur bereitstellen +// ----------------------------------------------------------- +$GLOBALS['lang'] = $lang; +$GLOBALS['availableLangs'] = $availableLangs; + +$GLOBALS['i18n'] = [ + 'current' => $activeLangData, + 'fallback' => $fallbackLangData, +]; + +// ----------------------------------------------------------- +// 6) Rest des Systems laden +// ----------------------------------------------------------- +require_once __DIR__ . "/config.php"; +require_once __DIR__ . "/db.php"; require_once __DIR__ . '/../src/functions.php'; diff --git a/partials/structure/app_config.php b/partials/structure/app_config.php index b6db9de..49ae6d1 100644 --- a/partials/structure/app_config.php +++ b/partials/structure/app_config.php @@ -1,31 +1,63 @@ $lang ?? 'en', + + // Basis-Pfade 'assetsBase' => '/assets', - // NEU: Versionierung für JS/CSS aus PHP-Config + + // Versionierung für JS/CSS + // → wenn ASSET_VERSION definiert ist, wird sie genutzt + // → sonst null (JS-Loader sorgt für ?v= fallback) 'assetVersion'=> defined('ASSET_VERSION') ? ASSET_VERSION : null, + + // Environment (prod, staging, dev) 'env' => $GLOBALS['ENV'] ?? 'prod', - 'domains' => [ + // Domains + 'domains' => [ 'primaryDomain' => app_primary_domain(), 'primaryUrl' => app_primary_url(), 'fakecheckDomain' => app_fakecheck_domain(), 'fakecheckUrl' => app_fakecheck_url(), ], + // Fakecheck-Tool-Config 'fakecheck' => [ 'baseUrl' => $GLOBALS['usb_base_url'] ?? '', 'apiBaseUrl' => $GLOBALS['usb_api_base'] ?? 'https://api.usbcheck.it', 'locale' => $lang ?? 'en', ], + + // ----------------------------------------------- + // i18n: aus fileload.php gefüllt + // ----------------------------------------------- + 'i18n' => [ + // Alle verfügbaren Sprachen (code, label, flag) + 'available' => $availableLangs ?? [], + + // Aktuelle Sprache als Code (de/en/fr/it …) + 'current' => $lang ?? 'en', + ], ]; + +// ----------------------------------------------- +// Javascript-Konfiguration in die Seite schreiben +// ----------------------------------------------- ?> diff --git a/partials/structure/header.php b/partials/structure/header.php index 2099f65..f914485 100644 --- a/partials/structure/header.php +++ b/partials/structure/header.php @@ -44,13 +44,52 @@ if ($isLoggedIn) { $userInitials = mb_strtoupper($initials); } } + +// ----------------------------------------- +// Dynamische Sprachliste +// kommt aus app_config.php: +// +// $usbConfig['i18n']['available'] = [ +// 'de' => ['code'=>'de','label'=>'Deutsch','flag'=>'🇩🇪'], +// ... +// ]; +// $usbConfig['i18n']['current'] = 'de'; +// ----------------------------------------- + +// aktuelle Sprache aus globalem Kontext +$currentLang = $usbConfig['i18n']['current'] ?? ($lang ?? 'en'); + +// verfügbare Sprachen aus Config +$availableLangs = $usbConfig['i18n']['available'] ?? []; + +// Fallback: Wenn Config noch nichts liefert, nimm nur die aktuelle Sprache +if (!$availableLangs || !is_array($availableLangs)) { + $availableLangs = [ + $currentLang => [ + 'code' => $currentLang, + 'label' => strtoupper($currentLang), + 'flag' => '🏳️' + ] + ]; +} + +// Sicherstellen, dass currentLang in der Liste ist +if (!isset($availableLangs[$currentLang])) { + $currentLang = array_key_first($availableLangs); +} + +// aktuelle Sprache-Info +$currentLangInfo = $availableLangs[$currentLang] ?? ['code' => $currentLang]; +$currentLangFlag = $currentLangInfo['flag'] ?? '🏳️'; +$currentLangCode = strtoupper($currentLangInfo['code'] ?? $currentLang); +$currentLangLabel = $currentLangInfo['label'] ?? $currentLangCode; ?>
@@ -127,7 +156,7 @@ if ($isLoggedIn) { type="button" class="relative inline-flex items-center justify-center rounded-full bg-brand-primary px-4 py-1.5 text-xs font-semibold uppercase tracking-[0.18em] text-brand-bg shadow-soft hover:bg-cyan-400 transition-colors" data-i18n="header_btn_login" - data-login-url="/login/?lang="> + data-login-url="/login/?lang="> Login @@ -143,7 +172,7 @@ if ($isLoggedIn) {