Added timed scheduled runs

This commit is contained in:
Jeroen De Meerleer 2023-01-10 17:21:49 +01:00
parent f77d487ab2
commit 21f65e2480
Signed by: JeroenED
GPG Key ID: 28CCCB8F62BFADD6
21 changed files with 1703 additions and 231 deletions

View File

@ -1,4 +1,7 @@
# Changelog
## Version 1.2
### New
* Added timed scheduled runs
## Version 1.1

View File

@ -9,4 +9,28 @@ Utils.initTags = () => {
})
}
Utils.timepickerOptions = {
localization:{
locale: 'nl',
format: 'dd/MM/yyyy HH:mm:ss'
},
display: {
icons: {
time: 'icon-clock-o',
date: 'icon-calendar',
up: 'icon-arrow-up',
down: 'icon-arrow-down',
previous: 'icon-chevron-left',
next: 'icon-chevron-right',
today: 'icon-calendar-check-o',
clear: 'icon-delete',
close: 'icon-x',
},
components: {
seconds: true,
useTwentyfourHour: true
}
},
}
export default Utils;

View File

@ -1,7 +1,6 @@
import 'bootstrap';
import moment from 'moment';
import * as tempusDominus from '@eonasdan/tempus-dominus/dist/js/tempus-dominus';
import customDateFormat from '@eonasdan/tempus-dominus/dist/plugins/customDateFormat'
import {TempusDominus,extend} from "@eonasdan/tempus-dominus";
import customDateFormat from '@eonasdan/tempus-dominus/dist/plugins/customDateFormat';
import Utils from "./Utils";
document.addEventListener("readystatechange", event => {
@ -18,34 +17,11 @@ document.addEventListener("readystatechange", event => {
}
});
const timepickerOptions = {
localization:{
locale: 'nl',
format: 'dd/MM/yyyy HH:mm:ss'
},
display: {
icons: {
time: 'icon-clock-o',
date: 'icon-calendar',
up: 'icon-arrow-up',
down: 'icon-arrow-down',
previous: 'icon-chevron-left',
next: 'icon-chevron-right',
today: 'icon-calendar-check-o',
clear: 'icon-delete',
close: 'icon-x',
},
components: {
seconds: true,
useTwentyfourHour: true
}
},
}
function initDatePickers()
{
tempusDominus.extend(customDateFormat);
new tempusDominus.TempusDominus(document.querySelector('#nextrunselector'), timepickerOptions);
new tempusDominus.TempusDominus(document.querySelector('#lastrunselector'), timepickerOptions);
extend(customDateFormat);
new TempusDominus(document.querySelector('#nextrunselector'), Utils.timepickerOptions);
new TempusDominus(document.querySelector('#lastrunselector'), Utils.timepickerOptions);
}
function initCronType()

View File

@ -2,11 +2,14 @@ import {Modal} from 'bootstrap';
import image from '/assets/images/ajax-loader.gif'
import '/assets/scss/job/index.scss';
import Utils from "./Utils";
import customDateFormat from '@eonasdan/tempus-dominus/dist/plugins/customDateFormat';
import {DateTime,TempusDominus,extend} from "@eonasdan/tempus-dominus";
document.addEventListener("readystatechange", event => {
if(event.target.readyState === 'complete') {
initDeleteButtons();
initRunNowButtons();
initRunButtons();
initTimepicker();
Utils.initTags();
}
});
@ -27,55 +30,98 @@ function initDeleteButtons() {
}));
}
function initRunNowButtons() {
document.querySelectorAll('.runnow').forEach(elem => elem.addEventListener("click", event => {
var selecttimedatepicker;
function initTimepicker() {
extend(customDateFormat);
let modal = document.querySelector('#run_selecttime');
let datepickeroptions = Utils.timepickerOptions;
datepickeroptions.display.inline = true;
datepickeroptions.display.sideBySide = true;
datepickeroptions.restrictions = {
minDate: new Date()
};
selecttimedatepicker = new TempusDominus(document.querySelector('#selecttime_datepicker'), datepickeroptions);
}
function initRunButtons() {
document.querySelectorAll('.run').forEach(elem => elem.addEventListener("click", event => {
let me = event.currentTarget;
let href = me.dataset.href;
let runnowCnt = document.querySelector('.runnow-content');
if(runnowCnt.querySelector('img') === null) {
let loaderImg = document.createElement('img');
loaderImg.src = image;
runnowCnt.appendChild(loaderImg);
let norun = me.closest('tr').classList.contains('norun')
let maxdate = new DateTime(me.dataset.nextrun)
if (maxdate < new DateTime() ) {
if (norun) {
maxdate = undefined;
} else {
console.error('You cannot have to be run jobs in the past');
return;
}
}
document.querySelector('.container-fluid').classList.add('blur');
document.querySelector('.runnow-overlay').classList.add('d-block');
document.querySelector('.runnow-overlay').classList.remove('d-none');
fetch(href, { method: 'GET' })
.then(response => response.json())
.then(data => {
let modal = document.querySelector('#runnow_result');
modal.querySelector('.modal-title').innerHTML = data.title;
if (data.status == 'deferred') {
modal.querySelector('.modal-body').innerHTML = data.message;
me.classList.add('disabled');
let td = me.closest('td');
td.querySelectorAll('.btn').forEach(btn => {
btn.classList.add('btn-outline-success');
btn.classList.remove('btn-outline-primary');
btn.classList.remove('btn-outline-danger');
})
let tr = me.closest('tr');
tr.classList.add('running');
tr.classList.add('text-success');
tr.classList.remove('norun');
tr.classList.remove('text-danger');
} else if (data.status == 'ran') {
let content = '<p>' + data.message + '</p>'
content += '<pre>' + data.output + '</pre>'
modal.querySelector('.modal-body').innerHTML = content;
}
var bsModal = new Modal('#runnow_result').show();
document.querySelector('.container-fluid').classList.remove('blur');
document.querySelector('.runnow-overlay').classList.remove('d-block');
document.querySelector('.runnow-overlay').classList.add('d-none');
})
selecttimedatepicker.updateOptions({
restrictions: {
maxDate: maxdate
}
})
selecttimedatepicker.viewDate = new DateTime();
var bsModal = new Modal('#run_selecttime');
bsModal.show();
document.querySelectorAll('.schedule').forEach(elem => elem.addEventListener("click", event => {
bsModal.hide();
let time = Math.floor(selecttimedatepicker.viewDate / 1000);
run(me, time);
}));
document.querySelectorAll('.run-now').forEach(elem => elem.addEventListener("click", event => {
bsModal.hide();
run(me);
}));
}));
}
function run(elem, time = 0) {
let href = elem.dataset.href;
if (time > 0) href = href + '/' + time.toString();
let runCnt = document.querySelector('.run-content');
if(runCnt.querySelector('img') === null) {
let loaderImg = document.createElement('img');
loaderImg.src = image;
runCnt.appendChild(loaderImg);
}
document.querySelector('.container-fluid').classList.add('blur');
document.querySelector('.run-overlay').classList.add('d-block');
document.querySelector('.run-overlay').classList.remove('d-none');
fetch(href, { method: 'GET' })
.then(response => response.json())
.then(data => {
let modal = document.querySelector('#run_result');
modal.querySelector('.modal-title').innerHTML = data.title;
if (data.status == 'deferred') {
modal.querySelector('.modal-body').innerHTML = data.message;
elem.classList.add('disabled');
let td = elem.closest('td');
td.querySelectorAll('.btn').forEach(btn => {
btn.classList.add('btn-outline-success');
btn.classList.remove('btn-outline-primary');
btn.classList.remove('btn-outline-danger');
})
let tr = elem.closest('tr');
tr.classList.add('running');
tr.classList.add('text-success');
tr.classList.remove('norun');
tr.classList.remove('text-danger');
} else if (data.status == 'ran') {
let content = '<p>' + data.message + '</p>'
content += '<pre>' + data.output + '</pre>'
modal.querySelector('.modal-body').innerHTML = content;
}
var runModal = new Modal('#run_result');
runModal.show();
document.querySelector('.container-fluid').classList.remove('blur');
document.querySelector('.run-overlay').classList.remove('d-block');
document.querySelector('.run-overlay').classList.add('d-none');
})
)
}

View File

@ -1,5 +1,7 @@
@import "/assets/scss/base";
@import "/assets/scss/icons";
@import "assets/scss/base";
@import "assets/scss/icons";
@import "/node_modules/@eonasdan/tempus-dominus/dist/css/tempus-dominus.css";
@import "assets/scss/tempus-dominus-dark";
tr.norun td {
background-color: #f8d7da;
@ -33,8 +35,8 @@ td.status-col {
filter: blur(3px);
}
.runnow-overlay {
.runnow-blur {
.run-overlay {
.run-blur {
bottom: 0;
left: 0;
position: fixed;
@ -43,7 +45,7 @@ td.status-col {
z-index: 1500;
}
.runnow-content {
.run-content {
font-size: 10px;
height: 50px;
position: absolute;
@ -54,4 +56,22 @@ td.status-col {
margin-left: -50px;
margin-top: -50px;
}
}
#run_selecttime {
.tempus-dominus-widget {
box-shadow: none;
&.timepicker-sbs {
width: 19em;
.td-row {
flex-direction: column;
.td-half {
width: 19em;
}
}
}
}
}

View File

@ -61,11 +61,14 @@ job_edit:
requirements:
id: \d+
job_runnow:
path: '/{_locale}/job/{id}/runnow'
controller: App\Controller\JobController::runNowAction
job_run:
path: '/{_locale}/job/{id}/run/{timestamp}'
controller: App\Controller\JobController::runAction
requirements:
id: \d+
timestamp: \d+
defaults:
timestamp: 0
job_add:
path: '/{_locale}/job/add'

View File

@ -63,7 +63,7 @@ class DaemonCommand extends Command
$consolerun = $jobRepo->getTempVar($job, 'consolerun', false);
if($consolerun && !$rebootedself) continue;
}
$manual = ($job->getRunning() == 2);
$manual = ($job->getRunning() > 1);
$jobRepo->setJobRunning($job, true);
$output->writeln('Running Job ' . $job->getId());
if($async) {

View File

@ -47,14 +47,14 @@ class RunCommand extends Command
}
$jobRepo->setJobRunning($job, true);
$jobRepo->setTempVar($job, 'consolerun', true);
$result = $jobRepo->runNow($job, true);
$result = $jobRepo->run($job, true);
if($job->getData('crontype') == 'reboot') {
$sleeping = true;
while($sleeping) {
if(time() >= $job->getRunning()) $sleeping = false;
sleep(1);
}
$result = $jobRepo->runNow($job, true);
$result = $jobRepo->run($job, true);
}
$jobRepo->setJobRunning($job, false);
$jobRepo->setTempVar($job, 'consolerun', false);

View File

@ -81,30 +81,30 @@ class JobController extends AbstractController
}
}
public function runNowAction(Request $request, ManagerRegistry $doctrine, TranslatorInterface $translator, int $id): JsonResponse
public function runAction(Request $request, ManagerRegistry $doctrine, TranslatorInterface $translator, int $id, int $timestamp): JsonResponse
{
if($request->getMethod() == 'GET') {
$jobRepo = $doctrine->getRepository(Job::class);
$job = $jobRepo->find($id);
$runnowResult = $jobRepo->runNow($job);
if ($runnowResult['success'] === NULL) {
$runResult = $jobRepo->run($job, false, $timestamp);
if ($runResult['success'] === NULL) {
$return = [
'status' => 'deferred',
'success' => NULL,
'title' => $translator->trans('job.index.runnow.deferred.title'),
'message' => $translator->trans('job.index.runnow.deferred.message')
'title' => $translator->trans('job.index.run.deferred.title'),
'message' => $translator->trans('job.index.run.deferred.message')
];
} else {
$return = [
'status' => 'ran',
'success' => $runnowResult['success'],
'title' => $runnowResult['success'] ? $translator->trans('job.index.runnow.ran.title.success') : $translator->trans('job.index.runnow.ran.title.failed'),
'message' => $translator->trans('job.index.runnow.ran.message', [
'_runtime_' => number_format($runnowResult['runtime'], 3),
'_exitcode_' => $runnowResult['exitcode']
'success' => $runResult['success'],
'title' => $runResult['success'] ? $translator->trans('job.index.run.ran.title.success') : $translator->trans('job.index.run.ran.title.failed'),
'message' => $translator->trans('job.index.run.ran.message', [
'_runtime_' => number_format($runResult['runtime'], 3),
'_exitcode_' => $runResult['exitcode']
]),
'exitcode' => $runnowResult['exitcode'],
'output' => $runnowResult['output'],
'exitcode' => $runResult['exitcode'],
'output' => $runResult['output'],
];
}
return new JsonResponse($return);

View File

@ -142,7 +142,7 @@ class JobRepository extends EntityRepository
{
$em = $this->getEntityManager();
if(in_array($job->getRunning(), [0,1,2])) $job->setRunning($status ? 1 : 0);
$job->setRunning($status ? 1 : 0);
$em->persist($job);
$em->flush();
@ -320,7 +320,7 @@ class JobRepository extends EntityRepository
private function runRebootJob(Job &$job, float &$starttime, bool &$manual): array
{
$em = $this->getEntityManager();
if($job->getRunning() == 1) {
if($this->getTempVar($job, 'rebooting', false) === false) {
if(isset($_ENV['DEMO_MODE']) && $_ENV['DEMO_MODE'] == 'true') {
$job->setRunning(time() + $job->getData('reboot-delay-secs') + ($job->getData('reboot-duration') * 60));
$em->persist($job);
@ -341,6 +341,7 @@ class JobRepository extends EntityRepository
}
$job->setRunning(time() + $job->getData('reboot-delay-secs') + ($job->getData('reboot-duration') * 60));
$this->setTempVar($job, 'rebooting', true);
$em->persist($job);
$em->flush();
@ -358,7 +359,7 @@ class JobRepository extends EntityRepository
}
return ['status' => 'deferred'];
} elseif($job->getRunning() != 0) {
} elseif($this->getTempVar($job, 'rebooting', false) === true) {
if($job->getRunning() > time()) {
return ['status' => 'deferred'];
}
@ -411,11 +412,15 @@ class JobRepository extends EntityRepository
* @return array
* @throws \Doctrine\DBAL\Exception
*/
public function runNow(Job &$job, $console = false) {
public function run(Job &$job, $console = false, int $timestamp = 0)
{
$em = $this->getEntityManager();
$runRepo = $this->getEntityManager()->getRepository(Run::class);
if($console == false && ($runRepo->isSlowJob($job)) || count($job->getRuns()) == 0 || $job->getData('crontype') === 'reboot') {
if ($timestamp > 0) {
$job->setRunning($timestamp);
$em->persist($job);
$em->flush();
} elseif($console == false && ($runRepo->isSlowJob($job)) || count($job->getRuns()) == 0 || $job->getData('crontype') === 'reboot') {
if(in_array($job->getRunning(), [0,1,2])) {
$job->setRunning(2);
$em->persist($job);
@ -506,7 +511,6 @@ class JobRepository extends EntityRepository
} while ($nextrun < time());
$job->setNextrun($nextrun);
}
$this->deleteTempVar($job);

View File

@ -25,7 +25,7 @@
<td class="d-block d-md-table-cell align-middle">{{ job.interval | interval }}</td>
<td class="d-block d-md-table-cell align-middle">{{ job.nextrun | date("d/m/Y H:i:s") }}</td>
<td class="text-md-end d-block d-md-table-cell align-middle">
<a href="javascript:void(0);" data-href="{{ path('job_runnow', {'id': job.id}) }}" class="runnow btn btn-outline-{% if job.data.running == true %}success{% elseif job.data.norun == true %}danger{% else %}primary{% endif %}{% if job.data.running == true %} disabled{% endif %}"><i class="icon icon-run" aria-hidden="true"></i></a>
<a href="javascript:void(0);" data-nextrun="{{ job.nextrun | date("Y/m/d H:i:s") }}" data-href="{{ path('job_run', {'id': job.id}) }}" class="run btn btn-outline-{% if job.data.running == true %}success{% elseif job.data.norun == true %}danger{% else %}primary{% endif %}{% if job.data.running == true %} disabled{% endif %}"><i class="icon icon-run" aria-hidden="true"></i></a>
<a href="{{ path('job_view', {'id': job.id}) }}" class="btn btn-outline-{% if job.data.running == true %}success{% elseif job.data.norun == true %}danger{% else %}primary{% endif %}"><i class="icon icon-view" aria-hidden="true"></i></a>
<a href="{{ path('job_edit', {'id': job.id}) }}" class="btn btn-outline-{% if job.data.running == true %}success{% elseif job.data.norun == true %}danger{% else %}primary{% endif %}"><i class="icon icon-edit" aria-hidden="true"></i></a>
<a href="javascript:void(0);" data-confirmation="Are you sure you want to delete this job?" data-href="{{ path('job_delete', {'id': job.id}) }}" class="delete-btn btn btn-outline-{% if job.data.running == true %}success{% elseif job.data.norun == true %}danger{% else %}primary{% endif %}"><i class="icon icon-delete" aria-hidden="true"></i></a>
@ -34,7 +34,31 @@
{% endfor %}
</tbody>
</table>
<div class="modal fade" id="runnow_result" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal fade" id="run_selecttime" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="staticBackdropLabel">{{ "job.index.run.selecttime.header" | trans }}</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close">
<span aria-hidden="true"></span>
</button>
</div>
<div class="modal-body">
<p>{{ "job.index.run.selecttime.description" | trans }}</p>
<div class="d-flex flex-column align-items-center selecttimepickers">
<div id="selecttime_datepicker">
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline-primary schedule" data-bs-dismiss="modal">{{ "job.index.run.selecttime.btnschedule.label" | trans }}</button>
<button type="button" class="btn btn-outline-success run-now" data-bs-dismiss="modal">{{ "job.index.run.selecttime.btnrunnow.label" | trans }}</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="run_result" data-backdrop="static" data-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
@ -47,7 +71,7 @@
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline-primary" data-bs-dismiss="modal">Close</button>
<button type="button" class="btn btn-outline-primary" data-bs-dismiss="modal">{{ "job.index.run.ran.btnclose.label" | trans }}</button>
</div>
</div>
</div>
@ -55,10 +79,10 @@
{% endblock %}
{% block extrahtml %}
<div class="runnow-overlay d-none">
<div class="runnow-content">
<div class="run-overlay d-none">
<div class="run-content">
</div>
<div class="runnow-blur"></div>
<div class="run-blur"></div>
</div>
{% endblock %}

View File

@ -1,5 +1,5 @@
{% extends "base.html.twig" %}
{% block title %}{{ 'job.title' | trans({ '_jobname_': job.name }) }}{% endblock %}
{% block title %}{{ 'job.view.title' | trans({ '_jobname_': job.name }) }}{% endblock %}
{% block content %}
<h2>{{ 'job.view.header' | trans({ '_jobname_': (job.name | parsetags) }) | raw }}</h2>
<p>

View File

@ -161,26 +161,6 @@
<source>job.index.table.headers.nextrun</source>
<target>Next run</target>
</trans-unit>
<trans-unit id="n9XSrh3" resname="job.index.runnow.deferred.title">
<source>job.index.runnow.deferred.title</source>
<target>Cronjob has been scheduled</target>
</trans-unit>
<trans-unit id="2QVNoEx" resname="job.index.runnow.deferred.message">
<source>job.index.runnow.deferred.message</source>
<target>Job was scheduled to be run. You will find the output soon in the job details</target>
</trans-unit>
<trans-unit id="_9vL1xO" resname="job.index.runnow.ran.title.success">
<source>job.index.runnow.ran.title.success</source>
<target>Cronjob succesfully ran</target>
</trans-unit>
<trans-unit id="SH3oarr" resname="job.index.runnow.ran.title.failed">
<source>job.index.runnow.ran.title.failed</source>
<target>Cronjob failed. Please check output below</target>
</trans-unit>
<trans-unit id="az3XJT4" resname="job.index.runnow.ran.message">
<source>job.index.runnow.ran.message</source>
<target>Cronjob ran in _runtime_ seconds with exit code _exitcode_</target>
</trans-unit>
<trans-unit id="mokjk0L" resname="job.index.flashes.jobdeleted">
<source>job.index.flashes.jobdeleted</source>
<target>Cronjob is successfully deleted</target>
@ -613,6 +593,46 @@
<source>footer.source</source>
<target>Source</target>
</trans-unit>
<trans-unit id="X.uZ4TL" resname="job.index.run.selecttime.header">
<source>job.index.run.selecttime.header</source>
<target>When to run this job?</target>
</trans-unit>
<trans-unit id="i4An5BC" resname="job.index.run.selecttime.description">
<source>job.index.run.selecttime.description</source>
<target>Please select the time to run this job</target>
</trans-unit>
<trans-unit id="tav8v0S" resname="job.index.run.selecttime.btnschedule.label">
<source>job.index.run.selecttime.btnschedule.label</source>
<target>Schedule</target>
</trans-unit>
<trans-unit id="St.ceTi" resname="job.index.run.selecttime.btnrunnow.label">
<source>job.index.run.selecttime.btnrunnow.label</source>
<target>Run now</target>
</trans-unit>
<trans-unit id="XAxpenS" resname="job.index.run.ran.btnclose.label">
<source>job.index.run.ran.btnclose.label</source>
<target>Close</target>
</trans-unit>
<trans-unit id="QH_iTBI" resname="job.index.run.deferred.title">
<source>job.index.run.deferred.title</source>
<target>Cronjob has been scheduled</target>
</trans-unit>
<trans-unit id="QqC.rDo" resname="job.index.run.deferred.message">
<source>job.index.run.deferred.message</source>
<target>Job was scheduled to be run. You will find the output soon in the job details</target>
</trans-unit>
<trans-unit id="0DypXnU" resname="job.index.run.ran.title.success">
<source>job.index.run.ran.title.success</source>
<target>Cronjob succesfully ran</target>
</trans-unit>
<trans-unit id="7wkhcjy" resname="job.index.run.ran.title.failed">
<source>job.index.run.ran.title.failed</source>
<target>Cronjob failed. Please check output below</target>
</trans-unit>
<trans-unit id="W_dAs4D" resname="job.index.run.ran.message">
<source>job.index.run.ran.message</source>
<target>Cronjob ran in _runtime_ seconds with exit code _exitcode_</target>
</trans-unit>
</body>
</file>
</xliff>

View File

@ -0,0 +1,606 @@
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="en" target-language="fr" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="qvIyBkY" resname="title">
<source>title</source>
<target state="final">Webcron management</target>
</trans-unit>
<trans-unit id="HgWEol2" resname="header">
<source>header</source>
<target state="final">Webcron management</target>
</trans-unit>
<trans-unit id="Q54TzT5" resname="demomode.flashnotice">
<source>demomode.flashnotice</source>
<target state="final">Cette application est en mode démo. Les modifications sont maintenues dans la base de données, mais les tâches ne sont pas exécutées</target>
</trans-unit>
<trans-unit id="rpq61qN" resname="demomode.credentials.header">
<source>demomode.credentials.header</source>
<target state="final">Connexion en mode démo</target>
</trans-unit>
<trans-unit id="jUz9fVE" resname="demomode.credentials.username">
<source>demomode.credentials.username</source>
<target state="final">Utilisateur</target>
</trans-unit>
<trans-unit id="QNu97w_" resname="demomode.credentials.password">
<source>demomode.credentials.password</source>
<target state="final">Mot de passe</target>
</trans-unit>
<trans-unit id="U8IBiON" resname="menu.overview">
<source>menu.overview</source>
<target state="final">Aperçu </target>
</trans-unit>
<trans-unit id="iGC7eCk" resname="menu.add">
<source>menu.add</source>
<target state="final">Ajouter une nouvelle tâche</target>
</trans-unit>
<trans-unit id="4UTsL.X" resname="menu.settings">
<source>menu.settings</source>
<target state="final">Paramètres</target>
</trans-unit>
<trans-unit id="wBTFKFR" resname="menu.logout">
<source>menu.logout</source>
<target state="final">Déconnexion</target>
</trans-unit>
<trans-unit id="4cxyGOO" resname="security.login.username.label">
<source>security.login.username.label</source>
<target state="final">Utilisateur</target>
</trans-unit>
<trans-unit id="u2tKtI1" resname="security.login.username.placeholder">
<source>security.login.username.placeholder</source>
<target state="final">jean@exemple.fr</target>
</trans-unit>
<trans-unit id="Niy_SZ2" resname="security.login.password.label">
<source>security.login.password.label</source>
<target state="final">Mot de passe</target>
</trans-unit>
<trans-unit id="3rU2_6v" resname="security.login.password.placeholder">
<source>security.login.password.placeholder</source>
<target state="final">Paris75000</target>
</trans-unit>
<trans-unit id="0MGdvgf" resname="security.login.remember.label">
<source>security.login.remember.label</source>
<target state="final">Rappele-moi</target>
</trans-unit>
<trans-unit id="4GvZndQ" resname="security.login.submit-btn.label">
<source>security.login.submit-btn.label</source>
<target state="final">Connecter</target>
</trans-unit>
<trans-unit id="W.225Bj" resname="settings.title">
<source>settings.title</source>
<target state="final">Paramètres</target>
</trans-unit>
<trans-unit id="a1bm5YC" resname="settings.header">
<source>settings.header</source>
<target state="final">Paramètres</target>
</trans-unit>
<trans-unit id="aAt4FLV" resname="settings.password.header">
<source>settings.password.header</source>
<target state="final">Mot de passe</target>
</trans-unit>
<trans-unit id="qqAzx9b" resname="settings.password.current.label">
<source>settings.password.current.label</source>
<target state="final">Mot de passe actuel</target>
</trans-unit>
<trans-unit id="rr8bU5t" resname="settings.password.current.placeholder">
<source>settings.password.current.placeholder</source>
<target state="final">Paris75000</target>
</trans-unit>
<trans-unit id="YVhGwqr" resname="settings.password.password.label">
<source>settings.password.password.label</source>
<target state="final">Nouveau mot de passe</target>
</trans-unit>
<trans-unit id="OZpjE9T" resname="settings.password.password.placeholder">
<source>settings.password.password.placeholder</source>
<target state="final">Nice06000</target>
</trans-unit>
<trans-unit id="TNBtpD_" resname="settings.password.repeat.label">
<source>settings.password.repeat.label</source>
<target state="final">Confirmer mot de passe</target>
</trans-unit>
<trans-unit id="bYb7Tz." resname="settings.password.repeat.placeholder">
<source>settings.password.repeat.placeholder</source>
<target state="final">Nice06000</target>
</trans-unit>
<trans-unit id="QH_iTBI" resname="job.index.run.deferred.title">
<source>job.index.run.deferred.title</source>
<target>__job.index.run.deferred.title</target>
</trans-unit>
<trans-unit id="QqC.rDo" resname="job.index.run.deferred.message">
<source>job.index.run.deferred.message</source>
<target>__job.index.run.deferred.message</target>
</trans-unit>
<trans-unit id="0DypXnU" resname="job.index.run.ran.title.success">
<source>job.index.run.ran.title.success</source>
<target>__job.index.run.ran.title.success</target>
</trans-unit>
<trans-unit id="7wkhcjy" resname="job.index.run.ran.title.failed">
<source>job.index.run.ran.title.failed</source>
<target>__job.index.run.ran.title.failed</target>
</trans-unit>
<trans-unit id="W_dAs4D" resname="job.index.run.ran.message">
<source>job.index.run.ran.message</source>
<target>__job.index.run.ran.message</target>
</trans-unit>
<trans-unit id="g7pEpsB" resname="footer.title">
<source>footer.title</source>
<target>__footer.title</target>
</trans-unit>
<trans-unit id="Lz7YjVX" resname="footer.source">
<source>footer.source</source>
<target>__footer.source</target>
</trans-unit>
<trans-unit id="0eRDYaC" resname="job.index.title">
<source>job.index.title</source>
<target>__job.index.title</target>
</trans-unit>
<trans-unit id="J.7dT3_" resname="job.index.header">
<source>job.index.header</source>
<target>__job.index.header</target>
</trans-unit>
<trans-unit id="T0URP45" resname="job.index.table.headers.name">
<source>job.index.table.headers.name</source>
<target>__job.index.table.headers.name</target>
</trans-unit>
<trans-unit id="vNWgxUJ" resname="job.index.table.headers.host">
<source>job.index.table.headers.host</source>
<target>__job.index.table.headers.host</target>
</trans-unit>
<trans-unit id="1YQJCGW" resname="job.index.table.headers.interval">
<source>job.index.table.headers.interval</source>
<target>__job.index.table.headers.interval</target>
</trans-unit>
<trans-unit id="mZ.gLJq" resname="job.index.table.headers.nextrun">
<source>job.index.table.headers.nextrun</source>
<target>__job.index.table.headers.nextrun</target>
</trans-unit>
<trans-unit id="X.uZ4TL" resname="job.index.run.selecttime.header">
<source>job.index.run.selecttime.header</source>
<target>__job.index.run.selecttime.header</target>
</trans-unit>
<trans-unit id="i4An5BC" resname="job.index.run.selecttime.description">
<source>job.index.run.selecttime.description</source>
<target>__job.index.run.selecttime.description</target>
</trans-unit>
<trans-unit id="tav8v0S" resname="job.index.run.selecttime.btnschedule.label">
<source>job.index.run.selecttime.btnschedule.label</source>
<target>__job.index.run.selecttime.btnschedule.label</target>
</trans-unit>
<trans-unit id="St.ceTi" resname="job.index.run.selecttime.btnrunnow.label">
<source>job.index.run.selecttime.btnrunnow.label</source>
<target>__job.index.run.selecttime.btnrunnow.label</target>
</trans-unit>
<trans-unit id="XAxpenS" resname="job.index.run.ran.btnclose.label">
<source>job.index.run.ran.btnclose.label</source>
<target>__job.index.run.ran.btnclose.label</target>
</trans-unit>
<trans-unit id="CPdXoro" resname="job.add.title">
<source>job.add.title</source>
<target>__job.add.title</target>
</trans-unit>
<trans-unit id=".pKQkI0" resname="job.add.header">
<source>job.add.header</source>
<target>__job.add.header</target>
</trans-unit>
<trans-unit id="h9UI9nK" resname="job.addedit.generalinfo.header">
<source>job.addedit.generalinfo.header</source>
<target>__job.addedit.generalinfo.header</target>
</trans-unit>
<trans-unit id="2.rDz7o" resname="job.addedit.generalinfo.name.label">
<source>job.addedit.generalinfo.name.label</source>
<target>__job.addedit.generalinfo.name.label</target>
</trans-unit>
<trans-unit id="3FV9jvC" resname="job.addedit.generalinfo.name.placeholder">
<source>job.addedit.generalinfo.name.placeholder</source>
<target>__job.addedit.generalinfo.name.placeholder</target>
</trans-unit>
<trans-unit id="j9FTkRt" resname="job.addedit.generalinfo.name.helptext">
<source>job.addedit.generalinfo.name.helptext</source>
<target>__job.addedit.generalinfo.name.helptext</target>
</trans-unit>
<trans-unit id="CL7GVb3" resname="job.addedit.generalinfo.interval.label">
<source>job.addedit.generalinfo.interval.label</source>
<target>__job.addedit.generalinfo.interval.label</target>
</trans-unit>
<trans-unit id="OTx9beS" resname="job.addedit.generalinfo.interval.patterns.label">
<source>job.addedit.generalinfo.interval.patterns.label</source>
<target>__job.addedit.generalinfo.interval.patterns.label</target>
</trans-unit>
<trans-unit id="0ATgoBe" resname="job.addedit.generalinfo.interval.patterns.minute">
<source>job.addedit.generalinfo.interval.patterns.minute</source>
<target>__job.addedit.generalinfo.interval.patterns.minute</target>
</trans-unit>
<trans-unit id="f0o1GlZ" resname="job.addedit.generalinfo.interval.patterns.hour">
<source>job.addedit.generalinfo.interval.patterns.hour</source>
<target>__job.addedit.generalinfo.interval.patterns.hour</target>
</trans-unit>
<trans-unit id="hCmc8AA" resname="job.addedit.generalinfo.interval.patterns.day">
<source>job.addedit.generalinfo.interval.patterns.day</source>
<target>__job.addedit.generalinfo.interval.patterns.day</target>
</trans-unit>
<trans-unit id="zmUXvRU" resname="job.addedit.generalinfo.interval.patterns.week">
<source>job.addedit.generalinfo.interval.patterns.week</source>
<target>__job.addedit.generalinfo.interval.patterns.week</target>
</trans-unit>
<trans-unit id="ISEzS__" resname="job.addedit.generalinfo.interval.patterns.4week">
<source>job.addedit.generalinfo.interval.patterns.4week</source>
<target>__job.addedit.generalinfo.interval.patterns.4week</target>
</trans-unit>
<trans-unit id="HWDmm9f" resname="job.addedit.generalinfo.nextrun.label">
<source>job.addedit.generalinfo.nextrun.label</source>
<target>__job.addedit.generalinfo.nextrun.label</target>
</trans-unit>
<trans-unit id="e1RkhOF" resname="job.addedit.generalinfo.lastrun.label">
<source>job.addedit.generalinfo.lastrun.label</source>
<target>__job.addedit.generalinfo.lastrun.label</target>
</trans-unit>
<trans-unit id="kw_hgon" resname="job.addedit.generalinfo.lastrun.eternal.label">
<source>job.addedit.generalinfo.lastrun.eternal.label</source>
<target>__job.addedit.generalinfo.lastrun.eternal.label</target>
</trans-unit>
<trans-unit id="sdUg23G" resname="job.addedit.generalinfo.retention.label">
<source>job.addedit.generalinfo.retention.label</source>
<target>__job.addedit.generalinfo.retention.label</target>
</trans-unit>
<trans-unit id="nWofDbf" resname="job.addedit.generalinfo.retention.placeholder">
<source>job.addedit.generalinfo.retention.placeholder</source>
<target>__job.addedit.generalinfo.retention.placeholder</target>
</trans-unit>
<trans-unit id="eHfLjBO" resname="job.addedit.generalinfo.retention.helptext">
<source>job.addedit.generalinfo.retention.helptext</source>
<target>__job.addedit.generalinfo.retention.helptext</target>
</trans-unit>
<trans-unit id="kfQDfoB" resname="job.addedit.generalinfo.failpercentage.label">
<source>job.addedit.generalinfo.failpercentage.label</source>
<target>__job.addedit.generalinfo.failpercentage.label</target>
</trans-unit>
<trans-unit id="Ytyhy77" resname="job.addedit.generalinfo.faildays.label">
<source>job.addedit.generalinfo.faildays.label</source>
<target>__job.addedit.generalinfo.faildays.label</target>
</trans-unit>
<trans-unit id="2O_wFoD" resname="job.addedit.generalinfo.faildays.placeholder">
<source>job.addedit.generalinfo.faildays.placeholder</source>
<target>__job.addedit.generalinfo.faildays.placeholder</target>
</trans-unit>
<trans-unit id="UvMb6oM" resname="job.addedit.generalinfo.hostlabel.label">
<source>job.addedit.generalinfo.hostlabel.label</source>
<target>__job.addedit.generalinfo.hostlabel.label</target>
</trans-unit>
<trans-unit id="GjPGKoQ" resname="job.addedit.generalinfo.hostlabel.placeholder">
<source>job.addedit.generalinfo.hostlabel.placeholder</source>
<target>__job.addedit.generalinfo.hostlabel.placeholder</target>
</trans-unit>
<trans-unit id="moGlM4y" resname="job.addedit.generalinfo.hostlabel.helptext">
<source>job.addedit.generalinfo.hostlabel.helptext</source>
<target>__job.addedit.generalinfo.hostlabel.helptext</target>
</trans-unit>
<trans-unit id="VEORPjf" resname="job.addedit.jobdetails.header">
<source>job.addedit.jobdetails.header</source>
<target>__job.addedit.jobdetails.header</target>
</trans-unit>
<trans-unit id="7haVx1t" resname="job.addedit.crontype.label">
<source>job.addedit.crontype.label</source>
<target>__job.addedit.crontype.label</target>
</trans-unit>
<trans-unit id="kw_PINJ" resname="job.addedit.crontype.command.label">
<source>job.addedit.crontype.command.label</source>
<target>__job.addedit.crontype.command.label</target>
</trans-unit>
<trans-unit id="A66vsIi" resname="job.addedit.crontype.reboot.label">
<source>job.addedit.crontype.reboot.label</source>
<target>__job.addedit.crontype.reboot.label</target>
</trans-unit>
<trans-unit id="ze4mr8D" resname="job.addedit.crontype.http.label">
<source>job.addedit.crontype.http.label</source>
<target>__job.addedit.crontype.http.label</target>
</trans-unit>
<trans-unit id="oV9GuKJ" resname="job.addedit.hosttype.label">
<source>job.addedit.hosttype.label</source>
<target>__job.addedit.hosttype.label</target>
</trans-unit>
<trans-unit id="eBXA85X" resname="job.addedit.hosttype.local.label">
<source>job.addedit.hosttype.local.label</source>
<target>__job.addedit.hosttype.local.label</target>
</trans-unit>
<trans-unit id="oUUVCNC" resname="job.addedit.hosttype.ssh.label">
<source>job.addedit.hosttype.ssh.label</source>
<target>__job.addedit.hosttype.ssh.label</target>
</trans-unit>
<trans-unit id="8q0z3bf" resname="job.addedit.containertype.label">
<source>job.addedit.containertype.label</source>
<target>__job.addedit.containertype.label</target>
</trans-unit>
<trans-unit id="ZPis4Xx" resname="job.addedit.containertype.none.label">
<source>job.addedit.containertype.none.label</source>
<target>__job.addedit.containertype.none.label</target>
</trans-unit>
<trans-unit id="AGADEB_" resname="job.addedit.containertype.docker.label">
<source>job.addedit.containertype.docker.label</source>
<target>__job.addedit.containertype.docker.label</target>
</trans-unit>
<trans-unit id="ZNQUrj7" resname="job.addedit.crontype.command.command.label">
<source>job.addedit.crontype.command.command.label</source>
<target>__job.addedit.crontype.command.command.label</target>
</trans-unit>
<trans-unit id="aWesJsc" resname="job.addedit.crontype.command.command.placeholder">
<source>job.addedit.crontype.command.command.placeholder</source>
<target>__job.addedit.crontype.command.command.placeholder</target>
</trans-unit>
<trans-unit id="os3VpHs" resname="job.addedit.crontype.command.response.label">
<source>job.addedit.crontype.command.response.label</source>
<target>__job.addedit.crontype.command.response.label</target>
</trans-unit>
<trans-unit id="RIWj._C" resname="job.addedit.crontype.command.response.placeholder">
<source>job.addedit.crontype.command.response.placeholder</source>
<target>__job.addedit.crontype.command.response.placeholder</target>
</trans-unit>
<trans-unit id="Kv8GihO" resname="job.addedit.crontype.reboot.header">
<source>job.addedit.crontype.reboot.header</source>
<target>__job.addedit.crontype.reboot.header</target>
</trans-unit>
<trans-unit id="hy8z.7x" resname="job.addedit.crontype.reboot.reboot.command.label">
<source>job.addedit.crontype.reboot.reboot.command.label</source>
<target>__job.addedit.crontype.reboot.reboot.command.label</target>
</trans-unit>
<trans-unit id="tw3YvLz" resname="job.addedit.crontype.reboot.reboot.command.placeholder">
<source>job.addedit.crontype.reboot.reboot.command.placeholder</source>
<target>__job.addedit.crontype.reboot.reboot.command.placeholder</target>
</trans-unit>
<trans-unit id="ENLtpfK" resname="job.addedit.crontype.reboot.getservices.command.label">
<source>job.addedit.crontype.reboot.getservices.command.label</source>
<target>__job.addedit.crontype.reboot.getservices.command.label</target>
</trans-unit>
<trans-unit id="yxIObGq" resname="job.addedit.crontype.reboot.getservices.command.placeholder">
<source>job.addedit.crontype.reboot.getservices.command.placeholder</source>
<target>__job.addedit.crontype.reboot.getservices.command.placeholder</target>
</trans-unit>
<trans-unit id="aurJI0X" resname="job.addedit.crontype.reboot.getservices.response.label">
<source>job.addedit.crontype.reboot.getservices.response.label</source>
<target>__job.addedit.crontype.reboot.getservices.response.label</target>
</trans-unit>
<trans-unit id="xMbagrx" resname="job.addedit.crontype.reboot.getservices.response.placeholder">
<source>job.addedit.crontype.reboot.getservices.response.placeholder</source>
<target>__job.addedit.crontype.reboot.getservices.response.placeholder</target>
</trans-unit>
<trans-unit id="bEPANkU" resname="job.addedit.crontype.reboot.reboot.delay.label">
<source>job.addedit.crontype.reboot.reboot.delay.label</source>
<target>__job.addedit.crontype.reboot.reboot.delay.label</target>
</trans-unit>
<trans-unit id="f38i.f6" resname="job.addedit.crontype.reboot.reboot.delay.placeholder">
<source>job.addedit.crontype.reboot.reboot.delay.placeholder</source>
<target>__job.addedit.crontype.reboot.reboot.delay.placeholder</target>
</trans-unit>
<trans-unit id="T55_j9D" resname="job.addedit.crontype.reboot.reboot.delay.helptext">
<source>job.addedit.crontype.reboot.reboot.delay.helptext</source>
<target>__job.addedit.crontype.reboot.reboot.delay.helptext</target>
</trans-unit>
<trans-unit id="EbgF04P" resname="job.addedit.crontype.reboot.reboot.duration.label">
<source>job.addedit.crontype.reboot.reboot.duration.label</source>
<target>__job.addedit.crontype.reboot.reboot.duration.label</target>
</trans-unit>
<trans-unit id="1FVsnYa" resname="job.addedit.crontype.reboot.reboot.duration.placeholder">
<source>job.addedit.crontype.reboot.reboot.duration.placeholder</source>
<target>__job.addedit.crontype.reboot.reboot.duration.placeholder</target>
</trans-unit>
<trans-unit id="VWOhJBY" resname="job.addedit.crontype.reboot.reboot.duration.helptext">
<source>job.addedit.crontype.reboot.reboot.duration.helptext</source>
<target>__job.addedit.crontype.reboot.reboot.duration.helptext</target>
</trans-unit>
<trans-unit id="oJn3xvZ" resname="job.addedit.crontype.http.header">
<source>job.addedit.crontype.http.header</source>
<target>__job.addedit.crontype.http.header</target>
</trans-unit>
<trans-unit id="hwhqEtB" resname="job.addedit.crontype.http.url.label">
<source>job.addedit.crontype.http.url.label</source>
<target>__job.addedit.crontype.http.url.label</target>
</trans-unit>
<trans-unit id="31CZuNl" resname="job.addedit.crontype.http.url.placeholder">
<source>job.addedit.crontype.http.url.placeholder</source>
<target>__job.addedit.crontype.http.url.placeholder</target>
</trans-unit>
<trans-unit id="gGpY1Gz" resname="job.addedit.crontype.http.basic-auth.username.label">
<source>job.addedit.crontype.http.basic-auth.username.label</source>
<target>__job.addedit.crontype.http.basic-auth.username.label</target>
</trans-unit>
<trans-unit id="9d3Trxr" resname="job.addedit.crontype.http.basic-auth.username.placeholder">
<source>job.addedit.crontype.http.basic-auth.username.placeholder</source>
<target>__job.addedit.crontype.http.basic-auth.username.placeholder</target>
</trans-unit>
<trans-unit id="27zbUzr" resname="job.addedit.crontype.http.basic-auth.password.label">
<source>job.addedit.crontype.http.basic-auth.password.label</source>
<target>__job.addedit.crontype.http.basic-auth.password.label</target>
</trans-unit>
<trans-unit id="ROX9KeU" resname="job.addedit.crontype.http.basic-auth.password.placeholder">
<source>job.addedit.crontype.http.basic-auth.password.placeholder</source>
<target>__job.addedit.crontype.http.basic-auth.password.placeholder</target>
</trans-unit>
<trans-unit id="pRPdCPd" resname="job.addedit.crontype.http.basic-auth.password.helptext">
<source>job.addedit.crontype.http.basic-auth.password.helptext</source>
<target>__job.addedit.crontype.http.basic-auth.password.helptext</target>
</trans-unit>
<trans-unit id="SnZXqhK" resname="job.addedit.crontype.http.response.label">
<source>job.addedit.crontype.http.response.label</source>
<target>__job.addedit.crontype.http.response.label</target>
</trans-unit>
<trans-unit id="aLSDlKd" resname="job.addedit.crontype.http.response.placeholder">
<source>job.addedit.crontype.http.response.placeholder</source>
<target>__job.addedit.crontype.http.response.placeholder</target>
</trans-unit>
<trans-unit id="ZeflLHK" resname="job.addedit.hosttype.local.header">
<source>job.addedit.hosttype.local.header</source>
<target>__job.addedit.hosttype.local.header</target>
</trans-unit>
<trans-unit id="1atQ8Ot" resname="job.addedit.hosttype.local.nodetails">
<source>job.addedit.hosttype.local.nodetails</source>
<target>__job.addedit.hosttype.local.nodetails</target>
</trans-unit>
<trans-unit id="HIND6DD" resname="job.addedit.hosttype.ssh.header">
<source>job.addedit.hosttype.ssh.header</source>
<target>__job.addedit.hosttype.ssh.header</target>
</trans-unit>
<trans-unit id="n_JNj3z" resname="job.addedit.hosttype.ssh.hostname.label">
<source>job.addedit.hosttype.ssh.hostname.label</source>
<target>__job.addedit.hosttype.ssh.hostname.label</target>
</trans-unit>
<trans-unit id="4ZEnTLC" resname="job.addedit.hosttype.ssh.hostname.placeholder">
<source>job.addedit.hosttype.ssh.hostname.placeholder</source>
<target>__job.addedit.hosttype.ssh.hostname.placeholder</target>
</trans-unit>
<trans-unit id="08j0NEG" resname="job.addedit.hosttype.ssh.username.label">
<source>job.addedit.hosttype.ssh.username.label</source>
<target>__job.addedit.hosttype.ssh.username.label</target>
</trans-unit>
<trans-unit id="EJOhQKe" resname="job.addedit.hosttype.ssh.username.placeholder">
<source>job.addedit.hosttype.ssh.username.placeholder</source>
<target>__job.addedit.hosttype.ssh.username.placeholder</target>
</trans-unit>
<trans-unit id="VEZQ7fY" resname="job.addedit.hosttype.ssh.privatekey.label">
<source>job.addedit.hosttype.ssh.privatekey.label</source>
<target>__job.addedit.hosttype.ssh.privatekey.label</target>
</trans-unit>
<trans-unit id="1MzOMSK" resname="job.addedit.hosttype.ssh.privatekey.helptext">
<source>job.addedit.hosttype.ssh.privatekey.helptext</source>
<target>__job.addedit.hosttype.ssh.privatekey.helptext</target>
</trans-unit>
<trans-unit id="nxl.bTZ" resname="job.addedit.hosttype.ssh.passphrase.label">
<source>job.addedit.hosttype.ssh.passphrase.label</source>
<target>__job.addedit.hosttype.ssh.passphrase.label</target>
</trans-unit>
<trans-unit id="rYaggeh" resname="job.addedit.hosttype.ssh.passphrase.placeholder">
<source>job.addedit.hosttype.ssh.passphrase.placeholder</source>
<target>__job.addedit.hosttype.ssh.passphrase.placeholder</target>
</trans-unit>
<trans-unit id="MAQ8t1s" resname="job.addedit.hosttype.ssh.passphrase.helptext">
<source>job.addedit.hosttype.ssh.passphrase.helptext</source>
<target>__job.addedit.hosttype.ssh.passphrase.helptext</target>
</trans-unit>
<trans-unit id="1hg_Lri" resname="job.addedit.containertype.docker.header">
<source>job.addedit.containertype.docker.header</source>
<target>__job.addedit.containertype.docker.header</target>
</trans-unit>
<trans-unit id="fddg1.3" resname="job.addedit.containertype.docker.service.label">
<source>job.addedit.containertype.docker.service.label</source>
<target>__job.addedit.containertype.docker.service.label</target>
</trans-unit>
<trans-unit id="mmNVzOj" resname="job.addedit.containertype.docker.service.placeholder">
<source>job.addedit.containertype.docker.service.placeholder</source>
<target>__job.addedit.containertype.docker.service.placeholder</target>
</trans-unit>
<trans-unit id="kaHv1qa" resname="job.addedit.containertype.docker.username.label">
<source>job.addedit.containertype.docker.username.label</source>
<target>__job.addedit.containertype.docker.username.label</target>
</trans-unit>
<trans-unit id="UzbvieZ" resname="job.addedit.containertype.docker.username.placeholder">
<source>job.addedit.containertype.docker.username.placeholder</source>
<target>__job.addedit.containertype.docker.username.placeholder</target>
</trans-unit>
<trans-unit id="BsHxmnc" resname="job.addedit.variables.header">
<source>job.addedit.variables.header</source>
<target>__job.addedit.variables.header</target>
</trans-unit>
<trans-unit id="pawk4nL" resname="job.addedit.variables.secret.label">
<source>job.addedit.variables.secret.label</source>
<target>__job.addedit.variables.secret.label</target>
</trans-unit>
<trans-unit id="roGfPFi" resname="job.addedit.variables.name.placeholder">
<source>job.addedit.variables.name.placeholder</source>
<target>__job.addedit.variables.name.placeholder</target>
</trans-unit>
<trans-unit id="WWsh_72" resname="job.addedit.variables.value.placeholder">
<source>job.addedit.variables.value.placeholder</source>
<target>__job.addedit.variables.value.placeholder</target>
</trans-unit>
<trans-unit id="Ve0r_Wy" resname="job.addedit.variables.helptext">
<source>job.addedit.variables.helptext</source>
<target>__job.addedit.variables.helptext</target>
</trans-unit>
<trans-unit id="tL8wand" resname="job.addedit.variables.add.label">
<source>job.addedit.variables.add.label</source>
<target>__job.addedit.variables.add.label</target>
</trans-unit>
<trans-unit id="or7JWUe" resname="job.addedit.submit.label">
<source>job.addedit.submit.label</source>
<target>__job.addedit.submit.label</target>
</trans-unit>
<trans-unit id="ysrfPnl" resname="job.view.header">
<source>job.view.header</source>
<target>__job.view.header</target>
</trans-unit>
<trans-unit id="KBsRhNs" resname="job.view.edit">
<source>job.view.edit</source>
<target>__job.view.edit</target>
</trans-unit>
<trans-unit id="xvdCrX2" resname="job.view.show.onlyfailed">
<source>job.view.show.onlyfailed</source>
<target>__job.view.show.onlyfailed</target>
</trans-unit>
<trans-unit id="_zWmcxu" resname="job.view.show.all">
<source>job.view.show.all</source>
<target>__job.view.show.all</target>
</trans-unit>
<trans-unit id="lpu6CQS" resname="job.view.results.exitcode">
<source>job.view.results.exitcode</source>
<target>__job.view.results.exitcode</target>
</trans-unit>
<trans-unit id="9EemRnl" resname="job.view.results.runtime">
<source>job.view.results.runtime</source>
<target>__job.view.results.runtime</target>
</trans-unit>
<trans-unit id="juzEgkd" resname="job.view.results.manual">
<source>job.view.results.manual</source>
<target>__job.view.results.manual</target>
</trans-unit>
<trans-unit id="H.6.gtG" resname="job.view.results.noresults.failed">
<source>job.view.results.noresults.failed</source>
<target>__job.view.results.noresults.failed</target>
</trans-unit>
<trans-unit id="u3QkQi1" resname="job.view.results.noresults.all">
<source>job.view.results.noresults.all</source>
<target>__job.view.results.noresults.all</target>
</trans-unit>
<trans-unit id="zBxeZSL" resname="job.edit.title">
<source>job.edit.title</source>
<target>__job.edit.title</target>
</trans-unit>
<trans-unit id="CDJme2K" resname="job.edit.header">
<source>job.edit.header</source>
<target>__job.edit.header</target>
</trans-unit>
<trans-unit id="iSs41MC" resname="job.addedit.generalinfo.interval.placeholder">
<source>job.addedit.generalinfo.interval.placeholder</source>
<target>__job.addedit.generalinfo.interval.placeholder</target>
</trans-unit>
<trans-unit id="sxAwNxW" resname="job.addedit.crontype.command.header">
<source>job.addedit.crontype.command.header</source>
<target>__job.addedit.crontype.command.header</target>
</trans-unit>
<trans-unit id="p0Seiyx" resname="job.addedit.crontype.reboot.reboot.command.helptext">
<source>job.addedit.crontype.reboot.reboot.command.helptext</source>
<target>__job.addedit.crontype.reboot.reboot.command.helptext</target>
</trans-unit>
<trans-unit id="uVSkZpl" resname="job.addedit.hosttype.ssh.privatekey.keep.label">
<source>job.addedit.hosttype.ssh.privatekey.keep.label</source>
<target>__job.addedit.hosttype.ssh.privatekey.keep.label</target>
</trans-unit>
<trans-unit id="_OGkxC8" resname="settings.other.header">
<source>settings.other.header</source>
<target>__settings.other.header</target>
</trans-unit>
<trans-unit id="78Yswpr" resname="settings.other.locale.label">
<source>settings.other.locale.label</source>
<target>__settings.other.locale.label</target>
</trans-unit>
<trans-unit id="WQ4J4Fx" resname="settings.submit.label">
<source>settings.submit.label</source>
<target>__settings.submit.label</target>
</trans-unit>
<trans-unit id="SF_jXZZ" resname="job.view.title">
<source>job.view.title</source>
<target>__job.view.title</target>
</trans-unit>
</body>
</file>
</xliff>

View File

@ -5,6 +5,10 @@
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="mokjk0L" resname="job.index.flashes.jobdeleted">
<source>job.index.flashes.jobdeleted</source>
<target>Cr0nj0b b succ3ssfuLLy d3L3t3d</target>
</trans-unit>
<trans-unit id="qvIyBkY" resname="title">
<source>title</source>
<target state="final">W3bcr0n m4n4g3m3nt</target>
@ -161,30 +165,6 @@
<source>job.index.table.headers.nextrun</source>
<target state="final">N3xtrun</target>
</trans-unit>
<trans-unit id="n9XSrh3" resname="job.index.runnow.deferred.title">
<source>job.index.runnow.deferred.title</source>
<target state="final">Cr0nj0b h4z b33n sch3duL3d</target>
</trans-unit>
<trans-unit id="2QVNoEx" resname="job.index.runnow.deferred.message">
<source>job.index.runnow.deferred.message</source>
<target state="final">J0b wuz sch3duL3d 2 b run. j00 w1LL f1nd t3h 0utput s00n 1n t3h j0b d3t41Lz</target>
</trans-unit>
<trans-unit id="_9vL1xO" resname="job.index.runnow.ran.title.success">
<source>job.index.runnow.ran.title.success</source>
<target state="final">Cr0nj0b succ3sfuLLy r4n</target>
</trans-unit>
<trans-unit id="SH3oarr" resname="job.index.runnow.ran.title.failed">
<source>job.index.runnow.ran.title.failed</source>
<target state="final">Cr0nj0b f41L3d. PL34s3 ch3ck 0utput b3L0w</target>
</trans-unit>
<trans-unit id="az3XJT4" resname="job.index.runnow.ran.message">
<source>job.index.runnow.ran.message</source>
<target state="final">Cr0nj0b r4n 1n _runtime_ s3c0ndz w1th 3x1t c0d3 _exitcode_</target>
</trans-unit>
<trans-unit id="mokjk0L" resname="job.index.flashes.jobdeleted">
<source>job.index.flashes.jobdeleted</source>
<target state="final">Cr0nj0b b succ3ssfuLLy d3L3t3d</target>
</trans-unit>
<trans-unit id="SF_jXZZ" resname="job.view.title">
<source>job.view.title</source>
<target state="final">0v3rv13w 0f runz 4 _jobname_</target>
@ -613,6 +593,46 @@
<source>footer.source</source>
<target state="final">S0urc3</target>
</trans-unit>
<trans-unit id="X.uZ4TL" resname="job.index.run.selecttime.header">
<source>job.index.run.selecttime.header</source>
<target state="final">Wh3n 2 run d1z j0b?</target>
</trans-unit>
<trans-unit id="i4An5BC" resname="job.index.run.selecttime.description">
<source>job.index.run.selecttime.description</source>
<target state="final">PL34s3 s3L3ct t3h t1m3 2 run d1z j0b</target>
</trans-unit>
<trans-unit id="tav8v0S" resname="job.index.run.selecttime.btnschedule.label">
<source>job.index.run.selecttime.btnschedule.label</source>
<target state="final">Sch3duL3</target>
</trans-unit>
<trans-unit id="St.ceTi" resname="job.index.run.selecttime.btnrunnow.label">
<source>job.index.run.selecttime.btnrunnow.label</source>
<target state="final">Run n0w</target>
</trans-unit>
<trans-unit id="XAxpenS" resname="job.index.run.ran.btnclose.label">
<source>job.index.run.ran.btnclose.label</source>
<target state="final">CL0s3</target>
</trans-unit>
<trans-unit id="QH_iTBI" resname="job.index.run.deferred.title">
<source>job.index.run.deferred.title</source>
<target state="final">Cr0nj0b h4z b33n sch3duL3d</target>
</trans-unit>
<trans-unit id="QqC.rDo" resname="job.index.run.deferred.message">
<source>job.index.run.deferred.message</source>
<target state="final">J0b wuz sch3duL3d 2 b run. j00 w1LL f1nd t3h 0utput s00n 1n t3h j0b d3t41Lz</target>
</trans-unit>
<trans-unit id="0DypXnU" resname="job.index.run.ran.title.success">
<source>job.index.run.ran.title.success</source>
<target state="final">Cr0nj0b succ3sfuLLy r4n</target>
</trans-unit>
<trans-unit id="7wkhcjy" resname="job.index.run.ran.title.failed">
<source>job.index.run.ran.title.failed</source>
<target state="final">Cr0nj0b f41L3d. PL34s3 ch3ck 0utput b3L0w</target>
</trans-unit>
<trans-unit id="W_dAs4D" resname="job.index.run.ran.message">
<source>job.index.run.ran.message</source>
<target state="final">Cr0nj0b r4n 1n _runtime_ s3c0ndz w1th 3x1t c0d3 _exitcode_</target>
</trans-unit>
</body>
</file>
</xliff>

View File

@ -7,131 +7,579 @@
<body>
<trans-unit id="qvIyBkY" resname="title">
<source>title</source>
<target state="final">webcROn managemnt</target>
<target state="translated">webcROn managemnt</target>
</trans-unit>
<trans-unit id="HgWEol2" resname="header">
<source>header</source>
<target state="final">webcROn managemnt</target>
<target state="translated">webcROn managemnt</target>
</trans-unit>
<trans-unit id="Q54TzT5" resname="demomode.flashnotice">
<source>demomode.flashnotice</source>
<target state="final">tHIZ ApplicashuN R in deEMo mode?? changez iz persisTd in tEH dATabase but jobz iz not bean executd k?</target>
<target state="translated">tHIZ ApplicashuN R in deEMo mode?? changez iz persisTd in tEH dATabase but jobz iz not bean executd k?</target>
</trans-unit>
<trans-unit id="rpq61qN" resname="demomode.credentials.header">
<source>demomode.credentials.header</source>
<target state="final">loGIN fr DEEmo mode</target>
<target state="translated">loGIN fr DEEmo mode</target>
</trans-unit>
<trans-unit id="jUz9fVE" resname="demomode.credentials.username">
<source>demomode.credentials.username</source>
<target state="final">oH hi username</target>
<target state="translated">oH hi username</target>
</trans-unit>
<trans-unit id="QNu97w_" resname="demomode.credentials.password">
<source>demomode.credentials.password</source>
<target state="final">oh hi paswORD k?</target>
<target state="translated">oh hi paswORD k?</target>
</trans-unit>
<trans-unit id="U8IBiON" resname="menu.overview">
<source>menu.overview</source>
<target state="final">ovrview plz?</target>
<target state="translated">ovrview plz?</target>
</trans-unit>
<trans-unit id="iGC7eCk" resname="menu.add">
<source>menu.add</source>
<target state="final">ADD new cRONJob plz?</target>
<target state="translated">ADD new cRONJob plz?</target>
</trans-unit>
<trans-unit id="4UTsL.X" resname="menu.settings">
<source>menu.settings</source>
<target state="final">settingz</target>
<target state="translated">settingz</target>
</trans-unit>
<trans-unit id="wBTFKFR" resname="menu.logout">
<source>menu.logout</source>
<target state="final">oh hi logowt plz?</target>
<target state="translated">oh hi logowt plz?</target>
</trans-unit>
<trans-unit id="4cxyGOO" resname="security.login.username.label">
<source>security.login.username.label</source>
<target state="final">oH hi username</target>
<target state="translated">oH hi username</target>
</trans-unit>
<trans-unit id="u2tKtI1" resname="security.login.username.placeholder">
<source>security.login.username.placeholder</source>
<target state="final">jeroen@example.com</target>
<target state="translated">__security.login.username.placeholder</target>
</trans-unit>
<trans-unit id="Niy_SZ2" resname="security.login.password.label">
<source>security.login.password.label</source>
<target state="final">oh hi paswORD k?</target>
<target state="translated">oh hi paswORD k?</target>
</trans-unit>
<trans-unit id="3rU2_6v" resname="security.login.password.placeholder">
<source>security.login.password.placeholder</source>
<target state="final">burgerz plz?</target>
<target state="translated">burgerz plz?</target>
</trans-unit>
<trans-unit id="0MGdvgf" resname="security.login.remember.label">
<source>security.login.remember.label</source>
<target state="final">rememBr me</target>
<target state="translated">rememBr me</target>
</trans-unit>
<trans-unit id="4GvZndQ" resname="security.login.submit-btn.label">
<source>security.login.submit-btn.label</source>
<target state="final">login</target>
<target state="translated">login</target>
</trans-unit>
<trans-unit id="W.225Bj" resname="settings.title">
<source>settings.title</source>
<target state="final">settingz</target>
<target state="translated">settingz</target>
</trans-unit>
<trans-unit id="a1bm5YC" resname="settings.header">
<source>settings.header</source>
<target state="final">settingz</target>
</trans-unit>
<trans-unit id="qUrJMfo" resname="settings.flashes.inexistinglocale">
<source>settings.flashes.inexistinglocale</source>
<target state="final">oh hi Language dus not EXIs plz?</target>
</trans-unit>
<trans-unit id="XcSnV8X" resname="settings.flashes.localesaved">
<source>settings.flashes.localesaved</source>
<target state="final">LAnguage r savd k?</target>
</trans-unit>
<trans-unit id="kpbry92" resname="settings.flashes.repeatpasswordnotok">
<source>settings.flashes.repeatpasswordnotok</source>
<target state="final">oh hi PASwordz iz not Ekwel</target>
</trans-unit>
<trans-unit id="DpJMsln" resname="settings.flashes.currentpassnotok">
<source>settings.flashes.currentpassnotok</source>
<target state="final">paswordz r not correcT Plz?</target>
</trans-unit>
<trans-unit id="tB3o6UA" resname="settings.flashes.passwordsaved">
<source>settings.flashes.passwordsaved</source>
<target state="final">paSWORd r SAVD</target>
<target state="translated">settingz</target>
</trans-unit>
<trans-unit id="aAt4FLV" resname="settings.password.header">
<source>settings.password.header</source>
<target state="final">oh hi paswORD k?</target>
<target state="translated">oh hi paswORD k?</target>
</trans-unit>
<trans-unit id="qqAzx9b" resname="settings.password.current.label">
<source>settings.password.current.label</source>
<target state="final">currnt paswoRD</target>
<target state="translated">currnt paswoRD</target>
</trans-unit>
<trans-unit id="rr8bU5t" resname="settings.password.current.placeholder">
<source>settings.password.current.placeholder</source>
<target state="final">burgerz plz?</target>
<target state="translated">burgerz plz?</target>
</trans-unit>
<trans-unit id="YVhGwqr" resname="settings.password.password.label">
<source>settings.password.password.label</source>
<target state="final">new pasword</target>
<target state="translated">new pasword</target>
</trans-unit>
<trans-unit id="OZpjE9T" resname="settings.password.password.placeholder">
<source>settings.password.password.placeholder</source>
<target state="final">MOAr paswoRD</target>
<target state="translated">MOAr paswoRD</target>
</trans-unit>
<trans-unit id="TNBtpD_" resname="settings.password.repeat.label">
<source>settings.password.repeat.label</source>
<target state="final">Repeet pasword plz?</target>
<target state="translated">Repeet pasword plz?</target>
</trans-unit>
<trans-unit id="bYb7Tz." resname="settings.password.repeat.placeholder">
<source>settings.password.repeat.placeholder</source>
<target state="final">MOAr paswoRD</target>
<target state="translated">MOAr paswoRD</target>
</trans-unit>
<trans-unit id="_OGkxC8" resname="settings.other.header">
<source>settings.other.header</source>
<target state="final">othr settingz plz?</target>
<target state="translated">othr settingz plz?</target>
</trans-unit>
<trans-unit id="78Yswpr" resname="settings.other.locale.label">
<source>settings.other.locale.label</source>
<target state="final">languagE</target>
<target state="translated">languagE</target>
</trans-unit>
<trans-unit id="WQ4J4Fx" resname="settings.submit.label">
<source>settings.submit.label</source>
<target state="translated">__settings.submit.label</target>
</trans-unit>
<trans-unit id="0eRDYaC" resname="job.index.title">
<source>job.index.title</source>
<target state="translated">__job.index.title</target>
</trans-unit>
<trans-unit id="J.7dT3_" resname="job.index.header">
<source>job.index.header</source>
<target state="translated">__job.index.header</target>
</trans-unit>