From 5e093d018ef399d338f10605d1aa22e3862284f2 Mon Sep 17 00:00:00 2001 From: marj Date: Mon, 3 Aug 2009 21:12:45 +0000 Subject: [PATCH] Language selection simplification Bug #4325 fixed USERLAN deprecated Bug #3485 possible fix work in progress --- class2.php | 90 +++++++++++++++++++++------ e107_files/shortcode/languagelinks.sc | 73 ++++++++++++---------- 2 files changed, 110 insertions(+), 53 deletions(-) diff --git a/class2.php b/class2.php index 605ee7262..6157e770d 100644 --- a/class2.php +++ b/class2.php @@ -9,9 +9,9 @@ * General purpose file * * $Source: /cvs_backup/e107_0.8/class2.php,v $ -* $Revision: 1.117 $ -* $Date: 2009-08-03 19:51:24 $ -* $Author: e107steved $ +* $Revision: 1.118 $ +* $Date: 2009-08-03 21:12:44 $ +* $Author: marj_nl_fr $ * */ // @@ -456,14 +456,14 @@ define('e_COOKIE', $pref['cookie_name']); // let the subdomain determine the language (when enabled). -if(varset($pref['multilanguage_subdomain']) && ($pref['user_tracking'] == 'session') && e_DOMAIN && MULTILANG_SUBDOMAIN !== false) +if(varset($pref['multilanguage_subdomain']) && ($pref['user_tracking'] == 'session') && e_DOMAIN && MULTILANG_SUBDOMAIN !== FALSE) { - $mtmp = explode("\n",$pref['multilanguage_subdomain']); + $mtmp = explode("\n", $pref['multilanguage_subdomain']); foreach($mtmp as $val) { if(e_DOMAIN == trim($val)) { - $domain_active = true; + $domain_active = TRUE; break; } } @@ -491,7 +491,8 @@ if ($pref['user_tracking'] == 'session') session_start(); if (!isset($_SESSION['challenge'])) { // New session - $_SESSION['challenge'] = sha1(time().session_id()); // Create a unique challenge string for CHAP login + // Create a unique challenge string for CHAP login + $_SESSION['challenge'] = sha1(time().session_id()); } $ubrowser = md5('E107'.$_SERVER['HTTP_USER_AGENT']); if (!isset($_SESSION['ubrowser'])) @@ -559,9 +560,10 @@ define('e_PAGE', $page); // sort out the users language selection if (isset($_POST['setlanguage']) || isset($_GET['elan']) || isset($GLOBALS['elan'])) { - if($_GET['elan']) // query support, for language selection splash pages. etc + // query support, for language selection splash pages. etc + if($_GET['elan']) { - $_POST['sitelanguage'] = str_replace(array(".","/","%"),"",$_GET['elan']); + $_POST['sitelanguage'] = str_replace(array(".", "/", "%"), "", $_GET['elan']); } if($GLOBALS['elan'] && !isset($_POST['sitelanguage'])) { @@ -570,6 +572,7 @@ if (isset($_POST['setlanguage']) || isset($_GET['elan']) || isset($GLOBALS['elan $sql->mySQLlanguage = $_POST['sitelanguage']; $sql2->mySQLlanguage = $_POST['sitelanguage']; + session_set('e107language_'.e_COOKIE, $_POST['sitelanguage'], time() + 86400); if ($pref['user_tracking'] != 'session' && (strpos(e_SELF, ADMINDIR) === false)) { @@ -599,12 +602,13 @@ if (isset($pref['multilanguage']) && $pref['multilanguage']) } // Get Language List for rights checking. -if(!$tmplan = getcachedvars('language-list')) +if( ! $tmplan = getcachedvars('language-list')) { - $handle=opendir(e_LANGUAGEDIR); + $handle = opendir(e_LANGUAGEDIR); while ($file = readdir($handle)) { - if (is_dir(e_LANGUAGEDIR.$file) && $file != '.' && $file != '..' && $file != 'CVS') + // add only if e_LANGUAGEDIR.e_LANGUAGE/e_LANGUAGE + if ($file != '.' && $file != '..' && is_readable(e_LANGUAGEDIR.$file.'/'.$file.'.php')) { $lanlist[] = $file; } @@ -613,21 +617,69 @@ if(!$tmplan = getcachedvars('language-list')) $tmplan = implode(',', $lanlist); cachevars('language-list', $tmplan); } +// Save language flat list +define('e_LANLIST', $tmplan); -define('e_LANLIST', (isset($tmplan) ? $tmplan : '')); +// Set $language fallback to $pref['sitelanguage'] for the time being +$language = $pref['sitelanguage']; -$language=(isset($_COOKIE['e107language_'.e_COOKIE]) ? $_COOKIE['e107language_'.e_COOKIE] : ($pref['sitelanguage'] ? $pref['sitelanguage'] : 'English')); -$language = preg_replace('#\W#', '', $language); -define('USERLAN', ($user_language && (strpos(e_SELF, $PLUGINS_DIRECTORY) !== FALSE || (strpos(e_SELF, $ADMIN_DIRECTORY) === FALSE && file_exists(e_LANGUAGEDIR.$user_language."/lan_".e_PAGE)) || (strpos(e_SELF, $ADMIN_DIRECTORY) !== FALSE && file_exists(e_LANGUAGEDIR.$user_language."/admin/lan_".e_PAGE)) || file_exists(dirname($_SERVER['SCRIPT_FILENAME'])."/languages/".$user_language."/lan_".e_PAGE) || ( (strpos(e_SELF, $ADMIN_DIRECTORY) == FALSE) && (strpos(e_SELF, $PLUGINS_DIRECTORY) == FALSE) && file_exists(e_LANGUAGEDIR.$user_language.'/'.$user_language.'.php') ) ) ? $user_language : FALSE)); -define('e_LANGUAGE', (!USERLAN || !defined('USERLAN') ? $language : USERLAN)); +// Get user language choice +/// Force no multilingual sites to keep there preset languages? if (varset($pref['multilanguage'])) +{ + if ($pref['user_tracking'] == 'session') + { + $user_language = (array_key_exists('e107language_'.$pref['cookie_name'], $_SESSION) ? $_SESSION['e107language_'.$pref['cookie_name']] : ''); + } + else + { + $user_language= (isset($_COOKIE['e107language_'.$pref['cookie_name']])) ? $_COOKIE['e107language_'.$pref['cookie_name']] : ''; + } + // Strip $user_language + //TODO allow [a-z][A-Z][0-9]_ + $user_language = preg_replace('#\W#', '', $user_language); -e107_include(e_LANGUAGEDIR.e_LANGUAGE.'/'.e_LANGUAGE.'.php'); + // Is user language choice available? + if( ! in_array($user_language, $lanlist)) + { + // Reset session + if(array_key_exists('e107language_'.$pref['cookie_name'], $_SESSION)) + { + unset($_SESSION['e107language_'.$pref['cookie_name']]); + } + // Reset cookie + if(isset($_COOKIE['e107language_'.$pref['cookie_name']])) + { + unset($_COOKIE['e107language_'.$pref['cookie_name']]); + } + $user_language = ''; + } + else + { + $language = $user_language; + } + + // Ensure db got the proper language - default is empty + if (varset($pref['multilanguage'])) + { + $sql->mySQLlanguage = $user_language; + $sql2->mySQLlanguage = $user_language; + } +} + +// We should have the language by now +define('e_LANGUAGE', $language); + +// Keep USERLAN for backward compatibility +define('USERLAN', e_LANGUAGE); + +//TODO do it only once and with the proper function +e107_include_once(e_LANGUAGEDIR.e_LANGUAGE.'/'.e_LANGUAGE.'.php'); e107_include_once(e_LANGUAGEDIR.e_LANGUAGE."/".e_LANGUAGE.'_custom.php'); // Now we know the site CHARSET, define how to handle utf-8 as necessary $tp->initCharset(); -if($pref['sitelanguage'] != e_LANGUAGE && isset($pref['multilanguage']) && $pref['multilanguage'] && !$pref['multilanguage_subdomain']) +if($pref['sitelanguage'] != e_LANGUAGE && varset($pref['multilanguage']) && !$pref['multilanguage_subdomain']) { list($clc) = explode("_",CORE_LC); define('e_LAN', strtolower($clc)); diff --git a/e107_files/shortcode/languagelinks.sc b/e107_files/shortcode/languagelinks.sc index 0e81264ee..dc60ff0c0 100644 --- a/e107_files/shortcode/languagelinks.sc +++ b/e107_files/shortcode/languagelinks.sc @@ -1,43 +1,48 @@ -// $Id: languagelinks.sc,v 1.2 2007-10-30 23:34:01 e107coders Exp $ +//convert($languageFolder); + $name = $slng->toNative($languageFolder); + //$subdom = (isset($cursub[2])) ? $cursub[0] : ''; + + if(varset($pref['multilanguage_subdomain'])) { - $tmp = explode(",",$parm); + $code = ($languageFolder == $pref['sitelanguage']) ? 'www.' : $code; + $link = (e_QUERY) + ? str_replace($_SERVER['HTTP_HOST'], $code.'.'.e_DOMAIN, e_SELF).'?'.e_QUERY + : str_replace($_SERVER['HTTP_HOST'], $code.'.'.e_DOMAIN, e_SELF); } else { - $tmp = explode(",",e_LANLIST); - sort($tmp); + $link = (e_QUERY) ? e_SELF.'?['.$code.']'.e_QUERY : e_SELF.'?['.$code.']'; } + $class = ($languageFolder == e_LANGUAGE) ? 'languagelink_active' : 'languagelink'; + $ret[] = "\n{$name}"; +} - if(count($tmp) < 2) - { - return; - } - - foreach($tmp as $val) - { - $code = $lng->convert($val); - $name = $lng->toNative($val); - $subdom = (isset($cursub[2])) ? $cursub[0] : ""; - - if(isset($pref['multilanguage_subdomain']) && $pref['multilanguage_subdomain']){ - $link = (e_QUERY) ? str_replace($_SERVER['HTTP_HOST'],$code.".".e_DOMAIN,e_SELF)."?".e_QUERY : str_replace($_SERVER['HTTP_HOST'],$code.".".e_DOMAIN,e_SELF); - } - else{ - $link = (e_QUERY) ? e_SELF."?[".$code."]".e_QUERY : e_SELF."?[".$code."]"; - } - if(isset($pref['multilanguage_subdomain']) && $pref['multilanguage_subdomain'] && $val == $pref['sitelanguage']){ - $link = str_replace($code.".".e_DOMAIN,"www.".e_DOMAIN,$link); - } - $class = ($val == e_LANGUAGE) ? "languagelink_active" : "languagelink"; - $ret[] = "".$name."\n"; - } - -return implode($sep,$ret); \ No newline at end of file +return implode(LANGLINKS_SEPARATOR, $ret); \ No newline at end of file