From c651779095c853d54da93c3087c780e8d286072d Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Fri, 16 Oct 2020 08:59:53 +0100 Subject: [PATCH] MDL-69788 admin: validate language menu configuration. --- admin/tests/behat/language_settings.feature | 34 +++++++++++++++++++++ lang/en/error.php | 1 + lib/adminlib.php | 30 ++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 admin/tests/behat/language_settings.feature diff --git a/admin/tests/behat/language_settings.feature b/admin/tests/behat/language_settings.feature new file mode 100644 index 0000000000000..6d00ebecdd690 --- /dev/null +++ b/admin/tests/behat/language_settings.feature @@ -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 "" + And I press "Save changes" + Then I should see "Invalid language code: " + Examples: + | fieldvalue | invalidlang | + | xx | xx | + | xx\|Bad | xx | + | en,qq | qq | + | en,qq\|Bad | qq | + | en$$ | en$$ | + | en$$\|Bad | en$$ | diff --git a/lang/en/error.php b/lang/en/error.php index e8dacc86886b5..dcdca0c6ccc97 100644 --- a/lang/en/error.php +++ b/lang/en/error.php @@ -341,6 +341,7 @@ $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})'; diff --git a/lib/adminlib.php b/lib/adminlib.php index 29889c777c049..83f1c0583db53 100644 --- a/lib/adminlib.php +++ b/lib/adminlib.php @@ -4887,6 +4887,36 @@ public function __construct() { 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 *