From f11a7fc8a35864145e73f41c7e453bff9fe40c1c Mon Sep 17 00:00:00 2001 From: Claudia Bressi Date: Fri, 17 Dec 2021 11:58:36 +0100 Subject: [PATCH] Add Translate Add NgxTranslate, NgxTranslateTesting Create english bundle file Update all components for translation Update unit tests Add language setting (optional) Resolves #701 --- ui/package-lock.json | 158 +-- ui/package.json | 7 +- ui/src/app/about/about.module.ts | 8 +- ui/src/app/about/info/info.component.html | 181 ++- ui/src/app/about/info/info.component.spec.ts | 15 +- ui/src/app/about/info/info.component.ts | 9 +- .../about/signpost/signpost.component.html | 32 +- .../about/signpost/signpost.component.spec.ts | 15 +- ui/src/app/about/user/user.component.html | 4 +- ui/src/app/about/user/user.component.spec.ts | 9 +- ui/src/app/app.component.html | 8 +- ui/src/app/app.component.spec.ts | 5 +- ui/src/app/app.component.ts | 8 +- ui/src/app/app.module.ts | 20 +- ui/src/app/apps/add/add.compoment.spec.ts | 3 + ui/src/app/apps/add/add.component.html | 10 +- .../app/apps/add/props/props.component.html | 32 +- .../apps/add/props/props.component.spec.ts | 3 + ui/src/app/apps/add/props/props.component.ts | 41 +- .../apps/add/register/register.component.html | 55 +- .../add/register/register.component.spec.ts | 5 +- .../apps/add/register/register.component.ts | 40 +- ui/src/app/apps/add/uri/uri.component.html | 29 +- ui/src/app/apps/add/uri/uri.component.spec.ts | 7 +- ui/src/app/apps/add/uri/uri.component.ts | 35 +- .../website-starters.component.html | 36 +- .../website-starters.component.spec.ts | 3 + .../website-starters.component.ts | 35 +- ui/src/app/apps/app/app.component.html | 58 +- ui/src/app/apps/app/app.component.spec.ts | 10 +- ui/src/app/apps/app/app.component.ts | 11 +- ui/src/app/apps/apps.component.html | 48 +- ui/src/app/apps/apps.component.spec.ts | 10 +- ui/src/app/apps/apps.component.ts | 2 +- ui/src/app/apps/apps.module.ts | 4 +- .../apps/unregister/unregister.component.html | 36 +- .../unregister/unregister.component.spec.ts | 10 +- .../apps/unregister/unregister.component.ts | 21 +- .../app/apps/version/version.component.html | 33 +- .../apps/version/version.component.spec.ts | 10 +- ui/src/app/apps/version/version.component.ts | 28 +- ui/src/app/flo/shared-flo.module.ts | 11 +- .../graph-view/graph-view.component.spec.ts | 3 + .../properties-groups-dialog.component.html | 10 +- .../properties/df.property.component.html | 6 +- .../properties-dialog.component.html | 12 +- .../properties.group.component.html | 2 +- ui/src/app/flo/stream-flo.module.ts | 2 + .../stream/component/create-component.spec.ts | 3 + .../flo/stream/component/create.component.ts | 12 +- .../stream/component/view.component.spec.ts | 8 +- .../flo/stream/component/view.component.ts | 8 +- .../instance-dot/instance-dot.component.html | 2 +- .../stream-properties-dialog.component.ts | 19 +- ui/src/app/flo/task-flo.module.ts | 2 + .../task/component/create.component.spec.ts | 10 +- .../flo/task/component/create.component.ts | 12 +- .../flo/task/component/view.component.spec.ts | 13 + ui/src/app/layout/layout.module.ts | 11 +- ui/src/app/layout/logo/logo.component.ts | 2 +- ui/src/app/layout/nav/nav.component.html | 36 +- ui/src/app/manage/manage.module.ts | 4 +- .../app/manage/records/action.filter.spec.ts | 9 +- ui/src/app/manage/records/action.filter.ts | 2 +- .../manage/records/operation.filter.spec.ts | 9 +- ui/src/app/manage/records/operation.filter.ts | 2 +- .../app/manage/records/records.component.html | 61 +- .../manage/records/records.component.spec.ts | 10 +- .../tools/cleanup/cleanup.component.html | 19 +- .../tools/cleanup/cleanup.component.spec.ts | 10 +- .../manage/tools/cleanup/cleanup.component.ts | 20 +- .../tools/stream/export.component.spec.ts | 11 +- .../manage/tools/stream/export.component.ts | 33 +- .../tools/stream/import.component.spec.ts | 10 +- .../manage/tools/stream/import.component.ts | 54 +- .../tools/task/export.component.spec.ts | 10 +- .../app/manage/tools/task/export.component.ts | 33 +- .../tools/task/import.component.spec.ts | 10 +- .../app/manage/tools/task/import.component.ts | 54 +- ui/src/app/manage/tools/tools.component.html | 36 +- .../app/manage/tools/tools.component.spec.ts | 10 +- .../authentication-required.component.spec.ts | 10 +- .../authentication-required.component.ts | 4 +- .../feature-disabled.component.spec.ts | 10 +- .../component/feature-disabled.component.ts | 4 +- .../component/roles-missing.component.spec.ts | 10 +- .../component/roles-missing.component.ts | 4 +- ui/src/app/security/security.module.ts | 2 + ui/src/app/settings/settings.module.ts | 2 + ui/src/app/settings/settings.service.ts | 28 +- .../settings/settings/settings.component.html | 30 +- .../settings/settings.component.spec.ts | 3 + .../settings/settings/settings.component.ts | 9 +- .../settings/store/settings.effect.spec.ts | 10 +- ui/src/app/settings/store/settings.effect.ts | 25 +- .../settings/store/settings.reducer.spec.ts | 15 +- ui/src/app/settings/store/settings.reducer.ts | 8 +- .../component/confirm/confirm.component.html | 4 +- .../component/confirm/confirm.component.ts | 11 +- .../key-value/key-value.component.spec.ts | 4 +- .../key-value/key-value.component.ts | 14 +- .../component/search/search.component.html | 12 +- .../component/search/search.component.spec.ts | 3 + .../component/search/search.component.ts | 10 +- .../shared/filter/date/date.filter.spec.ts | 9 +- ui/src/app/shared/filter/date/date.filter.ts | 4 +- ui/src/app/shared/shared.module.ts | 2 + .../runtime/details/details.component.html | 22 +- .../runtime/details/details.component.spec.ts | 10 +- .../streams/runtime/runtime.component.html | 32 +- .../streams/runtime/runtime.component.spec.ts | 10 +- ui/src/app/streams/streams.module.ts | 4 +- .../streams/clone/clone.component.html | 38 +- .../streams/clone/clone.component.spec.ts | 8 +- .../streams/streams/clone/clone.component.ts | 26 +- .../streams/create/create.component.html | 51 +- .../streams/create/create.component.spec.ts | 4 +- .../streams/create/create.component.ts | 133 +- .../deploy/builder/builder.component.html | 105 +- .../deploy/builder/builder.component.spec.ts | 3 + .../deploy/builder/builder.component.ts | 19 +- .../streams/deploy/deploy.component.html | 28 +- .../streams/deploy/deploy.component.ts | 33 +- .../deploy/free-text/free-text.component.html | 25 +- .../free-text/free-text.component.spec.ts | 3 + .../deploy/free-text/free-text.component.ts | 8 +- .../deploy/stream-deploy.component.spec.ts | 12 +- .../streams/destroy/destroy.component.html | 24 +- .../streams/destroy/destroy.component.spec.ts | 10 +- .../streams/destroy/destroy.component.ts | 24 +- .../multi-deploy/multi-deploy.component.html | 39 +- .../multi-deploy.component.spec.ts | 3 + .../multi-deploy/multi-deploy.component.ts | 18 +- .../streams/rollback/rollback.component.html | 15 +- .../rollback/rollback.component.spec.ts | 10 +- .../streams/rollback/rollback.component.ts | 13 +- .../streams/status/status.component.spec.ts | 10 +- .../streams/status/status.component.ts | 52 +- .../streams/stream/stream.component.html | 105 +- .../streams/stream/stream.component.spec.ts | 10 +- .../streams/stream/stream.component.ts | 6 +- .../streams/streams/streams.component.html | 73 +- .../streams/streams/streams.component.spec.ts | 11 +- .../streams/undeploy/undeploy.component.html | 24 +- .../undeploy/undeploy.component.spec.ts | 10 +- .../streams/undeploy/undeploy.component.ts | 24 +- .../executions/cleanup/cleanup.component.html | 31 +- .../cleanup/cleanup.component.spec.ts | 10 +- .../executions/cleanup/cleanup.component.ts | 16 +- .../execution/execution.component.html | 82 +- .../execution/execution.component.spec.ts | 10 +- .../execution/execution.component.ts | 9 +- .../executions/execution/log/log.component.ts | 6 +- .../executions/executions.component.html | 57 +- .../executions/executions.component.spec.ts | 11 +- .../executions/stop/stop.component.html | 18 +- .../executions/stop/stop.component.spec.ts | 10 +- .../executions/stop/stop.component.ts | 15 +- .../jobs/execution/execution.component.html | 167 ++- .../execution/execution.component.spec.ts | 10 +- .../jobs/execution/execution.component.ts | 22 +- .../app/tasks-jobs/jobs/jobs.component.html | 67 +- .../tasks-jobs/jobs/jobs.component.spec.ts | 10 +- ui/src/app/tasks-jobs/jobs/jobs.component.ts | 22 +- .../tasks-jobs/jobs/step/step.component.html | 216 ++-- .../jobs/step/step.component.spec.ts | 10 +- .../tasks-jobs/jobs/step/step.component.ts | 21 +- .../schedules/create/create.component.html | 68 +- .../schedules/create/create.component.spec.ts | 10 +- .../schedules/create/create.component.ts | 25 +- .../schedules/destroy/destroy.component.html | 32 +- .../destroy/destroy.component.spec.ts | 10 +- .../schedules/destroy/destroy.component.ts | 16 +- .../schedule/schedule.component.html | 40 +- .../schedule/schedule.component.spec.ts | 10 +- .../schedules/schedule/schedule.component.ts | 6 +- .../schedules/schedules.component.html | 42 +- .../schedules/schedules.component.spec.ts | 11 +- .../schedules/schedules.component.ts | 6 +- ui/src/app/tasks-jobs/tasks-jobs.module.ts | 2 + .../tasks/cleanup/cleanup.component.html | 22 +- .../tasks/cleanup/cleanup.component.spec.ts | 10 +- .../tasks/cleanup/cleanup.component.ts | 22 +- .../tasks/clone/clone.component.html | 34 +- .../tasks/clone/clone.component.spec.ts | 3 + .../tasks-jobs/tasks/clone/clone.component.ts | 26 +- .../tasks/create/create.component.html | 58 +- .../tasks/create/create.component.spec.ts | 3 + .../tasks/create/create.component.ts | 35 +- .../tasks/destroy/destroy.component.html | 30 +- .../tasks/destroy/destroy.component.spec.ts | 16 +- .../tasks/destroy/destroy.component.ts | 26 +- .../launch/builder/builder.component.html | 108 +- .../launch/builder/builder.component.spec.ts | 3 + .../tasks/launch/builder/builder.component.ts | 23 +- .../builder/errors/errors.component.spec.ts | 3 + .../launch/free-text/free-text.component.html | 32 +- .../free-text/free-text.component.spec.ts | 3 + .../tasks/launch/launch.component.html | 21 +- .../tasks/launch/launch.component.spec.ts | 10 +- .../tasks/launch/launch.component.ts | 44 +- .../tasks-jobs/tasks/task/task.component.html | 113 +- .../tasks/task/task.component.spec.ts | 3 + .../tasks-jobs/tasks/task/task.component.ts | 10 +- .../app/tasks-jobs/tasks/tasks.component.html | 63 +- .../tasks-jobs/tasks/tasks.component.spec.ts | 11 +- ui/src/assets/i18n/en.json | 1100 +++++++++++++++++ ui/tsconfig.json | 11 +- 208 files changed, 4197 insertions(+), 1731 deletions(-) create mode 100644 ui/src/assets/i18n/en.json diff --git a/ui/package-lock.json b/ui/package-lock.json index f136803c2..dd6330900 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -34,23 +34,6 @@ "requires": { "@angular-devkit/core": "13.0.2", "rxjs": "6.6.7" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } } }, "@angular-devkit/build-angular": { @@ -152,23 +135,6 @@ "esbuild-windows-arm64": "0.13.12" } }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, "tslib": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", @@ -185,23 +151,6 @@ "requires": { "@angular-devkit/architect": "0.1300.2", "rxjs": "6.6.7" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } } }, "@angular-devkit/core": { @@ -216,23 +165,6 @@ "magic-string": "0.25.7", "rxjs": "6.6.7", "source-map": "0.7.3" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } } }, "@angular-devkit/schematics": { @@ -246,23 +178,6 @@ "magic-string": "0.25.7", "ora": "5.4.1", "rxjs": "6.6.7" - }, - "dependencies": { - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } } }, "@angular-eslint/builder": { @@ -1923,7 +1838,7 @@ "@compodoc/ngd-transformer": "^2.0.0-alpha.4", "cheerio": "^1.0.0-rc.2", "chokidar": "^1.7.0", - "colors": "1.4.0", + "colors": "^1.1.2", "commander": "2.11.0", "findit": "^2.0.0", "fs-extra": "^4.0.2", @@ -1989,7 +1904,8 @@ "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true }, "commander": { "version": "2.11.0", @@ -2639,6 +2555,36 @@ "integrity": "sha512-eCtPydszVvKtkvL4HeDMvWC3IqTF/xZF6CTumMweRNInc6mTZiwwLwLDk8pg3xVp3ttZUOwV17BUnEs4/Q4qMA==", "dev": true }, + "@ngx-translate/core": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-14.0.0.tgz", + "integrity": "sha512-UevdwNCXMRCdJv//0kC8h2eSfmi02r29xeE8E9gJ1Al4D4jEJ7eiLPdjslTMc21oJNGguqqWeEVjf64SFtvw2w==", + "requires": { + "tslib": "^2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "@ngx-translate/http-loader": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-7.0.0.tgz", + "integrity": "sha512-j+NpXXlcGVdyUNyY/qsJrqqeAdJdizCd+GKh3usXExSqy1aE9866jlAIL+xrfDU4w+LiMoma5pgE4emvFebZmA==", + "requires": { + "tslib": "^2.3.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -4665,12 +4611,6 @@ "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", "dev": true }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -8311,7 +8251,8 @@ "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true } } }, @@ -8520,7 +8461,7 @@ "body-parser": "^1.19.0", "braces": "^3.0.2", "chokidar": "^3.5.1", - "colors": "1.4.0", + "colors": "^1.4.0", "connect": "^3.7.0", "di": "^0.0.1", "dom-serialize": "^2.2.1", @@ -8545,7 +8486,8 @@ "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true }, "connect": { "version": "3.7.0", @@ -8748,13 +8690,14 @@ "integrity": "sha1-LpxyB+pyZ3EmAln4K+y1QyCeRAo=", "dev": true, "requires": { - "colors": "1.4.0" + "colors": "^1.1.2" }, "dependencies": { "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true } } }, @@ -8894,7 +8837,7 @@ "integrity": "sha1-pp8ObKWB4DkapXlBlw4XwwjdSGk=", "dev": true, "requires": { - "colors": "1.4.0", + "colors": "^1.4.0", "connect": "3.4.x", "cors": "^2.8.5", "event-stream": "^4.0.1", @@ -9779,6 +9722,15 @@ "tslib": "^2.0.0" } }, + "ngx-translate-testing": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ngx-translate-testing/-/ngx-translate-testing-6.0.1.tgz", + "integrity": "sha512-LI3jOUxGLjnD4OD9DwmmafJ5OyPQJlUbTl6AJKYMYV2EClwmZ3m+V03/mZIO5VRQBIT9fwgNhHmJW1vw7ITpdg==", + "dev": true, + "requires": { + "tslib": "^2.0.0" + } + }, "nice-napi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", @@ -13974,9 +13926,9 @@ } }, "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "requires": { "tslib": "^1.9.0" }, @@ -16391,4 +16343,4 @@ } } } -} \ No newline at end of file +} diff --git a/ui/package.json b/ui/package.json index 056926292..34c89475d 100644 --- a/ui/package.json +++ b/ui/package.json @@ -24,7 +24,7 @@ "private": true, "dependencies": { "@angular/animations": "13.0.1", - "@angular/cdk": "^13.0.1", + "@angular/cdk": "13.0.1", "@angular/common": "13.0.1", "@angular/compiler": "13.0.1", "@angular/core": "13.0.1", @@ -39,6 +39,8 @@ "@ngrx/effects": "12.4.0", "@ngrx/router-store": "12.4.0", "@ngrx/store": "12.4.0", + "@ngx-translate/core": "14.0.0", + "@ngx-translate/http-loader": "7.0.0", "@webcomponents/webcomponentsjs": "2.5.0", "angular-2-local-storage": "3.0.2", "file-saver": "2.0.5", @@ -88,7 +90,7 @@ "karma": "6.3.4", "karma-browserstack-launcher": "1.5.1", "karma-chrome-launcher": "3.1.0", - "karma-coverage": "^2.0.3", + "karma-coverage": "2.0.3", "karma-edge-launcher": "0.4.2", "karma-firefox-launcher": "1.3.0", "karma-jasmine": "3.3.1", @@ -96,6 +98,7 @@ "karma-safari-launcher": "1.0.0", "karma-sauce-launcher": "2.0.2", "karma-spec-reporter": "0.0.32", + "ngx-translate-testing": "6.0.1", "prettier": "2.3.0", "pretty-quick": "3.1.0", "protractor": "7.0.0", diff --git a/ui/src/app/about/about.module.ts b/ui/src/app/about/about.module.ts index 87f511efd..07d79325b 100644 --- a/ui/src/app/about/about.module.ts +++ b/ui/src/app/about/about.module.ts @@ -6,10 +6,16 @@ import {SignpostComponent} from './signpost/signpost.component'; import {UserComponent} from './user/user.component'; import {StoreModule} from '@ngrx/store'; import * as fromAbout from '../shared/store/about.reducer'; +import {TranslateModule} from '@ngx-translate/core'; @NgModule({ declarations: [InfoComponent, SignpostComponent, UserComponent], - imports: [CommonModule, ClarityModule, StoreModule.forFeature(fromAbout.aboutFeatureKey, fromAbout.reducer)], + imports: [ + CommonModule, + ClarityModule, + StoreModule.forFeature(fromAbout.aboutFeatureKey, fromAbout.reducer), + TranslateModule + ], exports: [SignpostComponent, UserComponent] }) export class AboutModule {} diff --git a/ui/src/app/about/info/info.component.html b/ui/src/app/about/info/info.component.html index 39e47bab9..4c85caaa0 100644 --- a/ui/src/app/about/info/info.component.html +++ b/ui/src/app/about/info/info.component.html @@ -1,51 +1,61 @@ - + diff --git a/ui/src/app/about/info/info.component.spec.ts b/ui/src/app/about/info/info.component.spec.ts index 244136804..3937b2aa6 100644 --- a/ui/src/app/about/info/info.component.spec.ts +++ b/ui/src/app/about/info/info.component.spec.ts @@ -8,6 +8,11 @@ import {AboutServiceMock} from '../../tests/api/about.service.mock'; import {AppServiceMock} from '../../tests/api/app.service.mock'; import {NotificationServiceMock} from '../../tests/service/notification.service.mock'; import {InfoComponent} from './info.component'; +import {SharedModule} from '../../shared/shared.module'; +import {TranslateTestingModule} from 'ngx-translate-testing'; +import TRANSLATIONS from '../../../assets/i18n/en.json'; +import {StoreModule} from '@ngrx/store'; +import {ROOT_REDUCERS, metaReducers} from 'src/app/reducers/reducer'; describe('about/info/info.component.ts', () => { let component: InfoComponent; @@ -17,7 +22,15 @@ describe('about/info/info.component.ts', () => { waitForAsync(() => { TestBed.configureTestingModule({ declarations: [InfoComponent], - imports: [FormsModule, ClarityModule, RouterTestingModule.withRoutes([]), BrowserAnimationsModule], + imports: [ + FormsModule, + ClarityModule, + SharedModule, + TranslateTestingModule.withTranslations('en', TRANSLATIONS), + RouterTestingModule.withRoutes([]), + StoreModule.forRoot(ROOT_REDUCERS, {metaReducers}), + BrowserAnimationsModule + ], providers: [ SecurityServiceMock.provider, AboutServiceMock.provider, diff --git a/ui/src/app/about/info/info.component.ts b/ui/src/app/about/info/info.component.ts index 269624db1..5108ab088 100644 --- a/ui/src/app/about/info/info.component.ts +++ b/ui/src/app/about/info/info.component.ts @@ -4,6 +4,7 @@ import {AboutService} from '../../shared/api/about.service'; import {NotificationService} from '../../shared/service/notification.service'; import {ClipboardCopyService} from '../../shared/service/clipboard-copy.service'; import {JsonPipe} from '@angular/common'; +import {TranslateService} from '@ngx-translate/core'; @Component({ selector: 'app-about-info', @@ -19,7 +20,8 @@ export class InfoComponent implements OnInit { constructor( private aboutService: AboutService, private clipboardCopyService: ClipboardCopyService, - private notificationService: NotificationService + private notificationService: NotificationService, + private translate: TranslateService ) {} ngOnInit(): void { @@ -32,7 +34,10 @@ export class InfoComponent implements OnInit { copyToClipboard(): void { if (this.about) { this.clipboardCopyService.executeCopy(new JsonPipe().transform(this.about), this.container.nativeElement); - this.notificationService.success('Copy to clipboard', 'Copied About Details to Clipboard (As JSON).'); + this.notificationService.success( + this.translate.instant('about.info.message.copyTitle'), + this.translate.instant('about.info.message.copyContent') + ); } } } diff --git a/ui/src/app/about/signpost/signpost.component.html b/ui/src/app/about/signpost/signpost.component.html index d56e8de43..8cd4bdbbe 100644 --- a/ui/src/app/about/signpost/signpost.component.html +++ b/ui/src/app/about/signpost/signpost.component.html @@ -3,20 +3,26 @@ -

