diff --git a/.gitignore b/.gitignore index 911e1eef..7e051b25 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,6 @@ npm-debug.log* yarn-debug.log* yarn-error.log* -dist/ \ No newline at end of file +dist/ + +.idea \ No newline at end of file diff --git a/package.json b/package.json index 9064a24a..d5c93944 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "html-webpack-plugin": "4.0.0-beta.5", "http-proxy-middleware": "^0.20.0", "husky": "^4.2.5", + "i18next": "^21.2.4", "identity-obj-proxy": "3.0.0", "invariant": "^2.2.4", "is-wsl": "^1.1.0", @@ -74,6 +75,7 @@ "react-dom": "^16.12.0", "react-dplayer": "^0.4.1", "react-hotkeys": "^2.0.0", + "react-i18next": "^11.12.0", "react-lazy-load-image-component": "^1.3.2", "react-load-script": "^0.0.6", "react-monaco-editor": "^0.36.0", diff --git a/src/App.js b/src/App.js index 3e10f681..d835a93e 100644 --- a/src/App.js +++ b/src/App.js @@ -1,4 +1,4 @@ -import React, { Suspense } from "react"; +import React, { Suspense, useEffect } from "react"; import AuthRoute from "./middleware/AuthRoute"; import Navbar from "./component/Navbar/Navbar.js"; import useMediaQuery from "@material-ui/core/useMediaQuery"; @@ -30,6 +30,7 @@ import ResetForm from "./component/Login/ResetForm"; import Reset from "./component/Login/Reset"; import PageLoading from "./component/Placeholder/PageLoading"; import CodeViewer from "./component/Viewer/Code"; +import { useTranslation } from "react-i18next"; const PDFViewer = React.lazy(() => import(/* webpackChunkName: "pdf" */ "./component/Viewer/PDF") ); @@ -38,6 +39,7 @@ export default function App() { const themeConfig = useSelector((state) => state.siteConfig.theme); const isLogin = useSelector((state) => state.viewUpdate.isLogin); const prefersDarkMode = useMediaQuery("(prefers-color-scheme: dark)"); + const { t } = useTranslation(); const theme = React.useMemo(() => { themeConfig.palette.type = prefersDarkMode ? "dark" : "light"; @@ -82,133 +84,133 @@ export default function App() { const { path } = useRouteMatch(); return ( - - -
- - - -
-
- - - - - - - - - - - - - - - - - - - - - - - }> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }> - - - - - - - - - - - - -
-
-
-
+ + +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + }> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + }> + + + + + + + + + + + + +
+
+
+
); } diff --git a/src/actions/explorer.js b/src/actions/explorer.js index 32cd3fb3..3b6b88df 100644 --- a/src/actions/explorer.js +++ b/src/actions/explorer.js @@ -1,3 +1,4 @@ +import i18next from 'i18next'; import { isMac } from "../utils"; import pathHelper from "../utils/page"; import Auth from "../middleware/Auth"; @@ -59,7 +60,7 @@ export const openPreview = () => { if (isShare) { const user = Auth.GetUser(); if (!Auth.Check() && user && !user.group.shareDownload) { - dispatch(toggleSnackbar("top", "right", "请先登录", "warning")); + dispatch(toggleSnackbar("top", "right", i18next.t('please log in first'), "warning")); dispatch(changeContextMenu("file", false)); return; } @@ -188,7 +189,7 @@ export const openPreview = () => { ); return; default: - dispatch(openLoadingDialog("获取下载地址...")); + dispatch(openLoadingDialog(i18next.t('Get download address...'))); return; } }; diff --git a/src/component/Admin/Common/DomainInput.js b/src/component/Admin/Common/DomainInput.js index dc8e2ff0..b739b3d1 100644 --- a/src/component/Admin/Common/DomainInput.js +++ b/src/component/Admin/Common/DomainInput.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useEffect, useState } from "react"; import FormControl from "@material-ui/core/FormControl"; import InputLabel from "@material-ui/core/InputLabel"; @@ -11,6 +12,7 @@ export default function DomainInput({ onChange, value, required, label }) { const [domain, setDomain] = useState(""); const [protocol, setProtocol] = useState("https://"); const [error, setError] = useState(); + const { t } = useTranslation(); useState(() => { value = value ? value : ""; @@ -28,7 +30,7 @@ export default function DomainInput({ onChange, value, required, label }) { useEffect(() => { if (protocol === "http://" && window.location.protocol === "https:") { setError( - "您当前站点启用了 HTTPS ,此处选择 HTTP 可能会导致无法连接。" + t('HTTPS is enabled on your current site. Selecting HTTP here may cause connection failure.') ); } else { setError(""); diff --git a/src/component/Admin/Common/SizeInput.js b/src/component/Admin/Common/SizeInput.js index 89a54c74..9c2ce71e 100644 --- a/src/component/Admin/Common/SizeInput.js +++ b/src/component/Admin/Common/SizeInput.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import FormControl from "@material-ui/core/FormControl"; import Input from "@material-ui/core/Input"; import InputAdornment from "@material-ui/core/InputAdornment"; @@ -42,6 +43,7 @@ export default function SizeInput({ dispatch(toggleSnackbar(vertical, horizontal, msg, color)), [dispatch] ); + const { t } = useTranslation(); const [unit, setUnit] = useState(1); let first = true; @@ -56,73 +58,73 @@ export default function SizeInput({ }, [value]); return ( - - {label} - { - if (e.target.value * unit < max) { - onChange({ - target: { - value: (e.target.value * unit).toString(), - }, - }); - } else { - ToggleSnackbar( - "top", - "right", - "超出最大尺寸限制", - "warning" - ); - } - }} - required={required} - endAdornment={ - - - - } - /> - + + {label} + { + if (e.target.value * unit < max) { + onChange({ + target: { + value: (e.target.value * unit).toString(), + }, + }); + } else { + ToggleSnackbar( + "top", + "right", + t('Exceeding the maximum size limit'), + "warning" + ); + } + }} + required={required} + endAdornment={ + + + + } + /> + ); } diff --git a/src/component/Admin/Dashboard.js b/src/component/Admin/Dashboard.js index 484be530..744ccaed 100644 --- a/src/component/Admin/Dashboard.js +++ b/src/component/Admin/Dashboard.js @@ -1,3 +1,5 @@ +import { useTranslation } from "react-i18next"; +import i18next from "i18next"; import { withStyles } from "@material-ui/core"; import AppBar from "@material-ui/core/AppBar"; import Divider from "@material-ui/core/Divider"; @@ -177,92 +179,92 @@ const useStyles = makeStyles((theme) => ({ const items = [ { - title: "面板首页", + title: i18next.t('Home'), icon: , path: "home", }, { - title: "参数设置", + title: i18next.t('Parameter settings'), icon: , sub: [ { - title: "站点信息", + title: i18next.t('Site Information'), path: "basic", icon: , }, { - title: "注册与登录", + title: i18next.t('Registration and Login'), path: "access", icon: , }, { - title: "邮件", + title: i18next.t('Mail'), path: "mail", icon: , }, { - title: "上传与下载", + title: i18next.t('Upload and download'), path: "upload", icon: , }, { - title: "外观", + title: i18next.t('Themeing'), path: "theme", icon: , }, { - title: "离线下载", + title: i18next.t('Offline download'), path: "aria2", icon: , }, { - title: "图像处理", + title: i18next.t('Image Processing'), path: "image", icon: , }, { - title: "验证码", + title: i18next.t('Verification Code'), path: "captcha", icon: , }, ], }, { - title: "存储策略", + title: i18next.t('Storage Strategy'), icon: , path: "policy", }, { - title: "用户组", + title: i18next.t('User group'), icon: , path: "group", }, { - title: "用户", + title: i18next.t('Users'), icon: , path: "user", }, { - title: "文件", + title: i18next.t('document'), icon: , path: "file", }, { - title: "分享", + title: i18next.t('share'), icon: , path: "share", }, { - title: "持久任务", + title: i18next.t('Persistent Task'), icon: , sub: [ { - title: "离线下载", + title: i18next.t('Offline download'), path: "download", icon: , }, { - title: "常规任务", + title: i18next.t('Regular Tasks'), path: "task", icon: , }, @@ -277,6 +279,7 @@ export default function Dashboard({ content }) { const [menuOpen, setMenuOpen] = useState(null); const history = useHistory(); const location = useLocation(); + const { t } = useTranslation(); const handleDrawerOpen = () => { setOpen(true); @@ -293,7 +296,7 @@ export default function Dashboard({ content }) { ); useEffect(() => { - SetSubTitle("仪表盘"); + SetSubTitle(t('Dashboard')); }, []); useEffect(() => { @@ -305,151 +308,151 @@ export default function Dashboard({ content }) { const { path } = useRouteMatch(); return ( -
- - - - - - - Cloudreve 仪表盘 - - - - - -
- - {theme.direction === "rtl" ? ( - - ) : ( - - )} - -
- - - {items.map((item) => { - if (item.path !== undefined) { - return ( - - history.push("/admin/" + item.path) - } - button - className={clsx({ - [classes.active]: location.pathname.startsWith( - "/admin/" + item.path - ), - })} - key={item.title} - > - - {item.icon} - - - - ); - } - return ( - { - setMenuOpen(isExpanded ? item.title : null); - }} - > - - - {item.icon} - - - - - - {item.sub.map((sub) => ( - - history.push( - "/admin/" + sub.path - ) - } - className={clsx({ - [classes.sub]: open, - [classes.active]: location.pathname.startsWith( - "/admin/" + sub.path - ), - })} - button - key={sub.title} - > - - {sub.icon} - - - - ))} - - - - ); - })} - -
-
-
- {content(path)} -
-
+
+ + + + + + + {t('Cloudreve Dashboard')} + + + + + +
+ + {theme.direction === "rtl" ? ( + + ) : ( + + )} + +
+ + + {items.map((item) => { + if (item.path !== undefined) { + return ( + + history.push("/admin/" + item.path) + } + button + className={clsx({ + [classes.active]: location.pathname.startsWith( + "/admin/" + item.path + ), + })} + key={item.title} + > + + {item.icon} + + + + ); + } + return ( + { + setMenuOpen(isExpanded ? item.title : null); + }} + > + + + {item.icon} + + + + + + {item.sub.map((sub) => ( + + history.push( + "/admin/" + sub.path + ) + } + className={clsx({ + [classes.sub]: open, + [classes.active]: location.pathname.startsWith( + "/admin/" + sub.path + ), + })} + button + key={sub.title} + > + + {sub.icon} + + + + ))} + + + + ); + })} + +
+
+
+ {content(path)} +
+
); } diff --git a/src/component/Admin/Dialogs/AddGroupk.js b/src/component/Admin/Dialogs/AddGroupk.js index 5b42e99b..b511f2f5 100644 --- a/src/component/Admin/Dialogs/AddGroupk.js +++ b/src/component/Admin/Dialogs/AddGroupk.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Button from "@material-ui/core/Button"; import Dialog from "@material-ui/core/Dialog"; import DialogActions from "@material-ui/core/DialogActions"; @@ -34,6 +35,7 @@ export default function AddGroup({ open, onClose, onSubmit }) { des: "", highlight: false, }); + const { t } = useTranslation(); useEffect(() => { if (open && groups.length === 0) { @@ -73,174 +75,173 @@ export default function AddGroup({ open, onClose, onSubmit }) { }; return ( - -
- - 添加可购用户组 - - - -
- - - 名称 - - - - 商品展示名称 - - -
+ + + + {t('Add Purchasable User Group')} + + + +
+ + + {t('Name')} + + + + {t('Product display name')} + + +
-
- - - 用户组 - - - - 购买后升级的用户组 - - -
+
+ + + {t('User group')} + + + + {t('User group upgraded after purchase')} + + +
-
- - - 有效期 (天) - - - - 单位购买时间的有效期 - - -
+
+ + + {t('Validity period (days)')} + + + + {t('Valid period of unit purchase time')} + + +
-
- - - 单价 (元) - - - - 用户组的单价 - - -
+
+ + + {t('Unit price (yuan)')} + + + + {t('Unit price of user group')} + + +
-
- - - 单价 (积分) - - - - 使用积分购买时的价格,填写为 0 - 表示不能使用积分购买 - - -
+
+ + + {t('Unit price (points)')} + + + + {t('The price when using points to purchase, fill in as 0\nmeans that you cannot use points to buy')} + + +
-
- - - 商品描述 (一行一个) - - - - 购买页面展示的商品描述 - - -
+
+ + + {t('Product description (one per line)')} + + + + {t('Product description displayed on the purchase page')} + + +
-
- - - } - label="突出展示" - /> - - 开启后,在商品选择页面会被突出展示 - - -
-
-
- - - - - -
+
+ + + } + label={t('Highlights')} + /> + + {t('When enabled, it will be highlighted on the product selection page')} + + +
+
+
+ + + + + +
); } diff --git a/src/component/Admin/Dialogs/AddPack.js b/src/component/Admin/Dialogs/AddPack.js index 2e606039..3e6ed493 100644 --- a/src/component/Admin/Dialogs/AddPack.js +++ b/src/component/Admin/Dialogs/AddPack.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useState } from "react"; import DialogTitle from "@material-ui/core/DialogTitle"; import DialogContent from "@material-ui/core/DialogContent"; @@ -27,6 +28,7 @@ export default function AddPack({ open, onClose, onSubmit }) { price: "", score: "", }); + const { t } = useTranslation(); const handleChange = (name) => (event) => { setPack({ @@ -47,123 +49,122 @@ export default function AddPack({ open, onClose, onSubmit }) { }; return ( - -
- 添加容量包 - - -
- - - 名称 - - - - 商品展示名称 - - -
+ + + {t('Add Capacity Pack')} + + +
+ + + {t('Name')} + + + + {t('Product display name')} + + +
-
- - - - 容量包的大小 - - -
+
+ + + + {t('The size of the capacity package')} + + +
-
- - - 有效期 (天) - - - - 每个容量包的有效期 - - -
+
+ + + {t('Validity period (days)')} + + + + {t('The validity period of each capacity package')} + + +
-
- - - 单价 (元) - - - - 容量包的单价 - - -
+
+ + + {t('Unit price (yuan)')} + + + + {t('Unit price of capacity package')} + + +
-
- - - 单价 (积分) - - - - 使用积分购买时的价格,填写为 0 - 表示不能使用积分购买 - - -
-
-
- - - - - -
+
+ + + {t('Unit price (points)')} + + + + {t('The price when using points to purchase, fill in as 0\nmeans that you cannot use points to buy')} + + +
+
+
+ + + + + +
); } diff --git a/src/component/Admin/Dialogs/AddPolicy.js b/src/component/Admin/Dialogs/AddPolicy.js index 1d40e26c..939929e9 100644 --- a/src/component/Admin/Dialogs/AddPolicy.js +++ b/src/component/Admin/Dialogs/AddPolicy.js @@ -1,3 +1,5 @@ +import { useTranslation } from "react-i18next"; +import i18next from "i18next"; import Button from "@material-ui/core/Button"; import Card from "@material-ui/core/Card"; import CardActionArea from "@material-ui/core/CardActionArea"; @@ -36,32 +38,32 @@ const useStyles = makeStyles((theme) => ({ const policies = [ { - name: "本机存储", + name: i18next.t('Local Storage'), img: "local.png", path: "/admin/policy/add/local", }, { - name: "从机存储", + name: i18next.t('Slave Storage'), img: "remote.png", path: "/admin/policy/add/remote", }, { - name: "七牛", + name: i18next.t('Qiniu'), img: "qiniu.png", path: "/admin/policy/add/qiniu", }, { - name: "阿里云 OSS", + name: i18next.t('Alibaba Cloud OSS'), img: "oss.png", path: "/admin/policy/add/oss", }, { - name: "又拍云", + name: i18next.t('UpYun'), img: "upyun.png", path: "/admin/policy/add/upyun", }, { - name: "腾讯云 COS", + name: i18next.t('Tencent Cloud COS'), img: "cos.png", path: "/admin/policy/add/cos", }, @@ -81,62 +83,63 @@ export default function AddPolicy({ open, onClose }) { const classes = useStyles(); const location = useHistory(); + const { t } = useTranslation(); return ( - - 选择存储方式 - - - {policies.map((v) => ( - - - { - location.push(v.path); - onClose(); - }} - className={classes.cardContainer} - > - - - - {v.name} - - - - - - ))} - - - - - - - + + {t('Select storage method')} + + + {policies.map((v) => ( + + + { + location.push(v.path); + onClose(); + }} + className={classes.cardContainer} + > + + + + {v.name} + + + + + + ))} + + + + + + + ); } diff --git a/src/component/Admin/Dialogs/AddRedeem.js b/src/component/Admin/Dialogs/AddRedeem.js index 4ae350bb..742e07e7 100644 --- a/src/component/Admin/Dialogs/AddRedeem.js +++ b/src/component/Admin/Dialogs/AddRedeem.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Button from "@material-ui/core/Button"; import Dialog from "@material-ui/core/Dialog"; import DialogActions from "@material-ui/core/DialogActions"; @@ -38,6 +39,8 @@ export default function AddRedeem({ open, onClose, products, onSuccess }) { [dispatch] ); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setInput({ ...input, @@ -77,99 +80,99 @@ export default function AddRedeem({ open, onClose, products, onSuccess }) { }; return ( - -
- 生成兑换码 - - -
- - - 生成数量 - - - - 激活码批量生成数量 - - -
+ + + {t('Generate redemption code')} + + +
+ + + {t('Generate quantity')} + + + + {t('The number of activation codes generated in batches')} + + +
-
- - - 对应商品 - - - -
+
+ + + {t('Corresponding product')} + + + +
-
- - - 商品数量 - - - - 对于积分类商品,此处为积分数量,其他商品为时长倍数 - - -
-
-
- - - - - -
+
+ + + {t('amount of goods')} + + + + {t('For point products, here is the number of points, and other products are multiples of duration')} + + +
+
+
+ + + + + +
); } diff --git a/src/component/Admin/Dialogs/Alert.js b/src/component/Admin/Dialogs/Alert.js index b838835f..553bbaaa 100644 --- a/src/component/Admin/Dialogs/Alert.js +++ b/src/component/Admin/Dialogs/Alert.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React from "react"; import DialogTitle from "@material-ui/core/DialogTitle"; import DialogContent from "@material-ui/core/DialogContent"; @@ -8,24 +9,26 @@ import Button from "@material-ui/core/Button"; import Dialog from "@material-ui/core/Dialog"; export default function AlertDialog({ title, msg, open, onClose }) { + const { t } = useTranslation(); + return ( - - {title} - - - {msg} - - - - - - + + {title} + + + {msg} + + + + + + ); } diff --git a/src/component/Admin/Dialogs/CreateTheme.js b/src/component/Admin/Dialogs/CreateTheme.js index 7e93ecf9..d71d6c05 100644 --- a/src/component/Admin/Dialogs/CreateTheme.js +++ b/src/component/Admin/Dialogs/CreateTheme.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import AppBar from "@material-ui/core/AppBar"; import Button from "@material-ui/core/Button"; import Dialog from "@material-ui/core/Dialog"; @@ -55,294 +56,296 @@ export default function CreateTheme({ open, onClose, onSubmit }) { return createMuiTheme(theme); }, [theme]); + const { t } = useTranslation(); + return ( - - - - - - - 主色调 - - { - setTheme({ - ...theme, - palette: { - ...theme.palette, - primary: { - ...theme.palette.primary, - main: e.target.value, - }, - }, - }); - }} - fullWidth - /> -
- { - setTheme({ - ...theme, - palette: { - ...theme.palette, - primary: { - ...theme.palette.primary, - main: c.hex, - }, - }, - }); - }} - /> -
-
- - - 辅色调 - - { - setTheme({ - ...theme, - palette: { - ...theme.palette, - secondary: { - ...theme.palette.secondary, - main: e.target.value, - }, - }, - }); - }} - fullWidth - /> -
- { - setTheme({ - ...theme, - palette: { - ...theme.palette, - secondary: { - ...theme.palette.secondary, - main: c.hex, - }, - }, - }); - }} - /> -
-
- - - 主色调文字 - - { - setTheme({ - ...theme, - palette: { - ...theme.palette, - primary: { - ...theme.palette.primary, - contrastText: e.target.value, - }, - }, - }); - }} - fullWidth - /> -
- { - setTheme({ - ...theme, - palette: { - ...theme.palette, - primary: { - ...theme.palette.primary, - contrastText: c.hex, - }, - }, - }); - }} - /> -
-
- - - 辅色调文字 - - { - setTheme({ - ...theme, - palette: { - ...theme.palette, - secondary: { - ...theme.palette.secondary, - contrastText: e.target.value, - }, - }, - }); - }} - fullWidth - /> -
- { - setTheme({ - ...theme, - palette: { - ...theme.palette, - secondary: { - ...theme.palette.secondary, - contrastText: c.hex, - }, - }, - }); - }} - /> -
-
-
- - -
- - - - - - - Color - - - -
- -
- - - -
-
- - - - - - - - -
+ + + + + + + {t('main color tone')} + + { + setTheme({ + ...theme, + palette: { + ...theme.palette, + primary: { + ...theme.palette.primary, + main: e.target.value, + }, + }, + }); + }} + fullWidth + /> +
+ { + setTheme({ + ...theme, + palette: { + ...theme.palette, + primary: { + ...theme.palette.primary, + main: c.hex, + }, + }, + }); + }} + /> +
+
+ + + {t('Subtone')} + + { + setTheme({ + ...theme, + palette: { + ...theme.palette, + secondary: { + ...theme.palette.secondary, + main: e.target.value, + }, + }, + }); + }} + fullWidth + /> +
+ { + setTheme({ + ...theme, + palette: { + ...theme.palette, + secondary: { + ...theme.palette.secondary, + main: c.hex, + }, + }, + }); + }} + /> +
+
+ + + {t('Main tone text')} + + { + setTheme({ + ...theme, + palette: { + ...theme.palette, + primary: { + ...theme.palette.primary, + contrastText: e.target.value, + }, + }, + }); + }} + fullWidth + /> +
+ { + setTheme({ + ...theme, + palette: { + ...theme.palette, + primary: { + ...theme.palette.primary, + contrastText: c.hex, + }, + }, + }); + }} + /> +
+
+ + + {t('Subtone text')} + + { + setTheme({ + ...theme, + palette: { + ...theme.palette, + secondary: { + ...theme.palette.secondary, + contrastText: e.target.value, + }, + }, + }); + }} + fullWidth + /> +
+ { + setTheme({ + ...theme, + palette: { + ...theme.palette, + secondary: { + ...theme.palette.secondary, + contrastText: c.hex, + }, + }, + }); + }} + /> +
+
+
+ + +
+ + + + + + + Color + + + +
+ +
+ + + +
+
+ + + + + + + + +
); } diff --git a/src/component/Admin/Dialogs/FileFilter.js b/src/component/Admin/Dialogs/FileFilter.js index ffca7930..d1c05373 100644 --- a/src/component/Admin/Dialogs/FileFilter.js +++ b/src/component/Admin/Dialogs/FileFilter.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Button from "@material-ui/core/Button"; import Dialog from "@material-ui/core/Dialog"; import DialogActions from "@material-ui/core/DialogActions"; @@ -28,6 +29,8 @@ export default function FileFilter({ setFilter, setSearch, open, onClose }) { [dispatch] ); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setInput({ ...input, [name]: event.target.value }); }; @@ -66,64 +69,64 @@ export default function FileFilter({ setFilter, setSearch, open, onClose }) { }; return ( - - 过滤条件 - - - - 存储策略 - - - - - - - - setKeywords(e.target.value)} - id="standard-basic" - label="搜索 文件名" - /> - - - - - - - + + {t('Filter Conditions')} + + + + {t('Storage Strategy')} + + + + + + + + setKeywords(e.target.value)} + id="standard-basic" + label={t('Search file name')} + /> + + + + + + + ); } diff --git a/src/component/Admin/Dialogs/MagicVar.js b/src/component/Admin/Dialogs/MagicVar.js index a2b4a83b..931e8489 100644 --- a/src/component/Admin/Dialogs/MagicVar.js +++ b/src/component/Admin/Dialogs/MagicVar.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Button from "@material-ui/core/Button"; import Dialog from "@material-ui/core/Dialog"; import DialogActions from "@material-ui/core/DialogActions"; @@ -12,147 +13,149 @@ import TableRow from "@material-ui/core/TableRow"; import React from "react"; export default function MagicVar({ isFile, open, onClose, isSlave }) { + const { t } = useTranslation(); + return ( - - - {isFile ? "文件名魔法变量" : "路径魔法变量"} - - - - - - - 魔法变量 - 描述 - 示例 - - - - - - {"{randomkey16}"} - - 16位随机字符 - N6IimT5XZP324ACK - - - - {"{randomkey8}"} - - 8位随机字符 - gWz78q30 - - - - {"{timestamp}"} - - 秒级时间戳 - 1582692933 - - - - {"{timestamp_nano}"} - - 纳秒级时间戳 - 1582692933231834600 - - {!isSlave && ( - - - {"{uid}"} - - 用户ID - 1 - - )} - {isFile && ( - - - {"{originname}"} - - 原始文件名 - MyPico.mp4 - - )} - {!isFile && !isSlave && ( - - - {"{path}"} - - 用户上传路径 - /我的文件/学习资料/ - - )} - - - {"{date}"} - - 日期 - 20060102 - - - - {"{datetime}"} - - 日期时间 - 20060102150405 - - - - {"{year}"} - - 年份 - 2006 - - - - {"{month}"} - - 月份 - 01 - - - - {"{day}"} - - - 02 - - - - {"{hour}"} - - 小时 - 15 - - - - {"{minute}"} - - 分钟 - 04 - - - - {"{second}"} - - - 05 - - -
-
-
- - - -
+ + + {isFile ? t('File name magic variable') : t('Path Magic Variables')} + + + + + + + {t('Magic Variables')} + {t('describe')} + {t('Example')} + + + + + + {"{randomkey16}"} + + {t('16 random characters')} + N6IimT5XZP324ACK + + + + {"{randomkey8}"} + + {t('8 random characters')} + gWz78q30 + + + + {"{timestamp}"} + + {t('Second timestamp')} + 1582692933 + + + + {"{timestamp_nano}"} + + {t('Nanosecond Timestamp')} + 1582692933231834600 + + {!isSlave && ( + + + {"{uid}"} + + {t('User ID')} + 1 + + )} + {isFile && ( + + + {"{originname}"} + + {t('Original file name')} + MyPico.mp4 + + )} + {!isFile && !isSlave && ( + + + {"{path}"} + + {t('User upload path')} + {t('/My Files/Learning Materials/')} + + )} + + + {"{date}"} + + {t('date')} + 20060102 + + + + {"{datetime}"} + + {t('Date Time')} + 20060102150405 + + + + {"{year}"} + + {t('years')} + 2006 + + + + {"{month}"} + + {t('month')} + 01 + + + + {"{day}"} + + {t('day')} + 02 + + + + {"{hour}"} + + {t('Hour')} + 15 + + + + {"{minute}"} + + {t('minute')} + 04 + + + + {"{second}"} + + {t('Second')} + 05 + + +
+
+
+ + + +
); } diff --git a/src/component/Admin/Dialogs/ShareFilter.js b/src/component/Admin/Dialogs/ShareFilter.js index ef9dc38a..71d0e575 100644 --- a/src/component/Admin/Dialogs/ShareFilter.js +++ b/src/component/Admin/Dialogs/ShareFilter.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Button from "@material-ui/core/Button"; import Dialog from "@material-ui/core/Dialog"; import DialogActions from "@material-ui/core/DialogActions"; @@ -16,6 +17,7 @@ export default function ShareFilter({ setFilter, setSearch, open, onClose }) { user_id: "", }); const [keywords, setKeywords] = useState(""); + const { t } = useTranslation(); const handleChange = (name) => (event) => { setInput({ ...input, [name]: event.target.value }); @@ -40,56 +42,56 @@ export default function ShareFilter({ setFilter, setSearch, open, onClose }) { }; return ( - - 过滤条件 - - - - 源文件类型 - - - - - - - - setKeywords(e.target.value)} - id="standard-basic" - label="搜索 文件名" - /> - - - - - - - + + {t('Filter Conditions')} + + + + {t('Source File Type')} + + + + + + + + setKeywords(e.target.value)} + id="standard-basic" + label={t('Search file name')} + /> + + + + + + + ); } diff --git a/src/component/Admin/Dialogs/UserFilter.js b/src/component/Admin/Dialogs/UserFilter.js index 79e5baca..dbace5eb 100644 --- a/src/component/Admin/Dialogs/UserFilter.js +++ b/src/component/Admin/Dialogs/UserFilter.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Button from "@material-ui/core/Button"; import Dialog from "@material-ui/core/Dialog"; import DialogActions from "@material-ui/core/DialogActions"; @@ -28,6 +29,8 @@ export default function UserFilter({ setFilter, setSearch, open, onClose }) { [dispatch] ); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setInput({ ...input, [name]: event.target.value }); }; @@ -62,73 +65,73 @@ export default function UserFilter({ setFilter, setSearch, open, onClose }) { }; return ( - - 过滤条件 - - - - 用户组 - - - - - - 用户状态 - - - - - setKeywords(e.target.value)} - id="standard-basic" - label="搜索 昵称 / 用户名" - /> - - - - - - - + + {t('Filter Conditions')} + + + + {t('User group')} + + + + + + {t('user status')} + + + + + setKeywords(e.target.value)} + id="standard-basic" + label={t('Search for nickname / username')} + /> + + + + + + + ); } diff --git a/src/component/Admin/File/File.js b/src/component/Admin/File/File.js index dbb5581d..13e6b9f4 100644 --- a/src/component/Admin/File/File.js +++ b/src/component/Admin/File/File.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import { lighten } from "@material-ui/core"; import Badge from "@material-ui/core/Badge"; import Button from "@material-ui/core/Button"; @@ -94,6 +95,8 @@ export default function File() { [dispatch] ); + const { t } = useTranslation(); + const loadList = () => { API.post("/admin/file/list", { page: page, @@ -125,7 +128,7 @@ export default function File() { ToggleSnackbar( "top", "right", - "删除任务将在后台执行", + t('Delete task will be executed in the background'), "success" ); }) @@ -145,7 +148,7 @@ export default function File() { ToggleSnackbar( "top", "right", - "删除任务将在后台执行", + t('Delete task will be executed in the background'), "success" ); }) @@ -189,278 +192,278 @@ export default function File() { const isSelected = (id) => selected.indexOf(id) !== -1; return ( -
- setFilterDialog(false)} - setSearch={setSearch} - setFilter={setFilter} - /> -
- -
- - setFilterDialog(true)} - > - - - - - - -
-
+
+ setFilterDialog(false)} + setSearch={setSearch} + setFilter={setFilter} + /> +
+ +
+ + setFilterDialog(true)} + > + + + + + + +
+
- - {selected.length > 0 && ( - - - 已选择 {selected.length} 个对象 - - - - - - - - - - - - - )} - - - - - - 0 && - selected.length < files.length - } - checked={ - files.length > 0 && - selected.length === files.length - } - onChange={handleSelectAllClick} - inputProps={{ - "aria-label": "select all desserts", - }} - /> - - - - setOrderBy([ - "id", - orderBy[1] === "asc" - ? "desc" - : "asc", - ]) - } - > - # - {orderBy[0] === "id" ? ( - - {orderBy[1] === "desc" - ? "sorted descending" - : "sorted ascending"} - - ) : null} - - - - - setOrderBy([ - "name", - orderBy[1] === "asc" - ? "desc" - : "asc", - ]) - } - > - 文件名 - {orderBy[0] === "name" ? ( - - {orderBy[1] === "desc" - ? "sorted descending" - : "sorted ascending"} - - ) : null} - - - - - setOrderBy([ - "size", - orderBy[1] === "asc" - ? "desc" - : "asc", - ]) - } - > - 大小 - {orderBy[0] === "size" ? ( - - {orderBy[1] === "desc" - ? "sorted descending" - : "sorted ascending"} - - ) : null} - - - - 上传者 - - - 上传于 - - - 操作 - - - - - {files.map((row) => ( - - - - handleClick(event, row.ID) - } - checked={isSelected(row.ID)} - /> - - {row.ID} - - + {selected.length > 0 && ( + + + {t('selected')} {selected.length} {t('Objects')} + + + + + + + + + + + + + )} + +
+ + + + 0 && + selected.length < files.length + } + checked={ + files.length > 0 && + selected.length === files.length + } + onChange={handleSelectAllClick} + inputProps={{ + "aria-label": "select all desserts", + }} + /> + + + + setOrderBy([ + "id", + orderBy[1] === "asc" + ? "desc" + : "asc", + ]) + } + > + # + {orderBy[0] === "id" ? ( + + {orderBy[1] === "desc" + ? "sorted descending" + : "sorted ascending"} + + ) : null} + + + + + setOrderBy([ + "name", + orderBy[1] === "asc" + ? "desc" + : "asc", + ]) + } + > + {t('File name')} + {orderBy[0] === "name" ? ( + - {row.Name} - - - - {sizeToString(row.Size)} - - - + ) : null} + + + + + setOrderBy([ + "size", + orderBy[1] === "asc" + ? "desc" + : "asc", + ]) + } + > + {t('Size')} + {orderBy[0] === "size" ? ( + - {users[row.UserID] - ? users[row.UserID].Nick - : "未知"} - - - - {formatLocalTime( - row.CreatedAt, - "YYYY-MM-DD H:mm:ss" - )} - - - - - deletePolicy(row.ID) - } - size={"small"} - > - - - - - - ))} - -
-
- setPage(p + 1)} - onChangeRowsPerPage={(e) => { - setPageSize(e.target.value); - setPage(1); - }} - /> -
-
+ {orderBy[1] === "desc" + ? "sorted descending" + : "sorted ascending"} + + ) : null} + + + + {t('Uploaded by')} + + + {t('Uploaded to')} + + + {t('Action')} + + + + + {files.map((row) => ( + + + + handleClick(event, row.ID) + } + checked={isSelected(row.ID)} + /> + + {row.ID} + + + {row.Name} + + + + {sizeToString(row.Size)} + + + + {users[row.UserID] + ? users[row.UserID].Nick + : t('unknown')} + + + + {formatLocalTime( + row.CreatedAt, + "YYYY-MM-DD H:mm:ss" + )} + + + + + deletePolicy(row.ID) + } + size={"small"} + > + + + + + + ))} + + + + setPage(p + 1)} + onChangeRowsPerPage={(e) => { + setPageSize(e.target.value); + setPage(1); + }} + /> + +
); } diff --git a/src/component/Admin/File/Import.js b/src/component/Admin/File/Import.js index 6c434629..897959d8 100644 --- a/src/component/Admin/File/Import.js +++ b/src/component/Admin/File/Import.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import { Dialog } from "@material-ui/core"; import Button from "@material-ui/core/Button"; import Chip from "@material-ui/core/Chip"; @@ -80,6 +81,8 @@ export default function Import() { const [selectRemote, setSelectRemote] = useState(false); const [selectLocal, setSelectLocal] = useState(false); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setOptions({ ...options, @@ -105,7 +108,7 @@ export default function Import() { const submit = (e) => { e.preventDefault(); if (user === null) { - ToggleSnackbar("top", "right", "请先选择目标用户", "warning"); + ToggleSnackbar("top", "right", t('Please select first Select the target user'), "warning"); return; } setLoading(true); @@ -122,7 +125,7 @@ export default function Import() { ToggleSnackbar( "top", "right", - "导入任务已创建,您可以在“持久任务”中查看执行情况", + t('The import task has been created, you can check the execution in the "persistent task"'), "success" ); }) @@ -200,7 +203,7 @@ export default function Import() { ToggleSnackbar( "top", "right", - "选择的存储策略只支持手动输入路径", + t('The selected storage strategy only supports manual input of the path'), "warning" ); return; @@ -208,7 +211,7 @@ export default function Import() { setSelectRemote(true); } else { if (user === null) { - ToggleSnackbar("top", "right", "请先选择目标用户", "warning"); + ToggleSnackbar("top", "right", t('Please select first Select the target user'), "warning"); return; } setSelectLocal(true); @@ -216,256 +219,256 @@ export default function Import() { }; return ( -
- setSelectRemote(false)} - aria-labelledby="form-dialog-title" - > - 选择目录 - - setOptions({ - ...options, - src: p, - }) - )} - /> +
+ setSelectRemote(false)} + aria-labelledby="form-dialog-title" + > + {t('Select Directory')} + + setOptions({ + ...options, + src: p, + }) + )} + /> - - - - - setSelectLocal(false)} - aria-labelledby="form-dialog-title" - > - 选择目录 - - setOptions({ - ...options, - dst: p, - }) - )} - /> + + + + + setSelectLocal(false)} + aria-labelledby="form-dialog-title" + > + {t('Select Directory')} + + setOptions({ + ...options, + dst: p, + }) + )} + /> - - - - -
-
- - 导入外部目录 - -
-
- - 您可以将存储策略中已有文件、目录结构导入到 - Cloudreve - 中,导入操作不会额外占用物理存储空间,但仍会正常扣除用户已用容量空间,空间不足时将停止导入。 - -
-
- - - 存储策略 - - - - 选择要导入文件目前存储所在的存储策略 - - -
-
- - - 目标用户 - - { - handleChange("userInput")(e); - setAnchorEl(e.currentTarget); - }} - startAdornment={ - user !== null && ( - - { - setUser(null); - }} - label={user.Nick} - /> - - ) - } - disabled={user !== null} - /> - 0 - } - anchorEl={anchorEl} - placement={"bottom"} - transition - > - {({ TransitionProps }) => ( - - - {users.map((u) => ( - - selectUser(u) - } - > - {u.Nick}{" "} - {"<" + u.Email + ">"} - - ))} - - - )} - - - 选择要将文件导入到哪个用户的文件系统中,可通过昵称、邮箱搜索用户 - - -
+ + + +
+ +
+ + {t('Import external directory')} + +
+
+ + {t( + 'You can import the existing files and directory structure in the storage policy into\nCloudreve\n. The import operation will not take up additional physical storage space, but the user\'s used capacity will still be deducted normally, and it will stop when the space is insufficient Import.' + )} + +
+
+ + + {t('Storage Strategy')} + + + + {t('Select the storage strategy where the imported file is currently stored')} + + +
+
+ + + {t('Target users')} + + { + handleChange("userInput")(e); + setAnchorEl(e.currentTarget); + }} + startAdornment={ + user !== null && ( + + { + setUser(null); + }} + label={user.Nick} + /> + + ) + } + disabled={user !== null} + /> + 0 + } + anchorEl={anchorEl} + placement={"bottom"} + transition + > + {({ TransitionProps }) => ( + + + {users.map((u) => ( + + selectUser(u) + } + > + {u.Nick}{" "} + {"<" + u.Email + ">"} + + ))} + + + )} + + + {t('Choose which user\'s file system to import the file into, you can search for the user by nickname and mailbox')} + + +
-
- - - 原始目录路径 - +
+ + + {t('Original Directory Path')} + - { - handleChange("src")(e); - setAnchorEl(e.currentTarget); - }} - required - endAdornment={ - - } - /> + { + handleChange("src")(e); + setAnchorEl(e.currentTarget); + }} + required + endAdornment={ + + } + /> - - 要导入的目录在存储端的路径 - - -
+ + {t('The path of the directory to be imported on the storage side')} + +
+
-
- - - 目的目录路径 - +
+ + + {t('Destination Directory Path')} + - { - handleChange("dst")(e); - setAnchorEl(e.currentTarget); - }} - required - endAdornment={ - - } - /> + { + handleChange("dst")(e); + setAnchorEl(e.currentTarget); + }} + required + endAdornment={ + + } + /> - - 要将目录导入到用户文件系统中的路径 - - -
+ + {t('The path to import the directory to the user\'s file system')} + +
+
-
- - - } - label="递归导入子目录" - /> - - 是否将目录下的所有子目录递归导入 - - -
-
-
+
+ + + } + label={t('Import subdirectories recursively')} + /> + + {t('Whether to recursively import all subdirectories under the directory')} + + +
+
+ -
- -
- - +
+ +
+ + ); } diff --git a/src/component/Admin/Group/EditGroup.js b/src/component/Admin/Group/EditGroup.js index a1001999..4dde3f71 100644 --- a/src/component/Admin/Group/EditGroup.js +++ b/src/component/Admin/Group/EditGroup.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback, useEffect, useState } from "react"; import { useParams } from "react-router"; import API from "../../../middleware/Api"; @@ -17,6 +18,8 @@ export default function EditGroupPreload() { [dispatch] ); + const { t } = useTranslation(); + useEffect(() => { setGroup({}); API.get("/admin/group/" + id) @@ -67,7 +70,7 @@ export default function EditGroupPreload() { ToggleSnackbar( "top", "right", - "Aria2 设置项格式错误", + t('Aria2 setting item format error'), "warning" ); return; diff --git a/src/component/Admin/Group/Group.js b/src/component/Admin/Group/Group.js index 66f1ffa5..d4db0d2d 100644 --- a/src/component/Admin/Group/Group.js +++ b/src/component/Admin/Group/Group.js @@ -1,3 +1,5 @@ +import { useTranslation } from "react-i18next"; +import i18next from "i18next"; import Button from "@material-ui/core/Button"; import IconButton from "@material-ui/core/IconButton"; import Paper from "@material-ui/core/Paper"; @@ -43,23 +45,23 @@ const useStyles = makeStyles((theme) => ({ const columns = [ { id: "#", label: "#", minWidth: 50 }, - { id: "name", label: "名称", minWidth: 170 }, - { id: "type", label: "存储策略", minWidth: 170 }, + { id: "name", label: i18next.t('Name'), minWidth: 170 }, + { id: "type", label: i18next.t('Storage Strategy'), minWidth: 170 }, { id: "count", - label: "下属用户数", + label: i18next.t('Number of Subordinate Users'), minWidth: 50, align: "right", }, { id: "size", - label: "最大容量", + label: i18next.t('Maximum capacity'), minWidth: 100, align: "right", }, { id: "action", - label: "操作", + label: i18next.t('Action'), minWidth: 170, align: "right", }, @@ -89,6 +91,8 @@ export default function Group() { [dispatch] ); + const { t } = useTranslation(); + const loadList = () => { API.post("/admin/group/list", { page: page, @@ -108,7 +112,7 @@ export default function Group() { useEffect(() => { if (query.get("code") === "0") { - ToggleSnackbar("top", "right", "授权成功", "success"); + ToggleSnackbar("top", "right", t('Authorization succeeded'), "success"); } else if (query.get("msg") && query.get("msg") !== "") { ToggleSnackbar( "top", @@ -127,7 +131,7 @@ export default function Group() { API.delete("/admin/group/" + id) .then(() => { loadList(); - ToggleSnackbar("top", "right", "用户组已删除", "success"); + ToggleSnackbar("top", "right", t('User group has been deleted'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -135,114 +139,114 @@ export default function Group() { }; return ( -
-
- -
- -
-
+
+
+ +
+ +
+
- - - - - - {columns.map((column) => ( - - {column.label} - - ))} - - - - {groups.map((row) => ( - - {row.ID} - {row.Name} - - {row.PolicyList !== null && - row.PolicyList.map((pid, key) => { - let res = ""; - if (policies[pid]) { - res += policies[pid].Name; - } - if ( - key !== - row.PolicyList.length - 1 - ) { - res += " / "; - } - return res; - })} - - - {statics[row.ID] !== undefined && - statics[row.ID].toLocaleString()} - - - {statics[row.ID] !== undefined && - sizeToString(row.MaxStorage)} - - - - - history.push( - "/admin/group/edit/" + - row.ID - ) - } - size={"small"} - > - - - - - - deletePolicy(row.ID) - } - size={"small"} - > - - - - - - ))} - -
-
- setPage(p + 1)} - onChangeRowsPerPage={(e) => { - setPageSize(e.target.value); - setPage(1); - }} - /> -
-
+ + + + + + {columns.map((column) => ( + + {column.label} + + ))} + + + + {groups.map((row) => ( + + {row.ID} + {row.Name} + + {row.PolicyList !== null && + row.PolicyList.map((pid, key) => { + let res = ""; + if (policies[pid]) { + res += policies[pid].Name; + } + if ( + key !== + row.PolicyList.length - 1 + ) { + res += " / "; + } + return res; + })} + + + {statics[row.ID] !== undefined && + statics[row.ID].toLocaleString()} + + + {statics[row.ID] !== undefined && + sizeToString(row.MaxStorage)} + + + + + history.push( + "/admin/group/edit/" + + row.ID + ) + } + size={"small"} + > + + + + + + deletePolicy(row.ID) + } + size={"small"} + > + + + + + + ))} + +
+
+ setPage(p + 1)} + onChangeRowsPerPage={(e) => { + setPageSize(e.target.value); + setPage(1); + }} + /> +
+
); } diff --git a/src/component/Admin/Group/GroupForm.js b/src/component/Admin/Group/GroupForm.js index 2bbd0987..1a97f4f4 100644 --- a/src/component/Admin/Group/GroupForm.js +++ b/src/component/Admin/Group/GroupForm.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Button from "@material-ui/core/Button"; import Collapse from "@material-ui/core/Collapse"; import FormControl from "@material-ui/core/FormControl"; @@ -98,6 +99,8 @@ export default function GroupForm(props) { }); }, []); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setGroup({ ...group, @@ -176,7 +179,7 @@ export default function GroupForm(props) { groupCopy.OptionsSerialized.aria2_options ); } catch (e) { - ToggleSnackbar("top", "right", "Aria2 设置项格式错误", "warning"); + ToggleSnackbar("top", "right", t('Aria2 setting item format error'), "warning"); return; } @@ -189,7 +192,7 @@ export default function GroupForm(props) { ToggleSnackbar( "top", "right", - "用户组已" + (props.group ? "保存" : "添加"), + t('User Group Already') + (props.group ? t('save') : t('Add to')), "success" ); }) @@ -202,352 +205,349 @@ export default function GroupForm(props) { }; return ( -
-
-
- - {group.ID === 0 && "新建用户组"} - {group.ID !== 0 && "编辑 " + group.Name} - +
+ +
+ + {group.ID === 0 && t('New User Group')} + {group.ID !== 0 && t('edit ') + group.Name} + -
- {group.ID !== 3 && ( - <> -
- - - 用户组名 - - - - 用户组的名称 - - -
+
+ {group.ID !== 3 && ( + <> +
+ + + {t('User group name')} + + + + {t('The name of the user group')} + + +
-
- - - 存储策略 - - - - 指定用户组的存储策略。 - - -
+
+ + + {t('Storage Strategy')} + + + + {t('Specify the storage policy of the user group.')} + + +
-
- - - - - 用户组下的用户初始可用最大容量 - -
- - )} +
+ + + + + {t('The initial available maximum capacity of users under the user group')} + +
+ + )} -
- - - - - 填写为 0 表示不限制。开启限制后, - 此用户组下的用户下载所有支持限速的存储策略下的文件时,下载最大速度会被限制。 - -
+
+ + + + + {t( + 'Fill in 0 means no limit. When the limit is turned on,\nwhen users under this user group download all files under the storage policy that supports the speed limit, the maximum download speed will be limited.' + )} + +
- {group.ID !== 3 && ( -
- - - } - label="允许创建分享" - /> - - 关闭后,用户无法创建分享链接 - - -
- )} + {group.ID !== 3 && ( +
+ + + } + label={t('Allow to create shares')} + /> + + {t('When disabled, users cannot create sharing links')} + + +
+ )} -
- - - } - label="允许下载分享" - /> - - 关闭后,用户无法下载别人创建的文件分享 - - -
+
+ + + } + label={t('Allow download and share')} + /> + + {t('When disabled, users cannot download files created by others to share')} + + +
- {group.ID !== 3 && ( -
- - - } - label="WebDAV" - /> - - 关闭后,用户无法通过 WebDAV - 协议连接至网盘 - - -
- )} + {group.ID !== 3 && ( +
+ + + } + label="WebDAV" + /> + + {t('When disabled, users cannot connect to the network disk through the WebDAV\nprotocol')} + + +
+ )} -
- - - } - label="禁止多次下载请求" - /> - - 只针对本机存储策略有效。开启后,用户无法使用多线程下载工具。 - - -
+
+ + + } + label={t('Multiple download requests are prohibited')} + /> + + {t('Only valid for the native storage strategy. When enabled, users cannot use the multi-threaded download tool.')} + + +
- {group.ID !== 3 && ( -
- - - } - label="离线下载" - /> - - 是否允许用户创建离线下载任务 - - -
- )} + {group.ID !== 3 && ( +
+ + + } + label={t('Offline download')} + /> + + {t('Whether users are allowed to create offline download tasks')} + + +
+ )} - -
- - - Aria2 任务参数 - - - - 此用户组创建离线下载任务时额外携带的参数,以 - JSON - 编码后的格式书写,您可也可以将这些设置写在 - Aria2 配置文件里,可用参数请查阅官方文档 - - -
-
+ +
+ + + {t('Aria2 Task Parameters')} + + + + {t( + 'The additional parameters that this user group carries when creating offline download tasks are written in\nJSON\nencoded format. You can also write these settings in the\nAria2 configuration file. For available parameters, please refer to the official Document' + )} + + +
+
-
- - - } - label="打包下载" - /> - - 是否允许用户多选文件打包下载 - - -
+
+ + + } + label={t('Download package')} + /> + + {t('Whether to allow users to select multiple files to package and download')} + + +
- {group.ID !== 3 && ( -
- - - } - label="压缩/解压缩 任务" - /> - - 是否用户创建 压缩/解压缩 任务 - - -
- )} + {group.ID !== 3 && ( +
+ + + } + label={t('Compress/Decompress Tasks')} + /> + + {t('Whether users create compression/decompression tasks')} + + +
+ )} - -
- - - - - 用户可创建的压缩任务的文件最大总大小,填写为 - 0 表示不限制 - -
+ +
+ + + + + {t('The maximum total file size of the compression task that can be created by the user, filled in as\n0 means unlimited')} + +
-
- - - - - 用户可创建的解压缩任务的文件最大总大小,填写为 - 0 表示不限制 - -
-
-
-
-
- -
- -
+
+ + + + + {t('The maximum total file size of the decompression task that can be created by the user, filled in as\n0 means unlimited')} + +
+ +
+
+
+ +
+ +
); } diff --git a/src/component/Admin/Index.js b/src/component/Admin/Index.js index b18f560d..17f4b22a 100644 --- a/src/component/Admin/Index.js +++ b/src/component/Admin/Index.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Avatar from "@material-ui/core/Avatar"; import Button from "@material-ui/core/Button"; import Chip from "@material-ui/core/Chip"; @@ -118,6 +119,8 @@ export default function Index() { [dispatch] ); + const { t } = useTranslation(); + const ResetSiteURL = () => { setOpen(false); API.patch("/admin/setting", { @@ -130,7 +133,7 @@ export default function Index() { }) .then(() => { setSiteURL(window.location.origin); - ToggleSnackbar("top", "right", "设置已更改", "success"); + ToggleSnackbar("top", "right", t('Settings have been changed'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -187,323 +190,324 @@ export default function Index() { }, []); return ( - - setOpen(false)} - aria-labelledby="alert-dialog-title" - aria-describedby="alert-dialog-description" - > - - {"确定站点URL设置"} - - - - - {siteURL === "" && - "您尚未设定站点URL,是否要将其设定为当前的 " + - window.location.origin + - " ?"} - {siteURL !== "" && - "您设置的站点URL与当前实际不一致,是否要将其设定为当前的 " + - window.location.origin + - " ?"} - - - 此设置非常重要,请确保其与您站点的实际地址一致。你可以在 - 参数设置 - 站点信息 中更改此设置。 - - - - - - - - - - - - 趋势 - - - - - - - - - - - - - - - - - - - 总计 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- cloudreve -
- - Cloudreve - - - {version.backend}{" "} - {version.is_pro === "true" && ( - - )} - -
-
- -
- - - window.open("https://cloudreve.org") - } - > - - - - - - - - - - window.open( - "https://github.com/cloudreve/cloudreve" - ) - } - > - - - - - - - - - - window.open("https://docs.cloudreve.org/") - } - > - - - - - - - - - - window.open("https://forum.cloudreve.org") - } - > - - - - - - - - - - window.open( - "https://t.me/cloudreve_official" - ) - } - > - - - - - - - - - - window.open( - "https://docs.cloudreve.org/use/pro/jie-shao" - ) - } - > - - - - - - - - - -
-
-
- - - - {news && - news.map((v) => ( - <> - - window.open( - "https://forum.cloudreve.org/d/" + - v.id - ) - } - > - - + setOpen(false)} + aria-labelledby="alert-dialog-title" + aria-describedby="alert-dialog-description" + > + + {t('Confirm site URL settings')} + + + + + {siteURL === "" && + t('You have not set the site URL, do you want to set it to the current ') + + window.location.origin + + " ?"} + {siteURL !== "" && + t('The site URL you set is inconsistent with the current URL. Do you want to set it to the current') + + window.location.origin + + " ?"} + + + {t( + 'This setting is very important, please make sure it is consistent with the actual address of your site. You can change this setting in\nparameter settings-site information.' + )} + + + + + + + + + + + + {t('trend')} + + + + + + + + + + + + + + + + + + + {t('total')} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ cloudreve +
+ + Cloudreve + + + {version.backend}{" "} + {version.is_pro === "true" && ( + + )} + +
+
+ +
+ + + window.open("https://cloudreve.org") + } + > + + + + + + + + + + window.open( + "https://github.com/cloudreve/cloudreve" + ) + } + > + + + + + + + + + + window.open("https://docs.cloudreve.org/") + } + > + + + + + + + + + + window.open("https://forum.cloudreve.org") + } + > + + + + + + + + + + window.open( + "https://t.me/cloudreve_official" + ) + } + > + + + + + + + + + + window.open( + "https://docs.cloudreve.org/use/pro/jie-shao" + ) + } + > + + + + + + + + + +
+
+
+ + + + {news && + news.map((v) => ( + <> + + window.open( + "https://forum.cloudreve.org/d/" + + v.id + ) + } + > + + + + + + {newsUsers[ v.relationships - .startUser.data.id + .startUser.data + .id ] && - newsUsers[ - v.relationships - .startUser.data.id - ].avatarUrl - } - /> -
- - - {newsUsers[ + newsUsers[ v.relationships - .startUser.data - .id - ] && - newsUsers[ - v.relationships - .startUser - .data.id - ].username}{" "} - - 发表于{" "} - - - } - /> -
- - - ))} -
-
-
-
+ .startUser + .data.id + ].username}{" "} + + {t('Published on')}{" "} + + + } + /> + + + + ))} + + + + ); } diff --git a/src/component/Admin/Policy/Guid/COSGuide.js b/src/component/Admin/Policy/Guid/COSGuide.js index adac62b9..58fd1d3d 100644 --- a/src/component/Admin/Policy/Guid/COSGuide.js +++ b/src/component/Admin/Policy/Guid/COSGuide.js @@ -1,3 +1,5 @@ +import { useTranslation } from "react-i18next"; +import i18next from "i18next"; import Button from "@material-ui/core/Button"; import Collapse from "@material-ui/core/Collapse"; import FormControl from "@material-ui/core/FormControl"; @@ -82,31 +84,31 @@ const useStyles = makeStyles((theme) => ({ const steps = [ { - title: "存储空间", + title: i18next.t('Storage'), optional: false, }, { - title: "上传路径", + title: i18next.t('Upload Path'), optional: false, }, { - title: "直链设置", + title: i18next.t('Straight link settings'), optional: false, }, { - title: "上传限制", + title: i18next.t('Upload limit'), optional: false, }, { - title: "跨域策略", + title: i18next.t('Cross Domain Policy'), optional: true, }, { - title: "云函数回调", + title: i18next.t('Cloud function callback'), optional: true, }, { - title: "完成", + title: i18next.t('Finish'), optional: false, }, ]; @@ -146,6 +148,8 @@ export default function COSGuide(props) { ); const [region, setRegion] = useState("ap-chengdu"); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setPolicy({ ...policy, @@ -208,7 +212,7 @@ export default function COSGuide(props) { ToggleSnackbar( "top", "right", - "存储策略已" + (props.policy ? "保存" : "添加"), + t('Storage Policy Already') + (props.policy ? t('save') : t('Add to')), "success" ); setActiveStep(4); @@ -230,7 +234,7 @@ export default function COSGuide(props) { id: policyID, }) .then(() => { - ToggleSnackbar("top", "right", "跨域策略已添加", "success"); + ToggleSnackbar("top", "right", t('Cross-domain policy has been added'), "success"); setActiveStep(5); }) .catch((error) => { @@ -248,7 +252,7 @@ export default function COSGuide(props) { region: region, }) .then(() => { - ToggleSnackbar("top", "right", "回调云函数已添加", "success"); + ToggleSnackbar("top", "right", t('Callback cloud function has been added'), "success"); setActiveStep(6); }) .catch((error) => { @@ -260,919 +264,917 @@ export default function COSGuide(props) { }; return ( -
- - {props.policy ? "修改" : "添加"} 腾讯云 COS 存储策略 - - - {steps.map((label, index) => { - const stepProps = {}; - const labelProps = {}; - if (label.optional) { - labelProps.optional = ( - 可选 - ); - } - if (isStepSkipped(index)) { - stepProps.completed = false; - } - return ( - - {label.title} - - ); - })} - +
+ + {props.policy ? t('Revise') : t('Add to')} {t('Tencent Cloud COS Storage Strategy')} + + + {steps.map((label, index) => { + const stepProps = {}; + const labelProps = {}; + if (label.optional) { + labelProps.optional = ( + ({t('Optional')}) + ); + } + if (isStepSkipped(index)) { + stepProps.completed = false; + } + return ( + + {label.title} + + ); + })} + - {activeStep === 0 && ( -
{ - e.preventDefault(); - setActiveStep(1); - }} - > -
-
-
0
-
-
- - 在使用 腾讯云 COS 储策略前,请确保您在 参数设置 - - 站点信息 - 站点URL 中填写的 - 地址与实际相符,并且 - 能够被外网正常访问。 - -
-
+ {activeStep === 0 && ( + { + e.preventDefault(); + setActiveStep(1); + }} + > +
+
+
0
+
+
+ + {t( + 'Before using the Tencent Cloud COS storage strategy, please make sure that the\naddress you fill in the parameter setting\n-site information-site URL matches the actual one, and ' + )} + {t('Able to be normally accessed by the external network')}{t('。')} + +
+
-
-
-
1
-
-
- - 前往 - - COS 管理控制台 - - 创建存储桶。 - -
-
- -
-
-
2
-
-
- - 转到所创建存储桶的基础配置页面,将 - 空间名称填写在下方: - -
- - - 空间名称 - - - -
-
-
+
+
+
1
+
+
+ + {t('Go to')} + + {t('COS Management Console')} + + {t('Create bucket.')} + +
+
-
-
-
3
-
-
- - 在下方选择您创建的空间的访问权限类型,推荐选择 - 私有读写 - 以获得更高的安全性,私有空间无法开启“获取直链”功能。 - -
- - - - } - label="私有读写" - /> - - } - label="公共读私有写" - /> - - -
-
-
+
+
+
2
+
+
+ + {t('Go to the basic configuration page of the created bucket, change ')} + {t('Space name')}{t('Fill in below:')} + +
+ + + {t('Space name')} + + + +
+
+
-
-
-
4
-
-
- - 转到所创建 Bucket 的基础配置,填写 - 基本信息栏目下 给出的{" "} - 访问域名 - -
- -
-
-
+
+
+
3
+
+
+ + {t('Select the type of access permission for the space you created below, it is recommended to choose')} + {t('Private Read and Write')} + {t('In order to obtain higher security, the private space cannot open the "Get Direct Link" function.')} + +
+ + + + } + label={t('Private Read and Write')} + /> + + } + label={t('Public Read Private Write')} + /> + + +
+
+
-
-
-
5
-
-
- - 是否要使用配套的 腾讯云CDN 加速 COS 访问? - -
- - { - setUseCDN(e.target.value); - }} - row - > - - } - label="使用" - /> - - } - label="不使用" - /> - - -
-
-
+
+
+
4
+
+
+ + {t('Go to the basic configuration of the created Bucket and fill in ')} + {t('Basic Information')}{t('Given under the column')}{" "} + {t('Access Domain')} + +
+ +
+
+
- -
-
-
6
-
-
- - 前往 - - 腾讯云 CDN 管理控制台 - - 创建 CDN 加速域名,并设定源站为刚创建的 COS - 存储桶。在下方填写 CDN - 加速域名,并选择是否使用 HTTPS: - -
- -
-
-
-
+
+
+
5
+
+
+ + {t('Do you want to use the supporting Tencent Cloud CDN to accelerate COS access?')} + +
+ + { + setUseCDN(e.target.value); + }} + row + > + + } + label={t('use')} + /> + + } + label={t('Do not use')} + /> + + +
+
+
-
-
-
- {getNumber(6, [useCDN === "true"])} -
-
-
- - 在腾讯云 + +
+
+
6
+
+
+ + {t('Go to')} - 访问密钥 + {t('Tencent Cloud CDN Management Console')} - 页面获取 - 一对访问密钥,并填写在下方。请确保这对密钥拥有 - COS 和 SCF 服务的访问权限。 - -
- - - SecretId - - - -
-
- - - SecretKey - - - -
-
-
+ {t( + 'Create a CDN accelerated domain name, and set the source site to the newly created COS\nbucket. Fill in the CDN\naccelerated domain name below, and choose whether to use HTTPS:' + )} +
+
+ +
+
+
+ -
-
-
- {getNumber(7, [useCDN === "true"])} -
-
-
- - 为此存储策略命名: - -
- - - 存储策略名 - - - -
-
-
+
+
+
+ {getNumber(6, [useCDN === "true"])} +
+
+
+ + {t('In Tencent Cloud')} + + {t('Access Key')} + + {t( + 'The page gets a pair of\naccess keys and fills them in below. Please make sure that this pair of keys has access rights to\nCOS and SCF services.' + )} + +
+ + + SecretId + + + +
+
+ + + SecretKey + + + +
+
+
-
- -
-
- )} +
+
+
+ {getNumber(7, [useCDN === "true"])} +
+
+
+ + {t('Name this storage policy:')} + +
+ + + {t('Storage Policy Name')} + + + +
+
+
- {activeStep === 1 && ( -
{ - e.preventDefault(); - setActiveStep(2); - }} - > -
-
-
1
-
-
- - 请在下方输入文件的存储目录路径,可以为绝对路径或相对路径(相对于 - 从机的 - Cloudreve)。路径中可以使用魔法变量,文件在上传时会自动替换这些变量为相应值; - 可用魔法变量可参考{" "} - { - e.preventDefault(); - setMagicVar("path"); - }} - > - 路径魔法变量列表 - {" "} - 。 - -
- - - 存储目录 - - - -
-
-
+
+ +
+
+ )} -
-
-
2
-
-
- - 是否需要对存储的物理文件进行重命名?此处的重命名不会影响最终呈现给用户的 - 文件名。文件名也可使用魔法变量, - 可用魔法变量可参考{" "} - { - e.preventDefault(); - setMagicVar("file"); - }} - > - 文件名魔法变量列表 - {" "} - 。 - -
- - - - } - label="开启重命名" - /> - - } - label="不开启" - /> - - -
+ {activeStep === 1 && ( +
{ + e.preventDefault(); + setActiveStep(2); + }} + > +
+
+
1
+
+
+ + {t( + 'Please keep at least one color scheme' + )}{" "} + { + e.preventDefault(); + setMagicVar("path"); + }} + > + {t('Path Magic Variable List')} + {" "} + {t('。')} + +
+ + + {t('Storage Directory')} + + + +
+
+
- -
- - - 命名规则 - - - -
-
-
-
+
+
+
2
+
+
+ + {t( + 'Does the stored physical file need to be renamed? The renaming here will not affect the\nfile name that is finally presented to the user. The file name can also use magic variables,\ncan refer to the available magic variables' + )}{" "} + { + e.preventDefault(); + setMagicVar("file"); + }} + > + {t('File name magic variable list')} + {" "} + {t('。')} + +
+ + + + } + label={t('Turn on rename')} + /> + + } + label={t('Do not open')} + /> + + +
-
- - -
- - )} + +
+ + + {t('Naming Rules')} + + + +
+
+
+
- {activeStep === 2 && ( -
{ - e.preventDefault(); - setActiveStep(3); - }} - > -
-
-
1
-
-
- - 是否允许获取文件永久直链? -
- 开启后,用户可以请求获得能直接访问到文件内容的直链,适用于图床应用或自用。 -
+
+ + +
+ + )} -
- - { - if ( - policy.IsPrivate === "true" && - e.target.value === "true" - ) { - ToggleSnackbar( - "top", - "right", - "私有空间无法开启此功能", - "warning" - ); - return; - } - handleChange("IsOriginLinkEnable")( - e - ); - }} - row - > - - } - label="允许" - /> - - } - label="禁止" - /> - - -
-
-
+ {activeStep === 2 && ( +
{ + e.preventDefault(); + setActiveStep(3); + }} + > +
+
+
1
+
+
+ + {t('Are you allowed to obtain permanent direct links to files?')} +
+ {t('When enabled, the user can request a direct link that can directly access the content of the file, suitable for image bed applications or personal use.')} +
-
- {" "} - -
- - )} +
+ + { + if ( + policy.IsPrivate === "true" && + e.target.value === "true" + ) { + ToggleSnackbar( + "top", + "right", + t('Private space cannot open this function'), + "warning" + ); + return; + } + handleChange("IsOriginLinkEnable")( + e + ); + }} + row + > + + } + label={t('allow')} + /> + + } + label={t('prohibit')} + /> + + +
+
+
- {activeStep === 3 && ( -
-
-
-
1
-
-
- - 是否限制上传的单文件大小? - +
+ {" "} + +
+ + )} -
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - MaxSize: "10485760", - }); - } else { - setPolicy({ - ...policy, - MaxSize: "0", - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
+ {activeStep === 3 && ( +
+
+
+
1
+
+
+ + {t('Do you want to limit the size of the uploaded single file?')} + - -
-
-
2
-
-
- - 输入限制: - -
- -
-
-
-
+
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + MaxSize: "10485760", + }); + } else { + setPolicy({ + ...policy, + MaxSize: "0", + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
-
-
-
- {policy.MaxSize !== "0" ? "3" : "2"} -
-
-
- - 是否限制上传文件扩展名? - + +
+
+
2
+
+
+ + {t('Input limit:')} + +
+ +
+
+
+
-
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - file_type: - "jpg,png,mp4,zip,rar", - }, - }); - } else { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - file_type: "", - }, - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
+
+
+
+ {policy.MaxSize !== "0" ? "3" : "2"} +
+
+
+ + {t('Do you want to restrict uploading file extensions?')} + - -
-
-
- {policy.MaxSize !== "0" ? "4" : "3"} -
-
-
- - 输入允许上传的文件扩展名,多个请以半角逗号 , - 隔开 - -
- - - 扩展名列表 - - - -
-
-
-
+
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + file_type: + "jpg,png,mp4,zip,rar", + }, + }); + } else { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + file_type: "", + }, + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
-
- {" "} - -
-
- )} + +
+
+
+ {policy.MaxSize !== "0" ? "4" : "3"} +
+
+
+ + {t('Enter the file extensions allowed to upload, please use a comma for more than one file,\nseparated')} + +
+ + + {t('List of extensions')} + + + +
+
+
+
- {activeStep === 4 && ( -
-
-
-
- - COS 存储桶 需要正确配置跨域策略后才能使用 Web - 端上传文件,Cloudreve - 可以帮您自动设置,您也可以参考文档步骤手动设置。如果您已设置过此 - Bucket 的跨域策略,此步骤可以跳过。 - -
- -
-
-
-
- {" "} -
- - )} +
+ {" "} + +
+ + )} - {activeStep === 5 && ( -
-
-
-
- - COS 存储桶 客户端直传需要借助腾讯云的 - - 云函数 - - 产品以确保上传回调可控。如果您打算将此存储策略自用,或者分配给可信赖用户组,此步骤可以跳过。 - 如果是作为公有使用,请务必创建回调云函数。 -
-
-
- - Cloudreve 可以尝试帮你自动创建回调云函数,请选择 - COS 存储桶 所在地域后继续。 - 创建可能会花费数秒钟,请耐心等待。创建前请确保您的腾讯云账号已开启云函数服务。 - + {activeStep === 4 && ( + +
+
+
+ + {t( + 'The COS bucket needs to be correctly configured with the cross-domain policy before you can use the Web\nside to upload files. Cloudreve\ncan automatically set it for you, or you can set it manually by referring to the document steps. If you have already set this\nBucket Cross-domain policy, this step can be skipped.' + )} + +
+ +
+
+
+
+ {" "} +
+ + )} -
- - - 存储桶所在地区 - - - -
+ {activeStep === 5 && ( +
+
+
+
+ + {t('The direct transmission of the COS bucket client requires the help of Tencent Cloud')} + + {t('Cloud Function')} + + {t( + 'Products to ensure that upload callbacks are controllable. If you plan to use this storage policy for your own use, or assign it to a trusted user group, you can skip this step.\nIf it is for public use, please be sure to create a callback cloud function.' + )} +
+
+
+ + {t( + 'Cloudreve can try to automatically create a callback cloud function for you. Please select the location of\nCOS bucket and continue.\nCreation may take a few seconds, please be patient. Please make sure your Tencent Cloud account is enabled before creating Cloud function service.' + )} + -
- -
-
-
-
- {" "} -
- - )} +
+ + + {t('The region where the bucket is located')} + + + +
+ +
+ +
+
+
+
+ {" "} +
+ + )} - {activeStep === 6 && ( - <> -
- - 存储策略已{props.policy ? "保存" : "添加"}! - - - 要使用此存储策略,请到用户组管理页面,为相应用户组绑定此存储策略。 - -
-
- -
- - )} + {activeStep === 6 && ( + <> +
+ + {t('Storage Policy Already')}{props.policy ? t('save') : t('Add to')}{t('!')} + + + {t('To use this storage policy, please go to the user group management page and bind this storage policy to the corresponding user group.')} + +
+
+ +
+ + )} - setMagicVar("")} - /> - setMagicVar("")} - /> -
+ setMagicVar("")} + /> + setMagicVar("")} + /> +
); } diff --git a/src/component/Admin/Policy/Guid/EditPro.js b/src/component/Admin/Policy/Guid/EditPro.js index 13b914aa..d1ba0dd6 100644 --- a/src/component/Admin/Policy/Guid/EditPro.js +++ b/src/component/Admin/Policy/Guid/EditPro.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Button from "@material-ui/core/Button"; import FormControl from "@material-ui/core/FormControl"; import FormControlLabel from "@material-ui/core/FormControlLabel"; @@ -20,6 +21,8 @@ export default function EditPro(props) { const [, setLoading] = useState(false); const [policy, setPolicy] = useState(props.policy); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setPolicy({ ...policy, @@ -74,7 +77,7 @@ export default function EditPro(props) { ToggleSnackbar( "top", "right", - "存储策略已" + (props.policy ? "保存" : "添加"), + t('Storage Policy Already') + (props.policy ? t('save') : t('Add to')), "success" ); }) @@ -89,460 +92,460 @@ export default function EditPro(props) { }; return ( -
- 编辑存储策略 - -
- - - - 设置项 - - 描述 - - - - - - ID - - {policy.ID} - 存储策略编号 - - - - 类型 - - {policy.Type} - 存储策略类型 - - - - 名称 - - - - - - - 存储策名称 - - - - Server - - - - - - - 存储端 Endpoint - - - - BucketName - - - - - - - 存储桶标识 - - - - 私有空间 - - - - - - } - label="是" - /> - - } - label="否" - /> - - - - 是否为私有空间 - - - - 文件资源根URL - - - - - - - - 预览/获取文件外链时生成URL的前缀 - - - - - AccessKey - - - - - - - AccessKey / 刷新Token - - - - SecretKey - - - - - - - SecretKey - - - - 最大单文件尺寸 (Bytes) - - - - - - - - 最大可上传的文件尺寸,填写为0表示不限制 - - - - - 自动重命名 - - - - - - } - label="是" - /> - - } - label="否" - /> - - - - - 是否根据规则对上传物理文件重命名 - - - - - 存储路径 - - - - - - - 文件物理存储路径 - - - - 存储文件名 - - - - - - - 文件物理存储文件名 - - - - 允许获取外链 - - - - - - } - label="是" - /> - - } - label="否" - /> - - - - - 是否允许获取外链。注意,某些存储策略类型不支持,即使在此开启,获取的外链也无法使用。 - - - - - 又拍云防盗链 Token - - - - - - - 仅对又拍云存储策略有效 - - - - 允许文件扩展名 - - - - - - - 留空表示不限制 - - - - 允许的 MimeType - - - - - - - 仅对七牛存储策略有效 - - - - OneDrive 重定向地址 - - - - - - - 一般添加后无需修改 - - - - OneDrive 反代服务器地址 - - - - - - - - 仅对 OneDrive 存储策略有效 - - - - - OneDrive/SharePoint 驱动器资源标识 - - - - - - - - 仅对 OneDrive - 存储策略有效,留空则使用用户的默认 OneDrive - 驱动器 - - - - - Amazon S3 Region - - - - - - - - 仅对 Amazon S3 存储策略有效 - - - - - 内网 EndPoint - - - - - - - 仅对 OSS 存储策略有效 - - -
- -
-
-
+
+ {t('Edit Storage Policy')} + +
+ + + + {t('Settings')} + {t('value')} + {t('describe')} + + + + + + ID + + {policy.ID} + {t('Storage Policy Number')} + + + + {t('Type')} + + {policy.Type} + {t('Storage Strategy Type')} + + + + {t('Name')} + + + + + + + {t('Storage Policy Name')} + + + + Server + + + + + + + {t('Storage Endpoint')} + + + + BucketName + + + + + + + {t('Bucket ID')} + + + + {t('Private Space')} + + + + + + } + label={t('Yes')} + /> + + } + label={t('no')} + /> + + + + {t('Whether it is a private space')} + + + + {t('File resource root URL')} + + + + + + + + {t('The prefix of the URL generated when previewing/fetching the external link of the file')} + + + + + AccessKey + + + + + + + {t('AccessKey / Refresh Token')} + + + + SecretKey + + + + + + + SecretKey + + + + {t('Maximum single file size (Bytes)')} + + + + + + + + {t('The maximum file size that can be uploaded, fill in 0 means no limit')} + + + + + {t('Automatically rename')} + + + + + + } + label={t('Yes')} + /> + + } + label={t('no')} + /> + + + + + {t('Whether to rename the uploaded physical file according to the rules')} + + + + + {t('Storage path')} + + + + + + + {t('File physical storage path')} + + + + {t('Storage file name')} + + + + + + + {t('File physical storage file name')} + + + + {t('Allow access to external links')} + + + + + + } + label={t('Yes')} + /> + + } + label={t('no')} + /> + + + + + {t('Whether it is allowed to obtain external links. Note that some storage policy types are not supported. Even if it is turned on here, the obtained external links cannot be used.')} + + + + + {t('Again to take the cloud anti-leech Token')} + + + + + + + {t('Only valid for another cloud storage strategy')} + + + + {t('Allow file extensions')} + + + + + + + {t('Leave blank means unlimited')} + + + + {t('Allowed MimeType')} + + + + + + + {t('Only valid for Qiniu storage strategy')} + + + + {t('OneDrive redirect address')} + + + + + + + {t('No need to modify after generally added')} + + + + {t('OneDrive anti-generation server address')} + + + + + + + + {t('Only valid for OneDrive storage policies')} + + + + + {t('OneDrive/SharePoint Drive Resource Identification')} + + + + + + + + {t( + 'Only valid for OneDrive\nstorage policy, leave it blank to use the user\'s default OneDrive\ndrive' + )} + + + + + Amazon S3 Region + + + + + + + + {t('Only valid for Amazon S3 storage policies')} + + + + + {t('Intranet EndPoint')} + + + + + + + {t('Only valid for OSS storage policies')} + + +
+ +
+
+
); } diff --git a/src/component/Admin/Policy/Guid/LocalGuide.js b/src/component/Admin/Policy/Guid/LocalGuide.js index 8d541fa8..3145adc3 100644 --- a/src/component/Admin/Policy/Guid/LocalGuide.js +++ b/src/component/Admin/Policy/Guid/LocalGuide.js @@ -1,3 +1,5 @@ +import { useTranslation } from "react-i18next"; +import i18next from "i18next"; import Button from "@material-ui/core/Button"; import Collapse from "@material-ui/core/Collapse"; import FormControl from "@material-ui/core/FormControl"; @@ -67,19 +69,19 @@ const useStyles = makeStyles((theme) => ({ const steps = [ { - title: "上传路径", + title: i18next.t('Upload Path'), optional: false, }, { - title: "直链设置", + title: i18next.t('Straight link settings'), optional: false, }, { - title: "上传限制", + title: i18next.t('Upload limit'), optional: false, }, { - title: "完成", + title: i18next.t('Finish'), optional: false, }, ]; @@ -112,6 +114,8 @@ export default function LocalGuide(props) { } ); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setPolicy({ ...policy, @@ -194,7 +198,7 @@ export default function LocalGuide(props) { ToggleSnackbar( "top", "right", - "存储策略已" + (props.policy ? "保存" : "添加"), + t('Storage Policy Already') + (props.policy ? t('save') : t('Add to')), "success" ); setActiveStep(4); @@ -210,567 +214,567 @@ export default function LocalGuide(props) { }; return ( -
- - {props.policy ? "修改" : "添加"}本机存储策略 - - - {steps.map((label, index) => { - const stepProps = {}; - const labelProps = {}; - if (label.optional) { - labelProps.optional = ( - 可选 - ); - } - if (isStepSkipped(index)) { - stepProps.completed = false; - } - return ( - - {label.title} - - ); - })} - - {activeStep === 0 && ( -
-
-
-
1
-
-
- - 请在下方输入文件的存储目录路径,可以为绝对路径或相对路径(相对于 - Cloudreve)。路径中可以使用魔法变量,文件在上传时会自动替换这些变量为相应值; - 可用魔法变量可参考{" "} - { - e.preventDefault(); - setMagicVar("path"); - }} - > - 路径魔法变量列表 - {" "} - 。 - -
- - - 存储目录 - - - -
-
-
- -
-
-
2
-
-
- - 是否需要对存储的物理文件进行重命名?此处的重命名不会影响最终呈现给用户的 - 文件名。文件名也可使用魔法变量, - 可用魔法变量可参考{" "} - { - e.preventDefault(); - setMagicVar("file"); - }} - > - 文件名魔法变量列表 - {" "} - 。 - -
- - - - } - label="开启重命名" - /> - - } - label="不开启" - /> - - -
- - -
- - - 命名规则 - - - -
-
-
-
- -
- -
-
- )} - - {activeStep === 1 && ( -
{ - e.preventDefault(); - setActiveStep(2); - }} - > -
-
-
1
-
-
- - 是否允许获取文件永久直链? +
+ + {props.policy ? t('Revise') : t('Add to')}{t('Native Storage Policy')} + + + {steps.map((label, index) => { + const stepProps = {}; + const labelProps = {}; + if (label.optional) { + labelProps.optional = ( + ({t('Optional')}) + ); + } + if (isStepSkipped(index)) { + stepProps.completed = false; + } + return ( + + {label.title} + + ); + })} + + {activeStep === 0 && ( + +
+
+
1
+
+
+ + {t( + 'Please enter the storage directory path of the file below, which can be an absolute path or a relative path (relative to\nCloudreve). Magic variables can be used in the path, and these variables will be automatically replaced with corresponding values ​​when the file is uploaded;\nAvailable magic variables can refer to ' + )}{" "} + { + e.preventDefault(); + setMagicVar("path"); + }} + > + {t('Path Magic Variable List')} + {" "} + {t('。')} + +
+ + + {t('Storage Directory')} + + + +
+
+
+ +
+
+
2
+
+
+ + {t( + 'Does the stored physical file need to be renamed? The renaming here will not affect the\nfile name that is finally presented to the user. The file name can also use magic variables,\ncan refer to the available magic variables' + )}{" "} + { + e.preventDefault(); + setMagicVar("file"); + }} + > + {t('File name magic variable list')} + {" "} + {t('。')} + +
+ + + + } + label={t('Turn on rename')} + /> + + } + label={t('Do not open')} + /> + + +
+ + +
+ + + {t('Naming Rules')} + + + +
+
+
+
+ +
+ +
+ + )} + + {activeStep === 1 && ( +
{ + e.preventDefault(); + setActiveStep(2); + }} + > +
+
+
1
+
+
+ + {t('Are you allowed to obtain permanent direct links to files?')} +
+ {t('When enabled, the user can request a direct link that can directly access the content of the file, suitable for image bed applications or personal use.')} +
+ +
+ + + + } + label={t('allow')} + /> + + } + label={t('prohibit')} + /> + + +
+
+
+ + +
+
+
2
+
+
+ + {t('Do you want to use CDN for downloads/direct links?')}
- 开启后,用户可以请求获得能直接访问到文件内容的直链,适用于图床应用或自用。 -
- -
- - - - } - label="允许" - /> - - } - label="禁止" - /> - - -
-
-
- - -
-
-
2
-
-
- - 是否要对下载/直链使用 CDN? -
- 开启后,用户访问文件时的 URL - 中的域名部分会被替换为 CDN 域名。 -
- -
- - { - if ( - e.target.value === "false" - ) { - setPolicy({ - ...policy, - BaseURL: "", - }); - } - setUseCDN(e.target.value); - }} - row - > - - } - label="使用" - /> - - } - label="不使用" - /> - - -
-
-
- - -
-
-
3
-
-
- - 选择协议并填写 CDN 域名 - - -
- -
-
-
-
-
- -
- {" "} - -
- - )} - - {activeStep === 2 && ( -
{ - e.preventDefault(); - setActiveStep(3); - }} - > -
-
-
1
-
-
- - 是否限制上传的单文件大小? - - -
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - MaxSize: "10485760", - }); - } else { - setPolicy({ - ...policy, - MaxSize: "0", - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
- - -
-
-
2
-
-
- - 输入限制: - -
- -
-
-
-
- -
-
-
- {policy.MaxSize !== "0" ? "3" : "2"} -
-
-
- - 是否限制上传文件扩展名? - - -
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - file_type: - "jpg,png,mp4,zip,rar", - }, - }); - } else { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - file_type: "", - }, - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
- - -
-
-
- {policy.MaxSize !== "0" ? "4" : "3"} -
-
-
- - 输入允许上传的文件扩展名,多个请以半角逗号 , - 隔开 - -
- - - 扩展名列表 - - - -
-
-
-
- -
- {" "} - -
-
- )} - - {activeStep === 3 && ( -
-
-
-
- - 最后一步,为此存储策略命名: - -
- - - 存储策略名 - - - -
-
-
-
- {" "} - -
-
- )} - - {activeStep === 4 && ( - <> -
- - 存储策略已{props.policy ? "保存" : "添加"}! - - - 要使用此存储策略,请到用户组管理页面,为相应用户组绑定此存储策略。 - -
-
- -
- - )} - - setMagicVar("")} - /> - setMagicVar("")} - /> -
+ {t( + 'When enabled, the domain name part of the URL\nwhen the user accesses the file will be replaced with the CDN domain name.' + )} +
+ +
+ + { + if ( + e.target.value === "false" + ) { + setPolicy({ + ...policy, + BaseURL: "", + }); + } + setUseCDN(e.target.value); + }} + row + > + + } + label={t('use')} + /> + + } + label={t('Do not use')} + /> + + +
+
+
+ + +
+
+
3
+
+
+ + {t('Select the protocol and fill in the CDN domain name')} + + +
+ +
+
+
+
+ + +
+ {" "} + +
+ + )} + + {activeStep === 2 && ( +
{ + e.preventDefault(); + setActiveStep(3); + }} + > +
+
+
1
+
+
+ + {t('Do you want to limit the size of the uploaded single file?')} + + +
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + MaxSize: "10485760", + }); + } else { + setPolicy({ + ...policy, + MaxSize: "0", + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
+ + +
+
+
2
+
+
+ + {t('Input limit:')} + +
+ +
+
+
+
+ +
+
+
+ {policy.MaxSize !== "0" ? "3" : "2"} +
+
+
+ + {t('Do you want to restrict uploading file extensions?')} + + +
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + file_type: + "jpg,png,mp4,zip,rar", + }, + }); + } else { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + file_type: "", + }, + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
+ + +
+
+
+ {policy.MaxSize !== "0" ? "4" : "3"} +
+
+
+ + {t('Enter the file extensions allowed to upload, please use a comma for more than one file,\nseparated')} + +
+ + + {t('List of extensions')} + + + +
+
+
+
+ +
+ {" "} + +
+
+ )} + + {activeStep === 3 && ( +
+
+
+
+ + {t('The last step, name this storage policy: ')} + +
+ + + {t('Storage Policy Name')} + + + +
+
+
+
+ {" "} + +
+
+ )} + + {activeStep === 4 && ( + <> +
+ + {t('Storage Policy Already')}{props.policy ? t('save') : t('Add to')}{t('!')} + + + {t('To use this storage policy, please go to the user group management page and bind this storage policy to the corresponding user group.')} + +
+
+ +
+ + )} + + setMagicVar("")} + /> + setMagicVar("")} + /> +
); } diff --git a/src/component/Admin/Policy/Guid/OSSGuide.js b/src/component/Admin/Policy/Guid/OSSGuide.js index c07ffd65..476e85ca 100644 --- a/src/component/Admin/Policy/Guid/OSSGuide.js +++ b/src/component/Admin/Policy/Guid/OSSGuide.js @@ -1,3 +1,5 @@ +import { useTranslation } from "react-i18next"; +import i18next from "i18next"; import Button from "@material-ui/core/Button"; import Collapse from "@material-ui/core/Collapse"; import FormControl from "@material-ui/core/FormControl"; @@ -80,27 +82,27 @@ const useStyles = makeStyles((theme) => ({ const steps = [ { - title: "存储空间", + title: i18next.t('Storage'), optional: false, }, { - title: "上传路径", + title: i18next.t('Upload Path'), optional: false, }, { - title: "直链设置", + title: i18next.t('Straight link settings'), optional: false, }, { - title: "上传限制", + title: i18next.t('Upload limit'), optional: false, }, { - title: "跨域策略", + title: i18next.t('Cross Domain Policy'), optional: true, }, { - title: "完成", + title: i18next.t('Finish'), optional: false, }, ]; @@ -145,6 +147,8 @@ export default function OSSGuide(props) { props.policy ? props.policy.ID : 0 ); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setPolicy({ ...policy, @@ -211,7 +215,7 @@ export default function OSSGuide(props) { ToggleSnackbar( "top", "right", - "存储策略已" + (props.policy ? "保存" : "添加"), + t('Storage Policy Already') + (props.policy ? t('save') : t('Add to')), "success" ); setActiveStep(4); @@ -233,7 +237,7 @@ export default function OSSGuide(props) { id: policyID, }) .then(() => { - ToggleSnackbar("top", "right", "跨域策略已添加", "success"); + ToggleSnackbar("top", "right", t('Cross-domain policy has been added'), "success"); setActiveStep(5); }) .catch((error) => { @@ -245,884 +249,878 @@ export default function OSSGuide(props) { }; return ( -
- - {props.policy ? "修改" : "添加"} 阿里云 OSS 存储策略 - - - {steps.map((label, index) => { - const stepProps = {}; - const labelProps = {}; - if (label.optional) { - labelProps.optional = ( - 可选 - ); - } - if (isStepSkipped(index)) { - stepProps.completed = false; - } - return ( - - {label.title} - - ); - })} - +
+ + {props.policy ? t('Revise') : t('Add to')} {t('Alibaba Cloud OSS Storage Strategy')} + + + {steps.map((label, index) => { + const stepProps = {}; + const labelProps = {}; + if (label.optional) { + labelProps.optional = ( + ({t('Optional')}) + ); + } + if (isStepSkipped(index)) { + stepProps.completed = false; + } + return ( + + {label.title} + + ); + })} + - {activeStep === 0 && ( -
{ - e.preventDefault(); - setActiveStep(1); - }} - > -
-
-
0
-
-
- - 在使用 阿里云 OSS 储策略前,请确保您在 参数设置 - - 站点信息 - 站点URL 中填写的 - 地址与实际相符,并且 - 能够被外网正常访问。 - -
-
+ {activeStep === 0 && ( + { + e.preventDefault(); + setActiveStep(1); + }} + > +
+
+
0
+
+
+ + {t( + 'Before using the Alibaba Cloud OSS storage strategy, please make sure that the\naddress you fill in the parameter setting\n-site information-site URL matches the actual one, and ' + )} + {t('Able to be normally accessed by the external network')}{t('。')} + +
+
-
-
-
1
-
-
- - 前往 - - OSS 管理控制台 - - 创建 Bucket。注意:创建空间类型只能选择 - 标准存储低频访问 - ,暂不支持归档存储 - -
-
- -
-
-
2
-
-
- - 在下方填写您创建 Bucket 时指定的 - Bucket 名称: - -
- - - Bucket 名称 - - - -
-
-
+
+
+
1
+
+
+ + {t('Go to')} + + {t('OSS Management Console')} + + {t('Create Bucket. Note: You can only select the type of space to create')} + {t('Standard Storage')}{t('或')}{t('Low Frequency Access')} + {t(', not currently supported')}{t('Archive Storage')} + +
+
-
-
-
3
-
-
- - 在下方选择您创建的空间的读写权限类型,推荐选择“私有”以获得更高的安全性,私有空间无法开启“获取直链”功能。 - -
- - - - } - label="私有" - /> - - } - label="公共读" - /> - - -
-
-
+
+
+
2
+
+
+ + {t('Fill in the \\\\ specified when you created the Bucket below')} + {t('Bucket name')}{t(':')} + +
+ + + {t('Bucket name')} + + + +
+
+
-
-
-
4
-
-
- - 转到所创建 Bucket 的概览页面,填写 - 访问域名栏目下 - 外网访问 一行中间的{" "} - EndPoint(地域节点) - -
- - - EndPoint - - [\\w\\-]*)(?:\\.))?(?[\\w\\-]*))\\.(?[\\w\\-]*)", - title: - "格式不合法,只需输入域名部分即可", - }} - /> - -
-
-
+
+
+
3
+
+
+ + {t('Select the type of read and write permissions for the space you created below. It is recommended to select "Private" for higher security. The private space cannot enable the "Get direct link" function.')} + +
+ + + + } + label={t('private')} + /> + + } + label={t('Public Reading')} + /> + + +
+
+
-
-
-
5
-
-
- - 如果您的 Cloudreve - 部署在阿里云计算服务中,并且与 OSS - 处在同一可用区下,您可以额外指定使用内网 - EndPoint - 以节省流量开始。是否要在服务端发送请求时使用 OSS - 内网 EndPoint? - -
- - { - setUseLanEndpoint( - e.target.value === "true" - ); - }} - row - > - - } - label="使用" - /> - - } - label="不使用" - /> - - -
- -
- - - 内网 EndPoint - - [\\w\\-]*)(?:\\.))?(?[\\w\\-]*))\\.(?[\\w\\-]*)", - title: - "格式不合法,只需输入域名部分即可", - }} - /> - -
-
-
-
+
+
+
4
+
+
+ + {t('Go to the overview page of the created Bucket and fill in ')} + {t('Access Domain')}{t('Under the column')} + {t('Extranet access')} {t('The \\\\ in the middle of a line')}{" "} + {t('EndPoint (regional node)')} + +
+ + + EndPoint + + [\\w\\-]*)(?:\\.))?(?[\\w\\-]*))\\.(?[\\w\\-]*)", + title: + t('The format is illegal, just enter the domain name part'), + }} + /> + +
+
+
-
-
-
6
-
-
- - 是否要使用配套的 阿里云CDN 加速 OSS 访问? - -
- - { - setUseCDN(e.target.value); - }} - row - > - - } - label="使用" - /> - - } - label="不使用" - /> - - -
-
-
+
+
+
5
+
+
+ + {t( + 'If your Cloudreve\nis deployed in Alibaba Cloud Computing Service and it is in the same Availability Zone as OSS\n, you can additionally specify the use of the intranet\nEndPoint\nto save data start. Do you want to Use OSS\nIntranet EndPoint when sending requests on the server side?' + )} + +
+ + { + setUseLanEndpoint( + e.target.value === "true" + ); + }} + row + > + + } + label={t('use')} + /> + + } + label={t('Do not use')} + /> + + +
+ +
+ + + {t('Intranet EndPoint')} + + [\\w\\-]*)(?:\\.))?(?[\\w\\-]*))\\.(?[\\w\\-]*)", + title: + t('The format is illegal, just enter the domain name part'), + }} + /> + +
+
+
+
- -
-
-
7
-
-
- - 前往 - - 阿里云 CDN 管理控制台 - - 创建 CDN 加速域名,并设定源站为刚创建的 OSS - Bucket。在下方填写 CDN - 加速域名,并选择是否使用 HTTPS: - -
- -
-
-
-
+
+
+
6
+
+
+ + {t('Do you want to use the supporting Alibaba Cloud CDN to accelerate OSS access?')} + +
+ + { + setUseCDN(e.target.value); + }} + row + > + + } + label={t('use')} + /> + + } + label={t('Do not use')} + /> + + +
+
+
-
-
-
- {getNumber(7, [useCDN === "true"])} -
-
-
- - 在阿里云 + +
+
+
7
+
+
+ + {t('Go to')} - 安全信息管理 + {t('Alibaba Cloud CDN Management Console')} - 页面获取 用户 AccessKey,并填写在下方。 - -
- - - AccessKey ID - - - -
-
- - - Access Key Secret - - - -
-
-
+ {t( + 'Create a CDN accelerated domain name, and set the source site as the newly created OSS\nBucket. Fill in the CDN\naccelerated domain name below, and choose whether to use HTTPS:' + )} +
+
+ +
+
+
+ -
-
-
- {getNumber(8, [useCDN === "true"])} -
-
-
- - 为此存储策略命名: - -
- - - 存储策略名 - - - -
-
-
+
+
+
+ {getNumber(7, [useCDN === "true"])} +
+
+
+ + {t('In Alibaba Cloud')} + + {t('Security Information Management')} + + {t('Get the user\'s AccessKey on the page and fill it in below')} + +
+ + + AccessKey ID + + + +
+
+ + + Access Key Secret + + + +
+
+
-
- -
-
- )} +
+
+
+ {getNumber(8, [useCDN === "true"])} +
+
+
+ + {t('Name this storage policy:')} + +
+ + + {t('Storage Policy Name')} + + + +
+
+
- {activeStep === 1 && ( -
{ - e.preventDefault(); - setActiveStep(2); - }} - > -
-
-
1
-
-
- - 请在下方输入文件的存储目录路径,可以为绝对路径或相对路径(相对于 - 从机的 - Cloudreve)。路径中可以使用魔法变量,文件在上传时会自动替换这些变量为相应值; - 可用魔法变量可参考{" "} - { - e.preventDefault(); - setMagicVar("path"); - }} - > - 路径魔法变量列表 - {" "} - 。 - -
- - - 存储目录 - - - -
-
-
+
+ +
+
+ )} -
-
-
2
-
-
- - 是否需要对存储的物理文件进行重命名?此处的重命名不会影响最终呈现给用户的 - 文件名。文件名也可使用魔法变量, - 可用魔法变量可参考{" "} - { - e.preventDefault(); - setMagicVar("file"); - }} - > - 文件名魔法变量列表 - {" "} - 。 - -
- - - - } - label="开启重命名" - /> - - } - label="不开启" - /> - - -
+ {activeStep === 1 && ( +
{ + e.preventDefault(); + setActiveStep(2); + }} + > +
+
+
1
+
+
+ + {t( + 'Please keep at least one color scheme' + )}{" "} + { + e.preventDefault(); + setMagicVar("path"); + }} + > + {t('Path Magic Variable List')} + {" "} + {t('。')} + +
+ + + {t('Storage Directory')} + + + +
+
+
- -
- - - 命名规则 - - - -
-
-
-
+
+
+
2
+
+
+ + {t( + 'Does the stored physical file need to be renamed? The renaming here will not affect the\nfile name that is finally presented to the user. The file name can also use magic variables,\ncan refer to the available magic variables' + )}{" "} + { + e.preventDefault(); + setMagicVar("file"); + }} + > + {t('File name magic variable list')} + {" "} + {t('。')} + +
+ + + + } + label={t('Turn on rename')} + /> + + } + label={t('Do not open')} + /> + + +
-
- - -
- - )} + +
+ + + {t('Naming Rules')} + + + +
+
+
+
- {activeStep === 2 && ( -
{ - e.preventDefault(); - setActiveStep(3); - }} - > -
-
-
1
-
-
- - 是否允许获取文件永久直链? -
- 开启后,用户可以请求获得能直接访问到文件内容的直链,适用于图床应用或自用。 -
+
+ + +
+ + )} -
- - { - if ( - policy.IsPrivate === "true" && - e.target.value === "true" - ) { - ToggleSnackbar( - "top", - "right", - "私有空间无法开启此功能", - "warning" - ); - return; - } - handleChange("IsOriginLinkEnable")( - e - ); - }} - row - > - - } - label="允许" - /> - - } - label="禁止" - /> - - -
-
-
+ {activeStep === 2 && ( +
{ + e.preventDefault(); + setActiveStep(3); + }} + > +
+
+
1
+
+
+ + {t('Are you allowed to obtain permanent direct links to files?')} +
+ {t('When enabled, the user can request a direct link that can directly access the content of the file, suitable for image bed applications or personal use.')} +
-
- {" "} - -
- - )} +
+ + { + if ( + policy.IsPrivate === "true" && + e.target.value === "true" + ) { + ToggleSnackbar( + "top", + "right", + t('Private space cannot open this function'), + "warning" + ); + return; + } + handleChange("IsOriginLinkEnable")( + e + ); + }} + row + > + + } + label={t('allow')} + /> + + } + label={t('prohibit')} + /> + + +
+
+
- {activeStep === 3 && ( -
-
-
-
1
-
-
- - 是否限制上传的单文件大小? - +
+ {" "} + +
+ + )} -
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - MaxSize: "10485760", - }); - } else { - setPolicy({ - ...policy, - MaxSize: "0", - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
+ {activeStep === 3 && ( +
+
+
+
1
+
+
+ + {t('Do you want to limit the size of the uploaded single file?')} + - -
-
-
2
-
-
- - 输入限制: - -
- -
-
-
-
+
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + MaxSize: "10485760", + }); + } else { + setPolicy({ + ...policy, + MaxSize: "0", + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
-
-
-
- {policy.MaxSize !== "0" ? "3" : "2"} -
-
-
- - 是否限制上传文件扩展名? - + +
+
+
2
+
+
+ + {t('Input limit:')} + +
+ +
+
+
+
-
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - file_type: - "jpg,png,mp4,zip,rar", - }, - }); - } else { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - file_type: "", - }, - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
+
+
+
+ {policy.MaxSize !== "0" ? "3" : "2"} +
+
+
+ + {t('Do you want to restrict uploading file extensions?')} + - -
-
-
- {policy.MaxSize !== "0" ? "4" : "3"} -
-
-
- - 输入允许上传的文件扩展名,多个请以半角逗号 , - 隔开 - -
- - - 扩展名列表 - - - -
-
-
-
+
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + file_type: + "jpg,png,mp4,zip,rar", + }, + }); + } else { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + file_type: "", + }, + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
-
- {" "} - -
-
- )} + +
+
+
+ {policy.MaxSize !== "0" ? "4" : "3"} +
+
+
+ + {t('Enter the file extensions allowed to upload, please use a comma for more than one file,\nseparated')} + +
+ + + {t('List of extensions')} + + + +
+
+
+
- {activeStep === 4 && ( -
-
-
-
- - OSS Bucket 需要正确配置跨域策略后才能使用 Web - 端上传文件,Cloudreve - 可以帮您自动设置,您也可以参考文档步骤手动设置。如果您已设置过此 - Bucket 的跨域策略,此步骤可以跳过。 - -
- -
-
-
-
- {" "} -
- - )} +
+ {" "} + +
+ + )} + + {activeStep === 4 && ( +
+
+
+
+ + {t( + 'OSS Bucket needs to configure the cross-domain policy correctly before uploading files on the Web\nside, Cloudreve\nIt can be set automatically for you, or you can set it manually by referring to the document steps. If you have already set a cross-domain policy for this\nBucket, you can skip this step. ' + )} + +
+ +
+
+
+
+ {" "} +
+ + )} - {activeStep === 5 && ( - <> -
- - 存储策略已{props.policy ? "保存" : "添加"}! - - - 要使用此存储策略,请到用户组管理页面,为相应用户组绑定此存储策略。 - -
-
- -
- - )} + {activeStep === 5 && ( + <> +
+ + {t('Storage Policy Already')}{props.policy ? t('save') : t('Add to')}{t('!')} + + + {t('To use this storage policy, please go to the user group management page and bind this storage policy to the corresponding user group.')} + +
+
+ +
+ + )} - setMagicVar("")} - /> - setMagicVar("")} - /> -
+ setMagicVar("")} + /> + setMagicVar("")} + /> +
); } diff --git a/src/component/Admin/Policy/Guid/OneDriveGuide.js b/src/component/Admin/Policy/Guid/OneDriveGuide.js index f259db78..d5441493 100644 --- a/src/component/Admin/Policy/Guid/OneDriveGuide.js +++ b/src/component/Admin/Policy/Guid/OneDriveGuide.js @@ -1,3 +1,5 @@ +import { useTranslation } from "react-i18next"; +import i18next from "i18next"; import Button from "@material-ui/core/Button"; import Collapse from "@material-ui/core/Collapse"; import FormControl from "@material-ui/core/FormControl"; @@ -80,27 +82,27 @@ const useStyles = makeStyles((theme) => ({ const steps = [ { - title: "应用授权", + title: i18next.t('App Authorization'), optional: false, }, { - title: "上传路径", + title: i18next.t('Upload Path'), optional: false, }, { - title: "直链设置", + title: i18next.t('Straight link settings'), optional: false, }, { - title: "上传限制", + title: i18next.t('Upload limit'), optional: false, }, { - title: "账号授权", + title: i18next.t('Account authorization'), optional: false, }, { - title: "完成", + title: i18next.t('Finish'), optional: false, }, ]; @@ -153,6 +155,8 @@ export default function OneDriveGuide(props) { ); const [httpsAlert, setHttpsAlert] = useState(false); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setPolicy({ ...policy, @@ -265,7 +269,7 @@ export default function OneDriveGuide(props) { ToggleSnackbar( "top", "right", - "存储策略已" + (props.policy ? "保存" : "添加"), + t('Storage Policy Already') + (props.policy ? t('save') : t('Add to')), "success" ); setActiveStep(4); @@ -282,812 +286,809 @@ export default function OneDriveGuide(props) { }; return ( -
- setHttpsAlert(false)} - title={"警告"} - msg={ - "您必须启用 HTTPS 才能使用 OneDrive/SharePoint 存储策略;启用后同步更改 参数设置 - 站点信息 - 站点URL。" - } - /> - - {props.policy ? "修改" : "添加"} OneDrive/SharePoint 存储策略 - - - {steps.map((label, index) => { - const stepProps = {}; - const labelProps = {}; - if (label.optional) { - labelProps.optional = ( - 可选 - ); - } - if (isStepSkipped(index)) { - stepProps.completed = false; - } - return ( - - {label.title} - - ); - })} - +
+ setHttpsAlert(false)} + title={t('warn')} + msg={ + t('You must enable HTTPS to use the OneDrive/SharePoint storage policy; after enabling it, change the parameter settings-site information-site URL.') + } + /> + + {props.policy ? t('Revise') : t('Add to')} {t('OneDrive/SharePoint Storage Strategy')} + + + {steps.map((label, index) => { + const stepProps = {}; + const labelProps = {}; + if (label.optional) { + labelProps.optional = ( + ({t('Optional')}) + ); + } + if (isStepSkipped(index)) { + stepProps.completed = false; + } + return ( + + {label.title} + + ); + })} + - {activeStep === 0 && ( -
{ - e.preventDefault(); - setActiveStep(1); - }} - > -
-
-
1
-
-
- - 前往 - - Azure Active Directory 控制台 (国际版账号) - {" "} - 或者{" "} - - Azure Active Directory 控制台 (世纪互联账号) - - 并登录,登录后进入 - Azure Active Directory管理面板。 - -
-
+ {activeStep === 0 && ( + { + e.preventDefault(); + setActiveStep(1); + }} + > +
+
+
1
+
+
+ + {t('Go to')} + + {t('Azure Active Directory Console (International Account)')} + {" "} + {t('or')}{" "} + + {t('Azure Active Directory console (21Vianet account)')} + + {t('Log in and enter after logging in')} + Azure Active Directory{t('Admin Panel.')} + +
+
-
-
-
2
-
-
- - 进入左侧 应用注册 菜单,并点击{" "} - 新注册 按钮。 - -
-
+
+
+
2
+
+
+ + {t('Enter the left side')} {t('Application Registration')} {t('Menu and click ')}{" "} + {t('New registration')} {t('Button.')} + +
+
-
-
-
3
-
-
- - 填写应用注册表单。其中,名称可任取; - 受支持的帐户类型 选择为 - - 任何组织目录(任何 Azure AD 目录 - - 多租户)中的帐户 - - ;重定向 URI (可选) - 请选择Web,并填写 - - {policy.OptionsSerialized.od_redirect} - - ; 其他保持默认即可 - -
-
+
+
+
3
+
+
+ + {t('Fill in the application registration form. Among them, the name can be any; ')} + {t('Supported account types')} {t('Select as ')} + + {t('An account in any organization directory (any Azure AD directory-\nmulti-tenant)')} + + {t(';')}{t('Redirect URI (optional)')} + {t('please choose')}Web{t(', and fill in ')} + + {policy.OptionsSerialized.od_redirect} + + {t('; Others can be kept by default": ')} + +
+
-
-
-
4
-
-
- - 创建完成后进入应用管理的概览 - 页面,复制应用程序(客户端) ID - 并填写在下方: - -
- - - 应用程序(客户端) ID - - - -
-
-
+
+
+
4
+
+
+ + {t('After the creation is complete, enter the application management')}{t('Overview')} + {t('Page, copy')}{t('Application (Client) ID')} + {t('And fill in the following:')} + +
+ + + {t('Application (Client) ID')} + + + +
+
+
-
-
-
5
-
-
- - 进入应用管理页面左侧的证书和密码 - 菜单,点击 - 新建客户端密码 - 按钮,截止期限选择为 - 从不 - 。创建完成后将客户端密码的值填写在下方: - -
- - - 客户端密码 - - - -
-
-
+
+
+
5
+
+
+ + {t('Enter on the left side of the application management page,')}{t('Certificate and Password')} + {t('Menu, click')} + {t('New Client Password')} + {t('Button, ')}{t('Deadline')}{t('Select as ')} + {t('Never')} + {t('. After the creation is complete, fill in the value of the client password below: ')} + +
+ + + {t('Client Password')} + + + +
+
+
-
-
-
6
-
-
- - 选择您的 Microsoft 365 账号类型: - -
- - - - } - label="国际版" - /> - - } - label="世纪互联版" - /> - - -
-
-
+
+
+
6
+
+
+ + {t('Select your Microsoft 365 account type:')} + +
+ + + + } + label={t('International Edition')} + /> + + } + label={t('21Vianet Edition')} + /> + + +
+
+
-
-
-
7
-
-
- - 是否将文件存放在 SharePoint 中? - -
- - { - setUseSharePoint( - e.target.value === "true" - ); - }} - row - > - - } - label="存到指定 SharePoint 中" - /> - - } - label="存到账号默认 OneDrive 驱动器中" - /> - - -
- -
- - - SharePoint 站点地址 - - - -
-
-
-
+
+
+
7
+
+
+ + {t('Do you want to store the file in SharePoint?')} + +
+ + { + setUseSharePoint( + e.target.value === "true" + ); + }} + row + > + + } + label={t('Save to specified SharePoint')} + /> + + } + label={t('Save to the account default OneDrive drive')} + /> + + +
+ +
+ + + {t('SharePoint site address')} + + + +
+
+
+
-
-
-
8
-
-
- - 是否要在文件下载时替换为使用自建的反代服务器? - -
- - { - setUseCDN( - e.target.value === "true" - ); - }} - row - > - - } - label="使用" - /> - - } - label="不使用" - /> - - -
- -
- - - -
-
-
-
+
+
+
8
+
+
+ + {t('Do you want to replace with a self-built anti-generation server when downloading files?')} + +
+ + { + setUseCDN( + e.target.value === "true" + ); + }} + row + > + + } + label={t('use')} + /> + + } + label={t('Do not use')} + /> + + +
+ +
+ + + +
+
+
+
-
-
-
9
-
-
- - 为此存储策略命名: - -
- - - 存储策略名 - - - -
-
-
+
+
+
9
+
+
+ + {t('Name this storage policy:')} + +
+ + + {t('Storage Policy Name')} + + + +
+
+
-
- -
-
- )} +
+ +
+ + )} - {activeStep === 1 && ( -
{ - e.preventDefault(); - setActiveStep(2); - }} - > -
-
-
1
-
-
- - 请在下方输入文件的存储目录路径,可以为绝对路径或相对路径(相对于 - 从机的 - Cloudreve)。路径中可以使用魔法变量,文件在上传时会自动替换这些变量为相应值; - 可用魔法变量可参考{" "} - { - e.preventDefault(); - setMagicVar("path"); - }} - > - 路径魔法变量列表 - {" "} - 。 - -
- - - 存储目录 - - - -
-
-
+ {activeStep === 1 && ( + { + e.preventDefault(); + setActiveStep(2); + }} + > +
+
+
1
+
+
+ + {t( + 'Please keep at least one color scheme' + )}{" "} + { + e.preventDefault(); + setMagicVar("path"); + }} + > + {t('Path Magic Variable List')} + {" "} + {t('。')} + +
+ + + {t('Storage Directory')} + + + +
+
+
-
-
-
2
-
-
- - 是否需要对存储的物理文件进行重命名?此处的重命名不会影响最终呈现给用户的 - 文件名。文件名也可使用魔法变量, - 可用魔法变量可参考{" "} - { - e.preventDefault(); - setMagicVar("file"); - }} - > - 文件名魔法变量列表 - {" "} - 。 - -
- - - - } - label="开启重命名" - /> - - } - label="不开启" - /> - - -
+
+
+
2
+
+
+ + {t( + 'Does the stored physical file need to be renamed? The renaming here will not affect the\nfile name that is finally presented to the user. The file name can also use magic variables,\ncan refer to the available magic variables' + )}{" "} + { + e.preventDefault(); + setMagicVar("file"); + }} + > + {t('File name magic variable list')} + {" "} + {t('。')} + +
+ + + + } + label={t('Turn on rename')} + /> + + } + label={t('Do not open')} + /> + + +
- -
- - - 命名规则 - - - -
-
-
-
+ +
+ + + {t('Naming Rules')} + + + +
+
+
+
-
- - -
-
- )} +
+ + +
+ + )} - {activeStep === 2 && ( -
{ - e.preventDefault(); - setActiveStep(3); - }} - > -
-
-
1
-
-
- - 是否允许获取文件永久直链? -
- 开启后,用户可以请求获得能直接访问到文件内容的直链,适用于图床应用或自用。 -
+ {activeStep === 2 && ( + { + e.preventDefault(); + setActiveStep(3); + }} + > +
+
+
1
+
+
+ + {t('Are you allowed to obtain permanent direct links to files?')} +
+ {t('When enabled, the user can request a direct link that can directly access the content of the file, suitable for image bed applications or personal use.')} +
-
- - { - handleChange("IsOriginLinkEnable")( - e - ); - }} - row - > - - } - label="允许" - /> - - } - label="禁止" - /> - - -
-
-
+
+ + { + handleChange("IsOriginLinkEnable")( + e + ); + }} + row + > + + } + label={t('allow')} + /> + + } + label={t('prohibit')} + /> + + +
+
+
-
- {" "} - -
-
- )} +
+ {" "} + +
+ + )} - {activeStep === 3 && ( -
-
-
-
1
-
-
- - 是否限制上传的单文件大小? - + {activeStep === 3 && ( + +
+
+
1
+
+
+ + {t('Do you want to limit the size of the uploaded single file?')} + -
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - MaxSize: "10485760", - }); - } else { - setPolicy({ - ...policy, - MaxSize: "0", - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
+
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + MaxSize: "10485760", + }); + } else { + setPolicy({ + ...policy, + MaxSize: "0", + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
- -
-
-
2
-
-
- - 输入限制: - -
- -
-
-
-
+ +
+
+
2
+
+
+ + {t('Input limit:')} + +
+ +
+
+
+
-
-
-
- {policy.MaxSize !== "0" ? "3" : "2"} -
-
-
- - 是否限制上传文件扩展名? - +
+
+
+ {policy.MaxSize !== "0" ? "3" : "2"} +
+
+
+ + {t('Do you want to restrict uploading file extensions?')} + -
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - file_type: - "jpg,png,mp4,zip,rar", - }, - }); - } else { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - file_type: "", - }, - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
+
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + file_type: + "jpg,png,mp4,zip,rar", + }, + }); + } else { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + file_type: "", + }, + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
- -
-
-
- {policy.MaxSize !== "0" ? "4" : "3"} -
-
-
- - 输入允许上传的文件扩展名,多个请以半角逗号 , - 隔开 - -
- - - 扩展名列表 - - - -
-
-
-
+ +
+
+
+ {policy.MaxSize !== "0" ? "4" : "3"} +
+
+
+ + {t('Enter the file extensions allowed to upload, please use a comma for more than one file,\nseparated')} + +
+ + + {t('List of extensions')} + + + +
+
+
+
-
- {" "} - -
-
- )} +
+ {" "} + +
+ + )} - {activeStep === 4 && ( -
-
-
-
- - 存储策略已{props.policy ? "保存" : "添加"} - ,但是你需要点击下方按钮,并使用 OneDrive - 登录授权以完成初始化后才能使用。 - 日后你可以在存储策略列表页面重新进行授权。 - -
- -
-
-
-
- - )} + {activeStep === 4 && ( +
+
+
+
+ + {t('Storage Policy Already')}{props.policy ? t('save') : t('Add to')} + {t( + 'But you need to click the button below and use OneDrive\nto log in and authorize to complete the initialization before you can use it.\nYou can re-authorize on the storage policy list page in the future.' + )} + +
+ +
+
+
+
+ + )} - {activeStep === 5 && ( - <> -
- 存储策略已添加! - - 要使用此存储策略,请到用户组管理页面,为相应用户组绑定此存储策略。 - -
-
- -
- - )} + {activeStep === 5 && ( + <> +
+ {t('Storage policy has been added!')} + + {t('To use this storage policy, please go to the user group management page and bind this storage policy to the corresponding user group.')} + +
+
+ +
+ + )} - setMagicVar("")} - /> - setMagicVar("")} - /> -
+ setMagicVar("")} + /> + setMagicVar("")} + /> +
); } diff --git a/src/component/Admin/Policy/Guid/QiniuGuide.js b/src/component/Admin/Policy/Guid/QiniuGuide.js index 34bbb8a1..f9d358a2 100644 --- a/src/component/Admin/Policy/Guid/QiniuGuide.js +++ b/src/component/Admin/Policy/Guid/QiniuGuide.js @@ -1,3 +1,5 @@ +import { useTranslation } from "react-i18next"; +import i18next from "i18next"; import Button from "@material-ui/core/Button"; import Collapse from "@material-ui/core/Collapse"; import FormControl from "@material-ui/core/FormControl"; @@ -68,23 +70,23 @@ const useStyles = makeStyles((theme) => ({ const steps = [ { - title: "存储空间", + title: i18next.t('Storage'), optional: false, }, { - title: "上传路径", + title: i18next.t('Upload Path'), optional: false, }, { - title: "直链设置", + title: i18next.t('Straight link settings'), optional: false, }, { - title: "上传限制", + title: i18next.t('Upload limit'), optional: false, }, { - title: "完成", + title: i18next.t('Finish'), optional: false, }, ]; @@ -120,6 +122,8 @@ export default function RemoteGuide(props) { } ); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setPolicy({ ...policy, @@ -178,7 +182,7 @@ export default function RemoteGuide(props) { ToggleSnackbar( "top", "right", - "存储策略已" + (props.policy ? "保存" : "添加"), + t('Storage Policy Already') + (props.policy ? t('save') : t('Add to')), "success" ); setActiveStep(5); @@ -194,784 +198,782 @@ export default function RemoteGuide(props) { }; return ( -
- - {props.policy ? "修改" : "添加"} 七牛 存储策略 - - - {steps.map((label, index) => { - const stepProps = {}; - const labelProps = {}; - if (label.optional) { - labelProps.optional = ( - 可选 - ); - } - if (isStepSkipped(index)) { - stepProps.completed = false; - } - return ( - - {label.title} - - ); - })} - - - {activeStep === 0 && ( -
{ - e.preventDefault(); - setActiveStep(1); - }} - > -
-
-
0
-
-
- - 在使用七牛存储策略前,请确保您在 参数设置 - - 站点信息 - 站点URL 中填写的 地址与实际相符,并且 - 能够被外网正常访问。 - -
-
- -
-
-
1
-
-
- - 前往 - - 七牛控制面板 - - 创建对象存储资源。 - -
-
- -
-
-
2
-
-
- - 在下方填写您在七牛创建存储空间时指定的“存储空间名称”: - -
- - - 存储空间名称 - - - -
-
-
- -
-
-
3
-
-
- - 在下方选择您创建的空间类型,推荐选择“私有空间”以获得更高的安全性,私有空间无法开启“获取直链”功能。 - -
- - - - } - label="私有" - /> - - } - label="公有" - /> - - -
-
-
- -
-
-
4
-
-
- - 填写您为存储空间绑定的 CDN 加速域名。 - -
- -
-
-
- -
-
-
5
-
-
- - 在七牛控制面板进入 个人中心 - - 密钥管理,在下方填写获得到的 AK、SK。 - -
- - - AK - - - -
-
- - - SK - - - -
-
-
- -
- -
-
- )} - - {activeStep === 1 && ( -
{ - e.preventDefault(); - setActiveStep(2); - }} - > -
-
-
1
-
-
- - 请在下方输入文件的存储目录路径,可以为绝对路径或相对路径(相对于 - 从机的 - Cloudreve)。路径中可以使用魔法变量,文件在上传时会自动替换这些变量为相应值; - 可用魔法变量可参考{" "} - { - e.preventDefault(); - setMagicVar("path"); - }} - > - 路径魔法变量列表 - {" "} - 。 - -
- - - 存储目录 - - - -
-
-
- -
-
-
2
-
-
- - 是否需要对存储的物理文件进行重命名?此处的重命名不会影响最终呈现给用户的 - 文件名。文件名也可使用魔法变量, - 可用魔法变量可参考{" "} - { - e.preventDefault(); - setMagicVar("file"); - }} - > - 文件名魔法变量列表 - {" "} - 。 - -
- - - - } - label="开启重命名" - /> - - } - label="不开启" - /> - - -
- - -
- - - 命名规则 - - - -
-
-
-
- -
- - -
-
- )} - - {activeStep === 2 && ( -
{ - e.preventDefault(); - setActiveStep(3); - }} - > -
-
-
1
-
-
- - 是否允许获取文件永久直链? -
- 开启后,用户可以请求获得能直接访问到文件内容的直链,适用于图床应用或自用。 -
- -
- - { - if ( - policy.IsPrivate === "true" && - e.target.value === "true" - ) { - ToggleSnackbar( - "top", - "right", - "私有空间无法开启此功能", - "warning" - ); - return; - } - handleChange("IsOriginLinkEnable")( - e - ); - }} - row - > - - } - label="允许" - /> - - } - label="禁止" - /> - - -
-
-
- -
- {" "} - -
-
- )} - - {activeStep === 3 && ( -
{ - e.preventDefault(); - setActiveStep(4); - }} - > -
-
-
1
-
-
- - 是否限制上传的单文件大小? - - -
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - MaxSize: "10485760", - }); - } else { - setPolicy({ - ...policy, - MaxSize: "0", - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
- - -
-
-
2
-
-
- - 输入限制: - -
- -
-
-
-
- -
-
-
- {policy.MaxSize !== "0" ? "3" : "2"} -
-
-
- - 是否限制上传文件扩展名? - - -
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - file_type: - "jpg,png,mp4,zip,rar", - }, - }); - } else { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - file_type: "", - }, - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
- - -
-
-
- {policy.MaxSize !== "0" ? "4" : "3"} -
-
-
- - 输入允许上传的文件扩展名,多个请以半角逗号 , - 隔开 - -
- - - 扩展名列表 - - - -
-
-
-
- -
-
-
- {getNumber(3, [ - policy.MaxSize !== "0", - policy.OptionsSerialized.file_type !== "", - ])} -
-
-
- - 是否限制上传文件 MimeType? - - -
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - mimetype: "image/*", - }, - }); - } else { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - mimetype: "", - }, - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
- - -
-
-
- {getNumber(4, [ - policy.MaxSize !== "0", - policy.OptionsSerialized.file_type !== - "", - ])} -
-
-
- - 输入允许上传的 MimeType,多个请以半角逗号 , - 隔开。七牛服务器会侦测文件内容以判断 - MimeType,再用判断值跟指定值进行匹配,匹配成功则允许上传 - -
- - - MimeType 列表 - - - -
-
-
-
- -
- {" "} - -
-
- )} - - {activeStep === 4 && ( -
-
-
-
- - 最后一步,为此存储策略命名: - -
- - - 存储策略名 - - - -
-
-
-
- {" "} - -
-
- )} - - {activeStep === 5 && ( - <> -
- - 存储策略已{props.policy ? "保存" : "添加"}! - - - 要使用此存储策略,请到用户组管理页面,为相应用户组绑定此存储策略。 - -
-
- -
- - )} - - setMagicVar("")} - /> - setMagicVar("")} - /> -
+
+ + {props.policy ? t('Revise') : t('Add to')} {t('Qiniu Storage Strategy')} + + + {steps.map((label, index) => { + const stepProps = {}; + const labelProps = {}; + if (label.optional) { + labelProps.optional = ( + ({t('Optional')}) + ); + } + if (isStepSkipped(index)) { + stepProps.completed = false; + } + return ( + + {label.title} + + ); + })} + + + {activeStep === 0 && ( +
{ + e.preventDefault(); + setActiveStep(1); + }} + > +
+
+
0
+
+
+ + {t( + 'Before using the Qiniu storage strategy, please make sure that the address you fill in the parameter setting -\nsite information-site URL matches the actual address, and ' + )} + {t('Able to be normally accessed by the external network')}{t('。')} + +
+
+ +
+
+
1
+
+
+ + {t('Go to')} + + {t('Qiniu Control Panel')} + + {t('Create an object storage resource.')} + +
+
+ +
+
+
2
+
+
+ + {t('Fill in the "storage space name" you specified when Qiniu created the storage space below: ')} + +
+ + + {t('Storage space name')} + + + +
+
+
+ +
+
+
3
+
+
+ + {t('Select the type of space you created below. It is recommended to select "Private Space" for higher security. Private Space cannot enable the "Get Direct Link" function.')} + +
+ + + + } + label={t('private')} + /> + + } + label={t('Public')} + /> + + +
+
+
+ +
+
+
4
+
+
+ + {t('Fill in the CDN accelerated domain name that you bind to the storage space.')} + +
+ +
+
+
+ +
+
+
5
+
+
+ + {t('Enter the personal center -\nkey management in the Qiniu control panel, and fill in the AK and SK obtained below.')} + +
+ + + AK + + + +
+
+ + + SK + + + +
+
+
+ +
+ +
+
+ )} + + {activeStep === 1 && ( +
{ + e.preventDefault(); + setActiveStep(2); + }} + > +
+
+
1
+
+
+ + {t( + 'Please keep at least one color scheme' + )}{" "} + { + e.preventDefault(); + setMagicVar("path"); + }} + > + {t('Path Magic Variable List')} + {" "} + {t('。')} + +
+ + + {t('Storage Directory')} + + + +
+
+
+ +
+
+
2
+
+
+ + {t( + 'Does the stored physical file need to be renamed? The renaming here will not affect the\nfile name that is finally presented to the user. The file name can also use magic variables,\ncan refer to the available magic variables' + )}{" "} + { + e.preventDefault(); + setMagicVar("file"); + }} + > + {t('File name magic variable list')} + {" "} + {t('。')} + +
+ + + + } + label={t('Turn on rename')} + /> + + } + label={t('Do not open')} + /> + + +
+ + +
+ + + {t('Naming Rules')} + + + +
+
+
+
+ +
+ + +
+
+ )} + + {activeStep === 2 && ( +
{ + e.preventDefault(); + setActiveStep(3); + }} + > +
+
+
1
+
+
+ + {t('Are you allowed to obtain permanent direct links to files?')} +
+ {t('When enabled, the user can request a direct link that can directly access the content of the file, suitable for image bed applications or personal use.')} +
+ +
+ + { + if ( + policy.IsPrivate === "true" && + e.target.value === "true" + ) { + ToggleSnackbar( + "top", + "right", + t('Private space cannot open this function'), + "warning" + ); + return; + } + handleChange("IsOriginLinkEnable")( + e + ); + }} + row + > + + } + label={t('allow')} + /> + + } + label={t('prohibit')} + /> + + +
+
+
+ +
+ {" "} + +
+
+ )} + + {activeStep === 3 && ( +
{ + e.preventDefault(); + setActiveStep(4); + }} + > +
+
+
1
+
+
+ + {t('Do you want to limit the size of the uploaded single file?')} + + +
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + MaxSize: "10485760", + }); + } else { + setPolicy({ + ...policy, + MaxSize: "0", + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
+ + +
+
+
2
+
+
+ + {t('Input limit:')} + +
+ +
+
+
+
+ +
+
+
+ {policy.MaxSize !== "0" ? "3" : "2"} +
+
+
+ + {t('Do you want to restrict uploading file extensions?')} + + +
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + file_type: + "jpg,png,mp4,zip,rar", + }, + }); + } else { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + file_type: "", + }, + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
+ + +
+
+
+ {policy.MaxSize !== "0" ? "4" : "3"} +
+
+
+ + {t('Enter the file extensions allowed to upload, please use a comma for more than one file,\nseparated')} + +
+ + + {t('List of extensions')} + + + +
+
+
+
+ +
+
+
+ {getNumber(3, [ + policy.MaxSize !== "0", + policy.OptionsSerialized.file_type !== "", + ])} +
+
+
+ + {t('Do you limit uploading files to MimeType?')} + + +
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + mimetype: "image/*", + }, + }); + } else { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + mimetype: "", + }, + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
+ + +
+
+
+ {getNumber(4, [ + policy.MaxSize !== "0", + policy.OptionsSerialized.file_type !== + "", + ])} +
+
+
+ + {t( + 'Enter the MimeType that is allowed to upload, please use a comma for more than one MimeType,\nSeparate. The Qiniu server will detect the content of the file to determine the\nMimeType, and then use the judgment value to match the specified value. If the match is successful, the upload is allowed.' + )} + +
+ + + {t('MimeType list')} + + + +
+
+
+
+ +
+ {" "} + +
+
+ )} + + {activeStep === 4 && ( +
+
+
+
+ + {t('The last step, name this storage policy: ')} + +
+ + + {t('Storage Policy Name')} + + + +
+
+
+
+ {" "} + +
+
+ )} + + {activeStep === 5 && ( + <> +
+ + {t('Storage Policy Already')}{props.policy ? t('save') : t('Add to')}{t('!')} + + + {t('To use this storage policy, please go to the user group management page and bind this storage policy to the corresponding user group.')} + +
+
+ +
+ + )} + + setMagicVar("")} + /> + setMagicVar("")} + /> +
); } diff --git a/src/component/Admin/Policy/Guid/RemoteGuide.js b/src/component/Admin/Policy/Guid/RemoteGuide.js index d226b9c8..3337fff0 100644 --- a/src/component/Admin/Policy/Guid/RemoteGuide.js +++ b/src/component/Admin/Policy/Guid/RemoteGuide.js @@ -1,3 +1,5 @@ +import { useTranslation } from "react-i18next"; +import i18next from "i18next"; import Button from "@material-ui/core/Button"; import Collapse from "@material-ui/core/Collapse"; import FormControl from "@material-ui/core/FormControl"; @@ -90,23 +92,23 @@ const useStyles = makeStyles((theme) => ({ const steps = [ { - title: "存储端配置", + title: i18next.t('Storage configuration'), optional: false, }, { - title: "上传路径", + title: i18next.t('Upload Path'), optional: false, }, { - title: "直链设置", + title: i18next.t('Straight link settings'), optional: false, }, { - title: "上传限制", + title: i18next.t('Upload limit'), optional: false, }, { - title: "完成", + title: i18next.t('Finish'), optional: false, }, ]; @@ -141,6 +143,8 @@ export default function RemoteGuide(props) { } ); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setPolicy({ ...policy, @@ -178,7 +182,7 @@ export default function RemoteGuide(props) { secret: policy.SecretKey, }) .then(() => { - ToggleSnackbar("top", "right", "通信正常", "success"); + ToggleSnackbar("top", "right", t('Communication is normal'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -223,7 +227,7 @@ export default function RemoteGuide(props) { ToggleSnackbar( "top", "right", - "存储策略已" + (props.policy ? "保存" : "添加"), + t('Storage Policy Already') + (props.policy ? t('save') : t('Add to')), "success" ); setActiveStep(5); @@ -239,754 +243,755 @@ export default function RemoteGuide(props) { }; return ( -
- - {props.policy ? "修改" : "添加"}从机存储策略 - - - {steps.map((label, index) => { - const stepProps = {}; - const labelProps = {}; - if (label.optional) { - labelProps.optional = ( - 可选 - ); - } - if (isStepSkipped(index)) { - stepProps.completed = false; - } - return ( - - {label.title} - - ); - })} - - - {activeStep === 0 && ( -
{ - e.preventDefault(); - setActiveStep(1); - }} - > - - 从机存储策略允许你使用同样运行了 Cloudreve - 的服务器作为存储端, 用户上传下载流量通过 HTTP 直传。 - - -
-
-
1
-
-
- - 将和主站相同版本的 Cloudreve - 程序拷贝至要作为从机的服务器上。 - -
-
- -
-
-
2
-
-
- - 下方为系统为您随机生成的从机端密钥,一般无需改动,如果有自定义需求, - 可将您的密钥填入下方: - -
- - - 从机密钥 - - - -
-
-
- -
-
-
3
-
-
- - 修改从机配置文件。 -
- 在从机端 Cloudreve 的同级目录下新建 - conf.ini - 文件,填入从机配置,启动/重启从机端 Cloudreve。 - 以下为一个可供参考的配置例子,其中密钥部分已帮您填写为上一步所生成的。 -
-
-                                [System]
-                                
- Mode = slave -
- Listen = :5212 -
-
- [Slave] -
- Secret = {policy.SecretKey} -
-
- [CORS] -
- AllowOrigins = *
- AllowMethods = OPTIONS,GET,POST -
- AllowHeaders = *
-
- - 从机端配置文件格式大致与主站端相同,区别在于: -
    -
  • - System - 分区下的 - mode - 字段必须更改为slave -
  • -
  • - 必须指定Slave分区下的 - Secret - 字段,其值为第二步里填写或生成的密钥。 -
  • -
  • - 必须启动跨域配置,即CORS - 字段的内容, - 具体可参考上文范例或官方文档。如果配置不正确,用户将无法通过 - Web 端向从机上传文件。 -
  • -
-
-
-
- -
-
-
4
-
-
- - 填写从机地址。 -
- 如果主站启用了 - HTTPS,从机也需要启用,并在下方填入 HTTPS - 协议的地址。 -
-
- - - 从机地址 - - - -
-
-
- -
-
-
5
-
-
- - 完成以上步骤后,你可以点击下方的测试按钮测试通信是否正常。 - -
- -
-
-
- -
- -
-
- )} - - {activeStep === 1 && ( -
{ - e.preventDefault(); - setActiveStep(2); - }} - > -
-
-
1
-
-
- - 请在下方输入文件的存储目录路径,可以为绝对路径或相对路径(相对于 - 从机的 - Cloudreve)。路径中可以使用魔法变量,文件在上传时会自动替换这些变量为相应值; - 可用魔法变量可参考{" "} - { - e.preventDefault(); - setMagicVar("path"); - }} - > - 路径魔法变量列表 - {" "} - 。 - -
- - - 存储目录 - - - -
-
-
- -
-
-
2
-
-
- - 是否需要对存储的物理文件进行重命名?此处的重命名不会影响最终呈现给用户的 - 文件名。文件名也可使用魔法变量, - 可用魔法变量可参考{" "} - { - e.preventDefault(); - setMagicVar("file"); - }} - > - 文件名魔法变量列表 - {" "} - 。 - -
- - - - } - label="开启重命名" - /> - - } - label="不开启" - /> - - -
- - -
- - - 命名规则 - - - -
-
-
-
- -
- - -
-
- )} - - {activeStep === 2 && ( -
{ - e.preventDefault(); - setActiveStep(3); - }} - > -
-
-
1
-
-
- - 是否允许获取文件永久直链? +
+ + {props.policy ? t('Revise') : t('Add to')}{t('Slave Storage Strategy')} + + + {steps.map((label, index) => { + const stepProps = {}; + const labelProps = {}; + if (label.optional) { + labelProps.optional = ( + ({t('Optional')}) + ); + } + if (isStepSkipped(index)) { + stepProps.completed = false; + } + return ( + + {label.title} + + ); + })} + + + {activeStep === 0 && ( + { + e.preventDefault(); + setActiveStep(1); + }} + > + + {t( + 'The slave storage policy allows you to use the server that also runs Cloudreve\nas the storage end, and the user upload and download traffic is directly transmitted via HTTP.' + )} + + +
+
+
1
+
+
+ + {t('Copy the Cloudreve\nprogram of the same version as the master site to the server to be used as the slave.')} + +
+
+ +
+
+
2
+
+
+ + {t( + 'The following is the slave key randomly generated by the system for you. Generally, there is no need to change it. If you have custom requirements,\ncan fill in your key below:' + )} + +
+ + + {t('Slave Key')} + + + +
+
+
+ +
+
+
3
+
+
+ + {t('Modify the slave configuration file.')} +
+ {t('Create a new directory in the same level directory of Cloudreve on the slave side')} + conf.ini + {t( + 'File, fill in the slave configuration, start/restart Cloudreve on the slave side.\nThe following is a configuration example for reference, in which the key part has been filled in for you as the one generated in the previous step.' + )} +
+
+                              [System]
+                              
+ Mode = slave +
+ Listen = :5212 +
+
+ [Slave] +
+ Secret = {policy.SecretKey} +
+
+ [CORS] +
+ AllowOrigins = *
+ AllowMethods = OPTIONS,GET,POST +
+ AllowHeaders = *
+
+ + {t('The configuration file format of the slave is roughly the same as that of the master, the difference is: ')} +
    +
  • + System + {t('\\\\ under the partition')} + mode + {t('The field must be changed to ')}slave +
  • +
  • + {t('Must specify ')}Slave{t('\\\\ under the partition')} + Secret + {t('The value of the field is the key filled in or generated in the second step.')} +
  • +
  • + {t('Cross-domain configuration must be activated, ie ')}CORS + {t( + 'For the content of the field,\ncan refer to the above examples or official documents. If the configuration is not correct, the user will not be able to upload files to the slave through the\nWeb terminal.' + )} +
  • +
+
+
+
+ +
+
+
4
+
+
+ + {t('Fill in the slave address.')} +
+ {t( + 'If the master has enabled\nHTTPS, the slave also needs to enable it, and fill in the address of the HTTPS\nprotocol below.' + )} +
+
+ + + {t('Slave address')} + + + +
+
+
+ +
+
+
5
+
+
+ + {t('After completing the above steps, you can click the test button below to test whether the communication is normal.')} + +
+ +
+
+
+ +
+ +
+ + )} + + {activeStep === 1 && ( +
{ + e.preventDefault(); + setActiveStep(2); + }} + > +
+
+
1
+
+
+ + {t( + 'Please keep at least one color scheme' + )}{" "} + { + e.preventDefault(); + setMagicVar("path"); + }} + > + {t('Path Magic Variable List')} + {" "} + {t('。')} + +
+ + + {t('Storage Directory')} + + + +
+
+
+ +
+
+
2
+
+
+ + {t( + 'Does the stored physical file need to be renamed? The renaming here will not affect the\nfile name that is finally presented to the user. The file name can also use magic variables,\ncan refer to the available magic variables' + )}{" "} + { + e.preventDefault(); + setMagicVar("file"); + }} + > + {t('File name magic variable list')} + {" "} + {t('。')} + +
+ + + + } + label={t('Turn on rename')} + /> + + } + label={t('Do not open')} + /> + + +
+ + +
+ + + {t('Naming Rules')} + + + +
+
+
+
+ +
+ + +
+
+ )} + + {activeStep === 2 && ( +
{ + e.preventDefault(); + setActiveStep(3); + }} + > +
+
+
1
+
+
+ + {t('Are you allowed to obtain permanent direct links to files?')} +
+ {t('When enabled, the user can request a direct link that can directly access the content of the file, suitable for image bed applications or personal use.')} +
+ +
+ + + + } + label={t('allow')} + /> + + } + label={t('prohibit')} + /> + + +
+
+
+ + +
+
+
2
+
+
+ + {t('Do you want to use CDN for downloads/direct links?')}
- 开启后,用户可以请求获得能直接访问到文件内容的直链,适用于图床应用或自用。 -
- -
- - - - } - label="允许" - /> - - } - label="禁止" - /> - - -
-
-
- - -
-
-
2
-
-
- - 是否要对下载/直链使用 CDN? -
- 开启后,用户访问文件时的 URL - 中的域名部分会被替换为 CDN 域名。 -
- -
- - { - if ( - e.target.value === "false" - ) { - setPolicy({ - ...policy, - BaseURL: "", - }); - } - setUseCDN(e.target.value); - }} - row - > - - } - label="使用" - /> - - } - label="不使用" - /> - - -
-
-
- - -
-
-
3
-
-
- - 选择协议并填写 CDN 域名 - - -
- -
-
-
-
-
- -
- {" "} - -
- - )} - - {activeStep === 3 && ( -
{ - e.preventDefault(); - setActiveStep(4); - }} - > -
-
-
1
-
-
- - 是否限制上传的单文件大小? - - -
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - MaxSize: "10485760", - }); - } else { - setPolicy({ - ...policy, - MaxSize: "0", - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
- - -
-
-
2
-
-
- - 输入限制: - -
- -
-
-
-
- -
-
-
- {policy.MaxSize !== "0" ? "3" : "2"} -
-
-
- - 是否限制上传文件扩展名? - - -
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - file_type: - "jpg,png,mp4,zip,rar", - }, - }); - } else { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - file_type: "", - }, - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
- - -
-
-
- {policy.MaxSize !== "0" ? "4" : "3"} -
-
-
- - 输入允许上传的文件扩展名,多个请以半角逗号 , - 隔开 - -
- - - 扩展名列表 - - - -
-
-
-
- -
- {" "} - -
-
- )} - - {activeStep === 4 && ( -
-
-
-
- - 最后一步,为此存储策略命名: - -
- - - 存储策略名 - - - -
-
-
-
- {" "} - -
-
- )} - - {activeStep === 5 && ( - <> -
- - 存储策略已{props.policy ? "保存" : "添加"}! - - - 要使用此存储策略,请到用户组管理页面,为相应用户组绑定此存储策略。 - -
-
- -
- - )} - - setMagicVar("")} - /> - setMagicVar("")} - /> -
+ {t( + 'When enabled, the domain name part of the URL\nwhen the user accesses the file will be replaced with the CDN domain name.' + )} +
+ +
+ + { + if ( + e.target.value === "false" + ) { + setPolicy({ + ...policy, + BaseURL: "", + }); + } + setUseCDN(e.target.value); + }} + row + > + + } + label={t('use')} + /> + + } + label={t('Do not use')} + /> + + +
+
+
+ + +
+
+
3
+
+
+ + {t('Select the protocol and fill in the CDN domain name')} + + +
+ +
+
+
+
+ + +
+ {" "} + +
+ + )} + + {activeStep === 3 && ( +
{ + e.preventDefault(); + setActiveStep(4); + }} + > +
+
+
1
+
+
+ + {t('Do you want to limit the size of the uploaded single file?')} + + +
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + MaxSize: "10485760", + }); + } else { + setPolicy({ + ...policy, + MaxSize: "0", + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
+ + +
+
+
2
+
+
+ + {t('Input limit:')} + +
+ +
+
+
+
+ +
+
+
+ {policy.MaxSize !== "0" ? "3" : "2"} +
+
+
+ + {t('Do you want to restrict uploading file extensions?')} + + +
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + file_type: + "jpg,png,mp4,zip,rar", + }, + }); + } else { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + file_type: "", + }, + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
+ + +
+
+
+ {policy.MaxSize !== "0" ? "4" : "3"} +
+
+
+ + {t('Enter the file extensions allowed to upload, please use a comma for more than one file,\nseparated')} + +
+ + + {t('List of extensions')} + + + +
+
+
+
+ +
+ {" "} + +
+
+ )} + + {activeStep === 4 && ( +
+
+
+
+ + {t('The last step, name this storage policy: ')} + +
+ + + {t('Storage Policy Name')} + + + +
+
+
+
+ {" "} + +
+
+ )} + + {activeStep === 5 && ( + <> +
+ + {t('Storage Policy Already')}{props.policy ? t('save') : t('Add to')}{t('!')} + + + {t('To use this storage policy, please go to the user group management page and bind this storage policy to the corresponding user group.')} + +
+
+ +
+ + )} + + setMagicVar("")} + /> + setMagicVar("")} + /> +
); } diff --git a/src/component/Admin/Policy/Guid/S3Guide.js b/src/component/Admin/Policy/Guid/S3Guide.js index c6bd2c62..ec7fc371 100644 --- a/src/component/Admin/Policy/Guid/S3Guide.js +++ b/src/component/Admin/Policy/Guid/S3Guide.js @@ -1,3 +1,5 @@ +import { useTranslation } from "react-i18next"; +import i18next from "i18next"; import { lighten, makeStyles } from "@material-ui/core/styles"; import React, { useCallback, useState } from "react"; import Stepper from "@material-ui/core/Stepper"; @@ -92,27 +94,27 @@ const useStyles = makeStyles((theme) => ({ const steps = [ { - title: "存储空间", + title: i18next.t('Storage'), optional: false, }, { - title: "上传路径", + title: i18next.t('Upload Path'), optional: false, }, { - title: "直链设置", + title: i18next.t('Straight link settings'), optional: false, }, { - title: "上传限制", + title: i18next.t('Upload limit'), optional: false, }, { - title: "跨域策略", + title: i18next.t('Cross Domain Policy'), optional: true, }, { - title: "完成", + title: i18next.t('Finish'), optional: false, }, ]; @@ -140,7 +142,7 @@ const regions = { "eu-west-3": "Europe (Paris)", "eu-north-1": "Europe (Stockholm)", "me-south-1": "Middle East (Bahrain)", - "sa-east-1": "South America (São Paulo)", + "sa-east-1": i18next.t('South America (São Paulo)'), }; export default function S3Guide(props) { @@ -179,6 +181,8 @@ export default function S3Guide(props) { props.policy ? props.policy.ID : 0 ); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setPolicy({ ...policy, @@ -241,7 +245,7 @@ export default function S3Guide(props) { ToggleSnackbar( "top", "right", - "存储策略已" + (props.policy ? "保存" : "添加"), + t('Storage Policy Already') + (props.policy ? t('save') : t('Add to')), "success" ); setActiveStep(4); @@ -263,7 +267,7 @@ export default function S3Guide(props) { id: policyID, }) .then(() => { - ToggleSnackbar("top", "right", "跨域策略已添加", "success"); + ToggleSnackbar("top", "right", t('Cross-domain policy has been added'), "success"); setActiveStep(5); }) .catch((error) => { @@ -275,814 +279,811 @@ export default function S3Guide(props) { }; return ( -
- setAlertOpen(false)} - title={"警告"} - msg={ - "S3 类型存储策略目前仅可用于自己使用,或者是给受信任的用户组使用。" - } - /> - - {props.policy ? "修改" : "添加"} Amazon S3 存储策略 - - - {steps.map((label, index) => { - const stepProps = {}; - const labelProps = {}; - if (label.optional) { - labelProps.optional = ( - 可选 - ); - } - if (isStepSkipped(index)) { - stepProps.completed = false; - } - return ( - - {label.title} - - ); - })} - +
+ setAlertOpen(false)} + title={t('warn')} + msg={ + t('S3 type storage policy is currently only available for self-use, or for trusted user groups.') + } + /> + + {props.policy ? t('Revise') : t('Add to')} {t('Amazon S3 Storage Policy')} + + + {steps.map((label, index) => { + const stepProps = {}; + const labelProps = {}; + if (label.optional) { + labelProps.optional = ( + ({t('Optional')}) + ); + } + if (isStepSkipped(index)) { + stepProps.completed = false; + } + return ( + + {label.title} + + ); + })} + - {activeStep === 0 && ( -
{ - e.preventDefault(); - setActiveStep(1); - }} - > -
-
-
0
-
-
- - Cloudreve 主站需要启用 CORS 支持,具体步骤如下: + {activeStep === 0 && ( + { + e.preventDefault(); + setActiveStep(1); + }} + > +
+
+
0
+
+
+ + {t('The Cloudreve master site needs to enable CORS support, the specific steps are as follows:')} +
+ {t( + 'Modify the Cloudreve configuration file, add the following CORS\nconfiguration items, save and restart Cloudreve.' + )} +
+                                [CORS]
                                 
- 修改 Cloudreve 配置文件,新增以下 CORS - 配置项,保存并重启 Cloudreve。 -
-                                    [CORS]
-                                    
- AllowOrigins = *
- AllowMethods = OPTIONS,GET,POST -
- AllowHeaders = *
-
- -
-
+ AllowOrigins = *
+ AllowMethods = OPTIONS,GET,POST +
+ AllowHeaders = *
+ +
+
+
-
-
-
1
-
-
- - 前往 AWS S3 - 控制台创建存储桶,在下方填写您创建存储桶时指定的 - 存储桶名称: - -
- - - 存储桶名称 - - - -
-
-
+
+
+
1
+
+
+ + {t('Go to the AWS S3\nconsole to create a bucket, and fill in the specified when you created the bucket below')} + {t('Bucket name')}{t(':')} + +
+ + + {t('Bucket name')} + + + +
+
+
-
-
-
2
-
-
- - 在下方选择您创建的空间的公共访问权限类型,推荐选择“私有”以获得更高的安全性,私有空间无法开启“获取直链”功能。 - -
- - - - } - label="阻止全部公共访问权限" - /> - - } - label="允许公共读取" - /> - - -
-
-
+
+
+
2
+
+
+ + {t('Select the type of public access permissions for the space you created below. It is recommended to select "Private" for higher security. Private spaces cannot enable the "Get direct link" function.')} + +
+ + + + } + label={t('Block all public access rights')} + /> + + } + label={t('Allow public reading')} + /> + + +
+
+
-
-
-
3
-
-
- - (可选) 指定存储桶的 EndPoint(地域节点), - 填写为完整的 URL 格式,比如{" "} - https://bucket.region.example.com。 - 留空则将使用系统生成的默认接入点。 - -
- - - EndPoint - - - -
-
-
+
+
+
3
+
+
+ + {t( + '(Optional) Specify the EndPoint (regional node) of the bucket, fill in\nas a complete URL format, such as ' + )}{" "} + https://bucket.region.example.com{t('.\nLeave blank to use the default access point generated by the system.')} + +
+ + + EndPoint + + + +
+
+
-
-
-
4
-
-
- - 选择存储桶所在的区域,或者手动输入区域代码 - -
- - - handleOptionChange("region")({ - target: { value: value }, - }) - } - renderOption={(option) => ( - - {regions[option]} - - )} - renderInput={(params) => ( - - )} - /> - -
-
-
+
+
+
4
+
+
+ + {t('Select the region where the bucket is located, or manually enter the region code')} + +
+ + + handleOptionChange("region")({ + target: { value: value }, + }) + } + renderOption={(option) => ( + + {regions[option]} + + )} + renderInput={(params) => ( + + )} + /> + +
+
+
-
-
-
5
-
-
- - 是否要使用 CDN 加速访问? - -
- - { - setUseCDN(e.target.value); - }} - row - > - - } - label="使用" - /> - - } - label="不使用" - /> - - -
-
-
+
+
+
5
+
+
+ + {t('Do you want to use CDN to accelerate access?')} + +
+ + { + setUseCDN(e.target.value); + }} + row + > + + } + label={t('use')} + /> + + } + label={t('Do not use')} + /> + + +
+
+
- -
-
-
6
-
-
- - CDN 加速域名 - -
- -
-
-
-
+ +
+
+
6
+
+
+ + {t('CDN accelerated domain name')} + +
+ +
+
+
+
-
-
-
- {getNumber(6, [useCDN === "true"])} -
-
-
- - 获取访问密钥,并填写在下方。 - -
- - - AccessKey - - - -
-
- - - SecretKey - - - -
-
-
+
+
+
+ {getNumber(6, [useCDN === "true"])} +
+
+
+ + {t('Get the access key and fill it in below.')} + +
+ + + AccessKey + + + +
+
+ + + SecretKey + + + +
+
+
-
-
-
- {getNumber(7, [useCDN === "true"])} -
-
-
- - 为此存储策略命名: - -
- - - 存储策略名 - - - -
-
-
+
+
+
+ {getNumber(7, [useCDN === "true"])} +
+
+
+ + {t('Name this storage policy:')} + +
+ + + {t('Storage Policy Name')} + + + +
+
+
-
- -
-
- )} +
+ +
+ + )} - {activeStep === 1 && ( -
{ - e.preventDefault(); - setActiveStep(2); - }} - > -
-
-
1
-
-
- - 请在下方输入文件的存储目录路径,可以为绝对路径或相对路径(相对于 - 从机的 - Cloudreve)。路径中可以使用魔法变量,文件在上传时会自动替换这些变量为相应值; - 可用魔法变量可参考{" "} - setMagicVar("path")} - > - 路径魔法变量列表 - {" "} - 。 - -
- - - 存储目录 - - - -
-
-
+ {activeStep === 1 && ( + { + e.preventDefault(); + setActiveStep(2); + }} + > +
+
+
1
+
+
+ + {t( + 'Please keep at least one color scheme' + )}{" "} + setMagicVar("path")} + > + {t('Path Magic Variable List')} + {" "} + {t('。')} + +
+ + + {t('Storage Directory')} + + + +
+
+
-
-
-
2
-
-
- - 是否需要对存储的物理文件进行重命名?此处的重命名不会影响最终呈现给用户的 - 文件名。文件名也可使用魔法变量, - 可用魔法变量可参考{" "} - setMagicVar("file")} - > - 文件名魔法变量列表 - {" "} - 。 - -
- - - - } - label="开启重命名" - /> - - } - label="不开启" - /> - - -
+
+
+
2
+
+
+ + {t( + 'Does the stored physical file need to be renamed? The renaming here will not affect the\nfile name that is finally presented to the user. The file name can also use magic variables,\ncan refer to the available magic variables' + )}{" "} + setMagicVar("file")} + > + {t('File name magic variable list')} + {" "} + {t('。')} + +
+ + + + } + label={t('Turn on rename')} + /> + + } + label={t('Do not open')} + /> + + +
- -
- - - 命名规则 - - - -
-
-
-
+ +
+ + + {t('Naming Rules')} + + + +
+
+
+
-
- - -
-
- )} +
+ + +
+ + )} - {activeStep === 2 && ( -
{ - e.preventDefault(); - setActiveStep(3); - }} - > -
-
-
1
-
-
- - 是否允许获取文件永久直链? -
- 开启后,用户可以请求获得能直接访问到文件内容的直链,适用于图床应用或自用。 -
+ {activeStep === 2 && ( + { + e.preventDefault(); + setActiveStep(3); + }} + > +
+
+
1
+
+
+ + {t('Are you allowed to obtain permanent direct links to files?')} +
+ {t('When enabled, the user can request a direct link that can directly access the content of the file, suitable for image bed applications or personal use.')} +
-
- - { - if ( - policy.IsPrivate === "true" && - e.target.value === "true" - ) { - ToggleSnackbar( - "top", - "right", - "私有空间无法开启此功能", - "warning" - ); - return; - } - handleChange("IsOriginLinkEnable")( - e - ); - }} - row - > - - } - label="允许" - /> - - } - label="禁止" - /> - - -
-
-
+
+ + { + if ( + policy.IsPrivate === "true" && + e.target.value === "true" + ) { + ToggleSnackbar( + "top", + "right", + t('Private space cannot open this function'), + "warning" + ); + return; + } + handleChange("IsOriginLinkEnable")( + e + ); + }} + row + > + + } + label={t('allow')} + /> + + } + label={t('prohibit')} + /> + + +
+
+
-
- {" "} - -
-
- )} +
+ {" "} + +
+ + )} - {activeStep === 3 && ( -
-
-
-
1
-
-
- - 是否限制上传的单文件大小? - + {activeStep === 3 && ( + +
+
+
1
+
+
+ + {t('Do you want to limit the size of the uploaded single file?')} + -
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - MaxSize: "10485760", - }); - } else { - setPolicy({ - ...policy, - MaxSize: "0", - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
+
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + MaxSize: "10485760", + }); + } else { + setPolicy({ + ...policy, + MaxSize: "0", + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
- -
-
-
2
-
-
- - 输入限制: - -
- -
-
-
-
+ +
+
+
2
+
+
+ + {t('Input limit:')} + +
+ +
+
+
+
-
-
-
- {policy.MaxSize !== "0" ? "3" : "2"} -
-
-
- - 是否限制上传文件扩展名? - +
+
+
+ {policy.MaxSize !== "0" ? "3" : "2"} +
+
+
+ + {t('Do you want to restrict uploading file extensions?')} + -
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - file_type: - "jpg,png,mp4,zip,rar", - }, - }); - } else { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - file_type: "", - }, - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
+
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + file_type: + "jpg,png,mp4,zip,rar", + }, + }); + } else { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + file_type: "", + }, + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
- -
-
-
- {policy.MaxSize !== "0" ? "4" : "3"} -
-
-
- - 输入允许上传的文件扩展名,多个请以半角逗号 , - 隔开 - -
- - - 扩展名列表 - - - -
-
-
-
+ +
+
+
+ {policy.MaxSize !== "0" ? "4" : "3"} +
+
+
+ + {t('Enter the file extensions allowed to upload, please use a comma for more than one file,\nseparated')} + +
+ + + {t('List of extensions')} + + + +
+
+
+
-
- {" "} - -
-
- )} +
+ {" "} + +
+ + )} - {activeStep === 4 && ( -
-
-
-
- - S3 Bucket 需要正确配置跨域策略后才能使用 Web - 端上传文件,Cloudreve - 可以帮您自动设置,您也可以参考文档步骤手动设置。如果您已设置过此 - Bucket 的跨域策略,此步骤可以跳过。 - -
- -
-
-
-
- {" "} -
- - )} + {activeStep === 4 && ( +
+
+
+
+ + {t( + 'S3 Bucket needs to configure the cross-domain policy correctly before you can upload files on the Web\nside. Cloudreve\ncan automatically set it for you, or you can set it manually by referring to the document steps. If you have already set this\nBucket Cross-domain policy, this step can be skipped.' + )} + +
+ +
+
+
+
+ {" "} +
+ + )} - {activeStep === 5 && ( - <> -
- - 存储策略已{props.policy ? "保存" : "添加"}! - - - 要使用此存储策略,请到用户组管理页面,为相应用户组绑定此存储策略。 - -
-
- -
- - )} + {activeStep === 5 && ( + <> +
+ + {t('Storage Policy Already')}{props.policy ? t('save') : t('Add to')}{t('!')} + + + {t('To use this storage policy, please go to the user group management page and bind this storage policy to the corresponding user group.')} + +
+
+ +
+ + )} - setMagicVar("")} - /> - setMagicVar("")} - /> -
+ setMagicVar("")} + /> + setMagicVar("")} + /> +
); } diff --git a/src/component/Admin/Policy/Guid/UpyunGuide.js b/src/component/Admin/Policy/Guid/UpyunGuide.js index e2ea8692..74942ee5 100644 --- a/src/component/Admin/Policy/Guid/UpyunGuide.js +++ b/src/component/Admin/Policy/Guid/UpyunGuide.js @@ -1,3 +1,5 @@ +import { useTranslation } from "react-i18next"; +import i18next from "i18next"; import Button from "@material-ui/core/Button"; import Collapse from "@material-ui/core/Collapse"; import FormControl from "@material-ui/core/FormControl"; @@ -67,23 +69,23 @@ const useStyles = makeStyles((theme) => ({ const steps = [ { - title: "存储空间", + title: i18next.t('Storage'), optional: false, }, { - title: "上传路径", + title: i18next.t('Upload Path'), optional: false, }, { - title: "直链设置", + title: i18next.t('Straight link settings'), optional: false, }, { - title: "上传限制", + title: i18next.t('Upload limit'), optional: false, }, { - title: "完成", + title: i18next.t('Finish'), optional: false, }, ]; @@ -118,6 +120,8 @@ export default function UpyunGuide(props) { } ); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setPolicy({ ...policy, @@ -176,7 +180,7 @@ export default function UpyunGuide(props) { ToggleSnackbar( "top", "right", - "存储策略已" + (props.policy ? "保存" : "添加"), + t('Storage Policy Already') + (props.policy ? t('save') : t('Add to')), "success" ); setActiveStep(5); @@ -192,718 +196,717 @@ export default function UpyunGuide(props) { }; return ( -
- - {props.policy ? "修改" : "添加"} 又拍云 存储策略 - - - {steps.map((label, index) => { - const stepProps = {}; - const labelProps = {}; - if (label.optional) { - labelProps.optional = ( - 可选 - ); - } - if (isStepSkipped(index)) { - stepProps.completed = false; - } - return ( - - {label.title} - - ); - })} - - - {activeStep === 0 && ( -
{ - e.preventDefault(); - setActiveStep(1); - }} - > -
-
-
0
-
-
- - 在使用又拍云存储策略前,请确保您在 参数设置 - - 站点信息 - 站点URL 中填写的 地址与实际相符,并且 - 能够被外网正常访问。 - -
-
- -
-
-
1
-
-
- - 前往 - - 又拍云面板 - - 创建云存储服务。 - -
-
- -
-
-
2
-
-
- - 在下方填写所创建的服务名称: - -
- - - 服务名称 - - - -
-
-
- -
-
-
3
-
-
- - 为此服务创建或授权有读取、写入、删除权限的操作员,然后将操作员信息填写在下方: - -
- - - 操作员名 - - - -
-
- - - 操作员密码 - - - -
-
-
- -
-
-
4
-
-
- - 填写为云存储服务绑定的域名,并根据实际情况选择是否使用 - HTTPS: - -
- -
-
-
- -
-
-
5
-
-
- - 此步骤可保持默认并跳过,但是强烈建议您跟随此步骤操作。 -
- 前往所创建云存储服务的 功能配置 面板,转到 - 访问配置 选项卡,开启 Token 防盗链并设定密码。 -
-
- - - - } - label="已开启 Token 防盗链" - /> - - } - label="未开启 Token 防盗链" - /> - - -
-
-
- - -
-
-
6
-
-
- - 填写您所设置的 Token 防盗链 密钥 - -
- - - Token 防盗链 密钥 - - - -
-
-
-
- -
- -
-
- )} - - {activeStep === 1 && ( -
{ - e.preventDefault(); - setActiveStep(2); - }} - > -
-
-
1
-
-
- - 请在下方输入文件的存储目录路径,可以为绝对路径或相对路径(相对于 - 从机的 - Cloudreve)。路径中可以使用魔法变量,文件在上传时会自动替换这些变量为相应值; - 可用魔法变量可参考{" "} - { - e.preventDefault(); - setMagicVar("path"); - }} - > - 路径魔法变量列表 - {" "} - 。 - -
- - - 存储目录 - - - -
-
-
- -
-
-
2
-
-
- - 是否需要对存储的物理文件进行重命名?此处的重命名不会影响最终呈现给用户的 - 文件名。文件名也可使用魔法变量, - 可用魔法变量可参考{" "} - { - e.preventDefault(); - setMagicVar("file"); - }} - > - 文件名魔法变量列表 - {" "} - 。 - -
- - - - } - label="开启重命名" - /> - - } - label="不开启" - /> - - -
- - -
- - - 命名规则 - - - -
-
-
-
- -
- - -
-
- )} - - {activeStep === 2 && ( -
{ - e.preventDefault(); - setActiveStep(3); - }} - > -
-
-
1
-
-
- - 是否允许获取文件永久直链? -
- 开启后,用户可以请求获得能直接访问到文件内容的直链,适用于图床应用或自用。 -
- -
- - { - if ( - policy.IsPrivate === "true" && - e.target.value === "true" - ) { - ToggleSnackbar( - "top", - "right", - "开启 Token 防盗链后无法使用直链功能", - "warning" - ); - return; - } - handleChange("IsOriginLinkEnable")( - e - ); - }} - row - > - - } - label="允许" - /> - - } - label="禁止" - /> - - -
-
-
- -
- {" "} - -
-
- )} - - {activeStep === 3 && ( -
{ - e.preventDefault(); - setActiveStep(4); - }} - > -
-
-
1
-
-
- - 是否限制上传的单文件大小? - - -
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - MaxSize: "10485760", - }); - } else { - setPolicy({ - ...policy, - MaxSize: "0", - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
- - -
-
-
2
-
-
- - 输入限制: - -
- -
-
-
-
- -
-
-
- {policy.MaxSize !== "0" ? "3" : "2"} -
-
-
- - 是否限制上传文件扩展名? - - -
- - { - if (e.target.value === "true") { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - file_type: - "jpg,png,mp4,zip,rar", - }, - }); - } else { - setPolicy({ - ...policy, - OptionsSerialized: { - ...policy.OptionsSerialized, - file_type: "", - }, - }); - } - }} - row - > - - } - label="限制" - /> - - } - label="不限制" - /> - - -
-
-
- - -
-
-
- {policy.MaxSize !== "0" ? "4" : "3"} -
-
-
- - 输入允许上传的文件扩展名,多个请以半角逗号 , - 隔开 - -
- - - 扩展名列表 - - - -
-
-
-
- -
- {" "} - -
-
- )} - - {activeStep === 4 && ( -
-
-
-
- - 最后一步,为此存储策略命名: - -
- - - 存储策略名 - - - -
-
-
-
- {" "} - -
-
- )} - - {activeStep === 5 && ( - <> -
- - 存储策略已{props.policy ? "保存" : "添加"}! - - - 要使用此存储策略,请到用户组管理页面,为相应用户组绑定此存储策略。 - -
-
- -
- - )} - - setMagicVar("")} - /> - setMagicVar("")} - /> -
+
+ + {props.policy ? t('Revise') : t('Add to')} {t('Shoot cloud storage strategy again')} + + + {steps.map((label, index) => { + const stepProps = {}; + const labelProps = {}; + if (label.optional) { + labelProps.optional = ( + ({t('Optional')}) + ); + } + if (isStepSkipped(index)) { + stepProps.completed = false; + } + return ( + + {label.title} + + ); + })} + + + {activeStep === 0 && ( +
{ + e.preventDefault(); + setActiveStep(1); + }} + > +
+
+
0
+
+
+ + {t( + 'Before using another cloud storage strategy, please make sure that the address you fill in the parameter settings-\nsite information-site URL matches the actual address, and ' + )} + {t('Able to be normally accessed by the external network')}{t('。')} + +
+
+ +
+
+
1
+
+
+ + {t('Go to')} + + {t('Shoot the cloud panel again')} + + {t('Create a cloud storage service.')} + +
+
+ +
+
+
2
+
+
+ + {t('Fill in the name of the created service below:')} + +
+ + + {t('service name')} + + + +
+
+
+ +
+
+
3
+
+
+ + {t('Create or authorize an operator with read, write, and delete permissions for this service, and then fill in the operator information below: ')} + +
+ + + {t('Operator Name')} + + + +
+
+ + + {t('Operator Password')} + + + +
+
+
+ +
+
+
4
+
+
+ + {t('Fill in the domain name bound to the cloud storage service, and choose whether to use\nHTTPS:')} + +
+ +
+
+
+ +
+
+
5
+
+
+ + {t('This step can be left by default and skipped, but it is strongly recommended that you follow this step.')} +
+ {t( + 'Go to the function configuration panel of the created cloud storage service, go to the\naccess configuration tab, turn on the Token anti-theft chain and set a password.' + )} +
+
+ + + + } + label={t('Token anti-theft chain is turned on')} + /> + + } + label={t('The Token anti-leech link is not turned on')} + /> + + +
+
+
+ + +
+
+
6
+
+
+ + {t('Fill in the Token anti-theft chain key you set')} + +
+ + + {t('Token anti-theft chain key')} + + + +
+
+
+
+ +
+ +
+
+ )} + + {activeStep === 1 && ( +
{ + e.preventDefault(); + setActiveStep(2); + }} + > +
+
+
1
+
+
+ + {t( + 'Please keep at least one color scheme' + )}{" "} + { + e.preventDefault(); + setMagicVar("path"); + }} + > + {t('Path Magic Variable List')} + {" "} + {t('。')} + +
+ + + {t('Storage Directory')} + + + +
+
+
+ +
+
+
2
+
+
+ + {t( + 'Does the stored physical file need to be renamed? The renaming here will not affect the\nfile name that is finally presented to the user. The file name can also use magic variables,\ncan refer to the available magic variables' + )}{" "} + { + e.preventDefault(); + setMagicVar("file"); + }} + > + {t('File name magic variable list')} + {" "} + {t('。')} + +
+ + + + } + label={t('Turn on rename')} + /> + + } + label={t('Do not open')} + /> + + +
+ + +
+ + + {t('Naming Rules')} + + + +
+
+
+
+ +
+ + +
+
+ )} + + {activeStep === 2 && ( +
{ + e.preventDefault(); + setActiveStep(3); + }} + > +
+
+
1
+
+
+ + {t('Are you allowed to obtain permanent direct links to files?')} +
+ {t('When enabled, the user can request a direct link that can directly access the content of the file, suitable for image bed applications or personal use.')} +
+ +
+ + { + if ( + policy.IsPrivate === "true" && + e.target.value === "true" + ) { + ToggleSnackbar( + "top", + "right", + t('The direct chain function cannot be used after the Token anti-leech link is turned on'), + "warning" + ); + return; + } + handleChange("IsOriginLinkEnable")( + e + ); + }} + row + > + + } + label={t('allow')} + /> + + } + label={t('prohibit')} + /> + + +
+
+
+ +
+ {" "} + +
+
+ )} + + {activeStep === 3 && ( +
{ + e.preventDefault(); + setActiveStep(4); + }} + > +
+
+
1
+
+
+ + {t('Do you want to limit the size of the uploaded single file?')} + + +
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + MaxSize: "10485760", + }); + } else { + setPolicy({ + ...policy, + MaxSize: "0", + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
+ + +
+
+
2
+
+
+ + {t('Input limit:')} + +
+ +
+
+
+
+ +
+
+
+ {policy.MaxSize !== "0" ? "3" : "2"} +
+
+
+ + {t('Do you want to restrict uploading file extensions?')} + + +
+ + { + if (e.target.value === "true") { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + file_type: + "jpg,png,mp4,zip,rar", + }, + }); + } else { + setPolicy({ + ...policy, + OptionsSerialized: { + ...policy.OptionsSerialized, + file_type: "", + }, + }); + } + }} + row + > + + } + label={t('limit')} + /> + + } + label={t('not limited')} + /> + + +
+
+
+ + +
+
+
+ {policy.MaxSize !== "0" ? "4" : "3"} +
+
+
+ + {t('Enter the file extensions allowed to upload, please use a comma for more than one file,\nseparated')} + +
+ + + {t('List of extensions')} + + + +
+
+
+
+ +
+ {" "} + +
+
+ )} + + {activeStep === 4 && ( +
+
+
+
+ + {t('The last step, name this storage policy: ')} + +
+ + + {t('Storage Policy Name')} + + + +
+
+
+
+ {" "} + +
+
+ )} + + {activeStep === 5 && ( + <> +
+ + {t('Storage Policy Already')}{props.policy ? t('save') : t('Add to')}{t('!')} + + + {t('To use this storage policy, please go to the user group management page and bind this storage policy to the corresponding user group.')} + +
+
+ +
+ + )} + + setMagicVar("")} + /> + setMagicVar("")} + /> +
); } diff --git a/src/component/Admin/Policy/Policy.js b/src/component/Admin/Policy/Policy.js index 33408fa6..c0abcf9f 100644 --- a/src/component/Admin/Policy/Policy.js +++ b/src/component/Admin/Policy/Policy.js @@ -1,3 +1,5 @@ +import { useTranslation } from "react-i18next"; +import i18next from "i18next"; import Button from "@material-ui/core/Button"; import IconButton from "@material-ui/core/IconButton"; import Menu from "@material-ui/core/Menu"; @@ -48,23 +50,23 @@ const useStyles = makeStyles((theme) => ({ const columns = [ { id: "#", label: "#", minWidth: 50 }, - { id: "name", label: "名称", minWidth: 170 }, - { id: "type", label: "类型", minWidth: 170 }, + { id: "name", label: i18next.t('Name'), minWidth: 170 }, + { id: "type", label: i18next.t('Type'), minWidth: 170 }, { id: "count", - label: "下属文件数", + label: i18next.t('Number of Subordinate Files'), minWidth: 50, align: "right", }, { id: "size", - label: "数据量", + label: i18next.t('Filesize'), minWidth: 100, align: "right", }, { id: "action", - label: "操作", + label: i18next.t('Action'), minWidth: 170, align: "right", }, @@ -92,6 +94,8 @@ export default function Policy() { const history = useHistory(); const query = useQuery(); + const { t } = useTranslation(); + const handleClick = (event) => { setAnchorEl(event.currentTarget); }; @@ -109,7 +113,7 @@ export default function Policy() { useEffect(() => { if (query.get("code") === "0") { - ToggleSnackbar("top", "right", "授权成功", "success"); + ToggleSnackbar("top", "right", t('Authorization succeeded'), "success"); } else if (query.get("msg") && query.get("msg") !== "") { ToggleSnackbar( "top", @@ -145,7 +149,7 @@ export default function Policy() { API.delete("/admin/policy/" + id) .then(() => { loadList(); - ToggleSnackbar("top", "right", "存储策略已删除", "success"); + ToggleSnackbar("top", "right", t('Storage policy has been deleted'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -155,142 +159,142 @@ export default function Policy() { const open = Boolean(anchorEl); return ( -
- setAddDialog(false)} /> -
- -
- - -
-
+
+ setAddDialog(false)} /> +
+ +
+ + +
+
- - - - - - {columns.map((column) => ( - - {column.label} - - ))} - - - - {policies.map((row) => ( - - {row.ID} - {row.Name} - - {policyTypeMap[row.Type] !== - undefined && - policyTypeMap[row.Type]} - - - {statics[row.ID] !== undefined && - statics[row.ID][0].toLocaleString()} - - - {statics[row.ID] !== undefined && - sizeToString(statics[row.ID][1])} - - - - - deletePolicy(row.ID) - } - size={"small"} - > - - - - - { - setEditID(row.ID); - handleClick(e); - }} - size={"small"} - > - - - - - - ))} - -
-
- setPage(p + 1)} - onChangeRowsPerPage={(e) => { - setPageSize(e.target.value); - setPage(1); - }} - /> -
- - { - handleClose(e); - history.push("/admin/policy/edit/pro/" + editID); - }} - > - 专家模式编辑 - - { - handleClose(e); - history.push("/admin/policy/edit/guide/" + editID); - }} - > - 向导模式编辑 - - -
+ + + + + + {columns.map((column) => ( + + {column.label} + + ))} + + + + {policies.map((row) => ( + + {row.ID} + {row.Name} + + {policyTypeMap[row.Type] !== + undefined && + policyTypeMap[row.Type]} + + + {statics[row.ID] !== undefined && + statics[row.ID][0].toLocaleString()} + + + {statics[row.ID] !== undefined && + sizeToString(statics[row.ID][1])} + + + + + deletePolicy(row.ID) + } + size={"small"} + > + + + + + { + setEditID(row.ID); + handleClick(e); + }} + size={"small"} + > + + + + + + ))} + +
+
+ setPage(p + 1)} + onChangeRowsPerPage={(e) => { + setPageSize(e.target.value); + setPage(1); + }} + /> +
+ + { + handleClose(e); + history.push("/admin/policy/edit/pro/" + editID); + }} + > + {t('Expert mode editing')} + + { + handleClose(e); + history.push("/admin/policy/edit/guide/" + editID); + }} + > + {t('Wizard mode editing')} + + +
); } diff --git a/src/component/Admin/Setting/Access.js b/src/component/Admin/Setting/Access.js index 0abc148b..15436925 100644 --- a/src/component/Admin/Setting/Access.js +++ b/src/component/Admin/Setting/Access.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Button from "@material-ui/core/Button"; import FormControl from "@material-ui/core/FormControl"; import FormControlLabel from "@material-ui/core/FormControlLabel"; @@ -49,6 +50,8 @@ export default function Access() { const [groups, setGroups] = useState([]); const [httpAlert, setHttpAlert] = useState(false); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { let value = event.target.value; if (event.target.checked !== undefined) { @@ -112,7 +115,7 @@ export default function Access() { options: option, }) .then(() => { - ToggleSnackbar("top", "right", "设置已更改", "success"); + ToggleSnackbar("top", "right", t('Settings have been changed'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -123,203 +126,204 @@ export default function Access() { }; return ( -
- setHttpAlert(false)} - open={httpAlert} - /> -
-
- - 注册与登录 - -
-
- - - } - label="允许新用户注册" - /> - - 关闭后,无法再通过前台注册新的用户 - - -
+
+ setHttpAlert(false)} + open={httpAlert} + /> + +
+ + {t('Registration and Login')} + +
+
+ + + } + label={t('Allow new users to register')} + /> + + {t('When disabled, users can no longer register through the login page')} + + +
-
- - - } - label="邮件激活" - /> - - 开启后,新用户注册需要点击邮件中的激活链接才能完成。请确认邮件发送设置是否正确,否则激活邮件无法送达 - - -
+
+ + + } + label={t('Mail activation')} + /> + + {t('When enabled, the new user registration needs to click the activation link in the email to complete. Please confirm that the email sending settings are correct, otherwise the activation email will not be delivered')} + + +
-
- - - } - label="注册验证码" - /> - - 是否启用注册表单验证码 - - -
+
+ + + } + label={t('Register Verification Code')} + /> + + {t('Whether to enable the registration form verification code')} + + +
-
- - - } - label="登录验证码" - /> - - 是否启用登录表单验证码 - - -
+
+ + + } + label={t('Login Verification Code')} + /> + + {t('Whether to enable the login form verification code')} + + +
-
- - - } - label="找回密码验证码" - /> - - 是否启用找回密码表单验证码 - - -
+
+ + + } + label={t('Retrieve password verification code')} + /> + + {t('Whether to enable the password recovery form verification code')} + + +
-
- - { - if ( - !siteURL.startsWith( - "https://" - ) - ) { - setHttpAlert(true); - return; - } - handleChange("authn_enabled")( - e - ); - }} - /> - } - label="Web Authn" - /> - - 是否允许用户使用绑定的外部验证器登录,站点必须启动 - HTTPS 才能使用。 - - -
+
+ + { + if ( + !siteURL.startsWith( + "https://" + ) + ) { + setHttpAlert(true); + return; + } + handleChange("authn_enabled")( + e + ); + }} + /> + } + label="Web Authn" + /> + + {t( + 'Whether the user is allowed to log in using the bound external authenticator, the site must use\nHTTPS before it can be used.' + )} + + +
-
- - - 默认用户组 - - - - 用户注册后的初始用户组 - - -
-
-
+
+ + + {t('Default User Group')} + + + + {t('Initial user group after user registration')} + + +
+
+
-
- -
- -
+
+ +
+ +
); } diff --git a/src/component/Admin/Setting/Aria2.js b/src/component/Admin/Setting/Aria2.js index a62f79d0..1a1623de 100644 --- a/src/component/Admin/Setting/Aria2.js +++ b/src/component/Admin/Setting/Aria2.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Button from "@material-ui/core/Button"; import FormControl from "@material-ui/core/FormControl"; import FormHelperText from "@material-ui/core/FormHelperText"; @@ -43,6 +44,8 @@ export default function Aria2() { aria2_call_timeout: "0", }); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setOptions({ ...options, @@ -91,7 +94,7 @@ export default function Aria2() { ToggleSnackbar( "top", "right", - "连接成功,Aria2 版本为:" + response.data, + t('The connection is successful, the Aria2 version is: ') + response.data, "success" ); }) @@ -117,7 +120,7 @@ export default function Aria2() { options: option, }) .then(() => { - ToggleSnackbar("top", "right", "设置已更改", "success"); + ToggleSnackbar("top", "right", t('Settings have been changed'), "success"); reload(); }) .catch((error) => { @@ -129,177 +132,174 @@ export default function Aria2() { }; return ( -
-
-
- - Aria2 - +
+ +
+ + Aria2 + -
-
- - - Cloudreve 的离线下载功能由{" "} - - Aria2 - {" "} - 驱动。如需使用,请在同一设备上以和运行 - Cloudreve 相同的用户身份启动 Aria2, 并在 - Aria2 的配置文件中开启 RPC - 服务。更多信息及指引请参考文档的{" "} - - 离线下载 - {" "} - 章节。 - - -
+
+
+ + + {t('Cloudreve\'s offline download function is controlled by')}{" "} + + Aria2 + {" "} + {t( + 'Driver. If you need to use it, please start Aria2 on the same device as the user running\nCloudreve, and enable the RPC\nservice in the configuration file of\nAria2. For more information and instructions, please refer to the docs' + )}{" "} + + {t('Offline download')} + {" "} + {t('chapter.')} + + +
-
- - - RPC 服务器地址 - - - - 包含端口的完整 RPC - 服务器地址,例如:http://127.0.0.1:6800/,留空表示不启用 - Aria2 服务 - - -
+
+ + + {t('RPC server address')} + + + + {t( + 'The complete RPC\nserver address including the port, for example: http://127.0.0.1:6800/, leave it blank to not enable the\nAria2 service' + )} + + +
-
- - - RPC Secret - - - - RPC 授权令牌,与 Aria2 - 配置文件中保持一致,未设置请留空。 - - -
+
+ + + RPC Secret + + + + {t('RPC authorization token, consistent with the Aria2\nconfiguration file, please leave it blank if it is not set.')} + + +
-
- - - 临时下载目录 - - - - 离线下载临时下载目录的 - 绝对路径,Cloudreve - 进程需要此目录的读、写、执行权限。 - - -
+
+ + + {t('Temporary Download Directory')} + + + + {t('Offline download of the temporary download directory')} + {t('Absolute path')}{t(', the Cloudreve\nprocess requires read, write, and execute permissions for this directory.')} + + +
-
- - - 状态刷新间隔 (秒) - - - - Cloudreve 向 Aria2 请求刷新任务状态的间隔。 - - -
+
+ + + {t('Status refresh interval (seconds)')} + + + + {t('The interval at which Cloudreve requests Aria2 to refresh the task status.')} + + +
-
- - - RPC 调用超时 (秒) - - - - 调用 RPC 服务时最长等待时间 - - -
+
+ + + {t('RPC call timeout (seconds)')} + + + + {t('The longest waiting time when calling RPC service')} + + +
-
- - - 全局任务参数 - - - - 创建下载任务时携带的额外设置参数,以 JSON - 编码后的格式书写,您可也可以将这些设置写在 - Aria2 配置文件里,可用参数请查阅官方文档 - - -
-
-
+
+ + + {t('Global Task Parameters')} + + + + {t( + 'The additional setting parameters carried when creating a download task are written in JSON\nencoded format. You can also write these settings in the\nAria2 configuration file. For available parameters, please refer to the official documentation' + )} + + +
+
+
-
- - -
- -
+
+ + +
+ +
); } diff --git a/src/component/Admin/Setting/Captcha.js b/src/component/Admin/Setting/Captcha.js index 349461fc..d24d28c1 100644 --- a/src/component/Admin/Setting/Captcha.js +++ b/src/component/Admin/Setting/Captcha.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback, useEffect, useState } from "react"; import { makeStyles } from "@material-ui/core/styles"; import Typography from "@material-ui/core/Typography"; @@ -49,6 +50,8 @@ export default function Captcha() { captcha_TCaptcha_SecretKey: "", }); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setOptions({ ...options, @@ -90,7 +93,7 @@ export default function Captcha() { options: option, }) .then(() => { - ToggleSnackbar("top", "right", "设置已更改", "success"); + ToggleSnackbar("top", "right", t('Settings have been changed'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -101,308 +104,308 @@ export default function Captcha() { }; return ( -
-
-
- - 验证码 - -
-
- - - 验证码类型 - - - - 验证码类型 - - -
-
-
+
+ +
+ + {t('Verification Code')} + +
+
+ + + {t('Verification Code Type')} + + + + {t('Verification Code Type')} + + +
+
+
- {options.captcha_type === "normal" && ( -
- - 普通验证码 - -
-
- - - 宽度 - - - -
+ {options.captcha_type === "normal" && ( +
+ + {t('General Verification Code')} + +
+
+ + + {t('width')} + + + +
-
- - - 高度 - - - -
+
+ + + {t('high')} + + + +
-
- - - 模式 - - - - 验证码的形式 - - -
-
-
- )} +
+ + + {t('model')} + + + + {t('Verification code form')} + + +
+
+
+ )} - {options.captcha_type === "recaptcha" && ( -
- - reCAPTCHA V2 - -
-
-
- - - Site KEY - - - - - 应用管理页面 - {" "} - 获取到的的 网站密钥 - - -
+ {options.captcha_type === "recaptcha" && ( +
+ + reCAPTCHA V2 + +
+
+
+ + + Site KEY + + + + + {t('Application Management Page')} + {" "} + {t('The obtained website key')} + + +
-
- - - Secret - - + + + Secret + + + + - - - 应用管理页面 - {" "} - 获取到的的 秘钥 - - -
-
-
-
- )} + target={"_blank"} + > + {t('Application Management Page')} + {" "} + {t('The obtained secret key')} + + +
+
+
+
+ )} - {options.captcha_type === "tcaptcha" && ( -
- - 腾讯云验证码 - -
-
-
- - - SecretId - - + + {t('Tencent Cloud Verification Code')} + +
+
+
+ + + SecretId + + + + - - - 访问密钥页面 - {" "} - 获取到的的 SecretId - - -
+ target={"_blank"} + > + {t('Access Key Page')} + {" "} + {t('The obtained SecretId')} + + +
-
- - - SecretKey - - + + + SecretKey + + + + - - - 访问密钥页面 - {" "} - 获取到的的 SecretKey - - -
+ target={"_blank"} + > + {t('Access Key Page')} + {" "} + {t('The obtained SecretKey')} + + +
-
- - - APPID - - + + + APPID + + + + - - - 图形验证页面 - {" "} - 获取到的的 APPID - - -
+ target={"_blank"} + > + {t('Graphic verification page')} + {" "} + {t('The obtained APPID')} + +
+
-
- - - App Secret Key - - + + + App Secret Key + + + + - - - 图形验证页面 - {" "} - 获取到的的 App Secret Key - - -
-
-
-
- )} + target={"_blank"} + > + {t('Graphic verification page')} + {" "} + {t('The obtained App Secret Key')} + + +
+
+
+
+ )} -
- -
- -
+
+ +
+ +
); } diff --git a/src/component/Admin/Setting/Image.js b/src/component/Admin/Setting/Image.js index b8cac0df..0f222c4a 100644 --- a/src/component/Admin/Setting/Image.js +++ b/src/component/Admin/Setting/Image.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Button from "@material-ui/core/Button"; import FormControl from "@material-ui/core/FormControl"; import FormHelperText from "@material-ui/core/FormHelperText"; @@ -44,6 +45,8 @@ export default function ImageSetting() { thumb_height: "", }); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setOptions({ ...options, @@ -85,7 +88,7 @@ export default function ImageSetting() { options: option, }) .then(() => { - ToggleSnackbar("top", "right", "设置已更改", "success"); + ToggleSnackbar("top", "right", t('Settings have been changed'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -96,175 +99,175 @@ export default function ImageSetting() { }; return ( -
-
-
- - 头像 - -
-
- - - Gravatar 服务器 - - - - Gravatar 服务器地址,可选择使用国内镜像 - - -
+
+ +
+ + {t('Avatar')} + +
+
+ + + {t('Gravatar Server')} + + + + {t('Gravatar server address, you can choose to use domestic mirror')} + + +
-
- - - 头像存储路径 - - - - 用户上传自定义头像的存储路径 - - -
+
+ + + {t('Portrait storage path')} + + + + {t('The storage path of the user uploaded custom avatar')} + + +
-
- - - - 用户可上传头像文件的最大大小 - - -
+
+ + + + {t('The maximum size of the avatar file that the user can upload')} + + +
-
- - - 小头像尺寸 - - - -
+
+ + + {t('Small avatar size')} + + + +
-
- - - 中头像尺寸 - - - -
+
+ + + {t('Medium avatar size')} + + + +
-
- - - 大头像尺寸 - - - -
-
-
+
+ + + {t('Large Avatar Size')} + + + +
+
+
-
- - 缩略图 - +
+ + {t('Thumbnail')} + -
-
- - - 宽度 - - - -
-
+
+
+ + + {t('width')} + + + +
+
-
-
- - - 高度 - - - -
-
-
+
+
+ + + {t('high')} + + + +
+
+
-
- -
- -
+
+ +
+ +
); } diff --git a/src/component/Admin/Setting/Mail.js b/src/component/Admin/Setting/Mail.js index 74c75fc0..a32d4c9a 100644 --- a/src/component/Admin/Setting/Mail.js +++ b/src/component/Admin/Setting/Mail.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Button from "@material-ui/core/Button"; import Dialog from "@material-ui/core/Dialog"; import DialogActions from "@material-ui/core/DialogActions"; @@ -59,6 +60,8 @@ export default function Mail() { mail_reset_pwd_template: "", }); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setOptions({ ...options, @@ -103,7 +106,7 @@ export default function Mail() { to: tesInput, }) .then(() => { - ToggleSnackbar("top", "right", "测试邮件已发送", "success"); + ToggleSnackbar("top", "right", t('Test mail has been sent'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -138,7 +141,7 @@ export default function Mail() { options: option, }) .then(() => { - ToggleSnackbar("top", "right", "设置已更改", "success"); + ToggleSnackbar("top", "right", t('Settings have been changed'), "success"); reload(); }) .catch((error) => { @@ -150,284 +153,283 @@ export default function Mail() { }; return ( -
- setTest(false)} - aria-labelledby="form-dialog-title" - > - 发件测试 - - - - 发送测试邮件前,请先保存已更改的邮件设置; - - - 邮件发送结果不会立即反馈,如果您长时间未收到测试邮件,请检查 - Cloudreve 在终端输出的错误日志。 - - - setTestInput(e.target.value)} - type="email" - fullWidth - /> - - - - - - +
+ setTest(false)} + aria-labelledby="form-dialog-title" + > + {t('Sending Test')} + + + + {t('Before sending a test mail, please save the changed mail settings;')} + + + {t( + 'The result of the email will not be reported immediately. If you have not received the test email for a long time, please check the error log output by\nCloudreve in the terminal.' + )} + + + setTestInput(e.target.value)} + type="email" + fullWidth + /> + + + + + + -
-
- - 发信 - + +
+ + {t('Send a letter')} + -
-
- - - 发件人名 - - - - 邮件中展示的发件人姓名 - - -
+
+
+ + + {t('Sender\'s name')} + + + + {t('The sender\'s name shown in the message')} + + +
-
- - - 发件人邮箱 - - - - 发件邮箱的地址 - - -
+
+ + + {t('Sender\'s mailbox')} + + + + {t('The address of the sending mailbox')} + + +
-
- - - SMTP 服务器 - - - - 发件服务器地址,不含端口号 - - -
+
+ + + {t('SMTP server')} + + + + {t('Sending server address without port number')} + + +
-
- - - SMTP 端口 - - - - 发件服务器地址端口号 - - -
+
+ + + {t('SMTP port')} + + + + {t('Sending server address port number')} + + +
-
- - - SMTP 用户名 - - - - 发信邮箱用户名,一般与邮箱地址相同 - - -
+
+ + + {t('SMTP username')} + + + + {t('The user name of the sending mailbox, generally the same as the mailbox address')} + + +
-
- - - SMTP 密码 - - - - 发信邮箱密码 - - -
+
+ + + {t('SMTP password')} + + + + {t('Send Mail Password')} + + +
-
- - - 回信邮箱 - - - - 用户回复系统发送的邮件时,用于接收回信的邮箱 - - -
+
+ + + {t('Reply mailbox')} + + + + {t('The mailbox used to receive the reply when the user responds to the email sent by the system')} + + +
-
- - - } - label="强制使用 SSL 连接" - /> - - 是否强制使用 SSL - 加密连接。如果无法发送邮件,可关闭此项, - Cloudreve 会尝试使用 STARTTLS - 并决定是否使用加密连接 - - -
+
+ + + } + label={t('Enforce SSL connection')} + /> + + {t( + 'Whether to force the use of SSL\nencrypted connection. If you cannot send mail, you can turn this off,\nCloudreve will try to use STARTTLS\nand decide whether to use encrypted connection' + )} + + +
-
- - - SMTP 连接有效期 (秒) - - - - 有效期内建立的 SMTP - 连接会被新邮件发送请求复用 - - -
-
-
+
+ + + {t('SMTP connection validity period (seconds)')} + + + + {t('The SMTP\nconnection established within the validity period will be reused by new mail sending requests')} + + +
+
+
-
- - 邮件模板 - +
+ + {t('Mail Template')} + -
-
- - - 新用户激活 - - - - 新用户注册后激活邮件的模板 - - -
+
+
+ + + {t('New user activation')} + + + + {t('Activate email template after registration for new users')} + + +
-
- - - 重置密码 - - - - 密码重置邮件模板 - - -
-
-
+
+ + + {t('reset Password')} + + + + {t('Password reset email template')} + + +
+
+
-
- - {" "} - -
-
-
+
+ + {" "} + +
+ +
); } diff --git a/src/component/Admin/Setting/SiteInformation.js b/src/component/Admin/Setting/SiteInformation.js index 21fbb5df..5f693167 100644 --- a/src/component/Admin/Setting/SiteInformation.js +++ b/src/component/Admin/Setting/SiteInformation.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Button from "@material-ui/core/Button"; import FormControl from "@material-ui/core/FormControl"; import FormHelperText from "@material-ui/core/FormHelperText"; @@ -49,6 +50,8 @@ export default function SiteInformation() { pwa_background_color: "", }); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setOptions({ ...options, @@ -90,7 +93,7 @@ export default function SiteInformation() { options: option, }) .then(() => { - ToggleSnackbar("top", "right", "设置已更改", "success"); + ToggleSnackbar("top", "right", t('Settings have been changed'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -101,223 +104,224 @@ export default function SiteInformation() { }; return ( -
-
-
- - 基本信息 - -
-
- - - 主标题 - - - - 站点的主标题 - - -
-
- - - 副标题 - - - - 站点的副标题 - - -
-
- - - 站点描述 - - - - 站点描述信息,可能会在分享页面摘要内展示 - - -
-
- - - 站点URL - - - - 非常重要,请确保与实际情况一致。使用云存储策略、支付平台时,请填入可以被外网访问的地址。 - - -
-
- - - 网站备案号 - - - - 工信部网站ICP备案号 - - -
-
- - - 页脚代码 - - - - 在页面底部插入的自定义HTML代码 - - -
-
-
-
- - 渐进式应用 (PWA) - -
-
- - - 小图标 - - - - 扩展名为 ico 的小图标地址 - - -
-
- - - 中图标 - - - - 192x192 的中等图标地址,png 格式 - - -
-
- - - 大图标 - - - - 512x512 的大图标地址,png 格式 - - -
-
- - - 展示模式 - - - - PWA 应用添加后的展示模式 - - -
-
- - - 主题色 - - - - CSS 色值,影响 PWA - 启动画面上状态栏、内容页中状态栏、地址栏的颜色 - - -
-
-
-
- - - 背景色 - - - - CSS 色值 - - -
-
-
-
- -
-
-
+
+
+
+ + {t('Basic Information')} + +
+
+ + + {t('Main title')} + + + + {t('The main title of the site')} + + +
+
+ + + {t('subtitle')} + + + + {t('Subtitle of the site')} + + +
+
+ + + {t('Site Description')} + + + + {t('Site description information may be displayed in the summary of the sharing page')} + + +
+
+ + + {t('Site URL')} + + + + {t('Very important, please ensure that it is consistent with the actual situation. When using cloud storage strategies and payment platforms, please fill in an address that can be accessed by the external network.')} + + +
+
+ + + {t('Website record number')} + + + + {t('Ministry of Industry and Information Technology website ICP record number')} + + +
+
+ + + {t('Footer Code')} + + + + {t('Custom HTML code inserted at the bottom of the page')} + + +
+
+
+
+ + {t('Progressive Web App (PWA)')} + +
+
+ + + {t('Small Icon')} + + + + {t('The address of the small icon with the extension ico')} + + +
+
+ + + {t('Medium Icon')} + + + + {t('192x192 medium icon address, png format')} + + +
+
+ + + {t('Large Icon')} + + + + {t('512x512 large icon address, png format')} + + +
+
+ + + {t('Display Mode')} + + + + {t('Display mode after PWA application is added')} + + +
+
+ + + {t('Theme Color')} + + + + {t( + 'CSS color value affects the color of the status bar on the startup screen, the status bar in the content page, and the address bar on the PWA\n' + )} + + +
+
+
+
+ + + {t('Background color')} + + + + {t('CSS color value')} + + +
+
+
+
+ +
+
+
); } diff --git a/src/component/Admin/Setting/Theme.js b/src/component/Admin/Setting/Theme.js index 4fa1ecc2..b594daae 100644 --- a/src/component/Admin/Setting/Theme.js +++ b/src/component/Admin/Setting/Theme.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Button from "@material-ui/core/Button"; import FormControl from "@material-ui/core/FormControl"; import FormHelperText from "@material-ui/core/FormHelperText"; @@ -71,13 +72,15 @@ export default function Theme() { [dispatch] ); + const { t } = useTranslation(); + const deleteTheme = (color) => { if (color === options.defaultTheme) { - ToggleSnackbar("top", "right", "不能删除默认配色", "warning"); + ToggleSnackbar("top", "right", t('Cannot delete the default color scheme'), "warning"); return; } if (Object.keys(theme).length <= 1) { - ToggleSnackbar("top", "right", "请至少保留一个配色方案", "warning"); + ToggleSnackbar("top", "right", t('Please keep at least one color scheme'), "warning"); return; } const themeCopy = { ...theme }; @@ -95,7 +98,7 @@ export default function Theme() { ToggleSnackbar( "top", "right", - "主色调不能与已有配色重复", + t('The main color cannot be repeated with the existing color matching'), "warning" ); return; @@ -157,7 +160,7 @@ export default function Theme() { options: option, }) .then(() => { - ToggleSnackbar("top", "right", "设置已更改", "success"); + ToggleSnackbar("top", "right", t('Settings have been changed'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -168,279 +171,279 @@ export default function Theme() { }; return ( -
-
-
- - 主题配色 - -
-
- - - - 关键色 - 色彩配置 - 操作 - - - - {Object.keys(theme).map((k) => ( - - -
-
-
-
- - - { - setThemeConfig({ - ...themeConfig, - [k]: e.target.value, - }); - }} - onBlur={(e) => { - try { - const res = JSON.parse( - e.target.value - ); - if ( - !( - "palette" in - res - ) || - !( - "primary" in - res.palette - ) || - !( - "main" in - res.palette - .primary - ) || - !( - "secondary" in - res.palette - ) || - !( - "main" in - res.palette - .secondary - ) - ) { - throw e; - } - setTheme({ - ...theme, - [k]: res, - }); - } catch (e) { - setThemeConfigError( - { - ...themeConfigError, - [k]: true, - } - ); - return; - } - setThemeConfigError({ - ...themeConfigError, - [k]: false, - }); - }} - value={themeConfig[k]} - /> - - - - deleteTheme(k) - } - > - - - - - ))} - -
-
- +
+ + + {t('The complete configuration items are available in ')}{" "} + - 新建配色方案 - -
- - - 完整的配置项可在{" "} - - 默认主题 - Material-UI - {" "} - 查阅。 - - -
+ {t('Default Theme-Material-UI')} + {" "} + {t('View.')} + + +
-
- - - 默认配色 - - - - 用户未指定偏好配色时,站点默认使用的配色方案 - - -
-
-
+
+ + + {t('Default color scheme')} + + + + {t('When the user does not specify a color preference, the color scheme used by the site by default')} + + +
+
+
-
- - 界面 - +
+ + {t('Interface')} + -
-
- - - 个人文件列表默认样式 - - - - 用户未指定偏好样式时,个人文件页面列表默认样式 - - -
-
+
+
+ + + {t('Personal file list default style')} + + + + {t('When the user does not specify a preferred style, the default style of the personal file page list')} + + +
+
-
-
- - - 目录分享页列表默认样式 - - - - 用户未指定偏好样式时,目录分享页面的默认样式 - - -
-
-
+
+
+ + + {t('The default style of the directory sharing page list')} + + + + {t('When the user does not specify a preferred style, the default style of the directory sharing page')} + + +
+
+
-
- -
- +
+ +
+ - setCreate(false)} - /> -
+ setCreate(false)} + /> +
); } diff --git a/src/component/Admin/Setting/UploadDownload.js b/src/component/Admin/Setting/UploadDownload.js index 27a2f45c..d91dff91 100644 --- a/src/component/Admin/Setting/UploadDownload.js +++ b/src/component/Admin/Setting/UploadDownload.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Button from "@material-ui/core/Button"; import FormControl from "@material-ui/core/FormControl"; import FormControlLabel from "@material-ui/core/FormControlLabel"; @@ -55,6 +56,8 @@ export default function UploadDownload() { onedrive_source_timeout: "0", }); + const { t } = useTranslation(); + const handleCheckChange = (name) => (event) => { const value = event.target.checked ? "1" : "0"; setOptions({ @@ -104,7 +107,7 @@ export default function UploadDownload() { options: option, }) .then(() => { - ToggleSnackbar("top", "right", "设置已更改", "success"); + ToggleSnackbar("top", "right", t('Settings have been changed'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -115,390 +118,393 @@ export default function UploadDownload() { }; return ( -
-
-
- - 存储与传输 - -
-
- - - Worker 数量 - - - - 任务队列最多并行执行的任务数,保存后需要重启 - Cloudreve 生效 - - -
+
+ +
+ + {t('Storage and Transmission')} + +
+
+ + + {t('Number of Workers')} + + + + {t('The maximum number of tasks executed in parallel in the task queue. After saving, you need to restart\nCloudreve to take effect')} + + +
-
- - - 中转并行传输 - - - - 任务队列中转任务传输时,最大并行协程数 - - -
+
+ + + {t('Transit Parallel Transmission')} + + + + {t('The maximum number of parallel coroutines when transferring tasks in the task queue')} + + +
-
- - - 临时目录 - - - - 用于存放打包下载、解压缩、压缩等任务产生的临时文件的目录路径 - - -
+
+ + + {t('Temporary Directory')} + + + + {t('The directory path used to store temporary files generated by tasks such as package download, decompression, compression, etc.')} + + +
-
- - - - 文本文件可在线编辑的最大大小,超出此大小的文件无法在线编辑 - - -
+
+ + + + {t('The maximum size of a text file that can be edited online. Files beyond this size cannot be edited online')} + + +
-
- - - OneDrive 分片错误重试 - - - - OneDrive - 存储策略分片上传失败后重试的最大次数,只适用于服务端上传或中转 - - -
+
+ + + {t('OneDrive fragmentation error retry')} + + + + {t( + 'OneDrive\nThe maximum number of retries after a failed upload of storage policy fragments, only applicable to server uploads or transfers' + )} + + +
-
- - - } - label="上传校验失败时强制重置连接" - /> - - 开启后,如果本次策略、头像等数据上传校验失败,服务器会强制重置连接 - - -
-
-
+
+ + + } + label={t('Forcibly reset the connection when upload verification fails')} + /> + + {t('When enabled, if the data upload verification of this policy, avatar, etc. fails, the server will forcibly reset the connection')} + + +
+
+
-
- - 有效期 (秒) - +
+ + {t('Validity period (seconds)')} + -
-
- - - 打包下载 - - - -
+
+
+ + + {t('Download package')} + + + +
-
- - - 下载会话 - - - -
+
+ + + {t('Download Session')} + + + +
-
- - - 预览链接 - - - -
+
+ + + {t('Preview link')} + + + +
-
- - - Office 文档预览连接 - - - -
+
+ + + {t('Office Document Preview Connection')} + + + +
-
- - - 上传凭证 - - - -
+
+ + + {t('upload certificate')} + + + +
-
- - - 上传会话 - - - - 超出后不再处理此上传的回调请求 - - -
+
+ + + {t('Upload session')} + + + + {t('After exceeding this upload callback request will not be processed')} + + +
-
- - - 从机API请求 - - - -
+
+ + + {t('Slave API request')} + + + +
-
- - - 分享下载会话 - - - - 设定时间内重复下载分享文件,不会被记入总下载次数 - - -
+
+ + + {t('Share download session')} + + + + {t('Repetitive downloading of shared files within the set time will not be counted in the total number of downloads')} + + +
-
- - - OneDrive 客户端上传监控间隔 - - - - 每间隔所设定时间,Cloudreve 会向 OneDrive - 请求检查客户端上传情况已确保客户端上传可控 - - -
+
+ + + {t('OneDrive client upload monitoring interval')} + + + + {t( + 'Every set time interval, Cloudreve will ask OneDrive\nto check the customer The client upload situation has ensured that the client upload is controllable' + )} + + +
-
- - - OneDrive 回调等待 - - - - OneDrive - 客户端上传完成后,等待回调的最大时间,如果超出会被认为上传失败 - - -
+
+ + + {t('OneDrive callback waiting')} + + + + {t( + 'OneDrive\nThe maximum time to wait for the callback after the client upload is completed, if it exceeds, the upload will be considered failed' + )} + + +
-
- - - OneDrive 下载请求缓存 - - - - OneDrive 获取文件下载 URL - 后可将结果缓存,减轻热门文件下载API请求频率 - - -
-
-
+
+ + + {t('OneDrive download request cache')} + + + + {t( + 'OneDrive can cache the results after obtaining the file download URL\n, reducing the frequency of popular file download API requests' + )} + + +
+
+
-
- -
- -
+
+ +
+ +
); } diff --git a/src/component/Admin/Share/Share.js b/src/component/Admin/Share/Share.js index e3361568..6063b908 100644 --- a/src/component/Admin/Share/Share.js +++ b/src/component/Admin/Share/Share.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import { lighten } from "@material-ui/core"; import Badge from "@material-ui/core/Badge"; import Button from "@material-ui/core/Button"; @@ -90,6 +91,9 @@ export default function Share() { dispatch(toggleSnackbar(vertical, horizontal, msg, color)), [dispatch] ); + + const { t } = useTranslation(); + const loadList = () => { API.post("/admin/share/list", { page: page, @@ -119,7 +123,7 @@ export default function Share() { API.post("/admin/share/delete", { id: [id] }) .then(() => { loadList(); - ToggleSnackbar("top", "right", "分享已删除", "success"); + ToggleSnackbar("top", "right", t('Share deleted'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -134,7 +138,7 @@ export default function Share() { API.post("/admin/share/delete", { id: selected }) .then(() => { loadList(); - ToggleSnackbar("top", "right", "分享已删除", "success"); + ToggleSnackbar("top", "right", t('Share deleted'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -176,312 +180,312 @@ export default function Share() { const isSelected = (id) => selected.indexOf(id) !== -1; return ( -
- setFilterDialog(false)} - setSearch={setSearch} - setFilter={setFilter} - /> -
-
- - setFilterDialog(true)} - > - - - - - - -
-
+
+ setFilterDialog(false)} + setSearch={setSearch} + setFilter={setFilter} + /> +
+
+ + setFilterDialog(true)} + > + + + + + + +
+
- - {selected.length > 0 && ( - - - 已选择 {selected.length} 个对象 - - - - - - - - )} - - - - - - 0 && - selected.length < shares.length - } - checked={ - shares.length > 0 && - selected.length === shares.length - } - onChange={handleSelectAllClick} - inputProps={{ - "aria-label": "select all desserts", - }} - /> - - - - setOrderBy([ - "id", - orderBy[1] === "asc" - ? "desc" - : "asc", - ]) - } - > - # - {orderBy[0] === "id" ? ( - - {orderBy[1] === "desc" - ? "sorted descending" - : "sorted ascending"} - - ) : null} - - - - - setOrderBy([ - "source_name", - orderBy[1] === "asc" - ? "desc" - : "asc", - ]) - } - > - 对象名 - {orderBy[0] === "source_name" ? ( - - {orderBy[1] === "desc" - ? "sorted descending" - : "sorted ascending"} - - ) : null} - - - - 类型 - - - - setOrderBy([ - "views", - orderBy[1] === "asc" - ? "desc" - : "asc", - ]) - } - > - 浏览 - {orderBy[0] === "views" ? ( - - {orderBy[1] === "desc" - ? "sorted descending" - : "sorted ascending"} - - ) : null} - - - - - setOrderBy([ - "downloads", - orderBy[1] === "asc" - ? "desc" - : "asc", - ]) - } - > - 下载 - {orderBy[0] === "downloads" ? ( - - {orderBy[1] === "desc" - ? "sorted descending" - : "sorted ascending"} - - ) : null} - - - - 自动过期 - - - 分享者 - - - 分享于 - - - 操作 - - - - - {shares.map((row) => ( - - - - handleClick(event, row.ID) + + {selected.length > 0 && ( + + + {t('selected')} {selected.length} {t('Objects')} + + + + + + + + )} + +
+ + + + 0 && + selected.length < shares.length + } + checked={ + shares.length > 0 && + selected.length === shares.length + } + onChange={handleSelectAllClick} + inputProps={{ + "aria-label": "select all desserts", + }} + /> + + + + setOrderBy([ + "id", + orderBy[1] === "asc" + ? "desc" + : "asc", + ]) + } + > + # + {orderBy[0] === "id" ? ( + + {orderBy[1] === "desc" + ? "sorted descending" + : "sorted ascending"} + + ) : null} + + + + + setOrderBy([ + "source_name", + orderBy[1] === "asc" + ? "desc" + : "asc", + ]) + } + > + {t('Object name')} + {orderBy[0] === "source_name" ? ( + - - {row.ID} - - + ) : null} + + + + {t('Type')} + + + + setOrderBy([ + "views", + orderBy[1] === "asc" + ? "desc" + : "asc", + ]) + } + > + {t('Browse')} + {orderBy[0] === "views" ? ( + - {row.SourceName} - - - - {row.Password === "" ? "公开" : "私密"} - - - {row.Views} - - - {row.Downloads} - - - {row.RemainDownloads > -1 && - row.RemainDownloads + " 次下载后"} - {row.RemainDownloads === -1 && "无"} - - - + ) : null} + + + + + setOrderBy([ + "downloads", + orderBy[1] === "asc" + ? "desc" + : "asc", + ]) + } + > + {t('download')} + {orderBy[0] === "downloads" ? ( + - {users[row.UserID] - ? users[row.UserID].Nick - : "未知"} - - - - {formatLocalTime( - row.CreatedAt, - "YYYY-MM-DD H:mm:ss" - )} - - - - - deletePolicy(row.ID) - } - size={"small"} - > - - - - - - ))} - -
-
- setPage(p + 1)} - onChangeRowsPerPage={(e) => { - setPageSize(e.target.value); - setPage(1); - }} - /> -
-
+ {orderBy[1] === "desc" + ? "sorted descending" + : "sorted ascending"} + + ) : null} + + + + {t('Automatically expire')} + + + {t('Sharer')} + + + {t('Share on')} + + + {t('Action')} + + + + + {shares.map((row) => ( + + + + handleClick(event, row.ID) + } + checked={isSelected(row.ID)} + /> + + {row.ID} + + + + {row.Views} + + + {row.Downloads} + + + {row.RemainDownloads > -1 && + row.RemainDownloads + t('After downloads')} + {row.RemainDownloads === -1 && t('without')} + + + + {users[row.UserID] + ? users[row.UserID].Nick + : t('unknown')} + + + + {formatLocalTime( + row.CreatedAt, + "YYYY-MM-DD H:mm:ss" + )} + + + + + deletePolicy(row.ID) + } + size={"small"} + > + + + + + + ))} + + + + setPage(p + 1)} + onChangeRowsPerPage={(e) => { + setPageSize(e.target.value); + setPage(1); + }} + /> + +
); } diff --git a/src/component/Admin/Task/Download.js b/src/component/Admin/Task/Download.js index 6272590d..40e35547 100644 --- a/src/component/Admin/Task/Download.js +++ b/src/component/Admin/Task/Download.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import { lighten } from "@material-ui/core"; import Button from "@material-ui/core/Button"; import Checkbox from "@material-ui/core/Checkbox"; @@ -90,6 +91,8 @@ export default function Download() { [dispatch] ); + const { t } = useTranslation(); + const loadList = () => { API.post("/admin/download/list", { page: page, @@ -118,7 +121,7 @@ export default function Download() { API.post("/admin/download/delete", { id: [id] }) .then(() => { loadList(); - ToggleSnackbar("top", "right", "任务已删除", "success"); + ToggleSnackbar("top", "right", t('Task has been deleted'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -133,7 +136,7 @@ export default function Download() { API.post("/admin/download/delete", { id: selected }) .then(() => { loadList(); - ToggleSnackbar("top", "right", "任务已删除", "success"); + ToggleSnackbar("top", "right", t('Task has been deleted'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -175,223 +178,223 @@ export default function Download() { const isSelected = (id) => selected.indexOf(id) !== -1; return ( -
- setFilterDialog(false)} - setSearch={setSearch} - setFilter={setFilter} - /> -
-
- -
-
+
+ setFilterDialog(false)} + setSearch={setSearch} + setFilter={setFilter} + /> +
+
+ +
+
- - {selected.length > 0 && ( - - - 已选择 {selected.length} 个对象 - - - - - - - - )} - - - - - - 0 && - selected.length < downloads.length - } - checked={ - downloads.length > 0 && - selected.length === downloads.length - } - onChange={handleSelectAllClick} - inputProps={{ - "aria-label": "select all desserts", - }} - /> - - - - setOrderBy([ - "id", - orderBy[1] === "asc" - ? "desc" - : "asc", - ]) - } - > - # - {orderBy[0] === "id" ? ( - - {orderBy[1] === "desc" - ? "sorted descending" - : "sorted ascending"} - - ) : null} - - - - 源地址 - - - 状态 - - - - setOrderBy([ - "total_size", - orderBy[1] === "asc" - ? "desc" - : "asc", - ]) - } - > - 大小 - {orderBy[0] === "total_size" ? ( - - {orderBy[1] === "desc" - ? "sorted descending" - : "sorted ascending"} - - ) : null} - - - - 创建者 - - - 创建于 - - - 操作 - - - - - {downloads.map((row) => ( - - - - handleClick(event, row.ID) - } - checked={isSelected(row.ID)} - /> - - {row.ID} - - {row.Source} - - - {row.Status === 0 && "就绪"} - {row.Status === 1 && "下载中"} - {row.Status === 2 && "暂停中"} - {row.Status === 3 && "出错"} - {row.Status === 4 && "完成"} - {row.Status === 5 && "取消/停止"} - {row.Status === 6 && "未知"} - - - {sizeToString(row.TotalSize)} - - - + {selected.length > 0 && ( + + + {t('selected')} {selected.length} {t('Objects')} + + + + + + + + )} + +
+ + + + 0 && + selected.length < downloads.length + } + checked={ + downloads.length > 0 && + selected.length === downloads.length + } + onChange={handleSelectAllClick} + inputProps={{ + "aria-label": "select all desserts", + }} + /> + + + + setOrderBy([ + "id", + orderBy[1] === "asc" + ? "desc" + : "asc", + ]) + } + > + # + {orderBy[0] === "id" ? ( + + {orderBy[1] === "desc" + ? "sorted descending" + : "sorted ascending"} + + ) : null} + + + + {t('source address')} + + + {t('state')} + + + + setOrderBy([ + "total_size", + orderBy[1] === "asc" + ? "desc" + : "asc", + ]) + } + > + {t('Size')} + {orderBy[0] === "total_size" ? ( + - {users[row.UserID] - ? users[row.UserID].Nick - : "未知"} - - - - {formatLocalTime( - row.CreatedAt, - "YYYY-MM-DD H:mm:ss" - )} - - - - - deletePolicy(row.ID) - } - size={"small"} - > - - - - - - ))} - -
-
- setPage(p + 1)} - onChangeRowsPerPage={(e) => { - setPageSize(e.target.value); - setPage(1); - }} - /> -
-
+ {orderBy[1] === "desc" + ? "sorted descending" + : "sorted ascending"} + + ) : null} + + + + {t('creator')} + + + {t('Built in')} + + + {t('Action')} + + + + + {downloads.map((row) => ( + + + + handleClick(event, row.ID) + } + checked={isSelected(row.ID)} + /> + + {row.ID} + + {row.Source} + + + {row.Status === 0 && t('Ready')} + {row.Status === 1 && t('downloading')} + {row.Status === 2 && t('Pause')} + {row.Status === 3 && t('Error')} + {row.Status === 4 && t('Finish')} + {row.Status === 5 && t('Cancel/Stop')} + {row.Status === 6 && t('unknown')} + + + {sizeToString(row.TotalSize)} + + + + {users[row.UserID] + ? users[row.UserID].Nick + : t('unknown')} + + + + {formatLocalTime( + row.CreatedAt, + "YYYY-MM-DD H:mm:ss" + )} + + + + + deletePolicy(row.ID) + } + size={"small"} + > + + + + + + ))} + + + + setPage(p + 1)} + onChangeRowsPerPage={(e) => { + setPageSize(e.target.value); + setPage(1); + }} + /> + +
); } diff --git a/src/component/Admin/Task/Task.js b/src/component/Admin/Task/Task.js index a5e9f489..82c45a22 100644 --- a/src/component/Admin/Task/Task.js +++ b/src/component/Admin/Task/Task.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import { lighten } from "@material-ui/core"; import Button from "@material-ui/core/Button"; import Checkbox from "@material-ui/core/Checkbox"; @@ -90,6 +91,8 @@ export default function Task() { [dispatch] ); + const { t } = useTranslation(); + const loadList = () => { API.post("/admin/task/list", { page: page, @@ -118,7 +121,7 @@ export default function Task() { API.post("/admin/task/delete", { id: [id] }) .then(() => { loadList(); - ToggleSnackbar("top", "right", "任务已删除", "success"); + ToggleSnackbar("top", "right", t('Task has been deleted'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -133,7 +136,7 @@ export default function Task() { API.post("/admin/task/delete", { id: selected }) .then(() => { loadList(); - ToggleSnackbar("top", "right", "任务已删除", "success"); + ToggleSnackbar("top", "right", t('Task has been deleted'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -180,206 +183,206 @@ export default function Task() { const res = JSON.parse(error); return res.msg; } catch (e) { - return "未知"; + return t('unknown'); } }; const isSelected = (id) => selected.indexOf(id) !== -1; return ( -
- setFilterDialog(false)} - setSearch={setSearch} - setFilter={setFilter} - /> -
-
- -
-
+
+ setFilterDialog(false)} + setSearch={setSearch} + setFilter={setFilter} + /> +
+
+ +
+
- - {selected.length > 0 && ( - - - 已选择 {selected.length} 个对象 - - - - - - - - )} - - - - - - 0 && - selected.length < tasks.length - } - checked={ - tasks.length > 0 && - selected.length === tasks.length - } - onChange={handleSelectAllClick} - inputProps={{ - "aria-label": "select all desserts", - }} - /> - - - - setOrderBy([ - "id", - orderBy[1] === "asc" - ? "desc" - : "asc", - ]) - } - > - # - {orderBy[0] === "id" ? ( - - {orderBy[1] === "desc" - ? "sorted descending" - : "sorted ascending"} - - ) : null} - - - - 类型 - - - 状态 - - - 最后进度 - - - 错误信息 - - - 创建者 - - - 创建于 - - - 操作 - - - - - {tasks.map((row) => ( - - - - handleClick(event, row.ID) - } - checked={isSelected(row.ID)} - /> - - {row.ID} - - {getTaskType(row.Type)} - - - {getTaskStatus(row.Status)} - - - {getTaskProgress( - row.Type, - row.Progress - )} - - - {getError(row.Error)} - - - - {users[row.UserID] - ? users[row.UserID].Nick - : "未知"} - - - - {formatLocalTime( - row.CreatedAt, - "YYYY-MM-DD H:mm:ss" - )} - - - - - deletePolicy(row.ID) - } - size={"small"} - > - - - - - - ))} - -
-
- setPage(p + 1)} - onChangeRowsPerPage={(e) => { - setPageSize(e.target.value); - setPage(1); - }} - /> -
-
+ + {selected.length > 0 && ( + + + {t('selected')} {selected.length} {t('Objects')} + + + + + + + + )} + + + + + + 0 && + selected.length < tasks.length + } + checked={ + tasks.length > 0 && + selected.length === tasks.length + } + onChange={handleSelectAllClick} + inputProps={{ + "aria-label": "select all desserts", + }} + /> + + + + setOrderBy([ + "id", + orderBy[1] === "asc" + ? "desc" + : "asc", + ]) + } + > + # + {orderBy[0] === "id" ? ( + + {orderBy[1] === "desc" + ? "sorted descending" + : "sorted ascending"} + + ) : null} + + + + {t('Type')} + + + {t('state')} + + + {t('Final Progress')} + + + {t('Error Message')} + + + {t('creator')} + + + {t('Built in')} + + + {t('Action')} + + + + + {tasks.map((row) => ( + + + + handleClick(event, row.ID) + } + checked={isSelected(row.ID)} + /> + + {row.ID} + + {getTaskType(row.Type)} + + + {getTaskStatus(row.Status)} + + + {getTaskProgress( + row.Type, + row.Progress + )} + + + {getError(row.Error)} + + + + {users[row.UserID] + ? users[row.UserID].Nick + : t('unknown')} + + + + {formatLocalTime( + row.CreatedAt, + "YYYY-MM-DD H:mm:ss" + )} + + + + + deletePolicy(row.ID) + } + size={"small"} + > + + + + + + ))} + +
+
+ setPage(p + 1)} + onChangeRowsPerPage={(e) => { + setPageSize(e.target.value); + setPage(1); + }} + /> +
+
); } diff --git a/src/component/Admin/User/User.js b/src/component/Admin/User/User.js index 5acfaa33..90b03fa6 100644 --- a/src/component/Admin/User/User.js +++ b/src/component/Admin/User/User.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import { lighten } from "@material-ui/core"; import Badge from "@material-ui/core/Badge"; import Button from "@material-ui/core/Button"; @@ -93,6 +94,8 @@ export default function Group() { [dispatch] ); + const { t } = useTranslation(); + const loadList = () => { API.post("/admin/user/list", { page: page, @@ -120,7 +123,7 @@ export default function Group() { API.post("/admin/user/delete", { id: [id] }) .then(() => { loadList(); - ToggleSnackbar("top", "right", "用户已删除", "success"); + ToggleSnackbar("top", "right", t('User has been deleted'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -135,7 +138,7 @@ export default function Group() { API.post("/admin/user/delete", { id: selected }) .then(() => { loadList(); - ToggleSnackbar("top", "right", "用户已删除", "success"); + ToggleSnackbar("top", "right", t('User has been deleted'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -199,337 +202,337 @@ export default function Group() { const isSelected = (id) => selected.indexOf(id) !== -1; return ( -
- setFilterDialog(false)} - setSearch={setSearch} - setFilter={setFilter} - /> -
- -
- - setFilterDialog(true)} - > - - - - - - -
-
+
+ setFilterDialog(false)} + setSearch={setSearch} + setFilter={setFilter} + /> +
+ +
+ + setFilterDialog(true)} + > + + + + + + +
+
- - {selected.length > 0 && ( - - - 已选择 {selected.length} 个对象 - - - - - - - - )} - - - - - - 0 && - selected.length < users.length - } - checked={ - users.length > 0 && - selected.length === users.length - } - onChange={handleSelectAllClick} - inputProps={{ - "aria-label": "select all desserts", - }} - /> - - - - setOrderBy([ - "id", - orderBy[1] === "asc" - ? "desc" - : "asc", - ]) - } - > - # - {orderBy[0] === "id" ? ( - - {orderBy[1] === "desc" - ? "sorted descending" - : "sorted ascending"} - - ) : null} - - - - - setOrderBy([ - "nick", - orderBy[1] === "asc" - ? "desc" - : "asc", - ]) - } - > - 昵称 - {orderBy[0] === "nick" ? ( - - {orderBy[1] === "desc" - ? "sorted descending" - : "sorted ascending"} - - ) : null} - - - - - setOrderBy([ - "email", - orderBy[1] === "asc" - ? "desc" - : "asc", - ]) - } - > - Email - {orderBy[0] === "email" ? ( - - {orderBy[1] === "desc" - ? "sorted descending" - : "sorted ascending"} - - ) : null} - - - - 用户组 - - - 状态 - - - - setOrderBy([ - "storage", - orderBy[1] === "asc" - ? "desc" - : "asc", - ]) - } - > - 已用空间 - {orderBy[0] === "storage" ? ( - - {orderBy[1] === "desc" - ? "sorted descending" - : "sorted ascending"} - - ) : null} - - - - 操作 - - - - - {users.map((row) => ( - - - - handleClick(event, row.ID) + + {selected.length > 0 && ( + + + {t('selected')} {selected.length} {t('Objects')} + + + + + + + + )} + +
+ + + + 0 && + selected.length < users.length + } + checked={ + users.length > 0 && + selected.length === users.length + } + onChange={handleSelectAllClick} + inputProps={{ + "aria-label": "select all desserts", + }} + /> + + + + setOrderBy([ + "id", + orderBy[1] === "asc" + ? "desc" + : "asc", + ]) + } + > + # + {orderBy[0] === "id" ? ( + + {orderBy[1] === "desc" + ? "sorted descending" + : "sorted ascending"} + + ) : null} + + + + + setOrderBy([ + "nick", + orderBy[1] === "asc" + ? "desc" + : "asc", + ]) + } + > + {t('Nickname')} + {orderBy[0] === "nick" ? ( + - - {row.ID} - {row.Nick} - {row.Email} - - + {orderBy[1] === "desc" + ? "sorted descending" + : "sorted ascending"} + + ) : null} + + + + + setOrderBy([ + "email", + orderBy[1] === "asc" + ? "desc" + : "asc", + ]) + } + > + Email + {orderBy[0] === "email" ? ( + + {orderBy[1] === "desc" + ? "sorted descending" + : "sorted ascending"} + + ) : null} + + + + {t('User group')} + + + {t('state')} + + + + setOrderBy([ + "storage", + orderBy[1] === "asc" + ? "desc" + : "asc", + ]) + } + > + {t('Used space')} + {orderBy[0] === "storage" ? ( + - {row.Group.Name} - - - - {row.Status === 0 && ( - - 正常 - - )} - {row.Status === 1 && ( - - 未激活 - - )} - {row.Status === 2 && ( - - 被封禁 - - )} - {row.Status === 3 && ( - - 超额封禁 - - )} - - - {sizeToString(row.Storage)} - - - - - history.push( - "/admin/user/edit/" + - row.ID - ) - } - size={"small"} - > - - - - - block(row.ID)} - size={"small"} - > - - - - - - deletePolicy(row.ID) - } - size={"small"} - > - - - - - - ))} - -
-
- setPage(p + 1)} - onChangeRowsPerPage={(e) => { - setPageSize(e.target.value); - setPage(1); - }} - /> -
-
+ {orderBy[1] === "desc" + ? "sorted descending" + : "sorted ascending"} + + ) : null} + + + + {t('Action')} + + + + + {users.map((row) => ( + + + + handleClick(event, row.ID) + } + checked={isSelected(row.ID)} + /> + + {row.ID} + {row.Nick} + {row.Email} + + + {row.Group.Name} + + + + {row.Status === 0 && ( + ( + {t('normal')} + ) + )} + {row.Status === 1 && ( + ( + {t('inactivated')} + ) + )} + {row.Status === 2 && ( + ( + {t('Blocked')} + ) + )} + {row.Status === 3 && ( + ( + {t('Excessive ban')} + ) + )} + + + {sizeToString(row.Storage)} + + + + + history.push( + "/admin/user/edit/" + + row.ID + ) + } + size={"small"} + > + + + + + block(row.ID)} + size={"small"} + > + + + + + + deletePolicy(row.ID) + } + size={"small"} + > + + + + + + ))} + + + + setPage(p + 1)} + onChangeRowsPerPage={(e) => { + setPageSize(e.target.value); + setPage(1); + }} + /> + +
); } diff --git a/src/component/Admin/User/UserForm.js b/src/component/Admin/User/UserForm.js index cd09f648..27554d40 100644 --- a/src/component/Admin/User/UserForm.js +++ b/src/component/Admin/User/UserForm.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import Button from "@material-ui/core/Button"; import FormControl from "@material-ui/core/FormControl"; import FormHelperText from "@material-ui/core/FormHelperText"; @@ -67,6 +68,8 @@ export default function UserForm(props) { }); }, []); + const { t } = useTranslation(); + const handleChange = (name) => (event) => { setUser({ ...user, @@ -93,7 +96,7 @@ export default function UserForm(props) { ToggleSnackbar( "top", "right", - "用户已" + (props.user ? "保存" : "添加"), + t('User Already') + (props.user ? t('save') : t('Add to')), "success" ); }) @@ -106,121 +109,121 @@ export default function UserForm(props) { }; return ( -
-
-
- - {user.ID === 0 && "创建用户"} - {user.ID !== 0 && "编辑 " + user.Nick} - +
+ +
+ + {user.ID === 0 && t('Create User')} + {user.ID !== 0 && t('edit ') + user.Nick} + -
-
- - - 邮箱 - - - -
+
+
+ + + {t('E-mail')} + + + +
-
- - - 昵称 - - - -
+
+ + + {t('Nickname')} + + + +
-
- - - 密码 - - - - {user.ID !== 0 && "留空表示不修改"} - - -
+
+ + + {t('Password')} + + + + {user.ID !== 0 && t('Leave blank means not to modify')} + + +
-
- - - 用户组 - - - - 用户所属用户组 - - -
+
+ + + {t('User group')} + + + + {t('User group to which the user belongs')} + + +
-
- - - 状态 - - - -
-
-
-
- -
- -
+
+ + + {t('state')} + + + +
+
+
+
+ +
+ +
); } diff --git a/src/component/Common/ICPFooter.js b/src/component/Common/ICPFooter.js index 056eaafe..2edf1715 100644 --- a/src/component/Common/ICPFooter.js +++ b/src/component/Common/ICPFooter.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import { Link, makeStyles } from "@material-ui/core"; import React, { useEffect, useState } from "react"; import { useSelector } from "react-redux"; @@ -25,19 +26,21 @@ export const ICPFooter = () => { setShow(siteICPId && (isSharePage || isLoginPage)); }, [siteICPId, location]); + const { t } = useTranslation(); + if (!show) { return <>; } return ( -
- {`备案号: `} - - {siteICPId} - -
+
+ {t`record number: `} + + {siteICPId} + +
); }; diff --git a/src/component/Dial/Create.js b/src/component/Dial/Create.js index cb804fae..25015c3d 100644 --- a/src/component/Dial/Create.js +++ b/src/component/Dial/Create.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback, useState, useEffect } from "react"; import { makeStyles, Badge } from "@material-ui/core"; import SpeedDial from "@material-ui/lab/SpeedDial"; @@ -63,12 +64,14 @@ export default function UploadButton(props) { setQueued(props.Queued); }, [props.Queued]); + const { t } = useTranslation(); + const openUpload = (id) => { const uploadButton = document.getElementsByClassName(id)[0]; if (document.body.contains(uploadButton)) { uploadButton.click(); } else { - ToggleSnackbar("top", "right", "上传组件还未加载完成", "warning"); + ToggleSnackbar("top", "right", t('The upload component has not been loaded yet'), "warning"); } }; const uploadClicked = () => { @@ -90,75 +93,75 @@ export default function UploadButton(props) { }; return ( - - - - - - + + + + + + ); } diff --git a/src/component/Dial/Save.js b/src/component/Dial/Save.js index 104a18ee..8b6e9cfd 100644 --- a/src/component/Dial/Save.js +++ b/src/component/Dial/Save.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React from "react"; import { makeStyles } from "@material-ui/core"; import SaveIcon from "@material-ui/icons/Save"; @@ -52,33 +53,35 @@ export default function SaveButton(props) { [classes.buttonSuccess]: props.status === "success", }); + const { t } = useTranslation(); + return ( - -
-
- - - {props.status === "success" ? ( - - ) : ( - - )} - - - {props.status === "loading" && ( - - )} -
-
-
+ +
+
+ + + {props.status === "success" ? ( + + ) : ( + + )} + + + {props.status === "loading" && ( + + )} +
+
+
); } diff --git a/src/component/Download/Download.js b/src/component/Download/Download.js index d40b2e18..f43e87d6 100644 --- a/src/component/Download/Download.js +++ b/src/component/Download/Download.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import { Button, IconButton, Typography, withStyles } from "@material-ui/core"; import RefreshIcon from "@material-ui/icons/Refresh"; import React, { Component } from "react"; @@ -134,7 +135,7 @@ class DownloadComponent extends Component { }); }) .catch(() => { - this.props.toggleSnackbar("top", "right", "加载失败", "error"); + this.props.toggleSnackbar("top", "right", this.props.t('Failed to load'), "error"); this.setState({ loading: false, }); @@ -146,48 +147,48 @@ class DownloadComponent extends Component { const user = Auth.GetUser(); return ( -
- {user.group.allowRemoteDownload && } - + {user.group.allowRemoteDownload && } + + {this.props.t('in progress')} + - 进行中 - - - - - {this.state.downloading.map((value, k) => ( - - ))} - - 已完成 - -
- {this.state.finishedList.map((value, k) => { - if (value.files) { - return ; - } - return null; - })} - -
-
+ + + + {this.state.downloading.map((value, k) => ( + + ))} + + {this.props.t('completed')} + +
+ {this.state.finishedList.map((value, k) => { + if (value.files) { + return ; + } + return null; + })} + +
+ ); } } @@ -195,6 +196,6 @@ class DownloadComponent extends Component { const Download = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(DownloadComponent)); +)(withTranslation()(withStyles(styles)(DownloadComponent))); export default Download; diff --git a/src/component/Download/DownloadingCard.js b/src/component/Download/DownloadingCard.js index c20e6f71..0cb8d946 100644 --- a/src/component/Download/DownloadingCard.js +++ b/src/component/Download/DownloadingCard.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import { Card, CardContent, @@ -209,6 +210,8 @@ export default function DownloadingCard(props) { // eslint-disable-next-line }, [task.info.bitfield, task.info.numPieces, theme]); + const { t } = useTranslation(); + const getPercent = (completed, total) => { if (total === 0) { return 0; @@ -251,7 +254,7 @@ export default function DownloadingCard(props) { files: newFiles, }, }); - ToggleSnackbar("top", "right", "文件已删除", "success"); + ToggleSnackbar("top", "right", t('File has been deleted'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -265,7 +268,7 @@ export default function DownloadingCard(props) { if (task.info.bittorrent.info.name !== "") { return task.info.bittorrent.info.name; } - return task.name === "." ? "[未知]" : task.name; + return task.name === "." ? t('[unknown]') : task.name; }, [task]); const getIcon = useCallback(() => { @@ -293,7 +296,7 @@ export default function DownloadingCard(props) { ToggleSnackbar( "top", "right", - "任务已取消,状态会在稍后更新", + t('Task has been cancelled, status will be updated later'), "success" ); }) @@ -314,7 +317,7 @@ export default function DownloadingCard(props) { ToggleSnackbar( "top", "right", - "操作成功,状态会在稍后更新", + t('The operation is successful, the status will be updated later'), "success" ); setSelectDialogOpen(false); @@ -328,363 +331,363 @@ export default function DownloadingCard(props) { }; return ( - - setSelectDialogOpen(false)} - modalsLoading={loading} - files={selectFileOption} - onSubmit={changeSelectedFile} - /> - - -
{getIcon()}
- - - - {getDownloadName()} - - - - - {task.total > 0 && ( - - {getPercent( - task.downloaded, - task.total - ).toFixed(2)} - % -{" "} - {task.downloaded === 0 - ? "0Bytes" - : sizeToString(task.downloaded)} - / - {task.total === 0 - ? "0Bytes" - : sizeToString(task.total)}{" "} - -{" "} - {task.speed === "0" - ? "0B/s" - : sizeToString(task.speed) + "/s"} - - )} - {task.total === 0 && - } - - - - - - - -
- - - {task.info.bittorrent.mode === "multi" && ( -
- - - {activeFiles().map((value) => { - return ( - + setSelectDialogOpen(false)} + modalsLoading={loading} + files={selectFileOption} + onSubmit={changeSelectedFile} + /> + + +
{getIcon()}
+ + + + {getDownloadName()} + + + + + {task.total > 0 && ( + + {getPercent( + task.downloaded, + task.total + ).toFixed(2)} + % -{" "} + {task.downloaded === 0 + ? "0Bytes" + : sizeToString(task.downloaded)} + / + {task.total === 0 + ? "0Bytes" + : sizeToString(task.total)}{" "} + -{" "} + {task.speed === "0" + ? "0B/s" + : sizeToString(task.speed) + "/s"} + + )} + {task.total === 0 && - } + + + + + + + +
+ + + {task.info.bittorrent.mode === "multi" && ( +
+
+ + {activeFiles().map((value) => { + return ( + + - - + {value.path} + + + + + {" "} + {sizeToString( + value.length + )} + + + + + {getPercent( + value.completedLength, + value.length + ).toFixed(2)} + % + + + + + + deleteFile( + value.index + ) + } + disabled={loading} + size={"small"} > - - {value.path} - - - - - {" "} - {sizeToString( - value.length - )} - - - - - {getPercent( - value.completedLength, - value.length - ).toFixed(2)} - % - - - - - - deleteFile( - value.index - ) - } - disabled={loading} - size={"small"} - > - - - - - - ); - })} - -
-
- )} + + + + + + ); + })} + + + + )} -
- - {task.info.bittorrent.mode === "multi" && ( - - )} - -
- -
- {task.info.bitfield !== "" && ( - - )} +
+ + {task.info.bittorrent.mode === "multi" && ( + () + )} + +
+ +
+ {task.info.bitfield !== "" && ( + + )} - - - - 更新于: - - - - - - - - 上传大小: - - - {sizeToString(task.info.uploadLength)} - - - - - 上传速度: - - - {sizeToString(task.info.uploadSpeed)} / s - - - {task.info.bittorrent.mode !== "" && ( - <> - - - InfoHash: - - - {task.info.infoHash} - - - - - 做种者: - - - {task.info.numSeeders} - - - - - 做种中: - - - {task.info.seeder === "true" - ? "是" - : "否"} - - - - )} - - - 分片大小: - - - {sizeToString(task.info.pieceLength)} - - - - - 分片数量: - - - {task.info.numPieces} - - - -
- - - + + + + {t('Updated at:')} + + + + + + + + {t('Upload size:')} + + + {sizeToString(task.info.uploadLength)} + + + + + {t('Upload speed:')} + + + {sizeToString(task.info.uploadSpeed)} / s + + + {task.info.bittorrent.mode !== "" && ( + <> + + + {t('InfoHash:')} + + + {task.info.infoHash} + + + + + {t('Seeder:')} + + + {task.info.numSeeders} + + + + + {t('During seeding:')} + + + {task.info.seeder === "true" + ? t('Yes') + : t('no')} + + + + )} + + + {t('Shard size:')} + + + {sizeToString(task.info.pieceLength)} + + + + + {t('Number of shards:')} + + + {task.info.numPieces} + + + +
+
+
+
); } diff --git a/src/component/Download/FinishedCard.js b/src/component/Download/FinishedCard.js index f6a4b451..bf4d0a48 100644 --- a/src/component/Download/FinishedCard.js +++ b/src/component/Download/FinishedCard.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback } from "react"; import { Card, @@ -162,6 +163,8 @@ export default function FinishedCard(props) { [dispatch] ); + const { t } = useTranslation(); + const handleChange = () => (event, newExpanded) => { setExpanded(!!newExpanded); }; @@ -177,7 +180,7 @@ export default function FinishedCard(props) { setLoading(true); API.delete("/aria2/task/" + props.task.gid) .then(() => { - ToggleSnackbar("top", "right", "删除成功", "success"); + ToggleSnackbar("top", "right", t('successfully deleted'), "success"); }) .catch((error) => { ToggleSnackbar("top", "right", error.message, "error"); @@ -188,7 +191,7 @@ export default function FinishedCard(props) { }; const getDownloadName = useCallback(() => { - return props.task.name === "." ? "[未知]" : props.task.name; + return props.task.name === "." ? t('[unknown]') : props.task.name; }, [props.task.name]); const activeFiles = useCallback(() => { @@ -215,226 +218,226 @@ export default function FinishedCard(props) { const getTaskError = (error) => { try { const res = JSON.parse(error); - return res.msg + ":" + res.error; + return res.msg + t(':') + res.error; } catch (e) { - return "文件转存失败"; + return t('File transfer failed'); } }; return ( - - - -
{getIcon()}
- - - - {getDownloadName()} - - - {props.task.status === 3 && ( - - - 下载出错:{props.task.error} - - - )} - {props.task.status === 5 && ( - - 已取消 - {props.task.error !== "" && ( - :{props.task.error} - )} - - )} - {props.task.status === 4 && - props.task.task_status === 4 && ( - - 已完成 - - )} - {props.task.status === 4 && - props.task.task_status === 0 && ( - - 已完成,转存排队中 - - )} - {props.task.status === 4 && - props.task.task_status === 1 && ( - - 已完成,转存处理中 - - )} - {props.task.status === 4 && - props.task.task_status === 2 && ( - - {getTaskError(props.task.task_error)} - + + + +
{getIcon()}
+ + + + {getDownloadName()} + + + {props.task.status === 3 && ( + + + {t('Download error:')}{props.task.error} + + + )} + {props.task.status === 5 && ( + ( + {t('Cancelled')} + {props.task.error !== "" && ( + ({t(':')}{props.task.error}) )} - - - - - - -
- - - {props.task.files.length > 1 && ( -
- - - {activeFiles().map((value) => { - return ( - - - - - {value.path} - - - - - {" "} - {sizeToString( - value.length - )} - - - - - {getPercent( - value.completedLength, - value.length - ).toFixed(2)} - % - - - - ); - })} - -
-
- )} + ) + )} + {props.task.status === 4 && + props.task.task_status === 4 && ( + ( + {t('completed')} + ) + )} + {props.task.status === 4 && + props.task.task_status === 0 && ( + ( + {t('Completed, transfer to queue')} + ) + )} + {props.task.status === 4 && + props.task.task_status === 1 && ( + ( + {t('Completed, transfer processing')} + ) + )} + {props.task.status === 4 && + props.task.task_status === 2 && ( + + {getTaskError(props.task.task_error)} + + )} +
+ + + + + +
+ + + {props.task.files.length > 1 && ( +
+ + + {activeFiles().map((value) => { + return ( + + + + + {value.path} + + + + + {" "} + {sizeToString( + value.length + )} + + + + + {getPercent( + value.completedLength, + value.length + ).toFixed(2)} + % + + + + ); + })} + +
+
+ )} -
- - -
- -
- - - - 创建日期: - - - {formatLocalTime( - props.task.create, - "YYYY-MM-DD H:mm:ss" - )} - - - - - 最后更新: - - - {formatLocalTime( - props.task.update, - "YYYY-MM-DD H:mm:ss" - )} - - - -
-
-
-
+
+ + +
+ +
+ + + + {t('Created Date:')} + + + {formatLocalTime( + props.task.create, + "YYYY-MM-DD H:mm:ss" + )} + + + + + {t('latest update:')} + + + {formatLocalTime( + props.task.update, + "YYYY-MM-DD H:mm:ss" + )} + + + +
+ + + ); } diff --git a/src/component/FileManager/ContextMenu.js b/src/component/FileManager/ContextMenu.js index 7886f0fe..6cf47d6e 100644 --- a/src/component/FileManager/ContextMenu.js +++ b/src/component/FileManager/ContextMenu.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import { Divider, ListItemIcon, @@ -177,7 +178,7 @@ class ContextMenuCompoment extends Component { openArchiveDownload = () => { this.props.changeContextMenu("file", false); - this.props.openLoadingDialog("打包中..."); + this.props.openLoadingDialog(this.props.t('Packing...')); }; openDownload = () => { @@ -185,14 +186,14 @@ class ContextMenuCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "未登录用户无法预览", + this.props.t('Users who are not logged in cannot preview'), "warning" ); this.props.changeContextMenu("file", false); return; } this.props.changeContextMenu("file", false); - this.props.openLoadingDialog("获取下载地址..."); + this.props.openLoadingDialog(this.props.t('Get download address...')); }; enterFolder = () => { @@ -212,7 +213,7 @@ class ContextMenuCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "上传组件还未加载完成", + this.props.t('The upload component has not been loaded yet'), "warning" ); } @@ -267,7 +268,7 @@ class ContextMenuCompoment extends Component { ); }, icon: , - text: "刷新", + text: this.props.t('Refresh'), }, ], center: [ @@ -275,19 +276,19 @@ class ContextMenuCompoment extends Component { condition: true, onClick: () => this.clickUpload("uploadFileForm"), icon: , - text: "上传文件", + text: this.props.t('upload files'), }, { condition: true, onClick: () => this.clickUpload("uploadFolderForm"), icon: , - text: "上传目录", + text: this.props.t('Upload directory'), }, { condition: user.group.allowRemoteDownload, onClick: () => this.props.openRemoteDownloadDialog(), icon: , - text: "离线下载", + text: this.props.t('Offline download'), }, ], bottom: [ @@ -295,380 +296,380 @@ class ContextMenuCompoment extends Component { condition: true, onClick: () => this.props.openCreateFolderDialog(), icon: , - text: "创建文件夹", + text: this.props.t('Create Folder'), }, { condition: true, onClick: () => this.props.openCreateFileDialog(), icon: , - text: "创建文件", + text: this.props.t('Create a file'), }, ], }; return ( -
- - this.props.changeContextMenu(this.props.menuType, false) - } - anchorReference="anchorPosition" - anchorPosition={{ top: this.Y, left: this.X }} - anchorOrigin={{ - vertical: "top", - horizontal: "left", - }} - transformOrigin={{ - vertical: "top", - horizontal: "left", - }} - > - {this.props.menuType === "empty" && ( -
- { - this.props.refreshFileList(); - this.props.changeContextMenu( - this.props.menuType, - false - ); - }} - > - - - - 刷新 - - - - this.clickUpload("uploadFileForm") - } - > - - - - - 上传文件 - - - - this.clickUpload("uploadFolderForm") - } - > - - - - - 上传目录 - - - {user.group.allowRemoteDownload && ( - - this.props.openRemoteDownloadDialog() - } - > - - - - - 离线下载 - - - )} +
+ + this.props.changeContextMenu(this.props.menuType, false) + } + anchorReference="anchorPosition" + anchorPosition={{ top: this.Y, left: this.X }} + anchorOrigin={{ + vertical: "top", + horizontal: "left", + }} + transformOrigin={{ + vertical: "top", + horizontal: "left", + }} + > + {this.props.menuType === "empty" && ( +
+ { + this.props.refreshFileList(); + this.props.changeContextMenu( + this.props.menuType, + false + ); + }} + > + + + + {this.props.t('Refresh')} + + + + this.clickUpload("uploadFileForm") + } + > + + + + + {this.props.t('upload files')} + + + + this.clickUpload("uploadFolderForm") + } + > + + + + + {this.props.t('Upload directory')} + + + {user.group.allowRemoteDownload && ( + + this.props.openRemoteDownloadDialog() + } + > + + + + + {this.props.t('Offline download')} + + + )} - - - this.props.openCreateFolderDialog() - } - > - - - - - 创建文件夹 - - - - this.props.openCreateFileDialog() - } - > - - - - - 创建文件 - - -
- )} - {this.props.menuType !== "empty" && ( -
- {!this.props.isMultiple && this.props.withFolder && ( -
- - - - - - 进入 - - - {isHomePage && ( - - )} -
- )} - {!this.props.isMultiple && - this.props.withFile && - (!this.props.share || - this.props.share.preview) && - isPreviewable(this.props.selected[0].name) && ( -
- - this.props.openPreview() - } - > - - - - - 打开 - - -
- )} + + + this.props.openCreateFolderDialog() + } + > + + + + + {this.props.t('Create Folder')} + + + + this.props.openCreateFileDialog() + } + > + + + + + {this.props.t('Create a file')} + + +
+ )} + {this.props.menuType !== "empty" && ( +
+ {!this.props.isMultiple && this.props.withFolder && ( +
+ + + + + + {this.props.t('Enter')} + + + {isHomePage && ( + + )} +
+ )} + {!this.props.isMultiple && + this.props.withFile && + (!this.props.share || + this.props.share.preview) && + isPreviewable(this.props.selected[0].name) && ( +
+ + this.props.openPreview() + } + > + + + + + {this.props.t('Open')} + + +
+ )} - {!this.props.isMultiple && this.props.withFile && ( -
- this.openDownload()} - > - - - - - 下载 - - - {isHomePage && ( - - )} -
- )} + {!this.props.isMultiple && this.props.withFile && ( +
+ this.openDownload()} + > + + + + + {this.props.t('download')} + + + {isHomePage && ( + + )} +
+ )} - {(this.props.isMultiple || this.props.withFolder) && - (user.group.allowArchiveDownload || - !isHomePage) && ( - - this.openArchiveDownload() - } - > - - - - - 打包下载 - - - )} + {(this.props.isMultiple || this.props.withFolder) && + (user.group.allowArchiveDownload || + !isHomePage) && ( + + this.openArchiveDownload() + } + > + + + + + {this.props.t('Download package')} + + + )} - {!this.props.isMultiple && - this.props.withFile && - isHomePage && - user.policy.allowSource && ( - - this.props.openGetSourceDialog() - } - > - - - - - 获取外链 - - - )} + {!this.props.isMultiple && + this.props.withFile && + isHomePage && + user.policy.allowSource && ( + + this.props.openGetSourceDialog() + } + > + + + + + {this.props.t('Get External Links')} + + + )} - {!this.props.isMultiple && - isHomePage && - user.group.allowRemoteDownload && - this.props.withFile && - isTorrent(this.props.selected[0].name) && ( - - this.props.openTorrentDownloadDialog() - } - > - - - - - 创建离线下载任务 - - - )} - {!this.props.isMultiple && - isHomePage && - user.group.compress && - this.props.withFile && - isCompressFile(this.props.selected[0].name) && ( - - this.props.openDecompressDialog() - } - > - - - - - 解压缩 - - - )} + {!this.props.isMultiple && + isHomePage && + user.group.allowRemoteDownload && + this.props.withFile && + isTorrent(this.props.selected[0].name) && ( + + this.props.openTorrentDownloadDialog() + } + > + + + + + {this.props.t('Create offline download task')} + + + )} + {!this.props.isMultiple && + isHomePage && + user.group.compress && + this.props.withFile && + isCompressFile(this.props.selected[0].name) && ( + + this.props.openDecompressDialog() + } + > + + + + + {this.props.t('unzip')} + + + )} - {isHomePage && user.group.compress && ( - - this.props.openCompressDialog() - } - > - - - - - 创建压缩文件 - - - )} + {isHomePage && user.group.compress && ( + + this.props.openCompressDialog() + } + > + + + + + {this.props.t('Create compressed file')} + + + )} - {!this.props.isMultiple && isHomePage && ( - this.props.openShareDialog()} - > - - - - - 创建分享链接 - - - )} + {!this.props.isMultiple && isHomePage && ( + this.props.openShareDialog()} + > + + + + + {this.props.t('Create a share link')} + + + )} - {!this.props.isMultiple && isHomePage && ( - - this.props.toggleObjectInfoSidebar(true) - } - > - - - - - 详细信息 - - - )} + {!this.props.isMultiple && isHomePage && ( + + this.props.toggleObjectInfoSidebar(true) + } + > + + + + + {this.props.t('details')} + + + )} - {!this.props.isMultiple && isHomePage && ( - - )} + {!this.props.isMultiple && isHomePage && ( + + )} - {!this.props.isMultiple && isHomePage && ( -
- - this.props.openRenameDialog() - } - > - - - - - 重命名 - - - {this.props.keywords === "" && ( - - this.props.openCopyDialog() - } - > - - - - - 复制 - - - )} -
- )} - {isHomePage && ( -
- {this.props.keywords === "" && ( - - this.props.openMoveDialog() - } - > - - - - - 移动 - - - )} + {!this.props.isMultiple && isHomePage && ( +
+ + this.props.openRenameDialog() + } + > + + + + + {this.props.t('Rename')} + + + {this.props.keywords === "" && ( + + this.props.openCopyDialog() + } + > + + + + + {this.props.t('copy')} + + + )} +
+ )} + {isHomePage && ( +
+ {this.props.keywords === "" && ( + + this.props.openMoveDialog() + } + > + + + + + {this.props.t('move')} + + + )} - - - this.props.openRemoveDialog() - } - > - - - - - 删除 - - -
- )} -
- )} -
-
+ + + this.props.openRemoveDialog() + } + > + + + + + {this.props.t('delete')} + + +
+ )} +
+ )} + + ); } } @@ -681,6 +682,6 @@ ContextMenuCompoment.propTypes = { const ContextMenu = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(withRouter(ContextMenuCompoment))); +)(withTranslation()(withStyles(styles)(withRouter(ContextMenuCompoment)))); export default ContextMenu; diff --git a/src/component/FileManager/Explorer.js b/src/component/FileManager/Explorer.js index 7a42975b..527f79df 100644 --- a/src/component/FileManager/Explorer.js +++ b/src/component/FileManager/Explorer.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import { CircularProgress, Grid, @@ -262,15 +263,15 @@ class ExplorerCompoment extends Component { ); }} > - 名称 - {this.props.sortMethod === "namePos" || - this.props.sortMethod === "nameRev" ? ( - - {this.props.sortMethod === "nameRev" - ? "sorted descending" - : "sorted ascending"} - - ) : null} + {this.props.t('Name')} + {this.props.sortMethod === "namePos" || + this.props.sortMethod === "nameRev" ? ( + + {this.props.sortMethod === "nameRev" + ? "sorted descending" + : "sorted ascending"} + + ) : null} @@ -292,15 +293,15 @@ class ExplorerCompoment extends Component { ); }} > - 大小 - {this.props.sortMethod === "sizePos" || - this.props.sortMethod === "sizeRes" ? ( - - {this.props.sortMethod === "sizeRes" - ? "sorted descending" - : "sorted ascending"} - - ) : null} + {this.props.t('Size')} + {this.props.sortMethod === "sizePos" || + this.props.sortMethod === "sizeRes" ? ( + + {this.props.sortMethod === "sizeRes" + ? "sorted descending" + : "sorted ascending"} + + ) : null} @@ -322,15 +323,15 @@ class ExplorerCompoment extends Component { ); }} > - 日期 - {this.props.sortMethod === "timePos" || - this.props.sortMethod === "timeRev" ? ( - - {this.props.sortMethod === "sizeRes" - ? "sorted descending" - : "sorted ascending"} - - ) : null} + {this.props.t('date')} + {this.props.sortMethod === "timePos" || + this.props.sortMethod === "timeRev" ? ( + + {this.props.sortMethod === "sizeRes" + ? "sorted descending" + : "sorted ascending"} + + ) : null} @@ -340,7 +341,7 @@ class ExplorerCompoment extends Component { )} @@ -363,7 +364,7 @@ class ExplorerCompoment extends Component { variant="body2" className={classes.typeHeader} > - 文件夹 + {this.props.t('folder')} - 文件 + {this.props.t('document')} - - - - {this.props.navigatorError && ( - - - :( 请求时出现错误 - - - {this.props.navigatorErrorMsg.message} - - - )} +
+ + + + {this.props.navigatorError && ( + + + {this.props.t(':( An error occurred during request')} + + + {this.props.navigatorErrorMsg.message} + + + )} - {this.props.loading && !this.props.navigatorError && ( -
- -
- )} + {this.props.loading && !this.props.navigatorError && ( +
+ +
+ )} - {this.props.keywords === "" && - isHomePage && - this.props.dirList.length === 0 && - this.props.fileList.length === 0 && - !this.props.loading && - !this.props.navigatorError && ( -
- -
- 拖拽文件至此 -
-
- 或点击右下方“上传文件”按钮添加文件 -
-
- )} - {((this.props.keywords !== "" && - this.props.dirList.length === 0 && - this.props.fileList.length === 0 && - !this.props.loading && - !this.props.navigatorError) || - (this.props.dirList.length === 0 && - this.props.fileList.length === 0 && - !this.props.loading && - !this.props.navigatorError && - !isHomePage)) && ( -
- -
- 什么都没有找到 -
-
- )} - {showView && view} -
+ {this.props.keywords === "" && + isHomePage && + this.props.dirList.length === 0 && + this.props.fileList.length === 0 && + !this.props.loading && + !this.props.navigatorError && ( +
+ +
+ {this.props.t('Drag and drop files here')} +
+
+ {this.props.t('Or click the "Upload File" button at the bottom right to add a file')} +
+
+ )} + {((this.props.keywords !== "" && + this.props.dirList.length === 0 && + this.props.fileList.length === 0 && + !this.props.loading && + !this.props.navigatorError) || + (this.props.dirList.length === 0 && + this.props.fileList.length === 0 && + !this.props.loading && + !this.props.navigatorError && + !isHomePage)) && ( +
+ +
+ {this.props.t('Nothing was found')} +
+
+ )} + {showView && view} + ); } } @@ -510,6 +511,6 @@ ExplorerCompoment.propTypes = { const Explorer = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(withRouter(ExplorerCompoment))); +)(withTranslation()(withStyles(styles)(withRouter(ExplorerCompoment)))); export default Explorer; diff --git a/src/component/FileManager/ImgPreview_old.js b/src/component/FileManager/ImgPreview_old.js index de2b0e87..2eaf9ad9 100644 --- a/src/component/FileManager/ImgPreview_old.js +++ b/src/component/FileManager/ImgPreview_old.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import PropTypes from "prop-types"; import { connect } from "react-redux"; @@ -105,40 +106,40 @@ class ImgPreviewCompoment extends Component { const { photoIndex, isOpen, items } = this.state; return ( -
- {isOpen && ( - this.handleClose()} - imageLoadErrorMessage="无法加载此图像" - imageCrossOrigin="anonymous" - imageTitle={items[photoIndex].title} - onMovePrevRequest={() => - this.setState({ - photoIndex: - (photoIndex + items.length - 1) % - items.length, - }) - } - reactModalStyle={{ - overlay: { - zIndex: 10000, - }, - }} - onMoveNextRequest={() => - this.setState({ - photoIndex: (photoIndex + 1) % items.length, - }) - } - /> - )} -
+
+ {isOpen && ( + this.handleClose()} + imageLoadErrorMessage={this.props.t('Unable to load this image')} + imageCrossOrigin="anonymous" + imageTitle={items[photoIndex].title} + onMovePrevRequest={() => + this.setState({ + photoIndex: + (photoIndex + items.length - 1) % + items.length, + }) + } + reactModalStyle={{ + overlay: { + zIndex: 10000, + }, + }} + onMoveNextRequest={() => + this.setState({ + photoIndex: (photoIndex + 1) % items.length, + }) + } + /> + )} +
); } } @@ -150,6 +151,6 @@ ImgPreviewCompoment.propTypes = { const ImgPreivew = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(withRouter(ImgPreviewCompoment))); +)(withTranslation()(withStyles(styles)(withRouter(ImgPreviewCompoment)))); export default ImgPreivew; diff --git a/src/component/FileManager/Modals.js b/src/component/FileManager/Modals.js index 08b2c8d0..9b99efa9 100644 --- a/src/component/FileManager/Modals.js +++ b/src/component/FileManager/Modals.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import PropTypes from "prop-types"; import { connect } from "react-redux"; @@ -120,7 +121,7 @@ class ModalsCompoment extends Component { if (this.props.loading !== nextProps.loading) { // 打包下载 if (nextProps.loading === true) { - if (nextProps.loadingText === "打包中...") { + if (nextProps.loadingText === this.props.t('Packing...')) { if ( pathHelper.isSharePage(this.props.location.pathname) && this.props.share && @@ -130,7 +131,7 @@ class ModalsCompoment extends Component { return; } this.archiveDownload(); - } else if (nextProps.loadingText === "获取下载地址...") { + } else if (nextProps.loadingText === this.props.t('Get download address...')) { if ( pathHelper.isSharePage(this.props.location.pathname) && this.props.share && @@ -382,7 +383,7 @@ class ModalsCompoment extends Component { target.path === "/" ? target.path + target.name : target.path + "/" + target.name; - this.props.openLoadingDialog("处理中..."); + this.props.openLoadingDialog(this.props.t('Processing...')); this.submitMove(); } }; @@ -415,7 +416,7 @@ class ModalsCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "新名称与已有文件重复", + this.props.t('The new name is the same as the existing file'), "warning" ); this.props.setModalsLoading(false); @@ -453,7 +454,7 @@ class ModalsCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "文件夹名称重复", + this.props.t('Duplicate folder name'), "warning" ); this.props.setModalsLoading(false); @@ -494,7 +495,7 @@ class ModalsCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "文件名称重复", + this.props.t('Duplicate file name'), "warning" ); this.props.setModalsLoading(false); @@ -537,7 +538,7 @@ class ModalsCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "任务已创建", + this.props.t('Task has been created'), "success" ); this.onClose(); @@ -568,7 +569,7 @@ class ModalsCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "任务已创建", + this.props.t('Task has been created'), "success" ); this.onClose(); @@ -629,465 +630,465 @@ class ModalsCompoment extends Component { const { classes } = this.props; return ( -
- - - - 获取文件外链 - +
+ + + + {this.props.t('Get files outside the chain')} + - -
- - -
- - - -
- - 新建文件夹 + +
+ + +
+ + + +
+ + {this.props.t('new folder')} - -
- this.handleInputChange(e)} - fullWidth - /> - -
- - -
- -
-
-
- - - 新建文件 + +
+ this.handleInputChange(e)} + fullWidth + /> + +
+ + +
+ +
+
+
- -
- this.handleInputChange(e)} - fullWidth - /> - -
- - -
- -
-
-
+ + {this.props.t('New file')} - - 重命名 - - - 输入{" "} - - {this.props.selected.length === 1 - ? this.props.selected[0].name - : ""} - {" "} - 的新名称: - -
- this.handleInputChange(e)} - fullWidth - /> - -
- - -
- -
-
-
- + +
+ this.handleInputChange(e)} + fullWidth + /> + +
+ + +
+ +
+
+
- - 移动至 - + + {this.props.t('Rename')} + + + {this.props.t('enter')}{" "} + + {this.props.selected.length === 1 + ? this.props.selected[0].name + : ""} + {" "} + {this.props.t('The new name: ')} + +
+ this.handleInputChange(e)} + fullWidth + /> + +
+ + +
+ +
+
+
+ - {this.state.selectedPath !== "" && ( - - - 移动至{" "} - {this.state.selectedPathName} - - - )} - - -
- -
-
-
- - 删除对象 + + {this.props.t('Move to')} + - - - 确定要删除 - {this.props.selected.length === 1 && ( - {this.props.selected[0].name} + {this.state.selectedPath !== "" && ( + + + {this.props.t('Move to')}{" "} + {this.state.selectedPathName} + + + )} + + +
+ +
+
+
+ + {this.props.t('Delete Object')} + + + + {this.props.t('Are you sure you want to delete')} + {this.props.selected.length === 1 && ( + {this.props.selected[0].name} + )} + {this.props.selected.length > 1 && ( + ( + {this.props.t('this')}{this.props.selected.length}{this.props.t('Objects')} + ) + )} + {this.props.t('?')} + + + + +
+ -
- -
- -
+ +
+ + - + - - 音频播放 + + {this.props.t('Music player')} - - - {this.props.selected.length !== 0 && ( - - - - - - - - - 新建离线下载任务 - + + + {this.props.selected.length !== 0 && ( + + + + + + + + + {this.props.t('Create a new offline download task')} + - - - - - - - - - - - - - 选择存储位置 - - + + + + + + + + + + + + + {this.props.t('Choose storage location')} + + - {this.state.selectedPath !== "" && ( - - - 下载至{" "} - {this.state.selectedPathName} - - - )} - - -
- -
-
-
- - - 选择存储位置 - - + {this.state.selectedPath !== "" && ( + + + {this.props.t('Download to')}{" "} + {this.state.selectedPathName} + + + )} + + +
+ +
+
+
+ + + {this.props.t('Choose storage location')} + + - {this.state.selectedPath !== "" && ( - - - 下载至{" "} - {this.state.selectedPathName} - - - )} - - -
- -
-
-
+ {this.state.selectedPath !== "" && ( + + + {this.props.t('Download to')}{" "} + {this.state.selectedPathName} + + + )} + + +
+ +
+
+
- - - + + + ); } } @@ -1099,6 +1100,6 @@ ModalsCompoment.propTypes = { const Modals = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(withRouter(ModalsCompoment))); +)(withTranslation()(withStyles(styles)(withRouter(ModalsCompoment)))); export default Modals; diff --git a/src/component/FileManager/Navigator/Navigator.js b/src/component/FileManager/Navigator/Navigator.js index 72ff930d..8d1dfe79 100644 --- a/src/component/FileManager/Navigator/Navigator.js +++ b/src/component/FileManager/Navigator/Navigator.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import PropTypes from "prop-types"; import { connect } from "react-redux"; @@ -334,44 +335,44 @@ class NavigatorComponent extends Component { disableAutoFocusItem={true} > this.performAction("refresh")}> - - - - 刷新 + + + + {this.props.t('Refresh')} {this.props.keywords === "" && isHomePage && (
this.performAction("share")}> - - - - 分享 + + + + {this.props.t('share')} {user.group.compress && ( - this.performAction("compress")} > - - - - 压缩 - + + + + {this.props.t('compression')} + ) )} this.performAction("newfolder")} > - - - - 创建文件夹 + + + + {this.props.t('Create Folder')} this.performAction("newFile")}> - - - - 创建文件 + + + + {this.props.t('Create a file')}
)} @@ -379,109 +380,109 @@ class NavigatorComponent extends Component { ); return ( -
-
-
- - this.navigateTo(e, -1)} - /> - - - {this.state.hiddenMode && ( - - - - - - - {/* */} - - this.navigateTo( - e, - this.state.folders.length - 1 - ) - } - /> - {presentFolderMenu} - - )} - {!this.state.hiddenMode && - this.state.folders.map((folder, id, folders) => ( - - {folder !== "" && ( - - - this.navigateTo(e, id) - } - /> - {id === folders.length - 1 && - presentFolderMenu} - {id !== folders.length - 1 && ( - - )} - - )} - - ))} -
-
- -
-
- -
+
+
+
+ + this.navigateTo(e, -1)} + /> + + + {this.state.hiddenMode && ( + + + + + + + {/* */} + + this.navigateTo( + e, + this.state.folders.length - 1 + ) + } + /> + {presentFolderMenu} + + )} + {!this.state.hiddenMode && + this.state.folders.map((folder, id, folders) => ( + + {folder !== "" && ( + + + this.navigateTo(e, id) + } + /> + {id === folders.length - 1 && + presentFolderMenu} + {id !== folders.length - 1 && ( + + )} + + )} + + ))} +
+
+ +
+
+ +
); } } @@ -494,6 +495,6 @@ NavigatorComponent.propTypes = { const Navigator = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(withRouter(NavigatorComponent))); +)(withTranslation()(withStyles(styles)(withRouter(NavigatorComponent)))); export default Navigator; diff --git a/src/component/FileManager/Navigator/SubActions.js b/src/component/FileManager/Navigator/SubActions.js index d8357b50..3d64d997 100644 --- a/src/component/FileManager/Navigator/SubActions.js +++ b/src/component/FileManager/Navigator/SubActions.js @@ -1,3 +1,5 @@ +import { useTranslation } from "react-i18next"; +import i18next from "i18next"; import React, { useCallback, useState } from "react"; import { IconButton, makeStyles, Menu, MenuItem } from "@material-ui/core"; import ViewListIcon from "@material-ui/icons/ViewList"; @@ -17,7 +19,7 @@ const useStyles = makeStyles((theme) => ({ }, })); -const sortOptions = ["A-Z", "Z-A", "最早", "最新", "最小", "最大"]; +const sortOptions = ["A-Z", "Z-A", i18next.t('Early'), i18next.t('up to date'), i18next.t('Minimum'), i18next.t('maximum')]; export default function SubActions({ isSmall, share, inherit }) { const dispatch = useDispatch(); @@ -38,6 +40,9 @@ export default function SubActions({ isSmall, share, inherit }) { ); const [anchorSort, setAnchorSort] = useState(null); const [selectedIndex, setSelectedIndex] = useState(0); + + const { t } = useTranslation(); + const showSortOptions = (e) => { setAnchorSort(e.currentTarget); }; @@ -67,79 +72,77 @@ export default function SubActions({ isSmall, share, inherit }) { }; const classes = useStyles(); - return ( - <> - {viewMethod === "icon" && ( - - - - )} - {viewMethod === "list" && ( - - - - )} - - {viewMethod === "smallIcon" && ( - - - - )} - + return <> + {viewMethod === "icon" && ( - + + + )} + {viewMethod === "list" && ( + + - setAnchorSort(null)} + )} + + {viewMethod === "smallIcon" && ( + - {sortOptions.map((option, index) => ( - handleMenuItemClick(event, index)} - > - {option} - - ))} - - {share && ( - SetShareUserPopover(e.currentTarget)} - style={{ padding: 5 }} + + + )} + + + + + setAnchorSort(null)} + > + {sortOptions.map((option, index) => ( + handleMenuItemClick(event, index)} > - - - )} - - ); + {option} + + ))} + + {share && ( + SetShareUserPopover(e.currentTarget)} + style={{ padding: 5 }} + > + + + )} + ; } diff --git a/src/component/FileManager/ObjectIcon.js b/src/component/FileManager/ObjectIcon.js index 8e287e67..f842192b 100644 --- a/src/component/FileManager/ObjectIcon.js +++ b/src/component/FileManager/ObjectIcon.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback, useEffect } from "react"; import { useDispatch, useSelector } from "react-redux"; import { @@ -75,6 +76,8 @@ export default function ObjectIcon(props) { ); const OpenPreview = useCallback(() => dispatch(openPreview()), [dispatch]); + const { t } = useTranslation(); + const classes = useStyles(); const contextMenu = (e) => { @@ -130,12 +133,12 @@ export default function ObjectIcon(props) { if (isShare) { const user = Auth.GetUser(); if (!Auth.Check() && user && !user.group.shareDownload) { - ToggleSnackbar("top", "right", "请先登录", "warning"); + ToggleSnackbar("top", "right", t('please log in first'), "warning"); return; } } if (window.shareInfo && !window.shareInfo.preview) { - OpenLoadingDialog("获取下载地址..."); + OpenLoadingDialog(t('Get download address...')); return; } diff --git a/src/component/FileManager/PathSelector.js b/src/component/FileManager/PathSelector.js index 9aa09f5a..a4ebb332 100644 --- a/src/component/FileManager/PathSelector.js +++ b/src/component/FileManager/PathSelector.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import PropTypes from "prop-types"; import FolderIcon from "@material-ui/icons/Folder"; @@ -117,63 +118,63 @@ class PathSelectorCompoment extends Component { const { classes } = this.props; return ( -
- - {this.state.presentPath !== "/" && ( - - - - - - - )} - {this.state.dirList.map((value, index) => ( - this.handleSelect(index)} - > - - - - - {value.name !== "/" && ( - - - this.enterFolder( - value.path === "/" - ? value.path + value.name - : value.path + - "/" + - value.name - ) - } - > - - - - )} - - ))} - -
+
+ + {this.state.presentPath !== "/" && ( + + + + + + + )} + {this.state.dirList.map((value, index) => ( + this.handleSelect(index)} + > + + + + + {value.name !== "/" && ( + + + this.enterFolder( + value.path === "/" + ? value.path + value.name + : value.path + + "/" + + value.name + ) + } + > + + + + )} + + ))} + +
); } } @@ -187,4 +188,4 @@ PathSelectorCompoment.propTypes = { export default connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(PathSelectorCompoment)); +)(withTranslation()(withStyles(styles)(PathSelectorCompoment))); diff --git a/src/component/FileManager/Sidebar/SideDrawer.js b/src/component/FileManager/Sidebar/SideDrawer.js index d3924f0f..d98f3cf5 100644 --- a/src/component/FileManager/Sidebar/SideDrawer.js +++ b/src/component/FileManager/Sidebar/SideDrawer.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback, useEffect, useState } from "react"; import { makeStyles } from "@material-ui/core"; import { useDispatch, useSelector } from "react-redux"; @@ -133,59 +134,61 @@ export default function SideDrawer() { } }, [selected, sideBarOpen]); + const { t } = useTranslation(); + const classes = useStyles(); const propsItem = [ { - label: "大小", + label: t('Size'), value: (d, t) => sizeToString(d.size) + " (" + d.size.toLocaleString() + - " 字节)", + t('Bytes)'), show: (d) => true, }, { - label: "存储策略", + label: t('Storage Strategy'), value: (d, t) => d.policy, show: (d) => d.type === "file", }, { - label: "包含目录", - value: (d, t) => d.child_folder_num.toLocaleString() + " " + "个", + label: t('Include directory'), + value: (d, t) => d.child_folder_num.toLocaleString() + " " + t('individual'), show: (d) => d.type === "dir", }, { - label: "包含文件", - value: (d, t) => d.child_file_num.toLocaleString() + " " + "个", + label: t('Include file'), + value: (d, t) => d.child_file_num.toLocaleString() + " " + t('individual'), show: (d) => d.type === "dir", }, { - label: "所在目录", + label: t('Directory'), // eslint-disable-next-line react/display-name value: (d, t) => { const path = d.path === "" ? t.path : d.path; const name = filename(path); return ( - - NavigateTo(path)} - > - {name === "" ? "根目录" : name} - - + + NavigateTo(path)} + > + {name === "" ? t('Root directory') : name} + + ); }, show: (d) => true, }, { - label: "修改于", + label: t('Modified at'), value: (d, t) => formatLocalTime(d.updated_at, "YYYY/MM/DD H:mm:ss"), show: (d) => true, }, { - label: "创建于", + label: t('Built in'), value: (d) => formatLocalTime(d.created_at, "YYYY/MM/DD H:mm:ss"), show: (d) => true, }, @@ -218,13 +221,13 @@ export default function SideDrawer() { } })} {target.type === "dir" && ( - - 统计于{" "} - - + ( + {t('Statistics on')}{" "} + + ) )} )} diff --git a/src/component/Login/Activication.js b/src/component/Login/Activication.js index 07c7997b..83f7c491 100644 --- a/src/component/Login/Activication.js +++ b/src/component/Login/Activication.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback, useState, useEffect } from "react"; import { useDispatch } from "react-redux"; import { makeStyles } from "@material-ui/core"; @@ -74,32 +75,34 @@ function Activation() { // eslint-disable-next-line }, [location]); + const { t } = useTranslation(); + return ( -
- {success && ( - - - - - - 激活成功 - - - 您的账号已被成功激活。 - - - - )} -
+
+ {success && ( + + + + + + {t('Activated successfully')} + + + {t('Your account has been successfully activated.')} + + + + )} +
); } diff --git a/src/component/Login/LoginForm.js b/src/component/Login/LoginForm.js index 5a0c3bb8..8cc315a5 100644 --- a/src/component/Login/LoginForm.js +++ b/src/component/Login/LoginForm.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback, useEffect, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; import LockOutlinedIcon from "@material-ui/icons/LockOutlined"; @@ -135,6 +136,8 @@ function LoginForm() { setEmail(query.get("username")); }, [location]); + const { t } = useTranslation(); + const afterLogin = (data) => { Auth.authenticate(data); @@ -148,7 +151,7 @@ function LoginForm() { SetSessionStatus(true); history.push("/home"); - ToggleSnackbar("top", "right", "登录成功", "success"); + ToggleSnackbar("top", "right", t('Login successful'), "success"); localStorage.removeItem("siteConfigCache"); }; @@ -156,7 +159,7 @@ function LoginForm() { const authnLogin = (e) => { e.preventDefault(); if (!navigator.credentials) { - ToggleSnackbar("top", "right", "当前浏览器或环境不支持", "warning"); + ToggleSnackbar("top", "right", t('The current browser or environment does not support'), "warning"); return; } @@ -258,179 +261,179 @@ function LoginForm() { }; return ( -
- {!twoFA && ( - <> - - - - - - 登录 {title} - - {!useAuthn && ( -
- - - 电子邮箱 - - - setEmail(e.target.value) - } - autoComplete - value={email} - autoFocus - /> - - - - 密码 - - setPwd(e.target.value)} - type="password" - id="password" - value={pwd} - autoComplete - /> - - {loginCaptcha && } +
+ {!twoFA && ( + <> + + + + + + {t('Log in')} {title} + + {!useAuthn && ( + + + + {t('E-mail')} + + + setEmail(e.target.value) + } + autoComplete + value={email} + autoFocus + /> + + + + {t('Password')} + + setPwd(e.target.value)} + type="password" + id="password" + value={pwd} + autoComplete + /> + + {loginCaptcha && } - - - )} - {useAuthn && ( -
- - - 电子邮箱 - - - setEmail(e.target.value) - } - autoComplete - value={email} - autoFocus - /> - - -
- )} - -
-
- 忘记密码 -
-
- 注册账号 -
-
+ + + )} + {useAuthn && ( +
+ + + {t('E-mail')} + + + setEmail(e.target.value) + } + autoComplete + value={email} + autoFocus + /> + + +
+ )} + +
+
+ {t('Forgot password')} +
+
+ {t('Create an account')} +
+
- -
+ + - {authn && ( -
- -
- )} - - )} - {twoFA && ( - - - - - - 二步验证 - -
- - - 请输入六位二步验证代码 - - - setFACode(event.target.value) - } - autoComplete - value={faCode} - autoFocus - /> - - {" "} -
{" "} - -
- )} -
+ {authn && ( +
+ +
+ )} + + )} + {twoFA && ( + + + + + + {t('Two-step verification')} + +
+ + + {t('Please enter the six-digit two-step verification code')} + + + setFACode(event.target.value) + } + autoComplete + value={faCode} + autoFocus + /> + + {" "} +
{" "} + +
+ )} +
); } diff --git a/src/component/Login/Register.js b/src/component/Login/Register.js index 0fe2984d..08aa031b 100644 --- a/src/component/Login/Register.js +++ b/src/component/Login/Register.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; import RegIcon from "@material-ui/icons/AssignmentIndOutlined"; @@ -118,11 +119,13 @@ function Register() { } = useCaptcha(); const classes = useStyles(); + const { t } = useTranslation(); + const register = (e) => { e.preventDefault(); if (input.password !== input.password_repeat) { - ToggleSnackbar("top", "right", "两次密码输入不一致", "warning"); + ToggleSnackbar("top", "right", t('The two password entries are inconsistent'), "warning"); return; } @@ -142,7 +145,7 @@ function Register() { setEmailActive(true); } else { history.push("/login?username=" + input.email); - ToggleSnackbar("top", "right", "注册成功", "success"); + ToggleSnackbar("top", "right", t('registration success'), "success"); } }) .catch((error) => { @@ -153,101 +156,101 @@ function Register() { }; return ( -
- <> - {!emailActive && ( - - - - - - 注册 {title} - +
+ <> + {!emailActive && ( + + + + + + {t('Register')} {title} + -
- - - 电子邮箱 - - - - - 密码 - - - - - 确认密码 - - - - {regCaptcha && } + + + + {t('E-mail')} + + + + + {t('Password')} + + + + + {t('Confirm Password')} + + + + {regCaptcha && } - - + + - -
-
- 返回登录 -
-
- 忘记密码 -
-
-
- )} - {emailActive && ( - - - - - - 邮件激活 - - - 一封激活邮件已经发送至您的邮箱,请访问邮件中的链接以继续完成注册。 - - - )} - -
+ +
+
+ {t('Return to login')} +
+
+ {t('Forgot password')} +
+
+
+ )} + {emailActive && ( + + + + + + {t('Mail activation')} + + + {t('An activation email has been sent to your mailbox, please visit the link in the email to continue to complete the registration.')} + + + )} + +
); } diff --git a/src/component/Login/Reset.js b/src/component/Login/Reset.js index 9c3fc0a6..2686d6a4 100644 --- a/src/component/Login/Reset.js +++ b/src/component/Login/Reset.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; import { @@ -91,6 +92,8 @@ function Reset() { captchaParamsRef, } = useCaptcha(); + const { t } = useTranslation(); + const submit = (e) => { e.preventDefault(); setLoading(true); @@ -107,7 +110,7 @@ function Reset() { ToggleSnackbar( "top", "right", - "密码重置邮件已发送,请注意查收", + t('The password reset email has been sent, please check it'), "success" ); }) @@ -121,52 +124,52 @@ function Reset() { const classes = useStyles(); return ( -
- - - - - - 找回密码 - -
- - 注册邮箱 - - - {forgetCaptcha && } - {" "} - {" "} - -
-
- 返回登录 -
-
- 注册账号 -
-
-
-
+
+ + + + + + {t('Retrieve Password')} + +
+ + {t('register e-mail')} + + + {forgetCaptcha && } + {" "} + {" "} + +
+
+ {t('Return to login')} +
+
+ {t('Create an account')} +
+
+
+
); } diff --git a/src/component/Login/ResetForm.js b/src/component/Login/ResetForm.js index 313d0b21..dbaf9abf 100644 --- a/src/component/Login/ResetForm.js +++ b/src/component/Login/ResetForm.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback, useState } from "react"; import { useDispatch } from "react-redux"; import { makeStyles } from "@material-ui/core"; @@ -79,10 +80,12 @@ function ResetForm() { ); const history = useHistory(); + const { t } = useTranslation(); + const submit = (e) => { e.preventDefault(); if (input.password !== input.password_repeat) { - ToggleSnackbar("top", "right", "两次密码输入不一致", "warning"); + ToggleSnackbar("top", "right", t('The two password entries are inconsistent'), "warning"); return; } setLoading(true); @@ -94,7 +97,7 @@ function ResetForm() { .then(() => { setLoading(false); history.push("/login"); - ToggleSnackbar("top", "right", "密码已重设", "success"); + ToggleSnackbar("top", "right", t('Password has been reset'), "success"); }) .catch((error) => { setLoading(false); @@ -105,61 +108,61 @@ function ResetForm() { const classes = useStyles(); return ( -
- - - - - - 找回密码 - -
- - 新密码 - - - - 重复新密码 - - - {" "} -
{" "} - -
-
- 返回登录 -
-
- 注册账号 -
-
-
-
+
+ + + + + + {t('Retrieve Password')} + +
+ + {t('New password')} + + + + {t('Repeat new password')} + + + {" "} +
{" "} + +
+
+ {t('Return to login')} +
+
+ {t('Create an account')} +
+
+
+
); } diff --git a/src/component/Login/ResetPwdForm.js b/src/component/Login/ResetPwdForm.js index 04327a77..f50eea8a 100644 --- a/src/component/Login/ResetPwdForm.js +++ b/src/component/Login/ResetPwdForm.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import { connect } from "react-redux"; import KeyIcon from "@material-ui/icons/VpnKeyOutlined"; @@ -88,7 +89,7 @@ class ResetPwdFormCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "两次密码输入不一致", + this.props.t('The two password entries are inconsistent'), "warning" ); return; @@ -121,7 +122,7 @@ class ResetPwdFormCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "密码重设成功", + this.props.t('Password reset successfully'), "success" ); } @@ -147,61 +148,61 @@ class ResetPwdFormCompoment extends Component { const { classes } = this.props; return ( -
- - - - - - 找回密码 - -
- - 新密码 - - - - 重复新密码 - - - {" "} -
{" "} - -
-
- 返回登录 -
-
- 注册账号 -
-
-
-
+
+ + + + + + {this.props.t('Retrieve Password')} + +
+ + {this.props.t('New password')} + + + + {this.props.t('Repeat new password')} + + + {" "} +
{" "} + +
+
+ {this.props.t('Return to login')} +
+
+ {this.props.t('Create an account')} +
+
+
+
); } } @@ -209,6 +210,6 @@ class ResetPwdFormCompoment extends Component { const ResetPwdForm = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(ResetPwdFormCompoment)); +)(withTranslation()(withStyles(styles)(ResetPwdFormCompoment))); export default ResetPwdForm; diff --git a/src/component/Modals/AddTag.js b/src/component/Modals/AddTag.js index bf655c1f..551a3dbf 100644 --- a/src/component/Modals/AddTag.js +++ b/src/component/Modals/AddTag.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useState, useCallback } from "react"; import { makeStyles, useTheme } from "@material-ui/core"; import { @@ -217,188 +218,190 @@ export default function AddTag(props) { const classes = useStyles(); + const { t } = useTranslation(); + return ( - - setPathSelectDialog(false)} - aria-labelledby="form-dialog-title" - > - 选择目录 - + + setPathSelectDialog(false)} + aria-labelledby="form-dialog-title" + > + {t('Select Directory')} + - - - - - + + + + + - - - - - - - {value === 0 && ( - - - - - 你可以使用*作为通配符。比如 - *.png - 表示匹配png格式图像。多行规则间会以“或”的关系进行运算。 - - 图标: -
- - {Object.keys(icons).map((key, index) => ( - - {icons[key]} - - ))} - -
- 颜色: -
- - {[ - theme.palette.text.secondary, - "#f44336", - "#e91e63", - "#9c27b0", - "#673ab7", - "#3f51b5", - "#2196f3", - "#03a9f4", - "#00bcd4", - "#009688", - "#4caf50", - "#cddc39", - "#ffeb3b", - "#ffc107", - "#ff9800", - "#ff5722", - "#795548", - "#9e9e9e", - "#607d8b", - ].map((key, index) => ( - - - - ))} - -
-
- )} - {value === 1 && ( - - -
- + + + + + + {value === 0 && ( + + + + + {t('You can use')} * {t('as a wildcard. For example ')} + *.png + {t('Means matching png format images. Multi-line rules will be calculated in an "or" relationship.')} + + {t('Icon:')} +
+ + {Object.keys(icons).map((key, index) => ( + + {icons[key]} + + ))} + +
+ {t('Colour:')} +
+ + {[ + theme.palette.text.secondary, + "#f44336", + "#e91e63", + "#9c27b0", + "#673ab7", + "#3f51b5", + "#2196f3", + "#03a9f4", + "#00bcd4", + "#009688", + "#4caf50", + "#cddc39", + "#ffeb3b", + "#ffc107", + "#ff9800", + "#ff5722", + "#795548", + "#9e9e9e", + "#607d8b", + ].map((key, index) => ( + + + + ))} + +
+
+ )} + {value === 1 && ( + + +
+ + +
+
+ )} + + +
+ -
- - )} - - -
- -
-
-
+ )} + + + +
); } diff --git a/src/component/Modals/Compress.js b/src/component/Modals/Compress.js index 450dcdf5..3db0ee91 100644 --- a/src/component/Modals/Compress.js +++ b/src/component/Modals/Compress.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useState, useCallback } from "react"; import { makeStyles } from "@material-ui/core"; import { @@ -55,6 +56,8 @@ export default function CompressDialog(props) { [dispatch] ); + const { t } = useTranslation(); + const setMoveTarget = (folder) => { const path = folder.path === "/" @@ -91,7 +94,7 @@ export default function CompressDialog(props) { }) .then(() => { props.onClose(); - ToggleSnackbar("top", "right", "压缩任务已创建", "success"); + ToggleSnackbar("top", "right", t('Compression task has been created'), "success"); SetModalsLoading(false); }) .catch((error) => { @@ -103,54 +106,54 @@ export default function CompressDialog(props) { const classes = useStyles(); return ( - - 存放到 - + + {t('Save to')} + - {selectedPath !== "" && ( - - - setFileName(e.target.value)} - value={fileName} - fullWidth - autoFocus - id="standard-basic" - label="压缩文件名" + {selectedPath !== "" && ( + + + setFileName(e.target.value)} + value={fileName} + fullWidth + autoFocus + id="standard-basic" + label={t('Compressed file name')} + /> + + + )} + + +
+ -
- -
- -
+ )} + + + +
); } diff --git a/src/component/Modals/Copy.js b/src/component/Modals/Copy.js index 4428e5ee..5f122ad1 100644 --- a/src/component/Modals/Copy.js +++ b/src/component/Modals/Copy.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useState, useCallback } from "react"; import { makeStyles } from "@material-ui/core"; import { @@ -101,44 +102,46 @@ export default function CopyDialog(props) { const classes = useStyles(); + const { t } = useTranslation(); + return ( - - 复制到 - + + {t('copy to')} + - {selectedPath !== "" && ( - - - 复制到 {selectedPathName} - - - )} - - -
- -
-
-
+ {selectedPath !== "" && ( + + + {t('copy to')} {selectedPathName} + + + )} + + +
+ +
+
+
); } diff --git a/src/component/Modals/CreateShare.js b/src/component/Modals/CreateShare.js index d964a865..595b7b0a 100644 --- a/src/component/Modals/CreateShare.js +++ b/src/component/Modals/CreateShare.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback } from "react"; import { Checkbox, @@ -130,6 +131,8 @@ export default function CreatShare(props) { preview: true, }); + const { t } = useTranslation(); + const handleChange = (prop) => (event) => { // 输入密码 if (prop === "password") { @@ -220,242 +223,242 @@ export default function CreatShare(props) { const handleFocus = (event) => event.target.select(); return ( - - 创建分享链接 + + {t('Create a share link')} - {shareURL === "" && ( - <> - - - - - - - - - - - - - - - - - - 分享密码 - - - - - - - - - } - offIcon={ - - } - /> - - - } - labelWidth={70} - /> - - - - - - - - - - - - - - - - - - - - 或者 - - - - 后过期 - - - - - - - - - - - - - - - - - 是否允许在分享页面预览文件内容 - - - - - - - )} - {shareURL !== "" && ( - - - - )} + {shareURL === "" && ( + <> + + + + + + + + + + + + + + + + + + {t('Share Password')} + + + + + + + + + } + offIcon={ + + } + /> + + + } + labelWidth={70} + /> + + + + + + + + + + + + + + + + + + + + {t('or')} + + + + {t('Expires later')} + + + + + + + + + + + + + + + + + {t('Whether it is allowed to preview the content of the file on the sharing page')} + + + + + + + )} + {shareURL !== "" && ( + + + + )} - - + + - {shareURL === "" && ( -
- -
- )} -
-
+ {shareURL === "" && ( +
+ +
+ )} + +
); } diff --git a/src/component/Modals/CreateWebDAVAccount.js b/src/component/Modals/CreateWebDAVAccount.js index 8d644025..f7dad979 100644 --- a/src/component/Modals/CreateWebDAVAccount.js +++ b/src/component/Modals/CreateWebDAVAccount.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useState } from "react"; import { makeStyles } from "@material-ui/core"; import { Dialog } from "@material-ui/core"; @@ -42,6 +43,8 @@ export default function CreateWebDAVAccount(props) { const [selectedPathName, setSelectedPathName] = useState(""); const classes = useStyles(); + const { t } = useTranslation(); + const setMoveTarget = (folder) => { const path = folder.path === "/" @@ -67,83 +70,83 @@ export default function CreateWebDAVAccount(props) { }; return ( - - setPathSelectDialog(false)} - aria-labelledby="form-dialog-title" - > - 选择目录 - + + setPathSelectDialog(false)} + aria-labelledby="form-dialog-title" + > + {t('Select Directory')} + - - - - - -
-
-
-
- -
+ + + + +
+
+
+
+
+ +
- -
-
-
- -
-
- -
- -
-
-
-
- - - - -
+ + +
+
+ +
+
+ +
+ +
+
+ + + + + + +
); } diff --git a/src/component/Modals/Decompress.js b/src/component/Modals/Decompress.js index 68827ee5..bdf50851 100644 --- a/src/component/Modals/Decompress.js +++ b/src/component/Modals/Decompress.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useState, useCallback } from "react"; import { makeStyles } from "@material-ui/core"; import { @@ -50,6 +51,8 @@ export default function DecompressDialog(props) { [dispatch] ); + const { t } = useTranslation(); + const setMoveTarget = (folder) => { const path = folder.path === "/" @@ -70,7 +73,7 @@ export default function DecompressDialog(props) { }) .then(() => { props.onClose(); - ToggleSnackbar("top", "right", "解压缩任务已创建", "success"); + ToggleSnackbar("top", "right", t('Decompression task has been created'), "success"); SetModalsLoading(false); }) .catch((error) => { @@ -82,43 +85,43 @@ export default function DecompressDialog(props) { const classes = useStyles(); return ( - - 解压送至 - + + {t('Unzip and send to')} + - {selectedPath !== "" && ( - - - 解压送至 {selectedPathName} - - - )} - - -
- -
-
-
+ {selectedPath !== "" && ( + + + {t('Unzip and send to')} {selectedPathName} + + + )} + + +
+ +
+
+
); } diff --git a/src/component/Modals/SelectFile.js b/src/component/Modals/SelectFile.js index 29f0fe53..bb7459c2 100644 --- a/src/component/Modals/SelectFile.js +++ b/src/component/Modals/SelectFile.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useState, useEffect } from "react"; import { makeStyles } from "@material-ui/core"; import { @@ -41,6 +42,8 @@ export default function SelectFileDialog(props) { setFiles(props.files); }, [props.files]); + const { t } = useTranslation(); + const handleChange = (index) => (event) => { const filesCopy = [...files]; // eslint-disable-next-line @@ -69,50 +72,50 @@ export default function SelectFileDialog(props) { const classes = useStyles(); return ( - - 选择要下载的文件 - - {files.map((v, k) => { - return ( - - - - } - label={v.path} - /> - - - ); - })} - - - -
- -
-
-
+ + {t('Select the file to download')} + + {files.map((v, k) => { + return ( + + + + } + label={v.path} + /> + + + ); + })} + + + +
+ +
+
+
); } diff --git a/src/component/Modals/TimeZone.js b/src/component/Modals/TimeZone.js index d15fd9f6..0e89ab90 100644 --- a/src/component/Modals/TimeZone.js +++ b/src/component/Modals/TimeZone.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useState, useCallback, useEffect } from "react"; import { FormLabel, makeStyles } from "@material-ui/core"; import { @@ -35,9 +36,11 @@ export default function TimeZoneDialog(props) { [dispatch] ); + const { t } = useTranslation(); + const saveZoneInfo = () => { if (!validateTimeZone(timeZoneValue)) { - ToggleSnackbar("top", "right", "无效的时区名称", "warning"); + ToggleSnackbar("top", "right", t('Invalid time zone name'), "warning"); return; } Auth.SetPreference("timeZone", timeZoneValue); @@ -48,41 +51,41 @@ export default function TimeZoneDialog(props) { const classes = useStyles(); return ( - - 更改时区 + + {t('Change time zone')} - - - setTimeZoneValue(e.target.value)} - /> - - + + + setTimeZoneValue(e.target.value)} + /> + + - - -
- -
-
-
+ + +
+ +
+
+
); } diff --git a/src/component/Navbar/DarkModeSwitcher.js b/src/component/Navbar/DarkModeSwitcher.js index e2f181f6..2af302ff 100644 --- a/src/component/Navbar/DarkModeSwitcher.js +++ b/src/component/Navbar/DarkModeSwitcher.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback } from "react"; import { IconButton, makeStyles } from "@material-ui/core"; import DayIcon from "@material-ui/icons/Brightness7"; @@ -30,22 +31,25 @@ const DarkModeSwitcher = ({ position }) => { ToggleThemeMode(); }; const classes = useStyles(); + + const { t } = useTranslation(); + return ( - - - {isDayLight && } - {isDark && } - - + + + {isDayLight && } + {isDark && } + + ); }; diff --git a/src/component/Navbar/FileTags.js b/src/component/Navbar/FileTags.js index 903a9dea..2cf170cc 100644 --- a/src/component/Navbar/FileTags.js +++ b/src/component/Navbar/FileTags.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback, useState, Suspense } from "react"; import { Divider, @@ -160,6 +161,8 @@ export default function FileTag() { [dispatch] ); + const { t } = useTranslation(); + const getIcon = (icon, color) => { if (icons[icon]) { const IconComponent = icons[icon]; @@ -203,186 +206,184 @@ export default function FileTag() { }); }; - return ( - <> - - setAddTagModal(false)} - /> - - isHomePage && setTagOpen(!tagOpen)} + return <> + + setAddTagModal(false)} + /> + + isHomePage && setTagOpen(!tagOpen)} + > + - + !isHomePage && history.push("/home?path=%2F") + } > + + + {!(tagOpen && isHomePage) && ( + + )} + + + + + + + + setTagHover(null)}> - !isHomePage && history.push("/home?path=%2F") - } + id="pickfiles" + className={classes.hiddenButton} > - - {!(tagOpen && isHomePage) && ( - - )} + - + - - - - - setTagHover(null)}> + + + + + + + {[ + { + key: t('Video'), + id: "video", + icon: ( + + ), + }, + { + key: t('Pictures'), + id: "image", + icon: ( + + ), + }, + { + key: t('Audio'), + id: "audio", + icon: ( + + ), + }, + { + key: t('Documents'), + id: "doc", + icon: ( + + ), + }, + ].map((v) => ( SearchMyFile(v.id + "/internal")} > - - + + {v.icon} - + + ))} + {tags.map((v) => ( setTagHover(v.id)} + onClick={() => { + if (v.type === 0) { + SearchMyFile("tag/" + v.id); + } else { + NavigateTo(v.expression); + } + }} > - - + + {getIcon( + v.type === 0 + ? v.icon + : "FolderHeartOutline", + v.type === 0 ? v.color : null + )} - - - {[ - { - key: "视频", - id: "video", - icon: ( - - ), - }, - { - key: "图片", - id: "image", - icon: ( - - ), - }, - { - key: "音频", - id: "audio", - icon: ( - - ), - }, - { - key: "文档", - id: "doc", - icon: ( - - ), - }, - ].map((v) => ( - SearchMyFile(v.id + "/internal")} - > - - {v.icon} - - - - ))} - {tags.map((v) => ( - setTagHover(v.id)} - onClick={() => { - if (v.type === 0) { - SearchMyFile("tag/" + v.id); - } else { - NavigateTo(v.expression); - } - }} - > - - {getIcon( - v.type === 0 - ? v.icon - : "FolderHeartOutline", - v.type === 0 ? v.color : null - )} - - + - {tagHover === v.id && ( - submitDelete(v.id)} + {tagHover === v.id && ( + submitDelete(v.id)} + > + - - - - - )} - - ))} - - setAddTagModal(true)}> - - - - + + + + )} - {" "} - - - - - ); + ))} + + setAddTagModal(true)}> + + + + + + {" "} + + + + ; } diff --git a/src/component/Navbar/LanguageSwitcher.js b/src/component/Navbar/LanguageSwitcher.js new file mode 100644 index 00000000..b2a597be --- /dev/null +++ b/src/component/Navbar/LanguageSwitcher.js @@ -0,0 +1,33 @@ +import { useTranslation } from "react-i18next"; +import React from "react"; +import { Select, MenuItem } from "@material-ui/core"; +import Tooltip from "@material-ui/core/Tooltip"; +import i18next from "i18next"; + +const availableLanguages = ["en-US", "zh-CN"]; + +const LanguageSwitcher = () => { + const toggleLanguage = ({ target }) => { + i18next.changeLanguage(target.value); + }; + const { t } = useTranslation(); + + return ( + + + + ); +}; + +export default LanguageSwitcher; diff --git a/src/component/Navbar/Navbar.js b/src/component/Navbar/Navbar.js index 94fbe227..11e634c5 100644 --- a/src/component/Navbar/Navbar.js +++ b/src/component/Navbar/Navbar.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import PropTypes from "prop-types"; import classNames from "classnames"; @@ -43,6 +44,7 @@ import pathHelper from "../../utils/page"; import SezrchBar from "./SearchBar"; import StorageBar from "./StorageBar"; import UserAvatar from "./UserAvatar"; +import LanguageSwitcher from "./LanguageSwitcher"; import UserInfo from "./UserInfo"; import { AccountArrowRight, AccountPlus, LogoutVariant } from "mdi-material-ui"; import { withRouter } from "react-router-dom"; @@ -348,16 +350,16 @@ class NavbarCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "未登录用户无法预览", + this.props.t('Users who are not logged in cannot preview'), "warning" ); return; } - this.props.openLoadingDialog("获取下载地址..."); + this.props.openLoadingDialog(this.props.t('Get download address...')); }; archiveDownload = () => { - this.props.openLoadingDialog("打包中..."); + this.props.openLoadingDialog(this.props.t('Packing...')); }; signOut = () => { @@ -366,7 +368,7 @@ class NavbarCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "您已退出登录", + this.props.t('You have logged out'), "success" ); Auth.signout(); @@ -405,7 +407,7 @@ class NavbarCompoment extends Component { this.props.history.push("/shares?") } @@ -415,11 +417,11 @@ class NavbarCompoment extends Component { className={classes.iconFix} /> - + this.props.history.push("/aria2?") } @@ -429,7 +431,7 @@ class NavbarCompoment extends Component { className={classes.iconFix} /> - + {user.group.webdav && ( this.props.history.push("/tasks?") } @@ -460,7 +462,7 @@ class NavbarCompoment extends Component { className={classes.iconFix} /> - + @@ -471,7 +473,7 @@ class NavbarCompoment extends Component { this.props.history.push("/setting?") } @@ -481,12 +483,12 @@ class NavbarCompoment extends Component { className={classes.iconFix} /> - + @@ -494,7 +496,7 @@ class NavbarCompoment extends Component { className={classes.iconFix} /> - + @@ -509,7 +511,7 @@ class NavbarCompoment extends Component {
this.props.history.push("/login")} > @@ -517,17 +519,17 @@ class NavbarCompoment extends Component { className={classes.iconFix} /> - + this.props.history.push("/signup")} > - +
)} @@ -536,402 +538,406 @@ class NavbarCompoment extends Component { const iOS = process.browser && /iPad|iPhone|iPod/.test(navigator.userAgent); return ( -
- - - {this.props.selected.length <= 1 && - !( - !this.props.isMultiple && this.props.withFile - ) && ( - - - - )} - {this.props.selected.length <= 1 && - !( - !this.props.isMultiple && this.props.withFile - ) && ( - - this.props.handleDesktopToggle( - !this.props.desktopOpen - ) - } - className={classes.menuButtonDesktop} - > - - - )} - {(this.props.selected.length > 1 || - (!this.props.isMultiple && this.props.withFile)) && - (isHomePage || - pathHelper.isSharePage( - this.props.location.pathname - )) && ( - 1 || - (!this.props.isMultiple && - this.props.withFile) - } - > - - this.props.setSelectedTarget([]) - } - > - - - - )} - {this.props.selected.length <= 1 && - !( - !this.props.isMultiple && this.props.withFile - ) && ( - { - this.props.history.push("/"); - }} - > - {this.props.subTitle - ? this.props.subTitle - : this.props.title} - - )} +
+ + + {this.props.selected.length <= 1 && + !( + !this.props.isMultiple && this.props.withFile + ) && ( + + + + )} + {this.props.selected.length <= 1 && + !( + !this.props.isMultiple && this.props.withFile + ) && ( + + this.props.handleDesktopToggle( + !this.props.desktopOpen + ) + } + className={classes.menuButtonDesktop} + > + + + )} + {(this.props.selected.length > 1 || + (!this.props.isMultiple && this.props.withFile)) && + (isHomePage || + pathHelper.isSharePage( + this.props.location.pathname + )) && ( + 1 || + (!this.props.isMultiple && + this.props.withFile) + } + > + + this.props.setSelectedTarget([]) + } + > + + + + )} + {this.props.selected.length <= 1 && + !( + !this.props.isMultiple && this.props.withFile + ) && ( + { + this.props.history.push("/"); + }} + > + {this.props.subTitle + ? this.props.subTitle + : this.props.title} + + )} - {!this.props.isMultiple && - this.props.withFile && - !pathHelper.isMobile() && ( - - {this.props.selected[0].name}{" "} - {(isHomePage || - pathHelper.isSharePage( - this.props.location.pathname - )) && - "(" + - sizeToString( - this.props.selected[0].size - ) + - ")"} - - )} + {!this.props.isMultiple && + this.props.withFile && + !pathHelper.isMobile() && ( + + {this.props.selected[0].name}{" "} + {(isHomePage || + pathHelper.isSharePage( + this.props.location.pathname + )) && + "(" + + sizeToString( + this.props.selected[0].size + ) + + ")"} + + )} - {this.props.selected.length > 1 && - !pathHelper.isMobile() && ( - - {this.props.selected.length}个对象 - - )} - {this.props.selected.length <= 1 && - !( - !this.props.isMultiple && this.props.withFile - ) && } -
- {(this.props.selected.length > 1 || - (!this.props.isMultiple && this.props.withFile)) && - !isHomePage && - !pathHelper.isSharePage( - this.props.location.pathname - ) && - Auth.Check(this.props.isLogin) && - !checkGetParameters("share") && ( -
- - - this.props.saveFile() - } - > - - - -
- )} - {(this.props.selected.length > 1 || - (!this.props.isMultiple && this.props.withFile)) && - (isHomePage || isSharePage) && ( -
- {!this.props.isMultiple && - this.props.withFile && - isPreviewable( - this.props.selected[0].name - ) && ( - - - - this.props.openPreview() - } - > - - - - - )} - {!this.props.isMultiple && - this.props.withFile && ( - - - - this.openDownload() - } - > - - - - - )} - {(this.props.isMultiple || - this.props.withFolder) && - user.group.allowArchiveDownload && ( - - - - this.archiveDownload() - } - > - - - - - )} + {this.props.selected.length > 1 && + !pathHelper.isMobile() && ( + ( + {this.props.selected.length}{this.props.t('Objects')} + ) + )} + {this.props.selected.length <= 1 && + !( + !this.props.isMultiple && this.props.withFile + ) && } +
+ {(this.props.selected.length > 1 || + (!this.props.isMultiple && this.props.withFile)) && + !isHomePage && + !pathHelper.isSharePage( + this.props.location.pathname + ) && + Auth.Check(this.props.isLogin) && + !checkGetParameters("share") && ( +
+ + + this.props.saveFile() + } + > + + + +
+ )} + {(this.props.selected.length > 1 || + (!this.props.isMultiple && this.props.withFile)) && + (isHomePage || isSharePage) && ( +
+ {!this.props.isMultiple && + this.props.withFile && + isPreviewable( + this.props.selected[0].name + ) && ( + + + + this.props.openPreview() + } + > + + + + + )} + {!this.props.isMultiple && + this.props.withFile && ( + + + + this.openDownload() + } + > + + + + + )} + {(this.props.isMultiple || + this.props.withFolder) && + user.group.allowArchiveDownload && ( + + + + this.archiveDownload() + } + > + + + + + )} - {!this.props.isMultiple && - this.props.withFolder && ( - - - - this.props.navigateTo( - this.props - .path === - "/" - ? this.props - .path + - this - .props - .selected[0] - .name - : this.props - .path + - "/" + - this - .props - .selected[0] - .name - ) - } - > - - - - - )} - {!this.props.isMultiple && - !pathHelper.isMobile() && - !isSharePage && ( - - - - this.props.openShareDialog() - } - > - - - - - )} - {!this.props.isMultiple && !isSharePage && ( - - - - this.props.openRenameDialog() - } - > - - - - - )} - {!isSharePage && ( -
- {!pathHelper.isMobile() && ( - - - - this.props.openMoveDialog() - } - > - - - - - )} + {!this.props.isMultiple && + this.props.withFolder && ( + + + + this.props.navigateTo( + this.props + .path === + "/" + ? this.props + .path + + this + .props + .selected[0] + .name + : this.props + .path + + "/" + + this + .props + .selected[0] + .name + ) + } + > + + + + + )} + {!this.props.isMultiple && + !pathHelper.isMobile() && + !isSharePage && ( + + + + this.props.openShareDialog() + } + > + + + + + )} + {!this.props.isMultiple && !isSharePage && ( + + + + this.props.openRenameDialog() + } + > + + + + + )} + {!isSharePage && ( +
+ {!pathHelper.isMobile() && ( + + + + this.props.openMoveDialog() + } + > + + + + + )} - - - - this.props.openRemoveDialog() - } - > - - - - + + + + this.props.openRemoveDialog() + } + > + + + + - {pathHelper.isMobile() && ( - - - - this.props.changeContextMenu( - "file", - true - ) - } - > - - - - - )} -
- )} -
- )} - {this.props.selected.length <= 1 && - !( - !this.props.isMultiple && this.props.withFile - ) && } - {this.props.selected.length <= 1 && - !(!this.props.isMultiple && this.props.withFile) && - isHomePage && - pathHelper.isMobile() && } - - - {this.loadUploader()} + {pathHelper.isMobile() && ( + + + + this.props.changeContextMenu( + "file", + true + ) + } + > + + + + + )} +
+ )} +
+ )} + {this.props.selected.length <= 1 && + !( + !this.props.isMultiple && this.props.withFile + ) && } + {this.props.selected.length <= 1 && + !( + !this.props.isMultiple && this.props.withFile + ) && } + {this.props.selected.length <= 1 && + !(!this.props.isMultiple && this.props.withFile) && + isHomePage && + pathHelper.isMobile() && } + + + {this.loadUploader()} - - - this.setState(() => ({ mobileOpen: true })) - } - disableDiscovery={iOS} - ModalProps={{ - keepMounted: true, // Better open performance on mobile. - }} - > - {drawer} - - - - -
- {drawer} - - -
+ + + this.setState(() => ({ mobileOpen: true })) + } + disableDiscovery={iOS} + ModalProps={{ + keepMounted: true, // Better open performance on mobile. + }} + > + {drawer} + + + + +
+ {drawer} + + +
); } } @@ -943,6 +949,6 @@ NavbarCompoment.propTypes = { const Navbar = connect( mapStateToProps, mapDispatchToProps -)(withTheme(withStyles(styles)(withRouter(NavbarCompoment)))); +)(withTranslation()(withTheme(withStyles(styles)(withRouter(NavbarCompoment))))); export default Navbar; diff --git a/src/component/Navbar/SearchBar.js b/src/component/Navbar/SearchBar.js index 975af8bf..a0b7946e 100644 --- a/src/component/Navbar/SearchBar.js +++ b/src/component/Navbar/SearchBar.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import PropTypes from "prop-types"; import SearchIcon from "@material-ui/icons/Search"; @@ -146,74 +147,74 @@ class SearchBarCompoment extends Component { const isHomePage = pathHelper.isHomePage(this.props.location.pathname); return ( -
-
- -
- - - - - {({ TransitionProps }) => ( - - - {isHomePage && ( - - - - - - 在我的文件中搜索{" "} - - {this.state.input} - - - } - /> - - )} - - - - - - - 在全站分享中搜索{" "} +
+
+ +
+ + + + + {({ TransitionProps }) => ( + + + {isHomePage && ( + + + + + + {this.props.t('Search in my files')}{" "} {this.state.input} - - } - /> - - - - )} - -
+ + } + /> +
+ )} + + + + + + + {this.props.t('Search in site-wide sharing')}{" "} + + {this.state.input} + + + } + /> + +
+
+ )} +
+
); } } @@ -225,6 +226,6 @@ SearchBarCompoment.propTypes = { const SearchBar = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(withRouter(SearchBarCompoment))); +)(withTranslation()(withStyles(styles)(withRouter(SearchBarCompoment)))); export default SearchBar; diff --git a/src/component/Navbar/SideDrawer.js b/src/component/Navbar/SideDrawer.js index 5ea6316f..f78a64c3 100644 --- a/src/component/Navbar/SideDrawer.js +++ b/src/component/Navbar/SideDrawer.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import PropTypes from "prop-types"; import UploadIcon from "@material-ui/icons/CloudUpload"; @@ -44,11 +45,11 @@ class SideDrawer extends Component {
- + - + @@ -94,4 +95,4 @@ SideDrawer.propTypes = { classes: PropTypes.object.isRequired, }; -export default withStyles(styles)(SideDrawer); +export default withTranslation()(withStyles(styles)(SideDrawer)); diff --git a/src/component/Navbar/StorageBar.js b/src/component/Navbar/StorageBar.js index 575c78f5..e9490579 100644 --- a/src/component/Navbar/StorageBar.js +++ b/src/component/Navbar/StorageBar.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import PropTypes from "prop-types"; import StorageIcon from "@material-ui/icons/Storage"; @@ -107,7 +108,7 @@ class StorageBarCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "您的已用容量已超过容量配额,请尽快删除多余文件或购买容量", + this.props.t('Your used capacity has exceeded the capacity quota, please delete extra files or purchase capacity as soon as possible'), "warning" ); } else { @@ -126,56 +127,56 @@ class StorageBarCompoment extends Component { render() { const { classes } = this.props; return ( -
this.setState({ showExpand: true })} - onMouseLeave={() => this.setState({ showExpand: false })} - className={classes.stickFooter} - > - - -
- -
- 存储空间{" "} - -
- this.setState({ showExpand: true })} + onMouseLeave={() => this.setState({ showExpand: false })} + className={classes.stickFooter} + > + + +
+ +
+ {this.props.t('Storage')}{" "} + +
+ + - - {this.state.used === null - ? " -- " - : this.state.used} - {" / "} - {this.state.total === null - ? " -- " - : this.state.total} - - -
+ {this.state.used === null + ? " -- " + : this.state.used} + {" / "} + {this.state.total === null + ? " -- " + : this.state.total} + +
-
-
-
+
+
+
+
); } } @@ -187,6 +188,6 @@ StorageBarCompoment.propTypes = { const StorageBar = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(withRouter(StorageBarCompoment))); +)(withTranslation()(withStyles(styles)(withRouter(StorageBarCompoment)))); export default StorageBar; diff --git a/src/component/Navbar/UserAvatar.js b/src/component/Navbar/UserAvatar.js index b9e28b8e..e9c172bb 100644 --- a/src/component/Navbar/UserAvatar.js +++ b/src/component/Navbar/UserAvatar.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import PropTypes from "prop-types"; import { connect } from "react-redux"; @@ -99,63 +100,63 @@ class UserAvatarCompoment extends Component { ); return ( -
- -
- {!isAdminPage && ( - <> - - {loginCheck && ( - <> - - - this.props.history.push( - "/setting?" - ) - } - color="inherit" - > - - - - - )} - - )} - {isAdminPage && ( - - - - - - )} - - {!loginCheck && } - {loginCheck && ( - - )} - {" "} -
-
- -
+
+ +
+ {!isAdminPage && ( + <> + + {loginCheck && ( + <> + + + this.props.history.push( + "/setting?" + ) + } + color="inherit" + > + + + + + )} + + )} + {isAdminPage && ( + + + + + + )} + + {!loginCheck && } + {loginCheck && ( + + )} + {" "} +
+
+ +
); } } @@ -167,6 +168,6 @@ UserAvatarCompoment.propTypes = { const UserAvatar = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(withRouter(UserAvatarCompoment))); +)(withTranslation()(withStyles(styles)(withRouter(UserAvatarCompoment)))); export default UserAvatar; diff --git a/src/component/Navbar/UserAvatarPopover.js b/src/component/Navbar/UserAvatarPopover.js index 8176559b..d423b50f 100644 --- a/src/component/Navbar/UserAvatarPopover.js +++ b/src/component/Navbar/UserAvatarPopover.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import PropTypes from "prop-types"; import { connect } from "react-redux"; @@ -87,7 +88,7 @@ class UserAvatarPopoverCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "您已退出登录", + this.props.t('You have logged out'), "success" ); Auth.signout(); @@ -115,125 +116,125 @@ class UserAvatarPopoverCompoment extends Component { ); return ( - - {!Auth.Check() && ( -
- - this.props.history.push("/login")} - > - - - - 登录 - - this.props.history.push("/signup")} - > - - - - 注册 - -
- )} - {Auth.Check() && ( -
-
-
- -
-
- {user.nickname} - - {user.user_name} - - -
-
-
- - {!isAdminPage && ( - { - this.handleClose(); - this.props.history.push( - "/profile/" + user.id - ); - }} - > - - - - 个人主页 - - )} - {user.group.id === 1 && ( - { - this.handleClose(); - this.props.history.push("/admin/home"); - }} - > - - - - 管理面板 - - )} - - + + {!Auth.Check() && ( +
+ + this.props.history.push("/login")} + > + + + + {this.props.t('Log in')} + + this.props.history.push("/signup")} + > + + + + {this.props.t('Register')} + +
+ )} + {Auth.Check() && ( +
+
+
+ +
+
+ {user.nickname} + + {user.user_name} + + +
+
+
+ + {!isAdminPage && ( + ( { + this.handleClose(); + this.props.history.push( + "/profile/" + user.id + ); + }} + > - + - 退出登录 - -
-
- )} -
+ {this.props.t('Homepage')} +
) + )} + {user.group.id === 1 && ( + ( { + this.handleClose(); + this.props.history.push("/admin/home"); + }} + > + + + + {this.props.t('Admin Panel')} + ) + )} + + + + + + {this.props.t('Sign out')} + +
+
+ )} +
); } } @@ -245,6 +246,6 @@ UserAvatarPopoverCompoment.propTypes = { const UserAvatarPopover = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(withRouter(UserAvatarPopoverCompoment))); +)(withTranslation()(withStyles(styles)(withRouter(UserAvatarPopoverCompoment)))); export default UserAvatarPopover; diff --git a/src/component/Navbar/UserInfo.js b/src/component/Navbar/UserInfo.js index e2747528..c8415735 100644 --- a/src/component/Navbar/UserInfo.js +++ b/src/component/Navbar/UserInfo.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import PropTypes from "prop-types"; import { connect } from "react-redux"; @@ -100,43 +101,43 @@ class UserInfoCompoment extends Component { const user = Auth.GetUser(this.props.isLogin); return ( -
-
- {/* eslint-disable-next-line */} - - {isLogin && ( - - )} - {!isLogin && ( - - )} - - -
-
- - {isLogin ? user.nickname : "未登录"} - - - {isLogin ? user.group.name : "游客"} - -
-
+
+
+ {/* eslint-disable-next-line */} + + {isLogin && ( + + )} + {!isLogin && ( + + )} + + +
+
+ + {isLogin ? user.nickname : this.props.t('Not logged in')} + + + {isLogin ? user.group.name : this.props.t('Guest')} + +
+
); } } @@ -148,6 +149,6 @@ UserInfoCompoment.propTypes = { const UserInfo = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(UserInfoCompoment)); +)(withTranslation()(withStyles(styles)(UserInfoCompoment))); export default UserInfo; diff --git a/src/component/Placeholder/ErrorBoundary.js b/src/component/Placeholder/ErrorBoundary.js index 2311df43..3f4aa3db 100644 --- a/src/component/Placeholder/ErrorBoundary.js +++ b/src/component/Placeholder/ErrorBoundary.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React from "react"; import { withStyles } from "@material-ui/core"; @@ -33,33 +34,31 @@ class ErrorBoundary extends React.Component { const { classes } = this.props; if (this.state.hasError) { // 你可以自定义降级后的 UI 并渲染 - return ( - <> -

:(

-

- 页面渲染出现错误,请尝试刷新此页面。 -

- {this.state.error && - this.state.errorInfo && - this.state.errorInfo.componentStack && ( -
- 错误详情 -
-                                    {this.state.error.toString()}
-                                
-
-                                    
-                                        {this.state.errorInfo.componentStack}
-                                    
-                                
-
- )} - - ); + return <> +

:(

+

+ {this.props.t('There was an error in page rendering, please try to refresh this page.')} +

+ {this.state.error && + this.state.errorInfo && + this.state.errorInfo.componentStack && ( +
+ {this.props.t('Error details')} +
+                                {this.state.error.toString()}
+                            
+
+                                
+                                    {this.state.errorInfo.componentStack}
+                                
+                            
+
+ )} + ; } return this.props.children; } } -export default withStyles(styles)(ErrorBoundary); +export default withTranslation()(withStyles(styles)(ErrorBoundary)); diff --git a/src/component/Setting/Authn.js b/src/component/Setting/Authn.js index fac8d02d..71128995 100644 --- a/src/component/Setting/Authn.js +++ b/src/component/Setting/Authn.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useState, useCallback } from "react"; import { Button, @@ -56,12 +57,14 @@ export default function Authn(props) { [dispatch] ); + const { t } = useTranslation(); + const deleteCredential = (id) => { API.patch("/user/setting/authn", { id: id, }) .then(() => { - ToggleSnackbar("top", "right", "凭证已删除", "success"); + ToggleSnackbar("top", "right", t('Credentials have been deleted'), "success"); props.remove(id); }) .catch((error) => { @@ -76,7 +79,7 @@ export default function Authn(props) { const addCredential = () => { if (!navigator.credentials) { - ToggleSnackbar("top", "right", "当前浏览器或环境不支持", "warning"); + ToggleSnackbar("top", "right", t('The current browser or environment does not support'), "warning"); return; } @@ -129,7 +132,7 @@ export default function Authn(props) { }) .then((response) => { props.add(response.data); - ToggleSnackbar("top", "right", "验证器已添加", "success"); + ToggleSnackbar("top", "right", t('Verifier has been added'), "success"); return; }) .catch((error) => { @@ -139,71 +142,71 @@ export default function Authn(props) { }; return ( -
- setConfirm(false)}> - 删除凭证 - 确定要吊销这个凭证吗? - - - - - +
+ setConfirm(false)}> + {t('Delete Credentials')} + {t('Are you sure you want to revoke this certificate?')} + + + + + - - 外部认证器 - - - - {props.list.map((v) => ( - <> - { - setConfirm(true); - setSelected(v.id); - }} - > - - - - + + {t('External Authenticator')} + + + + {props.list.map((v) => ( + <> + { + setConfirm(true); + setSelected(v.id); + }} + > + + + + - deleteCredential(v.id)} - className={classes.flexContainer} - > - - - - - - ))} - addCredential()}> - - - - + deleteCredential(v.id)} + className={classes.flexContainer} + > + + + + + + ))} + addCredential()}> + + + + - - - - - - -
+ + + + + + +
); } diff --git a/src/component/Setting/Profile.js b/src/component/Setting/Profile.js index d77ea313..df95b4b4 100644 --- a/src/component/Setting/Profile.js +++ b/src/component/Setting/Profile.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import { connect } from "react-redux"; import { toggleSnackbar } from "../../actions"; @@ -192,232 +193,232 @@ class ProfileCompoment extends Component { const { classes } = this.props; return ( -
- {this.state.user === null &&
} - {this.state.user !== null && ( - -
-
- -
-
- - {this.state.user.nick} - -
-
- - - - - - {this.state.listType === 2 && ( -
- - - - UID - - - {this.state.user.id} - - - - - 昵称 - - - {this.state.user.nick} - - - - - 用户组 - - - {this.state.user.group} - - - - - 分享总数 - - - {this.state.total} - - - - - 注册日期 - - - {this.state.user.date} - - - -
- )} - {(this.state.listType === 0 || - this.state.listType === 1) && ( -
-
- - - - 文件名 - - 分享日期 - - - 下载次数 - - - 浏览次数 - - - - - {this.state.shareList.map( - (row, id) => ( - - this.props.history.push( - "/s/" + row.key - ) - } - > - - - {row.source - ? row.source - .name - : "[已失效]"} - - - - {row.create_date} - - - {row.downloads} - - - {row.views} - - - ) - )} - -
-
- {this.state.shareList.length !== 0 && - this.state.listType === 0 && ( -
- - this.loadList( - v, - this.state.listType === - 0 - ? "default" - : "hot" - ) - } - color="secondary" - /> -
- )} -
- )} -
- )} -
+
+ {this.state.user === null &&
} + {this.state.user !== null && ( + +
+
+ +
+
+ + {this.state.user.nick} + +
+
+ + + + + + {this.state.listType === 2 && ( +
+ + + + UID + + + {this.state.user.id} + + + + + {this.props.t('Nickname')} + + + {this.state.user.nick} + + + + + {this.props.t('User group')} + + + {this.state.user.group} + + + + + {this.props.t('Total Shares')} + + + {this.state.total} + + + + + {this.props.t('Registration Date')} + + + {this.state.user.date} + + + +
+ )} + {(this.state.listType === 0 || + this.state.listType === 1) && ( +
+
+ + + + {this.props.t('File name')} + + {this.props.t('Share Date')} + + + {this.props.t('download times')} + + + {this.props.t('Views')} + + + + + {this.state.shareList.map( + (row, id) => ( + + this.props.history.push( + "/s/" + row.key + ) + } + > + + + {row.source + ? row.source + .name + : this.props.t('[expired]')} + + + + {row.create_date} + + + {row.downloads} + + + {row.views} + + + ) + )} + +
+
+ {this.state.shareList.length !== 0 && + this.state.listType === 0 && ( +
+ + this.loadList( + v, + this.state.listType === + 0 + ? "default" + : "hot" + ) + } + color="secondary" + /> +
+ )} +
+ )} +
+ )} +
); } } @@ -425,6 +426,6 @@ class ProfileCompoment extends Component { const Profile = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(withRouter(ProfileCompoment))); +)(withTranslation()(withStyles(styles)(withRouter(ProfileCompoment)))); export default Profile; diff --git a/src/component/Setting/Tasks.js b/src/component/Setting/Tasks.js index 8f7ba624..845693ef 100644 --- a/src/component/Setting/Tasks.js +++ b/src/component/Setting/Tasks.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useState, useCallback, useEffect } from "react"; import { makeStyles, Typography } from "@material-ui/core"; import { useDispatch } from "react-redux"; @@ -59,6 +60,8 @@ export default function Tasks() { [dispatch] ); + const { t } = useTranslation(); + const loadList = (page) => { API.get("/user/setting/tasks?page=" + page) .then((response) => { @@ -83,71 +86,71 @@ export default function Tasks() { const res = JSON.parse(error); return res.msg; } catch (e) { - return "未知"; + return t('unknown'); } }; const classes = useStyles(); return ( -
- - 任务队列 - - - - - - 创建于 - - 任务类型 - - - 状态 - - - 最后进度 - - 错误信息 - - - - {tasks.map((row, id) => ( - - - {formatLocalTime( - row.create_date, - "YYYY-MM-DD H:mm:ss" - )} - - - {getTaskType(row.type)} - - - {getTaskStatus(row.status)} - - - {getTaskProgress(row.type, row.progress)} - - - {getError(row.error)} - - - ))} - -
-
- setPage(v)} - color="secondary" - /> -
-
-
+
+ + {t('Task Queue')} + + + + + + {t('Built in')} + + {t('Task Type')} + + + {t('state')} + + + {t('Final Progress')} + + {t('Error Message')} + + + + {tasks.map((row, id) => ( + + + {formatLocalTime( + row.create_date, + "YYYY-MM-DD H:mm:ss" + )} + + + {getTaskType(row.type)} + + + {getTaskStatus(row.status)} + + + {getTaskProgress(row.type, row.progress)} + + + {getError(row.error)} + + + ))} + +
+
+ setPage(v)} + color="secondary" + /> +
+
+
); } diff --git a/src/component/Setting/UserSetting.js b/src/component/Setting/UserSetting.js index f28ba8ae..c0af30c4 100644 --- a/src/component/Setting/UserSetting.js +++ b/src/component/Setting/UserSetting.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import { connect } from "react-redux"; import PhotoIcon from "@material-ui/icons/InsertPhoto"; @@ -279,7 +280,7 @@ class UserSettingCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "头像已更新,刷新后生效", + this.props.t('The avatar has been updated and will take effect after refreshing'), "success" ); this.setState({ @@ -310,7 +311,7 @@ class UserSettingCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "昵称已更改,刷新后生效", + this.props.t('The nickname has been changed and will take effect after refreshing'), "success" ); this.setState({ @@ -346,7 +347,7 @@ class UserSettingCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "头像已更新,刷新后生效", + this.props.t('The avatar has been updated and will take effect after refreshing'), "success" ); this.setState({ @@ -374,7 +375,7 @@ class UserSettingCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "设置已保存", + this.props.t('Settings have been saved'), "success" ); this.setState({ @@ -399,7 +400,7 @@ class UserSettingCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "两次密码输入不一致", + this.props.t('The two password entries are inconsistent'), "warning" ); return; @@ -415,7 +416,7 @@ class UserSettingCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "密码已更新", + this.props.t('Password has been updated'), "success" ); this.setState({ @@ -447,7 +448,7 @@ class UserSettingCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "主题配色已更换", + this.props.t('The theme color has been changed'), "success" ); this.props.applyThemes(this.state.chosenTheme); @@ -546,7 +547,7 @@ class UserSettingCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "设定已保存", + this.props.t('Settings saved'), "success" ); this.setState({ @@ -590,703 +591,704 @@ class UserSettingCompoment extends Component { const dark = Auth.GetPreference("theme_mode"); return ( -
-
- - 个人资料 - - - - - this.setState({ avatarModal: true }) - } - > - - - - - - - - - - - - - - +
+
+ + {this.props.t('personal information')} + + + + + this.setState({ avatarModal: true }) + } + > + + + + + + + + + + + + + + - - - {this.state.settings.uid} - - - - - - this.setState({ nickModal: true }) - } - > - - - - + + + {this.state.settings.uid} + + + + + + this.setState({ nickModal: true }) + } + > + + + + - - this.setState({ nickModal: true }) - } - className={classes.flexContainer} - > - - {user.nickname} - - - - - - - - - - + + this.setState({ nickModal: true }) + } + className={classes.flexContainer} + > + + {user.nickname} + + + + + + + + + + - - - {user.user_name} - - - - - - - - - + + + {user.user_name} + + + + + + + + + - - - {user.group.name} - - - - - - - - - + + + {user.group.name} + + + + + + + + + - - - {formatLocalTime( - user.created_at, - "YYYY-MM-DD H:mm:ss" - )} - - - - - - - 安全隐私 - - - - - - - - + + + {formatLocalTime( + user.created_at, + "YYYY-MM-DD H:mm:ss" + )} + + + + + + + {this.props.t('Security and Privacy')} + + + + + + + + - - - - - - - this.setState({ changePassword: true }) - } - > - - - - + + + + + + + this.setState({ changePassword: true }) + } + > + + + + - - - - - - this.init2FA()}> - - - - + + + + + + this.init2FA()}> + + + + - - - {!this.state.settings.two_factor - ? "未开启" - : "已开启"} - - - - - - + + + {!this.state.settings.two_factor + ? this.props.t('Not configured') + : this.props.t('activated')} + + + + + + - { - this.setState({ - settings: { - ...this.state.settings, - authn: [ - ...this.state.settings.authn, - credential, - ], - }, - }); - }} - remove={(id) => { - let credentials = [...this.state.settings.authn]; - credentials = credentials.filter((v) => { - return v.id !== id; - }); - this.setState({ - settings: { - ...this.state.settings, - authn: credentials, - }, - }); - }} - /> + { + this.setState({ + settings: { + ...this.state.settings, + authn: [ + ...this.state.settings.authn, + credential, + ], + }, + }); + }} + remove={(id) => { + let credentials = [...this.state.settings.authn]; + credentials = credentials.filter((v) => { + return v.id !== id; + }); + this.setState({ + settings: { + ...this.state.settings, + authn: credentials, + }, + }); + }} + /> - - 个性化 - - - - - this.setState({ changeTheme: true }) - } - > - - - - + + {this.props.t('Personalise')} + + + + + this.setState({ changeTheme: true }) + } + > + + + + - -
-
-
-
- - this.toggleThemeMode(dark)} - > - - - - + +
+
+
+
+ + this.toggleThemeMode(dark)} + > + + + + - - - {dark && - (dark === "dark" - ? "偏好开启" - : "偏好关闭")} - {dark === null && "跟随系统"} - - - - - - this.toggleViewMethod()} - > - - - - + + + {dark && + (dark === "dark" + ? this.props.t('Preferences on') + : this.props.t('Preferences off'))} + {dark === null && this.props.t('Follow the system')} + + + + + + this.toggleViewMethod()} + > + + + + - - - {this.props.viewMethod === "icon" && - "大图标"} - {this.props.viewMethod === "list" && - "列表"} - {this.props.viewMethod === - "smallIcon" && "小图标"} - - - - - - - this.setState({ changeTimeZone: true }) - } - button - > - - - - + + + {this.props.viewMethod === "icon" && + this.props.t('Large Icon')} + {this.props.viewMethod === "list" && + this.props.t('List')} + {this.props.viewMethod === + "smallIcon" && this.props.t('Small Icon')} + + + + + + + this.setState({ changeTimeZone: true }) + } + button + > + + + + - - - {timeZone} - - - - -
-
- {user.group.webdav && ( -
- - WebDAV - - - - - this.setState({ - showWebDavUrl: true, - }) - } - > - - - - + + + {timeZone} + + + + + + + {user.group.webdav && ( +
+ + WebDAV + + + + + this.setState({ + showWebDavUrl: true, + }) + } + > + + + + - - - - - - - this.setState({ - showWebDavUserName: true, - }) - } - > - - - - + + + + + + + this.setState({ + showWebDavUserName: true, + }) + } + > + + + + - - - - - - - this.props.history.push("/webdav?") - } - > - - - - + + + + + + + this.props.history.push("/webdav?") + } + > + + + + - - - - - - -
- )} -
-
- this.setState({ changeTimeZone: false })} - open={this.state.changeTimeZone} - /> - - 修改头像 - - - - - - - - - - - - - - - - - - - - - - - - - 修改昵称 - - - - - - - - - - 修改登录密码 - -
- -
-
- -
-
- -
-
- - - - -
- - - {this.state.settings.two_factor ? "关闭" : "启用"} - 二步验证 - - -
- {!this.state.settings.two_factor && ( -
- + + + + + + + + + + + + + + + + + + + + +
+ + {this.props.t('Change username')} + + + + + + + + + + {this.props.t('Change password')} + +
+ +
+
+ +
+
+ +
+
+ + + + +
+ + + {this.state.settings.two_factor ? this.props.t('Close') : this.props.t('Enable')} + { } + {this.props.t('Two-step verification')} + + +
+ {!this.state.settings.two_factor && ( +
+ -
-
-
- - - - -
- - 更改主题配色 - - - {Object.keys(this.state.settings.themes).map( - (value, key) => ( - -
- - ) - )} - - - - - - -
- - WebDAV连接地址 - - - - - - - - - WebDAV用户名 - - - - - - - -
+
+ {!this.state.settings.two_factor && ( + ( + {this.props.t('Please use any two-step verification APP or password management software that supports two-step verification to scan the QR code on the left to add this site. After scanning, please fill in the 6-digit verification code given by the two-step verification APP to enable the two-step verification. ')} + ) + )} + {this.state.settings.two_factor && ( + ( + {this.props.t('Please verify the current two-step verification code.')} + ) + )} + +
+
+ + + + + + + + {this.props.t('Change theme color')} + + + {Object.keys(this.state.settings.themes).map( + (value, key) => ( + +
+ + ) + )} + + + + + + +
+ + {this.props.t('WebDAV connection address')} + + + + + + + + + {this.props.t('WebDAV username')} + + + + + + + +
); } } @@ -1294,6 +1296,6 @@ class UserSettingCompoment extends Component { const UserSetting = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(withRouter(UserSettingCompoment))); +)(withTranslation()(withStyles(styles)(withRouter(UserSettingCompoment)))); export default UserSetting; diff --git a/src/component/Setting/WebDAV.js b/src/component/Setting/WebDAV.js index 558944ab..09f92a4c 100644 --- a/src/component/Setting/WebDAV.js +++ b/src/component/Setting/WebDAV.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useState, useCallback, useEffect } from "react"; import { makeStyles, Typography } from "@material-ui/core"; import { useDispatch } from "react-redux"; @@ -63,9 +64,11 @@ export default function WebDAV() { [dispatch] ); + const { t } = useTranslation(); + const copyToClipboard = (text) => { navigator.clipboard.writeText(text); - ToggleSnackbar("top", "center", "已复制到剪切板", "success"); + ToggleSnackbar("top", "center", t('Copied to clipboard'), "success"); }; const loadList = () => { @@ -124,113 +127,113 @@ export default function WebDAV() { const user = Auth.GetUser(); return ( -
- setCreate(false)} - /> - - WebDAV - - - setTab(newValue)} - aria-label="disabled tabs example" - > - - -
- {tab === 0 && ( -
- - WebDAV的地址为: - {window.location.origin + "/dav"} - ;登陆用户名统一为:{user.user_name}{" "} - ;密码为所创建账号的密码。 - - - - - - 备注名 - 密码 - - 根目录 - - - 创建日期 - - - 操作 - - - - - {accounts.map((row, id) => ( - - - {row.Name} - - - {row.Password} - - copyToClipboard( - row.Password - ) - } - href={"javascript:void"} - > - 复制 - - - - {row.Root} - - - - - - - deleteAccount(id) - } - > - - - - - ))} - -
-
- -
- )} -
-
-
+
+ setCreate(false)} + /> + + WebDAV + + + setTab(newValue)} + aria-label="disabled tabs example" + > + + +
+ {tab === 0 && ( +
+ + {t('The address of WebDAV is: ')} + {window.location.origin + "/dav"} + {t('; The login user name is unified as: ')}{user.user_name}{" "} + {t(';The password is the password of the created account.')} + + + + + + {t('Label')} + {t('Password')} + + {t('Root directory')} + + + {t('Created Date')} + + + {t('Action')} + + + + + {accounts.map((row, id) => ( + + + {row.Name} + + + {row.Password} + + copyToClipboard( + row.Password + ) + } + href={"javascript:void"} + > + {t('copy')} + + + + {row.Root} + + + + + + + deleteAccount(id) + } + > + + + + + ))} + +
+
+ +
+ )} +
+
+
); } diff --git a/src/component/Share/Creator.js b/src/component/Share/Creator.js index 951396ed..1315fd43 100644 --- a/src/component/Share/Creator.js +++ b/src/component/Share/Creator.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React from "react"; import { makeStyles } from "@material-ui/core/styles"; import { Avatar, Typography } from "@material-ui/core"; @@ -30,14 +31,14 @@ export default function Creator(props) { const classes = useStyles(); const history = useHistory(); + const { t } = useTranslation(); + const getSecondDes = () => { if (props.share.expire > 0) { if (props.share.expire >= 24 * 3600) { - return ( - Math.round(props.share.expire / (24 * 3600)) + " 天后到期" - ); + return Math.round(props.share.expire / (24 * 3600)) + t('Expires in days'); } - return Math.round(props.share.expire / 3600) + " 小时后到期"; + return Math.round(props.share.expire / 3600) + t('Expires in hours'); } return formatLocalTime(props.share.create_date, "YYYY-MM-DD H:mm:ss"); }; @@ -48,45 +49,45 @@ export default function Creator(props) { }; return ( -
- userProfile()} - /> - - {props.isFolder && ( - <> - 此分享由{" "} - userProfile()} - href={"javascript:void(0)"} - color="inherit" - > - {props.share.creator.nick} - {" "} - 创建 - - )} - {!props.isFolder && ( - <> - {" "} - userProfile()} - href={"javascript:void(0)"} - color="inherit" - > - {props.share.creator.nick} - {" "} - 向您分享了 1 个文件 - - )} - - - {props.share.views} 次浏览 • {props.share.downloads} 次下载 •{" "} - {getSecondDes()} - -
+
+ userProfile()} + /> + + {props.isFolder && ( + (<> + {t('This is shared by')}{" "} + userProfile()} + href={"javascript:void(0)"} + color="inherit" + > + {props.share.creator.nick} + {" "} + {t('create')} + ) + )} + {!props.isFolder && ( + (<> + {" "} + userProfile()} + href={"javascript:void(0)"} + color="inherit" + > + {props.share.creator.nick} + {" "} + {t('Shared a file with you')} + ) + )} + + + {props.share.views} {t('Views •')} {props.share.downloads} {t('Downloads •')}{" "} + {getSecondDes()} + +
); } diff --git a/src/component/Share/LockedFile.js b/src/component/Share/LockedFile.js index c681ce3e..b6bf8391 100644 --- a/src/component/Share/LockedFile.js +++ b/src/component/Share/LockedFile.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import { connect } from "react-redux"; import { toggleSnackbar } from "../../actions"; @@ -77,56 +78,56 @@ class LockedFileCompoment extends Component { const { classes } = this.props; return ( -
- - - } - title={this.props.share.creator.nick + " 的加密分享"} - subheader={this.props.share.create_date} - /> - - -
- - -
- - - -
-
+
+ + + } + title={this.props.share.creator.nick + this.props.t('\'S encrypted sharing')} + subheader={this.props.share.create_date} + /> + + +
+ + +
+ + + +
+
); } } @@ -134,6 +135,6 @@ class LockedFileCompoment extends Component { const LockedFile = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(withRouter(LockedFileCompoment))); +)(withTranslation()(withStyles(styles)(withRouter(LockedFileCompoment)))); export default LockedFile; diff --git a/src/component/Share/MyShare.js b/src/component/Share/MyShare.js index 7587d676..5ad8ffbc 100644 --- a/src/component/Share/MyShare.js +++ b/src/component/Share/MyShare.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import { connect } from "react-redux"; import { toggleSnackbar } from "../../actions"; @@ -133,7 +134,7 @@ class MyShareCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "分享已取消", + this.props.t('Sharing canceled'), "success" ); if (oldList.length === 0) { @@ -216,7 +217,7 @@ class MyShareCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "没有更多了", + this.props.t('No more'), "info" ); } @@ -226,7 +227,7 @@ class MyShareCompoment extends Component { }); }) .catch(() => { - this.props.toggleSnackbar("top", "right", "加载失败", "error"); + this.props.toggleSnackbar("top", "right", this.props.t('Failed to load'), "error"); }); }; @@ -252,252 +253,252 @@ class MyShareCompoment extends Component { const { classes } = this.props; return ( -
- - - - 我的分享 - - - - - - - - - - {this.state.shareList.map((value) => ( - - - - {!value.is_dir && ( - - )}{" "} - {value.is_dir && ( - - - - )} -
- } - title={ - - - {value.source - ? value.source.name - : "[原始对象不存在]"}{" "} - - - } - subheader={ - - {formatLocalTime( - value.create_date, - "YYYY-MM-DD H:mm:ss" - )} - {this.isExpired(value) && ( - - )} - - } - /> - - - - - this.props.history.push( - "/s/" + - value.key + - (value.password === "" - ? "" - : "?password=" + - value.password) - ) - } - > - - - {" "} - {value.password !== "" && ( - <> - - this.changePermission( - value.key - ) - } - > - - - - - - this.showPwd(value.password) - } - > - - - - - - )} - {value.password === "" && ( - - this.changePermission(value.key) - } - > - - - - - )} - - this.changePreviewOption(value.key) - } - > - - - } - offIcon={ - - } - /> - - - - this.removeShare(value.key) - } - > - - - - - - - - ))} - -
- -
{" "} - - 分享密码 {" "} - - - {" "} - - {" "} - {" "} - {" "} -
+
+ + + + {this.props.t('My Share')} + + + + + + + + + + {this.state.shareList.map((value) => ( + + + + {!value.is_dir && ( + + )}{" "} + {value.is_dir && ( + + + + )} +
+ } + title={ + + + {value.source + ? value.source.name + : this.props.t('[Original object does not exist]')}{" "} + + + } + subheader={ + + {formatLocalTime( + value.create_date, + "YYYY-MM-DD H:mm:ss" + )} + {this.isExpired(value) && ( + + )} + + } + /> + + + + + this.props.history.push( + "/s/" + + value.key + + (value.password === "" + ? "" + : "?password=" + + value.password) + ) + } + > + + + {" "} + {value.password !== "" && ( + <> + + this.changePermission( + value.key + ) + } + > + + + + + + this.showPwd(value.password) + } + > + + + + + + )} + {value.password === "" && ( + + this.changePermission(value.key) + } + > + + + + + )} + + this.changePreviewOption(value.key) + } + > + + + } + offIcon={ + + } + /> + + + + this.removeShare(value.key) + } + > + + + + + + + + ))} + +
+ +
{" "} + + {this.props.t('Share Password')} {" "} + + + {" "} + + {" "} + {" "} + {" "} +
); } } @@ -505,6 +506,6 @@ class MyShareCompoment extends Component { const MyShare = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(withRouter(MyShareCompoment))); +)(withTranslation()(withStyles(styles)(withRouter(MyShareCompoment)))); export default MyShare; diff --git a/src/component/Share/ReadMe.js b/src/component/Share/ReadMe.js index bcfee28d..912737b2 100644 --- a/src/component/Share/ReadMe.js +++ b/src/component/Share/ReadMe.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback, useEffect, useState } from "react"; import { makeStyles, useTheme } from "@material-ui/core/styles"; import { MenuBook } from "@material-ui/icons"; @@ -81,6 +82,8 @@ export default function ReadMe(props) { const $vm = React.createRef(); + const { t } = useTranslation(); + useEffect(() => { setLoading(true); const previewPath = @@ -100,7 +103,7 @@ export default function ReadMe(props) { ToggleSnackbar( "top", "right", - "无法读取 README 内容," + error.message, + t('Unable to read README content, ') + error.message, "error" ); }) diff --git a/src/component/Share/SearchResult.js b/src/component/Share/SearchResult.js index fa0f1bcd..a640c08e 100644 --- a/src/component/Share/SearchResult.js +++ b/src/component/Share/SearchResult.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback, useEffect, useState } from "react"; import { useDispatch } from "react-redux"; import { toggleSnackbar } from "../../actions"; @@ -96,6 +97,8 @@ export default function SearchResult() { const [shareList, setShareList] = useState([]); const [orderBy, setOrderBy] = useState("created_at DESC"); + const { t } = useTranslation(); + const search = useCallback((keywords, page, orderBy) => { const order = orderBy.split(" "); API.get( @@ -113,7 +116,7 @@ export default function SearchResult() { ToggleSnackbar( "top", "right", - "找不到符合条件的分享", + t('Cannot find a share that meets the conditions'), "info" ); } @@ -121,7 +124,7 @@ export default function SearchResult() { setShareList(response.data.items); }) .catch(() => { - ToggleSnackbar("top", "right", "加载失败", "error"); + ToggleSnackbar("top", "right", t('Failed to load'), "error"); }); }, []); @@ -130,7 +133,7 @@ export default function SearchResult() { if (keywords) { search(keywords, page, orderBy); } else { - ToggleSnackbar("top", "right", "请输入搜索关键词", "warning"); + ToggleSnackbar("top", "right", t('Enter search keywords'), "warning"); } }, [location]); @@ -147,125 +150,125 @@ export default function SearchResult() { }; return ( -
- - - - 搜索结果 - - - - - - - - - - {shareList.map((value) => ( - - - - {!value.is_dir && ( - - )}{" "} - {value.is_dir && ( - - - - )} -
- } - action={ - - - history.push("/s/" + value.key) - } - > - - - - } - title={ - - - {value.source - ? value.source.name - : "[原始对象不存在]"}{" "} - - - } - subheader={ - - 分享于{" "} - - - } - /> - - - ))} - -
- -
{" "} -
+
+ + + + {t('search results')} + + + + + + + + + + {shareList.map((value) => ( + + + + {!value.is_dir && ( + + )}{" "} + {value.is_dir && ( + + + + )} +
+ } + action={ + + + history.push("/s/" + value.key) + } + > + + + + } + title={ + + + {value.source + ? value.source.name + : t('[Original object does not exist]')}{" "} + + + } + subheader={ + + {t('Share on')}{" "} + + + } + /> + + + ))} + +
+ +
{" "} +
); } diff --git a/src/component/Share/SharePreload.js b/src/component/Share/SharePreload.js index bf602169..d35c53fb 100644 --- a/src/component/Share/SharePreload.js +++ b/src/component/Share/SharePreload.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { Suspense, useCallback, useEffect, useState } from "react"; import PageLoading from "../Placeholder/PageLoading"; import { useParams } from "react-router"; @@ -29,12 +30,14 @@ export default function SharePreload() { [dispatch] ); + const { t } = useTranslation(); + useEffect(() => { if (share) { if (share.locked) { - SetSubTitle(share.creator.nick + "的加密分享"); + SetSubTitle(share.creator.nick + t('\'S encrypted sharing"')); if (password !== "") { - ToggleSnackbar("top", "right", "密码不正确", "warning"); + ToggleSnackbar("top", "right", t('Incorrect password'), "warning"); } } else { SetSubTitle(share.source.name); @@ -73,22 +76,22 @@ export default function SharePreload() { }, [id, password, ToggleSnackbar]); return ( - }> - {share === undefined && } - {share === null && } - {share && share.locked && ( - - )} - {share && !share.locked && !share.is_dir && ( - - )} - {share && !share.locked && share.is_dir && ( - - )} - + }> + {share === undefined && } + {share === null && } + {share && share.locked && ( + + )} + {share && !share.locked && !share.is_dir && ( + + )} + {share && !share.locked && share.is_dir && ( + + )} + ); } diff --git a/src/component/Share/SharedFile.js b/src/component/Share/SharedFile.js index b2ac118b..6519da9a 100644 --- a/src/component/Share/SharedFile.js +++ b/src/component/Share/SharedFile.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import { connect } from "react-redux"; import { sizeToString, vhCheck } from "../../utils"; @@ -140,7 +141,7 @@ class SharedFileCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "请先登录", + this.props.t('please log in first'), "warning" ); return; @@ -202,7 +203,7 @@ class SharedFileCompoment extends Component { this.props.toggleSnackbar( "top", "right", - "此文件无法预览", + this.props.t('This file cannot be previewed'), "warning" ); return; @@ -240,55 +241,55 @@ class SharedFileCompoment extends Component { render() { const { classes } = this.props; return ( -
- - -
- - -
- -
- - {this.props.share.source.name} - - - {sizeToString(this.props.share.source.size)} - -
-
- -
-
- {this.props.share.preview && ( - - )} -
-
- -
-
-
-
+
+ + +
+ + +
+ +
+ + {this.props.share.source.name} + + + {sizeToString(this.props.share.source.size)} + +
+
+ +
+
+ {this.props.share.preview && ( + () + )} +
+
+ +
+
+
+
); } } @@ -296,6 +297,6 @@ class SharedFileCompoment extends Component { const SharedFile = connect( mapStateToProps, mapDispatchToProps -)(withStyles(styles)(withRouter(SharedFileCompoment))); +)(withTranslation()(withStyles(styles)(withRouter(SharedFileCompoment)))); export default SharedFile; diff --git a/src/component/Upload/FileList.js b/src/component/Upload/FileList.js index 2d8477d6..e08a8406 100644 --- a/src/component/Upload/FileList.js +++ b/src/component/Upload/FileList.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import CloseIcon from "@material-ui/icons/Close"; import AddIcon from "@material-ui/icons/AddCircleOutline"; @@ -195,198 +196,197 @@ class FileList extends Component { }); return ( - - - - - - - - 上传队列 - - - - - - - - - {this.state.files.map((item, i) => ( -
- {item.status === 2 && ( -
- )} - - - {item.status === 1 && ( - - {item.name} - - } - secondary={
排队中...
} - /> - )} - {item.status === 2 && ( - - {item.name} - - } - secondary={ -
- {item.percent <= 99 && ( - <> - {window.plupload - .formatSize( - item.speed - ) - .toUpperCase()} - /s 已上传{" "} - {window.plupload - .formatSize( - item.loaded - ) - .toUpperCase()}{" "} - , 共{" "} - {window.plupload - .formatSize( - item.size - ) - .toUpperCase()}{" "} - - {item.percent}%{" "} - - )} - {item.percent > 99 && ( -
处理中...
- )} -
- } - /> - )} - {item.status === 3 && ( - - {item.name} - - } - secondary={item.status} - /> - )} - {item.status === 4 && ( - - {item.name} - - } - secondary={ -
- {item.errMsg} -
-
- } - /> - )} - {item.status === 5 && ( - - {item.name} - - } - secondary={ -
- 已完成 -
-
- } - /> - )} - - {item.status !== 4 && ( - - this.cancelUpload(item) - } - > - - - )} - {item.status === 4 && ( - - - this.reQueue(item) - } - > - - - - )} - -
- -
- ))} - - -
+ + + + + + + + {this.props.t('Upload Queue')} + + + + + + + + + {this.state.files.map((item, i) => ( +
+ {item.status === 2 && ( +
+ )} + + + {item.status === 1 && ( + + {item.name} + + } + secondary={
{this.props.t('in the line...')}
} + /> + )} + {item.status === 2 && ( + + {item.name} + + } + secondary={ +
+ {item.percent <= 99 && ( + (<> + {window.plupload + .formatSize( + item.speed + ) + .toUpperCase()} + {this.props.t('/s uploaded')}{" "} + {window.plupload + .formatSize( + item.loaded + ) + .toUpperCase()}{" "} + {this.props.t(', common')}{" "} + {window.plupload + .formatSize( + item.size + ) + .toUpperCase()}{" "}-{item.percent}%{" "} + ) + )} + {item.percent > 99 && ( + (
{this.props.t('Processing...')}
) + )} +
+ } + /> + )} + {item.status === 3 && ( + + {item.name} + + } + secondary={item.status} + /> + )} + {item.status === 4 && ( + + {item.name} + + } + secondary={ +
+ {item.errMsg} +
+
+ } + /> + )} + {item.status === 5 && ( + + {item.name} + + } + secondary={ +
+ {this.props.t('completed')} +
+
+ } + /> + )} + + {item.status !== 4 && ( + + this.cancelUpload(item) + } + > + + + )} + {item.status === 4 && ( + + + this.reQueue(item) + } + > + + + + )} + +
+ +
+ ))} + + +
); } } FileList.propTypes = {}; -export default withStyles(styles)(withWidth()(withTheme(FileList))); +export default withTranslation()(withStyles(styles)(withWidth()(withTheme(FileList)))); diff --git a/src/component/Upload/Uploader.js b/src/component/Upload/Uploader.js index 4f9dc1ec..101c7ce7 100644 --- a/src/component/Upload/Uploader.js +++ b/src/component/Upload/Uploader.js @@ -1,3 +1,4 @@ +import { withTranslation } from "react-i18next"; import React, { Component } from "react"; import uploaderLoader from "../../loader"; import { connect } from "react-redux"; @@ -51,7 +52,7 @@ class UploaderComponent extends Component { this.props.toggleSnackbar( "top", "right", - "文件已经重新加入上传队列", + this.props.t('The file has been re-added to the upload queue'), "info" ); }; @@ -229,6 +230,6 @@ class UploaderComponent extends Component { const Uploader = connect(mapStateToProps, mapDispatchToProps, null, { forwardRef: true, -})(uploaderLoader()(UploaderComponent)); +})(withTranslation()(uploaderLoader()(UploaderComponent))); export default Uploader; diff --git a/src/component/Viewer/Code.js b/src/component/Viewer/Code.js index 66e2588d..e4001cd2 100644 --- a/src/component/Viewer/Code.js +++ b/src/component/Viewer/Code.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { Suspense, useCallback, useEffect, useState } from "react"; import { Paper, useTheme } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; @@ -88,6 +89,8 @@ export default function CodeViewer() { // eslint-disable-next-line }, [math.params[0], location]); + const { t } = useTranslation(); + useEffect(() => { let requestURL = "/file/content/" + query.get("id"); if (pathHelper.isSharePage(location.pathname)) { @@ -109,7 +112,7 @@ export default function CodeViewer() { ToggleSnackbar( "top", "right", - "无法读取文件内容," + error.message, + t('Unable to read the contents of the file, ') + error.message, "error" ); }) diff --git a/src/component/Viewer/PDF.js b/src/component/Viewer/PDF.js index d445889e..d1a7a3c6 100644 --- a/src/component/Viewer/PDF.js +++ b/src/component/Viewer/PDF.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback, useEffect, useState } from "react"; import { Document, Page, pdfjs } from "react-pdf"; import { Paper } from "@material-ui/core"; @@ -68,6 +69,8 @@ export default function PDFViewer() { // eslint-disable-next-line }, [math.params[0], location]); + const { t } = useTranslation(); + const removeTextLayerOffset = () => { const textLayers = document.querySelectorAll( ".react-pdf__Page__textContent" @@ -80,46 +83,46 @@ export default function PDFViewer() { const classes = useStyles(); return ( -
- setPageNumber(numPages)} - onLoadError={(error) => { - ToggleSnackbar( - "top", - "right", - "PDF 加载失败," + error.message, - "error" - ); - }} - loading={ - - - - } - file={ - getBaseURL() + - (pathHelper.isSharePage(location.pathname) - ? "/share/preview/" + - id + - (query.get("share_path") !== "" - ? "?path=" + - encodeURIComponent(query.get("share_path")) - : "") - : "/file/preview/" + query.get("id")) - } - > - {Array.from(new Array(pageNumber), (el, index) => ( - - - - ))} - -
+
+ setPageNumber(numPages)} + onLoadError={(error) => { + ToggleSnackbar( + "top", + "right", + t('PDF failed to load,') + error.message, + "error" + ); + }} + loading={ + + + + } + file={ + getBaseURL() + + (pathHelper.isSharePage(location.pathname) + ? "/share/preview/" + + id + + (query.get("share_path") !== "" + ? "?path=" + + encodeURIComponent(query.get("share_path")) + : "") + : "/file/preview/" + query.get("id")) + } + > + {Array.from(new Array(pageNumber), (el, index) => ( + + + + ))} + +
); } diff --git a/src/component/Viewer/Text.js b/src/component/Viewer/Text.js index 50d71b4d..262bf80a 100644 --- a/src/component/Viewer/Text.js +++ b/src/component/Viewer/Text.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { useCallback, useEffect, useState } from "react"; import { Paper } from "@material-ui/core"; import { makeStyles } from "@material-ui/core/styles"; @@ -72,6 +73,8 @@ export default function TextViewer() { // eslint-disable-next-line }, [math.params[0], location]); + const { t } = useTranslation(); + useEffect(() => { let requestURL = "/file/content/" + query.get("id"); if (pathHelper.isSharePage(location.pathname)) { @@ -93,7 +96,7 @@ export default function TextViewer() { ToggleSnackbar( "top", "right", - "无法读取文件内容," + error.message, + t('Unable to read the contents of the file, ') + error.message, "error" ); }) diff --git a/src/config.js b/src/config.js index 21c0e59e..79a30808 100644 --- a/src/config.js +++ b/src/config.js @@ -1,3 +1,4 @@ +import i18next from 'i18next'; export const imgPreviewSuffix = [ "bmp", "png", @@ -65,12 +66,12 @@ export const mediaType = { js: ["js", "jsx"], }; export const policyTypeMap = { - local: "本机", - remote: "从机", - qiniu: "七牛", - upyun: "又拍云", - oss: "阿里云 OSS", - cos: "腾讯云", + local: i18next.t('Local'), + remote: i18next.t('Slave'), + qiniu: i18next.t('Qiniu'), + upyun: i18next.t('UpYun'), + oss: i18next.t('Alibaba Cloud OSS'), + cos: i18next.t('Tencent Cloud'), onedrive: "OneDrive", s3: "Amazon S3", }; @@ -106,16 +107,16 @@ export const isCompressFile = (name) => { return suffix === "zip"; }; -const taskStatus = ["排队中", "处理中", "失败", "取消", "已完成"]; -const taskType = ["压缩", "解压缩", "文件中转", "导入外部目录"]; +const taskStatus = [i18next.t('in the line'), i18next.t('Processing'), i18next.t('fail'), i18next.t('Cancel'), i18next.t('completed')]; +const taskType = [i18next.t('compression'), i18next.t('unzip'), i18next.t('File transfer'), i18next.t('Import external directory')]; const taskProgress = [ - "等待中", - "压缩中", - "解压缩中", - "下载中", - "转存中", - "索引中", - "插入中", + i18next.t('Waiting'), + i18next.t('Compressing'), + i18next.t('Unzipping'), + i18next.t('downloading'), + i18next.t('Transferring'), + i18next.t('In the index'), + i18next.t('Insert'), ]; export const getTaskStatus = (status) => { @@ -128,7 +129,7 @@ export const getTaskType = (status) => { export const getTaskProgress = (type, status) => { if (type === 2) { - return "已完成 " + (status + 1) + " 个文件"; + return i18next.t('completed ') + (status + 1) + i18next.t('Files'); } return taskProgress[status]; }; diff --git a/src/hooks/normal.js b/src/hooks/normal.js index 7f7ba656..4ac0475b 100644 --- a/src/hooks/normal.js +++ b/src/hooks/normal.js @@ -1,3 +1,4 @@ +import { useTranslation } from "react-i18next"; import React, { forwardRef, useCallback, @@ -28,6 +29,8 @@ const NormalCaptcha = forwardRef(function NormalCaptcha( [dispatch] ); + const { t } = useTranslation(); + const refreshCaptcha = () => { API.get("/site/captcha") .then((response) => { @@ -38,7 +41,7 @@ const NormalCaptcha = forwardRef(function NormalCaptcha( ToggleSnackbar( "top", "right", - "无法加载验证码:" + error.message, + t('Unable to load verification code:') + error.message, "error" ); }); @@ -54,33 +57,33 @@ const NormalCaptcha = forwardRef(function NormalCaptcha( }, [captcha]); return ( -
- - 验证码 - setCaptcha(e.target.value)} - type="text" - id="captcha" - value={captcha} - autoComplete - /> - {" "} -
- {captchaData === null && ( -
- -
- )} - {captchaData !== null && ( - captcha - )} -
-
+
+ + {t('Verification Code')} + setCaptcha(e.target.value)} + type="text" + id="captcha" + value={captcha} + autoComplete + /> + {" "} +
+ {captchaData === null && ( +
+ +
+ )} + {captchaData !== null && ( + captcha + )} +
+
); }); diff --git a/src/index.js b/src/index.js index 80046c06..f70711c1 100644 --- a/src/index.js +++ b/src/index.js @@ -13,6 +13,27 @@ import { createBrowserHistory } from "history"; import { routerMiddleware } from "connected-react-router"; import { ConnectedRouter } from "connected-react-router"; const Admin = React.lazy(() => import("./Admin")); +import i18n from "i18next"; +import { initReactI18next } from "react-i18next"; +import * as en from './locales/en-US.json'; +import * as zhCn from './locales/zh-CN.json'; + +i18n + .use(initReactI18next) + .init({ + resources: { + "en-US": { + translation: en, + }, + "zh-CN": { + translation: zhCn, + } + }, + lng: "en-US", + interpolation: { + escapeValue: false + } +}); if (window.location.hash !== "") { window.location.href = window.location.hash.split("#")[1]; diff --git a/src/locales/en-US.json b/src/locales/en-US.json new file mode 100644 index 00000000..77471bf4 --- /dev/null +++ b/src/locales/en-US.json @@ -0,0 +1,995 @@ +{ + "Files": "Files", + "Create": "Create", + "Expires in days": "Expires in days", + "Bytes)": "Bytes)", + "Expires in hours": "Expires in hours", + "After downloads": "After downloads", + "'S encrypted sharing": "'S encrypted sharing", + "(Optional) Specify the EndPoint (regional node) of the bucket, fill in\nas a complete URL format, such as ": "(Optional) Specify the EndPoint (regional node) of the bucket, fill in\nas a complete URL format, such as ", + ", common": ", common", + ", common ": ", common ", + "/s uploaded": "/s uploaded", + "/My Files/Learning Materials/": "/My Documents/Learning Materials/", + "/search results": "/search results", + "1 download": "1 download", + "1 hour": "1 hour", + "1 day": "1 day", + "2 downloads": "2 downloads", + "3 downloads": "3 downloads", + "4 downloads": "4 downloads", + "5 downloads": "5 downloads", + "5 minutes": "5 minutes", + "6-digit verification code": "6-digit verification code", + "7 days": "7 days", + "8 random characters": "8 random characters", + "16 random characters": "16 random characters", + "20 downloads": "20 downloads", + "30 days": "30 days", + "50 downloads": "50 downloads", + "100 downloads": "100 downloads", + "192x192 medium icon address, png format": "192x192 medium icon address, png format", + "512x512 large icon address, png format": "512x512 large icon address, png format", + ":( An error occurred during request": ":( An error occurred during request", + "AccessKey / Refresh Token": "AccessKey / Refresh Token", + "Amazon S3 Storage Policy": "Amazon S3 Storage Policy", + "Aria2 Task Parameters": "Aria2 Task Parameters", + "Aria2 setting item format error": "Aria2 setting item format error", + "Azure Active Directory console (21Vianet account)": "Azure Active Directory console (21Vianet account)", + "Azure Active Directory Console (International Account)": "Azure Active Directory Console (International Account)", + "Bucket name": "Bucket name", + "CDN prefix": "CDN prefix", + "CDN accelerated domain name": "CDN accelerated domain name", + "The direct transmission of the COS bucket client requires the help of Tencent Cloud": "The direct transmission of the COS bucket client requires the help of Tencent Cloud", + "The COS bucket needs to be correctly configured with the cross-domain policy before you can use the Web\nside to upload files. Cloudreve\ncan automatically set it for you, or you can set it manually by referring to the document steps. If you have already set this\nBucket Cross-domain policy, this step can be skipped.": "The COS bucket needs to be correctly configured with the cross-domain policy before you can use the Web\nside to upload files. Cloudreve\ncan automatically set it for you, or you can set it manually by referring to the document steps. If you have already set this\nBucket Cross-domain policy, this step can be skipped.", + "COS Management Console": "COS Management Console", + "CSS color value": "CSS color value", + "CSS color value affects the color of the status bar on the startup screen, the status bar in the content page, and the address bar on the PWA\n": "CSS color value affects the color of the status bar on the startup screen, the status bar in the content page, and the address bar on the PWA\n", + "The Cloudreve master site needs to enable CORS support, the specific steps are as follows:": "The Cloudreve master site needs to enable CORS support, the specific steps are as follows:", + "Cloudreve Dashboard": "Cloudreve Dashboard", + "Cloudreve can try to automatically create a callback cloud function for you. Please select the location of\nCOS bucket and continue.\nCreation may take a few seconds, please be patient. Please make sure your Tencent Cloud account is enabled before creating Cloud function service.": "Cloudreve can try to automatically create a callback cloud function for you. Please select the location of\nCOS bucket and continue.\nCreation may take a few seconds, please be patient. Please make sure your Tencent Cloud account is enabled before creating Cloud function service.", + "The interval at which Cloudreve requests Aria2 to refresh the task status.": "The interval at which Cloudreve requests Aria2 to refresh the task status.", + "Cloudreve's offline download function is controlled by": "Cloudreve's offline download function is controlled by", + "EndPoint (regional node)": "EndPoint (regional node)", + "Gravatar Server": "Gravatar Server", + "Gravatar server address, you can choose to use domestic mirror": "Gravatar server address, you can choose to use domestic mirror", + "IANA Time Zone Name Identification": "IANA Time Zone Name Identification", + "InfoHash:": "InfoHash:", + "MimeType list": "MimeType list", + "OSS Bucket needs to configure the cross-domain policy correctly before uploading files on the Web\nside, Cloudreve\nIt can be set automatically for you, or you can set it manually by referring to the document steps. If you have already set a cross-domain policy for this\nBucket, you can skip this step. ": "OSS Bucket needs to configure the cross-domain policy correctly before uploading files on the Web\nside, Cloudreve\nIt can be set automatically for you, or you can set it manually by referring to the document steps. If you have already set a cross-domain policy for this\nBucket, you can skip this step. ", + "OSS Management Console": "OSS Management Console", + "Office Document Preview Connection": "Office Document Preview Connection", + "OneDrive\nThe maximum number of retries after a failed upload of storage policy fragments, only applicable to server uploads or transfers": "OneDrive\nThe maximum number of retries after a failed upload of storage policy fragments, only applicable to server uploads or transfers", + "OneDrive\nThe maximum time to wait for the callback after the client upload is completed, if it exceeds, the upload will be considered failed": "OneDrive\nThe maximum time to wait for the callback after the client upload is completed, if it exceeds, the upload will be considered failed", + "OneDrive download request cache": "OneDrive download request cache", + "OneDrive fragmentation error retry": "OneDrive fragmentation error retry", + "OneDrive anti-generation server address": "OneDrive anti-generation server address", + "OneDrive callback waiting": "OneDrive callback waiting", + "OneDrive client upload monitoring interval": "OneDrive client upload monitoring interval", + "OneDrive can cache the results after obtaining the file download URL\n, reducing the frequency of popular file download API requests": "OneDrive can cache the results after obtaining the file download URL\n, reducing the frequency of popular file download API requests", + "OneDrive redirect address": "OneDrive redirect address", + "OneDrive/SharePoint Storage Strategy": "OneDrive/SharePoint Storage Strategy", + "OneDrive/SharePoint Drive Resource Identification": "OneDrive/SharePoint Drive Resource Identification", + "PDF failed to load,": "PDF failed to load,", + "Display mode after PWA application is added": "Display mode after PWA application is added", + "RPC authorization token, consistent with the Aria2\nconfiguration file, please leave it blank if it is not set.": "RPC authorization token, consistent with the Aria2\nconfiguration file, please leave it blank if it is not set.", + "RPC server address": "RPC server address", + "RPC call timeout (seconds)": "RPC call timeout (seconds)", + "S3 Bucket needs to configure the cross-domain policy correctly before you can upload files on the Web\nside. Cloudreve\ncan automatically set it for you, or you can set it manually by referring to the document steps. If you have already set this\nBucket Cross-domain policy, this step can be skipped.": "S3 Bucket needs to configure the cross-domain policy correctly before you can upload files on the Web\nside. Cloudreve\ncan automatically set it for you, or you can set it manually by referring to the document steps. If you have already set this\nBucket Cross-domain policy, this step can be skipped.", + "S3 type storage policy is currently only available for self-use, or for trusted user groups.": "S3 type storage policy is currently only available for self-use, or for trusted user groups.", + "SMTP password": "SMTP password", + "SMTP server": "SMTP server", + "SMTP username": "SMTP username", + "SMTP port": "SMTP port", + "SMTP connection validity period (seconds)": "SMTP connection validity period (seconds)", + "SharePoint site address": "SharePoint site address", + "South America (São Paulo)": "South America (São Paulo)", + "Telegram group": "Telegram group", + "Token anti-theft chain key": "Token anti-theft chain key", + "Web Authn requires your site to enable HTTPS, and confirm the parameter settings-site information-site URL also uses HTTPS before it can be turned on.": "Web Authn requires your site to enable HTTPS, and confirm the parameter settings-site information-site URL also uses HTTPS before it can be turned on.", + "WebDAV username": "WebDAV username", + "The address of WebDAV is: ": "The address of WebDAV is: ", + "WebDAV connection address": "WebDAV connection address", + "Number of Workers": "Number of Workers", + "[Original object does not exist]": "[Original object does not exist]", + "[expired]": "[expired]", + "[unknown]": "[unknown]", + ".": ".", + ".\nLeave blank to use the default access point generated by the system.": ".\nLeave blank to use the default access point generated by the system.", + ". After the creation is complete, fill in the value of the client password below: ": ". After the creation is complete, fill in the value of the client password below: ", + "An activation email has been sent to your mailbox, please visit the link in the email to continue to complete the registration.": "An activation email has been sent to your mailbox, please visit the link in the email to continue to complete the registration.", + "No need to modify after generally added": "No need to modify after generally added", + "The \\\\ in the middle of a line": "The \\\\ in the middle of a line", + "Qiniu": "Qiniu", + "Qiniu Storage Strategy": "Qiniu Storage Strategy", + "Qiniu Control Panel": "Qiniu Control Panel", + "Previous": "Previous", + "Upload and download": "Upload and download", + "Uploaded to": "Uploaded to", + "Upload session": "Upload session", + "upload certificate": "upload certificate", + "Upload size:": "Upload size:", + "Upload documents": "Upload documents", + "upload files": "upload files", + "Forcibly reset the connection when upload verification fails": "Forcibly reset the connection when upload verification fails", + "Upload directory": "Upload directory", + "The upload component has not been loaded yet": "The upload component has not been loaded yet", + "Uploaded by": "Uploaded by", + "Uploader ID": "Uploader ID", + "Upload Path": "Upload Path", + "Upload speed:": "Upload speed:", + "Upload Queue": "Upload Queue", + "Upload limit": "Upload limit", + "Parent directory": "Parent directory", + "Next step": "Next step", + "Number of Subordinate Files": "Number of Subordinate Files", + "Number of Subordinate Users": "Number of Subordinate Users", + "The following is the slave key randomly generated by the system for you. Generally, there is no need to change it. If you have custom requirements,\ncan fill in your key below:": "The following is the slave key randomly generated by the system for you. Generally, there is no need to change it. If you have custom requirements,\ncan fill in your key below:", + "download": "download", + "downloading": "downloading", + "Download Session": "Download Session", + "Download error:": "Download error:", + "download times": "download times", + "The number of downloads from large to small": "The number of downloads from large to small", + "The number of downloads from small to large": "The number of downloads from small to large", + "Download to": "Download to", + "Download speed limit": "Download speed limit", + "Do not use": "Do not use", + "Do not open": "Do not open", + "Cannot delete the default color scheme": "Cannot delete the default color scheme", + "Cannot contain spaces": "Cannot contain spaces", + "not limited": "not limited", + "Expert mode editing": "Expert mode editing", + "21Vianet Edition": "21Vianet Edition", + "The two password entries are inconsistent": "The two password entries are inconsistent", + "individual": "individual", + "Homepage": "Homepage", + "Personal file list default style": "Personal file list default style", + "Personal settings": "Personal settings", + "personal information": "personal information", + "Objects": "Objects", + "Personalise": "Personalise", + "Medium Icon": "Medium Icon", + "Medium avatar size": "Medium avatar size", + "Transit Parallel Transmission": "Transit Parallel Transmission", + "Temporary Download Directory": "Temporary Download Directory", + "Temporary Directory": "Temporary Directory", + "Name this storage policy:": "Name this storage policy:", + "Create or authorize an operator with read, write, and delete permissions for this service, and then fill in the operator information below: ": "Create or authorize an operator with read, write, and delete permissions for this service, and then fill in the operator information below: ", + "Main title": "Main title", + "main color tone": "main color tone", + "The main color cannot be repeated with the existing color matching": "The main color cannot be repeated with the existing color matching", + "Main tone text": "Main tone text", + "Home": "Home", + "Theme Color": "Theme Color", + "Theme Colors": "Theme Colors", + "The theme color has been changed": "The theme color has been changed", + "Two-step verification": "Two-step verification", + "Cloud Function": "Cloud Function", + "Cloud function callback": "Cloud function callback", + "Southeast Asia Pacific (Singapore)": "Southeast Asia Pacific (Singapore)", + "South Asia Pacific (Mumbai)": "South Asia Pacific (Mumbai)", + "Products to ensure that upload callbacks are controllable. If you plan to use this storage policy for your own use, or assign it to a trusted user group, you can skip this step.\nIf it is for public use, please be sure to create a callback cloud function.": "Products to ensure that upload callbacks are controllable. If you plan to use this storage policy for your own use, or assign it to a trusted user group, you can skip this step.\nIf it is for public use, please be sure to create a callback cloud function.", + "Nothing was found": "Nothing was found", + "Only valid for Amazon S3 storage policies": "Only valid for Amazon S3 storage policies", + "Only valid for OSS storage policies": "Only valid for OSS storage policies", + "Only valid for OneDrive\nstorage policy, leave it blank to use the user's default OneDrive\ndrive": "Only valid for OneDrive\nstorage policy, leave it blank to use the user's default OneDrive\ndrive", + "Only valid for OneDrive storage policies": "Only valid for OneDrive storage policies", + "Only valid for Qiniu storage strategy": "Only valid for Qiniu storage strategy", + "Only valid for another cloud storage strategy": "Only valid for another cloud storage strategy", + "Never": "Never", + "Import from outside": "Import from outside", + "Upload from file": "Upload from file", + "Slave": "Slave", + "Slave API request": "Slave API request", + "Slave address": "Slave address", + "Slave Storage": "Slave Storage", + "Slave Storage Strategy": "Slave Storage Strategy", + "The slave storage policy allows you to use the server that also runs Cloudreve\nas the storage end, and the user upload and download traffic is directly transmitted via HTTP.": "The slave storage policy allows you to use the server that also runs Cloudreve\nas the storage end, and the user upload and download traffic is directly transmitted via HTTP.", + "Slave Key": "Slave Key", + "The configuration file format of the slave is roughly the same as that of the master, the difference is: ": "The configuration file format of the slave is roughly the same as that of the master, the difference is: ", + "In order to obtain higher security, the private space cannot open the \"Get Direct Link\" function.": "In order to obtain higher security, the private space cannot open the \"Get Direct Link\" function.", + "Dashboard": "Dashboard", + "An account in any organization directory (any Azure AD directory-\nmulti-tenant)": "An account in any organization directory (any Azure AD directory-\nmulti-tenant)", + "Task has been created": "Task has been created", + "Task has been deleted": "Task has been deleted", + "Task has been cancelled, status will be updated later": "Task has been cancelled, status will be updated later", + "Task Type": "Task Type", + "Task Queue": "Task Queue", + "The maximum number of parallel coroutines when transferring tasks in the task queue": "The maximum number of parallel coroutines when transferring tasks in the task queue", + "The maximum number of tasks executed in parallel in the task queue. After saving, you need to restart\nCloudreve to take effect": "The maximum number of tasks executed in parallel in the task queue. After saving, you need to restart\nCloudreve to take effect", + "Low Frequency Access": "Low Frequency Access", + "as a wildcard. For example ": "as a wildcard. For example ", + "You can use": "You can use", + "use": "use", + "Use Gravatar Avatar ": "Use Gravatar Avatar ", + "Log in with external authenticator": "Log in with external authenticator", + "Use password protection": "Use password protection", + "Log in with password": "Log in with password", + "The price when using points to purchase, fill in as 0\nmeans that you cannot use points to buy": "The price when using points to purchase, fill in as 0\nmeans that you cannot use points to buy", + "save": "save", + "save Changes": "save Changes", + "Revise": "Revise", + "Modify the Cloudreve configuration file, add the following CORS\nconfiguration items, save and restart Cloudreve.": "Modify the Cloudreve configuration file, add the following CORS\nconfiguration items, save and restart Cloudreve.", + "Modified at": "Modified at", + "Modify the slave configuration file.": "Modify the slave configuration file.", + "Modify avatar": "Modify avatar", + "Change username": "Change username", + "Change password": "Change password", + "value": "value", + "Preferences off": "Preferences off", + "Preferences on": "Preferences on", + "During seeding:": "During seeding:", + "Seeder:": "Seeder:", + "allow": "allow", + "Allow download and share": "Allow download and share", + "Allow public reading": "Allow public reading", + "Allow to create shares": "Allow to create shares", + "Allow file extensions": "Allow file extensions", + "Allow new users to register": "Allow new users to register", + "Allowed MimeType": "Allowed MimeType", + "Allow access to external links": "Allow access to external links", + "Allow preview": "Allow preview", + "Global Task Parameters": "Global Task Parameters", + "all": "all", + "Share all": "Share all", + "Public Reading": "Public Reading", + "Public Read Private Write": "Public Read Private Write", + "public": "public", + "Total number of public shares": "Total number of public shares", + "Public": "Public", + "Key Color": "Key Color", + "Close": "Close", + "When disabled, users can no longer register through the login page": "When disabled, users can no longer register through the login page", + "When disabled, users cannot download files created by others to share": "When disabled, users cannot download files created by others to share", + "When disabled, users cannot create sharing links": "When disabled, users cannot create sharing links", + "When disabled, users cannot connect to the network disk through the WebDAV\nprotocol": "When disabled, users cannot connect to the network disk through the WebDAV\nprotocol", + "Intranet EndPoint": "Intranet EndPoint", + "Credentials have been deleted": "Credentials have been deleted", + "Error": "Error", + "share": "share", + "Share download session": "Share download session", + "Share does not exist or has expired": "Share does not exist or has expired", + "Share on": "Share on", + "Share Password": "Share Password", + "Share deleted": "Share deleted", + "Sharing canceled": "Sharing canceled", + "Total Shares": "Total Shares", + "Share Date": "Share Date", + "Sharer": "Sharer", + "Share Link": "Share Link", + "\\\\ under the partition": "\\\\ under the partition", + "Shard size:": "Shard size:", + "Number of shards:": "Number of shards:", + "minute": "minute", + "Switch to light mode": "Switch to light mode", + "Switch to dark mode": "Switch to dark mode", + "List": "List", + "List display": "List display", + "create": "create", + "Create Bucket. Note: You can only select the type of space to create": "Create Bucket. Note: You can only select the type of space to create", + "Create a CDN accelerated domain name, and set the source site to the newly created COS\nbucket. Fill in the CDN\naccelerated domain name below, and choose whether to use HTTPS:": "Create a CDN accelerated domain name, and set the source site to the newly created COS\nbucket. Fill in the CDN\naccelerated domain name below, and choose whether to use HTTPS:", + "Create a CDN accelerated domain name, and set the source site as the newly created OSS\nBucket. Fill in the CDN\naccelerated domain name below, and choose whether to use HTTPS:": "Create a CDN accelerated domain name, and set the source site as the newly created OSS\nBucket. Fill in the CDN\naccelerated domain name below, and choose whether to use HTTPS:", + "The additional setting parameters carried when creating a download task are written in JSON\nencoded format. You can also write these settings in the\nAria2 configuration file. For available parameters, please refer to the official documentation": "The additional setting parameters carried when creating a download task are written in JSON\nencoded format. You can also write these settings in the\nAria2 configuration file. For available parameters, please refer to the official documentation", + "Built in": "Built in", + "Create a cloud storage service.": "Create a cloud storage service.", + "Create Task": "Create Task", + "Create a share link": "Create a share link", + "Create compressed file": "Create compressed file", + "Create bucket.": "Create bucket.", + "After the creation is complete, enter the application management": "After the creation is complete, enter the application management", + "Create an object storage resource.": "Create an object storage resource.", + "Create import task": "Create import task", + "Create a file": "Create a file", + "Create Folder": "Create Folder", + "Create a new account": "Create a new account", + "Created Date": "Created Date", + "Created from early to late": "Created from early to late", + "Created from late to early": "Created from late to early", + "Created Date:": "Created Date:", + "Create User": "Create User", + "Create offline download task": "Create offline download task", + "creator": "creator", + "Initial capacity": "Initial capacity", + "delete": "delete", + "Delete task will be executed in the background": "Delete task will be executed in the background", + "Delete Credentials": "Delete Credentials", + "Delete Object": "Delete Object", + "successfully deleted": "successfully deleted", + "Delete this file": "Delete this file", + "Delete Record": "Delete Record", + "Refresh": "Refresh", + "Go to": "Go to", + "Go to the AWS S3\nconsole to create a bucket, and fill in the specified when you created the bucket below": "Go to the AWS S3\nconsole to create a bucket, and fill in the specified when you created the bucket below", + "Go to the function configuration panel of the created cloud storage service, go to the\naccess configuration tab, turn on the Token anti-theft chain and set a password.": "Go to the function configuration panel of the created cloud storage service, go to the\naccess configuration tab, turn on the Token anti-theft chain and set a password.", + "subtitle": "subtitle", + "Failed to load": "Failed to load", + "load more": "load more", + "Accelerated Domain Name": "Accelerated Domain Name", + "Include file": "Include file", + "Include directory": "Include directory", + "The complete RPC\nserver address including the port, for example: http://127.0.0.1:6800/, leave it blank to not enable the\nAria2 service": "The complete RPC\nserver address including the port, for example: http://127.0.0.1:6800/, leave it blank to not enable the\nAria2 service", + "North America (Toronto)": "North America (Toronto)", + "Upgrade to Donation Edition": "Upgrade to Donation Edition", + "East China (Shanghai)": "East China (Shanghai)", + "North China (Beijing)": "North China (Beijing)", + "South China (Guangzhou)": "South China (Guangzhou)", + "South China (Guangzhou Open)": "South China (Guangzhou Open)", + "Unit price (yuan)": "Unit price (yuan)", + "Unit price (points)": "Unit price (points)", + "Valid period of unit purchase time": "Valid period of unit purchase time", + "Single file size limit": "Single file size limit", + "compression": "compression", + "Compress/Decompress Tasks": "Compress/Decompress Tasks", + "Compressing": "Compressing", + "Compression task has been created": "Compression task has been created", + "Compressed file name": "Compressed file name", + "Original file name": "Original file name", + "Original Directory Path": "Original Directory Path", + "Old password": "Old password", + "Settings": "Settings", + "UpYun": "UpYun", + "Shoot cloud storage strategy again": "Shoot cloud storage strategy again", + "Again to take the cloud anti-leech Token": "Again to take the cloud anti-leech Token", + "Shoot the cloud panel again": "Shoot the cloud panel again", + "Counter generation server address": "Counter generation server address", + "Sender's name": "Sender's name", + "Sender's mailbox": "Sender's mailbox", + "Sending server address port number": "Sending server address port number", + "Sending server address without port number": "Sending server address without port number", + "Sending Test": "Sending Test", + "The address of the sending mailbox": "The address of the sending mailbox", + "Send a letter": "Send a letter", + "Send Mail Password": "Send Mail Password", + "The user name of the sending mailbox, generally the same as the mailbox address": "The user name of the sending mailbox, generally the same as the mailbox address", + "Published on": "Published on", + "send": "send", + "Send password reset email": "Send password reset email", + "Send test mail": "Send test mail", + "Before sending a test mail, please save the changed mail settings;": "Before sending a test mail, please save the changed mail settings;", + "Cancel": "Cancel", + "Cancel/Stop": "Cancel/Stop", + "Cancel task": "Cancel task", + "Cancel sharing": "Cancel sharing", + "Supported account types": "Supported account types", + "Change to public sharing": "Change to public sharing", + "Change to private sharing": "Change to private sharing", + "Only valid for the native storage strategy. When enabled, users cannot use the multi-threaded download tool.": "Only valid for the native storage strategy. When enabled, users cannot use the multi-threaded download tool.", + "Optional": "Optional", + "Name": "Name", + "Expires later": "Expires later", + "Wizard mode editing": "Wizard mode editing", + "Shared a file with you": "Shared a file with you", + "?": "?", + "no": "no", + "Enable": "Enable", + "Naming Rules": "Naming Rules", + "Product display name": "Product display name", + "Product description (one per line)": "Product description (one per line)", + "amount of goods": "amount of goods", + "Reply mailbox": "Reply mailbox", + "Callback cloud function has been added": "Callback cloud function has been added", + "International Edition": "International Edition", + "Image Processing": "Image Processing", + "Graphic verification page": "Graphic verification page", + "Icon:": "Icon:", + "Pictures": "Pictures", + "Enter the personal center -\nkey management in the Qiniu control panel, and fill in the AK and SK obtained below.": "Enter the personal center -\nkey management in the Qiniu control panel, and fill in the AK and SK obtained below.", + "Fill in the \\\\ specified when you created the Bucket below": "Fill in the \\\\ specified when you created the Bucket below", + "Fill in the \"storage space name\" you specified when Qiniu created the storage space below: ": "Fill in the \"storage space name\" you specified when Qiniu created the storage space below: ", + "Fill in the name of the created service below:": "Fill in the name of the created service below:", + "Select the type of public access permissions for the space you created below. It is recommended to select \"Private\" for higher security. Private spaces cannot enable the \"Get direct link\" function.": "Select the type of public access permissions for the space you created below. It is recommended to select \"Private\" for higher security. Private spaces cannot enable the \"Get direct link\" function.", + "Select the type of access permission for the space you created below, it is recommended to choose": "Select the type of access permission for the space you created below, it is recommended to choose", + "Select the type of read and write permissions for the space you created below. It is recommended to select \"Private\" for higher security. The private space cannot enable the \"Get direct link\" function.": "Select the type of read and write permissions for the space you created below. It is recommended to select \"Private\" for higher security. The private space cannot enable the \"Get direct link\" function.", + "Select the type of space you created below. It is recommended to select \"Private Space\" for higher security. Private Space cannot enable the \"Get Direct Link\" function.": "Select the type of space you created below. It is recommended to select \"Private Space\" for higher security. Private Space cannot enable the \"Get Direct Link\" function.", + "Create a new directory in the same level directory of Cloudreve on the slave side": "Create a new directory in the same level directory of Cloudreve on the slave side", + "Before using the Tencent Cloud COS storage strategy, please make sure that the\naddress you fill in the parameter setting\n-site information-site URL matches the actual one, and ": "Before using the Tencent Cloud COS storage strategy, please make sure that the\naddress you fill in the parameter setting\n-site information-site URL matches the actual one, and ", + "Before using the Alibaba Cloud OSS storage strategy, please make sure that the\naddress you fill in the parameter setting\n-site information-site URL matches the actual one, and ": "Before using the Alibaba Cloud OSS storage strategy, please make sure that the\naddress you fill in the parameter setting\n-site information-site URL matches the actual one, and ", + "Before using the Qiniu storage strategy, please make sure that the address you fill in the parameter setting -\nsite information-site URL matches the actual address, and ": "Before using the Qiniu storage strategy, please make sure that the address you fill in the parameter setting -\nsite information-site URL matches the actual address, and ", + "Before using another cloud storage strategy, please make sure that the address you fill in the parameter settings-\nsite information-site URL matches the actual address, and ": "Before using another cloud storage strategy, please make sure that the address you fill in the parameter settings-\nsite information-site URL matches the actual address, and ", + "Search in site-wide sharing": "Search in site-wide sharing", + "Search in my files": "Search in my files", + "In Tencent Cloud": "In Tencent Cloud", + "In Alibaba Cloud": "In Alibaba Cloud", + "Custom HTML code inserted at the bottom of the page": "Custom HTML code inserted at the bottom of the page", + "Basic Information": "Basic Information", + "Fill in 0 means no limit. When the limit is turned on,\nwhen users under this user group download all files under the storage policy that supports the speed limit, the maximum download speed will be limited.": "Fill in 0 means no limit. When the limit is turned on,\nwhen users under this user group download all files under the storage policy that supports the speed limit, the maximum download speed will be limited.", + "Fill in the domain name bound to the cloud storage service, and choose whether to use\nHTTPS:": "Fill in the domain name bound to the cloud storage service, and choose whether to use\nHTTPS:", + "Fill in the slave address.": "Fill in the slave address.", + "Fill in below:": "Fill in below:", + "Fill in the application registration form. Among them, the name can be any; ": "Fill in the application registration form. Among them, the name can be any; ", + "Fill in the CDN accelerated domain name that you bind to the storage space.": "Fill in the CDN accelerated domain name that you bind to the storage space.", + "Fill in the Token anti-theft chain key you set": "Fill in the Token anti-theft chain key you set", + "Processing": "Processing", + "Processing...": "Processing...", + "record number: ": "record number: ", + "Label": "Label", + "copy": "copy", + "copy to": "copy to", + "Extranet access": "Extranet access", + "Themeing": "Themeing", + "External Authenticator": "External Authenticator", + "External link address": "External link address", + "Large Icon": "Large Icon", + "Large icon display": "Large icon display", + "Large Avatar Size": "Large Avatar Size", + "Size": "Size", + "fail": "fail", + "Avatar": "Avatar", + "Portrait storage path": "Portrait storage path", + "The avatar has been updated and will take effect after refreshing": "The avatar has been updated and will take effect after refreshing", + "Picture file size limit": "Picture file size limit", + "If the master has enabled\nHTTPS, the slave also needs to enable it, and fill in the address of the HTTPS\nprotocol below.": "If the master has enabled\nHTTPS, the slave also needs to enable it, and fill in the address of the HTTPS\nprotocol below.", + "If your Cloudreve\nis deployed in Alibaba Cloud Computing Service and it is in the same Availability Zone as OSS\n, you can additionally specify the use of the intranet\nEndPoint\nto save data start. Do you want to Use OSS\nIntranet EndPoint when sending requests on the server side?": "If your Cloudreve\nis deployed in Alibaba Cloud Computing Service and it is in the same Availability Zone as OSS\n, you can additionally specify the use of the intranet\nEndPoint\nto save data start. Do you want to Use OSS\nIntranet EndPoint when sending requests on the server side?", + "The field must be changed to ": "The field must be changed to ", + "For the content of the field,\ncan refer to the above examples or official documents. If the configuration is not correct, the user will not be able to upload files to the slave through the\nWeb terminal.": "For the content of the field,\ncan refer to the above examples or official documents. If the configuration is not correct, the user will not be able to upload files to the slave through the\nWeb terminal.", + "The value of the field is the key filled in or generated in the second step.": "The value of the field is the key filled in or generated in the second step.", + "letter": "letter", + "Storage and Transmission": "Storage and Transmission", + "Storage file name": "Storage file name", + "The region where the bucket is located": "The region where the bucket is located", + "Bucket ID": "Bucket ID", + "Storage Directory": "Storage Directory", + "Storage": "Storage", + "Storage space name": "Storage space name", + "Storage Endpoint": "Storage Endpoint", + "Storage configuration": "Storage configuration", + "Storage Policy Name": "Storage Policy Name", + "Storage Strategy": "Storage Strategy", + "Storage Strategy Comparison": "Storage Strategy Comparison", + "Storage Policy Already": "Storage Policy Already", + "Storage policy has been deleted": "Storage policy has been deleted", + "Storage policy has been added!": "Storage policy has been added!", + "Storage Strategy Type": "Storage Strategy Type", + "Storage Policy Number": "Storage Policy Number", + "Storage path": "Storage path", + "Save to specified SharePoint": "Save to specified SharePoint", + "Save to the account default OneDrive drive": "Save to the account default OneDrive drive", + "Save to": "Save to", + "Security Information Management": "Security Information Management", + "Security and Privacy": "Security and Privacy", + "Finish": "Finish", + "After completing the above steps, you can click the test button below to test whether the communication is normal.": "After completing the above steps, you can click the test button below to test whether the communication is normal.", + "The complete configuration items are available in ": "The complete configuration items are available in ", + "Client Password": "Client Password", + "Unit price of capacity package": "Unit price of capacity package", + "The size of the capacity package": "The size of the capacity package", + "width": "width", + "Login Password": "Password", + "Incorrect password": "Incorrect password", + "Password has been updated": "Password has been updated", + "Password has been reset": "Password has been reset", + "The password reset email has been sent, please check it": "The password reset email has been sent, please check it", + "Password reset email template": "Password reset email template", + "Password reset successfully": "Password reset successfully", + "For point products, here is the number of points, and other products are multiples of duration": "For point products, here is the number of points, and other products are multiples of duration", + "Corresponding product": "Corresponding product", + "Object name": "Object name", + "The import task has been created, you can check the execution in the \"persistent task\"": "The import task has been created, you can check the execution in the \"persistent task\"", + "Import external directory": "Import external directory", + "Block/Unblock": "Block/Unblock", + "Copy the Cloudreve\nprogram of the same version as the master site to the server to be used as the slave.": "Copy the Cloudreve\nprogram of the same version as the master site to the server to be used as the slave.", + "Small Icon": "Small Icon", + "Small icon display": "Small icon display", + "Small avatar size": "Small avatar size", + "Hour": "Hour", + "Ready": "Ready", + "Display Mode": "Display Mode", + "Ministry of Industry and Information Technology website ICP record number": "Ministry of Industry and Information Technology website ICP record number", + "Used ": "Used ", + "Cancelled": "Cancelled", + "Copied to clipboard": "Copied to clipboard", + "expired": "expired", + "completed": "completed", + "completed ": "completed ", + "Completed, transfer processing": "Completed, transfer processing", + "Completed, transfer to queue": "Completed, transfer to queue", + "activated": "activated", + "Token anti-theft chain is turned on": "Token anti-theft chain is turned on", + "Used space": "Used space", + "selected": "selected", + "Regular Tasks": "Regular Tasks", + "years": "years", + "And fill in the following:": "And fill in the following:", + "Log in and enter after logging in": "Log in and enter after logging in", + "application": "application", + "App Authorization": "App Authorization", + "Application Registration": "Application Registration", + "Application (Client) ID": "Application (Client) ID", + "Application Management Page": "Application Management Page", + "The direct chain function cannot be used after the Token anti-leech link is turned on": "The direct chain function cannot be used after the Token anti-leech link is turned on", + "When enabled, it will be highlighted on the product selection page": "When enabled, it will be highlighted on the product selection page", + "When enabled, if the data upload verification of this policy, avatar, etc. fails, the server will forcibly reset the connection": "When enabled, if the data upload verification of this policy, avatar, etc. fails, the server will forcibly reset the connection", + "When enabled, the new user registration needs to click the activation link in the email to complete. Please confirm that the email sending settings are correct, otherwise the activation email will not be delivered": "When enabled, the new user registration needs to click the activation link in the email to complete. Please confirm that the email sending settings are correct, otherwise the activation email will not be delivered", + "When enabled, the user can request a direct link that can directly access the content of the file, suitable for image bed applications or personal use.": "When enabled, the user can request a direct link that can directly access the content of the file, suitable for image bed applications or personal use.", + "When enabled, the domain name part of the URL\nwhen the user accesses the file will be replaced with the CDN domain name.": "When enabled, the domain name part of the URL\nwhen the user accesses the file will be replaced with the CDN domain name.", + "Turn on rename": "Turn on rename", + "Enforce SSL connection": "Enforce SSL connection", + "Forced Delete": "Forced Delete", + "Archive Storage": "Archive Storage", + "The current browser or environment does not support": "The current browser or environment does not support", + "Maximum size of files to be compressed": "Maximum size of files to be compressed", + "Maximum size of the file to be decompressed": "Maximum size of the file to be decompressed", + "Cross-domain configuration must be activated, ie ": "Cross-domain configuration must be activated, ie ", + "Must specify ": "Must specify ", + "Forgot password": "Forgot password", + "neglect": "neglect", + "total": "total", + "You can import the existing files and directory structure in the storage policy into\nCloudreve\n. The import operation will not take up additional physical storage space, but the user's used capacity will still be deducted normally, and it will stop when the space is insufficient Import.": "You can import the existing files and directory structure in the storage policy into\nCloudreve\n. The import operation will not take up additional physical storage space, but the user's used capacity will still be deducted normally, and it will stop when the space is insufficient Import.", + "You have not set the site URL, do you want to set it to the current ": "You have not set the site URL, do you want to set it to the current ", + "You have logged out": "You have logged out", + "HTTPS is enabled on your current site. Selecting HTTP here may cause connection failure.": "HTTPS is enabled on your current site. Selecting HTTP here may cause connection failure.", + "You must enable HTTPS to use the OneDrive/SharePoint storage policy; after enabling it, change the parameter settings-site information-site URL.": "You must enable HTTPS to use the OneDrive/SharePoint storage policy; after enabling it, change the parameter settings-site information-site URL.", + "Your used capacity has exceeded the capacity quota, please delete extra files or purchase capacity as soon as possible": "Your used capacity has exceeded the capacity quota, please delete extra files or purchase capacity as soon as possible", + "Your account has been successfully activated.": "Your account has been successfully activated.", + "The site URL you set is inconsistent with the current URL. Do you want to set it to the current": "The site URL you set is inconsistent with the current URL. Do you want to set it to the current", + "My Share": "My Share", + "My files": "My files", + "or": "or", + "Or click the \"Upload File\" button at the bottom right to add a file": "Or click the \"Upload File\" button at the bottom right to add a file", + "Deadline": "Deadline", + "Directory": "Directory", + "Download package": "Download package", + "Packing...": "Packing...", + "Open": "Open", + "Open storage directory": "Open storage directory", + "The address of the small icon with the extension ico": "The address of the small icon with the extension ico", + "List of extensions": "List of extensions", + "Cannot find a share that meets the conditions": "Cannot find a share that meets the conditions", + "Retrieve Password": "Retrieve Password", + "Retrieve password verification code": "Retrieve password verification code", + "Drag and drop files here": "Drag and drop files here", + "Persistent Task": "Persistent Task", + "Specify the storage policy of the user group.": "Specify the storage policy of the user group.", + "Button.": "Button.", + "Button, ": "Button, ", + "Authorization succeeded": "Authorization succeeded", + "Sort by": "Sort by", + "in the line": "in the line", + "in the line...": "in the line...", + "describe": "describe", + "hint": "hint", + "Insert": "Insert", + "Search file name": "Search file name", + "Search for nickname / username": "Search for nickname / username", + "search...": "search...", + "search results": "search results", + "Action": "Action", + "Operator Name": "Operator Name", + "Operator Password": "Operator Password", + "The operation is successful, the status will be updated later": "The operation is successful, the status will be updated later", + "receiver's address": "receiver's address", + "number": "number", + "Numbers + Letters": "Numbers + Letters", + "document": "document", + "File transfer": "File transfer", + "File Classification": "File Classification", + "Document tiles": "Document tiles", + "File name": "File name", + "File name matching rules": "File name matching rules", + "Duplicate file name": "Duplicate file name", + "File name magic variable": "File name magic variable", + "File name magic variable list": "File name magic variable list", + "File Address": "File Address", + "folder": "folder", + "Folder name": "Folder name", + "Duplicate folder name": "Duplicate folder name", + "File has been deleted": "File has been deleted", + "The file has been re-added to the upload queue": "The file has been re-added to the upload queue", + "Total number of files": "Total number of files", + "File physical storage file name": "File physical storage file name", + "File physical storage path": "File physical storage path", + "File resource root URL": "File resource root URL", + "File transfer failed": "File transfer failed", + "File, fill in the slave configuration, start/restart Cloudreve on the slave side.\nThe following is a configuration example for reference, in which the key part has been filled in for you as the one generated in the previous step.": "File, fill in the slave configuration, start/restart Cloudreve on the slave side.\nThe following is a configuration example for reference, in which the key part has been filled in for you as the one generated in the previous step.", + "Text input": "Text input", + "The maximum size of a text file that can be edited online. Files beyond this size cannot be edited online": "The maximum size of a text file that can be edited online. Files beyond this size cannot be edited online", + "Online edit size of text file": "Online edit size of text file", + "Documents": "Documents", + "New name": "New name", + "The new name is the same as the existing file": "The new name is the same as the existing file", + "New password": "New password", + "New Client Password": "New Client Password", + "New file": "New file", + "new folder": "new folder", + "New User": "New User", + "New User Group": "New User Group", + "New Directory": "New Directory", + "Create a new offline download task": "Create a new offline download task", + "New color scheme": "New color scheme", + "New registration": "New registration", + "Activate email template after registration for new users": "Activate email template after registration for new users", + "New user activation": "New user activation", + "without": "without", + "Invalid time zone name": "Invalid time zone name", + "Unable to load this image": "Unable to load this image", + "Unable to load site configuration:": "Unable to load site configuration:", + "Unable to load verification code:": "Unable to load verification code:", + "Unable to read README content, ": "Unable to read README content, ", + "Unable to read the contents of the file, ": "Unable to read the contents of the file, ", + "day": "day", + "date": "date", + "Date Time": "Date Time", + "Time zone": "Time zone", + "Yes": "Yes", + "Whether it is a private space": "Whether it is a private space", + "Whether it is allowed to preview the content of the file on the sharing page": "Whether it is allowed to preview the content of the file on the sharing page", + "Whether the user is allowed to log in using the bound external authenticator, the site must use\nHTTPS before it can be used.": "Whether the user is allowed to log in using the bound external authenticator, the site must use\nHTTPS before it can be used.", + "Whether users are allowed to create offline download tasks": "Whether users are allowed to create offline download tasks", + "Whether to allow users to select multiple files to package and download": "Whether to allow users to select multiple files to package and download", + "Whether it is allowed to obtain external links. Note that some storage policy types are not supported. Even if it is turned on here, the obtained external links cannot be used.": "Whether it is allowed to obtain external links. Note that some storage policy types are not supported. Even if it is turned on here, the obtained external links cannot be used.", + "Are you allowed to obtain permanent direct links to files?": "Are you allowed to obtain permanent direct links to files?", + "Whether to enable the password recovery form verification code": "Whether to enable the password recovery form verification code", + "Whether to enable the registration form verification code": "Whether to enable the registration form verification code", + "Whether to enable the login form verification code": "Whether to enable the login form verification code", + "Do you want to store the file in SharePoint?": "Do you want to store the file in SharePoint?", + "Whether to recursively import all subdirectories under the directory": "Whether to recursively import all subdirectories under the directory", + "Whether to force the use of SSL\nencrypted connection. If you cannot send mail, you can turn this off,\nCloudreve will try to use STARTTLS\nand decide whether to use encrypted connection": "Whether to force the use of SSL\nencrypted connection. If you cannot send mail, you can turn this off,\nCloudreve will try to use STARTTLS\nand decide whether to use encrypted connection", + "Whether to rename the uploaded physical file according to the rules": "Whether to rename the uploaded physical file according to the rules", + "Whether users create compression/decompression tasks": "Whether users create compression/decompression tasks", + "Do you want to use CDN to accelerate access?": "Do you want to use CDN to accelerate access?", + "Do you want to use the supporting Tencent Cloud CDN to accelerate COS access?": "Do you want to use the supporting Tencent Cloud CDN to accelerate COS access?", + "Do you want to use the supporting Alibaba Cloud CDN to accelerate OSS access?": "Do you want to use the supporting Alibaba Cloud CDN to accelerate OSS access?", + "Do you want to replace with a self-built anti-generation server when downloading files?": "Do you want to replace with a self-built anti-generation server when downloading files?", + "Do you want to use CDN for downloads/direct links?": "Do you want to use CDN for downloads/direct links?", + "Do you limit uploading files to MimeType?": "Do you limit uploading files to MimeType?", + "Do you want to restrict uploading file extensions?": "Do you want to restrict uploading file extensions?", + "Do you want to limit the size of the uploaded single file?": "Do you want to limit the size of the uploaded single file?", + "Does the stored physical file need to be renamed? The renaming here will not affect the\nfile name that is finally presented to the user. The file name can also use magic variables,\ncan refer to the available magic variables": "Does the stored physical file need to be renamed? The renaming here will not affect the\nfile name that is finally presented to the user. The file name can also use magic variables,\ncan refer to the available magic variables", + "Username": "Username", + "The nickname has been changed and will take effect after refreshing": "The nickname has been changed and will take effect after refreshing", + "Display Path": "Display Path", + "ordinary": "ordinary", + "General Verification Code": "General Verification Code", + "Pause": "Pause", + "More operations": "More operations", + "Change": "Change", + "Change theme color": "Change theme color", + "Change time zone": "Change time zone", + "Updated at:": "Updated at:", + "The last step, name this storage policy: ": "The last step, name this storage policy: ", + "latest update:": "latest update:", + "Final Progress": "Final Progress", + "maximum": "maximum", + "Maximum single file size (Bytes)": "Maximum single file size (Bytes)", + "The maximum file size that can be uploaded, fill in 0 means no limit": "The maximum file size that can be uploaded, fill in 0 means no limit", + "Maximum capacity": "Maximum capacity", + "Minimum": "Minimum", + "up to date": "up to date", + "Early": "Early", + "month": "month", + "Validity period (days)": "Validity period (days)", + "Validity period (seconds)": "Validity period (seconds)", + "The SMTP\nconnection established within the validity period will be reused by new mail sending requests": "The SMTP\nconnection established within the validity period will be reused by new mail sending requests", + "service name": "service name", + "Not configured": "Not configured", + "The Token anti-leech link is not turned on": "The Token anti-leech link is not turned on", + "inactivated": "inactivated", + "Not logged in": "Not logged in", + "Users who are not logged in cannot preview": "Users who are not logged in cannot preview", + "unknown": "unknown", + "unknown error": "unknown error", + "Local": "Local", + "Local Storage": "Local Storage", + "Native Storage Policy": "Native Storage Policy", + "View Password": "View Password", + "View.": "View.", + "Standard Storage": "Standard Storage", + "Label name": "Label name", + "Under the column": "Under the column", + "Given under the column": "Given under the column", + "Root directory": "Root directory", + "The format is illegal, just enter the domain name part": "The format is illegal, just enter the domain name part", + "Incorrect format": "Incorrect format", + "Overview": "Overview", + "model": "model", + "Downloads •": "Downloads •", + "Views •": "Views •", + "normal": "normal", + "This is shared by": "This is shared by", + "This file cannot be previewed": "This file cannot be previewed", + "This step can be left by default and skipped, but it is strongly recommended that you follow this step.": "This step can be left by default and skipped, but it is strongly recommended that you follow this step.", + "The additional parameters that this user group carries when creating offline download tasks are written in\nJSON\nencoded format. You can also write these settings in the\nAria2 configuration file. For available parameters, please refer to the official Document": "The additional parameters that this user group carries when creating offline download tasks are written in\nJSON\nencoded format. You can also write these settings in the\nAria2 configuration file. For available parameters, please refer to the official Document", + "This setting is very important, please make sure it is consistent with the actual address of your site. You can change this setting in\nparameter settings-site information.": "This setting is very important, please make sure it is consistent with the actual address of your site. You can change this setting in\nparameter settings-site information.", + "The validity period of each capacity package": "The validity period of each capacity package", + "Every set time interval, Cloudreve will ask OneDrive\nto check the customer The client upload situation has ensured that the client upload is controllable": "Every set time interval, Cloudreve will ask OneDrive\nto check the customer The client upload situation has ensured that the client upload is controllable", + "No more": "No more", + "Register": "Register", + "Registration and Login": "Registration and Login", + "registration success": "registration success", + "Registration Date": "Registration Date", + "Registration time": "Registration time", + "registered user": "registered user", + "Create an account": "Create an account", + "register e-mail": "register e-mail", + "Register Verification Code": "Register Verification Code", + "Test slave communication": "Test slave communication", + "Test Connection": "Test Connection", + "Test mail has been sent": "Test mail has been sent", + "Browse": "Browse", + "Views": "Views", + "Browse times from large to small": "Browse times from large to small", + "Views from small to large": "Views from small to large", + "Add to": "Add to", + "Add Purchasable User Group": "Add Purchasable User Group", + "Add Storage Policy": "Add Storage Policy", + "Add Capacity Pack": "Add Capacity Pack", + "Add new validator": "Add new validator", + "Add tag...": "Add tag...", + "Progressive Web App (PWA)": "Progressive Web App (PWA)", + "Hong Kong, Macao and Taiwan (Hong Kong, China)": "Hong Kong, Macao and Taiwan (Hong Kong, China)", + "Guest": "Guest", + "source address": "source address", + "Source File Type": "Source File Type", + "Activated successfully": "Activated successfully", + "The number of activation codes generated in batches": "The number of activation codes generated in batches", + "Popular Shares": "Popular Shares", + "state": "state", + "Status refresh interval (seconds)": "Status refresh interval (seconds)", + "Generate redemption code": "Generate redemption code", + "Generate quantity": "Generate quantity", + "The directory path used to store temporary files generated by tasks such as package download, decompression, compression, etc.": "The directory path used to store temporary files generated by tasks such as package download, decompression, compression, etc.", + "Users": "Users", + "User ID": "User ID", + "The storage path of the user uploaded custom avatar": "The storage path of the user uploaded custom avatar", + "User upload path": "User upload path", + "The maximum size of the avatar file that the user can upload": "The maximum size of the avatar file that the user can upload", + "The maximum total file size of the compression task that can be created by the user, filled in as\n0 means unlimited": "The maximum total file size of the compression task that can be created by the user, filled in as\n0 means unlimited", + "The maximum total file size of the decompression task that can be created by the user, filled in as\n0 means unlimited": "The maximum total file size of the decompression task that can be created by the user, filled in as\n0 means unlimited", + "The mailbox used to receive the reply when the user responds to the email sent by the system": "The mailbox used to receive the reply when the user responds to the email sent by the system", + "User Already": "User Already", + "User has been deleted": "User has been deleted", + "User group to which the user belongs": "User group to which the user belongs", + "When the user does not specify a preferred style, the default style of the personal file page list": "When the user does not specify a preferred style, the default style of the personal file page list", + "When the user does not specify a preferred style, the default style of the directory sharing page": "When the user does not specify a preferred style, the default style of the directory sharing page", + "When the user does not specify a color preference, the color scheme used by the site by default": "When the user does not specify a color preference, the color scheme used by the site by default", + "Initial user group after user registration": "Initial user group after user registration", + "user status": "user status", + "User group": "User group", + "The initial available maximum capacity of users under the user group": "The initial available maximum capacity of users under the user group", + "User group name": "User group name", + "User Group Already": "User Group Already", + "User group has been deleted": "User group has been deleted", + "Unit price of user group": "Unit price of user group", + "The name of the user group": "The name of the user group", + "Depend on ": "Depend on ", + "E-mail": "E-mail", + "Interface": "Interface", + "Leave blank means not to modify": "Leave blank means not to modify", + "Leave blank means unlimited": "Leave blank means unlimited", + "Log in": "Log in", + "Login successful": "Login successful", + "Login Verification Code": "Login Verification Code", + "Encrypted Sharing": "Encrypted Sharing", + "The new name: ": "The new name: ", + "contents": "contents", + "The default style of the directory sharing page list": "The default style of the directory sharing page list", + "Directory Shortcut": "Directory Shortcut", + "Directory Path": "Directory Path", + "Target users": "Target users", + "Destination Directory Path": "Destination Directory Path", + "Straight link settings": "Straight link settings", + "Relative root directory": "Relative root directory", + "understood": "understood", + "Ok": "Ok", + "Confirm site URL settings": "Confirm site URL settings", + "Are you sure you want to delete": "Are you sure you want to delete", + "Are you sure you want to revoke this certificate?": "Are you sure you want to revoke this certificate?", + "Confirm Password": "Confirm Password", + "Confirm password": "Confirm password", + "Example": "Example", + "prohibit": "prohibit", + "Multiple download requests are prohibited": "Multiple download requests are prohibited", + "Preview prohibited": "Preview prohibited", + "Offline download": "Offline download", + "Offline download of the temporary download directory": "Offline download of the temporary download directory", + "Private": "Private", + "Total number of private shares": "Total number of private shares", + "private": "private", + "Private Space": "Private Space", + "Private space cannot open this function": "Private space cannot open this function", + "Private Read and Write": "Private Read and Write", + "Second": "Second", + "Second timestamp": "Second timestamp", + "integral": "integral", + "move": "move", + "Move to": "Move to", + "The format of the space name is incorrect, for example: ccc-1252109809": "The format of the space name is incorrect, for example: ccc-1252109809", + "Space name": "Space name", + "Highlights": "Highlights", + "Site URL": "Site URL", + "Site Information": "Site Information", + "Site Description": "Site Description", + "Site description information may be displayed in the summary of the sharing page": "Site description information may be displayed in the summary of the sharing page", + "The main title of the site": "The main title of the site", + "Subtitle of the site": "Subtitle of the site", + "chapter.": "chapter.", + "Waiting": "Waiting", + "count": "count", + "Admin Panel": "Admin Panel", + "Admin Panel.": "Admin Panel.", + "Type": "Type", + "In the index": "In the index", + "Nanosecond Timestamp": "Nanosecond Timestamp", + "Absolute path": "Absolute path", + "Statistics on": "Statistics on", + "continue": "continue", + "Continue to log in": "Continue to log in", + "edit": "edit", + "edit ": "edit ", + "Edit Storage Policy": "Edit Storage Policy", + "Thumbnail": "Thumbnail", + "Website record number": "Website record number", + "Western United States (Silicon Valley)": "Western United States (Silicon Valley)", + "Background color": "Background color", + "Able to be normally accessed by the external network": "Able to be normally accessed by the external network", + "Tencent Cloud": "Tencent Cloud", + "Tencent Cloud CDN Management Console": "Tencent Cloud CDN Management Console", + "Tencent Cloud COS": "Tencent Cloud COS", + "Tencent Cloud COS Storage Strategy": "Tencent Cloud COS Storage Strategy", + "Tencent Cloud Verification Code": "Tencent Cloud Verification Code", + "Automatically expire": "Automatically expire", + "Automatically rename": "Automatically rename", + "Color Configuration": "Color Configuration", + "Get download address...": "Get download address...", + "The obtained APPID": "The obtained APPID", + "The obtained App Secret Key": "The obtained App Secret Key", + "The obtained SecretId": "The obtained SecretId", + "The obtained SecretKey": "The obtained SecretKey", + "The obtained secret key": "The obtained secret key", + "The obtained website key": "The obtained website key", + "Get External Links": "Get External Links", + "Get files outside the chain": "Get files outside the chain", + "Get the access key and fill it in below.": "Get the access key and fill it in below.", + "Menu and click ": "Menu and click ", + "Menu, click ": "Menu, click ", + "Means matching png format images. Multi-line rules will be calculated in an \"or\" relationship.": "Means matching png format images. Multi-line rules will be calculated in an \"or\" relationship.", + "Blocked": "Blocked", + "Southwest Region (Chengdu)": "Southwest Region (Chengdu)", + "To use this storage policy, please go to the user group management page and bind this storage policy to the corresponding user group.": "To use this storage policy, please go to the user group management page and bind this storage policy to the corresponding user group.", + "The path of the directory to be imported on the storage side": "The path of the directory to be imported on the storage side", + "The path to import the directory to the user's file system": "The path to import the directory to the user's file system", + "Video": "Video", + "unzip": "unzip", + "Unzipping": "Unzipping", + "Decompression task has been created": "Decompression task has been created", + "Unzip and send to": "Unzip and send to", + "warn": "warn", + "Discussion community": "Discussion community", + "Let Cloudreve help me create": "Let Cloudreve help me create", + "Let Cloudreve set it up for me": "Let Cloudreve set it up for me", + "Settings have been saved": "Settings have been saved", + "Repetitive downloading of shared files within the set time will not be counted in the total number of downloads": "Repetitive downloading of shared files within the set time will not be counted in the total number of downloads", + "Settings have been changed": "Settings have been changed", + "Access Domain": "Access Domain", + "Access Key": "Access Key", + "Access Key Page": "Access Key Page", + "Certificate and Password": "Certificate and Password", + "details": "details", + "Please use any two-step verification APP or password management software that supports two-step verification to scan the QR code on the left to add this site. After scanning, please fill in the 6-digit verification code given by the two-step verification APP to enable the two-step verification. ": "Please use any two-step verification APP or password management software that supports two-step verification to scan the QR code on the left to add this site. After scanning, please fill in the 6-digit verification code given by the two-step verification APP to enable the two-step verification. ", + "please log in first": "please log in first", + "Please select first Select the target user": "Please select first Select the target user", + "Please enter the storage directory path of the file below, which can be an absolute path or a relative path (relative to\nCloudreve). Magic variables can be used in the path, and these variables will be automatically replaced with corresponding values ​​when the file is uploaded;\nAvailable magic variables can refer to ": "Please enter the storage directory path of the file below, which can be an absolute path or a relative path (relative to\nCloudreve). Magic variables can be used in the path, and these variables will be automatically replaced with corresponding values ​​when the file is uploaded;\nAvailable magic variables can refer to ", + "Please enter the storage directory path of the file below, which can be an absolute path or a relative path (relative to the\nCloudreve of the\nslave). Magic variables can be used in the path, and these variables will be automatically replaced when the file is uploaded. Corresponding value;\nAvailable magic variables can be referred to": "Please enter the storage directory path of the file below, which can be an absolute path or a relative path (relative to the\nCloudreve of the\nslave). Magic variables can be used in the path, and these variables will be automatically replaced when the file is uploaded. Corresponding value;\nAvailable magic variables can be referred to", + "Please keep at least one color scheme": "Please keep at least one color scheme", + "Please enter the six-digit two-step verification code": "Please enter the six-digit two-step verification code", + "Enter search keywords": "Enter search keywords", + "please choose": "please choose", + "Please verify the current two-step verification code.": "Please verify the current two-step verification code.", + "The longest waiting time when calling RPC service": "The longest waiting time when calling RPC service", + "Account authorization": "Account authorization", + "Account Management": "Account Management", + "User group upgraded after purchase": "User group upgraded after purchase", + "Product description displayed on the purchase page": "Product description displayed on the purchase page", + "After exceeding this upload callback request will not be processed": "After exceeding this upload callback request will not be processed", + "Exceeding the maximum size limit": "Exceeding the maximum size limit", + "Excessive use is banned": "Excessive use is banned", + "Excessive ban": "Excessive ban", + "trend": "trend", + "Follow the system": "Follow the system", + "Cross Domain Policy": "Cross Domain Policy", + "Cross-domain policy has been added": "Cross-domain policy has been added", + "Path Magic Variables": "Path Magic Variables", + "Path Magic Variable List": "Path Magic Variable List", + "jump over": "jump over", + "Go to the basic configuration of the created Bucket and fill in ": "Go to the basic configuration of the created Bucket and fill in ", + "Go to the overview page of the created Bucket and fill in ": "Go to the overview page of the created Bucket and fill in ", + "Go to the basic configuration page of the created bucket, change ": "Go to the basic configuration page of the created bucket, change ", + "Go to authorization page": "Go to authorization page", + "Transferring": "Transferring", + "Subtone": "Subtone", + "Subtone text": "Subtone text", + "enter": "enter", + "Enter the MimeType that is allowed to upload, please use a comma for more than one MimeType,\nSeparate. The Qiniu server will detect the content of the file to determine the\nMimeType, and then use the judgment value to match the specified value. If the match is successful, the upload is allowed.": "Enter the MimeType that is allowed to upload, please use a comma for more than one MimeType,\nSeparate. The Qiniu server will detect the content of the file to determine the\nMimeType, and then use the judgment value to match the specified value. If the match is successful, the upload is allowed.", + "Enter the file extensions allowed to upload, please use a comma for more than one file,\nseparated": "Enter the file extensions allowed to upload, please use a comma for more than one file,\nseparated", + "Enter the sharing password": "Enter the sharing password", + "Enter the file download address, support HTTP(s)/FTP/magnet link": "Enter the file download address, support HTTP(s)/FTP/magnet link", + "Input limit:": "Input limit:", + "filter": "filter", + "Filter Conditions": "Filter Conditions", + "Return to the previous level": "Return to the previous level", + "return to home page": "return to home page", + "Return to storage policy list": "Return to storage policy list", + "Return to login": "Return to login", + "this": "this", + "Enter": "Enter", + "Enter the left side": "Enter the left side", + "Enter on the left side of the application management page,": "Enter on the left side of the application management page,", + "Enter directory": "Enter directory", + "in progress": "in progress", + "Connect Address": "Connect Address", + "The connection is successful, the Aria2 version is: ": "The connection is successful, the Aria2 version is: ", + "Sign out": "Sign out", + "choose": "choose", + "Select as ": "Select as ", + "Select the protocol and fill in the CDN domain name": "Select the protocol and fill in the CDN domain name", + "Choose storage location": "Choose storage location", + "Select storage method": "Select storage method", + "Select the region where the bucket is located, or manually enter the region code": "Select the region where the bucket is located, or manually enter the region code", + "Select your Microsoft 365 account type:": "Select your Microsoft 365 account type:", + "The selected storage strategy only supports manual input of the path": "The selected storage strategy only supports manual input of the path", + "Select Directory": "Select Directory", + "Select the file to download": "Select the file to download", + "Select the storage strategy where the imported file is currently stored": "Select the storage strategy where the imported file is currently stored", + "Choose which user's file system to import the file into, you can search for the user by nickname and mailbox": "Choose which user's file system to import the file into, you can search for the user by nickname and mailbox", + "Import subdirectories recursively": "Import subdirectories recursively", + "Communication is normal": "Communication is normal", + "Mail": "Mail", + "The sender's name shown in the message": "The sender's name shown in the message", + "The result of the email will not be reported immediately. If you have not received the test email for a long time, please check the error log output by\nCloudreve in the terminal.": "The result of the email will not be reported immediately. If you have not received the test email for a long time, please check the error log output by\nCloudreve in the terminal.", + "Mail Template": "Mail Template", + "Mail activation": "Mail activation", + "Rename": "Rename", + "Repeat new password": "Repeat new password", + "Redirect URI (optional)": "Redirect URI (optional)", + "reset Password": "reset Password", + "Retry": "Retry", + "Error Message": "Error Message", + "Error details": "Error details", + "Block all public access rights": "Block all public access rights", + "Alibaba Cloud CDN Management Console": "Alibaba Cloud CDN Management Console", + "Alibaba Cloud OSS": "Alibaba Cloud OSS", + "Alibaba Cloud OSS Storage Strategy": "Alibaba Cloud OSS Storage Strategy", + "limit": "limit", + "Randomly Generated": "Randomly Generated", + "Very important, please ensure that it is consistent with the actual situation. When using cloud storage strategies and payment platforms, please fill in an address that can be accessed by the external network.": "Very important, please ensure that it is consistent with the actual situation. When using cloud storage strategies and payment platforms, please fill in an address that can be accessed by the external network.", + "Audio": "Audio", + "Music player": "Music player", + "Footer Code": "Footer Code", + "Page does not exist": "Page does not exist", + "There was an error in page rendering, please try to refresh this page.": "There was an error in page rendering, please try to refresh this page.", + "The page gets a pair of\naccess keys and fills them in below. Please make sure that this pair of keys has access rights to\nCOS and SCF services.": "The page gets a pair of\naccess keys and fills them in below. Please make sure that this pair of keys has access rights to\nCOS and SCF services.", + "Get the user's AccessKey on the page and fill it in below.": "Get the user's AccessKey on the page and fill it in below.", + "Page, copy": "Page, copy", + "Preview": "Preview", + "The prefix of the URL generated when previewing/fetching the external link of the file": "The prefix of the URL generated when previewing/fetching the external link of the file", + "Preview link": "Preview link", + "Colour:": "Colour:", + "Driver. If you need to use it, please start Aria2 on the same device as the user running\nCloudreve, and enable the RPC\nservice in the configuration file of\nAria2. For more information and instructions, please refer to the docs": "Driver. If you need to use it, please start Aria2 on the same device as the user running\nCloudreve, and enable the RPC\nservice in the configuration file of\nAria2. For more information and instructions, please refer to the docs", + "Verifier has been added": "Verifier has been added", + "Verification Code": "Verification Code", + "Verification code form": "Verification code form", + "Verification Code Type": "Verification Code Type", + "high": "high", + "Magic Variables": "Magic Variables", + "Dark Mode": "Dark Mode", + "Default Theme-Material-UI": "Default Theme-Material-UI", + "Default User Group": "Default User Group", + "Default color scheme": "Default color scheme", + "!": "!", + ", the Cloudreve\nprocess requires read, write, and execute permissions for this directory.": ", the Cloudreve\nprocess requires read, write, and execute permissions for this directory.", + "But you need to click the button below and use OneDrive\nto log in and authorize to complete the initialization before you can use it.\nYou can re-authorize on the storage policy list page in the future.": "But you need to click the button below and use OneDrive\nto log in and authorize to complete the initialization before you can use it.\nYou can re-authorize on the storage policy list page in the future.", + ", and fill in ": ", and fill in ", + ", not currently supported": ", not currently supported", + ":": ":", + ";": ";", + "; Others can be kept by default": "; Others can be kept by default", + ";The password is the password of the created account.": ";The password is the password of the created account.", + "; The login user name is unified as: ": "; The login user name is unified as: ", + "Parameter settings": "Parameter settings", + "Nickname": "Nickname", + "Password": "Password", + "Settings saved": "Settings saved", + "Filesize": "Filesize", + "Change language": "Change language" +} \ No newline at end of file diff --git a/src/locales/zh-CN.json b/src/locales/zh-CN.json new file mode 100644 index 00000000..f82409e7 --- /dev/null +++ b/src/locales/zh-CN.json @@ -0,0 +1,995 @@ +{ + "Files": " 个文件", + "Create": " 创建", + "Expires in days": " 天后到期", + "Bytes)": " 字节)", + "Expires in hours": " 小时后到期", + "After downloads": " 次下载后", + "'S encrypted sharing": " 的加密分享", + "(Optional) Specify the EndPoint (regional node) of the bucket, fill in\nas a complete URL format, such as ": "(可选) 指定存储桶的 EndPoint(地域节点),\n填写为完整的 URL 格式,比如", + ", common": ", 共", + ", common ": ", 共 ", + "/s uploaded": "/s 已上传", + "/My Files/Learning Materials/": "/我的文件/学习资料/", + "/search results": "/搜索结果", + "1 download": "1 次下载", + "1 hour": "1 小时", + "1 day": "1 天", + "2 downloads": "2 次下载", + "3 downloads": "3 次下载", + "4 downloads": "4 次下载", + "5 downloads": "5 次下载", + "5 minutes": "5 分钟", + "6-digit verification code": "6位验证码", + "7 days": "7 天", + "8 random characters": "8位随机字符", + "16 random characters": "16位随机字符", + "20 downloads": "20 次下载", + "30 days": "30 天", + "50 downloads": "50 次下载", + "100 downloads": "100 次下载", + "192x192 medium icon address, png format": "192x192 的中等图标地址,png 格式", + "512x512 large icon address, png format": "512x512 的大图标地址,png 格式", + ":( An error occurred during request": ":( 请求时出现错误", + "AccessKey / Refresh Token": "AccessKey / 刷新Token", + "Amazon S3 Storage Policy": "Amazon S3 存储策略", + "Aria2 Task Parameters": "Aria2 任务参数", + "Aria2 setting item format error": "Aria2 设置项格式错误", + "Azure Active Directory console (21Vianet account)": "Azure Active Directory 控制台 (世纪互联账号)", + "Azure Active Directory Console (International Account)": "Azure Active Directory 控制台 (国际版账号)", + "Bucket name": "存储桶名称", + "CDN prefix": "CDN 前缀", + "CDN accelerated domain name": "CDN 加速域名", + "The direct transmission of the COS bucket client requires the help of Tencent Cloud": "COS 存储桶 客户端直传需要借助腾讯云的", + "The COS bucket needs to be correctly configured with the cross-domain policy before you can use the Web\nside to upload files. Cloudreve\ncan automatically set it for you, or you can set it manually by referring to the document steps. If you have already set this\nBucket Cross-domain policy, this step can be skipped.": "COS 存储桶 需要正确配置跨域策略后才能使用 Web\n端上传文件,Cloudreve\n可以帮您自动设置,您也可以参考文档步骤手动设置。如果您已设置过此\nBucket 的跨域策略,此步骤可以跳过。", + "COS Management Console": "COS 管理控制台", + "CSS color value": "CSS 色值", + "CSS color value affects the color of the status bar on the startup screen, the status bar in the content page, and the address bar on the PWA\n": "CSS 色值,影响 PWA\n启动画面上状态栏、内容页中状态栏、地址栏的颜色", + "The Cloudreve master site needs to enable CORS support, the specific steps are as follows:": "Cloudreve 主站需要启用 CORS 支持,具体步骤如下:", + "Cloudreve Dashboard": "Cloudreve 仪表盘", + "Cloudreve can try to automatically create a callback cloud function for you. Please select the location of\nCOS bucket and continue.\nCreation may take a few seconds, please be patient. Please make sure your Tencent Cloud account is enabled before creating Cloud function service.": "Cloudreve 可以尝试帮你自动创建回调云函数,请选择\nCOS 存储桶 所在地域后继续。\n创建可能会花费数秒钟,请耐心等待。创建前请确保您的腾讯云账号已开启云函数服务。", + "The interval at which Cloudreve requests Aria2 to refresh the task status.": "Cloudreve 向 Aria2 请求刷新任务状态的间隔。", + "Cloudreve's offline download function is controlled by": "Cloudreve 的离线下载功能由", + "EndPoint (regional node)": "EndPoint(地域节点)", + "Gravatar Server": "Gravatar 服务器", + "Gravatar server address, you can choose to use domestic mirror": "Gravatar 服务器地址,可选择使用国内镜像", + "IANA Time Zone Name Identification": "IANA 时区名称标识", + "InfoHash:": "InfoHash:", + "MimeType list": "MimeType 列表", + "OSS Bucket needs to configure the cross-domain policy correctly before uploading files on the Web\nside, Cloudreve\nIt can be set automatically for you, or you can set it manually by referring to the document steps. If you have already set a cross-domain policy for this\nBucket, you can skip this step. ": "OSS Bucket 需要正确配置跨域策略后才能使用 Web\n端上传文件,Cloudreve\n可以帮您自动设置,您也可以参考文档步骤手动设置。如果您已设置过此\nBucket 的跨域策略,此步骤可以跳过。", + "OSS Management Console": "OSS 管理控制台", + "Office Document Preview Connection": "Office 文档预览连接", + "OneDrive\nThe maximum number of retries after a failed upload of storage policy fragments, only applicable to server uploads or transfers": "OneDrive\n存储策略分片上传失败后重试的最大次数,只适用于服务端上传或中转", + "OneDrive\nThe maximum time to wait for the callback after the client upload is completed, if it exceeds, the upload will be considered failed": "OneDrive\n客户端上传完成后,等待回调的最大时间,如果超出会被认为上传失败", + "OneDrive download request cache": "OneDrive 下载请求缓存", + "OneDrive fragmentation error retry": "OneDrive 分片错误重试", + "OneDrive anti-generation server address": "OneDrive 反代服务器地址", + "OneDrive callback waiting": "OneDrive 回调等待", + "OneDrive client upload monitoring interval": "OneDrive 客户端上传监控间隔", + "OneDrive can cache the results after obtaining the file download URL\n, reducing the frequency of popular file download API requests": "OneDrive 获取文件下载 URL\n后可将结果缓存,减轻热门文件下载API请求频率", + "OneDrive redirect address": "OneDrive 重定向地址", + "OneDrive/SharePoint Storage Strategy": "OneDrive/SharePoint 存储策略", + "OneDrive/SharePoint Drive Resource Identification": "OneDrive/SharePoint 驱动器资源标识", + "PDF failed to load,": "PDF 加载失败,", + "Display mode after PWA application is added": "PWA 应用添加后的展示模式", + "RPC authorization token, consistent with the Aria2\nconfiguration file, please leave it blank if it is not set.": "RPC 授权令牌,与 Aria2\n配置文件中保持一致,未设置请留空。", + "RPC server address": "RPC 服务器地址", + "RPC call timeout (seconds)": "RPC 调用超时 (秒)", + "S3 Bucket needs to configure the cross-domain policy correctly before you can upload files on the Web\nside. Cloudreve\ncan automatically set it for you, or you can set it manually by referring to the document steps. If you have already set this\nBucket Cross-domain policy, this step can be skipped.": "S3 Bucket 需要正确配置跨域策略后才能使用 Web\n端上传文件,Cloudreve\n可以帮您自动设置,您也可以参考文档步骤手动设置。如果您已设置过此\nBucket 的跨域策略,此步骤可以跳过。", + "S3 type storage policy is currently only available for self-use, or for trusted user groups.": "S3 类型存储策略目前仅可用于自己使用,或者是给受信任的用户组使用。", + "SMTP password": "SMTP 密码", + "SMTP server": "SMTP 服务器", + "SMTP username": "SMTP 用户名", + "SMTP port": "SMTP 端口", + "SMTP connection validity period (seconds)": "SMTP 连接有效期 (秒)", + "SharePoint site address": "SharePoint 站点地址", + "South America (São Paulo)": "South America (São Paulo)", + "Telegram group": "Telegram 群组", + "Token anti-theft chain key": "Token 防盗链 密钥", + "Web Authn requires your site to enable HTTPS, and confirm the parameter settings-site information-site URL also uses HTTPS before it can be turned on.": "Web Authn 需要您的站点启用 HTTPS,并确认 参数设置 - 站点信息 - 站点URL 也使用了 HTTPS 后才能开启。", + "WebDAV username": "WebDAV用户名", + "The address of WebDAV is: ": "WebDAV的地址为:", + "WebDAV connection address": "WebDAV连接地址", + "Number of Workers": "Worker 数量", + "[Original object does not exist]": "[原始对象不存在]", + "[expired]": "[已失效]", + "[unknown]": "[未知]", + ".": "。", + ".\nLeave blank to use the default access point generated by the system.": "。\n留空则将使用系统生成的默认接入点。", + ". After the creation is complete, fill in the value of the client password below: ": "。创建完成后将客户端密码的值填写在下方:", + "An activation email has been sent to your mailbox, please visit the link in the email to continue to complete the registration.": "一封激活邮件已经发送至您的邮箱,请访问邮件中的链接以继续完成注册。", + "No need to modify after generally added": "一般添加后无需修改", + "The \\\\ in the middle of a line": "一行中间的", + "Qiniu": "七牛", + "Qiniu Storage Strategy": "七牛 存储策略", + "Qiniu Control Panel": "七牛控制面板", + "Previous": "上一步", + "Upload and download": "上传与下载", + "Uploaded to": "上传于", + "Upload session": "上传会话", + "upload certificate": "上传凭证", + "Upload size:": "上传大小:", + "Upload documents": "上传文d件", + "upload files": "上传文件", + "Forcibly reset the connection when upload verification fails": "上传校验失败时强制重置连接", + "Upload directory": "上传目录", + "The upload component has not been loaded yet": "上传组件还未加载完成", + "Uploaded by": "上传者", + "Uploader ID": "上传者ID", + "Upload Path": "上传路径", + "Upload speed:": "上传速度:", + "Upload Queue": "上传队列", + "Upload limit": "上传限制", + "Parent directory": "上级目录", + "Next step": "下一步", + "Number of Subordinate Files": "下属文件数", + "Number of Subordinate Users": "下属用户数", + "The following is the slave key randomly generated by the system for you. Generally, there is no need to change it. If you have custom requirements,\ncan fill in your key below:": "下方为系统为您随机生成的从机端密钥,一般无需改动,如果有自定义需求,\n可将您的密钥填入下方:", + "download": "下载", + "downloading": "下载中", + "Download Session": "下载会话", + "Download error:": "下载出错:", + "download times": "下载次数", + "The number of downloads from large to small": "下载次数由大到小", + "The number of downloads from small to large": "下载次数由小到大", + "Download to": "下载至", + "Download speed limit": "下载限速", + "Do not use": "不使用", + "Do not open": "不开启", + "Cannot delete the default color scheme": "不能删除默认配色", + "Cannot contain spaces": "不能含有空格", + "not limited": "不限制", + "Expert mode editing": "专家模式编辑", + "21Vianet Edition": "世纪互联版", + "The two password entries are inconsistent": "两次密码输入不一致", + "individual": "个", + "Homepage": "个人主页", + "Personal file list default style": "个人文件列表默认样式", + "Personal settings": "个人设置", + "personal information": "个人资料", + "Objects": "个对象", + "Personalise": "个性化", + "Medium Icon": "中图标", + "Medium avatar size": "中头像尺寸", + "Transit Parallel Transmission": "中转并行传输", + "Temporary Download Directory": "临时下载目录", + "Temporary Directory": "临时目录", + "Name this storage policy:": "为此存储策略命名:", + "Create or authorize an operator with read, write, and delete permissions for this service, and then fill in the operator information below: ": "为此服务创建或授权有读取、写入、删除权限的操作员,然后将操作员信息填写在下方:", + "Main title": "主标题", + "main color tone": "主色调", + "The main color cannot be repeated with the existing color matching": "主色调不能与已有配色重复", + "Main tone text": "主色调文字", + "Home": "面板首页", + "Theme Color": "主题色", + "Theme Colors": "主题配色", + "The theme color has been changed": "主题配色已更换", + "Two-step verification": "二步验证", + "Cloud Function": "云函数", + "Cloud function callback": "云函数回调", + "Southeast Asia Pacific (Singapore)": "亚太东南(新加坡)", + "South Asia Pacific (Mumbai)": "亚太南部(孟买)", + "Products to ensure that upload callbacks are controllable. If you plan to use this storage policy for your own use, or assign it to a trusted user group, you can skip this step.\nIf it is for public use, please be sure to create a callback cloud function.": "产品以确保上传回调可控。如果您打算将此存储策略自用,或者分配给可信赖用户组,此步骤可以跳过。\n如果是作为公有使用,请务必创建回调云函数。", + "Nothing was found": "什么都没有找到", + "Only valid for Amazon S3 storage policies": "仅对 Amazon S3 存储策略有效", + "Only valid for OSS storage policies": "仅对 OSS 存储策略有效", + "Only valid for OneDrive\nstorage policy, leave it blank to use the user's default OneDrive\ndrive": "仅对 OneDrive\n存储策略有效,留空则使用用户的默认 OneDrive\n驱动器", + "Only valid for OneDrive storage policies": "仅对 OneDrive 存储策略有效", + "Only valid for Qiniu storage strategy": "仅对七牛存储策略有效", + "Only valid for another cloud storage strategy": "仅对又拍云存储策略有效", + "Never": "从不", + "Import from outside": "从外部导入", + "Upload from file": "从文件上传", + "Slave": "从机", + "Slave API request": "从机API请求", + "Slave address": "从机地址", + "Slave Storage": "从机存储", + "Slave Storage Strategy": "从机存储策略", + "The slave storage policy allows you to use the server that also runs Cloudreve\nas the storage end, and the user upload and download traffic is directly transmitted via HTTP.": "从机存储策略允许你使用同样运行了 Cloudreve\n的服务器作为存储端, 用户上传下载流量通过 HTTP 直传。", + "Slave Key": "从机密钥", + "The configuration file format of the slave is roughly the same as that of the master, the difference is: ": "从机端配置文件格式大致与主站端相同,区别在于:", + "In order to obtain higher security, the private space cannot open the \"Get Direct Link\" function.": "以获得更高的安全性,私有空间无法开启“获取直链”功能。", + "Dashboard": "仪表盘", + "An account in any organization directory (any Azure AD directory-\nmulti-tenant)": "任何组织目录(任何 Azure AD 目录 -\n多租户)中的帐户", + "Task has been created": "任务已创建", + "Task has been deleted": "任务已删除", + "Task has been cancelled, status will be updated later": "任务已取消,状态会在稍后更新", + "Task Type": "任务类型", + "Task Queue": "任务队列", + "The maximum number of parallel coroutines when transferring tasks in the task queue": "任务队列中转任务传输时,最大并行协程数", + "The maximum number of tasks executed in parallel in the task queue. After saving, you need to restart\nCloudreve to take effect": "任务队列最多并行执行的任务数,保存后需要重启\nCloudreve 生效", + "Low Frequency Access": "低频访问", + "as a wildcard. For example ": "作为通配符。比如", + "You can use": "你可以使用", + "use": "使用", + "Use Gravatar Avatar ": "使用 Gravatar 头像 ", + "Log in with external authenticator": "使用外部验证器登录", + "Use password protection": "使用密码保护", + "Log in with password": "使用密码登录", + "The price when using points to purchase, fill in as 0\nmeans that you cannot use points to buy": "使用积分购买时的价格,填写为 0\n表示不能使用积分购买", + "save": "保存", + "save Changes": "保存更改", + "Revise": "修改", + "Modify the Cloudreve configuration file, add the following CORS\nconfiguration items, save and restart Cloudreve.": "修改 Cloudreve 配置文件,新增以下 CORS\n配置项,保存并重启 Cloudreve。", + "Modified at": "修改于", + "Modify the slave configuration file.": "修改从机配置文件。", + "Modify avatar": "修改头像", + "Change username": "修改昵称", + "Change password": "修改登录密码", + "value": "值", + "Preferences off": "偏好关闭", + "Preferences on": "偏好开启", + "During seeding:": "做种中:", + "Seeder:": "做种者:", + "allow": "允许", + "Allow download and share": "允许下载分享", + "Allow public reading": "允许公共读取", + "Allow to create shares": "允许创建分享", + "Allow file extensions": "允许文件扩展名", + "Allow new users to register": "允许新用户注册", + "Allowed MimeType": "允许的 MimeType", + "Allow access to external links": "允许获取外链", + "Allow preview": "允许预览", + "Global Task Parameters": "全局任务参数", + "all": "全部", + "Share all": "全部分享", + "Public Reading": "公共读", + "Public Read Private Write": "公共读私有写", + "public": "公开", + "Total number of public shares": "公开分享总数", + "Public": "公有", + "Key Color": "关键色", + "Close": "关闭", + "When disabled, users can no longer register through the login page": "关闭后,无法再通过前台注册新的用户", + "When disabled, users cannot download files created by others to share": "关闭后,用户无法下载别人创建的文件分享", + "When disabled, users cannot create sharing links": "关闭后,用户无法创建分享链接", + "When disabled, users cannot connect to the network disk through the WebDAV\nprotocol": "关闭后,用户无法通过 WebDAV\n协议连接至网盘", + "Intranet EndPoint": "内网 EndPoint", + "Credentials have been deleted": "凭证已删除", + "Error": "出错", + "share": "分享", + "Share download session": "分享下载会话", + "Share does not exist or has expired": "分享不存在或已过期", + "Share on": "分享于", + "Share Password": "分享密码", + "Share deleted": "分享已删除", + "Sharing canceled": "分享已取消", + "Total Shares": "分享总数", + "Share Date": "分享日期", + "Sharer": "分享者", + "Share Link": "分享链接", + "\\\\ under the partition": "分区下的", + "Shard size:": "分片大小:", + "Number of shards:": "分片数量:", + "minute": "分钟", + "Switch to light mode": "切换到浅色模式", + "Switch to dark mode": "切换到深色模式", + "List": "列表", + "List display": "列表展示", + "create": "创建", + "Create Bucket. Note: You can only select the type of space to create": "创建 Bucket。注意:创建空间类型只能选择", + "Create a CDN accelerated domain name, and set the source site to the newly created COS\nbucket. Fill in the CDN\naccelerated domain name below, and choose whether to use HTTPS:": "创建 CDN 加速域名,并设定源站为刚创建的 COS\n存储桶。在下方填写 CDN\n加速域名,并选择是否使用 HTTPS:", + "Create a CDN accelerated domain name, and set the source site as the newly created OSS\nBucket. Fill in the CDN\naccelerated domain name below, and choose whether to use HTTPS:": "创建 CDN 加速域名,并设定源站为刚创建的 OSS\nBucket。在下方填写 CDN\n加速域名,并选择是否使用 HTTPS:", + "The additional setting parameters carried when creating a download task are written in JSON\nencoded format. You can also write these settings in the\nAria2 configuration file. For available parameters, please refer to the official documentation": "创建下载任务时携带的额外设置参数,以 JSON\n编码后的格式书写,您可也可以将这些设置写在\nAria2 配置文件里,可用参数请查阅官方文档", + "Built in": "创建于", + "Create a cloud storage service.": "创建云存储服务。", + "Create Task": "创建任务", + "Create a share link": "创建分享链接", + "Create compressed file": "创建压缩文件", + "Create bucket.": "创建存储桶。", + "After the creation is complete, enter the application management": "创建完成后进入应用管理的", + "Create an object storage resource.": "创建对象存储资源。", + "Create import task": "创建导入任务", + "Create a file": "创建文件", + "Create Folder": "创建文件夹", + "Create a new account": "创建新账号", + "Created Date": "创建日期", + "Created from early to late": "创建日期由早到晚", + "Created from late to early": "创建日期由晚到早", + "Created Date:": "创建日期:", + "Create User": "创建用户", + "Create offline download task": "创建离线下载任务", + "creator": "创建者", + "Initial capacity": "初始容量", + "delete": "删除", + "Delete task will be executed in the background": "删除任务将在后台执行", + "Delete Credentials": "删除凭证", + "Delete Object": "删除对象", + "successfully deleted": "删除成功", + "Delete this file": "删除此文件", + "Delete Record": "删除记录", + "Refresh": "刷新", + "Go to": "前往", + "Go to the AWS S3\nconsole to create a bucket, and fill in the specified when you created the bucket below": "前往 AWS S3\n控制台创建存储桶,在下方填写您创建存储桶时指定的", + "Go to the function configuration panel of the created cloud storage service, go to the\naccess configuration tab, turn on the Token anti-theft chain and set a password.": "前往所创建云存储服务的 功能配置 面板,转到\n访问配置 选项卡,开启 Token 防盗链并设定密码。", + "subtitle": "副标题", + "Failed to load": "加载失败", + "load more": "加载更多", + "Accelerated Domain Name": "加速域名", + "Include file": "包含文件", + "Include directory": "包含目录", + "The complete RPC\nserver address including the port, for example: http://127.0.0.1:6800/, leave it blank to not enable the\nAria2 service": "包含端口的完整 RPC\n服务器地址,例如:http://127.0.0.1:6800/,留空表示不启用\nAria2 服务", + "North America (Toronto)": "北美地区(多伦多)", + "Upgrade to Donation Edition": "升级到捐助版", + "East China (Shanghai)": "华东地区(上海)", + "North China (Beijing)": "华北地区(北京)", + "South China (Guangzhou)": "华南地区(广州)", + "South China (Guangzhou Open)": "华南地区(广州Open)", + "Unit price (yuan)": "单价 (元)", + "Unit price (points)": "单价 (积分)", + "Valid period of unit purchase time": "单位购买时间的有效期", + "Single file size limit": "单文件大小限制", + "compression": "压缩", + "Compress/Decompress Tasks": "压缩/解压缩 任务", + "Compressing": "压缩中", + "Compression task has been created": "压缩任务已创建", + "Compressed file name": "压缩文件名", + "Original file name": "原始文件名", + "Original Directory Path": "原始目录路径", + "Old password": "原密码", + "Settings": "设置项", + "UpYun": "又拍云", + "Shoot cloud storage strategy again": "又拍云 存储策略", + "Again to take the cloud anti-leech Token": "又拍云防盗链 Token", + "Shoot the cloud panel again": "又拍云面板", + "Counter generation server address": "反代服务器地址", + "Sender's name": "发件人名", + "Sender's mailbox": "发件人邮箱", + "Sending server address port number": "发件服务器地址端口号", + "Sending server address without port number": "发件服务器地址,不含端口号", + "Sending Test": "发件测试", + "The address of the sending mailbox": "发件邮箱的地址", + "Send a letter": "发信", + "Send Mail Password": "发信邮箱密码", + "The user name of the sending mailbox, generally the same as the mailbox address": "发信邮箱用户名,一般与邮箱地址相同", + "Published on": "发表于", + "send": "发送", + "Send password reset email": "发送密码重置邮件", + "Send test mail": "发送测试邮件", + "Before sending a test mail, please save the changed mail settings;": "发送测试邮件前,请先保存已更改的邮件设置;", + "Cancel": "取消", + "Cancel/Stop": "取消/停止", + "Cancel task": "取消任务", + "Cancel sharing": "取消分享", + "Supported account types": "受支持的帐户类型", + "Change to public sharing": "变更为公开分享", + "Change to private sharing": "变更为私密分享", + "Only valid for the native storage strategy. When enabled, users cannot use the multi-threaded download tool.": "只针对本机存储策略有效。开启后,用户无法使用多线程下载工具。", + "Optional": "可选", + "Name": "名称", + "Expires later": "后过期", + "Wizard mode editing": "向导模式编辑", + "Shared a file with you": "向您分享了 1 个文件", + "?": "吗?", + "no": "否", + "Enable": "启用", + "Naming Rules": "命名规则", + "Product display name": "商品展示名称", + "Product description (one per line)": "商品描述 (一行一个)", + "amount of goods": "商品数量", + "Reply mailbox": "回信邮箱", + "Callback cloud function has been added": "回调云函数已添加", + "International Edition": "国际版", + "Image Processing": "图像处理", + "Graphic verification page": "图形验证页面", + "Icon:": "图标:", + "Pictures": "图片", + "Enter the personal center -\nkey management in the Qiniu control panel, and fill in the AK and SK obtained below.": "在七牛控制面板进入 个人中心 -\n密钥管理,在下方填写获得到的 AK、SK。", + "Fill in the \\\\ specified when you created the Bucket below": "在下方填写您创建 Bucket 时指定的", + "Fill in the \"storage space name\" you specified when Qiniu created the storage space below: ": "在下方填写您在七牛创建存储空间时指定的“存储空间名称”:", + "Fill in the name of the created service below:": "在下方填写所创建的服务名称:", + "Select the type of public access permissions for the space you created below. It is recommended to select \"Private\" for higher security. Private spaces cannot enable the \"Get direct link\" function.": "在下方选择您创建的空间的公共访问权限类型,推荐选择“私有”以获得更高的安全性,私有空间无法开启“获取直链”功能。", + "Select the type of access permission for the space you created below, it is recommended to choose": "在下方选择您创建的空间的访问权限类型,推荐选择", + "Select the type of read and write permissions for the space you created below. It is recommended to select \"Private\" for higher security. The private space cannot enable the \"Get direct link\" function.": "在下方选择您创建的空间的读写权限类型,推荐选择“私有”以获得更高的安全性,私有空间无法开启“获取直链”功能。", + "Select the type of space you created below. It is recommended to select \"Private Space\" for higher security. Private Space cannot enable the \"Get Direct Link\" function.": "在下方选择您创建的空间类型,推荐选择“私有空间”以获得更高的安全性,私有空间无法开启“获取直链”功能。", + "Create a new directory in the same level directory of Cloudreve on the slave side": "在从机端 Cloudreve 的同级目录下新建", + "Before using the Tencent Cloud COS storage strategy, please make sure that the\naddress you fill in the parameter setting\n-site information-site URL matches the actual one, and ": "在使用 腾讯云 COS 储策略前,请确保您在 参数设置\n- 站点信息 - 站点URL 中填写的\n地址与实际相符,并且", + "Before using the Alibaba Cloud OSS storage strategy, please make sure that the\naddress you fill in the parameter setting\n-site information-site URL matches the actual one, and ": "在使用 阿里云 OSS 储策略前,请确保您在 参数设置\n- 站点信息 - 站点URL 中填写的\n地址与实际相符,并且", + "Before using the Qiniu storage strategy, please make sure that the address you fill in the parameter setting -\nsite information-site URL matches the actual address, and ": "在使用七牛存储策略前,请确保您在 参数设置 -\n站点信息 - 站点URL 中填写的 地址与实际相符,并且", + "Before using another cloud storage strategy, please make sure that the address you fill in the parameter settings-\nsite information-site URL matches the actual address, and ": "在使用又拍云存储策略前,请确保您在 参数设置 -\n站点信息 - 站点URL 中填写的 地址与实际相符,并且", + "Search in site-wide sharing": "在全站分享中搜索", + "Search in my files": "在我的文件中搜索", + "In Tencent Cloud": "在腾讯云", + "In Alibaba Cloud": "在阿里云", + "Custom HTML code inserted at the bottom of the page": "在页面底部插入的自定义HTML代码", + "Basic Information": "基本信息", + "Fill in 0 means no limit. When the limit is turned on,\nwhen users under this user group download all files under the storage policy that supports the speed limit, the maximum download speed will be limited.": "填写为 0 表示不限制。开启限制后,\n此用户组下的用户下载所有支持限速的存储策略下的文件时,下载最大速度会被限制。", + "Fill in the domain name bound to the cloud storage service, and choose whether to use\nHTTPS:": "填写为云存储服务绑定的域名,并根据实际情况选择是否使用\nHTTPS:", + "Fill in the slave address.": "填写从机地址。", + "Fill in below:": "填写在下方:", + "Fill in the application registration form. Among them, the name can be any; ": "填写应用注册表单。其中,名称可任取;", + "Fill in the CDN accelerated domain name that you bind to the storage space.": "填写您为存储空间绑定的 CDN 加速域名。", + "Fill in the Token anti-theft chain key you set": "填写您所设置的 Token 防盗链 密钥", + "Processing": "处理中", + "Processing...": "处理中...", + "record number: ": "备案号: ", + "Label": "备注名", + "copy": "复制", + "copy to": "复制到", + "Extranet access": "外网访问", + "Themeing": "外观", + "External Authenticator": "外部认证器", + "External link address": "外链地址", + "Large Icon": "大图标", + "Large icon display": "大图标展示", + "Large Avatar Size": "大头像尺寸", + "Filesize": "数据量", + "fail": "失败", + "Avatar": "头像", + "Portrait storage path": "头像存储路径", + "The avatar has been updated and will take effect after refreshing": "头像已更新,刷新后生效", + "Picture file size limit": "头像文件大小限制", + "If the master has enabled\nHTTPS, the slave also needs to enable it, and fill in the address of the HTTPS\nprotocol below.": "如果主站启用了\nHTTPS,从机也需要启用,并在下方填入 HTTPS\n协议的地址。", + "If your Cloudreve\nis deployed in Alibaba Cloud Computing Service and it is in the same Availability Zone as OSS\n, you can additionally specify the use of the intranet\nEndPoint\nto save data start. Do you want to Use OSS\nIntranet EndPoint when sending requests on the server side?": "如果您的 Cloudreve\n部署在阿里云计算服务中,并且与 OSS\n处在同一可用区下,您可以额外指定使用内网\nEndPoint\n以节省流量开始。是否要在服务端发送请求时使用 OSS\n内网 EndPoint?", + "The field must be changed to ": "字段必须更改为", + "For the content of the field,\ncan refer to the above examples or official documents. If the configuration is not correct, the user will not be able to upload files to the slave through the\nWeb terminal.": "字段的内容,\n具体可参考上文范例或官方文档。如果配置不正确,用户将无法通过\nWeb 端向从机上传文件。", + "The value of the field is the key filled in or generated in the second step.": "字段,其值为第二步里填写或生成的密钥。", + "letter": "字母", + "Storage and Transmission": "存储与传输", + "Storage file name": "存储文件名", + "The region where the bucket is located": "存储桶所在地区", + "Bucket ID": "存储桶标识", + "Storage Directory": "存储目录", + "Storage": "存储空间", + "Storage space name": "存储空间名称", + "Storage Endpoint": "存储端 Endpoint", + "Storage configuration": "存储端配置", + "Storage Policy Name": "存储策略名", + "Storage Strategy": "存储策略", + "Storage Strategy Comparison": "存储策略对比", + "Storage Policy Already": "存储策略已", + "Storage policy has been deleted": "存储策略已删除", + "Storage policy has been added!": "存储策略已添加!", + "Storage Strategy Type": "存储策略类型", + "Storage Policy Number": "存储策略编号", + "Storage path": "存储路径", + "Save to specified SharePoint": "存到指定 SharePoint 中", + "Save to the account default OneDrive drive": "存到账号默认 OneDrive 驱动器中", + "Save to": "存放到", + "Security Information Management": "安全信息管理", + "Security and Privacy": "安全隐私", + "Finish": "完成", + "After completing the above steps, you can click the test button below to test whether the communication is normal.": "完成以上步骤后,你可以点击下方的测试按钮测试通信是否正常。", + "The complete configuration items are available in ": "完整的配置项可在", + "Client Password": "客户端密码", + "Unit price of capacity package": "容量包的单价", + "The size of the capacity package": "容量包的大小", + "width": "宽度", + "Login Password": "登录密码", + "Incorrect password": "密码不正确", + "Password has been updated": "密码已更新", + "Password has been reset": "密码已重设", + "The password reset email has been sent, please check it": "密码重置邮件已发送,请注意查收", + "Password reset email template": "密码重置邮件模板", + "Password reset successfully": "密码重设成功", + "For point products, here is the number of points, and other products are multiples of duration": "对于积分类商品,此处为积分数量,其他商品为时长倍数", + "Corresponding product": "对应商品", + "Object name": "对象名", + "The import task has been created, you can check the execution in the \"persistent task\"": "导入任务已创建,您可以在“持久任务”中查看执行情况", + "Import external directory": "导入外部目录", + "Block/Unblock": "封禁/解封", + "Copy the Cloudreve\nprogram of the same version as the master site to the server to be used as the slave.": "将和主站相同版本的 Cloudreve\n程序拷贝至要作为从机的服务器上。", + "Small Icon": "小图标", + "Small icon display": "小图标展示", + "Small avatar size": "小头像尺寸", + "Hour": "小时", + "Ready": "就绪", + "Display Mode": "展示模式", + "Ministry of Industry and Information Technology website ICP record number": "工信部网站ICP备案号", + "Used ": "已使用 ", + "Cancelled": "已取消", + "Copied to clipboard": "已复制到剪切板", + "expired": "已失效", + "completed": "已完成", + "completed ": "已完成 ", + "Completed, transfer processing": "已完成,转存处理中", + "Completed, transfer to queue": "已完成,转存排队中", + "activated": "已开启", + "Token anti-theft chain is turned on": "已开启 Token 防盗链", + "Used space": "已用空间", + "selected": "已选择", + "Regular Tasks": "常规任务", + "years": "年份", + "And fill in the following:": "并填写在下方:", + "Log in and enter after logging in": "并登录,登录后进入", + "application": "应用", + "App Authorization": "应用授权", + "Application Registration": "应用注册", + "Application (Client) ID": "应用程序(客户端) ID", + "Application Management Page": "应用管理页面", + "The direct chain function cannot be used after the Token anti-leech link is turned on": "开启 Token 防盗链后无法使用直链功能", + "When enabled, it will be highlighted on the product selection page": "开启后,在商品选择页面会被突出展示", + "When enabled, if the data upload verification of this policy, avatar, etc. fails, the server will forcibly reset the connection": "开启后,如果本次策略、头像等数据上传校验失败,服务器会强制重置连接", + "When enabled, the new user registration needs to click the activation link in the email to complete. Please confirm that the email sending settings are correct, otherwise the activation email will not be delivered": "开启后,新用户注册需要点击邮件中的激活链接才能完成。请确认邮件发送设置是否正确,否则激活邮件无法送达", + "When enabled, the user can request a direct link that can directly access the content of the file, suitable for image bed applications or personal use.": "开启后,用户可以请求获得能直接访问到文件内容的直链,适用于图床应用或自用。", + "When enabled, the domain name part of the URL\nwhen the user accesses the file will be replaced with the CDN domain name.": "开启后,用户访问文件时的 URL\n中的域名部分会被替换为 CDN 域名。", + "Turn on rename": "开启重命名", + "Enforce SSL connection": "强制使用 SSL 连接", + "Forced Delete": "强制删除", + "Archive Storage": "归档存储", + "The current browser or environment does not support": "当前浏览器或环境不支持", + "Maximum size of files to be compressed": "待压缩文件最大大小", + "Maximum size of the file to be decompressed": "待解压文件最大大小", + "Cross-domain configuration must be activated, ie ": "必须启动跨域配置,即", + "Must specify ": "必须指定", + "Forgot password": "忘记密码", + "neglect": "忽略", + "total": "总计", + "You can import the existing files and directory structure in the storage policy into\nCloudreve\n. The import operation will not take up additional physical storage space, but the user's used capacity will still be deducted normally, and it will stop when the space is insufficient Import.": "您可以将存储策略中已有文件、目录结构导入到\nCloudreve\n中,导入操作不会额外占用物理存储空间,但仍会正常扣除用户已用容量空间,空间不足时将停止导入。", + "You have not set the site URL, do you want to set it to the current ": "您尚未设定站点URL,是否要将其设定为当前的 ", + "You have logged out": "您已退出登录", + "HTTPS is enabled on your current site. Selecting HTTP here may cause connection failure.": "您当前站点启用了 HTTPS ,此处选择 HTTP 可能会导致无法连接。", + "You must enable HTTPS to use the OneDrive/SharePoint storage policy; after enabling it, change the parameter settings-site information-site URL.": "您必须启用 HTTPS 才能使用 OneDrive/SharePoint 存储策略;启用后同步更改 参数设置 - 站点信息 - 站点URL。", + "Your used capacity has exceeded the capacity quota, please delete extra files or purchase capacity as soon as possible": "您的已用容量已超过容量配额,请尽快删除多余文件或购买容量", + "Your account has been successfully activated.": "您的账号已被成功激活。", + "The site URL you set is inconsistent with the current URL. Do you want to set it to the current": "您设置的站点URL与当前实际不一致,是否要将其设定为当前的 ", + "My Share": "我的分享", + "My files": "我的文件", + "or": "或者", + "Or click the \"Upload File\" button at the bottom right to add a file": "或点击右下方“上传文件”按钮添加文件", + "Deadline": "截止期限", + "Directory": "所在目录", + "Download package": "打包下载", + "Packing...": "打包中...", + "Open": "打开", + "Open storage directory": "打开存放目录", + "The address of the small icon with the extension ico": "扩展名为 ico 的小图标地址", + "List of extensions": "扩展名列表", + "Cannot find a share that meets the conditions": "找不到符合条件的分享", + "Retrieve Password": "找回密码", + "Retrieve password verification code": "找回密码验证码", + "Drag and drop files here": "拖拽文件至此", + "Persistent Task": "持久任务", + "Specify the storage policy of the user group.": "指定用户组的存储策略。", + "Button.": "按钮。", + "Button, ": "按钮,", + "Authorization succeeded": "授权成功", + "Sort by": "排序方式", + "in the line": "排队中", + "in the line...": "排队中...", + "describe": "描述", + "hint": "提示", + "Insert": "插入中", + "Search file name": "搜索 文件名", + "Search for nickname / username": "搜索 昵称 / 用户名", + "search...": "搜索...", + "search results": "搜索结果", + "Action": "操作", + "Operator Name": "操作员名", + "Operator Password": "操作员密码", + "The operation is successful, the status will be updated later": "操作成功,状态会在稍后更新", + "receiver's address": "收件人地址", + "number": "数字", + "Numbers + Letters": "数字+字母", + "document": "文件", + "File transfer": "文件中转", + "File Classification": "文件分类", + "Document tiles": "文件列表", + "File name": "文件名称", + "File name matching rules": "文件名匹配规则", + "Duplicate file name": "文件名称重复", + "File name magic variable": "文件名魔法变量", + "File name magic variable list": "文件名魔法变量列表", + "File Address": "文件地址", + "folder": "文件夹", + "Folder name": "文件夹名称", + "Duplicate folder name": "文件夹名称重复", + "File has been deleted": "文件已删除", + "The file has been re-added to the upload queue": "文件已经重新加入上传队列", + "Total number of files": "文件总数", + "File physical storage file name": "文件物理存储文件名", + "File physical storage path": "文件物理存储路径", + "File resource root URL": "文件资源根URL", + "File transfer failed": "文件转存失败", + "File, fill in the slave configuration, start/restart Cloudreve on the slave side.\nThe following is a configuration example for reference, in which the key part has been filled in for you as the one generated in the previous step.": "文件,填入从机配置,启动/重启从机端 Cloudreve。\n以下为一个可供参考的配置例子,其中密钥部分已帮您填写为上一步所生成的。", + "Text input": "文字输入", + "The maximum size of a text file that can be edited online. Files beyond this size cannot be edited online": "文本文件可在线编辑的最大大小,超出此大小的文件无法在线编辑", + "Online edit size of text file": "文本文件在线编辑大小", + "Documents": "文档", + "New name": "新名称", + "The new name is the same as the existing file": "新名称与已有文件重复", + "New password": "新密码", + "New Client Password": "新建客户端密码", + "New file": "新建文件", + "new folder": "新建文件夹", + "New User": "新建用户", + "New User Group": "新建用户组", + "New Directory": "新建目录", + "Create a new offline download task": "新建离线下载任务", + "New color scheme": "新建配色方案", + "New registration": "新注册", + "Activate email template after registration for new users": "新用户注册后激活邮件的模板", + "New user activation": "新用户激活", + "without": "无", + "Invalid time zone name": "无效的时区名称", + "Unable to load this image": "无法加载此图像", + "Unable to load site configuration:": "无法加载站点配置:", + "Unable to load verification code:": "无法加载验证码:", + "Unable to read README content, ": "无法读取 README 内容,", + "Unable to read the contents of the file, ": "无法读取文件内容,", + "day": "日", + "date": "日期", + "Date Time": "日期时间", + "Time zone": "时区", + "Yes": "是", + "Whether it is a private space": "是否为私有空间", + "Whether it is allowed to preview the content of the file on the sharing page": "是否允许在分享页面预览文件内容", + "Whether the user is allowed to log in using the bound external authenticator, the site must use\nHTTPS before it can be used.": "是否允许用户使用绑定的外部验证器登录,站点必须启动\nHTTPS 才能使用。", + "Whether users are allowed to create offline download tasks": "是否允许用户创建离线下载任务", + "Whether to allow users to select multiple files to package and download": "是否允许用户多选文件打包下载", + "Whether it is allowed to obtain external links. Note that some storage policy types are not supported. Even if it is turned on here, the obtained external links cannot be used.": "是否允许获取外链。注意,某些存储策略类型不支持,即使在此开启,获取的外链也无法使用。", + "Are you allowed to obtain permanent direct links to files?": "是否允许获取文件永久直链?", + "Whether to enable the password recovery form verification code": "是否启用找回密码表单验证码", + "Whether to enable the registration form verification code": "是否启用注册表单验证码", + "Whether to enable the login form verification code": "是否启用登录表单验证码", + "Do you want to store the file in SharePoint?": "是否将文件存放在 SharePoint 中?", + "Whether to recursively import all subdirectories under the directory": "是否将目录下的所有子目录递归导入", + "Whether to force the use of SSL\nencrypted connection. If you cannot send mail, you can turn this off,\nCloudreve will try to use STARTTLS\nand decide whether to use encrypted connection": "是否强制使用 SSL\n加密连接。如果无法发送邮件,可关闭此项,\nCloudreve 会尝试使用 STARTTLS\n并决定是否使用加密连接", + "Whether to rename the uploaded physical file according to the rules": "是否根据规则对上传物理文件重命名", + "Whether users create compression/decompression tasks": "是否用户创建 压缩/解压缩 任务", + "Do you want to use CDN to accelerate access?": "是否要使用 CDN 加速访问?", + "Do you want to use the supporting Tencent Cloud CDN to accelerate COS access?": "是否要使用配套的 腾讯云CDN 加速 COS 访问?", + "Do you want to use the supporting Alibaba Cloud CDN to accelerate OSS access?": "是否要使用配套的 阿里云CDN 加速 OSS 访问?", + "Do you want to replace with a self-built anti-generation server when downloading files?": "是否要在文件下载时替换为使用自建的反代服务器?", + "Do you want to use CDN for downloads/direct links?": "是否要对下载/直链使用 CDN?", + "Do you limit uploading files to MimeType?": "是否限制上传文件 MimeType?", + "Do you want to restrict uploading file extensions?": "是否限制上传文件扩展名?", + "Do you want to limit the size of the uploaded single file?": "是否限制上传的单文件大小?", + "Does the stored physical file need to be renamed? The renaming here will not affect the\nfile name that is finally presented to the user. The file name can also use magic variables,\ncan refer to the available magic variables": "是否需要对存储的物理文件进行重命名?此处的重命名不会影响最终呈现给用户的\n文件名。文件名也可使用魔法变量,\n可用魔法变量可参考", + "Username": "用户名", + "The nickname has been changed and will take effect after refreshing": "昵称已更改,刷新后生效", + "Display Path": "显示路径", + "ordinary": "普通", + "General Verification Code": "普通验证码", + "Pause": "暂停中", + "More operations": "更多操作", + "Change": "更改", + "Change theme color": "更改主题配色", + "Change time zone": "更改时区", + "Updated at:": "更新于:", + "The last step, name this storage policy: ": "最后一步,为此存储策略命名:", + "latest update:": "最后更新:", + "Final Progress": "最后进度", + "maximum": "最大", + "Maximum single file size (Bytes)": "最大单文件尺寸 (Bytes)", + "The maximum file size that can be uploaded, fill in 0 means no limit": "最大可上传的文件尺寸,填写为0表示不限制", + "Maximum capacity": "最大容量", + "Minimum": "最小", + "up to date": "最新", + "Early": "最早", + "month": "月份", + "Validity period (days)": "有效期 (天)", + "Validity period (seconds)": "有效期 (秒)", + "The SMTP\nconnection established within the validity period will be reused by new mail sending requests": "有效期内建立的 SMTP\n连接会被新邮件发送请求复用", + "service name": "服务名称", + "Not configured": "未开启", + "The Token anti-leech link is not turned on": "未开启 Token 防盗链", + "inactivated": "未激活", + "Not logged in": "未登录", + "Users who are not logged in cannot preview": "未登录用户无法预览", + "unknown": "未知", + "unknown error": "未知错误", + "Local": "本机", + "Local Storage": "本机存储", + "Native Storage Policy": "本机存储策略", + "View Password": "查看密码", + "View.": "查阅。", + "Standard Storage": "标准存储", + "Label name": "标签名", + "Under the column": "栏目下", + "Given under the column": "栏目下 给出的", + "Root directory": "根目录", + "The format is illegal, just enter the domain name part": "格式不合法,只需输入域名部分即可", + "Incorrect format": "格式不正确", + "Overview": "概览", + "model": "模式", + "Downloads •": "次下载 •", + "Views •": "次浏览 •", + "normal": "正常", + "This is shared by": "此分享由", + "This file cannot be previewed": "此文件无法预览", + "This step can be left by default and skipped, but it is strongly recommended that you follow this step.": "此步骤可保持默认并跳过,但是强烈建议您跟随此步骤操作。", + "The additional parameters that this user group carries when creating offline download tasks are written in\nJSON\nencoded format. You can also write these settings in the\nAria2 configuration file. For available parameters, please refer to the official Document": "此用户组创建离线下载任务时额外携带的参数,以\nJSON\n编码后的格式书写,您可也可以将这些设置写在\nAria2 配置文件里,可用参数请查阅官方文档", + "This setting is very important, please make sure it is consistent with the actual address of your site. You can change this setting in\nparameter settings-site information.": "此设置非常重要,请确保其与您站点的实际地址一致。你可以在\n参数设置 - 站点信息 中更改此设置。", + "The validity period of each capacity package": "每个容量包的有效期", + "Every set time interval, Cloudreve will ask OneDrive\nto check the customer The client upload situation has ensured that the client upload is controllable": "每间隔所设定时间,Cloudreve 会向 OneDrive\n请求检查客户端上传情况已确保客户端上传可控", + "No more": "没有更多了", + "Register": "注册", + "Registration and Login": "注册与登录", + "registration success": "注册成功", + "Registration Date": "注册日期", + "Registration time": "注册时间", + "registered user": "注册用户", + "Create an account": "注册账号", + "register e-mail": "注册邮箱", + "Register Verification Code": "注册验证码", + "Test slave communication": "测试从机通信", + "Test Connection": "测试连接", + "Test mail has been sent": "测试邮件已发送", + "Browse": "浏览", + "Views": "浏览次数", + "Browse times from large to small": "浏览次数由大到小", + "Views from small to large": "浏览次数由小到大", + "Add to": "添加", + "Add Purchasable User Group": "添加可购用户组", + "Add Storage Policy": "添加存储策略", + "Add Capacity Pack": "添加容量包", + "Add new validator": "添加新验证器", + "Add tag...": "添加标签...", + "Progressive Web App (PWA)": "渐进式应用 (PWA)", + "Hong Kong, Macao and Taiwan (Hong Kong, China)": "港澳台地区(中国香港)", + "Guest": "游客", + "source address": "源地址", + "Source File Type": "源文件类型", + "Activated successfully": "激活成功", + "The number of activation codes generated in batches": "激活码批量生成数量", + "Popular Shares": "热门分享", + "state": "状态", + "Status refresh interval (seconds)": "状态刷新间隔 (秒)", + "Generate redemption code": "生成兑换码", + "Generate quantity": "生成数量", + "The directory path used to store temporary files generated by tasks such as package download, decompression, compression, etc.": "用于存放打包下载、解压缩、压缩等任务产生的临时文件的目录路径", + "Users": "用户", + "User ID": "用户ID", + "The storage path of the user uploaded custom avatar": "用户上传自定义头像的存储路径", + "User upload path": "用户上传路径", + "The maximum size of the avatar file that the user can upload": "用户可上传头像文件的最大大小", + "The maximum total file size of the compression task that can be created by the user, filled in as\n0 means unlimited": "用户可创建的压缩任务的文件最大总大小,填写为\n0 表示不限制", + "The maximum total file size of the decompression task that can be created by the user, filled in as\n0 means unlimited": "用户可创建的解压缩任务的文件最大总大小,填写为\n0 表示不限制", + "The mailbox used to receive the reply when the user responds to the email sent by the system": "用户回复系统发送的邮件时,用于接收回信的邮箱", + "User Already": "用户已", + "User has been deleted": "用户已删除", + "User group to which the user belongs": "用户所属用户组", + "When the user does not specify a preferred style, the default style of the personal file page list": "用户未指定偏好样式时,个人文件页面列表默认样式", + "When the user does not specify a preferred style, the default style of the directory sharing page": "用户未指定偏好样式时,目录分享页面的默认样式", + "When the user does not specify a color preference, the color scheme used by the site by default": "用户未指定偏好配色时,站点默认使用的配色方案", + "Initial user group after user registration": "用户注册后的初始用户组", + "user status": "用户状态", + "User group": "用户组", + "The initial available maximum capacity of users under the user group": "用户组下的用户初始可用最大容量", + "User group name": "用户组名", + "User Group Already": "用户组已", + "User group has been deleted": "用户组已删除", + "Unit price of user group": "用户组的单价", + "The name of the user group": "用户组的名称", + "Depend on ": "由 ", + "E-mail": "电子邮箱", + "Interface": "界面", + "Leave blank means not to modify": "留空表示不修改", + "Leave blank means unlimited": "留空表示不限制", + "Log in": "登录", + "Login successful": "登录成功", + "Login Verification Code": "登录验证码", + "Encrypted Sharing": "的加密分享", + "The new name: ": "的新名称:", + "contents": "目录", + "The default style of the directory sharing page list": "目录分享页列表默认样式", + "Directory Shortcut": "目录快捷方式", + "Directory Path": "目录路径", + "Target users": "目标用户", + "Destination Directory Path": "目的目录路径", + "Straight link settings": "直链设置", + "Relative root directory": "相对根目录", + "understood": "知道了", + "Ok": "确定", + "Confirm site URL settings": "确定站点URL设置", + "Are you sure you want to delete": "确定要删除", + "Are you sure you want to revoke this certificate?": "确定要吊销这个凭证吗?", + "Confirm Password": "确认密码", + "Confirm password": "确认新密码", + "Example": "示例", + "prohibit": "禁止", + "Multiple download requests are prohibited": "禁止多次下载请求", + "Preview prohibited": "禁止预览", + "Offline download": "离线下载", + "Offline download of the temporary download directory": "离线下载临时下载目录的", + "Private": "私密", + "Total number of private shares": "私密分享总数", + "private": "私有", + "Private Space": "私有空间", + "Private space cannot open this function": "私有空间无法开启此功能", + "Private Read and Write": "私有读写", + "Second": "秒", + "Second timestamp": "秒级时间戳", + "integral": "积分", + "move": "移动", + "Move to": "移动至", + "The format of the space name is incorrect, for example: ccc-1252109809": "空间名格式不正确, 举例:ccc-1252109809", + "Space name": "空间名称", + "Highlights": "突出展示", + "Site URL": "站点URL", + "Site Information": "站点信息", + "Site Description": "站点描述", + "Site description information may be displayed in the summary of the sharing page": "站点描述信息,可能会在分享页面摘要内展示", + "The main title of the site": "站点的主标题", + "Subtitle of the site": "站点的副标题", + "chapter.": "章节。", + "Waiting": "等待中", + "count": "算数", + "Admin Panel": "管理面板", + "Admin Panel.": "管理面板。", + "Type": "类型", + "In the index": "索引中", + "Nanosecond Timestamp": "纳秒级时间戳", + "Absolute path": "绝对路径", + "Statistics on": "统计于", + "continue": "继续", + "Continue to log in": "继续登录", + "edit": "编辑", + "edit ": "编辑 ", + "Edit Storage Policy": "编辑存储策略", + "Thumbnail": "缩略图", + "Website record number": "网站备案号", + "Western United States (Silicon Valley)": "美国西部(硅谷)", + "Background color": "背景色", + "Able to be normally accessed by the external network": "能够被外网正常访问", + "Tencent Cloud": "腾讯云", + "Tencent Cloud CDN Management Console": "腾讯云 CDN 管理控制台", + "Tencent Cloud COS": "腾讯云 COS", + "Tencent Cloud COS Storage Strategy": "腾讯云 COS 存储策略", + "Tencent Cloud Verification Code": "腾讯云验证码", + "Automatically expire": "自动过期", + "Automatically rename": "自动重命名", + "Color Configuration": "色彩配置", + "Get download address...": "获取下载地址...", + "The obtained APPID": "获取到的的 APPID", + "The obtained App Secret Key": "获取到的的 App Secret Key", + "The obtained SecretId": "获取到的的 SecretId", + "The obtained SecretKey": "获取到的的 SecretKey", + "The obtained secret key": "获取到的的 秘钥", + "The obtained website key": "获取到的的 网站密钥", + "Get External Links": "获取外链", + "Get files outside the chain": "获取文件外链", + "Get the access key and fill it in below.": "获取访问密钥,并填写在下方。", + "Menu and click ": "菜单,并点击", + "Menu, click ": "菜单,点击", + "Means matching png format images. Multi-line rules will be calculated in an \"or\" relationship.": "表示匹配png格式图像。多行规则间会以“或”的关系进行运算。", + "Blocked": "被封禁", + "Southwest Region (Chengdu)": "西南地区(成都)", + "To use this storage policy, please go to the user group management page and bind this storage policy to the corresponding user group.": "要使用此存储策略,请到用户组管理页面,为相应用户组绑定此存储策略。", + "The path of the directory to be imported on the storage side": "要导入的目录在存储端的路径", + "The path to import the directory to the user's file system": "要将目录导入到用户文件系统中的路径", + "Video": "视频", + "unzip": "解压缩", + "Unzipping": "解压缩中", + "Decompression task has been created": "解压缩任务已创建", + "Unzip and send to": "解压送至", + "warn": "警告", + "Discussion community": "讨论社区", + "Let Cloudreve help me create": "让 Cloudreve 帮我创建", + "Let Cloudreve set it up for me": "让 Cloudreve 帮我设置", + "Settings have been saved": "设置已保存", + "Repetitive downloading of shared files within the set time will not be counted in the total number of downloads": "设定时间内重复下载分享文件,不会被记入总下载次数", + "Settings have been changed": "设置已更改", + "Access Domain": "访问域名", + "Access Key": "访问密钥", + "Access Key Page": "访问密钥页面", + "Certificate and Password": "证书和密码", + "details": "详细信息", + "Please use any two-step verification APP or password management software that supports two-step verification to scan the QR code on the left to add this site. After scanning, please fill in the 6-digit verification code given by the two-step verification APP to enable the two-step verification. ": "请使用任意二步验证APP或者支持二步验证的密码管理软件扫描左侧二维码添加本站。扫描完成后请填写二步验证APP给出的6位验证码以开启二步验证。", + "please log in first": "请先登录", + "Please select first Select the target user": "请先选择目标用户", + "Please enter the storage directory path of the file below, which can be an absolute path or a relative path (relative to\nCloudreve). Magic variables can be used in the path, and these variables will be automatically replaced with corresponding values ​​when the file is uploaded;\nAvailable magic variables can refer to ": "请在下方输入文件的存储目录路径,可以为绝对路径或相对路径(相对于\nCloudreve)。路径中可以使用魔法变量,文件在上传时会自动替换这些变量为相应值;\n可用魔法变量可参考", + "Please enter the storage directory path of the file below, which can be an absolute path or a relative path (relative to the\nCloudreve of the\nslave). Magic variables can be used in the path, and these variables will be automatically replaced when the file is uploaded. Corresponding value;\nAvailable magic variables can be referred to": "请在下方输入文件的存储目录路径,可以为绝对路径或相对路径(相对于\n从机的\nCloudreve)。路径中可以使用魔法变量,文件在上传时会自动替换这些变量为相应值;\n可用魔法变量可参考", + "Please keep at least one color scheme": "请至少保留一个配色方案", + "Please enter the six-digit two-step verification code": "请输入六位二步验证代码", + "Enter search keywords": "请输入搜索关键词", + "please choose": "请选择", + "Please verify the current two-step verification code.": "请验证当前二步验证代码。", + "The longest waiting time when calling RPC service": "调用 RPC 服务时最长等待时间", + "Account authorization": "账号授权", + "Account Management": "账号管理", + "User group upgraded after purchase": "购买后升级的用户组", + "Product description displayed on the purchase page": "购买页面展示的商品描述", + "After exceeding this upload callback request will not be processed": "超出后不再处理此上传的回调请求", + "Exceeding the maximum size limit": "超出最大尺寸限制", + "Excessive use is banned": "超额使用被封禁", + "Excessive ban": "超额封禁", + "trend": "趋势", + "Follow the system": "跟随系统", + "Cross Domain Policy": "跨域策略", + "Cross-domain policy has been added": "跨域策略已添加", + "Path Magic Variables": "路径魔法变量", + "Path Magic Variable List": "路径魔法变量列表", + "jump over": "跳过", + "Go to the basic configuration of the created Bucket and fill in ": "转到所创建 Bucket 的基础配置,填写", + "Go to the overview page of the created Bucket and fill in ": "转到所创建 Bucket 的概览页面,填写", + "Go to the basic configuration page of the created bucket, change ": "转到所创建存储桶的基础配置页面,将", + "Go to authorization page": "转到授权页面", + "Transferring": "转存中", + "Subtone": "辅色调", + "Subtone text": "辅色调文字", + "enter": "输入", + "Enter the MimeType that is allowed to upload, please use a comma for more than one MimeType,\nSeparate. The Qiniu server will detect the content of the file to determine the\nMimeType, and then use the judgment value to match the specified value. If the match is successful, the upload is allowed.": "输入允许上传的 MimeType,多个请以半角逗号 ,\n隔开。七牛服务器会侦测文件内容以判断\nMimeType,再用判断值跟指定值进行匹配,匹配成功则允许上传", + "Enter the file extensions allowed to upload, please use a comma for more than one file,\nseparated": "输入允许上传的文件扩展名,多个请以半角逗号 ,\n隔开", + "Enter the sharing password": "输入分享密码", + "Enter the file download address, support HTTP(s)/FTP/magnet link": "输入文件下载地址,支持 HTTP(s)/FTP/磁力链", + "Input limit:": "输入限制:", + "filter": "过滤", + "Filter Conditions": "过滤条件", + "Return to the previous level": "返回上一层", + "return to home page": "返回主页", + "Return to storage policy list": "返回存储策略列表", + "Return to login": "返回登录", + "this": "这", + "Enter": "进入", + "Enter the left side": "进入左侧", + "Enter on the left side of the application management page,": "进入应用管理页面左侧的", + "Enter directory": "进入目录", + "in progress": "进行中", + "Connect Address": "连接地址", + "The connection is successful, the Aria2 version is: ": "连接成功,Aria2 版本为:", + "Sign out": "退出登录", + "choose": "选择", + "Select as ": "选择为", + "Select the protocol and fill in the CDN domain name": "选择协议并填写 CDN 域名", + "Choose storage location": "选择存储位置", + "Select storage method": "选择存储方式", + "Select the region where the bucket is located, or manually enter the region code": "选择存储桶所在的区域,或者手动输入区域代码", + "Select your Microsoft 365 account type:": "选择您的 Microsoft 365 账号类型:", + "The selected storage strategy only supports manual input of the path": "选择的存储策略只支持手动输入路径", + "Select Directory": "选择目录", + "Select the file to download": "选择要下载的文件", + "Select the storage strategy where the imported file is currently stored": "选择要导入文件目前存储所在的存储策略", + "Choose which user's file system to import the file into, you can search for the user by nickname and mailbox": "选择要将文件导入到哪个用户的文件系统中,可通过昵称、邮箱搜索用户", + "Import subdirectories recursively": "递归导入子目录", + "Communication is normal": "通信正常", + "Mail": "邮件", + "The sender's name shown in the message": "邮件中展示的发件人姓名", + "The result of the email will not be reported immediately. If you have not received the test email for a long time, please check the error log output by\nCloudreve in the terminal.": "邮件发送结果不会立即反馈,如果您长时间未收到测试邮件,请检查\nCloudreve 在终端输出的错误日志。", + "Mail Template": "邮件模板", + "Mail activation": "邮件激活", + "Rename": "重命名", + "Repeat new password": "重复新密码", + "Redirect URI (optional)": "重定向 URI (可选)", + "reset Password": "重设密码", + "Retry": "重试", + "Error Message": "错误信息", + "Error details": "错误详情", + "Block all public access rights": "阻止全部公共访问权限", + "Alibaba Cloud CDN Management Console": "阿里云 CDN 管理控制台", + "Alibaba Cloud OSS": "阿里云 OSS", + "Alibaba Cloud OSS Storage Strategy": "阿里云 OSS 存储策略", + "limit": "限制", + "Randomly Generated": "随机生成", + "Very important, please ensure that it is consistent with the actual situation. When using cloud storage strategies and payment platforms, please fill in an address that can be accessed by the external network.": "非常重要,请确保与实际情况一致。使用云存储策略、支付平台时,请填入可以被外网访问的地址。", + "Audio": "音频", + "Music player": "音频播放", + "Footer Code": "页脚代码", + "Page does not exist": "页面不存在", + "There was an error in page rendering, please try to refresh this page.": "页面渲染出现错误,请尝试刷新此页面。", + "The page gets a pair of\naccess keys and fills them in below. Please make sure that this pair of keys has access rights to\nCOS and SCF services.": "页面获取\n一对访问密钥,并填写在下方。请确保这对密钥拥有\nCOS 和 SCF 服务的访问权限。", + "Get the user's AccessKey on the page and fill it in below.": "页面获取 用户 AccessKey,并填写在下方。", + "Page, copy": "页面,复制", + "Preview": "预览", + "The prefix of the URL generated when previewing/fetching the external link of the file": "预览/获取文件外链时生成URL的前缀", + "Preview link": "预览链接", + "Colour:": "颜色:", + "Driver. If you need to use it, please start Aria2 on the same device as the user running\nCloudreve, and enable the RPC\nservice in the configuration file of\nAria2. For more information and instructions, please refer to the docs": "驱动。如需使用,请在同一设备上以和运行\nCloudreve 相同的用户身份启动 Aria2, 并在\nAria2 的配置文件中开启 RPC\n服务。更多信息及指引请参考文档的", + "Verifier has been added": "验证器已添加", + "Verification Code": "验证码", + "Verification code form": "验证码的形式", + "Verification Code Type": "验证码类型", + "high": "高度", + "Magic Variables": "魔法变量", + "Dark Mode": "黑暗模式", + "Default Theme-Material-UI": "默认主题 - Material-UI", + "Default User Group": "默认用户组", + "Default color scheme": "默认配色", + "!": "!", + ", the Cloudreve\nprocess requires read, write, and execute permissions for this directory.": ",Cloudreve\n进程需要此目录的读、写、执行权限。", + "But you need to click the button below and use OneDrive\nto log in and authorize to complete the initialization before you can use it.\nYou can re-authorize on the storage policy list page in the future.": ",但是你需要点击下方按钮,并使用 OneDrive\n登录授权以完成初始化后才能使用。\n日后你可以在存储策略列表页面重新进行授权。", + ", and fill in ": ",并填写", + ", not currently supported": ",暂不支持", + ":": ":", + ";": ";", + "; Others can be kept by default": "; 其他保持默认即可", + ";The password is the password of the created account.": ";密码为所创建账号的密码。", + "; The login user name is unified as: ": ";登陆用户名统一为:", + "Parameter settings": "参数设置", + "Size": "大小", + "Nickname": "昵称", + "Password": "密码", + "Settings saved": "设定已保存", + "Change language": "改变语言" +} \ No newline at end of file diff --git a/src/middleware/Api.js b/src/middleware/Api.js index 1f105d9c..a04f7c47 100644 --- a/src/middleware/Api.js +++ b/src/middleware/Api.js @@ -1,3 +1,4 @@ +import i18next from "i18next"; import axios from "axios"; import Auth from "./Auth"; @@ -15,7 +16,7 @@ const instance = axios.create({ function AppError(message, code, error) { this.code = code; - this.message = message || "未知错误"; + this.message = message || i18next.t('unknown error'); this.message += error ? " " + error : ""; this.stack = new Error().stack; } diff --git a/src/middleware/Init.js b/src/middleware/Init.js index 3a7ac52b..501fe956 100644 --- a/src/middleware/Init.js +++ b/src/middleware/Init.js @@ -1,3 +1,4 @@ +import i18next from "i18next"; import { setSiteConfig, toggleSnackbar, @@ -90,7 +91,7 @@ export async function UpdateSiteConfig(store) { toggleSnackbar( "top", "right", - "无法加载站点配置:" + error.message, + i18next.t('Unable to load site configuration:') + error.message, "error" ) ); diff --git a/src/reducers/index.js b/src/reducers/index.js index 5a470393..ec61dd4c 100644 --- a/src/reducers/index.js +++ b/src/reducers/index.js @@ -4,6 +4,7 @@ import { combineReducers } from "../redux/combineReducers"; import viewUpdate from "../redux/viewUpdate/reducer"; import explorer from "../redux/explorer/reducer"; import { connectRouter } from "connected-react-router"; +import i18next from "i18next"; const doNavigate = (path, state) => { window.currntPath = path; @@ -140,7 +141,7 @@ const cloudreveApp = (state = defaultStatus, action) => { case "SEARCH_MY_FILE": return Object.assign({}, state, { navigator: Object.assign({}, state.navigator, { - path: "/搜索结果", + path: i18next.t('/search results'), refresh: state.explorer.keywords === "" ? state.navigator.refresh diff --git a/src/reducers/index.test.js b/src/reducers/index.test.js index 5554a376..04521b95 100644 --- a/src/reducers/index.test.js +++ b/src/reducers/index.test.js @@ -66,20 +66,47 @@ const initState = { const middlewares = [thunk]; const mockStore = configureMockStore(middlewares); +jest.mock('connected-react-router', () => ({ + connectRouter: () => { + return {}; + }, +})); + +jest.mock('react-i18next', () => ({ + withTranslation: () => Component => { + Component.defaultProps = { ...Component.defaultProps, t: () => '' }; + return Component; + }, + useTranslation: () => { + return { + t: (str) => str, + i18n: { + changeLanguage: () => new Promise(() => { + return {}; + }), + }, + }; + }, +})); + +jest.mock('i18next', () => ({ + t: (str) => '', +})); + describe("index reducer", () => { it("should return the initial state", () => { - expect(cloudreveApp(undefined, { type: "@@INIT" })).toEqual(initState); + expect(cloudreveApp()(undefined, { type: "@@INIT" })).toEqual(initState); }); it("should handle redux init", () => { - expect(cloudreveApp(undefined, { type: "@@redux/INIT" })).toEqual( + expect(cloudreveApp()(undefined, { type: "@@redux/INIT" })).toEqual( initState ); }); it("should handle DRAWER_TOGGLE", () => { const openAction = drawerToggleAction(true); - expect(cloudreveApp(initState, openAction)).toEqual({ + expect(cloudreveApp()(initState, openAction)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -88,7 +115,7 @@ describe("index reducer", () => { }); const clossAction = drawerToggleAction(false); - expect(cloudreveApp(initState, clossAction)).toEqual({ + expect(cloudreveApp()(initState, clossAction)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -99,7 +126,7 @@ describe("index reducer", () => { it("should handle CHANGE_VIEW_METHOD", () => { const action = changeViewMethod("list"); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -110,7 +137,7 @@ describe("index reducer", () => { it("should handle SET_SORT_METHOD", () => { const action = setSortMethod("sizeRes"); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -269,7 +296,7 @@ describe("index reducer", () => { it("should handle CHANGE_CONTEXT_MENU", () => { const action1 = changeContextMenu("empty", false); - expect(cloudreveApp(initState, action1)).toEqual({ + expect(cloudreveApp()(initState, action1)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -278,7 +305,7 @@ describe("index reducer", () => { }, }); const action2 = changeContextMenu("aa", true); - expect(cloudreveApp(initState, action2)).toEqual({ + expect(cloudreveApp()(initState, action2)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -290,7 +317,7 @@ describe("index reducer", () => { it("should handle DRAG_AND_DROP", () => { const action = dragAndDrop("source", "target"); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, explorer: { ...initState.explorer, @@ -303,7 +330,7 @@ describe("index reducer", () => { it("should handle SET_NAVIGATOR_LOADING_STATUE", () => { const action = setNavigatorLoadingStatus(true); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -314,7 +341,7 @@ describe("index reducer", () => { it("should handle SET_NAVIGATOR_ERROR", () => { const action = setNavigatorError(true, "Error Message"); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -493,7 +520,7 @@ describe("index reducer", () => { }, ]); expect( - cloudreveApp( + cloudreveApp()( { ...initState, explorer: { @@ -533,7 +560,7 @@ describe("index reducer", () => { }, ]); expect( - cloudreveApp( + cloudreveApp()( { ...initState, explorer: { @@ -572,7 +599,7 @@ describe("index reducer", () => { ]; const action = addSelectedTargets(newSelect); expect( - cloudreveApp( + cloudreveApp()( { ...initState, explorer: { @@ -607,7 +634,7 @@ describe("index reducer", () => { ]; const action = setSelectedTarget(newSelect); expect( - cloudreveApp( + cloudreveApp()( { ...initState, explorer: { @@ -635,7 +662,7 @@ describe("index reducer", () => { const remove = ["1"]; const action = removeSelectedTargets(remove); expect( - cloudreveApp( + cloudreveApp()( { ...initState, explorer: { @@ -692,7 +719,7 @@ describe("index reducer", () => { }, }; const action = setNavigator("/newpath", true); - expect(cloudreveApp(navState, action)).toEqual({ + expect(cloudreveApp()(navState, action)).toEqual({ ...initState, navigator: { ...initState.navigator, @@ -746,8 +773,8 @@ describe("index reducer", () => { }, }, }; - expect(cloudreveApp(initState, action)).toEqual(darkState); - expect(cloudreveApp(darkState, action)).toEqual(lightState); + expect(cloudreveApp()(initState, action)).toEqual(darkState); + expect(cloudreveApp()(darkState, action)).toEqual(lightState); }); it("should handle APPLY_THEME", () => { @@ -759,7 +786,7 @@ describe("index reducer", () => { themes: JSON.stringify({ foo: "bar" }), }, }; - expect(cloudreveApp(stateWithThemes, action)).toEqual({ + expect(cloudreveApp()(stateWithThemes, action)).toEqual({ ...stateWithThemes, siteConfig: { ...stateWithThemes.siteConfig, @@ -770,7 +797,7 @@ describe("index reducer", () => { it("should handle OPEN_CREATE_FOLDER_DIALOG", () => { const action = openCreateFolderDialog(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -785,7 +812,7 @@ describe("index reducer", () => { it("should handle OPEN_RENAME_DIALOG", () => { const action = openRenameDialog(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -800,7 +827,7 @@ describe("index reducer", () => { it("should handle OPEN_REMOVE_DIALOG", () => { const action = openRemoveDialog(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -815,7 +842,7 @@ describe("index reducer", () => { it("should handle OPEN_MOVE_DIALOG", () => { const action = openMoveDialog(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -830,7 +857,7 @@ describe("index reducer", () => { it("should handle OPEN_RESAVE_DIALOG", () => { const action = openResaveDialog(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -846,7 +873,7 @@ describe("index reducer", () => { it("should handle SET_USER_POPOVER", () => { // TODO: update to real anchor const action = setUserPopover("anchor"); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -858,7 +885,7 @@ describe("index reducer", () => { it("should handle SET_SHARE_USER_POPOVER", () => { // TODO: update to real anchor const action = setShareUserPopover("anchor"); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -870,7 +897,7 @@ describe("index reducer", () => { it("should handle OPEN_SHARE_DIALOG", () => { // TODO: update to real anchor const action = openShareDialog(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -886,7 +913,7 @@ describe("index reducer", () => { it("should handle SET_SITE_CONFIG", () => { // TODO: update to real anchor const action = setSiteConfig({ foo: "bar" }); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, siteConfig: { foo: "bar", @@ -897,7 +924,7 @@ describe("index reducer", () => { it("should handle SET_SITE_CONFIG", () => { // TODO: update to real anchor const action = setSiteConfig({ foo: "bar" }); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, siteConfig: { foo: "bar", @@ -907,7 +934,7 @@ describe("index reducer", () => { it("should handle OPEN_MUSIC_DIALOG", () => { const action = openMusicDialog(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -922,7 +949,7 @@ describe("index reducer", () => { it("should handle OPEN_REMOTE_DOWNLOAD_DIALOG", () => { const action = openRemoteDownloadDialog(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -937,7 +964,7 @@ describe("index reducer", () => { it("should handle OPEN_TORRENT_DOWNLOAD_DIALOG", () => { const action = openTorrentDownloadDialog(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -952,7 +979,7 @@ describe("index reducer", () => { it("should handle OPEN_DECOMPRESS_DIALOG", () => { const action = openDecompressDialog(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -967,7 +994,7 @@ describe("index reducer", () => { it("should handle OPEN_COMPRESS_DIALOG", () => { const action = openCompressDialog(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -982,7 +1009,7 @@ describe("index reducer", () => { it("should handle OPEN_GET_SOURCE_DIALOG", () => { const action = openGetSourceDialog(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -997,7 +1024,7 @@ describe("index reducer", () => { it("should handle OPEN_COPY_DIALOG", () => { const action = openCopyDialog(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -1012,7 +1039,7 @@ describe("index reducer", () => { it("should handle OPEN_LOADING_DIALOG", () => { const action = openLoadingDialog("loading"); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -1028,7 +1055,7 @@ describe("index reducer", () => { it("should handle CLOSE_ALL_MODALS", () => { const action = closeAllModals(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -1054,6 +1081,7 @@ describe("index reducer", () => { }); it("should handle CHANGE_SUB_TITLE", async () => { + initState.siteConfig.title = 'Cloudreve'; const store = mockStore(initState); const action = changeSubTitle("test sub title"); await store.dispatch(action); @@ -1063,7 +1091,7 @@ describe("index reducer", () => { it("should handle SET_SUBTITLE", () => { const action = setSubtitle("test sub title 2"); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -1079,7 +1107,7 @@ describe("index reducer", () => { "something wrong", "error" ); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -1096,7 +1124,7 @@ describe("index reducer", () => { it("should handle SET_MODALS_LOADING", () => { const action = setModalsLoading("test loading status"); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -1107,7 +1135,7 @@ describe("index reducer", () => { it("should handle SET_SESSION_STATUS", () => { const action = setSessionStatus(true); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -1118,7 +1146,7 @@ describe("index reducer", () => { it("should handle ENABLE_LOAD_UPLOADER", () => { const action = enableLoadUploader(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -1129,7 +1157,7 @@ describe("index reducer", () => { it("should handle REFRESH_FILE_LIST", () => { const action = refreshFileList(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, navigator: { ...initState.navigator, @@ -1149,11 +1177,11 @@ describe("index reducer", () => { it("should handle SEARCH_MY_FILE", () => { const action = searchMyFile("keyword"); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, navigator: { ...initState.navigator, - path: "/搜索结果", + path: '', refresh: true, }, viewUpdate: { @@ -1184,7 +1212,7 @@ describe("index reducer", () => { fileList: [{ type: "file" }, { type: "dir" }], }, }; - expect(cloudreveApp(showImgState, action)).toEqual({ + expect(cloudreveApp()(showImgState, action)).toEqual({ ...showImgState, explorer: { ...showImgState.explorer, @@ -1200,7 +1228,7 @@ describe("index reducer", () => { it("should handle REFRESH_STORAGE", () => { const action = refreshStorage(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, viewUpdate: { ...initState.viewUpdate, @@ -1211,7 +1239,7 @@ describe("index reducer", () => { it("should handle SAVE_FILE", () => { const action = saveFile(); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, explorer: { ...initState.explorer, @@ -1222,7 +1250,7 @@ describe("index reducer", () => { it("should handle SET_LAST_SELECT", () => { const action = setLastSelect({ type: "file" }, 1); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, explorer: { ...initState.explorer, @@ -1236,7 +1264,7 @@ describe("index reducer", () => { it("should handle SET_SHIFT_SELECTED_IDS", () => { const action = setShiftSelectedIds(["1", "2"]); - expect(cloudreveApp(initState, action)).toEqual({ + expect(cloudreveApp()(initState, action)).toEqual({ ...initState, explorer: { ...initState.explorer, diff --git a/yarn.lock b/yarn.lock index ff6fb225..9305f42e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,17 +9,17 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" - integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.15.8", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.15.8.tgz#45990c47adadb00c03677baa89221f7cc23d2503" + integrity sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg== dependencies: - "@babel/highlight" "^7.12.13" + "@babel/highlight" "^7.14.5" -"@babel/compat-data@^7.13.0", "@babel/compat-data@^7.13.8", "@babel/compat-data@^7.9.0": - version "7.13.11" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.11.tgz#9c8fe523c206979c9a81b1e12fe50c1254f1aa35" - integrity sha512-BwKEkO+2a67DcFeS3RLl0Z3Gs2OvdXewuWjc1Hfokhb5eQWP9YRYH1/+VrVZvql2CfjOiNGqSAFOYt4lsqTHzg== +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.15.0", "@babel/compat-data@^7.9.0": + version "7.15.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" + integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== "@babel/core@7.6.0": version "7.6.0" @@ -64,84 +64,84 @@ source-map "^0.5.0" "@babel/core@^7.1.0", "@babel/core@^7.4.5": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.10.tgz#07de050bbd8193fcd8a3c27918c0890613a94559" - integrity sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.9" - "@babel/helper-compilation-targets" "^7.13.10" - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helpers" "^7.13.10" - "@babel/parser" "^7.13.10" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.8.tgz#195b9f2bffe995d2c6c159e72fe525b4114e8c10" + integrity sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og== + dependencies: + "@babel/code-frame" "^7.15.8" + "@babel/generator" "^7.15.8" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.8" + "@babel/helpers" "^7.15.4" + "@babel/parser" "^7.15.8" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.6" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.1.2" - lodash "^4.17.19" semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.13.0", "@babel/generator@^7.13.9", "@babel/generator@^7.4.0", "@babel/generator@^7.6.0", "@babel/generator@^7.9.0": - version "7.13.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39" - integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw== +"@babel/generator@^7.15.4", "@babel/generator@^7.15.8", "@babel/generator@^7.4.0", "@babel/generator@^7.6.0", "@babel/generator@^7.9.0": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.8.tgz#fa56be6b596952ceb231048cf84ee499a19c0cd1" + integrity sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g== dependencies: - "@babel/types" "^7.13.0" + "@babel/types" "^7.15.6" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.10.4", "@babel/helper-annotate-as-pure@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" - integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== +"@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835" + integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.15.4" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" - integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz#21ad815f609b84ee0e3058676c33cf6d1670525f" + integrity sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q== dependencies: - "@babel/helper-explode-assignable-expression" "^7.12.13" - "@babel/types" "^7.12.13" + "@babel/helper-explode-assignable-expression" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.13.10", "@babel/helper-compilation-targets@^7.13.8", "@babel/helper-compilation-targets@^7.8.7": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz#1310a1678cb8427c07a753750da4f8ce442bdd0c" - integrity sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.15.4", "@babel/helper-compilation-targets@^7.8.7": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9" + integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ== dependencies: - "@babel/compat-data" "^7.13.8" - "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.14.5" + "@babel/compat-data" "^7.15.0" + "@babel/helper-validator-option" "^7.14.5" + browserslist "^4.16.6" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.13.0", "@babel/helper-create-class-features-plugin@^7.8.3": - version "7.13.11" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz#30d30a005bca2c953f5653fc25091a492177f4f6" - integrity sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw== +"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4", "@babel/helper-create-class-features-plugin@^7.8.3": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e" + integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-member-expression-to-functions" "^7.13.0" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-replace-supers" "^7.13.0" - "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" -"@babel/helper-create-regexp-features-plugin@^7.12.13": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz#a2ac87e9e319269ac655b8d4415e94d38d663cb7" - integrity sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg== +"@babel/helper-create-regexp-features-plugin@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4" + integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-annotate-as-pure" "^7.14.5" regexpu-core "^4.7.1" -"@babel/helper-define-polyfill-provider@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e" - integrity sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg== +"@babel/helper-define-polyfill-provider@^0.2.2": + version "0.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6" + integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew== dependencies: "@babel/helper-compilation-targets" "^7.13.0" "@babel/helper-module-imports" "^7.12.13" @@ -152,168 +152,175 @@ resolve "^1.14.2" semver "^6.1.2" -"@babel/helper-explode-assignable-expression@^7.12.13": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz#17b5c59ff473d9f956f40ef570cf3a76ca12657f" - integrity sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA== - dependencies: - "@babel/types" "^7.13.0" - -"@babel/helper-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" - integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== - dependencies: - "@babel/helper-get-function-arity" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/helper-get-function-arity@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" - integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-hoist-variables@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz#5d5882e855b5c5eda91e0cadc26c6e7a2c8593d8" - integrity sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g== - dependencies: - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" - -"@babel/helper-member-expression-to-functions@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz#6aa4bb678e0f8c22f58cdb79451d30494461b091" - integrity sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ== - dependencies: - "@babel/types" "^7.13.0" - -"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" - integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.9.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz#42eb4bd8eea68bab46751212c357bfed8b40f6f1" - integrity sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw== - dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-replace-supers" "^7.13.0" - "@babel/helper-simple-access" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.12.11" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" - lodash "^4.17.19" - -"@babel/helper-optimise-call-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" - integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" - integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== - -"@babel/helper-remap-async-to-generator@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz#376a760d9f7b4b2077a9dd05aa9c3927cadb2209" - integrity sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-wrap-function" "^7.13.0" - "@babel/types" "^7.13.0" - -"@babel/helper-replace-supers@^7.12.13", "@babel/helper-replace-supers@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz#6034b7b51943094cb41627848cb219cb02be1d24" - integrity sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.13.0" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" - -"@babel/helper-simple-access@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" - integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-skip-transparent-expression-wrappers@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" - integrity sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA== +"@babel/helper-explode-assignable-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz#f9aec9d219f271eaf92b9f561598ca6b2682600c" + integrity sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g== dependencies: - "@babel/types" "^7.12.1" - -"@babel/helper-split-export-declaration@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" - integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== + "@babel/types" "^7.15.4" + +"@babel/helper-function-name@^7.14.5", "@babel/helper-function-name@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc" + integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw== dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== + "@babel/helper-get-function-arity" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/types" "^7.15.4" -"@babel/helper-validator-option@^7.12.17": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" - integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== - -"@babel/helper-wrap-function@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz#bdb5c66fda8526ec235ab894ad53a1235c79fcc4" - integrity sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA== +"@babel/helper-get-function-arity@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b" + integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/types" "^7.15.4" + +"@babel/helper-hoist-variables@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df" + integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA== + dependencies: + "@babel/types" "^7.15.4" -"@babel/helpers@^7.13.10", "@babel/helpers@^7.6.0", "@babel/helpers@^7.9.0": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.10.tgz#fd8e2ba7488533cdeac45cc158e9ebca5e3c7df8" - integrity sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ== - dependencies: - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" - integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== - dependencies: - "@babel/helper-validator-identifier" "^7.12.11" +"@babel/helper-member-expression-to-functions@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef" + integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.15.4", "@babel/helper-module-imports@^7.8.3": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f" + integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.4", "@babel/helper-module-transforms@^7.15.8", "@babel/helper-module-transforms@^7.9.0": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz#d8c0e75a87a52e374a8f25f855174786a09498b2" + integrity sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg== + dependencies: + "@babel/helper-module-imports" "^7.15.4" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-simple-access" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/helper-validator-identifier" "^7.15.7" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.6" + +"@babel/helper-optimise-call-expression@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171" + integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" + integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== + +"@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f" + integrity sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-wrap-function" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a" + integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helper-simple-access@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b" + integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-skip-transparent-expression-wrappers@^7.14.5", "@babel/helper-skip-transparent-expression-wrappers@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb" + integrity sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-split-export-declaration@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257" + integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw== + dependencies: + "@babel/types" "^7.15.4" + +"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9", "@babel/helper-validator-identifier@^7.15.7": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/helper-validator-option@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" + integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== + +"@babel/helper-wrap-function@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7" + integrity sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw== + dependencies: + "@babel/helper-function-name" "^7.15.4" + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/helpers@^7.15.4", "@babel/helpers@^7.6.0", "@babel/helpers@^7.9.0": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43" + integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ== + dependencies: + "@babel/template" "^7.15.4" + "@babel/traverse" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.13.0", "@babel/parser@^7.13.10", "@babel/parser@^7.4.3", "@babel/parser@^7.6.0", "@babel/parser@^7.9.0": - version "7.13.11" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.11.tgz#f93ebfc99d21c1772afbbaa153f47e7ce2f50b88" - integrity sha512-PhuoqeHoO9fc4ffMEVk4qb/w/s2iOSWohvbHxLtxui0eBg3Lg5gN1U8wp1V1u61hOWkPQJJyJzGH6Y+grwkq8Q== +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.15.4", "@babel/parser@^7.15.8", "@babel/parser@^7.4.3", "@babel/parser@^7.6.0", "@babel/parser@^7.9.0": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.8.tgz#7bacdcbe71bdc3ff936d510c15dcea7cf0b99016" + integrity sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA== -"@babel/plugin-proposal-async-generator-functions@^7.13.8", "@babel/plugin-proposal-async-generator-functions@^7.8.3": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz#87aacb574b3bc4b5603f6fe41458d72a5a2ec4b1" - integrity sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e" + integrity sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + +"@babel/plugin-proposal-async-generator-functions@^7.15.8", "@babel/plugin-proposal-async-generator-functions@^7.8.3": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz#a3100f785fab4357987c4223ab1b02b599048403" + integrity sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.15.4" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-proposal-class-properties@7.8.3": @@ -324,13 +331,22 @@ "@babel/helper-create-class-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-proposal-class-properties@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz#146376000b94efd001e57a40a88a525afaab9f37" - integrity sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg== +"@babel/plugin-proposal-class-properties@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e" + integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-proposal-class-static-block@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz#3e7ca6128453c089e8b477a99f970c63fc1cb8d7" + integrity sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-proposal-decorators@7.8.3": version "7.8.3" @@ -341,36 +357,36 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-decorators" "^7.8.3" -"@babel/plugin-proposal-dynamic-import@^7.13.8", "@babel/plugin-proposal-dynamic-import@^7.8.3": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz#876a1f6966e1dec332e8c9451afda3bebcdf2e1d" - integrity sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ== +"@babel/plugin-proposal-dynamic-import@^7.14.5", "@babel/plugin-proposal-dynamic-import@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c" + integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-proposal-export-namespace-from@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" - integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== +"@babel/plugin-proposal-export-namespace-from@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76" + integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.13.8", "@babel/plugin-proposal-json-strings@^7.8.3": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz#bf1fb362547075afda3634ed31571c5901afef7b" - integrity sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q== +"@babel/plugin-proposal-json-strings@^7.14.5", "@babel/plugin-proposal-json-strings@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb" + integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-proposal-logical-assignment-operators@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz#93fa78d63857c40ce3c8c3315220fd00bfbb4e1a" - integrity sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A== +"@babel/plugin-proposal-logical-assignment-operators@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738" + integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-proposal-nullish-coalescing-operator@7.8.3": @@ -381,12 +397,12 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz#3730a31dafd3c10d8ccd10648ed80a2ac5472ef3" - integrity sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" + integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-proposal-numeric-separator@7.8.3": @@ -397,31 +413,31 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-numeric-separator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.12.13", "@babel/plugin-proposal-numeric-separator@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" - integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== +"@babel/plugin-proposal-numeric-separator@^7.14.5", "@babel/plugin-proposal-numeric-separator@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18" + integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.13.8", "@babel/plugin-proposal-object-rest-spread@^7.9.0": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz#5d210a4d727d6ce3b18f9de82cc99a3964eed60a" - integrity sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g== +"@babel/plugin-proposal-object-rest-spread@^7.15.6", "@babel/plugin-proposal-object-rest-spread@^7.9.0": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11" + integrity sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg== dependencies: - "@babel/compat-data" "^7.13.8" - "@babel/helper-compilation-targets" "^7.13.8" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/compat-data" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.13.0" + "@babel/plugin-transform-parameters" "^7.15.4" -"@babel/plugin-proposal-optional-catch-binding@^7.13.8", "@babel/plugin-proposal-optional-catch-binding@^7.8.3": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz#3ad6bd5901506ea996fc31bdcf3ccfa2bed71107" - integrity sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA== +"@babel/plugin-proposal-optional-catch-binding@^7.14.5", "@babel/plugin-proposal-optional-catch-binding@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c" + integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-proposal-optional-chaining@7.9.0": @@ -432,30 +448,40 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.13.8", "@babel/plugin-proposal-optional-chaining@^7.9.0": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.8.tgz#e39df93efe7e7e621841babc197982e140e90756" - integrity sha512-hpbBwbTgd7Cz1QryvwJZRo1U0k1q8uyBmeXOSQUjdg/A2TASkhR/rz7AyqZ/kS8kbpsNA80rOYbxySBJAqmhhQ== +"@babel/plugin-proposal-optional-chaining@^7.14.5", "@babel/plugin-proposal-optional-chaining@^7.9.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" + integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-private-methods@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz#04bd4c6d40f6e6bbfa2f57e2d8094bad900ef787" - integrity sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q== +"@babel/plugin-proposal-private-methods@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d" + integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-create-class-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" - integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== +"@babel/plugin-proposal-private-property-in-object@^7.15.4": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz#55c5e3b4d0261fd44fe637e3f624cfb0f484e3e5" + integrity sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4", "@babel/plugin-proposal-unicode-property-regex@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8" + integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -471,12 +497,19 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-decorators@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" - integrity sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA== + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz#eafb9c0cbe09c8afeb964ba3a7bbd63945a72f20" + integrity sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" @@ -493,11 +526,11 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-flow@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.12.13.tgz#5df9962503c0a9c918381c929d51d4d6949e7e86" - integrity sha512-J/RYxnlSLXZLVR7wTRsozxKT8qbsx1mNKJzXEEjQ0Kjx1ZACcyHgbanNWNCFtc36IzuWhYWPpvJFFoexoOWFmA== + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.14.5.tgz#2ff654999497d7d7d142493260005263731da180" + integrity sha512-9WK5ZwKCdWHxVuU13XNT6X73FGmutAXeor5lGFq6qhOFtMFUF4jkbijuyUdZZlpYq6E2hZeZf/u3959X9wsv0Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-json-strings@^7.8.0", "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" @@ -506,12 +539,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz#044fb81ebad6698fe62c478875575bcbb9b70f15" - integrity sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g== +"@babel/plugin-syntax-jsx@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201" + integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" @@ -555,99 +588,106 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.12.13", "@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" - integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" - integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w== +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-arrow-functions@^7.13.0", "@babel/plugin-transform-arrow-functions@^7.8.3": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz#10a59bebad52d637a027afa692e8d5ceff5e3dae" - integrity sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg== +"@babel/plugin-syntax-typescript@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" + integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-async-to-generator@^7.13.0", "@babel/plugin-transform-async-to-generator@^7.8.3": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz#8e112bf6771b82bf1e974e5e26806c5c99aa516f" - integrity sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg== +"@babel/plugin-transform-arrow-functions@^7.14.5", "@babel/plugin-transform-arrow-functions@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a" + integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A== dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-remap-async-to-generator" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-block-scoped-functions@^7.12.13", "@babel/plugin-transform-block-scoped-functions@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" - integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== +"@babel/plugin-transform-async-to-generator@^7.14.5", "@babel/plugin-transform-async-to-generator@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67" + integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-remap-async-to-generator" "^7.14.5" -"@babel/plugin-transform-block-scoping@^7.12.13", "@babel/plugin-transform-block-scoping@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" - integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== +"@babel/plugin-transform-block-scoped-functions@^7.14.5", "@babel/plugin-transform-block-scoped-functions@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4" + integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-classes@^7.13.0", "@babel/plugin-transform-classes@^7.9.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz#0265155075c42918bf4d3a4053134176ad9b533b" - integrity sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g== +"@babel/plugin-transform-block-scoping@^7.15.3", "@babel/plugin-transform-block-scoping@^7.8.3": + version "7.15.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf" + integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-replace-supers" "^7.13.0" - "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-transform-classes@^7.15.4", "@babel/plugin-transform-classes@^7.9.0": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz#50aee17aaf7f332ae44e3bce4c2e10534d5d3bf1" + integrity sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-optimise-call-expression" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.13.0", "@babel/plugin-transform-computed-properties@^7.8.3": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz#845c6e8b9bb55376b1fa0b92ef0bdc8ea06644ed" - integrity sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg== +"@babel/plugin-transform-computed-properties@^7.14.5", "@babel/plugin-transform-computed-properties@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f" + integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-destructuring@^7.13.0", "@babel/plugin-transform-destructuring@^7.8.3": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz#c5dce270014d4e1ebb1d806116694c12b7028963" - integrity sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA== +"@babel/plugin-transform-destructuring@^7.14.7", "@babel/plugin-transform-destructuring@^7.8.3": + version "7.14.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576" + integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" - integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== +"@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4", "@babel/plugin-transform-dotall-regex@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a" + integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-duplicate-keys@^7.12.13", "@babel/plugin-transform-duplicate-keys@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" - integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== +"@babel/plugin-transform-duplicate-keys@^7.14.5", "@babel/plugin-transform-duplicate-keys@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954" + integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-exponentiation-operator@^7.12.13", "@babel/plugin-transform-exponentiation-operator@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" - integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== +"@babel/plugin-transform-exponentiation-operator@^7.14.5", "@babel/plugin-transform-exponentiation-operator@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493" + integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-flow-strip-types@7.9.0": version "7.9.0" @@ -657,115 +697,115 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-flow" "^7.8.3" -"@babel/plugin-transform-for-of@^7.13.0", "@babel/plugin-transform-for-of@^7.9.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz#c799f881a8091ac26b54867a845c3e97d2696062" - integrity sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg== +"@babel/plugin-transform-for-of@^7.15.4", "@babel/plugin-transform-for-of@^7.9.0": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz#25c62cce2718cfb29715f416e75d5263fb36a8c2" + integrity sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-function-name@^7.12.13", "@babel/plugin-transform-function-name@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" - integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== +"@babel/plugin-transform-function-name@^7.14.5", "@babel/plugin-transform-function-name@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2" + integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ== dependencies: - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-function-name" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-literals@^7.12.13", "@babel/plugin-transform-literals@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" - integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== +"@babel/plugin-transform-literals@^7.14.5", "@babel/plugin-transform-literals@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78" + integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-member-expression-literals@^7.12.13", "@babel/plugin-transform-member-expression-literals@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" - integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== +"@babel/plugin-transform-member-expression-literals@^7.14.5", "@babel/plugin-transform-member-expression-literals@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7" + integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-modules-amd@^7.13.0", "@babel/plugin-transform-modules-amd@^7.9.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3" - integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ== +"@babel/plugin-transform-modules-amd@^7.14.5", "@babel/plugin-transform-modules-amd@^7.9.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" + integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== dependencies: - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.9.0": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz#7b01ad7c2dcf2275b06fa1781e00d13d420b3e1b" - integrity sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw== +"@babel/plugin-transform-modules-commonjs@^7.15.4", "@babel/plugin-transform-modules-commonjs@^7.9.0": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz#8201101240eabb5a76c08ef61b2954f767b6b4c1" + integrity sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA== dependencies: - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-simple-access" "^7.15.4" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.13.8", "@babel/plugin-transform-modules-systemjs@^7.9.0": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz#6d066ee2bff3c7b3d60bf28dec169ad993831ae3" - integrity sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A== +"@babel/plugin-transform-modules-systemjs@^7.15.4", "@babel/plugin-transform-modules-systemjs@^7.9.0": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz#b42890c7349a78c827719f1d2d0cd38c7d268132" + integrity sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw== dependencies: - "@babel/helper-hoist-variables" "^7.13.0" - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-module-transforms" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-identifier" "^7.14.9" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.13.0", "@babel/plugin-transform-modules-umd@^7.9.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz#8a3d96a97d199705b9fd021580082af81c06e70b" - integrity sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw== +"@babel/plugin-transform-modules-umd@^7.14.5", "@babel/plugin-transform-modules-umd@^7.9.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0" + integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA== dependencies: - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-module-transforms" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13", "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" - integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== +"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9", "@babel/plugin-transform-named-capturing-groups-regex@^7.8.3": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2" + integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-create-regexp-features-plugin" "^7.14.5" -"@babel/plugin-transform-new-target@^7.12.13", "@babel/plugin-transform-new-target@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" - integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== +"@babel/plugin-transform-new-target@^7.14.5", "@babel/plugin-transform-new-target@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8" + integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-object-super@^7.12.13", "@babel/plugin-transform-object-super@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" - integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== +"@babel/plugin-transform-object-super@^7.14.5", "@babel/plugin-transform-object-super@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45" + integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-replace-supers" "^7.14.5" -"@babel/plugin-transform-parameters@^7.13.0", "@babel/plugin-transform-parameters@^7.8.7": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz#8fa7603e3097f9c0b7ca1a4821bc2fb52e9e5007" - integrity sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw== +"@babel/plugin-transform-parameters@^7.15.4", "@babel/plugin-transform-parameters@^7.8.7": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62" + integrity sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-property-literals@^7.12.13", "@babel/plugin-transform-property-literals@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" - integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== +"@babel/plugin-transform-property-literals@^7.14.5", "@babel/plugin-transform-property-literals@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34" + integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-react-constant-elements@^7.0.0": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.10.tgz#5d3de8a8ee53f4612e728f4f17b8c9125f8019e5" - integrity sha512-E+aCW9j7mLq01tOuGV08YzLBt+vSyr4bOPT75B6WrAlrUfmOYOZ/yWk847EH0dv0xXiCihWLEmlX//O30YhpIw== + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz#41790d856f7c5cec82d2bcf5d0e5064d682522ed" + integrity sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-react-display-name@7.8.3": version "7.8.3" @@ -774,66 +814,66 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-react-display-name@^7.12.13", "@babel/plugin-transform-react-display-name@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz#c28effd771b276f4647411c9733dbb2d2da954bd" - integrity sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA== +"@babel/plugin-transform-react-display-name@^7.14.5", "@babel/plugin-transform-react-display-name@^7.8.3": + version "7.15.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz#6aaac6099f1fcf6589d35ae6be1b6e10c8c602b9" + integrity sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-react-jsx-development@^7.12.12", "@babel/plugin-transform-react-jsx-development@^7.9.0": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz#f510c0fa7cd7234153539f9a362ced41a5ca1447" - integrity sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ== +"@babel/plugin-transform-react-jsx-development@^7.14.5", "@babel/plugin-transform-react-jsx-development@^7.9.0": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz#1a6c73e2f7ed2c42eebc3d2ad60b0c7494fcb9af" + integrity sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ== dependencies: - "@babel/plugin-transform-react-jsx" "^7.12.17" + "@babel/plugin-transform-react-jsx" "^7.14.5" "@babel/plugin-transform-react-jsx-self@^7.9.0": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.12.13.tgz#422d99d122d592acab9c35ea22a6cfd9bf189f60" - integrity sha512-FXYw98TTJ125GVCCkFLZXlZ1qGcsYqNQhVBQcZjyrwf8FEUtVfKIoidnO8S0q+KBQpDYNTmiGo1gn67Vti04lQ== + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.14.9.tgz#33041e665453391eb6ee54a2ecf3ba1d46bd30f4" + integrity sha512-Fqqu0f8zv9W+RyOnx29BX/RlEsBRANbOf5xs5oxb2aHP4FKbLXxIaVPUiCti56LAR1IixMH4EyaixhUsKqoBHw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-react-jsx-source@^7.9.0": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.12.13.tgz#051d76126bee5c9a6aa3ba37be2f6c1698856bcb" - integrity sha512-O5JJi6fyfih0WfDgIJXksSPhGP/G0fQpfxYy87sDc+1sFmsCS6wr3aAn+whbzkhbjtq4VMqLRaSzR6IsshIC0Q== + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.14.5.tgz#79f728e60e6dbd31a2b860b0bf6c9765918acf1d" + integrity sha512-1TpSDnD9XR/rQ2tzunBVPThF5poaYT9GqP+of8fAtguYuI/dm2RkrMBDemsxtY0XBzvW7nXjYM0hRyKX9QYj7Q== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-react-jsx@^7.12.13", "@babel/plugin-transform-react-jsx@^7.12.17", "@babel/plugin-transform-react-jsx@^7.9.1": - version "7.12.17" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.17.tgz#dd2c1299f5e26de584939892de3cfc1807a38f24" - integrity sha512-mwaVNcXV+l6qJOuRhpdTEj8sT/Z0owAVWf9QujTZ0d2ye9X/K+MTOTSizcgKOj18PGnTc/7g1I4+cIUjsKhBcw== +"@babel/plugin-transform-react-jsx@^7.14.5", "@babel/plugin-transform-react-jsx@^7.9.1": + version "7.14.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz#3314b2163033abac5200a869c4de242cd50a914c" + integrity sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw== dependencies: - "@babel/helper-annotate-as-pure" "^7.12.13" - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-syntax-jsx" "^7.12.13" - "@babel/types" "^7.12.17" + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-module-imports" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-jsx" "^7.14.5" + "@babel/types" "^7.14.9" -"@babel/plugin-transform-react-pure-annotations@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz#05d46f0ab4d1339ac59adf20a1462c91b37a1a42" - integrity sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg== +"@babel/plugin-transform-react-pure-annotations@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz#18de612b84021e3a9802cbc212c9d9f46d0d11fc" + integrity sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-regenerator@^7.12.13", "@babel/plugin-transform-regenerator@^7.8.7": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz#b628bcc9c85260ac1aeb05b45bde25210194a2f5" - integrity sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA== +"@babel/plugin-transform-regenerator@^7.14.5", "@babel/plugin-transform-regenerator@^7.8.7": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f" + integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.12.13", "@babel/plugin-transform-reserved-words@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" - integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== +"@babel/plugin-transform-reserved-words@^7.14.5", "@babel/plugin-transform-reserved-words@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304" + integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-runtime@7.9.0": version "7.9.0" @@ -845,65 +885,65 @@ resolve "^1.8.1" semver "^5.5.1" -"@babel/plugin-transform-shorthand-properties@^7.12.13", "@babel/plugin-transform-shorthand-properties@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" - integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== +"@babel/plugin-transform-shorthand-properties@^7.14.5", "@babel/plugin-transform-shorthand-properties@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58" + integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-spread@^7.13.0", "@babel/plugin-transform-spread@^7.8.3": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz#84887710e273c1815ace7ae459f6f42a5d31d5fd" - integrity sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg== +"@babel/plugin-transform-spread@^7.15.8", "@babel/plugin-transform-spread@^7.8.3": + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz#79d5aa27f68d700449b2da07691dfa32d2f6d468" + integrity sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4" -"@babel/plugin-transform-sticky-regex@^7.12.13", "@babel/plugin-transform-sticky-regex@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" - integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== +"@babel/plugin-transform-sticky-regex@^7.14.5", "@babel/plugin-transform-sticky-regex@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9" + integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-template-literals@^7.13.0", "@babel/plugin-transform-template-literals@^7.8.3": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz#a36049127977ad94438dee7443598d1cefdf409d" - integrity sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw== +"@babel/plugin-transform-template-literals@^7.14.5", "@babel/plugin-transform-template-literals@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93" + integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg== dependencies: - "@babel/helper-plugin-utils" "^7.13.0" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-typeof-symbol@^7.12.13", "@babel/plugin-transform-typeof-symbol@^7.8.4": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" - integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== +"@babel/plugin-transform-typeof-symbol@^7.14.5", "@babel/plugin-transform-typeof-symbol@^7.8.4": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4" + integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-transform-typescript@^7.9.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz#4a498e1f3600342d2a9e61f60131018f55774853" - integrity sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ== + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.8.tgz#ff0e6a47de9b2d58652123ab5a879b2ff20665d8" + integrity sha512-ZXIkJpbaf6/EsmjeTbiJN/yMxWPFWvlr7sEG1P95Xb4S4IBcrf2n7s/fItIhsAmOf8oSh3VJPDppO6ExfAfKRQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.13.0" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/plugin-syntax-typescript" "^7.12.13" + "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.14.5" -"@babel/plugin-transform-unicode-escapes@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" - integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== +"@babel/plugin-transform-unicode-escapes@^7.14.5": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" + integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-unicode-regex@^7.12.13", "@babel/plugin-transform-unicode-regex@^7.8.3": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" - integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== +"@babel/plugin-transform-unicode-regex@^7.14.5", "@babel/plugin-transform-unicode-regex@^7.8.3": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e" + integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.13" - "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-create-regexp-features-plugin" "^7.14.5" + "@babel/helper-plugin-utils" "^7.14.5" "@babel/preset-env@7.9.0": version "7.9.0" @@ -972,29 +1012,33 @@ semver "^5.5.0" "@babel/preset-env@^7.4.5": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.10.tgz#b5cde31d5fe77ab2a6ab3d453b59041a1b3a5252" - integrity sha512-nOsTScuoRghRtUsRr/c69d042ysfPHcu+KOB4A9aAO9eJYqrkat+LF8G1yp1HD18QiwixT2CisZTr/0b3YZPXQ== - dependencies: - "@babel/compat-data" "^7.13.8" - "@babel/helper-compilation-targets" "^7.13.10" - "@babel/helper-plugin-utils" "^7.13.0" - "@babel/helper-validator-option" "^7.12.17" - "@babel/plugin-proposal-async-generator-functions" "^7.13.8" - "@babel/plugin-proposal-class-properties" "^7.13.0" - "@babel/plugin-proposal-dynamic-import" "^7.13.8" - "@babel/plugin-proposal-export-namespace-from" "^7.12.13" - "@babel/plugin-proposal-json-strings" "^7.13.8" - "@babel/plugin-proposal-logical-assignment-operators" "^7.13.8" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" - "@babel/plugin-proposal-numeric-separator" "^7.12.13" - "@babel/plugin-proposal-object-rest-spread" "^7.13.8" - "@babel/plugin-proposal-optional-catch-binding" "^7.13.8" - "@babel/plugin-proposal-optional-chaining" "^7.13.8" - "@babel/plugin-proposal-private-methods" "^7.13.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" + version "7.15.8" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.8.tgz#f527ce5bcb121cd199f6b502bf23e420b3ff8dba" + integrity sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA== + dependencies: + "@babel/compat-data" "^7.15.0" + "@babel/helper-compilation-targets" "^7.15.4" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.15.4" + "@babel/plugin-proposal-async-generator-functions" "^7.15.8" + "@babel/plugin-proposal-class-properties" "^7.14.5" + "@babel/plugin-proposal-class-static-block" "^7.15.4" + "@babel/plugin-proposal-dynamic-import" "^7.14.5" + "@babel/plugin-proposal-export-namespace-from" "^7.14.5" + "@babel/plugin-proposal-json-strings" "^7.14.5" + "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5" + "@babel/plugin-proposal-numeric-separator" "^7.14.5" + "@babel/plugin-proposal-object-rest-spread" "^7.15.6" + "@babel/plugin-proposal-optional-catch-binding" "^7.14.5" + "@babel/plugin-proposal-optional-chaining" "^7.14.5" + "@babel/plugin-proposal-private-methods" "^7.14.5" + "@babel/plugin-proposal-private-property-in-object" "^7.15.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.14.5" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.3" @@ -1004,45 +1048,46 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.12.13" - "@babel/plugin-transform-arrow-functions" "^7.13.0" - "@babel/plugin-transform-async-to-generator" "^7.13.0" - "@babel/plugin-transform-block-scoped-functions" "^7.12.13" - "@babel/plugin-transform-block-scoping" "^7.12.13" - "@babel/plugin-transform-classes" "^7.13.0" - "@babel/plugin-transform-computed-properties" "^7.13.0" - "@babel/plugin-transform-destructuring" "^7.13.0" - "@babel/plugin-transform-dotall-regex" "^7.12.13" - "@babel/plugin-transform-duplicate-keys" "^7.12.13" - "@babel/plugin-transform-exponentiation-operator" "^7.12.13" - "@babel/plugin-transform-for-of" "^7.13.0" - "@babel/plugin-transform-function-name" "^7.12.13" - "@babel/plugin-transform-literals" "^7.12.13" - "@babel/plugin-transform-member-expression-literals" "^7.12.13" - "@babel/plugin-transform-modules-amd" "^7.13.0" - "@babel/plugin-transform-modules-commonjs" "^7.13.8" - "@babel/plugin-transform-modules-systemjs" "^7.13.8" - "@babel/plugin-transform-modules-umd" "^7.13.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" - "@babel/plugin-transform-new-target" "^7.12.13" - "@babel/plugin-transform-object-super" "^7.12.13" - "@babel/plugin-transform-parameters" "^7.13.0" - "@babel/plugin-transform-property-literals" "^7.12.13" - "@babel/plugin-transform-regenerator" "^7.12.13" - "@babel/plugin-transform-reserved-words" "^7.12.13" - "@babel/plugin-transform-shorthand-properties" "^7.12.13" - "@babel/plugin-transform-spread" "^7.13.0" - "@babel/plugin-transform-sticky-regex" "^7.12.13" - "@babel/plugin-transform-template-literals" "^7.13.0" - "@babel/plugin-transform-typeof-symbol" "^7.12.13" - "@babel/plugin-transform-unicode-escapes" "^7.12.13" - "@babel/plugin-transform-unicode-regex" "^7.12.13" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-transform-arrow-functions" "^7.14.5" + "@babel/plugin-transform-async-to-generator" "^7.14.5" + "@babel/plugin-transform-block-scoped-functions" "^7.14.5" + "@babel/plugin-transform-block-scoping" "^7.15.3" + "@babel/plugin-transform-classes" "^7.15.4" + "@babel/plugin-transform-computed-properties" "^7.14.5" + "@babel/plugin-transform-destructuring" "^7.14.7" + "@babel/plugin-transform-dotall-regex" "^7.14.5" + "@babel/plugin-transform-duplicate-keys" "^7.14.5" + "@babel/plugin-transform-exponentiation-operator" "^7.14.5" + "@babel/plugin-transform-for-of" "^7.15.4" + "@babel/plugin-transform-function-name" "^7.14.5" + "@babel/plugin-transform-literals" "^7.14.5" + "@babel/plugin-transform-member-expression-literals" "^7.14.5" + "@babel/plugin-transform-modules-amd" "^7.14.5" + "@babel/plugin-transform-modules-commonjs" "^7.15.4" + "@babel/plugin-transform-modules-systemjs" "^7.15.4" + "@babel/plugin-transform-modules-umd" "^7.14.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9" + "@babel/plugin-transform-new-target" "^7.14.5" + "@babel/plugin-transform-object-super" "^7.14.5" + "@babel/plugin-transform-parameters" "^7.15.4" + "@babel/plugin-transform-property-literals" "^7.14.5" + "@babel/plugin-transform-regenerator" "^7.14.5" + "@babel/plugin-transform-reserved-words" "^7.14.5" + "@babel/plugin-transform-shorthand-properties" "^7.14.5" + "@babel/plugin-transform-spread" "^7.15.8" + "@babel/plugin-transform-sticky-regex" "^7.14.5" + "@babel/plugin-transform-template-literals" "^7.14.5" + "@babel/plugin-transform-typeof-symbol" "^7.14.5" + "@babel/plugin-transform-unicode-escapes" "^7.14.5" + "@babel/plugin-transform-unicode-regex" "^7.14.5" "@babel/preset-modules" "^0.1.4" - "@babel/types" "^7.13.0" - babel-plugin-polyfill-corejs2 "^0.1.4" - babel-plugin-polyfill-corejs3 "^0.1.3" - babel-plugin-polyfill-regenerator "^0.1.2" - core-js-compat "^3.9.0" + "@babel/types" "^7.15.6" + babel-plugin-polyfill-corejs2 "^0.2.2" + babel-plugin-polyfill-corejs3 "^0.2.5" + babel-plugin-polyfill-regenerator "^0.2.2" + core-js-compat "^3.16.0" semver "^6.3.0" "@babel/preset-modules@^0.1.3", "@babel/preset-modules@^0.1.4": @@ -1069,15 +1114,16 @@ "@babel/plugin-transform-react-jsx-source" "^7.9.0" "@babel/preset-react@^7.0.0": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.13.tgz#5f911b2eb24277fa686820d5bd81cad9a0602a0a" - integrity sha512-TYM0V9z6Abb6dj1K7i5NrEhA13oS5ujUYQYDfqIBXYHOc2c2VkFgc+q9kyssIyUfy4/hEwqrgSlJ/Qgv8zJLsA== + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.14.5.tgz#0fbb769513f899c2c56f3a882fa79673c2d4ab3c" + integrity sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ== dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - "@babel/plugin-transform-react-display-name" "^7.12.13" - "@babel/plugin-transform-react-jsx" "^7.12.13" - "@babel/plugin-transform-react-jsx-development" "^7.12.12" - "@babel/plugin-transform-react-pure-annotations" "^7.12.1" + "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-validator-option" "^7.14.5" + "@babel/plugin-transform-react-display-name" "^7.14.5" + "@babel/plugin-transform-react-jsx" "^7.14.5" + "@babel/plugin-transform-react-jsx-development" "^7.14.5" + "@babel/plugin-transform-react-pure-annotations" "^7.14.5" "@babel/preset-typescript@7.9.0": version "7.9.0" @@ -1094,44 +1140,43 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d" - integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.14.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.4.tgz#fd17d16bfdf878e6dd02d19753a39fa8a8d9c84a" + integrity sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw== dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.12.13", "@babel/template@^7.4.0", "@babel/template@^7.6.0", "@babel/template@^7.8.6": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" - integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.6.0", "@babel/traverse@^7.9.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz#6d95752475f86ee7ded06536de309a65fc8966cc" - integrity sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.0" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.13.0" - "@babel/types" "^7.13.0" +"@babel/template@^7.15.4", "@babel/template@^7.4.0", "@babel/template@^7.6.0", "@babel/template@^7.8.6": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194" + integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.15.4", "@babel/traverse@^7.4.3", "@babel/traverse@^7.6.0", "@babel/traverse@^7.9.0": + version "7.15.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d" + integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA== + dependencies: + "@babel/code-frame" "^7.14.5" + "@babel/generator" "^7.15.4" + "@babel/helper-function-name" "^7.15.4" + "@babel/helper-hoist-variables" "^7.15.4" + "@babel/helper-split-export-declaration" "^7.15.4" + "@babel/parser" "^7.15.4" + "@babel/types" "^7.15.4" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.12.17", "@babel/types@^7.13.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.6.0", "@babel/types@^7.9.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80" - integrity sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA== +"@babel/types@^7.0.0", "@babel/types@^7.14.9", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.6.0", "@babel/types@^7.9.0": + version "7.15.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f" + integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - lodash "^4.17.19" + "@babel/helper-validator-identifier" "^7.14.9" to-fast-properties "^2.0.0" "@cnakazawa/watch@^1.0.3": @@ -1353,14 +1398,14 @@ chalk "^3.0.0" "@material-ui/core@^4.9.0": - version "4.11.3" - resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.11.3.tgz#f22e41775b0bd075e36a7a093d43951bf7f63850" - integrity sha512-Adt40rGW6Uds+cAyk3pVgcErpzU/qxc7KBR94jFHBYretU4AtWZltYcNsbeMn9tXL86jjVL1kuGcIHsgLgFGRw== + version "4.12.3" + resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.12.3.tgz#80d665caf0f1f034e52355c5450c0e38b099d3ca" + integrity sha512-sdpgI/PL56QVsEJldwEe4FFaFTLUqN+rd7sSZiRCdx2E/C7z5yK0y/khAWVBH24tXwto7I1hCzNWfJGZIYJKnw== dependencies: "@babel/runtime" "^7.4.4" - "@material-ui/styles" "^4.11.3" - "@material-ui/system" "^4.11.3" - "@material-ui/types" "^5.1.0" + "@material-ui/styles" "^4.11.4" + "@material-ui/system" "^4.12.1" + "@material-ui/types" "5.1.0" "@material-ui/utils" "^4.11.2" "@types/react-transition-group" "^4.2.0" clsx "^1.0.4" @@ -1378,9 +1423,9 @@ "@babel/runtime" "^7.4.4" "@material-ui/lab@^4.0.0-alpha.42": - version "4.0.0-alpha.57" - resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.57.tgz#e8961bcf6449e8a8dabe84f2700daacfcafbf83a" - integrity sha512-qo/IuIQOmEKtzmRD2E4Aa6DB4A87kmY6h0uYhjUmrrgmEAgbbw9etXpWPVXuRK6AGIQCjFzV6WO2i21m1R4FCw== + version "4.0.0-alpha.60" + resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.60.tgz#5ad203aed5a8569b0f1753945a21a05efa2234d2" + integrity sha512-fadlYsPJF+0fx2lRuyqAuJj7hAS1tLDdIEEdov5jlrpb5pp4b+mRDUqQTUxi4inRZHS1bEXpU8QWUhO6xX88aA== dependencies: "@babel/runtime" "^7.4.4" "@material-ui/utils" "^4.11.2" @@ -1388,14 +1433,14 @@ prop-types "^15.7.2" react-is "^16.8.0 || ^17.0.0" -"@material-ui/styles@^4.11.3": - version "4.11.3" - resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.3.tgz#1b8d97775a4a643b53478c895e3f2a464e8916f2" - integrity sha512-HzVzCG+PpgUGMUYEJ2rTEmQYeonGh41BYfILNFb/1ueqma+p1meSdu4RX6NjxYBMhf7k+jgfHFTTz+L1SXL/Zg== +"@material-ui/styles@^4.11.4": + version "4.11.4" + resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.4.tgz#eb9dfccfcc2d208243d986457dff025497afa00d" + integrity sha512-KNTIZcnj/zprG5LW0Sao7zw+yG3O35pviHzejMdcSGCdWbiO8qzRgOYL8JAxAsWBKOKYwVZxXtHWaB5T2Kvxew== dependencies: "@babel/runtime" "^7.4.4" "@emotion/hash" "^0.8.0" - "@material-ui/types" "^5.1.0" + "@material-ui/types" "5.1.0" "@material-ui/utils" "^4.11.2" clsx "^1.0.4" csstype "^2.5.2" @@ -1410,17 +1455,17 @@ jss-plugin-vendor-prefixer "^10.5.1" prop-types "^15.7.2" -"@material-ui/system@^4.11.3": - version "4.11.3" - resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.11.3.tgz#466bc14c9986798fd325665927c963eb47cc4143" - integrity sha512-SY7otguNGol41Mu2Sg6KbBP1ZRFIbFLHGK81y4KYbsV2yIcaEPOmsCK6zwWlp+2yTV3J/VwT6oSBARtGIVdXPw== +"@material-ui/system@^4.12.1": + version "4.12.1" + resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.12.1.tgz#2dd96c243f8c0a331b2bb6d46efd7771a399707c" + integrity sha512-lUdzs4q9kEXZGhbN7BptyiS1rLNHe6kG9o8Y307HCvF4sQxbCgpL2qi+gUk+yI8a2DNk48gISEQxoxpgph0xIw== dependencies: "@babel/runtime" "^7.4.4" "@material-ui/utils" "^4.11.2" csstype "^2.5.2" prop-types "^15.7.2" -"@material-ui/types@^5.1.0": +"@material-ui/types@5.1.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== @@ -1434,25 +1479,25 @@ prop-types "^15.7.2" react-is "^16.8.0 || ^17.0.0" -"@nodelib/fs.scandir@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" - integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: - "@nodelib/fs.stat" "2.0.4" + "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" - integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" - integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: - "@nodelib/fs.scandir" "2.1.4" + "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" "@svgr/babel-plugin-add-jsx-attribute@^4.2.0": @@ -1564,9 +1609,9 @@ integrity sha512-upIS0Gt9Mc8eEpCbYMZ1K8rhNosfKUtimNcINce+zLwJF5UpM3Vv7yz3S5l/1IX+DxTa8lTkUjqynvjRXyJzsg== "@types/babel__core@^7.1.0": - version "7.1.14" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" - integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== + version "7.1.16" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.16.tgz#bc12c74b7d65e82d29876b5d0baf5c625ac58702" + integrity sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1575,62 +1620,74 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" - integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== + version "7.6.3" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.3.tgz#f456b4b2ce79137f768aa130d2423d2f0ccfaba5" + integrity sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.0" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.0.tgz#0c888dd70b3ee9eebb6e4f200e809da0076262be" - integrity sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A== + version "7.4.1" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.11.1" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.1.tgz#654f6c4f67568e24c23b367e947098c6206fa639" - integrity sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw== + version "7.14.2" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.14.2.tgz#ffcd470bbb3f8bf30481678fb5502278ca833a43" + integrity sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA== dependencies: "@babel/types" "^7.3.0" -"@types/d3-path@^1": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-1.0.9.tgz#73526b150d14cd96e701597cbf346cfd1fd4a58c" - integrity sha512-NaIeSIBiFgSC6IGUBjZWcscUJEq7vpVu7KthHN8eieTV9d9MqkSOZLH4chq1PmcKy06PNe3axLeKmRIyxJ+PZQ== +"@types/d3-color@^2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-2.0.3.tgz#8bc4589073c80e33d126345542f588056511fe82" + integrity sha512-+0EtEjBfKEDtH9Rk3u3kLOUXM5F+iZK+WvASPb0MhIZl8J8NUvGeZRwKCXl+P3HkYx5TdU4YtcibpqHkSR9n7w== + +"@types/d3-interpolate@^2.0.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-2.0.2.tgz#78eddf7278b19e48e8652603045528d46897aba0" + integrity sha512-lElyqlUfIPyWG/cD475vl6msPL4aMU7eJvx1//Q177L8mdXoVPFl1djIESF2FKnc0NyaHvQlJpWwKJYwAhUoCw== + dependencies: + "@types/d3-color" "^2" + +"@types/d3-path@^2": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-2.0.1.tgz#ca03dfa8b94d8add97ad0cd97e96e2006b4763cb" + integrity sha512-6K8LaFlztlhZO7mwsZg7ClRsdLg3FJRzIIi6SZXDWmmSJc2x8dd2VkESbLXdk3p8cuvz71f36S0y8Zv2AxqvQw== "@types/d3-scale@^3.0.0": - version "3.2.2" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-3.2.2.tgz#5e28d0b1c599328aaec6094219f10a2570be6d74" - integrity sha512-qpQe8G02tzUwt9sdWX1h8A/W0Q1+N48wMnYXVOkrzeLUkCfvzJYV9Ee3aORCS4dN4ONRLFmMvaXdziQ29XGLjQ== + version "3.3.2" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-3.3.2.tgz#18c94e90f4f1c6b1ee14a70f14bfca2bd1c61d06" + integrity sha512-gGqr7x1ost9px3FvIfUMi5XA/F/yAf4UkUDtdQhpH92XCT0Oa7zkkRzY61gPVJq+DxpHn/btouw5ohWkbBsCzQ== dependencies: - "@types/d3-time" "*" + "@types/d3-time" "^2" "@types/d3-shape@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-2.0.0.tgz#61aa065726f3c2641aedc59c3603475ab11aeb2f" - integrity sha512-NLzD02m5PiD1KLEDjLN+MtqEcFYn4ZL9+Rqc9ZwARK1cpKZXd91zBETbe6wpBB6Ia0D0VZbpmbW3+BsGPGnCpA== + version "2.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-2.1.3.tgz#35d397b9e687abaa0de82343b250b9897b8cacf3" + integrity sha512-HAhCel3wP93kh4/rq+7atLdybcESZ5bRHDEZUojClyZWsRuEMo3A52NGYJSh48SxfxEU6RZIVbZL2YFZ2OAlzQ== dependencies: - "@types/d3-path" "^1" + "@types/d3-path" "^2" -"@types/d3-time@*": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.0.0.tgz#831dd093db91f16b83ba980e194bb8e4bcef44d6" - integrity sha512-Abz8bTzy8UWDeYs9pCa3D37i29EWDjNTjemdk0ei1ApYVNqulYlGUKip/jLOpogkPSsPz/GvZCYiC7MFlEk0iQ== +"@types/d3-time@^2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.1.1.tgz#743fdc821c81f86537cbfece07093ac39b4bc342" + integrity sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg== "@types/dplayer@^1.25.0": - version "1.25.1" - resolved "https://registry.yarnpkg.com/@types/dplayer/-/dplayer-1.25.1.tgz#649162a3dce31afd8027577bb6a5f728a16acad3" - integrity sha512-dZxgqzI6rbO/gHd2ejcC3tHYSYC4Scoh+kPewV4cAI76ye9ySuLsnRoOYvVt9xy3H6Wn8UV95ayEkXFRB10bxg== + version "1.25.2" + resolved "https://registry.yarnpkg.com/@types/dplayer/-/dplayer-1.25.2.tgz#2155a9ca4daf419deaa6bba8d10d29bad6a10cb8" + integrity sha512-bkTVZkK3Vi7N7eX2FUBnqKhCjTaeRLkhvY8H6zolatbSTtjPPdxyUzhE3C29sIBYRRq1kQHSduFgCHKg5VF3Jw== "@types/eslint-visitor-keys@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== -"@types/hoist-non-react-statics@^3.3.1": +"@types/hoist-non-react-statics@^3.3.0", "@types/hoist-non-react-statics@^3.3.1": version "3.3.1" resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f" integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== @@ -1639,9 +1696,9 @@ hoist-non-react-statics "^3.3.0" "@types/invariant@^2.2.30", "@types/invariant@^2.2.32": - version "2.2.34" - resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.34.tgz#05e4f79f465c2007884374d4795452f995720bbe" - integrity sha512-lYUtmJ9BqUN688fGY1U1HZoWT1/Jrmgigx2loq4ZcJpICECm/Om3V314BxdzypO0u5PORKGMM6x0OXaljV1YFg== + version "2.2.35" + resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.35.tgz#cd3ebf581a6557452735688d8daba6cf0bd5a3be" + integrity sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg== "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.3" @@ -1672,14 +1729,14 @@ pretty-format "^25.2.1" "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" - integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/node@^14.0.1": - version "14.14.35" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.35.tgz#42c953a4e2b18ab931f72477e7012172f4ffa313" - integrity sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag== + version "14.17.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.21.tgz#6359d8cf73481e312a43886fa50afc70ce5592c6" + integrity sha512-zv8ukKci1mrILYiQOwGSV4FpkZhyxQtuFWGya2GujWg+zVAeRQ4qbaMmWp9vb9889CFA8JECH7lkwCL6Ygg8kA== "@types/parse-json@^4.0.0": version "4.0.0" @@ -1687,47 +1744,57 @@ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prop-types@*": - version "15.7.3" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" - integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== + version "15.7.4" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== "@types/q@^1.5.1": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" - integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== + version "1.5.5" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.5.tgz#75a2a8e7d8ab4b230414505d92335d1dcb53a6df" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== "@types/react-dom@^16.9.8": - version "16.9.11" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.11.tgz#752e223a1592a2c10f2668b215a0e0667f4faab1" - integrity sha512-3UuR4MoWf5spNgrG6cwsmT9DdRghcR4IDFOzNZ6+wcmacxkFykcb5ji0nNVm9ckBT4BCxvCrJJbM4+EYsEEVIg== + version "16.9.14" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.14.tgz#674b8f116645fe5266b40b525777fc6bb8eb3bcd" + integrity sha512-FIX2AVmPTGP30OUJ+0vadeIFJJ07Mh1m+U0rxfgyW34p3rTlXI+nlenvAxNn4BP36YyI9IJ/+UJ7Wu22N1pI7A== dependencies: "@types/react" "^16" +"@types/react-redux@^7.1.16": + version "7.1.19" + resolved "https://registry.yarnpkg.com/@types/react-redux/-/react-redux-7.1.19.tgz#477bd0a9b01bae6d6bf809418cdfa7d3c16d4c62" + integrity sha512-L37dSCT0aoJnCgpR8Iuginlbxoh7qhWOXiaDqEsxVMrER1CmVhFD+63NxgJeT4pkmEM28oX0NH4S4f+sXHTZjA== + dependencies: + "@types/hoist-non-react-statics" "^3.3.0" + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + redux "^4.0.0" + "@types/react-transition-group@^4.2.0": - version "4.4.1" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.1.tgz#e1a3cb278df7f47f17b5082b1b3da17170bd44b1" - integrity sha512-vIo69qKKcYoJ8wKCJjwSgCTM+z3chw3g18dkrDfVX665tMH7tmbDxEAnPdey4gTlwZz5QuHGzd+hul0OVZDqqQ== + version "4.4.3" + resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.3.tgz#b0994da0a7023d67dbb4a8910a62112bc00d5688" + integrity sha512-fUx5muOWSYP8Bw2BUQ9M9RK9+W1XBK/7FLJ8PTQpnpTEkn0ccyMffyEQvan4C3h53gHdx7KE5Qrxi/LnUGQtdg== dependencies: "@types/react" "*" "@types/react@*", "@types/react@^16", "@types/react@^16.9.35", "@types/react@^16.x": - version "16.14.5" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.5.tgz#2c39b5cadefaf4829818f9219e5e093325979f4d" - integrity sha512-YRRv9DNZhaVTVRh9Wmmit7Y0UFhEVqXqCSw3uazRWMxa2x85hWQZ5BN24i7GXZbaclaLXEcodEeIHsjBA8eAMw== + version "16.14.16" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.16.tgz#0ad1adaefbba4ccc307ddf364d071b3c81e0ce30" + integrity sha512-7waDQ0h1TkAk99S04wV0LUiiSXpT02lzrdDF4WZFqn2W0XE5ICXLBMtqXWZ688aX2dJislQ3knmZX/jH53RluQ== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" -"@types/resize-observer-browser@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.5.tgz#36d897708172ac2380cd486da7a3daf1161c1e23" - integrity sha512-8k/67Z95Goa6Lznuykxkfhq9YU3l1Qe6LNZmwde1u7802a3x8v44oq0j91DICclxatTr0rNnhXx7+VTIetSrSQ== +"@types/resize-observer-browser@^0.1.6": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@types/resize-observer-browser/-/resize-observer-browser-0.1.6.tgz#d8e6c2f830e2650dc06fe74464472ff64b54a302" + integrity sha512-61IfTac0s9jvNtBCpyo86QeaN8qqpMGHdK0uGKCCIy2dt5/Yk84VduHIdWAcmkC5QvdkPL0p5eWYgUZtHKKUVg== "@types/scheduler@*": - version "0.16.1" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" - integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== "@types/shallowequal@^1.1.1": version "1.1.1" @@ -1740,21 +1807,21 @@ integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== "@types/yargs-parser@*": - version "20.2.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" - integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== + version "20.2.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== "@types/yargs@^13.0.0": - version "13.0.11" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.11.tgz#def2f0c93e4bdf2c61d7e34899b17e34be28d3b1" - integrity sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ== + version "13.0.12" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" + integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ== dependencies: "@types/yargs-parser" "*" "@types/yargs@^15.0.0": - version "15.0.13" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc" - integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ== + version "15.0.14" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" + integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== dependencies: "@types/yargs-parser" "*" @@ -1979,9 +2046,9 @@ acorn-globals@^4.1.0, acorn-globals@^4.3.0: acorn-walk "^6.0.1" acorn-jsx@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^6.0.1: version "6.2.0" @@ -2055,11 +2122,11 @@ ansi-escapes@^3.0.0: integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-escapes@^4.2.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: - type-fest "^0.11.0" + type-fest "^0.21.3" ansi-html@0.0.7: version "0.0.7" @@ -2081,10 +2148,10 @@ ansi-regex@^4.0.0, ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== +ansi-regex@^5.0.0, ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" @@ -2108,10 +2175,10 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -2171,16 +2238,16 @@ array-flatten@^2.1.0: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.0.3, array-includes@^3.1.1, array-includes@^3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" - integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== +array-includes@^3.0.3, array-includes@^3.1.1, array-includes@^3.1.3: + version "3.1.4" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" + integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" + es-abstract "^1.19.1" get-intrinsic "^1.1.1" - is-string "^1.0.5" + is-string "^1.0.7" array-union@^1.0.1: version "1.0.2" @@ -2204,15 +2271,14 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.flatmap@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz#94cfd47cc1556ec0747d97f7c7738c58122004c9" - integrity sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q== +array.prototype.flatmap@^1.2.4: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz#908dc82d8a406930fdf38598d51e7411d18d4446" + integrity sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA== dependencies: call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - function-bind "^1.1.1" + es-abstract "^1.19.0" asap@^2.0.6, asap@~2.0.6: version "2.0.6" @@ -2299,15 +2365,15 @@ atob@^2.1.2: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.6.1: - version "9.8.6" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" - integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== + version "9.8.8" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a" + integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA== dependencies: browserslist "^4.12.0" caniuse-lite "^1.0.30001109" - colorette "^1.2.1" normalize-range "^0.1.2" num2fraction "^1.2.2" + picocolors "^0.2.1" postcss "^7.0.32" postcss-value-parser "^4.1.0" @@ -2329,11 +2395,11 @@ axios@0.19.2: follow-redirects "1.5.10" axios@^0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== dependencies: - follow-redirects "^1.10.0" + follow-redirects "^1.14.0" axobject-query@^2.0.2: version "2.2.0" @@ -2420,29 +2486,29 @@ babel-plugin-named-asset-import@^0.3.4: resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.7.tgz#156cd55d3f1228a5765774340937afc8398067dd" integrity sha512-squySRkf+6JGnvjoUtDEjSREJEBirnXi9NqP6rjSYsylxQxqBTz+pkmf395i9E2zsvmYUaI40BHo6SqZUdydlw== -babel-plugin-polyfill-corejs2@^0.1.4: - version "0.1.10" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz#a2c5c245f56c0cac3dbddbf0726a46b24f0f81d1" - integrity sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA== +babel-plugin-polyfill-corejs2@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327" + integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ== dependencies: - "@babel/compat-data" "^7.13.0" - "@babel/helper-define-polyfill-provider" "^0.1.5" + "@babel/compat-data" "^7.13.11" + "@babel/helper-define-polyfill-provider" "^0.2.2" semver "^6.1.1" -babel-plugin-polyfill-corejs3@^0.1.3: - version "0.1.7" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0" - integrity sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw== +babel-plugin-polyfill-corejs3@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz#2779846a16a1652244ae268b1e906ada107faf92" + integrity sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.1.5" - core-js-compat "^3.8.1" + "@babel/helper-define-polyfill-provider" "^0.2.2" + core-js-compat "^3.16.2" -babel-plugin-polyfill-regenerator@^0.1.2: - version "0.1.6" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz#0fe06a026fe0faa628ccc8ba3302da0a6ce02f3f" - integrity sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg== +babel-plugin-polyfill-regenerator@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077" + integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg== dependencies: - "@babel/helper-define-polyfill-provider" "^0.1.5" + "@babel/helper-define-polyfill-provider" "^0.2.2" babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" @@ -2505,9 +2571,9 @@ babylon@^6.18.0: integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== balloon-css@^1.0.3: version "1.2.0" @@ -2733,16 +2799,16 @@ browserslist@4.14.2: escalade "^3.0.2" node-releases "^1.1.61" -browserslist@^4.0.0, browserslist@^4.1.1, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.3, browserslist@^4.6.4, browserslist@^4.9.1: - version "4.16.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" - integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== +browserslist@^4.0.0, browserslist@^4.1.1, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.17.3, browserslist@^4.6.4, browserslist@^4.9.1: + version "4.17.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.3.tgz#2844cd6eebe14d12384b0122d217550160d2d624" + integrity sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ== dependencies: - caniuse-lite "^1.0.30001181" - colorette "^1.2.1" - electron-to-chromium "^1.3.649" + caniuse-lite "^1.0.30001264" + electron-to-chromium "^1.3.857" escalade "^3.1.1" - node-releases "^1.1.70" + node-releases "^1.1.77" + picocolors "^0.2.1" bser@2.1.1: version "2.1.1" @@ -2752,9 +2818,9 @@ bser@2.1.1: node-int64 "^0.4.0" buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== buffer-indexof@^1.0.0: version "1.1.1" @@ -2891,10 +2957,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001181: - version "1.0.30001204" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz#256c85709a348ec4d175e847a3b515c66e79f2aa" - integrity sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001125, caniuse-lite@^1.0.30001264: + version "1.0.30001265" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz#0613c9e6c922e422792e6fcefdf9a3afeee4f8c3" + integrity sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw== capture-exit@^2.0.0: version "2.0.0" @@ -2931,9 +2997,9 @@ chalk@^3.0.0: supports-color "^7.1.0" chalk@^4.0.0, chalk@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -2963,19 +3029,19 @@ chokidar@^2.0.0, chokidar@^2.1.8: fsevents "^1.2.7" chokidar@^3.4.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" - integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== dependencies: - anymatch "~3.1.1" + anymatch "~3.1.2" braces "~3.0.2" - glob-parent "~5.1.0" + glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.5.0" + readdirp "~3.6.0" optionalDependencies: - fsevents "~2.3.1" + fsevents "~2.3.2" chownr@^1.1.1: version "1.1.4" @@ -2983,11 +3049,9 @@ chownr@^1.1.1: integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" + version "1.0.3" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== ci-info@^2.0.0: version "2.0.0" @@ -3013,9 +3077,9 @@ class-utils@^0.3.5: static-extend "^0.1.1" classnames@^2.2.5, classnames@^2.2.6: - version "2.2.6" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" - integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q== + version "2.3.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" + integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== clean-css@4.2.x: version "4.2.3" @@ -3106,7 +3170,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0, color-convert@^1.9.1: +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -3130,26 +3194,21 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.5.4: - version "1.5.5" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz#65474a8f0e7439625f3d27a6a19d89fc45223014" - integrity sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg== +color-string@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.6.0.tgz#c3915f61fe267672cb7e1e064c9d692219f6c312" + integrity sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA== dependencies: color-name "^1.0.0" simple-swizzle "^0.2.2" color@^3.0.0: - version "3.1.3" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" - integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== + version "3.2.1" + resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== dependencies: - color-convert "^1.9.1" - color-string "^1.5.4" - -colorette@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + color-convert "^1.9.3" + color-string "^1.6.0" combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" @@ -3296,9 +3355,9 @@ convert-source-map@^0.3.3: integrity sha1-8dgClQr33SYxof6+BZZVDIarMZA= convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== dependencies: safe-buffer "~5.1.1" @@ -3347,12 +3406,12 @@ copy-webpack-plugin@^5.1.1: serialize-javascript "^4.0.0" webpack-log "^2.0.0" -core-js-compat@^3.6.2, core-js-compat@^3.8.1, core-js-compat@^3.9.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.1.tgz#4e572acfe90aff69d76d8c37759d21a5c59bb455" - integrity sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA== +core-js-compat@^3.16.0, core-js-compat@^3.16.2, core-js-compat@^3.6.2: + version "3.18.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.18.2.tgz#e40c266fbd613948dd8d2d2156345da8ac03c142" + integrity sha512-25VJYCJtGjZwLguj7d66oiHfmnVw3TMOZ0zV8DyMJp/aeQ3OjR519iOOeck08HMyVVRAqXxafc2Hl+5QstJrsQ== dependencies: - browserslist "^4.16.3" + browserslist "^4.17.3" semver "7.0.0" core-js@^2.4.0: @@ -3361,15 +3420,20 @@ core-js@^2.4.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.5.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.9.1.tgz#cec8de593db8eb2a85ffb0dbdeb312cb6e5460ae" - integrity sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg== + version "3.18.2" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.18.2.tgz#63a551e8a29f305cd4123754846e65896619ba5b" + integrity sha512-zNhPOUoSgoizoSQFdX1MeZO16ORRb9FFQLts8gSYbZU5FcgXhp24iMWMxnOQo5uIaIG7/6FA/IqJPwev1o9ZXQ== -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cosmiconfig@^5.0.0, cosmiconfig@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" @@ -3392,9 +3456,9 @@ cosmiconfig@^6.0.0: yaml "^1.7.2" cosmiconfig@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" - integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" import-fresh "^3.2.1" @@ -3527,7 +3591,7 @@ css-select-base-adapter@^0.1.1: resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== -css-select@^2.0.0, css-select@^2.0.2: +css-select@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== @@ -3537,6 +3601,17 @@ css-select@^2.0.0, css-select@^2.0.2: domutils "^1.7.0" nth-check "^1.0.2" +css-select@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" + integrity sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA== + dependencies: + boolbase "^1.0.0" + css-what "^5.0.0" + domhandler "^4.2.0" + domutils "^2.6.0" + nth-check "^2.0.0" + css-tree@1.0.0-alpha.37: version "1.0.0-alpha.37" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" @@ -3546,9 +3621,9 @@ css-tree@1.0.0-alpha.37: source-map "^0.6.1" css-tree@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" - integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ== + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: mdn-data "2.0.14" source-map "^0.6.1" @@ -3571,6 +3646,11 @@ css-what@^3.2.1: resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== +css-what@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad" + integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg== + css@^2.0.0: version "2.2.4" resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929" @@ -3596,10 +3676,10 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" - integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== +cssnano-preset-default@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" + integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== dependencies: css-declaration-sorter "^4.0.1" cssnano-util-raw-cache "^4.0.1" @@ -3629,7 +3709,7 @@ cssnano-preset-default@^4.0.7: postcss-ordered-values "^4.1.2" postcss-reduce-initial "^4.0.3" postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.2" + postcss-svgo "^4.0.3" postcss-unique-selectors "^4.0.1" cssnano-util-get-arguments@^4.0.0: @@ -3655,12 +3735,12 @@ cssnano-util-same-parent@^4.0.0: integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== cssnano@^4.1.10: - version "4.1.10" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" - integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + version "4.1.11" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" + integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== dependencies: cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.7" + cssnano-preset-default "^4.0.8" is-resolvable "^1.0.0" postcss "^7.0.0" @@ -3684,24 +3764,24 @@ cssstyle@^1.0.0, cssstyle@^1.1.1: cssom "0.3.x" csstype@^2.5.2: - version "2.6.16" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.16.tgz#544d69f547013b85a40d15bff75db38f34fe9c39" - integrity sha512-61FBWoDHp/gRtsoDkq/B1nWrCUG/ok1E3tUrcNbZjsE9Cxd9yzUirjS3+nAATB8U4cTtaQmAHbNndoFz5L6C9Q== + version "2.6.18" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.18.tgz#980a8b53085f34af313410af064f2bd241784218" + integrity sha512-RSU6Hyeg14am3Ah4VZEmeX8H7kLwEEirXe6aU2IPfKNvhXwTflK5HQRDNI0ypQXoqmm+QPyG2IaPuQE5zMwSIQ== csstype@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.7.tgz#2a5fb75e1015e84dd15692f71e89a1450290950b" - integrity sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g== + version "3.0.9" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.9.tgz#6410af31b26bd0520933d02cbc64fce9ce3fbf0b" + integrity sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw== cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= -d3-array@^2.3.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.0.tgz#68a74d153e52d6bf4608d9f6388cca48b42a4c3f" - integrity sha512-T6H/qNldyD/1OlRkJbonb3u3MPhNwju8OPxYv0YSjDb/B2RUeeBEHzIpNrYiinwpmz8+am+puMrpcrDWgY9wRg== +d3-array@2, d3-array@^2.3.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" + integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== dependencies: internmap "^1.0.0" @@ -3715,7 +3795,7 @@ d3-array@^2.3.0: resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-2.0.0.tgz#a10bcc0f986c372b729ba447382413aabf5b0767" integrity sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA== -"d3-interpolate@1.2.0 - 2", d3-interpolate@^2.0.1: +"d3-interpolate@1.2.0 - 2", d3-interpolate@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-2.0.1.tgz#98be499cfb8a3b94d4ff616900501a64abc91163" integrity sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ== @@ -3727,15 +3807,15 @@ d3-array@^2.3.0: resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-2.0.0.tgz#55d86ac131a0548adae241eebfb56b4582dd09d8" integrity sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA== -d3-scale@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.2.3.tgz#be380f57f1f61d4ff2e6cbb65a40593a51649cfd" - integrity sha512-8E37oWEmEzj57bHcnjPVOBS3n4jqakOeuv1EDdQSiSrYnMCBdMd3nc4HtKk7uia8DUHcY/CGuJ42xxgtEYrX0g== +d3-scale@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-3.3.0.tgz#28c600b29f47e5b9cd2df9749c206727966203f3" + integrity sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ== dependencies: d3-array "^2.3.0" d3-format "1 - 2" d3-interpolate "1.2.0 - 2" - d3-time "1 - 2" + d3-time "^2.1.1" d3-time-format "2 - 3" d3-shape@^2.0.0: @@ -3752,10 +3832,12 @@ d3-shape@^2.0.0: dependencies: d3-time "1 - 2" -"d3-time@1 - 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.0.0.tgz#ad7c127d17c67bd57a4c61f3eaecb81108b1e0ab" - integrity sha512-2mvhstTFcMvwStWd9Tj3e6CEqtOivtD8AUiHT8ido/xmzrI9ijrUUihZ6nHuf/vsScRBonagOdj0Vv+SEL5G3Q== +"d3-time@1 - 2", d3-time@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-2.1.1.tgz#e9d8a8a88691f4548e68ca085e5ff956724a6682" + integrity sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ== + dependencies: + d3-array "2" d@1, d@^1.0.1: version "1.0.1" @@ -3766,9 +3848,9 @@ d@1, d@^1.0.1: type "^1.0.1" damerau-levenshtein@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" - integrity sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug== + version "1.0.7" + resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz#64368003512a1a6992593741a09a9d31a836f55d" + integrity sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw== dashdash@^1.12.0: version "1.14.1" @@ -3787,9 +3869,9 @@ data-urls@^1.0.0, data-urls@^1.1.0: whatwg-url "^7.0.0" dayjs@^1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.4.tgz#8e544a9b8683f61783f570980a8a80eaf54ab1e2" - integrity sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw== + version "1.10.7" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468" + integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig== debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: version "2.6.9" @@ -3805,7 +3887,7 @@ debug@=3.1.0: dependencies: ms "2.0.0" -debug@^3.1.1, debug@^3.2.5: +debug@^3.1.1, debug@^3.2.5, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -3813,9 +3895,9 @@ debug@^3.1.1, debug@^3.2.5: ms "^2.1.1" debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== dependencies: ms "2.1.2" @@ -3854,9 +3936,9 @@ deep-equal@^1.0.1: regexp.prototype.flags "^1.2.0" deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== default-gateway@^4.2.0: version "4.2.0" @@ -3936,9 +4018,9 @@ detect-newline@^2.1.0: integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= detect-node@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.5.tgz#9d270aa7eaa5af0b72c4c9d9b814e7f4ce738b79" - integrity sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== detect-port-alt@1.1.6: version "1.1.6" @@ -3998,9 +4080,9 @@ dns-equal@^1.0.0: integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= dns-packet@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" - integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== dependencies: ip "^1.1.0" safe-buffer "^5.0.1" @@ -4034,7 +4116,7 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-converter@^0.2: +dom-converter@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== @@ -4049,9 +4131,9 @@ dom-helpers@^3.4.0: "@babel/runtime" "^7.1.2" dom-helpers@^5.0.1: - version "5.2.0" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.0.tgz#57fd054c5f8f34c52a3eeffdb7e7e93cd357d95b" - integrity sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ== + version "5.2.1" + resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: "@babel/runtime" "^7.8.7" csstype "^3.0.2" @@ -4064,20 +4146,29 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" +dom-serializer@^1.0.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" + integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domelementtype@1, domelementtype@^1.3.1: +domelementtype@1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== -domelementtype@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" - integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== domexception@^1.0.1: version "1.0.1" @@ -4086,14 +4177,14 @@ domexception@^1.0.1: dependencies: webidl-conversions "^4.0.2" -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== +domhandler@^4.0.0, domhandler@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f" + integrity sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w== dependencies: - domelementtype "1" + domelementtype "^2.2.0" -domutils@^1.5.1, domutils@^1.7.0: +domutils@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== @@ -4101,6 +4192,15 @@ domutils@^1.5.1, domutils@^1.7.0: dom-serializer "0" domelementtype "1" +domutils@^2.5.2, domutils@^2.6.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + dot-prop@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -4155,10 +4255,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.649: - version "1.3.693" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.693.tgz#5089c506a925c31f93fcb173a003a22e341115dd" - integrity sha512-vUdsE8yyeu30RecppQtI+XTz2++LWLVEIYmzeCaCRLSdtKZ2eXqdJcrs85KwLiPOPVc6PELgWyXBsfqIvzGZag== +electron-to-chromium@^1.3.564, electron-to-chromium@^1.3.857: + version "1.3.864" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz#6a993bcc196a2b8b3df84d28d5d4dd912393885f" + integrity sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw== elliptic@^6.5.3: version "6.5.4" @@ -4214,11 +4314,6 @@ enhanced-resolve@^4.1.0: memory-fs "^0.5.0" tapable "^1.0.0" -entities@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - entities@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" @@ -4238,27 +4333,31 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: - version "1.18.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" - integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== +es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" has "^1.0.3" has-symbols "^1.0.2" - is-callable "^1.2.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" is-negative-zero "^2.0.1" - is-regex "^1.1.2" - is-string "^1.0.5" - object-inspect "^1.9.0" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" + is-string "^1.0.7" + is-weakref "^1.0.1" + object-inspect "^1.11.0" object-keys "^1.1.1" object.assign "^4.1.2" string.prototype.trimend "^1.0.4" string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.0" + unbox-primitive "^1.0.1" es-to-primitive@^1.2.1: version "1.2.1" @@ -4335,12 +4434,12 @@ eslint-config-react-app@^5.0.2: confusing-browser-globals "^1.0.9" eslint-import-resolver-node@^0.3.2: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== dependencies: - debug "^2.6.9" - resolve "^1.13.1" + debug "^3.2.7" + resolve "^1.20.0" eslint-loader@3.0.2: version "3.0.2" @@ -4354,11 +4453,11 @@ eslint-loader@3.0.2: schema-utils "^2.2.0" eslint-module-utils@^2.4.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== + version "2.6.2" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz#94e5540dd15fe1522e8ffa3ec8db3b7fa7e7a534" + integrity sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q== dependencies: - debug "^2.6.9" + debug "^3.2.7" pkg-dir "^2.0.0" eslint-plugin-flowtype@3.13.0: @@ -4406,21 +4505,24 @@ eslint-plugin-react-hooks@^4.0.0: integrity sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ== eslint-plugin-react@^7.19.0: - version "7.22.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.22.0.tgz#3d1c542d1d3169c45421c1215d9470e341707269" - integrity sha512-p30tuX3VS+NWv9nQot9xIGAHBXR0+xJVaZriEsHoJrASGCJZDJ8JLNM0YqKqI0AKm6Uxaa1VUHoNEibxRCMQHA== + version "7.26.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.26.1.tgz#41bcfe3e39e6a5ac040971c1af94437c80daa40e" + integrity sha512-Lug0+NOFXeOE+ORZ5pbsh6mSKjBKXDXItUD2sQoT+5Yl0eoT82DqnXeTMfUare4QVCn9QwXbfzO/dBLjLXwVjQ== dependencies: - array-includes "^3.1.1" - array.prototype.flatmap "^1.2.3" + array-includes "^3.1.3" + array.prototype.flatmap "^1.2.4" doctrine "^2.1.0" - has "^1.0.3" + estraverse "^5.2.0" jsx-ast-utils "^2.4.1 || ^3.0.0" - object.entries "^1.1.2" - object.fromentries "^2.0.2" - object.values "^1.1.1" + minimatch "^3.0.4" + object.entries "^1.1.4" + object.fromentries "^2.0.4" + object.hasown "^1.0.0" + object.values "^1.1.4" prop-types "^15.7.2" - resolve "^1.18.1" - string.prototype.matchall "^4.0.2" + resolve "^2.0.0-next.3" + semver "^6.3.0" + string.prototype.matchall "^4.0.5" eslint-scope@^4.0.3: version "4.0.3" @@ -4574,9 +4676,9 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: safe-buffer "^5.1.1" exec-sh@^0.3.2: - version "0.3.5" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.5.tgz#1b46bd6bcbf54fdc1e926a4f3d90126d42cec3df" - integrity sha512-0hzpaUazv4mEccxdn3TXC+HWNeVXNKMCJRK6E7Xyg+LwGAYI3yFag6jTkd4injV+kChYDQS1ftqDhnDVWNhU8A== + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== execa@^1.0.0: version "1.0.0" @@ -4658,11 +4760,11 @@ express@^4.16.2: vary "~1.1.2" ext@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" - integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + version "1.6.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.6.0.tgz#3871d50641e874cc172e2b53f919842d19db4c52" + integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg== dependencies: - type "^2.0.0" + type "^2.5.0" extend-shallow@^2.0.1: version "2.0.1" @@ -4722,17 +4824,21 @@ fast-deep-equal@^3.1.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-equals@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fast-equals/-/fast-equals-2.0.3.tgz#7039b0a039909f345a2ce53f6202a14e5f392efc" + integrity sha512-0EMw4TTUxsMDpDkCg0rXor2gsg+npVrMIHbEhvD0HZyIhUX6AktC/yasm+qKwfyswd06Qy95ZKk8p2crTo0iPA== + fast-glob@^3.1.1: - version "3.2.5" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" - integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" + glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" + micromatch "^4.0.4" fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -4745,9 +4851,9 @@ fast-levenshtein@~2.0.6: integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= fastq@^1.6.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858" - integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g== + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== dependencies: reusify "^1.0.4" @@ -4759,9 +4865,9 @@ faye-websocket@^0.10.0: websocket-driver ">=0.5.1" faye-websocket@~0.11.1: - version "0.11.3" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" - integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA== + version "0.11.4" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== dependencies: websocket-driver ">=0.5.1" @@ -4936,10 +5042,10 @@ follow-redirects@1.5.10: dependencies: debug "=3.1.0" -follow-redirects@^1.0.0, follow-redirects@^1.10.0: - version "1.13.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267" - integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA== +follow-redirects@^1.0.0, follow-redirects@^1.14.0: + version "1.14.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" + integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== for-each@^0.3.3: version "0.3.3" @@ -5000,10 +5106,10 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== fragment-cache@^0.2.1: version "0.2.1" @@ -5075,7 +5181,7 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" -fsevents@~2.3.1: +fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -5126,6 +5232,14 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -5146,7 +5260,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: +glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -5154,9 +5268,9 @@ glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: is-glob "^4.0.1" glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -5229,9 +5343,9 @@ globby@^7.1.1: slash "^1.0.0" graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== growly@^1.3.0: version "1.3.0" @@ -5265,11 +5379,11 @@ har-validator@~5.1.3: har-schema "^2.0.0" harmony-reflect@^1.4.6: - version "1.6.1" - resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9" - integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA== + version "1.6.2" + resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.2.tgz#31ecbd32e648a34d030d86adb67d4d47547fe710" + integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== -has-bigints@^1.0.0: +has-bigints@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== @@ -5284,11 +5398,18 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2: +has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" @@ -5388,9 +5509,9 @@ hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0, hoist-non-react- react-is "^16.7.0" hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== hpack.js@^2.1.6: version "2.1.6" @@ -5412,11 +5533,6 @@ hsla-regex@^1.0.0: resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" @@ -5447,6 +5563,13 @@ html-minifier@^3.5.20: relateurl "0.2.x" uglify-js "3.4.x" +html-parse-stringify@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz#dfc1017347ce9f77c8141a507f233040c59c55d2" + integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== + dependencies: + void-elements "3.1.0" + html-webpack-plugin@4.0.0-beta.5: version "4.0.0-beta.5" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.0-beta.5.tgz#2c53083c1151bfec20479b1f8aaf0039e77b5513" @@ -5459,17 +5582,15 @@ html-webpack-plugin@4.0.0-beta.5: tapable "^1.1.0" util.promisify "1.0.0" -htmlparser2@^3.10.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" http-deceiver@^1.2.7: version "1.2.7" @@ -5577,6 +5698,13 @@ hyphenate-style-name@^1.0.3: resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== +i18next@^21.2.4: + version "21.2.4" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-21.2.4.tgz#ac56044099c83a0a8e2c596acf57f35da8ca327e" + integrity sha512-+81XmiwJOLWJFjRZJK5ASFahAo5TXZGz5IrBT4CfLJ3CyXho61A1cj1Kmh8za8TYtGFou0cEkUSjEaqfya7Wfg== + dependencies: + "@babel/runtime" "^7.12.0" + iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -5634,9 +5762,9 @@ immer@8.0.1: integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== "immutable@^3.8.1 || ^4.0.0-rc.1": - version "4.0.0-rc.12" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217" - integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A== + version "4.0.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" + integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== import-cwd@^2.0.0: version "2.1.0" @@ -5681,13 +5809,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indefinite-observable@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/indefinite-observable/-/indefinite-observable-2.0.1.tgz#574af29bfbc17eb5947793797bddc94c9d859400" - integrity sha512-G8vgmork+6H9S8lUAg1gtXEj2JxIQTo0g2PbFiYOdjkziSI0F7UYBiVwhZRuixhBCNGczAls34+5HJPyZysvxQ== - dependencies: - symbol-observable "1.2.0" - indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -5814,11 +5935,12 @@ is-accessor-descriptor@^1.0.0: kind-of "^6.0.0" is-arguments@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" - integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" is-arrayish@^0.2.1: version "0.2.1" @@ -5831,9 +5953,11 @@ is-arrayish@^0.3.1: integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-bigint@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" - integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" is-binary-path@^1.0.0: version "1.0.1" @@ -5850,21 +5974,22 @@ is-binary-path@~2.1.0: binary-extensions "^2.0.0" is-boolean-object@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" - integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" + has-tostringtag "^1.0.0" is-buffer@^1.0.2, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" - integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== is-ci@^2.0.0: version "2.0.0" @@ -5886,9 +6011,9 @@ is-color-stop@^1.0.0: rgba-regex "^1.0.0" is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + version "2.7.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.7.0.tgz#3c0ef7d31b4acfc574f80c58409d568a836848e3" + integrity sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ== dependencies: has "^1.0.3" @@ -5907,9 +6032,11 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" is-descriptor@^0.1.0: version "0.1.6" @@ -5935,9 +6062,9 @@ is-directory@^0.3.1: integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-docker@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" - integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" @@ -5986,9 +6113,9 @@ is-glob@^3.1.0: is-extglob "^2.1.0" is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" @@ -6003,9 +6130,11 @@ is-negative-zero@^2.0.1: integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== is-number-object@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" - integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" is-number@^3.0.0: version "3.0.0" @@ -6060,13 +6189,13 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-regex@^1.0.4, is-regex@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" - integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== +is-regex@^1.0.4, is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== dependencies: call-bind "^1.0.2" - has-symbols "^1.0.1" + has-tostringtag "^1.0.0" is-regexp@^1.0.0: version "1.0.0" @@ -6083,35 +6212,42 @@ is-root@2.1.0: resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= -is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -is-svg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" - integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: - html-comment-regex "^1.1.0" + has-tostringtag "^1.0.0" is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - has-symbols "^1.0.1" + has-symbols "^1.0.2" is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -6767,73 +6903,72 @@ jsprim@^1.2.2: verror "1.10.0" jss-plugin-camel-case@^10.5.1: - version "10.6.0" - resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.6.0.tgz#93d2cd704bf0c4af70cc40fb52d74b8a2554b170" - integrity sha512-JdLpA3aI/npwj3nDMKk308pvnhoSzkW3PXlbgHAzfx0yHWnPPVUjPhXFtLJzgKZge8lsfkUxvYSQ3X2OYIFU6A== + version "10.8.0" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.8.0.tgz#575fd849202d36713a6970796458e375754446c7" + integrity sha512-yxlXrXwcCdGw+H4BC187dEu/RFyW8joMcWfj8Rk9UPgWTKu2Xh7Sib4iW3xXjHe/t5phOHF1rBsHleHykWix7g== dependencies: "@babel/runtime" "^7.3.1" hyphenate-style-name "^1.0.3" - jss "10.6.0" + jss "10.8.0" jss-plugin-default-unit@^10.5.1: - version "10.6.0" - resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.6.0.tgz#af47972486819b375f0f3a9e0213403a84b5ef3b" - integrity sha512-7y4cAScMHAxvslBK2JRK37ES9UT0YfTIXWgzUWD5euvR+JR3q+o8sQKzBw7GmkQRfZijrRJKNTiSt1PBsLI9/w== + version "10.8.0" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.8.0.tgz#98db5962e62abbf43f1cc111e62cb70ffb09db59" + integrity sha512-9XJV546cY9zV9OvIE/v/dOaxSi4062VfYQQfwbplRExcsU2a79Yn+qDz/4ciw6P4LV1Naq90U+OffAGRHfNq/Q== dependencies: "@babel/runtime" "^7.3.1" - jss "10.6.0" + jss "10.8.0" jss-plugin-global@^10.5.1: - version "10.6.0" - resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.6.0.tgz#3e8011f760f399cbadcca7f10a485b729c50e3ed" - integrity sha512-I3w7ji/UXPi3VuWrTCbHG9rVCgB4yoBQLehGDTmsnDfXQb3r1l3WIdcO8JFp9m0YMmyy2CU7UOV6oPI7/Tmu+w== + version "10.8.0" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.8.0.tgz#0c2b0c056087f5846d600f3332eeb7a1a8b9c9f2" + integrity sha512-H/8h/bHd4e7P0MpZ9zaUG8NQSB2ie9rWo/vcCP6bHVerbKLGzj+dsY22IY3+/FNRS8zDmUyqdZx3rD8k4nmH4w== dependencies: "@babel/runtime" "^7.3.1" - jss "10.6.0" + jss "10.8.0" jss-plugin-nested@^10.5.1: - version "10.6.0" - resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.6.0.tgz#5f83c5c337d3b38004834e8426957715a0251641" - integrity sha512-fOFQWgd98H89E6aJSNkEh2fAXquC9aZcAVjSw4q4RoQ9gU++emg18encR4AT4OOIFl4lQwt5nEyBBRn9V1Rk8g== + version "10.8.0" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.8.0.tgz#7ef9a815e9c9fbede41a8f52ce75cffb4c3b86d5" + integrity sha512-MhmINZkSxyFILcFBuDoZmP1+wj9fik/b9SsjoaggkGjdvMQCES21mj4K5ZnRGVm448gIXyi9j/eZjtDzhaHUYQ== dependencies: "@babel/runtime" "^7.3.1" - jss "10.6.0" + jss "10.8.0" tiny-warning "^1.0.2" jss-plugin-props-sort@^10.5.1: - version "10.6.0" - resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.6.0.tgz#297879f35f9fe21196448579fee37bcde28ce6bc" - integrity sha512-oMCe7hgho2FllNc60d9VAfdtMrZPo9n1Iu6RNa+3p9n0Bkvnv/XX5San8fTPujrTBScPqv9mOE0nWVvIaohNuw== + version "10.8.0" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.8.0.tgz#2a83e8ca80d72828495bad57b485f7d55a33543b" + integrity sha512-VY+Wt5WX5GMsXDmd+Ts8+O16fpiCM81svbox++U3LDbJSM/g9FoMx3HPhwUiDfmgHL9jWdqEuvSl/JAk+mh6mQ== dependencies: "@babel/runtime" "^7.3.1" - jss "10.6.0" + jss "10.8.0" jss-plugin-rule-value-function@^10.5.1: - version "10.6.0" - resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.6.0.tgz#3c1a557236a139d0151e70a82c810ccce1c1c5ea" - integrity sha512-TKFqhRTDHN1QrPTMYRlIQUOC2FFQb271+AbnetURKlGvRl/eWLswcgHQajwuxI464uZk91sPiTtdGi7r7XaWfA== + version "10.8.0" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.8.0.tgz#e011ed180789229e7ea8f75c222d34810bcab520" + integrity sha512-R8N8Ma6Oye1F9HroiUuHhVjpPsVq97uAh+rMI6XwKLqirIu2KFb5x33hPj+vNBMxSHc9jakhf5wG0BbQ7fSDOg== dependencies: "@babel/runtime" "^7.3.1" - jss "10.6.0" + jss "10.8.0" tiny-warning "^1.0.2" jss-plugin-vendor-prefixer@^10.5.1: - version "10.6.0" - resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.6.0.tgz#e1fcd499352846890c38085b11dbd7aa1c4f2c78" - integrity sha512-doJ7MouBXT1lypLLctCwb4nJ6lDYqrTfVS3LtXgox42Xz0gXusXIIDboeh6UwnSmox90QpVnub7au8ybrb0krQ== + version "10.8.0" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.8.0.tgz#024b6d77be50b68e5dfca2c75f68091d8b722d61" + integrity sha512-G1zD0J8dFwKZQ+GaZaay7A/Tg7lhDw0iEkJ/iFFA5UPuvZFpMprCMQttXcTBhLlhhWnyZ8YPn4yqp+amrhQekw== dependencies: "@babel/runtime" "^7.3.1" css-vendor "^2.0.8" - jss "10.6.0" + jss "10.8.0" -jss@10.6.0, jss@^10.5.1: - version "10.6.0" - resolved "https://registry.yarnpkg.com/jss/-/jss-10.6.0.tgz#d92ff9d0f214f65ca1718591b68e107be4774149" - integrity sha512-n7SHdCozmxnzYGXBHe0NsO0eUf9TvsHVq2MXvi4JmTn3x5raynodDVE/9VQmBdWFyyj9HpHZ2B4xNZ7MMy7lkw== +jss@10.8.0, jss@^10.5.1: + version "10.8.0" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.8.0.tgz#5063ee73aabd9f228ea3849df7962f0d2e213a42" + integrity sha512-6fAMLJrVQ8epM5ghghxWqCwRR0ZamP2cKbOAtzPudcCMSNdAqtvmzQvljUZYR8OXJIeb/IpZeOXA1sDXms4R1w== dependencies: "@babel/runtime" "^7.3.1" csstype "^3.0.2" - indefinite-observable "^2.0.1" is-in-browser "^1.1.3" tiny-warning "^1.0.2" @@ -6846,11 +6981,11 @@ jsx-ast-utils@^2.2.1: object.assign "^4.1.0" "jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz#41108d2cec408c3453c1bbe8a4aae9e1e2bd8f82" - integrity sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q== + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz#720b97bfe7d901b927d87c3773637ae8ea48781b" + integrity sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA== dependencies: - array-includes "^3.1.2" + array-includes "^3.1.3" object.assign "^4.1.2" killable@^1.0.0: @@ -7074,7 +7209,7 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash.template@^4.4.0, lodash.template@^4.5.0: +lodash.template@^4.4.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== @@ -7104,7 +7239,7 @@ lodash.uniqueid@^4.0.1: resolved "https://registry.yarnpkg.com/lodash.uniqueid/-/lodash.uniqueid-4.0.1.tgz#3268f26a7c88e4f4b1758d679271814e31fa5b26" integrity sha1-MmjyanyI5PSxdY1nknGBTjH6WyY= -"lodash@>=3.5 <5", lodash@^4.0.1, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.5, lodash@~4.17.4: +"lodash@>=3.5 <5", lodash@^4.0.1, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.5: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -7141,9 +7276,9 @@ lru-cache@^6.0.0: yallist "^4.0.0" make-cancellable-promise@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/make-cancellable-promise/-/make-cancellable-promise-1.0.0.tgz#826214115b0827ca7a45ba204df7c31546243870" - integrity sha512-+YO6Grg2uy/z8Mv3uV90OP6yAUHIF43YGgEFbejmBrK9VWFsVO6DvzFMcopXr9wCNg3/QIltIKiSCROC7zFB2g== + version "1.1.0" + resolved "https://registry.yarnpkg.com/make-cancellable-promise/-/make-cancellable-promise-1.1.0.tgz#b4e9fcb31db3a27417e44f80cffa598ec9ac9f4e" + integrity sha512-X5Opjm2xcZsOLuJ+Bnhb4t5yfu4ehlA3OKEYLtqUchgVzL/QaqW373ZUVxVHKwvJ38cmYuR4rAHD2yUvAIkTPA== make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" @@ -7154,9 +7289,9 @@ make-dir@^2.0.0, make-dir@^2.1.0: semver "^5.6.0" make-event-props@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/make-event-props/-/make-event-props-1.2.0.tgz#96b87d88919533b8f8934b58b4c3d5679459a0cf" - integrity sha512-BmWFkm/jZzVH9A0tEBdkjAARUz/eha+5IRyfOndeSMKRadkgR5DawoBHoRwLxkYmjJOI5bHkXKpaZocxj+dKgg== + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-event-props/-/make-event-props-1.3.0.tgz#2434cb390d58bcf40898d009ef5b1f936de9671b" + integrity sha512-oWiDZMcVB1/A487251hEWza1xzgCzl6MXxe9aF24l5Bt9N9UEbqTqKumEfuuLhmlhRZYnc+suVvW4vUs8bwO7Q== makeerror@1.0.x: version "1.0.11" @@ -7200,9 +7335,9 @@ material-colors@^1.2.1: integrity sha512-6qE4B9deFBIa9YSpOc9O0Sgc43zTeVYbgDT5veRKSlB2+ZuHNoVVxA1L/ckMUayV9Ay9y7Z/SZCLcGteW9i7bg== material-ui-toggle-icon@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/material-ui-toggle-icon/-/material-ui-toggle-icon-1.1.1.tgz#97a66900f03b33860f83ddcd5eb1a7cdd618e200" - integrity sha512-0Qf6mop5BAL3LOr/w0oOnTyFvBd5M9DwSvUR+CONhwyZ6N8Z9+9oSOr/4tJx69dBv72eaiPQwztVMbv5X+z1BQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/material-ui-toggle-icon/-/material-ui-toggle-icon-1.1.2.tgz#3125e686981659839409d12a2e0178d34acb6623" + integrity sha512-nxUNlpemqG/ObsNc+JmkJnOB0oPoJpgVKBXsuguVdRSlAU+qjEEJzVhaXLND4VCSAtz4QLO81yXByplzeLsQhw== dependencies: prop-types "^15.5.10" @@ -7216,9 +7351,9 @@ md5.js@^1.3.4: safe-buffer "^5.1.2" mdi-material-ui@^6.9.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/mdi-material-ui/-/mdi-material-ui-6.22.0.tgz#0b323909fc9ed38b707463bec716e57000af97c7" - integrity sha512-cztRUMEiR8JGmEw9GUZWFnJ1WsNTE5tn6vqDMTOequCE6UxMIhBEhbQHW4Z0JyWSs3mTkvjzOLTYoBy3efIV3g== + version "6.22.1" + resolved "https://registry.yarnpkg.com/mdi-material-ui/-/mdi-material-ui-6.22.1.tgz#f4cd3fdd24103b87204a5d7fe1096c20b93f8d49" + integrity sha512-wndaFXJhoFr9g5kPw31TZajTa9uf/21jb2jD1rJ5Vi+sj2GZYnZz2BYbrfp1qFgd7tZz8XAcnpsSNMdLbe+dtw== mdn-data@2.0.14: version "2.0.14" @@ -7261,9 +7396,9 @@ memory-fs@^0.5.0: readable-stream "^2.0.1" merge-class-names@^1.1.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/merge-class-names/-/merge-class-names-1.4.0.tgz#02edcdd5ff677fbb03b47ecd4586df89d697b81b" - integrity sha512-xNdBM7s+6uD+vNZJEymqrFbMBCDGzoA8clZTcj2F1XIy1QQKF+wjFVv7iDZFfdCBnViTdt54A4Ye2lmBsXrBjQ== + version "1.4.2" + resolved "https://registry.yarnpkg.com/merge-class-names/-/merge-class-names-1.4.2.tgz#78d6d95ab259e7e647252a7988fd25a27d5a8835" + integrity sha512-bOl98VzwCGi25Gcn3xKxnR5p/WrhWFQB59MS/aGENcmUc6iSm96yrFDF0XSNurX9qN4LbJm0R9kfvsQ17i8zCw== merge-deep@^3.0.2: version "3.0.3" @@ -7318,13 +7453,13 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== +micromatch@^4.0.2, micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== dependencies: braces "^3.0.1" - picomatch "^2.0.5" + picomatch "^2.2.3" miller-rabin@^4.0.0: version "4.0.1" @@ -7334,17 +7469,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.46.0, "mime-db@>= 1.43.0 < 2": - version "1.46.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" - integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== +mime-db@1.50.0, "mime-db@>= 1.43.0 < 2": + version "1.50.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f" + integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A== mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.29" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" - integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== + version "2.1.33" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb" + integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g== dependencies: - mime-db "1.46.0" + mime-db "1.50.0" mime@1.6.0: version "1.6.0" @@ -7441,16 +7576,16 @@ mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1: minimist "^1.2.5" monaco-editor-webpack-plugin@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-3.0.1.tgz#b9bf93314eb2708907c232cfbf359622e7a6d98a" - integrity sha512-Hym4HqWgIpyoi9G0spln/b/7rkDKfYwIOrNzo1fHHMc+MLYSwD1JXHwKSDS77X27ZHfVJsEXbMZYdGhSYuVF0w== + version "3.1.0" + resolved "https://registry.yarnpkg.com/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-3.1.0.tgz#972efc47a91b3bf3bd977885684a3180eb8f341b" + integrity sha512-TP5NkCAV0OeFTry5k/d60KR7CkhTXL4kgJKtE3BzjgbDb5TGEPEhoKmHBrSa6r7Oc0sNbPLZhKD/TP2ig7A+/A== dependencies: loader-utils "^2.0.0" monaco-editor@*: - version "0.23.0" - resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.23.0.tgz#24844ba5640c7adb3a2a3ff3b520cf2d7170a6f0" - integrity sha512-q+CP5zMR/aFiMTE9QlIavGyGicKnG2v/H8qVvybLzeFsARM8f6G9fL0sMST2tyVYCwDKkGamZUI6647A0jR/Lg== + version "0.29.0" + resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.29.0.tgz#916b7be58e882c3b2a4a2f444688b583919e085e" + integrity sha512-7bOTapOZG8gNfzk9HJstNClnRjD9TEkVqo7qB3W6y+4cypS31A55MBQ7dpnEdnQBU+Hz3isyx61mi3/e05S7Xg== move-concurrently@^1.0.1: version "1.0.1" @@ -7503,9 +7638,9 @@ mute-stream@0.0.8: integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nan@^2.12.1: - version "2.14.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" - integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== + version "2.15.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" + integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== nanomatch@^1.2.9: version "1.2.13" @@ -7616,10 +7751,10 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" -node-releases@^1.1.61, node-releases@^1.1.70: - version "1.1.71" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" - integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== +node-releases@^1.1.61, node-releases@^1.1.77: + version "1.1.77" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" + integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== normalize-package-data@^2.3.2: version "2.5.0" @@ -7677,6 +7812,13 @@ nth-check@^1.0.2: dependencies: boolbase "~1.0.0" +nth-check@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" + integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== + dependencies: + boolbase "^1.0.0" + num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" @@ -7716,10 +7858,10 @@ object-hash@^1.3.1: resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df" integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA== -object-inspect@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" - integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== object-is@^1.0.1: version "1.1.5" @@ -7756,34 +7898,40 @@ object.assign@^4.1.0, object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.entries@^1.1.0, object.entries@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" - integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== +object.entries@^1.1.0, object.entries@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" + es-abstract "^1.19.1" -object.fromentries@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.4.tgz#26e1ba5c4571c5c6f0890cef4473066456a120b8" - integrity sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ== +object.fromentries@^2.0.4: + version "2.0.5" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.5.tgz#7b37b205109c21e741e605727fe8b0ad5fa08251" + integrity sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - has "^1.0.3" + es-abstract "^1.19.1" object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0, object.getownpropertydescriptors@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" - integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== + version "2.1.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" + integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" + es-abstract "^1.19.1" + +object.hasown@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.0.tgz#7232ed266f34d197d15cac5880232f7a4790afe5" + integrity sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.19.1" object.pick@^1.3.0: version "1.3.0" @@ -7792,15 +7940,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.0, object.values@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz#eaa8b1e17589f02f698db093f7c62ee1699742ee" - integrity sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw== +object.values@^1.1.0, object.values@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - has "^1.0.3" + es-abstract "^1.19.1" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -8127,9 +8274,9 @@ path-key@^3.1.0: integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" @@ -8163,9 +8310,9 @@ path-type@^4.0.0: integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pbkdf2@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" - integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -8186,10 +8333,15 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== pify@^2.0.0: version "2.3.0" @@ -8502,11 +8654,10 @@ postcss-image-set-function@^3.0.1: postcss-values-parser "^2.0.0" postcss-initial@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz#f018563694b3c16ae8eaabe3c585ac6319637b2d" - integrity sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.4.tgz#9d32069a10531fe2ecafa0b6ac750ee0bc7efc53" + integrity sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg== dependencies: - lodash.template "^4.5.0" postcss "^7.0.2" postcss-lab-function@^2.0.1: @@ -8893,21 +9044,18 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4: uniq "^1.0.1" postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: - version "6.0.4" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz#56075a1380a04604c38b063ea7767a129af5c2b3" - integrity sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw== + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea" + integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg== dependencies: cssesc "^3.0.0" - indexes-of "^1.0.1" - uniq "^1.0.1" util-deprecate "^1.0.2" -postcss-svgo@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" - integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== +postcss-svgo@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" + integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== dependencies: - is-svg "^3.0.0" postcss "^7.0.0" postcss-value-parser "^3.0.0" svgo "^1.0.0" @@ -8950,13 +9098,12 @@ postcss@7.0.14: supports-color "^6.1.0" postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.35" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz#d2be00b998f7f211d8a276974079f2e92b970e24" - integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== + version "7.0.39" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== dependencies: - chalk "^2.4.2" + picocolors "^0.2.1" source-map "^0.6.1" - supports-color "^6.1.0" prelude-ls@~1.1.2: version "1.1.2" @@ -9033,7 +9180,7 @@ promise@^8.0.3: dependencies: asap "~2.0.6" -prompts@2.4.0, prompts@^2.0.1: +prompts@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== @@ -9041,7 +9188,15 @@ prompts@2.4.0, prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: +prompts@^2.0.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ== @@ -9051,11 +9206,11 @@ prop-types@^15.5.0, prop-types@^15.5.10, prop-types@^15.6.0, prop-types@^15.6.1, react-is "^16.8.1" proxy-addr@~2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" - integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== dependencies: - forwarded "~0.1.2" + forwarded "0.2.0" ipaddr.js "1.9.1" prr@~1.0.1: @@ -9337,6 +9492,14 @@ react-hotkeys@^2.0.0: dependencies: prop-types "^15.6.1" +react-i18next@^11.12.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.12.0.tgz#2a053321b9b7a876d5baa7af55a12d986117bffc" + integrity sha512-M9BT+hqVG03ywrl+L7CK74ugK+4jIo7AeKJ17+g9BoqJz2+/aVbs8SIVXT4KMQ1rjIdcw+GcSRDy1CXjcz6tLQ== + dependencies: + "@babel/runtime" "^7.14.5" + html-parse-stringify "^3.0.1" + react-is@16.10.2: version "16.10.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.10.2.tgz#984120fd4d16800e9a738208ab1fba422d23b5ab" @@ -9348,9 +9511,9 @@ react-is@^16.12.0, react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react- integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== "react-is@^16.8.0 || ^17.0.0": - version "17.0.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" - integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== react-lazy-load-image-component@^1.3.2: version "1.5.1" @@ -9400,45 +9563,46 @@ react-photo-view@^0.4.0: lodash.uniqueid "^4.0.1" react-redux@^7.1.3: - version "7.2.2" - resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.2.tgz#03862e803a30b6b9ef8582dadcc810947f74b736" - integrity sha512-8+CQ1EvIVFkYL/vu6Olo7JFLWop1qRUeb46sGtIMDCSpgwPQq8fPLpirIB0iTqFe9XYEFPHssdX8/UwN6pAkEA== + version "7.2.5" + resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.5.tgz#213c1b05aa1187d9c940ddfc0b29450957f6a3b8" + integrity sha512-Dt29bNyBsbQaysp6s/dN0gUodcq+dVKKER8Qv82UrpeygwYeX1raTtil7O/fftw/rFqzaf6gJhDZRkkZnn6bjg== dependencies: "@babel/runtime" "^7.12.1" + "@types/react-redux" "^7.1.16" hoist-non-react-statics "^3.3.2" loose-envify "^1.4.0" prop-types "^15.7.2" react-is "^16.13.1" -react-resize-detector@^6.6.0: - version "6.6.4" - resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-6.6.4.tgz#704a6c985d666d119d833e908cc555b186cfea0c" - integrity sha512-sAAh8TmOp59MFs2HR7D1VGbAq+zL+2klQhFbkXOH5Gy/EBEyHGiWXWMStoB+axSYr/Xw54owg6QRGSFj3z0dew== +react-resize-detector@^6.6.3: + version "6.7.6" + resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-6.7.6.tgz#4416994e5ead7eba76606e3a248a1dfca49b67a3" + integrity sha512-/6RZlul1yePSoYJxWxmmgjO320moeLC/khrwpEVIL+D2EjLKhqOwzFv+H8laMbImVj7Zu4FlMa0oA7au3/ChjQ== dependencies: - "@types/resize-observer-browser" "^0.1.5" + "@types/resize-observer-browser" "^0.1.6" lodash.debounce "^4.0.8" lodash.throttle "^4.1.1" resize-observer-polyfill "^1.5.1" react-router-dom@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" - integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== + version "5.3.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.0.tgz#da1bfb535a0e89a712a93b97dd76f47ad1f32363" + integrity sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ== dependencies: - "@babel/runtime" "^7.1.2" + "@babel/runtime" "^7.12.13" history "^4.9.0" loose-envify "^1.3.1" prop-types "^15.6.2" - react-router "5.2.0" + react-router "5.2.1" tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.2.0, react-router@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" - integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== +react-router@5.2.1, react-router@^5.1.2: + version "5.2.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.1.tgz#4d2e4e9d5ae9425091845b8dbc6d9d276239774d" + integrity sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ== dependencies: - "@babel/runtime" "^7.1.2" + "@babel/runtime" "^7.12.13" history "^4.9.0" hoist-non-react-statics "^3.1.0" loose-envify "^1.3.1" @@ -9449,17 +9613,16 @@ react-router@5.2.0, react-router@^5.1.2: tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-smooth@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-1.0.6.tgz#18b964f123f7bca099e078324338cd8739346d0a" - integrity sha512-B2vL4trGpNSMSOzFiAul9kFAsxTukL9Wyy9EXtkQy3GJr6sZqW9e1nShdVOJ3hRYamPZ94O17r3Q0bjSw3UYtg== +react-smooth@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-2.0.0.tgz#561647b33e498b2e25f449b3c6689b2e9111bf91" + integrity sha512-wK4dBBR6P21otowgMT9toZk+GngMplGS1O5gk+2WSiHEXIrQgDvhR5IIlT74Vtu//qpTcipkgo21dD7a7AUNxw== dependencies: - lodash "~4.17.4" - prop-types "^15.6.0" + fast-equals "^2.0.0" raf "^3.4.0" - react-transition-group "^2.5.0" + react-transition-group "2.9.0" -react-transition-group@^2.5.0: +react-transition-group@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d" integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg== @@ -9470,9 +9633,9 @@ react-transition-group@^2.5.0: react-lifecycles-compat "^3.0.4" react-transition-group@^4.4.0: - version "4.4.1" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9" - integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw== + version "4.4.2" + resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470" + integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg== dependencies: "@babel/runtime" "^7.5.5" dom-helpers "^5.0.1" @@ -9542,7 +9705,7 @@ read-pkg@^3.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: +readable-stream@^3.0.6, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -9560,10 +9723,10 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" - integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" @@ -9574,31 +9737,32 @@ realpath-native@^1.1.0: dependencies: util.promisify "^1.0.0" -recharts-scale@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.4.tgz#8d6d1fce49cb617ee047601c6b261f3e5ca7f2c7" - integrity sha512-e7MCnuD1+gtY9N7TYxzB+QXvi4s30kvNqVbI1p5m4rf47GusEQaEHxi8zvlZkdOOZ90UhpGHcnkYlyYkUJ2JoQ== +recharts-scale@^0.4.4: + version "0.4.5" + resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.4.5.tgz#0969271f14e732e642fcc5bd4ab270d6e87dd1d9" + integrity sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w== dependencies: decimal.js-light "^2.4.1" recharts@^2.0.6: - version "2.0.8" - resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.0.8.tgz#54ff6c4fd4c9d38e4e6de53015f9ee1004a3a098" - integrity sha512-38Pc1Z3UaNdi+zv1O5CQs1vCv2ZHo8sZ2c8UaTFydNKNO07uNVc3411TYRDOqMj0SZCwhoEW7uTHNhWBTkPmaQ== + version "2.1.4" + resolved "https://registry.yarnpkg.com/recharts/-/recharts-2.1.4.tgz#8d21750e3bb01a909e01ebe5573c48d813c25287" + integrity sha512-ZKaLgUo4g84FhIiLeRq0uWMqe5GTjjJk+5fxmIt2H4cn279QZCMEsuVFmBqYedJcmX1URYEII5qb9pOppr5fJA== dependencies: + "@types/d3-interpolate" "^2.0.0" "@types/d3-scale" "^3.0.0" "@types/d3-shape" "^2.0.0" classnames "^2.2.5" - d3-interpolate "^2.0.1" - d3-scale "^3.2.3" + d3-interpolate "^2.0.0" + d3-scale "^3.0.0" d3-shape "^2.0.0" eventemitter3 "^4.0.1" lodash "^4.17.19" react-is "16.10.2" - react-resize-detector "^6.6.0" - react-smooth "^1.0.6" - recharts-scale "^0.4.2" - reduce-css-calc "^2.1.7" + react-resize-detector "^6.6.3" + react-smooth "^2.0.0" + recharts-scale "^0.4.4" + reduce-css-calc "^2.1.8" recursive-readdir@2.2.2: version "2.2.2" @@ -9607,7 +9771,7 @@ recursive-readdir@2.2.2: dependencies: minimatch "3.0.4" -reduce-css-calc@^2.1.7: +reduce-css-calc@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz#7ef8761a28d614980dc0c982f772c93f7a99de03" integrity sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg== @@ -9627,22 +9791,21 @@ redux-thunk@^2.3.0: resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622" integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw== -redux@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.5.tgz#4db5de5816e17891de8a80c424232d06f051d93f" - integrity sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w== +redux@^4.0.0, redux@^4.0.4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.1.1.tgz#76f1c439bb42043f985fbd9bf21990e60bd67f47" + integrity sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw== dependencies: - loose-envify "^1.4.0" - symbol-observable "^1.2.0" + "@babel/runtime" "^7.9.2" -regenerate-unicode-properties@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" - integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA== +regenerate-unicode-properties@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326" + integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA== dependencies: - regenerate "^1.4.0" + regenerate "^1.4.2" -regenerate@^1.4.0: +regenerate@^1.4.2: version "1.4.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== @@ -9653,9 +9816,9 @@ regenerator-runtime@^0.11.0: integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: - version "0.13.7" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" - integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== regenerator-transform@^0.14.2: version "0.14.5" @@ -9691,31 +9854,31 @@ regexpp@^2.0.1: integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== regexpp@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== regexpu-core@^4.7.1: - version "4.7.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6" - integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ== - dependencies: - regenerate "^1.4.0" - regenerate-unicode-properties "^8.2.0" - regjsgen "^0.5.1" - regjsparser "^0.6.4" - unicode-match-property-ecmascript "^1.0.4" - unicode-match-property-value-ecmascript "^1.2.0" - -regjsgen@^0.5.1: + version "4.8.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0" + integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^9.0.0" + regjsgen "^0.5.2" + regjsparser "^0.7.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.0.0" + +regjsgen@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== -regjsparser@^0.6.4: - version "0.6.7" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.7.tgz#c00164e1e6713c2e3ee641f1701c4b7aa0a7f86c" - integrity sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ== +regjsparser@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968" + integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ== dependencies: jsesc "~0.5.0" @@ -9730,20 +9893,20 @@ remove-trailing-separator@^1.0.1: integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= renderkid@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.5.tgz#483b1ac59c6601ab30a7a596a5965cabccfdd0a5" - integrity sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ== - dependencies: - css-select "^2.0.2" - dom-converter "^0.2" - htmlparser2 "^3.10.1" - lodash "^4.17.20" - strip-ansi "^3.0.0" + version "2.0.7" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609" + integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^3.0.1" repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.6.1: version "1.6.1" @@ -9872,7 +10035,7 @@ resolve@1.12.0: dependencies: path-parse "^1.0.6" -resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.18.1, resolve@^1.3.2, resolve@^1.8.1: +resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.8.1: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -9880,6 +10043,14 @@ resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.1 is-core-module "^2.2.0" path-parse "^1.0.6" +resolve@^2.0.0-next.3: + version "2.0.0-next.3" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" + integrity sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -9968,9 +10139,9 @@ run-queue@^1.0.0, run-queue@^1.0.3: aproba "^1.1.1" rxjs@^6.6.0: - version "6.6.6" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.6.tgz#14d8417aa5a07c5e633995b525e1e3c0dec03b70" - integrity sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg== + version "6.6.7" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" + integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== dependencies: tslib "^1.9.0" @@ -10079,9 +10250,9 @@ select-hose@^2.0.0: integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= selfsigned@^1.9.1: - version "1.10.8" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" - integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== + version "1.10.11" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.11.tgz#24929cd906fe0f44b6d01fb23999a739537acbe9" + integrity sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA== dependencies: node-forge "^0.10.0" @@ -10091,9 +10262,9 @@ semver-compare@^1.0.0: integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= semver-regex@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.2.tgz#34b4c0d361eef262e07199dbef316d0f2ab11807" - integrity sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.3.tgz#b2bcc6f97f63269f286994e297e229b6245d0dc3" + integrity sha512-Aqi54Mk9uYTjVexLnR67rTyBusmwd04cLkHy9hNvk3+G3nT2Oyg7E0l4XVbOaNwIvQ3hHeYxGcyEy+mKreyBFQ== "semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.7.1" @@ -10111,9 +10282,9 @@ semver@7.0.0: integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== semver@^7.3.2: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" @@ -10275,9 +10446,9 @@ side-channel@^1.0.4: object-inspect "^1.9.0" signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + version "3.0.5" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" + integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== simple-swizzle@^0.2.2: version "0.2.2" @@ -10389,9 +10560,9 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: urix "^0.1.0" source-map-support@^0.5.6, source-map-support@~0.5.12: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + version "0.5.20" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -10433,9 +10604,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" - integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ== + version "3.0.10" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" + integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA== spdy-transport@^3.0.0: version "3.0.0" @@ -10488,9 +10659,9 @@ sshpk@^1.7.0: tweetnacl "~0.14.0" ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== dependencies: figgy-pudding "^3.5.1" @@ -10500,9 +10671,9 @@ stable@^0.1.8: integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stack-utils@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.4.tgz#4b600971dcfc6aed0cbdf2a8268177cc916c87c8" - integrity sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w== + version "1.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" + integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== dependencies: escape-string-regexp "^2.0.0" @@ -10604,23 +10775,24 @@ string-width@^3.0.0, string-width@^3.1.0: strip-ansi "^5.1.0" string-width@^4.1.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" -string.prototype.matchall@^4.0.2: - version "4.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.4.tgz#608f255e93e072107f5de066f81a2dfb78cf6b29" - integrity sha512-pknFIWVachNcyqRfaQSeu/FUfpvJTe4uskUSZ9Wc1RijsPuzbZ8TyYT8WCNnntCjUEqQ3vUHMAfVj2+wLAisPQ== +string.prototype.matchall@^4.0.5: + version "4.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" + integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" - has-symbols "^1.0.1" + es-abstract "^1.19.1" + get-intrinsic "^1.1.1" + has-symbols "^1.0.2" internal-slot "^1.0.3" regexp.prototype.flags "^1.3.1" side-channel "^1.0.4" @@ -10664,7 +10836,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@6.0.0, strip-ansi@^6.0.0: +strip-ansi@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== @@ -10692,6 +10864,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -10777,11 +10956,6 @@ svgo@^1.0.0, svgo@^1.2.2: unquote "~1.1.1" util.promisify "~1.0.0" -symbol-observable@1.2.0, symbol-observable@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== - symbol-tree@^3.2.2: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -10880,9 +11054,9 @@ thunky@^1.0.2: integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== timeago-react@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/timeago-react/-/timeago-react-3.0.2.tgz#1bd8b86c37c93bcd6a4340fea340e6c9c2bdd4e0" - integrity sha512-K+NqoRcE13xv7lrmHtZmy7G+yXF8ZxmuwRK/EGKyT1chpI3zmV6YnB5o9+slnOCq1dXuQJknr/hWjINyP7C9LA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/timeago-react/-/timeago-react-3.0.4.tgz#291bc1a0bac4db922b7852e6f858da24dc41fd3a" + integrity sha512-cv6Bnm01VKyHoQCBKzk24+L9ycj3jLq3uEFpYILKGJT7UUXWEzC0TBCxforsvL4NSjcwqqHNKdEeqEFMNNoN2A== dependencies: timeago.js "^4.0.0" @@ -10926,9 +11100,9 @@ tmp@^0.0.33: os-tmpdir "~1.0.2" tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE= + version "1.0.5" + resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== to-arraybuffer@^1.0.0: version "1.0.1" @@ -11038,10 +11212,10 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== type-fest@^0.8.1: version "0.8.1" @@ -11061,7 +11235,7 @@ type@^1.0.1: resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== -type@^2.0.0: +type@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" integrity sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw== @@ -11072,9 +11246,9 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@^3.9.2: - version "3.9.9" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.9.tgz#e69905c54bc0681d0518bd4d587cc6f2d0b1a674" - integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w== + version "3.9.10" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" + integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== uglify-js@3.4.x: version "3.4.10" @@ -11084,38 +11258,38 @@ uglify-js@3.4.x: commander "~2.19.0" source-map "~0.6.1" -unbox-primitive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.0.tgz#eeacbc4affa28e9b3d36b5eaeccc50b3251b1d3f" - integrity sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA== +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== dependencies: function-bind "^1.1.1" - has-bigints "^1.0.0" - has-symbols "^1.0.0" - which-boxed-primitive "^1.0.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" -unicode-canonical-property-names-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" - integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== -unicode-match-property-ecmascript@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" - integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: - unicode-canonical-property-names-ecmascript "^1.0.4" - unicode-property-aliases-ecmascript "^1.0.4" + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" -unicode-match-property-value-ecmascript@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531" - integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ== +unicode-match-property-value-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714" + integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== -unicode-property-aliases-ecmascript@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4" - integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg== +unicode-property-aliases-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" + integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== union-value@^1.0.0: version "1.0.1" @@ -11206,9 +11380,9 @@ url-loader@2.1.0: schema-utils "^2.0.0" url-parse@^1.4.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz#d5fa9890af8a5e1f274a2c98376510f6425f6e3b" - integrity sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q== + version "1.5.3" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862" + integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ== dependencies: querystringify "^2.1.1" requires-port "^1.0.0" @@ -11331,6 +11505,11 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +void-elements@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-3.1.0.tgz#614f7fbf8d801f0bb5f0661f5b2f5785750e4f09" + integrity sha1-YU9/v42AHwu18GYfWy9XhXUOTwk= + w3c-hr-time@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" @@ -11535,7 +11714,7 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -which-boxed-primitive@^1.0.1: +which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== @@ -11771,16 +11950,16 @@ write@1.0.3: mkdirp "^0.5.1" ws@^5.2.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" - integrity sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA== + version "5.2.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.3.tgz#05541053414921bc29c63bee14b8b0dd50b07b3d" + integrity sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA== dependencies: async-limiter "~1.0.0" ws@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" - integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== + version "6.2.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e" + integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw== dependencies: async-limiter "~1.0.0" @@ -11805,9 +11984,9 @@ xtend@^4.0.0, xtend@~4.0.1: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== "y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== yallist@^3.0.2: version "3.1.1"