From 76e886e6107645459739d6dddfd4b2e619d4e095 Mon Sep 17 00:00:00 2001 From: "Florian Aders (EleRas)" Date: Thu, 23 Jun 2011 13:20:08 +0200 Subject: [PATCH] Moved language - selection based on gettext into an own class for easier management Signed-off-by: Florian Aders (EleRas) --- lib/classes/output/class.languageSelect.php | 194 ++++++++++++++++++++ webftp.php | 80 +------- 2 files changed, 204 insertions(+), 70 deletions(-) create mode 100644 lib/classes/output/class.languageSelect.php diff --git a/lib/classes/output/class.languageSelect.php b/lib/classes/output/class.languageSelect.php new file mode 100644 index 00000000..08e4adb9 --- /dev/null +++ b/lib/classes/output/class.languageSelect.php @@ -0,0 +1,194 @@ + (2011-) + * @license GPLv2 http://files.froxlor.org/misc/COPYING.txt + * @package Classes + * + */ + +/** + * + * @property-write bool $useBrowser Determine if the browser should be used to detect the language + */ +class languageSelect +{ + /** + * Shall the browser be used to determine the language? + * @var bool + */ + private $useBrowser = true; + + /** + * The default language to be used if the chosen one is not working + * @var string + */ + private $defaultLanguage = 'en'; + + /** + * All available languages shipped with Froxlor + * @var array Containing all languages available in Froxlor + */ + private $availableLanguages = array(); + + /** + * All really working languages (codepage exists, Froxlor ships .mo .- file) + * @var array Containing all working languages, indexed by availableLanguages + */ + private $workingLanguages = array(); + + /** + * The currently used language + * @var string + */ + private $selectedLanguage = 'en'; + + /** + * Constructor for the class + * Here we search which languages are shipped with Froxlor and which ones are actually working + */ + public function __construct() + { + // Search for all available languages in 'locales' + if ($handle = opendir('./locales/')) + { + $files = array(); + // Loop through the directory + while(false!==($file = readdir($handle))) + { + // If there is a directory and it's not '.' or '..', it's a language + if (is_dir('./locales/' . $file) && !preg_match('/^\.\.?$/', $file)) + { + $files[] = $file; + } + } + closedir($handle); + sort($files); + $this->availableLanguages = $files; + } + + # See for which language the codepages are compiled + foreach ($this->availableLanguages as $lang) + { + preg_match_all("/[^|\w]".$lang.'.*/', `locale -a`, $matches); + foreach($matches[0] as $m) + { + if(preg_match('/utf8/', $m)) + { + $this->workingLanguages[$lang] = trim($m); + break; + } + } + } + } + + /** + * Set the gettext - variables needed to a chosen language + * + * This function either tries to find a suitable language for the users browser + * (if $userBrowser is true) and sets the language to the desired one. A language given + * as a parameter overrides the "automagic" and forces the given language. + * If the desired language is not within workingLanguages, the fallback will be used + * + * @param string $lang An optional language to be forced, if it's not working, the default language will be used + * @return bool|string The used language if successful, otherwise "false" + */ + public function setLanguage($lang = '') + { + setLocale(LC_ALL,'en_US.utf8'); + bindtextdomain('default','./locales/'); + textdomain('default'); + if (!empty($lang)) + { + if (isset($this->workingLanguages[$lang])) + { + return setLocale(LC_ALL, $this->workingLanguages[$this->selectedLanguage]); + } + else + { + return false; + } + } + + # Get Browser - languages + if ($this->useBrowser) + { + $ls = array(); + if (!isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) + { + $_SERVER['HTTP_ACCEPT_LANGUAGE'] = ''; + } + $langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); + foreach($langs as $lang) + { + if (in_array(preg_replace('/;.*/','',trim($lang)), $this->availableLanguages)) + { + $this->selectedLanguage = preg_replace('/;.*/','',trim($lang)); + break; + } + } + + } + + // Let's try the original language selected + if(setLocale(LC_ALL, $this->selectedLanguage)) + { + // Worked, okay, no more work needed + return true; + } + + // Okay, let's hope we have a working language with another name for the selected one + if (isset($this->workingLanguages[$this->selectedLanguage])) + { + return setLocale(LC_ALL, $this->workingLanguages[$this->selectedLanguage]); + } + return false; + } + + /** + * Get all working languages + * + * This will return an array indexed by availableLanguages which are actually working + * Languages which are available but where gettext can't be used because of missing + * compiled codepage are not returned at all + * + * @return array All languages found to be working + */ + public function getWorkingLanguages() + { + return $this->workingLanguages; + } + + /** + * Get all available languages + * + * This will return an arraywhich contains all languages Froxlor ships. Please note: + * It does not mean, that all languages are really working {@link getWorkingLanguages()} + * + * @return array All languages shipped by Froxlor + */ + public function getAvailableLanguages() + { + return $this->availableLanguages; + } + + public function __set($varname, $value) + { + switch ($varname) + { + case "useBrowser": + $this->useBrowser = ($value === false) ? false : true; + return true; + break; + } + return false; + } +} diff --git a/webftp.php b/webftp.php index 283cf151..9c6dc309 100644 --- a/webftp.php +++ b/webftp.php @@ -108,73 +108,6 @@ else $settings['panel']['default_theme'] = 'Froxlor'; } -# Set the language -setLocale(LC_ALL,'en_US.utf8'); -bindtextdomain('default','./locales/'); -textdomain('default'); -if ($handle = opendir('./locales/')) -{ - $files = array(); - while(false!==($file = readdir($handle))) - { - if (is_dir('./locales/' . $file) && !preg_match('/^\.\.?$/', $file)) - { - $files[] = $file; - } - } - closedir($handle); - sort($files); - $available_languages = array(); - foreach($files as $f) - { - $available_languages[] = $f; - } -} -else -{ - echo 'error: missing language files'; - exit; -} - -$ls = array(); -if (!isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) -{ - $_SERVER['HTTP_ACCEPT_LANGUAGE'] = ''; -} - -$langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); -foreach($langs as $lang) -{ - if (in_array(preg_replace('/;.*/','',trim($lang)), $available_languages)) - { - $selected_language = preg_replace('/;.*/','',trim($lang)); - break; - } -} -if(!isset($selected_language)) -{ - $selected_language = 'en'; -} - -if(!setLocale(LC_ALL, $selected_language)) -{ - preg_match_all("/[^|\w]".$selected_language.'.*/',`locale -a`,$matches); - if(!count($matches[0])) - { - die('no locale info for "'.$selected_language.'"'); - } - $selected_language = trim($matches[0][0]); - foreach($matches[0] as $m) - { - if(preg_match('/utf8/', $m)) - { - $selected_language = trim($m); - break; - } - } - setLocale(LC_ALL, $selected_language); -} - # Initialize Smarty include('./lib/classes/Smarty/Smarty.class.php'); $smarty = new Smarty; @@ -183,6 +116,16 @@ $smarty->template_dir = './templates/' . $settings['panel']['default_theme'] . ' $smarty->compile_dir = './templates_c/'; $smarty->cache_dir = './cache/'; +# Set the language +require('./lib/classes/output/class.languageSelect.php'); +$language = new languageSelect(); +$language->useBrowser = true; +$language->setLanguage(); + +# Activate gettext for smarty; +define('HAVE_GETTEXT', true); +require ('./lib/functions/smarty_plugins/gettext-prefilter.php'); + $settings['admin']['show_version_login'] = 0; if ($result = $db->query("SELECT `value` FROM `panel_settings` WHERE `settinggroup` = 'admin' AND `varname` = 'show_version_login'")) { @@ -203,9 +146,6 @@ if ($result = $db->query("SELECT `value` FROM `panel_settings` WHERE `settinggro $db->close(); unset($db); -# Activate gettext for smarty; -define('HAVE_GETTEXT', true); -require ('./lib/functions/smarty_plugins/gettext-prefilter.php'); # Set default options for template $image_path = 'images/'.$settings['panel']['default_theme']; $header_logo = $image_path.'/logo.png';