Merge branch 'MDL-69788' of https://github.com/paulholden/moodle
authorAdrian Greeve <abgreeve@gmail.com>
Thu, 22 Oct 2020 01:08:50 +0000 (09:08 +0800)
committerAdrian Greeve <abgreeve@gmail.com>
Thu, 22 Oct 2020 01:08:50 +0000 (09:08 +0800)
admin/tests/behat/language_settings.feature [new file with mode: 0644]
lang/en/error.php
lib/adminlib.php
lib/classes/string_manager_standard.php
lib/tests/string_manager_standard_test.php

diff --git a/admin/tests/behat/language_settings.feature b/admin/tests/behat/language_settings.feature
new file mode 100644 (file)
index 0000000..6d00ebe
--- /dev/null
@@ -0,0 +1,34 @@
+@core @core_admin
+Feature: Configure language settings for the site
+  In order to configure language settings for the site
+  As an admin
+  I want to set language settings relevant to my site users
+
+  Scenario: Set languages on language menu
+    Given I log in as "admin"
+    And I navigate to "Language > Language settings" in site administration
+    When I set the field "Languages on language menu" to "en"
+    And I press "Save changes"
+    Then I should not see "Invalid language code"
+
+  Scenario: Reset languages on language menu
+    Given I log in as "admin"
+    And I navigate to "Language > Language settings" in site administration
+    When I set the field "Languages on language menu" to ""
+    And I press "Save changes"
+    Then I should not see "Invalid language code"
+
+  Scenario Outline: Set languages on language menu with invalid language
+    Given I log in as "admin"
+    And I navigate to "Language > Language settings" in site administration
+    When I set the field "Languages on language menu" to "<fieldvalue>"
+    And I press "Save changes"
+    Then I should see "Invalid language code: <invalidlang>"
+    Examples:
+      | fieldvalue | invalidlang |
+      | xx         | xx          |
+      | xx\|Bad    | xx          |
+      | en,qq      | qq          |
+      | en,qq\|Bad | qq          |
+      | en$$       | en$$        |
+      | en$$\|Bad  | en$$        |
index f8d5b9b..ef16de3 100644 (file)
@@ -341,6 +341,7 @@ $string['invalidgroupid'] = 'Incorrect group ID specified';
 $string['invalidipformat'] = 'Invalid IP address format';
 $string['invaliditemid'] = 'Incorrect item ID';
 $string['invalidkey'] = 'Incorrect key';
+$string['invalidlanguagecode'] = 'Invalid language code: {$a}';
 $string['invalidlegacy'] = 'Incorrect legacy role definition for type: {$a}';
 $string['invalidmd5'] = 'The check variable was wrong - try again';
 $string['invalidmode'] = 'Invalid mode ({$a})';
index 4d55c9f..f51f740 100644 (file)
@@ -4933,6 +4933,36 @@ class admin_setting_langlist extends admin_setting_configtext {
         parent::__construct('langlist', get_string('langlist', 'admin'), get_string('configlanglist', 'admin'), '', PARAM_NOTAGS);
     }
 
+    /**
+     * Validate that each language identifier exists on the site
+     *
+     * @param string $data
+     * @return bool|string True if validation successful, otherwise error string
+     */
+    public function validate($data) {
+        $parentcheck = parent::validate($data);
+        if ($parentcheck !== true) {
+            return $parentcheck;
+        }
+
+        if ($data === '') {
+            return true;
+        }
+
+        // Normalize language identifiers.
+        $langcodes = array_map('trim', explode(',', $data));
+        foreach ($langcodes as $langcode) {
+            // If the langcode contains optional alias, split it out.
+            [$langcode, ] = preg_split('/\s*\|\s*/', $langcode, 2);
+
+            if (!get_string_manager()->translation_exists($langcode)) {
+                return get_string('invalidlanguagecode', 'error', $langcode);
+            }
+        }
+
+        return true;
+    }
+
     /**
      * Save the new setting
      *
index 1a3f364..140ba65 100644 (file)
@@ -533,7 +533,13 @@ class core_string_manager_standard implements core_string_manager {
                     $languages[$langcode] = !empty($this->transaliases[$langcode]) ? $this->transaliases[$langcode] : $langname;
                 }
             }
-            return $languages;
+
+            // If there are no valid enabled translations, then return all languages.
+            if (!empty($languages)) {
+                return $languages;
+            } else {
+                return $cachedlist;
+            }
         }
 
         // Get all languages available in system.
@@ -584,7 +590,12 @@ class core_string_manager_standard implements core_string_manager {
             }
         }
 
-        return $languages;
+        // If there are no valid enabled translations, then return all languages.
+        if (!empty($languages)) {
+            return $languages;
+        } else {
+            return $cachedlist;
+        }
     }
 
     /**
index aa73a0e..c167707 100644 (file)
@@ -140,6 +140,13 @@ class core_string_manager_standard_testcase extends advanced_testcase {
 
         $this->assertEquals(['en' => 'En'], $stringman->get_list_of_translations());
 
+        // Set invalid config, ensure original list is returned.
+        set_config('langlist', 'xx');
+        $this->assertEquals(['en' => 'English ‎(en)‎'], get_string_manager(true)->get_list_of_translations());
+
+        set_config('langlist', 'xx,en|En');
+        $this->assertEquals(['en' => 'En'], get_string_manager(true)->get_list_of_translations());
+
         set_config('langlist', '');
         get_string_manager(true);
     }