From 18ceee5c2513a02f0eb2d00dfb7ee84b99c30478 Mon Sep 17 00:00:00 2001 From: skodak Date: Tue, 6 Mar 2007 23:51:34 +0000 Subject: [PATCH] MDL-8777 Failing setup_lang_from_browser if lang contains dash; user lang preference not respected --- lib/moodlelib.php | 28 +++++++++++++++++++++------- login/index.php | 10 ++++++++++ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/lib/moodlelib.php b/lib/moodlelib.php index 1aaeab884ca..38f494b5b10 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -6776,9 +6776,10 @@ function is_enabled_enrol($enrol='') { */ function setup_lang_from_browser() { - global $CFG, $SESSION; + global $CFG, $SESSION, $USER; - if (!empty($SESSION->lang)) { // Lang is defined in session, nothing to do + if (!empty($SESSION->lang) or !empty($USER->lang)) { + // Lang is defined in session or user profile, nothing to do return; } @@ -6787,14 +6788,27 @@ function setup_lang_from_browser() { } /// Extract and clean langs from headers - $langs = strtolower(clean_param($_SERVER['HTTP_ACCEPT_LANGUAGE'], PARAM_SAFEDIR)); /// Get String with basic clean - $langs = str_replace('-', '_', $langs); // we are using underscores - $langs = explode(',', $langs); /// Convert to array - $langs = array_unique($langs); /// Avoid duplicates + $rawlangs = $_SERVER['HTTP_ACCEPT_LANGUAGE']; + $rawlangs = str_replace('-', '_', $rawlangs); // we are using underscores + $rawlangs = explode(',', $rawlangs); // Convert to array + $langs = array(); + + $order = 1.0; + foreach ($rawlangs as $lang) { + if (strpos($lang, ';') === false) { + $langs[(string)$order] = $lang; + $order = $order-0.01; + } else { + $parts = explode(';', $lang); + $pos = strpos($parts[1], '='); + $langs[substr($parts[1], $pos+1)] = $parts[0]; + } + } + krsort($langs, SORT_NUMERIC); /// Look for such langs under standard locations foreach ($langs as $lang) { - $lang = $lang.'_utf8'; + $lang = clean_param($lang.'_utf8', PARAM_SAFEDIR); // clean it properly for include if (file_exists($CFG->dataroot .'/lang/'. $lang) or file_exists($CFG->dirroot .'/lang/'. $lang)) { $SESSION->lang = $lang; /// Lang exists, set it in session break; /// We have finished. Go out diff --git a/login/index.php b/login/index.php index dcfe41817c4..569f038956a 100644 --- a/login/index.php +++ b/login/index.php @@ -144,6 +144,16 @@ if (!isset($CFG->auth_instructions)) { if ($user) { + // language setup + if ($user->username == 'guest') { + // no predefined language for guests - use existing session or default site lang + unset($user->lang); + + } else if (!empty($user->lang)) { + // unset previous session language - use user preference instead + unset($SESSION->lang); + } + if (empty($user->confirmed)) { // This account was never confirmed print_header(get_string("mustconfirm"), get_string("mustconfirm") ); print_heading(get_string("mustconfirm"));