'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; // Redirect to same page without language parameter to apply new language $currentUrl = $_SERVER['REQUEST_URI']; $urlWithoutLang = strtok($currentUrl, '?')[0]; // Redirect to same page without language parameter if ($urlWithoutLang !== false) { header('Location: ' . $urlWithoutLang); 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 if (defined('DEFAULT_LANGUAGE') && isset($this->supportedLanguages[DEFAULT_LANGUAGE])) { $this->currentLanguage = DEFAULT_LANGUAGE; return; } // Fall back to default language $this->currentLanguage = $this->defaultLanguage; } 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 = '
'; $switcher .= '' . $this->translate('language') . ':'; foreach ($this->supportedLanguages as $code => $name) { $separator = strpos($currentPath, '?') !== false ? '&' : '?'; $switcherUrl = $currentPath . $separator . 'lang=' . $code; $class = $code === $this->currentLanguage ? 'active' : ''; $switcher .= '' . $name . ''; } $switcher .= '
'; return $switcher; } } // Global translation function for convenience function t($key, $params = []) { return Translation::getInstance()->translate($key, $params); } // Get current language function getCurrentLanguage() { return Translation::getInstance()->getCurrentLanguage(); } // Get supported languages function getSupportedLanguages() { return Translation::getInstance()->getSupportedLanguages(); }