'English', 'fi' => 'Finnish']; private function __construct() { $this->detectLanguage(); $this->loadTranslations(); } public static function getInstance() { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; } private function detectLanguage() { // Check if language is set in session if (isset($_SESSION['language']) && isset($this->supportedLanguages[$_SESSION['language']])) { $this->currentLanguage = $_SESSION['language']; return; } // Check URL parameter if (isset($_GET['lang']) && isset($this->supportedLanguages[$_GET['lang']])) { $this->currentLanguage = $_GET['lang']; $_SESSION['language'] = $this->currentLanguage; // Load translations for the new language immediately $this->loadTranslations(); // Redirect to same page without language parameter to apply new language $currentUrl = $_SERVER['REQUEST_URI']; $parsedUrl = parse_url($currentUrl); // Build URL without lang parameter $redirectUrl = $parsedUrl['path']; if (isset($parsedUrl['query'])) { parse_str($parsedUrl['query'], $queryParams); unset($queryParams['lang']); // Remove lang parameter if (!empty($queryParams)) { $redirectUrl .= '?' . http_build_query($queryParams); } } // Only redirect if not in CLI mode to avoid issues during testing if (php_sapi_name() !== 'cli') { // Redirect to clean URL header('Location: ' . $redirectUrl); exit; } return; } // Check browser language preference if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $browserLang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); if (isset($this->supportedLanguages[$browserLang])) { $this->currentLanguage = $browserLang; $_SESSION['language'] = $this->currentLanguage; return; } } // Check configuration default (but prefer English for public site) if (defined('DEFAULT_LANGUAGE') && isset($this->supportedLanguages[DEFAULT_LANGUAGE]) && DEFAULT_LANGUAGE !== 'fi') { $this->currentLanguage = DEFAULT_LANGUAGE; return; } // Fall back to English as default language $this->currentLanguage = 'en'; } private function loadTranslations() { $langFile = __DIR__ . '/../languages/' . $this->currentLanguage . '.php'; if (file_exists($langFile)) { $this->translations = require $langFile; } else { // Fall back to default language if current language file doesn't exist $defaultLangFile = __DIR__ . '/../languages/' . $this->defaultLanguage . '.php'; if (file_exists($defaultLangFile)) { $this->translations = require $defaultLangFile; } } } public function translate($key, $params = []) { if (isset($this->translations[$key])) { $translation = $this->translations[$key]; // Replace parameters in translation foreach ($params as $param => $value) { $translation = str_replace(':' . $param, $value, $translation); } return $translation; } // Return key if translation not found return $key; } public function getCurrentLanguage() { return $this->currentLanguage; } public function getSupportedLanguages() { return $this->supportedLanguages; } public function setLanguage($language) { if (isset($this->supportedLanguages[$language])) { $this->currentLanguage = $language; $_SESSION['language'] = $language; $this->loadTranslations(); return true; } return false; } public function getLanguageSwitcher($currentPath = '') { $switcher = '