From 26217268979bb3e86abaf2080f0920acda460f06 Mon Sep 17 00:00:00 2001 From: 22 <60903333+nini22P@users.noreply.github.com> Date: Sat, 1 Jun 2024 21:56:44 +0800 Subject: [PATCH 1/3] feat: add playback rate menu --- src/hooks/player/usePlayerControl.ts | 20 +++++- src/hooks/ui/useTheme.ts | 2 +- src/pages/Player/Audio/MenuButton.tsx | 74 +++++++++++++++++-- src/pages/Player/Player.tsx | 1 - src/pages/Player/PlayerControl.tsx | 100 +++++++++++++++++++++++--- src/store/useUiStore.ts | 2 + src/types/ui.ts | 2 + 7 files changed, 183 insertions(+), 18 deletions(-) diff --git a/src/hooks/player/usePlayerControl.ts b/src/hooks/player/usePlayerControl.ts index caf9a33..5fbcd63 100644 --- a/src/hooks/player/usePlayerControl.ts +++ b/src/hooks/player/usePlayerControl.ts @@ -33,16 +33,18 @@ const usePlayerControl = (player: HTMLVideoElement | null) => { const [ shuffle, repeat, + volume, + playbackRate, updateShuffle, updateRepeat, - volume, ] = useUiStore( (state) => [ state.shuffle, state.repeat, + state.volume, + state.playbackRate, state.updateShuffle, state.updateRepeat, - state.volume, ] ) @@ -155,7 +157,19 @@ const usePlayerControl = (player: HTMLVideoElement | null) => { player.volume = (isNaN(volume / 100) || volume < 0 || volume > 100) ? 0.8 : (volume / 100) } }, - [player, volume] + // eslint-disable-next-line react-hooks/exhaustive-deps + [player && player.src, volume] + ) + + // 播放速度 + useEffect( + () => { + if (player) { + player.playbackRate = playbackRate + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [player && player.src, playbackRate] ) return { diff --git a/src/hooks/ui/useTheme.ts b/src/hooks/ui/useTheme.ts index 9f644d6..99dccc2 100644 --- a/src/hooks/ui/useTheme.ts +++ b/src/hooks/ui/useTheme.ts @@ -144,7 +144,7 @@ const useTheme = () => { MuiListItemIcon: { styleOverrides: { root: { - minWidth: 0, + minWidth: '0px !important', marginRight: '1rem', }, } diff --git a/src/pages/Player/Audio/MenuButton.tsx b/src/pages/Player/Audio/MenuButton.tsx index aa89ffb..6f0692b 100644 --- a/src/pages/Player/Audio/MenuButton.tsx +++ b/src/pages/Player/Audio/MenuButton.tsx @@ -1,14 +1,30 @@ import useUiStore from '@/store/useUiStore' import MoreVertRoundedIcon from '@mui/icons-material/MoreVertRounded' -import { Box, IconButton, ListItemText, Menu, MenuItem } from '@mui/material' +import SyncAltRoundedIcon from '@mui/icons-material/SyncAltRounded' +import SpeedRoundedIcon from '@mui/icons-material/SpeedRounded' +import NavigateBeforeRoundedIcon from '@mui/icons-material/NavigateBeforeRounded' +import NavigateNextRoundedIcon from '@mui/icons-material/NavigateNextRounded' +import CheckRoundedIcon from '@mui/icons-material/CheckRounded' +import { Box, IconButton, ListItemIcon, ListItemText, Menu, MenuItem } from '@mui/material' import { useState } from 'react' const MenuButton = () => { - const [audioViewTheme, updateAudioViewTheme] = useUiStore(state => [state.audioViewTheme, state.updateAudioViewTheme]) + const [ + audioViewTheme, + playbackRate, + updateAudioViewTheme, + updatePlaybackRate, + ] = useUiStore(state => [ + state.audioViewTheme, + state.playbackRate, + state.updateAudioViewTheme, + state.updatePlaybackRate, + ]) const [anchorEl, setAnchorEl] = useState(null) const [menuOpen, setMenuOpen] = useState(false) + const [menuStatus, setMenuStatus] = useState(null) const handleClickMenu = (event: React.MouseEvent) => { setAnchorEl(event.currentTarget) @@ -18,6 +34,7 @@ const MenuButton = () => { const handleCloseMenu = () => { setAnchorEl(null) setMenuOpen(false) + setMenuStatus(null) } const handleClickSwitchTheme = () => { @@ -37,9 +54,56 @@ const MenuButton = () => { open={menuOpen} onClose={handleCloseMenu} > - - - + { + (!menuStatus) && +
+ + + + + + + setMenuStatus('playbackRate')}> + + + + + + + + {playbackRate.toFixed(2)} + + +
+ } + + { + (menuStatus === 'playbackRate') && +
+ setMenuStatus(null)}> + + + + + + { + [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 3, 4].map((speed) => ( + { + updatePlaybackRate(speed) + setMenuStatus(null) + }} + > + + + + {speed.toFixed(2)} + + )) + } +
+ } diff --git a/src/pages/Player/Player.tsx b/src/pages/Player/Player.tsx index 9fb48d8..7802bf2 100644 --- a/src/pages/Player/Player.tsx +++ b/src/pages/Player/Player.tsx @@ -12,7 +12,6 @@ import PlayQueue from './PlayQueue' const Player = () => { - const [ videoViewIsShow, controlIsShow, diff --git a/src/pages/Player/PlayerControl.tsx b/src/pages/Player/PlayerControl.tsx index 7cccc4c..cbfb5d0 100644 --- a/src/pages/Player/PlayerControl.tsx +++ b/src/pages/Player/PlayerControl.tsx @@ -1,4 +1,4 @@ -import { Box, ButtonBase, CircularProgress, Container, IconButton, Paper, Popover, Slider, Typography, useTheme } from '@mui/material' +import { Box, ButtonBase, CircularProgress, Container, IconButton, ListItemIcon, ListItemText, Menu, MenuItem, Paper, Popover, Slider, Typography, useTheme } from '@mui/material' import Grid from '@mui/material/Unstable_Grid2' import CloseFullscreenRoundedIcon from '@mui/icons-material/CloseFullscreenRounded' import OpenInFullRoundedIcon from '@mui/icons-material/OpenInFullRounded' @@ -15,6 +15,11 @@ import PlaylistPlayRoundedIcon from '@mui/icons-material/PlaylistPlayRounded' import VolumeUpIcon from '@mui/icons-material/VolumeUp' import VolumeDownIcon from '@mui/icons-material/VolumeDown' import VolumeOffIcon from '@mui/icons-material/VolumeOff' +import MoreHorizRoundedIcon from '@mui/icons-material/MoreHorizRounded' +import SpeedRoundedIcon from '@mui/icons-material/SpeedRounded' +import NavigateBeforeRoundedIcon from '@mui/icons-material/NavigateBeforeRounded' +import NavigateNextRoundedIcon from '@mui/icons-material/NavigateNextRounded' +import CheckRoundedIcon from '@mui/icons-material/CheckRounded' import usePlayQueueStore from '@/store/usePlayQueueStore' import usePlayerStore from '@/store/usePlayerStore' import useUiStore from '@/store/useUiStore' @@ -35,10 +40,12 @@ const PlayerControl = ({ player }: { player: HTMLVideoElement | null }) => { shuffle, repeat, volume, + playbackRate, updateAudioViewIsShow, updateVideoViewIsShow, updatePlayQueueIsShow, updateVolume, + updatePlaybackRate, ] = useUiStore( (state) => [ state.videoViewIsShow, @@ -47,10 +54,12 @@ const PlayerControl = ({ player }: { player: HTMLVideoElement | null }) => { state.shuffle, state.repeat, state.volume, + state.playbackRate, state.updateAudioViewIsShow, state.updateVideoViewIsShow, state.updatePlayQueueIsShow, state.updateVolume, + state.updatePlaybackRate, ] ) @@ -98,8 +107,21 @@ const PlayerControl = ({ player }: { player: HTMLVideoElement | null }) => { large: { width: 38, height: 38 } } - const [anchorEl, setAnchorEl] = useState(null) - const volumeOpen = Boolean(anchorEl) + const [volumeAnchorEl, setVolumeAnchorEl] = useState(null) + const volumeOpen = Boolean(volumeAnchorEl) + + const [menuAnchorEl, setMemuAnchorEl] = useState(null) + const menuOpen = Boolean(menuAnchorEl) + const [menuStatus, setMenuStatus] = useState<'playbackRate' | null>(null) + + const handleClickMenu = (event: React.MouseEvent) => { + setMemuAnchorEl(event.currentTarget) + } + + const handleCloseMenu = () => { + setMemuAnchorEl(null) + setMenuStatus(null) + } return ( @@ -209,7 +231,7 @@ const PlayerControl = ({ player }: { player: HTMLVideoElement | null }) => { handleClickSeekbackward(10)} > @@ -236,7 +258,7 @@ const PlayerControl = ({ player }: { player: HTMLVideoElement | null }) => { } handleClickSeekforward(10)} > @@ -265,10 +287,11 @@ const PlayerControl = ({ player }: { player: HTMLVideoElement | null }) => { - ) => setAnchorEl(event.currentTarget)} > + ) => setVolumeAnchorEl(event.currentTarget)} > { volume === 0 ? @@ -279,8 +302,8 @@ const PlayerControl = ({ player }: { player: HTMLVideoElement | null }) => { setAnchorEl(null)} - anchorEl={anchorEl} + onClose={() => setVolumeAnchorEl(null)} + anchorEl={volumeAnchorEl} anchorOrigin={{ vertical: 'top', horizontal: 'center', @@ -314,9 +337,11 @@ const PlayerControl = ({ player }: { player: HTMLVideoElement | null }) => { /> + updatePlayQueueIsShow(!playQueueIsShow)}> + handleClickFullscreen()} > { fullscreen @@ -324,6 +349,65 @@ const PlayerControl = ({ player }: { player: HTMLVideoElement | null }) => { : } + + + + + + { + (!menuStatus) && + setMenuStatus('playbackRate')}> + + + + + + + + {playbackRate.toFixed(2)} + + + } + { + (menuStatus === 'playbackRate') && +
+ setMenuStatus(null)}> + + + + + + { + [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 3, 4].map((speed) => ( + { + updatePlaybackRate(speed) + setMenuStatus(null) + }} + > + + + + {speed.toFixed(2)} + + )) + } +
+ } +
diff --git a/src/store/useUiStore.ts b/src/store/useUiStore.ts index 3f90ecb..b8f7822 100644 --- a/src/store/useUiStore.ts +++ b/src/store/useUiStore.ts @@ -18,6 +18,7 @@ const useUiStore = createWithEqualityFn()( shuffle: false, repeat: 'off', volume: 80, + playbackRate: 1, coverColor: '#8e24aa', CoverThemeColor: false, colorMode: 'auto', @@ -39,6 +40,7 @@ const useUiStore = createWithEqualityFn()( updateShuffle: (shuffle) => set(() => ({ shuffle: shuffle })), updateRepeat: (repeat) => set(() => ({ repeat: repeat })), updateVolume: (volume) => set(() => ({ volume: volume })), + updatePlaybackRate: (playbackRate) => set(() => ({ playbackRate })), updateCoverColor: (coverColor) => set(() => ({ coverColor: coverColor })), updateCoverThemeColor: (CoverThemeColor) => set(() => ({ CoverThemeColor: CoverThemeColor })), updateColorMode: (colorMode) => set(() => ({ colorMode: colorMode })), diff --git a/src/types/ui.ts b/src/types/ui.ts index 38fa632..452dcc3 100644 --- a/src/types/ui.ts +++ b/src/types/ui.ts @@ -11,6 +11,7 @@ export interface UiStatus { shuffle: boolean; repeat: 'off' | 'all' | 'one'; volume: number; + playbackRate: number; coverColor: string; CoverThemeColor: boolean; colorMode: 'auto' | 'light' | 'dark'; @@ -35,6 +36,7 @@ export interface UiAction { updateShuffle: (shuffle: UiStatus['shuffle']) => void; updateRepeat: (loop: UiStatus['repeat']) => void; updateVolume: (volume: UiStatus['volume']) => void; + updatePlaybackRate: (playbackRate: UiStatus['playbackRate']) => void; updateCoverColor: (coverColor: UiStatus['coverColor']) => void; updateCoverThemeColor: (CoverThemeColor: UiStatus['CoverThemeColor']) => void; updateColorMode: (colorMode: UiStatus['colorMode']) => void; From df6eebc6f35ae3f6a01541d0acbce55e30ecfb2a Mon Sep 17 00:00:00 2001 From: 22 <60903333+nini22P@users.noreply.github.com> Date: Sat, 1 Jun 2024 23:48:06 +0800 Subject: [PATCH 2/3] feat: i18n migration to lingui --- .swcrc | 5 + lingui.config.js | 12 + package-lock.json | 2302 +++++++++++++++-- package.json | 16 +- src/components/CommonList/CommonList.tsx | 5 +- src/components/CommonList/CommonListItem.tsx | 6 +- .../CommonList/CommonListItemCard.tsx | 5 +- src/components/CommonList/CommonMenu.tsx | 19 +- src/components/CommonList/ShuffleAll.tsx | 6 +- src/data/licenses.ts | 24 +- src/i18n.ts | 24 - src/locales/en.json | 68 - src/locales/en/messages.po | 219 ++ src/locales/en/messages.ts | 1 + src/locales/zh-CN.json | 68 - src/locales/zh-CN/messages.po | 219 ++ src/locales/zh-CN/messages.ts | 1 + src/main.tsx | 20 +- src/pages/Files/Files.tsx | 10 +- src/pages/Files/FilterMenu.tsx | 26 +- src/pages/LogIn.tsx | 7 +- src/pages/Player/Audio/MenuButton.tsx | 7 +- src/pages/Player/PlayerControl.tsx | 5 +- src/pages/Playlist/Playlist.tsx | 21 +- src/pages/Setting.tsx | 33 +- src/pages/SideBar/Playlists.tsx | 7 +- src/pages/SideBar/SideBar.tsx | 10 +- tsconfig.json | 3 + 28 files changed, 2588 insertions(+), 561 deletions(-) create mode 100644 lingui.config.js delete mode 100644 src/i18n.ts delete mode 100644 src/locales/en.json create mode 100644 src/locales/en/messages.po create mode 100644 src/locales/en/messages.ts delete mode 100644 src/locales/zh-CN.json create mode 100644 src/locales/zh-CN/messages.po create mode 100644 src/locales/zh-CN/messages.ts diff --git a/.swcrc b/.swcrc index ea5c4cd..33cea55 100644 --- a/.swcrc +++ b/.swcrc @@ -1,6 +1,11 @@ { "$schema": "https://json.schemastore.org/swcrc", "jsc": { + "experimental": { + "plugins": [ + ["@lingui/swc-plugin",{}] + ] + }, "parser": { "syntax": "typescript" }, diff --git a/lingui.config.js b/lingui.config.js new file mode 100644 index 0000000..e047d2f --- /dev/null +++ b/lingui.config.js @@ -0,0 +1,12 @@ +/** @type {import('@lingui/conf').LinguiConfig} */ +module.exports = { + locales: ['en', 'zh-CN'], + sourceLocale: 'en', + catalogs: [ + { + path: '/src/locales/{locale}/messages', + include: ['src'], + }, + ], + format: 'po', +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 0d93f0b..4410d2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,19 +13,18 @@ "@emotion/react": "^11.11.3", "@emotion/styled": "^11.11.0", "@fontsource/roboto": "^5.0.8", + "@lingui/macro": "^4.11.1", + "@lingui/react": "^4.11.1", "@mui/icons-material": "^5.15.10", "@mui/material": "^5.15.10", "@react-spring/web": "^9.7.3", "@use-gesture/react": "^10.3.0", "buffer": "^6.0.3", "extract-colors": "^4.0.2", - "i18next": "^23.9.0", - "i18next-browser-languagedetector": "^7.2.0", "idb-keyval": "^6.2.1", "music-metadata-browser": "^2.5.10", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-i18next": "^14.0.5", "react-router-dom": "^6.22.1", "react-virtualized": "^9.22.5", "short-uuid": "^4.2.2", @@ -33,6 +32,8 @@ "zustand": "^4.5.1" }, "devDependencies": { + "@lingui/cli": "^4.11.1", + "@lingui/swc-plugin": "^4.0.8", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", "@swc/core": "^1.4.2", "@types/extract-colors": "^1.1.4", @@ -1935,213 +1936,1067 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "dependencies": { + "@floating-ui/utils": "^0.2.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", + "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", + "dependencies": { + "@floating-ui/dom": "^1.6.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + }, + "node_modules/@fontsource/roboto": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.8.tgz", + "integrity": "sha512-XxPltXs5R31D6UZeLIV1td3wTXU3jzd3f2DLsXI8tytMGBkIsGcc9sIyiupRtA8y73HAhuSCeweOoBqf6DbWCA==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/types/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "dev": true + }, + "node_modules/@lingui/babel-plugin-extract-messages": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-4.11.1.tgz", + "integrity": "sha512-ouyUTVy2QbHQMv5ib2zFzimjpdBYALCbqnzOJI0YKCOIJD/+sCIPKcCzVrLdKEu90qwy18J/Ho7Z66BhffGAkQ==", + "dev": true, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/cli": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-4.11.1.tgz", + "integrity": "sha512-jA5pRB7UKwto704hMl2ohO/kGuoPEnf0lSg0qPlbVAfzQCTzq3TxJTgLEAoLQ5AL7aqXXysqrWOM9MEy7pJ4+w==", + "dev": true, + "dependencies": { + "@babel/core": "^7.21.0", + "@babel/generator": "^7.21.1", + "@babel/parser": "^7.21.2", + "@babel/runtime": "^7.21.0", + "@babel/types": "^7.21.2", + "@lingui/babel-plugin-extract-messages": "4.11.1", + "@lingui/conf": "4.11.1", + "@lingui/core": "4.11.1", + "@lingui/format-po": "4.11.1", + "@lingui/message-utils": "4.11.1", + "babel-plugin-macros": "^3.0.1", + "chalk": "^4.1.0", + "chokidar": "3.5.1", + "cli-table": "0.3.6", + "commander": "^10.0.0", + "convert-source-map": "^2.0.0", + "date-fns": "^3.6.0", + "esbuild": "^0.17.10", + "glob": "^7.1.4", + "inquirer": "^7.3.3", + "micromatch": "4.0.2", + "normalize-path": "^3.0.0", + "ora": "^5.1.0", + "pathe": "^1.1.0", + "pkg-up": "^3.1.0", + "pofile": "^1.1.4", + "pseudolocale": "^2.0.0", + "ramda": "^0.27.1", + "source-map": "^0.8.0-beta.0" + }, + "bin": { + "lingui": "dist/lingui.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@lingui/cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@lingui/cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@lingui/cli/node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/@lingui/cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@lingui/cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@lingui/cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@lingui/cli/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@lingui/cli/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@lingui/cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lingui/cli/node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lingui/cli/node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/@lingui/cli/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dev": true, + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@lingui/cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=8" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", - "dev": true, + "node_modules/@lingui/conf": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-4.11.1.tgz", + "integrity": "sha512-rjMoHl80QhLIo+Zfs1s04Uh+Twpy9CZN01la48oti0g+zAniLk9RN8KlIGC4hyruVh1CsIwjabjLAdwj3cOKKQ==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "chalk": "^4.1.0", + "cosmiconfig": "^8.0.0", + "jest-validate": "^29.4.3", + "jiti": "^1.17.1", + "lodash.get": "^4.4.2" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=16.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, + "node_modules/@lingui/conf/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "color-convert": "^2.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, + "node_modules/@lingui/conf/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "type-fest": "^0.20.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true, + "node_modules/@lingui/conf/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=7.0.0" } }, - "node_modules/@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "node_modules/@lingui/conf/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@lingui/conf/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dependencies": { - "@floating-ui/utils": "^0.2.1" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@floating-ui/dom": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", - "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", - "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" + "node_modules/@lingui/conf/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" } }, - "node_modules/@floating-ui/react-dom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.8.tgz", - "integrity": "sha512-HOdqOt3R3OGeTKidaLvJKcgg75S6tibQ3Tif4eyd91QnIJWr0NLvoXFpJA/j8HqkFSL68GDca9AuyWEHlhyClw==", + "node_modules/@lingui/conf/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "@floating-ui/dom": "^1.6.1" + "has-flag": "^4.0.0" }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "engines": { + "node": ">=8" } }, - "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" - }, - "node_modules/@fontsource/roboto": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.8.tgz", - "integrity": "sha512-XxPltXs5R31D6UZeLIV1td3wTXU3jzd3f2DLsXI8tytMGBkIsGcc9sIyiupRtA8y73HAhuSCeweOoBqf6DbWCA==" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, + "node_modules/@lingui/core": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@lingui/core/-/core-4.11.1.tgz", + "integrity": "sha512-iG8Oz46kuYFugWFlCH/SRvnsMqhD2zc3csPUVD7RZN/374v6Djd6EzlQEla307J3qFrhfJDrhhZrIH8v0GANCw==", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@babel/runtime": "^7.20.13", + "@lingui/message-utils": "4.11.1", + "unraw": "^3.0.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=16.0.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@lingui/format-po": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@lingui/format-po/-/format-po-4.11.1.tgz", + "integrity": "sha512-8qeiL8tXkGjW9kjUFzO00ZibpP5S6fJHdvTprm7wMAjpLtUYbMlSn/XQi2uLpG+ZB+9/EPTKGhNOaa9Fktq53Q==", "dev": true, - "engines": { - "node": ">=12.22" + "dependencies": { + "@lingui/conf": "4.11.1", + "@lingui/message-utils": "4.11.1", + "date-fns": "^3.6.0", + "pofile": "^1.1.4" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, + "node_modules/@lingui/macro": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-4.11.1.tgz", + "integrity": "sha512-CwZNfI00ad4jmXkd/0cBM05pNALw96Xu9EmqRubQzqsN7FON9d48ZYUyK1lBnfZNkQjS82ack8tjkW1o3X725Q==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/runtime": "^7.20.13", + "@babel/types": "^7.20.7", + "@lingui/conf": "4.11.1", + "@lingui/core": "4.11.1", + "@lingui/message-utils": "4.11.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@lingui/react": "^4.0.0", + "babel-plugin-macros": "2 || 3" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, + "node_modules/@lingui/message-utils": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@lingui/message-utils/-/message-utils-4.11.1.tgz", + "integrity": "sha512-6dufjX9YdGZftgnzmrakvgiE0srp83GhrbK32dz33hASgAbF5vGHkxyOZLmnL3xYO5RgsrCJ5HGyiB/oQKlc9w==", + "dependencies": { + "@messageformat/parser": "^5.0.0", + "js-sha256": "^0.10.1" + }, "engines": { - "node": ">=6.0.0" + "node": ">=16.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, + "node_modules/@lingui/react": { + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/@lingui/react/-/react-4.11.1.tgz", + "integrity": "sha512-pqnAhp1gYJKz7dgDAIb1G1oaBq7OcuQJrXDq/ekrLqSBLozlpPskY5bmv20ygtjgoUiVOlD0+32UWDLafasc4w==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "@lingui/core": "4.11.1" + }, "engines": { - "node": ">=6.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "node_modules/@lingui/swc-plugin": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@lingui/swc-plugin/-/swc-plugin-4.0.8.tgz", + "integrity": "sha512-zWvfFAvo2NOV+yFAjTbuEE0x53XEJlBS3EQ1R4xswjWSgpXWbLg45Rg37Ai2Ud0qeQkQLZnL93yt7dOwstX5eQ==", "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "peerDependencies": { + "@lingui/macro": "4" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "next": { + "optional": true + } } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", - "dev": true, + "node_modules/@messageformat/parser": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@messageformat/parser/-/parser-5.1.0.tgz", + "integrity": "sha512-jKlkls3Gewgw6qMjKZ9SFfHUpdzEVdovKFtW1qRhJ3WI4FW5R/NnGDqr8SDGz+krWDO3ki94boMmQvGke1HwUQ==", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "moo": "^0.5.1" } }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true - }, "node_modules/@mui/base": { "version": "5.0.0-beta.36", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.36.tgz", @@ -2558,6 +3413,11 @@ "node": ">=14.0.0" } }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, "node_modules/@sindresorhus/merge-streams": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz", @@ -2768,6 +3628,27 @@ "@types/node": "*" } }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.12", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", @@ -2784,7 +3665,6 @@ "version": "20.11.19", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.19.tgz", "integrity": "sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==", - "dev": true, "dependencies": { "undici-types": "~5.26.4" } @@ -2937,6 +3817,19 @@ "@types/node": "*" } }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.0.2.tgz", @@ -3484,13 +4377,40 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-html-community": { @@ -3546,8 +4466,7 @@ "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", @@ -3767,6 +4686,55 @@ "node": ">=8" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -3966,6 +4934,17 @@ "tslib": "^2.0.3" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001579", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz", @@ -4007,6 +4986,12 @@ "node": ">=0.8.0" } }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -4073,11 +5058,65 @@ "node": ">=0.10.0" } }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.6.tgz", + "integrity": "sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ==", + "dev": true, + "dependencies": { + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -4119,6 +5158,15 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", @@ -4591,6 +5639,16 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -4634,6 +5692,18 @@ "node": ">= 10" } }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-data-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.0.1.tgz", @@ -4878,6 +5948,12 @@ "integrity": "sha512-z/6oZ/Muqk4BaE7P69bXhUhpJbUM9ZJeka43ZwxsDshKtePns4mhBlh8bU5+yrnOnz3fhG82XLzGUXazOmsWnA==", "dev": true }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "node_modules/emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", @@ -5046,6 +6122,43 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -5437,6 +6550,20 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/extract-colors": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/extract-colors/-/extract-colors-4.0.2.tgz", @@ -5518,6 +6645,30 @@ "node": ">=0.8.0" } }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -5758,6 +6909,20 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -6140,14 +7305,6 @@ "node": ">=12" } }, - "node_modules/html-parse-stringify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", - "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", - "dependencies": { - "void-elements": "3.1.0" - } - }, "node_modules/html-webpack-plugin": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", @@ -6286,36 +7443,6 @@ "node": ">=10.17.0" } }, - "node_modules/i18next": { - "version": "23.9.0", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.9.0.tgz", - "integrity": "sha512-f3MUciKqwzNV//mHG6EtdSlC65+nqH/3zK8sOSWqNV6FVu2tmHhF/rFOp9UF8S4m1odojtuipKaKJrP0Loh60g==", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - } - ], - "dependencies": { - "@babel/runtime": "^7.23.2" - } - }, - "node_modules/i18next-browser-languagedetector": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.0.tgz", - "integrity": "sha512-U00DbDtFIYD3wkWsr2aVGfXGAj2TgnELzOX9qv8bT0aJtvPV9CRO77h+vgmHFBMe7LAxdwvT/7VkCWGya6L3tA==", - "dependencies": { - "@babel/runtime": "^7.23.2" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -6432,11 +7559,105 @@ "wrappy": "1" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -6590,6 +7811,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -6602,6 +7832,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -6768,6 +8007,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -6901,6 +8152,94 @@ "node": ">=8" } }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-validate/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -6943,11 +8282,15 @@ "version": "1.20.0", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", - "dev": true, "bin": { "jiti": "bin/jiti.js" } }, + "node_modules/js-sha256": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.10.1.tgz", + "integrity": "sha512-5obBtsz9301ULlsgggLg542s/jqtddfOpV5KJc4hajc9JV8GeY2gZHSVpYBn4nWqAUTJ9v+xwtbJ1mIBgIH5Vw==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6957,7 +8300,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -7071,7 +8413,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, "engines": { "node": ">=6" } @@ -7144,6 +8485,11 @@ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -7156,6 +8502,92 @@ "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", "dev": true }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -7317,6 +8749,11 @@ "node": "*" } }, + "node_modules/moo": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -7372,6 +8809,12 @@ "url": "https://github.com/sponsors/Borewit" } }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -7570,41 +9013,143 @@ "node": ">=6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=7.0.0" } }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/p-limit": { @@ -7762,6 +9307,12 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, "node_modules/peek-readable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", @@ -7856,6 +9407,85 @@ "node": ">=8" } }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pofile": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/pofile/-/pofile-1.1.4.tgz", + "integrity": "sha512-r6Q21sKsY1AjTVVjOuU02VYKVNQGJNQHjTIvs4dEbeuuYfxgYk/DGD2mqqq4RDaVkwdSq0VEtmQUOPe/wH8X3g==", + "dev": true + }, "node_modules/postcss": { "version": "8.4.35", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", @@ -8050,6 +9680,30 @@ "renderkid": "^3.0.0" } }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -8101,6 +9755,30 @@ "node": ">= 0.10" } }, + "node_modules/pseudolocale": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pseudolocale/-/pseudolocale-2.0.0.tgz", + "integrity": "sha512-g1K9tCQYY4e3UGtnW8qs3kGWAOONxt7i5wuOFvf3N1EIIRhiLVIhZ9AM/ZyGTxsp231JbFywJU/EbJ5ZoqnZdg==", + "dev": true, + "dependencies": { + "commander": "^10.0.0" + }, + "bin": { + "pseudolocale": "dist/cli.mjs" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/pseudolocale/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -8145,6 +9823,12 @@ } ] }, + "node_modules/ramda": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", + "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "dev": true + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -8210,27 +9894,6 @@ "react": "^18.2.0" } }, - "node_modules/react-i18next": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.0.5.tgz", - "integrity": "sha512-5+bQSeEtgJrMBABBL5lO7jPdSNAbeAZ+MlFWDw//7FnVacuVu3l9EeWFzBQvZsKy+cihkbThWOAThEdH8YjGEw==", - "dependencies": { - "@babel/runtime": "^7.23.9", - "html-parse-stringify": "^3.0.1" - }, - "peerDependencies": { - "i18next": ">= 23.2.3", - "react": ">= 16.8.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -8556,6 +10219,19 @@ "node": ">=4" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -8590,6 +10266,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -8613,6 +10298,24 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/safe-array-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", @@ -9130,6 +10833,20 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.matchall": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", @@ -9447,12 +11164,30 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -9498,6 +11233,15 @@ "url": "https://github.com/sponsors/Borewit" } }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/ts-api-utils": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", @@ -9631,7 +11375,7 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9658,8 +11402,7 @@ "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -9743,6 +11486,11 @@ "node": ">= 0.8" } }, + "node_modules/unraw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unraw/-/unraw-3.0.0.tgz", + "integrity": "sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==" + }, "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -9837,14 +11585,6 @@ "node": ">= 0.8" } }, - "node_modules/void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -9867,6 +11607,21 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, "node_modules/webpack": { "version": "5.90.3", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", @@ -10224,6 +11979,17 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -10558,32 +12324,6 @@ "node": ">=8" } }, - "node_modules/workbox-build/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/workbox-build/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "node_modules/workbox-build/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, "node_modules/workbox-cacheable-response": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-7.0.0.tgz", diff --git a/package.json b/package.json index c1c6626..68080e7 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,11 @@ "private": true, "version": "1.6.5", "scripts": { - "dev": "webpack serve", - "build": "webpack --mode=production --node-env=production", + "dev": "lingui extract & lingui compile --typescript & webpack serve", + "build": "lingui extract & lingui compile --typescript & webpack --mode=production --node-env=production", "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "watch": "webpack --watch" + "watch": "webpack --watch", + "lingui": "lingui extract & lingui compile --typescript" }, "dependencies": { "@azure/msal-browser": "^3.10.0", @@ -15,19 +16,18 @@ "@emotion/react": "^11.11.3", "@emotion/styled": "^11.11.0", "@fontsource/roboto": "^5.0.8", + "@lingui/macro": "^4.11.1", + "@lingui/react": "^4.11.1", "@mui/icons-material": "^5.15.10", "@mui/material": "^5.15.10", "@react-spring/web": "^9.7.3", "@use-gesture/react": "^10.3.0", "buffer": "^6.0.3", "extract-colors": "^4.0.2", - "i18next": "^23.9.0", - "i18next-browser-languagedetector": "^7.2.0", "idb-keyval": "^6.2.1", "music-metadata-browser": "^2.5.10", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-i18next": "^14.0.5", "react-router-dom": "^6.22.1", "react-virtualized": "^9.22.5", "short-uuid": "^4.2.2", @@ -35,6 +35,8 @@ "zustand": "^4.5.1" }, "devDependencies": { + "@lingui/cli": "^4.11.1", + "@lingui/swc-plugin": "^4.0.8", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", "@swc/core": "^1.4.2", "@types/extract-colors": "^1.1.4", @@ -65,4 +67,4 @@ "webpack-merge": "^5.10.0", "workbox-webpack-plugin": "^7.0.0" } -} \ No newline at end of file +} diff --git a/src/components/CommonList/CommonList.tsx b/src/components/CommonList/CommonList.tsx index 839d2bf..c1a6182 100644 --- a/src/components/CommonList/CommonList.tsx +++ b/src/components/CommonList/CommonList.tsx @@ -12,10 +12,10 @@ import CommonListItem from './CommonListItem' import { Box, Fab, List, useMediaQuery, useTheme } from '@mui/material' import { AutoSizer, List as VirtualList } from 'react-virtualized' import CommonListItemCard from './CommonListItemCard' -import { useTranslation } from 'react-i18next' import ShuffleRoundedIcon from '@mui/icons-material/ShuffleRounded' import PlayArrowRoundedIcon from '@mui/icons-material/PlayArrowRounded' import { useNavigate } from 'react-router-dom' +import { t } from '@lingui/macro' const CommonList = ( { @@ -36,7 +36,6 @@ const CommonList = ( }, }) => { - const { t } = useTranslation() const navigate = useNavigate() const [anchorEl, setAnchorEl] = useState(null) const [menuOpen, setMenuOpen] = useState(false) @@ -399,7 +398,7 @@ const CommonList = ( handleClickPlayAll()}> - {t('playlist.playAll')} + {t`Play all`} } diff --git a/src/components/CommonList/CommonListItem.tsx b/src/components/CommonList/CommonListItem.tsx index f41ef5b..fec6a3f 100644 --- a/src/components/CommonList/CommonListItem.tsx +++ b/src/components/CommonList/CommonListItem.tsx @@ -7,7 +7,7 @@ import MusicNoteRoundedIcon from '@mui/icons-material/MusicNoteRounded' import MovieRoundedIcon from '@mui/icons-material/MovieRounded' import MoreVertRoundedIcon from '@mui/icons-material/MoreVertRounded' import { ListItem, IconButton, ListItemButton, ListItemAvatar, Avatar, ListItemText, ListItemIcon } from '@mui/material' -import { useTranslation } from 'react-i18next' +import { t } from '@lingui/macro' const CommonListItem = ({ item, @@ -21,8 +21,6 @@ const CommonListItem = ({ handleClickMenu: (event: React.MouseEvent, currentFile: File) => void, }) => { - const { t } = useTranslation() - return ( handleClickMenu(event, { diff --git a/src/components/CommonList/CommonListItemCard.tsx b/src/components/CommonList/CommonListItemCard.tsx index cf1e65b..91a94fc 100644 --- a/src/components/CommonList/CommonListItemCard.tsx +++ b/src/components/CommonList/CommonListItemCard.tsx @@ -6,10 +6,10 @@ import FolderOpenRoundedIcon from '@mui/icons-material/FolderOpenRounded' import MusicNoteRoundedIcon from '@mui/icons-material/MusicNoteRounded' import MovieRoundedIcon from '@mui/icons-material/MovieRounded' import MoreVertRoundedIcon from '@mui/icons-material/MoreVertRounded' -import { useTranslation } from 'react-i18next' import Grid from '@mui/material/Unstable_Grid2/Grid2' import useUtils from '@/hooks/useUtils' import { sizeConvert } from '@/utils' +import { t } from '@lingui/macro' const CommonListItemCard = ({ item, @@ -24,7 +24,6 @@ const CommonListItemCard = ({ }) => { const theme = useTheme() - const { t } = useTranslation() const { getThumbnailUrl } = useUtils() const thumbnailUrl = getThumbnailUrl(item) @@ -74,7 +73,7 @@ const CommonListItemCard = ({ (item.fileType === 'audio' || item.fileType === 'video') && event.stopPropagation()} diff --git a/src/components/CommonList/CommonMenu.tsx b/src/components/CommonList/CommonMenu.tsx index 2bc08d6..e37bae5 100644 --- a/src/components/CommonList/CommonMenu.tsx +++ b/src/components/CommonList/CommonMenu.tsx @@ -1,4 +1,4 @@ -import { useTranslation } from 'react-i18next' +import { t } from '@lingui/macro' import { useNavigate } from 'react-router-dom' import shortUUID from 'short-uuid' import { Menu, MenuItem, ListItemText, Button, Dialog, DialogActions, DialogTitle, List, ListItem, ListItemButton, ListItemIcon } from '@mui/material' @@ -37,7 +37,6 @@ const CommonMenu = ( } ) => { - const { t } = useTranslation() const navigate = useNavigate() const [updateFolderTree] = useUiStore((state) => [state.updateFolderTree]) @@ -61,7 +60,7 @@ const CommonMenu = ( // 新建播放列表 const addNewPlaylist = () => { const id = shortUUID().generate() - insertPlaylist({ id, title: t('playlist.newPlaylist'), fileList: [] }) + insertPlaylist({ id, title: t`New playlist`, fileList: [] }) } // 添加到播放列表 @@ -105,21 +104,21 @@ const CommonMenu = ( setDialogOpen(true) handleCloseMenu() }}> - + { // 当前选择文件不在播放队列中时显示 (currentFile && !playQueue?.find((file) => { return pathConvert(file.filePath) === pathConvert(currentFile?.filePath) })) && - + } { // 在 Files 组件中隐藏 handleClickRemove && - + } @@ -135,7 +134,7 @@ const CommonMenu = ( handleCloseMenu() }} > - + } @@ -146,7 +145,7 @@ const CommonMenu = ( fullWidth maxWidth='xs' > - {t('playlist.addToPlaylist')} + {t`Add to playlist`} {playlists?.map((item, index) => - + - + diff --git a/src/components/CommonList/ShuffleAll.tsx b/src/components/CommonList/ShuffleAll.tsx index aea2f05..4e71095 100644 --- a/src/components/CommonList/ShuffleAll.tsx +++ b/src/components/CommonList/ShuffleAll.tsx @@ -1,11 +1,9 @@ import { ListItem, ListItemButton, ListItemIcon, ListItemText } from '@mui/material' -import { useTranslation } from 'react-i18next' +import { t } from '@lingui/macro' import ShuffleRoundedIcon from '@mui/icons-material/ShuffleRounded' const ShuffleAll = ({ handleClickShuffleAll }: { handleClickShuffleAll: () => void }) => { - const { t } = useTranslation() - return ( vo - + ) diff --git a/src/data/licenses.ts b/src/data/licenses.ts index 80e1209..268e95a 100644 --- a/src/data/licenses.ts +++ b/src/data/licenses.ts @@ -26,6 +26,12 @@ export const licenses = [ 'link': 'https://github.com/fontsource/font-files', 'author': 'Google Inc.' }, + { + 'name': '@lingui', + 'licenseType': 'MIT', + 'link': 'https://github.com/lingui/js-lingui', + 'author': 'Lingui', + }, { 'name': '@mui/icons-material', 'licenseType': 'MIT', @@ -62,18 +68,6 @@ export const licenses = [ 'link': 'https://github.com/Namide/extract-colors', 'author': 'damien@doussaud.fr' }, - { - 'name': 'i18next', - 'licenseType': 'MIT', - 'link': 'https://github.com/i18next/i18next', - 'author': 'Jan Mühlemann (https://github.com/jamuhl)' - }, - { - 'name': 'i18next-browser-languagedetector', - 'licenseType': 'MIT', - 'link': 'https://github.com/i18next/i18next-browser-languageDetector', - 'author': 'Jan Mühlemann (https://github.com/jamuhl)' - }, { 'name': 'idb-keyval', 'licenseType': 'Apache-2.0', @@ -98,12 +92,6 @@ export const licenses = [ 'link': 'https://github.com/facebook/react', 'author': 'n/a' }, - { - 'name': 'react-i18next', - 'licenseType': 'MIT', - 'link': 'https://github.com/i18next/react-i18next', - 'author': 'Jan Mühlemann (https://github.com/jamuhl)' - }, { 'name': 'react-router-dom', 'licenseType': 'MIT', diff --git a/src/i18n.ts b/src/i18n.ts deleted file mode 100644 index e774618..0000000 --- a/src/i18n.ts +++ /dev/null @@ -1,24 +0,0 @@ -import i18next from 'i18next' -import { initReactI18next } from 'react-i18next' -import LanguageDetector from 'i18next-browser-languagedetector' -import en from './locales/en.json' -import zh_CN from './locales/zh-CN.json' - -i18next - .use(LanguageDetector) - .use(initReactI18next) - .init({ - fallbackLng: 'en', - interpolation: { - escapeValue: false, - }, - detection: { - caches: [] // Disable LanguageDetector cache - }, - resources: { - 'en': { translation: en }, - 'zh-CN': { translation: zh_CN }, - }, - }) - -export default i18next \ No newline at end of file diff --git a/src/locales/en.json b/src/locales/en.json deleted file mode 100644 index 12ecb13..0000000 --- a/src/locales/en.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "common": { - "ok": "OK", - "cancel": "Cancel", - "rename": "Rename", - "remove": "Remove", - "delete": "Delete", - "clear": "Clear", - "calculate": "Calculate", - "more": "More", - "about": "About", - "openSourceDependencies": "Open source dependencies", - "search": "Search", - "close": "Close" - }, - "account": { - "account": "Account", - "signIn": "Sign in", - "signOut": "Sign out", - "signInAlert": "Please use Microsoft account authorization to log in" - }, - "playlist": { - "newPlaylist": "New Playlist", - "playAll": "Play all", - "shuffleAll": "Shuffle all", - "addPlaylist": "Add playlist", - "addToPlaylist": "Add to playlist", - "addToPlayQueue": "Add to play queue", - "openInFolder": "Open in folder", - "playlistWillBeDeleted": "The playlist will be deleted" - }, - "nav": { - "files": "Files", - "history": "History", - "setting": "Setting" - }, - "data": { - "data": "Data", - "localMetaDataCache": "Local MetaData Cache" - }, - "customize": { - "customize": "Customize", - "colorMode": "Color Mode", - "auto": "Auto", - "light": "Light", - "dark": "Dark", - "CoverThemeColor": "Use album cover theme color" - }, - "files": { - "display": { - "list": "List", - "multicolumnList": "Multicolumn list", - "grid": "Grid" - }, - "sortBy": { - "name": "Name", - "size": "Size", - "lastModified": "Last Modified" - }, - "orderBy": { - "asc": "Ascending", - "desc": "Descending" - }, - "foldersFirst": "Folders first", - "mediaOnly": "Media only", - "hdThumbnails": "HD thumbnails" - } -} \ No newline at end of file diff --git a/src/locales/en/messages.po b/src/locales/en/messages.po new file mode 100644 index 0000000..de7ada3 --- /dev/null +++ b/src/locales/en/messages.po @@ -0,0 +1,219 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-06-01 23:36+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: en\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/pages/Setting.tsx:109 +msgid "About" +msgstr "About" + +#: src/pages/Setting.tsx:41 +msgid "Account" +msgstr "Account" + +#: src/components/CommonList/CommonMenu.tsx:174 +#: src/pages/SideBar/Playlists.tsx:49 +msgid "Add playlist" +msgstr "Add playlist" + +#: src/components/CommonList/CommonMenu.tsx:114 +msgid "Add to play queue" +msgstr "Add to play queue" + +#: src/components/CommonList/CommonMenu.tsx:107 +#: src/components/CommonList/CommonMenu.tsx:148 +msgid "Add to playlist" +msgstr "Add to playlist" + +#: src/pages/Files/FilterMenu.tsx:102 +msgid "Ascending" +msgstr "Ascending" + +#: src/pages/Setting.tsx:85 +msgid "Auto" +msgstr "Auto" + +#: src/components/CommonList/CommonMenu.tsx:179 +#: src/pages/Playlist/Playlist.tsx:168 +#: src/pages/Playlist/Playlist.tsx:191 +msgid "Cancel" +msgstr "Cancel" + +#: src/pages/Setting.tsx:66 +msgid "Clear" +msgstr "Clear" + +#: src/pages/Files/Files.tsx:174 +msgid "Close" +msgstr "Close" + +#: src/pages/Setting.tsx:92 +msgid "Color mode" +msgstr "Color mode" + +#: src/pages/Setting.tsx:75 +msgid "Customize" +msgstr "Customize" + +#: src/pages/Setting.tsx:87 +msgid "Dark" +msgstr "Dark" + +#: src/pages/Setting.tsx:62 +msgid "Data" +msgstr "Data" + +#: src/pages/Playlist/Playlist.tsx:145 +msgid "Delete" +msgstr "Delete" + +#: src/pages/Files/FilterMenu.tsx:103 +msgid "Descending" +msgstr "Descending" + +#: src/pages/SideBar/SideBar.tsx:19 +msgid "Files" +msgstr "Files" + +#: src/pages/Files/FilterMenu.tsx:111 +msgid "Folders first" +msgstr "Folders first" + +#: src/pages/Files/FilterMenu.tsx:78 +msgid "Grid" +msgstr "Grid" + +#: src/pages/Files/FilterMenu.tsx:115 +msgid "HD thumbnails" +msgstr "HD thumbnails" + +#: src/pages/SideBar/SideBar.tsx:20 +msgid "History" +msgstr "History" + +#: src/pages/Files/FilterMenu.tsx:91 +msgid "Last modified" +msgstr "Last modified" + +#: src/pages/Setting.tsx:86 +msgid "Light" +msgstr "Light" + +#: src/pages/Files/FilterMenu.tsx:76 +msgid "List" +msgstr "List" + +#: src/pages/Setting.tsx:70 +msgid "Local metaData cache" +msgstr "Local metaData cache" + +#: src/pages/Files/FilterMenu.tsx:112 +msgid "Media only" +msgstr "Media only" + +#: src/components/CommonList/CommonListItem.tsx:32 +#: src/components/CommonList/CommonListItemCard.tsx:76 +#: src/pages/Playlist/Playlist.tsx:101 +msgid "More" +msgstr "More" + +#: src/pages/Files/FilterMenu.tsx:77 +msgid "Multicolumn list" +msgstr "Multicolumn list" + +#: src/pages/Files/FilterMenu.tsx:89 +msgid "Name" +msgstr "Name" + +#: src/components/CommonList/CommonMenu.tsx:63 +#: src/pages/SideBar/Playlists.tsx:16 +msgid "New playlist" +msgstr "New playlist" + +#: src/pages/Playlist/Playlist.tsx:175 +#: src/pages/Playlist/Playlist.tsx:192 +msgid "OK" +msgstr "OK" + +#: src/components/CommonList/CommonMenu.tsx:121 +msgid "Open in folder" +msgstr "Open in folder" + +#: src/pages/Setting.tsx:118 +msgid "Open source dependencies" +msgstr "Open source dependencies" + +#: src/components/CommonList/CommonList.tsx:401 +msgid "Play all" +msgstr "Play all" + +#: src/pages/Player/Audio/MenuButton.tsx:72 +#: src/pages/Player/Audio/MenuButton.tsx:88 +#: src/pages/Player/PlayerControl.tsx:377 +#: src/pages/Player/PlayerControl.tsx:391 +msgid "Playback rate" +msgstr "Playback rate" + +#: src/pages/LogIn.tsx:25 +#: src/pages/Setting.tsx:55 +msgid "Please use Microsoft account authorization to log in" +msgstr "Please use Microsoft account authorization to log in" + +#: src/components/CommonList/CommonMenu.tsx:137 +msgid "Remove" +msgstr "Remove" + +#: src/pages/Playlist/Playlist.tsx:139 +#: src/pages/Playlist/Playlist.tsx:156 +msgid "Rename" +msgstr "Rename" + +#: src/pages/Files/Files.tsx:161 +#: src/pages/Files/Files.tsx:162 +#: src/pages/Files/Files.tsx:174 +#: src/pages/Files/Files.tsx:174 +msgid "Search" +msgstr "Search" + +#: src/pages/SideBar/SideBar.tsx:21 +msgid "Setting" +msgstr "Setting" + +#: src/components/CommonList/ShuffleAll.tsx:24 +msgid "Shuffle all" +msgstr "Shuffle all" + +#: src/pages/LogIn.tsx:27 +#: src/pages/Setting.tsx:46 +msgid "Sign in" +msgstr "Sign in" + +#: src/pages/Setting.tsx:45 +msgid "Sign out" +msgstr "Sign out" + +#: src/pages/Files/FilterMenu.tsx:90 +msgid "Size" +msgstr "Size" + +#: src/pages/Player/Audio/MenuButton.tsx:65 +msgid "Switch theme" +msgstr "Switch theme" + +#: src/pages/Playlist/Playlist.tsx:188 +msgid "The playlist will be deleted" +msgstr "The playlist will be deleted" + +#: src/pages/Setting.tsx:104 +msgid "Use album cover theme color" +msgstr "Use album cover theme color" diff --git a/src/locales/en/messages.ts b/src/locales/en/messages.ts new file mode 100644 index 0000000..cb6f953 --- /dev/null +++ b/src/locales/en/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages:Messages=JSON.parse("{\"uyJsf6\":\"About\",\"AeXO77\":\"Account\",\"uQ+CWJ\":\"Add playlist\",\"Vmuxgj\":\"Add to play queue\",\"gLfZlz\":\"Add to playlist\",\"nYD/Cq\":\"Ascending\",\"R9Khdg\":\"Auto\",\"dEgA5A\":\"Cancel\",\"xCJdfg\":\"Clear\",\"yz7wBu\":\"Close\",\"YDWhuY\":\"Color mode\",\"srRMnJ\":\"Customize\",\"pvnfJD\":\"Dark\",\"HKH+W+\":\"Data\",\"cnGeoo\":\"Delete\",\"Cko536\":\"Descending\",\"sER+bs\":\"Files\",\"rvhCbi\":\"Folders first\",\"CXDHcv\":\"Grid\",\"t3SPBU\":\"HD thumbnails\",\"0caMy7\":\"History\",\"x5DnMs\":\"Last modified\",\"1njn7W\":\"Light\",\"2BBAbc\":\"List\",\"2QFkSI\":\"Local metaData cache\",\"eK4SL/\":\"Media only\",\"2FYpfJ\":\"More\",\"/u/nsV\":\"Multicolumn list\",\"6YtxFj\":\"Name\",\"dMizp8\":\"New playlist\",\"zga9sT\":\"OK\",\"zAd2xF\":\"Open in folder\",\"OZNIzM\":\"Open source dependencies\",\"tVR7Hf\":\"Play all\",\"W7OEzk\":\"Playback rate\",\"2t5KJY\":\"Please use Microsoft account authorization to log in\",\"t/YqKh\":\"Remove\",\"2wxgft\":\"Rename\",\"A1taO8\":\"Search\",\"EFKJQT\":\"Setting\",\"ML96zX\":\"Shuffle all\",\"5lWFkC\":\"Sign in\",\"fcWrnU\":\"Sign out\",\"Cj2Gtd\":\"Size\",\"dGrFyD\":\"Switch theme\",\"DLu3TH\":\"The playlist will be deleted\",\"lRkLr5\":\"Use album cover theme color\"}"); \ No newline at end of file diff --git a/src/locales/zh-CN.json b/src/locales/zh-CN.json deleted file mode 100644 index f0cb44b..0000000 --- a/src/locales/zh-CN.json +++ /dev/null @@ -1,68 +0,0 @@ -{ - "common": { - "ok": "确定", - "cancel": "取消", - "rename": "重命名", - "remove": "移除", - "delete": "删除", - "clear": "清除", - "calculate": "计算", - "more": "更多", - "about": "关于", - "openSourceDependencies": "开源库", - "search": "搜索", - "close": "关闭" - }, - "account": { - "account": "账户", - "signIn": "登录", - "signOut": "注销", - "signInAlert": "请使用微软账户授权登录" - }, - "playlist": { - "newPlaylist": "新播放列表", - "playAll": "全部播放", - "shuffleAll": "全部随机播放", - "addPlaylist": "新建播放列表", - "addToPlaylist": "添加到播放列表", - "addToPlayQueue": "添加到播放队列", - "openInFolder": "打开所在文件夹", - "playlistWillBeDeleted": "播放列表将会被删除" - }, - "nav": { - "files": "文件", - "history": "历史", - "setting": "设置" - }, - "data": { - "data": "数据", - "localMetaDataCache": "本地元数据缓存" - }, - "customize": { - "customize": "定制", - "colorMode": "颜色模式", - "auto": "自动", - "light": "浅色", - "dark": "深色", - "CoverThemeColor": "使用专辑封面主题色" - }, - "files": { - "display": { - "list": "列表", - "multicolumnList": "多列列表", - "grid": "网格" - }, - "sortBy": { - "name": "名称", - "size": "大小", - "lastModified": "最后修改" - }, - "orderBy": { - "asc": "正序", - "desc": "倒序" - }, - "foldersFirst": "文件夹优先", - "mediaOnly": "仅限媒体", - "hdThumbnails": "高清缩略图" - } -} \ No newline at end of file diff --git a/src/locales/zh-CN/messages.po b/src/locales/zh-CN/messages.po new file mode 100644 index 0000000..e3fbe3c --- /dev/null +++ b/src/locales/zh-CN/messages.po @@ -0,0 +1,219 @@ +msgid "" +msgstr "" +"POT-Creation-Date: 2024-06-01 23:36+0800\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: @lingui/cli\n" +"Language: zh-CN\n" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Plural-Forms: \n" + +#: src/pages/Setting.tsx:109 +msgid "About" +msgstr "关于" + +#: src/pages/Setting.tsx:41 +msgid "Account" +msgstr "账户" + +#: src/components/CommonList/CommonMenu.tsx:174 +#: src/pages/SideBar/Playlists.tsx:49 +msgid "Add playlist" +msgstr "新建播放列表" + +#: src/components/CommonList/CommonMenu.tsx:114 +msgid "Add to play queue" +msgstr "添加到播放队列" + +#: src/components/CommonList/CommonMenu.tsx:107 +#: src/components/CommonList/CommonMenu.tsx:148 +msgid "Add to playlist" +msgstr "添加到播放列表" + +#: src/pages/Files/FilterMenu.tsx:102 +msgid "Ascending" +msgstr "正序" + +#: src/pages/Setting.tsx:85 +msgid "Auto" +msgstr "自动" + +#: src/components/CommonList/CommonMenu.tsx:179 +#: src/pages/Playlist/Playlist.tsx:168 +#: src/pages/Playlist/Playlist.tsx:191 +msgid "Cancel" +msgstr "取消" + +#: src/pages/Setting.tsx:66 +msgid "Clear" +msgstr "清除" + +#: src/pages/Files/Files.tsx:174 +msgid "Close" +msgstr "关闭" + +#: src/pages/Setting.tsx:92 +msgid "Color mode" +msgstr "颜色模式" + +#: src/pages/Setting.tsx:75 +msgid "Customize" +msgstr "定制" + +#: src/pages/Setting.tsx:87 +msgid "Dark" +msgstr "深色" + +#: src/pages/Setting.tsx:62 +msgid "Data" +msgstr "数据" + +#: src/pages/Playlist/Playlist.tsx:145 +msgid "Delete" +msgstr "删除" + +#: src/pages/Files/FilterMenu.tsx:103 +msgid "Descending" +msgstr "倒序" + +#: src/pages/SideBar/SideBar.tsx:19 +msgid "Files" +msgstr "文件" + +#: src/pages/Files/FilterMenu.tsx:111 +msgid "Folders first" +msgstr "文件夹优先" + +#: src/pages/Files/FilterMenu.tsx:78 +msgid "Grid" +msgstr "网格" + +#: src/pages/Files/FilterMenu.tsx:115 +msgid "HD thumbnails" +msgstr "高清缩略图" + +#: src/pages/SideBar/SideBar.tsx:20 +msgid "History" +msgstr "历史" + +#: src/pages/Files/FilterMenu.tsx:91 +msgid "Last modified" +msgstr "最后修改" + +#: src/pages/Setting.tsx:86 +msgid "Light" +msgstr "浅色" + +#: src/pages/Files/FilterMenu.tsx:76 +msgid "List" +msgstr "列表" + +#: src/pages/Setting.tsx:70 +msgid "Local metaData cache" +msgstr "本地元数据缓存" + +#: src/pages/Files/FilterMenu.tsx:112 +msgid "Media only" +msgstr "仅限媒体" + +#: src/components/CommonList/CommonListItem.tsx:32 +#: src/components/CommonList/CommonListItemCard.tsx:76 +#: src/pages/Playlist/Playlist.tsx:101 +msgid "More" +msgstr "更多" + +#: src/pages/Files/FilterMenu.tsx:77 +msgid "Multicolumn list" +msgstr "多列列表" + +#: src/pages/Files/FilterMenu.tsx:89 +msgid "Name" +msgstr "名称" + +#: src/components/CommonList/CommonMenu.tsx:63 +#: src/pages/SideBar/Playlists.tsx:16 +msgid "New playlist" +msgstr "新播放列表" + +#: src/pages/Playlist/Playlist.tsx:175 +#: src/pages/Playlist/Playlist.tsx:192 +msgid "OK" +msgstr "确定" + +#: src/components/CommonList/CommonMenu.tsx:121 +msgid "Open in folder" +msgstr "打开所在文件夹" + +#: src/pages/Setting.tsx:118 +msgid "Open source dependencies" +msgstr "开源库" + +#: src/components/CommonList/CommonList.tsx:401 +msgid "Play all" +msgstr "全部播放" + +#: src/pages/Player/Audio/MenuButton.tsx:72 +#: src/pages/Player/Audio/MenuButton.tsx:88 +#: src/pages/Player/PlayerControl.tsx:377 +#: src/pages/Player/PlayerControl.tsx:391 +msgid "Playback rate" +msgstr "播放速度" + +#: src/pages/LogIn.tsx:25 +#: src/pages/Setting.tsx:55 +msgid "Please use Microsoft account authorization to log in" +msgstr "请使用微软账户授权登录" + +#: src/components/CommonList/CommonMenu.tsx:137 +msgid "Remove" +msgstr "移除" + +#: src/pages/Playlist/Playlist.tsx:139 +#: src/pages/Playlist/Playlist.tsx:156 +msgid "Rename" +msgstr "重命名" + +#: src/pages/Files/Files.tsx:161 +#: src/pages/Files/Files.tsx:162 +#: src/pages/Files/Files.tsx:174 +#: src/pages/Files/Files.tsx:174 +msgid "Search" +msgstr "搜索" + +#: src/pages/SideBar/SideBar.tsx:21 +msgid "Setting" +msgstr "设置" + +#: src/components/CommonList/ShuffleAll.tsx:24 +msgid "Shuffle all" +msgstr "全部随机播放" + +#: src/pages/LogIn.tsx:27 +#: src/pages/Setting.tsx:46 +msgid "Sign in" +msgstr "登录" + +#: src/pages/Setting.tsx:45 +msgid "Sign out" +msgstr "注销" + +#: src/pages/Files/FilterMenu.tsx:90 +msgid "Size" +msgstr "大小" + +#: src/pages/Player/Audio/MenuButton.tsx:65 +msgid "Switch theme" +msgstr "切换主题" + +#: src/pages/Playlist/Playlist.tsx:188 +msgid "The playlist will be deleted" +msgstr "播放列表将会被删除" + +#: src/pages/Setting.tsx:104 +msgid "Use album cover theme color" +msgstr "使用专辑封面主题色" diff --git a/src/locales/zh-CN/messages.ts b/src/locales/zh-CN/messages.ts new file mode 100644 index 0000000..c6d0ef9 --- /dev/null +++ b/src/locales/zh-CN/messages.ts @@ -0,0 +1 @@ +/*eslint-disable*/import type{Messages}from"@lingui/core";export const messages:Messages=JSON.parse("{\"uyJsf6\":\"关于\",\"AeXO77\":\"账户\",\"uQ+CWJ\":\"新建播放列表\",\"Vmuxgj\":\"添加到播放队列\",\"gLfZlz\":\"添加到播放列表\",\"nYD/Cq\":\"正序\",\"R9Khdg\":\"自动\",\"dEgA5A\":\"取消\",\"xCJdfg\":\"清除\",\"yz7wBu\":\"关闭\",\"YDWhuY\":\"颜色模式\",\"srRMnJ\":\"定制\",\"pvnfJD\":\"深色\",\"HKH+W+\":\"数据\",\"cnGeoo\":\"删除\",\"Cko536\":\"倒序\",\"sER+bs\":\"文件\",\"rvhCbi\":\"文件夹优先\",\"CXDHcv\":\"网格\",\"t3SPBU\":\"高清缩略图\",\"0caMy7\":\"历史\",\"x5DnMs\":\"最后修改\",\"1njn7W\":\"浅色\",\"2BBAbc\":\"列表\",\"2QFkSI\":\"本地元数据缓存\",\"eK4SL/\":\"仅限媒体\",\"2FYpfJ\":\"更多\",\"/u/nsV\":\"多列列表\",\"6YtxFj\":\"名称\",\"dMizp8\":\"新播放列表\",\"zga9sT\":\"确定\",\"zAd2xF\":\"打开所在文件夹\",\"OZNIzM\":\"开源库\",\"tVR7Hf\":\"全部播放\",\"W7OEzk\":\"播放速度\",\"2t5KJY\":\"请使用微软账户授权登录\",\"t/YqKh\":\"移除\",\"2wxgft\":\"重命名\",\"A1taO8\":\"搜索\",\"EFKJQT\":\"设置\",\"ML96zX\":\"全部随机播放\",\"5lWFkC\":\"登录\",\"fcWrnU\":\"注销\",\"Cj2Gtd\":\"大小\",\"dGrFyD\":\"切换主题\",\"DLu3TH\":\"播放列表将会被删除\",\"lRkLr5\":\"使用专辑封面主题色\"}"); \ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx index 84e4bcd..2263d39 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -4,6 +4,10 @@ import { PublicClientApplication } from '@azure/msal-browser' import { MsalProvider } from '@azure/msal-react' import { msalConfig } from './graph/authConfig' import { RouterProvider } from 'react-router-dom' +import { i18n } from '@lingui/core' +import { I18nProvider } from '@lingui/react' +import { messages as enMessages } from './locales/en/messages' +import { messages as zhCNMessages } from './locales/zh-CN/messages' import './index.css' import '@fontsource/roboto/300.css' import '@fontsource/roboto/400.css' @@ -11,14 +15,22 @@ import '@fontsource/roboto/500.css' import '@fontsource/roboto/700.css' import 'react-virtualized/styles.css' import router from './router' -import './i18n' const msalInstance = new PublicClientApplication(msalConfig) +i18n.load({ + 'en': enMessages, + 'zh-CN': zhCNMessages, +}) + +i18n.activate(navigator.language) + ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - - - + + + + + ) diff --git a/src/pages/Files/Files.tsx b/src/pages/Files/Files.tsx index 8a6421f..85629e1 100644 --- a/src/pages/Files/Files.tsx +++ b/src/pages/Files/Files.tsx @@ -13,7 +13,7 @@ import { Divider, IconButton, InputBase } from '@mui/material' import SearchRoundedIcon from '@mui/icons-material/SearchRounded' import CloseRoundedIcon from '@mui/icons-material/CloseRounded' import { useEffect, useRef, useState } from 'react' -import { useTranslation } from 'react-i18next' +import { t } from '@lingui/macro' const Files = () => { @@ -39,8 +39,6 @@ const Files = () => { const { getFilesData } = useFilesData() - const { t } = useTranslation() - const [searchIsShow, setSearchIsShow] = useState(false) const [searchValue, setSearchValue] = useState('') @@ -160,8 +158,8 @@ const Files = () => { setSearchValue(e.target.value)} sx={{ marginX: '0.5rem' }} @@ -173,7 +171,7 @@ const Files = () => { + aria-label={searchIsShow ? `${t`Close`} ${t`Search`}` : t`Search`}> {searchIsShow ? : } diff --git a/src/pages/Files/FilterMenu.tsx b/src/pages/Files/FilterMenu.tsx index 3b60d97..610ed9f 100644 --- a/src/pages/Files/FilterMenu.tsx +++ b/src/pages/Files/FilterMenu.tsx @@ -2,7 +2,7 @@ import useUiStore from '@/store/useUiStore' import FilterListRoundedIcon from '@mui/icons-material/FilterListRounded' import { Checkbox, Divider, FormControlLabel, FormGroup, IconButton, Menu, Radio, RadioGroup } from '@mui/material' import React from 'react' -import { useTranslation } from 'react-i18next' +import { t } from '@lingui/macro' const FilterMenu = () => { const [anchorEl, setAnchorEl] = React.useState(null) @@ -44,8 +44,6 @@ const FilterMenu = () => { ] ) - const { t } = useTranslation() - return (
{ name='display-radio-buttons-group' sx={{ paddingLeft: 2 }} > - } label={t('files.display.list')} onChange={() => updateDisplay('list')} /> - } label={t('files.display.multicolumnList')} onChange={() => updateDisplay('multicolumnList')} /> - } label={t('files.display.grid')} onChange={() => updateDisplay('grid')} /> + } label={t`List`} onChange={() => updateDisplay('list')} /> + } label={t`Multicolumn list`} onChange={() => updateDisplay('multicolumnList')} /> + } label={t`Grid`} onChange={() => updateDisplay('grid')} /> @@ -88,9 +86,9 @@ const FilterMenu = () => { name="sort-radio-buttons-group" sx={{ paddingLeft: 2 }} > - } label={t('files.sortBy.name')} onChange={() => updateSortBy('name')} /> - } label={t('files.sortBy.size')} onChange={() => updateSortBy('size')} /> - } label={t('files.sortBy.lastModified')} onChange={() => updateSortBy('datetime')} /> + } label={t`Name`} onChange={() => updateSortBy('name')} /> + } label={t`Size`} onChange={() => updateSortBy('size')} /> + } label={t`Last modified`} onChange={() => updateSortBy('datetime')} /> @@ -101,8 +99,8 @@ const FilterMenu = () => { name="order-radio-buttons-group" sx={{ paddingLeft: 2 }} > - } label={t('files.orderBy.asc')} onChange={() => updateOrderBy('asc')} /> - } label={t('files.orderBy.desc')} onChange={() => updateOrderBy('desc')} /> + } label={t`Ascending`} onChange={() => updateOrderBy('asc')} /> + } label={t`Descending`} onChange={() => updateOrderBy('desc')} /> @@ -110,11 +108,11 @@ const FilterMenu = () => { - } label={t('files.foldersFirst')} onChange={() => updateFoldersFirst(!foldersFirst)} /> - } label={t('files.mediaOnly')} onChange={() => updateMediaOnly(!mediaOnly)} /> + } label={t`Folders first`} onChange={() => updateFoldersFirst(!foldersFirst)} /> + } label={t`Media only`} onChange={() => updateMediaOnly(!mediaOnly)} /> { display === 'grid' && - } label={t('files.hdThumbnails')} onChange={() => updateHDThumbnails(!hdThumbnails)} /> + } label={t`HD thumbnails`} onChange={() => updateHDThumbnails(!hdThumbnails)} /> } diff --git a/src/pages/LogIn.tsx b/src/pages/LogIn.tsx index e367146..8c9ac37 100644 --- a/src/pages/LogIn.tsx +++ b/src/pages/LogIn.tsx @@ -1,10 +1,9 @@ import { Button, Container, IconButton, Link, Typography } from '@mui/material' import GitHubIcon from '@mui/icons-material/GitHub' -import { useTranslation } from 'react-i18next' +import { t } from '@lingui/macro' import useUser from '../hooks/graph/useUser' const LogIn = () => { - const { t } = useTranslation() const { login } = useUser() return ( @@ -23,9 +22,9 @@ const LogIn = () => {
- {t('account.signInAlert')} + {t`Please use Microsoft account authorization to log in`} - +