MDL-46585 lang: display debugging message when deprecated string is used
[moodle.git] / lib / classes / string_manager_standard.php
index 7ec3708..6482c67 100644 (file)
@@ -47,6 +47,8 @@ class core_string_manager_standard implements core_string_manager {
     protected $translist;
     /** @var cache stores list of available translations */
     protected $menucache;
+    /** @var array list of cached deprecated strings */
+    protected $cacheddeprecated;
 
     /**
      * Create new instance of string manager
@@ -206,6 +208,57 @@ class core_string_manager_standard implements core_string_manager {
         return $string;
     }
 
+    /**
+     * Parses all deprecated.txt in all plugins lang locations and returns the list of deprecated strings.
+     *
+     * Static variable is used for caching, this function is only called in dev environment.
+     *
+     * @return array of deprecated strings in the same format they appear in deprecated.txt files: "identifier,component"
+     *     where component is a normalised component (i.e. "core_moodle", "mod_assign", etc.)
+     */
+    protected function load_deprecated_strings() {
+        global $CFG;
+
+        if ($this->cacheddeprecated !== null) {
+            return $this->cacheddeprecated;
+        }
+
+        $this->cacheddeprecated = array();
+        $content = '';
+        $filename = $CFG->dirroot . '/lang/en/deprecated.txt';
+        if (file_exists($filename)) {
+            $content .= file_get_contents($filename);
+        }
+        foreach (core_component::get_plugin_types() as $plugintype => $plugintypedir) {
+            foreach (core_component::get_plugin_list($plugintype) as $pluginname => $plugindir) {
+                $filename = $plugindir.'/lang/en/deprecated.txt';
+                if (file_exists($filename)) {
+                    $content .= "\n". file_get_contents($filename);
+                }
+            }
+        }
+
+        $strings = preg_split('/\s*\n\s*/', $content, -1, PREG_SPLIT_NO_EMPTY);
+        $this->cacheddeprecated = array_flip($strings);
+
+        return $this->cacheddeprecated;
+    }
+
+    /**
+     * Has string been deprecated?
+     *
+     * Usually checked only inside get_string() to display debug warnings.
+     *
+     * @param string $identifier The identifier of the string to search for
+     * @param string $component The module the string is associated with
+     * @return bool true if deprecated
+     */
+    public function string_deprecated($identifier, $component) {
+        $deprecated = $this->load_deprecated_strings();
+        list($plugintype, $pluginname) = core_component::normalize_component($component);
+        return isset($deprecated[$identifier . ',' . $plugintype . '_' . $pluginname]);
+    }
+
     /**
      * Does the string actually exist?
      *
@@ -234,6 +287,8 @@ class core_string_manager_standard implements core_string_manager {
      * @return string The String !
      */
     public function get_string($identifier, $component = '', $a = null, $lang = null) {
+        global $CFG;
+
         $this->countgetstring++;
         // There are very many uses of these time formatting strings without the 'langconfig' component,
         // it would not be reasonable to expect that all of them would be converted during 2.0 migration.
@@ -279,7 +334,7 @@ class core_string_manager_standard implements core_string_manager {
             // Devs need to learn to purge all caches after any change or disable $CFG->langstringcache.
             if (!isset($string[$identifier])) {
                 // The string is still missing - should be fixed by developer.
-                if (debugging('', DEBUG_DEVELOPER)) {
+                if ($CFG->debugdeveloper) {
                     list($plugintype, $pluginname) = core_component::normalize_component($component);
                     if ($plugintype === 'core') {
                         $file = "lang/en/{$component}.php";
@@ -324,6 +379,16 @@ class core_string_manager_standard implements core_string_manager {
             }
         }
 
+        if ($CFG->debugdeveloper) {
+            // Display a debugging message if sting exists but was deprecated.
+            if ($this->string_deprecated($identifier, $component)) {
+                list($plugintype, $pluginname) = core_component::normalize_component($component);
+                debugging("String [{$identifier},{$plugintype}_{$pluginname}] is deprecated. ".
+                    'Either you should no longer be using that string, or the string has been incorrectly deprecated, in which case you should report this as a bug. '.
+                    'Please refer to https://docs.moodle.org/dev/String_deprecation', DEBUG_DEVELOPER);
+            }
+        }
+
         return $string;
     }