mirrored from git://git.moodle.org/moodle.git
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
MDL-62728 lang: display a warning when missing some locales on server
- Loading branch information
Showing
5 changed files
with
195 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
<?php | ||
// This file is part of Moodle - http://moodle.org/ | ||
// | ||
// Moodle is free software: you can redistribute it and/or modify | ||
// it under the terms of the GNU General Public License as published by | ||
// the Free Software Foundation, either version 3 of the License, or | ||
// (at your option) any later version. | ||
// | ||
// Moodle is distributed in the hope that it will be useful, | ||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
// GNU General Public License for more details. | ||
// | ||
// You should have received a copy of the GNU General Public License | ||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. | ||
|
||
/** | ||
* Helper class for the language import tool. | ||
* | ||
* @package tool_langimport | ||
* @copyright 2018 Université Rennes 2 {@link https://www.univ-rennes2.fr} | ||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | ||
*/ | ||
|
||
namespace tool_langimport; | ||
|
||
use coding_exception; | ||
|
||
defined('MOODLE_INTERNAL') || die; | ||
|
||
/** | ||
* Helper class for the language import tool. | ||
* | ||
* @copyright 2018 Université Rennes 2 {@link https://www.univ-rennes2.fr} | ||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | ||
*/ | ||
class locale { | ||
/** | ||
* Checks availability of locale on current operating system. | ||
* | ||
* @param string $langpackcode E.g.: en, es, fr, de. | ||
* @return bool TRUE if the locale is available on OS. | ||
* @throws coding_exception when $langpackcode parameter is a non-empty string. | ||
*/ | ||
public function check_locale_availability(string $langpackcode) : bool { | ||
global $CFG; | ||
|
||
if (empty($langpackcode)) { | ||
throw new coding_exception('Invalid language pack code in \\'.__METHOD__.'() call, only non-empty string is allowed'); | ||
} | ||
|
||
// Fetch the correct locale based on ostype. | ||
if ($CFG->ostype === 'WINDOWS') { | ||
$stringtofetch = 'localewin'; | ||
} else { | ||
$stringtofetch = 'locale'; | ||
} | ||
|
||
// Store current locale. | ||
$currentlocale = $this->set_locale(LC_ALL, 0); | ||
|
||
$locale = get_string_manager()->get_string($stringtofetch, 'langconfig', $a = null, $langpackcode); | ||
|
||
// Try to set new locale. | ||
$return = $this->set_locale(LC_ALL, $locale); | ||
|
||
// Restore current locale. | ||
$this->set_locale(LC_ALL, $currentlocale); | ||
|
||
// If $return is not equal to false, it means that setlocale() succeed to change locale. | ||
return $return !== false; | ||
} | ||
|
||
/** | ||
* Wrap for the native PHP function setlocale(). | ||
* | ||
* @param int $category Specifying the category of the functions affected by the locale setting. | ||
* @param string $locale E.g.: en_AU.utf8, en_GB.utf8, es_ES.utf8, fr_FR.utf8, de_DE.utf8. | ||
* @return string|false Returns the new current locale, or FALSE on error. | ||
*/ | ||
protected function set_locale(int $category = LC_ALL, string $locale = '0') { | ||
return setlocale($category, $locale); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
<?php | ||
// This file is part of Moodle - http://moodle.org/ | ||
// | ||
// Moodle is free software: you can redistribute it and/or modify | ||
// it under the terms of the GNU General Public License as published by | ||
// the Free Software Foundation, either version 3 of the License, or | ||
// (at your option) any later version. | ||
// | ||
// Moodle is distributed in the hope that it will be useful, | ||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
// GNU General Public License for more details. | ||
// | ||
// You should have received a copy of the GNU General Public License | ||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. | ||
|
||
/** | ||
* Tests for \tool_langimport\locale class. | ||
* | ||
* @package tool_langimport | ||
* @copyright 2018 Université Rennes 2 {@link https://www.univ-rennes2.fr} | ||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | ||
*/ | ||
|
||
defined('MOODLE_INTERNAL') || die(); | ||
|
||
/** | ||
* Tests for \tool_langimport\locale class. | ||
* | ||
* @copyright 2018 Université Rennes 2 {@link https://www.univ-rennes2.fr} | ||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | ||
*/ | ||
class locale_testcase extends \advanced_testcase { | ||
/** | ||
* Test that \tool_langimport\locale::check_locale_availability() works as expected. | ||
* | ||
* @return void | ||
*/ | ||
public function test_check_locale_availability() { | ||
// Create a mock of set_locale() method to simulate : | ||
// - first setlocale() call which backup current locale | ||
// - second setlocale() call which try to set new 'es' locale | ||
// - third setlocale() call which restore locale. | ||
$mock = $this->getMockBuilder(\tool_langimport\locale::class) | ||
->setMethods(['set_locale']) | ||
->getMock(); | ||
$mock->method('set_locale')->will($this->onConsecutiveCalls('en', 'es', 'en')); | ||
|
||
// Test what happen when locale is available on system. | ||
$result = $mock->check_locale_availability('en'); | ||
$this->assertTrue($result); | ||
|
||
// Create a mock of set_locale() method to simulate : | ||
// - first setlocale() call which backup current locale | ||
// - second setlocale() call which fail to set new locale | ||
// - third setlocale() call which restore locale. | ||
$mock = $this->getMockBuilder(\tool_langimport\locale::class) | ||
->setMethods(['set_locale']) | ||
->getMock(); | ||
$mock->method('set_locale')->will($this->onConsecutiveCalls('en', false, 'en')); | ||
|
||
// Test what happen when locale is not available on system. | ||
$result = $mock->check_locale_availability('en'); | ||
$this->assertFalse($result); | ||
|
||
// Test an invalid parameter. | ||
$locale = new \tool_langimport\locale(); | ||
$this->expectException(coding_exception::class); | ||
$locale->check_locale_availability(''); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters