Refactor to i18next

This commit is contained in:
Daniel Egger 2023-07-05 13:04:16 +02:00
parent aaf226dde9
commit f4f508aac3
19 changed files with 129 additions and 407 deletions

274
client/package-lock.json generated
View File

@ -28,8 +28,6 @@
"mitt": "^3.0.0", "mitt": "^3.0.0",
"pinia": "^2.1.4", "pinia": "^2.1.4",
"vue": "^3.3.4", "vue": "^3.3.4",
"vue-i18n": "^9.2.2",
"vue-i18n-extract": "^2.0.7",
"vue-router": "^4.2.2" "vue-router": "^4.2.2"
}, },
"devDependencies": { "devDependencies": {
@ -4585,63 +4583,6 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true "dev": true
}, },
"node_modules/@intlify/core-base": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.2.tgz",
"integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==",
"dependencies": {
"@intlify/devtools-if": "9.2.2",
"@intlify/message-compiler": "9.2.2",
"@intlify/shared": "9.2.2",
"@intlify/vue-devtools": "9.2.2"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/@intlify/devtools-if": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.2.tgz",
"integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==",
"dependencies": {
"@intlify/shared": "9.2.2"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/@intlify/message-compiler": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.2.tgz",
"integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==",
"dependencies": {
"@intlify/shared": "9.2.2",
"source-map": "0.6.1"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/@intlify/shared": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz",
"integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==",
"engines": {
"node": ">= 14"
}
},
"node_modules/@intlify/vue-devtools": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz",
"integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==",
"dependencies": {
"@intlify/core-base": "9.2.2",
"@intlify/shared": "9.2.2"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/@istanbuljs/load-nyc-config": { "node_modules/@istanbuljs/load-nyc-config": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@ -8564,7 +8505,8 @@
"node_modules/argparse": { "node_modules/argparse": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
}, },
"node_modules/aria-query": { "node_modules/aria-query": {
"version": "5.1.3", "version": "5.1.3",
@ -9122,6 +9064,7 @@
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true,
"dependencies": { "dependencies": {
"balanced-match": "^1.0.0" "balanced-match": "^1.0.0"
} }
@ -9252,6 +9195,7 @@
"version": "6.7.14", "version": "6.7.14",
"resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
"integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
"dev": true,
"engines": { "engines": {
"node": ">=8" "node": ">=8"
} }
@ -11074,26 +11018,6 @@
"tslib": "^2.0.3" "tslib": "^2.0.3"
} }
}, },
"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": { "node_modules/dotenv": {
"version": "16.0.3", "version": "16.0.3",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
@ -13935,14 +13859,6 @@
"tslib": "^2.0.3" "tslib": "^2.0.3"
} }
}, },
"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": { "node_modules/is-weakmap": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
@ -14321,6 +14237,7 @@
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
"dependencies": { "dependencies": {
"argparse": "^2.0.1" "argparse": "^2.0.1"
}, },
@ -17857,6 +17774,7 @@
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true,
"engines": { "engines": {
"node": ">=0.10.0" "node": ">=0.10.0"
} }
@ -19672,67 +19590,6 @@
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true "dev": true
}, },
"node_modules/vue-i18n": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.2.tgz",
"integrity": "sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==",
"dependencies": {
"@intlify/core-base": "9.2.2",
"@intlify/shared": "9.2.2",
"@intlify/vue-devtools": "9.2.2",
"@vue/devtools-api": "^6.2.1"
},
"engines": {
"node": ">= 14"
},
"peerDependencies": {
"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-i18n-extract/node_modules/minimatch": {
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"dependencies": {
"brace-expansion": "^2.0.1"
},
"engines": {
"node": ">=10"
}
},
"node_modules/vue-inbrowser-compiler-independent-utils": { "node_modules/vue-inbrowser-compiler-independent-utils": {
"version": "4.64.1", "version": "4.64.1",
"resolved": "https://registry.npmjs.org/vue-inbrowser-compiler-independent-utils/-/vue-inbrowser-compiler-independent-utils-4.64.1.tgz", "resolved": "https://registry.npmjs.org/vue-inbrowser-compiler-independent-utils/-/vue-inbrowser-compiler-independent-utils-4.64.1.tgz",
@ -23432,48 +23289,6 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true "dev": true
}, },
"@intlify/core-base": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.2.2.tgz",
"integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==",
"requires": {
"@intlify/devtools-if": "9.2.2",
"@intlify/message-compiler": "9.2.2",
"@intlify/shared": "9.2.2",
"@intlify/vue-devtools": "9.2.2"
}
},
"@intlify/devtools-if": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/@intlify/devtools-if/-/devtools-if-9.2.2.tgz",
"integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==",
"requires": {
"@intlify/shared": "9.2.2"
}
},
"@intlify/message-compiler": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.2.2.tgz",
"integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==",
"requires": {
"@intlify/shared": "9.2.2",
"source-map": "0.6.1"
}
},
"@intlify/shared": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.2.2.tgz",
"integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q=="
},
"@intlify/vue-devtools": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz",
"integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==",
"requires": {
"@intlify/core-base": "9.2.2",
"@intlify/shared": "9.2.2"
}
},
"@istanbuljs/load-nyc-config": { "@istanbuljs/load-nyc-config": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@ -26542,7 +26357,8 @@
"argparse": { "argparse": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
}, },
"aria-query": { "aria-query": {
"version": "5.1.3", "version": "5.1.3",
@ -26976,6 +26792,7 @@
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true,
"requires": { "requires": {
"balanced-match": "^1.0.0" "balanced-match": "^1.0.0"
} }
@ -27063,7 +26880,8 @@
"cac": { "cac": {
"version": "6.7.14", "version": "6.7.14",
"resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
"integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==" "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
"dev": true
}, },
"cachedir": { "cachedir": {
"version": "2.3.0", "version": "2.3.0",
@ -28425,22 +28243,6 @@
"tslib": "^2.0.3" "tslib": "^2.0.3"
} }
}, },
"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": { "dotenv": {
"version": "16.0.3", "version": "16.0.3",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
@ -30586,11 +30388,6 @@
"tslib": "^2.0.3" "tslib": "^2.0.3"
} }
}, },
"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": { "is-weakmap": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
@ -30892,6 +30689,7 @@
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
"requires": { "requires": {
"argparse": "^2.0.1" "argparse": "^2.0.1"
} }
@ -33537,7 +33335,8 @@
"source-map": { "source-map": {
"version": "0.6.1", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
}, },
"source-map-js": { "source-map-js": {
"version": "1.0.2", "version": "1.0.2",
@ -34872,51 +34671,6 @@
} }
} }
}, },
"vue-i18n": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.2.2.tgz",
"integrity": "sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==",
"requires": {
"@intlify/core-base": "9.2.2",
"@intlify/shared": "9.2.2",
"@intlify/vue-devtools": "9.2.2",
"@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"
}
},
"minimatch": {
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
"requires": {
"brace-expansion": "^2.0.1"
}
}
}
},
"vue-inbrowser-compiler-independent-utils": { "vue-inbrowser-compiler-independent-utils": {
"version": "4.64.1", "version": "4.64.1",
"resolved": "https://registry.npmjs.org/vue-inbrowser-compiler-independent-utils/-/vue-inbrowser-compiler-independent-utils-4.64.1.tgz", "resolved": "https://registry.npmjs.org/vue-inbrowser-compiler-independent-utils/-/vue-inbrowser-compiler-independent-utils-4.64.1.tgz",

View File

@ -16,8 +16,7 @@
"storybook": "storybook dev -p 6006", "storybook": "storybook dev -p 6006",
"tailwind": "tailwindcss -i tailwind.css -o ../server/vbv_lernwelt/static/css/tailwind.css --watch", "tailwind": "tailwindcss -i tailwind.css -o ../server/vbv_lernwelt/static/css/tailwind.css --watch",
"test": "vitest run", "test": "vitest run",
"typecheck": "npm run codegen && vue-tsc --noEmit -p tsconfig.app.json --composite false", "typecheck": "npm run codegen && vue-tsc --noEmit -p tsconfig.app.json --composite false"
"vue-i18n-extract": "vue-i18n-extract report"
}, },
"dependencies": { "dependencies": {
"@headlessui/tailwindcss": "^0.1.3", "@headlessui/tailwindcss": "^0.1.3",
@ -40,8 +39,6 @@
"mitt": "^3.0.0", "mitt": "^3.0.0",
"pinia": "^2.1.4", "pinia": "^2.1.4",
"vue": "^3.3.4", "vue": "^3.3.4",
"vue-i18n": "^9.2.2",
"vue-i18n-extract": "^2.0.7",
"vue-router": "^4.2.2" "vue-router": "^4.2.2"
}, },
"devDependencies": { "devDependencies": {

View File

@ -1,9 +1,9 @@
<script setup lang="ts"> <script setup lang="ts">
import { SUPPORT_LOCALES } from "@/i18n";
import type { AvailableLanguages } from "@/stores/user"; import type { AvailableLanguages } from "@/stores/user";
import { useUserStore } from "@/stores/user"; import { useUserStore } from "@/stores/user";
import { Menu, MenuButton, MenuItem, MenuItems } from "@headlessui/vue"; import { Menu, MenuButton, MenuItem, MenuItems } from "@headlessui/vue";
import * as log from "loglevel"; import * as log from "loglevel";
import { SUPPORT_LOCALES } from "@/i18nextWrapper";
log.debug("AppFooter created"); log.debug("AppFooter created");

View File

@ -2,7 +2,7 @@
<div class="mb-4 bg-white px-6 py-5"> <div class="mb-4 bg-white px-6 py-5">
<h3 class="heading-3 mb-4 flex items-center gap-2"> <h3 class="heading-3 mb-4 flex items-center gap-2">
<it-icon-feedback-large class="h-16 w-16"></it-icon-feedback-large> <it-icon-feedback-large class="h-16 w-16"></it-icon-feedback-large>
<div>{{ $t("general.feedback", 2) }}</div> <div>{{ $t("general.feedback_other") }}</div>
</h3> </h3>
<ol v-if="feedbackSummary.length > 0"> <ol v-if="feedbackSummary.length > 0">
<ItRow v-for="feedbacks in feedbackSummary" :key="feedbacks.circle_id"> <ItRow v-for="feedbacks in feedbackSummary" :key="feedbacks.circle_id">
@ -12,7 +12,7 @@
<template #center> <template #center>
<div class="flex w-full justify-between"> <div class="flex w-full justify-between">
<div>Circle: {{ feedbacks.circle.title }}</div> <div>Circle: {{ feedbacks.circle.title }}</div>
<div>{{ $t("feedback.sentByUsers", feedbacks.count) }}</div> <div>{{ $t("feedback.sentByUsers", { count: feedbacks.count }) }}</div>
</div> </div>
</template> </template>
<template #link> <template #link>

View File

@ -4,7 +4,9 @@ import { PopoverButton } from "@headlessui/vue";
</script> </script>
<template> <template>
<div class="pb-2 text-lg text-black">{{ $t("general.notification", 2) }}</div> <div class="pb-2 text-lg text-black">
{{ $t("general.notification_other") }}
</div>
<div class="border-t bg-white"> <div class="border-t bg-white">
<NotificationList :num-notifications-to-show="4" /> <NotificationList :num-notifications-to-show="4" />
<router-link to="/notifications"> <router-link to="/notifications">

View File

@ -1,47 +0,0 @@
import type { AvailableLanguages } from "@/stores/user";
import dayjs from "dayjs";
import i18next from "i18next";
import { nextTick } from "vue";
import { createI18n } from "vue-i18n";
// https://vue-i18n.intlify.dev/guide/advanced/lazy.html
export const SUPPORT_LOCALES: AvailableLanguages[] = ["de", "fr", "it"];
let i18n: any = null;
export function setupI18n(
options = { locale: "de", legacy: false, fallbackLocale: "de" }
) {
i18n = createI18n(options);
setI18nLanguage(options.locale);
dayjs.locale(options.locale);
return i18n;
}
export function setI18nLanguage(locale: string) {
// if (i18n.mode === "legacy") {
// i18n.global.locale = locale;
// } else {
// i18n.global.locale.value = locale;
// }
/**
* NOTE:
* If you need to specify the language setting for headers, such as the `fetch` API, set it here.
* The following is an example for axios.
*
* axios.defaults.headers.common['Accept-Language'] = locale
*/
i18next.changeLanguage(locale);
document.querySelector("html")?.setAttribute("lang", locale);
}
export async function loadLocaleMessages(locale: any) {
// load locale messages with dynamic import
const messages = await import(
/* webpackChunkName: "locale-[request]" */ `./locales/${locale}.json`
);
// set locale and locale message
i18n.global.setLocaleMessage(locale, messages.default);
return nextTick();
}

View File

@ -1,7 +1,10 @@
import type { AvailableLanguages } from "@/stores/user";
import i18next from "i18next"; import i18next from "i18next";
import I18NextVue from "i18next-vue"; import I18NextVue from "i18next-vue";
import { nextTick } from "vue"; import { nextTick } from "vue";
export const SUPPORT_LOCALES: AvailableLanguages[] = ["de", "fr", "it"];
i18next i18next
// detect user language // detect user language
// learn more: https://github.com/i18next/i18next-browser-languageDetector // learn more: https://github.com/i18next/i18next-browser-languageDetector
@ -10,8 +13,8 @@ i18next
// for all options read: https://www.i18next.com/overview/configuration-options // for all options read: https://www.i18next.com/overview/configuration-options
.init({ .init({
debug: true, debug: true,
fallbackLng: "fr", fallbackLng: "de",
defaultNS: "translations", defaultNS: "messages",
resources: { resources: {
de: { de: {
translation: {}, translation: {},
@ -19,6 +22,19 @@ i18next
}, },
}); });
export function setI18nLanguage(locale: string) {
/**
* NOTE:
* If you need to specify the language setting for headers, such as the `fetch` API, set it here.
* The following is an example for axios.
*
* axios.defaults.headers.common['Accept-Language'] = locale
*/
i18next.changeLanguage(locale);
document.querySelector("html")?.setAttribute("lang", locale);
}
// @ts-ignore
export function i18nextWrapper(app) { export function i18nextWrapper(app) {
app.use(I18NextVue, { i18next }); app.use(I18NextVue, { i18next });
return app; return app;
@ -26,28 +42,9 @@ export function i18nextWrapper(app) {
export async function loadI18nextLocaleMessages(locale: any) { export async function loadI18nextLocaleMessages(locale: any) {
// load locale messages with dynamic import // load locale messages with dynamic import
const messages = await import( const messages = await import(`./locales/${locale}.json`);
/* webpackChunkName: "locale-[request]" */ `./locales/${locale}.json`
);
// set locale and locale message i18next.addResourceBundle(locale, "messages", messages, true, true);
console.log(messages);
console.log(messages["welcome"]);
console.log(
"#######################################################################3"
);
console.log(i18next);
window.i18next = i18next;
i18next.addResourceBundle(locale, "translations", messages, true, true);
// i18next.addResourceBundle(
// "de",
// "translations",
// {
// welcome: "Hallo, jetzt aber!",
// },
// true,
// true
// );
return nextTick(); return nextTick();
} }

View File

@ -16,9 +16,9 @@
"assignmentSubmitted": "Du hast deine Ergebnisse erfolgreich abgegeben.", "assignmentSubmitted": "Du hast deine Ergebnisse erfolgreich abgegeben.",
"confirmSubmitPerson": "Hiermit bestätige ich, dass die folgende Person meine Ergebnisse bewerten soll.", "confirmSubmitPerson": "Hiermit bestätige ich, dass die folgende Person meine Ergebnisse bewerten soll.",
"confirmSubmitResults": "Hiermit bestätige ich, dass ich die Zusammenfassung meiner Ergebnisse überprüft habe und so abgeben will.", "confirmSubmitResults": "Hiermit bestätige ich, dass ich die Zusammenfassung meiner Ergebnisse überprüft habe und so abgeben will.",
"dueDateIntroduction": "Reiche deine Ergebnisse pünktlich ein bis am {date} um {time} Uhr ein.", "dueDateIntroduction": "Reiche deine Ergebnisse pünktlich ein bis am {{date}} um {{time}} Uhr ein.",
"dueDateNotSet": "Keine Abgabedaten wurden erfasst für diese Durchführung", "dueDateNotSet": "Keine Abgabedaten wurden erfasst für diese Durchführung",
"dueDateSubmission": "Einreichungstermin: {date}", "dueDateSubmission": "Einreichungstermin: {{date}}",
"dueDateTitle": "Abgabetermin", "dueDateTitle": "Abgabetermin",
"edit": "Bearbeiten", "edit": "Bearbeiten",
"effortTitle": "Zeitaufwand", "effortTitle": "Zeitaufwand",
@ -26,7 +26,7 @@
"lastChangesNotSaved": "Die letzte Änderung konnte nicht gespeichert werden.", "lastChangesNotSaved": "Die letzte Änderung konnte nicht gespeichert werden.",
"performanceObjectivesTitle": "Leistungsziele", "performanceObjectivesTitle": "Leistungsziele",
"showAssessmentDocument": "Bewertungsinstrument anzeigen", "showAssessmentDocument": "Bewertungsinstrument anzeigen",
"submissionNotificationDisclaimer": "{name} wird deine Ergebnisse bewerten. Du wirst per Benachrichtigung informiert, sobald die Bewertung für dich freigegeben wurde.", "submissionNotificationDisclaimer": "{{name}} wird deine Ergebnisse bewerten. Du wirst per Benachrichtigung informiert, sobald die Bewertung für dich freigegeben wurde.",
"submitAssignment": "Ergebnisse abgeben", "submitAssignment": "Ergebnisse abgeben",
"taskDefinition": "Bearbeite die Teilaufgaben und dokumentiere deine Ergebnisse.", "taskDefinition": "Bearbeite die Teilaufgaben und dokumentiere deine Ergebnisse.",
"taskDefinitionTitle": "Aufgabenstellung" "taskDefinitionTitle": "Aufgabenstellung"
@ -34,14 +34,14 @@
"circlePage": { "circlePage": {
"circleContentBoxTitle": "Das lernst du in diesem Circle", "circleContentBoxTitle": "Das lernst du in diesem Circle",
"contactExpertButton": "Trainer/-in kontaktieren", "contactExpertButton": "Trainer/-in kontaktieren",
"contactExpertDescription": "Tausche dich mit der Trainer/-in für den Circle {circleName} aus.", "contactExpertDescription": "Tausche dich mit der Trainer/-in für den Circle {{circleName}} aus.",
"documents": { "documents": {
"action": "Unterlagen hochladen", "action": "Unterlagen hochladen",
"chooseLearningSequence": "Bitte wähle eine Lernsequenz aus", "chooseLearningSequence": "Bitte wähle eine Lernsequenz aus",
"chooseName": "Bitte wähle einen Namen", "chooseName": "Bitte wähle einen Namen",
"chooseSequence": "Wähle eine Lernsequenz aus", "chooseSequence": "Wähle eine Lernsequenz aus",
"deleteModalTitle": "Unterlage löschen", "deleteModalTitle": "Unterlage löschen",
"deleteModalWarning": "Willst du die Unterlage <strong>\"{title}\"</strong> löschen?<br> Diese Aktion ist nicht umkehrbar.", "deleteModalWarning": "Willst du die Unterlage <strong>\"{{title}}\"</strong> löschen?<br> Diese Aktion ist nicht umkehrbar.",
"expertDescription": "Stelle deinen Lernenden zusätzliche Inhalte zur Verfügung.", "expertDescription": "Stelle deinen Lernenden zusätzliche Inhalte zur Verfügung.",
"fileLabel": "Datei", "fileLabel": "Datei",
"maxFileSize": "Maximale Dateigrösse: 20 MB", "maxFileSize": "Maximale Dateigrösse: 20 MB",
@ -98,7 +98,7 @@
"average": "Durchschnitt", "average": "Durchschnitt",
"circleFeedback": "Feedback zum Circle", "circleFeedback": "Feedback zum Circle",
"completionDescription": "Dein Feedback ist anonym. Dein Vor- und Nachname werden bei deiner Trainer/-in nicht angezeigt.", "completionDescription": "Dein Feedback ist anonym. Dein Vor- und Nachname werden bei deiner Trainer/-in nicht angezeigt.",
"completionTitle": "Schicke dein Feedback an {name}", "completionTitle": "Schicke dein Feedback an {{name}}",
"courseNegativeFeedbackLabel": "Wo siehst du Verbesserungspotential?", "courseNegativeFeedbackLabel": "Wo siehst du Verbesserungspotential?",
"coursePositiveFeedbackLabel": "Was hat dir besonders gut gefallen?", "coursePositiveFeedbackLabel": "Was hat dir besonders gut gefallen?",
"feedbackPageInfo": "Teilnehmer haben das Feedback ausgefüllt", "feedbackPageInfo": "Teilnehmer haben das Feedback ausgefüllt",
@ -109,7 +109,7 @@
"instructorCompetenceLabel": "Wie beurteilst du die Themensicherheit und Fachkompetenz des Kursleiters/der Kursleiterin?", "instructorCompetenceLabel": "Wie beurteilst du die Themensicherheit und Fachkompetenz des Kursleiters/der Kursleiterin?",
"instructorOpenFeedbackLabel": "Was möchtest du dem Kursleiter/der Kursleiterin sonst noch sagen?", "instructorOpenFeedbackLabel": "Was möchtest du dem Kursleiter/der Kursleiterin sonst noch sagen?",
"instructorRespectLabel": "Wurden Fragen und Anregungen der Kursteilnehmenden ernst genommen und aufgegriffen?", "instructorRespectLabel": "Wurden Fragen und Anregungen der Kursteilnehmenden 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.", "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)?", "materialsRatingLabel": "Falls ja: Wie beurteilen Sie die Vorbereitungsunterlagen (z.B. eLearning)?",
"noFeedbacks": "Es wurden noch keine Feedbacks abgegeben", "noFeedbacks": "Es wurden noch keine Feedbacks abgegeben",
"preparationTaskClarityLabel": "Waren die Vorbereitungsaufträge klar und verständlich?", "preparationTaskClarityLabel": "Waren die Vorbereitungsaufträge klar und verständlich?",
@ -118,7 +118,7 @@
"recommendLabel": "Würdest du den Kurs weiterempfehlen?", "recommendLabel": "Würdest du den Kurs weiterempfehlen?",
"satisfactionLabel": "Zufriedenheit insgesamt", "satisfactionLabel": "Zufriedenheit insgesamt",
"sendFeedback": "Feedback abschicken", "sendFeedback": "Feedback abschicken",
"sentByUsers": "Von {count} Teilnehmern ausgefüllt", "sentByUsers": "Von {{count}} Teilnehmern ausgefüllt",
"showDetails": "Details anzeigen", "showDetails": "Details anzeigen",
"unhappy": "Unzufrieden", "unhappy": "Unzufrieden",
"veryHappy": "Sehr zufrieden", "veryHappy": "Sehr zufrieden",
@ -139,12 +139,16 @@
"backCapitalized": "@.capitalize:general.back", "backCapitalized": "@.capitalize:general.back",
"backToCircle": "zurück zum Circle", "backToCircle": "zurück zum Circle",
"backToLearningPath": "zurück zum Lernpfad", "backToLearningPath": "zurück zum Lernpfad",
"certificate": "Zertifikat | Zertifikate", "certificate_one": "Zertifikat",
"certificate_other": "Zertifikate",
"circles": "Circles", "circles": "Circles",
"close": "Schliessen", "close": "Schliessen",
"exam": "Prüfung | Prüfungen", "exam_one": "Prüfung",
"examResult": "Prüfungsresultat | Prüfungsresultate", "exam_other": "Prüfungen",
"feedback": "Feedback | Feedbacks", "examResult_one": "Prüfungsresultat",
"examResult_other": "Prüfungsresultate",
"feedback_one": "Feedback",
"feedback_other": "Feedbacks",
"introduction": "Einleitung", "introduction": "Einleitung",
"learningPath": "Lernpfad", "learningPath": "Lernpfad",
"learningSequence": "Lernsequenz", "learningSequence": "Lernsequenz",
@ -152,7 +156,8 @@
"next": "Weiter", "next": "Weiter",
"nextStep": "Weiter geht's", "nextStep": "Weiter geht's",
"no": "Nein", "no": "Nein",
"notification": "Benachrichtigung | Benachrichtigungen", "notification_one": "Benachrichtigung",
"notification_other": "Benachrichtigungen",
"profileLink": "Details anzeigen", "profileLink": "Details anzeigen",
"save": "Speichern", "save": "Speichern",
"send": "Senden", "send": "Senden",
@ -163,7 +168,8 @@
"start": "Los geht's", "start": "Los geht's",
"submission": "Abgabe", "submission": "Abgabe",
"title": "myVBV", "title": "myVBV",
"transferTask": "Transferauftrag | Transferaufträge", "transferTask_one": "Transferauftrag",
"transferTask_other": "Transferaufträge",
"yes": "Ja" "yes": "Ja"
}, },
"language": { "language": {
@ -179,7 +185,7 @@
"listView": "Listenansicht", "listView": "Listenansicht",
"nextStep": "Nächster Schritt", "nextStep": "Nächster Schritt",
"pathView": "Pfadansicht", "pathView": "Pfadansicht",
"progressText": "Du hast { inProgressCount } von { allCount } Circles bearbeitet", "progressText": "Du hast {{ inProgressCount }} von {{ allCount }} Circles bearbeitet",
"showListView": "Listenansicht anzeigen", "showListView": "Listenansicht anzeigen",
"topics": "Themen:", "topics": "Themen:",
"welcomeBack": "Willkommen zurück in deinem Lehrgang:" "welcomeBack": "Willkommen zurück in deinem Lehrgang:"
@ -191,7 +197,8 @@
"mediaLibrary": { "mediaLibrary": {
"handlungsfelder": { "handlungsfelder": {
"description": "Finde alle Ressourcen der Handlungsfelder wie Lernmedien, Links und andere nützliche Informationen.", "description": "Finde alle Ressourcen der Handlungsfelder wie Lernmedien, Links und andere nützliche Informationen.",
"title": "Handlungsfeld | Handlungsfelder" "title_one": "Handlungsfeld",
"title_other": "Handlungsfelder"
}, },
"learningMedia": { "learningMedia": {
"description": "Finde eine vollständige Liste der Bücher und anderen Medien, auf die im Kurs verwiesen wird.", "description": "Finde eine vollständige Liste der Bücher und anderen Medien, auf die im Kurs verwiesen wird.",
@ -218,8 +225,8 @@
"selfEvaluation": "Selbsteinschätzung", "selfEvaluation": "Selbsteinschätzung",
"selfEvaluationNo": "@:selfEvaluation: Muss ich nochmals anschauen.", "selfEvaluationNo": "@:selfEvaluation: Muss ich nochmals anschauen.",
"selfEvaluationYes": "@:selfEvaluation: Ich kann das.", "selfEvaluationYes": "@:selfEvaluation: Ich kann das.",
"steps": "Schritt {current} von {max}", "steps": "Schritt {{current}} von {{max}}",
"title": "@:selfEvaluation.selfEvaluation {title}", "title": "@:selfEvaluation.selfEvaluation {{title}}",
"yes": "Ja, ich kann das" "yes": "Ja, ich kann das"
}, },
"settings": { "settings": {

View File

@ -15,9 +15,9 @@
"assignmentSubmitted": "Tes résultats ont bien été transmis.", "assignmentSubmitted": "Tes résultats ont bien été transmis.",
"confirmSubmitPerson": "Par la présente, je confirme que la personne suivante doit évaluer mes résultats.", "confirmSubmitPerson": "Par la présente, je confirme que la personne suivante doit évaluer mes résultats.",
"confirmSubmitResults": "Par la présente, je confirme que jai vérifié la synthèse de mes résultats et que je souhaite la remettre telle quelle.", "confirmSubmitResults": "Par la présente, je confirme que jai vérifié la synthèse de mes résultats et que je souhaite la remettre telle quelle.",
"dueDateIntroduction": "Envoie tes résultats dans les délais avant le {date} à {time} heures.", "dueDateIntroduction": "Envoie tes résultats dans les délais avant le {{date}} à {{time}} heures.",
"dueDateNotSet": "Aucune date de remise na été spécifiée pour cette opération.", "dueDateNotSet": "Aucune date de remise na été spécifiée pour cette opération.",
"dueDateSubmission": "Date de clôture : {date}", "dueDateSubmission": "Date de clôture : {{date}}",
"dueDateTitle": "Date de remise", "dueDateTitle": "Date de remise",
"edit": "Traiter", "edit": "Traiter",
"effortTitle": "Temps nécessaire", "effortTitle": "Temps nécessaire",
@ -25,7 +25,7 @@
"lastChangesNotSaved": "La dernière modification na pas pu être enregistrée.", "lastChangesNotSaved": "La dernière modification na pas pu être enregistrée.",
"performanceObjectivesTitle": "Objectifs", "performanceObjectivesTitle": "Objectifs",
"showAssessmentDocument": "Afficher loutil dévaluation", "showAssessmentDocument": "Afficher loutil dévaluation",
"submissionNotificationDisclaimer": "{name} va procéder à lévaluation de tes résultats. Tu recevras une notification dès que lévaluation aura été validée et que tu pourras la consulter.", "submissionNotificationDisclaimer": "{{name}} va procéder à lévaluation de tes résultats. Tu recevras une notification dès que lévaluation aura été validée et que tu pourras la consulter.",
"submitAssignment": "Remettre les résultats", "submitAssignment": "Remettre les résultats",
"taskDefinition": "Résous les exercices et documente tes résultats.", "taskDefinition": "Résous les exercices et documente tes résultats.",
"taskDefinitionTitle": "Énoncé du problème" "taskDefinitionTitle": "Énoncé du problème"
@ -33,14 +33,14 @@
"circlePage": { "circlePage": {
"circleContentBoxTitle": "Ce que tu vas apprendre dans ce cercle", "circleContentBoxTitle": "Ce que tu vas apprendre dans ce cercle",
"contactExpertButton": "Contacter le formateur / la formatrice", "contactExpertButton": "Contacter le formateur / la formatrice",
"contactExpertDescription": "Échanger avec le formateur / la formatrice si tu as des questions sur le cercle {circleName}.", "contactExpertDescription": "Échanger avec le formateur / la formatrice si tu as des questions sur le cercle {{circleName}}.",
"documents": { "documents": {
"action": "Télécharger les documents", "action": "Télécharger les documents",
"chooseLearningSequence": "Sélectionne une séquence", "chooseLearningSequence": "Sélectionne une séquence",
"chooseName": "Sélectionne un nom", "chooseName": "Sélectionne un nom",
"chooseSequence": "Sélectionne une séquence", "chooseSequence": "Sélectionne une séquence",
"deleteModalTitle": "Supprimer les documents", "deleteModalTitle": "Supprimer les documents",
"deleteModalWarning": "Veux-tu <strong>\"{title}\"</strong> supprimer les documents ?<br> Cette action est irréversible.", "deleteModalWarning": "Veux-tu <strong>\"{{title}}\"</strong> supprimer les documents ?<br> Cette action est irréversible.",
"expertDescription": "Mets des contenus supplémentaires à la disposition de tes apprenants.", "expertDescription": "Mets des contenus supplémentaires à la disposition de tes apprenants.",
"fileLabel": "Fichier", "fileLabel": "Fichier",
"maxFileSize": "Taille maximale du fichier : 20 Mo", "maxFileSize": "Taille maximale du fichier : 20 Mo",
@ -97,7 +97,7 @@
"average": "Moyen", "average": "Moyen",
"circleFeedback": "Feed-back sur le cercle", "circleFeedback": "Feed-back sur le cercle",
"completionDescription": "Tes commentaires seront anonymes. Ton nom et ton prénom ne seront pas indiqués au formateur / à la formatrice.", "completionDescription": "Tes commentaires seront anonymes. Ton nom et ton prénom ne seront pas indiqués au formateur / à la formatrice.",
"completionTitle": "Envoie ton feed-back à {name}", "completionTitle": "Envoie ton feed-back à {{name}}",
"courseNegativeFeedbackLabel": "À ton avis, quels sont les points qui pourraient être améliorés ?", "courseNegativeFeedbackLabel": "À ton avis, quels sont les points qui pourraient être améliorés ?",
"coursePositiveFeedbackLabel": "Quest-ce qui ta particulièrement plu ?", "coursePositiveFeedbackLabel": "Quest-ce qui ta particulièrement plu ?",
"feedbackPageInfo": "Les participants ont rempli le feed-back", "feedbackPageInfo": "Les participants ont rempli le feed-back",
@ -108,7 +108,7 @@
"instructorCompetenceLabel": "Que penses-tu des compétences techniques de la personne chargée du cours et de sa maîtrise du sujet ?", "instructorCompetenceLabel": "Que penses-tu des compétences techniques de la personne chargée du cours et de sa maîtrise du sujet ?",
"instructorOpenFeedbackLabel": "Souhaites-tu ajouter quelque chose à lintention de la personne chargée du cours ?", "instructorOpenFeedbackLabel": "Souhaites-tu ajouter quelque chose à lintention de la personne chargée du cours ?",
"instructorRespectLabel": "Les questions et les suggestions des participants ont-elles été prises au sérieux et traitées correctement ?", "instructorRespectLabel": "Les questions et les suggestions des participants ont-elles été prises au sérieux et traitées correctement ?",
"intro": "{name}, ton formateur / ta formatrice, tinvite à lui adresser un feed-back. Cela nest pas obligatoire, mais lui permettrait daméliorer son cours.", "intro": "{{name}}, ton formateur / ta formatrice, tinvite à lui adresser un feed-back. Cela nest pas obligatoire, mais lui permettrait daméliorer son cours.",
"materialsRatingLabel": "Si oui : Que pensez-vous des documents fournis pour le travail préparatoire (par ex. eLearning) ?", "materialsRatingLabel": "Si oui : Que pensez-vous des documents fournis pour le travail préparatoire (par ex. eLearning) ?",
"noFeedbacks": "Aucun feed-back na encore été remis", "noFeedbacks": "Aucun feed-back na encore été remis",
"preparationTaskClarityLabel": "Les travaux préparatoires étaient-ils clairs et compréhensibles ?", "preparationTaskClarityLabel": "Les travaux préparatoires étaient-ils clairs et compréhensibles ?",
@ -117,7 +117,7 @@
"recommendLabel": "Est-ce que tu recommandes ce cours ?", "recommendLabel": "Est-ce que tu recommandes ce cours ?",
"satisfactionLabel": "Degré de satisfaction au global", "satisfactionLabel": "Degré de satisfaction au global",
"sendFeedback": "Envoyer le feed-back", "sendFeedback": "Envoyer le feed-back",
"sentByUsers": "Rempli par {count} participants", "sentByUsers": "Rempli par {{count}} participants",
"showDetails": "Afficher les détails", "showDetails": "Afficher les détails",
"unhappy": "Insatisfait(e)", "unhappy": "Insatisfait(e)",
"veryHappy": "Très satisfait(e)", "veryHappy": "Très satisfait(e)",
@ -138,12 +138,16 @@
"backCapitalized": "@.capitalize:general.back", "backCapitalized": "@.capitalize:general.back",
"backToCircle": "Revenir au cercle", "backToCircle": "Revenir au cercle",
"backToLearningPath": "Revenir au programme de formation", "backToLearningPath": "Revenir au programme de formation",
"certificate": "Certificat | Certificats", "certificate_one": "Certificat",
"certificate_other": "Certificats",
"circles": "Cercles", "circles": "Cercles",
"close": "Fermer", "close": "Fermer",
"exam": "Examen | Examens", "exam_one": "Examen",
"examResult": "Résultat de lexamen | Résultats de lexamen", "exam_other": "Examens",
"feedback": "Feed-back | Feed-backs", "examResult_one": "Résultat de lexamen",
"examResult_other": "Résultats de lexamen",
"feedback_one": "Feed-back",
"feedback_other": "Feed-backs",
"introduction": "Introduction", "introduction": "Introduction",
"learningPath": "Programme de formation", "learningPath": "Programme de formation",
"learningSequence": "Séquence", "learningSequence": "Séquence",
@ -151,7 +155,8 @@
"next": "Continuer", "next": "Continuer",
"nextStep": "Cela continue", "nextStep": "Cela continue",
"no": "Non", "no": "Non",
"notification": "Notification | Notifications", "notification_one": "Notification",
"notification_other": "Notifications",
"profileLink": "Détails", "profileLink": "Détails",
"save": "Enregistrer", "save": "Enregistrer",
"send": "Envoyer", "send": "Envoyer",
@ -162,7 +167,8 @@
"start": "Cest parti !", "start": "Cest parti !",
"submission": "Remise", "submission": "Remise",
"title": "myAFA", "title": "myAFA",
"transferTask": "Exercice dapplication | Exercices dapplication", "transferTask_one": "Exercice dapplication",
"transferTask_other": "Exercices dapplication",
"yes": "Oui" "yes": "Oui"
}, },
"language": { "language": {
@ -178,7 +184,7 @@
"listView": "Affichage sous forme de liste", "listView": "Affichage sous forme de liste",
"nextStep": "Étape suivante", "nextStep": "Étape suivante",
"pathView": "Affichage sous forme de parcours", "pathView": "Affichage sous forme de parcours",
"progressText": "Tu as traité { inProgressCount } de { allCount } cercles", "progressText": "Tu as traité {{ inProgressCount }} de {{ allCount }} cercles",
"showListView": "Afficher la liste", "showListView": "Afficher la liste",
"topics": "Thèmes :", "topics": "Thèmes :",
"welcomeBack": "Cela fait plaisir de te revoir dans ta formation :" "welcomeBack": "Cela fait plaisir de te revoir dans ta formation :"
@ -190,7 +196,8 @@
"mediaLibrary": { "mediaLibrary": {
"handlungsfelder": { "handlungsfelder": {
"description": "Trouve toutes les ressources des champs daction, comme les outils didactiques, les liens et autres informations utiles.", "description": "Trouve toutes les ressources des champs daction, comme les outils didactiques, les liens et autres informations utiles.",
"title": "Champ daction | Champs daction" "title_one": "Champ daction",
"title_other": "Champs daction"
}, },
"learningMedia": { "learningMedia": {
"description": "Trouve une liste complète des livres, manuels et autres outils qui ont été mentionnés pendant le cours.", "description": "Trouve une liste complète des livres, manuels et autres outils qui ont été mentionnés pendant le cours.",
@ -217,8 +224,8 @@
"selfEvaluation": "Auto-évaluation", "selfEvaluation": "Auto-évaluation",
"selfEvaluationNo": "@:selfEvaluation: Il faut que je regarde cela encore une fois de plus près.", "selfEvaluationNo": "@:selfEvaluation: Il faut que je regarde cela encore une fois de plus près.",
"selfEvaluationYes": "@:selfEvaluation: Je maîtrise cette question.", "selfEvaluationYes": "@:selfEvaluation: Je maîtrise cette question.",
"steps": "Étape {current} sur {max}", "steps": "Étape {{current}} sur {{max}}",
"title": "@:selfEvaluation.selfEvaluation {title}", "title": "@:selfEvaluation.selfEvaluation {{title}}",
"yes": "Oui, je maîtrise cette question" "yes": "Oui, je maîtrise cette question"
}, },
"settings": { "settings": {

View File

@ -15,9 +15,9 @@
"assignmentSubmitted": "I tuoi risultati sono stati consegnati con successo.", "assignmentSubmitted": "I tuoi risultati sono stati consegnati con successo.",
"confirmSubmitPerson": "Confermo che i miei risultati dovranno essere valutati dalla seguente persona.", "confirmSubmitPerson": "Confermo che i miei risultati dovranno essere valutati dalla seguente persona.",
"confirmSubmitResults": "Confermo di aver controllato il riepilogo dei miei risultati e di volerli consegnare.", "confirmSubmitResults": "Confermo di aver controllato il riepilogo dei miei risultati e di volerli consegnare.",
"dueDateIntroduction": "Presenta i tuoi risultati entro il {date} alle {time}.", "dueDateIntroduction": "Presenta i tuoi risultati entro il {{date}} alle {{time}}.",
"dueDateNotSet": "Non sono stati registrati dati di consegna per questo svolgimento", "dueDateNotSet": "Non sono stati registrati dati di consegna per questo svolgimento",
"dueDateSubmission": "Termine di presentazione: {date}", "dueDateSubmission": "Termine di presentazione: {{date}}",
"dueDateTitle": "Termine di consegna", "dueDateTitle": "Termine di consegna",
"edit": "Modificare", "edit": "Modificare",
"effortTitle": "Tempo richiesto", "effortTitle": "Tempo richiesto",
@ -25,7 +25,7 @@
"lastChangesNotSaved": "Non è stato possibile salvare lultima modifica.", "lastChangesNotSaved": "Non è stato possibile salvare lultima modifica.",
"performanceObjectivesTitle": "Obiettivi di valutazione", "performanceObjectivesTitle": "Obiettivi di valutazione",
"showAssessmentDocument": "Mostrare lo strumento di valutazione", "showAssessmentDocument": "Mostrare lo strumento di valutazione",
"submissionNotificationDisclaimer": "I tuoi risultati saranno valutati da {name}. Riceverai una notifica non appena la tua valutazione sarà disponibile.", "submissionNotificationDisclaimer": "I tuoi risultati saranno valutati da {{name}}. Riceverai una notifica non appena la tua valutazione sarà disponibile.",
"submitAssignment": "Consegnare i risultati", "submitAssignment": "Consegnare i risultati",
"taskDefinition": "Svolgi le attività parziali e documenta i tuoi risultati.", "taskDefinition": "Svolgi le attività parziali e documenta i tuoi risultati.",
"taskDefinitionTitle": "Compito" "taskDefinitionTitle": "Compito"
@ -33,14 +33,14 @@
"circlePage": { "circlePage": {
"circleContentBoxTitle": "Cosa apprenderai in questo Circle", "circleContentBoxTitle": "Cosa apprenderai in questo Circle",
"contactExpertButton": "Contattare il/la trainer", "contactExpertButton": "Contattare il/la trainer",
"contactExpertDescription": "Confrontati con il/la trainer per il Circle {circleName}.", "contactExpertDescription": "Confrontati con il/la trainer per il Circle {{circleName}}.",
"documents": { "documents": {
"action": "Caricare i documenti", "action": "Caricare i documenti",
"chooseLearningSequence": "Seleziona una sequenza di apprendimento", "chooseLearningSequence": "Seleziona una sequenza di apprendimento",
"chooseName": "Seleziona un nome", "chooseName": "Seleziona un nome",
"chooseSequence": "Seleziona una sequenza di apprendimento", "chooseSequence": "Seleziona una sequenza di apprendimento",
"deleteModalTitle": "Eliminare il documento", "deleteModalTitle": "Eliminare il documento",
"deleteModalWarning": "Desideri davvero eliminare il documento <strong>\"{title}\"</strong>?<br> Una volta eseguita, loperazione non potrà più essere annullata.", "deleteModalWarning": "Desideri davvero eliminare il documento <strong>\"{{title}}\"</strong>?<br> Una volta eseguita, loperazione non potrà più essere annullata.",
"expertDescription": "Fornisci ai tuoi allievi e alle tue allieve contenuti aggiuntivi.", "expertDescription": "Fornisci ai tuoi allievi e alle tue allieve contenuti aggiuntivi.",
"fileLabel": "File", "fileLabel": "File",
"maxFileSize": "Dimensioni massime del file: 20 MB", "maxFileSize": "Dimensioni massime del file: 20 MB",
@ -97,7 +97,7 @@
"average": "Media", "average": "Media",
"circleFeedback": "Feedback sul Circle", "circleFeedback": "Feedback sul Circle",
"completionDescription": "Il tuo feedback è anonimo. Il/La trainer non visualizzerà il tuo nome e cognome.", "completionDescription": "Il tuo feedback è anonimo. Il/La trainer non visualizzerà il tuo nome e cognome.",
"completionTitle": "Invia il tuo feedback a {name}", "completionTitle": "Invia il tuo feedback a {{name}}",
"courseNegativeFeedbackLabel": "Dove vedi un potenziale di miglioramento?", "courseNegativeFeedbackLabel": "Dove vedi un potenziale di miglioramento?",
"coursePositiveFeedbackLabel": "Coshai apprezzato particolarmente?", "coursePositiveFeedbackLabel": "Coshai apprezzato particolarmente?",
"feedbackPageInfo": "I/Le partecipanti hanno fornito il feedback", "feedbackPageInfo": "I/Le partecipanti hanno fornito il feedback",
@ -108,7 +108,7 @@
"instructorCompetenceLabel": "Come valuti il livello di preparazione sui temi e le competenze specialistiche dellistruttore/istruttrice del corso?", "instructorCompetenceLabel": "Come valuti il livello di preparazione sui temi e le competenze specialistiche dellistruttore/istruttrice del corso?",
"instructorOpenFeedbackLabel": "Cosaltro vorresti ancora dire allistruttore/istruttrice del corso?", "instructorOpenFeedbackLabel": "Cosaltro vorresti ancora dire allistruttore/istruttrice del corso?",
"instructorRespectLabel": "Le domande e i suggerimenti dei/delle partecipanti al corso sono stati accolti e presi sul serio?", "instructorRespectLabel": "Le domande e i suggerimenti dei/delle partecipanti al corso sono stati accolti e presi sul serio?",
"intro": "{name}, il tuo/la tua trainer ti invita a fornire un feedback su di lui/lei. È facoltativo, ma sarebbe utile per migliorare la tua esperienza di apprendimento.", "intro": "{{name}}, il tuo/la tua trainer ti invita a fornire un feedback su di lui/lei. È facoltativo, ma sarebbe utile per migliorare la tua esperienza di apprendimento.",
"materialsRatingLabel": "Se sì: qual è la valutazione dei documenti di preparazione (ad es. eLearning)?", "materialsRatingLabel": "Se sì: qual è la valutazione dei documenti di preparazione (ad es. eLearning)?",
"noFeedbacks": "Non è stato fornito ancora nessun feedback", "noFeedbacks": "Non è stato fornito ancora nessun feedback",
"preparationTaskClarityLabel": "Gli incarichi di preparazione erano chiari e comprensibili?", "preparationTaskClarityLabel": "Gli incarichi di preparazione erano chiari e comprensibili?",
@ -117,7 +117,7 @@
"recommendLabel": "Raccomanderesti il corso?", "recommendLabel": "Raccomanderesti il corso?",
"satisfactionLabel": "Soddisfazione complessiva", "satisfactionLabel": "Soddisfazione complessiva",
"sendFeedback": "Inviare il feedback", "sendFeedback": "Inviare il feedback",
"sentByUsers": "Fornito da {count} partecipanti", "sentByUsers": "Fornito da {{count}} partecipanti",
"showDetails": "Mostrare i dettagli", "showDetails": "Mostrare i dettagli",
"unhappy": "Insoddisfatto/a", "unhappy": "Insoddisfatto/a",
"veryHappy": "Molto soddisfatto/a", "veryHappy": "Molto soddisfatto/a",
@ -138,12 +138,16 @@
"backCapitalized": "@.capitalize:general.back", "backCapitalized": "@.capitalize:general.back",
"backToCircle": "Torna al Circle", "backToCircle": "Torna al Circle",
"backToLearningPath": "Torna al percorso formativo", "backToLearningPath": "Torna al percorso formativo",
"certificate": "Certificato | Certificati", "certificate_one": "Certificato",
"certificate_other": "Certificati",
"circles": "Circle", "circles": "Circle",
"close": "Chiudere", "close": "Chiudere",
"exam": "Esame| Esami", "exam_one": "Esame",
"examResult": "Risultato dellesame | Risultati degli esami", "exam_other": "Esami",
"feedback": "Feedback | Feedback", "examResult_one": "Risultato dellesame",
"examResult_other": "Risultati degli esami",
"feedback_one": "Feedback",
"feedback_other": "Feedback",
"introduction": "Introduzione", "introduction": "Introduzione",
"learningPath": "Percorso formativo", "learningPath": "Percorso formativo",
"learningSequence": "Sequenza di apprendimento", "learningSequence": "Sequenza di apprendimento",
@ -151,7 +155,8 @@
"next": "Avanti", "next": "Avanti",
"nextStep": "Continua", "nextStep": "Continua",
"no": "No", "no": "No",
"notification": "Notifica | Notifiche", "notification_one": "Notifica",
"notification_other": "Notifiche",
"profileLink": "Mostrare i dettagli", "profileLink": "Mostrare i dettagli",
"save": "Salvare", "save": "Salvare",
"send": "Inviare", "send": "Inviare",
@ -162,7 +167,8 @@
"start": "Si comincia", "start": "Si comincia",
"submission": "Consegna", "submission": "Consegna",
"title": "myAFA", "title": "myAFA",
"transferTask": "Incarico di trasferimento | Incarichi di trasferimento", "transferTask_one": "Incarico di trasferimento",
"transferTask_other": "Incarichi di trasferimento",
"yes": "Sì" "yes": "Sì"
}, },
"language": { "language": {
@ -178,7 +184,7 @@
"listView": "Vista elenco", "listView": "Vista elenco",
"nextStep": "Prossimo passo", "nextStep": "Prossimo passo",
"pathView": "Vista percorso", "pathView": "Vista percorso",
"progressText": "Hai svolto { inProgressCount } Circle su { allCount }", "progressText": "Hai svolto {{ inProgressCount }} Circle su {{ allCount }}",
"showListView": "Mostrare la vista elenco", "showListView": "Mostrare la vista elenco",
"topics": "Temi:", "topics": "Temi:",
"welcomeBack": "Bentornato/a al tuo corso:" "welcomeBack": "Bentornato/a al tuo corso:"
@ -190,7 +196,8 @@
"mediaLibrary": { "mediaLibrary": {
"handlungsfelder": { "handlungsfelder": {
"description": "Trova tutte le risorse dei campi dazione, come materiali didattici, link e altre informazioni utili.", "description": "Trova tutte le risorse dei campi dazione, come materiali didattici, link e altre informazioni utili.",
"title": "Campo dazione | Campi dazione" "title_one": "Campo dazione",
"title_other": "Campi dazione"
}, },
"learningMedia": { "learningMedia": {
"description": "Trova un elenco completo di libri e altri materiali a cui si rimanda nel corso.", "description": "Trova un elenco completo di libri e altri materiali a cui si rimanda nel corso.",
@ -217,8 +224,8 @@
"selfEvaluation": "Auto-valutazione", "selfEvaluation": "Auto-valutazione",
"selfEvaluationNo": "@:selfEvaluation: Devo riguardarlo ancora una volta.", "selfEvaluationNo": "@:selfEvaluation: Devo riguardarlo ancora una volta.",
"selfEvaluationYes": "@:selfEvaluation: Ho compreso tutto.", "selfEvaluationYes": "@:selfEvaluation: Ho compreso tutto.",
"steps": "Passo {current} di {max}", "steps": "Passo {{current}} di {{max}}",
"title": "@:selfEvaluation.selfEvaluation {title}", "title": "@:selfEvaluation.selfEvaluation {{title}}",
"yes": "Sì, ho compreso tutto" "yes": "Sì, ho compreso tutto"
}, },
"settings": { "settings": {

View File

@ -4,10 +4,8 @@ import type { LoginMethod } from "@/types";
import * as log from "loglevel"; import * as log from "loglevel";
import { reactive } from "vue"; import { reactive } from "vue";
import { useRoute } from "vue-router"; import { useRoute } from "vue-router";
import { useTranslation } from "i18next-vue";
const route = useRoute(); const route = useRoute();
const { t } = useTranslation();
defineProps<{ defineProps<{
loginMethod: LoginMethod; loginMethod: LoginMethod;
@ -28,7 +26,7 @@ const userStore = useUserStore();
<main class="bg-gray-200 lg:px-12 lg:py-12"> <main class="bg-gray-200 lg:px-12 lg:py-12">
<div class="container-medium"> <div class="container-medium">
<h1 class="mb-8">Login</h1> <h1 class="mb-8">Login</h1>
<h2>{{ t("welcome") }}</h2> <h2>{{ $t("welcome") }}</h2>
<form <form
v-if="loginMethod === 'local'" v-if="loginMethod === 'local'"

View File

@ -16,7 +16,7 @@ async function loadAdditionalNotifications() {
<div class="bg-gray-200"> <div class="bg-gray-200">
<div class="container-large px-8 py-8"> <div class="container-large px-8 py-8">
<header class="mb-6"> <header class="mb-6">
<h1>{{ $t("general.notification", 2) }}</h1> <h1>{{ $t("general.notification_other") }}</h1>
</header> </header>
<main> <main>
<div class="bg-white px-4 py-4"> <div class="bg-white px-4 py-4">

View File

@ -74,13 +74,13 @@ function setActiveClasses(isActive: boolean) {
<button>{{ $t("competences.competences") }}</button> <button>{{ $t("competences.competences") }}</button>
</li> </li>
<li class="mr-12"> <li class="mr-12">
<button>{{ $t("general.transferTask", 2) }}</button> <button>{{ $t("general.transferTask_other") }}</button>
</li> </li>
<li class="mr-12"> <li class="mr-12">
<button>{{ $t("general.exam", 2) }}</button> <button>{{ $t("general.exam_other") }}</button>
</li> </li>
<li class="mr-12"> <li class="mr-12">
<button>{{ $t("general.certificate", 2) }}</button> <button>{{ $t("general.certificate_other") }}</button>
</li> </li>
</ul> </ul>
<div> <div>

View File

@ -64,7 +64,7 @@ function updateActiveState(status: CourseCompletionStatus) {
:to="`${competenceStore.competenceProfilePage()?.frontend_url}`" :to="`${competenceStore.competenceProfilePage()?.frontend_url}`"
> >
<it-icon-arrow-left /> <it-icon-arrow-left />
<span>zurück</span> <span>{{ $t("general.back") }}</span>
</router-link> </router-link>
</nav> </nav>
<div class="mb-4 flex flex-col items-center justify-between lg:mb-10 lg:flex-row"> <div class="mb-4 flex flex-col items-center justify-between lg:mb-10 lg:flex-row">

View File

@ -77,7 +77,7 @@ function hasMoreItemsForType<T>(itemType: MediaBlockType, items: T[]) {
<div class="flex justify-between md:flex-col lg:flex-row"> <div class="flex justify-between md:flex-col lg:flex-row">
<div class="lg:w-6/12"> <div class="lg:w-6/12">
<h3 class="text-large mb-3 font-normal text-gray-900"> <h3 class="text-large mb-3 font-normal text-gray-900">
{{ $t("mediaLibrary.handlungsfelder.title", 1) }} {{ $t("mediaLibrary.handlungsfelder.title_one") }}
</h3> </h3>
<h1 class="mb-4 lg:mb-8" data-cy="hf-title">{{ mediaCategory.title }}</h1> <h1 class="mb-4 lg:mb-8" data-cy="hf-title">{{ mediaCategory.title }}</h1>
<p class="text-large">{{ mediaCategory.introduction_text }}</p> <p class="text-large">{{ mediaCategory.introduction_text }}</p>

View File

@ -27,7 +27,9 @@ watch(dropdownSelected, (newValue) =>
<template> <template>
<div class="container-large"> <div class="container-large">
<div class="mb-10 mt-6 flex flex-col items-center justify-between lg:flex-row"> <div class="mb-10 mt-6 flex flex-col items-center justify-between lg:flex-row">
<h1>{{ $t("mediaLibrary.handlungsfelder.title", categories.length) }}</h1> <h1>
{{ $t("mediaLibrary.handlungsfelder.title", { count: categories.length }) }}
</h1>
<!-- <ItDropdownSelect v-model="dropdownSelected" :items="mediaStore.availableLearningPaths"></ItDropdownSelect>--> <!-- <ItDropdownSelect v-model="dropdownSelected" :items="mediaStore.availableLearningPaths"></ItDropdownSelect>-->
</div> </div>
<div v-if="mediaStore.mediaLibraryPage"> <div v-if="mediaStore.mediaLibraryPage">

View File

@ -35,7 +35,7 @@ watch(dropdownSelected, (newValue) =>
</div> </div>
<OverviewCard <OverviewCard
v-if="mediaStore.mediaLibraryPage" v-if="mediaStore.mediaLibraryPage"
:title="$t('mediaLibrary.handlungsfelder.title', 2)" :title="$t('mediaLibrary.handlungsfelder.title_other')"
:call2-action="$t('general.show')" :call2-action="$t('general.show')"
:link="`${mediaStore.mediaLibraryPage.frontend_url}/category`" :link="`${mediaStore.mediaLibraryPage.frontend_url}/category`"
:description="$t('mediaLibrary.handlungsfelder.description')" :description="$t('mediaLibrary.handlungsfelder.description')"

View File

@ -1,8 +1,7 @@
import log from "loglevel"; import log from "loglevel";
import { bustItGetCache, itGetCached, itPost } from "@/fetchHelpers"; import { bustItGetCache, itGetCached, itPost } from "@/fetchHelpers";
import { setI18nLanguage } from "@/i18n"; import { loadI18nextLocaleMessages, setI18nLanguage } from "@/i18nextWrapper";
import { loadI18nextLocaleMessages } from "@/i18nextWrapper";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { defineStore } from "pinia"; import { defineStore } from "pinia";

View File

@ -6,8 +6,7 @@
"test": "echo \"Error: no test specified\" && exit 1", "test": "echo \"Error: no test specified\" && exit 1",
"cypress:open": "cypress open", "cypress:open": "cypress open",
"cypress:ci": "cypress-cloud run --parallel --record --ci-build-id $(echo -n ${BITBUCKET_STEP_UUID}-${BITBUCKET_BUILD_NUMBER})", "cypress:ci": "cypress-cloud run --parallel --record --ci-build-id $(echo -n ${BITBUCKET_STEP_UUID}-${BITBUCKET_BUILD_NUMBER})",
"prettier": "npm run prettier --prefix client", "prettier": "npm run prettier --prefix client"
"vue-i18n-extract": "npm run vue-i18n-extract --prefix client"
}, },
"devDependencies": { "devDependencies": {
"cypress": "^12.15.0", "cypress": "^12.15.0",