<?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);