Bug 35079: Rebuild POT files only if necessary or asked explicitely

By default, gulp tasks po:create and po:update won't rebuild the POT
files if they already exist.
Both tasks gained a new option --force-extract to rebuild them
unconditionally

This makes it possible to create/update PO files for multiple languages
sequentially without rebuilding the POT file for each language.
For instance:

    gulp po:update --lang fr-FR
    # do something with the PO files
    gulp po:update --lang en-GB
    # ...

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
This commit is contained in:
Julian Maurice 2023-10-17 16:33:37 +02:00 committed by Tomas Cohen Arazi
parent f380181fc4
commit 0584a2016e
Signed by: tomascohen
GPG key ID: 0A272EA1B2F3C15F

View file

@ -8,6 +8,7 @@ const fs = require('fs');
const os = require('os'); const os = require('os');
const path = require('path'); const path = require('path');
const util = require('util'); const util = require('util');
const stream = require('stream/promises');
const sass = require('gulp-sass')(require('sass')); const sass = require('gulp-sass')(require('sass'));
const rtlcss = require('gulp-rtlcss'); const rtlcss = require('gulp-rtlcss');
@ -257,19 +258,26 @@ function po_create_type (type) {
const access = util.promisify(fs.access); const access = util.promisify(fs.access);
const exec = util.promisify(child_process.exec); const exec = util.promisify(child_process.exec);
const languages = getLanguages(); const pot = `misc/translator/Koha-${type}.pot`;
const promises = [];
for (const language of languages) {
const locale = language.split('-').filter(s => s.length !== 4).join('_');
const po = `misc/translator/po/${language}-${type}.po`;
const pot = `misc/translator/Koha-${type}.pot`;
const promise = access(po) // Generate .pot only if it doesn't exist or --force-extract is given
.catch(() => exec(`msginit -o ${po} -i ${pot} -l ${locale} --no-translator`)) const extract = () => stream.finished(poTasks[type].extract());
promises.push(promise); const p = args['force-extract'] ? extract() : access(pot).catch(extract);
}
return Promise.all(promises); return p.then(function () {
const languages = getLanguages();
const promises = [];
for (const language of languages) {
const locale = language.split('-').filter(s => s.length !== 4).join('_');
const po = `misc/translator/po/${language}-${type}.po`;
const promise = access(po)
.catch(() => exec(`msginit -o ${po} -i ${pot} -l ${locale} --no-translator`))
promises.push(promise);
}
return Promise.all(promises);
});
} }
function po_create_marc_marc21 () { return po_create_type('marc-MARC21') } function po_create_marc_marc21 () { return po_create_type('marc-MARC21') }
@ -284,14 +292,25 @@ function po_create_installer_marc21 () { return po_create_type('installer-MARC2
function po_create_installer_unimarc () { return po_create_type('installer-UNIMARC') } function po_create_installer_unimarc () { return po_create_type('installer-UNIMARC') }
function po_update_type (type) { function po_update_type (type) {
const msgmerge_opts = '--backup=off --no-wrap --quiet -F --update'; const access = util.promisify(fs.access);
const cmd = `msgmerge ${msgmerge_opts} <%= file.path %> misc/translator/Koha-${type}.pot`; const exec = util.promisify(child_process.exec);
const languages = getLanguages();
const globs = languages.map(language => `misc/translator/po/${language}-${type}.po`);
return src(globs) const pot = `misc/translator/Koha-${type}.pot`;
.pipe(exec(cmd, { continueOnError: true }))
.pipe(exec.reporter({ err: false, stdout: false })) // Generate .pot only if it doesn't exist or --force-extract is given
const extract = () => stream.finished(poTasks[type].extract());
const p = args['force-extract'] ? extract() : access(pot).catch(extract);
return p.then(function () {
const languages = getLanguages();
const promises = [];
for (const language of languages) {
const po = `misc/translator/po/${language}-${type}.po`;
promises.push(exec(`msgmerge --backup=off --no-wrap --quiet -F --update ${po} ${pot}`));
}
return Promise.all(promises);
});
} }
function po_update_marc_marc21 () { return po_update_type('marc-MARC21') } function po_update_marc_marc21 () { return po_update_type('marc-MARC21') }
@ -379,6 +398,6 @@ exports.watch = function () {
watch(STAFF_CSS_BASE + "/src/**/*.scss", series('staff_css')); watch(STAFF_CSS_BASE + "/src/**/*.scss", series('staff_css'));
}; };
exports['po:create'] = parallel(...poTypes.map(type => series(poTasks[type].extract, poTasks[type].create))); exports['po:create'] = parallel(...poTypes.map(type => poTasks[type].create));
exports['po:update'] = parallel(...poTypes.map(type => series(poTasks[type].extract, poTasks[type].update))); exports['po:update'] = parallel(...poTypes.map(type => poTasks[type].update));
exports['po:extract'] = parallel(...poTypes.map(type => poTasks[type].extract)); exports['po:extract'] = parallel(...poTypes.map(type => poTasks[type].extract));