feat: add i18next and react-i18next for internationalization support
Test / backend (push) Successful in 12s
Test / frontend (push) Failing after 5s

This commit is contained in:
LaurensBartelds committed 2026-04-26 21:59:06 +02:00
1 parent 98bba73192
commit e9c0a2615a
3 files changed
+92 -1

No files matched your search

+88
View File
@@ -9,9 +9,12 @@
"version": "0.0.0",
"dependencies": {
"dompurify": "^3.4.1",
"i18next": "^23.16.8",
"i18next-browser-languagedetector": "^8.0.4",
"katex": "^0.16.45",
"react": "^19.2.5",
"react-dom": "^19.2.5",
"react-i18next": "^15.4.1",
"react-router-dom": "^7.14.2"
},
"devDependencies": {
@@ -228,6 +231,15 @@
"node": ">=6.0.0"
}
},
"node_modules/@babel/runtime": {
"version": "7.29.2",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
"integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/template": {
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
@@ -2287,6 +2299,47 @@
"dev": true,
"license": "MIT"
},
"node_modules/html-parse-stringify": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
"integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
"license": "MIT",
"dependencies": {
"void-elements": "3.1.0"
}
},
"node_modules/i18next": {
"version": "23.16.8",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz",
"integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==",
"funding": [
{
"type": "individual",
"url": "https://locize.com"
},
{
"type": "individual",
"url": "https://locize.com/i18next.html"
},
{
"type": "individual",
"url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
}
],
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.2"
}
},
"node_modules/i18next-browser-languagedetector": {
"version": "8.2.1",
"resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.2.1.tgz",
"integrity": "sha512-bZg8+4bdmaOiApD7N7BPT9W8MLZG+nPTOFlLiJiT8uzKXFjhxw4v2ierCXOwB5sFDMtuA5G4kgYZ0AznZxQ/cw==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.23.2"
}
},
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -3089,6 +3142,32 @@
"react": "^19.2.5"
}
},
"node_modules/react-i18next": {
"version": "15.7.4",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.7.4.tgz",
"integrity": "sha512-nyU8iKNrI5uDJch0z9+Y5XEr34b0wkyYj3Rp+tfbahxtlswxSCjcUL9H0nqXo9IR3/t5Y5PKIA3fx3MfUyR9Xw==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.27.6",
"html-parse-stringify": "^3.0.1"
},
"peerDependencies": {
"i18next": ">= 23.4.0",
"react": ">= 16.8.0",
"typescript": "^5"
},
"peerDependenciesMeta": {
"react-dom": {
"optional": true
},
"react-native": {
"optional": true
},
"typescript": {
"optional": true
}
}
},
"node_modules/react-router": {
"version": "7.14.2",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-7.14.2.tgz",
@@ -3612,6 +3691,15 @@
}
}
},
"node_modules/void-elements": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
"integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+3
View File
@@ -13,9 +13,12 @@
},
"dependencies": {
"dompurify": "^3.4.1",
"i18next": "^23.16.8",
"i18next-browser-languagedetector": "^8.0.4",
"katex": "^0.16.45",
"react": "^19.2.5",
"react-dom": "^19.2.5",
"react-i18next": "^15.4.1",
"react-router-dom": "^7.14.2"
},
"devDependencies": {
@@ -1 +1 @@
{"version":"4.1.5","results":[[":frontend/src/utils/grading.test.ts",{"duration":11.88799999999992,"failed":false}],[":frontend/src/utils/latex.test.ts",{"duration":15.778799999999933,"failed":false}],[":backend/src/validators/authSchemas.test.ts",{"duration":14.862500000000068,"failed":false}],[":frontend/src/utils/validation.test.ts",{"duration":10.760000000000105,"failed":false}],[":frontend/src/utils/storage.test.ts",{"duration":9.449499999999944,"failed":false}],[":backend/src/validators/examSchemas.test.ts",{"duration":17.14530000000002,"failed":false}],[":backend/src/validators/adminSchemas.test.ts",{"duration":20.04939999999999,"failed":false}],[":backend/src/middleware/error.test.ts",{"duration":3.2900999999999954,"failed":false}],[":frontend/src/utils/slug.test.ts",{"duration":10.857900000000086,"failed":false}],[":frontend/src/utils/formatting.test.ts",{"duration":8.759399999999914,"failed":false}],[":backend/src/config.test.ts",{"duration":6.4430999999999585,"failed":false}],[":backend/src/validators/resultSchemas.test.ts",{"duration":12.441899999999919,"failed":false}],[":backend/src/utils/tokens.test.ts",{"duration":191.26739999999995,"failed":false}],[":backend/src/validators/setupSchemas.test.ts",{"duration":12.750800000000027,"failed":false}],[":backend/src/utils/asyncHandler.test.ts",{"duration":9.973799999999983,"failed":false}],[":frontend/src/utils/api.test.ts",{"duration":6.215300000000013,"failed":false}]]}
{"version":"4.1.5","results":[[":frontend/src/utils/grading.test.ts",{"duration":13.527699999999982,"failed":false}],[":frontend/src/utils/latex.test.ts",{"duration":19.335300000000075,"failed":false}],[":backend/src/validators/authSchemas.test.ts",{"duration":18.226099999999974,"failed":false}],[":frontend/src/utils/validation.test.ts",{"duration":8.861599999999953,"failed":false}],[":frontend/src/utils/storage.test.ts",{"duration":13.730599999999981,"failed":false}],[":backend/src/validators/examSchemas.test.ts",{"duration":14.561199999999985,"failed":false}],[":backend/src/validators/adminSchemas.test.ts",{"duration":10.744000000000028,"failed":false}],[":backend/src/middleware/error.test.ts",{"duration":3.961199999999991,"failed":false}],[":frontend/src/utils/slug.test.ts",{"duration":7.912199999999984,"failed":false}],[":frontend/src/utils/formatting.test.ts",{"duration":8.322499999999991,"failed":false}],[":backend/src/config.test.ts",{"duration":5.9365999999999985,"failed":false}],[":backend/src/validators/resultSchemas.test.ts",{"duration":10.511600000000044,"failed":false}],[":backend/src/utils/tokens.test.ts",{"duration":197.5005,"failed":false}],[":backend/src/validators/setupSchemas.test.ts",{"duration":12.653300000000058,"failed":false}],[":backend/src/utils/asyncHandler.test.ts",{"duration":8.633299999999963,"failed":false}],[":frontend/src/utils/api.test.ts",{"duration":5.6884000000000015,"failed":false}]]}