diff --git a/gulpfile.ts b/gulpfile.ts index 9619ea66..60d3429c 100644 --- a/gulpfile.ts +++ b/gulpfile.ts @@ -1,12 +1,17 @@ import * as gulp from 'gulp'; import * as fs from 'fs'; +import {promises as fsp} from 'fs'; +import * as path from 'path'; +import * as util from 'util'; import * as zip from 'gulp-zip'; import * as ts from 'gulp-typescript'; +import * as xml2js from 'xml2js'; +import * as child_process from 'child_process'; // @ts-ignore import * as jeditor from 'gulp-json-editor'; +import {XLIFF} from 'xlf-google-translate'; - -const exec = require('child_process').exec; +const execPr = util.promisify(child_process.exec); const translationFolder = 'translate'; const tsBackendProject = ts.createProject('tsconfig.json'); @@ -45,10 +50,79 @@ const handleError = (cb: (err: any) => void) => { cb(err); }; }; +const createDynamicTranslationFile = async (language: string) => { + // load + const folder = './src/frontend/' + translationFolder; + const data: string = await fsp.readFile(path.join(folder, `messages.${language}.xlf`), 'utf-8'); + const translationXml: XLIFF.Root = await xml2js.parseStringPromise(data); -const createFrontendTask = (type: string, script: string) => { - gulp.task(type, (cb) => { - exec(script, handleError(cb)); + // clean translations, keep only .ts transaltions + const hasTsTranslation = (cg: XLIFF.ContextGroup) => + cg.context.findIndex((c: any) => c.$['context-type'] === 'sourcefile' && c._.endsWith('.ts')) !== -1; + const translations = translationXml.xliff.file[0].body[0]['trans-unit']; + const filtered = translations.filter(tr => tr['context-group'].findIndex(hasTsTranslation) !== -1); + filtered.forEach(tr => delete tr['context-group']); + translationXml.xliff.file[0].body[0]['trans-unit'] = filtered; + + // save + const builder = new xml2js.Builder({trim: true, normalize: true}); + const xml = builder.buildObject(translationXml); + await fsp.writeFile(path.join(folder, `ts-only-msg.${language}.xlf`), xml); + +}; + +const removeDynamicTranslationFile = async (language: string) => { + const translationFile = path.join('./src/frontend/', translationFolder, `ts-only-msg.${language}.xlf`); + fsp.unlink(translationFile); +}; + + +const setDynTransFileAtAppModule = async (language: string) => { + const file = './src/frontend/app/app.module.ts'; + let data: string = await fsp.readFile(file, 'utf-8'); + const from = 'messages.${locale}.xlf'; + const to = `ts-only-msg.${language}.xlf`; + data = data.replace(from, to); + await fsp.writeFile(file, data); +}; + +const resetAppModule = async (language: string) => { + const file = './src/frontend/app/app.module.ts'; + let data: string = await fsp.readFile(file, 'utf-8'); + const from = 'messages.${locale}.xlf'; + const to = `ts-only-msg.${language}.xlf`; + data = data.replace(to, from); + await fsp.writeFile(file, data); +}; + + +const createFrontendTask = (type: string, language: string, script: string) => { + gulp.task(type, async (cb) => { + let error; + try { + // TODO: remove this once i18n-pollify is removed from the project + // Adding filtered translation as webpack would pack all translations into the created release + await createDynamicTranslationFile(language); + await setDynTransFileAtAppModule(language); + const {stdout, stderr} = await execPr(script); + console.log(stdout); + console.error(stderr); + } catch (e) { + console.error(e); + error = e; + } finally { + try { + await resetAppModule(language); + } catch (e) { + + } + try { + await removeDynamicTranslationFile(language); + } catch (e) { + + } + cb(error); + } }); }; @@ -85,13 +159,13 @@ gulp.task('build-frontend', (() => { return l !== 'en'; }); const tasks = []; - createFrontendTask('build-frontend-release default', + createFrontendTask('build-frontend-release default', 'en', 'ng build --aot --prod --output-path=./release/dist --no-progress --i18n-locale=en' + ' --i18n-format xlf --i18n-file src/frontend/' + translationFolder + '/messages.en.xlf' + ' --i18n-missing-translation warning'); tasks.push('build-frontend-release default'); for (let i = 0; i < languages.length; i++) { - createFrontendTask('build-frontend-release ' + languages[i], + createFrontendTask('build-frontend-release ' + languages[i], languages[i], 'ng build --aot --prod --output-path=./release/dist/' + languages[i] + ' --no-progress --i18n-locale=' + languages[i] + ' --i18n-format xlf --i18n-file src/frontend/' + translationFolder + '/messages.' + languages[i] + '.xlf' + @@ -105,7 +179,7 @@ gulp.task('copy-static', function () { return gulp.src([ 'src/backend/model/diagnostics/blank.jpg', 'README.md', - // 'package-lock.json', should not add, it keeps optional packages optional even with --force-opt-packages. + // 'package-lock.json', should not add, it keeps optional packages optional even with --force-opt-packages. 'LICENSE'], {base: '.'}) .pipe(gulp.dest('./release')); }); @@ -172,12 +246,12 @@ const simpleBuild = (isProd: boolean) => { if (isProd) { cmd += ' --prod --no-extract-licenses '; } - createFrontendTask('build-frontend default', cmd + '--output-path=./dist --no-progress --no-progress --i18n-locale en' + + createFrontendTask('build-frontend default', 'en', cmd + '--output-path=./dist --no-progress --no-progress --i18n-locale en' + ' --i18n-format=xlf --i18n-file=src/frontend/' + translationFolder + '/messages.en.xlf' + ' --i18n-missing-translation warning'); tasks.push('build-frontend default'); if (!process.env.CI) { // don't build languages if running in CI for (let i = 0; i < languages.length; i++) { - createFrontendTask('build-frontend ' + languages[i], cmd + + createFrontendTask('build-frontend ' + languages[i], languages[i], cmd + '--output-path=./dist/' + languages[i] + ' --no-progress --i18n-locale ' + languages[i] + ' --i18n-format=xlf --i18n-file=src/frontend/' + translationFolder + @@ -188,31 +262,59 @@ const simpleBuild = (isProd: boolean) => { return gulp.series(...tasks); }; -gulp.task('extract-locale', (cb) => { +gulp.task('extract-locale', async (cb) => { console.log('creating source translation file: locale.source.xlf'); - exec('ng xi18n --out-file=./../../locale.source.xlf --i18n-format=xlf --i18n-locale=en', - {maxBuffer: 1024 * 1024}, (error: any, stdOut: string, stdErr: string) => { - console.log(stdOut); - console.log(stdErr); - if (error) { - return cb(error); - } - exec('ngx-extractor -i src/frontend/**/*.ts -f xlf --out-file locale.source.xlf', - handleError(cb)); - }); + try { + { + const {stdout, stderr} = await execPr('ng xi18n --out-file=./../../locale.source.xlf --i18n-format=xlf --i18n-locale=en', + {maxBuffer: 1024 * 1024}); + console.log(stdout); + console.error(stderr); + } + { + const {stdout, stderr} = await execPr('ngx-extractor -i src/frontend/**/*.ts -f xlf --out-file locale.source.xlf'); + console.log(stdout); + console.error(stderr); + } + cb(); + } catch (e) { + console.error(e); + return cb(e); + } }); -const translate = (list: any[], cb: (err: any) => void) => { - const localsStr = '"[\\"' + list.join('\\",\\"') + '\\"]"'; - exec('xlf-google-translate --source-lang="en" --source-file="./locale.source.xlf" --destination-folder="./src/frontend/"' + - translationFolder + ' --destination-languages=' + localsStr, - handleError(cb)); +const translate = async (list: any[], cb: (err?: any) => void) => { + try { + const localsStr = '"[\\"' + list.join('\\",\\"') + '\\"]"'; + const {stdout, stderr} = await execPr('xlf-google-translate ' + + '--source-lang="en" ' + + '--source-file="./locale.source.xlf" ' + + '--destination-filename="messages" ' + + '--destination-folder="./src/frontend/"' + translationFolder + ' --destination-languages=' + localsStr); + console.log(stdout); + console.error(stderr); + cb(); + } catch (e) { + console.error(e); + return cb(e); + } }; -const merge = (list: any[], cb: (err: any) => void) => { - const localsStr = '"[\\"' + list.join('\\",\\"') + '\\"]"'; - exec('xlf-google-translate --method="extend-only" --source-lang="en" --source-file="./locale.source.xlf" --destination-folder="./src/frontend/"' + - translationFolder + ' --destination-languages=' + localsStr, - handleError(cb)); +const merge = async (list: any[], cb: (err?: any) => void) => { + try { + const localsStr = '"[\\"' + list.join('\\",\\"') + '\\"]"'; + const {stdout, stderr} = await execPr('xlf-google-translate ' + + '--method="extend-only" ' + + '--source-lang="en" ' + + '--source-file="./locale.source.xlf" ' + + '--destination-filename="messages" ' + + '--destination-folder="./src/frontend/"' + translationFolder + ' --destination-languages=' + localsStr); + console.log(stdout); + console.error(stderr); + cb(); + } catch (e) { + console.error(e); + return cb(e); + } }; gulp.task('update-translation-only', function (cb) { diff --git a/package-lock.json b/package-lock.json index f8337368..1a15b80e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "pigallery2", - "version": "1.7.9", + "version": "1.8.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -4106,6 +4106,15 @@ "winston": "*" } }, + "@types/xml2js": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.5.tgz", + "integrity": "sha512-yohU3zMn0fkhlape1nxXG2bLEGZRc1FeqF80RoHaYXJN7uibaauXfhzhOJr1Xh36sn+/tx21QAOf07b/xYVk1w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", @@ -7293,9 +7302,9 @@ "dev": true }, "defer-to-connect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.0.1.tgz", - "integrity": "sha512-2e0FJesseUqQj671gvZWfUyxpnFx/5n4xleamlpCD3U6Fm5dh5qzmmLNxNhtmHF06+SYVHH8QU6FACffYTnj0Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.1.tgz", + "integrity": "sha512-J7thop4u3mRTkYRQ+Vpfwy2G5Ehoy82I14+14W4YMDLKdWloI9gSzRbV30s/NckQGVJtPkWNcW4oMAUigTdqiQ==", "dev": true }, "define-properties": { @@ -13671,9 +13680,9 @@ "dev": true }, "normalize-url": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.3.0.tgz", - "integrity": "sha512-0NLtR71o4k6GLP+mr6Ty34c5GA6CMoEsncKJxvQd8NzPxaHRJNnb5gZE8R1XF4CPIS7QPHLJ74IFszwtNVAHVQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", "dev": true }, "now-and-later": { @@ -14087,9 +14096,9 @@ } }, "p-cancelable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.0.0.tgz", - "integrity": "sha512-USgPoaC6tkTGlS831CxsVdmZmyb8tR1D+hStI84MyckLOzfJlYQUweomrwE3D8T7u5u5GVuW064LT501wHTYYA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, "p-defer": { @@ -20145,14 +20154,14 @@ } }, "xlf-google-translate": { - "version": "1.0.0-beta.15", - "resolved": "https://registry.npmjs.org/xlf-google-translate/-/xlf-google-translate-1.0.0-beta.15.tgz", - "integrity": "sha512-2JbIyS6rjBU5aJ7hhlWSLxNk8JC9BCwjjVhZu5Sm66c0NMukgn4RRnu9Z8d41NnDfPFrrkONYxkJm57lzRysUw==", + "version": "1.0.0-beta.18", + "resolved": "https://registry.npmjs.org/xlf-google-translate/-/xlf-google-translate-1.0.0-beta.18.tgz", + "integrity": "sha512-BDsJm+i6rNNuFqm3EYXhojTb9V/PYdgt3zt0X56kIrWqJKrI08iDOdhIXcujqdYwiPxnS4nVPW4DKbXy8UA1gw==", "dev": true, "requires": { "@k3rn31p4nic/google-translate-api": "1.0.6", "typeconfig": "1.0.7", - "xml2js": "0.4.19" + "xml2js": "0.4.23" }, "dependencies": { "typeconfig": { @@ -20172,18 +20181,18 @@ "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=" }, "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", "requires": { "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" + "xmlbuilder": "~11.0.0" } }, "xmlbuilder": { - "version": "9.0.7", - "resolved": "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, "xmldom": { "version": "0.1.27", diff --git a/package.json b/package.json index ccf59e35..ed68708b 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,7 @@ "@types/rimraf": "2.0.3", "@types/sharp": "0.23.1", "@types/winston": "2.4.4", + "@types/xml2js": "0.4.5", "@yaga/leaflet-ng2": "1.0.0", "bootstrap": "4.4.1", "chai": "4.2.0", @@ -118,7 +119,8 @@ "ts-node": "8.5.4", "tslint": "5.20.1", "typescript": "3.5.3", - "xlf-google-translate": "1.0.0-beta.15", + "xlf-google-translate": "1.0.0-beta.19", + "xml2js": "0.4.23", "zone.js": "0.10.2" }, "//": [ @@ -138,5 +140,10 @@ }, "engines": { "node": ">=10.17 <13.0" - } + }, + "browserslist": [ + "> 5%", + "Firefox ESR", + "not dead" + ] } diff --git a/src/frontend/translate/messages.en.xlf b/src/frontend/translate/messages.en.xlf index 98313dfd..3cc453f4 100644 --- a/src/frontend/translate/messages.en.xlf +++ b/src/frontend/translate/messages.en.xlf @@ -588,7 +588,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 237 + 260 Close @@ -710,7 +710,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 196 + 219 Save @@ -767,7 +767,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 200 + 223 Reset @@ -1685,7 +1685,7 @@ app/ui/settings/indexing/indexing.settings.component.html - 130 + 132 Statistic: @@ -1693,7 +1693,7 @@ Folders app/ui/settings/indexing/indexing.settings.component.html - 134 + 136 Folders @@ -1701,7 +1701,7 @@ Photos app/ui/settings/indexing/indexing.settings.component.html - 138 + 140 Photos @@ -1709,7 +1709,7 @@ Videos app/ui/settings/indexing/indexing.settings.component.html - 142 + 144 Videos @@ -1717,7 +1717,7 @@ Size app/ui/settings/indexing/indexing.settings.component.html - 147 + 149 Size @@ -1821,7 +1821,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 114 + 118 every @@ -1845,7 +1845,7 @@ Job: app/ui/settings/jobs/jobs.settings.component.html - 49 + 52 Job: @@ -1853,7 +1853,7 @@ Periodicity: app/ui/settings/jobs/jobs.settings.component.html - 62 + 66 Periodicity: @@ -1862,7 +1862,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 72 + 76 Set the time to run the job. @@ -1870,7 +1870,7 @@ After: app/ui/settings/jobs/jobs.settings.component.html - 78 + 82 After: @@ -1879,7 +1879,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 89 + 93 The job will run after that job finishes. @@ -1887,20 +1887,38 @@ At: app/ui/settings/jobs/jobs.settings.component.html - 96 + 100 app/ui/settings/jobs/jobs.settings.component.html - 106 + 110 At: + + Allow parallel run + + app/ui/settings/jobs/jobs.settings.component.html + 129 + + Allow parallel run + + + Enables the job to start even if an other job is already running. + + + app/ui/settings/jobs/jobs.settings.component.html + 144 + + Enables the job to start even if an other job is already running. + + ';' separated integers. app/ui/settings/jobs/jobs.settings.component.html - 175 + 198 ';' separated integers. @@ -1909,7 +1927,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 203 + 226 + Add Job @@ -1917,7 +1935,7 @@ Add new job app/ui/settings/jobs/jobs.settings.component.html - 218 + 241 Add new job @@ -1926,7 +1944,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 232 + 255 Select a job to schedule. @@ -1935,7 +1953,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 240 + 263 Add Job @@ -2374,13 +2392,13 @@ Job started - - Job stopped + + Stopping job src/frontend/app/ui/settings/jobs/button/job-button.settings.component.ts 1 - Job stopped + Stopping job Jobs diff --git a/src/frontend/translate/messages.fr.xlf b/src/frontend/translate/messages.fr.xlf index f8d16257..da5521a5 100644 --- a/src/frontend/translate/messages.fr.xlf +++ b/src/frontend/translate/messages.fr.xlf @@ -588,7 +588,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 237 + 260 Fermer @@ -710,7 +710,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 196 + 219 Enregistrer @@ -767,7 +767,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 200 + 223 Réinitialiser @@ -1685,7 +1685,7 @@ app/ui/settings/indexing/indexing.settings.component.html - 130 + 132 Statistique : @@ -1693,7 +1693,7 @@ Folders app/ui/settings/indexing/indexing.settings.component.html - 134 + 136 Dossiers @@ -1701,7 +1701,7 @@ Photos app/ui/settings/indexing/indexing.settings.component.html - 138 + 140 Photos @@ -1709,7 +1709,7 @@ Videos app/ui/settings/indexing/indexing.settings.component.html - 142 + 144 Vidéos @@ -1717,7 +1717,7 @@ Size app/ui/settings/indexing/indexing.settings.component.html - 147 + 149 Taille @@ -1821,7 +1821,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 114 + 118 every @@ -1845,7 +1845,7 @@ Job: app/ui/settings/jobs/jobs.settings.component.html - 49 + 52 Job: @@ -1853,7 +1853,7 @@ Periodicity: app/ui/settings/jobs/jobs.settings.component.html - 62 + 66 Periodicity: @@ -1862,7 +1862,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 72 + 76 Set the time to run the job. @@ -1870,7 +1870,7 @@ After: app/ui/settings/jobs/jobs.settings.component.html - 78 + 82 After: @@ -1879,7 +1879,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 89 + 93 The job will run after that job finishes. @@ -1887,20 +1887,38 @@ At: app/ui/settings/jobs/jobs.settings.component.html - 96 + 100 app/ui/settings/jobs/jobs.settings.component.html - 106 + 110 At: + + Allow parallel run + + app/ui/settings/jobs/jobs.settings.component.html + 129 + + Allow parallel run + + + Enables the job to start even if an other job is already running. + + + app/ui/settings/jobs/jobs.settings.component.html + 144 + + Enables the job to start even if an other job is already running. + + ';' separated integers. app/ui/settings/jobs/jobs.settings.component.html - 175 + 198 ';' separated integers. @@ -1909,7 +1927,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 203 + 226 + Add Job @@ -1917,7 +1935,7 @@ Add new job app/ui/settings/jobs/jobs.settings.component.html - 218 + 241 Add new job @@ -1926,7 +1944,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 232 + 255 Select a job to schedule. @@ -1935,7 +1953,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 240 + 263 Add Job @@ -2374,13 +2392,13 @@ Job started - - Job stopped + + Stopping job src/frontend/app/ui/settings/jobs/button/job-button.settings.component.ts 1 - Job stopped + Stopping job Jobs diff --git a/src/frontend/translate/messages.hu.xlf b/src/frontend/translate/messages.hu.xlf index 93b6f769..cc9877a3 100644 --- a/src/frontend/translate/messages.hu.xlf +++ b/src/frontend/translate/messages.hu.xlf @@ -588,7 +588,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 237 + 260 Bezárás @@ -710,7 +710,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 196 + 219 Mentés @@ -767,7 +767,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 200 + 223 Visszaállítás @@ -1685,7 +1685,7 @@ app/ui/settings/indexing/indexing.settings.component.html - 130 + 132 Statisztika: @@ -1693,7 +1693,7 @@ Folders app/ui/settings/indexing/indexing.settings.component.html - 134 + 136 Mappák @@ -1701,7 +1701,7 @@ Photos app/ui/settings/indexing/indexing.settings.component.html - 138 + 140 Fotók @@ -1709,7 +1709,7 @@ Videos app/ui/settings/indexing/indexing.settings.component.html - 142 + 144 Videók @@ -1717,7 +1717,7 @@ Size app/ui/settings/indexing/indexing.settings.component.html - 147 + 149 Méret @@ -1821,7 +1821,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 114 + 118 minden @@ -1845,7 +1845,7 @@ Job: app/ui/settings/jobs/jobs.settings.component.html - 49 + 52 Feladat: @@ -1853,7 +1853,7 @@ Periodicity: app/ui/settings/jobs/jobs.settings.component.html - 62 + 66 Gyakoriság: @@ -1862,7 +1862,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 72 + 76 Állítsd be, hogy mikos fusson a feladat. @@ -1870,7 +1870,7 @@ After: app/ui/settings/jobs/jobs.settings.component.html - 78 + 82 Ez után: @@ -1879,7 +1879,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 89 + 93 Ez a feladat a beállított feladat után fog futni. @@ -1887,20 +1887,37 @@ At: app/ui/settings/jobs/jobs.settings.component.html - 96 + 100 app/ui/settings/jobs/jobs.settings.component.html - 106 + 110 Ekkor: + + Allow parallel run + + app/ui/settings/jobs/jobs.settings.component.html + 129 + + Párhuzamos futtatás + + + Enables the job to start even if an other job is already running. + + + app/ui/settings/jobs/jobs.settings.component.html + 144 + + Akkor is elundul a feladat, ha egy másik már fut. + ';' separated integers. app/ui/settings/jobs/jobs.settings.component.html - 175 + 198 ';'-vel elválaszott egész számok. @@ -1909,7 +1926,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 203 + 226 + Új feladat @@ -1917,7 +1934,7 @@ Add new job app/ui/settings/jobs/jobs.settings.component.html - 218 + 241 Új feladat @@ -1926,7 +1943,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 232 + 255 Válaszd ki az ütemezendő feladatot. @@ -1935,7 +1952,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 240 + 263 Feladat hozzáadása @@ -2374,13 +2391,13 @@ Feladat elindult - - Job stopped + + Stopping job src/frontend/app/ui/settings/jobs/button/job-button.settings.component.ts 1 - Feladat leállt + Stopping job Jobs diff --git a/src/frontend/translate/messages.ro.xlf b/src/frontend/translate/messages.ro.xlf index 486f7a68..b8f390bf 100644 --- a/src/frontend/translate/messages.ro.xlf +++ b/src/frontend/translate/messages.ro.xlf @@ -588,7 +588,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 237 + 260 Închide @@ -710,7 +710,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 196 + 219 Salvare @@ -767,7 +767,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 200 + 223 Restabilire @@ -1685,7 +1685,7 @@ app/ui/settings/indexing/indexing.settings.component.html - 130 + 132 Statistici: @@ -1693,7 +1693,7 @@ Folders app/ui/settings/indexing/indexing.settings.component.html - 134 + 136 Dosare @@ -1701,7 +1701,7 @@ Photos app/ui/settings/indexing/indexing.settings.component.html - 138 + 140 Fotografii @@ -1709,7 +1709,7 @@ Videos app/ui/settings/indexing/indexing.settings.component.html - 142 + 144 Videoclipuri @@ -1717,7 +1717,7 @@ Size app/ui/settings/indexing/indexing.settings.component.html - 147 + 149 Dimensiuni @@ -1821,7 +1821,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 114 + 118 every @@ -1845,7 +1845,7 @@ Job: app/ui/settings/jobs/jobs.settings.component.html - 49 + 52 Job: @@ -1853,7 +1853,7 @@ Periodicity: app/ui/settings/jobs/jobs.settings.component.html - 62 + 66 Periodicity: @@ -1862,7 +1862,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 72 + 76 Set the time to run the job. @@ -1870,7 +1870,7 @@ After: app/ui/settings/jobs/jobs.settings.component.html - 78 + 82 After: @@ -1879,7 +1879,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 89 + 93 The job will run after that job finishes. @@ -1887,20 +1887,38 @@ At: app/ui/settings/jobs/jobs.settings.component.html - 96 + 100 app/ui/settings/jobs/jobs.settings.component.html - 106 + 110 At: + + Allow parallel run + + app/ui/settings/jobs/jobs.settings.component.html + 129 + + Allow parallel run + + + Enables the job to start even if an other job is already running. + + + app/ui/settings/jobs/jobs.settings.component.html + 144 + + Enables the job to start even if an other job is already running. + + ';' separated integers. app/ui/settings/jobs/jobs.settings.component.html - 175 + 198 ';' separated integers. @@ -1909,7 +1927,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 203 + 226 + Add Job @@ -1917,7 +1935,7 @@ Add new job app/ui/settings/jobs/jobs.settings.component.html - 218 + 241 Add new job @@ -1926,7 +1944,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 232 + 255 Select a job to schedule. @@ -1935,7 +1953,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 240 + 263 Add Job @@ -2374,13 +2392,13 @@ Job started - - Job stopped + + Stopping job src/frontend/app/ui/settings/jobs/button/job-button.settings.component.ts 1 - Job stopped + Stopping job Jobs diff --git a/src/frontend/translate/messages.ru.xlf b/src/frontend/translate/messages.ru.xlf index 3e522dab..87da6139 100644 --- a/src/frontend/translate/messages.ru.xlf +++ b/src/frontend/translate/messages.ru.xlf @@ -588,7 +588,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 237 + 260 Закрыть @@ -710,7 +710,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 196 + 219 Сохранить @@ -767,7 +767,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 200 + 223 Сбросить @@ -1685,7 +1685,7 @@ app/ui/settings/indexing/indexing.settings.component.html - 130 + 132 Статистика: @@ -1693,7 +1693,7 @@ Folders app/ui/settings/indexing/indexing.settings.component.html - 134 + 136 Папки @@ -1701,7 +1701,7 @@ Photos app/ui/settings/indexing/indexing.settings.component.html - 138 + 140 Фото @@ -1709,7 +1709,7 @@ Videos app/ui/settings/indexing/indexing.settings.component.html - 142 + 144 Видео @@ -1717,7 +1717,7 @@ Size app/ui/settings/indexing/indexing.settings.component.html - 147 + 149 Размер @@ -1821,7 +1821,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 114 + 118 every @@ -1845,7 +1845,7 @@ Job: app/ui/settings/jobs/jobs.settings.component.html - 49 + 52 Job: @@ -1853,7 +1853,7 @@ Periodicity: app/ui/settings/jobs/jobs.settings.component.html - 62 + 66 Periodicity: @@ -1862,7 +1862,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 72 + 76 Set the time to run the job. @@ -1870,7 +1870,7 @@ After: app/ui/settings/jobs/jobs.settings.component.html - 78 + 82 After: @@ -1879,7 +1879,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 89 + 93 The job will run after that job finishes. @@ -1887,20 +1887,38 @@ At: app/ui/settings/jobs/jobs.settings.component.html - 96 + 100 app/ui/settings/jobs/jobs.settings.component.html - 106 + 110 At: + + Allow parallel run + + app/ui/settings/jobs/jobs.settings.component.html + 129 + + Allow parallel run + + + Enables the job to start even if an other job is already running. + + + app/ui/settings/jobs/jobs.settings.component.html + 144 + + Enables the job to start even if an other job is already running. + + ';' separated integers. app/ui/settings/jobs/jobs.settings.component.html - 175 + 198 ';' separated integers. @@ -1909,7 +1927,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 203 + 226 + Add Job @@ -1917,7 +1935,7 @@ Add new job app/ui/settings/jobs/jobs.settings.component.html - 218 + 241 Add new job @@ -1926,7 +1944,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 232 + 255 Select a job to schedule. @@ -1935,7 +1953,7 @@ app/ui/settings/jobs/jobs.settings.component.html - 240 + 263 Add Job @@ -2374,13 +2392,13 @@ Job started - - Job stopped + + Stopping job src/frontend/app/ui/settings/jobs/button/job-button.settings.component.ts 1 - Job stopped + Stopping job Jobs