2023-05-18 11:59:02 +00:00
|
|
|
// (C) Copyright 2015 Moodle Pty Ltd.
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
const gulp = require('gulp');
|
|
|
|
const slash = require('gulp-slash');
|
|
|
|
const through = require('through');
|
|
|
|
const bufferFrom = require('buffer-from');
|
|
|
|
const pathLib = require('path');
|
|
|
|
const { readFileSync } = require('fs');
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Use the English generated lang file (src/assets/lang/en.json) to override strings in features lang.json files.
|
|
|
|
*/
|
|
|
|
class OverrideLangTask {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Run the task.
|
|
|
|
*
|
|
|
|
* @param done Function to call when done.
|
|
|
|
*/
|
|
|
|
run(done) {
|
|
|
|
const self = this;
|
|
|
|
|
|
|
|
const path = pathLib.join('./src/assets/lang', 'en.json');
|
|
|
|
const data = JSON.parse(readFileSync(path));
|
|
|
|
|
|
|
|
const files = {};
|
|
|
|
|
|
|
|
for (const key in data) {
|
|
|
|
let filePath = './src';
|
|
|
|
|
|
|
|
const exp = key.split('.');
|
|
|
|
|
|
|
|
|
|
|
|
const type = exp.shift();
|
|
|
|
let component = 'moodle';
|
|
|
|
let plainid = exp.shift();
|
|
|
|
|
|
|
|
if (exp.length > 0) {
|
|
|
|
component = plainid;
|
|
|
|
plainid = exp.join('.');
|
|
|
|
}
|
|
|
|
|
2023-11-06 10:07:18 +00:00
|
|
|
const component_slashes = component.replace(/_/g, '/');
|
2023-05-18 11:59:02 +00:00
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
case 'core':
|
|
|
|
if (component == 'moodle') {
|
|
|
|
filePath = pathLib.join(filePath, 'core/lang.json');
|
|
|
|
} else {
|
|
|
|
filePath = pathLib.join(filePath, `/core/features/${component_slashes}/lang.json`);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'addon':
|
|
|
|
filePath = pathLib.join(filePath, `/addons/${component_slashes}/lang.json`);
|
|
|
|
break;
|
|
|
|
case 'assets':
|
|
|
|
filePath = pathLib.join(filePath, `/${type}/${component}.json`);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
filePath = pathLib.join(filePath, `/${type}/lang.json`);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
filePath = pathLib.resolve(filePath);
|
|
|
|
|
|
|
|
if (files[filePath] === undefined) {
|
|
|
|
files[filePath] = {};
|
|
|
|
}
|
|
|
|
|
|
|
|
files[filePath][plainid] = data[key];
|
|
|
|
}
|
|
|
|
|
|
|
|
const paths = Object.keys(files);
|
2023-11-06 10:07:18 +00:00
|
|
|
gulp.src(paths)
|
2023-05-18 11:59:02 +00:00
|
|
|
.pipe(slash())
|
2023-11-06 10:07:18 +00:00
|
|
|
.pipe(through(function (destFile) {
|
2023-05-18 11:59:02 +00:00
|
|
|
const oldContents = self.readFile(destFile);
|
|
|
|
destFile.contents = self.jsonFile(oldContents, files[destFile.path]);
|
|
|
|
|
|
|
|
this.emit('data', destFile);
|
|
|
|
}))
|
2023-11-06 10:07:18 +00:00
|
|
|
.pipe(gulp.dest((data) => data.base, { overwrite: true }))
|
2023-05-18 11:59:02 +00:00
|
|
|
.on('end', done);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Reads file.
|
|
|
|
*
|
|
|
|
* @param file File treated.
|
|
|
|
*/
|
|
|
|
readFile(file) {
|
|
|
|
if (file.isNull() || file.isStream()) {
|
|
|
|
return; // ignore
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
return JSON.parse(file.contents.toString());
|
|
|
|
} catch (err) {
|
|
|
|
console.log('Error parsing JSON: ' + err);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates the stringified json.
|
|
|
|
*
|
|
|
|
* @param oldContents File old data.
|
|
|
|
* @param data File data.
|
|
|
|
* @return Buffer with the treated data.
|
|
|
|
*/
|
|
|
|
jsonFile(oldContents, data) {
|
|
|
|
data = Object.assign(oldContents, data);
|
|
|
|
|
|
|
|
const fileContents = {};
|
|
|
|
// Force ordering by string key.
|
|
|
|
Object.keys(data).sort().forEach((key) => {
|
|
|
|
fileContents[key] = data[key];
|
|
|
|
});
|
|
|
|
|
|
|
|
return bufferFrom(JSON.stringify(fileContents, null, 4) + "\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = OverrideLangTask;
|