MDL-15252 language list refactoring
authorPetr Skoda <skodak@moodle.org>
Sat, 10 Apr 2010 21:22:15 +0000 (21:22 +0000)
committerPetr Skoda <skodak@moodle.org>
Sat, 10 Apr 2010 21:22:15 +0000 (21:22 +0000)
admin/cli/install.php
install.php
lib/db/upgrade.php
lib/installlib.php
lib/moodlelib.php

index b71a3d7..1aa0287 100644 (file)
@@ -190,7 +190,7 @@ echo get_string('cliinstallheader', 'install', $CFG->target_release)."\n";
 //Fist select language
 if ($interactive) {
     cli_separator();
-    $languages = install_get_list_of_languages();
+    $languages = get_list_of_languages();
     // format the langs nicely - 3 per line
     $c = 0;
     $langlist = '';
index 28a0e77..71b91f5 100644 (file)
@@ -603,7 +603,7 @@ if ($distro) {
                                   get_string('chooselanguagesub', 'install'));
 }
 
-$languages = install_get_list_of_languages();
+$languages = get_list_of_languages();
 echo '<div class="userinput">';
 echo '<div class="formrow"><label class="formlabel" for="langselect">'.get_string('language').'</label>';
 echo '<select id="langselect" name="lang" class="forminput" onchange="this.form.submit()">';
index d68269f..8b406be 100644 (file)
@@ -3468,6 +3468,16 @@ WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
             set_config('lang', $lang);
         }
 
+        // tweak langlist
+        if (!empty($CFG->langlist)) {
+            $langs = explode(',', $CFG->langlist);
+            foreach ($langs as $key=>$lang) {
+                $lang = str_replace('_utf8', '', $lang);
+                $langs[$key] = $lang;
+            }
+            set_config('langlist', implode(',', $langs));
+        }
+
         // Main savepoint reached
         upgrade_main_savepoint($result, 2010040900);
     }
index 323a1b1..1dbb55b 100644 (file)
@@ -123,36 +123,6 @@ function install_db_validate($database, $dbhost, $dbuser, $dbpass, $dbname, $pre
     }
 }
 
-/**
- * This function returns a list of languages and their full names. The
- * list of available languages is fetched from install/lang/xx/installer.php
- * and it's used exclusively by the installation process
- *
- * @global object
- * @return array An associative array with contents in the form of LanguageCode => LanguageName
- */
-function install_get_list_of_languages() {
-    global $CFG;
-
-    $languages = array();
-
-    // Get raw list of lang directories
-    $langdirs = get_list_of_plugins('install/lang');
-    asort($langdirs);
-    // Get some info from each lang
-    foreach ($langdirs as $lang) {
-        if (file_exists($CFG->dirroot.'/install/lang/'.$lang.'/installer.php')) {
-            $string = array();
-            include($CFG->dirroot.'/install/lang/'.$lang.'/installer.php');
-            if (!empty($string['thislanguage'])) {
-                $languages[$lang] = $string['thislanguage'].' ('.$lang.')';
-            }
-        }
-    }
-    // Return array
-    return $languages;
-}
-
 /**
  * Returns content of config.php file.
  * @param moodle_database $database database instance
index aaef17c..2e7c1d1 100644 (file)
@@ -5702,12 +5702,20 @@ interface string_manager {
      * @return array two-letter country code => translated name.
      */
     public function get_list_of_countries();
+
+    /**
+     * Returns localised list of installed languages
+     * @param bool $returnall return all or just enabled
+     */
+    public function get_list_of_languages($returnall = false);
 }
 
 
 /**
  * Low level string getching implementation.
  *
+ * TODO: implement lang precompilation
+ *
  * @package    moodlecore
  * @copyright  2010 Petr Skoda (http://skodak.org)
  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
@@ -5934,6 +5942,59 @@ class amos_string_manager implements string_manager {
         $lang = current_language();
         return $this->load_component_strings('countries', $lang);
     }
+
+    /**
+     * Returns localised list of installed languages
+     * @param bool $returnall return all or just enabled
+     */
+    public function get_list_of_languages($returnall = false) {
+        global $CFG;
+
+        $languages = array();
+
+        if (!$returnall && !empty($CFG->langlist)) {
+            // return only languages allowed in langlist admin setting
+            $langlist = explode(',', $CFG->langlist);
+            // find existing langs from langlist
+            foreach ($langlist as $lang) {
+                $lang = trim($lang);   //Just trim spaces to be a bit more permissive
+                if (strstr($lang, '_local') !== false) {
+                    continue;
+                }
+                if ($lang !== 'en' and !file_exists("$this->otherroot/$lang/langconfig.php")) {
+                    // some broken or missing lang - can not swith to it anyway
+                    continue;
+                }
+                $string = $this->load_component_strings('langconfig', $lang);
+                if (!empty($string['thislanguage'])) {
+                    $languages[$lang] = $string['thislanguage'].' ('. $lang .')';
+                }
+                unset($string);
+            }
+
+        } else {
+            // return all languages available in system
+            $langdirs = get_list_of_plugins('', '', $this->otherroot);
+
+            $langdirs = array_merge($langdirs, array("$CFG->dirroot/lang/en"=>'en'));
+            // Sort all
+
+            asort($langdirs);
+            // Loop through all langs and get info
+            foreach ($langdirs as $lang) {
+                if (strstr($lang, '_local') !== false) {
+                    continue;
+                }
+                $string = $this->load_component_strings('langconfig', $lang);
+                if (!empty($string['thislanguage'])) {
+                    $languages[$lang] = $string['thislanguage'].' ('. $lang .')';
+                }
+                unset($string);
+            }
+        }
+
+        return $languages;
+    }
 }
 
 
