diff --git a/README.md b/README.md index 71693b77..4f6e05c9 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,21 @@ Preferences -> Tools -> Actions on Save * Run eslint --fix * Run prettier +## Translations + +We use (vue-i18n)[https://kazupon.github.io/vue-i18n/] for translations +and (vue-i18n-extract)[https://github.com/Spittal/vue-i18n-extract] for helper +scripts. + +``` +# will create a report on command line with missing translations +npm run vue-i18n-extract + +# add missing translations to files, see docs for more options +cd client +npx vue-i18n-extract --add +``` + ## Deployment to CapRover ### CapRover Dev (vbv-lernwelt.control.iterativ.ch) diff --git a/client/.prettierignore b/client/.prettierignore index de4d1f00..80cb10cb 100644 --- a/client/.prettierignore +++ b/client/.prettierignore @@ -1,2 +1,4 @@ dist node_modules +**/__tests__/*.json +src/colors.json diff --git a/client/.prettierrc b/client/.prettierrc index 8258aa33..7542914d 100644 --- a/client/.prettierrc +++ b/client/.prettierrc @@ -1,8 +1,9 @@ { + "htmlWhitespaceSensitivity": "ignore", + "jsonRecursiveSort": true, + "organizeImportsSkipDestructiveCodeActions": true, + "printWidth": 88, "semi": true, "singleQuote": false, - "tabWidth": 2, - "printWidth": 88, - "organizeImportsSkipDestructiveCodeActions": true, - "htmlWhitespaceSensitivity": "ignore" + "tabWidth": 2 } diff --git a/client/package-lock.json b/client/package-lock.json index e2df688f..08d5fb5c 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -21,6 +21,7 @@ "pinia": "^2.0.21", "vue": "^3.2.38", "vue-i18n": "^9.2.2", + "vue-i18n-extract": "^2.0.7", "vue-router": "^4.1.5" }, "devDependencies": { @@ -51,6 +52,7 @@ "postcss-import": "^14.1.0", "prettier": "^2.7.1", "prettier-plugin-organize-imports": "^3.1.1", + "prettier-plugin-sort-json": "^1.0.0", "prettier-plugin-tailwindcss": "^0.2.1", "replace-in-file": "^6.3.5", "sass": "^1.54.6", @@ -3345,6 +3347,12 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "node_modules/@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "dev": true + }, "node_modules/@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", @@ -4225,8 +4233,7 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/aria-query": { "version": "5.1.3", @@ -4409,8 +4416,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", @@ -4467,7 +4473,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -4569,6 +4574,14 @@ "node": ">=10.16.0" } }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -4942,8 +4955,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/constant-case": { "version": "3.0.4", @@ -5725,6 +5737,26 @@ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, + "node_modules/dot-object": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/dot-object/-/dot-object-2.1.4.tgz", + "integrity": "sha512-7FXnyyCLFawNYJ+NhkqyP9Wd2yzuo+7n9pGiYpkmXCTYa8Ci2U0eUNDVg5OuO5Pm6aFXI2SWN8/N/w7SJWu1WA==", + "dependencies": { + "commander": "^4.0.0", + "glob": "^7.1.5" + }, + "bin": { + "dot-object": "bin/dot-object" + } + }, + "node_modules/dot-object/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, "node_modules/dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -6953,8 +6985,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.2", @@ -7046,7 +7077,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7084,7 +7114,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7094,7 +7123,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -7552,7 +7580,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -7561,8 +7588,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/inquirer": { "version": "8.2.5", @@ -7946,6 +7972,14 @@ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, + "node_modules/is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-weakmap": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", @@ -8062,7 +8096,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -8675,7 +8708,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8965,7 +8997,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -9205,7 +9236,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9522,6 +9552,21 @@ } } }, + "node_modules/prettier-plugin-sort-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-sort-json/-/prettier-plugin-sort-json-1.0.0.tgz", + "integrity": "sha512-XgcaF/Sojax1vD6j53wNIByx0rp7ecang+A8W0eM+Ks3yBFu/qXjJNvUtC1lEWeYbNfmRs/d8FyYJCYozAVENw==", + "dev": true, + "dependencies": { + "@types/prettier": "^2.7.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "prettier": "^2.3.2" + } + }, "node_modules/prettier-plugin-tailwindcss": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.2.1.tgz", @@ -11125,6 +11170,39 @@ "vue": "^3.0.0" } }, + "node_modules/vue-i18n-extract": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/vue-i18n-extract/-/vue-i18n-extract-2.0.7.tgz", + "integrity": "sha512-i1NW5R58S720iQ1BEk+6ILo3hT6UA8mtYNNolSH4rt9345qvXdvA6GHy2+jHozdDAKHwlu9VvS/+vIMKs1UYQw==", + "dependencies": { + "cac": "^6.7.12", + "dot-object": "^2.1.4", + "glob": "^8.0.1", + "is-valid-glob": "^1.0.0", + "js-yaml": "^4.1.0" + }, + "bin": { + "vue-i18n-extract": "bin/vue-i18n-extract.js" + } + }, + "node_modules/vue-i18n-extract/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/vue-router": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", @@ -11460,8 +11538,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/ws": { "version": "8.11.0", @@ -14317,6 +14394,12 @@ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, + "@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "dev": true + }, "@types/semver": { "version": "7.3.13", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", @@ -15009,8 +15092,7 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "aria-query": { "version": "5.1.3", @@ -15149,8 +15231,7 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { "version": "1.5.1", @@ -15190,7 +15271,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, "requires": { "balanced-match": "^1.0.0" } @@ -15256,6 +15336,11 @@ "streamsearch": "^1.1.0" } }, + "cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==" + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -15544,8 +15629,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "constant-case": { "version": "3.0.4", @@ -16143,6 +16227,22 @@ } } }, + "dot-object": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/dot-object/-/dot-object-2.1.4.tgz", + "integrity": "sha512-7FXnyyCLFawNYJ+NhkqyP9Wd2yzuo+7n9pGiYpkmXCTYa8Ci2U0eUNDVg5OuO5Pm6aFXI2SWN8/N/w7SJWu1WA==", + "requires": { + "commander": "^4.0.0", + "glob": "^7.1.5" + }, + "dependencies": { + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + } + } + }, "dotenv": { "version": "16.0.3", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", @@ -16977,8 +17077,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { "version": "2.3.2", @@ -17042,7 +17141,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -17056,7 +17154,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -17066,7 +17163,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -17416,7 +17512,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -17425,8 +17520,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "inquirer": { "version": "8.2.5", @@ -17703,6 +17797,11 @@ } } }, + "is-valid-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==" + }, "is-weakmap": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", @@ -17801,7 +17900,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "requires": { "argparse": "^2.0.1" } @@ -18274,7 +18372,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, "requires": { "brace-expansion": "^2.0.1" } @@ -18490,7 +18587,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "requires": { "wrappy": "1" } @@ -18678,8 +18774,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-key": { "version": "3.1.1", @@ -18847,6 +18942,15 @@ "dev": true, "requires": {} }, + "prettier-plugin-sort-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-sort-json/-/prettier-plugin-sort-json-1.0.0.tgz", + "integrity": "sha512-XgcaF/Sojax1vD6j53wNIByx0rp7ecang+A8W0eM+Ks3yBFu/qXjJNvUtC1lEWeYbNfmRs/d8FyYJCYozAVENw==", + "dev": true, + "requires": { + "@types/prettier": "^2.7.2" + } + }, "prettier-plugin-tailwindcss": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.2.1.tgz", @@ -19980,6 +20084,32 @@ "@vue/devtools-api": "^6.2.1" } }, + "vue-i18n-extract": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/vue-i18n-extract/-/vue-i18n-extract-2.0.7.tgz", + "integrity": "sha512-i1NW5R58S720iQ1BEk+6ILo3hT6UA8mtYNNolSH4rt9345qvXdvA6GHy2+jHozdDAKHwlu9VvS/+vIMKs1UYQw==", + "requires": { + "cac": "^6.7.12", + "dot-object": "^2.1.4", + "glob": "^8.0.1", + "is-valid-glob": "^1.0.0", + "js-yaml": "^4.1.0" + }, + "dependencies": { + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + } + } + }, "vue-router": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.6.tgz", @@ -20233,8 +20363,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "ws": { "version": "8.11.0", diff --git a/client/package.json b/client/package.json index 4d8a7a34..92c91e05 100644 --- a/client/package.json +++ b/client/package.json @@ -10,6 +10,7 @@ "coverage": "vitest run --coverage", "typecheck": "vue-tsc --noEmit -p tsconfig.app.json --composite false", "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", + "vue-i18n-extract": "vue-i18n-extract report", "prettier": "prettier . --write", "prettier:check": "prettier . --check", "tailwind": "tailwindcss -i tailwind.css -o ../server/vbv_lernwelt/static/css/tailwind.css --watch" @@ -28,6 +29,7 @@ "pinia": "^2.0.21", "vue": "^3.2.38", "vue-i18n": "^9.2.2", + "vue-i18n-extract": "^2.0.7", "vue-router": "^4.1.5" }, "devDependencies": { @@ -58,6 +60,7 @@ "postcss-import": "^14.1.0", "prettier": "^2.7.1", "prettier-plugin-organize-imports": "^3.1.1", + "prettier-plugin-sort-json": "^1.0.0", "prettier-plugin-tailwindcss": "^0.2.1", "replace-in-file": "^6.3.5", "sass": "^1.54.6", diff --git a/client/src/locales/de.json b/client/src/locales/de.json index 61cc2089..66507e91 100644 --- a/client/src/locales/de.json +++ b/client/src/locales/de.json @@ -1,170 +1,170 @@ { + "circlePage": { + "circleContentBoxTitle": "Das lernst du in diesem Circle.", + "contactExpertButton": "Fachexpertin kontaktieren", + "contactExpertDescription": "Tausche dich mit der Fachexpertin für den Circle {circleName} aus.", + "documents": { + "action": "Unterlagen hochladen", + "chooseLearningSequence": "Bitte wähle eine Lernsequenz aus", + "chooseName": "Bitte wähle einen Namen", + "chooseSequence": "Wähle eine Lernsequenz aus", + "expertDescription": "Stelle deinen Lernenden zusätzliche Inhalte zur Verfügung.", + "fileLabel": "Datei", + "maxFileSize": "Maximale Dateigrösse: 20 MB", + "modalAction": "Datei auswählen", + "modalFileName": "Name", + "modalNameInformation": "Max. 70 Zeichen", + "selectFile": "Bitte wähle eine Datei aus", + "title": "Unterlagen", + "uploadErrorMessage": "Beim Hochladen ist ein Fehler aufgetreten. Bitte versuche es erneut.", + "userDescription": "Hier findest du die Unterlagen, die dir die Fachexpertin zur Verfügung gestellt hat." + }, + "duration": "Dauer", + "gotQuestions": "Hast du Fragen?", + "learnMore": "Erfahre mehr dazu" + }, + "cockpit": { + "examsDone": "Abgelegte Prüfungen von Teilnehmer.", + "feedbacksDone": "Abgeschickte Feedbacks von Teilnehmer.", + "notifyTask": "Benachrichtigen", + "notifyTaskDescription": "Teilnehmer benachrichtigen", + "profileLink": "Profil anzeigen", + "progress": "Fortschritt", + "tasksDone": "Erledigte Transferaufträge von Teilnehmer.", + "title": "Cockpit" + }, + "competences": { + "assessAgain": "Sich nochmals einschätzen", + "assessment": "Einschätzungen", + "competences": "Kompetenzen", + "lastImprovements": "Letzte verbesserte Kompetenzen", + "notAssessed": "Nicht eingeschätzt", + "title": "KompetenzNavi" + }, + "constants": { + "no": "Nein", + "satisfied": "zufrieden", + "unsatisfied": "unzufrieden", + "verySatisfied": "sehr zufrieden", + "veryUnsatisfied": "sehr unzufrieden", + "yes": "Ja" + }, + "dashboard": { + "welcome": "Willkommen, {name}" + }, + "feedback": { + "answers": "Antworten", + "areYouSatisfied": "Wie zufrieden bist du?", + "average": "Durchschnitt", + "circleFeedback": "Feedback zum Circle", + "completionDescription": "Dein Feedback ist anonym. Dein Vor- und Nachname werden bei deiner Trainer/-in nicht angezeigt.", + "completionTitle": "Schicke dein Feedback an {name}", + "courseNegativeFeedbackLabel": "Wo sehen Sie Verbesserungspotenzial?", + "coursePositiveFeedbackLabel": "Was hat Ihnen besonders gut gefallen?", + "feedbackPageInfo": "Teilnehmer haben das Feedback ausgefüllt", + "feedbackPageTitle": "Feedback zum Lehrgang", + "feedbackSent": "Dein Feedback wurde abgeschickt", + "goalAttainmentLabel": "Zielerreichung insgesamt", + "happy": "Zufrieden", + "instructorCompetenceLabel": "Der Kursleiter war themenstark, fachkompetent.", + "instructorOpenFeedbackLabel": "Was ich dem Kursleiter sonst noch sagen wollte:", + "instructorRespectLabel": "Fragen und Anregungen der Kursteilnehmenden wurden ernst genommen und aufgegriffen.", + "intro": "{name}, dein/e Trainer/-in, bittet dich, ihm/ihr Feedback zu geben. Das ist freiwillig, würde aber ihm/ihr helfen, deine Lernerlebniss zu verbessern.", + "materialsRatingLabel": "Falls ja: Wie beurteilen Sie die Vorbereitungsunterlagen (z.B. eLearning)?", + "noFeedbacks": "Es wurden noch keine Feedbacks abgegeben", + "proficiencyLabel": "Wie beurteilen Sie Ihre Sicherheit bezüglichen den Themen nach dem Kurs?", + "questionTitle": "Frage", + "receivedMaterialsLabel": "Haben Sie Vorbereitungsunterlagen (z.B. eLearning) erhalten?", + "recommendLabel": "Würden Sie den Kurs weiterempfehlen?", + "satisfactionLabel": "Zufriedenheit insgesamt", + "sendFeedback": "Feedback abschicken", + "sentByUsers": "Von {count} Teilnehmern ausgefüllt", + "showDetails": "Details anzeigen", + "unhappy": "Unzufrieden", + "veryHappy": "Sehr zufrieden", + "veryUnhappy": "Sehr unzufrieden" + }, + "footer": { + "contact": "Kontakt", + "dataProtection": "Datenschutzbestimmungen", + "faq": "FAQ", + "imprint": "Impressum" + }, "general": { - "nextStep": "Weiter geht's", - "start": "Los geht's", - "backToLearningPath": "zurück zum Lernpfad", - "backToCircle": "zurück zum Circle", - "next": "Weiter", "back": "zurück", "backCapitalized": "@.capitalize:general.back", - "save": "Speichern", - "send": "Senden", - "learningUnit": "Lerneinheit", - "learningPath": "Lernpfad", - "learningSequence": "Lernsequenz", - "show": "Anschauen", + "backToCircle": "zurück zum Circle", + "backToLearningPath": "zurück zum Lernpfad", + "certificate": "Zertifikat | Zertifikate", "circles": "Circles", - "transferTask": "Transferauftrag | Transferaufträge", - "feedback": "Feedback | Feedbacks", "exam": "Prüfung | Prüfungen", "examResult": "Prüfungsresultat | Prüfungsresultate", - "certificate": "Zertifikat | Zertifikate", + "feedback": "Feedback | Feedbacks", + "learningPath": "Lernpfad", + "learningSequence": "Lernsequenz", + "learningUnit": "Lerneinheit", + "next": "Weiter", + "nextStep": "Weiter geht's", + "no": "Nein", "notification": "Benachrichtigung | Benachrichtigungen", "profileLink": "Profil anzeigen", + "save": "Speichern", + "send": "Senden", + "settings": "Kontoeinstellungen", "shop": "Shop", - "yes": "Ja", - "no": "Nein", + "show": "Anschauen", "showAll": "Alle anschauen", - "settings": "Kontoeinstellungen" + "start": "Los geht's", + "transferTask": "Transferauftrag | Transferaufträge", + "yes": "Ja" + }, + "learningContent": { + "completeAndContinue": "Als erledigt markieren" + }, + "learningPathPage": { + "nextStep": "Nächster Schritt", + "showListView": "Listenansicht anzeigen", + "welcomeBack": "Willkommen zurück, {name}" }, "mainNavigation": { "logout": "Abmelden", "profile": "Profil" }, - "dashboard": { - "welcome": "Willkommen, {name}" - }, - "learningPathPage": { - "welcomeBack": "Willkommen zurück, {name}", - "showListView": "Listenansicht anzeigen", - "nextStep": "Nächster Schritt" - }, - "circlePage": { - "duration": "Dauer", - "circleContentBoxTitle": "Das lernst du in diesem Circle.", - "gotQuestions": "Hast du Fragen?", - "contactExpertButton": "Fachexpertin kontaktieren", - "contactExpertDescription": "Tausche dich mit der Fachexpertin für den Circle {circleName} aus.", - "learnMore": "Erfahre mehr dazu", - "documents": { - "title": "Unterlagen", - "expertDescription": "Stelle deinen Lernenden zusätzliche Inhalte zur Verfügung.", - "userDescription": "Hier findest du die Unterlagen, die dir die Fachexpertin zur Verfügung gestellt hat.", - "action": "Unterlagen hochladen", - "modalAction": "Datei auswählen", - "fileLabel": "Datei", - "modalFileName": "Name", - "modalNameInformation": "Max. 70 Zeichen", - "chooseSequence": "Wähle eine Lernsequenz aus", - "selectFile": "Bitte wähle eine Datei aus", - "chooseName": "Bitte wähle einen Namen", - "chooseLearningSequence": "Bitte wähle eine Lernsequenz aus", - "uploadErrorMessage": "Beim Hochladen ist ein Fehler aufgetreten. Bitte versuche es erneut.", - "maxFileSize": "Maximale Dateigrösse: 20 MB" - } - }, - "learningContent": { - "completeAndContinue": "Als erledigt markieren" - }, - "selfEvaluation": { - "selfEvaluation": "Selbsteinschätzung", - "title": "@:selfEvaluation.selfEvaluation {title}", - "steps": "Schritt {current} von {max}", - "instruction": [ - "Überprüfe, ob du in der Lernheinheit", - "alles verstanden hast.", - "Lies die folgende Aussage und bewerte sie:" - ], - "yes": "Ja, ich kann das", - "no": "Das muss ich nochmals anschauen", - "progressText": "Schau dein Fortschritt in deinem KompetenzNavi:", - "progressLink": "KompetenzNavi öffnen", - "selfEvaluationYes": "@:selfEvaluation: Ich kann das.", - "selfEvaluationNo": "@:selfEvaluation: Muss ich nochmals anschauen." - }, - "competences": { - "competences": "Kompetenzen", - "title": "KompetenzNavi", - "lastImprovements": "Letzte verbesserte Kompetenzen", - "assessment": "Einschätzungen", - "notAssessed": "Nicht eingeschätzt", - "assessAgain": "Sich nochmals einschätzen" - }, "mediaLibrary": { - "title": "Mediathek", - "learningMedia": { - "titel": "Lernmedien", - "description": "Finde eine vollständige Liste der Bücher und anderen Medien, auf die im Kurs verwiesen wird." - }, "handlungsfelder": { - "title": "Handlungsfeld | Handlungsfelder", - "description": "Finde alle Ressourcen der Handlungsfelder wie Lernmedien, Links und andere nützliche Informationen." - } - }, - "footer": { - "dataProtection": "Datenschutzbestimmungen", - "imprint": "Impressum", - "contact": "Kontakt", - "faq": "FAQ" - }, - "cockpit": { - "title": "Cockpit", - "tasksDone": "Erledigte Transferaufträge von Teilnehmer.", - "feedbacksDone": "Abgeschickte Feedbacks von Teilnehmer.", - "examsDone": "Abgelegte Prüfungen von Teilnehmer.", - "progress": "Fortschritt", - "profileLink": "Profil anzeigen", - "notifyTaskDescription": "Teilnehmer benachrichtigen", - "notifyTask": "Benachrichtigen" + "description": "Finde alle Ressourcen der Handlungsfelder wie Lernmedien, Links und andere nützliche Informationen.", + "title": "Handlungsfeld | Handlungsfelder" + }, + "learningMedia": { + "description": "Finde eine vollständige Liste der Bücher und anderen Medien, auf die im Kurs verwiesen wird.", + "titel": "Lernmedien" + }, + "title": "Mediathek" }, "messages": { "sendMessage": "Nachricht schreiben" }, - "feedback": { - "intro": "{name}, dein/e Trainer/-in, bittet dich, ihm/ihr Feedback zu geben. Das ist freiwillig, würde aber ihm/ihr helfen, deine Lernerlebniss zu verbessern.", - "areYouSatisfied": "Wie zufrieden bist du?", - "recommendLabel": "Würden Sie den Kurs weiterempfehlen?", - "satisfactionLabel": "Zufriedenheit insgesamt", - "goalAttainmentLabel": "Zielerreichung insgesamt", - "proficiencyLabel": "Wie beurteilen Sie Ihre Sicherheit bezüglichen den Themen nach dem Kurs?", - "receivedMaterialsLabel": "Haben Sie Vorbereitungsunterlagen (z.B. eLearning) erhalten?", - "materialsRatingLabel": "Falls ja: Wie beurteilen Sie die Vorbereitungsunterlagen (z.B. eLearning)?", - "instructorCompetenceLabel": "Der Kursleiter war themenstark, fachkompetent.", - "instructorRespectLabel": "Fragen und Anregungen der Kursteilnehmenden wurden ernst genommen und aufgegriffen.", - "instructorOpenFeedbackLabel": "Was ich dem Kursleiter sonst noch sagen wollte:", - "courseNegativeFeedbackLabel": "Wo sehen Sie Verbesserungspotenzial?", - "coursePositiveFeedbackLabel": "Was hat Ihnen besonders gut gefallen?", - "completionTitle": "Schicke dein Feedback an {name}", - "completionDescription": "Dein Feedback ist anonym. Dein Vor- und Nachname werden bei deiner Trainer/-in nicht angezeigt.", - "sendFeedback": "Feedback abschicken", - "feedbackSent": "Dein Feedback wurde abgeschickt", - "circleFeedback": "Feedback zum Circle", - "showDetails": "Details anzeigen", - "sentByUsers": "Von {count} Teilnehmern ausgefüllt", - "feedbackPageTitle": "Feedback zum Lehrgang", - "feedbackPageInfo": "Teilnehmer haben das Feedback ausgefüllt", - "questionTitle": "Frage", - "veryUnhappy": "Sehr unzufrieden", - "unhappy": "Unzufrieden", - "happy": "Zufrieden", - "veryHappy": "Sehr zufrieden", - "average": "Durchschnitt", - "answers": "Antworten", - "noFeedbacks": "Es wurden noch keine Feedbacks abgegeben" - }, "notifications": { "load_more": "Mehr laden", "no_notifications": "Du hast derzeit keine Benachrichtigungen" }, + "selfEvaluation": { + "instruction": [ + "Überprüfe, ob du in der Lernheinheit", + "alles verstanden hast.", + "Lies die folgende Aussage und bewerte sie:" + ], + "no": "Das muss ich nochmals anschauen", + "progressLink": "KompetenzNavi öffnen", + "progressText": "Schau dein Fortschritt in deinem KompetenzNavi:", + "selfEvaluation": "Selbsteinschätzung", + "selfEvaluationNo": "@:selfEvaluation: Muss ich nochmals anschauen.", + "selfEvaluationYes": "@:selfEvaluation: Ich kann das.", + "steps": "Schritt {current} von {max}", + "title": "@:selfEvaluation.selfEvaluation {title}", + "yes": "Ja, ich kann das" + }, "settings": { "emailNotifications": "Email Benachrichtigungen" - }, - "constants": { - "yes": "Ja", - "no": "Nein", - "verySatisfied": "sehr zufrieden", - "satisfied": "zufrieden", - "unsatisfied": "unzufrieden", - "veryUnsatisfied": "sehr unzufrieden" } } diff --git a/client/src/locales/fr.json b/client/src/locales/fr.json index 0b590e24..edf60444 100644 --- a/client/src/locales/fr.json +++ b/client/src/locales/fr.json @@ -1,159 +1,170 @@ { - "general": { - "nextStep": "Prochaine étape", - "start": "Commencer", - "backToLearningPath": "zurück zum Lernpfad", - "backToCircle": "zurück zum Circle", - "next": "Weiter", - "back": "zurück", - "backCapitalized": "@.capitalize:general.back", - "save": "Speichern", - "learningUnit": "Lerneinheit", - "learningPath": "Lernpfad", - "learningSequence": "Lernsequenz", - "show": "Anschauen", - "circles": "Circles", - "transferTask": "Transferauftrag | Transferaufträge", - "feedback": "Feedback | Feedbacks", - "exam": "Prüfung | Prüfungen", - "examResult": "Prüfungsresultat | Prüfungsresultate", - "certificate": "Zertifikat | Zertifikate", - "notification": "Benachrichtigung | Benachrichtigungen", - "profileLink": "Profil anzeigen", - "shop": "Shop", - "yes": "Ja", - "no": "Nein" + "circlePage": { + "circleContentBoxTitle": "Das lernst du in diesem Circle.", + "contactExpertButton": "Fachexpertin kontaktieren", + "contactExpertDescription": "Tausche dich mit der Fachexpertin für den Circle {circleName} aus.", + "documents": { + "action": "Unterlagen hochladen", + "chooseLearningSequence": "Bitte wähle eine Lernsequenz aus", + "chooseName": "Bitte wähle einen Namen", + "chooseSequence": "Wähle eine Lernsequenz aus", + "expertDescription": "Stelle deinen Lernenden zusätzliche Inhalte zur Verfügung.", + "fileLabel": "Datei", + "maxFileSize": "Maximale Dateigrösse: 20 MB", + "modalAction": "Datei auswählen", + "modalFileName": "Name", + "modalNameInformation": "Max. 70 Zeichen", + "selectFile": "Bitte wähle eine Datei aus", + "title": "Unterlagen", + "uploadErrorMessage": "Beim Hochladen ist ein Fehler aufgetreten. Bitte versuche es erneut.", + "userDescription": "Hier findest du die Unterlagen, die dir die Fachexpertin zur Verfügung gestellt hat." + }, + "duration": "Dauer", + "gotQuestions": "Hast du Fragen?", + "learnMore": "Erfahre mehr dazu" }, - "mainNavigation": { - "logout": "Abmelden", - "settings": "Kontoeinstellungen" + "cockpit": { + "examsDone": "Abgelegte Prüfungen von Teilnehmer.", + "feedbacksDone": "Abgeschickte Feedbacks von Teilnehmer.", + "profileLink": "Profil anzeigen", + "progress": "Fortschritt", + "tasksDone": "Erledigte Transferaufträge von Teilnehmer.", + "title": "Cockpit" + }, + "competences": { + "assessAgain": "Sich nochmals einschätzen", + "assessment": "Einschätzungen", + "competences": "Kompetenzen", + "lastImprovements": "Letzte verbesserte Kompetenzen", + "notAssessed": "Nicht eingeschätzt", + "showAll": "Alle anschauen", + "title": "KompetenzNavi" + }, + "constants": { + "no": "Nein", + "satisfied": "zufrieden", + "unsatisfied": "unzufrieden", + "verySatisfied": "sehr zufrieden", + "veryUnsatisfied": "sehr unzufrieden", + "yes": "Ja" }, "dashboard": { "welcome": "Willkommen, {name}" }, - "learningPathPage": { - "welcomeBack": "Willkommen zurück, {name}", - "showListView": "Listenansicht anzeigen", - "nextStep": "Nächster Schritt" + "feedback": { + "answers": "Antworten", + "areYouSatisfied": "Wie zufrieden bist du?", + "average": "Durchschnitt", + "circleFeedback": "Feedback zum Circle", + "completionDescription": "Dein Feedback ist anonym. Dein Vor- und Nachname werden bei deiner Trainer/-in nicht angezeigt.", + "completionTitle": "Schicke dein Feedback an {name}", + "courseNegativeFeedbackLabel": "Wo sehen Sie Verbesserungspotenzial?", + "coursePositiveFeedbackLabel": "Was hat Ihnen besonders gut gefallen?", + "feedbackPageInfo": "Teilnehmer haben das Feedback ausgefüllt", + "feedbackPageTitle": "Feedback zum Lehrgang", + "feedbackSent": "Dein Feedback wurde abgeschickt", + "goalAttainmentLabel": "Zielerreichung insgesamt", + "happy": "Zufrieden", + "instructorCompetenceLabel": "Der Kursleiter war themenstark, fachkompetent.", + "instructorOpenFeedbackLabel": "Was ich dem Kursleiter sonst noch sagen wollte:", + "instructorRespectLabel": "Fragen und Anregungen der Kursteilnehmenden wurden ernst genommen und aufgegriffen.", + "intro": "{name}, dein/e Trainer/-in, bittet dich, ihm/ihr Feedback zu geben. Das ist freiwillig, würde aber ihm/ihr helfen, deine Lernerlebniss zu verbessern.", + "materialsRatingLabel": "Falls ja: Wie beurteilen Sie die Vorbereitungsunterlagen (z.B. eLearning)?", + "noFeedbacks": "Es wurden noch keine Feedbacks abgegeben", + "proficiencyLabel": "Wie beurteilen Sie Ihre Sicherheit bezüglichen den Themen nach dem Kurs?", + "questionTitle": "Frage", + "receivedMaterialsLabel": "Haben Sie Vorbereitungsunterlagen (z.B. eLearning) erhalten?", + "recommendLabel": "Würden Sie den Kurs weiterempfehlen?", + "satisfactionLabel": "Zufriedenheit insgesamt", + "sendFeedback": "Feedback abschicken", + "sentByUsers": "Von {count} Teilnehmern ausgefüllt", + "showDetails": "Details anzeigen", + "unhappy": "Unzufrieden", + "veryHappy": "Sehr zufrieden", + "veryUnhappy": "Sehr unzufrieden" }, - "circlePage": { - "duration": "Dauer", - "circleContentBoxTitle": "Das lernst du in diesem Circle.", - "gotQuestions": "Hast du Fragen?", - "contactExpertButton": "Fachexpertin kontaktieren", - "contactExpertDescription": "Tausche dich mit der Fachexpertin für den Circle {circleName} aus.", - "learnMore": "Erfahre mehr dazu", - "documents": { - "title": "Unterlagen", - "expertDescription": "Stelle deinen Lernenden zusätzliche Inhalte zur Verfügung.", - "userDescription": "Hier findest du die Unterlagen, die dir die Fachexpertin zur Verfügung gestellt hat.", - "action": "Unterlagen hochladen", - "modalAction": "Datei auswählen", - "fileLabel": "Datei", - "modalFileName": "Name", - "modalNameInformation": "Max. 70 Zeichen", - "chooseSequence": "Wähle eine Lernsequenz aus", - "selectFile": "Bitte wähle eine Datei aus", - "chooseName": "Bitte wähle einen Namen", - "chooseLearningSequence": "Bitte wähle eine Lernsequenz aus", - "uploadErrorMessage": "Beim Hochladen ist ein Fehler aufgetreten. Bitte versuche es erneut.", - "maxFileSize": "Maximale Dateigrösse: 20 MB" - } + "footer": { + "contact": "Kontakt", + "dataProtection": "Datenschutzbestimmungen", + "faq": "FAQ", + "imprint": "Impressum" + }, + "general": { + "back": "zurück", + "backCapitalized": "@.capitalize:general.back", + "backToCircle": "zurück zum Circle", + "backToLearningPath": "zurück zum Lernpfad", + "certificate": "Zertifikat | Zertifikate", + "circles": "Circles", + "exam": "Prüfung | Prüfungen", + "examResult": "Prüfungsresultat | Prüfungsresultate", + "feedback": "Feedback | Feedbacks", + "hello": "", + "learningPath": "Lernpfad", + "learningSequence": "Lernsequenz", + "learningUnit": "Lerneinheit", + "next": "Weiter", + "nextStep": "Prochaine étape", + "no": "Nein", + "notification": "Benachrichtigung | Benachrichtigungen", + "profileLink": "Profil anzeigen", + "save": "Speichern", + "settings": "", + "shop": "Shop", + "show": "Anschauen", + "showAll": "", + "start": "Commencer", + "transferTask": "Transferauftrag | Transferaufträge", + "yes": "Ja" }, "learningContent": { "completeAndContinue": "Als erledigt markieren" }, + "learningPathPage": { + "nextStep": "Nächster Schritt", + "showListView": "Listenansicht anzeigen", + "welcomeBack": "Willkommen zurück, {name}" + }, + "mainNavigation": { + "logout": "Abmelden", + "profile": "", + "settings": "Kontoeinstellungen" + }, + "mediaLibrary": { + "handlungsfelder": { + "description": "Finde alle Ressourcen der Handlungsfelder wie Lernmedien, Links und andere nützliche Informationen.", + "title": "Handlungsfeld | Handlungsfelder" + }, + "learningMedia": { + "description": "Finde eine vollständige Liste der Bücher und anderen Medien, auf die im Kurs verwiesen wird.", + "titel": "Lernmedien" + }, + "title": "Mediathek" + }, + "messages": { + "sendMessage": "Nachricht schreiben" + }, + "notifications": { + "load_more": "", + "no_notifications": "" + }, "selfEvaluation": { - "selfEvaluation": "Selbsteinschätzung", - "title": "@:selfEvaluation.selfEvaluation {title}", - "steps": "Schritt {current} von {max}", "instruction": [ "Überprüfe, ob du in der Lernheinheit", "alles verstanden hast.", "Lies die folgende Aussage und bewerte sie:" ], - "yes": "Ja, ich kann das", "no": "Das muss ich nochmals anschauen", - "progressText": "Schau dein Fortschritt in deinem KompetenzNavi:", "progressLink": "KompetenzNavi öffnen", + "progressText": "Schau dein Fortschritt in deinem KompetenzNavi:", + "selfEvaluation": "Selbsteinschätzung", + "selfEvaluationNo": "@:selfEvaluation: Muss ich nochmals anschauen.", "selfEvaluationYes": "@:selfEvaluation: Ich kann das.", - "selfEvaluationNo": "@:selfEvaluation: Muss ich nochmals anschauen." + "steps": "Schritt {current} von {max}", + "title": "@:selfEvaluation.selfEvaluation {title}", + "yes": "Ja, ich kann das" }, - "competences": { - "competences": "Kompetenzen", - "title": "KompetenzNavi", - "lastImprovements": "Letzte verbesserte Kompetenzen", - "showAll": "Alle anschauen", - "assessment": "Einschätzungen", - "notAssessed": "Nicht eingeschätzt", - "assessAgain": "Sich nochmals einschätzen" - }, - "mediaLibrary": { - "title": "Mediathek", - "learningMedia": { - "titel": "Lernmedien", - "description": "Finde eine vollständige Liste der Bücher und anderen Medien, auf die im Kurs verwiesen wird." - }, - "handlungsfelder": { - "title": "Handlungsfeld | Handlungsfelder", - "description": "Finde alle Ressourcen der Handlungsfelder wie Lernmedien, Links und andere nützliche Informationen." - } - }, - "footer": { - "dataProtection": "Datenschutzbestimmungen", - "imprint": "Impressum", - "contact": "Kontakt", - "faq": "FAQ" - }, - "cockpit": { - "title": "Cockpit", - "tasksDone": "Erledigte Transferaufträge von Teilnehmer.", - "feedbacksDone": "Abgeschickte Feedbacks von Teilnehmer.", - "examsDone": "Abgelegte Prüfungen von Teilnehmer.", - "progress": "Fortschritt", - "profileLink": "Profil anzeigen" - }, - "messages": { - "sendMessage": "Nachricht schreiben" - }, - "feedback": { - "intro": "{name}, dein/e Trainer/-in, bittet dich, ihm/ihr Feedback zu geben. Das ist freiwillig, würde aber ihm/ihr helfen, deine Lernerlebniss zu verbessern.", - "areYouSatisfied": "Wie zufrieden bist du?", - "recommendLabel": "Würden Sie den Kurs weiterempfehlen?", - "satisfactionLabel": "Zufriedenheit insgesamt", - "goalAttainmentLabel": "Zielerreichung insgesamt", - "proficiencyLabel": "Wie beurteilen Sie Ihre Sicherheit bezüglichen den Themen nach dem Kurs?", - "receivedMaterialsLabel": "Haben Sie Vorbereitungsunterlagen (z.B. eLearning) erhalten?", - "materialsRatingLabel": "Falls ja: Wie beurteilen Sie die Vorbereitungsunterlagen (z.B. eLearning)?", - "instructorCompetenceLabel": "Der Kursleiter war themenstark, fachkompetent.", - "instructorRespectLabel": "Fragen und Anregungen der Kursteilnehmenden wurden ernst genommen und aufgegriffen.", - "instructorOpenFeedbackLabel": "Was ich dem Kursleiter sonst noch sagen wollte:", - "courseNegativeFeedbackLabel": "Wo sehen Sie Verbesserungspotenzial?", - "coursePositiveFeedbackLabel": "Was hat Ihnen besonders gut gefallen?", - "completionTitle": "Schicke dein Feedback an {name}", - "completionDescription": "Dein Feedback ist anonym. Dein Vor- und Nachname werden bei deiner Trainer/-in nicht angezeigt.", - "sendFeedback": "Feedback abschicken", - "feedbackSent": "Dein Feedback wurde abgeschickt", - "circleFeedback": "Feedback zum Circle", - "showDetails": "Details anzeigen", - "sentByUsers": "Von {count} Teilnehmern ausgefüllt", - "feedbackPageTitle": "Feedback zum Lehrgang", - "feedbackPageInfo": "Teilnehmer haben das Feedback ausgefüllt", - "questionTitle": "Frage", - "veryUnhappy": "Sehr unzufrieden", - "unhappy": "Unzufrieden", - "happy": "Zufrieden", - "veryHappy": "Sehr zufrieden", - "average": "Durchschnitt", - "answers": "Antworten", - "noFeedbacks": "Es wurden noch keine Feedbacks abgegeben" - }, - "constants": { - "yes": "Ja", - "no": "Nein", - "verySatisfied": "sehr zufrieden", - "satisfied": "zufrieden", - "unsatisfied": "unzufrieden", - "veryUnsatisfied": "sehr unzufrieden" + "settings": { + "emailNotifications": "" } } diff --git a/client/tsconfig.app.json b/client/tsconfig.app.json index 0d2e0c18..1a19788b 100644 --- a/client/tsconfig.app.json +++ b/client/tsconfig.app.json @@ -1,15 +1,15 @@ { - "extends": "@vue/tsconfig/tsconfig.web.json", - "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], - "exclude": ["src/**/__tests__/*"], "compilerOptions": { - "lib": ["ES2021", "DOM", "DOM.Iterable"], - "composite": true, - "strict": true, "allowJs": true, "baseUrl": ".", + "composite": true, + "lib": ["ES2021", "DOM", "DOM.Iterable"], "paths": { "@/*": ["./src/*"] - } - } + }, + "strict": true + }, + "exclude": ["src/**/__tests__/*"], + "extends": "@vue/tsconfig/tsconfig.web.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"] } diff --git a/client/tsconfig.vite-config.json b/client/tsconfig.vite-config.json index d20d8726..e3f2fdc1 100644 --- a/client/tsconfig.vite-config.json +++ b/client/tsconfig.vite-config.json @@ -1,8 +1,8 @@ { - "extends": "@vue/tsconfig/tsconfig.node.json", - "include": ["vite.config.*"], "compilerOptions": { "composite": true, "types": ["node", "vitest"] - } + }, + "extends": "@vue/tsconfig/tsconfig.node.json", + "include": ["vite.config.*"] } diff --git a/client/tsconfig.vitest.json b/client/tsconfig.vitest.json index 67705fd2..5e470cc6 100644 --- a/client/tsconfig.vitest.json +++ b/client/tsconfig.vitest.json @@ -1,9 +1,9 @@ { - "extends": "./tsconfig.app.json", - "exclude": [], "compilerOptions": { "composite": true, "lib": [], "types": ["node", "jsdom", "vitest/globals"] - } + }, + "exclude": [], + "extends": "./tsconfig.app.json" } diff --git a/client/vue-i18n-extract.config.js b/client/vue-i18n-extract.config.js new file mode 100644 index 00000000..211d01d8 --- /dev/null +++ b/client/vue-i18n-extract.config.js @@ -0,0 +1,12 @@ +// eslint-disable-next-line +module.exports = { + vueFiles: "./src/**/*.?(js|vue)", + languageFiles: "./src/locales/*.json", + exclude: ["translation_key_1", "translation_key_2"], + output: false, + add: false, + remove: false, + ci: false, + separator: ".", + noEmptyTranslation: "", +}; diff --git a/package.json b/package.json index 6229e1a5..3f1eb448 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "test": "echo \"Error: no test specified\" && exit 1", "cypress:open": "cypress open", "cypress:ci": "currents run --parallel --record --key $CURRENTS_KEY", - "prettier": "npm run prettier --prefix client" + "prettier": "npm run prettier --prefix client", + "vue-i18n-extract": "npm run vue-i18n-extract --prefix client" }, "devDependencies": { "@currents/cli": "^3.1.3", diff --git a/server/vbv_lernwelt/competence/create_uk_competence_profile.py b/server/vbv_lernwelt/competence/create_uk_competence_profile.py index 03808e4a..db091068 100644 --- a/server/vbv_lernwelt/competence/create_uk_competence_profile.py +++ b/server/vbv_lernwelt/competence/create_uk_competence_profile.py @@ -20,104 +20,33 @@ def create_uk_competence_profile(course_id=COURSE_UK1): competences = [ { - "competence_id": "A1", - "title": "Weiterempfehlung für Neukunden generieren", - "items": [ - "Verhandlungsgeschick", - "Überzeugtes Auftreten", - ], - }, - { - "competence_id": "A2", - "title": "Kundengespräche vereinbaren", - "items": [ - "Gesprächsführung / Fragetechniken", - "Selbstorganisation", - "Arbeitstechniken", - "Psychologische Kenntnisse / Kommunikations-psychologie", - ], - }, - { - "competence_id": "A3", - "title": "Auftritt in den sozialen Medien zeitgemäss halten", - "items": [ - "Gesetzliche und Compliance-Anforderungen der Versicherer", - "Datenschutzgesetz", - "Kommunikation in den sozialen Medien", - ], - }, - {"competence_id": "A4", "title": "Kundendaten erfassen", "items": []}, - { - "competence_id": "B1", - "title": "Wünsche, Ziele und Bedürfnisse der Kunden im Gespräch ermitteln", - "items": [ - "Gesprächsführung", - "Fragetechniken", - "Kundenpsychologie", - ], - }, - { - "competence_id": "B2", - "title": "Analyse des Kundenbedarfs und des Kundenbedürfnisses durchführen", - "items": [ - "Fragetechniken", - "Visuelle Hilfsmittel / Visualisierungstechniken", - ], - }, - { - "competence_id": "B3", - "title": "Individuelle Lösungsvorschläge erarbeiten", - "items": [ - "Fundierte Produktekenntnisse", - "Regulatorische Vorschriften", - ], - }, - { - "competence_id": "B4", - "title": "Lösungsvorschläge präsentieren und umsetzen", - "items": [ - "Verhandlungsstrategien", - "Fundierte Produktkenntnisse", - "Visuelle Hilfsmittel / Visualisierungstechniken", - ], - }, - { - "competence_id": "C1", - "title": "Cross- und Upselling; bestehende fremdverwaltete Versicherungspolicen prüfen und in das Portfolio aufnehmen", - "items": [ - "Produktkenntnisse", - "Gesprächsführung", - "Kommunikation", - "Fragetechnik", - "Verhandlungsgeschick", - "Vertragsrecht", - "Regulatorische Vorgaben", - "UVG, BVG, KVG, VVG", - ], - }, - { - "competence_id": "C2", - "title": "Änderungswünsche entgegennehmen und bestehende Verträge anpassen", - "items": [ - "Produktkenntnisse", - "Gesprächsführung", - "Kommunikation", - "Fragetechnik", - "Verhandlungsgeschick", - "Vertragsrecht", - "Regulatorische Vorgaben", - "UVG, BVG, KVG, VVG", - ], - }, - { - "competence_id": "C3", - "title": "Kunden im Schadenfall unterstützen", + "competence_id": "e4", + "title": "Betriebsbezogene Inhalte multimedial aufbereiten", "items": [], }, - {"competence_id": "C4", "title": "Bestehende Kunden pflegen", "items": []}, { - "competence_id": "C5", - "title": "Versicherungsanträge nachbearbeiten", + "competence_id": "c3", + "title": "Betriebliche Prozesse dokumentieren, koordinieren und umsetzen", + "items": [], + }, + { + "competence_id": "e2", + "title": "Informationen im wirtschaftlichen und kaufmännischen Bereich recherchieren", + "items": [], + }, + { + "competence_id": "d2", + "title": "Informations- und Beratungsgespräche mit Kunden oder Lieferanten führen", + "items": [], + }, + { + "competence_id": "d3", + "title": "Betriebliche Prozesse dokumentieren, koordinieren und umsetzen", + "items": [], + }, + { + "competence_id": "d1", + "title": "Anliegen von Kunden oder Lieferanten entgegennehmen", "items": [], }, ] @@ -130,165 +59,93 @@ def create_uk_competence_profile(course_id=COURSE_UK1): items=[("item", i) for i in c["items"]], ) - # Daten anhand von WEVM_Version Oktober 2022 - # Einstieg/Beobachten – Selbsteinschätzung «Einkommenssicherung» PerformanceCriteriaFactory( parent=CompetencePage.objects.get( - slug__startswith=slug_prefix.replace("-lp", ""), competence_id="A2" + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="e4" ), - competence_id="A2.1", - title="Ich bin fähig je nach (Neu-) Kunde Form und Ort für das Gespräch festzulegen.", - learning_unit=LearningUnit.objects.get( - slug=f"{slug_prefix}-circle-kickoff-lu-einführung" - ), - ) - PerformanceCriteriaFactory( - parent=CompetencePage.objects.get( - slug__startswith=slug_prefix.replace("-lp", ""), competence_id="A2" - ), - competence_id="A2.2", - title="Ich bin fähig mir intern und extern die nötigen Informationen über den (Neu-) Kunden zu beschaffen.", - learning_unit=LearningUnit.objects.get( - slug=f"{slug_prefix}-circle-kickoff-lu-arbeits-und-lerntechnik" - ), - ) - PerformanceCriteriaFactory( - parent=CompetencePage.objects.get( - slug__startswith=slug_prefix.replace("-lp", ""), competence_id="A2" - ), - competence_id="A2.3", - title="Ich bin fähig die Terminierung auf das Thema Einkommenssicherung auszurichten.", - learning_unit=LearningUnit.objects.get( - slug=f"{slug_prefix}-circle-kickoff-lu-versicherung" - ), - ) - PerformanceCriteriaFactory( - parent=CompetencePage.objects.get( - slug__startswith=slug_prefix.replace("-lp", ""), competence_id="A2" - ), - competence_id="A2.4", - title="Ich bin fähig für das zu führende Gespräch eine Agenda zu erstellen.", - learning_unit=LearningUnit.objects.get( - slug=f"{slug_prefix}-circle-kickoff-lu-beratung-und-verkauf" - ), - ) - PerformanceCriteriaFactory( - parent=CompetencePage.objects.get( - slug__startswith=slug_prefix.replace("-lp", ""), competence_id="A2" - ), - competence_id="A2.5", - title="Ich bin fähig für das Handlungsfeld «Einkommenssicherung» geeignete Hilfsmittel und Unterlagen zusammenzustellen.", - learning_unit=LearningUnit.objects.get( - slug=f"{slug_prefix}-circle-kickoff-lu-sozialer-auftritt" - ), - ) - PerformanceCriteriaFactory( - parent=CompetencePage.objects.get( - slug__startswith=slug_prefix.replace("-lp", ""), competence_id="B1" - ), - competence_id="B1.1", - title="Ich bin fähig dem Kunden den Gesprächsablauf und den Zeitrahmen (mittels Agenda) aufzuzeigen.", - learning_unit=LearningUnit.objects.get( - slug=f"{slug_prefix}-circle-basis-lu-einführung" - ), - ) - PerformanceCriteriaFactory( - parent=CompetencePage.objects.get( - slug__startswith=slug_prefix.replace("-lp", ""), competence_id="B1" - ), - competence_id="B1.2", - title="Ich bin fähig mich beim Kunden korrekt zu identifizieren (VAG 45).", - learning_unit=LearningUnit.objects.get( - slug=f"{slug_prefix}-circle-basis-lu-arbeits-und-lerntechnik" - ), - ) - PerformanceCriteriaFactory( - parent=CompetencePage.objects.get( - slug__startswith=slug_prefix.replace("-lp", ""), competence_id="B2" - ), - competence_id="B2.3", - title="Ich bin fähig alle erforderlichen Unterlagen einzufordern.", - learning_unit=LearningUnit.objects.get( - slug=f"{slug_prefix}-circle-basis-lu-versicherung" - ), - ) - PerformanceCriteriaFactory( - parent=CompetencePage.objects.get( - slug__startswith=slug_prefix.replace("-lp", ""), competence_id="A1" - ), - competence_id="A1.6", - title="Ich bin fähig im täglichen Kontakt potenzielle Kundinnen und Kunden zu erkennen.", - learning_unit=LearningUnit.objects.get( - slug=f"{slug_prefix}-circle-basis-lu-versicherung" - ), - ) - PerformanceCriteriaFactory( - parent=CompetencePage.objects.get( - slug__startswith=slug_prefix.replace("-lp", ""), competence_id="A2" - ), - competence_id="A2.1", - title="Ich bin fähig je nach (Neu-) Kunde Form und Ort für das Gespräch festzulegen.", - learning_unit=LearningUnit.objects.get( - slug=f"{slug_prefix}-circle-basis-lu-beratung-und-verkauf" - ), - ) - PerformanceCriteriaFactory( - parent=CompetencePage.objects.get( - slug__startswith=slug_prefix.replace("-lp", ""), competence_id="A2" - ), - competence_id="A2.2", - title="Ich bin fähig mir intern und extern die nötigen Informationen über den (Neu-) Kunden zu beschaffen.", - learning_unit=LearningUnit.objects.get( - slug=f"{slug_prefix}-circle-basis-lu-sozialer-auftritt" - ), - ) - PerformanceCriteriaFactory( - parent=CompetencePage.objects.get( - slug__startswith=slug_prefix.replace("-lp", ""), competence_id="A2" - ), - competence_id="A2.3", - title="Ich bin fähig die Terminierung auf das Thema Fahrzeug auszurichten.", - learning_unit=LearningUnit.objects.get( - slug=f"{slug_prefix}-circle-fahrzeug-lu-versicherung" - ), - ) - PerformanceCriteriaFactory( - parent=CompetencePage.objects.get( - slug__startswith=slug_prefix.replace("-lp", ""), competence_id="A2" - ), - competence_id="A2.4", - title="Ich bin fähig für das zu führende Gespräch eine Agenda zu erstellen.", + competence_id="e4.pv.ük1", + title="Sie erläutern die Dienstleistungen des Betriebs. (K2)", learning_unit=LearningUnit.objects.get( slug=f"{slug_prefix}-circle-fahrzeug-lu-einführung" ), ) PerformanceCriteriaFactory( parent=CompetencePage.objects.get( - slug__startswith=slug_prefix.replace("-lp", ""), competence_id="A2" + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="e4" ), - competence_id="A2.5", - title="Ich bin fähig für das zu führende Gespräch geeignete Hilfsmittel und Unterlagen zusammenzustellen.", + competence_id="e4.pv.ük3", + title="Sie stellen die Wertschöpfungskette und die verschiedenen organisatorischen Bereiche ihres Betriebs dar. (K2).", learning_unit=LearningUnit.objects.get( - slug=f"{slug_prefix}-circle-fahrzeug-lu-arbeits-und-lerntechnik" + slug=f"{slug_prefix}-circle-fahrzeug-lu-einführung" ), ) PerformanceCriteriaFactory( parent=CompetencePage.objects.get( - slug__startswith=slug_prefix.replace("-lp", ""), competence_id="A2" + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="e4" ), - competence_id="A2.3", - title="Ich bin fähig die Terminierung auf das Thema Reisen auszurichten.", + competence_id="e4.pv.ük4", + title="Sie erläutern die relevanten rechtlichen Grundlagen ihrer Branche situationsgerecht. (K2)", learning_unit=LearningUnit.objects.get( - slug=f"{slug_prefix}-circle-fahrzeug-lu-versicherung" + slug=f"{slug_prefix}-circle-fahrzeug-lu-einführung" ), ) PerformanceCriteriaFactory( parent=CompetencePage.objects.get( - slug__startswith=slug_prefix.replace("-lp", ""), competence_id="A2" + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2" ), - competence_id="A2.4", - title="Ich bin fähig für das zu führende Gespräch eine Agenda zu erstellen.", + competence_id="d2.pv.ük1", + title="Sie beschreiben die wichtigsten gesetzlichen Grundlagen im Versicherungsbereich umfassend. (K2)", learning_unit=LearningUnit.objects.get( - slug=f"{slug_prefix}-circle-fahrzeug-lu-sozialer-auftritt" + slug=f"{slug_prefix}-circle-fahrzeug-lu-einführung" + ), + ) + PerformanceCriteriaFactory( + parent=CompetencePage.objects.get( + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2" + ), + competence_id="d2.pv.ük2", + title="Sie nennen die relevanten Dienstleistungen und Produkte im Versicherungsbereich. (K1)", + learning_unit=LearningUnit.objects.get( + slug=f"{slug_prefix}-circle-fahrzeug-lu-einführung" + ), + ) + PerformanceCriteriaFactory( + parent=CompetencePage.objects.get( + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2" + ), + competence_id="d2.pv.ük3", + title="Sie erklären die Leistungen und Produkte im Versicherungsbereich. (K2)", + learning_unit=LearningUnit.objects.get( + slug=f"{slug_prefix}-circle-fahrzeug-lu-einführung" + ), + ) + PerformanceCriteriaFactory( + parent=CompetencePage.objects.get( + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="d2" + ), + competence_id="d2.pv.ük4", + title="Sie erläutern die Prozesse und Abläufe im privaten Versicherungsbereich verständlich. (K2)", + learning_unit=LearningUnit.objects.get( + slug=f"{slug_prefix}-circle-fahrzeug-lu-einführung" + ), + ) + PerformanceCriteriaFactory( + parent=CompetencePage.objects.get( + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="c3" + ), + competence_id="c3.pv.ük7", + title="Sie erläutern die gesetzlichen Bestimmungen bei Schaden- und Leistungsfällen. (K2)", + learning_unit=LearningUnit.objects.get( + slug=f"{slug_prefix}-circle-fahrzeug-lu-einführung" + ), + ) + PerformanceCriteriaFactory( + parent=CompetencePage.objects.get( + slug__startswith=slug_prefix.replace("-lp", ""), competence_id="c3" + ), + competence_id="c3.pv.ük11", + title="Sie beurteilen gängige Versicherungslösungen fachkundig. (K3)", + learning_unit=LearningUnit.objects.get( + slug=f"{slug_prefix}-circle-fahrzeug-lu-einführung" ), ) diff --git a/server/vbv_lernwelt/course/management/commands/create_default_courses.py b/server/vbv_lernwelt/course/management/commands/create_default_courses.py index d51d1076..de61b412 100644 --- a/server/vbv_lernwelt/course/management/commands/create_default_courses.py +++ b/server/vbv_lernwelt/course/management/commands/create_default_courses.py @@ -248,7 +248,7 @@ def command(): # initial completion data for slug, status, email in [ ( - "überbetriebliche-kurse-competence-crit-a21-allgemein", + "überbetriebliche-kurse-competence-crit-e4pvük4-allgemein", "success", "michael.meier@example.com", ), @@ -273,7 +273,7 @@ def command(): "michael.meier@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a22-allgemein", + "überbetriebliche-kurse-competence-crit-e4pvük3-allgemein", "success", "michael.meier@example.com", ), @@ -293,7 +293,7 @@ def command(): "michael.meier@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a23-allgemein", + "überbetriebliche-kurse-competence-crit-e4pvük1-allgemein", "success", "michael.meier@example.com", ), @@ -313,7 +313,7 @@ def command(): "michael.meier@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a24-allgemein", + "überbetriebliche-kurse-competence-crit-d2pvük4-allgemein", "fail", "michael.meier@example.com", ), @@ -338,7 +338,7 @@ def command(): "michael.meier@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a25-allgemein", + "überbetriebliche-kurse-competence-crit-d2pvük3-allgemein", "success", "michael.meier@example.com", ), @@ -368,7 +368,7 @@ def command(): "michael.meier@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a24-allgemein-1", + "überbetriebliche-kurse-competence-crit-d2pvük2-allgemein", "success", "michael.meier@example.com", ), @@ -393,7 +393,7 @@ def command(): "michael.meier@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a25-allgemein-1", + "überbetriebliche-kurse-competence-crit-d2pvük1-allgemein", "success", "michael.meier@example.com", ), @@ -413,7 +413,7 @@ def command(): "michael.meier@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a23-allgemein-1", + "überbetriebliche-kurse-competence-crit-c3pvük7-allgemein", "fail", "michael.meier@example.com", ), @@ -433,7 +433,7 @@ def command(): "michael.meier@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a23-allgemein-2", + "überbetriebliche-kurse-competence-crit-c3pvük11-allgemein", "fail", "michael.meier@example.com", ), @@ -498,7 +498,7 @@ def command(): "lina.egger@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a21-allgemein", + "überbetriebliche-kurse-competence-crit-e4pvük4-allgemein", "success", "lina.egger@example.com", ), @@ -523,7 +523,7 @@ def command(): "lina.egger@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a22-allgemein", + "überbetriebliche-kurse-competence-crit-e4pvük3-allgemein", "success", "lina.egger@example.com", ), @@ -543,7 +543,7 @@ def command(): "lina.egger@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a23-allgemein", + "überbetriebliche-kurse-competence-crit-e4pvük1-allgemein", "success", "lina.egger@example.com", ), @@ -563,7 +563,7 @@ def command(): "lina.egger@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a24-allgemein", + "überbetriebliche-kurse-competence-crit-d2pvük4-allgemein", "success", "lina.egger@example.com", ), @@ -583,7 +583,7 @@ def command(): "lina.egger@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a25-allgemein", + "überbetriebliche-kurse-competence-crit-d2pvük3-allgemein", "success", "lina.egger@example.com", ), @@ -613,7 +613,7 @@ def command(): "lina.egger@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a24-allgemein-1", + "überbetriebliche-kurse-competence-crit-d2pvük2-allgemein", "success", "lina.egger@example.com", ), @@ -638,7 +638,7 @@ def command(): "lina.egger@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a25-allgemein-1", + "überbetriebliche-kurse-competence-crit-d2pvük1-allgemein", "success", "lina.egger@example.com", ), @@ -658,12 +658,12 @@ def command(): "lina.egger@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a23-allgemein-1", + "überbetriebliche-kurse-competence-crit-c3pvük7-allgemein", "success", "lina.egger@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a23-allgemein-2", + "überbetriebliche-kurse-competence-crit-c3pvük11-allgemein", "success", "lina.egger@example.com", ), @@ -697,11 +697,6 @@ def command(): "success", "lina.egger@example.com", ), - ( - "überbetriebliche-kurse-competence-crit-a24-allgemein-2", - "success", - "lina.egger@example.com", - ), ( "überbetriebliche-kurse-lp-circle-fahrzeug-lc-mediathek-4", "success", @@ -773,7 +768,7 @@ def command(): "evelyn.schmid@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a21-allgemein", + "überbetriebliche-kurse-competence-crit-e4pvük4-allgemein", "success", "evelyn.schmid@example.com", ), @@ -798,7 +793,7 @@ def command(): "evelyn.schmid@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a22-allgemein", + "überbetriebliche-kurse-competence-crit-e4pvük3-allgemein", "fail", "evelyn.schmid@example.com", ), @@ -818,7 +813,7 @@ def command(): "evelyn.schmid@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a23-allgemein", + "überbetriebliche-kurse-competence-crit-e4pvük1-allgemein", "fail", "evelyn.schmid@example.com", ), @@ -838,7 +833,7 @@ def command(): "evelyn.schmid@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a24-allgemein", + "überbetriebliche-kurse-competence-crit-d2pvük4-allgemein", "success", "evelyn.schmid@example.com", ), @@ -858,7 +853,7 @@ def command(): "evelyn.schmid@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a25-allgemein", + "überbetriebliche-kurse-competence-crit-d2pvük3-allgemein", "success", "evelyn.schmid@example.com", ), @@ -873,7 +868,7 @@ def command(): "evelyn.schmid@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a24-allgemein-1", + "überbetriebliche-kurse-competence-crit-d2pvük2-allgemein", "success", "evelyn.schmid@example.com", ), @@ -898,7 +893,7 @@ def command(): "evelyn.schmid@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a25-allgemein-1", + "überbetriebliche-kurse-competence-crit-d2pvük1-allgemein", "fail", "evelyn.schmid@example.com", ), @@ -918,12 +913,12 @@ def command(): "evelyn.schmid@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a23-allgemein-1", + "überbetriebliche-kurse-competence-crit-c3pvük7-allgemein", "success", "evelyn.schmid@example.com", ), ( - "überbetriebliche-kurse-competence-crit-a23-allgemein-2", + "überbetriebliche-kurse-competence-crit-c3pvük11-allgemein", "fail", "evelyn.schmid@example.com", ), @@ -962,11 +957,6 @@ def command(): "success", "evelyn.schmid@example.com", ), - ( - "überbetriebliche-kurse-competence-crit-a24-allgemein-2", - "fail", - "evelyn.schmid@example.com", - ), ( "überbetriebliche-kurse-lp-circle-fahrzeug-lc-lerninhalt-offen-1", "success",