See Release Notes
Long Term Support Release
<?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/>. /** * CLI customlang import tool. * * @package tool_customlang * @copyright 2020 Ferran Recio <ferran@moodle.com> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ use tool_customlang\local\importer; use core\output\notification; define('CLI_SCRIPT', true); require(__DIR__ . '/../../../../config.php'); require_once($CFG->dirroot.'/'.$CFG->admin.'/tool/customlang/locallib.php'); require_once("$CFG->libdir/clilib.php"); $usage = "Import lang customization. It can get a single file or a folder. If no lang is provided it will try to infere from the filename Options: --lang The target language (will get from filename if not provided) --source=path File or folder of the custom lang files (zip or php files) --mode What string should be imported. Options are: - all: all string will be imported (default) - new: only string with no previous customisation - update: only strings already modified --checkin Save strings to the language pack -h, --help Print out this help Examples: \$ sudo -u www-data /usr/bin/php admin/tool/customlang/cli/import.php --lang=en --source=customlangs.zip \$ sudo -u www-data /usr/bin/php admin/tool/customlang/cli/import.php --source=/tmp/customlangs --checkin \$ sudo -u www-data /usr/bin/php admin/tool/customlang/cli/import.php --lang=en --source=/tmp/customlangs "; list($options, $unrecognized) = cli_get_params( [ 'help' => false, 'lang' => false, 'source' => false, 'mode' => 'all', 'checkin' => false, ], ['h' => 'help'] ); if ($unrecognized) { $unrecognized = implode("\n ", $unrecognized); cli_error(get_string('cliunknowoption', 'admin', $unrecognized)); } if ($options['help']) { cli_write($usage); exit(0); } $source = $options['source'] ?? null; $lang = $options['lang'] ?? null; $modeparam = $options['mode'] ?? 'all'; $checkin = $options['checkin'] ?? false; $modes = [ 'all' => importer::IMPORTALL, 'update' => importer::IMPORTUPDATE, 'new' => importer::IMPORTNEW, ]; if (!isset($modes[$modeparam])) { cli_error(get_string('climissingmode', 'tool_customlang')); } $mode = $modes[$modeparam]; if (empty($source)) { $source = $CFG->dataroot.'/temp/customlang'; } if (!file_exists($source)) { cli_error(get_string('climissingsource', 'tool_customlang')); } // Emulate normal session - we use admin account by default.< cron_setup_user();> \core\cron::setup_user();// Get the file list. $files = []; $langfiles = []; if (is_file($source)) { $files[] = $source; } if (is_dir($source)) { $filelist = glob("$source/*"); foreach ($filelist as $filename) { $files[] = "$filename"; } } $countfiles = 0; foreach ($files as $filepath) { // Try to get the lang. $filelang = $lang; // Get component from filename. $pathparts = pathinfo($filepath); $filename = $pathparts['filename']; $extension = $pathparts['extension']; if ($extension == 'zip') { if (!$filelang) { // Try to get the lang from the filename. if (strrpos($filename, 'customlang_') === 0) { $parts = explode('_', $filename); if (!empty($parts[1])) { $filelang = $parts[1]; } } } } else if ($extension != 'php') { // Ignore any other file extension. continue; } if (empty($filelang)) { cli_error(get_string('climissinglang', 'tool_customlang')); } if (!isset($langfiles[$filelang])) { $langfiles[$filelang] = []; } $langfiles[$filelang][] = $filepath; $countfiles ++; } if (!$countfiles) { cli_error(get_string('climissingfiles', 'tool_customlang')); } foreach ($langfiles as $lng => $files) { $importer = new importer($lng, $mode); $storedfiles = []; $fs = get_file_storage(); cli_heading(get_string('clifiles', 'tool_customlang', $lng)); // If we intend to check in any changes, we must first check them out. if ($checkin) { cli_writeln(get_string('checkout', 'tool_customlang')); $progressbar = new progress_bar(); $progressbar->create(); tool_customlang_utils::checkout($lng, $progressbar); } foreach ($files as $file) { // Generate a valid stored_file from this file. $record = (object)[ 'filearea' => 'draft', 'component' => 'user', 'filepath' => '/', 'itemid' => file_get_unused_draft_itemid(), 'license' => $CFG->sitedefaultlicense, 'author' => '', 'filename' => clean_param(basename($file), PARAM_FILE), 'contextid' => \context_user::instance($USER->id)->id, 'userid' => $USER->id, ]; cli_writeln($file); $storedfiles[] = $fs->create_file_from_pathname($record, $file); } cli_writeln(""); // Import files. cli_heading(get_string('cliimporting', 'tool_customlang', $modeparam)); $importer->import($storedfiles); // Display logs. $log = $importer->get_log(); if (empty($log)) { cli_problem(get_string('clinolog', 'tool_customlang', $lng)); } foreach ($log as $message) { if ($message->errorlevel == notification::NOTIFY_ERROR) { cli_problem($message->get_message()); } else { cli_writeln($message->get_message()); } } // Do the checkin if necessary. if ($checkin) { tool_customlang_utils::checkin($lng); cli_writeln(get_string('savecheckin', 'tool_customlang')); } cli_writeln(""); } exit(0);