Skip to content

Commit

Permalink
Merge branch 'MDL-69788' of https://github.com/paulholden/moodle
Browse files Browse the repository at this point in the history
  • Loading branch information
abgreeve committed Oct 22, 2020
2 parents 284d0ae + 7337934 commit a9ab6a1
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 2 deletions.
34 changes: 34 additions & 0 deletions 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 "<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$$ |
1 change: 1 addition & 0 deletions lang/en/error.php
Expand Up @@ -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})';
Expand Down
30 changes: 30 additions & 0 deletions lib/adminlib.php
Expand Up @@ -4933,6 +4933,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
*
Expand Down
15 changes: 13 additions & 2 deletions lib/classes/string_manager_standard.php
Expand Up @@ -533,7 +533,13 @@ public function get_list_of_translations($returnall = false) {
$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.
Expand Down Expand Up @@ -584,7 +590,12 @@ public function get_list_of_translations($returnall = false) {
}
}

return $languages;
// If there are no valid enabled translations, then return all languages.
if (!empty($languages)) {
return $languages;
} else {
return $cachedlist;
}
}

/**
Expand Down
7 changes: 7 additions & 0 deletions lib/tests/string_manager_standard_test.php
Expand Up @@ -140,6 +140,13 @@ public function test_get_list_of_translations() {

$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);
}
Expand Down

0 comments on commit a9ab6a1

Please sign in to comment.