--- /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/>.
+
+/**
+ * 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();
+
+// 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));
+
+ 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);