@@ -6016,6 +6077,30 @@ class install_string_manager implements string_manager {
     public function get_list_of_countries() {
         return array();
     }
+
+    /**
+     * Returns localised list of installed languages
+     * @param bool $returnall return all or just enabled
+     */
+    public function get_list_of_languages($returnall = false) {
+        // return all is ignored here - we need to know all langs in installer
+        $languages = array();
+        // Get raw list of lang directories
+        $langdirs = get_list_of_plugins('install/lang');
+        asort($langdirs);
+        // Get some info from each lang
+        foreach ($langdirs as $lang) {
+            if (file_exists($this->installroot.'/'.$lang.'/installer.php')) {
+                $string = array();
+                include($this->installroot.'/'.$lang.'/installer.php');
+                if (!empty($string['thislanguage'])) {
+                    $languages[$lang] = $string['thislanguage'].' ('.$lang.')';
+                }
+            }
+        }
+        // Return array
+        return $languages;
+    }
 }
 
 
@@ -6159,105 +6244,11 @@ function print_string($identifier, $component = '', $a = NULL) {
  */
 function get_list_of_languages($refreshcache=false, $returnall=false) {
 
-    global $CFG;
-
-    $languages = array();
-
-    $filetocheck = 'langconfig.php';
-
-    if (!$refreshcache && !$returnall && !empty($CFG->langcache) && file_exists($CFG->dataroot .'/cache/languages')) {
-/// read available langs from cache
-
-        $lines = file($CFG->dataroot .'/cache/languages');
-        foreach ($lines as $line) {
-            $line = trim($line);
-            if (preg_match('/^(\w+)\s+(.+)/', $line, $matches)) {
-                $languages[$matches[1]] = $matches[2];
-            }
-        }
-        unset($lines); unset($line); unset($matches);
-        return $languages;
-    }
-
-    if (!$returnall && !empty($CFG->langlist)) {
-/// return only languages allowed in langlist admin setting
-
-        $langlist = explode(',', $CFG->langlist);
-        // find existing langs from langlist
-        foreach ($langlist as $lang) {
-            $lang = trim($lang);   //Just trim spaces to be a bit more permissive
-            if (strstr($lang, '_local')!==false) {
-                continue;
-            }
-        /// Search under dirroot/lang
-            if (file_exists($CFG->dirroot .'/lang/'. $lang .'/'. $filetocheck)) {
-                include($CFG->dirroot .'/lang/'. $lang .'/'. $filetocheck);
-                if (!empty($string['thislanguage'])) {
-                    $languages[$lang] = $string['thislanguage'].' ('. $lang .')';
-                }
-                unset($string);
-            }
-        /// And moodledata/lang
-            if (file_exists($CFG->dataroot .'/lang/'. $lang .'/'. $filetocheck)) {
-                include($CFG->dataroot .'/lang/'. $lang .'/'. $filetocheck);
-                if (!empty($string['thislanguage'])) {
-                    $languages[$lang] = $string['thislanguage'].' ('. $lang .')';
-                }
-                unset($string);
-            }
-        }
-
-    } else {
-/// return all languages available in system
-    /// Fetch langs from moodle/lang directory
-        $langdirs = get_list_of_plugins('lang');
-    /// Fetch langs from moodledata/lang directory
-        $langdirs2 = get_list_of_plugins('lang', '', $CFG->dataroot);
-    /// Merge both lists of langs
-        $langdirs = array_merge($langdirs, $langdirs2);
-    /// Sort all
-        asort($langdirs);
-    /// Get some info from each lang (first from moodledata, then from moodle)
-        foreach ($langdirs as $lang) {
-            if (strstr($lang, '_local')!==false) {
-                continue;
-            }
-        /// Search under moodledata/lang
-            if (file_exists($CFG->dataroot .'/lang/'. $lang .'/'. $filetocheck)) {
-                include($CFG->dataroot .'/lang/'. $lang .'/'. $filetocheck);
-                if (!empty($string['thislanguage'])) {
-                    $languages[$lang] = $string['thislanguage'] .' ('. $lang .')';
-                }
-                unset($string);
-            }
-        /// And dirroot/lang
-            if (file_exists($CFG->dirroot .'/lang/'. $lang .'/'. $filetocheck)) {
-                include($CFG->dirroot .'/lang/'. $lang .'/'. $filetocheck);
-                if (!empty($string['thislanguage'])) {
-                    $languages[$lang] = $string['thislanguage'] .' ('. $lang .')';
-                }
-                unset($string);
-            }
-        }
-    }
-
-    if ($refreshcache && !empty($CFG->langcache)) {
-        if ($returnall) {
-            // we have a list of all langs only, just delete old cache
-            @unlink($CFG->dataroot.'/cache/languages');
-
-        } else {
-            // store the list of allowed languages
-            if ($file = fopen($CFG->dataroot .'/cache/languages', 'w')) {
-                foreach ($languages as $key => $value) {
-                    fwrite($file, "$key $value\n");
-                }
-                fclose($file);
-            }
-        }
+    if ($refreshcache) {
+        // TODO: reimplement caching?; this may not be necessary if we implement lang pack precompilation in dataroot
     }
 
-    return $languages;
+    return get_string_manager()->get_list_of_languages($returnall);
 }
 
 /**