Spring Cloud Data Flow

+

{{ 'appRoot.fullName' | translate }}

- Data Flow Server Implementation
- Name: {{ about.versions.implementation.name || 'n/a' }}
- Version: {{ about.versions.implementation.version || 'n/a' }}
- + {{ 'about.signpost.title' | translate }}
+ {{ 'about.signpost.name' | translate }}: {{ about.versions.implementation.name || 'n/a' }}
+ {{ 'about.signpost.version' | translate }}: {{ about.versions.implementation.version || 'n/a' }}
+

diff --git a/ui/src/app/about/signpost/signpost.component.spec.ts b/ui/src/app/about/signpost/signpost.component.spec.ts index 2acf4afb2..872c17463 100644 --- a/ui/src/app/about/signpost/signpost.component.spec.ts +++ b/ui/src/app/about/signpost/signpost.component.spec.ts @@ -9,6 +9,11 @@ import {AppServiceMock} from '../../tests/api/app.service.mock'; import {NotificationServiceMock} from '../../tests/service/notification.service.mock'; import {SignpostComponent} from './signpost.component'; import {InfoComponent} from '../info/info.component'; +import {SharedModule} from '../../shared/shared.module'; +import {TranslateTestingModule} from 'ngx-translate-testing'; +import TRANSLATIONS from '../../../assets/i18n/en.json'; +import {StoreModule} from '@ngrx/store'; +import {ROOT_REDUCERS, metaReducers} from 'src/app/reducers/reducer'; describe('about/signpost/signpost.component.ts', () => { let component: SignpostComponent; @@ -18,7 +23,15 @@ describe('about/signpost/signpost.component.ts', () => { waitForAsync(() => { TestBed.configureTestingModule({ declarations: [SignpostComponent, InfoComponent], - imports: [FormsModule, ClarityModule, RouterTestingModule.withRoutes([]), BrowserAnimationsModule], + imports: [ + FormsModule, + ClarityModule, + SharedModule, + TranslateTestingModule.withTranslations('en', TRANSLATIONS), + RouterTestingModule.withRoutes([]), + StoreModule.forRoot(ROOT_REDUCERS, {metaReducers}), + BrowserAnimationsModule + ], providers: [ SecurityServiceMock.provider, AboutServiceMock.provider, diff --git a/ui/src/app/about/user/user.component.html b/ui/src/app/about/user/user.component.html index 10623e883..7e57696cb 100644 --- a/ui/src/app/about/user/user.component.html +++ b/ui/src/app/about/user/user.component.html @@ -5,13 +5,13 @@ - Log out + {{ 'about.user.logOut' | translate }}
- Log In + {{ 'about.user.logIn' | translate }}
diff --git a/ui/src/app/about/user/user.component.spec.ts b/ui/src/app/about/user/user.component.spec.ts index 3e7236ba2..b3fbf0a9e 100644 --- a/ui/src/app/about/user/user.component.spec.ts +++ b/ui/src/app/about/user/user.component.spec.ts @@ -4,6 +4,8 @@ import {ClarityModule} from '@clr/angular'; import {RouterTestingModule} from '@angular/router/testing'; import {UserComponent} from './user.component'; import {SecurityServiceMock} from '../../../app/tests/api/security.service.mock'; +import {TranslateTestingModule} from 'ngx-translate-testing'; +import TRANSLATIONS from '../../../assets/i18n/en.json'; describe('UserComponent', () => { let component: UserComponent; @@ -13,7 +15,12 @@ describe('UserComponent', () => { waitForAsync(() => { TestBed.configureTestingModule({ declarations: [UserComponent], - imports: [FormsModule, ClarityModule, RouterTestingModule.withRoutes([])], + imports: [ + FormsModule, + ClarityModule, + TranslateTestingModule.withTranslations('en', TRANSLATIONS), + RouterTestingModule.withRoutes([]) + ], providers: [SecurityServiceMock.provider] }).compileComponents(); }) diff --git a/ui/src/app/app.component.html b/ui/src/app/app.component.html index 1eec42beb..29cd9edbb 100644 --- a/ui/src/app/app.component.html +++ b/ui/src/app/app.component.html @@ -1,9 +1,9 @@ @@ -75,7 +73,9 @@ class="clr-form-control clr-row" [class.clr-error]="submitted && form.get('metaDataUri').invalid && !isFormEmpty(form)" > - +
- Please provide a valid URI pointing to the respective properties file. + {{ 'applications.add.register.invalidMetadataURI' | translate }}
- +
@@ -110,7 +107,7 @@ class="btn btn-sm btn-secondary" title="Remove" > - Remove + {{ 'commons.remove' | translate }}
@@ -125,23 +122,29 @@ class="btn btn-sm btn-secondary" itle="Add application" > - New application + {{ 'applications.add.register.newApp' | translate }} - + diff --git a/ui/src/app/apps/add/register/register.component.spec.ts b/ui/src/app/apps/add/register/register.component.spec.ts index 74dfb9b72..3cb589cab 100644 --- a/ui/src/app/apps/add/register/register.component.spec.ts +++ b/ui/src/app/apps/add/register/register.component.spec.ts @@ -12,6 +12,8 @@ import {NotificationServiceMock} from '../../../tests/service/notification.servi import {RegisterComponent} from './register.component'; import {throwError} from 'rxjs'; import {ContextServiceMock} from '../../../tests/service/context.service.mock'; +import {TranslateTestingModule} from 'ngx-translate-testing'; +import TRANSLATIONS from '../../../../assets/i18n/en.json'; describe('apps/register/register.component.ts', () => { let component: RegisterComponent; @@ -26,6 +28,7 @@ describe('apps/register/register.component.ts', () => { ReactiveFormsModule, FormsModule, ClarityModule, + TranslateTestingModule.withTranslations('en', TRANSLATIONS), RouterTestingModule.withRoutes([]), BrowserAnimationsModule ], @@ -121,7 +124,7 @@ describe('apps/register/register.component.ts', () => { fixture.detectChanges(); fixture.debugElement.query(By.css('button[name=register]')).nativeElement.click(); fixture.detectChanges(); - expect(NotificationServiceMock.mock.errorNotification[0].title).toBe('Invalid application(s)'); + expect(NotificationServiceMock.mock.errorNotification[0].title).toBe('Invalid field(s)'); expect(NotificationServiceMock.mock.errorNotification[0].message).toBe('Some field(s) are missing or invalid.'); }); diff --git a/ui/src/app/apps/add/register/register.component.ts b/ui/src/app/apps/add/register/register.component.ts index 4cda0b19c..362cb3d1c 100644 --- a/ui/src/app/apps/add/register/register.component.ts +++ b/ui/src/app/apps/add/register/register.component.ts @@ -5,6 +5,7 @@ import {AppService} from '../../../shared/api/app.service'; import {NotificationService} from '../../../shared/service/notification.service'; import {Router} from '@angular/router'; import {AppsAddValidator} from '../add.validtor'; +import {TranslateService} from '@ngx-translate/core'; @Component({ selector: 'app-add-register', @@ -20,7 +21,8 @@ export class RegisterComponent implements OnInit { private appService: AppService, private notificationService: NotificationService, private fb: FormBuilder, - private router: Router + private router: Router, + private translate: TranslateService ) {} ngOnInit(): void { @@ -31,9 +33,15 @@ export class RegisterComponent implements OnInit { this.submitted = true; if (!this.isValid()) { if (this.noValue()) { - this.notificationService.error('Invalid application', 'Please, register at least one application.'); + this.notificationService.error( + this.translate.instant('applications.add.register.message.invalidAppTitle'), + this.translate.instant('applications.add.register.message.invalidAppContent') + ); } else { - this.notificationService.error('Invalid application(s)', 'Some field(s) are missing or invalid.'); + this.notificationService.error( + this.translate.instant('commons.message.invalidFieldsTitle'), + this.translate.instant('commons.message.invalidFieldsContent') + ); } } else { this.isImporting = true; @@ -50,19 +58,19 @@ export class RegisterComponent implements OnInit { } }) .filter(a => a != null); - this.appService - .registerProps(applications) - // .pipe(takeUntil(this.ngUnsubscribe$), finalize(() => this.blockerService.unlock())) - .subscribe( - data => { - this.notificationService.success('Register application(s).', `${data.length} App(s) registered.`); - this.cancel(); - }, - error => { - this.isImporting = false; - this.notificationService.error('An error occurred', error); - } - ); + this.appService.registerProps(applications).subscribe( + data => { + this.notificationService.success( + this.translate.instant('applications.add.register.message.successTitle'), + this.translate.instant('applications.add.register.message.successContent', {count: data.length}) + ); + this.cancel(); + }, + error => { + this.isImporting = false; + this.notificationService.error(this.translate.instant('commons.message.error'), error); + } + ); } } diff --git a/ui/src/app/apps/add/uri/uri.component.html b/ui/src/app/apps/add/uri/uri.component.html index 4ec8b8c45..305054df8 100644 --- a/ui/src/app/apps/add/uri/uri.component.html +++ b/ui/src/app/apps/add/uri/uri.component.html @@ -1,8 +1,4 @@ -

- Provide a URI that points to the location of the properties file.
- This properties file is formatted so that the keys represent the type and the name of the application, e.g. type.name. - The property values are the URIs of the app. -

+

@@ -15,31 +11,30 @@ [dataflowFocus]="true" class="clr-col-6" style="width: 100%" - placeholder="https://url.to.properties" + placeholder="{{ 'applications.add.uri.placeholderUri' | translate }}" /> - e.g.: https://dataflow.spring.io/kafka-maven-latest - Please provide a valid URI pointing to the respective properties file. + {{ 'applications.add.uri.eg' | translate }}: {{ 'applications.add.uri.egValue' | translate }} + + {{ 'applications.add.uri.invalidUri' | translate }} - +
- + diff --git a/ui/src/app/apps/add/uri/uri.component.spec.ts b/ui/src/app/apps/add/uri/uri.component.spec.ts index 6a1c4ff1c..f3904894c 100644 --- a/ui/src/app/apps/add/uri/uri.component.spec.ts +++ b/ui/src/app/apps/add/uri/uri.component.spec.ts @@ -12,6 +12,8 @@ import {UriComponent} from './uri.component'; import {throwError} from 'rxjs'; import {FocusDirective} from '../../../shared/directive/focus.directive'; import {ContextServiceMock} from '../../../tests/service/context.service.mock'; +import {TranslateTestingModule} from 'ngx-translate-testing'; +import TRANSLATIONS from '../../../../assets/i18n/en.json'; describe('apps/uri/uri.component.ts', () => { let component: UriComponent; @@ -26,6 +28,7 @@ describe('apps/uri/uri.component.ts', () => { ReactiveFormsModule, FormsModule, ClarityModule, + TranslateTestingModule.withTranslations('en', TRANSLATIONS), RouterTestingModule.withRoutes([]), BrowserAnimationsModule ], @@ -69,7 +72,7 @@ describe('apps/uri/uri.component.ts', () => { expect(inputs.force.checked).toBe(a.force); component.submit(); fixture.detectChanges(); - expect(NotificationServiceMock.mock.errorNotification[0].title).toBe('Invalid field'); + expect(NotificationServiceMock.mock.errorNotification[0].title).toBe('Invalid field(s)'); expect(NotificationServiceMock.mock.errorNotification[0].message).toBe('Some field(s) are missing or invalid.'); }); }); @@ -86,7 +89,7 @@ describe('apps/uri/uri.component.ts', () => { fixture.detectChanges(); expect(spy).toHaveBeenCalledTimes(1); expect(navigate.calls.mostRecent().args[0].toString()).toBe('apps'); - expect(NotificationServiceMock.mock.successNotifications[0].title).toBe('Import application(s)'); + expect(NotificationServiceMock.mock.successNotifications[0].title).toBe('Import Application(s)'); expect(NotificationServiceMock.mock.successNotifications[0].message).toBe('Application(s) Imported.'); done(); }); diff --git a/ui/src/app/apps/add/uri/uri.component.ts b/ui/src/app/apps/add/uri/uri.component.ts index 9a7942629..91ca809a8 100644 --- a/ui/src/app/apps/add/uri/uri.component.ts +++ b/ui/src/app/apps/add/uri/uri.component.ts @@ -4,6 +4,7 @@ import {NotificationService} from '../../../shared/service/notification.service' import {FormControl, FormGroup, Validators} from '@angular/forms'; import {Router} from '@angular/router'; import {AppsAddValidator} from '../add.validtor'; +import {TranslateService} from '@ngx-translate/core'; @Component({ selector: 'app-add-uri', @@ -16,7 +17,8 @@ export class UriComponent { constructor( private appService: AppService, private notificationService: NotificationService, - private router: Router + private router: Router, + private translate: TranslateService ) { this.form = new FormGroup({ uri: new FormControl('', [Validators.required, AppsAddValidator.uri]), @@ -30,22 +32,25 @@ export class UriComponent { submit(): void { if (!this.form.valid) { - this.notificationService.error('Invalid field', 'Some field(s) are missing or invalid.'); + this.notificationService.error( + this.translate.instant('commons.message.invalidFieldsTitle'), + this.translate.instant('commons.message.invalidFieldsContent') + ); } else { this.isImporting = true; - this.appService - .importUri(this.form.get('uri').value.toString(), this.form.get('force').value) - // .pipe(takeUntil(this.ngUnsubscribe$), finalize(() => this.blockerService.unlock())) - .subscribe( - data => { - this.notificationService.success('Import application(s)', 'Application(s) Imported.'); - this.back(); - }, - error => { - this.isImporting = false; - this.notificationService.error('An error occurred', error); - } - ); + this.appService.importUri(this.form.get('uri').value.toString(), this.form.get('force').value).subscribe( + () => { + this.notificationService.success( + this.translate.instant('applications.add.uri.message.successTitle'), + this.translate.instant('applications.add.uri.message.successContent') + ); + this.back(); + }, + error => { + this.isImporting = false; + this.notificationService.error(this.translate.instant('commons.message.error'), error); + } + ); } } diff --git a/ui/src/app/apps/add/website-starters/website-starters.component.html b/ui/src/app/apps/add/website-starters/website-starters.component.html index aee22797c..a1aca9bf3 100644 --- a/ui/src/app/apps/add/website-starters/website-starters.component.html +++ b/ui/src/app/apps/add/website-starters/website-starters.component.html @@ -1,54 +1,54 @@
-

- Use predefined application-URIs (for either maven or docker) for all the out-of-the-box stream and task/batch apps. -

+

{{ 'applications.add.websiteStarters.usePredefined' | translate }}.

- + - + - + - + - + - + - +
- + diff --git a/ui/src/app/apps/add/website-starters/website-starters.component.spec.ts b/ui/src/app/apps/add/website-starters/website-starters.component.spec.ts index a0ba396e1..461f54292 100644 --- a/ui/src/app/apps/add/website-starters/website-starters.component.spec.ts +++ b/ui/src/app/apps/add/website-starters/website-starters.component.spec.ts @@ -12,6 +12,8 @@ import {NotificationServiceMock} from '../../../tests/service/notification.servi import {WebsiteStartersComponent} from './website-starters.component'; import {throwError} from 'rxjs'; import {ContextServiceMock} from '../../../tests/service/context.service.mock'; +import {TranslateTestingModule} from 'ngx-translate-testing'; +import TRANSLATIONS from '../../../../assets/i18n/en.json'; describe('apps/website-starters/website-starters.component.ts', () => { let component: WebsiteStartersComponent; @@ -26,6 +28,7 @@ describe('apps/website-starters/website-starters.component.ts', () => { ReactiveFormsModule, FormsModule, ClarityModule, + TranslateTestingModule.withTranslations('en', TRANSLATIONS), RouterTestingModule.withRoutes([]), BrowserAnimationsModule ], diff --git a/ui/src/app/apps/add/website-starters/website-starters.component.ts b/ui/src/app/apps/add/website-starters/website-starters.component.ts index 3e65016b3..f8638bc91 100644 --- a/ui/src/app/apps/add/website-starters/website-starters.component.ts +++ b/ui/src/app/apps/add/website-starters/website-starters.component.ts @@ -1,5 +1,6 @@ import {Component} from '@angular/core'; import {Router} from '@angular/router'; +import {TranslateService} from '@ngx-translate/core'; import {AppService} from '../../../shared/api/app.service'; import {NotificationService} from '../../../shared/service/notification.service'; @@ -24,28 +25,32 @@ export class WebsiteStartersComponent { constructor( private router: Router, private notificationService: NotificationService, - private appService: AppService + private appService: AppService, + private translate: TranslateService ) {} submit(): void { if (!this.value || !this.uris[this.value]) { - this.notificationService.error('No starter selected', 'Please, select a starter pack.'); + this.notificationService.error( + this.translate.instant('applications.add.websiteStarters.message.noStarterTitle'), + this.translate.instant('applications.add.websiteStarters.message.noStarterContent') + ); return; } this.isImporting = true; - this.appService - .importUri(this.uris[this.value], this.force) - // .pipe(takeUntil(this.ngUnsubscribe$), finalize(() => this.blockerService.unlock())) - .subscribe( - () => { - this.notificationService.success('Import starters', 'Application(s) Imported.'); - this.back(); - }, - error => { - this.notificationService.error('An error occurred', error); - this.isImporting = false; - } - ); + this.appService.importUri(this.uris[this.value], this.force).subscribe( + () => { + this.notificationService.success( + this.translate.instant('applications.add.websiteStarters.message.successTitle'), + this.translate.instant('applications.add.websiteStarters.message.successContent') + ); + this.back(); + }, + error => { + this.notificationService.error(this.translate.instant('commons.message.error'), error); + this.isImporting = false; + } + ); } back(): void { diff --git a/ui/src/app/apps/app/app.component.html b/ui/src/app/apps/app/app.component.html index 5907275b4..8ba59b67f 100644 --- a/ui/src/app/apps/app/app.component.html +++ b/ui/src/app/apps/app/app.component.html @@ -1,6 +1,6 @@

- Application {{ app.name }}{{ app.name }}  {{ app.type }} {{ defaultApp.version }} @@ -10,7 +10,7 @@

- Version + {{ 'applications.main.version' | translate }} @@ -39,7 +39,7 @@

(click)="getProperties(version)" > {{ version.version }}  - (DEFAULT) + ({{ 'applications.details.default' | translate | uppercase }}) @@ -47,39 +47,44 @@

- +
-
Type
+
{{ 'applications.main.type' | translate }}
{{ app.type }}
-
Version
+
{{ 'applications.main.version' | translate }}
{{ defaultApp.version }}
-
Uri
+
{{ 'applications.main.uri' | translate }}
{{ detailedApp.uri }}
-
Metadata Uri
+
{{ 'applications.main.metadataURI' | translate }}
{{ detailedApp.metaDataUri || 'N/A' }}
-
Version(s)
+
{{ 'applications.main.version' | translate }}(s)
{{ versions.length }}
- Loading information... + {{ 'commons.loading' | translate }}
@@ -90,7 +95,7 @@

- There are more than 50 properties to display, the UI can be slow.
Do you - want to display all the properties ? + {{ 'applications.details.tooManyProperties' | translate }}
+ {{ 'applications.details.tooManyProperties2' | translate }}
@@ -120,7 +125,7 @@

@@ -134,16 +139,23 @@

{{ getReadableId(property.id) }}
- Deprecation level: {{ property.deprecation.level }} + {{ 'applications.details.deprecatedLevel' | translate }}: + {{ property.deprecation.level }}
-
{{ property.description ? property.description : '(No Description Available)' }}
+
{{ property.description }}
+
+ ({{ 'applications.details.noDescription' | translate }}) +
{{ property.type }} (Default value: {{ property.defaultValue }}({{ 'applications.details.defaultValue' | translate }}: + {{ property.defaultValue }})
@@ -154,11 +166,11 @@

-
No property
+
{{ 'applications.details.noProperty' | translate }}

- Loading properties... + {{ 'commons.loading' | translate }}
@@ -169,7 +181,7 @@

- Loading application... + {{ 'commons.loading' | translate }}
diff --git a/ui/src/app/apps/app/app.component.spec.ts b/ui/src/app/apps/app/app.component.spec.ts index fdac446cc..112807786 100644 --- a/ui/src/app/apps/app/app.component.spec.ts +++ b/ui/src/app/apps/app/app.component.spec.ts @@ -18,6 +18,8 @@ import {OrderByPipe} from '../../shared/pipe/order-by.pipe'; import {By} from '@angular/platform-browser'; import {HttpError} from '../../shared/model/error.model'; import {ContextServiceMock} from '../../tests/service/context.service.mock'; +import {TranslateTestingModule} from 'ngx-translate-testing'; +import TRANSLATIONS from '../../../assets/i18n/en.json'; describe('apps/apps.component.ts', () => { let component: AppComponent; @@ -33,7 +35,13 @@ describe('apps/apps.component.ts', () => { CardComponent, OrderByPipe ], - imports: [FormsModule, ClarityModule, RouterTestingModule.withRoutes([]), BrowserAnimationsModule], + imports: [ + FormsModule, + ClarityModule, + TranslateTestingModule.withTranslations('en', TRANSLATIONS), + RouterTestingModule.withRoutes([]), + BrowserAnimationsModule + ], providers: [ SecurityServiceMock.provider, AboutServiceMock.provider, diff --git a/ui/src/app/apps/app/app.component.ts b/ui/src/app/apps/app/app.component.ts index 4be4c4ad5..d0ca60073 100644 --- a/ui/src/app/apps/app/app.component.ts +++ b/ui/src/app/apps/app/app.component.ts @@ -7,6 +7,7 @@ import {UnregisterComponent} from '../unregister/unregister.component'; import {NotificationService} from '../../shared/service/notification.service'; import {VersionComponent} from '../version/version.component'; import {HttpError} from '../../shared/model/error.model'; +import {TranslateService} from '@ngx-translate/core'; @Component({ selector: 'app-app', @@ -30,7 +31,8 @@ export class AppComponent implements OnInit { private route: ActivatedRoute, private appsService: AppService, private router: Router, - private notificationService: NotificationService + private notificationService: NotificationService, + private translate: TranslateService ) {} ngOnInit(): void { @@ -45,7 +47,10 @@ export class AppComponent implements OnInit { this.appsService.getAppVersions(this.app.name, this.app.type).subscribe( (apps: App[]) => { if (apps.length === 0) { - this.notificationService.error('An error occurred', 'No application found.'); + this.notificationService.error( + this.translate.instant('commons.message.error'), + this.translate.instant('applications.details.notFound') + ); this.back(); } this.versions = apps; @@ -57,7 +62,7 @@ export class AppComponent implements OnInit { this.loading = false; }, error => { - this.notificationService.error('An error occurred', error); + this.notificationService.error(this.translate.instant('commons.message.error'), error); this.back(); } ); diff --git a/ui/src/app/apps/apps.component.html b/ui/src/app/apps/apps.component.html index 1ce2ff327..f5253c033 100644 --- a/ui/src/app/apps/apps.component.html +++ b/ui/src/app/apps/apps.component.html @@ -1,5 +1,5 @@

- Applications + {{ 'applications.main.title' | translate }}

@@ -20,7 +20,9 @@

#datagrid > - + @@ -40,9 +43,11 @@

(click)="setMode(true)" [appRole]="['ROLE_DESTROY']" > - Group Actions + {{ 'commons.groupActions' | translate }} + + - [style.width.px]="context.sizeName | datagridcolumn: datagrid:contextName | async" [clrFilterValue]="context.name" > - Name + {{ 'applications.main.name' | translate }} [clrDgSortOrder]="context.by === 'type' ? (context.reverse ? -1 : 1) : 0" [style.width.px]="context.sizeType | datagridcolumn: datagrid:contextName | async" > - Type + {{ 'applications.main.type' | translate }} @@ -71,7 +76,7 @@

[style.width.px]="context.sizeVersion | datagridcolumn: datagrid:contextName | async" > - Version + {{ 'applications.main.version' | translate }} @@ -82,7 +87,7 @@

[style.width.px]="context.sizeUri | datagridcolumn: datagrid:contextName | async" > - URI + {{ 'applications.main.uri' | translate }} @@ -91,7 +96,7 @@

[style.width.px]="context.sizeMetadataUri | datagridcolumn: datagrid:contextName | async" > - Metadata URI + {{ 'applications.main.metadataURI' | translate }} @@ -115,12 +120,16 @@

>{{ app.metaDataUri }} - - - + + + - No results found. + {{ 'applications.main.noResult' | translate }}. [clrDgPageSize]="+context.size" [clrDgPage]="+context.current" > - Applications per page - {{ pagination.firstItem + 1 }} - {{ pagination.lastItem + 1 }} of {{ page?.total }} applications + {{ + 'applications.main.applicationsPerPage' | translate + }} + {{ + 'applications.main.pagination' + | translate: {first: pagination.firstItem + 1, last: pagination.lastItem + 1, total: page?.total} + }} diff --git a/ui/src/app/apps/apps.component.spec.ts b/ui/src/app/apps/apps.component.spec.ts index 5b889e509..b14b5d90e 100644 --- a/ui/src/app/apps/apps.component.spec.ts +++ b/ui/src/app/apps/apps.component.spec.ts @@ -17,6 +17,8 @@ import {ConfirmComponent} from '../shared/component/confirm/confirm.component'; import {ContextServiceMock} from '../tests/service/context.service.mock'; import {SettingsServiceMock} from '../tests/service/settings.service.mock'; import {DatagridColumnPipe} from '../shared/pipe/datagrid-column.pipe'; +import {TranslateTestingModule} from 'ngx-translate-testing'; +import TRANSLATIONS from '../../assets/i18n/en.json'; describe('apps/apps.component.ts', () => { let component: AppsComponent; @@ -33,7 +35,13 @@ describe('apps/apps.component.ts', () => { ConfirmComponent, DatagridColumnPipe ], - imports: [FormsModule, ClarityModule, RouterTestingModule.withRoutes([]), BrowserAnimationsModule], + imports: [ + FormsModule, + ClarityModule, + TranslateTestingModule.withTranslations('en', TRANSLATIONS), + RouterTestingModule.withRoutes([]), + BrowserAnimationsModule + ], providers: [ SecurityServiceMock.provider, AboutServiceMock.provider, diff --git a/ui/src/app/apps/apps.component.ts b/ui/src/app/apps/apps.component.ts index 3b5175312..1361d49f5 100644 --- a/ui/src/app/apps/apps.component.ts +++ b/ui/src/app/apps/apps.component.ts @@ -1,4 +1,4 @@ -import {ChangeDetectorRef, Component, OnDestroy, ViewChild} from '@angular/core'; +import {ChangeDetectorRef, Component, ViewChild} from '@angular/core'; import {AppService} from '../shared/api/app.service'; import {ClrDatagridStateInterface} from '@clr/angular'; import {App, AppPage} from '../shared/model/app.model'; diff --git a/ui/src/app/apps/apps.module.ts b/ui/src/app/apps/apps.module.ts index 7d365fddc..00bbd85c1 100644 --- a/ui/src/app/apps/apps.module.ts +++ b/ui/src/app/apps/apps.module.ts @@ -16,6 +16,7 @@ import {PropsComponent} from './add/props/props.component'; import {RegisterComponent} from './add/register/register.component'; import {UriComponent} from './add/uri/uri.component'; import {WebsiteStartersComponent} from './add/website-starters/website-starters.component'; +import {TranslateModule} from '@ngx-translate/core'; @NgModule({ declarations: [ @@ -37,7 +38,8 @@ import {WebsiteStartersComponent} from './add/website-starters/website-starters. SharedModule, ClarityModule, SecurityModule, - AppsRoutingModule + AppsRoutingModule, + TranslateModule ], providers: [] }) diff --git a/ui/src/app/apps/unregister/unregister.component.html b/ui/src/app/apps/unregister/unregister.component.html index 05c613b76..fc27ca412 100644 --- a/ui/src/app/apps/unregister/unregister.component.html +++ b/ui/src/app/apps/unregister/unregister.component.html @@ -1,26 +1,32 @@ - - + +
- Loading history... + {{ 'commons.loading' | translate }}
@@ -252,26 +285,28 @@

- Loading stream... + {{ 'commons.loading' | translate }}
diff --git a/ui/src/app/streams/streams/stream/stream.component.spec.ts b/ui/src/app/streams/streams/stream/stream.component.spec.ts index 427912e3a..a429688a6 100644 --- a/ui/src/app/streams/streams/stream/stream.component.spec.ts +++ b/ui/src/app/streams/streams/stream/stream.component.spec.ts @@ -21,6 +21,8 @@ import {DatetimePipe} from '../../../shared/pipe/datetime.pipe'; import {StreamDslComponent} from '../../../shared/component/stream-dsl/stream-dsl.component'; import {ParserService} from '../../../flo/shared/service/parser.service'; import {ContextServiceMock} from '../../../tests/service/context.service.mock'; +import {TranslateTestingModule} from 'ngx-translate-testing'; +import TRANSLATIONS from '../../../../assets/i18n/en.json'; describe('streams/streams/stream/stream.component.ts', () => { let component: StreamComponent; @@ -39,7 +41,13 @@ describe('streams/streams/stream/stream.component.ts', () => { DatetimePipe, StreamDslComponent ], - imports: [FormsModule, ClarityModule, RouterTestingModule.withRoutes([]), BrowserAnimationsModule], + imports: [ + FormsModule, + ClarityModule, + RouterTestingModule.withRoutes([]), + BrowserAnimationsModule, + TranslateTestingModule.withTranslations('en', TRANSLATIONS) + ], providers: [ SecurityServiceMock.provider, AboutServiceMock.provider, diff --git a/ui/src/app/streams/streams/stream/stream.component.ts b/ui/src/app/streams/streams/stream/stream.component.ts index 23636715d..c75ac803c 100644 --- a/ui/src/app/streams/streams/stream/stream.component.ts +++ b/ui/src/app/streams/streams/stream/stream.component.ts @@ -10,6 +10,7 @@ import {UndeployComponent} from '../undeploy/undeploy.component'; import get from 'lodash.get'; import {StreamStatus} from '../../../shared/model/metrics.model'; import {RollbackComponent} from '../rollback/rollback.component'; +import {TranslateService} from '@ngx-translate/core'; @Component({ selector: 'app-stream', @@ -41,7 +42,8 @@ export class StreamComponent implements OnInit { private route: ActivatedRoute, private router: Router, private notificationService: NotificationService, - private streamService: StreamService + private streamService: StreamService, + private translate: TranslateService ) {} ngOnInit(): void { @@ -70,7 +72,7 @@ export class StreamComponent implements OnInit { this.loading = false; }, error => { - this.notificationService.error('An error occurred', error); + this.notificationService.error(this.translate.instant('commons.message.error'), error); if (HttpError.is404(error)) { this.back(); } diff --git a/ui/src/app/streams/streams/streams.component.html b/ui/src/app/streams/streams/streams.component.html index 1e2039c21..5ad4d41e9 100644 --- a/ui/src/app/streams/streams/streams.component.html +++ b/ui/src/app/streams/streams/streams.component.html @@ -1,11 +1,15 @@

- Streams + {{ 'streams.main.title' | translate }} + + - -

@@ -17,7 +21,9 @@

#datagrid > - + @@ -62,9 +68,11 @@

(click)="setMode(true)" [appRole]="['ROLE_DEPLOY', 'ROLE_CREATE', 'ROLE_DESTROY']" > - Group Actions + {{ 'commons.groupActions' | translate }} + + - [style.width.px]="context.sizeName | datagridcolumn: datagrid:contextName:30 | async" [clrFilterValue]="context.name" > - Name + {{ 'streams.main.name' | translate }} - Description + {{ 'streams.main.description' | translate }} (clrDgColumnResize)="updateContext('sizeDslText', $event)" [style.width.px]="context.sizeDslText | datagridcolumn: datagrid:contextName:30 | async" > - Definition + {{ 'streams.main.definition' | translate }} [style.width.px]="context.sizeStatus | datagridcolumn: datagrid:contextName:20 | async" > - Status  + {{ 'streams.main.status' | translate }}  @@ -119,14 +127,14 @@

>{{ stream.status }} - + + + + + - - - - - No results found. + {{ 'streams.main.noResult' | translate }} [clrDgPageSize]="context.size" [clrDgPage]="context.current" > - Streams per page - {{ pagination.firstItem + 1 }} - {{ pagination.lastItem + 1 }} of {{ page?.total }} streams + {{ + 'streams.main.streamsPerPage' | translate + }} + {{ + 'streams.main.pagination' + | translate: {first: pagination.firstItem + 1, last: pagination.lastItem + 1, total: page?.total} + }} diff --git a/ui/src/app/streams/streams/streams.component.spec.ts b/ui/src/app/streams/streams/streams.component.spec.ts index 93915f2a9..0551e0de3 100644 --- a/ui/src/app/streams/streams/streams.component.spec.ts +++ b/ui/src/app/streams/streams/streams.component.spec.ts @@ -16,8 +16,9 @@ import {GrafanaServiceMock} from '../../tests/service/grafana.service.mock'; import {GroupServiceMock} from '../../tests/service/group.service.mock'; import {ContextServiceMock} from '../../tests/service/context.service.mock'; import {SettingsServiceMock} from '../../tests/service/settings.service.mock'; -import {ConfirmComponent} from '../../shared/component/confirm/confirm.component'; import {DatagridColumnPipe} from '../../shared/pipe/datagrid-column.pipe'; +import {TranslateTestingModule} from 'ngx-translate-testing'; +import TRANSLATIONS from '../../../assets/i18n/en.json'; describe('streams/streams/streams.component.ts', () => { let component: StreamsComponent; @@ -34,7 +35,13 @@ describe('streams/streams/streams.component.ts', () => { GrafanaStreamDirective, DatagridColumnPipe ], - imports: [FormsModule, ClarityModule, RouterTestingModule.withRoutes([]), BrowserAnimationsModule], + imports: [ + FormsModule, + ClarityModule, + RouterTestingModule.withRoutes([]), + BrowserAnimationsModule, + TranslateTestingModule.withTranslations('en', TRANSLATIONS) + ], providers: [ SecurityServiceMock.provider, AboutServiceMock.provider, diff --git a/ui/src/app/streams/streams/undeploy/undeploy.component.html b/ui/src/app/streams/streams/undeploy/undeploy.component.html index 3ece37f4f..8b318d02b 100644 --- a/ui/src/app/streams/streams/undeploy/undeploy.component.html +++ b/ui/src/app/streams/streams/undeploy/undeploy.component.html @@ -1,18 +1,16 @@ - - + +
- Loading execution(s)... + {{ 'commons.loading' | translate }}

- +
- - - + + + @@ -270,11 +295,11 @@

NamePlatformCron Expression{{ 'schedules.main.name' | translate }}{{ 'schedules.main.platform' | translate }}{{ 'schedules.main.cronExpression' | translate }}
-
No schedule yet.
+
{{ 'schedules.main.noSchedule' | translate }}
- Loading schedule(s)... + {{ 'commons.loading' | translate }}
@@ -284,7 +309,7 @@

- Loading task... + {{ 'commons.loading' | translate }}
diff --git a/ui/src/app/tasks-jobs/tasks/task/task.component.spec.ts b/ui/src/app/tasks-jobs/tasks/task/task.component.spec.ts index f59c1d650..ad983f990 100644 --- a/ui/src/app/tasks-jobs/tasks/task/task.component.spec.ts +++ b/ui/src/app/tasks-jobs/tasks/task/task.component.spec.ts @@ -15,6 +15,8 @@ import {LogComponent} from '../../executions/execution/log/log.component'; import {ContextServiceMock} from '../../../tests/service/context.service.mock'; import {ScheduleServiceMock} from '../../../tests/api/schedule.service.mock'; import {CleanupComponent} from '../cleanup/cleanup.component'; +import {TranslateTestingModule} from 'ngx-translate-testing'; +import TRANSLATIONS from '../../../../assets/i18n/en.json'; describe('tasks-jobs/tasks/task/task.component.ts', () => { let component: TaskComponent; @@ -28,6 +30,7 @@ describe('tasks-jobs/tasks/task/task.component.ts', () => { FormsModule, ReactiveFormsModule, ClarityModule, + TranslateTestingModule.withTranslations('en', TRANSLATIONS), RouterTestingModule.withRoutes([]), BrowserAnimationsModule ], diff --git a/ui/src/app/tasks-jobs/tasks/task/task.component.ts b/ui/src/app/tasks-jobs/tasks/task/task.component.ts index 39d7cae6b..24d1a5e65 100644 --- a/ui/src/app/tasks-jobs/tasks/task/task.component.ts +++ b/ui/src/app/tasks-jobs/tasks/task/task.component.ts @@ -16,6 +16,7 @@ import {AboutState} from '../../../shared/store/about.reducer'; import {ScheduleService} from '../../../shared/api/schedule.service'; import {SchedulePage} from '../../../shared/model/schedule.model'; import {CleanupComponent} from '../cleanup/cleanup.component'; +import {TranslateService} from '@ngx-translate/core'; @Component({ selector: 'app-task', @@ -43,7 +44,8 @@ export class TaskComponent implements OnInit { private toolsService: ToolsService, private scheduleService: ScheduleService, private aboutService: AboutService, - private route: ActivatedRoute + private route: ActivatedRoute, + private translate: TranslateService ) {} ngOnInit(): void { @@ -82,7 +84,7 @@ export class TaskComponent implements OnInit { this.loading = false; }, error => { - this.notificationService.error('An error occurred', error); + this.notificationService.error(this.translate.instant('commons.message.error'), error); if (HttpError.is404(error)) { this.back(); } @@ -97,7 +99,7 @@ export class TaskComponent implements OnInit { this.loadingSchedules = false; }, error => { - this.notificationService.error('An error occured', error); + this.notificationService.error(this.translate.instant('commons.message.error'), error); this.loadingSchedules = false; } ); @@ -144,7 +146,7 @@ export class TaskComponent implements OnInit { }, error => { this.loadingExecution = false; - this.notificationService.error('An error occured', error); + this.notificationService.error(this.translate.instant('commons.message.error'), error); } ); } diff --git a/ui/src/app/tasks-jobs/tasks/tasks.component.html b/ui/src/app/tasks-jobs/tasks/tasks.component.html index 3595f416f..a8da819f9 100644 --- a/ui/src/app/tasks-jobs/tasks/tasks.component.html +++ b/ui/src/app/tasks-jobs/tasks/tasks.component.html @@ -1,11 +1,15 @@

- Tasks + {{ 'tasks.main.title' | translate }} + + - -

@@ -17,7 +21,9 @@

#datagrid > - + @@ -54,9 +60,11 @@

(click)="setMode(true)" [appRole]="['ROLE_DESTROY', 'ROLE_SCHEDULE']" > - Group Actions + {{ 'commons.groupActions' | translate }} + + - [style.width.px]="context.sizeName | datagridcolumn: datagrid:contextName:15 | async" [clrFilterValue]="context.taskName" > - Name + {{ 'tasks.main.name' | translate }} (clrDgColumnResize)="updateContext('sizeDsl', $event)" [style.width.px]="context.sizeDsl | datagridcolumn: datagrid:contextName:15 | async" > - Definition + {{ 'tasks.main.definition' | translate }} - Status + {{ 'tasks.main.status' | translate }} @@ -106,8 +114,10 @@

>{{ task.status }} - - + + - - + + - No results found. + {{ 'commons.noResultFound' | translate }} [clrDgPageSize]="context.size" [clrDgPage]="context.current" > - Tasks per page - {{ pagination.firstItem + 1 }} - {{ pagination.lastItem + 1 }} of {{ page?.total }} tasks + {{ + 'tasks.main.tasksPerPage' | translate + }} + {{ + 'tasks.main.pagination' + | translate: {first: pagination.firstItem + 1, last: pagination.lastItem + 1, total: page?.total} + }} diff --git a/ui/src/app/tasks-jobs/tasks/tasks.component.spec.ts b/ui/src/app/tasks-jobs/tasks/tasks.component.spec.ts index 1f5d50f05..49c4f4a62 100644 --- a/ui/src/app/tasks-jobs/tasks/tasks.component.spec.ts +++ b/ui/src/app/tasks-jobs/tasks/tasks.component.spec.ts @@ -13,9 +13,10 @@ import {TaskServiceMock} from '../../tests/api/task.service.mock'; import {GroupServiceMock} from '../../tests/service/group.service.mock'; import {ContextServiceMock} from '../../tests/service/context.service.mock'; import {SettingsServiceMock} from '../../tests/service/settings.service.mock'; -import {ConfirmComponent} from '../../shared/component/confirm/confirm.component'; import {DatagridColumnPipe} from '../../shared/pipe/datagrid-column.pipe'; import {CleanupComponent} from './cleanup/cleanup.component'; +import {TranslateTestingModule} from 'ngx-translate-testing'; +import TRANSLATIONS from '../../../assets/i18n/en.json'; describe('tasks-jobs/tasks/tasks.component.ts', () => { let component: TasksComponent; @@ -25,7 +26,13 @@ describe('tasks-jobs/tasks/tasks.component.ts', () => { waitForAsync(() => { TestBed.configureTestingModule({ declarations: [TasksComponent, DestroyComponent, CleanupComponent, RoleDirective, DatagridColumnPipe], - imports: [FormsModule, ClarityModule, RouterTestingModule.withRoutes([]), BrowserAnimationsModule], + imports: [ + FormsModule, + ClarityModule, + RouterTestingModule.withRoutes([]), + TranslateTestingModule.withTranslations('en', TRANSLATIONS), + BrowserAnimationsModule + ], providers: [ SecurityServiceMock.provider, AboutServiceMock.provider, diff --git a/ui/src/assets/i18n/en.json b/ui/src/assets/i18n/en.json new file mode 100644 index 000000000..b6bc6c707 --- /dev/null +++ b/ui/src/assets/i18n/en.json @@ -0,0 +1,1100 @@ +{ + "commons": { + "ok": "Ok", + "of": "of", + "yes": "Yes", + "ofType": "of type", + "refresh": "Refresh", + "cancel": "Cancel", + "remove": "Remove", + "edit": "Edit", + "close": "Close", + "loading": "loading", + "listedBelow": "listed below", + "areYouSure": "Are you sure?", + "setDefault": "Set default", + "makeDefault": "Make default", + "importFile": "Import a file", + "selectFile": "Select a file", + "minDate": "Min date", + "maxDate": "Max date", + "actions": "Actions", + "groupActions": "Group Actions", + "confirmAction": "Confirm action", + "noResultFound": "No results found.", + "message": { + "error": "An error occurred", + "copiedTitle": "Content copied", + "copiedContent": "The content have been copied to your clipboard.", + "invalidFieldsTitle": "Invalid field(s)", + "invalidFieldsContent": "Some field(s) are missing or invalid." + } + }, + "appRoot": { + "welcomeTo": "Welcome to", + "appTitle": "Data Flow UI", + "youHaveToLogin": "You have to log in to access the application.", + "title": "Data Flow", + "fullName": "Spring Cloud Data Flow" + }, + "layout": { + "logo": { + "title": "Spring Cloud Dataflow UI" + }, + "nav": { + "applications": "Applications", + "streams": "Streams", + "runtime": "Runtime", + "tasks": "Tasks", + "tasksJobs": "Tasks / Jobs", + "taskExecution": "Task executions", + "jobExecution": "Job executions", + "schedules": "Schedules", + "manage": "Manage", + "auditRecords": "Audit Records", + "tools": "Tools" + }, + "quicksearch": { + "input": "Search for keywords...", + "searching": "Searching for results...", + "application": "Application(s)", + "stream": "Stream(s)", + "task": "Task(s)", + "noResult": "There are no search results for" + } + }, + "applications": { + "main": { + "title": "Applications", + "addApplications": "Add application(s)", + "unregisterApplications": "Unregister application(s)", + "name": "Name", + "type": "Type", + "version": "Version", + "uri": "URI", + "metadataURI": "Metadata URI", + "manageVersion": "Manage Version", + "unregister": "Unregister", + "noResult": "No results found", + "applicationsPerPage": "Applications per page", + "application": "application", + "details": "Details", + "pagination": "{{ first }} - {{ last }} of {{ total }} applications" + }, + "add": { + "registerOneOrMore": "Register one or more applications", + "importFromHttp": "Import application coordinates from an HTTP URI location", + "importFromFile": "Import application coordinates from a properties file", + "importFromSpringDataFlow": "Import application starters from dataflow.spring.io", + "websiteStarters": { + "usePredefined": "Use predefined application-URIs (for either maven or docker) for all the out-of-the-box stream and task/batch apps", + "startersForKafkaMaven": "Stream application starters for Kafka/Maven", + "startersForKafkaDocker": "Stream application starters for Kafka/Docker", + "startersForRabbitMQMaven": "Stream application starters for RabbitMQ/Maven", + "startersForRabbitMQDocker": "Stream application starters for RabbitMQ/Docker", + "startersForMaven": "Task application starters for Maven", + "startersForDocker": "Task application starters for Docker", + "forceImport": "Force, the applications will be imported and installed even if it already exists but only if not being used already", + "importApplications": "Import Application(s)", + "importingApplications": "Importing application(s)", + "message": { + "successTitle": "Import starters", + "successContent": "Application(s) Imported.", + "noStarterTitle": "No starter selected", + "noStarterContent": "Please, select a starter pack." + } + }, + "props": { + "desc": "Enter the list of properties into the text area field below.", + "desc2": "Alternatively, you can also select a file in your local file system, which is used to populate the text area field.", + "appsAsProperties": "Apps as Properties", + "example": "Example", + "example1": "task.timestamp=maven://o.s.cloud.task.app:timestamp-task:1.2.3.RELEASE", + "example2": "task.spark-client=maven://o.s.cloud.task.app:spark-client-task:1.2.3.RELEASE", + "force": "Force, the applications will be imported and installed even if it already exists but only if not being used already.", + "import": "Import Application(s)", + "importing": "Importing application(s)", + "requiredApp": "One or more application(s) are required.", + "message": { + "successTitle": "Import application(s)", + "successContent": "Application(s) Imported.", + "errorContent": "An error occurred while importing Apps. Please check the server logs for more details." + } + }, + "register": { + "desc": "Register one or more applications by entering a Name, Type and App URI of the application Jar. You can also provide an optional metadata artifact URI.
The App URI & the Metadata Artifact URI are typically provided using the Maven coordinates of the Jar but can be a local file or a docker image URI.", + "invalidName": "Please provide a valid name for the app.", + "invalidType": "Please provide a valid type.", + "invalidUri": "Please provide a valid URI pointing to the respective properties file.", + "invalidMetadataURI": "Please provide a valid URI pointing to the respective properties file.", + "force": "Force, the applications will be imported and installed even if it already exists but only if not being used already.", + "newApp": "New application", + "import": "Import Application(s)", + "register": "Register Application(s)", + "registering": "Registering application(s)", + "message": { + "invalidAppTitle": "Invalid application", + "invalidAppContent": "Please, register at least one application.", + "successTitle": "Register application(s).", + "successContent": "{{count}} App(s) registered" + } + }, + "uri": { + "desc": "Provide a URI that points to the location of the properties file.
This properties file is formatted so that the keys represent the type and the name of the application, e.g. type.name. The property values are the URIs of the app.", + "placeholderUri": "https://url.to.properties", + "eg": "e.g.", + "egValue": "https://dataflow.spring.io/kafka-maven-latest", + "invalidUri": "Please provide a valid URI pointing to the respective properties file.", + "force": "Force, the applications will be imported and installed even if it already exists but only if not being used already.", + "importing": "Importing application(s)", + "import": "Import Application(s)", + "message": { + "successTitle": "Import Application(s)", + "successContent": "Application(s) Imported." + } + } + }, + "unregister": { + "title": "Confirm Unregister Application", + "title2": "Confirm Unregister Applications", + "content": "This action will unregister and delete application", + "content2": "This action will unregister and delete the", + "unregistering": "Unregistering application(s) ...", + "unregister": "Unregister the application", + "unregister2": "Unregister the applications", + "message": { + "successTitle": "Unregister application", + "successContent": "Successfully removed app \"{{name}}\" of type \"{{type}}\".", + "successTitle2": "Unregister applications", + "successContent2": "{{count}} app(s) unregistered." + } + }, + "details": { + "title": "Application", + "unregister": "Unregister Application", + "manageVersions": "Manage versions", + "notFound": "No application found.", + "information": "Information", + "appProperties": "Application properties", + "tooManyProperties": "There are more than 50 properties to display, the UI can be slow.", + "tooManyProperties2": "Do you want to display all the properties ?", + "showAll": "Show all the properties", + "default": "Default", + "deprecatedLevel": "Deprecation level", + "noDescription": "No Description Available", + "defaultValue": "Default value", + "noProperty": "No property" + }, + "version": { + "manageVersions": "Manage versions", + "loadingVersions": "Loading version(s) ...", + "thisActionWillUnregisterThe": "This action will unregister the", + "ofTheApplication": "of the application", + "thisActionWillMakeTheVersion": "This action will make the version", + "asTheDefaultVersion": "as the default version for the application", + "version": "version", + "message": { + "unregisterSuccessTitle": "Unregister version", + "unregisterSuccessContent": "Successfully removed version \"{{version}}\".", + "defaultSuccessTitle": "Default version", + "defaultSuccessContent": "The version \"{{version}}\" is now the default version of the application \"{{app}}\" ({{type}})." + } + } + }, + "settings": { + "title": "Settings", + "close": "Close", + "language": "Language", + "languageDescription": "You can choose your preferred language.", + "en": "English", + "de": "German", + "fr": "French", + "theme": "Theme", + "themeDescription": "You can choose between dark and default theme.", + "darkTheme": "dark", + "defaultTheme": "default", + "results": "Results", + "resultsDescription": "You can choose the number of results per page." + }, + "about": { + "user": { + "logOut": "Log out", + "logIn": "Log In" + }, + "signpost": { + "title": "Data Flow Server Implementation", + "name": "Name", + "version": "Version", + "moreInfo": "More info", + "projectPage": "Project Page", + "sourceCode": "Source Code", + "documentation": "Documentation", + "apiDocs": "API Docs", + "supportForum": "Support Forum", + "issueTracker": "Issue Tracker" + }, + "info": { + "title": "About Spring Cloud Data Flow", + "serverImpTitle": "Data Flow Server Implementation", + "name": "Name", + "version": "Version", + "features": "Features", + "streams": "Streams", + "tasks": "Tasks", + "schedules": "Schedules", + "monitoring": "Monitoring Dashboard", + "grafana": "Grafana", + "wavefront": "Wavefront", + "security": "Security", + "authentificationEnabled": "Authentication Enabled", + "authenticated": "Authenticated", + "username": "Username", + "roles": "Roles", + "impVersion": "Implementation Version", + "core": "Core", + "dashboard": "Dashboard", + "shell": "Shell", + "shellChecksumSha1": "Shell Checksum Sha1", + "shellChecksumSha256": "Shell Checksum Sha256", + "runtimeSkipperDeployer": "Runtime Environment - Skipper Deployer", + "spiVersion": "Spi Version", + "javaVersion": "Java Version", + "platformApiVersion": "Platform Api Version", + "platformClientVersion": "Platform Client Version", + "platformHostVersion": "Platform Host Version", + "platformType": "Platform Type", + "springBootVersion": "Spring Boot Version", + "springVersion": "Spring Version", + "platformSkipperDeployer": "Platform-specific Information of the Skipper Deployer", + "noPlatform": "No platform-specific app deployer information available.", + "runtimeTaskLauncher": "Runtime Environment - Task Launcher", + "noLauncher": "No Task Launcher information is available.", + "platformTaskLauncher": "Platform-specific Information of the Task Launcher", + "noPlatformTaskLauncher": "No platform-specific task launcher information available.", + "help": "Need Help or Found an Issue?", + "projectPageDesc": "Quick overview of Spring Cloud Data Flow Project.", + "sourceCodeDesc": "Spring Cloud Data Flow Project is an Open Source Project.", + "documentationDesc": "Learn more about the product features.", + "apiDocsDesc": "Learn more about the REST-APIs.", + "supportFormDesc": "You need help?", + "issueTrackerDesc": "Report an issue or request for a new feature.", + "copy": "Copy Details to Clipboard", + "message": { + "copyTitle": "Copy to clipboard", + "copyContent": "Copied About Details to Clipboard (As JSON)." + } + } + }, + "auditRecords": { + "title": "Audit Records", + "id": "ID", + "createdOn": "Created On", + "actions": "Actions", + "operations": "Operations", + "operationID": "Operation ID", + "createBy": "Create by", + "platformName": "Platform name", + "noResult": "No results found.", + "data": "Data", + "property": "Property", + "recordsPerPage": "Records per page", + "pagination": "{{ first }} - {{ last }} of {{ total }} records", + "allActions": "All actions", + "allOperations": "All operations" + }, + "tools": { + "title": "Tools", + "exportStreams": "Export stream(s): Create a JSON file with the selected streams", + "importStreams": "Import stream(s): Import streams from a JSON file", + "cleanUpAll": "Clean up all task/job executions", + "cleanUpCompleted": "Clean up all completed task/job executions", + "exportTasks": "Export task(s): Create a JSON file with the selected tasks", + "importTasks": "Import task(s): Import tasks from a JSON file", + "streams": "Streams", + "tasks": "Tasks", + "cleanUp": "Clean up Task Executions", + "modal": { + "cleanUp": { + "title": "Confirm Clean Up Task Execution(s)", + "content": "This action will remove {{ count }} execution(s). Are you sure?", + "processing": "Removing data", + "cleanUp": "Clean up Execution(s)", + "message": { + "warningNoExecutionTitle": "No execution", + "warningNoExecutionContent": "There is no execution.", + "successTitle": "Clean up execution(s)", + "successContent": "{{count}} execution(s) cleaned up." + } + }, + "exportStreams": { + "title": "Export stream(s)", + "content": "You can create an export of your selected streams.
This operation will generate and download a JSON file.", + "name": "Name", + "definition": "Definition", + "exporting": "Exporting stream(s)", + "export": "Export stream(s)", + "message": { + "errorNoStreamTitle": "No stream selected", + "errorNoStreamContent": "Please, select stream(s) to export.", + "successTitle": "Stream(s) export", + "successContent": "Stream(s) has been exported." + } + }, + "importStreams": { + "title": "Import stream(s)", + "content": "You can import your streams from a JSON file.
The file needs to be modified for sensitive properties before importing.", + "options": "Options", + "jsonFile": "JSON file", + "file": "File", + "optimize": "Optimize", + "duration": "Duration", + "errors": "{{count}} error(s)", + "description": "Description", + "errorMessage": "Message", + "index": "Index", + "success": "{{count}} stream(s) created", + "imnporting": "Importing stream(s)", + "import": "Import stream(s)", + "message": { + "errorInvalidFileTitle": "Invalid file", + "errorInvalidFileContent": "The file is not valid.", + "errorSelectFileTitle": "Invalid file", + "errorSelectFileContent": "Please, select a file." + } + }, + "exportTasks": { + "title": "Export task(s)", + "content": "You can create an export of your selected tasks.
This operation will generate and download a JSON file.", + "name": "Name", + "definition": "Definition", + "exporting": "Exporting task(s)", + "export": "Export task(s)", + "message": { + "errorNoTaskTitle": "No task selected", + "errorNoTaskContent": "Please, select task(s) to export.", + "successTitle": "Task(s) export", + "successContent": "Task(s) has been exported." + } + }, + "importTasks": { + "title": "Import task(s)", + "content": "You can import your tasks from a JSON file.
The file needs to be modified for sensitive properties before importing.", + "options": "Options", + "jsonFile": "JSON file", + "file": "File", + "excludeChildren": "Exclude children", + "duration": "Duration", + "errors": "{{count}} error(s)", + "description": "Description", + "errorMessage": "Message", + "index": "Index", + "success": "{{count}} task(s) created", + "imnporting": "Importing task(s)", + "import": "Import task(s)", + "message": { + "errorInvalidFileTitle": "Invalid file", + "errorInvalidFileContent": "The file is not valid.", + "errorSelectFileTitle": "Invalid file", + "errorSelectFileContent": "Please, select a file." + } + } + } + }, + "runtime": { + "main": { + "title": "Runtime", + "stream": "Stream {{ name }}", + "instance": "instance", + "instances": "instances", + "viewDetails": "View details", + "grafana": "Grafana dashboard", + "wavefront": "Wavefront dashboard", + "noApp": "There are currently no applications running.", + "loading": "Loading runtime" + }, + "details": { + "title": "Instances for app", + "instance": "Instance" + } + }, + "streams": { + "main": { + "title": "Streams", + "createStreams": "Create stream(s)", + "grafana": "Grafana Dashboard", + "wavefront": "Wavefront Dashboard", + "deployStreams": "Deploy stream(s)", + "undeployStreams": "Undeploy stream(s)", + "destroyStreams": "Destroy stream(s)", + "cloneStreams": "Clone stream(s)", + "name": "Name", + "description": "Description", + "definition": "Definition", + "status": "Status", + "details": "Details", + "deploy": "Deploy", + "update": "Update", + "undeploy": "Undeploy", + "destroy": "Destroy", + "clone": "Clone", + "noResult": "No results found.", + "streamsPerPage": "Streams per page", + "pagination": "{{ first }} - {{ last }} of {{ total }} streams" + }, + "clone": { + "title": "Clone Stream", + "title2": "Clone Streams", + "content": "This action will create the following stream(s)", + "duplicate": "Duplicate stream name, please check input names.", + "requiredName": "Stream name is required.", + "invalidName": "Invalid stream name (no space or special charaters).", + "maxLengthName": "Stream name must be less than 255 characters long.", + "uniqueName": "Stream name is already taken.", + "cloning": "Cloning stream(s)", + "clone": "Clone the stream", + "clone2": "Clone the streams", + "message": { + "partialSuccessTitle": "Stream(s) clone", + "partialSuccessContent": "Stream(s) have been cloned partially", + "successTitle": "Stream(s) clone", + "successContent": "Stream(s) have been cloned successfully", + "errorContent": "No stream(s) cloned." + } + }, + "destroy": { + "title": "Confirm Destroy Stream", + "title2": "Confirm Destroy Streams", + "content": "This action will destroy and delete the stream {{ name }}. Are you sure?", + "content2": "This action will destroy the {{ count }} stream definitions listed below. Are you sure?", + "destroying": "Destroying stream(s)", + "destroy": "Destroy the stream", + "destroy2": "Destroy the streams", + "message": { + "successTitle": "Destroy stream", + "successContent": "Successfully removed stream \"{{ name }}\".", + "successTitle2": "Destroy streams", + "successContent2": "{{ count }} stream(s) destroyed.", + "errorContent": "An error occurred while bulk deleting Streams. Please check the server logs for more details." + } + }, + "rollback": { + "title": "Confirm stream rollback", + "content": " This action will rollback the stream {{ name }} to the version {{ version }}. Are you sure?", + "rollbacking": "Rollback stream(s)", + "rollback": "Rollback", + "message": { + "successTitle": "Rollback success", + "successContent": "Successful stream rollback to version \"{{ version }}\"" + } + }, + "status": { + "title": "Stream status", + "deploying": "Deploying", + "deployingContent": "Deployment has been initiated", + "deployed": "Deployed", + "deployedContent": "Fully deployed based on each of the stream's apps' count properties", + "partial": "Partial", + "partialContent": "1 or more of the apps are not yet deployed.", + "incomplete": "Incomplete", + "incompleteContent": "At least 1 of each app, but 1 or more of them not at requested capacity", + "failed": "Failed", + "failedContent": "1 or more of the apps does not have even a single instance deployed", + "undeployed": "Undeployed", + "undeployedContent": "Intentionally undeployed, or created but not yet deployed" + }, + "undeploy": { + "title": "Confirm Undeploy Stream", + "title2": "Confirm Undeploy Streams", + "content": "This action will undeploy the stream {{ name }}. Are you sure?", + "content2": "This action will undeploy the {{ count }} stream definitions listed below. Are you sure?", + "undeploying": "Undeploying stream(s)", + "undeploy": "Undeploy the stream", + "undeploy2": "Undeploy the streams", + "message": { + "successTitle": "Undeploy stream", + "successContent": "Successfully undeploy stream \"{{ name }}\".", + "successTitle2": "Undeploy streams", + "successContent2": "{{ count }} stream(s) undeployed.", + "errorContent": "An error occurred while undeploying Streams. Please check the server logs for more details." + } + }, + "create": { + "title": "Create stream(s)", + "create": "Create stream(s)", + "modal": { + "title": "Create stream(s)", + "creating": "Creating Stream(s)", + "content": "This action will create the following stream(s):", + "create": "Create the stream(s)", + "placeholderName": "Stream Name", + "placeholderDescription": "Stream Description", + "duplicateName": "Duplicate stream name, please check input names.", + "requiredName": "Stream name is required", + "uniqueName": "Stream name is already taken", + "invalidName": "Invalid stream name", + "maxLengthName": "Stream name must be less than 255 characters long", + "maxLengthDescription": "Stream description must be less than 255 characters long", + "operation": { + "creating": "Create stream {{ name }}", + "completed": "Creation completed" + }, + "message": { + "invalidStreamTitle": "Invalid stream(s)", + "invalidStreamContent": "Please, enter one or more valid streams.", + "successTitle": "Stream(s) creation", + "successContent": "Stream(s) have been created successfully", + "errorContent": "Problem creating stream \"{{ name }}\": {{ message }}", + "errorContent2": "Failed to create stream \"{{ name }} \"" + } + } + }, + "stream": { + "title": "Stream", + "deploy": "Deploy stream", + "update": "Update stream", + "undeploy": "Undeploy stream", + "destroy": "Destroy stream", + "applications": "Applications", + "information": "Information", + "showPipeline": "Show Data Pipeline", + "relatedStreams": "Related stream(s)", + "deploymentInfo": "Deployment Info", + "runtime": "Runtime", + "instances": "instance(s)", + "viewLog": "View Log", + "history": "History", + "noHistory": "There is no history yet.", + "version": "Version", + "date": "Date", + "streamStatus": "StreamStatus", + "description": "Description", + "platform": "Platform", + "rollback": "Rollback", + "logStream": "Log {{ name }}", + "noLog": "No log." + }, + "multiDeploy": { + "title": "Deploy Streams", + "deploy": "Deploy", + "update": "Update", + "properties": "Properties", + "invalidPlatform": "Select a platform.", + "invalidProperties": "One or more arguments are invalid.
Example: myarg=myvalue.", + "deployStreams": "Deploy the streams", + "deployModal": "Deploy streams", + "deploying": "Deploying streams", + "message": { + "successTitle": "Deploy success", + "successContent": "Successfully deployed {{count}} stream(s)." + } + }, + "deploy": { + "main": { + "titleUpdate": "Update stream", + "titleDeploy": "Deploy stream", + "description": "Please specify any optional deployment properties. You can either use the builder.
Alternatively, you can point to an external properties file containing the deployment properties. For more information please see the Technical Documentation.", + "builder": "Builder", + "freetext": "Freetext", + "update": "Update stream", + "deploy": "Deploy stream", + "updating": "Updating stream", + "deploying": "Deploying stream(s)", + "export": "Export", + "copy": "Copy to Clipboard", + "message": { + "errorExportPropertyContent": "There are no properties to export.", + "errorCopyPropertyContent": "There are no properties to copy.", + "successCopyTitle": "Copy to clipboard", + "successCopyContent": "The properties have been copied to your clipboard.", + "successUpdateTitle": "Update success", + "successUpdateContent": "Successfully updated stream definition \"{{ name }}\"", + "successDeployTitle": "Deploy success", + "successDeployContent": "Successfully deployed stream definition \"{{ name }}\"", + "errorDeployContent": "An error occurred during the stream deployment update." + } + }, + "freetext": { + "description": "Enter the list of properties into the text area field below. Alternatively, you can also select a file in your local file system, which is used to populate the text area field.", + "tooltip": "Please provide a text file containing properties. This will be used to populate the text area above.", + "deploy": "Deploy the stream", + "update": "Update the stream", + "message": { + "errorDeployTitle": "Invalid properties", + "errorDeployContent": "Some line(s) are invalid." + } + }, + "builder": { + "platform": "Platform", + "invalidPlatform": "The define platform is not valid (unknown).", + "genericDeployerProperties": "Generic Deployer Properties", + "example": "Example", + "key": "Key", + "value": "Value", + "properties": "Properties", + "defaultVersion": "Default version", + "generatedProperty": "Generated property", + "deploymentPlatform": "Deployment Platform", + "applicationsProperties": "Applications Properties", + "version": "Version", + "global": "Global", + "invalid": "invalid", + "enterNumber": "Enter a number", + "enterValue": "Enter a value", + "errorLoading": "Error loading", + "invalidVersion": "Invalid version", + "noProperties": "No properties", + "deploy": "Deploy the stream", + "update": "Update the stream", + "tooltip": { + "invalidProperty": "The field \"property\" is not valid.", + "invalidGlobal": "The field \"global\" is not valid.", + "invalidField": "The field \"{{ name }}\" is not valid." + }, + "deploymentPropertiesTitle": "Deployment properties for platform" + } + } + }, + "tasks": { + "main": { + "title": "Tasks", + "create": "Create task", + "grafana": "Grafana Dashboard", + "wavefront": "Wavefront Dashboard", + "scheduleTasks": "Schedule task(s)", + "destroyTasks": "Destroy task(s)", + "cloneTasks": "Clone task(s)", + "name": "Name", + "description": "Description", + "definition": "Definition", + "status": "Status", + "applications": "Applications", + "schedule": "Schedule", + "destroy": "Destroy", + "clone": "Clone", + "cleanup": "Cleanup", + "details": "Details", + "launch": "Launch", + "tasksPerPage": "Tasks per page", + "pagination": "{{ first }} - {{ last }} of {{ total }} tasks" + }, + "cleanup": { + "title": "Confirm Clean Up Execution(s)", + "confirmContent": "This action will remove {{ count }} execution(s). Are you sure?", + "selectContent": "Please, selected the status of the execution to remove:", + "all": "All the {{ all }} execution(s)", + "completed": "{{ completed }} execution(s) completed", + "removing": "Removing data", + "cleanup": "Clean up Execution(s)", + "message": { + "warningNoExecutionTitle": "No execution", + "warningNoExecutionContent": "There is no execution for this task.", + "successTitle": "Clean up execution(s)", + "successContent": "{{ count }} execution(s) cleaned up." + } + }, + "clone": { + "cloneTitle": "Clone Task", + "cloneTitle2": "Clone Tasks", + "content": "This action will create the following task(s)", + "duplicate": "Duplicate task name, please check input names.", + "requiredName": "Task name is required.", + "invalidName": "Invalid task name (no space or special charaters).", + "maxLengthName": "Task name must be less than 255 characters long.", + "uniqueName": "Task name is already taken.", + "cloning": "Cloning task(s)", + "clone": "Clone the task", + "clone2": "Clone the task", + "message": { + "partialSuccessTitle": "Task(s) clone", + "partialSuccessContent": "Task(s) have been cloned partially", + "successTitle": "Task(s) clone", + "successContent": "Task(s) have been cloned successfully", + "errorContent": "No task(s) cloned." + } + }, + "destroy": { + "destroyTitle": "Confirm Destroy Task", + "destroyTitle2": "Confirm Destroy Tasks", + "content": "This action will destroy and delete the task {{ name }}. Are you sure?", + "content2": "This action will destroy the {{ count }} tasks listed below. Are you sure?", + "destroying": "Destroying task(s)", + "destroy": "Destroy the task", + "destroy2": "Destroy the tasks", + "message": { + "successTitle": "Destroy task", + "successContent": "Successfully removed task \"{{ name }}\".", + "successTitle2": "Destroy tasks", + "successContent2": "{{ count }} task definition(s) destroyed.", + "errorContent": "An error occurred while bulk deleting tasks. Please check the server logs for more details." + } + }, + "task": { + "title": "Task", + "launch": "Launch task", + "schedule": "Schedule task", + "destroy": "Destroy task", + "cleanup": "Cleanup", + "information": "Information", + "applications": "Applications", + "showPipeline": "Show Data Pipeline", + "lastExecution": "Last execution", + "viewTaskExecution": "View task execution", + "viewLog": "View log", + "latestExecutions": "Latest execution(s)", + "schedules": "Schedule(s)" + }, + "create": { + "title": "Create a task", + "createTask": "Create task", + "modal": { + "creating": "Creating task", + "create": "Create the task", + "taskName": "Task Name", + "taskDescription": "Task Description", + "content": "This action will create the following task:", + "duplicateName": "Duplicate task name, please check input names.", + "maxLengthName": "Task name must be less than 256 characters long.", + "invalidName": "Invalid task name.", + "requiredTask": "Task name is required.", + "maxLength63Name": "The task definition name should be less than 63 characters for Kubernetes or Cloud Foundry platforms.", + "uniqueTask": "Task name is already taken.", + "maxLengthDescription": "Task description must be less than 255 characters long." + }, + "message": { + "errorContent": "Please, enter a valid task.", + "successTitle": "Task creation", + "successContent": "Task Definition created for {{ name }}" + } + }, + "launch": { + "main": { + "title": "Launch task", + "description": "Please specify any optional deployment properties. You can either use the builder.
Alternatively, you can point to an external properties file containing the deployment properties. For more information please see the Technical Documentation.", + "builder": "Builder", + "freetext": "Freetext", + "export": "Export", + "copy": "Copy to Clipboard", + "launching": "Launching task", + "launch": "Launch task", + "message": { + "errorExportPropertyContent": "There are no properties to export.", + "errorExportArgumentContent": "There are no arguments to export.", + "errorCopyPropertyContent": "There are no properties to copy.", + "errorCopyArgumentContent": "There are no arguments to copy.", + "successCopyTitle": "Copy to clipboard", + "successCopyContent": "The properties have been copied to your clipboard.", + "successCopyArgsContent": "The arguments have been copied to your clipboard.", + "successTitle": "Launch success", + "successContent": "Successfully launched task definition \"{{ name }}\"", + "errorLaunchContent": "An error occurred during the task launch." + } + }, + "freetext": { + "propertiesDescription": "Enter the list of properties into the text area field below.", + "argumentsDescription": "Enter the list of arguments into the text area field below.", + "propertiesTooltip": "Please provide a text file containing properties. This will be used to populate the text area above.", + "argumentsTooltip": "Please provide a text file containing arguments. This will be used to populate the text area above.", + "launch": "Launch Task" + }, + "builder": { + "platform": "Platform", + "invalidPlatform": "The define platform is not valid (unknown).", + "genericDeployerProperties": "Generic Deployer Properties", + "arguments": "Arguments", + "properties": "Properties", + "defaultVersion": "Default version", + "deploymentPlatform": "Deployment Platform", + "applicationsProperties": "Applications Properties", + "version": "Version", + "ctrProperties": "Ctr Properties", + "global": "Global", + "invalid": "invalid", + "enterNumber": "Enter a number", + "enterValue": "Enter a value", + "selectValue": "Select a value", + "errorLoading": "Error loading", + "invalidVersion": "Invalid version", + "noProperties": "No properties", + "launch": "Launch task", + "deploymentPropertiesTitle": "Deployment properties for platform", + "ctrPropertiesTitle": "Ctr properties", + "lastVersionLabel": "Last launch {{ version }}", + "defaultVersionLabel": "Default version ({{ version }})", + "tooltip": { + "invalidProperty": "The field \"property\" is not valid.", + "invalidGlobal": "The field \"global\" is not valid.", + "invalidField": "The field \"{{ name }}\" is not valid." + }, + "alert": { + "migrateContent": "There are properties which can be migrated.", + "migrate": "Migrate" + } + } + } + }, + "executions": { + "main": { + "title": "Task executions", + "executionId": "Execution Id", + "taskName": "Task name", + "arguments": "Arguments", + "externalExecutionId": "External Execution Id", + "batchJob": "Batch Job", + "jobExecutionIds": "Job Execution Ids", + "startTime": "Start Time", + "endTime": "End Time", + "startDate": "Start Date", + "endDate": "End Date", + "duration": "Duration", + "exitCode": "Exit Code", + "exitMessage": "Exit Message", + "resourceUrl": "Resource URL", + "viewLog": "View log", + "applicationProperties": "Application Properties", + "platformProperties": "Platform Properties", + "noExecution": "No execution yet.", + "cleanupExecutions": "Clean Up task execution(s)", + "cleanup": "Clean up task execution", + "details": "Details", + "taskDetails": "Task details", + "relaunch": "Relaunch task", + "stop": "Stop task", + "grafana": "Grafana Dashboard", + "wavefront": "Wavefront Dashboard", + "executionPerPage": "Task executions per page", + "pagination": "{{ first }} - {{ last }} of {{ total }} task executions" + }, + "stop": { + "title": "Confirm Stop Task Execution", + "description": "This action will stop the task execution {{ id }} (task {{ taskName }}). Are you sure?", + "stopping": "Stopping task execution", + "stop": "Stop Task Execution(s)", + "message": { + "successTitle": "Stop task execution(s)", + "successContent": "Request submitted to stop task execution \"{{ id }}\".", + "errorContent": "An error occurred while stopping task executions. Please check the server logs for more details." + } + }, + "cleanup": { + "title": "Confirm Clean Up Task Execution(s)", + "description": "This action will remove the data of the task execution {{ executionId }} (task {{ taskName }}). Are you sure?", + "description2": "This action will remove the data of the {{ count }} task executions listed below. Are you sure?", + "removing": "Removing data", + "cleanupExecution": "Clean up Task Execution", + "cleanupExecutions": "Clean up Task Executions", + "message": { + "successTitle": "Clean up task execution(s)", + "successContent": "{{ count }} task execution(s) cleaned up." + } + }, + "execution": { + "title": "Task execution - Execution ID", + "relaunch": "Relaunch task", + "stop": "Stop execution", + "cleanup": "Clean up task execution", + "viewTask": "View task", + "noTask": "No task found.", + "task": "Task", + "information": "Information", + "logTitle": "Log task execution {{ id }}" + } + }, + "jobs": { + "main": { + "title": "Job Executions", + "executionId": "Execution Id", + "name": "Name", + "id": "Id", + "jobName": "Job Name", + "jobInstance": "Job Instance", + "taskId": "Task Id", + "taskExecutionId": "Task Execution Id", + "jobParameters": "Job Parameters", + "instanceId": "Instance Id", + "startTime": "Start Time", + "endTime": "End Time", + "duration": "Duration", + "exitCode": "Exit Code", + "exitMessage": "Exit Message", + "stepExecutionCount": "Step Execution Count", + "status": "Status", + "details": "Details", + "restart": "Restart", + "stop": "Stop", + "grafana": "Grafana Dashboard", + "jobPerPage": "Job executions per page", + "pagination": "{{ first }} - {{ last }} of {{ total }} job executions", + "restartConfirmTitle": "Confirm restart the job execution", + "restartConfirmContent": "This action will restart the steps failed of the job execution {{ name }} ({{ id }}).
Are you sure?", + "stopConfirmTitle": "Confirm stop the job execution", + "stopConfirmContent": "This action will stop the job execution {{ name }} ({{ id }}).
Are you sure?", + "message": { + "successRestartTitle": "Restart job", + "successRestartMessage": "Successfully restarted job \"{{ name }}\".", + "successStopTitle": "Stop job", + "successStopMessage": "Successfully stopped job \"{{ name }}\"." + } + }, + "execution": { + "title": "Job execution", + "restart": "Restart the job", + "stop": "Stop the job", + "noTaskFound": "No task found.", + "task": "Task", + "information": "Information", + "taskExecution": "Task execution", + "steps": "Steps", + "viewTask": "View task", + "relaunchTask": "Relaunch Task", + "viewExecution": "View task execution", + "viewLog": "View log" + }, + "step": { + "title": "Step Execution", + "stepId": "Step Id", + "stepName": "Step Name", + "stepExecutionId": "Step Execution Id", + "jobExecutionId": "Job Execution Id", + "stepType": "Step Type", + "reads": "Reads", + "writes": "Writes", + "commits": "Commits", + "rollbacks": "Rollbacks", + "duration": "Durations", + "status": "Status", + "filterCount": "Filter Count", + "processSkips": "Process Skips", + "readSkips": "Read Skips", + "skips": "Skips", + "writeSkips": "Write Skips", + "noStep": "No Step Execution available.", + "noExecutionContext": "No step execution context.", + "information": "Information", + "exitDescription": "Exit Description", + "stepExecutionContext": "Step Execution Context", + "stepExecutionHistory": "Step Execution History", + "task": "task", + "taskExecution": "Task execution", + "history": { + "name": "name", + "count": "count", + "min": "min", + "max": "max", + "mean": "mean", + "standardDeviation": "Standard Deviation", + "commitCount": "Commit Count", + "duration": "Duration", + "durationPerRead": "Duration per Read", + "filterCount": "Filter Count", + "processSkipCount": "Process Skip Count", + "readCount": "Read Count", + "readSkipCount": "Read Skip Count", + "rollbackCount": "Rollback Count", + "writeCount": "Write Count", + "writeSkipCoumt": "Write Skip Count" + } + } + }, + "schedules": { + "main": { + "title": "Sechdules", + "name": "Name", + "taskName": "Task name", + "scheduleName": "Schedule name", + "schedule": "Schedule", + "platform": "Platform", + "cronExpression": "Cron Expression", + "cronExp": "Cron Expr.", + "arguments": "Arguments", + "noSchedule": "No schedule yet.", + "deleteSchedules": "Delete schedules(s)", + "details": "Details", + "taskDetails": "Task details", + "addNewSchedule": "Add new schedule", + "destroy": "Destroy", + "pagination": "{{ count }} schedules" + }, + "destroy": { + "title": "Confirm Delete Schedule", + "title2": "Confirm Delete Schedules", + "description": "This action will delete the schedule {{ name }}. Are you sure?", + "description2": "This action will delete the {{ count }} scheduleslisted below.
Are you sure?", + "deleting": "Deleting schedule(s)", + "delete": "Delete the schedule", + "delete2": "Delete the schedules", + "message": { + "successTitle": "Delete schedule(s)", + "successContent": "{{ count }} schedule(s) deleted.", + "errorContent": "An error occurred while deleting schedule(s). Please check the server logs for more details." + } + }, + "create": { + "title": "Create schedule(s)", + "requiredName": "The name is required.", + "uniqueName": "The name already exists.", + "duplicateScheduleName": "Duplicate schedule name on the form.", + "requiredScheduleName": "The name is required.", + "uniqueScheduleName": "The name already exists.", + "requiredPlatform": "The platform is required.", + "requiredCronExpression": "The cron expression is required.", + "arguments": "arguments", + "argumentsDesc": "Arguments can be prefixed by -- (optional). Example:", + "invalidArguments": "One or more arguments are invalid.
Example: myarg=myvalue.", + "properties": "Properties", + "propertiesDesc": "Parameters should start with an app. or scheduler.. Example:", + "invalidProperties": "One or more parameters are invalid.
Example: app.myarg=myvalue.", + "create": "Create schedule(s)", + "creating": "Creating schedule(s)", + "message": { + "groupSeclectionNotFoundTitle": "Group selection not found.", + "scheculeSuccessTitle": "Schedule creation", + "scheculesSuccessTitle": "Schedule creation", + "scheculeSuccessContent": "Successfully schedule creation \"{{ name }}\"", + "scheculesSuccessContent": "Successfully {{ count }} schedules creation" + } + }, + "schedule": { + "title": "Schedule", + "taskDetails": "Task details", + "deleteSchedule": "Delete schedule", + "information": "Information", + "taskInformation": "Task Information" + } + }, + "security": { + "authenticationRequired": { + "title": "Authentication required", + "description": "Please sign in." + }, + "featureDisabled": { + "title": "Feature Disabled", + "description": "The requested feature is disabled on the server." + }, + "rolesMissing": { + "title": "Roles Missing", + "description": "It appears that you are missing the proper roles. Please contact your administrator to rectify the situation." + } + }, + "flo": { + "commons": { + "invalidValue": "Invalid value.", + "searchForApplications": "Search for applications", + "fitToContent": "Fit to Content", + "instanceDown": "App instance either is down or not deployed" + }, + "properties": { + "title": "Properties for", + "searchProperties": "Search properties" + }, + "stream": { + "invalidAppLabel": "Invalid app label.", + "invalidStreamName": "Invalid stream name.", + "uniqueStreamName": "Stream name already exists.", + "noneOfStreamName": "Stream name already exists on the canvas.", + "enterStreamDefinition": "Enter stream definition" + }, + "task": { + "enterTaskDefinition": "Enter task definition" + } + } +} diff --git a/ui/tsconfig.json b/ui/tsconfig.json index ccb4a059e..bc67369f1 100644 --- a/ui/tsconfig.json +++ b/ui/tsconfig.json @@ -10,13 +10,10 @@ "moduleResolution": "node", "emitDecoratorMetadata": true, "experimentalDecorators": true, + "resolveJsonModule": true, + "esModuleInterop": true, "target": "es2015", - "typeRoots": [ - "node_modules/@types" - ], - "lib": [ - "es2018", - "dom" - ] + "typeRoots": ["node_modules/@types"], + "lib": ["es2018", "dom"] } }