|
Lines 163-169
function getPoTasks () {
Link Here
|
| 163 |
|
163 |
|
| 164 |
return tasks; |
164 |
return tasks; |
| 165 |
} |
165 |
} |
| 166 |
const poTypes = getPoTasks(); |
|
|
| 167 |
|
166 |
|
| 168 |
function po_extract_marc (type) { |
167 |
function po_extract_marc (type) { |
| 169 |
return src(`koha-tmpl/*-tmpl/*/en/**/*${type}*`, { read: false, nocase: true }) |
168 |
return src(`koha-tmpl/*-tmpl/*/en/**/*${type}*`, { read: false, nocase: true }) |
|
Lines 354-359
function po_update_installer () { return po_update_type('installer') }
Link Here
|
| 354 |
function po_update_installer_marc21 () { return po_update_type('installer-MARC21') } |
353 |
function po_update_installer_marc21 () { return po_update_type('installer-MARC21') } |
| 355 |
function po_update_installer_unimarc () { return po_update_type('installer-UNIMARC') } |
354 |
function po_update_installer_unimarc () { return po_update_type('installer-UNIMARC') } |
| 356 |
|
355 |
|
|
|
356 |
const PLUGINS_BASE = "/kohadevbox/plugins"; |
| 357 |
const PLUGINS = [] |
| 358 |
|
| 359 |
if (args.plugins) { |
| 360 |
const identifyPluginFile = (file) => { |
| 361 |
const pluginFile = fs.readFileSync(file, 'utf8') |
| 362 |
const fileByLine = pluginFile.split(/\r?\n/) |
| 363 |
|
| 364 |
let pluginIdentified = false |
| 365 |
fileByLine.forEach(line => { |
| 366 |
if (line.includes("Koha::Plugins::Base")) { |
| 367 |
pluginIdentified = true |
| 368 |
} |
| 369 |
}) |
| 370 |
return pluginIdentified |
| 371 |
} |
| 372 |
|
| 373 |
const collectPluginFiles = (fullPath) => { |
| 374 |
let files = [] |
| 375 |
fs.readdirSync(fullPath).forEach(file => { |
| 376 |
const absolutePath = path.join(fullPath, file) |
| 377 |
if (fs.statSync(absolutePath).isDirectory()) { |
| 378 |
const filesFromNestedFolder = collectPluginFiles(absolutePath) |
| 379 |
filesFromNestedFolder && filesFromNestedFolder.forEach(file => { |
| 380 |
files.push(file) |
| 381 |
}) |
| 382 |
} else { |
| 383 |
return files.push(absolutePath) |
| 384 |
} |
| 385 |
}) |
| 386 |
return files |
| 387 |
} |
| 388 |
|
| 389 |
function po_create_plugins(pluginData, type) { |
| 390 |
const access = util.promisify(fs.access); |
| 391 |
const exec = util.promisify(child_process.exec); |
| 392 |
|
| 393 |
const translatorDirCheck = fs.readdirSync(pluginData.bundlePath).includes('translator') |
| 394 |
if (!translatorDirCheck) { |
| 395 |
fs.mkdirSync(`${pluginData.bundlePath}/translator`) |
| 396 |
} |
| 397 |
const poDirCheck = fs.readdirSync(pluginData.bundlePath + '/translator').includes('po') |
| 398 |
if (!poDirCheck) { |
| 399 |
fs.mkdirSync(`${pluginData.bundlePath}/translator/po`) |
| 400 |
} |
| 401 |
|
| 402 |
const pot = `${pluginData.bundlePath}/translator/${pluginData.name}-${type}.pot`; |
| 403 |
|
| 404 |
// Generate .pot only if it doesn't exist or --force-extract is given |
| 405 |
const extract = () => stream.finished(poTasks[`${pluginData.name}-${type}`].extract()); |
| 406 |
|
| 407 |
const p = |
| 408 |
args['generate-pot'] === 'always' ? extract() : |
| 409 |
args['generate-pot'] === 'auto' ? access(pot).catch(extract) : |
| 410 |
args['generate-pot'] === 'never' ? Promise.resolve(0) : |
| 411 |
Promise.reject(new Error('Invalid value for option --generate-pot: ' + args['generate-pot'])) |
| 412 |
|
| 413 |
return p.then(function () { |
| 414 |
const languages = getLanguages(); |
| 415 |
const promises = []; |
| 416 |
languages.forEach(language => { |
| 417 |
const locale = language.split('-').filter(s => s.length !== 4).join('_'); |
| 418 |
const po = `${pluginData.bundlePath}/translator/po/${language}-${pluginData.name}-${type}.po`; |
| 419 |
|
| 420 |
const promise = access(po) |
| 421 |
.catch(() => exec(`msginit -o ${po} -i ${pot} -l ${locale} --no-translator`)) |
| 422 |
promises.push(promise); |
| 423 |
}) |
| 424 |
return Promise.all(promises); |
| 425 |
}) |
| 426 |
} |
| 427 |
|
| 428 |
function po_extract_plugins_js(pluginData) { |
| 429 |
const globs = [ |
| 430 |
`${pluginData.directory}/**/*.js`, |
| 431 |
`${pluginData.directory}/**/*.vue`, |
| 432 |
`!${pluginData.directory}/**/node_modules/**/*`, |
| 433 |
]; |
| 434 |
|
| 435 |
return src(globs, { read: false, nocase: true }) |
| 436 |
.pipe(xgettext(`xgettext -L JavaScript ${xgettext_options}`, `${pluginData.name}-js.pot`)) |
| 437 |
.pipe(dest(`${pluginData.bundlePath}/translator`)) |
| 438 |
} |
| 439 |
|
| 440 |
function po_extract_plugins_template(pluginData) { |
| 441 |
const globs = [ |
| 442 |
`${pluginData.directory}/**/*.tt`, |
| 443 |
`${pluginData.directory}/**/*.inc`, |
| 444 |
`!${pluginData.directory}/**/node_modules/**/*`, |
| 445 |
]; |
| 446 |
|
| 447 |
return src(globs, { read: false, nocase: true }) |
| 448 |
.pipe(xgettext('misc/translator/xgettext.pl --charset=UTF-8 -F', `${pluginData.name}-template.pot`)) |
| 449 |
.pipe(dest(`${pluginData.bundlePath}/translator`)) |
| 450 |
} |
| 451 |
|
| 452 |
function po_update_plugins(pluginData, type) { |
| 453 |
const access = util.promisify(fs.access); |
| 454 |
const exec = util.promisify(child_process.exec); |
| 455 |
|
| 456 |
const pot = `${pluginData.bundlePath}/translator/${pluginData.name}-${type}.pot`; |
| 457 |
|
| 458 |
// Generate .pot only if it doesn't exist or --force-extract is given |
| 459 |
const extract = () => stream.finished(poTasks[`${pluginData.name}-${type}`].extract()); |
| 460 |
const p = |
| 461 |
args['generate-pot'] === 'always' ? extract() : |
| 462 |
args['generate-pot'] === 'auto' ? access(pot).catch(extract) : |
| 463 |
args['generate-pot'] === 'never' ? Promise.resolve(0) : |
| 464 |
Promise.reject(new Error('Invalid value for option --generate-pot: ' + args['generate-pot'])) |
| 465 |
|
| 466 |
return p.then(function () { |
| 467 |
const languages = getLanguages(); |
| 468 |
const promises = []; |
| 469 |
languages.forEach(language => { |
| 470 |
const po = `${pluginData.bundlePath}/translator/po/${language}-${pluginData.name}-${type}.po`; |
| 471 |
promises.push(exec(`msgmerge --backup=off --no-wrap --quiet -F --update ${po} ${pot}`)); |
| 472 |
}) |
| 473 |
|
| 474 |
return Promise.all(promises); |
| 475 |
}); |
| 476 |
} |
| 477 |
|
| 478 |
// Remove all tasks except for plugins |
| 479 |
Object.keys(poTasks).forEach(task => { |
| 480 |
delete poTasks[task] |
| 481 |
}) |
| 482 |
|
| 483 |
const pluginNames = fs.readdirSync(PLUGINS_BASE); |
| 484 |
pluginNames.forEach(plugin => { |
| 485 |
const pluginFiles = collectPluginFiles(`${PLUGINS_BASE}/${plugin}/Koha`) |
| 486 |
let pluginFilePath |
| 487 |
pluginFiles.forEach(file => { |
| 488 |
const pluginFile = identifyPluginFile(file) |
| 489 |
if (pluginFile) { |
| 490 |
pluginFilePath = file.split('.')[0] |
| 491 |
} |
| 492 |
}) |
| 493 |
const name = pluginFilePath.split('/').pop() |
| 494 |
const pluginData = { |
| 495 |
name, |
| 496 |
bundlePath: pluginFilePath, |
| 497 |
directory: `${PLUGINS_BASE}/${plugin}`, |
| 498 |
} |
| 499 |
PLUGINS.push(pluginData) |
| 500 |
|
| 501 |
function po_extract_js () { return po_extract_plugins_js(pluginData) } |
| 502 |
function po_create_js () { return po_create_plugins(pluginData, 'js') } |
| 503 |
function po_update_js () { return po_update_plugins(pluginData, 'js') } |
| 504 |
function po_extract_template () { return po_extract_plugins_template(pluginData) } |
| 505 |
function po_create_template () { return po_create_plugins(pluginData, 'template') } |
| 506 |
function po_update_template () { return po_update_plugins(pluginData, 'template') } |
| 507 |
|
| 508 |
poTasks[`${name}-js`] = { |
| 509 |
extract: po_extract_js, |
| 510 |
create: po_create_js, |
| 511 |
update: po_update_js, |
| 512 |
} |
| 513 |
poTasks[`${name}-template`] = { |
| 514 |
extract: po_extract_template, |
| 515 |
create: po_create_template, |
| 516 |
update: po_update_template, |
| 517 |
} |
| 518 |
}) |
| 519 |
} |
| 520 |
|
| 357 |
/** |
521 |
/** |
| 358 |
* Gulp plugin that executes xgettext-like command `cmd` on all files given as |
522 |
* Gulp plugin that executes xgettext-like command `cmd` on all files given as |
| 359 |
* input, and then outputs the result as a POT file named `filename`. |
523 |
* input, and then outputs the result as a POT file named `filename`. |
|
Lines 434-439
if (args['_'][0].match("po:") && !fs.existsSync('misc/translator/po')) {
Link Here
|
| 434 |
process.exit(1); |
598 |
process.exit(1); |
| 435 |
} |
599 |
} |
| 436 |
|
600 |
|
|
|
601 |
const poTypes = getPoTasks(); |
| 602 |
|
| 437 |
exports['po:create'] = parallel(...poTypes.map(type => poTasks[type].create)); |
603 |
exports['po:create'] = parallel(...poTypes.map(type => poTasks[type].create)); |
| 438 |
exports['po:update'] = parallel(...poTypes.map(type => poTasks[type].update)); |
604 |
exports['po:update'] = parallel(...poTypes.map(type => poTasks[type].update)); |
| 439 |
exports['po:extract'] = parallel(...poTypes.map(type => poTasks[type].extract)); |
605 |
exports['po:extract'] = parallel(...poTypes.map(type => poTasks[type].extract)); |
| 440 |
- |
|
|