* Install language packs provided
*
* @param string|array $langs array of langcodes or individual langcodes
+ * @param bool $updating true if updating the langpacks
* @return int false if an error encountered or
* @throws \moodle_exception when error is encountered installing langpack
*/
- public function install_languagepacks($langs) {
+ public function install_languagepacks($langs, $updating = false) {
global $CFG;
$this->installer->set_queue($langs);
throw new \moodle_exception('remotedownloaderror', 'error', $a);
break;
case \lang_installer::RESULT_INSTALLED:
- $this->info[] = get_string('langpackinstalled', 'tool_langimport', $langcode);
$updatedpacks++;
+ if ($updating) {
+ event\langpack_updated::event_with_langcode($langcode)->trigger();
+ $this->info[] = get_string('langpackupdated', 'tool_langimport', $langcode);
+ } else {
+ $this->info[] = get_string('langpackinstalled', 'tool_langimport', $langcode);
+ event\langpack_imported::event_with_langcode($langcode)->trigger();
+ }
break;
case \lang_installer::RESULT_UPTODATE:
$this->info[] = get_string('langpackuptodate', 'tool_langimport', $langcode);
if ($rm1 or $rm2) {
$this->info[] = get_string('langpackremoved', 'tool_langimport', $lang);
+ event\langpack_removed::event_with_langcode($lang)->trigger();
return true;
} else { // Nothing deleted, possibly due to permission error.
$this->errors[] = 'An error has occurred, language pack is not completely uninstalled, please check file permissions';
}
try {
- $updated = $this->install_languagepacks($neededlangs);
+ $updated = $this->install_languagepacks($neededlangs, true);
} catch (\moodle_exception $e) {
return false;
}
--- /dev/null
+<?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/>.
+
+/**
+ * The langimport langpack imported event.
+ *
+ * @package tool_langimport
+ * @copyright 2014 Dan Poltawski <dan@moodle.com>
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace tool_langimport\event;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * The tool_langimport langpack imported event class.
+ *
+ * @property-read array $other {
+ * Extra information about event.
+ *
+ * - string langcode: the langpage pack code.
+ * }
+ *
+ * @package tool_langimport
+ * @copyright 2014 Dan Poltawski <dan@moodle.com>
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class langpack_imported extends \core\event\base {
+ /**
+ * Create instance of event.
+ *
+ * @param string $langcode
+ * @return langpack_updated
+ */
+ public static function event_with_langcode($langcode) {
+ $data = array(
+ 'context' => \context_system::instance(),
+ 'other' => array(
+ 'langcode' => $langcode,
+ )
+ );
+
+ return self::create($data);
+ }
+
+ /**
+ * Init method.
+ *
+ * @return void
+ */
+ protected function init() {
+ $this->data['crud'] = 'c';
+ $this->data['edulevel'] = self::LEVEL_OTHER;
+ }
+
+ /**
+ * Returns description of what happened.
+ *
+ * @return string
+ */
+ public function get_description() {
+ return "The language pack '{$this->other['langcode']}' was installed.";
+ }
+
+ /**
+ * Return localised event name.
+ *
+ * @return string
+ */
+ public static function get_name() {
+ return get_string('langpackinstalledevent', 'tool_langimport');
+ }
+
+ /**
+ * Returns relevant URL.
+ *
+ * @return \moodle_url
+ */
+ public function get_url() {
+ return new \moodle_url('/admin/tool/langimport/');
+ }
+
+ /**
+ * Custom validation.
+ *
+ * @throws \coding_exception
+ */
+ protected function validate_data() {
+ parent::validate_data();
+
+ if (!isset($this->other['langcode'])) {
+ throw new \coding_exception('The \'langcode\' value must be set');
+ }
+ // We can't use PARAM_LANG here as the string manager might not be aware of langpack yet.
+ $cleanedlang = clean_param($this->other['langcode'], PARAM_SAFEDIR);
+ if ($cleanedlang !== $this->other['langcode']) {
+ throw new \coding_exception('The \'langcode\' value must be set to a valid language code');
+ }
+ }
+}
--- /dev/null
+<?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/>.
+
+/**
+ * The langimport langpack removed event.
+ *
+ * @package tool_langimport
+ * @copyright 2014 Dan Poltawski <dan@moodle.com>
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace tool_langimport\event;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * The tool_langimport langpack removed event class.
+ *
+ * @property-read array $other {
+ * Extra information about event.
+ *
+ * - string langcode: the langpage pack code.
+ * }
+ *
+ * @package tool_langimport
+ * @copyright 2014 Dan Poltawski <dan@moodle.com>
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class langpack_removed extends \core\event\base {
+ /**
+ * Create instance of event.
+ *
+ * @param string $langcode
+ * @return langpack_updated
+ */
+ public static function event_with_langcode($langcode) {
+ $data = array(
+ 'context' => \context_system::instance(),
+ 'other' => array(
+ 'langcode' => $langcode,
+ )
+ );
+
+ return self::create($data);
+ }
+
+ /**
+ * Init method.
+ *
+ * @return void
+ */
+ protected function init() {
+ $this->data['crud'] = 'd';
+ $this->data['edulevel'] = self::LEVEL_OTHER;
+ }
+
+ /**
+ * Returns description of what happened.
+ *
+ * @return string
+ */
+ public function get_description() {
+ return "The language pack '{$this->other['langcode']}' was removed.";
+ }
+
+ /**
+ * Returns relevant URL.
+ *
+ * @return \moodle_url
+ */
+ public function get_url() {
+ return new \moodle_url('/admin/tool/langimport/');
+ }
+
+ /**
+ * Return localised event name.
+ *
+ * @return string
+ */
+ public static function get_name() {
+ return get_string('langpackremovedevent', 'tool_langimport');
+ }
+
+ /**
+ * Custom validation.
+ *
+ * @throws \coding_exception
+ */
+ protected function validate_data() {
+ parent::validate_data();
+
+ if (!isset($this->other['langcode'])) {
+ throw new \coding_exception('The \'langcode\' value must be set');
+ }
+
+ // We can't use PARAM_LANG here as it queries installed strings.
+ $cleanedlang = clean_param($this->other['langcode'], PARAM_SAFEDIR);
+ if ($cleanedlang !== $this->other['langcode']) {
+ throw new \coding_exception('The \'langcode\' value must be set to a valid language code');
+ }
+ }
+}
--- /dev/null
+<?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/>.
+
+/**
+ * The langimport langpack updated event.
+ *
+ * @package tool_langimport
+ * @copyright 2014 Dan Poltawski <dan@moodle.com>
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+namespace tool_langimport\event;
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * The tool_langimport langpack updated event class.
+ *
+ * @property-read array $other {
+ * Extra information about event.
+ *
+ * - string langcode: the langpage pack code.
+ * }
+ *
+ * @package tool_langimport
+ * @copyright 2014 Dan Poltawski <dan@moodle.com>
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class langpack_updated extends \core\event\base {
+ /**
+ * Create instance of event.
+ *
+ * @param string $langcode
+ * @return langpack_updated
+ */
+ public static function event_with_langcode($langcode) {
+ $data = array(
+ 'context' => \context_system::instance(),
+ 'other' => array(
+ 'langcode' => $langcode,
+ )
+ );
+
+ return self::create($data);
+ }
+
+ /**
+ * Init method.
+ *
+ * @return void
+ */
+ protected function init() {
+ $this->data['crud'] = 'u';
+ $this->data['edulevel'] = self::LEVEL_OTHER;
+ }
+
+ /**
+ * Returns description of what happened.
+ *
+ * @return string
+ */
+ public function get_description() {
+ return "The language pack '{$this->other['langcode']}' was updated.";
+ }
+
+ /**
+ * Return localised event name.
+ *
+ * @return string
+ */
+ public static function get_name() {
+ return get_string('langpackupdatedevent', 'tool_langimport');
+ }
+
+ /**
+ * Returns relevant URL.
+ *
+ * @return \moodle_url
+ */
+ public function get_url() {
+ return new \moodle_url('/admin/tool/langimport/');
+ }
+
+ /**
+ * Custom validation.
+ *
+ * @throws \coding_exception
+ */
+ protected function validate_data() {
+ parent::validate_data();
+
+ if (!isset($this->other['langcode'])) {
+ throw new \coding_exception('The \'langcode\' value must be set');
+ }
+
+ $cleanedlang = clean_param($this->other['langcode'], PARAM_LANG);
+ if ($cleanedlang !== $this->other['langcode']) {
+ throw new \coding_exception('The \'langcode\' value must be set to a valid language code');
+ }
+ }
+}
$string['langimport'] = 'Language import utility';
$string['langimportdisabled'] = 'Language import feature has been disabled. You have to update your language packs manually at the file-system level. Do not forget to purge string caches after you do so.';
$string['langpackinstalled'] = 'Language pack \'{$a}\' was successfully installed';
+$string['langpackinstalledevent'] = 'Language pack installed';
$string['langpackremoved'] = 'Language pack \'{$a}\' was uninstalled';
+$string['langpackremovedevent'] = 'Language pack uninstalled';
$string['langpackupdateskipped'] = 'Update of \'{$a}\' language pack skipped';
$string['langpackuptodate'] = 'Language pack \'{$a}\' is up-to-date';
+$string['langpackupdated'] = 'Language pack \'{$a}\' was successfully updated';
+$string['langpackupdatedevent'] = 'Language pack updated';
$string['langupdatecomplete'] = 'Language pack update completed';
$string['missingcfglangotherroot'] = 'Missing configuration value $CFG->langotherroot';
$string['missinglangparent'] = 'Missing parent language <em>{$a->parent}</em> of <em>{$a->lang}</em>.';
--- /dev/null
+<?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 langimport events.
+ *
+ * @package tool_langimport
+ * @copyright 2014 Dan Poltawski
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
+ */
+
+defined('MOODLE_INTERNAL') || die();
+
+/**
+ * Test class for langimport events.
+ *
+ * @package tool_langimport
+ * @copyright 2014 Dan Poltawski
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later.
+ */
+class tool_langimport_events_testcase extends advanced_testcase {
+
+ /**
+ * Setup testcase.
+ */
+ public function setUp() {
+ $this->setAdminUser();
+ $this->resetAfterTest();
+ }
+
+ public function test_langpack_updated() {
+ global $CFG;
+
+ $event = \tool_langimport\event\langpack_updated::event_with_langcode($CFG->lang);
+
+ // Trigger and capture the event.
+ $sink = $this->redirectEvents();
+ $event->trigger();
+ $events = $sink->get_events();
+ $event = reset($events);
+
+ $this->assertInstanceOf('\tool_langimport\event\langpack_updated', $event);
+ $this->assertEquals(context_system::instance(), $event->get_context());
+ }
+
+ public function test_langpack_updated_validation() {
+ $this->setExpectedException('coding_exception', 'The \'langcode\' value must be set to a valid language code');
+
+ \tool_langimport\event\langpack_updated::event_with_langcode('broken langcode');
+ }
+
+ public function test_langpack_installed() {
+ $event = \tool_langimport\event\langpack_imported::event_with_langcode('fr');
+
+ // Trigger and capture the event.
+ $sink = $this->redirectEvents();
+ $event->trigger();
+ $events = $sink->get_events();
+ $event = reset($events);
+
+ $this->assertInstanceOf('\tool_langimport\event\langpack_imported', $event);
+ $this->assertEquals(context_system::instance(), $event->get_context());
+ }
+
+ public function test_langpack_installed_validation() {
+ $this->setExpectedException('coding_exception', 'The \'langcode\' value must be set to a valid language code');
+
+ \tool_langimport\event\langpack_imported::event_with_langcode('broken langcode');
+ }
+
+ public function test_langpack_removed() {
+ $event = \tool_langimport\event\langpack_removed::event_with_langcode('fr');
+
+ // Trigger and capture the event.
+ $sink = $this->redirectEvents();
+ $event->trigger();
+ $events = $sink->get_events();
+ $event = reset($events);
+
+ $this->assertInstanceOf('\tool_langimport\event\langpack_removed', $event);
+ $this->assertEquals(context_system::instance(), $event->get_context());
+ }
+
+ public function test_langpack_removed_validation() {
+ $this->setExpectedException('coding_exception', 'The \'langcode\' value must be set to a valid language code');
+
+ \tool_langimport\event\langpack_removed::event_with_langcode('broken langcode');
+ }
+}
defined('MOODLE_INTERNAL') || die();
-$plugin->version = 2014051205; // The current plugin version (Date: YYYYMMDDXX)
+$plugin->version = 2014092800; // The current plugin version (Date: YYYYMMDDXX)
$plugin->requires = 2014050800; // Requires this Moodle version
$plugin->component = 'tool_langimport'; // Full name of the plugin (used for diagnostics)