diff --git a/public_html/switchlang.php b/public_html/switchlang.php
index 6f57cb81a..adac5f26d 100644
--- a/public_html/switchlang.php
+++ b/public_html/switchlang.php
@@ -38,32 +38,26 @@
* Switch language in a URL.
*
* @param string $url current URL
-* @param string $newlang new language to switch to
-* @param string $oldlang old, i.e. current language
+* @param string $newLang new language to switch to
+* @param string $oldLang old, i.e. current language
* @return string new URL after the language switch
-*
*/
-function switch_language($url, $newlang, $oldlang)
+function switch_language($url, $newLang, $oldLang)
{
global $_CONF;
- $retval = '';
-
- if (empty($newlang) || empty($oldlang) ||
- (strlen($newlang) !== strlen($oldlang))) {
+ if (empty($newLang) || empty($oldLang) || (strlen($newLang) !== strlen($oldLang))) {
return $url;
}
- $lang_len = strlen($oldlang);
+ $lang_len = strlen($oldLang);
$url_rewrite = false;
$q = false;
if ($_CONF['url_rewrite']) {
// check for "rewritten" URLs with a '?', e.g. search query highlighting
$q = strpos($url, '?');
- if ($q === false) {
- $url_rewrite = true;
- } elseif (substr($url, $q - 4, 4) !== '.php') {
+ if (($q === false) || (substr($url, $q - 4, 4) !== '.php')) {
$url_rewrite = true;
}
}
@@ -80,9 +74,8 @@ function switch_language($url, $newlang, $oldlang)
if (substr($p[$i], -4) === '.php') {
// found the script name - assume next parameter is the ID
if (isset($p[$i + 1])) {
- if (substr($p[$i + 1], -($lang_len + 1)) === '_' . $oldlang) {
- $p[$i + 1] = substr_replace($p[$i + 1], $newlang,
- -$lang_len);
+ if (substr($p[$i + 1], -($lang_len + 1)) === '_' . $oldLang) {
+ $p[$i + 1] = substr_replace($p[$i + 1], $newLang, -$lang_len);
$changed = true;
}
}
@@ -92,17 +85,15 @@ function switch_language($url, $newlang, $oldlang)
if ($changed) {
// merge the pieces back together
- if ($q === false) {
- $url = implode('/', $p);
- } else {
- $url = implode('/', $p) . substr($url, $q);
- }
+ $url = ($q === false)
+ ? implode('/', $p)
+ : implode('/', $p) . substr($url, $q);
}
$retval = $url;
} else { // URL contains '?' or '&'
$url = explode('&', $url);
- $urlpart = $url[0];
+ $urlPart = $url[0];
if (count($url) > 1) {
array_shift($url);
$extra_vars = '&' . implode('&', $url);
@@ -110,11 +101,11 @@ function switch_language($url, $newlang, $oldlang)
$extra_vars = '';
}
- if (substr($urlpart, -($lang_len + 1)) === '_' . $oldlang) {
- $urlpart = substr_replace($urlpart, $newlang, -$lang_len);
+ if (substr($urlPart, -($lang_len + 1)) === '_' . $oldLang) {
+ $urlPart = substr_replace($urlPart, $newLang, -$lang_len);
}
- $retval = $urlpart . $extra_vars;
+ $retval = $urlPart . $extra_vars;
}
return $retval;
@@ -122,10 +113,9 @@ function switch_language($url, $newlang, $oldlang)
// MAIN
$ret_url = '';
-if (isset($_SERVER['HTTP_REFERER'])) {
- if (strpos($_SERVER['HTTP_REFERER'], $_CONF['site_url']) !== false) {
- $ret_url = $_SERVER['HTTP_REFERER'];
- }
+if (isset($_SERVER['HTTP_REFERER']) &&
+ (strpos($_SERVER['HTTP_REFERER'], $_CONF['site_url']) !== false)) {
+ $ret_url = $_SERVER['HTTP_REFERER'];
}
// if not allowed, just ignore and return
@@ -134,30 +124,38 @@ function switch_language($url, $newlang, $oldlang)
$lang = strtolower(COM_applyFilter(COM_getArgument('lang')));
$lang = preg_replace('/[^a-z0-9\-_]/', '', $lang);
- $oldlang = COM_getLanguageId();
+ $oldLang = COM_getLanguageId();
+
+ // Code provided by hiroron
+ if ($lang === $oldLang) {
+ $langFromUrl = COM_getLanguageFromURL($ret_url);
+ $oldLang = empty($langFromUrl) ? $oldLang : $langFromUrl;
+ }
// do we really have a new language to switch to?
if (!empty($lang) && array_key_exists($lang, $_CONF['language_files'])) {
// does such a language file exist?
- $langfile = $_CONF['language_files'][$lang];
- if (is_file($_CONF['path_language'] . $langfile . '.php')) {
+ $langFile = $_CONF['language_files'][$lang];
+
+ if (is_file($_CONF['path_language'] . $langFile . '.php')) {
// Set the language cookie.
// Mainly used for anonymous users so the rest of their session
// will remain in the selected language
- setcookie($_CONF['cookie_language'], $langfile, time() + 31536000,
- $_CONF['cookie_path'], $_CONF['cookiedomain'],
- $_CONF['cookiesecure']);
+ setcookie(
+ $_CONF['cookie_language'], $langFile, time() + 31536000,
+ $_CONF['cookie_path'], $_CONF['cookiedomain'], $_CONF['cookiesecure']
+ );
// if user is not anonymous, store the preference in the database
if (!COM_isAnonUser()) {
- DB_query("UPDATE {$_TABLES['users']} SET language = '{$langfile}' WHERE uid = {$_USER['uid']}");
+ DB_query("UPDATE {$_TABLES['users']} SET language = '" . DB_escapeString($langFile) . "' WHERE uid = {$_USER['uid']}");
}
}
}
// Change the language ID if needed
- if (!empty($ret_url) && !empty($lang) && !empty($oldlang)) {
- $ret_url = switch_language($ret_url, $lang, $oldlang);
+ if (!empty($ret_url) && !empty($lang) && !empty($oldLang)) {
+ $ret_url = switch_language($ret_url, $lang, $oldLang);
}
}