From 6e7935a00586cd423a3be5a3205e68842790af2c Mon Sep 17 00:00:00 2001 From: Daniel Egger Date: Wed, 5 Jul 2023 16:15:17 +0200 Subject: [PATCH] Add locize cli script --- README.md | 34 +- client/.storybook/preview.ts | 2 +- client/package-lock.json | 958 ++++++++++++++++++ client/package.json | 5 +- client/src/i18nextWrapper.ts | 15 +- .../locales/{de.json => de/translation.json} | 24 +- .../locales/{fr.json => fr/translation.json} | 27 +- .../locales/{it.json => it/translation.json} | 27 +- client/src/pages/LoginPage.vue | 13 +- .../pages/cockpit/cockpitPage/CockpitPage.vue | 6 +- .../LearningPathAppointmentsMock.vue | 2 +- env_secrets/local_daniel.env | Bin 259 -> 446 bytes server/config/settings/base.py | 3 +- 13 files changed, 1064 insertions(+), 52 deletions(-) rename client/src/locales/{de.json => de/translation.json} (95%) rename client/src/locales/{fr.json => fr/translation.json} (93%) rename client/src/locales/{it.json => it/translation.json} (93%) diff --git a/README.md b/README.md index e13abd6e..120431f8 100644 --- a/README.md +++ b/README.md @@ -101,19 +101,35 @@ Preferences -> Tools -> Actions on Save ## 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. +We use (Locize)[https://locize.com] together with (i18next)[https://www.i18next.com/] +for translations on the Frontend. -``` -# will create a report on command line with missing translations -npm run vue-i18n-extract +The master for translated files is on Locize. Missing keys get automatically added to +Locize, no manual step is needed. +The translations are done on Locize. -# add missing translations to files, see docs for more options -cd client -npx vue-i18n-extract --add +Please make sure that the required environment variables are set +(see ./env_secrets/local_daniel.env for the values): + +* LOCIZE_PROJECT_ID +* LOCIZE_API_KEY + +The files in ./client/locales are only used as reference and are not the master! + +But you can still sync the local locale files with Locize with the following command. +Please be careful and do not lose translations. The savest way is to only add the +keys to the German file and let Locize translate them. + +```bash +npm run locize:sync ``` +### "_many" plural form in French and Italian + +See https://github.com/i18next/i18next/issues/1691#issuecomment-968063348 +for an explanation why this plural form is needed in French and Italian. +But not in German and English. + ## Deployment to CapRover ### CapRover Dev (vbv-lernwelt.control.iterativ.ch) diff --git a/client/.storybook/preview.ts b/client/.storybook/preview.ts index 5eb8c1cc..732f5449 100644 --- a/client/.storybook/preview.ts +++ b/client/.storybook/preview.ts @@ -1,6 +1,6 @@ import { Preview, setup } from "@storybook/vue3"; import { createI18n } from "vue-i18n"; -import de from "../src/locales/de.json"; +import de from "../src/locales/de/translation.json"; import "../tailwind.css"; import { withVueRouter } from "./mockRouter"; diff --git a/client/package-lock.json b/client/package-lock.json index acd87027..4ef402f4 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -24,6 +24,7 @@ "graphql": "^16.6.0", "i18next-locize-backend": "^6.2.2", "i18next-vue": "^2.2.0", + "locize": "^2.4.6", "lodash": "^4.17.21", "loglevel": "^1.8.0", "mitt": "^3.0.0", @@ -68,6 +69,7 @@ "eslint-plugin-storybook": "^0.6.12", "eslint-plugin-vue": "^9.15.0", "jsdom": "^22.1.0", + "locize-cli": "^7.14.6", "postcss": "^8.4.14", "postcss-import": "^15.1.0", "prettier": "^2.8.8", @@ -3539,6 +3541,16 @@ "react": "^16.14.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/@fluent/syntax": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@fluent/syntax/-/syntax-0.19.0.tgz", + "integrity": "sha512-5D2qVpZrgpjtqU4eNOcWGp1gnUCgjfM+vKGE2y03kKN6z5EBhtx0qdRFbg8QuNNj8wXNoX93KJoYb+NqoxswmQ==", + "dev": true, + "engines": { + "node": ">=14.0.0", + "npm": ">=7.0.0" + } + }, "node_modules/@graphql-codegen/add": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-5.0.0.tgz", @@ -4800,6 +4812,12 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@js.properties/properties": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@js.properties/properties/-/properties-0.5.4.tgz", + "integrity": "sha512-4M/Mb2CxzuI1CtQhVFs6OC9ceuGPAP6SOWnpLcrdB1TcUHroXbsYDVJNOm32koRMfuCoRACbojcm4dPPcQxu0w==", + "dev": true + }, "node_modules/@juggle/resize-observer": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", @@ -8379,6 +8397,16 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/android-string-resource": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/android-string-resource/-/android-string-resource-2.3.9.tgz", + "integrity": "sha512-SvsiQzZOmFyiJxR84OqNL+dB989enNrTN9rg8lhQfsE9RmYO5Coie0k+5YQRqG828f/sGPX5DM4JNx8oWvmkOQ==", + "dev": true, + "dependencies": { + "rdotjson": "1.0.4", + "xml-js": "1.6.11" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -8533,6 +8561,15 @@ "node": ">=8" } }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -9201,6 +9238,15 @@ "node": ">=8" } }, + "node_modules/cacheable-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "dev": true, + "engines": { + "node": ">=10.6.0" + } + }, "node_modules/cachedir": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", @@ -9397,6 +9443,44 @@ "node": ">= 0.8.0" } }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -9583,6 +9667,15 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -9971,6 +10064,34 @@ "node": ">=8" } }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -10000,6 +10121,12 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, + "node_modules/csvjson": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/csvjson/-/csvjson-5.1.0.tgz", + "integrity": "sha512-OqALQHA0k2rEGluOWikwFq5qtkRUDyoWP2u0UJy8uFjFx5FPMjPzx7D2Hn2KjBLpc8jkGrT9HDNgTUfopDlqVg==", + "dev": true + }, "node_modules/cypress": { "version": "12.14.0", "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.14.0.tgz", @@ -10945,6 +11072,15 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, + "node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/diff-sequences": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", @@ -10996,6 +11132,32 @@ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, "node_modules/domexception": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", @@ -11008,6 +11170,35 @@ "node": ">=12" } }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dot-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", @@ -11189,6 +11380,15 @@ "node": ">= 0.8" } }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -12309,6 +12509,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -12337,6 +12546,15 @@ "node": ">=0.4.0" } }, + "node_modules/fluent_conv": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fluent_conv/-/fluent_conv-3.2.0.tgz", + "integrity": "sha512-EhVRTpoeAk+vchaGXgpQT+cv+89kujnRPn7wBzouNDoNG8Fv2q00mon3l/S2a1g5pM/4/8B35fIchi0mG7WexA==", + "dev": true, + "dependencies": { + "@fluent/syntax": "0.19.0" + } + }, "node_modules/follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", @@ -12626,6 +12844,26 @@ "assert-plus": "^1.0.0" } }, + "node_modules/gettext-converter": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/gettext-converter/-/gettext-converter-1.2.3.tgz", + "integrity": "sha512-NF+8wcPhWsIsUxLtqpKjy8zX3dIQXiW0kjksvPCroAHrRxNerxfylr7FpxvNGGlEMw6GpXLDSkHYIAKR9hXtMg==", + "dev": true, + "dependencies": { + "arrify": "^2.0.1", + "content-type": "1.0.4", + "encoding": "0.1.13" + } + }, + "node_modules/gettext-converter/node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/giget": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/giget/-/giget-1.1.2.tgz", @@ -13069,6 +13307,25 @@ "node": ">=12" } }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -14530,6 +14787,15 @@ "node": ">=6" } }, + "node_modules/laravelphp": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/laravelphp/-/laravelphp-2.0.3.tgz", + "integrity": "sha512-gBPjC7cz29xFYFsBsVocqRD+sJVzEj9dnBpROSxoUb+FfG5Bhph4CiaZowYAXohQsZ8wk5jXYk7Z3gh/6TB7Sw==", + "dev": true, + "dependencies": { + "php-parser": "3.0.1" + } + }, "node_modules/lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -14674,6 +14940,122 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/locize": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/locize/-/locize-2.4.6.tgz", + "integrity": "sha512-o3X2/v8D+zuWAJRWuooEZbwblRQMJ5WYaT/4Psgek1+HXgqvb3TeZ7BUHaLc+oX2DK3TFSjSDqEFrSRVdu+B3A==" + }, + "node_modules/locize-cli": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/locize-cli/-/locize-cli-7.14.6.tgz", + "integrity": "sha512-NtYYCc7iLRKjfw3Qb+RJ4aai5ixfvjbl4JyRa1hBCM3XiGcoh3Ppt9vXmdB8pGQb7nuEe2UOg5PVFlQykV4QFQ==", + "dev": true, + "dependencies": { + "@js.properties/properties": "0.5.4", + "android-string-resource": "2.3.9", + "async": "3.2.4", + "cacheable-lookup": "6.1.0", + "colors": "1.4.0", + "commander": "9.5.0", + "csvjson": "5.1.0", + "diff": "5.1.0", + "dotenv": "16.0.3", + "flat": "5.0.2", + "fluent_conv": "3.2.0", + "gettext-converter": "1.2.3", + "https-proxy-agent": "5.0.1", + "ini": "3.0.1", + "js-yaml": "4.1.0", + "laravelphp": "2.0.3", + "lodash.clonedeep": "4.5.0", + "mkdirp": "2.1.6", + "node-fetch": "2.6.8", + "resx": "2.0.4", + "rimraf": "3.0.2", + "strings-file": "0.0.5", + "tmexchange": "2.0.5", + "xliff": "6.1.0", + "xlsx": "https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz" + }, + "bin": { + "locize": "bin/locize" + } + }, + "node_modules/locize-cli/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/locize-cli/node_modules/ini": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", + "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/locize-cli/node_modules/mkdirp": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "dev": true, + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/locize-cli/node_modules/node-fetch": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.8.tgz", + "integrity": "sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/locize-cli/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/locize-cli/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/locize-cli/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -14685,6 +15067,12 @@ "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", "dev": true }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -15539,6 +15927,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/obop": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/obop/-/obop-0.2.3.tgz", + "integrity": "sha512-xmaHk+pwv4T6QKoq553KeJlkZUV6WBVGU/dO7rppA7YFIvGf+xB1OQAkw8mcORtxtSHpiK5JiTQ+d7Bme/Y7Wg==", + "dev": true + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -15778,6 +16172,19 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -15919,6 +16326,12 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, + "node_modules/php-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.0.1.tgz", + "integrity": "sha512-m6CBPHOoMkzEHoXG0rhEg/VegSNemUNQepHnYtrRgTAh8rsqoO65KqQ32KJ5xe2iplhO0jdwd1UJ9Ea0yHsgYQ==", + "dev": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -16371,6 +16784,15 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "node_modules/process.argv": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/process.argv/-/process.argv-0.6.1.tgz", + "integrity": "sha512-WQOWF/VB0pTJu7c3ko0y5w6HWDQf6Wm3ppvKDI7ET4OSYBDOvcliBRM1HFIHHkJPNa/1bYTzmUinjF8492oaBg==", + "dev": true, + "dependencies": { + "obop": "^0.2.2" + } + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -16822,6 +17244,20 @@ "node": ">=0.10.0" } }, + "node_modules/rdotjson": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/rdotjson/-/rdotjson-1.0.4.tgz", + "integrity": "sha512-ELPyVCV5xsdLbo5t4Iqd9xdPaeDx++zFepmkXIEMYRb3km1mr3B85k+DpqcPxueAB6v4zCUZfammuOfejnB62Q==", + "dev": true, + "dependencies": { + "cheerio": "^1.0.0-rc.12", + "is-stream": "^2.0.0", + "process.argv": "^0.6.0" + }, + "bin": { + "rdotjson": "rdotjson.cli.js" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -17295,6 +17731,15 @@ "node": ">=8" } }, + "node_modules/resx": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/resx/-/resx-2.0.4.tgz", + "integrity": "sha512-b3IW7ge0nxbWOhbUGO/WULL4NG5ctrpey+UgDIwRq5K4Bblna4t1hLMbA2DZC9Y6e8U/zLuRJHg+qEOVKOoypQ==", + "dev": true, + "dependencies": { + "xml2js": "0.5.0" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -17466,6 +17911,12 @@ "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==", "dev": true }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -18112,6 +18563,27 @@ "node": ">=8" } }, + "node_modules/strings-file": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/strings-file/-/strings-file-0.0.5.tgz", + "integrity": "sha512-4/Fc8WshjKl/6MctVvdcdH3pQpbSP3J481hMUo9qMSpEK+piDYKYg8oSTGGKFMt2AyeZCQCnGF1uMq3i/xg/wQ==", + "dev": true, + "dependencies": { + "iconv-lite": "^0.4.13" + } + }, + "node_modules/strings-file/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -18632,6 +19104,15 @@ "tslib": "^2.0.3" } }, + "node_modules/tmexchange": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/tmexchange/-/tmexchange-2.0.5.tgz", + "integrity": "sha512-fJQcBIY/ebEYDagOA0IY2PKYs2OJtBo0UGO+O2huyTkL9h+1Fg75DKw0JHkzXA1C56ejQdLW7S9YS/IL9rOpmQ==", + "dev": true, + "dependencies": { + "xml2js": "0.5.0" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -20014,6 +20495,40 @@ } } }, + "node_modules/xliff": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/xliff/-/xliff-6.1.0.tgz", + "integrity": "sha512-uRmGu6Xyt+/Yr0/yZXU23GfxZOF0KLt5A4MFO7Q3YxR1GlCc/dF8viqMFgpftOo0jokSnA3T9KiHgek45lRkvw==", + "dev": true, + "dependencies": { + "xml-js": "1.6.11" + } + }, + "node_modules/xlsx": { + "version": "0.19.3", + "resolved": "https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz", + "integrity": "sha512-8IfgFctB7fkvqkTGF2MnrDrC6vzE28Wcc1aSbdDQ+4/WFtzfS73YuapbuaPZwGqpR2e0EeDMIrFOJubQVLWFNA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dev": true, + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, "node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", @@ -20023,6 +20538,28 @@ "node": ">=12" } }, + "node_modules/xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", @@ -22501,6 +23038,12 @@ "@lit-labs/react": "^1.0.2" } }, + "@fluent/syntax": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@fluent/syntax/-/syntax-0.19.0.tgz", + "integrity": "sha512-5D2qVpZrgpjtqU4eNOcWGp1gnUCgjfM+vKGE2y03kKN6z5EBhtx0qdRFbg8QuNNj8wXNoX93KJoYb+NqoxswmQ==", + "dev": true + }, "@graphql-codegen/add": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-5.0.0.tgz", @@ -23468,6 +24011,12 @@ "@jridgewell/sourcemap-codec": "1.4.14" } }, + "@js.properties/properties": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@js.properties/properties/-/properties-0.5.4.tgz", + "integrity": "sha512-4M/Mb2CxzuI1CtQhVFs6OC9ceuGPAP6SOWnpLcrdB1TcUHroXbsYDVJNOm32koRMfuCoRACbojcm4dPPcQxu0w==", + "dev": true + }, "@juggle/resize-observer": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", @@ -26276,6 +26825,16 @@ "uri-js": "^4.2.2" } }, + "android-string-resource": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/android-string-resource/-/android-string-resource-2.3.9.tgz", + "integrity": "sha512-SvsiQzZOmFyiJxR84OqNL+dB989enNrTN9rg8lhQfsE9RmYO5Coie0k+5YQRqG828f/sGPX5DM4JNx8oWvmkOQ==", + "dev": true, + "requires": { + "rdotjson": "1.0.4", + "xml-js": "1.6.11" + } + }, "ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -26385,6 +26944,12 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -26887,6 +27452,12 @@ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true }, + "cacheable-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "dev": true + }, "cachedir": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", @@ -27039,6 +27610,35 @@ "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==" }, + "cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dev": true, + "requires": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + } + }, + "cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + } + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -27161,6 +27761,12 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -27474,6 +28080,25 @@ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -27494,6 +28119,12 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" }, + "csvjson": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/csvjson/-/csvjson-5.1.0.tgz", + "integrity": "sha512-OqALQHA0k2rEGluOWikwFq5qtkRUDyoWP2u0UJy8uFjFx5FPMjPzx7D2Hn2KjBLpc8jkGrT9HDNgTUfopDlqVg==", + "dev": true + }, "cypress": { "version": "12.14.0", "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.14.0.tgz", @@ -28185,6 +28816,12 @@ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", "dev": true }, + "diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true + }, "diff-sequences": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", @@ -28227,6 +28864,23 @@ "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, "domexception": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", @@ -28236,6 +28890,26 @@ "webidl-conversions": "^7.0.0" } }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + }, "dot-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", @@ -28397,6 +29071,15 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "requires": { + "iconv-lite": "^0.6.2" + } + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -29281,6 +29964,12 @@ "path-exists": "^4.0.0" } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -29303,6 +29992,15 @@ "integrity": "sha512-uD7Du+9xC/gGnOyk3kANQmtgWWKANWcKGJ84Wu0NSjTaVING3GqUAsywUPAl3fEYKLVVIcDWiaQ8+R6qzghwmA==", "dev": true }, + "fluent_conv": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fluent_conv/-/fluent_conv-3.2.0.tgz", + "integrity": "sha512-EhVRTpoeAk+vchaGXgpQT+cv+89kujnRPn7wBzouNDoNG8Fv2q00mon3l/S2a1g5pM/4/8B35fIchi0mG7WexA==", + "dev": true, + "requires": { + "@fluent/syntax": "0.19.0" + } + }, "follow-redirects": { "version": "1.15.2", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", @@ -29509,6 +30207,25 @@ "assert-plus": "^1.0.0" } }, + "gettext-converter": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/gettext-converter/-/gettext-converter-1.2.3.tgz", + "integrity": "sha512-NF+8wcPhWsIsUxLtqpKjy8zX3dIQXiW0kjksvPCroAHrRxNerxfylr7FpxvNGGlEMw6GpXLDSkHYIAKR9hXtMg==", + "dev": true, + "requires": { + "arrify": "^2.0.1", + "content-type": "1.0.4", + "encoding": "0.1.13" + }, + "dependencies": { + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + } + } + }, "giget": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/giget/-/giget-1.1.2.tgz", @@ -29837,6 +30554,18 @@ "whatwg-encoding": "^2.0.0" } }, + "htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -30928,6 +31657,15 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, + "laravelphp": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/laravelphp/-/laravelphp-2.0.3.tgz", + "integrity": "sha512-gBPjC7cz29xFYFsBsVocqRD+sJVzEj9dnBpROSxoUb+FfG5Bhph4CiaZowYAXohQsZ8wk5jXYk7Z3gh/6TB7Sw==", + "dev": true, + "requires": { + "php-parser": "3.0.1" + } + }, "lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -31034,6 +31772,95 @@ "p-locate": "^5.0.0" } }, + "locize": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/locize/-/locize-2.4.6.tgz", + "integrity": "sha512-o3X2/v8D+zuWAJRWuooEZbwblRQMJ5WYaT/4Psgek1+HXgqvb3TeZ7BUHaLc+oX2DK3TFSjSDqEFrSRVdu+B3A==" + }, + "locize-cli": { + "version": "7.14.6", + "resolved": "https://registry.npmjs.org/locize-cli/-/locize-cli-7.14.6.tgz", + "integrity": "sha512-NtYYCc7iLRKjfw3Qb+RJ4aai5ixfvjbl4JyRa1hBCM3XiGcoh3Ppt9vXmdB8pGQb7nuEe2UOg5PVFlQykV4QFQ==", + "dev": true, + "requires": { + "@js.properties/properties": "0.5.4", + "android-string-resource": "2.3.9", + "async": "3.2.4", + "cacheable-lookup": "6.1.0", + "colors": "1.4.0", + "commander": "9.5.0", + "csvjson": "5.1.0", + "diff": "5.1.0", + "dotenv": "16.0.3", + "flat": "5.0.2", + "fluent_conv": "3.2.0", + "gettext-converter": "1.2.3", + "https-proxy-agent": "5.0.1", + "ini": "3.0.1", + "js-yaml": "4.1.0", + "laravelphp": "2.0.3", + "lodash.clonedeep": "4.5.0", + "mkdirp": "2.1.6", + "node-fetch": "2.6.8", + "resx": "2.0.4", + "rimraf": "3.0.2", + "strings-file": "0.0.5", + "tmexchange": "2.0.5", + "xliff": "6.1.0", + "xlsx": "https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz" + }, + "dependencies": { + "commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true + }, + "ini": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", + "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", + "dev": true + }, + "mkdirp": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "dev": true + }, + "node-fetch": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.8.tgz", + "integrity": "sha512-RZ6dBYuj8dRSfxpUSu+NsdF1dpPpluJxwOp+6IoDp/sH2QNDSvurYsAa+F1WxY2RjA1iP93xhcsUoYbF2XBqVg==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -31045,6 +31872,12 @@ "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", "dev": true }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -31699,6 +32532,12 @@ "object-keys": "^1.1.1" } }, + "obop": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/obop/-/obop-0.2.3.tgz", + "integrity": "sha512-xmaHk+pwv4T6QKoq553KeJlkZUV6WBVGU/dO7rppA7YFIvGf+xB1OQAkw8mcORtxtSHpiK5JiTQ+d7Bme/Y7Wg==", + "dev": true + }, "on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -31872,6 +32711,16 @@ "entities": "^4.4.0" } }, + "parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dev": true, + "requires": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -31989,6 +32838,12 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, + "php-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/php-parser/-/php-parser-3.0.1.tgz", + "integrity": "sha512-m6CBPHOoMkzEHoXG0rhEg/VegSNemUNQepHnYtrRgTAh8rsqoO65KqQ32KJ5xe2iplhO0jdwd1UJ9Ea0yHsgYQ==", + "dev": true + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -32218,6 +33073,15 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "process.argv": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/process.argv/-/process.argv-0.6.1.tgz", + "integrity": "sha512-WQOWF/VB0pTJu7c3ko0y5w6HWDQf6Wm3ppvKDI7ET4OSYBDOvcliBRM1HFIHHkJPNa/1bYTzmUinjF8492oaBg==", + "dev": true, + "requires": { + "obop": "^0.2.2" + } + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -32602,6 +33466,17 @@ } } }, + "rdotjson": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/rdotjson/-/rdotjson-1.0.4.tgz", + "integrity": "sha512-ELPyVCV5xsdLbo5t4Iqd9xdPaeDx++zFepmkXIEMYRb3km1mr3B85k+DpqcPxueAB6v4zCUZfammuOfejnB62Q==", + "dev": true, + "requires": { + "cheerio": "^1.0.0-rc.12", + "is-stream": "^2.0.0", + "process.argv": "^0.6.0" + } + }, "react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -32969,6 +33844,15 @@ "signal-exit": "^3.0.2" } }, + "resx": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/resx/-/resx-2.0.4.tgz", + "integrity": "sha512-b3IW7ge0nxbWOhbUGO/WULL4NG5ctrpey+UgDIwRq5K4Bblna4t1hLMbA2DZC9Y6e8U/zLuRJHg+qEOVKOoypQ==", + "dev": true, + "requires": { + "xml2js": "0.5.0" + } + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -33074,6 +33958,12 @@ "neo-async": "^2.6.2" } }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, "saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -33580,6 +34470,26 @@ "strip-ansi": "^6.0.1" } }, + "strings-file": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/strings-file/-/strings-file-0.0.5.tgz", + "integrity": "sha512-4/Fc8WshjKl/6MctVvdcdH3pQpbSP3J481hMUo9qMSpEK+piDYKYg8oSTGGKFMt2AyeZCQCnGF1uMq3i/xg/wQ==", + "dev": true, + "requires": { + "iconv-lite": "^0.4.13" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -34009,6 +34919,15 @@ "tslib": "^2.0.3" } }, + "tmexchange": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/tmexchange/-/tmexchange-2.0.5.tgz", + "integrity": "sha512-fJQcBIY/ebEYDagOA0IY2PKYs2OJtBo0UGO+O2huyTkL9h+1Fg75DKw0JHkzXA1C56ejQdLW7S9YS/IL9rOpmQ==", + "dev": true, + "requires": { + "xml2js": "0.5.0" + } + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -34989,12 +35908,51 @@ "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "dev": true }, + "xliff": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/xliff/-/xliff-6.1.0.tgz", + "integrity": "sha512-uRmGu6Xyt+/Yr0/yZXU23GfxZOF0KLt5A4MFO7Q3YxR1GlCc/dF8viqMFgpftOo0jokSnA3T9KiHgek45lRkvw==", + "dev": true, + "requires": { + "xml-js": "1.6.11" + } + }, + "xlsx": { + "version": "https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz", + "integrity": "sha512-8IfgFctB7fkvqkTGF2MnrDrC6vzE28Wcc1aSbdDQ+4/WFtzfS73YuapbuaPZwGqpR2e0EeDMIrFOJubQVLWFNA==", + "dev": true + }, + "xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dev": true, + "requires": { + "sax": "^1.2.4" + } + }, "xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true }, + "xml2js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", + "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", + "dev": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", diff --git a/client/package.json b/client/package.json index eee94171..86edfa69 100644 --- a/client/package.json +++ b/client/package.json @@ -16,7 +16,8 @@ "storybook": "storybook dev -p 6006", "tailwind": "tailwindcss -i tailwind.css -o ../server/vbv_lernwelt/static/css/tailwind.css --watch", "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", + "locize:sync": "locize sync --path ./src/locales" }, "dependencies": { "@headlessui/tailwindcss": "^0.1.3", @@ -35,6 +36,7 @@ "graphql": "^16.6.0", "i18next-locize-backend": "^6.2.2", "i18next-vue": "^2.2.0", + "locize": "^2.4.6", "lodash": "^4.17.21", "loglevel": "^1.8.0", "mitt": "^3.0.0", @@ -79,6 +81,7 @@ "eslint-plugin-storybook": "^0.6.12", "eslint-plugin-vue": "^9.15.0", "jsdom": "^22.1.0", + "locize-cli": "^7.14.6", "postcss": "^8.4.14", "postcss-import": "^15.1.0", "prettier": "^2.8.8", diff --git a/client/src/i18nextWrapper.ts b/client/src/i18nextWrapper.ts index 118431bb..0ede6b5d 100644 --- a/client/src/i18nextWrapper.ts +++ b/client/src/i18nextWrapper.ts @@ -1,9 +1,17 @@ import type { AvailableLanguages } from "@/stores/user"; import i18next from "i18next"; +import { locizePlugin } from "locize"; + import Backend from "i18next-locize-backend"; import { nextTick } from "vue"; +declare module "i18next" { + interface CustomTypeOptions { + returnNull: false; + } +} + export const SUPPORT_LOCALES: AvailableLanguages[] = ["de", "fr", "it"]; export function i18nextInit() { @@ -15,13 +23,16 @@ export function i18nextInit() { // init i18next // for all options read: https://www.i18next.com/overview/configuration-options .use(Backend) + .use(locizePlugin) .init({ debug: true, fallbackLng: "de", defaultNS: "translation", + returnNull: false, + saveMissing: true, backend: { - projectId: "7518c269-cbf7-4d25-bc5c-6ceba2a8b74b", - apiKey: "0001d5bd-04c9-4ade-bedd-308a01d86860", + projectId: import.meta.env.VITE_LOCIZE_PROJECTID, + apiKey: import.meta.env.VITE_LOCIZE_API_KEY, }, }) ); diff --git a/client/src/locales/de.json b/client/src/locales/de/translation.json similarity index 95% rename from client/src/locales/de.json rename to client/src/locales/de/translation.json index b1ea3f45..2324d56a 100644 --- a/client/src/locales/de.json +++ b/client/src/locales/de/translation.json @@ -1,14 +1,9 @@ { "Benutzername": "Benutzername", - "Hier findest du die Trainerunterlagen (Lösungsblätter, Präsentationen etc.) für deinen Circle.": "Hier findest du die Trainerunterlagen (Lösungsblätter, Präsentationen etc.) für deinen Circle.", - "Klicke auf den Button, um dich über SSO anzumelden oder zu registrieren.": "Klicke auf den Button, um dich über SSO anzumelden oder zu registrieren.", "MS Teams öffnen": "MS Teams öffnen", - "Nächste Termine:": "Nächste Termine:", "Passwort": "Passwort", - "SSO Login/Registration": "SSO Login/Registration", "Trainerunterlagen": "Trainerunterlagen", "Zur Zeit sind keine Termine vorhanden": "Zur Zeit sind keine Termine vorhanden", - "welcome": "Hallo Welt", "assignment": { "acceptConditionsDisclaimer": "Bedingungen akzeptieren und Ergebnisse abgeben", "assessmentDocumentDisclaimer": "Diese geleitete Fallarbeit wird auf Grund des folgenden Beurteilungsinstrument bewertet:", @@ -69,7 +64,8 @@ "profileLink": "Profil anzeigen", "progress": "Teilnehmende / Status", "tasksDone": "Erledigte Transferaufträge von Teilnehmer.", - "title": "Cockpit" + "title": "Cockpit", + "trainerFilesText": "Hier findest du die Trainerunterlagen (Lösungsblätter, Präsentationen etc.) für deinen Circle." }, "competences": { "assessAgain": "Sich nochmals einschätzen", @@ -92,6 +88,9 @@ "nocourses": "Du wurdest noch keinem Lehrgang zugewiesen.", "welcome": "Willkommen, {{name}}" }, + "dueDates": { + "nextDueDates": "Nächste Termine" + }, "feedback": { "answers": "Antworten", "areYouSatisfied": "Wie zufrieden bist du?", @@ -143,10 +142,10 @@ "certificate_other": "Zertifikate", "circles": "Circles", "close": "Schliessen", - "exam_one": "Prüfung", - "exam_other": "Prüfungen", "examResult_one": "Prüfungsresultat", "examResult_other": "Prüfungsresultate", + "exam_one": "Prüfung", + "exam_other": "Prüfungen", "feedback_one": "Feedback", "feedback_other": "Feedbacks", "introduction": "Einleitung", @@ -190,6 +189,12 @@ "topics": "Themen:", "welcomeBack": "Willkommen zurück in deinem Lehrgang:" }, + "login": { + "demoLogin": "Demo Login", + "login": "Login", + "ssoLogin": "SSO Login/Registration", + "ssoText": "Klicke auf den Button, um dich über SSO anzumelden oder zu registrieren." + }, "mainNavigation": { "logout": "Abmelden", "profile": "Profil" @@ -231,5 +236,6 @@ }, "settings": { "emailNotifications": "Email Benachrichtigungen" - } + }, + "welcome": "Hallo Welt" } diff --git a/client/src/locales/fr.json b/client/src/locales/fr/translation.json similarity index 93% rename from client/src/locales/fr.json rename to client/src/locales/fr/translation.json index e155be69..c1878e1c 100644 --- a/client/src/locales/fr.json +++ b/client/src/locales/fr/translation.json @@ -1,11 +1,7 @@ { "Benutzername": "Nom d’utilisateur", - "Hier findest du die Trainerunterlagen (Lösungsblätter, Präsentationen etc.) für deinen Circle.": "Tu trouves ici les documents de formation (feuilles de solution, présentations, etc.) pour ton cercle.", - "Klicke auf den Button, um dich über SSO anzumelden oder zu registrieren.": "Clique sur le bouton pour te connecter via le SSO ou t’inscrire.", "MS Teams öffnen": "Ouvrir MS Teams ", - "Nächste Termine:": "Prochaines réunions :", "Passwort": "Mot de passe", - "SSO Login/Registration": "Connexion SSO / Inscription", "Trainerunterlagen": "Documents du formateur / de la formatrice", "Zur Zeit sind keine Termine vorhanden": "Aucune réunion n’est prévue pour le moment", "assignment": { @@ -68,7 +64,8 @@ "profileLink": "Afficher le profil", "progress": "Personne participante / Statut", "tasksDone": "Exercices d’application terminés par les participants.", - "title": "Cockpit" + "title": "Cockpit", + "trainerFilesText": "Tu trouves ici les documents de formation (feuilles de solution, présentations, etc.) pour ton cercle." }, "competences": { "assessAgain": "S’évaluer à nouveau", @@ -91,6 +88,9 @@ "nocourses": "Tu n’as été affecté(e) à aucune formation encore.", "welcome": "Bienvenue, {{name}}" }, + "dueDates": { + "nextDueDates": "Prochaines réunions" + }, "feedback": { "answers": "Réponses", "areYouSatisfied": "Quel est ton degré de satisfaction ?", @@ -138,14 +138,18 @@ "backCapitalized": "@.capitalize:general.back", "backToCircle": "Revenir au cercle", "backToLearningPath": "Revenir au programme de formation", + "certificate_many": "Certificats", "certificate_one": "Certificat", "certificate_other": "Certificats", "circles": "Cercles", "close": "Fermer", - "exam_one": "Examen", - "exam_other": "Examens", + "examResult_many": "Résultats de l’examen", "examResult_one": "Résultat de l’examen", "examResult_other": "Résultats de l’examen", + "exam_many": "Examens", + "exam_one": "Examen", + "exam_other": "Examens", + "feedback_many": "Feed-backs", "feedback_one": "Feed-back", "feedback_other": "Feed-backs", "introduction": "Introduction", @@ -155,6 +159,7 @@ "next": "Continuer", "nextStep": "Cela continue", "no": "Non", + "notification_many": "Notifications", "notification_one": "Notification", "notification_other": "Notifications", "profileLink": "Détails", @@ -167,6 +172,7 @@ "start": "C’est parti !", "submission": "Remise", "title": "myAFA", + "transferTask_many": "Exercices d’application", "transferTask_one": "Exercice d’application", "transferTask_other": "Exercices d’application", "yes": "Oui" @@ -189,6 +195,12 @@ "topics": "Thèmes :", "welcomeBack": "Cela fait plaisir de te revoir dans ta formation :" }, + "login": { + "demoLogin": "Connexion Demo", + "login": "Login", + "ssoLogin": "Connexion SSO / Inscription", + "ssoText": "Clique sur le bouton pour te connecter via le SSO ou t’inscrire." + }, "mainNavigation": { "logout": "Se déconnecter", "profile": "Profil" @@ -196,6 +208,7 @@ "mediaLibrary": { "handlungsfelder": { "description": "Trouve toutes les ressources des champs d’action, comme les outils didactiques, les liens et autres informations utiles.", + "title_many": "Champs d’action", "title_one": "Champ d’action", "title_other": "Champs d’action" }, diff --git a/client/src/locales/it.json b/client/src/locales/it/translation.json similarity index 93% rename from client/src/locales/it.json rename to client/src/locales/it/translation.json index 92d572e1..c8be8b01 100644 --- a/client/src/locales/it.json +++ b/client/src/locales/it/translation.json @@ -1,11 +1,7 @@ { "Benutzername": "Nome utente", - "Hier findest du die Trainerunterlagen (Lösungsblätter, Präsentationen etc.) für deinen Circle.": "Qui trovi i documenti del/della trainer (soluzioni, presentazioni ecc.) per il tuo Circle.", - "Klicke auf den Button, um dich über SSO anzumelden oder zu registrieren.": "Clicca sul pulsante per effettuare il login o registrarti tramite SSO.", "MS Teams öffnen": "Aprire MS Teams", - "Nächste Termine:": "Prossime scadenze:", "Passwort": "Password", - "SSO Login/Registration": "Login/Registrazione SSO", "Trainerunterlagen": "Documenti del/della trainer", "Zur Zeit sind keine Termine vorhanden": "Al momento non ci sono scadenze", "assignment": { @@ -68,7 +64,8 @@ "profileLink": "Mostrare il profilo", "progress": "Partecipanti / Stato", "tasksDone": "Incarichi di trasferimento completati dal/dalla partecipante.", - "title": "Cockpit" + "title": "Cockpit", + "trainerFilesText": "Qui trovi i documenti del/della trainer (soluzioni, presentazioni ecc.) per il tuo Circle." }, "competences": { "assessAgain": "Nuova auto-valutazione", @@ -91,6 +88,9 @@ "nocourses": "Non sei ancora stato/a assegnato/a a nessun corso.", "welcome": "Ti diamo il benvenuto, {{name}}" }, + "dueDates": { + "nextDueDates": "Prossime scadenze" + }, "feedback": { "answers": "Risposte", "areYouSatisfied": "Quanto sei soddisfatto/a?", @@ -138,14 +138,18 @@ "backCapitalized": "@.capitalize:general.back", "backToCircle": "Torna al Circle", "backToLearningPath": "Torna al percorso formativo", + "certificate_many": "Certificati", "certificate_one": "Certificato", "certificate_other": "Certificati", "circles": "Circle", "close": "Chiudere", - "exam_one": "Esame", - "exam_other": "Esami", + "examResult_many": "Risultati degli esami", "examResult_one": "Risultato dell’esame", "examResult_other": "Risultati degli esami", + "exam_many": "Esami", + "exam_one": "Esame", + "exam_other": "Esami", + "feedback_many": "Feedback", "feedback_one": "Feedback", "feedback_other": "Feedback", "introduction": "Introduzione", @@ -155,6 +159,7 @@ "next": "Avanti", "nextStep": "Continua", "no": "No", + "notification_many": "Notifiche", "notification_one": "Notifica", "notification_other": "Notifiche", "profileLink": "Mostrare i dettagli", @@ -167,6 +172,7 @@ "start": "Si comincia", "submission": "Consegna", "title": "myAFA", + "transferTask_many": "Incarichi di trasferimento", "transferTask_one": "Incarico di trasferimento", "transferTask_other": "Incarichi di trasferimento", "yes": "Sì" @@ -189,6 +195,12 @@ "topics": "Temi:", "welcomeBack": "Bentornato/a al tuo corso:" }, + "login": { + "demoLogin": "Login Demo", + "login": "Login", + "ssoLogin": "Login/Registrazione SSO", + "ssoText": "Clicca sul pulsante per effettuare il login o registrarti tramite SSO." + }, "mainNavigation": { "logout": "Logout", "profile": "Profilo" @@ -196,6 +208,7 @@ "mediaLibrary": { "handlungsfelder": { "description": "Trova tutte le risorse dei campi d’azione, come materiali didattici, link e altre informazioni utili.", + "title_many": "Campi d’azione", "title_one": "Campo d’azione", "title_other": "Campi d’azione" }, diff --git a/client/src/pages/LoginPage.vue b/client/src/pages/LoginPage.vue index 9be6cd4d..74244c8a 100644 --- a/client/src/pages/LoginPage.vue +++ b/client/src/pages/LoginPage.vue @@ -25,8 +25,7 @@ const userStore = useUserStore();