From f1a8a21627dbd4300f4ec8d75463b3228501a123 Mon Sep 17 00:00:00 2001 From: Arthur M <4rthem@users.noreply.github.com> Date: Mon, 22 Apr 2024 21:29:52 +0200 Subject: [PATCH] PS-644 shared translations (#432) --- bin/dev/translate.sh | 11 + bin/vars.sh | 17 + dashboard/client/package.json | 2 +- databox/client/i18next-scanner.config.js | 82 - databox/client/package.json | 12 +- databox/client/src/i18n.ts | 50 +- databox/client/src/locales/app.ts | 4 - databox/client/src/locales/en_US/app.json | 36 - databox/client/src/locales/fr_FR/app.json | 36 - databox/client/src/store/basketStore.ts | 1 - databox/client/translations/de.json | 562 ++++++ databox/client/translations/en.json | 558 ++++++ databox/client/translations/es.json | 560 ++++++ databox/client/translations/fr.json | 558 ++++++ databox/client/translations/index.ts | 81 + databox/client/translations/zh.json | 558 ++++++ expose/client/i18next-scanner.config.js | 82 - expose/client/package.json | 13 +- .../src/component/index/PublicationIndex.tsx | 33 +- .../shared-components/DownloadButton.tsx | 3 +- expose/client/src/i18n.ts | 8 + expose/client/src/i18n/de/translation.json | 1 - expose/client/src/i18n/en/translation.json | 22 - expose/client/src/i18n/es/translation.json | 1 - expose/client/src/i18n/fr/translation.json | 22 - expose/client/src/i18n/i18n.js | 32 - expose/client/src/i18n/index.js | 6 - expose/client/src/index.tsx | 2 +- expose/client/translations/de.json | 17 + expose/client/translations/en.json | 17 + expose/client/translations/es.json | 17 + expose/client/translations/fr.json | 17 + expose/client/translations/index.ts | 70 + expose/client/translations/zh.json | 17 + lib/js/api/package.json | 12 +- lib/js/api/src/useRequestErrorHandler.ts | 8 +- lib/js/api/translations/de.json | 14 + lib/js/api/translations/en.json | 14 + lib/js/api/translations/es.json | 14 + lib/js/api/translations/fr.json | 14 + lib/js/api/translations/zh.json | 14 + lib/js/i18n/i18next-scanner.config.js | 86 + lib/js/i18n/package.json | 19 + lib/js/i18n/src/index.ts | 83 + lib/js/navigation/package.json | 14 +- lib/js/navigation/src/useNavigationPrompt.tsx | 4 +- lib/js/navigation/translations/de.json | 7 + lib/js/navigation/translations/en.json | 7 + lib/js/navigation/translations/es.json | 7 + lib/js/navigation/translations/fr.json | 7 + lib/js/navigation/translations/zh.json | 7 + lib/js/phrasea-ui/package.json | 9 +- lib/js/phrasea-ui/src/components/UserMenu.tsx | 4 +- lib/js/phrasea-ui/translations/de.json | 10 + lib/js/phrasea-ui/translations/en.json | 10 + lib/js/phrasea-ui/translations/es.json | 10 + lib/js/phrasea-ui/translations/fr.json | 10 + lib/js/phrasea-ui/translations/zh.json | 10 + lib/js/react-auth/package.json | 14 +- .../components/SessionAboutToExpireModal.tsx | 14 +- lib/js/react-auth/translations/de.json | 19 + lib/js/react-auth/translations/en.json | 19 + lib/js/react-auth/translations/es.json | 19 + lib/js/react-auth/translations/fr.json | 19 + lib/js/react-auth/translations/zh.json | 19 + lib/js/react-form/package.json | 12 +- .../src/Collection/CollectionWidget.tsx | 4 +- .../Collection/SortableCollectionWidget.tsx | 6 +- lib/js/react-form/src/FormFieldErrors.tsx | 2 +- lib/js/react-form/src/FormHasErrorsAlert.tsx | 2 +- .../FieldTranslationsEditDialog.tsx | 6 +- .../src/Translations/TranslatedField.tsx | 2 +- .../src/Translations/TranslationsWidget.tsx | 14 +- lib/js/react-form/translations/de.json | 34 + lib/js/react-form/translations/en.json | 34 + lib/js/react-form/translations/es.json | 34 + lib/js/react-form/translations/fr.json | 34 + lib/js/react-form/translations/zh.json | 34 + lib/js/react-ps/package.json | 6 +- pnpm-lock.yaml | 1549 ++++++++++------- uploader/client/i18next-scanner.config.js | 82 - uploader/client/package.json | 13 +- uploader/client/src/components/AssetForm.jsx | 2 +- uploader/client/src/components/Menu.tsx | 4 +- uploader/client/src/i18n.ts | 8 + uploader/client/src/index.tsx | 2 +- .../client/src/locales/en/translation.json | 22 - .../client/src/locales/es/translation.json | 16 - .../client/src/locales/fr/translation.json | 22 - uploader/client/src/locales/i18n.js | 38 - uploader/client/src/locales/index.js | 5 - uploader/client/translations/de.json | 12 + uploader/client/translations/en.json | 12 + uploader/client/translations/es.json | 12 + uploader/client/translations/fr.json | 12 + uploader/client/translations/index.ts | 70 + uploader/client/translations/zh.json | 12 + 97 files changed, 4815 insertions(+), 1327 deletions(-) create mode 100755 bin/dev/translate.sh delete mode 100644 databox/client/i18next-scanner.config.js delete mode 100644 databox/client/src/locales/app.ts delete mode 100644 databox/client/src/locales/en_US/app.json delete mode 100644 databox/client/src/locales/fr_FR/app.json create mode 100644 databox/client/translations/de.json create mode 100644 databox/client/translations/en.json create mode 100644 databox/client/translations/es.json create mode 100644 databox/client/translations/fr.json create mode 100644 databox/client/translations/index.ts create mode 100644 databox/client/translations/zh.json delete mode 100644 expose/client/i18next-scanner.config.js create mode 100644 expose/client/src/i18n.ts delete mode 100644 expose/client/src/i18n/de/translation.json delete mode 100644 expose/client/src/i18n/en/translation.json delete mode 100644 expose/client/src/i18n/es/translation.json delete mode 100644 expose/client/src/i18n/fr/translation.json delete mode 100644 expose/client/src/i18n/i18n.js delete mode 100644 expose/client/src/i18n/index.js create mode 100644 expose/client/translations/de.json create mode 100644 expose/client/translations/en.json create mode 100644 expose/client/translations/es.json create mode 100644 expose/client/translations/fr.json create mode 100644 expose/client/translations/index.ts create mode 100644 expose/client/translations/zh.json create mode 100644 lib/js/api/translations/de.json create mode 100644 lib/js/api/translations/en.json create mode 100644 lib/js/api/translations/es.json create mode 100644 lib/js/api/translations/fr.json create mode 100644 lib/js/api/translations/zh.json create mode 100644 lib/js/i18n/i18next-scanner.config.js create mode 100644 lib/js/i18n/package.json create mode 100644 lib/js/i18n/src/index.ts create mode 100644 lib/js/navigation/translations/de.json create mode 100644 lib/js/navigation/translations/en.json create mode 100644 lib/js/navigation/translations/es.json create mode 100644 lib/js/navigation/translations/fr.json create mode 100644 lib/js/navigation/translations/zh.json create mode 100644 lib/js/phrasea-ui/translations/de.json create mode 100644 lib/js/phrasea-ui/translations/en.json create mode 100644 lib/js/phrasea-ui/translations/es.json create mode 100644 lib/js/phrasea-ui/translations/fr.json create mode 100644 lib/js/phrasea-ui/translations/zh.json create mode 100644 lib/js/react-auth/translations/de.json create mode 100644 lib/js/react-auth/translations/en.json create mode 100644 lib/js/react-auth/translations/es.json create mode 100644 lib/js/react-auth/translations/fr.json create mode 100644 lib/js/react-auth/translations/zh.json create mode 100644 lib/js/react-form/translations/de.json create mode 100644 lib/js/react-form/translations/en.json create mode 100644 lib/js/react-form/translations/es.json create mode 100644 lib/js/react-form/translations/fr.json create mode 100644 lib/js/react-form/translations/zh.json delete mode 100644 uploader/client/i18next-scanner.config.js create mode 100644 uploader/client/src/i18n.ts delete mode 100644 uploader/client/src/locales/en/translation.json delete mode 100644 uploader/client/src/locales/es/translation.json delete mode 100644 uploader/client/src/locales/fr/translation.json delete mode 100644 uploader/client/src/locales/i18n.js delete mode 100644 uploader/client/src/locales/index.js create mode 100644 uploader/client/translations/de.json create mode 100644 uploader/client/translations/en.json create mode 100644 uploader/client/translations/es.json create mode 100644 uploader/client/translations/fr.json create mode 100644 uploader/client/translations/index.ts create mode 100644 uploader/client/translations/zh.json diff --git a/bin/dev/translate.sh b/bin/dev/translate.sh new file mode 100755 index 000000000..0b51b7caa --- /dev/null +++ b/bin/dev/translate.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +. bin/vars.sh + +js=(${CLIENT_PROJECTS} ${JS_LIBS}) + +for a in "${js[@]}"; do + echo " $a:" + + (cd "$a" && grep -q "\"translate\":" package.json && pnpm translate) +done diff --git a/bin/vars.sh b/bin/vars.sh index d4ed80771..35bcd649b 100644 --- a/bin/vars.sh +++ b/bin/vars.sh @@ -31,3 +31,20 @@ lib/php/webhook-bundle lib/php/workflow lib/php/workflow-bundle " + +JS_LIBS=" +lib/js/api +lib/js/auth +lib/js/core +lib/js/i18n +lib/js/liform-react +lib/js/navigation +lib/js/phrasea-ui +lib/js/react-auth +lib/js/react-form +lib/js/react-hooks +lib/js/react-ps +lib/js/storage +lib/js/theme-editor +lib/js/visual-workflow +" diff --git a/dashboard/client/package.json b/dashboard/client/package.json index f04edee65..163999bdb 100644 --- a/dashboard/client/package.json +++ b/dashboard/client/package.json @@ -22,7 +22,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-google-font-loader": "^1.1.0", - "react-i18next": "^13.5.0", + "react-i18next": "^14.1.0", "vite-plugin-svgr": "^4.2.0" }, "devDependencies": { diff --git a/databox/client/i18next-scanner.config.js b/databox/client/i18next-scanner.config.js deleted file mode 100644 index 16a6ff8fc..000000000 --- a/databox/client/i18next-scanner.config.js +++ /dev/null @@ -1,82 +0,0 @@ -const fs = require('fs'); -const chalk = require('chalk'); -const {defaultLocale, locales} = require('./src/lib/locales'); - -module.exports = { - input: [ - './i18n-scan-tmp/**/*.{js,jsx}', - // Use ! to filter out files or directories - '!src/**/*.spec.{js,jsx,ts,tsx}', - '!**/node_modules/**', - ], - output: './', - options: { - debug: true, - func: { - list: ['t', 'i18next.t', 'i18n.t'], - extensions: ['.js', '.jsx'], - }, - trans: { - component: 'Trans', - i18nKey: 'i18nKey', - defaultsKey: 'defaults', - extensions: ['.js', '.jsx'], - fallbackKey: function (ns, value) { - return value; - }, - acorn: { - ecmaVersion: 2020, - sourceType: 'module', // defaults to 'module' - // Check out https://github.com/acornjs/acorn/tree/master/acorn#interface for additional options - }, - }, - lngs: locales, - ns: ['app'], - defaultLng: defaultLocale, - defaultNs: 'app', - defaultValue: '__STRING_NOT_TRANSLATED__', - resource: { - loadPath: 'src/locales/{{lng}}/{{ns}}.json', - savePath: 'src/locales/{{lng}}/{{ns}}.json', - jsonIndent: 2, - lineEnding: '\n', - }, - nsSeparator: ':', // namespace separator - keySeparator: '.', // key separator - interpolation: { - prefix: '{{', - suffix: '}}', - }, - }, - transform: function customTransform(file, enc, done) { - 'use strict'; - const parser = this.parser; - const content = fs.readFileSync(file.path, enc); - let count = 0; - - parser.parseFuncFromString( - content, - {list: ['i18next._', 'i18next.__']}, - (key, options) => { - parser.set( - key, - Object.assign({}, options, { - nsSeparator: ':', - keySeparator: '.', - }) - ); - ++count; - } - ); - - if (count > 0) { - console.log( - `i18next-scanner: count=${chalk.cyan( - count - )}, file=${chalk.yellow(JSON.stringify(file.relative))}` - ); - } - - done(); - }, -}; diff --git a/databox/client/package.json b/databox/client/package.json index 6649991fa..2a9115ddf 100644 --- a/databox/client/package.json +++ b/databox/client/package.json @@ -7,6 +7,7 @@ "@alchemy/auth": "workspace:*", "@alchemy/core": "workspace:*", "@alchemy/navigation": "workspace:*", + "@alchemy/i18n": "workspace:*", "@alchemy/phrasea-ui": "workspace:*", "@alchemy/react-auth": "workspace:*", "@alchemy/react-form": "workspace:*", @@ -35,8 +36,6 @@ "flag-icons": "^6.15.0", "formik": "^2.4.5", "formik-material-ui": "4.0.0-alpha.2", - "i18next": "^23.10.1", - "i18next-browser-languagedetector": "^6.1.8", "ismounted": "^0.1.8", "leaflet": "^1.9.4", "moment": "^2.30.1", @@ -49,7 +48,7 @@ "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", "react-hook-form": "^7.51.0", - "react-i18next": "^13.5.0", + "react-i18next": "^14.1.0", "react-leaflet": "^4.2.1", "react-nl2br": "^1.0.4", "react-pdf": "^7.7.1", @@ -71,7 +70,7 @@ "lint:fix": "eslint --fix src", "format": "prettier --ignore-path .gitignore --write \"**/*.+(js|ts|json|cjs|tsx|jsx)\"", "preview": "vite preview", - "i18n:scan": "mkdir -p ./i18n-scan-tmp && rm -rf ./i18n-scan-tmp && npx tsc --jsx preserve --target ES6 --module es2022 --noEmit false --outDir ./i18n-scan-tmp && npx i18next-scanner" + "translate": "i18next-scanner --config ../../lib/js/i18n/i18next-scanner.config.js" }, "devDependencies": { "@testing-library/jest-dom": "^6.4.2", @@ -94,11 +93,12 @@ "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", "eslint-plugin-unused-imports": "^3.1.0", - "i18next-scanner": "^3.3.0", "ts-jest": "^23.10.5", "typescript": "^5.4.2", "vite": "^5.1.6", "vite-plugin-checker": "^0.6.4", - "vite-plugin-svgr": "^4.2.0" + "vite-plugin-svgr": "^4.2.0", + "i18next-scanner": "^4.4.0", + "i18next-scanner-typescript": "^1.2.0" } } diff --git a/databox/client/src/i18n.ts b/databox/client/src/i18n.ts index b9fb85c76..643087c95 100644 --- a/databox/client/src/i18n.ts +++ b/databox/client/src/i18n.ts @@ -1,48 +1,8 @@ -import i18n, {ResourceLanguage} from 'i18next'; -import {initReactI18next} from 'react-i18next'; -import LanguageDetector from 'i18next-browser-languagedetector'; -import {defaultLocale, locales} from './lib/locales'; -import * as appLangs from './locales/app'; +import {createI18N, createNS} from '@alchemy/i18n'; +import * as appLangs from '../translations'; -const resources: {[language: string]: ResourceLanguage} = {}; - -function addNS(ns: string, r: {[language: string]: ResourceLanguage}): void { - locales.forEach(l => { - if (!resources[l]) { - resources[l] = {[ns]: r[l]}; - } else { - resources[l][ns] = r[l]; - } - }); -} - -addNS('app', appLangs); - -i18n.use(LanguageDetector) - .use(initReactI18next) - .init({ - defaultNS: 'app', - supportedLngs: locales, - fallbackLng: defaultLocale, - interpolation: { - escapeValue: false, // not needed for react as it escapes by default - }, - resources, - }); - -function normalizeHTMLLocale(l: string): string { - return l.replace(/_/g, '-'); -} - -function setHtmlLangAttr(l: string): void { - document.documentElement.setAttribute('lang', normalizeHTMLLocale(l)); -} - -function languageChanged(lng: string): void { - setHtmlLangAttr(lng); -} - -languageChanged(i18n.language); -i18n.on('languageChanged', languageChanged); +const i18n = createI18N({ + resources: createNS(appLangs), +}); export default i18n; diff --git a/databox/client/src/locales/app.ts b/databox/client/src/locales/app.ts deleted file mode 100644 index 40272f286..000000000 --- a/databox/client/src/locales/app.ts +++ /dev/null @@ -1,4 +0,0 @@ -import en_US from './en_US/app.json'; -import fr_FR from './fr_FR/app.json'; - -export {en_US, fr_FR}; diff --git a/databox/client/src/locales/en_US/app.json b/databox/client/src/locales/en_US/app.json deleted file mode 100644 index c66431b99..000000000 --- a/databox/client/src/locales/en_US/app.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "form": { - "asset": { - "name": "Edit {{name}}", - "title": { - "label": "Title" - } - }, - "collection": { - "name": "Edit {{name}}", - "title": { - "label": "Title" - } - }, - "file_upload": { - "uploaded": "Files uploaded!" - }, - "upload_asset": { - "title": { - "label": "Asset title" - } - }, - "has_errors": "Form contains errors", - "save": "Save", - "cancel_and_close": "Cancel and close", - "workspace": { - "name": { - "label": "Name" - } - } - }, - "menu": { - "sign_in": "Sign in", - "logout": "Logout" - } -} diff --git a/databox/client/src/locales/fr_FR/app.json b/databox/client/src/locales/fr_FR/app.json deleted file mode 100644 index 01472dec9..000000000 --- a/databox/client/src/locales/fr_FR/app.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "form": { - "asset": { - "name": "Edit {{name}}", - "title": { - "label": "Title" - } - }, - "collection": { - "name": "Edit {{name}}", - "title": { - "label": "Title" - } - }, - "file_upload": { - "uploaded": "Files uploaded!" - }, - "upload_asset": { - "title": { - "label": "Asset title" - } - }, - "has_errors": "Form contains errors", - "save": "Save", - "cancel_and_close": "Cancel and close", - "workspace": { - "name": { - "label": "Name" - } - } - }, - "menu": { - "sign_in": "S'identifier", - "logout": "Déconnexion" - } -} diff --git a/databox/client/src/store/basketStore.ts b/databox/client/src/store/basketStore.ts index 92a407995..d4865310c 100644 --- a/databox/client/src/store/basketStore.ts +++ b/databox/client/src/store/basketStore.ts @@ -59,7 +59,6 @@ export const useBasketStore = create((set, getState) => ({ }, hasMore() { - console.log('!!getState().nextUrl', !!getState().nextUrl); return !!getState().nextUrl; }, diff --git a/databox/client/translations/de.json b/databox/client/translations/de.json new file mode 100644 index 000000000..b35a8a6b2 --- /dev/null +++ b/databox/client/translations/de.json @@ -0,0 +1,562 @@ +{ + "acl": { + "delete": "Löschen", + "form": { + "group_select": { + "placeholder": "Benutzer auswählen" + }, + "user_select": { + "placeholder": "Gruppe auswählen" + } + }, + "table": { + "cols": { + "user_group": "Benutzer/Gruppe" + } + } + }, + "asset": { + "delete": { + "confirm": { + "message_many": "Möchten Sie wirklich {{count}} Assets löschen?", + "message_many_plural": "Möchten Sie wirklich {{count}} Assets löschen?", + "message_one": "Möchten Sie dieses Asset wirklich löschen?", + "title": "Löschen bestätigen" + } + }, + "manage": { + "acl": { + "title": "Berechtigungen", + "versions": "Versionen" + }, + "attributes": { + "title": "Attribute" + }, + "edit": { + "title": "Bearbeiten" + }, + "info": { + "title": "Info" + }, + "operations": { + "title": "Operationen" + }, + "renditions": { + "title": "Renditions" + }, + "title": "Asset verwalten {{name}}" + } + }, + "asset_actions": { + "copy": "Kopieren", + "delete": "Löschen", + "edit": "Bearbeiten", + "edit_attributes": "Attribute bearbeiten", + "export": "Exportieren", + "move": "Verschieben", + "select_all": "Alle auswählen", + "share": "Teilen", + "unselect_all": "Alle abwählen" + }, + "attribute_class": { + "new": { + "label": "Neue Klasse" + } + }, + "attribute_definitions": { + "new": { + "label": "Neues Attribut" + } + }, + "basket": { + "choose_modal": { + "title": "Aktuellen Korb auswählen" + }, + "create_button": { + "label": "Neuen Korb erstellen" + }, + "default": { + "title": "Mein Korb" + }, + "item": { + "edit": "Diesen Korb bearbeiten" + }, + "manage": { + "acl": { + "title": "Berechtigungen" + }, + "edit": { + "title": "Bearbeiten" + }, + "info": { + "title": "Info" + }, + "title": "Korb verwalten {{name}}" + } + }, + "basket_delete": { + "title": { + "confirm": "Möchten Sie diesen Korb wirklich löschen?" + } + }, + "change_theme": { + "save": "Speichern", + "title": "Thema wählen" + }, + "chip": { + "editable": "Bearbeitbar", + "private": "Privat", + "public": "Öffentlich", + "read_only": "Nur lesen" + }, + "collection": { + "item": { + "create_asset": "Neues Asset zur Sammlung hinzufügen", + "create_collection": "In dieser Sammlung neue Sammlung erstellen", + "edit": "Diese Sammlung bearbeiten" + }, + "manage": { + "acl": { + "title": "Berechtigungen" + }, + "edit": { + "title": "Bearbeiten" + }, + "info": { + "title": "Info" + }, + "operations": { + "title": "Operationen" + }, + "tag_rules": { + "title": "Tag-Regeln" + }, + "title": "Sammlung verwalten {{name}}" + } + }, + "collection_delete": { + "title": { + "confirm": "Möchten Sie diese Sammlung wirklich löschen?" + } + }, + "collection_move": { + "intro": "Wählen Sie das Ziel aus, wohin diese Sammlung verschoben werden soll:", + "title": "Sammlung verschieben" + }, + "common": { + "delete": "Löschen", + "item_sorted": "Reihenfolge gespeichert!", + "loading": "Laden...", + "search": { + "placeholder": "Suchen...", + "submit": "Suchen" + } + }, + "copy_assets": { + "dialog": { + "intro": "Wohin möchten Sie die ausgewählten Assets kopieren?", + "submit": "Kopieren", + "title": "{{count}} Assets kopieren", + "title_plural": "{{count}} Assets kopieren" + }, + "form": { + "by_reference": { + "label": "Durch Verweis kopieren (Verknüpfung)" + }, + "with_attributes": { + "label": "Attribute kopieren" + }, + "with_tags": { + "label": "Tags kopieren" + } + } + }, + "copy_toclipboard": { + "copied": "In die Zwischenablage kopiert!" + }, + "danger_zone": "Gefahrenzone", + "definition_manager": { + "confirm_delete": "Möchten Sie diesen Eintrag wirklich löschen?", + "saved": "Definition gespeichert!" + }, + "delete": { + "basket": { + "confirmed": "Der Korb wurde entfernt!" + }, + "collection": { + "confirmed": "Die Sammlung wurde entfernt!" + } + }, + "dialog": { + "apply": "Anwenden", + "cancel": "Abbrechen", + "close": "Schließen", + "confirm": "Bestätigen", + "confirm_text_type": { + "default": "Bestätigen", + "intro": "Bitte geben Sie \"{{ text }}\" ein, um zu bestätigen:", + "placeholder": "\"{{ text }}\" eingeben" + }, + "reset": "Zurücksetzen", + "save": "Speichern" + }, + "export": { + "dialog": { + "intro": "Wählen Sie die Versionen aus, die Sie exportieren möchten:", + "submit": "Exportieren", + "title": "{{count}} Assets exportieren", + "title_plural": "{{count}} Assets exportieren" + } + }, + "filter_rule": { + "exclude": { + "helper": "Assets in diesem {{type}} sind nur sichtbar, wenn sie diese Tags NICHT enthalten." + }, + "group": "Gruppe", + "include": { + "helper": "Assets in diesem {{type}} sind nur sichtbar, wenn sie diese Tags enthalten." + }, + "user": "Benutzer" + }, + "form": { + "asset": { + "tags": { + "label": "Tags" + + + }, + "templates": { + "label": "Mit Vorlage ausfüllen" + }, + "title": { + "label": "Titel" + } + }, + "asset_create": { + "title": "Asset erstellen in", + "title_with_parent": "Asset unter" + }, + "asset_edit": { + "success": "Asset bearbeitet!" + }, + "attribute": { + "collection": { + "item_add": "{{name}} hinzufügen", + "item_remove": "Entfernen" + } + }, + "attribute_class": { + "editable": { + "label": "Bearbeitbar" + }, + "name": { + "label": "Name" + }, + "public": { + "label": "Öffentlich" + } + }, + "attribute_definition": { + "allowInvalid": { + "label": "Ungültige Werte zulassen" + }, + "class": { + "label": "Klasse" + }, + "field_type": { + "label": "Feldtyp" + }, + "multiple": { + "label": "Mehrere Werte" + }, + "name": { + "label": "Name" + }, + "searchable": { + "label": "Durchsuchbar" + }, + "slug": { + "label": "Slug" + }, + "suggest": { + "label": "In Suchvorschlägen anzeigen" + }, + "translatable": { + "label": "Übersetzbar" + } + }, + "basket": { + "description": { + "label": "Beschreibung" + }, + "title": { + "label": "Titel" + } + }, + "basket_create": { + "success": "Korb erstellt!", + "title": "Korb erstellen" + }, + "basket_edit": { + "success": "Korb bearbeitet!" + }, + "collection": { + "title": { + "label": "Titel" + } + }, + "collection_create": { + "success": "Sammlung erstellt!", + "title": "Sammlung erstellen in", + "title_with_parent": "Sammlung unter" + }, + "collection_edit": { + "success": "Sammlung bearbeitet!" + }, + "collection_move": { + "success": "Sammlung verschoben!" + }, + "copy_assets": { + "asset_not_linkable": { + "other_ws": "Die folgenden Assets können nicht als Verweis in einem anderen Arbeitsbereich kopiert werden.", + "permission": "Die folgenden Assets können nicht als Verweis kopiert werden, da Ihnen die Berechtigung fehlt.", + "select_for_hard_copy": "Sie können das Asset auswählen, das Sie duplizieren möchten (Hardcopy):" + }, + "destination": { + "label": "Ziel" + } + }, + "move_assets": { + "destination": { + "label": "Ziel" + } + }, + "permissions": { + "label": "Berechtigungen" + }, + "privacy": { + "label": "Datenschutz" + }, + "profile": { + "firstName": { + "translate": { + "title": "Tag übersetzen" + } + } + }, + "rendition_class": { + "name": { + "label": "Name" + }, + "public": { + "label": "Öffentlich" + } + }, + "rendition_definition": { + "class": { + "label": "Klasse" + }, + "name": { + "label": "Name" + }, + "pickSourceFile": { + "label": "Quelldatei auswählen" + }, + "useAsOriginal": { + "label": "Als Original verwenden" + }, + "useAsPreview": { + "label": "Als Vorschau verwenden" + }, + "useAsThumbnail": { + "label": "Als Thumbnail verwenden" + }, + "useAsThumbnailActive": { + "label": "Als aktives Thumbnail verwenden" + } + }, + "save_as": { + "destination": { + "label": "Ziel" + } + }, + "tag": { + "color": { + "label": "Farbe" + }, + "name": { + "label": "Name" + } + }, + "upload": { + "destination": { + "label": "Ziel" + }, + "submit": { + "title": "Hochladen" + }, + "success": "Dateien hochgeladen!", + "title": { + "label": "Titel" + } + }, + "workspace": { + "fallback_locales": { + "add": "Fallback-Sprache hinzufügen", + "label": "Sprache", + "title": "Fallback-Sprachen" + }, + "locales": { + "add": "Sprache hinzufügen", + "label": "Sprache", + "placeholder": "z.B. de oder de-DE", + "title": "Arbeitsbereich-Sprachen" + }, + "public": { + "label": "Öffentlich" + }, + "title": { + "label": "Titel" + } + }, + "workspace_edit": { + "success": "Arbeitsbereich bearbeitet!" + } + }, + "layout": { + "options": { + "collections_count": { + "label": "Sammlungen" + }, + "display_collections": { + "label": "Sammlungen anzeigen" + }, + "display_previews_hover": { + "label": "Vorschau bei Hover anzeigen" + }, + "display_tags": { + "label": "Tags anzeigen" + }, + "display_title": { + "label": "Titel anzeigen" + }, + "more": "Weitere Optionen", + "play_preview_videos": { + "label": "Videovorschauen automatisch abspielen" + }, + "tags_count": { + "label": "Tags" + }, + "thumb_size": { + "label": "Thumbnail-Größe" + }, + "title_rows": { + "label": "Reihen" + } + }, + "previews_locked": "Vorschauen gesperrt", + "previews_unlocked": "Vorschauen entsperrt", + "view": { + "grid": "Rasteransicht", + "list": "Listenansicht", + "masonry": "Maueransicht" + } + }, + "load_more": { + "button": { + "loading": "Laden..." + } + }, + "menu": { + "change_theme": "Thema ändern", + "sign_in": "Anmelden", + "theme_editor": "Thema-Editor" + }, + "modal": { + "close": "Schließen" + }, + "move_assets": { + "dialog": { + + + "intro": "Wohin möchten Sie die ausgewählten Assets verschieben?", + "submit": "Verschieben", + "title": "{{count}} Assets verschieben", + "title_plural": "{{count}} Assets verschieben" + } + }, + "not_found": { + "back_home": "Zurück zur Startseite", + "content": "Die von Ihnen gesuchte Seite existiert nicht oder wurde entfernt", + "title": "Seite nicht gefunden" + }, + "privacy": { + "no_access": "Kein Zugriff", + "private": "Privat", + "private_in_workspace": "Privat im Arbeitsbereich", + "public": "Öffentlich", + "public_for_users": "Öffentlich für Benutzer", + "public_in_workspace": "Öffentlich im Arbeitsbereich", + "secret": "Geheim" + }, + "rendition_class": { + "new": { + "label": "Neue Klasse" + } + }, + "rendition_definitions": { + "new": { + "label": "Neue Rendition" + } + }, + "renditions": { + "download": "Herunterladen" + }, + "search": { + "search_button": "Suchen", + "sort_by": { + "title": "Sortieren nach" + } + }, + "tags": { + "new": { + "label": "Neuer Tag" + } + }, + "workspace": { + "item": { + "create_collection": "Sammlung in diesem Arbeitsbereich hinzufügen", + "edit": "Diesen Arbeitsbereich bearbeiten" + }, + "manage": { + "acl": { + "title": "Berechtigungen" + }, + "attribute_class": { + "title": "Attribut-Klassen" + }, + "attribute_definitions": { + "title": "Attribute" + }, + "edit": { + "title": "Bearbeiten" + }, + "info": { + "title": "Info" + }, + "rendition_class": { + "title": "Rendition-Klassen" + }, + "rendition_definition": { + "title": "Renditions" + }, + "tag_rules": { + "title": "Tag-Regeln" + }, + "tags": { + "title": "Tags" + }, + "title": "Arbeitsbereich verwalten {{name}}" + } + } +} diff --git a/databox/client/translations/en.json b/databox/client/translations/en.json new file mode 100644 index 000000000..d3b8e376f --- /dev/null +++ b/databox/client/translations/en.json @@ -0,0 +1,558 @@ +{ + "acl": { + "delete": "Delete", + "form": { + "group_select": { + "placeholder": "Select user" + }, + "user_select": { + "placeholder": "Select group" + } + }, + "table": { + "cols": { + "user_group": "User/Group" + } + } + }, + "asset": { + "delete": { + "confirm": { + "message_many": "Are you sure you want to delete {{count}} assets?", + "message_many_plural": "Are you sure you want to delete {{count}} assets?", + "message_one": "Are you sure you want to delete this asset?", + "title": "Confirm delete" + } + }, + "manage": { + "acl": { + "title": "Permissions", + "versions": "Versions" + }, + "attributes": { + "title": "Attributes" + }, + "edit": { + "title": "Edit" + }, + "info": { + "title": "Info" + }, + "operations": { + "title": "Operations" + }, + "renditions": { + "title": "Renditions" + }, + "title": "Manage asset {{name}}" + } + }, + "asset_actions": { + "copy": "Copy", + "delete": "Delete", + "edit": "Edit", + "edit_attributes": "Edit attributes", + "export": "Export", + "move": "Move", + "select_all": "Select all", + "share": "Share", + "unselect_all": "Unselect all" + }, + "attribute_class": { + "new": { + "label": "New class" + } + }, + "attribute_definitions": { + "new": { + "label": "New attribute" + } + }, + "basket": { + "choose_modal": { + "title": "Select current Basket" + }, + "create_button": { + "label": "Create new Basket" + }, + "default": { + "title": "My Basket" + }, + "item": { + "edit": "Edit this basket" + }, + "manage": { + "acl": { + "title": "Permissions" + }, + "edit": { + "title": "Edit" + }, + "info": { + "title": "Info" + }, + "title": "Manage basket {{name}}" + } + }, + "basket_delete": { + "title": { + "confirm": "Are you sure you want to delete this basket?" + } + }, + "change_theme": { + "save": "Save", + "title": "Choose a theme" + }, + "chip": { + "editable": "Editable", + "private": "Private", + "public": "Public", + "read_only": "Read only" + }, + "collection": { + "item": { + "create_asset": "Add new asset to collection", + "create_collection": "Create new collection in this one", + "edit": "Edit this collection" + }, + "manage": { + "acl": { + "title": "Permissions" + }, + "edit": { + "title": "Edit" + }, + "info": { + "title": "Info" + }, + "operations": { + "title": "Operations" + }, + "tag_rules": { + "title": "Tag rules" + }, + "title": "Manage collection {{name}}" + } + }, + "collection_delete": { + "title": { + "confirm": "Are you sure you want to delete this collection?" + } + }, + "collection_move": { + "intro": "Select the destination where to move this collection:", + "title": "Move collection" + }, + "common": { + "delete": "Delete", + "item_sorted": "Order saved!", + "loading": "Loading...", + "search": { + "placeholder": "Search...", + "submit": "Search" + } + }, + "copy_assets": { + "dialog": { + "intro": "Where do you want to copy the selected assets?", + "submit": "Copy", + "title": "Copy {{count}} assets", + "title_plural": "Copy {{count}} assets" + }, + "form": { + "by_reference": { + "label": "Copy by reference (shortcut)" + }, + "with_attributes": { + "label": "Copy attributes" + }, + "with_tags": { + "label": "Copy tags" + } + } + }, + "copy_toclipboard": { + "copied": "Copied to clipboard!" + }, + "danger_zone": "Danger zone", + "definition_manager": { + "confirm_delete": "Are you sure you want to delete this item?", + "saved": "Definition saved!" + }, + "delete": { + "basket": { + "confirmed": "Basket has been removed!" + }, + "collection": { + "confirmed": "Collection has been removed!" + } + }, + "dialog": { + "apply": "Apply", + "cancel": "Cancel", + "close": "Close", + "confirm": "Confirm", + "confirm_text_type": { + "default": "Confirm", + "intro": "Please type \"{{ text }}\" to confirm:", + "placeholder": "Type \"{{ text }}\"" + }, + "reset": "Reset", + "save": "Save" + }, + "export": { + "dialog": { + "intro": "Select the renditions you want to export:", + "submit": "Export", + "title": "Export {{count}} assets", + "title_plural": "Export {{count}} assets" + } + }, + "filter_rule": { + "exclude": { + "helper": "Assets in this {{type}} will only be visible if they DOES NOT contains theses tags." + }, + "group": "Group", + "include": { + "helper": "Assets in this {{type}} will only be visible if they contains theses tags." + }, + "user": "User" + }, + "form": { + "asset": { + "tags": { + "label": "Tags" + }, + "templates": { + "label": "Fill with template" + }, + "title": { + "label": "Title" + } + }, + "asset_create": { + "title": "Create asset in", + "title_with_parent": "Create asset under" + }, + "asset_edit": { + "success": "Asset edited!" + }, + "attribute": { + "collection": { + "item_add": "Add {{name}}", + "item_remove": "Remove" + } + }, + "attribute_class": { + "editable": { + "label": "Editable" + }, + "name": { + "label": "Name" + }, + "public": { + "label": "Public" + } + }, + "attribute_definition": { + "allowInvalid": { + "label": "Allow invalid values" + }, + "class": { + "label": "Class" + }, + "field_type": { + "label": "Field type" + }, + "multiple": { + "label": "Multiple values" + }, + "name": { + "label": "Name" + }, + "searchable": { + "label": "Searchable" + }, + "slug": { + "label": "Slug" + }, + "suggest": { + "label": "Display in search suggestions" + }, + "translatable": { + "label": "Translatable" + } + }, + "basket": { + "description": { + "label": "Description" + }, + "title": { + "label": "Title" + } + }, + "basket_create": { + "success": "Basket created!", + "title": "Create Basket" + }, + "basket_edit": { + "success": "Basket edited!" + }, + "collection": { + "title": { + "label": "Title" + } + }, + "collection_create": { + "success": "Collection created!", + "title": "Create collection in", + "title_with_parent": "Create collection under" + }, + "collection_edit": { + "success": "Collection edited!" + }, + "collection_move": { + "success": "Collection moved!" + }, + "copy_assets": { + "asset_not_linkable": { + "other_ws": "The following assets cannot be copied by reference in another workspace.", + "permission": "The following assets cannot be copied by reference because you don't have sufficient permission.", + "select_for_hard_copy": "You can select the asset you want to duplicate to the destination (hard copy):" + }, + "destination": { + "label": "Destination" + } + }, + "move_assets": { + "destination": { + "label": "Destination" + } + }, + "permissions": { + "label": "Permissions" + }, + "privacy": { + "label": "Privacy" + }, + "profile": { + "firstName": { + "translate": { + "title": "Translate Tag" + } + } + }, + "rendition_class": { + "name": { + "label": "Name" + }, + "public": { + "label": "Public" + } + }, + "rendition_definition": { + "class": { + "label": "Class" + }, + "name": { + "label": "Name" + }, + "pickSourceFile": { + "label": "Pick source file" + }, + "useAsOriginal": { + "label": "Use as original" + }, + "useAsPreview": { + "label": "Use as preview" + }, + "useAsThumbnail": { + "label": "Use as thumbnail" + }, + "useAsThumbnailActive": { + "label": "Use as active thumbnail" + } + }, + "save_as": { + "destination": { + "label": "Destination" + } + }, + "tag": { + "color": { + "label": "Color" + }, + "name": { + "label": "Name" + } + }, + "upload": { + "destination": { + "label": "Destination" + }, + "submit": { + "title": "Upload" + }, + "success": "Files uploaded!", + "title": { + "label": "Title" + } + }, + "workspace": { + "fallback_locales": { + "add": "Add fallback locale", + "label": "Locale", + "title": "Fallbacks locales" + }, + "locales": { + "add": "Add locale", + "label": "Locale", + "placeholder": "e.g. fr or fr-FR", + "title": "Workspace locales" + }, + "public": { + "label": "Public" + }, + "title": { + "label": "Title" + } + }, + "workspace_edit": { + "success": "Workspace edited!" + } + }, + "layout": { + "options": { + "collections_count": { + "label": "collections" + }, + "display_collections": { + "label": "Display collections" + }, + "display_previews_hover": { + "label": "Display preview on hover" + }, + "display_tags": { + "label": "Display tags" + }, + "display_title": { + "label": "Display title" + }, + "more": "More options", + "play_preview_videos": { + "label": "Auto play video previews" + }, + "tags_count": { + "label": "tags" + }, + "thumb_size": { + "label": "Thumbnail size" + }, + "title_rows": { + "label": "rows" + } + }, + "previews_locked": "Previews locked", + "previews_unlocked": "Previews unlocked", + "view": { + "grid": "Grid View", + "list": "List View", + "masonry": "Masonry View" + } + }, + "load_more": { + "button": { + "loading": "Loading..." + } + }, + "menu": { + "change_theme": "Change theme", + "sign_in": "Sign in", + "theme_editor": "Theme Editor" + }, + "modal": { + "close": "Close" + }, + "move_assets": { + "dialog": { + "intro": "Where do you want to move the selected assets?", + "submit": "Move", + "title": "Move {{count}} assets", + "title_plural": "Move {{count}} assets" + } + }, + "not_found": { + "back_home": "Back home", + "content": "The page you are looking does not exist or has been removed", + "title": "Page not found" + }, + "privacy": { + "no_access": "No Access", + "private": "Private", + "private_in_workspace": "Private in workspace", + "public": "Public", + "public_for_users": "Public for users", + "public_in_workspace": "Public in workspace", + "secret": "Secret" + }, + "rendition_class": { + "new": { + "label": "New class" + } + }, + "rendition_definitions": { + "new": { + "label": "New rendition" + } + }, + "renditions": { + "download": "Download" + }, + "search": { + "search_button": "Search", + "sort_by": { + "title": "Sort by" + } + }, + "tags": { + "new": { + "label": "New tag" + } + }, + "workspace": { + "item": { + "create_collection": "Add collection in this workspace", + "edit": "Edit this workspace" + }, + "manage": { + "acl": { + "title": "Permissions" + }, + "attribute_class": { + "title": "Attribute classes" + }, + "attribute_definitions": { + "title": "Attributes" + }, + "edit": { + "title": "Edit" + }, + "info": { + "title": "Info" + }, + "rendition_class": { + "title": "Rendition classes" + }, + "rendition_definition": { + "title": "Renditions" + }, + "tag_rules": { + "title": "Tag rules" + }, + "tags": { + "title": "Tags" + }, + "title": "Manage workspace {{name}}" + } + } +} diff --git a/databox/client/translations/es.json b/databox/client/translations/es.json new file mode 100644 index 000000000..b2cfe0515 --- /dev/null +++ b/databox/client/translations/es.json @@ -0,0 +1,560 @@ +{ + "acl": { + "delete": "Eliminar", + "form": { + "group_select": { + "placeholder": "Seleccionar usuario" + }, + "user_select": { + "placeholder": "Seleccionar grupo" + } + }, + "table": { + "cols": { + "user_group": "Usuario/Grupo" + } + } + }, + "asset": { + "delete": { + "confirm": { + "message_many": "¿Estás seguro de que deseas eliminar {{count}} activos?", + "message_many_plural": "¿Estás seguro de que deseas eliminar {{count}} activos?", + "message_one": "¿Estás seguro de que deseas eliminar este activo?", + "title": "Confirmar eliminación" + } + }, + "manage": { + "acl": { + "title": "Permisos", + "versions": "Versiones" + }, + "attributes": { + "title": "Atributos" + }, + "edit": { + "title": "Editar" + }, + "info": { + "title": "Información" + }, + "operations": { + "title": "Operaciones" + }, + "renditions": { + "title": "Rendiciones" + }, + "title": "Administrar activo {{name}}" + } + }, + "asset_actions": { + "copy": "Copiar", + "delete": "Eliminar", + "edit": "Editar", + "edit_attributes": "Editar atributos", + "export": "Exportar", + "move": "Mover", + "select_all": "Seleccionar todo", + "share": "Compartir", + "unselect_all": "Anular selección de todo" + }, + "attribute_class": { + "new": { + "label": "Nueva clase" + } + }, + "attribute_definitions": { + "new": { + "label": "Nuevo atributo" + } + }, + "basket": { + "choose_modal": { + "title": "Seleccionar Cesta actual" + }, + "create_button": { + "label": "Crear nueva Cesta" + }, + "default": { + "title": "Mi Cesta" + }, + "item": { + "edit": "Editar esta cesta" + }, + "manage": { + "acl": { + "title": "Permisos" + }, + "edit": { + "title": "Editar" + }, + "info": { + "title": "Información" + }, + "title": "Administrar cesta {{name}}" + } + }, + "basket_delete": { + "title": { + "confirm": "¿Estás seguro de que deseas eliminar esta cesta?" + } + }, + "change_theme": { + "save": "Guardar", + "title": "Elegir un tema" + }, + "chip": { + "editable": "Editable", + "private": "Privado", + "public": "Público", + "read_only": "Solo lectura" + }, + "collection": { + "item": { + "create_asset": "Agregar nuevo activo a la colección", + "create_collection": "Crear nueva colección en esta", + "edit": "Editar esta colección" + }, + "manage": { + "acl": { + "title": "Permisos" + }, + "edit": { + "title": "Editar" + }, + "info": { + "title": "Información" + }, + "operations": { + "title": "Operaciones" + }, + "tag_rules": { + "title": "Reglas de etiquetas" + }, + "title": "Administrar colección {{name}}" + } + }, + "collection_delete": { + "title": { + "confirm": "¿Estás seguro de que deseas eliminar esta colección?" + } + }, + "collection_move": { + "intro": "Selecciona el destino donde mover esta colección:", + "title": "Mover colección" + }, + "common": { + "delete": "Eliminar", + "item_sorted": "¡Orden guardado!", + "loading": "Cargando...", + "search": { + "placeholder": "Buscar...", + "submit": "Buscar" + } + }, + "copy_assets": { + "dialog": { + "intro": "¿Dónde quieres copiar los activos seleccionados?", + "submit": "Copiar", + "title": "Copiar {{count}} activos", + "title_plural": "Copiar {{count}} activos" + }, + "form": { + "by_reference": { + "label": "Copiar por referencia (acceso directo)" + }, + "with_attributes": { + "label": "Copiar atributos" + }, + "with_tags": { + "label": "Copiar etiquetas" + } + } + }, + "copy_toclipboard": { + "copied": "¡Copiado al portapapeles!" + }, + "danger_zone": "Zona de peligro", + "definition_manager": { + "confirm_delete": "¿Estás seguro de que deseas eliminar este ítem?", + "saved": "¡Definición guardada!" + }, + "delete": { + "basket": { + "confirmed": "¡La Cesta ha sido eliminada!" + }, + "collection": { + "confirmed": "¡La Colección ha sido eliminada!" + } + }, + "dialog": { + "apply": "Aplicar", + "cancel": "Cancelar", + "close": "Cerrar", + "confirm": "Confirmar", + "confirm_text_type": { + "default": "Confirmar", + "intro": "Por favor, escribe \"{{ text }}\" para confirmar:", + "placeholder": "Escribe \"{{ text }}\"" + }, + "reset": "Restablecer", + "save": "Guardar" + }, + "export": { + "dialog": { + "intro": "Selecciona las rendiciones que deseas exportar:", + "submit": "Exportar", + "title": "Exportar {{count}} activos", + "title_plural": "Exportar {{count}} activos" + } + }, + "filter_rule": { + "exclude": { + "helper": "Los activos en esta {{type}} solo serán visibles si NO contienen estas etiquetas." + }, + "group": "Grupo", + "include": { + "helper": "Los activos en esta {{type}} solo serán visibles si contienen estas etiquetas." + }, + "user": "Usuario" + }, + "form": { + "asset": { + "tags": { + "label": "Etiquetas" + }, + "templates": { + "label": "Llenar con plantilla" + }, + "title": { + "label": "Título" + } + }, + "asset_create": { + "title": "Crear activo", + "title_with_parent": "Crear activo bajo" + }, + "asset_edit": { + "success": "¡Activo editado!" + }, + "attribute": { + "collection": { + "item_add": "Agregar {{name}}", + "item_remove": "Eliminar" + } + }, + "attribute_class": { + "editable": { + "label": "Editable" + }, + "name": { + "label": "Nombre" + }, + "public": { + "label": "Público" + } + }, + "attribute_definition": { + "allowInvalid": { + "label": "Permitir valores no válidos" + }, + "class": { + "label": "Clase" + }, + "field_type": { + "label": "Tipo de campo" + }, + "multiple": { + "label": "Valores múltiples" + }, + "name": { + "label": "Nombre" + }, + "searchable": { + "label": "Búsqueda" + }, + "slug": { + "label": "Slug" + }, + "suggest": { + "label": "Mostrar en sugerencias de búsqueda" + }, + "translatable": { + "label": "Traducible" + } + }, + "basket": { + "description": { + "label": "Descripción" + }, + "title": { + "label": "Título" + } + }, + "basket_create": { + "success": "¡Cesta creada!", + "title": "Crear Cesta" + }, + "basket_edit": { + "success": "¡Cesta editada!" + }, + "collection": { + "title": { + "label": "Título" + } + }, + "collection_create": { + "success": "¡Colección creada!", + "title": "Crear colección en", + "title_with_parent": "Crear colección bajo" + }, + "collection_edit": { + "success": "¡Colección editada!" + }, + "collection_move": { + "success": "¡Colección movida!" + }, + "copy_assets": { + "asset_not_linkable": { + "other_ws": "Los siguientes activos no se pueden copiar por referencia en otro espacio de trabajo.", + "permission": "Los siguientes activos no se pueden copiar por referencia porque no tienes permisos suficientes.", + "select_for_hard_copy": "Puedes seleccionar el activo que deseas duplicar en el destino (copia física):" + }, + "destination": { + "label": "Destino" + } + }, + "move_assets": { + "destination": { + "label": "Destino" + } + }, + "permissions": { + "label": "Permisos" + }, + "privacy": { + "label": "Privacidad" + }, + "profile": { + "firstName": { + "translate": { + "title": "Traducir Etiqueta" + } + } + }, + "rendition_class": { + "name": { + "label": "Nombre" + }, + "public": { + "label": "Público" + } + }, + "rendition_definition": { + "class": { + "label": "Clase" + }, + "name": { + "label": "Nombre" + }, + "pickSourceFile": { + "label": "Seleccionar archivo fuente" + }, + "useAsOriginal": { + "label": "Usar como original" + }, + "useAsPreview": { + "label": "Usar como vista previa" + }, + "useAsThumbnail": { + "label": "Usar como miniatura" + }, + "useAsThumbnailActive": { + "label": "Usar como miniatura activa" + } + }, + "save_as": { + "destination": { + "label": "Destino" + } + }, + "tag": { + "color": { + "label": "Color" + }, + "name": { + "label": "Nombre" + } + }, + "upload": { + "destination": { + "label": "Destino" + }, + "submit": { + "title": "Subir" + }, + "success": "¡Archivos subidos!", + "title": { + "label": "Título" + } + }, + "workspace": { + "fallback_locales": { + "add": "Agregar idioma de respaldo", + "label": "Idioma", + "title": "Idiomas de respaldo" + }, + "locales": { + "add": "Agregar idioma", + "label": "Idioma", + "placeholder": "p. ej., es o es-ES", + "title": "Idiomas del espacio de trabajo" + }, + "public": { + "label": "Público" + }, + "title": { + "label": "Título" + } + }, + "workspace_edit": { + "success": "¡Espacio de trabajo editado!" + } + }, + "layout": { + "options": { + "collections_count": { + "label": "colecciones" + }, + "display_collections": { + "label": "Mostrar colecciones" + }, + "display_previews_hover": { + "label": "Mostrar vista previa al pasar el mouse" + }, + "display_tags": { + "label": "Mostrar etiquetas" + }, + "display_title": { + "label": "Mostrar título" + }, + "more": "Más opciones", + "play_preview_videos": { + "label": "Reproducir automáticamente vistas previas de video" + }, + "tags_count": { + "label": "etiquetas" + }, + "thumb_size": { + "label": "Tamaño de la miniatura" + }, + "title_rows": { + "label": "filas" + } + }, + "previews_locked": "Vistas previas bloqueadas", + "previews_unlocked": "Vistas previas desbloqueadas", + "view": { + "grid": "Vista de cuadrícula", + "list": "Vista de lista", + "masonry": "Vista de mampostería" + } + }, + "load_more": { + "button": { + "loading": "Cargando..." + } + }, + "menu": { + "change_theme": "Cambiar tema", + "sign_in": "Iniciar sesión", + "theme_editor": "Editor de temas" + }, + "modal": { + "close": "Cerrar" + }, + "move_assets": { + "dialog": { + "intro": "¿Dónde quieres mover los activos seleccionados?", + "submit": "Mover", + "title": "Mover {{count}} activos", + "title_plural": "Mover {{count}} activos" + } + }, + "not_found": + + { + "back_home": "Volver a inicio", + "content": "La página que buscas no existe o ha sido eliminada", + "title": "Página no encontrada" + }, + "privacy": { + "no_access": "Sin acceso", + "private": "Privado", + "private_in_workspace": "Privado en espacio de trabajo", + "public": "Público", + "public_for_users": "Público para usuarios", + "public_in_workspace": "Público en espacio de trabajo", + "secret": "Secreto" + }, + "rendition_class": { + "new": { + "label": "Nueva clase" + } + }, + "rendition_definitions": { + "new": { + "label": "Nueva rendición" + } + }, + "renditions": { + "download": "Descargar" + }, + "search": { + "search_button": "Buscar", + "sort_by": { + "title": "Ordenar por" + } + }, + "tags": { + "new": { + "label": "Nueva etiqueta" + } + }, + "workspace": { + "item": { + "create_collection": "Agregar colección en este espacio de trabajo", + "edit": "Editar este espacio de trabajo" + }, + "manage": { + "acl": { + "title": "Permisos" + }, + "attribute_class": { + "title": "Clases de atributos" + }, + "attribute_definitions": { + "title": "Atributos" + }, + "edit": { + "title": "Editar" + }, + "info": { + "title": "Información" + }, + "rendition_class": { + "title": "Clases de rendición" + }, + "rendition_definition": { + "title": "Rendiciones" + }, + "tag_rules": { + "title": "Reglas de etiquetas" + }, + "tags": { + "title": "Etiquetas" + }, + "title": "Administrar espacio de trabajo {{name}}" + } + } +} diff --git a/databox/client/translations/fr.json b/databox/client/translations/fr.json new file mode 100644 index 000000000..40191a316 --- /dev/null +++ b/databox/client/translations/fr.json @@ -0,0 +1,558 @@ +{ + "acl": { + "delete": "Supprimer", + "form": { + "group_select": { + "placeholder": "Sélectionner l'utilisateur" + }, + "user_select": { + "placeholder": "Sélectionner le groupe" + } + }, + "table": { + "cols": { + "user_group": "Utilisateur/Groupe" + } + } + }, + "asset": { + "delete": { + "confirm": { + "message_many": "Êtes-vous sûr de vouloir supprimer {{count}} actifs ?", + "message_many_plural": "Êtes-vous sûr de vouloir supprimer {{count}} actifs ?", + "message_one": "Êtes-vous sûr de vouloir supprimer cet actif ?", + "title": "Confirmer la suppression" + } + }, + "manage": { + "acl": { + "title": "Permissions", + "versions": "Versions" + }, + "attributes": { + "title": "Attributs" + }, + "edit": { + "title": "Modifier" + }, + "info": { + "title": "Infos" + }, + "operations": { + "title": "Opérations" + }, + "renditions": { + "title": "Renditions" + }, + "title": "Gérer l'actif {{name}}" + } + }, + "asset_actions": { + "copy": "Copier", + "delete": "Supprimer", + "edit": "Modifier", + "edit_attributes": "Modifier les attributs", + "export": "Exporter", + "move": "Déplacer", + "select_all": "Sélectionner tout", + "share": "Partager", + "unselect_all": "Désélectionner tout" + }, + "attribute_class": { + "new": { + "label": "Nouvelle classe" + } + }, + "attribute_definitions": { + "new": { + "label": "Nouvel attribut" + } + }, + "basket": { + "choose_modal": { + "title": "Sélectionner le panier actuel" + }, + "create_button": { + "label": "Créer un nouveau panier" + }, + "default": { + "title": "Mon panier" + }, + "item": { + "edit": "Modifier ce panier" + }, + "manage": { + "acl": { + "title": "Permissions" + }, + "edit": { + "title": "Modifier" + }, + "info": { + "title": "Infos" + }, + "title": "Gérer le panier {{name}}" + } + }, + "basket_delete": { + "title": { + "confirm": "Êtes-vous sûr de vouloir supprimer ce panier ?" + } + }, + "change_theme": { + "save": "Enregistrer", + "title": "Choisir un thème" + }, + "chip": { + "editable": "Modifiable", + "private": "Privé", + "public": "Public", + "read_only": "Lecture seule" + }, + "collection": { + "item": { + "create_asset": "Ajouter un nouvel actif à la collection", + "create_collection": "Créer une nouvelle collection dans celle-ci", + "edit": "Modifier cette collection" + }, + "manage": { + "acl": { + "title": "Permissions" + }, + "edit": { + "title": "Modifier" + }, + "info": { + "title": "Infos" + }, + "operations": { + "title": "Opérations" + }, + "tag_rules": { + "title": "Règles de tag" + }, + "title": "Gérer la collection {{name}}" + } + }, + "collection_delete": { + "title": { + "confirm": "Êtes-vous sûr de vouloir supprimer cette collection ?" + } + }, + "collection_move": { + "intro": "Sélectionnez la destination où déplacer cette collection :", + "title": "Déplacer la collection" + }, + "common": { + "delete": "Supprimer", + "item_sorted": "Ordre enregistré !", + "loading": "Chargement...", + "search": { + "placeholder": "Rechercher...", + "submit": "Rechercher" + } + }, + "copy_assets": { + "dialog": { + "intro": "Où voulez-vous copier les actifs sélectionnés ?", + "submit": "Copier", + "title": "Copier {{count}} actifs", + "title_plural": "Copier {{count}} actifs" + }, + "form": { + "by_reference": { + "label": "Copier par référence (raccourci)" + }, + "with_attributes": { + "label": "Copier les attributs" + }, + "with_tags": { + "label": "Copier les tags" + } + } + }, + "copy_toclipboard": { + "copied": "Copié dans le presse-papiers !" + }, + "danger_zone": "Zone dangereuse", + "definition_manager": { + "confirm_delete": "Êtes-vous sûr de vouloir supprimer cet élément ?", + "saved": "Définition enregistrée !" + }, + "delete": { + "basket": { + "confirmed": "Le panier a été supprimé !" + }, + "collection": { + "confirmed": "La collection a été supprimée !" + } + }, + "dialog": { + "apply": "Appliquer", + "cancel": "Annuler", + "close": "Fermer", + "confirm": "Confirmer", + "confirm_text_type": { + "default": "Confirmer", + "intro": "Veuillez taper \"{{ text }}\" pour confirmer :", + "placeholder": "Taper \"{{ text }}\"" + }, + "reset": "Réinitialiser", + "save": "Enregistrer" + }, + "export": { + "dialog": { + "intro": "Sélectionnez les renditions que vous souhaitez exporter :", + "submit": "Exporter", + "title": "Exporter {{count}} actifs", + "title_plural": "Exporter {{count}} actifs" + } + }, + "filter_rule": { + "exclude": { + "helper": "Les actifs dans ce {{type}} ne seront visibles que s'ils ne contiennent PAS ces tags." + }, + "group": "Groupe", + "include": { + "helper": "Les actifs dans ce {{type}} ne seront visibles que s'ils contiennent ces tags." + }, + "user": "Utilisateur" + }, + "form": { + "asset": { + "tags": { + "label": "Tags" + }, + "templates": { + "label": "Remplir avec le modèle" + }, + "title": { + "label": "Titre" + } + }, + "asset_create": { + "title": "Créer un actif dans", + "title_with_parent": "Créer un actif sous" + }, + "asset_edit": { + "success": "Actif édité !" + }, + "attribute": { + "collection": { + "item_add": "Ajouter {{name}}", + "item_remove": "Supprimer" + } + }, + "attribute_class": { + "editable": { + "label": "Modifiable" + }, + "name": { + "label": "Nom" + }, + "public": { + "label": "Public" + } + }, + "attribute_definition": { + "allowInvalid": { + "label": "Autoriser les valeurs invalides" + }, + "class": { + "label": "Classe" + }, + "field_type": { + "label": "Type de champ" + }, + "multiple": { + "label": "Valeurs multiples" + }, + "name": { + "label": "Nom" + }, + "searchable": { + "label": "Recherche" + }, + "slug": { + "label": "Slug" + }, + "suggest": { + "label": "Afficher dans les suggestions de recherche" + }, + "translatable": { + "label": "Traduisible" + } + }, + "basket": { + "description": { + "label": "Description" + }, + "title": { + "label": "Titre" + } + }, + "basket_create": { + "success": "Panier créé !", + "title": "Créer un panier" + }, + "basket_edit": { + "success": "Panier édité !" + }, + "collection": { + "title": { + "label": "Titre" + } + }, + "collection_create": { + "success": "Collection créée !", + "title": "Créer une collection dans", + "title_with_parent": "Créer une collection sous" + }, + "collection_edit": { + "success": "Collection éditée !" + }, + "collection_move": { + "success": "Collection déplacée !" + }, + "copy_assets": { + "asset_not_linkable": { + "other_ws": "Les actifs suivants ne peuvent pas être copiés par référence dans un autre espace de travail.", + "permission": "Les actifs suivants ne peuvent pas être copiés par référence car vous n'avez pas les autorisations nécessaires.", + "select_for_hard_copy": "Vous pouvez sélectionner l'actif que vous souhaitez dupliquer vers la destination (copie physique) :" + }, + "destination": { + "label": "Destination" + } + }, + "move_assets": { + "destination": { + "label": "Destination" + } + }, + "permissions": { + "label": "Permissions" + }, + "privacy": { + "label": "Confidentialité" + }, + "profile": { + "firstName": { + "translate": { + "title": "Traduire Tag" + } + } + }, + "rendition_class": { + "name": { + "label": "Nom" + }, + "public": { + "label": "Public" + } + }, + "rendition_definition": { + "class": { + "label": "Classe" + }, + "name": { + "label": "Nom" + }, + "pickSourceFile": { + "label": "Sélectionner le fichier source" + }, + "useAsOriginal": { + "label": "Utiliser comme original" + }, + "useAsPreview": { + "label": "Utiliser comme aperçu" + }, + "useAsThumbnail": { + "label": "Utiliser comme miniature" + }, + "useAsThumbnailActive": { + "label": "Utiliser comme miniature active" + } + }, + "save_as": { + "destination": { + "label": "Destination" + } + }, + "tag": { + "color": { + "label": "Couleur" + }, + "name": { + "label": "Nom" + } + }, + "upload": { + "destination": { + "label": "Destination" + }, + "submit": { + "title": "Téléverser" + }, + "success": "Fichiers téléversés !", + "title": { + "label": "Titre" + } + }, + "workspace": { + "fallback_locales": { + "add": "Ajouter une langue de secours", + "label": "Langue", + "title": "Langues de secours" + }, + "locales": { + "add": "Ajouter une langue", + "label": "Langue", + "placeholder": "ex. fr ou fr-FR", + "title": "Langues de l'espace de travail" + }, + "public": { + "label": "Public" + }, + "title": { + "label": "Titre" + } + }, + "workspace_edit": { + "success": "Espace de travail édité !" + } + }, + "layout": { + "options": { + "collections_count": { + "label": "collections" + }, + "display_collections": { + "label": "Afficher les collections" + }, + "display_previews_hover": { + "label": "Afficher l'aperçu au survol" + }, + "display_tags": { + "label": "Afficher les tags" + }, + "display_title": { + "label": "Afficher le titre" + }, + "more": "Plus d'options", + "play_preview_videos": { + "label": "Lecture automatique des aperçus vidéo" + }, + "tags_count": { + "label": "tags" + }, + "thumb_size": { + "label": "Taille de la miniature" + }, + "title_rows": { + "label": "lignes" + } + }, + "previews_locked": "Aperçus verrouillés", + "previews_unlocked": "Aperçus déverrouillés", + "view": { + "grid": "Vue en grille", + "list": "Vue en liste", + "masonry": "Vue en mosaïque" + } + }, + "load_more": { + "button": { + "loading": "Chargement..." + } + }, + "menu": { + "change_theme": "Changer de thème", + "sign_in": "Se connecter", + "theme_editor": "Éditeur de thème" + }, + "modal": { + "close": "Fermer" + }, + "move_assets": { + "dialog": { + "intro": "Où voulez-vous déplacer les actifs sélectionnés ?", + "submit": "Déplacer", + "title": "Déplacer {{count}} actifs", + "title_plural": "Déplacer {{count}} actifs" + } + }, + "not_found": { + "back_home": "Retour à l'accueil", + "content": "La page que vous recherchez n'existe pas ou a été supprimée", + "title": "Page non trouvée" + }, + "privacy": { + "no_access": "Pas d'accès", + "private": "Privé", + "private_in_workspace": "Privé dans l'espace de travail", + "public": "Public", + "public_for_users": "Public pour les utilisateurs", + "public_in_workspace": "Public dans l'espace de travail", + "secret": "Secret" + }, + "rendition_class": { + "new": { + "label": "Nouvelle classe" + } + }, + "rendition_definitions": { + "new": { + "label": "Nouvelle rendition" + } + }, + "renditions": { + "download": "Télécharger" + }, + "search": { + "search_button": "Rechercher", + "sort_by": { + "title": "Trier par" + } + }, + "tags": { + "new": { + "label": "Nouveau tag" + } + }, + "workspace": { + "item": { + "create_collection": "Ajouter une collection dans cet espace de travail", + "edit": "Modifier cet espace de travail" + }, + "manage": { + "acl": { + "title": "Permissions" + }, + "attribute_class": { + "title": "Classes d'attributs" + }, + "attribute_definitions": { + "title": "Attributs" + }, + "edit": { + "title": "Modifier" + }, + "info": { + "title": "Infos" + }, + "rendition_class": { + "title": "Classes de renditions" + }, + "rendition_definition": { + "title": "Renditions" + }, + "tag_rules": { + "title": "Règles de tag" + }, + "tags": { + "title": "Tags" + }, + "title": "Gérer l'espace de travail {{name}}" + } + } +} diff --git a/databox/client/translations/index.ts b/databox/client/translations/index.ts new file mode 100644 index 000000000..62a4f421b --- /dev/null +++ b/databox/client/translations/index.ts @@ -0,0 +1,81 @@ +import en from './en.json'; +import fr from './fr.json'; +import es from './es.json'; +import de from './de.json'; +import zh from './zh.json'; + +import enApi from '@alchemy/api/translations/en.json'; +import frApi from '@alchemy/api/translations/fr.json'; +import esApi from '@alchemy/api/translations/es.json'; +import deApi from '@alchemy/api/translations/de.json'; +import zhApi from '@alchemy/api/translations/zh.json'; + +import enNav from '@alchemy/navigation/translations/en.json'; +import frNav from '@alchemy/navigation/translations/fr.json'; +import esNav from '@alchemy/navigation/translations/es.json'; +import deNav from '@alchemy/navigation/translations/de.json'; +import zhNav from '@alchemy/navigation/translations/zh.json'; + +import enAuth from '@alchemy/react-auth/translations/en.json'; +import frAuth from '@alchemy/react-auth/translations/fr.json'; +import esAuth from '@alchemy/react-auth/translations/es.json'; +import deAuth from '@alchemy/react-auth/translations/de.json'; +import zhAuth from '@alchemy/react-auth/translations/zh.json'; + +import enForm from '@alchemy/react-form/translations/en.json'; +import frForm from '@alchemy/react-form/translations/fr.json'; +import esForm from '@alchemy/react-form/translations/es.json'; +import deForm from '@alchemy/react-form/translations/de.json'; +import zhForm from '@alchemy/react-form/translations/zh.json'; + +const enMerged = { + ...en, + lib: { + ...enApi.lib, + ...enNav.lib, + ...enAuth.lib, + ...enForm.lib, + }, +}; + +const frMerged = { + ...fr, + lib: { + ...frApi.lib, + ...frNav.lib, + ...frAuth.lib, + ...frForm.lib, + }, +}; + +const esMerged = { + ...es, + lib: { + ...esApi.lib, + ...esNav.lib, + ...esAuth.lib, + ...esForm.lib, + }, +}; + +const deMerged = { + ...de, + lib: { + ...deApi.lib, + ...deNav.lib, + ...deAuth.lib, + ...deForm.lib, + }, +}; + +const zhMerged = { + ...zh, + lib: { + ...zhApi.lib, + ...zhNav.lib, + ...zhAuth.lib, + ...zhForm.lib, + }, +}; + +export {enMerged as en, frMerged as fr, esMerged as es, deMerged as de, zhMerged as zh}; diff --git a/databox/client/translations/zh.json b/databox/client/translations/zh.json new file mode 100644 index 000000000..3eb1dd175 --- /dev/null +++ b/databox/client/translations/zh.json @@ -0,0 +1,558 @@ +{ + "acl": { + "delete": "删除", + "form": { + "group_select": { + "placeholder": "选择用户" + }, + "user_select": { + "placeholder": "选择用户组" + } + }, + "table": { + "cols": { + "user_group": "用户/组" + } + } + }, + "asset": { + "delete": { + "confirm": { + "message_many": "您确定要删除{{count}}个资产吗?", + "message_many_plural": "您确定要删除{{count}}个资产吗?", + "message_one": "您确定要删除此资产吗?", + "title": "确认删除" + } + }, + "manage": { + "acl": { + "title": "权限", + "versions": "版本" + }, + "attributes": { + "title": "属性" + }, + "edit": { + "title": "编辑" + }, + "info": { + "title": "信息" + }, + "operations": { + "title": "操作" + }, + "renditions": { + "title": "版本" + }, + "title": "管理资产{{name}}" + } + }, + "asset_actions": { + "copy": "复制", + "delete": "删除", + "edit": "编辑", + "edit_attributes": "编辑属性", + "export": "导出", + "move": "移动", + "select_all": "全选", + "share": "分享", + "unselect_all": "取消全选" + }, + "attribute_class": { + "new": { + "label": "新类别" + } + }, + "attribute_definitions": { + "new": { + "label": "新属性" + } + }, + "basket": { + "choose_modal": { + "title": "选择当前购物篮" + }, + "create_button": { + "label": "创建新购物篮" + }, + "default": { + "title": "我的购物篮" + }, + "item": { + "edit": "编辑此购物篮" + }, + "manage": { + "acl": { + "title": "权限" + }, + "edit": { + "title": "编辑" + }, + "info": { + "title": "信息" + }, + "title": "管理购物篮{{name}}" + } + }, + "basket_delete": { + "title": { + "confirm": "您确定要删除此购物篮吗?" + } + }, + "change_theme": { + "save": "保存", + "title": "选择主题" + }, + "chip": { + "editable": "可编辑", + "private": "私有", + "public": "公开", + "read_only": "只读" + }, + "collection": { + "item": { + "create_asset": "将新资产添加到集合中", + "create_collection": "在其中创建新集合", + "edit": "编辑此集合" + }, + "manage": { + "acl": { + "title": "权限" + }, + "edit": { + "title": "编辑" + }, + "info": { + "title": "信息" + }, + "operations": { + "title": "操作" + }, + "tag_rules": { + "title": "标签规则" + }, + "title": "管理集合{{name}}" + } + }, + "collection_delete": { + "title": { + "confirm": "您确定要删除此集合吗?" + } + }, + "collection_move": { + "intro": "选择要移动此集合的目标位置:", + "title": "移动集合" + }, + "common": { + "delete": "删除", + "item_sorted": "排序已保存!", + "loading": "加载中...", + "search": { + "placeholder": "搜索...", + "submit": "搜索" + } + }, + "copy_assets": { + "dialog": { + "intro": "您要将所选资产复制到何处?", + "submit": "复制", + "title": "复制{{count}}个资产", + "title_plural": "复制{{count}}个资产" + }, + "form": { + "by_reference": { + "label": "通过引用复制(快捷方式)" + }, + "with_attributes": { + "label": "复制属性" + }, + "with_tags": { + "label": "复制标签" + } + } + }, + "copy_toclipboard": { + "copied": "已复制到剪贴板!" + }, + "danger_zone": "危险区", + "definition_manager": { + "confirm_delete": "您确定要删除此项吗?", + "saved": "定义已保存!" + }, + "delete": { + "basket": { + "confirmed": "购物篮已删除!" + }, + "collection": { + "confirmed": "集合已删除!" + } + }, + "dialog": { + "apply": "应用", + "cancel": "取消", + "close": "关闭", + "confirm": "确认", + "confirm_text_type": { + "default": "确认", + "intro": "请输入\"{{ text }}\"以确认:", + "placeholder": "输入\"{{ text }}\"" + }, + "reset": "重置", + "save": "保存" + }, + "export": { + "dialog": { + "intro": "选择要导出的版本:", + "submit": "导出", + "title": "导出{{count}}个资产", + "title_plural": "导出{{count}}个资产" + } + }, + "filter_rule": { + "exclude": { + "helper": "此{{type}}中的资产仅在不包含这些标签时可见。" + }, + "group": "组", + "include": { + "helper": "此{{type}}中的资产仅在包含这些标签时可见。" + }, + "user": "用户" + }, + "form": { + "asset": { + "tags": { + "label": "标签" + }, + "templates": { + "label": "使用模板填充" + }, + "title": { + "label": "标题" + } + }, + "asset_create": { + "title": "在中创建资产", + "title_with_parent": "在下创建资产" + }, + "asset_edit": { + "success": "资产已编辑!" + }, + "attribute": { + "collection": { + "item_add": "添加{{name}}", + "item_remove": "移除" + } + }, + "attribute_class": { + "editable": { + "label": "可编辑" + }, + "name": { + "label": "名称" + }, + "public": { + "label": "公开" + } + }, + "attribute_definition": { + "allowInvalid": { + "label": "允许无效值" + }, + "class": { + "label": "类别" + }, + "field_type": { + "label": "字段类型" + }, + "multiple": { + "label": "多个值" + }, + "name": { + "label": "名称" + }, + "searchable": { + "label": "可搜索" + }, + "slug": { + "label": "Slug" + }, + "suggest": { + "label": "在搜索建议中显示" + }, + "translatable": { + "label": "可翻译" + } + }, + "basket": { + "description": { + "label": "描述" + }, + "title": { + "label": "标题" + } + }, + "basket_create": { + "success": "购物篮已创建!", + "title": "创建购物篮" + }, + "basket_edit": { + "success": "购物篮已编辑!" + }, + "collection": { + "title": { + "label": "标题" + } + }, + "collection_create": { + "success": "集合已创建!", + "title": "在中创建集合", + "title_with_parent": "在下创建集合" + }, + "collection_edit": { + "success": "集合已编辑!" + }, + "collection_move": { + "success": "集合已移动!" + }, + "copy_assets": { + "asset_not_linkable": { + "other_ws": "以下资产无法在其他工作区中通过引用复制。", + "permission": "由于您没有足够的权限,以下资产无法通过引用复制。", + "select_for_hard_copy": "您可以选择要复制到目的地的资产(硬复制):" + }, + "destination": { + "label": "目的地" + } + }, + "move_assets": { + "destination": { + "label": "目的地" + } + }, + "permissions": { + "label": "权限" + }, + "privacy": { + "label": "隐私" + }, + "profile": { + "firstName": { + "translate": { + "title": "翻译标签" + } + } + }, + "rendition_class": { + "name": { + "label": "名称" + }, + "public": { + "label": "公开" + } + }, + "rendition_definition": { + "class": { + "label": "类别" + }, + "name": { + "label": "名称" + }, + "pickSourceFile": { + "label": "选择源文件" + }, + "useAsOriginal": { + "label": "用作原始文件" + }, + "useAsPreview": { + "label": "用作预览" + }, + "useAsThumbnail": { + "label": "用作缩略图" + }, + "useAsThumbnailActive": { + "label": "用作活动缩略图" + } + }, + "save_as": { + "destination": { + "label": "目的地" + } + }, + "tag": { + "color": { + "label": "颜色" + }, + "name": { + "label": "名称" + } + }, + "upload": { + "destination": { + "label": "目的地" + }, + "submit": { + "title": "上传" + }, + "success": "文件已上传!", + "title": { + "label": "标题" + } + }, + "workspace": { + "fallback_locales": { + "add": "添加回退语言环境", + "label": "语言环境", + "title": "回退语言环境" + }, + "locales": { + "add": "添加语言环境", + "label": "语言环境", + "placeholder": "例如,fr或fr-FR", + "title": "工作区语言环境" + }, + "public": { + "label": "公开" + }, + "title": { + "label": "标题" + } + }, + "workspace_edit": { + "success": "工作区已编辑!" + } + }, + "layout": { + "options": { + "collections_count": { + "label": "集合" + }, + "display_collections": { + "label": "显示集合" + }, + "display_previews_hover": { + "label": "悬停显示预览" + }, + "display_tags": { + "label": "显示标签" + }, + "display_title": { + "label": "显示标题" + }, + "more": "更多选项", + "play_preview_videos": { + "label": "自动播放视频预览" + }, + "tags_count": { + "label": "标签" + }, + "thumb_size": { + "label": "缩略图大小" + }, + "title_rows": { + "label": "行" + } + }, + "previews_locked": "预览已锁定", + "previews_unlocked": "预览已解锁", + "view": { + "grid": "网格视图", + "list": "列表视图", + "masonry": "砌体视图" + } + }, + "load_more": { + "button": { + "loading": "加载中..." + } + }, + "menu": { + "change_theme": "更改主题", + "sign_in": "登录", + "theme_editor": "主题编辑器" + }, + "modal": { + "close": "关闭" + }, + "move_assets": { + "dialog": { + "intro": "您要将所选资产移动到何处?", + "submit": "移动", + "title": "移动{{count}}个资产", + "title_plural": "移动{{count}}个资产" + } + }, + "not_found": { + "back_home": "返回首页", + "content": "您正在查找的页面不存在或已删除", + "title": "页面未找到" + }, + "privacy": { + "no_access": "无访问权限", + "private": "私有", + "private_in_workspace": "工作区内私有", + "public": "公开", + "public_for_users": "对用户公开", + "public_in_workspace": "工作区内公开", + "secret": "秘密" + }, + "rendition_class": { + "new": { + "label": "新类别" + } + }, + "rendition_definitions": { + "new": { + "label": "新版本" + } + }, + "renditions": { + "download": "下载" + }, + "search": { + "search_button": "搜索", + "sort_by": { + "title": "排序方式" + } + }, + "tags": { + "new": { + "label": "新标签" + } + }, + "workspace": { + "item": { + "create_collection": "在此工作区中添加集合", + "edit": "编辑此工作区" + }, + "manage": { + "acl": { + "title": "权限" + }, + "attribute_class": { + "title": "属性类别" + }, + "attribute_definitions": { + "title": "属性" + }, + "edit": { + "title": "编辑" + }, + "info": { + "title": "信息" + }, + "rendition_class": { + "title": "版本类别" + }, + "rendition_definition": { + "title": "版本" + }, + "tag_rules": { + "title": "标签规则" + }, + "tags": { + "title": "标签" + }, + "title": "管理工作区{{name}}" + } + } +} diff --git a/expose/client/i18next-scanner.config.js b/expose/client/i18next-scanner.config.js deleted file mode 100644 index 4e63d8ba8..000000000 --- a/expose/client/i18next-scanner.config.js +++ /dev/null @@ -1,82 +0,0 @@ -var fs = require('fs'); -var chalk = require('chalk'); - -module.exports = { - input: [ - 'src/**/*.{js,jsx}', - // Use ! to filter out files or directories - '!src/**/*.spec.{js,jsx}', - '!src/i18n/**', - '!**/node_modules/**', - ], - output: './', - options: { - debug: true, - func: { - list: ['i18next.t', 'i18n.t'], - extensions: ['.js', '.jsx'], - }, - trans: { - component: 'Trans', - i18nKey: 'i18nKey', - defaultsKey: 'defaults', - extensions: ['.js', '.jsx'], - fallbackKey: function (ns, value) { - return value; - }, - acorn: { - ecmaVersion: 10, // defaults to 10 - sourceType: 'module', // defaults to 'module' - // Check out https://github.com/acornjs/acorn/tree/master/acorn#interface for additional options - }, - }, - lngs: ['en', 'fr'], - ns: ['translation'], - defaultLng: 'en', - defaultNs: 'translation', - defaultValue: '__STRING_NOT_TRANSLATED__', - resource: { - loadPath: 'src/i18n/{{lng}}/{{ns}}.json', - savePath: 'src/i18n/{{lng}}/{{ns}}.json', - jsonIndent: 2, - lineEnding: '\n', - }, - nsSeparator: false, // namespace separator - keySeparator: false, // key separator - interpolation: { - prefix: '{{', - suffix: '}}', - }, - }, - transform: function customTransform(file, enc, done) { - 'use strict'; - const parser = this.parser; - const content = fs.readFileSync(file.path, enc); - let count = 0; - - parser.parseFuncFromString( - content, - {list: ['i18next._', 'i18next.__', 't']}, - (key, options) => { - parser.set( - key, - Object.assign({}, options, { - nsSeparator: false, - keySeparator: false, - }) - ); - ++count; - } - ); - - if (count > 0) { - console.log( - `i18next-scanner: count=${chalk.cyan( - count - )}, file=${chalk.yellow(JSON.stringify(file.relative))}` - ); - } - - done(); - }, -}; diff --git a/expose/client/package.json b/expose/client/package.json index cc3e00fac..6c749210d 100644 --- a/expose/client/package.json +++ b/expose/client/package.json @@ -8,7 +8,8 @@ "lint": "eslint src", "lint:fix": "eslint --fix src", "format": "prettier --ignore-path .gitignore --write \"**/*.+(js|ts|json|cjs|tsx|jsx)\"", - "preview": "vite preview" + "preview": "vite preview", + "translate": "i18next-scanner --config ../../lib/js/i18n/i18next-scanner.config.js" }, "dependencies": { "@alchemy/api": "workspace:*", @@ -16,6 +17,7 @@ "@alchemy/core": "workspace:*", "@alchemy/navigation": "workspace:*", "@alchemy/phrasea-ui": "workspace:*", + "@alchemy/i18n": "workspace:*", "@alchemy/react-auth": "workspace:*", "@alchemy/react-ps": "workspace:*", "@jonkoops/matomo-tracker-react": "^0.7.0", @@ -25,15 +27,13 @@ "axios": "^1.6.7", "bootstrap": "^4.6.2", "flow-bin": "^0.126.1", - "i18next": "^23.10.1", - "i18next-browser-languagedetector": "^6.1.8", "mapbox-gl": "^1.13.3", "moment": "^2.30.1", "react": "^18.2.0", "react-bootstrap": "^1.6.8", "react-dom": "^18.2.0", "react-grid-gallery": "^0.5.6", - "react-i18next": "^13.5.0", + "react-i18next": "^14.1.0", "react-image-gallery": "^0.9.1", "react-image-magnifiers": "^1.4.0", "react-images": "^1.1.7", @@ -57,10 +57,11 @@ "eslint": "^8.57.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", - "i18next-scanner": "^3.3.0", "typescript": "^5.4.2", "vite": "^5.1.6", "vite-plugin-checker": "^0.6.4", - "vite-plugin-svgr": "^4.2.0" + "vite-plugin-svgr": "^4.2.0", + "i18next-scanner": "^4.4.0", + "i18next-scanner-typescript": "^1.2.0" } } diff --git a/expose/client/src/component/index/PublicationIndex.tsx b/expose/client/src/component/index/PublicationIndex.tsx index 752328978..684880e12 100644 --- a/expose/client/src/component/index/PublicationIndex.tsx +++ b/expose/client/src/component/index/PublicationIndex.tsx @@ -16,17 +16,6 @@ enum SortBy { Name = 'name', } -const orders = { - [SortBy.Date]: { - label: `last_post_added`, - query: `order[createdAt]=desc`, - }, - [SortBy.Name]: { - label: `publication_name`, - query: `order[title]=asc`, - }, -}; - type Props = {}; export default function PublicationIndex({}: Props) { @@ -34,17 +23,23 @@ export default function PublicationIndex({}: Props) { const [sortBy, setSortBy] = React.useState(SortBy.Date); const {t} = useTranslation(); + const orders = { + [SortBy.Date]: { + label: t('order.last_post_added', 'Recents'), + query: `order[createdAt]=desc`, + }, + [SortBy.Name]: { + label: t('order.publication_name', 'Name'), + query: `order[title]=asc`, + }, + }; + React.useEffect(() => { apiClient.get(`/publications?${orders[sortBy].query}`).then(res => { setData(res.data['hydra:member']); }); }, [sortBy]); - const orderTr = { - [SortBy.Date]: t('order.last_post_added'), - [SortBy.Name]: t('order.publication_name'), - }; - return ( <>
@@ -58,17 +53,17 @@ export default function PublicationIndex({}: Props) { title={ <> - {orderTr[sortBy]} + {orders[sortBy].label} } > - {Object.keys(orders).map((o: string | SortBy) => { + {Object.keys(orders).map((o) => { return ( setSortBy(o as SortBy)} > - {orderTr[o as keyof typeof orderTr]} + {orders[o as keyof typeof orders].label} ); })} diff --git a/expose/client/src/component/layouts/shared-components/DownloadButton.tsx b/expose/client/src/component/layouts/shared-components/DownloadButton.tsx index 1fdb73933..80d84f7bc 100644 --- a/expose/client/src/component/layouts/shared-components/DownloadButton.tsx +++ b/expose/client/src/component/layouts/shared-components/DownloadButton.tsx @@ -24,10 +24,9 @@ export default function DownloadButton({downloadUrl, onDownload}: Props) { className={'btn btn-secondary'} href={downloadUrl} type={'button'} - title={t('download')} onClick={downloadHandler} > - {t('download')} + {t('download', 'Download')} )} diff --git a/expose/client/src/i18n.ts b/expose/client/src/i18n.ts new file mode 100644 index 000000000..643087c95 --- /dev/null +++ b/expose/client/src/i18n.ts @@ -0,0 +1,8 @@ +import {createI18N, createNS} from '@alchemy/i18n'; +import * as appLangs from '../translations'; + +const i18n = createI18N({ + resources: createNS(appLangs), +}); + +export default i18n; diff --git a/expose/client/src/i18n/de/translation.json b/expose/client/src/i18n/de/translation.json deleted file mode 100644 index 0967ef424..000000000 --- a/expose/client/src/i18n/de/translation.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/expose/client/src/i18n/en/translation.json b/expose/client/src/i18n/en/translation.json deleted file mode 100644 index deb832c5a..000000000 --- a/expose/client/src/i18n/en/translation.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "order": { - "last_post_added": "Last post added", - "publication_name": "Publication name" - }, - "menu.toggle": "Toggle Menu", - "download": "Download", - "download_original": "Download original", - "download_custom": "Download {{name}}", - "gallery.empty": "Gallery is empty", - "map.empty": "Map is empty", - "download_via_email": "Download via email", - "download_via_email.sent": "You will receive your download link by email.", - "email.label": "Email", - "modal.discard": "Discard", - "form.continue": "Continue", - "terms.accept": "Accept", - "download_archive": "Download archive", - "terms.please_read_accept": "Please read and accept the <1>terms", - "terms": "terms", - "modal.close": "Close" -} diff --git a/expose/client/src/i18n/es/translation.json b/expose/client/src/i18n/es/translation.json deleted file mode 100644 index 0967ef424..000000000 --- a/expose/client/src/i18n/es/translation.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/expose/client/src/i18n/fr/translation.json b/expose/client/src/i18n/fr/translation.json deleted file mode 100644 index ee26a584f..000000000 --- a/expose/client/src/i18n/fr/translation.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "order": { - "last_post_added": "Derniers ajouts", - "publication_name": "Titre" - }, - "menu.toggle": "Ouvrir/Fermer le menu", - "download": "Télécharger", - "download_original": "Télécharger l'original", - "download_custom": "Télécharger {{name}}", - "gallery.empty": "La galerie est vide", - "map.empty": "La carte est vide", - "download_via_email": "Télécharger via e-mail", - "download_via_email.sent": "Vous allez recevoir votre téléchargement par e-mail très bientôt.", - "email.label": "E-mail", - "modal.discard": "Annuler", - "form.continue": "Continuer", - "terms.accept": "Accepter", - "download_archive": "Télécharger l'archive", - "terms.please_read_accept": "Veuillez lire puis accepter les <1>conditions", - "terms": "conditions", - "modal.close": "Fermer" -} diff --git a/expose/client/src/i18n/i18n.js b/expose/client/src/i18n/i18n.js deleted file mode 100644 index f3195d23b..000000000 --- a/expose/client/src/i18n/i18n.js +++ /dev/null @@ -1,32 +0,0 @@ -import i18n from 'i18next'; -import {initReactI18next} from 'react-i18next'; -import LanguageDetector from 'i18next-browser-languagedetector'; -import * as languages from './'; - -const ns = 'translation'; - -const resources = {}; -Object.keys(languages).forEach(l => { - resources[l] = { - [ns]: languages[l], - }; -}); - -i18n - // detect user language - // learn more: https://github.com/i18next/i18next-browser-languageDetector - .use(LanguageDetector) - // pass the i18n instance to react-i18next. - .use(initReactI18next) - // init i18next - // for all options read: https://www.i18next.com/overview/configuration-options - .init({ - debug: true, - fallbackLng: 'en', - interpolation: { - escapeValue: false, // not needed for react as it escapes by default - }, - resources, - }); - -export default i18n; diff --git a/expose/client/src/i18n/index.js b/expose/client/src/i18n/index.js deleted file mode 100644 index 3bd4ce0a7..000000000 --- a/expose/client/src/i18n/index.js +++ /dev/null @@ -1,6 +0,0 @@ -import en from './en/translation'; -import fr from './fr/translation'; -import de from './de/translation'; -import es from './es/translation'; - -export {en, fr, de, es}; diff --git a/expose/client/src/index.tsx b/expose/client/src/index.tsx index 105c3f41a..92532e3e1 100644 --- a/expose/client/src/index.tsx +++ b/expose/client/src/index.tsx @@ -1,7 +1,7 @@ import ReactDOM from 'react-dom/client'; import './scss/index.scss'; import ConfigWrapper from './component/ConfigWrapper'; -import './i18n/i18n'; +import './i18n'; import AnalyticsProvider from './component/anaytics/AnalyticsProvider'; import React from 'react'; import config from './config'; diff --git a/expose/client/translations/de.json b/expose/client/translations/de.json new file mode 100644 index 000000000..5d4ebb654 --- /dev/null +++ b/expose/client/translations/de.json @@ -0,0 +1,17 @@ +{ + "download": "Herunterladen", + "download_archive": "Archiv herunterladen", + "gallery": { + "empty": "Galerie ist leer" + }, + "map": { + "empty": "Karte ist leer" + }, + "menu": { + "toggle": "Menü umschalten" + }, + "order": { + "last_post_added": "Neueste", + "publication_name": "Name" + } +} diff --git a/expose/client/translations/en.json b/expose/client/translations/en.json new file mode 100644 index 000000000..e8837ac02 --- /dev/null +++ b/expose/client/translations/en.json @@ -0,0 +1,17 @@ +{ + "download": "Download", + "download_archive": "Download archive", + "gallery": { + "empty": "Gallery is empty" + }, + "map": { + "empty": "Map is empty" + }, + "menu": { + "toggle": "Toggle Menu" + }, + "order": { + "last_post_added": "Recents", + "publication_name": "Name" + } +} diff --git a/expose/client/translations/es.json b/expose/client/translations/es.json new file mode 100644 index 000000000..f80a255b1 --- /dev/null +++ b/expose/client/translations/es.json @@ -0,0 +1,17 @@ +{ + "download": "Descargar", + "download_archive": "Descargar archivo", + "gallery": { + "empty": "La galería está vacía" + }, + "map": { + "empty": "El mapa está vacío" + }, + "menu": { + "toggle": "Alternar menú" + }, + "order": { + "last_post_added": "Recientes", + "publication_name": "Nombre" + } +} diff --git a/expose/client/translations/fr.json b/expose/client/translations/fr.json new file mode 100644 index 000000000..3c0c6f8a0 --- /dev/null +++ b/expose/client/translations/fr.json @@ -0,0 +1,17 @@ +{ + "download": "Télécharger", + "download_archive": "Télécharger l'archive", + "gallery": { + "empty": "La galerie est vide" + }, + "map": { + "empty": "La carte est vide" + }, + "menu": { + "toggle": "Afficher le menu" + }, + "order": { + "last_post_added": "Récents", + "publication_name": "Nom" + } +} diff --git a/expose/client/translations/index.ts b/expose/client/translations/index.ts new file mode 100644 index 000000000..9448e4211 --- /dev/null +++ b/expose/client/translations/index.ts @@ -0,0 +1,70 @@ +import en from './en.json'; +import fr from './fr.json'; +import es from './es.json'; +import de from './de.json'; +import zh from './zh.json'; + +import enApi from '@alchemy/api/translations/en.json'; +import frApi from '@alchemy/api/translations/fr.json'; +import esApi from '@alchemy/api/translations/es.json'; +import deApi from '@alchemy/api/translations/de.json'; +import zhApi from '@alchemy/api/translations/zh.json'; + +import enNav from '@alchemy/navigation/translations/en.json'; +import frNav from '@alchemy/navigation/translations/fr.json'; +import esNav from '@alchemy/navigation/translations/es.json'; +import deNav from '@alchemy/navigation/translations/de.json'; +import zhNav from '@alchemy/navigation/translations/zh.json'; + +import enAuth from '@alchemy/react-auth/translations/en.json'; +import frAuth from '@alchemy/react-auth/translations/fr.json'; +import esAuth from '@alchemy/react-auth/translations/es.json'; +import deAuth from '@alchemy/react-auth/translations/de.json'; +import zhAuth from '@alchemy/react-auth/translations/zh.json'; + +const enMerged = { + ...en, + lib: { + ...enApi.lib, + ...enNav.lib, + ...enAuth.lib, + }, +}; + +const frMerged = { + ...fr, + lib: { + ...frApi.lib, + ...frNav.lib, + ...frAuth.lib, + }, +}; + +const esMerged = { + ...es, + lib: { + ...esApi.lib, + ...esNav.lib, + ...esAuth.lib, + }, +}; + +const deMerged = { + ...de, + lib: { + ...deApi.lib, + ...deNav.lib, + ...deAuth.lib, + }, +}; + +const zhMerged = { + ...zh, + lib: { + ...zhApi.lib, + ...zhNav.lib, + ...zhAuth.lib, + }, +}; + +export {enMerged as en, frMerged as fr, esMerged as es, deMerged as de, zhMerged as zh}; diff --git a/expose/client/translations/zh.json b/expose/client/translations/zh.json new file mode 100644 index 000000000..741535fd0 --- /dev/null +++ b/expose/client/translations/zh.json @@ -0,0 +1,17 @@ +{ + "download": "下载", + "download_archive": "下载存档", + "gallery": { + "empty": "画廊是空的" + }, + "map": { + "empty": "地图是空的" + }, + "menu": { + "toggle": "切换菜单" + }, + "order": { + "last_post_added": "最新", + "publication_name": "名称" + } +} diff --git a/lib/js/api/package.json b/lib/js/api/package.json index eb5cb9c31..8fbac21da 100644 --- a/lib/js/api/package.json +++ b/lib/js/api/package.json @@ -6,19 +6,27 @@ "keywords": [], "main": "index.ts", "license": "MIT", + "scripts": { + "translate": "i18next-scanner --config ../i18n/i18next-scanner.config.js" + }, + "files": [ + "translations/*.json" + ], "peerDependencies": { "axios": "^1.6.2", "react": "^18.2.0", "react-hook-form": "^7.51.0", - "react-i18next": "^13.5.0", + "react-i18next": "^14.1.0", "react-toastify": "^9.1.3" }, "devDependencies": { "@types/react": "^18.2.65", "axios": "^1.6.7", + "i18next-scanner": "^4.4.0", + "i18next-scanner-typescript": "^1.2.0", "react": "^18.2.0", "react-hook-form": "^7.51.0", - "react-i18next": "^13.5.0", + "react-i18next": "^14.1.0", "react-toastify": "^9.1.3" } } diff --git a/lib/js/api/src/useRequestErrorHandler.ts b/lib/js/api/src/useRequestErrorHandler.ts index 0b6743474..3e05e161d 100644 --- a/lib/js/api/src/useRequestErrorHandler.ts +++ b/lib/js/api/src/useRequestErrorHandler.ts @@ -36,7 +36,7 @@ export default function useRequestErrorHandler({ case 401: toast.error( t( - 'api:error.session_expired', + 'lib.api.error.session_expired', 'Your session has expired' ) as string, { @@ -47,7 +47,7 @@ export default function useRequestErrorHandler({ break; case 403: toast.error( - t('api:error.http_unauthorized', 'Unauthorized') as string + t('lib.api.error.http_unauthorized', 'Unauthorized') as string ); break; case 400: @@ -68,14 +68,14 @@ export default function useRequestErrorHandler({ // Handled by form break; case 429: - toast.error(data?.[hydraDescriptionKey] || data?.detail || t('api:http_error.429', { + toast.error(data?.[hydraDescriptionKey] || data?.detail || t('lib.api.http_error.429', { defaultValue: 'Too many requests, you can retry in {{minutes}}min', minutes: Math.ceil(parseInt(error.response?.headers?.['retry-after'] ?? '0') / 60), })); break; default: toast.error( - t('api:error.http_error', 'Server error') as string + t('lib.api.error.http_error', 'Server error') as string ); break; } diff --git a/lib/js/api/translations/de.json b/lib/js/api/translations/de.json new file mode 100644 index 000000000..372092b67 --- /dev/null +++ b/lib/js/api/translations/de.json @@ -0,0 +1,14 @@ +{ + "lib": { + "api": { + "error": { + "http_error": "Serverfehler", + "http_unauthorized": "Unberechtigt", + "session_expired": "Ihre Sitzung ist abgelaufen" + }, + "http_error": { + "429": "Zu viele Anfragen, Sie können es in {{minutes}} Minuten erneut versuchen" + } + } + } +} diff --git a/lib/js/api/translations/en.json b/lib/js/api/translations/en.json new file mode 100644 index 000000000..c98fd201f --- /dev/null +++ b/lib/js/api/translations/en.json @@ -0,0 +1,14 @@ +{ + "lib": { + "api": { + "error": { + "http_error": "Server error", + "http_unauthorized": "Unauthorized", + "session_expired": "Your session has expired" + }, + "http_error": { + "429": "Too many requests, you can retry in {{minutes}}min" + } + } + } +} diff --git a/lib/js/api/translations/es.json b/lib/js/api/translations/es.json new file mode 100644 index 000000000..1d784bad1 --- /dev/null +++ b/lib/js/api/translations/es.json @@ -0,0 +1,14 @@ +{ + "lib": { + "api": { + "error": { + "http_error": "Error del servidor", + "http_unauthorized": "No autorizado", + "session_expired": "Su sesión ha expirado" + }, + "http_error": { + "429": "Demasiadas solicitudes, puede volver a intentarlo en {{minutes}} min" + } + } + } +} diff --git a/lib/js/api/translations/fr.json b/lib/js/api/translations/fr.json new file mode 100644 index 000000000..1aba354c1 --- /dev/null +++ b/lib/js/api/translations/fr.json @@ -0,0 +1,14 @@ +{ + "lib": { + "api": { + "error": { + "http_error": "Erreur du serveur", + "http_unauthorized": "Non autorisé", + "session_expired": "Votre session a expiré" + }, + "http_error": { + "429": "Trop de requêtes, vous pouvez réessayer dans {{minutes}}min" + } + } + } +} diff --git a/lib/js/api/translations/zh.json b/lib/js/api/translations/zh.json new file mode 100644 index 000000000..37e176fd6 --- /dev/null +++ b/lib/js/api/translations/zh.json @@ -0,0 +1,14 @@ +{ + "lib": { + "api": { + "error": { + "http_error": "服务器错误", + "http_unauthorized": "未经授权", + "session_expired": "您的会话已过期" + }, + "http_error": { + "429": "请求过多,请在{{minutes}}分钟后重试" + } + } + } +} diff --git a/lib/js/i18n/i18next-scanner.config.js b/lib/js/i18n/i18next-scanner.config.js new file mode 100644 index 000000000..18220495e --- /dev/null +++ b/lib/js/i18n/i18next-scanner.config.js @@ -0,0 +1,86 @@ +const typescriptTransform = require('i18next-scanner-typescript'); + +const dir = 'translations'; + +module.exports = { + options: { + debug: true, + sort: true, + removeUnusedKeys: true, + func: { + list: ['i18next.t', 'i18n.t'], + extensions: ['.js', '.jsx'] + }, + trans: { + component: 'Trans', + i18nKey: 'i18nKey', + defaultsKey: 'defaults', + extensions: ['.js', '.jsx'], + fallbackKey: function(ns, value) { + return value; + }, + + // https://react.i18next.com/latest/trans-component#usage-with-simple-html-elements-like-less-than-br-greater-than-and-others-v10.4.0 + supportBasicHtmlNodes: true, // Enables keeping the name of simple nodes (e.g.
) in translations instead of indexed keys. + keepBasicHtmlNodesFor: ['br', 'strong', 'i', 'p'], // Which nodes are allowed to be kept in translations during defaultValue generation of . + + // https://github.com/acornjs/acorn/tree/master/acorn#interface + acorn: { + ecmaVersion: 2020, + sourceType: 'module', // defaults to 'module' + } + }, + lngs: ['en', 'fr', 'es', 'de', 'zh'], + ns: ['lib'], + defaultLng: 'en', + defaultNs: 'lib', + defaultValue: '__STRING_NOT_TRANSLATED__', + resource: { + loadPath: dir + '/{{lng}}.json', + savePath: dir + '/{{lng}}.json', + jsonIndent: 2, + lineEnding: '\n' + }, + nsSeparator: ':', + keySeparator: '.', + interpolation: { + prefix: '{{', + suffix: '}}' + }, + metadata: {}, + allowDynamicKeys: false, + }, + input: [ + 'src/**/*.{ts,tsx,js,jsx}', + ], + output: './', + transform: typescriptTransform( + // options + { + // default value for extensions + extensions: [".ts", ".tsx", ".jsx", ".js"], + // optional ts configuration + tsOptions: { + target: "es2017", + jsx: "preserve" + }, + }, + + // optional custom transform function + function customTransform(outputText, file, enc, done) { + "use strict"; + const parser = this.parser; + let count = 0; + + parser.parseFuncFromString(outputText, { list: ['t'] }, (key, options) => { + parser.set(key, Object.assign({}, options, { + nsSeparator: ':', + keySeparator: '.', + })); + ++count; + }); + + done(); + }, + ), +}; diff --git a/lib/js/i18n/package.json b/lib/js/i18n/package.json new file mode 100644 index 000000000..99d71ef53 --- /dev/null +++ b/lib/js/i18n/package.json @@ -0,0 +1,19 @@ +{ + "name": "@alchemy/i18n", + "version": "1.0.0", + "public": true, + "main": "src/index.ts", + "peerDependencies": { + "react-i18next": "^14.1.0" + }, + "dependencies": { + "i18next": "^23.11.2", + "i18next-browser-languagedetector": "^7.2.1", + "i18next-http-backend": "^2.5.1", + "i18next-localstorage-backend": "^4.2.0", + "react-i18next": "^14.1.0" + }, + "devDependencies": { + "react-i18next": "^14.1.0" + } +} diff --git a/lib/js/i18n/src/index.ts b/lib/js/i18n/src/index.ts new file mode 100644 index 000000000..ff47c057a --- /dev/null +++ b/lib/js/i18n/src/index.ts @@ -0,0 +1,83 @@ +import i18n, {ResourceLanguage} from 'i18next'; +import {I18nextProviderProps, initReactI18next} from 'react-i18next'; +import LanguageDetector from 'i18next-browser-languagedetector'; + +type Resources = {[language: string]: ResourceLanguage}; + +type Options = { + resources: Resources, + defaultNS?: I18nextProviderProps['defaultNS']; + locales?: string[]; + defaultLocale?: string; + onLanguageChanged?: (lng: string | undefined) => void; +} + +const defaultLocales = ['en', 'fr', 'de', 'es', 'zh']; +const rootDefaultLocale = 'en'; +const rootDefaultNs = 'app'; + +export function createI18N({ + resources, + onLanguageChanged, + defaultNS = rootDefaultNs, + locales = defaultLocales, + defaultLocale = rootDefaultLocale, +}: Options) { + i18n.use(LanguageDetector) + .use(initReactI18next) + .init({ + defaultNS, + supportedLngs: locales, + fallbackLng: defaultLocale, + interpolation: { + escapeValue: false, // not needed for react as it escapes by default + }, + resources, + }); + + + languageChanged(i18n.language); + i18n.on('languageChanged', (lng: string | undefined): void => { + languageChanged(lng); + onLanguageChanged && onLanguageChanged(lng); + }); + + return i18n; +} + +export function normalizeHTMLLocale(l: string): string { + return l.replace(/_/g, '-'); +} + +export function setHtmlLangAttr(lng: string | undefined): void { + if (lng) { + document.documentElement.setAttribute('lang', normalizeHTMLLocale(lng)); + } +} + +export function languageChanged(lng: string | undefined): void { + setHtmlLangAttr(lng); +} + +export function appendNS(resources: Resources, ns: string, r: {[language: string]: ResourceLanguage}, locales = defaultLocales): void { + locales.forEach(l => { + if (!resources[l]) { + resources[l] = {[ns]: r[l]}; + } else { + resources[l][ns] = r[l]; + } + }); +} + +export function createNS(r: {[language: string]: ResourceLanguage}, ns: string = rootDefaultNs, locales = defaultLocales): Resources { + const resources: Resources = {}; + locales.forEach(l => { + if (!resources[l]) { + resources[l] = {[ns]: r[l]}; + } else { + resources[l][ns] = r[l]; + } + }); + + return resources; +} diff --git a/lib/js/navigation/package.json b/lib/js/navigation/package.json index ed2c1a9ec..7721a8302 100644 --- a/lib/js/navigation/package.json +++ b/lib/js/navigation/package.json @@ -4,8 +4,12 @@ "public": true, "main": "index.ts", "files": [ - "src/proxy/MatomoRouteWrapper.tsx" + "src/proxy/MatomoRouteWrapper.tsx", + "translations/*.json" ], + "scripts": { + "translate": "i18next-scanner --config ../i18n/i18next-scanner.config.js" + }, "dependencies": { "@alchemy/core": "workspace:*", "@remix-run/router": "1.11.0", @@ -15,14 +19,16 @@ "@alchemy/phrasea-ui": "workspace:*", "@jonkoops/matomo-tracker-react": "^0.7.0", "react": "^18.2.0", - "react-i18next": "^13.5.0" + "react-i18next": "^14.1.0" }, "devDependencies": { "@alchemy/phrasea-ui": "workspace:*", "@jonkoops/matomo-tracker-react": "^0.7.0", "@types/react": "^18.2.65", - "i18next": "^23.10.1", + "i18next": "^23.11.2", "react": "^18.2.0", - "react-i18next": "^13.5.0" + "react-i18next": "^14.1.0", + "i18next-scanner": "^4.4.0", + "i18next-scanner-typescript": "^1.2.0" } } diff --git a/lib/js/navigation/src/useNavigationPrompt.tsx b/lib/js/navigation/src/useNavigationPrompt.tsx index 7990616e1..c530748c5 100644 --- a/lib/js/navigation/src/useNavigationPrompt.tsx +++ b/lib/js/navigation/src/useNavigationPrompt.tsx @@ -59,9 +59,9 @@ function useBeforeUnloadWhen(when: boolean, message: string): void { } export function useInRouterDirtyFormPrompt(t: TFunction, isDirty: boolean, modalIndex?: number) { - useInRouterNavigationPrompt(t('navigation:common.dismiss_changes', 'Are you sure you want to dismiss unsaved changes?'), isDirty, modalIndex); + useInRouterNavigationPrompt(t('lib.navigation.dismiss_changes', 'Are you sure you want to dismiss unsaved changes?'), isDirty, modalIndex); } export function useOutsideRouterDirtyFormPrompt(t: TFunction, isDirty: boolean, modalIndex?: number) { - useOutsideRouterNavigationPrompt(t('navigation:common.dismiss_changes', 'Are you sure you want to dismiss unsaved changes?'), isDirty, modalIndex); + useOutsideRouterNavigationPrompt(t('lib.navigation.dismiss_changes', 'Are you sure you want to dismiss unsaved changes?'), isDirty, modalIndex); } diff --git a/lib/js/navigation/translations/de.json b/lib/js/navigation/translations/de.json new file mode 100644 index 000000000..ed2b10c8e --- /dev/null +++ b/lib/js/navigation/translations/de.json @@ -0,0 +1,7 @@ +{ + "lib": { + "navigation": { + "dismiss_changes": "Sind Sie sicher, dass Sie die nicht gespeicherten Änderungen verwerfen möchten?" + } + } +} diff --git a/lib/js/navigation/translations/en.json b/lib/js/navigation/translations/en.json new file mode 100644 index 000000000..cdde48212 --- /dev/null +++ b/lib/js/navigation/translations/en.json @@ -0,0 +1,7 @@ +{ + "lib": { + "navigation": { + "dismiss_changes": "Are you sure you want to dismiss unsaved changes?" + } + } +} diff --git a/lib/js/navigation/translations/es.json b/lib/js/navigation/translations/es.json new file mode 100644 index 000000000..858590b11 --- /dev/null +++ b/lib/js/navigation/translations/es.json @@ -0,0 +1,7 @@ +{ + "lib": { + "navigation": { + "dismiss_changes": "¿Estás seguro de que quieres descartar los cambios no guardados?" + } + } +} diff --git a/lib/js/navigation/translations/fr.json b/lib/js/navigation/translations/fr.json new file mode 100644 index 000000000..1df7e1c98 --- /dev/null +++ b/lib/js/navigation/translations/fr.json @@ -0,0 +1,7 @@ +{ + "lib": { + "navigation": { + "dismiss_changes": "Êtes-vous sûr de vouloir ignorer les modifications non enregistrées ?" + } + } +} diff --git a/lib/js/navigation/translations/zh.json b/lib/js/navigation/translations/zh.json new file mode 100644 index 000000000..ef72bf23c --- /dev/null +++ b/lib/js/navigation/translations/zh.json @@ -0,0 +1,7 @@ +{ + "lib": { + "navigation": { + "dismiss_changes": "您确定要放弃未保存的更改吗?" + } + } +} diff --git a/lib/js/phrasea-ui/package.json b/lib/js/phrasea-ui/package.json index 38af012af..4fb1ae417 100644 --- a/lib/js/phrasea-ui/package.json +++ b/lib/js/phrasea-ui/package.json @@ -3,12 +3,15 @@ "version": "1.0.0", "public": true, "main": "index.ts", + "scripts": { + "translate": "i18next-scanner --config ../i18n/i18next-scanner.config.js" + }, "peerDependencies": { "@alchemy/navigation": "workspace:*", "@mui/icons-material": "^5.15.1", "@mui/material": "^5.15.13", "react": "^18.2.0", - "react-i18next": "^13.5.0" + "react-i18next": "^14.1.0" }, "dependencies": { "styled-components": "^6.1.8" @@ -19,6 +22,8 @@ "@mui/material": "^5.15.13", "@types/react": "^18.2.65", "react": "^18.2.0", - "react-i18next": "^13.5.0" + "react-i18next": "^14.1.0", + "i18next-scanner": "^4.4.0", + "i18next-scanner-typescript": "^1.2.0" } } diff --git a/lib/js/phrasea-ui/src/components/UserMenu.tsx b/lib/js/phrasea-ui/src/components/UserMenu.tsx index 6018e9f35..0adbf4196 100644 --- a/lib/js/phrasea-ui/src/components/UserMenu.tsx +++ b/lib/js/phrasea-ui/src/components/UserMenu.tsx @@ -51,7 +51,7 @@ export default function UserMenu({ diff --git a/lib/js/phrasea-ui/translations/de.json b/lib/js/phrasea-ui/translations/de.json new file mode 100644 index 000000000..c98a6ede5 --- /dev/null +++ b/lib/js/phrasea-ui/translations/de.json @@ -0,0 +1,10 @@ +{ + "lib": { + "ui": { + "menu": { + "account": "My account", + "logout": "Logout" + } + } + } +} diff --git a/lib/js/phrasea-ui/translations/en.json b/lib/js/phrasea-ui/translations/en.json new file mode 100644 index 000000000..c98a6ede5 --- /dev/null +++ b/lib/js/phrasea-ui/translations/en.json @@ -0,0 +1,10 @@ +{ + "lib": { + "ui": { + "menu": { + "account": "My account", + "logout": "Logout" + } + } + } +} diff --git a/lib/js/phrasea-ui/translations/es.json b/lib/js/phrasea-ui/translations/es.json new file mode 100644 index 000000000..c98a6ede5 --- /dev/null +++ b/lib/js/phrasea-ui/translations/es.json @@ -0,0 +1,10 @@ +{ + "lib": { + "ui": { + "menu": { + "account": "My account", + "logout": "Logout" + } + } + } +} diff --git a/lib/js/phrasea-ui/translations/fr.json b/lib/js/phrasea-ui/translations/fr.json new file mode 100644 index 000000000..c98a6ede5 --- /dev/null +++ b/lib/js/phrasea-ui/translations/fr.json @@ -0,0 +1,10 @@ +{ + "lib": { + "ui": { + "menu": { + "account": "My account", + "logout": "Logout" + } + } + } +} diff --git a/lib/js/phrasea-ui/translations/zh.json b/lib/js/phrasea-ui/translations/zh.json new file mode 100644 index 000000000..c98a6ede5 --- /dev/null +++ b/lib/js/phrasea-ui/translations/zh.json @@ -0,0 +1,10 @@ +{ + "lib": { + "ui": { + "menu": { + "account": "My account", + "logout": "Logout" + } + } + } +} diff --git a/lib/js/react-auth/package.json b/lib/js/react-auth/package.json index f2892d4d5..a3b6795ce 100644 --- a/lib/js/react-auth/package.json +++ b/lib/js/react-auth/package.json @@ -6,10 +6,16 @@ "keywords": [], "main": "index.ts", "license": "MIT", + "scripts": { + "translate": "i18next-scanner --config ../i18n/i18next-scanner.config.js" + }, + "files": [ + "translations/*.json" + ], "peerDependencies": { "@mui/material": "^5.15.13", "react": "^18.2.0", - "react-i18next": "^13.5.0", + "react-i18next": "^14.1.0", "react-router-dom": "6.18.0", "react-toastify": "^9.1.3" }, @@ -29,10 +35,12 @@ "@types/node": "^10.17.60", "@types/react": "^18.2.65", "axios": "^1.6.7", - "react-i18next": "^13.5.0", + "react-i18next": "^14.1.0", "react-router-dom": "6.18.0", "react-toastify": "^9.1.3", "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.2", + "i18next-scanner": "^4.4.0", + "i18next-scanner-typescript": "^1.2.0" } } diff --git a/lib/js/react-auth/src/components/SessionAboutToExpireModal.tsx b/lib/js/react-auth/src/components/SessionAboutToExpireModal.tsx index 1d9b6b834..ed6a36d1c 100644 --- a/lib/js/react-auth/src/components/SessionAboutToExpireModal.tsx +++ b/lib/js/react-auth/src/components/SessionAboutToExpireModal.tsx @@ -44,15 +44,15 @@ export default function SessionAboutToExpireModal({ > { expired ? - t('auth:session_expiration.dialog.expired.title', 'You session has expired') - : t('auth:session_expiration.dialog.about_to_expire.title', 'You session is about to expire') + t('lib.auth.sess_exp.expired.title', 'You session has expired') + : t('lib.auth.sess_exp.about_to_expire.title', 'You session is about to expire') } { expired ? - t('auth:session_expiration.dialog.expired.intro', `Don't forget to save your contents before signing in again!`) - : t('auth:session_expiration.dialog.about_to_expire.intro', 'Are you still here? Do you want to keep your session alive?') + t('lib.auth.sess_exp.expired.intro', `Don't forget to save your contents before signing in again!`) + : t('lib.auth.sess_exp.about_to_expire.intro', 'Are you still here? Do you want to keep your session alive?') } @@ -62,7 +62,7 @@ export default function SessionAboutToExpireModal({ : <> - {t('auth:session_expiration.dialog.about_to_expire.stay', 'Keep me in!')} + {t('lib.auth.sess_exp.about_to_expire.stay', 'Keep me in!')} } diff --git a/lib/js/react-auth/translations/de.json b/lib/js/react-auth/translations/de.json new file mode 100644 index 000000000..51275dde3 --- /dev/null +++ b/lib/js/react-auth/translations/de.json @@ -0,0 +1,19 @@ +{ + "lib": { + "auth": { + "sess_exp": { + "about_to_expire": { + "intro": "Bist du noch da? Möchtest du deine Sitzung aktiv halten?", + "logout": "Abmelden", + "stay": "Angemeldet bleiben!", + "title": "Deine Sitzung läuft bald ab" + }, + "expired": { + "intro": "Vergiss nicht, deine Inhalte zu speichern, bevor du dich erneut anmeldest!", + "sign_in": "Schließen", + "title": "Deine Sitzung ist abgelaufen" + } + } + } + } +} diff --git a/lib/js/react-auth/translations/en.json b/lib/js/react-auth/translations/en.json new file mode 100644 index 000000000..073b3a2ec --- /dev/null +++ b/lib/js/react-auth/translations/en.json @@ -0,0 +1,19 @@ +{ + "lib": { + "auth": { + "sess_exp": { + "about_to_expire": { + "intro": "Are you still here? Do you want to keep your session alive?", + "logout": "Logout", + "stay": "Keep me in!", + "title": "You session is about to expire" + }, + "expired": { + "intro": "Don't forget to save your contents before signing in again!", + "sign_in": "Close", + "title": "You session has expired" + } + } + } + } +} diff --git a/lib/js/react-auth/translations/es.json b/lib/js/react-auth/translations/es.json new file mode 100644 index 000000000..93d50a13d --- /dev/null +++ b/lib/js/react-auth/translations/es.json @@ -0,0 +1,19 @@ +{ + "lib": { + "auth": { + "sess_exp": { + "about_to_expire": { + "intro": "¿Todavía estás aquí? ¿Quieres mantener tu sesión activa?", + "logout": "Cerrar sesión", + "stay": "¡Mantenerme dentro!", + "title": "Tu sesión está a punto de expirar" + }, + "expired": { + "intro": "¡No olvides guardar tu contenido antes de volver a iniciar sesión!", + "sign_in": "Cerrar", + "title": "Tu sesión ha expirado" + } + } + } + } +} diff --git a/lib/js/react-auth/translations/fr.json b/lib/js/react-auth/translations/fr.json new file mode 100644 index 000000000..382da1d53 --- /dev/null +++ b/lib/js/react-auth/translations/fr.json @@ -0,0 +1,19 @@ +{ + "lib": { + "auth": { + "sess_exp": { + "about_to_expire": { + "intro": "Êtes-vous toujours là ? Voulez-vous maintenir votre session active ?", + "logout": "Déconnexion", + "stay": "Rester connecté !", + "title": "Votre session est sur le point d'expirer" + }, + "expired": { + "intro": "N'oubliez pas de sauvegarder vos changements avant de vous reconnecter !", + "sign_in": "Fermer", + "title": "Votre session a expiré" + } + } + } + } +} diff --git a/lib/js/react-auth/translations/zh.json b/lib/js/react-auth/translations/zh.json new file mode 100644 index 000000000..41826ccf7 --- /dev/null +++ b/lib/js/react-auth/translations/zh.json @@ -0,0 +1,19 @@ +{ + "lib": { + "auth": { + "sess_exp": { + "about_to_expire": { + "intro": "您还在吗?您想保持登录状态吗?", + "logout": "登出", + "stay": "保持登录状态!", + "title": "您的会话即将过期" + }, + "expired": { + "intro": "在重新登录之前,请记得保存您的内容!", + "sign_in": "关闭", + "title": "您的会话已过期" + } + } + } + } +} diff --git a/lib/js/react-form/package.json b/lib/js/react-form/package.json index 4341fa607..813b1a1c5 100644 --- a/lib/js/react-form/package.json +++ b/lib/js/react-form/package.json @@ -6,6 +6,12 @@ "keywords": [], "main": "index.ts", "license": "MIT", + "scripts": { + "translate": "i18next-scanner --config ../i18n/i18next-scanner.config.js" + }, + "files": [ + "translations/*.json" + ], "peerDependencies": { "@alchemy/api": "workspace:*", "@alchemy/navigation": "workspace:*", @@ -18,7 +24,7 @@ "@mui/material": "^5.15.13", "react": "^18.2.0", "react-hook-form": "^7.51.0", - "react-i18next": "^13.5.0", + "react-i18next": "^14.1.0", "react-toastify": "^9.1.3" }, "dependencies": { @@ -34,6 +40,8 @@ "@types/node": "^10.17.60", "@types/react": "^18.2.65", "react-toastify": "^9.1.3", - "typescript": "^5.4.2" + "typescript": "^5.4.2", + "i18next-scanner": "^4.4.0", + "i18next-scanner-typescript": "^1.2.0" } } diff --git a/lib/js/react-form/src/Collection/CollectionWidget.tsx b/lib/js/react-form/src/Collection/CollectionWidget.tsx index 27cba9846..4bc982932 100644 --- a/lib/js/react-form/src/Collection/CollectionWidget.tsx +++ b/lib/js/react-form/src/Collection/CollectionWidget.tsx @@ -86,7 +86,7 @@ export default function CollectionWidget({ color={'error'} > {removeLabel || - t('form.collection.remove', 'Remove')} + t('lib.form.collection.remove', 'Remove')}
@@ -94,7 +94,7 @@ export default function CollectionWidget({ {undefined === max || fields.length < max ? ( ) : ( '' diff --git a/lib/js/react-form/src/Collection/SortableCollectionWidget.tsx b/lib/js/react-form/src/Collection/SortableCollectionWidget.tsx index 14ce7a4b1..51b81c47d 100644 --- a/lib/js/react-form/src/Collection/SortableCollectionWidget.tsx +++ b/lib/js/react-form/src/Collection/SortableCollectionWidget.tsx @@ -55,7 +55,7 @@ export default function SortableCollectionWidget< useSensor(TouchSensor), ); - const {t} = useTranslation('admin'); + const {t} = useTranslation(); const appendItem = () => { append(typeof emptyItem === 'string' ? emptyItem : { @@ -79,7 +79,7 @@ export default function SortableCollectionWidget< setActiveId(active.id as string); } - const rLabel = removeLabel || t('form.collection.remove', 'Remove'); + const rLabel = removeLabel || t('lib.form.collection.remove', 'Remove'); const activeFieldIndex = null !== activeId ? fields.findIndex(f => f.id === activeId) : null; const activeField = @@ -145,7 +145,7 @@ export default function SortableCollectionWidget< disabled={Boolean(max) && fields.length >= max!} startIcon={} > - {addLabel || t('form.collection.add', 'Add')} + {addLabel || t('lib.form.collection.add', 'Add')} ); diff --git a/lib/js/react-form/src/FormFieldErrors.tsx b/lib/js/react-form/src/FormFieldErrors.tsx index 4d1affb2c..53304981c 100644 --- a/lib/js/react-form/src/FormFieldErrors.tsx +++ b/lib/js/react-form/src/FormFieldErrors.tsx @@ -18,7 +18,7 @@ export default function FormFieldErrors({ <> {errors[field]?.type === 'required' && ( - {t('form.error.required', 'This field is required')} + {t('lib.form.error.required', 'This field is required')} )} {errors[field] && ( diff --git a/lib/js/react-form/src/FormHasErrorsAlert.tsx b/lib/js/react-form/src/FormHasErrorsAlert.tsx index 13ddeafe5..eceaf17b2 100644 --- a/lib/js/react-form/src/FormHasErrorsAlert.tsx +++ b/lib/js/react-form/src/FormHasErrorsAlert.tsx @@ -20,7 +20,7 @@ export default function FormHasErrorsAlert({ {errors && ( {Object.keys(errors).length > 0 && - t('form.has_errors', 'Form contains errors')} + t('lib.form.has_errors', 'Form contains errors')} )} diff --git a/lib/js/react-form/src/Translations/FieldTranslationsEditDialog.tsx b/lib/js/react-form/src/Translations/FieldTranslationsEditDialog.tsx index b99237339..66ba1e496 100644 --- a/lib/js/react-form/src/Translations/FieldTranslationsEditDialog.tsx +++ b/lib/js/react-form/src/Translations/FieldTranslationsEditDialog.tsx @@ -77,7 +77,7 @@ export default function FieldTranslationsEditDialog< onSuccess: () => { if (!noToast) { toast.success( - t('form.translations.saved', 'Translations saved!'), + t('lib.form.translations.saved', 'Translations saved!'), ); } closeModal(); @@ -110,7 +110,7 @@ export default function FieldTranslationsEditDialog< errors={errors} /> - {t('form.translations.submit', 'Save')} + {t('lib.form.translations.submit', 'Save')} )} diff --git a/lib/js/react-form/src/Translations/TranslatedField.tsx b/lib/js/react-form/src/Translations/TranslatedField.tsx index a85ebd064..69075415d 100644 --- a/lib/js/react-form/src/Translations/TranslatedField.tsx +++ b/lib/js/react-form/src/Translations/TranslatedField.tsx @@ -49,7 +49,7 @@ export default function TranslatedField({ {children} diff --git a/lib/js/react-form/src/Translations/TranslationsWidget.tsx b/lib/js/react-form/src/Translations/TranslationsWidget.tsx index 17f7eeffb..bd9095ab0 100644 --- a/lib/js/react-form/src/Translations/TranslationsWidget.tsx +++ b/lib/js/react-form/src/Translations/TranslationsWidget.tsx @@ -26,14 +26,14 @@ type Props = { export default function TranslationsWidget< TFieldValues extends {translations: Translation[]}, >({name, control, register, errors, max, inputProps}: Props) { - const {t} = useTranslation('admin'); + const {t} = useTranslation(); return ( <> }> {t( - 'form.translations.collection.title', + 'lib.form.translations.collection.title', 'Translations', )} @@ -58,7 +58,7 @@ export default function TranslationsWidget< path={name} register={register} addLabel={t( - 'form.translations.collection.add', + 'lib.form.translations.collection.add', 'Add new translation', )} removeLabel={ @@ -81,7 +81,7 @@ export default function TranslationsWidget< severity={'warning'} > {t( - 'form.translations.disabled_translation', + 'lib.form.translations.disabled_translation', 'This translation is disabled', )} @@ -100,7 +100,7 @@ export default function TranslationsWidget< `${path}.${index}.locale` as any } placeholder={t( - 'form.translations.locale.placeholder', + 'lib.form.translations.locale.placeholder', 'Select locale', )} required={true} @@ -115,7 +115,7 @@ export default function TranslationsWidget<
= 1 < 3' dependencies: - '@algolia/autocomplete-shared': 1.17.0(@algolia/client-search@4.22.1)(algoliasearch@4.22.1) + '@algolia/autocomplete-shared': 1.17.0(@algolia/client-search@4.23.3)(algoliasearch@4.23.3) search-insights: 2.13.0 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch dev: false - /@algolia/autocomplete-shared@1.17.0(@algolia/client-search@4.22.1)(algoliasearch@4.22.1): + /@algolia/autocomplete-shared@1.17.0(@algolia/client-search@4.23.3)(algoliasearch@4.23.3): resolution: {integrity: sha512-7su4KH/2q2Fhud2VujUNhCMbIh7yp6wqWR3UuVje5P3kDRhTotPRmg3iRQi48YRYkk9o+airsrLl+rxJ/9FWng==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: - '@algolia/client-search': 4.22.1 - algoliasearch: 4.22.1 + '@algolia/client-search': 4.23.3 + algoliasearch: 4.23.3 dev: false /@algolia/autocomplete-theme-classic@1.17.0: resolution: {integrity: sha512-FsW/J/mG1YIPv93/QQ7KxMVNXAiVi9accGgoK2y3zDz58WpVgUug97SUoQzP4I9EMZAZAHQo0QbWXxpqTWkcOA==} dev: false - /@algolia/cache-browser-local-storage@4.22.1: - resolution: {integrity: sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==} + /@algolia/cache-browser-local-storage@4.23.3: + resolution: {integrity: sha512-vRHXYCpPlTDE7i6UOy2xE03zHF2C8MEFjPN2v7fRbqVpcOvAUQK81x3Kc21xyb5aSIpYCjWCZbYZuz8Glyzyyg==} dependencies: - '@algolia/cache-common': 4.22.1 + '@algolia/cache-common': 4.23.3 dev: false - /@algolia/cache-common@4.22.1: - resolution: {integrity: sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==} + /@algolia/cache-common@4.23.3: + resolution: {integrity: sha512-h9XcNI6lxYStaw32pHpB1TMm0RuxphF+Ik4o7tcQiodEdpKK+wKufY6QXtba7t3k8eseirEMVB83uFFF3Nu54A==} dev: false - /@algolia/cache-in-memory@4.22.1: - resolution: {integrity: sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==} + /@algolia/cache-in-memory@4.23.3: + resolution: {integrity: sha512-yvpbuUXg/+0rbcagxNT7un0eo3czx2Uf0y4eiR4z4SD7SiptwYTpbuS0IHxcLHG3lq22ukx1T6Kjtk/rT+mqNg==} dependencies: - '@algolia/cache-common': 4.22.1 + '@algolia/cache-common': 4.23.3 dev: false - /@algolia/client-account@4.22.1: - resolution: {integrity: sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==} + /@algolia/client-account@4.23.3: + resolution: {integrity: sha512-hpa6S5d7iQmretHHF40QGq6hz0anWEHGlULcTIT9tbUssWUriN9AUXIFQ8Ei4w9azD0hc1rUok9/DeQQobhQMA==} dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/transporter': 4.22.1 + '@algolia/client-common': 4.23.3 + '@algolia/client-search': 4.23.3 + '@algolia/transporter': 4.23.3 dev: false - /@algolia/client-analytics@4.22.1: - resolution: {integrity: sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==} + /@algolia/client-analytics@4.23.3: + resolution: {integrity: sha512-LBsEARGS9cj8VkTAVEZphjxTjMVCci+zIIiRhpFun9jGDUlS1XmhCW7CTrnaWeIuCQS/2iPyRqSy1nXPjcBLRA==} dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 + '@algolia/client-common': 4.23.3 + '@algolia/client-search': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 dev: false - /@algolia/client-common@4.22.1: - resolution: {integrity: sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==} + /@algolia/client-common@4.23.3: + resolution: {integrity: sha512-l6EiPxdAlg8CYhroqS5ybfIczsGUIAC47slLPOMDeKSVXYG1n0qGiz4RjAHLw2aD0xzh2EXZ7aRguPfz7UKDKw==} dependencies: - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 dev: false - /@algolia/client-personalization@4.22.1: - resolution: {integrity: sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==} + /@algolia/client-personalization@4.23.3: + resolution: {integrity: sha512-3E3yF3Ocr1tB/xOZiuC3doHQBQ2zu2MPTYZ0d4lpfWads2WTKG7ZzmGnsHmm63RflvDeLK/UVx7j2b3QuwKQ2g==} dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 + '@algolia/client-common': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 dev: false - /@algolia/client-search@4.22.1: - resolution: {integrity: sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==} + /@algolia/client-search@4.23.3: + resolution: {integrity: sha512-P4VAKFHqU0wx9O+q29Q8YVuaowaZ5EM77rxfmGnkHUJggh28useXQdopokgwMeYw2XUht49WX5RcTQ40rZIabw==} dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 + '@algolia/client-common': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/transporter': 4.23.3 + dev: false + + /@algolia/logger-common@4.23.3: + resolution: {integrity: sha512-y9kBtmJwiZ9ZZ+1Ek66P0M68mHQzKRxkW5kAAXYN/rdzgDN0d2COsViEFufxJ0pb45K4FRcfC7+33YB4BLrZ+g==} dev: false - /@algolia/logger-common@4.22.1: - resolution: {integrity: sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==} + /@algolia/logger-console@4.23.3: + resolution: {integrity: sha512-8xoiseoWDKuCVnWP8jHthgaeobDLolh00KJAdMe9XPrWPuf1by732jSpgy2BlsLTaT9m32pHI8CRfrOqQzHv3A==} + dependencies: + '@algolia/logger-common': 4.23.3 dev: false - /@algolia/logger-console@4.22.1: - resolution: {integrity: sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==} + /@algolia/recommend@4.23.3: + resolution: {integrity: sha512-9fK4nXZF0bFkdcLBRDexsnGzVmu4TSYZqxdpgBW2tEyfuSSY54D4qSRkLmNkrrz4YFvdh2GM1gA8vSsnZPR73w==} dependencies: - '@algolia/logger-common': 4.22.1 + '@algolia/cache-browser-local-storage': 4.23.3 + '@algolia/cache-common': 4.23.3 + '@algolia/cache-in-memory': 4.23.3 + '@algolia/client-common': 4.23.3 + '@algolia/client-search': 4.23.3 + '@algolia/logger-common': 4.23.3 + '@algolia/logger-console': 4.23.3 + '@algolia/requester-browser-xhr': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/requester-node-http': 4.23.3 + '@algolia/transporter': 4.23.3 dev: false - /@algolia/requester-browser-xhr@4.22.1: - resolution: {integrity: sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==} + /@algolia/requester-browser-xhr@4.23.3: + resolution: {integrity: sha512-jDWGIQ96BhXbmONAQsasIpTYWslyjkiGu0Quydjlowe+ciqySpiDUrJHERIRfELE5+wFc7hc1Q5hqjGoV7yghw==} dependencies: - '@algolia/requester-common': 4.22.1 + '@algolia/requester-common': 4.23.3 dev: false - /@algolia/requester-common@4.22.1: - resolution: {integrity: sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==} + /@algolia/requester-common@4.23.3: + resolution: {integrity: sha512-xloIdr/bedtYEGcXCiF2muajyvRhwop4cMZo+K2qzNht0CMzlRkm8YsDdj5IaBhshqfgmBb3rTg4sL4/PpvLYw==} dev: false - /@algolia/requester-node-http@4.22.1: - resolution: {integrity: sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==} + /@algolia/requester-node-http@4.23.3: + resolution: {integrity: sha512-zgu++8Uj03IWDEJM3fuNl34s746JnZOWn1Uz5taV1dFyJhVM/kTNw9Ik7YJWiUNHJQXcaD8IXD1eCb0nq/aByA==} dependencies: - '@algolia/requester-common': 4.22.1 + '@algolia/requester-common': 4.23.3 dev: false - /@algolia/transporter@4.22.1: - resolution: {integrity: sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==} + /@algolia/transporter@4.23.3: + resolution: {integrity: sha512-Wjl5gttqnf/gQKJA+dafnD0Y6Yw97yvfY8R9h0dQltX1GXTgNs1zWgvtWW0tHl1EgMdhAyw189uWiZMnL3QebQ==} dependencies: - '@algolia/cache-common': 4.22.1 - '@algolia/logger-common': 4.22.1 - '@algolia/requester-common': 4.22.1 + '@algolia/cache-common': 4.23.3 + '@algolia/logger-common': 4.23.3 + '@algolia/requester-common': 4.23.3 dev: false /@ampproject/remapping@2.3.0: @@ -1461,6 +1522,14 @@ packages: '@babel/highlight': 7.23.4 chalk: 2.4.2 + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + dev: true + /@babel/compat-data@7.23.5: resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} engines: {node: '>=6.9.0'} @@ -1717,6 +1786,16 @@ packages: chalk: 2.4.2 js-tokens: 4.0.0 + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + dev: true + /@babel/parser@7.24.0: resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} engines: {node: '>=6.0.0'} @@ -2701,6 +2780,12 @@ packages: dependencies: regenerator-runtime: 0.14.1 + /@babel/runtime@7.24.4: + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + /@babel/template@7.24.0: resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} engines: {node: '>=6.9.0'} @@ -3078,6 +3163,15 @@ packages: requiresBuild: true optional: true + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -3095,6 +3189,15 @@ packages: requiresBuild: true optional: true + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm@0.18.20: resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} @@ -3112,6 +3215,15 @@ packages: requiresBuild: true optional: true + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-x64@0.18.20: resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} @@ -3129,6 +3241,15 @@ packages: requiresBuild: true optional: true + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-arm64@0.18.20: resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} @@ -3146,6 +3267,15 @@ packages: requiresBuild: true optional: true + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-x64@0.18.20: resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} @@ -3163,6 +3293,15 @@ packages: requiresBuild: true optional: true + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-arm64@0.18.20: resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} @@ -3180,6 +3319,15 @@ packages: requiresBuild: true optional: true + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-x64@0.18.20: resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} @@ -3197,6 +3345,15 @@ packages: requiresBuild: true optional: true + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm64@0.18.20: resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} @@ -3214,6 +3371,15 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm@0.18.20: resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} @@ -3231,6 +3397,15 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ia32@0.18.20: resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} @@ -3248,6 +3423,15 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-loong64@0.18.20: resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} @@ -3265,6 +3449,15 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-mips64el@0.18.20: resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} @@ -3282,6 +3475,15 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ppc64@0.18.20: resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} @@ -3299,6 +3501,15 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-riscv64@0.18.20: resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} @@ -3316,6 +3527,15 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-s390x@0.18.20: resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} @@ -3333,6 +3553,15 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-x64@0.18.20: resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} @@ -3350,6 +3579,15 @@ packages: requiresBuild: true optional: true + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/netbsd-x64@0.18.20: resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} @@ -3367,6 +3605,15 @@ packages: requiresBuild: true optional: true + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/openbsd-x64@0.18.20: resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} @@ -3384,6 +3631,15 @@ packages: requiresBuild: true optional: true + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/sunos-x64@0.18.20: resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} @@ -3401,6 +3657,15 @@ packages: requiresBuild: true optional: true + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-arm64@0.18.20: resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} @@ -3418,6 +3683,15 @@ packages: requiresBuild: true optional: true + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-ia32@0.18.20: resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} @@ -3435,6 +3709,15 @@ packages: requiresBuild: true optional: true + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-x64@0.18.20: resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} @@ -3452,6 +3735,15 @@ packages: requiresBuild: true optional: true + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3522,6 +3814,13 @@ packages: /@floating-ui/utils@0.2.1: resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + /@gulpjs/to-absolute-glob@4.0.0: + resolution: {integrity: sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==} + engines: {node: '>=10.13.0'} + dependencies: + is-negated-glob: 1.0.0 + dev: true + /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} @@ -3982,12 +4281,29 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@mui/utils': 5.15.13(@types/react@18.2.65)(react@18.2.0) '@types/react': 18.2.65 prop-types: 15.8.1 react: 18.2.0 + /@mui/private-theming@5.15.14(@types/react@18.2.65)(react@18.2.0): + resolution: {integrity: sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.4 + '@mui/utils': 5.15.14(@types/react@18.2.65)(react@18.2.0) + '@types/react': 18.2.65 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + /@mui/styled-engine@5.15.11(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0): resolution: {integrity: sha512-So21AhAngqo07ces4S/JpX5UaMU2RHXpEA6hNzI6IQjd/1usMPxpgK8wkGgTe3JKmC2KDmH8cvoycq5H3Ii7/w==} engines: {node: '>=12.0.0'} @@ -4001,13 +4317,35 @@ packages: '@emotion/styled': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 + '@emotion/cache': 11.11.0 + '@emotion/react': 11.11.4(@types/react@18.2.65)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.65)(react@18.2.0) + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.2.0 + + /@mui/styled-engine@5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0): + resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + dependencies: + '@babel/runtime': 7.24.4 '@emotion/cache': 11.11.0 '@emotion/react': 11.11.4(@types/react@18.2.65)(react@18.2.0) '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.65)(react@18.2.0) csstype: 3.1.3 prop-types: 15.8.1 react: 18.2.0 + dev: false /@mui/system@5.15.13(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.65)(react@18.2.0): resolution: {integrity: sha512-eHaX3sniZXNWkxX0lmcLxROhQ5La0HkOuF7zxbSdAoHUOk07gboQYmF6hSJ/VBFx/GLanIw67FMTn88vc8niLg==} @@ -4038,6 +4376,36 @@ packages: prop-types: 15.8.1 react: 18.2.0 + /@mui/system@5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.65)(react@18.2.0): + resolution: {integrity: sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.4 + '@emotion/react': 11.11.4(@types/react@18.2.65)(react@18.2.0) + '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.65)(react@18.2.0) + '@mui/private-theming': 5.15.14(@types/react@18.2.65)(react@18.2.0) + '@mui/styled-engine': 5.15.14(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(react@18.2.0) + '@mui/types': 7.2.14(@types/react@18.2.65) + '@mui/utils': 5.15.14(@types/react@18.2.65)(react@18.2.0) + '@types/react': 18.2.65 + clsx: 2.1.0 + csstype: 3.1.3 + prop-types: 15.8.1 + react: 18.2.0 + dev: false + /@mui/types@7.2.13(@types/react@18.2.65): resolution: {integrity: sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==} peerDependencies: @@ -4048,6 +4416,17 @@ packages: dependencies: '@types/react': 18.2.65 + /@mui/types@7.2.14(@types/react@18.2.65): + resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@types/react': 18.2.65 + dev: false + /@mui/utils@5.15.13(@types/react@18.2.65)(react@18.2.0): resolution: {integrity: sha512-qNlR9FLEhORC4zVZ3fzF48213EhP/92N71AcFbhHN73lPJjAbq9lUv+71P7uEdRHdrrOlm8+1zE8/OBy6MUqdg==} engines: {node: '>=12.0.0'} @@ -4065,7 +4444,25 @@ packages: react: 18.2.0 react-is: 18.2.0 - /@mui/x-tree-view@6.17.0(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@mui/material@5.15.13)(@mui/system@5.15.13)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0): + /@mui/utils@5.15.14(@types/react@18.2.65)(react@18.2.0): + resolution: {integrity: sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.24.4 + '@types/prop-types': 15.7.12 + '@types/react': 18.2.65 + prop-types: 15.8.1 + react: 18.2.0 + react-is: 18.2.0 + dev: false + + /@mui/x-tree-view@6.17.0(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@mui/material@5.15.13)(@mui/system@5.15.15)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-09dc2D+Rjg2z8KOaxbUXyPi0aw7fm2jurEtV8Xw48xJ00joLWd5QJm1/v4CarEvaiyhTQzHImNqdgeJW8ZQB6g==} engines: {node: '>=14.0.0'} peerDependencies: @@ -4081,7 +4478,7 @@ packages: '@emotion/styled': 11.11.0(@emotion/react@11.11.4)(@types/react@18.2.65)(react@18.2.0) '@mui/base': 5.0.0-beta.39(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0) '@mui/material': 5.15.13(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0) - '@mui/system': 5.15.13(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.65)(react@18.2.0) + '@mui/system': 5.15.15(@emotion/react@11.11.4)(@emotion/styled@11.11.0)(@types/react@18.2.65)(react@18.2.0) '@mui/utils': 5.15.13(@types/react@18.2.65)(react@18.2.0) '@types/react-transition-group': 4.4.10 clsx: 2.1.0 @@ -4128,29 +4525,29 @@ packages: '@octokit/types': 6.41.0 dev: true - /@octokit/auth-token@5.0.1: - resolution: {integrity: sha512-RTmWsLfig8SBoiSdgvCht4BXl1CHU89Co5xiQ5JF19my/sIRDFCQ1RPrmK0exgqUZuNm39C/bV8+/83+MJEjGg==} + /@octokit/auth-token@5.1.1: + resolution: {integrity: sha512-rh3G3wDO8J9wSjfI436JUKzHIxq8NaiL0tVeB2aXmG6p/9859aUOAjA9pmSPNGGZxfwmaJ9ozOJImuNVJdpvbA==} engines: {node: '>= 18'} dev: true - /@octokit/core@6.0.1: - resolution: {integrity: sha512-MIpPQXu8Y8GjHwXM81JLveiV+DHJZtLMcB5nKekBGOl3iAtk0HT3i12Xl8Biybu+bCS1+k4qbuKEq5d0RxNRnQ==} + /@octokit/core@6.1.2: + resolution: {integrity: sha512-hEb7Ma4cGJGEUNOAVmyfdB/3WirWMg5hDuNFVejGEDFqupeOysLc2sG6HJxY2etBp5YQu5Wtxwi020jS9xlUwg==} engines: {node: '>= 18'} dependencies: - '@octokit/auth-token': 5.0.1 - '@octokit/graphql': 8.0.1 - '@octokit/request': 9.0.1 - '@octokit/request-error': 6.0.2 - '@octokit/types': 12.6.0 + '@octokit/auth-token': 5.1.1 + '@octokit/graphql': 8.1.1 + '@octokit/request': 9.1.1 + '@octokit/request-error': 6.1.1 + '@octokit/types': 13.4.1 before-after-hook: 3.0.2 universal-user-agent: 7.0.2 dev: true - /@octokit/endpoint@10.0.0: - resolution: {integrity: sha512-emBcNDxBdC1y3+knJonS5zhUB/CG6TihubxM2U1/pG/Z1y3a4oV0Gzz3lmkCvWWQI6h3tqBAX9MgCBFp+M68Jw==} + /@octokit/endpoint@10.1.1: + resolution: {integrity: sha512-JYjh5rMOwXMJyUpj028cu0Gbp7qe/ihxfJMLc8VZBMMqSwLgOxDI1911gV4Enl1QSavAQNJcwmwBF9M0VvLh6Q==} engines: {node: '>= 18'} dependencies: - '@octokit/types': 12.6.0 + '@octokit/types': 13.4.1 universal-user-agent: 7.0.2 dev: true @@ -4162,12 +4559,12 @@ packages: universal-user-agent: 6.0.1 dev: true - /@octokit/graphql@8.0.1: - resolution: {integrity: sha512-lLDb6LhC1gBj2CxEDa5Xk10+H/boonhs+3Mi6jpRyetskDKNHe6crMeKmUE2efoLofMP8ruannLlCUgpTFmVzQ==} + /@octokit/graphql@8.1.1: + resolution: {integrity: sha512-ukiRmuHTi6ebQx/HFRCXKbDlOh/7xEV6QUXaE7MJEKGNAncGI/STSbOkl12qVXZrfZdpXctx5O9X1AIaebiDBg==} engines: {node: '>= 18'} dependencies: - '@octokit/request': 9.0.1 - '@octokit/types': 12.6.0 + '@octokit/request': 9.1.1 + '@octokit/types': 13.4.1 universal-user-agent: 7.0.2 dev: true @@ -4175,8 +4572,8 @@ packages: resolution: {integrity: sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==} dev: true - /@octokit/openapi-types@20.0.0: - resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} + /@octokit/openapi-types@22.1.0: + resolution: {integrity: sha512-pGUdSP+eEPfZiQHNkZI0U01HLipxncisdJQB4G//OAmfeO8sqTQ9KRa0KF03TUPCziNsoXUrTg4B2Q1EX++T0Q==} dev: true /@octokit/plugin-paginate-rest@1.1.2: @@ -4185,12 +4582,12 @@ packages: '@octokit/types': 2.16.2 dev: true - /@octokit/plugin-request-log@1.0.4(@octokit/core@6.0.1): + /@octokit/plugin-request-log@1.0.4(@octokit/core@6.1.2): resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} peerDependencies: '@octokit/core': '>=3' dependencies: - '@octokit/core': 6.0.1 + '@octokit/core': 6.1.2 dev: true /@octokit/plugin-rest-endpoint-methods@2.4.0: @@ -4216,11 +4613,11 @@ packages: once: 1.4.0 dev: true - /@octokit/request-error@6.0.2: - resolution: {integrity: sha512-WtRVpoHcNXs84+s9s/wqfHaxM68NGMg8Av7h59B50OVO0PwwMx+2GgQ/OliUd0iQBSNWgR6N8afi/KjSHbXHWw==} + /@octokit/request-error@6.1.1: + resolution: {integrity: sha512-1mw1gqT3fR/WFvnoVpY/zUM2o/XkMs/2AszUUG9I69xn0JFLv6PGkPhNk5lbfvROs79wiS0bqiJNxfCZcRJJdg==} engines: {node: '>= 18'} dependencies: - '@octokit/types': 12.6.0 + '@octokit/types': 13.4.1 dev: true /@octokit/request@5.6.3: @@ -4236,22 +4633,22 @@ packages: - encoding dev: true - /@octokit/request@9.0.1: - resolution: {integrity: sha512-kL+cAcbSl3dctYLuJmLfx6Iku2MXXy0jszhaEIjQNaCp4zjHXrhVAHeuaRdNvJjW9qjl3u1MJ72+OuBP0YW/pg==} + /@octokit/request@9.1.1: + resolution: {integrity: sha512-pyAguc0p+f+GbQho0uNetNQMmLG1e80WjkIaqqgUkihqUp0boRU6nKItXO4VWnr+nbZiLGEyy4TeKRwqaLvYgw==} engines: {node: '>= 18'} dependencies: - '@octokit/endpoint': 10.0.0 - '@octokit/request-error': 6.0.2 - '@octokit/types': 12.6.0 + '@octokit/endpoint': 10.1.1 + '@octokit/request-error': 6.1.1 + '@octokit/types': 13.4.1 universal-user-agent: 7.0.2 dev: true - /@octokit/rest@16.43.2(@octokit/core@6.0.1): + /@octokit/rest@16.43.2(@octokit/core@6.1.2): resolution: {integrity: sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ==} dependencies: '@octokit/auth-token': 2.5.0 '@octokit/plugin-paginate-rest': 1.1.2 - '@octokit/plugin-request-log': 1.0.4(@octokit/core@6.0.1) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@6.1.2) '@octokit/plugin-rest-endpoint-methods': 2.4.0 '@octokit/request': 5.6.3 '@octokit/request-error': 1.2.1 @@ -4270,10 +4667,10 @@ packages: - encoding dev: true - /@octokit/types@12.6.0: - resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==} + /@octokit/types@13.4.1: + resolution: {integrity: sha512-Y73oOAzRBAUzR/iRAbGULzpNkX8vaxKCqEtg6K74Ff3w9f5apFnWtE/2nade7dMWWW3bS5Kkd6DJS4HF04xreg==} dependencies: - '@octokit/openapi-types': 20.0.0 + '@octokit/openapi-types': 22.1.0 dev: true /@octokit/types@2.16.2: @@ -4301,13 +4698,13 @@ packages: /@radix-ui/number@1.0.1: resolution: {integrity: sha512-T5gIdVO2mmPW3NNhjNgEP3cqMXjXL9UbO0BzWcXfvdBs+BohbQxvd/K5hSVKmn9/lbTdsQVKbUcP5WLCwvUbBg==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 dev: true /@radix-ui/primitive@1.0.1: resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 dev: true /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0): @@ -4323,7 +4720,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.65 '@types/react-dom': 18.2.22 @@ -4344,7 +4741,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.65)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.65)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0) @@ -4364,7 +4761,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@types/react': 18.2.65 react: 18.2.0 dev: true @@ -4378,7 +4775,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@types/react': 18.2.65 react: 18.2.0 dev: true @@ -4392,7 +4789,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@types/react': 18.2.65 react: 18.2.0 dev: true @@ -4410,7 +4807,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.65)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0) @@ -4431,7 +4828,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@types/react': 18.2.65 react: 18.2.0 dev: true @@ -4449,7 +4846,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.65)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.65)(react@18.2.0) @@ -4468,7 +4865,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.65)(react@18.2.0) '@types/react': 18.2.65 react: 18.2.0 @@ -4487,7 +4884,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.65)(react@18.2.0) @@ -4517,7 +4914,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.65 '@types/react-dom': 18.2.22 @@ -4538,7 +4935,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.65)(react@18.2.0) '@types/react': 18.2.65 '@types/react-dom': 18.2.22 @@ -4559,7 +4956,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.65)(react@18.2.0) @@ -4588,7 +4985,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0) @@ -4629,7 +5026,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.65 '@types/react-dom': 18.2.22 @@ -4646,7 +5043,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.65)(react@18.2.0) '@types/react': 18.2.65 react: 18.2.0 @@ -4665,7 +5062,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-context': 1.0.1(@types/react@18.2.65)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.65)(react@18.2.0) @@ -4692,7 +5089,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.65)(react@18.2.0) @@ -4715,7 +5112,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-context': 1.0.1(@types/react@18.2.65)(react@18.2.0) '@radix-ui/react-direction': 1.0.1(@types/react@18.2.65)(react@18.2.0) @@ -4738,7 +5135,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@types/react': 18.2.65 react: 18.2.0 dev: true @@ -4752,7 +5149,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.65)(react@18.2.0) '@types/react': 18.2.65 react: 18.2.0 @@ -4767,7 +5164,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.65)(react@18.2.0) '@types/react': 18.2.65 react: 18.2.0 @@ -4782,7 +5179,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@types/react': 18.2.65 react: 18.2.0 dev: true @@ -4796,7 +5193,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@types/react': 18.2.65 react: 18.2.0 dev: true @@ -4810,7 +5207,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/rect': 1.0.1 '@types/react': 18.2.65 react: 18.2.0 @@ -4825,7 +5222,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.65)(react@18.2.0) '@types/react': 18.2.65 react: 18.2.0 @@ -4844,7 +5241,7 @@ packages: '@types/react-dom': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.65)(react-dom@18.2.0)(react@18.2.0) '@types/react': 18.2.65 '@types/react-dom': 18.2.22 @@ -4855,7 +5252,7 @@ packages: /@radix-ui/rect@1.0.1: resolution: {integrity: sha512-fyrgCaedtvMg9NK3en0pnOYJdtfwxUcNolezkNPUsoX57X8oQk+NkqcvzHXD2uKNij6GXmWU9NDru2IWjrO4BQ==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 dev: true /@react-dnd/asap@5.0.2: @@ -5206,7 +5603,7 @@ packages: debug: 4.3.4(supports-color@5.5.0) import-from: 3.0.0 lodash: 4.17.21 - semantic-release: 15.14.0(@octokit/core@6.0.1) + semantic-release: 15.14.0(@octokit/core@6.1.2) transitivePeerDependencies: - supports-color dev: true @@ -5215,13 +5612,13 @@ packages: resolution: {integrity: sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==} dev: true - /@semantic-release/github@5.5.8(@octokit/core@6.0.1)(semantic-release@15.14.0): + /@semantic-release/github@5.5.8(@octokit/core@6.1.2)(semantic-release@15.14.0): resolution: {integrity: sha512-YxbBXbCThs/Xk3E4QU01AMIUM8eb0UTvjHJtclTDR3/DEW7kUpmXQqBMnSh3qCTuk4scRFIoaF0fGU/0xByZug==} engines: {node: '>=8.16'} peerDependencies: semantic-release: '>=15.8.0 <16.0.0' dependencies: - '@octokit/rest': 16.43.2(@octokit/core@6.0.1) + '@octokit/rest': 16.43.2(@octokit/core@6.1.2) '@semantic-release/error': 2.2.0 aggregate-error: 3.1.0 bottleneck: 2.19.5 @@ -5236,7 +5633,7 @@ packages: mime: 2.6.0 p-filter: 2.1.0 p-retry: 4.6.2 - semantic-release: 15.14.0(@octokit/core@6.0.1) + semantic-release: 15.14.0(@octokit/core@6.1.2) url-join: 4.0.1 transitivePeerDependencies: - '@octokit/core' @@ -5261,7 +5658,7 @@ packages: rc: 1.2.8 read-pkg: 5.2.0 registry-auth-token: 4.2.2 - semantic-release: 15.14.0(@octokit/core@6.0.1) + semantic-release: 15.14.0(@octokit/core@6.1.2) tempy: 0.3.0 dev: true @@ -5281,7 +5678,7 @@ packages: into-stream: 5.1.1 lodash: 4.17.21 read-pkg-up: 7.0.1 - semantic-release: 15.14.0(@octokit/core@6.0.1) + semantic-release: 15.14.0(@octokit/core@6.1.2) transitivePeerDependencies: - supports-color dev: true @@ -6501,12 +6898,26 @@ packages: defer-to-connect: 1.1.3 dev: true + /@testing-library/dom@10.0.0: + resolution: {integrity: sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g==} + engines: {node: '>=18'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/runtime': 7.24.4 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + dev: true + /@testing-library/dom@8.20.1: resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==} engines: {node: '>=12'} dependencies: '@babel/code-frame': 7.23.5 - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 @@ -6582,17 +6993,17 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@testing-library/dom': 8.20.1 dev: true - /@testing-library/user-event@14.5.2(@testing-library/dom@9.3.4): + /@testing-library/user-event@14.5.2(@testing-library/dom@10.0.0): resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@testing-library/dom': '>=7.21.4' dependencies: - '@testing-library/dom': 9.3.4 + '@testing-library/dom': 10.0.0 dev: true /@toast-ui/react-image-editor@3.15.2(react@18.2.0): @@ -6916,11 +7327,11 @@ packages: /@types/eslint-scope@3.7.7: resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: - '@types/eslint': 8.56.5 + '@types/eslint': 8.56.10 '@types/estree': 1.0.5 - /@types/eslint@8.56.5: - resolution: {integrity: sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==} + /@types/eslint@8.56.10: + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 @@ -7118,6 +7529,11 @@ packages: dependencies: undici-types: 5.26.5 + /@types/node@18.19.31: + resolution: {integrity: sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==} + dependencies: + undici-types: 5.26.5 + /@types/normalize-package-data@2.4.4: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} dev: true @@ -7132,6 +7548,10 @@ packages: /@types/prop-types@15.7.11: resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + /@types/prop-types@15.7.12: + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + dev: false + /@types/qs@6.9.12: resolution: {integrity: sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==} dev: true @@ -7442,7 +7862,7 @@ packages: peerDependencies: video.js: ^6 || ^7 dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@videojs/vhs-utils': 3.0.5 aes-decrypter: 3.1.3 global: 4.4.0 @@ -7456,7 +7876,7 @@ packages: resolution: {integrity: sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==} engines: {node: '>=8', npm: '>=5'} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 global: 4.4.0 url-toolkit: 2.2.5 dev: false @@ -7464,7 +7884,7 @@ packages: /@videojs/xhr@2.6.0: resolution: {integrity: sha512-7J361GiN1tXpm+gd0xz2QWr3xNWBE+rytvo8J3KuggFaLg+U37gZQ2BuPLcnkfGffy2e+ozY70RHC8jt7zjA6Q==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 global: 4.4.0 is-function: 1.0.2 dev: false @@ -7735,26 +8155,6 @@ packages: resolution: {integrity: sha512-ziv35kaYELFw4suWlotz/Xsl1/1LhWAbwFoD3zIgCgP9gXGECEsAM4GhiB0T0xZdmQjyv6hmAzO280g0+n4vGw==} dev: false - /acorn-bigint@0.4.0(acorn@6.4.2): - resolution: {integrity: sha512-W9iaqWzqFo7ZBLmI9dMjHYGrN0Nm/ZgToqhvd3RELJux7RsX6k1/80h+bD9TtTpeKky/kYNbr3+vHWqI3hdyfA==} - engines: {node: '>=4.8.2'} - deprecated: acorn>=6.2 supports bigint - peerDependencies: - acorn: ^6.0.0 - dependencies: - acorn: 6.4.2 - dev: true - - /acorn-class-fields@0.3.7(acorn@6.4.2): - resolution: {integrity: sha512-jdUWSFce0fuADUljmExz4TWpPkxmRW/ZCPRqeeUzbGf0vFUcpQYbyq52l75qGd0oSwwtAepeL6hgb/naRgvcKQ==} - engines: {node: '>=4.8.2'} - peerDependencies: - acorn: ^6 || ^7 || ^8 - dependencies: - acorn: 6.4.2 - acorn-private-class-elements: 0.2.7(acorn@6.4.2) - dev: true - /acorn-class-fields@0.3.7(acorn@8.11.3): resolution: {integrity: sha512-jdUWSFce0fuADUljmExz4TWpPkxmRW/ZCPRqeeUzbGf0vFUcpQYbyq52l75qGd0oSwwtAepeL6hgb/naRgvcKQ==} engines: {node: '>=4.8.2'} @@ -7765,34 +8165,6 @@ packages: acorn-private-class-elements: 0.2.7(acorn@8.11.3) dev: true - /acorn-dynamic-import@4.0.0(acorn@6.4.2): - resolution: {integrity: sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==} - deprecated: This is probably built in to whatever tool you're using. If you still need it... idk - peerDependencies: - acorn: ^6.0.0 - dependencies: - acorn: 6.4.2 - dev: true - - /acorn-dynamic-import@4.0.0(acorn@8.11.3): - resolution: {integrity: sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==} - deprecated: This is probably built in to whatever tool you're using. If you still need it... idk - peerDependencies: - acorn: ^6.0.0 - dependencies: - acorn: 8.11.3 - dev: true - - /acorn-export-ns-from@0.1.0(acorn@6.4.2): - resolution: {integrity: sha512-QDQJBe2DfxNBIMxs+19XY2i/XXilJn+kPgX30HWNYK4IXoNj3ACNSWPU7szL0SzqjFyOG4zoZxG9P7JfNw5g7A==} - engines: {node: '>=4.8.2'} - deprecated: acorn>=7.2 supports export-ns-from - peerDependencies: - acorn: ^6.0.1 - dependencies: - acorn: 6.4.2 - dev: true - /acorn-globals@4.3.4: resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} dependencies: @@ -7813,24 +8185,6 @@ packages: dependencies: acorn: 8.11.3 - /acorn-import-meta@1.1.0(acorn@6.4.2): - resolution: {integrity: sha512-pshgiVR5mhpjFVdizKTN+kAGRqjJFUOEB3TvpQ6kiAutb1lvHrIVVcGoe5xzMpJkVNifCeymMG7/tsDkWn8CdQ==} - engines: {node: '>=4.8.2'} - deprecated: acorn>=7.2 supports import-meta - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 - dependencies: - acorn: 6.4.2 - dev: true - - /acorn-jsx@5.3.2(acorn@6.4.2): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 6.4.2 - dev: true - /acorn-jsx@5.3.2(acorn@7.4.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -7847,35 +8201,6 @@ packages: acorn: 8.11.3 dev: true - /acorn-logical-assignment@0.1.4(acorn@6.4.2): - resolution: {integrity: sha512-SeqO1iRtc/NeXo4bTkyK0hN0CIoKi/FQMN1NqhTr5UxqEn4p2wKNTZl+xzvU7i2u/k0f66YR7pNPi2ckPwYubg==} - engines: {node: '>=4.8.2'} - deprecated: acorn>=7.4 supports logical assignments - peerDependencies: - acorn: ^6 || ^7 || ^8 - dependencies: - acorn: 6.4.2 - dev: true - - /acorn-numeric-separator@0.3.6(acorn@6.4.2): - resolution: {integrity: sha512-jUr5esgChu4k7VzesH/Nww3EysuyGJJcTEEiXqILUFKpO96PNyEXmK21M6nE0TSqGA1PeEg1MzgqJaoFsn9JMw==} - engines: {node: '>=4.8.2'} - deprecated: acorn>=7.4 supports numeric separators - peerDependencies: - acorn: ^6 || ^7 || ^8 - dependencies: - acorn: 6.4.2 - dev: true - - /acorn-private-class-elements@0.2.7(acorn@6.4.2): - resolution: {integrity: sha512-+GZH2wOKNZOBI4OOPmzpo4cs6mW297sn6fgIk1dUI08jGjhAaEwvC39mN2gJAg2lmAQJ1rBkFqKWonL3Zz6PVA==} - engines: {node: '>=4.8.2'} - peerDependencies: - acorn: ^6.1.0 || ^7 || ^8 - dependencies: - acorn: 6.4.2 - dev: true - /acorn-private-class-elements@0.2.7(acorn@8.11.3): resolution: {integrity: sha512-+GZH2wOKNZOBI4OOPmzpo4cs6mW297sn6fgIk1dUI08jGjhAaEwvC39mN2gJAg2lmAQJ1rBkFqKWonL3Zz6PVA==} engines: {node: '>=4.8.2'} @@ -7885,42 +8210,14 @@ packages: acorn: 8.11.3 dev: true - /acorn-private-methods@0.3.3(acorn@6.4.2): - resolution: {integrity: sha512-46oeEol3YFvLSah5m9hGMlNpxDBCEkdceJgf01AjqKYTK9r6HexKs2rgSbLK81pYjZZMonhftuUReGMlbbv05w==} - engines: {node: '>=4.8.2'} - peerDependencies: - acorn: ^6 || ^7 || ^8 - dependencies: - acorn: 6.4.2 - acorn-private-class-elements: 0.2.7(acorn@6.4.2) - dev: true - /acorn-private-methods@0.3.3(acorn@8.11.3): - resolution: {integrity: sha512-46oeEol3YFvLSah5m9hGMlNpxDBCEkdceJgf01AjqKYTK9r6HexKs2rgSbLK81pYjZZMonhftuUReGMlbbv05w==} - engines: {node: '>=4.8.2'} - peerDependencies: - acorn: ^6 || ^7 || ^8 - dependencies: - acorn: 8.11.3 - acorn-private-class-elements: 0.2.7(acorn@8.11.3) - dev: true - - /acorn-stage3@2.1.0(acorn@6.4.2): - resolution: {integrity: sha512-6R3IWwmMl1MBYf6JtaquuE8OqtCArA1zaDlY7QUeUNDcUzNJoZJm1nFQrv0SzdjkRv1khADbMfucFsF661LGow==} + resolution: {integrity: sha512-46oeEol3YFvLSah5m9hGMlNpxDBCEkdceJgf01AjqKYTK9r6HexKs2rgSbLK81pYjZZMonhftuUReGMlbbv05w==} engines: {node: '>=4.8.2'} peerDependencies: - acorn: ^6.1.0 + acorn: ^6 || ^7 || ^8 dependencies: - acorn: 6.4.2 - acorn-bigint: 0.4.0(acorn@6.4.2) - acorn-class-fields: 0.3.7(acorn@6.4.2) - acorn-dynamic-import: 4.0.0(acorn@6.4.2) - acorn-export-ns-from: 0.1.0(acorn@6.4.2) - acorn-import-meta: 1.1.0(acorn@6.4.2) - acorn-logical-assignment: 0.1.4(acorn@6.4.2) - acorn-numeric-separator: 0.3.6(acorn@6.4.2) - acorn-private-methods: 0.3.3(acorn@6.4.2) - acorn-static-class-features: 0.2.4(acorn@6.4.2) + acorn: 8.11.3 + acorn-private-class-elements: 0.2.7(acorn@8.11.3) dev: true /acorn-stage3@4.0.0(acorn@8.11.3): @@ -7935,16 +8232,6 @@ packages: acorn-static-class-features: 0.2.4(acorn@8.11.3) dev: true - /acorn-static-class-features@0.2.4(acorn@6.4.2): - resolution: {integrity: sha512-5X4mpYq5J3pdndLmIB0+WtFd/mKWnNYpuTlTzj32wUu/PMmEGOiayQ5UrqgwdBNiaZBtDDh5kddpP7Yg2QaQYA==} - engines: {node: '>=4.8.2'} - peerDependencies: - acorn: ^6.1.0 || ^7 || ^8 - dependencies: - acorn: 6.4.2 - acorn-private-class-elements: 0.2.7(acorn@6.4.2) - dev: true - /acorn-static-class-features@0.2.4(acorn@8.11.3): resolution: {integrity: sha512-5X4mpYq5J3pdndLmIB0+WtFd/mKWnNYpuTlTzj32wUu/PMmEGOiayQ5UrqgwdBNiaZBtDDh5kddpP7Yg2QaQYA==} engines: {node: '>=4.8.2'} @@ -8000,7 +8287,7 @@ packages: /aes-decrypter@3.1.3: resolution: {integrity: sha512-VkG9g4BbhMBy+N5/XodDeV6F02chEk9IpgRTq/0bS80y4dzy79VH2Gtms02VXomf3HmyRe3yyJYkJ990ns+d6A==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@videojs/vhs-utils': 3.0.5 global: 4.4.0 pkcs7: 1.0.4 @@ -8052,23 +8339,24 @@ packages: uri-js: 4.4.1 dev: false - /algoliasearch@4.22.1: - resolution: {integrity: sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==} + /algoliasearch@4.23.3: + resolution: {integrity: sha512-Le/3YgNvjW9zxIQMRhUHuhiUjAlKY/zsdZpfq4dlLqg6mEm0nL6yk+7f2hDOtLpxsgE4jSzDmvHL7nXdBp5feg==} dependencies: - '@algolia/cache-browser-local-storage': 4.22.1 - '@algolia/cache-common': 4.22.1 - '@algolia/cache-in-memory': 4.22.1 - '@algolia/client-account': 4.22.1 - '@algolia/client-analytics': 4.22.1 - '@algolia/client-common': 4.22.1 - '@algolia/client-personalization': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/logger-common': 4.22.1 - '@algolia/logger-console': 4.22.1 - '@algolia/requester-browser-xhr': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/requester-node-http': 4.22.1 - '@algolia/transporter': 4.22.1 + '@algolia/cache-browser-local-storage': 4.23.3 + '@algolia/cache-common': 4.23.3 + '@algolia/cache-in-memory': 4.23.3 + '@algolia/client-account': 4.23.3 + '@algolia/client-analytics': 4.23.3 + '@algolia/client-common': 4.23.3 + '@algolia/client-personalization': 4.23.3 + '@algolia/client-search': 4.23.3 + '@algolia/logger-common': 4.23.3 + '@algolia/logger-console': 4.23.3 + '@algolia/recommend': 4.23.3 + '@algolia/requester-browser-xhr': 4.23.3 + '@algolia/requester-common': 4.23.3 + '@algolia/requester-node-http': 4.23.3 + '@algolia/transporter': 4.23.3 dev: false /amdefine@1.0.1: @@ -8428,13 +8716,6 @@ packages: resolution: {integrity: sha512-jlpIfsOoNoafl92Sz//64uQHGSyMrD2vYG5d8o2a4qGvyNCvXur7bzIsWtAC/6flI2RYAp3kv8rsfBtaLm7w0g==} dev: true - /append-buffer@1.0.2: - resolution: {integrity: sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==} - engines: {node: '>=0.10.0'} - dependencies: - buffer-equal: 1.0.1 - dev: true - /append-transform@0.4.0: resolution: {integrity: sha512-Yisb7ew0ZEyDtRYQ+b+26o9KbiYPFxwcsxKzbssigzRRMJ9LpExPVUg6Fos7eP7yP3q7///tzze4nm4lTptPBw==} engines: {node: '>=0.10.0'} @@ -8846,7 +9127,7 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 cosmiconfig: 7.1.0 resolve: 1.22.8 @@ -8971,6 +9252,12 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /bare-events@2.2.2: + resolution: {integrity: sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==} + requiresBuild: true + dev: true + optional: true + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: true @@ -9038,6 +9325,14 @@ packages: readable-stream: 3.6.2 dev: true + /bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: true + /block-stream2@2.1.0: resolution: {integrity: sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg==} dependencies: @@ -9209,11 +9504,6 @@ packages: /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - /buffer-equal@1.0.1: - resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} - engines: {node: '>=0.4'} - dev: true - /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -9228,6 +9518,13 @@ packages: ieee754: 1.2.1 dev: true + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + /builtin-modules@1.1.1: resolution: {integrity: sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==} engines: {node: '>=0.10.0'} @@ -9602,11 +9899,6 @@ packages: wrap-ansi: 6.2.0 dev: true - /clone-buffer@1.0.0: - resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} - engines: {node: '>= 0.10'} - dev: true - /clone-deep@4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} @@ -9635,14 +9927,6 @@ packages: engines: {node: '>=0.8'} dev: true - /cloneable-readable@1.1.3: - resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} - dependencies: - inherits: 2.0.4 - process-nextick-args: 2.0.1 - readable-stream: 2.3.8 - dev: true - /clsx@1.2.1: resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} engines: {node: '>=6'} @@ -9748,10 +10032,6 @@ packages: /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - /commander@3.0.2: - resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} - dev: true - /commander@6.2.1: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} @@ -9946,7 +10226,7 @@ packages: dependencies: JSONStream: 1.3.5 is-text-path: 1.0.1 - lodash: 4.17.11 + lodash: 4.17.21 meow: 4.0.1 split2: 2.2.0 through2: 2.0.5 @@ -10116,6 +10396,14 @@ packages: cross-spawn: 7.0.3 dev: false + /cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + /cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: @@ -10773,7 +11061,7 @@ packages: /dom-helpers@3.4.0: resolution: {integrity: sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 dev: false /dom-helpers@5.2.1: @@ -10921,14 +11209,6 @@ packages: jsbn: 0.1.1 safer-buffer: 2.1.2 - /editions@2.3.1: - resolution: {integrity: sha512-ptGvkwTvGdGfC0hfhKg0MT+TRLRKGtUiWGBInxOm5pz7ssADezahjCUaYuZ8Dr+C05FW0AECIIPt4WBxVINEhA==} - engines: {node: '>=0.8'} - dependencies: - errlop: 2.2.0 - semver: 6.3.1 - dev: true - /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -10992,8 +11272,8 @@ packages: graceful-fs: 4.2.11 tapable: 2.2.1 - /ensure-array@1.0.0: - resolution: {integrity: sha512-A+3Ntl5WS+GjDnHtC67dKIjw+IoGoeFdNvjn3ZfKEmZgWUz0nxBPE4W52QMCbGZsat0VwWskD5T6AEpe3T2d1g==} + /ensure-type@1.5.1: + resolution: {integrity: sha512-Dxe+mVF4MupV6eueWiFa6hUd9OL9lIM2/LqR40k1P+dwG+G2il2UigXTU9aQlaw+Y/N0BKSaTofNw73htTbC5g==} dev: true /ent@2.2.0: @@ -11029,11 +11309,6 @@ packages: resolution: {integrity: sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg==} dev: true - /errlop@2.2.0: - resolution: {integrity: sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==} - engines: {node: '>=0.8'} - dev: true - /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: @@ -11123,8 +11398,8 @@ packages: resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} dev: true - /es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + /es-module-lexer@1.5.0: + resolution: {integrity: sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==} /es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} @@ -11152,12 +11427,12 @@ packages: resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} dev: true - /esbuild-plugin-react-virtualized@1.0.4(esbuild@0.19.12): + /esbuild-plugin-react-virtualized@1.0.4(esbuild@0.20.2): resolution: {integrity: sha512-/Y+82TBduHox0/uhJlTgUqi3ZWN+qZPF0xy9crkHQE2AOOdm76l6VY2F0Mdfvue9hqXz2FOlKHlHUVXNalHLzA==} peerDependencies: esbuild: '*' dependencies: - esbuild: 0.19.12 + esbuild: 0.20.2 dev: true /esbuild-register@3.5.0(esbuild@0.18.20): @@ -11231,6 +11506,37 @@ packages: '@esbuild/win32-ia32': 0.19.12 '@esbuild/win32-x64': 0.19.12 + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + dev: true + /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -11751,6 +12057,10 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + dev: true + /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -12052,13 +12362,6 @@ packages: engines: {node: '>=0.4.0'} dev: true - /flush-write-stream@1.1.1: - resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: true - /fn-name@2.0.1: resolution: {integrity: sha512-oIDB1rXf3BUnn00bh2jVM0byuqr94rBh6g7ZfdKcbmp1we2GQtPzKdloyvBXHs+q3fvxB8EqX5ecFba3RwCSjA==} engines: {node: '>=0.10.0'} @@ -12262,12 +12565,12 @@ packages: dependencies: minipass: 3.3.6 - /fs-mkdirp-stream@1.0.0: - resolution: {integrity: sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==} - engines: {node: '>= 0.10'} + /fs-mkdirp-stream@2.0.1: + resolution: {integrity: sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==} + engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 - through2: 2.0.5 + streamx: 2.16.1 dev: true /fs.realpath@1.0.0: @@ -12539,13 +12842,6 @@ packages: is-glob: 2.0.1 dev: true - /glob-parent@3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} - dependencies: - is-glob: 3.1.0 - path-dirname: 1.0.2 - dev: true - /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -12569,20 +12865,18 @@ packages: glob: 7.2.3 dev: true - /glob-stream@6.1.0: - resolution: {integrity: sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==} - engines: {node: '>= 0.10'} + /glob-stream@8.0.2: + resolution: {integrity: sha512-R8z6eTB55t3QeZMmU1C+Gv+t5UnNRkA55c5yo67fAVfxODxieTwsjNG7utxS/73NdP1NbDgCrhVEg2h00y4fFw==} + engines: {node: '>=10.13.0'} dependencies: - extend: 3.0.2 - glob: 7.2.3 - glob-parent: 3.1.0 + '@gulpjs/to-absolute-glob': 4.0.0 + anymatch: 3.1.3 + fastq: 1.17.1 + glob-parent: 6.0.2 + is-glob: 4.0.3 is-negated-glob: 1.0.0 - ordered-read-streams: 1.0.1 - pumpify: 1.5.1 - readable-stream: 2.3.8 - remove-trailing-separator: 1.1.0 - to-absolute-glob: 2.0.2 - unique-stream: 2.3.1 + normalize-path: 3.0.0 + streamx: 2.16.1 dev: true /glob-to-regexp@0.4.1: @@ -13241,83 +13535,68 @@ packages: resolution: {integrity: sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==} dev: false - /i18next-browser-languagedetector@6.1.8: - resolution: {integrity: sha512-Svm+MduCElO0Meqpj1kJAriTC6OhI41VhlT/A0UPjGoPZBhAHIaGE5EfsHlTpgdH09UVX7rcc72pSDDBeKSQQA==} - dependencies: - '@babel/runtime': 7.24.0 - dev: false - /i18next-browser-languagedetector@7.2.0: resolution: {integrity: sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==} dependencies: '@babel/runtime': 7.24.0 dev: true - /i18next-scanner@2.11.0: - resolution: {integrity: sha512-/QqbSnUj9v6EwndaWeHp8NkHqLKAIHSlI1HXSyLdIPKWYM+Fnpk2tjnyjP8qn7L0rLT7HLH4bvyiw61wOIxf0A==} - engines: {node: '>=6'} - hasBin: true + /i18next-browser-languagedetector@7.2.1: + resolution: {integrity: sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw==} dependencies: - acorn: 6.4.2 - acorn-dynamic-import: 4.0.0(acorn@6.4.2) - acorn-jsx: 5.3.2(acorn@6.4.2) - acorn-stage3: 2.1.0(acorn@6.4.2) - acorn-walk: 6.2.0 - chalk: 2.4.2 - clone-deep: 4.0.1 - commander: 3.0.2 - deepmerge: 4.3.1 - ensure-array: 1.0.0 - eol: 0.9.1 - esprima: 4.0.1 - gulp-sort: 2.0.0 - i18next: 23.10.1 - lodash: 4.17.21 - parse5: 5.1.1 - sortobject: 1.3.0 - through2: 3.0.2 - vinyl: 2.2.1 - vinyl-fs: 3.0.3 + '@babel/runtime': 7.24.4 + dev: false + + /i18next-http-backend@2.5.1: + resolution: {integrity: sha512-+rNX1tghdVxdfjfPt0bI1sNg5ahGW9kA7OboG7b4t03Fp69NdDlRIze6yXhIbN8rbHxJ8IP4dzRm/okZ15lkQg==} + dependencies: + cross-fetch: 4.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /i18next-localstorage-backend@4.2.0: + resolution: {integrity: sha512-vglEQF0AnLriX7dLA2drHnqAYzHxnLwWQzBDw8YxcIDjOvYZz5rvpal59Dq4In+IHNmGNM32YgF0TDjBT0fHmA==} + dependencies: + '@babel/runtime': 7.24.4 + dev: false + + /i18next-scanner-typescript@1.2.0: + resolution: {integrity: sha512-Q9VFw8LygB8cW9/ixVf6DHkrP8CD0hRvJcxpaFVGbx9HU84yYWO7PmPfEc9kMFMVjR8HtRiP2U0i8Vinb/wsww==} + dependencies: + typescript: 5.4.2 dev: true - /i18next-scanner@3.3.0: - resolution: {integrity: sha512-wVCv2HCpFWi/KIU/UiWgzUZg3Ih9zO8GLRv0aAQWJ7LUukrLaNkzdtVdkED6b4AiEDfCuM4X1KLcBi+pvL6JzQ==} + /i18next-scanner@4.4.0: + resolution: {integrity: sha512-bgnVEfoFHLVxfXNQtsFFzexB/5kwgDZZkZ6+AnCmyaFKEQQbtMkgPgLHlMZ0deIIEG6KN/tYAus5ZJzng2Ac9g==} engines: {node: '>=12'} hasBin: true dependencies: acorn: 8.11.3 - acorn-dynamic-import: 4.0.0(acorn@8.11.3) acorn-jsx: 5.3.2(acorn@8.11.3) acorn-stage3: 4.0.0(acorn@8.11.3) acorn-walk: 8.3.2 chalk: 4.1.2 clone-deep: 4.0.1 - commander: 6.2.1 + commander: 9.5.0 deepmerge: 4.3.1 - ensure-array: 1.0.0 + ensure-type: 1.5.1 eol: 0.9.1 esprima-next: 5.8.4 gulp-sort: 2.0.0 - i18next: 23.10.1 + i18next: 23.11.2 lodash: 4.17.21 parse5: 6.0.1 sortobject: 4.17.0 through2: 4.0.2 - vinyl: 2.2.1 - vinyl-fs: 3.0.3 + vinyl: 3.0.0 + vinyl-fs: 4.0.0 dev: true - /i18next-xhr-backend@3.2.2: - resolution: {integrity: sha512-OtRf2Vo3IqAxsttQbpjYnmMML12IMB5e0fc5B7qKJFLScitYaXa1OhMX0n0X/3vrfFlpHL9Ro/H+ps4Ej2j7QQ==} - deprecated: replaced by i18next-http-backend - dependencies: - '@babel/runtime': 7.24.0 - dev: false - - /i18next@23.10.1: - resolution: {integrity: sha512-NDiIzFbcs3O9PXpfhkjyf7WdqFn5Vq6mhzhtkXzj51aOcNuPNcTwuYNuXCpHsanZGHlHKL35G7huoFeVic1hng==} + /i18next@23.11.2: + resolution: {integrity: sha512-qMBm7+qT8jdpmmDw/kQD16VpmkL9BdL+XNAK5MNbNFaf1iQQq35ZbPrSlqmnNPOSUY4m342+c0t0evinF5l7sA==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} @@ -13331,7 +13610,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - dev: false /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -13528,14 +13806,6 @@ packages: engines: {node: '>=8'} dev: true - /is-absolute@1.0.0: - resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} - engines: {node: '>=0.10.0'} - dependencies: - is-relative: 1.0.0 - is-windows: 1.0.2 - dev: true - /is-accessor-descriptor@1.0.1: resolution: {integrity: sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==} engines: {node: '>= 0.10'} @@ -13741,13 +14011,6 @@ packages: is-extglob: 1.0.0 dev: true - /is-glob@3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -13938,13 +14201,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-relative@1.0.0: - resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} - engines: {node: '>=0.10.0'} - dependencies: - is-unc-path: 1.0.0 - dev: true - /is-retry-allowed@1.2.0: resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} engines: {node: '>=0.10.0'} @@ -14018,13 +14274,6 @@ packages: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} requiresBuild: true - /is-unc-path@1.0.0: - resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} - engines: {node: '>=0.10.0'} - dependencies: - unc-path-regex: 0.1.2 - dev: true - /is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -14699,7 +14948,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.19.24 + '@types/node': 18.19.31 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -15146,13 +15395,6 @@ packages: dotenv-expand: 10.0.0 dev: true - /lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} - dependencies: - readable-stream: 2.3.8 - dev: true - /lcid@2.0.0: resolution: {integrity: sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==} engines: {node: '>=6'} @@ -15165,11 +15407,9 @@ packages: hasBin: true dev: true - /lead@1.0.0: - resolution: {integrity: sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==} - engines: {node: '>= 0.10'} - dependencies: - flush-write-stream: 1.1.1 + /lead@4.0.0: + resolution: {integrity: sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg==} + engines: {node: '>=10.13.0'} dev: true /leaflet@1.9.4: @@ -15602,7 +15842,7 @@ packages: /m3u8-parser@4.8.0: resolution: {integrity: sha512-UqA2a/Pw3liR6Df3gwxrqghCP17OpPlQj6RBPLYygf/ZSQ4MoSgvdvhvt35qV+3NaaA0FSZx93Ix+2brT1U7cA==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@videojs/vhs-utils': 3.0.5 global: 4.4.0 dev: false @@ -16147,7 +16387,7 @@ packages: resolution: {integrity: sha512-fwBebvpyPUU8bOzvhX0VQZgSohncbgYwUyJJoTSNpmy7ccD2ryiCvM7oRkn/xQH5cv73/xU7rJSNCLjdGFor0Q==} hasBin: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@videojs/vhs-utils': 3.0.5 '@xmldom/xmldom': 0.8.10 global: 4.4.0 @@ -16183,7 +16423,7 @@ packages: engines: {node: '>=8', npm: '>=5'} hasBin: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 global: 4.4.0 dev: false @@ -16375,9 +16615,9 @@ packages: engines: {node: '>=8'} dev: true - /now-and-later@2.0.1: - resolution: {integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==} - engines: {node: '>= 0.10'} + /now-and-later@3.0.0: + resolution: {integrity: sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==} + engines: {node: '>= 10.13.0'} dependencies: once: 1.4.0 dev: true @@ -16763,12 +17003,6 @@ packages: wcwidth: 1.0.1 dev: true - /ordered-read-streams@1.0.1: - resolution: {integrity: sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==} - dependencies: - readable-stream: 2.3.8 - dev: true - /os-homedir@1.0.2: resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} engines: {node: '>=0.10.0'} @@ -16998,11 +17232,6 @@ packages: dev: false optional: true - /parse5@5.1.1: - resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} - requiresBuild: true - dev: true - /parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: true @@ -17026,10 +17255,6 @@ packages: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} dev: true - /path-dirname@1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} - dev: true - /path-exists@2.1.0: resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} engines: {node: '>=0.10.0'} @@ -17196,7 +17421,7 @@ packages: resolution: {integrity: sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==} hasBin: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 dev: false /pkg-conf@2.1.0: @@ -17248,7 +17473,7 @@ packages: resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} engines: {node: '>=10'} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 dev: true /popper.js@1.16.1: @@ -17551,6 +17776,10 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + dev: true + /quick-lru@1.1.0: resolution: {integrity: sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==} engines: {node: '>=4'} @@ -17686,7 +17915,7 @@ packages: peerDependencies: react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 react: 18.2.0 dev: false @@ -17823,7 +18052,7 @@ packages: '@types/react': optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 '@types/react': 18.2.65 focus-lock: 1.3.4 prop-types: 15.8.1 @@ -17897,8 +18126,8 @@ packages: dependencies: react: 18.2.0 - /react-i18next@13.5.0(i18next@23.10.1)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-CFJ5NDGJ2MUyBohEHxljOq/39NQ972rh1ajnadG9BjTk+UXbHLq4z5DKEbEQBDoIhUmmbuS/fIMJKo6VOax1HA==} + /react-i18next@14.1.0(i18next@23.11.2)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-3KwX6LHpbvGQ+sBEntjV4sYW3Zovjjl3fpoHbUwSgFHf0uRBcbeCBLR5al6ikncI5+W0EFb71QXZmfop+J6NrQ==} peerDependencies: i18next: '>= 23.2.3' react: '>= 16.8.0' @@ -17910,9 +18139,9 @@ packages: react-native: optional: true dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 html-parse-stringify: 3.0.1 - i18next: 23.10.1 + i18next: 23.11.2 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -18600,7 +18829,7 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 dev: true /regex-cache@0.4.4: @@ -18702,23 +18931,6 @@ packages: autolinker: 0.28.1 dev: true - /remove-bom-buffer@3.0.0: - resolution: {integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-buffer: 1.1.6 - is-utf8: 0.2.1 - dev: true - - /remove-bom-stream@1.2.0: - resolution: {integrity: sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==} - engines: {node: '>= 0.10'} - dependencies: - remove-bom-buffer: 3.0.0 - safe-buffer: 5.2.1 - through2: 2.0.5 - dev: true - /remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} dev: true @@ -18740,9 +18952,9 @@ packages: is-finite: 1.1.0 dev: true - /replace-ext@1.0.1: - resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} - engines: {node: '>= 0.10'} + /replace-ext@2.0.0: + resolution: {integrity: sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==} + engines: {node: '>= 10'} dev: true /replace-in-file@3.4.4: @@ -18872,11 +19084,11 @@ packages: global-dirs: 0.1.1 dev: true - /resolve-options@1.1.0: - resolution: {integrity: sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==} - engines: {node: '>= 0.10'} + /resolve-options@2.0.0: + resolution: {integrity: sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==} + engines: {node: '>= 10.13.0'} dependencies: - value-or-function: 3.0.0 + value-or-function: 4.0.0 dev: true /resolve-protobuf-schema@2.1.0: @@ -19203,7 +19415,7 @@ packages: - supports-color dev: true - /sass-loader@13.3.3(sass@1.71.1)(webpack@5.90.3): + /sass-loader@13.3.3(sass@1.71.1)(webpack@5.91.0): resolution: {integrity: sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -19224,10 +19436,10 @@ packages: dependencies: neo-async: 2.6.2 sass: 1.71.1 - webpack: 5.90.3 + webpack: 5.91.0 dev: true - /sass-loader@8.0.2(sass@1.71.1)(webpack@5.90.3): + /sass-loader@8.0.2(sass@1.71.1)(webpack@5.91.0): resolution: {integrity: sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==} engines: {node: '>= 8.9.0'} peerDependencies: @@ -19249,7 +19461,7 @@ packages: sass: 1.71.1 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.90.3 + webpack: 5.91.0 dev: false /sass@1.71.1: @@ -19311,14 +19523,14 @@ packages: engines: {node: '>=0.12.0'} dev: true - /semantic-release@15.14.0(@octokit/core@6.0.1): + /semantic-release@15.14.0(@octokit/core@6.1.2): resolution: {integrity: sha512-Cn43W35AOLY0RMcDbtwhJODJmWg6YCs1+R5jRQsTmmkEGzkV4B2F/QXkjVZpl4UbH91r93GGH0xhoq9kh7I5PA==} engines: {node: '>=8.16'} hasBin: true dependencies: '@semantic-release/commit-analyzer': 6.3.3(semantic-release@15.14.0) '@semantic-release/error': 2.2.0 - '@semantic-release/github': 5.5.8(@octokit/core@6.0.1)(semantic-release@15.14.0) + '@semantic-release/github': 5.5.8(@octokit/core@6.1.2)(semantic-release@15.14.0) '@semantic-release/npm': 5.3.5(semantic-release@15.14.0) '@semantic-release/release-notes-generator': 7.3.5(semantic-release@15.14.0) aggregate-error: 3.1.0 @@ -19674,13 +19886,6 @@ packages: eve: 0.5.4 dev: false - /sortobject@1.3.0: - resolution: {integrity: sha512-rr0RrgE3ZoWaREnHiidnywzXLaeqmxDKfB4Htdbzu4WBzsVeZEJrhz7AR4ZF+gzHgbog/lQoNXxCWHaXeLc1Dg==} - engines: {node: '>=0.12'} - dependencies: - editions: 2.3.1 - dev: true - /sortobject@4.17.0: resolution: {integrity: sha512-gzx7USv55AFRQ7UCWJHHauwD/ptUHF9MLXCGO3f5M9zauDPZ/4a9H6/VVbOXefdpEoI1unwB/bArHIVMbWBHmA==} engines: {node: '>=10'} @@ -19903,10 +20108,25 @@ packages: readable-stream: 2.3.8 dev: true + /stream-composer@1.0.2: + resolution: {integrity: sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==} + dependencies: + streamx: 2.16.1 + dev: true + /stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} dev: true + /streamx@2.16.1: + resolution: {integrity: sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==} + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + optionalDependencies: + bare-events: 2.2.2 + dev: true + /strict-uri-encode@2.0.0: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} @@ -20282,6 +20502,12 @@ packages: mkdirp: 1.0.4 yallist: 4.0.0 + /teex@1.0.1: + resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + dependencies: + streamx: 2.16.1 + dev: true + /telejson@7.2.0: resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} dependencies: @@ -20332,7 +20558,7 @@ packages: execa: 0.7.0 dev: true - /terser-webpack-plugin@5.3.10(webpack@5.90.3): + /terser-webpack-plugin@5.3.10(webpack@5.91.0): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -20352,11 +20578,11 @@ packages: jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.29.1 - webpack: 5.90.3 + terser: 5.30.3 + webpack: 5.91.0 - /terser@5.29.1: - resolution: {integrity: sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==} + /terser@5.30.3: + resolution: {integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==} engines: {node: '>=10'} hasBin: true dependencies: @@ -20401,13 +20627,6 @@ packages: resolution: {integrity: sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA==} dev: true - /through2-filter@3.0.0: - resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} - dependencies: - through2: 2.0.5 - xtend: 4.0.2 - dev: true - /through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: @@ -20415,13 +20634,6 @@ packages: xtend: 4.0.2 dev: true - /through2@3.0.2: - resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: true - /through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: @@ -20462,14 +20674,6 @@ packages: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} dev: true - /to-absolute-glob@2.0.2: - resolution: {integrity: sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==} - engines: {node: '>=0.10.0'} - dependencies: - is-absolute: 1.0.0 - is-negated-glob: 1.0.0 - dev: true - /to-fast-properties@1.0.3: resolution: {integrity: sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==} engines: {node: '>=0.10.0'} @@ -20520,11 +20724,11 @@ packages: safe-regex: 1.1.0 dev: true - /to-through@2.0.0: - resolution: {integrity: sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==} - engines: {node: '>= 0.10'} + /to-through@3.0.0: + resolution: {integrity: sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==} + engines: {node: '>=10.13.0'} dependencies: - through2: 2.0.5 + streamx: 2.16.1 dev: true /tocbot@4.25.0: @@ -21124,11 +21328,6 @@ packages: which-boxed-primitive: 1.0.2 dev: true - /unc-path-regex@0.1.2: - resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} - engines: {node: '>=0.10.0'} - dev: true - /uncontrollable@7.2.1(react@18.2.0): resolution: {integrity: sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==} peerDependencies: @@ -21187,13 +21386,6 @@ packages: set-value: 2.0.1 dev: true - /unique-stream@2.3.1: - resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} - dependencies: - json-stable-stringify-without-jsonify: 1.0.1 - through2-filter: 3.0.0 - dev: true - /unique-string@1.0.0: resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} engines: {node: '>=4'} @@ -21487,9 +21679,9 @@ packages: engines: {node: '>= 0.10'} dev: true - /value-or-function@3.0.0: - resolution: {integrity: sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==} - engines: {node: '>= 0.10'} + /value-or-function@4.0.0: + resolution: {integrity: sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==} + engines: {node: '>= 10.13.0'} dev: true /vary@1.1.2: @@ -21537,52 +21729,55 @@ packages: global: 4.4.0 dev: false - /vinyl-fs@3.0.3: - resolution: {integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==} - engines: {node: '>= 0.10'} + /vinyl-contents@2.0.0: + resolution: {integrity: sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==} + engines: {node: '>=10.13.0'} + dependencies: + bl: 5.1.0 + vinyl: 3.0.0 + dev: true + + /vinyl-fs@4.0.0: + resolution: {integrity: sha512-7GbgBnYfaquMk3Qu9g22x000vbYkOex32930rBnc3qByw6HfMEAoELjCjoJv4HuEQxHAurT+nvMHm6MnJllFLw==} + engines: {node: '>=10.13.0'} dependencies: - fs-mkdirp-stream: 1.0.0 - glob-stream: 6.1.0 + fs-mkdirp-stream: 2.0.1 + glob-stream: 8.0.2 graceful-fs: 4.2.11 + iconv-lite: 0.6.3 is-valid-glob: 1.0.0 - lazystream: 1.0.1 - lead: 1.0.0 - object.assign: 4.1.5 - pumpify: 1.5.1 - readable-stream: 2.3.8 - remove-bom-buffer: 3.0.0 - remove-bom-stream: 1.2.0 - resolve-options: 1.1.0 - through2: 2.0.5 - to-through: 2.0.0 - value-or-function: 3.0.0 - vinyl: 2.2.1 - vinyl-sourcemap: 1.1.0 + lead: 4.0.0 + normalize-path: 3.0.0 + resolve-options: 2.0.0 + stream-composer: 1.0.2 + streamx: 2.16.1 + to-through: 3.0.0 + value-or-function: 4.0.0 + vinyl: 3.0.0 + vinyl-sourcemap: 2.0.0 dev: true - /vinyl-sourcemap@1.1.0: - resolution: {integrity: sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==} - engines: {node: '>= 0.10'} + /vinyl-sourcemap@2.0.0: + resolution: {integrity: sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q==} + engines: {node: '>=10.13.0'} dependencies: - append-buffer: 1.0.2 - convert-source-map: 1.9.0 + convert-source-map: 2.0.0 graceful-fs: 4.2.11 - normalize-path: 2.1.1 - now-and-later: 2.0.1 - remove-bom-buffer: 3.0.0 - vinyl: 2.2.1 + now-and-later: 3.0.0 + streamx: 2.16.1 + vinyl: 3.0.0 + vinyl-contents: 2.0.0 dev: true - /vinyl@2.2.1: - resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} - engines: {node: '>= 0.10'} + /vinyl@3.0.0: + resolution: {integrity: sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==} + engines: {node: '>=10.13.0'} dependencies: clone: 2.1.2 - clone-buffer: 1.0.0 clone-stats: 1.0.0 - cloneable-readable: 1.1.3 remove-trailing-separator: 1.1.0 - replace-ext: 1.0.1 + replace-ext: 2.0.0 + teex: 1.0.1 dev: true /vite-plugin-checker@0.6.4(eslint@8.57.0)(typescript@5.4.2)(vite@5.1.6): @@ -21896,8 +22091,8 @@ packages: resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==} dev: true - /webpack@5.90.3: - resolution: {integrity: sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==} + /webpack@5.91.0: + resolution: {integrity: sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -21916,7 +22111,7 @@ packages: browserslist: 4.23.0 chrome-trace-event: 1.0.3 enhanced-resolve: 5.16.0 - es-module-lexer: 1.4.1 + es-module-lexer: 1.5.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -21927,7 +22122,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.90.3) + terser-webpack-plugin: 5.3.10(webpack@5.91.0) watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -22425,7 +22620,7 @@ packages: /yup@0.27.0: resolution: {integrity: sha512-v1yFnE4+u9za42gG/b/081E7uNW9mUj3qtkmelLbW5YPROZzSH/KUUyJu9Wt8vxFJcT9otL/eZopS0YK1L5yPQ==} dependencies: - '@babel/runtime': 7.24.0 + '@babel/runtime': 7.24.4 fn-name: 2.0.1 lodash: 4.17.21 property-expr: 1.5.1 diff --git a/uploader/client/i18next-scanner.config.js b/uploader/client/i18next-scanner.config.js deleted file mode 100644 index 0fcfdbf0a..000000000 --- a/uploader/client/i18next-scanner.config.js +++ /dev/null @@ -1,82 +0,0 @@ -const fs = require('fs'); -const chalk = require('chalk'); - -module.exports = { - input: [ - 'src/**/*.{js,jsx}', - // Use ! to filter out files or directories - '!src/**/*.spec.{js,jsx}', - '!src/locales/**', - '!**/node_modules/**', - ], - output: './', - options: { - debug: true, - func: { - list: ['i18next.t', 'i18n.t', 't'], - extensions: ['.js', '.jsx'], - }, - trans: { - component: 'Trans', - i18nKey: 'i18nKey', - defaultsKey: 'defaults', - extensions: ['.js', '.jsx'], - fallbackKey: function (ns, value) { - return value; - }, - acorn: { - ecmaVersion: 10, // defaults to 10 - sourceType: 'module', // defaults to 'module' - // Check out https://github.com/acornjs/acorn/tree/master/acorn#interface for additional options - }, - }, - lngs: ['en'], - ns: ['translation'], - defaultLng: 'en', - defaultNs: 'translation', - defaultValue: '__STRING_NOT_TRANSLATED__', - resource: { - loadPath: 'src/locales/{lng}/{ns}.json', - savePath: 'src/locales/{lng}/{ns}.json', - jsonIndent: 2, - lineEnding: '\n', - }, - nsSeparator: ':', // namespace separator - keySeparator: '.', // key separator - interpolation: { - prefix: '{', - suffix: '}', - }, - }, - transform: function customTransform(file, enc, done) { - 'use strict'; - const parser = this.parser; - const content = fs.readFileSync(file.path, enc); - let count = 0; - - parser.parseFuncFromString( - content, - {list: ['i18next._', 'i18next.__']}, - (key, options) => { - parser.set( - key, - Object.assign({}, options, { - nsSeparator: false, - keySeparator: false, - }) - ); - ++count; - } - ); - - if (count > 0) { - console.log( - `i18next-scanner: count=${chalk.cyan( - count - )}, file=${chalk.yellow(JSON.stringify(file.relative))}` - ); - } - - done(); - }, -}; diff --git a/uploader/client/package.json b/uploader/client/package.json index 4ff962115..36f445224 100644 --- a/uploader/client/package.json +++ b/uploader/client/package.json @@ -9,7 +9,7 @@ "lint:fix": "eslint --fix src", "format": "prettier --ignore-path .gitignore --write \"**/*.+(js|ts|json|cjs|tsx|jsx)\"", "preview": "vite preview", - "translations-scan": "i18next-scanner --config i18next-scanner.config.js src/**/*.{js,jsx}" + "translate": "i18next-scanner --config ../../lib/js/i18n/i18next-scanner.config.js" }, "dependencies": { "@alchemy/api": "workspace:*", @@ -17,6 +17,7 @@ "@alchemy/core": "workspace:*", "@alchemy/liform-react": "workspace:*", "@alchemy/navigation": "workspace:*", + "@alchemy/i18n": "workspace:*", "@alchemy/phrasea-ui": "workspace:*", "@alchemy/react-auth": "workspace:*", "@alchemy/react-ps": "workspace:*", @@ -26,15 +27,12 @@ "axios": "^1.6.7", "bootstrap": "^4.6.2", "filesize": "^9.0.11", - "i18next": "^23.10.1", - "i18next-browser-languagedetector": "^6.1.8", - "i18next-xhr-backend": "^3.2.2", "react": "^18.2.0", "react-bootstrap": "^1.6.8", "react-burger-menu": "^2.9.2", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", - "react-i18next": "^13.5.0", + "react-i18next": "^14.1.0", "react-redux": "^9.1.0", "react-toastify": "^9.1.3", "redux": "^4.2.1", @@ -51,13 +49,14 @@ "@typescript-eslint/parser": "^6.21.0", "@vitejs/plugin-react-swc": "^3.6.0", "eslint": "^8.57.0", - "i18next-scanner": "^2.11.0", "react-bootstrap": "^1.0.0-beta.8", "sass": "^1.71.1", "sass-loader": "^13.3.3", "typescript": "^5.4.2", "vite": "^5.1.6", "vite-plugin-checker": "^0.6.4", - "vite-plugin-svgr": "^4.2.0" + "vite-plugin-svgr": "^4.2.0", + "i18next-scanner": "^4.4.0", + "i18next-scanner-typescript": "^1.2.0" } } diff --git a/uploader/client/src/components/AssetForm.jsx b/uploader/client/src/components/AssetForm.jsx index 8d3cd8aeb..f23d7711d 100644 --- a/uploader/client/src/components/AssetForm.jsx +++ b/uploader/client/src/components/AssetForm.jsx @@ -103,7 +103,7 @@ export default class AssetForm extends Component { const {schema} = this.state; if (undefined === schema) { - return {t => t('layout.loading_form')}; + return {t => t('layout.loading_form', 'Loading form...')}; } return ( diff --git a/uploader/client/src/components/Menu.tsx b/uploader/client/src/components/Menu.tsx index 940c706ea..c24e66f92 100644 --- a/uploader/client/src/components/Menu.tsx +++ b/uploader/client/src/components/Menu.tsx @@ -128,7 +128,7 @@ export default function Menu({children}: Props) { @@ -137,7 +137,7 @@ export default function Menu({children}: Props) { diff --git a/uploader/client/src/i18n.ts b/uploader/client/src/i18n.ts new file mode 100644 index 000000000..643087c95 --- /dev/null +++ b/uploader/client/src/i18n.ts @@ -0,0 +1,8 @@ +import {createI18N, createNS} from '@alchemy/i18n'; +import * as appLangs from '../translations'; + +const i18n = createI18N({ + resources: createNS(appLangs), +}); + +export default i18n; diff --git a/uploader/client/src/index.tsx b/uploader/client/src/index.tsx index 7cb4a4907..864d3f658 100644 --- a/uploader/client/src/index.tsx +++ b/uploader/client/src/index.tsx @@ -1,6 +1,6 @@ import ReactDOM from 'react-dom/client'; import './scss/index.scss'; -import './locales/i18n'; +import './i18n'; import Root from './Root.tsx'; import {DashboardMenu} from '@alchemy/react-ps'; import config from './config'; diff --git a/uploader/client/src/locales/en/translation.json b/uploader/client/src/locales/en/translation.json deleted file mode 100644 index 398d5a2fa..000000000 --- a/uploader/client/src/locales/en/translation.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "form": { - "email": { - "label": "Email" - }, - "password": { - "label": "Password" - }, - "submit_button": "Login" - }, - "login": { - "forgot_password": "Forgot password?", - "not_registered_yet": "Not registered yet?", - "sign_up_link": "Sign up" - }, - "layout": { - "loading_form": "Loading form..." - }, - "targets": { - "none_available": "You don't have access to any upload target." - } -} diff --git a/uploader/client/src/locales/es/translation.json b/uploader/client/src/locales/es/translation.json deleted file mode 100644 index b3684faea..000000000 --- a/uploader/client/src/locales/es/translation.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "form": { - "email": { - "label": "Email" - }, - "password": { - "label": "Contraseña" - }, - "submit_button": "Login" - }, - "login": { - "forgot_password": "¿Se te olvidó tu contraseña?", - "not_registered_yet": "Todavía no estas registrado?", - "sign_up_link": "Regístrate" - } -} diff --git a/uploader/client/src/locales/fr/translation.json b/uploader/client/src/locales/fr/translation.json deleted file mode 100644 index 0ea359074..000000000 --- a/uploader/client/src/locales/fr/translation.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "form": { - "email": { - "label": "E-mail" - }, - "password": { - "label": "Mot de passe" - }, - "submit_button": "Login" - }, - "login": { - "forgot_password": "Mot de passe oublié ?", - "not_registered_yet": "Pas encore de compte ?", - "sign_up_link": "Inscrivez-vous" - }, - "layout": { - "loading_form": "Chargement du formulaire..." - }, - "targets": { - "none_available": "Vous n'avez accès à aucune destination d'upload." - } -} diff --git a/uploader/client/src/locales/i18n.js b/uploader/client/src/locales/i18n.js deleted file mode 100644 index ed9625a3f..000000000 --- a/uploader/client/src/locales/i18n.js +++ /dev/null @@ -1,38 +0,0 @@ -import i18next from 'i18next'; -import LanguageDetector from 'i18next-browser-languagedetector'; -import {initReactI18next} from 'react-i18next'; -import * as languages from './'; -const i18n = i18next.createInstance(); - -const ns = 'translation'; - -const resources = {}; -Object.keys(languages).forEach(l => { - resources[l] = { - [ns]: languages[l], - }; -}); - -i18n.use(LanguageDetector) - .use(initReactI18next) - .init({ - debug: false, - resources, - fallbackLng: 'en', - ns: [ns], - defaultNs: ns, - detection: { - order: ['querystring', 'navigator'], - lookupQuerystring: 'lng', - }, - react: { - bindI18n: 'languageChanged', - bindI18nStore: '', - transEmptyNodeValue: '', - transSupportBasicHtmlNodes: true, - transKeepBasicHtmlNodesFor: ['br', 'strong', 'i'], - useSuspense: false, - }, - }); - -export default i18n; diff --git a/uploader/client/src/locales/index.js b/uploader/client/src/locales/index.js deleted file mode 100644 index f35617a01..000000000 --- a/uploader/client/src/locales/index.js +++ /dev/null @@ -1,5 +0,0 @@ -import en from './en/translation'; -import fr from './fr/translation'; -import es from './es/translation'; - -export {en, fr, es}; diff --git a/uploader/client/translations/de.json b/uploader/client/translations/de.json new file mode 100644 index 000000000..938555ce9 --- /dev/null +++ b/uploader/client/translations/de.json @@ -0,0 +1,12 @@ +{ + "layout": { + "loading_form": "Formular wird geladen..." + }, + "menu": { + "account": "Mein Konto", + "logout": "Abmelden" + }, + "targets": { + "none_available": "Sie haben keinen Zugriff auf ein Upload-Ziel." + } +} diff --git a/uploader/client/translations/en.json b/uploader/client/translations/en.json new file mode 100644 index 000000000..19d65978f --- /dev/null +++ b/uploader/client/translations/en.json @@ -0,0 +1,12 @@ +{ + "layout": { + "loading_form": "Loading form..." + }, + "menu": { + "account": "My account", + "logout": "Logout" + }, + "targets": { + "none_available": "You don't have access to any upload target." + } +} diff --git a/uploader/client/translations/es.json b/uploader/client/translations/es.json new file mode 100644 index 000000000..253428ebc --- /dev/null +++ b/uploader/client/translations/es.json @@ -0,0 +1,12 @@ +{ + "layout": { + "loading_form": "Cargando formulario..." + }, + "menu": { + "account": "Mi cuenta", + "logout": "Cerrar sesión" + }, + "targets": { + "none_available": "No tienes acceso a ningún destino de carga." + } +} diff --git a/uploader/client/translations/fr.json b/uploader/client/translations/fr.json new file mode 100644 index 000000000..e51ad7f98 --- /dev/null +++ b/uploader/client/translations/fr.json @@ -0,0 +1,12 @@ +{ + "layout": { + "loading_form": "Chargement du formulaire..." + }, + "menu": { + "account": "Mon compte", + "logout": "Déconnexion" + }, + "targets": { + "none_available": "Vous n'avez accès à aucune cible de téléchargement." + } +} diff --git a/uploader/client/translations/index.ts b/uploader/client/translations/index.ts new file mode 100644 index 000000000..9448e4211 --- /dev/null +++ b/uploader/client/translations/index.ts @@ -0,0 +1,70 @@ +import en from './en.json'; +import fr from './fr.json'; +import es from './es.json'; +import de from './de.json'; +import zh from './zh.json'; + +import enApi from '@alchemy/api/translations/en.json'; +import frApi from '@alchemy/api/translations/fr.json'; +import esApi from '@alchemy/api/translations/es.json'; +import deApi from '@alchemy/api/translations/de.json'; +import zhApi from '@alchemy/api/translations/zh.json'; + +import enNav from '@alchemy/navigation/translations/en.json'; +import frNav from '@alchemy/navigation/translations/fr.json'; +import esNav from '@alchemy/navigation/translations/es.json'; +import deNav from '@alchemy/navigation/translations/de.json'; +import zhNav from '@alchemy/navigation/translations/zh.json'; + +import enAuth from '@alchemy/react-auth/translations/en.json'; +import frAuth from '@alchemy/react-auth/translations/fr.json'; +import esAuth from '@alchemy/react-auth/translations/es.json'; +import deAuth from '@alchemy/react-auth/translations/de.json'; +import zhAuth from '@alchemy/react-auth/translations/zh.json'; + +const enMerged = { + ...en, + lib: { + ...enApi.lib, + ...enNav.lib, + ...enAuth.lib, + }, +}; + +const frMerged = { + ...fr, + lib: { + ...frApi.lib, + ...frNav.lib, + ...frAuth.lib, + }, +}; + +const esMerged = { + ...es, + lib: { + ...esApi.lib, + ...esNav.lib, + ...esAuth.lib, + }, +}; + +const deMerged = { + ...de, + lib: { + ...deApi.lib, + ...deNav.lib, + ...deAuth.lib, + }, +}; + +const zhMerged = { + ...zh, + lib: { + ...zhApi.lib, + ...zhNav.lib, + ...zhAuth.lib, + }, +}; + +export {enMerged as en, frMerged as fr, esMerged as es, deMerged as de, zhMerged as zh}; diff --git a/uploader/client/translations/zh.json b/uploader/client/translations/zh.json new file mode 100644 index 000000000..d444f22d2 --- /dev/null +++ b/uploader/client/translations/zh.json @@ -0,0 +1,12 @@ +{ + "layout": { + "loading_form": "加载表单中..." + }, + "menu": { + "account": "我的账户", + "logout": "退出" + }, + "targets": { + "none_available": "您没有任何上传目标的访问权限。" + } +}