| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- <?php
- /**
- * Translation System
- * Handles multi-language support for Finnish and English
- */
- class Translation {
- private static $instance = null;
- private $translations = [];
- private $currentLanguage = 'en';
- private $defaultLanguage = 'en';
- private $supportedLanguages = ['en' => '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;
- }
-
- public static function resetInstance() {
- self::$instance = null;
- }
-
- private function detectLanguage() {
- // Check if language is set in cookie
- if (isset($_COOKIE['language']) && isset($this->supportedLanguages[$_COOKIE['language']])) {
- $this->currentLanguage = $_COOKIE['language'];
- return;
- }
-
- // Check URL parameter
- if (isset($_GET['lang']) && isset($this->supportedLanguages[$_GET['lang']])) {
- $this->currentLanguage = $_GET['lang'];
-
- // Set cookie for language preference (expires in 1 year)
- setcookie('language', $this->currentLanguage, time() + 31536000, '/', '', false, true);
- $_COOKIE['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;
-
- // Set cookie for browser language preference
- setcookie('language', $this->currentLanguage, time() + 31536000, '/', '', false, true);
- $_COOKIE['language'] = $this->currentLanguage;
- return;
- }
- }
-
- // Check configuration default
- if (defined('DEFAULT_LANGUAGE') && isset($this->supportedLanguages[DEFAULT_LANGUAGE])) {
- $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 English if current language file doesn't exist
- $fallbackLangFile = __DIR__ . '/../languages/en.php';
- if (file_exists($fallbackLangFile)) {
- $this->translations = require $fallbackLangFile;
- }
- }
- }
-
- 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;
-
- // Set cookie for language preference (expires in 1 year)
- setcookie('language', $language, time() + 31536000, '/', '', false, true);
- $_COOKIE['language'] = $language;
-
- $this->loadTranslations();
- return true;
- }
- return false;
- }
-
- public function getLanguageSwitcher($currentPath = '') {
- $switcher = '<div class="language-switcher">';
- $switcher .= '<span class="language-label">' . $this->translate('language') . ':</span>';
-
- foreach ($this->supportedLanguages as $code => $name) {
- $separator = strpos($currentPath, '?') !== false ? '&' : '?';
- $switcherUrl = $currentPath . $separator . 'lang=' . $code;
-
- $class = $code === $this->currentLanguage ? 'active' : '';
- $switcher .= '<a href="' . htmlspecialchars($switcherUrl) . '" class="language-link ' . $class . '">' . $name . '</a>';
- }
-
- $switcher .= '</div>';
- 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();
- }
|