|
|
@@ -1,158 +1,71 @@
|
|
|
<?php
|
|
|
-/**
|
|
|
- * Translation System
|
|
|
- * Handles multi-language support for Finnish and English
|
|
|
- */
|
|
|
+// Translation system - Based on feedback system approach
|
|
|
+require_once 'config.php';
|
|
|
|
|
|
class Translation {
|
|
|
- private static $instance = null;
|
|
|
- private $translations = [];
|
|
|
- private $currentLanguage = 'en';
|
|
|
- private $defaultLanguage = 'en';
|
|
|
- private $supportedLanguages = ['en' => 'English', 'fi' => 'Finnish'];
|
|
|
+ private static $translations = [];
|
|
|
+ private static $current_lang = DEFAULT_LANGUAGE;
|
|
|
|
|
|
- private function __construct() {
|
|
|
- $this->detectLanguage();
|
|
|
- $this->loadTranslations();
|
|
|
- }
|
|
|
-
|
|
|
- public static function getInstance() {
|
|
|
- if (self::$instance === null) {
|
|
|
- self::$instance = new self();
|
|
|
+ public static function init($lang = 'en') {
|
|
|
+ self::$current_lang = $lang;
|
|
|
+ $lang_file = __DIR__ . "/../languages/{$lang}.php";
|
|
|
+
|
|
|
+ if (file_exists($lang_file)) {
|
|
|
+ self::$translations = require $lang_file;
|
|
|
+ } else {
|
|
|
+ // Fallback to English
|
|
|
+ self::$current_lang = 'en';
|
|
|
+ self::$translations = require __DIR__ . '/../languages/en.php';
|
|
|
}
|
|
|
- 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;
|
|
|
+ public static function get($key, $params = []) {
|
|
|
+ if (!isset(self::$translations[$key])) {
|
|
|
+ return $key; // Return key if translation not found
|
|
|
}
|
|
|
|
|
|
- // Fall back to English as default language
|
|
|
- $this->currentLanguage = 'en';
|
|
|
- }
|
|
|
-
|
|
|
- private function loadTranslations() {
|
|
|
- $langFile = __DIR__ . '/../languages/' . $this->currentLanguage . '.php';
|
|
|
+ $translation = self::$translations[$key];
|
|
|
|
|
|
- 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);
|
|
|
+ if (!empty($params)) {
|
|
|
+ foreach ($params as $placeholder => $value) {
|
|
|
+ $translation = str_replace('{' . $placeholder . '}', $value, $translation);
|
|
|
}
|
|
|
-
|
|
|
- return $translation;
|
|
|
}
|
|
|
|
|
|
- // Return key if translation not found
|
|
|
- return $key;
|
|
|
+ return $translation;
|
|
|
}
|
|
|
|
|
|
- public function getCurrentLanguage() {
|
|
|
- return $this->currentLanguage;
|
|
|
+ public static function getCurrentLang() {
|
|
|
+ return self::$current_lang;
|
|
|
}
|
|
|
|
|
|
- public function getSupportedLanguages() {
|
|
|
- return $this->supportedLanguages;
|
|
|
+ public static function getAvailableLanguages() {
|
|
|
+ return [
|
|
|
+ 'en' => 'English',
|
|
|
+ 'fi' => 'Suomi'
|
|
|
+ ];
|
|
|
}
|
|
|
|
|
|
- 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();
|
|
|
+ public static function setLanguage($lang) {
|
|
|
+ if (in_array($lang, array_keys(self::getAvailableLanguages()))) {
|
|
|
+ self::init($lang);
|
|
|
return true;
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- public function getLanguageSwitcher($currentPath = '') {
|
|
|
+ public static function getLanguageSwitcher($currentPath = '') {
|
|
|
+ $current_lang = self::getCurrentLang();
|
|
|
+ $languages = self::getAvailableLanguages();
|
|
|
+
|
|
|
$switcher = '<div class="language-switcher">';
|
|
|
- $switcher .= '<span class="language-label">' . $this->translate('language') . ':</span>';
|
|
|
+ $switcher .= '<span class="language-label">' . self::get('language') . ':</span>';
|
|
|
|
|
|
- foreach ($this->supportedLanguages as $code => $name) {
|
|
|
+ foreach ($languages as $code => $name) {
|
|
|
$separator = strpos($currentPath, '?') !== false ? '&' : '?';
|
|
|
$switcherUrl = $currentPath . $separator . 'lang=' . $code;
|
|
|
|
|
|
- $class = $code === $this->currentLanguage ? 'active' : '';
|
|
|
+ $class = $code === $current_lang ? 'active' : '';
|
|
|
$switcher .= '<a href="' . htmlspecialchars($switcherUrl) . '" class="language-link ' . $class . '">' . $name . '</a>';
|
|
|
}
|
|
|
|
|
|
@@ -161,17 +74,44 @@ class Translation {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// Global translation function for convenience
|
|
|
+// Helper function for easier translation access
|
|
|
function t($key, $params = []) {
|
|
|
- return Translation::getInstance()->translate($key, $params);
|
|
|
+ return Translation::get($key, $params);
|
|
|
}
|
|
|
|
|
|
-// Get current language
|
|
|
-function getCurrentLanguage() {
|
|
|
- return Translation::getInstance()->getCurrentLanguage();
|
|
|
+// Auto-initialize with session language or default from config
|
|
|
+if (session_status() === PHP_SESSION_NONE) {
|
|
|
+ session_start();
|
|
|
}
|
|
|
|
|
|
-// Get supported languages
|
|
|
-function getSupportedLanguages() {
|
|
|
- return Translation::getInstance()->getSupportedLanguages();
|
|
|
+// Handle language switching
|
|
|
+if (isset($_GET['lang']) && in_array($_GET['lang'], array_keys(Translation::getAvailableLanguages()))) {
|
|
|
+ $_SESSION['language'] = $_GET['lang'];
|
|
|
+ Translation::setLanguage($_GET['lang']);
|
|
|
+
|
|
|
+ // Redirect back to referring page or remove lang parameter
|
|
|
+ $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
|
|
|
+ if (php_sapi_name() !== 'cli') {
|
|
|
+ header('Location: ' . $redirectUrl);
|
|
|
+ exit;
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+// Initialize translation
|
|
|
+$language = $_SESSION['language'] ?? DEFAULT_LANGUAGE;
|
|
|
+Translation::init($language);
|
|
|
+?>
|