Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.
<?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));

> // If we intend to check in any changes, we must first check them out. foreach ($files as $file) { > if ($checkin) { // Generate a valid stored_file from this file. > cli_writeln(get_string('checkout', 'tool_customlang')); $record = (object)[ > 'filearea' => 'draft', > $progressbar = new progress_bar(); 'component' => 'user', > $progressbar->create(); 'filepath' => '/', > 'itemid' => file_get_unused_draft_itemid(), > tool_customlang_utils::checkout($lng, $progressbar); '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);