MDL-8777 Failing setup_lang_from_browser if lang contains dash; user lang preference...
authorskodak <skodak>
Tue, 6 Mar 2007 23:51:34 +0000 (23:51 +0000)
committerskodak <skodak>
Tue, 6 Mar 2007 23:51:34 +0000 (23:51 +0000)
lib/moodlelib.php
login/index.php

index 1aaeab884caad0293f02e176af05ea30093ebe7c..38f494b5b10c9ad6a2c131c1edeca80585f82ede 100644 (file)
@@ -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
index dcfe41817c4f5bba1f9ed9211ff9e348b5149fd1..569f038956a2bb01acca2d5e50102aff0cb49a24 100644 (file)
@@ -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"));