diff --git a/.prettierignore b/.prettierignore index 0d4222f5..ff7e524f 100644 --- a/.prettierignore +++ b/.prettierignore @@ -6,3 +6,27 @@ package.json .umi .umi-production .umi-test +.history +.tmp +node_modules +npm-debug.log* +yarn-error.log +yarn.lock +package-lock.json +static +data +DS_Store +src/.umi +src/.umi-production +src/.umi-test +.env.local +env +history +version.ts +config +log +db +manual_log +scripts +bak +.tmp \ No newline at end of file diff --git a/.umirc.ts b/.umirc.ts index 2c5f5cae..492d220a 100644 --- a/.umirc.ts +++ b/.umirc.ts @@ -5,6 +5,11 @@ const baseUrl = process.env.QlBaseUrl || '/'; export default defineConfig({ hash: true, antd: {}, + locale: { + antd: true, + title: true, + baseNavigator: true, + }, outputPath: 'static/dist', fastRefresh: true, favicons: [`https://qn.whyour.cn/favicon.svg`], diff --git a/back/api/log.ts b/back/api/log.ts index 5a82c031..797966a9 100644 --- a/back/api/log.ts +++ b/back/api/log.ts @@ -53,7 +53,7 @@ export default (app: Router) => { body: Joi.object({ filename: Joi.string().required(), path: Joi.string().allow(''), - type: Joi.string().optional() + type: Joi.string().optional(), }), }), async (req: Request, res: Response, next: NextFunction) => { @@ -65,7 +65,7 @@ export default (app: Router) => { }; const filePath = join(config.logPath, path, filename); if (type === 'directory') { - emptyDir(filePath); + emptyDir(filePath); } else { fs.unlinkSync(filePath); } @@ -75,5 +75,4 @@ export default (app: Router) => { } }, ); - }; diff --git a/back/api/system.ts b/back/api/system.ts index d291c712..f45ac035 100644 --- a/back/api/system.ts +++ b/back/api/system.ts @@ -35,9 +35,8 @@ export default (app: Router) => { try { const userService = Container.get(UserService); const authInfo = await userService.getUserInfo(); - const { version, changeLog, changeLogLink, publishTime } = await parseVersion( - config.versionFile, - ); + const { version, changeLog, changeLogLink, publishTime } = + await parseVersion(config.versionFile); let isInitialized = true; if ( diff --git a/back/config/subscription.ts b/back/config/subscription.ts index ffd71b2f..d6334c8c 100644 --- a/back/config/subscription.ts +++ b/back/config/subscription.ts @@ -34,9 +34,11 @@ export function formatCommand(doc: Subscription, url?: string) { if (type === 'file') { command += `raw "${_url}"`; } else { - command += `repo "${_url}" "${whitelist || ''}" "${blacklist || ''}" "${dependences || '' - }" "${branch || ''}" "${extensions || ''}" "${proxy || ''}" "${isNil(autoAddCron) ? true : Boolean(autoAddCron) - }" "${isNil(autoDelCron) ? true : Boolean(autoDelCron)}"`; + command += `repo "${_url}" "${whitelist || ''}" "${blacklist || ''}" "${ + dependences || '' + }" "${branch || ''}" "${extensions || ''}" "${proxy || ''}" "${ + isNil(autoAddCron) ? true : Boolean(autoAddCron) + }" "${isNil(autoDelCron) ? true : Boolean(autoDelCron)}"`; } return command; } diff --git a/back/data/auth.ts b/back/data/auth.ts index 0c0b2112..5f1dc6c3 100644 --- a/back/data/auth.ts +++ b/back/data/auth.ts @@ -39,12 +39,14 @@ export interface LoginLogInfo { address?: string; ip?: string; platform?: string; - status?: LoginStatus, + status?: LoginStatus; } -export type AuthModelInfo = SystemConfigInfo & Partial & LoginLogInfo; +export type AuthModelInfo = SystemConfigInfo & + Partial & + LoginLogInfo; -export interface AuthInstance extends Model, AuthInfo { } +export interface AuthInstance extends Model, AuthInfo {} export const AuthModel = sequelize.define('Auth', { ip: DataTypes.STRING, type: DataTypes.STRING, diff --git a/back/data/dependence.ts b/back/data/dependence.ts index c8d7eb60..05526b78 100644 --- a/back/data/dependence.ts +++ b/back/data/dependence.ts @@ -66,7 +66,7 @@ export enum unInstallDependenceCommandTypes { export interface DependenceInstance extends Model, - Dependence { } + Dependence {} export const DependenceModel = sequelize.define( 'Dependence', { diff --git a/back/loaders/initData.ts b/back/loaders/initData.ts index 678625d4..75ed464c 100644 --- a/back/loaders/initData.ts +++ b/back/loaders/initData.ts @@ -30,15 +30,15 @@ export default async () => { }); // 初始化更新所有任务状态为空闲 - await CrontabModel.update( - { status: CrontabStatus.idle }, - { where: {} }, - ); + await CrontabModel.update({ status: CrontabStatus.idle }, { where: {} }); // 初始化时安装所有处于安装中,安装成功,安装失败的依赖 DependenceModel.findAll({ where: {}, - order: [['type', 'DESC'], ['createdAt', 'DESC']], + order: [ + ['type', 'DESC'], + ['createdAt', 'DESC'], + ], raw: true, }).then(async (docs) => { await DependenceModel.update( diff --git a/back/loaders/initFile.ts b/back/loaders/initFile.ts index e076f425..ec0e03d8 100644 --- a/back/loaders/initFile.ts +++ b/back/loaders/initFile.ts @@ -5,7 +5,7 @@ import dotenv from 'dotenv'; import Logger from './logger'; import { fileExist } from '../config/util'; -const rootPath = process.env.QL_DIR as string;; +const rootPath = process.env.QL_DIR as string; const dataPath = path.join(rootPath, 'data/'); const configPath = path.join(dataPath, 'config/'); const scriptPath = path.join(dataPath, 'scripts/'); diff --git a/back/loaders/server.ts b/back/loaders/server.ts index 19123edf..31c3e387 100644 --- a/back/loaders/server.ts +++ b/back/loaders/server.ts @@ -30,7 +30,7 @@ export default async ({ server }: { server: Server }) => { Logger.error('Uncaught exception:', error); process.exit(1); }); - + process.on('unhandledRejection', (reason, promise) => { Logger.error('Unhandled rejection:', reason); process.exit(1); diff --git a/back/services/cron.ts b/back/services/cron.ts index 571ea287..ef1eb025 100644 --- a/back/services/cron.ts +++ b/back/services/cron.ts @@ -5,11 +5,7 @@ import { Crontab, CrontabModel, CrontabStatus } from '../data/cron'; import { exec, execSync } from 'child_process'; import fs from 'fs'; import cron_parser from 'cron-parser'; -import { - getFileContentByName, - fileExist, - killTask, -} from '../config/util'; +import { getFileContentByName, fileExist, killTask } from '../config/util'; import { promises, existsSync } from 'fs'; import { Op, where, col as colFn, FindOptions, fn } from 'sequelize'; import path from 'path'; @@ -20,7 +16,7 @@ import { spawn } from 'cross-spawn'; @Service() export default class CronService { - constructor(@Inject('logger') private logger: winston.Logger) { } + constructor(@Inject('logger') private logger: winston.Logger) {} private isSixCron(cron: Crontab) { const { schedule } = cron; @@ -508,10 +504,7 @@ export default class CronService { private make_command(tab: Crontab) { let command = tab.command.trim(); - if ( - !command.startsWith(TASK_PREFIX) && - !command.startsWith(QL_PREFIX) - ) { + if (!command.startsWith(TASK_PREFIX) && !command.startsWith(QL_PREFIX)) { command = `${TASK_PREFIX}${tab.command}`; } const crontab_job_string = `ID=${tab.id} ${command}`; diff --git a/back/services/cronView.ts b/back/services/cronView.ts index 941fe1cb..35bcc37e 100644 --- a/back/services/cronView.ts +++ b/back/services/cronView.ts @@ -32,7 +32,7 @@ export default class CronViewService { } public async update(payload: CrontabView): Promise { - const doc = await this.getDb({ id: payload.id }) + const doc = await this.getDb({ id: payload.id }); const tab = new CrontabView({ ...doc, ...payload }); const newDoc = await this.updateDb(tab); return newDoc; @@ -59,7 +59,9 @@ export default class CronViewService { } } - public async getDb(query: FindOptions['where']): Promise { + public async getDb( + query: FindOptions['where'], + ): Promise { const doc: any = await CrontabViewModel.findOne({ where: { ...query } }); return doc && (doc.get({ plain: true }) as CrontabView); } diff --git a/back/services/dependence.ts b/back/services/dependence.ts index 1acb37de..6ecee64d 100644 --- a/back/services/dependence.ts +++ b/back/services/dependence.ts @@ -23,7 +23,7 @@ export default class DependenceService { constructor( @Inject('logger') private logger: winston.Logger, private sockService: SockService, - ) { } + ) {} public async create(payloads: Dependence[]): Promise { const tabs = payloads.map((x) => { @@ -193,7 +193,9 @@ export default class DependenceService { const depVersionStr = versionDependenceCommandTypes[dependency.type]; let depVersion = ''; if (depName.includes(depVersionStr)) { - const symbolRegx = new RegExp(`(.*)${depVersionStr}([0-9\\.\\-\\+a-zA-Z]*)`); + const symbolRegx = new RegExp( + `(.*)${depVersionStr}([0-9\\.\\-\\+a-zA-Z]*)`, + ); const [, _depName, _depVersion] = depName.match(symbolRegx) || []; if (_depVersion && _depName) { depName = _depName; @@ -202,19 +204,23 @@ export default class DependenceService { } const isNodeDependence = dependency.type === DependenceTypes.nodejs; const isLinuxDependence = dependency.type === DependenceTypes.linux; - const isPythonDependence = dependency.type === DependenceTypes.python3; + const isPythonDependence = + dependency.type === DependenceTypes.python3; const depInfo = ( await promiseExecSuccess( isNodeDependence ? `${getCommandPrefix} | grep "${depName}" | head -1` : `${getCommandPrefix} ${depName}`, ) - ).replace(/\s{2,}/, ' ').replace(/\s+$/, ''); + ) + .replace(/\s{2,}/, ' ') + .replace(/\s+$/, ''); if ( depInfo && ((isNodeDependence && depInfo.split(' ')?.[0] === depName) || - (isLinuxDependence && depInfo.toLocaleLowerCase().includes('installed')) || + (isLinuxDependence && + depInfo.toLocaleLowerCase().includes('installed')) || isPythonDependence) && (!depVersion || depInfo.includes(depVersion)) ) { diff --git a/back/services/notify.ts b/back/services/notify.ts index 01d13329..0edaacf2 100644 --- a/back/services/notify.ts +++ b/back/services/notify.ts @@ -304,7 +304,8 @@ export default class NotificationService { } private async weWorkBot() { - const { weWorkBotKey, weWorkOrigin = 'https://qyapi.weixin.qq.com' } = this.params; + const { weWorkBotKey, weWorkOrigin = 'https://qyapi.weixin.qq.com' } = + this.params; const url = `${weWorkOrigin}/cgi-bin/webhook/send?key=${weWorkBotKey}`; try { const res: any = await got @@ -329,7 +330,8 @@ export default class NotificationService { } private async weWorkApp() { - const { weWorkAppKey, weWorkOrigin = 'https://qyapi.weixin.qq.com' } = this.params; + const { weWorkAppKey, weWorkOrigin = 'https://qyapi.weixin.qq.com' } = + this.params; const [corpid, corpsecret, touser, agentid, thumb_media_id = '1'] = weWorkAppKey.split(','); const url = `${weWorkOrigin}/cgi-bin/gettoken`; @@ -565,15 +567,17 @@ export default class NotificationService { private async pushMe() { const { pushMeKey } = this.params; try { - const res: any = await got - .post(`https://push.i-i.me/?push_key=${pushMeKey}`, { + const res: any = await got.post( + `https://push.i-i.me/?push_key=${pushMeKey}`, + { ...this.gotOption, json: { title: this.title, - content: this.content + content: this.content, }, headers: { 'Content-Type': 'application/json' }, - }); + }, + ); if (res.body === 'success') { return true; } else { diff --git a/back/services/schedule.ts b/back/services/schedule.ts index a0d157a9..88574729 100644 --- a/back/services/schedule.ts +++ b/back/services/schedule.ts @@ -42,7 +42,7 @@ export default class ScheduleService { private maxBuffer = 200 * 1024 * 1024; - constructor(@Inject('logger') private logger: winston.Logger) { } + constructor(@Inject('logger') private logger: winston.Logger) {} async runTask( command: string, @@ -109,7 +109,7 @@ export default class ScheduleService { await callbacks.onError?.(JSON.stringify(error)); } }); - }) + }); } async createCronTask( diff --git a/back/services/system.ts b/back/services/system.ts index 0d5ccc09..d36d5c72 100644 --- a/back/services/system.ts +++ b/back/services/system.ts @@ -36,7 +36,7 @@ export default class SystemService { @Inject('logger') private logger: winston.Logger, private scheduleService: ScheduleService, private sockService: SockService, - ) { } + ) {} public async getSystemConfig() { const doc = await this.getDb({ type: AuthDataType.systemConfig }); @@ -111,7 +111,7 @@ export default class SystemService { }, ); lastVersionContent = await parseContentVersion(result.body); - } catch (error) { } + } catch (error) {} if (!lastVersionContent) { lastVersionContent = currentVersionContent; @@ -256,7 +256,10 @@ export default class SystemService { public async exportData(res: Response) { try { - await tar.create({ gzip: true, file: config.dataTgzFile, cwd: config.rootPath }, ['data']) + await tar.create( + { gzip: true, file: config.dataTgzFile, cwd: config.rootPath }, + ['data'], + ); res.download(config.dataTgzFile); } catch (error: any) { return res.send({ code: 400, message: error.message }); diff --git a/back/services/user.ts b/back/services/user.ts index 2a12b606..c25a0c75 100644 --- a/back/services/user.ts +++ b/back/services/user.ts @@ -10,7 +10,13 @@ import config from '../config'; import * as fs from 'fs'; import jwt from 'jsonwebtoken'; import { authenticator } from '@otplib/preset-default'; -import { AuthDataType, AuthInfo, AuthModel, AuthModelInfo, LoginStatus } from '../data/auth'; +import { + AuthDataType, + AuthInfo, + AuthModel, + AuthModelInfo, + LoginStatus, +} from '../data/auth'; import { NotificationInfo } from '../data/notify'; import NotificationService from './notify'; import { Request } from 'express'; @@ -27,7 +33,7 @@ export default class UserService { @Inject('logger') private logger: winston.Logger, private scheduleService: ScheduleService, private sockService: SockService, - ) { } + ) {} public async login( payloads: { @@ -119,7 +125,8 @@ export default class UserService { }); await this.notificationService.notify( '登录通知', - `你于${dayjs(timestamp).format('YYYY-MM-DD HH:mm:ss')}在 ${address} ${req.platform + `你于${dayjs(timestamp).format('YYYY-MM-DD HH:mm:ss')}在 ${address} ${ + req.platform }端 登录成功,ip地址 ${ip}`, ); await this.getLoginLog(); @@ -147,7 +154,8 @@ export default class UserService { }); await this.notificationService.notify( '登录通知', - `你于${dayjs(timestamp).format('YYYY-MM-DD HH:mm:ss')}在 ${address} ${req.platform + `你于${dayjs(timestamp).format('YYYY-MM-DD HH:mm:ss')}在 ${address} ${ + req.platform }端 登录失败,ip地址 ${ip}`, ); await this.getLoginLog(); @@ -190,7 +198,9 @@ export default class UserService { where: { type: AuthDataType.loginLog }, }); if (docs && docs.length > 0) { - const result = docs.sort((a, b) => b.info!.timestamp! - a.info!.timestamp!); + const result = docs.sort( + (a, b) => b.info!.timestamp! - a.info!.timestamp!, + ); if (result.length > 100) { await AuthModel.destroy({ where: { id: result[result.length - 1].id }, diff --git a/back/shared/pLimit.ts b/back/shared/pLimit.ts index ffbe0cbb..822f3d91 100644 --- a/back/shared/pLimit.ts +++ b/back/shared/pLimit.ts @@ -1,6 +1,6 @@ -import pLimit from "p-limit"; +import pLimit from 'p-limit'; import os from 'os'; -import { AuthDataType, AuthModel } from "../data/auth"; +import { AuthDataType, AuthModel } from '../data/auth'; class TaskLimit { private oneLimit = pLimit(1); @@ -17,7 +17,9 @@ class TaskLimit { return; } await AuthModel.sync(); - const doc = await AuthModel.findOne({ where: { type: AuthDataType.systemConfig } }); + const doc = await AuthModel.findOne({ + where: { type: AuthDataType.systemConfig }, + }); if (doc?.info?.cronConcurrency) { this.cpuLimit = pLimit(doc?.info?.cronConcurrency); } diff --git a/back/shared/runCron.ts b/back/shared/runCron.ts index c9d2da9f..63ad84e1 100644 --- a/back/shared/runCron.ts +++ b/back/shared/runCron.ts @@ -1,5 +1,5 @@ import { spawn } from 'cross-spawn'; -import taskLimit from "./pLimit"; +import taskLimit from './pLimit'; import Logger from '../loaders/logger'; export function runCron(cmd: string): Promise { @@ -27,11 +27,9 @@ export function runCron(cmd: string): Promise { }); cp.on('close', async (code) => { - Logger.info( - `[任务退出] ${cmd} 进程id: ${cp.pid} 退出,退出码 ${code}`, - ); + Logger.info(`[任务退出] ${cmd} 进程id: ${cp.pid} 退出,退出码 ${code}`); resolve(); }); }); - }) -} \ No newline at end of file + }); +} diff --git a/package.json b/package.json index 6f2e3af2..78b3ca92 100644 --- a/package.json +++ b/package.json @@ -153,6 +153,7 @@ "react-dnd": "^14.0.2", "react-dnd-html5-backend": "^14.0.0", "react-dom": "18.2.0", + "react-intl-universal": "^2.6.21", "react-split-pane": "^0.1.92", "sockjs-client": "^1.6.0", "ts-node": "^10.6.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b0ec5c74..0d051739 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -291,6 +291,9 @@ devDependencies: react-dom: specifier: 18.2.0 version: 18.2.0(react@18.2.0) + react-intl-universal: + specifier: ^2.6.21 + version: 2.6.21(react@18.2.0) react-split-pane: specifier: ^0.1.92 version: 0.1.92(react-dom@18.2.0)(react@18.2.0) @@ -900,6 +903,13 @@ packages: '@babel/highlight': 7.18.6 dev: true + /@babel/code-frame@7.22.5: + resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.5 + dev: true + /@babel/compat-data@7.22.3: resolution: {integrity: sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==} engines: {node: '>=6.9.0'} @@ -910,20 +920,20 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.5 '@babel/generator': 7.22.3 '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.21.0) '@babel/helper-module-transforms': 7.22.1 '@babel/helpers': 7.22.3 - '@babel/parser': 7.22.4 - '@babel/template': 7.21.9 + '@babel/parser': 7.22.7 + '@babel/template': 7.22.5 '@babel/traverse': 7.22.4 - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 - semver: 6.3.0 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true @@ -946,7 +956,7 @@ packages: debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 - semver: 6.3.0 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true @@ -967,7 +977,7 @@ packages: '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 eslint: 8.35.0 eslint-visitor-keys: 2.1.0 - semver: 6.3.0 + semver: 6.3.1 dev: true /@babel/generator@7.22.3: @@ -987,11 +997,18 @@ packages: '@babel/types': 7.22.4 dev: true + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + /@babel/helper-builder-binary-assignment-operator-visitor@7.22.3: resolution: {integrity: sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 dev: true /@babel/helper-compilation-targets@7.22.1(@babel/core@7.21.0): @@ -1008,7 +1025,7 @@ packages: '@babel/helper-validator-option': 7.21.0 browserslist: 4.21.7 lru-cache: 5.1.1 - semver: 6.3.0 + semver: 6.3.1 dev: true /@babel/helper-compilation-targets@7.22.1(@babel/core@7.22.1): @@ -1025,7 +1042,7 @@ packages: '@babel/helper-validator-option': 7.21.0 browserslist: 4.21.7 lru-cache: 5.1.1 - semver: 6.3.0 + semver: 6.3.1 dev: true /@babel/helper-create-class-features-plugin@7.22.1(@babel/core@7.22.1): @@ -1043,12 +1060,31 @@ packages: '@babel/helper-function-name': 7.21.0 '@babel/helper-member-expression-to-functions': 7.22.3 '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.22.1 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.1) '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - '@babel/helper-split-export-declaration': 7.18.6 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 + dev: true + + /@babel/helper-create-class-features-plugin@7.22.9(@babel/core@7.22.1): + resolution: {integrity: sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + dependencies: + '@babel/core': 7.22.1 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.1) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + semver: 6.3.1 dev: true /@babel/helper-create-regexp-features-plugin@7.22.1(@babel/core@7.22.1): @@ -1061,9 +1097,9 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-annotate-as-pure': 7.22.5 regexpu-core: 5.3.2 - semver: 6.3.0 + semver: 6.3.1 dev: true /@babel/helper-define-polyfill-provider@0.4.0(@babel/core@7.22.1): @@ -1076,11 +1112,11 @@ packages: dependencies: '@babel/core': 7.22.1 '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.2 - semver: 6.3.0 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true @@ -1090,33 +1126,53 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-environment-visitor@7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-function-name@7.21.0: resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.21.9 - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-function-name@7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 dev: true /@babel/helper-hoist-variables@7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 dev: true /@babel/helper-member-expression-to-functions@7.22.3: resolution: {integrity: sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-member-expression-to-functions@7.22.5: + resolution: {integrity: sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 dev: true /@babel/helper-module-imports@7.21.4: resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 dev: true /@babel/helper-module-transforms@7.22.1: @@ -1126,7 +1182,7 @@ packages: '@babel/helper-environment-visitor': 7.22.1 '@babel/helper-module-imports': 7.21.4 '@babel/helper-simple-access': 7.21.5 - '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.19.1 '@babel/template': 7.21.9 '@babel/traverse': 7.22.4 @@ -1139,7 +1195,14 @@ packages: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-optimise-call-expression@7.22.5: + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 dev: true /@babel/helper-plugin-utils@7.21.5: @@ -1147,6 +1210,11 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.22.1): resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} @@ -1157,47 +1225,55 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.22.1 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 '@babel/helper-wrap-function': 7.20.5 - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-replace-supers@7.22.1: - resolution: {integrity: sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==} + /@babel/helper-replace-supers@7.22.9(@babel/core@7.22.1): + resolution: {integrity: sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true dependencies: - '@babel/helper-environment-visitor': 7.22.1 - '@babel/helper-member-expression-to-functions': 7.22.3 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/template': 7.21.9 - '@babel/traverse': 7.22.4 - '@babel/types': 7.22.4 - transitivePeerDependencies: - - supports-color + '@babel/core': 7.22.1 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 dev: true /@babel/helper-simple-access@7.21.5: resolution: {integrity: sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 dev: true /@babel/helper-skip-transparent-expression-wrappers@7.20.0: resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 dev: true - /@babel/helper-split-export-declaration@7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + /@babel/helper-skip-transparent-expression-wrappers@7.22.5: + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 dev: true /@babel/helper-string-parser@7.21.5: @@ -1205,11 +1281,21 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-identifier@7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} dev: true + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-option@7.21.0: resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==} engines: {node: '>=6.9.0'} @@ -1219,10 +1305,10 @@ packages: resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.21.0 - '@babel/template': 7.21.9 + '@babel/helper-function-name': 7.22.5 + '@babel/template': 7.22.5 '@babel/traverse': 7.22.4 - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 transitivePeerDependencies: - supports-color dev: true @@ -1247,6 +1333,15 @@ packages: js-tokens: 4.0.0 dev: true + /@babel/highlight@7.22.5: + resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + /@babel/parser@7.22.4: resolution: {integrity: sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==} engines: {node: '>=6.0.0'} @@ -1255,6 +1350,14 @@ packages: '@babel/types': 7.22.4 dev: true + /@babel/parser@7.22.7: + resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.5 + dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.22.1): resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} @@ -1265,7 +1368,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.3(@babel/core@7.22.1): @@ -1278,7 +1381,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 '@babel/plugin-transform-optional-chaining': 7.22.3(@babel/core@7.22.1) dev: true @@ -1293,7 +1396,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.1): @@ -1308,8 +1411,6 @@ packages: '@babel/core': 7.22.1 '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) '@babel/helper-plugin-utils': 7.21.5 - transitivePeerDependencies: - - supports-color dev: true /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.22.1): @@ -1340,11 +1441,9 @@ packages: dependencies: '@babel/core': 7.22.1 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.1) - transitivePeerDependencies: - - supports-color dev: true /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.22.1): @@ -1358,7 +1457,7 @@ packages: dependencies: '@babel/core': 7.22.1 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.1): @@ -1370,7 +1469,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-bigint@7.8.3: @@ -1381,7 +1480,7 @@ packages: '@babel/core': optional: true dependencies: - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.1): @@ -1393,7 +1492,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.1): @@ -1406,7 +1505,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.1): @@ -1430,7 +1529,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.22.1): @@ -1443,7 +1542,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-import-attributes@7.22.3(@babel/core@7.22.1): @@ -1456,7 +1555,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.1): @@ -1468,7 +1567,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.1): @@ -1480,7 +1579,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.22.1): @@ -1493,7 +1592,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.1): @@ -1505,7 +1604,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.1): @@ -1517,7 +1616,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.1): @@ -1529,7 +1628,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.1): @@ -1541,7 +1640,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.1): @@ -1553,7 +1652,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.1): @@ -1565,7 +1664,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.1): @@ -1578,7 +1677,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.1): @@ -1591,7 +1690,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.22.1): @@ -1618,7 +1717,7 @@ packages: dependencies: '@babel/core': 7.22.1 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-arrow-functions@7.21.5(@babel/core@7.22.1): @@ -1631,7 +1730,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-async-generator-functions@7.22.3(@babel/core@7.22.1): @@ -1645,7 +1744,7 @@ packages: dependencies: '@babel/core': 7.22.1 '@babel/helper-environment-visitor': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.22.1) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.1) transitivePeerDependencies: @@ -1663,7 +1762,7 @@ packages: dependencies: '@babel/core': 7.22.1 '@babel/helper-module-imports': 7.21.4 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.22.1) transitivePeerDependencies: - supports-color @@ -1679,7 +1778,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.22.1): @@ -1692,7 +1791,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-class-properties@7.22.3(@babel/core@7.22.1): @@ -1705,10 +1804,8 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) - '@babel/helper-plugin-utils': 7.21.5 - transitivePeerDependencies: - - supports-color + '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-class-static-block@7.22.3(@babel/core@7.22.1): @@ -1721,11 +1818,9 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.1) - transitivePeerDependencies: - - supports-color dev: true /@babel/plugin-transform-classes@7.21.0(@babel/core@7.22.1): @@ -1743,12 +1838,10 @@ packages: '@babel/helper-environment-visitor': 7.22.1 '@babel/helper-function-name': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.21.5 - '@babel/helper-replace-supers': 7.22.1 - '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.1) + '@babel/helper-split-export-declaration': 7.22.6 globals: 11.12.0 - transitivePeerDependencies: - - supports-color dev: true /@babel/plugin-transform-computed-properties@7.21.5(@babel/core@7.22.1): @@ -1761,7 +1854,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/template': 7.21.9 dev: true @@ -1775,7 +1868,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.22.1): @@ -1789,7 +1882,7 @@ packages: dependencies: '@babel/core': 7.22.1 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.22.1): @@ -1802,7 +1895,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-dynamic-import@7.22.1(@babel/core@7.22.1): @@ -1815,7 +1908,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.1) dev: true @@ -1830,7 +1923,7 @@ packages: dependencies: '@babel/core': 7.22.1 '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.3 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-export-namespace-from@7.22.3(@babel/core@7.22.1): @@ -1843,7 +1936,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.1) dev: true @@ -1857,7 +1950,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.22.1): @@ -1871,8 +1964,8 @@ packages: dependencies: '@babel/core': 7.22.1 '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) - '@babel/helper-function-name': 7.21.0 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-json-strings@7.22.3(@babel/core@7.22.1): @@ -1885,7 +1978,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.1) dev: true @@ -1899,7 +1992,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-logical-assignment-operators@7.22.3(@babel/core@7.22.1): @@ -1912,7 +2005,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.1) dev: true @@ -1926,7 +2019,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.22.1): @@ -1940,7 +2033,7 @@ packages: dependencies: '@babel/core': 7.22.1 '@babel/helper-module-transforms': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color dev: true @@ -1955,7 +2048,7 @@ packages: optional: true dependencies: '@babel/helper-module-transforms': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.21.5 transitivePeerDependencies: - supports-color @@ -1972,7 +2065,7 @@ packages: dependencies: '@babel/core': 7.22.1 '@babel/helper-module-transforms': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-simple-access': 7.21.5 transitivePeerDependencies: - supports-color @@ -1990,7 +2083,7 @@ packages: '@babel/core': 7.22.1 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-module-transforms': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-identifier': 7.19.1 transitivePeerDependencies: - supports-color @@ -2007,7 +2100,7 @@ packages: dependencies: '@babel/core': 7.22.1 '@babel/helper-module-transforms': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 transitivePeerDependencies: - supports-color dev: true @@ -2023,7 +2116,7 @@ packages: dependencies: '@babel/core': 7.22.1 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-new-target@7.22.3(@babel/core@7.22.1): @@ -2036,7 +2129,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-nullish-coalescing-operator@7.22.3(@babel/core@7.22.1): @@ -2049,7 +2142,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.1) dev: true @@ -2063,7 +2156,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.1) dev: true @@ -2079,7 +2172,7 @@ packages: '@babel/compat-data': 7.22.3 '@babel/core': 7.22.1 '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1) - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.1) '@babel/plugin-transform-parameters': 7.22.3(@babel/core@7.22.1) dev: true @@ -2094,10 +2187,8 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 - '@babel/helper-replace-supers': 7.22.1 - transitivePeerDependencies: - - supports-color + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-replace-supers': 7.22.9(@babel/core@7.22.1) dev: true /@babel/plugin-transform-optional-catch-binding@7.22.3(@babel/core@7.22.1): @@ -2110,7 +2201,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.1) dev: true @@ -2124,8 +2215,8 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.1) dev: true @@ -2139,7 +2230,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-private-methods@7.22.3(@babel/core@7.22.1): @@ -2152,10 +2243,8 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) - '@babel/helper-plugin-utils': 7.21.5 - transitivePeerDependencies: - - supports-color + '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-private-property-in-object@7.22.3(@babel/core@7.22.1): @@ -2168,12 +2257,10 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.9(@babel/core@7.22.1) + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.1) - transitivePeerDependencies: - - supports-color dev: true /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.22.1): @@ -2186,7 +2273,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.22.1): @@ -2199,7 +2286,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.22.1): @@ -2225,7 +2312,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-react-jsx-source@7.19.6(@babel/core@7.22.1): @@ -2238,7 +2325,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-react-jsx@7.22.3(@babel/core@7.22.1): @@ -2251,11 +2338,11 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.21.4 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.22.1) - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 dev: true /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.22.1): @@ -2268,8 +2355,8 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-regenerator@7.21.5(@babel/core@7.22.1): @@ -2282,7 +2369,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 regenerator-transform: 0.15.1 dev: true @@ -2296,7 +2383,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.22.1): @@ -2309,7 +2396,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-spread@7.20.7(@babel/core@7.22.1): @@ -2322,8 +2409,8 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 dev: true /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.22.1): @@ -2336,7 +2423,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.22.1): @@ -2349,7 +2436,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.22.1): @@ -2362,7 +2449,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-typescript@7.22.3(@babel/core@7.22.1): @@ -2379,8 +2466,6 @@ packages: '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1) '@babel/helper-plugin-utils': 7.21.5 '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.22.1) - transitivePeerDependencies: - - supports-color dev: true /@babel/plugin-transform-unicode-escapes@7.21.5(@babel/core@7.22.1): @@ -2393,7 +2478,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-unicode-property-regex@7.22.3(@babel/core@7.22.1): @@ -2407,7 +2492,7 @@ packages: dependencies: '@babel/core': 7.22.1 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.22.1): @@ -2421,7 +2506,7 @@ packages: dependencies: '@babel/core': 7.22.1 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-transform-unicode-sets-regex@7.22.3(@babel/core@7.22.1): @@ -2435,7 +2520,7 @@ packages: dependencies: '@babel/core': 7.22.1 '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1) - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/preset-env@7.22.4(@babel/core@7.22.1): @@ -2527,7 +2612,7 @@ packages: babel-plugin-polyfill-corejs3: 0.8.1(@babel/core@7.22.1) babel-plugin-polyfill-regenerator: 0.5.0(@babel/core@7.22.1) core-js-compat: 3.30.2 - semver: 6.3.0 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true @@ -2541,10 +2626,10 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.22.1) '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.22.1) - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 esutils: 2.0.3 dev: true @@ -2558,7 +2643,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.21.0 '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.22.1) '@babel/plugin-transform-react-jsx': 7.22.3(@babel/core@7.22.1) @@ -2576,7 +2661,7 @@ packages: optional: true dependencies: '@babel/core': 7.22.1 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@babel/helper-validator-option': 7.21.0 '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.22.1) '@babel/plugin-transform-modules-commonjs': 7.21.5(@babel/core@7.22.1) @@ -2612,6 +2697,15 @@ packages: '@babel/types': 7.22.4 dev: true + /@babel/template@7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + dev: true + /@babel/traverse@7.22.4: resolution: {integrity: sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==} engines: {node: '>=6.9.0'} @@ -2621,7 +2715,7 @@ packages: '@babel/helper-environment-visitor': 7.22.1 '@babel/helper-function-name': 7.21.0 '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.22.4 '@babel/types': 7.22.4 debug: 4.3.4 @@ -2639,6 +2733,15 @@ packages: to-fast-properties: 2.0.0 dev: true + /@babel/types@7.22.5: + resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + dev: true + /@bloomberg/record-tuple-polyfill@0.0.4: resolution: {integrity: sha512-h0OYmPR3A5Dfbetra/GzxBAzQk8sH7LhRkRUTdagX6nrtlUgJGYCTv4bBK33jsTQw9HDd8PE2x1Ma+iRKEDUsw==} dev: true @@ -4034,7 +4137,7 @@ packages: resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} engines: {node: '>=10'} dependencies: - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 entities: 4.5.0 dev: true @@ -4151,8 +4254,8 @@ packages: /@types/babel__core@7.20.1: resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} dependencies: - '@babel/parser': 7.22.4 - '@babel/types': 7.22.4 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.20.1 @@ -4161,20 +4264,20 @@ packages: /@types/babel__generator@7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 dev: true /@types/babel__template@7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.22.4 - '@babel/types': 7.22.4 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 dev: true /@types/babel__traverse@7.20.1: resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} dependencies: - '@babel/types': 7.22.4 + '@babel/types': 7.22.5 dev: true /@types/body-parser@1.19.2: @@ -5920,7 +6023,7 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.21.5 + '@babel/helper-plugin-utils': 7.22.5 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -5933,8 +6036,8 @@ packages: resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.21.9 - '@babel/types': 7.22.4 + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 '@types/babel__core': 7.20.1 '@types/babel__traverse': 7.20.1 dev: true @@ -5958,7 +6061,7 @@ packages: '@babel/compat-data': 7.22.3 '@babel/core': 7.22.1 '@babel/helper-define-polyfill-provider': 0.4.0(@babel/core@7.22.1) - semver: 6.3.0 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true @@ -6000,7 +6103,7 @@ packages: styled-components: optional: true dependencies: - '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.21.4 babel-plugin-syntax-jsx: 6.18.0 lodash: 4.17.21 @@ -6701,6 +6804,11 @@ packages: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} dev: false + /cookie@0.3.1: + resolution: {integrity: sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==} + engines: {node: '>= 0.6'} + dev: true + /cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} @@ -7745,7 +7853,7 @@ packages: object.values: 1.1.6 prop-types: 15.8.1 resolve: 2.0.0-next.4 - semver: 6.3.0 + semver: 6.3.1 string.prototype.matchall: 4.0.8 dev: true @@ -8240,7 +8348,7 @@ packages: webpack: optional: true dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.5 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 7.1.0 @@ -9387,10 +9495,10 @@ packages: engines: {node: '>=8'} dependencies: '@babel/core': 7.22.1 - '@babel/parser': 7.22.4 + '@babel/parser': 7.22.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 - semver: 6.3.0 + semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true @@ -9984,7 +10092,7 @@ packages: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: - semver: 6.3.0 + semver: 6.3.1 dev: false /make-error@1.3.6: @@ -10914,7 +11022,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.21.4 + '@babel/code-frame': 7.22.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -12926,6 +13034,26 @@ packages: shallowequal: 1.1.0 dev: true + /react-intl-universal@2.6.21(react@18.2.0): + resolution: {integrity: sha512-JJqZMzdB6jd4f0NfGRc9XM/pZElxtrDCWC9pE2yIesDO70SL+jQgaFAucQmstPwYqCcjvLpCgOrjP7cIo4kJnw==} + requiresBuild: true + peerDependencies: + react: '*' + peerDependenciesMeta: + react: + optional: true + dependencies: + cookie: 0.3.1 + escape-html: 1.0.3 + intl: 1.2.5 + intl-messageformat: 7.8.4 + invariant: 2.2.4 + lodash.merge: 4.6.2 + object-keys: 1.1.1 + querystring: 0.2.0 + react: 18.2.0 + dev: true + /react-intl@3.12.1(react@18.2.0): resolution: {integrity: sha512-cgumW29mwROIqyp8NXStYsoIm27+8FqnxykiLSawWjOxGIBeLuN/+p2srei5SRIumcJefOkOIHP+NDck05RgHg==} peerDependencies: @@ -13512,8 +13640,8 @@ packages: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true /semver@7.0.0: diff --git a/src/app.ts b/src/app.ts index 669b2cc2..4339670e 100644 --- a/src/app.ts +++ b/src/app.ts @@ -1,4 +1,19 @@ const baseUrl = window.__ENV__QlBaseUrl || '/'; +import intl from 'react-intl-universal'; + +export function rootContainer(container: any) { + const locales = { + 'en-US': require('./locales/en-US.json'), + 'zh-CN': require('./locales/zh-CN.json'), + }; + let currentLocale = intl.determineLocale({ + urlLocaleKey: 'lang', + cookieLocaleKey: 'lang', + }); + + intl.init({ currentLocale, locales }); + return container; +} export function modifyClientRenderOpts(memo: any) { return { diff --git a/src/components/copy.tsx b/src/components/copy.tsx index 88459c2f..2070d9da 100644 --- a/src/components/copy.tsx +++ b/src/components/copy.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useRef, useState, useEffect } from 'react'; import { Tooltip, Typography } from 'antd'; import { CopyOutlined, CheckOutlined } from '@ant-design/icons'; @@ -28,7 +29,10 @@ const Copy = ({ text }: { text: string }) => { return ( - + {copied ? : } diff --git a/src/components/tag.tsx b/src/components/tag.tsx index 8c87e210..f9b5db51 100644 --- a/src/components/tag.tsx +++ b/src/components/tag.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import { Tag, Input } from 'antd'; import { TweenOneGroup } from 'rc-tween-one'; import { PlusOutlined } from '@ant-design/icons'; @@ -101,7 +102,7 @@ const EditableTagGroup = ({ onClick={showInput} style={{ borderStyle: 'dashed', cursor: 'pointer' }} > - 新建 + {intl.get('新建')} )} diff --git a/src/layouts/defaultProps.tsx b/src/layouts/defaultProps.tsx index af278c73..c747b11e 100644 --- a/src/layouts/defaultProps.tsx +++ b/src/layouts/defaultProps.tsx @@ -1,14 +1,5 @@ -import { - FormOutlined, - FieldTimeOutlined, - DiffOutlined, - SettingOutlined, - CodeOutlined, - FolderOutlined, - RadiusSettingOutlined, - ControlOutlined, - ContainerOutlined, -} from '@ant-design/icons'; +import intl from 'react-intl-universal'; +import { SettingOutlined } from '@ant-design/icons'; import IconFont from '@/components/iconfont'; import { BasicLayoutProps } from '@ant-design/pro-layout'; @@ -16,74 +7,74 @@ export default { route: { routes: [ { - name: '登录', + name: intl.get('登录'), path: '/login', hideInMenu: true, component: '@/pages/login/index', }, { - name: '初始化', + name: intl.get('初始化'), path: '/initialization', hideInMenu: true, component: '@/pages/initialization/index', }, { - name: '错误', + name: intl.get('错误'), path: '/error', hideInMenu: true, component: '@/pages/error/index', }, { path: '/crontab', - name: '定时任务', + name: intl.get('定时任务'), icon: , component: '@/pages/crontab/index', }, { path: '/subscription', - name: '订阅管理', + name: intl.get('订阅管理'), icon: , component: '@/pages/subscription/index', }, { path: '/env', - name: '环境变量', + name: intl.get('环境变量'), icon: , component: '@/pages/env/index', }, { path: '/config', - name: '配置文件', + name: intl.get('配置文件'), icon: , component: '@/pages/config/index', }, { path: '/script', - name: '脚本管理', + name: intl.get('脚本管理'), icon: , component: '@/pages/script/index', }, { path: '/dependence', - name: '依赖管理', + name: intl.get('依赖管理'), icon: , component: '@/pages/dependence/index', }, { path: '/log', - name: '日志管理', + name: intl.get('日志管理'), icon: , component: '@/pages/log/index', }, { path: '/diff', - name: '对比工具', + name: intl.get('对比工具'), icon: , component: '@/pages/diff/index', }, { path: '/setting', - name: '系统设置', + name: intl.get('系统设置'), icon: , component: '@/pages/password/index', }, diff --git a/src/layouts/index.less b/src/layouts/index.less index dbe2038f..2bb91c06 100644 --- a/src/layouts/index.less +++ b/src/layouts/index.less @@ -332,6 +332,8 @@ select:-webkit-autofill:focus { } .ant-pro-sider-logo { + padding-inline: 8px !important; + .title { display: flex; height: 32px; diff --git a/src/layouts/index.tsx b/src/layouts/index.tsx index 0a385d12..fa74f436 100644 --- a/src/layouts/index.tsx +++ b/src/layouts/index.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useEffect, useState, useRef } from 'react'; import ProLayout, { PageLoading } from '@ant-design/pro-layout'; import * as DarkReader from '@umijs/ssr-darkreader'; @@ -264,7 +265,7 @@ export default function () { const menu: MenuProps = { items: [ { - label: '退出登录', + label: intl.get('退出登录'), className: 'side-menu-user-drop-menu', onClick: logout, key: 'logout', @@ -283,7 +284,7 @@ export default function () { <>
- 青龙 + {intl.get('青龙')} { const title = - (config.documentTitleMap as any)[location.pathname] || '未找到'; - return `${title} - 青龙`; + (config.documentTitleMap as any)[location.pathname] || + intl.get('未找到'); + return `${title} - ${intl.get('青龙')}`; }} onCollapse={setCollapsed} collapsed={collapsed} diff --git a/src/locales/en-US.json b/src/locales/en-US.json new file mode 100644 index 00000000..3d05e4df --- /dev/null +++ b/src/locales/en-US.json @@ -0,0 +1,396 @@ +{ + "复制成功": "Copy successful", + "复制": "Copy", + "新建": "New", + "登录": "Login", + "初始化": "Initialize", + "错误": "Error", + "定时任务": "Scheduled Tasks", + "订阅管理": "Subscription Management", + "环境变量": "Environment Variables", + "配置文件": "Configuration Files", + "脚本管理": "Script Management", + "依赖管理": "Dependency Management", + "日志管理": "Log Management", + "对比工具": "Comparison Tool", + "系统设置": "System Settings", + "退出登录": "Logout", + "青龙": "Qinglong", + "返回首页": "Return to Home", + "保存": "Save", + "日志": "Log", + "脚本": "Script", + "确认保存文件": "Confirm to Save File", + ",保存后不可恢复": ", it can't be recovered after saving.", + "确认运行": "Confirm to Run", + "确认运行定时任务": "Confirm to Run Scheduled Task", + "吗": "?", + "确认停止": "Confirm to Stop", + "确认停止定时任务": "Confirm to Stop Scheduled Task", + "确认": "Confirm", + "任务": "Task", + "状态": "Status", + "空闲中": "Idle", + "运行中": "Running", + "队列中": "In Queue", + "已禁用": "Disabled", + "定时": "Schedule", + "最后运行时间": "Last Run Time", + "最后运行时长": "Last Run Duration", + "下次运行时间": "Next Run Time", + "名称": "Name", + "命令/脚本": "Command/Script", + "定时规则": "Schedule Rule", + "操作": "Action", + "确认删除": "Confirm to Delete", + "确认删除定时任务": "Confirm to Delete Scheduled Task", + "编辑": "Edit", + "删除": "Delete", + "确认删除选中的定时任务吗": "Confirm to delete the selected scheduled tasks?", + "选中的定时任务吗": "selected scheduled tasks?", + "创建视图": "Create View", + "视图管理": "View Management", + "请输入名称或者关键词": "Please enter a name or keyword", + "创建任务": "Create Task", + "更多": "More", + "批量删除": "Batch Delete", + "批量启用": "Batch Enable", + "批量禁用": "Batch Disable", + "批量运行": "Batch Run", + "批量停止": "Batch Stop", + "批量置顶": "Batch Top", + "批量取消置顶": "Batch Un-top", + "批量修改标签": "Batch Modify Tags", + "已选择": "Selected", + "项": "items", + "知道了": "Got it", + "请输入任务名称": "Please enter the task name", + "支持输入脚本路径/任意系统可执行命令/task 脚本路径": "Supports input of script paths / any system executable commands / task script paths", + "秒(可选) 分 时 天 月 周": "Seconds (optional) Minutes Hours Day Month Week", + "标签": "Tags", + "取消": "Cancel", + "添加": "Add", + "启用": "Enable", + "禁用": "Disable", + "运行": "Run", + "停止": "Stop", + "置顶": "Top", + "取消置顶": "Un-top", + "命令": "Command", + "包含": "Include", + "不包含": "Exclude", + "属于": "Belong to", + "不属于": "Not Belong to", + "顺序": "Order", + "倒序": "Reverse", + "且": "And", + "或": "Or", + "输入后回车增加自定义选项": "Press Enter to add custom options", + "视图名称": "View Name", + "请输入视图名称": "Please enter the view name", + "请输入内容": "Please enter the content", + "新增筛选条件": "Add Filter", + "新增排序方式": "Add Sort", + "类型": "Type", + "显示": "Display", + "确认删除视图": "Confirm to delete the view", + "安装中": "Installing", + "已安装": "Installed", + "安装失败": "Installation Failed", + "删除中": "Deleting", + "已删除": "Deleted", + "删除失败": "Deletion Failed", + "序号": "Number", + "备注": "Remarks", + "更新时间": "Update Time", + "创建时间": "Creation Time", + "确认删除依赖": "Confirm to delete the dependency", + "确认重新安装": "Confirm to reinstall", + "确认删除选中的依赖吗": "Confirm to delete the selected dependencies?", + "确认重新安装选中的依赖吗": "Confirm to reinstall the selected dependencies?", + "请输入名称": "Please enter a name", + "创建依赖": "Create Dependency", + "批量安装": "Batch Install", + "批量强制删除": "Batch Force Delete", + "日志 -": "Log -", + "依赖类型": "Dependency Type", + "自动拆分": "Auto Split", + "多个依赖是否换行分割": "Whether to separate multiple dependencies with new lines", + "是": "Yes", + "否": "No", + "请输入依赖名称,支持指定版本": "Please enter the dependency name, version specification is supported", + "请输入依赖名称": "Please enter the dependency name", + "请输入备注": "Please enter remarks", + "源文件": "Source File", + "当前文件": "Current File", + "修改环境变量名称": "Modify Environment Variable Name", + "请输入新的环境变量名称": "Please enter the new environment variable name", + "已启用": "Enabled", + "值": "Value", + "确认删除变量": "Confirm to delete the variable", + "确认删除选中的变量吗": "Confirm to delete the selected variables?", + "选中的变量吗": "selected variables?", + "请输入名称/值/备注": "Please enter name/value/remarks", + "导入": "Import", + "创建变量": "Create Variable", + "批量修改变量名称": "Batch Modify Variable Names", + "批量导出": "Batch Export", + "请输入环境变量名称": "Please enter the environment variable name", + "只能输入字母数字下划线,且不能以数字开头": "Only letters, numbers, and underscores are allowed, and cannot start with a number", + "请输入环境变量值": "Please enter the environment variable value", + "服务启动超时": "Service startup timeout", + "请先按如下方式修复:": "Please fix it as follows:", + "1. 宿主机执行 docker run --rm -v\n /var/run/docker.sock:/var/run/docker.sock\n containrrr/watchtower -cR <容器名>": "1. Execute 'docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower -cR ' on the host machine", + "2. 容器内执行 ql -l check、ql -l update": "2. Execute 'ql -l check' and 'ql -l update' inside the container", + "3. 如果无法解决,容器内执行 pm2 logs,拷贝执行结果": "3. If the problem persists, execute 'pm2 logs' inside the container and copy the results", + "提交 issue": "Submit an issue", + "启动中,请稍后...": "Starting, please wait...", + "欢迎使用": "Welcome to use", + "欢迎使用青龙": "Welcome to use Qinglong", + "支持python3、javascript、shell、typescript 的定时任务管理面板": "A scheduling task management panel that supports python3, javascript, shell, and typescript", + "开始安装": "Start Installation", + "账户设置": "Account Settings", + "用户名": "Username", + "密码": "Password", + "密码不能为admin": "The password cannot be 'admin'", + "确认密码": "Confirm Password", + "您输入的两个密码不匹配!": "The two passwords you entered do not match!", + "提交": "Submit", + "通知设置": "Notification Settings", + "通知方式": "Notification Method", + "请选择通知方式": "Please select a notification method", + "跳过": "Skip", + "完成安装": "Installation Completed", + "恭喜安装完成!": "Congratulations, the installation is completed!", + "Telegram频道": "Telegram Channel", + "去登录": "Go to Login", + "初始化配置": "Initialize Configuration", + "文件": "File", + ",删除后不可恢复": ", it can't be recovered after deletion", + "请选择日志": "Please select a log", + "请输入日志名": "Please enter the log name", + "暂无日志": "No logs available", + "登录成功!": "Login successful!", + "上次登录时间:": "Last login time: ", + "上次登录地点:": "Last login location: ", + "上次登录IP:": "Last login IP: ", + "上次登录设备:": "Last login device: ", + "上次登录状态:": "Last login status: ", + "验证码": "Verification Code", + "验证码为6位数字": "Verification code is a 6-digit number", + "6位数字": "6-digit number", + "验证": "Verify", + "请": "Please", + "秒后重试": "Retry after seconds", + "在您的设备上打开两步验证应用程序以查看您的身份验证代码并验证您的身份。": "Open the two-factor authentication application on your device to view your authentication code and verify your identity.", + "请选择脚本文件": "Please select a script file", + "清空日志": "Clear Logs", + "设置": "Settings", + "退出": "Exit", + "空文件": "Empty File", + "本地文件": "Local File", + "文件夹": "Folder", + "文件名": "File Name", + "请输入文件名": "Please enter the file name", + "文件名不能包含斜杠": "File names cannot contain slashes", + "文件夹名": "Folder Name", + "请输入文件夹名": "Please enter the folder name", + "父目录": "Parent Directory", + "请选择父目录": "Please select a parent directory", + "点击或者拖拽文件到此区域上传": "Click or drag files here to upload", + "当前修改未保存,确定离开吗": "The current changes are not saved. Are you sure you want to leave?", + "退出编辑": "Exit Editing", + "重命名": "Rename", + "请选择脚本": "Please select a script", + "调试": "Debug", + "请输入脚本名": "Please enter the script name", + "暂无脚本": "No scripts available", + "请输入新名称": "Please enter a new name", + "保存文件": "Save File", + "保存目录": "Save Directory", + "请输入保存目录,默认scripts目录": "Please enter the save directory, default is 'scripts'", + "运行设置": "Run Settings", + "待开发": "To Be Developed", + "开发版": "Developer Edition", + "正式版": "Official Edition", + "版本": "Version", + "更新日志": "Changelog", + "查看": "View", + "提交BUG": "Submit Bug", + "名称不能为保留关键字": "The name cannot be a reserved keyword", + "请输入应用名称": "Please enter the application name", + "权限": "Permission", + "请选择模块权限": "Please select module permissions", + "更新": "Update", + "已经是最新版了!": "It is already the latest version!", + "是目前检测到的最新可用版本了。": "It is the latest available version currently detected.", + "重新下载": "Redownload", + "更新可用": "Update Available", + "新版本": "Create Version", + "可用,你使用的版本为": "available, the version you are using is", + "下载更新": "Download Update", + "以后再说": "Later", + "下载更新中...": "Downloading Update...", + "确认重启": "Confirm to Restart", + "系统安装包下载成功,确认重启": "System installation package downloaded successfully, confirm to restart", + "重启": "Restart", + "系统将在": "The system will restart in", + "秒后自动刷新": "seconds and automatically refresh", + "检查更新": "Check for Updates", + "确认删除应用": "Confirm to delete the application", + "确认重置": "Confirm to reset", + "确认重置应用": "Confirm to reset the application", + "的Secret吗": "'s Secret?", + "重置Secret会让当前应用所有token失效": "Resetting the Secret will invalidate all tokens for the current application", + "创建应用": "Create Application", + "安全设置": "Security Settings", + "应用设置": "Application Settings", + "登录日志": "Login Logs", + "其他设置": "Other Settings", + "关于": "About", + "成功": "Success", + "失败": "Failure", + "登录时间": "Login Time", + "登录地址": "Login Address", + "登录IP": "Login IP", + "登录设备": "Login Device", + "登录状态": "Login Status", + "亮色": "Light", + "暗色": "Dark", + "跟随系统": "Follow System", + "备份数据上传成功,确认覆盖数据": "Data backup uploaded successfully, confirm data overwrite", + "主题设置": "Theme Settings", + "日志删除频率": "Log Deletion Frequency", + "每x天自动删除x天以前的日志": "Automatically delete logs older than x days every x days", + "每": "Every", + "天": "day(s)", + "定时任务并发数": "Concurrent Scheduled Tasks", + "数据备份还原": "Data Backup & Restore", + "还原数据": "Restore Data", + "第一步": "Step 1", + "下载两步验证手机应用,比如 Google Authenticator 、": "Download a two-factor authentication mobile app, like Google Authenticator,", + "第二步": "Step 2", + "使用手机应用扫描二维码,或者输入秘钥": "Scan the QR code with the mobile app or enter the key", + "第三步": "Step 3", + "输入手机应用上的6位数字": "Enter the 6-digit code from the mobile app", + "完成设置": "Finish Setup", + "修改用户名密码": "Change Username and Password", + "两步验证": "Two-Factor Authentication", + "头像": "Profile Picture", + "更换头像": "Change Profile Picture", + "时": "hour(s)", + "分": "minute(s)", + "秒": "second(s)", + "私有仓库": "Private Repository", + "公开仓库": "Public Repository", + "单文件": "Single File", + "链接": "Link", + "分支": "Branch", + "确认删除定时订阅": "Confirm Deletion of Scheduled Subscription", + "定时订阅": "Scheduled Subscription", + "创建订阅": "Create Subscription", + "私钥": "Private Key", + "请输入私钥": "Please enter the private key", + "请输入认证用户名": "Please enter the authentication username", + "Github已不支持密码认证,请使用Token方式": "Github no longer supports password authentication. Please use the Token method.", + "密码/Token": "Password/Token", + "请输入密码或者Token": "Please enter the password or Token", + "支持拷贝 ql repo/raw 命令,粘贴导入": "Supports copying ql repo/raw command for import", + "请输入订阅链接": "Please enter the subscription link", + "请输入分支": "Please enter the branch", + "唯一值": "Unique Value", + "唯一值用于日志目录和私钥别名": "Unique value used for log directory and private key alias", + "自动生成": "Auto-generated", + "拉取方式": "Pull Method", + "用户名密码/Token": "Username/Password or Token", + "定时类型": "Schedule Type", + "白名单": "Whitelist", + "多个关键词竖线分割,支持正则表达式": "Multiple keywords separated by vertical lines (|), supports regular expressions", + "请输入脚本筛选白名单关键词,多个关键词竖线分割": "Please enter script filtering whitelist keywords, multiple keywords separated by vertical lines (|)", + "黑名单": "Blacklist", + "请输入脚本筛选黑名单关键词,多个关键词竖线分割": "Please enter script filtering blacklist keywords, multiple keywords separated by vertical lines (|)", + "依赖文件": "Dependency Files", + "请输入脚本依赖文件关键词,多个关键词竖线分割": "Please enter script dependency file keywords, multiple keywords separated by vertical lines (|)", + "文件后缀": "File Extension", + "仓库需要拉取的文件后缀,多个后缀空格分隔,默认使用配置文件中的RepoFileExtensions": "Repository requires pulling specific file extensions, multiple extensions separated by spaces, uses RepoFileExtensions from the configuration file by default", + "请输入文件后缀": "Please enter the file extension", + "执行前": "Before Execution", + "运行订阅前执行的命令,比如 cp/mv/python3 xxx.py/node xxx.js": "Run commands before executing the subscription, e.g., cp/mv/python3 xxx.py/node xxx.js", + "请输入运行订阅前要执行的命令": "Please enter the command to run before executing the subscription", + "执行后": "After Execution", + "运行订阅后执行的命令,比如 cp/mv/python3 xxx.py/node xxx.js": "Run commands after executing the subscription, e.g., cp/mv/python3 xxx.py/node xxx.js", + "请输入运行订阅后要执行的命令": "Please enter the command to run after executing the subscription", + "代理": "Proxy", + "公开仓库支持HTTP/SOCK5代理,私有仓库支持SOCK5代理": "Public repositories support HTTP/SOCK5 proxies, private repositories support SOCK5 proxies", + "自动添加任务": "Automatically Add Tasks", + "自动删除任务": "Automatically Delete Tasks", + "中文": "Chinese", + "系统信息": "System Information", + "Server酱": "ServerChan", + "Telegram机器人": "Telegram Bot", + "钉钉机器人": "DingTalk Bot", + "企业微信机器人": "WeChat Work Bot", + "企业微信应用": "WeChat Work App", + "智能微秘书": "Smart WeChat Assistant", + "群晖chat": "Synology Chat", + "邮箱": "Email", + "飞书机器人": "Feishu Bot", + "自定义通知": "Custom Notification", + "已关闭": "Disabled", + "gotify的url地址,例如 https://push.example.de:8080": "gotify URL address, e.g., https://push.example.de:8080", + "gotify的消息应用token码": "gotify message application token code", + "推送消息的优先级": "Priority of Push Messages", + "chat的url地址": "Chat URL address", + "chat的token码": "Chat token code", + "推送到个人QQ: http://127.0.0.1/send_private_msg,群:http://127.0.0.1/send_group_msg": "Push to personal QQ: http://127.0.0.1/send_private_msg, group: http://127.0.0.1/send_group_msg", + "访问密钥": "Access Key", + "如果GOBOT_URL设置 /send_private_msg 则需要填入 user_id=个人QQ 相反如果是 /send_group_msg 则需要填入 group_id=QQ群": "If GOBOT_URL is set to /send_private_msg, enter user_id=personal QQ; if set to /send_group_msg, enter group_id=QQ group", + "Server酱SENDKEY": "ServerChan SENDKEY", + "PushDeer的Key,https://github.com/easychen/pushdeer": "PushDeer Key, https://github.com/easychen/pushdeer", + "PushDeer的自架API endpoint,默认是 https://api2.pushdeer.com/message/push": "PushDeer's self-hosted API endpoint, default is https://api2.pushdeer.com/message/push", + "Bark的信息IP/设备码,例如:https://api.day.app/XXXXXXXX": "Bark information IP/device code, e.g., https://api.day.app/XXXXXXXX", + "BARK推送图标,自定义推送图标 (需iOS15或以上才能显示)": "BARK push icon, custom push icon (requires iOS 15 or above to display)", + "BARK推送铃声,铃声列表去APP查看复制填写": "BARK push ringtone, check and copy from the APP's ringtone list", + "BARK推送消息的分组,默认为qinglong": "BARK push message grouping, default is qinglong", + "telegram机器人的token,例如:1077xxx4424:AAFjv0FcqxxxxxxgEMGfi22B4yh15R5uw": "Telegram Bot token, e.g., 1077xxx4424:AAFjv0FcqxxxxxxgEMGfi22B4yh15R5uw", + "telegram用户的id,例如:129xxx206": "Telegram user ID, e.g., 129xxx206", + "代理IP": "Proxy IP", + "代理端口": "Proxy Port", + "telegram代理配置认证参数,用户名与密码用英文冒号连接 user:password": "Telegram proxy configuration authentication parameters, connect username and password with a colon, e.g., user:password", + "telegram api自建的反向代理地址,默认tg官方api": "Telegram API's self-built reverse proxy address, default is official tg API", + "钉钉机器人webhook token,例如:5a544165465465645d0f31dca676e7bd07415asdasd": "DingTalk Bot webhook token, e.g., 5a544165465465645d0f31dca676e7bd07415asdasd", + "密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串": "Secret key, shown below the signing section on the robot's security settings page, starts with SEC", + "企业微信机器人的webhook(详见文档 https://work.weixin.qq.com/api/doc/90000/90136/91770),例如:693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa": "WeChat Work Bot webhook (see documentation at https://work.weixin.qq.com/api/doc/90000/90136/91770), e.g., 693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa", + "企业微信代理地址": "WeChat Work Proxy Address", + "corpid、corpsecret、touser(注:多个成员ID使用|隔开)、agentid、消息类型(选填,不填默认文本消息类型) 注意用,号隔开(英文输入法的逗号),例如:wwcfrs,B-76WERQ,qinglong,1000001,2COat": "corpid, corpsecret, touser (note: separate multiple member IDs with |), agentid, message type (optional, defaults to text message type) – separated by commas (`,`), e.g., wwcfrs, B-76WERQ, qinglong, 1000001, 2COat", + "密钥key,智能微秘书个人中心获取apikey,申请地址:https://wechat.aibotk.com/signup?from=ql": "Key, obtain the API key from the Smart WeChat Assistant's personal center, apply at: https://wechat.aibotk.com/signup?from=ql", + "发送的目标,群组或者好友": "Recipient, group, or friend", + "请输入要发送的目标": "Please enter the recipient's name (group or friend)", + "群聊": "Group Chat", + "好友": "Friend", + "要发送的用户昵称或群名,如果目标是群,需要填群名,如果目标是好友,需要填好友昵称": "Enter the recipient's nickname if it's a friend or the group name if it's a group", + "iGot的信息推送key,例如:https://push.hellyw.com/XXXXXXXX": "iGot information push key, e.g., https://push.hellyw.com/XXXXXXXX", + "微信扫码登录后一对一推送或一对多推送下面的token(您的Token),不提供PUSH_PLUS_USER则默认为一对一推送,参考 https://www.pushplus.plus/": "After WeChat scan login, one-to-one or one-to-many push using the provided token (your Token). If PUSH_PLUS_USER is not provided, it defaults to one-to-one push. See reference at https://www.pushplus.plus/", + "一对多推送的“群组编码”(一对多推送下面->您的群组(如无则创建)->群组编码,如果您是创建群组人。也需点击“查看二维码”扫描绑定,否则不能接受群组消息推送)": "The 'group code' for one-to-many push (one-to-many push -> your group (if none, create one) -> group code). If you are the creator of the group, you need to click 'View QR code' to scan and bind, otherwise, you won't receive group messages.", + "飞书群组机器人:https://www.feishu.cn/hc/zh-CN/articles/360024984973": "Feishu group bot: https://www.feishu.cn/hc/zh-CN/articles/360024984973", + "邮箱服务名称,比如126、163、Gmail、QQ等,支持列表https://nodemailer.com/smtp/well-known/": "Email service name, e.g., 126, 163, Gmail, QQ, etc. Supported list: https://nodemailer.com/smtp/well-known/", + "邮箱地址": "Email Address", + "邮箱SMTP授权码": "Email SMTP Authorization Code", + "PushMe的Key,https://push.i-i.me/": "PushMe key, https://push.i-i.me/", + "请求方法": "Request Method", + "请求头Content-Type": "Request Header Content-Type", + "请求链接以http或者https开头。url或者body中必须包含$title,$content可选,对应api内容的位置": "Request URL should start with http or https. URL or body must contain $title, $content is optional and corresponds to the API content position.", + "请求头格式Custom-Header1: Header1,多个换行分割": "Request header format: Custom-Header1: Header1 (separate multiple headers with line breaks)", + "请求体格式key1: value1,多个换行分割。url或者body中必须包含$title,$content可选,对应api内容的位置": "Request body format: key1: value1 (separate multiple keys with line breaks). URL or body must contain $title, $content is optional and corresponds to the API content position.", + "错误日志": "Error Log", + "执行结束": "Execution Finished", + "备份": "Backup", + "生成数据中...": "Generating data...", + "请选择日志文件": "Please select a log file", + "筛选条件": "Filter Conditions", + "系统": "System", + "个人": "Personal", + "重新安装": "Reinstall", + "强制删除": "Force Delete", + "全部任务": "All Tasks" +} diff --git a/src/locales/zh-CN.json b/src/locales/zh-CN.json new file mode 100644 index 00000000..497c4851 --- /dev/null +++ b/src/locales/zh-CN.json @@ -0,0 +1,396 @@ +{ + "复制成功": "复制成功", + "复制": "复制", + "新建": "新建", + "登录": "登录", + "初始化": "初始化", + "错误": "错误", + "定时任务": "定时任务", + "订阅管理": "订阅管理", + "环境变量": "环境变量", + "配置文件": "配置文件", + "脚本管理": "脚本管理", + "依赖管理": "依赖管理", + "日志管理": "日志管理", + "对比工具": "对比工具", + "系统设置": "系统设置", + "退出登录": "退出登录", + "青龙": "青龙", + "返回首页": "返回首页", + "保存": "保存", + "日志": "日志", + "脚本": "脚本", + "确认保存文件": "确认保存文件", + ",保存后不可恢复": ",保存后不可恢复", + "确认运行": "确认运行", + "确认运行定时任务": "确认运行定时任务", + "吗": "吗", + "确认停止": "确认停止", + "确认停止定时任务": "确认停止定时任务", + "确认": "确认", + "任务": "任务", + "状态": "状态", + "空闲中": "空闲中", + "运行中": "运行中", + "队列中": "队列中", + "已禁用": "已禁用", + "定时": "定时", + "最后运行时间": "最后运行时间", + "最后运行时长": "最后运行时长", + "下次运行时间": "下次运行时间", + "名称": "名称", + "命令/脚本": "命令/脚本", + "定时规则": "定时规则", + "操作": "操作", + "确认删除": "确认删除", + "确认删除定时任务": "确认删除定时任务", + "编辑": "编辑", + "删除": "删除", + "确认删除选中的定时任务吗": "确认删除选中的定时任务吗", + "选中的定时任务吗": "选中的定时任务吗", + "创建视图": "创建视图", + "视图管理": "视图管理", + "请输入名称或者关键词": "请输入名称或者关键词", + "创建任务": "创建任务", + "更多": "更多", + "批量删除": "批量删除", + "批量启用": "批量启用", + "批量禁用": "批量禁用", + "批量运行": "批量运行", + "批量停止": "批量停止", + "批量置顶": "批量置顶", + "批量取消置顶": "批量取消置顶", + "批量修改标签": "批量修改标签", + "已选择": "已选择", + "项": "项", + "知道了": "知道了", + "请输入任务名称": "请输入任务名称", + "支持输入脚本路径/任意系统可执行命令/task 脚本路径": "支持输入脚本路径/任意系统可执行命令/task 脚本路径", + "秒(可选) 分 时 天 月 周": "秒(可选) 分 时 天 月 周", + "标签": "标签", + "取消": "取消", + "添加": "添加", + "启用": "启用", + "禁用": "禁用", + "运行": "运行", + "停止": "停止", + "置顶": "置顶", + "取消置顶": "取消置顶", + "命令": "命令", + "包含": "包含", + "不包含": "不包含", + "属于": "属于", + "不属于": "不属于", + "顺序": "顺序", + "倒序": "倒序", + "且": "且", + "或": "或", + "输入后回车增加自定义选项": "输入后回车增加自定义选项", + "视图名称": "视图名称", + "请输入视图名称": "请输入视图名称", + "请输入内容": "请输入内容", + "新增筛选条件": "新增筛选条件", + "新增排序方式": "新增排序方式", + "类型": "类型", + "显示": "显示", + "确认删除视图": "确认删除视图", + "安装中": "安装中", + "已安装": "已安装", + "安装失败": "安装失败", + "删除中": "删除中", + "已删除": "已删除", + "删除失败": "删除失败", + "序号": "序号", + "备注": "备注", + "更新时间": "更新时间", + "创建时间": "创建时间", + "确认删除依赖": "确认删除依赖", + "确认重新安装": "确认重新安装", + "确认删除选中的依赖吗": "确认删除选中的依赖吗", + "确认重新安装选中的依赖吗": "确认重新安装选中的依赖吗", + "请输入名称": "请输入名称", + "创建依赖": "创建依赖", + "批量安装": "批量安装", + "批量强制删除": "批量强制删除", + "日志 -": "日志 -", + "依赖类型": "依赖类型", + "自动拆分": "自动拆分", + "多个依赖是否换行分割": "多个依赖是否换行分割", + "是": "是", + "否": "否", + "请输入依赖名称,支持指定版本": "请输入依赖名称,支持指定版本", + "请输入依赖名称": "请输入依赖名称", + "请输入备注": "请输入备注", + "源文件": "源文件", + "当前文件": "当前文件", + "修改环境变量名称": "修改环境变量名称", + "请输入新的环境变量名称": "请输入新的环境变量名称", + "已启用": "已启用", + "值": "值", + "确认删除变量": "确认删除变量", + "确认删除选中的变量吗": "确认删除选中的变量吗", + "选中的变量吗": "选中的变量吗", + "请输入名称/值/备注": "请输入名称/值/备注", + "导入": "导入", + "创建变量": "创建变量", + "批量修改变量名称": "批量修改变量名称", + "批量导出": "批量导出", + "请输入环境变量名称": "请输入环境变量名称", + "只能输入字母数字下划线,且不能以数字开头": "只能输入字母数字下划线,且不能以数字开头", + "请输入环境变量值": "请输入环境变量值", + "服务启动超时": "服务启动超时", + "请先按如下方式修复:": "请先按如下方式修复:", + "1. 宿主机执行 docker run --rm -v\n /var/run/docker.sock:/var/run/docker.sock\n containrrr/watchtower -cR <容器名>": "1. 宿主机执行 docker run --rm -v\n /var/run/docker.sock:/var/run/docker.sock\n containrrr/watchtower -cR <容器名>", + "2. 容器内执行 ql -l check、ql -l update": "2. 容器内执行 ql -l check、ql -l update", + "3. 如果无法解决,容器内执行 pm2 logs,拷贝执行结果": "3. 如果无法解决,容器内执行 pm2 logs,拷贝执行结果", + "提交 issue": "提交 issue", + "启动中,请稍后...": "启动中,请稍后...", + "欢迎使用": "欢迎使用", + "欢迎使用青龙": "欢迎使用青龙", + "支持python3、javascript、shell、typescript 的定时任务管理面板": "支持python3、javaScript、shell、typescript 的定时任务管理面板", + "开始安装": "开始安装", + "账户设置": "账户设置", + "用户名": "用户名", + "密码": "密码", + "密码不能为admin": "密码不能为admin", + "确认密码": "确认密码", + "您输入的两个密码不匹配!": "您输入的两个密码不匹配!", + "提交": "提交", + "通知设置": "通知设置", + "通知方式": "通知方式", + "请选择通知方式": "请选择通知方式", + "跳过": "跳过", + "完成安装": "完成安装", + "恭喜安装完成!": "恭喜安装完成!", + "Telegram频道": "Telegram频道", + "去登录": "去登录", + "初始化配置": "初始化配置", + "文件": "文件", + ",删除后不可恢复": ",删除后不可恢复", + "请选择日志": "请选择日志", + "请输入日志名": "请输入日志名", + "暂无日志": "暂无日志", + "登录成功!": "登录成功!", + "上次登录时间:": "上次登录时间:", + "上次登录地点:": "上次登录地点:", + "上次登录IP:": "上次登录IP:", + "上次登录设备:": "上次登录设备:", + "上次登录状态:": "上次登录状态:", + "验证码": "验证码", + "验证码为6位数字": "验证码为6位数字", + "6位数字": "6位数字", + "验证": "验证", + "请": "请", + "秒后重试": "秒后重试", + "在您的设备上打开两步验证应用程序以查看您的身份验证代码并验证您的身份。": "在您的设备上打开两步验证应用程序以查看您的身份验证代码并验证您的身份。", + "请选择脚本文件": "请选择脚本文件", + "清空日志": "清空日志", + "设置": "设置", + "退出": "退出", + "空文件": "空文件", + "本地文件": "本地文件", + "文件夹": "文件夹", + "文件名": "文件名", + "请输入文件名": "请输入文件名", + "文件名不能包含斜杠": "文件名不能包含斜杠", + "文件夹名": "文件夹名", + "请输入文件夹名": "请输入文件夹名", + "父目录": "父目录", + "请选择父目录": "请选择父目录", + "点击或者拖拽文件到此区域上传": "点击或者拖拽文件到此区域上传", + "当前修改未保存,确定离开吗": "当前修改未保存,确定离开吗", + "退出编辑": "退出编辑", + "重命名": "重命名", + "请选择脚本": "请选择脚本", + "调试": "调试", + "请输入脚本名": "请输入脚本名", + "暂无脚本": "暂无脚本", + "请输入新名称": "请输入新名称", + "保存文件": "保存文件", + "保存目录": "保存目录", + "请输入保存目录,默认scripts目录": "请输入保存目录,默认scripts目录", + "运行设置": "运行设置", + "待开发": "待开发", + "开发版": "开发版", + "正式版": "正式版", + "版本": "版本", + "更新日志": "更新日志", + "查看": "查看", + "提交BUG": "提交BUG", + "名称不能为保留关键字": "名称不能为保留关键字", + "请输入应用名称": "请输入应用名称", + "权限": "权限", + "请选择模块权限": "请选择模块权限", + "更新": "更新", + "已经是最新版了!": "已经是最新版了!", + "是目前检测到的最新可用版本了。": "是目前检测到的最新可用版本了。", + "重新下载": "重新下载", + "更新可用": "更新可用", + "新版本": "新版本", + "可用,你使用的版本为": "可用,你使用的版本为", + "下载更新": "下载更新", + "以后再说": "以后再说", + "下载更新中...": "下载更新中...", + "确认重启": "确认重启", + "系统安装包下载成功,确认重启": "系统安装包下载成功,确认重启", + "重启": "重启", + "系统将在": "系统将在", + "秒后自动刷新": "秒后自动刷新", + "检查更新": "检查更新", + "确认删除应用": "确认删除应用", + "确认重置": "确认重置", + "确认重置应用": "确认重置应用", + "的Secret吗": "的Secret吗", + "重置Secret会让当前应用所有token失效": "重置Secret会让当前应用所有token失效", + "创建应用": "创建应用", + "安全设置": "安全设置", + "应用设置": "应用设置", + "登录日志": "登录日志", + "其他设置": "其他设置", + "关于": "关于", + "成功": "成功", + "失败": "失败", + "登录时间": "登录时间", + "登录地址": "登录地址", + "登录IP": "登录IP", + "登录设备": "登录设备", + "登录状态": "登录状态", + "亮色": "亮色", + "暗色": "暗色", + "跟随系统": "跟随系统", + "备份数据上传成功,确认覆盖数据": "备份数据上传成功,确认覆盖数据", + "主题设置": "主题设置", + "日志删除频率": "日志删除频率", + "每x天自动删除x天以前的日志": "每x天自动删除x天以前的日志", + "每": "每", + "天": "天", + "定时任务并发数": "定时任务并发数", + "数据备份还原": "数据备份还原", + "还原数据": "还原数据", + "第一步": "第一步", + "下载两步验证手机应用,比如 Google Authenticator 、": "下载两步验证手机应用,比如 Google Authenticator 、", + "第二步": "第二步", + "使用手机应用扫描二维码,或者输入秘钥": "使用手机应用扫描二维码,或者输入秘钥", + "第三步": "第三步", + "输入手机应用上的6位数字": "输入手机应用上的6位数字", + "完成设置": "完成设置", + "修改用户名密码": "修改用户名密码", + "两步验证": "两步验证", + "头像": "头像", + "更换头像": "更换头像", + "时": "时", + "分": "分", + "秒": "秒", + "私有仓库": "私有仓库", + "公开仓库": "公开仓库", + "单文件": "单文件", + "链接": "链接", + "分支": "分支", + "确认删除定时订阅": "确认删除定时订阅", + "定时订阅": "定时订阅", + "创建订阅": "创建订阅", + "私钥": "私钥", + "请输入私钥": "请输入私钥", + "请输入认证用户名": "请输入认证用户名", + "Github已不支持密码认证,请使用Token方式": "Github已不支持密码认证,请使用Token方式", + "密码/Token": "密码/Token", + "请输入密码或者Token": "请输入密码或者Token", + "支持拷贝 ql repo/raw 命令,粘贴导入": "支持拷贝 ql repo/raw 命令,粘贴导入", + "请输入订阅链接": "请输入订阅链接", + "请输入分支": "请输入分支", + "唯一值": "唯一值", + "唯一值用于日志目录和私钥别名": "唯一值用于日志目录和私钥别名", + "自动生成": "自动生成", + "拉取方式": "拉取方式", + "用户名密码/Token": "用户名密码/Token", + "定时类型": "定时类型", + "白名单": "白名单", + "多个关键词竖线分割,支持正则表达式": "多个关键词竖线分割,支持正则表达式", + "请输入脚本筛选白名单关键词,多个关键词竖线分割": "请输入脚本筛选白名单关键词,多个关键词竖线分割", + "黑名单": "黑名单", + "请输入脚本筛选黑名单关键词,多个关键词竖线分割": "请输入脚本筛选黑名单关键词,多个关键词竖线分割", + "依赖文件": "依赖文件", + "请输入脚本依赖文件关键词,多个关键词竖线分割": "请输入脚本依赖文件关键词,多个关键词竖线分割", + "文件后缀": "文件后缀", + "仓库需要拉取的文件后缀,多个后缀空格分隔,默认使用配置文件中的RepoFileExtensions": "仓库需要拉取的文件后缀,多个后缀空格分隔,默认使用配置文件中的RepoFileExtensions", + "请输入文件后缀": "请输入文件后缀", + "执行前": "执行前", + "运行订阅前执行的命令,比如 cp/mv/python3 xxx.py/node xxx.js": "运行订阅前执行的命令,比如 cp/mv/python3 xxx.py/node xxx.js", + "请输入运行订阅前要执行的命令": "请输入运行订阅前要执行的命令", + "执行后": "执行后", + "运行订阅后执行的命令,比如 cp/mv/python3 xxx.py/node xxx.js": "运行订阅后执行的命令,比如 cp/mv/python3 xxx.py/node xxx.js", + "请输入运行订阅后要执行的命令": "请输入运行订阅后要执行的命令", + "代理": "代理", + "公开仓库支持HTTP/SOCK5代理,私有仓库支持SOCK5代理": "公开仓库支持HTTP/SOCK5代理,私有仓库支持SOCK5代理", + "自动添加任务": "自动添加任务", + "自动删除任务": "自动删除任务", + "中文": "中文", + "系统信息": "系统信息", + "Server酱": "Server酱", + "Telegram机器人": "Telegram机器人", + "钉钉机器人": "钉钉机器人", + "企业微信机器人": "企业微信机器人", + "企业微信应用": "企业微信应用", + "智能微秘书": "智能微秘书", + "群晖chat": "群晖chat", + "邮箱": "邮箱", + "飞书机器人": "飞书机器人", + "自定义通知": "自定义通知", + "已关闭": "已关闭", + "gotify的url地址,例如 https://push.example.de:8080": "gotify的url地址,例如 https://push.example.de:8080", + "gotify的消息应用token码": "gotify的消息应用token码", + "推送消息的优先级": "推送消息的优先级", + "chat的url地址": "chat的url地址", + "chat的token码": "chat的token码", + "推送到个人QQ: http://127.0.0.1/send_private_msg,群:http://127.0.0.1/send_group_msg": "推送到个人QQ: http://127.0.0.1/send_private_msg,群:http://127.0.0.1/send_group_msg", + "访问密钥": "访问密钥", + "如果GOBOT_URL设置 /send_private_msg 则需要填入 user_id=个人QQ 相反如果是 /send_group_msg 则需要填入 group_id=QQ群": "如果GOBOT_URL设置 /send_private_msg 则需要填入 user_id=个人QQ 相反如果是 /send_group_msg 则需要填入 group_id=QQ群", + "Server酱SENDKEY": "Server酱SENDKEY", + "PushDeer的Key,https://github.com/easychen/pushdeer": "PushDeer的Key,https://github.com/easychen/pushdeer", + "PushDeer的自架API endpoint,默认是 https://api2.pushdeer.com/message/push": "PushDeer的自架API endpoint,默认是 https://api2.pushdeer.com/message/push", + "Bark的信息IP/设备码,例如:https://api.day.app/XXXXXXXX": "Bark的信息IP/设备码,例如:https://api.day.app/XXXXXXXX", + "BARK推送图标,自定义推送图标 (需iOS15或以上才能显示)": "BARK推送图标,自定义推送图标 (需iOS15或以上才能显示)", + "BARK推送铃声,铃声列表去APP查看复制填写": "BARK推送铃声,铃声列表去APP查看复制填写", + "BARK推送消息的分组, 默认为qinglong": "BARK推送消息的分组, 默认为qinglong", + "telegram机器人的token,例如:1077xxx4424:AAFjv0FcqxxxxxxgEMGfi22B4yh15R5uw": "telegram机器人的token,例如:1077xxx4424:AAFjv0FcqxxxxxxgEMGfi22B4yh15R5uw", + "telegram用户的id,例如:129xxx206": "telegram用户的id,例如:129xxx206", + "代理IP": "代理IP", + "代理端口": "代理端口", + "telegram代理配置认证参数, 用户名与密码用英文冒号连接 user:password": "telegram代理配置认证参数, 用户名与密码用英文冒号连接 user:password", + "telegram api自建的反向代理地址,默认tg官方api": "telegram api自建的反向代理地址,默认tg官方api", + "钉钉机器人webhook token,例如:5a544165465465645d0f31dca676e7bd07415asdasd": "钉钉机器人webhook token,例如:5a544165465465645d0f31dca676e7bd07415asdasd", + "密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串": "密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串", + "企业微信机器人的 webhook(详见文档 https://work.weixin.qq.com/api/doc/90000/90136/91770),例如:693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa": "企业微信机器人的 webhook(详见文档 https://work.weixin.qq.com/api/doc/90000/90136/91770),例如:693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa", + "企业微信代理地址": "企业微信代理地址", + "corpid,corpsecret,touser(注:多个成员ID使用|隔开),agentid,消息类型(选填,不填默认文本消息类型) 注意用,号隔开(英文输入法的逗号),例如:wwcfrs,B-76WERQ,qinglong,1000001,2COat": "corpid,corpsecret,touser(注:多个成员ID使用|隔开),agentid,消息类型(选填,不填默认文本消息类型) 注意用,号隔开(英文输入法的逗号),例如:wwcfrs,B-76WERQ,qinglong,1000001,2COat", + "密钥key,智能微秘书个人中心获取apikey,申请地址:https://wechat.aibotk.com/signup?from=ql": "密钥key,智能微秘书个人中心获取apikey,申请地址:https://wechat.aibotk.com/signup?from=ql", + "发送的目标,群组或者好友": "发送的目标,群组或者好友", + "请输入要发送的目标": "请输入要发送的目标", + "群聊": "群聊", + "好友": "好友", + "要发送的用户昵称或群名,如果目标是群,需要填群名,如果目标是好友,需要填好友昵称": "要发送的用户昵称或群名,如果目标是群,需要填群名,如果目标是好友,需要填好友昵称", + "iGot的信息推送key,例如:https://push.hellyw.com/XXXXXXXX": "iGot的信息推送key,例如:https://push.hellyw.com/XXXXXXXX", + "微信扫码登录后一对一推送或一对多推送下面的token(您的Token),不提供PUSH_PLUS_USER则默认为一对一推送,参考 https://www.pushplus.plus/": "微信扫码登录后一对一推送或一对多推送下面的token(您的Token),不提供PUSH_PLUS_USER则默认为一对一推送,参考 https://www.pushplus.plus/", + "一对多推送的“群组编码”(一对多推送下面->您的群组(如无则创建)->群组编码,如果您是创建群组人。也需点击“查看二维码”扫描绑定,否则不能接受群组消息推送)": "一对多推送的“群组编码”(一对多推送下面->您的群组(如无则创建)->群组编码,如果您是创建群组人。也需点击“查看二维码”扫描绑定,否则不能接受群组消息推送)", + "飞书群组机器人:https://www.feishu.cn/hc/zh-CN/articles/360024984973": "飞书群组机器人:https://www.feishu.cn/hc/zh-CN/articles/360024984973", + "邮箱服务名称,比如126、163、Gmail、QQ等,支持列表https://nodemailer.com/smtp/well-known/": "邮箱服务名称,比如126、163、Gmail、QQ等,支持列表https://nodemailer.com/smtp/well-known/", + "邮箱地址": "邮箱地址", + "邮箱SMTP授权码": "邮箱SMTP授权码", + "PushMe的Key,https://push.i-i.me/": "PushMe的Key,https://push.i-i.me/", + "请求方法": "请求方法", + "请求头Content-Type": "请求头Content-Type", + "请求链接以http或者https开头。url或者body中必须包含$title,$content可选,对应api内容的位置": "请求链接以http或者https开头。url或者body中必须包含$title,$content可选,对应api内容的位置", + "请求头格式Custom-Header1: Header1,多个换行分割": "请求头格式Custom-Header1: Header1,多个换行分割", + "请求体格式key1: value1,多个换行分割。url或者body中必须包含$title,$content可选,对应api内容的位置": "请求体格式key1: value1,多个换行分割。url或者body中必须包含$title,$content可选,对应api内容的位置", + "错误日志": "错误日志", + "执行结束": "执行结束", + "备份": "备份", + "生成数据中...": "生成数据中...", + "请选择日志文件": "请选择日志文件", + "筛选条件": "筛选条件", + "系统": "系统", + "个人": "个人", + "重新安装": "重新安装", + "强制删除": "强制删除", + "全部任务": "全部任务" +} diff --git a/src/pages/404.tsx b/src/pages/404.tsx index 9b572110..df30c41f 100644 --- a/src/pages/404.tsx +++ b/src/pages/404.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React from 'react'; import { Button, Result, Typography } from 'antd'; @@ -9,7 +10,7 @@ const NotFound: React.FC = () => ( title="404" extra={ } /> diff --git a/src/pages/config/index.tsx b/src/pages/config/index.tsx index fd4c7bec..aae5d5cd 100644 --- a/src/pages/config/index.tsx +++ b/src/pages/config/index.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal' import React, { PureComponent, Fragment, @@ -93,7 +94,7 @@ const Config = () => { type="primary" onClick={updateConfig} > - 保存 + {intl.get('保存')} , ]} header={{ diff --git a/src/pages/crontab/detail.tsx b/src/pages/crontab/detail.tsx index 7db8a291..f90201ab 100644 --- a/src/pages/crontab/detail.tsx +++ b/src/pages/crontab/detail.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useEffect, useRef, useState } from 'react'; import { Modal, @@ -38,11 +39,11 @@ const { Text } = Typography; const tabList = [ { key: 'log', - tab: '日志', + tab: intl.get('日志'), }, { key: 'script', - tab: '脚本', + tab: intl.get('脚本'), }, ]; const LangMap: any = { @@ -181,11 +182,11 @@ const CronDetailModal = ({ title: `确认保存`, content: ( <> - 确认保存文件 + {intl.get('确认保存文件')} {scriptInfo.filename} {' '} - ,保存后不可恢复 + {intl.get(',保存后不可恢复')} ), onOk() { @@ -217,14 +218,14 @@ const CronDetailModal = ({ const runCron = () => { Modal.confirm({ - title: '确认运行', + title: intl.get('确认运行'), content: ( <> - 确认运行定时任务{' '} + {intl.get('确认运行定时任务')}{' '} {currentCron.name} {' '} - 吗 + {intl.get('吗')} ), onOk() { @@ -247,14 +248,14 @@ const CronDetailModal = ({ const stopCron = () => { Modal.confirm({ - title: '确认停止', + title: intl.get('确认停止'), content: ( <> - 确认停止定时任务{' '} + {intl.get('确认停止定时任务')}{' '} {currentCron.name} {' '} - 吗 + {intl.get('吗')} ), onOk() { @@ -274,15 +275,18 @@ const CronDetailModal = ({ const enabledOrDisabledCron = () => { Modal.confirm({ - title: `确认${currentCron.isDisabled === 1 ? '启用' : '禁用'}`, + title: `确认${ + currentCron.isDisabled === 1 ? intl.get('启用') : intl.get('禁用') + }`, content: ( <> - 确认{currentCron.isDisabled === 1 ? '启用' : '禁用'} - 定时任务{' '} + {intl.get('确认')} + {currentCron.isDisabled === 1 ? intl.get('启用') : intl.get('禁用')} + {intl.get('定时任务')}{' '} {currentCron.name} {' '} - 吗 + {intl.get('吗')} ), onOk() { @@ -310,15 +314,18 @@ const CronDetailModal = ({ const pinOrUnPinCron = () => { Modal.confirm({ - title: `确认${currentCron.isPinned === 1 ? '取消置顶' : '置顶'}`, + title: `确认${ + currentCron.isPinned === 1 ? intl.get('取消置顶') : intl.get('置顶') + }`, content: ( <> - 确认{currentCron.isPinned === 1 ? '取消置顶' : '置顶'} - 定时任务{' '} + {intl.get('确认')} + {currentCron.isPinned === 1 ? intl.get('取消置顶') : intl.get('置顶')} + {intl.get('定时任务')}{' '} {currentCron.name} {' '} - 吗 + {intl.get('吗')} ), onOk() { @@ -378,7 +385,9 @@ const CronDetailModal = ({
, ]} header={{ @@ -906,7 +924,7 @@ const Crontab = () => { >
- 更多 + {intl.get('更多')}
@@ -929,56 +947,57 @@ const Crontab = () => { style={{ marginBottom: 5 }} onClick={delCrons} > - 批量删除 + {intl.get('批量删除')} - 已选择 -
{selectedRowIds?.length}项 + {intl.get('已选择')} + {selectedRowIds?.length} + {intl.get('项')}
)} diff --git a/src/pages/crontab/logModal.tsx b/src/pages/crontab/logModal.tsx index 13f99aaa..e4c43a20 100644 --- a/src/pages/crontab/logModal.tsx +++ b/src/pages/crontab/logModal.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useEffect, useRef, useState } from 'react'; import { Modal, message, Input, Form, Statistic, Button } from 'antd'; import { request } from '@/utils/http'; @@ -44,7 +45,7 @@ const CronLogModal = ({ data !== value ) { const log = data as string; - setValue(log || '暂无日志'); + setValue(log || intl.get('暂无日志')); const hasNext = Boolean( log && !logEnded(log) && !log.includes('任务未运行'), ); @@ -131,7 +132,7 @@ const CronLogModal = ({ onCancel={() => cancel()} footer={[ , ]} > diff --git a/src/pages/crontab/modal.tsx b/src/pages/crontab/modal.tsx index a33c7e74..33e7876a 100644 --- a/src/pages/crontab/modal.tsx +++ b/src/pages/crontab/modal.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useEffect, useState } from 'react'; import { Modal, message, Input, Form, Button } from 'antd'; import { request } from '@/utils/http'; @@ -31,7 +32,9 @@ const CronModal = ({ ); if (code === 200) { - message.success(cron ? '更新任务成功' : '新建任务成功'); + message.success( + cron ? intl.get('更新任务成功') : intl.get('创建任务成功'), + ); handleCancel(data); } setLoading(false); @@ -46,7 +49,7 @@ const CronModal = ({ return ( - - + + - + - + @@ -136,7 +141,9 @@ const CronLabelModal = ({ if (code === 200) { message.success( - action === 'post' ? '添加Labels成功' : '删除Labels成功', + action === 'post' + ? intl.get('添加Labels成功') + : intl.get('删除Labels成功'), ); handleCancel(true); } @@ -155,18 +162,18 @@ const CronLabelModal = ({ }, [ids, visible]); const buttons = [ - , + , , , ]; return (
- + diff --git a/src/pages/crontab/viewCreateModal.tsx b/src/pages/crontab/viewCreateModal.tsx index f1aa3b65..3423ea65 100644 --- a/src/pages/crontab/viewCreateModal.tsx +++ b/src/pages/crontab/viewCreateModal.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useEffect, useState } from 'react'; import { Modal, @@ -17,11 +18,11 @@ import get from 'lodash/get'; import { CrontabStatus } from './type'; const PROPERTIES = [ - { name: '命令', value: 'command' }, - { name: '名称', value: 'name' }, - { name: '定时规则', value: 'schedule' }, - { name: '状态', value: 'status' }, - { name: '标签', value: 'labels' }, + { name: intl.get('命令'), value: 'command' }, + { name: intl.get('名称'), value: 'name' }, + { name: intl.get('定时规则'), value: 'schedule' }, + { name: intl.get('状态'), value: 'status' }, + { name: intl.get('标签'), value: 'labels' }, ]; const EOperation: any = { @@ -31,10 +32,10 @@ const EOperation: any = { Nin: 'select', }; const OPERATIONS = [ - { name: '包含', value: 'Reg' }, - { name: '不包含', value: 'NotReg' }, - { name: '属于', value: 'In', type: 'select' }, - { name: '不属于', value: 'Nin', type: 'select' }, + { name: intl.get('包含'), value: 'Reg' }, + { name: intl.get('不包含'), value: 'NotReg' }, + { name: intl.get('属于'), value: 'In', type: 'select' }, + { name: intl.get('不属于'), value: 'Nin', type: 'select' }, // { name: '等于', value: 'Eq' }, // { name: '不等于', value: 'Ne' }, // { name: '为空', value: 'IsNull' }, @@ -42,15 +43,15 @@ const OPERATIONS = [ ]; const SORTTYPES = [ - { name: '顺序', value: 'ASC' }, - { name: '倒序', value: 'DESC' }, + { name: intl.get('顺序'), value: 'ASC' }, + { name: intl.get('倒序'), value: 'DESC' }, ]; const STATUS_MAP = { status: [ - { name: '运行中', value: CrontabStatus.running }, - { name: '空闲中', value: CrontabStatus.idle }, - { name: '已禁用', value: CrontabStatus.disabled }, + { name: intl.get('运行中'), value: CrontabStatus.running }, + { name: intl.get('空闲中'), value: CrontabStatus.idle }, + { name: intl.get('已禁用'), value: CrontabStatus.disabled }, ], }; @@ -137,7 +138,11 @@ const ViewCreateModal = ({ const statusElement = (property: keyof typeof STATUS_MAP) => { return ( - {STATUS_MAP[property]?.map((x) => ( {x.name} @@ -149,7 +154,7 @@ const ViewCreateModal = ({ return ( - + {(fields, { add, remove }) => ( @@ -223,7 +228,7 @@ const ViewCreateModal = ({
{fields.map(({ key, name, ...restField }) => ( {EOperation[filtersValue?.[name]['operation']] === 'select' ? ( statusElement(filtersValue?.[name]['property']) ) : ( - + )} {name !== 0 && ( @@ -272,7 +279,7 @@ const ViewCreateModal = ({ } > - 新增筛选条件 + {intl.get('新增筛选条件')}
@@ -320,7 +327,7 @@ const ViewCreateModal = ({ diff --git a/src/pages/crontab/viewManageModal.tsx b/src/pages/crontab/viewManageModal.tsx index 70fbed2d..560f9c72 100644 --- a/src/pages/crontab/viewManageModal.tsx +++ b/src/pages/crontab/viewManageModal.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useCallback, useEffect, useRef, useState } from 'react'; import { Modal, @@ -81,18 +82,18 @@ const ViewManageModal = ({ const columns: any = [ { - title: '名称', + title: intl.get('名称'), dataIndex: 'name', key: 'name', }, { - title: '类型', + title: intl.get('类型'), dataIndex: 'type', key: 'type', - render: (v) => (v === 1 ? '系统' : '个人'), + render: (v) => (v === 1 ? intl.get('系统') : intl.get('个人')), }, { - title: '显示', + title: intl.get('显示'), key: 'isDisabled', dataIndex: 'isDisabled', width: 100, @@ -107,7 +108,7 @@ const ViewManageModal = ({ }, }, { - title: '操作', + title: intl.get('操作'), key: 'action', width: 100, render: (text: string, record: any, index: number) => { @@ -140,14 +141,14 @@ const ViewManageModal = ({ const deleteView = (record: any, index: number) => { Modal.confirm({ - title: '确认删除', + title: intl.get('确认删除'), content: ( <> - 确认删除视图{' '} + {intl.get('确认删除视图')}{' '} {record.name} {' '} - 吗 + {intl.get('吗')} ), onOk() { @@ -218,7 +219,7 @@ const ViewManageModal = ({ return ( - 新建视图 + {intl.get('创建视图')} diff --git a/src/pages/dependence/index.tsx b/src/pages/dependence/index.tsx index 9ad83b2d..8c529e23 100644 --- a/src/pages/dependence/index.tsx +++ b/src/pages/dependence/index.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useCallback, useRef, useState, useEffect } from 'react'; import { Button, @@ -90,20 +91,22 @@ const Dependence = () => { useOutletContext(); const columns: any = [ { - title: '序号', - width: 50, + title: intl.get('序号'), + width: 80, render: (text: string, record: any, index: number) => { return {index + 1} ; }, }, { - title: '名称', + title: intl.get('名称'), dataIndex: 'name', + width: 120, key: 'name', }, { - title: '状态', + title: intl.get('状态'), key: 'status', + width: 100, dataIndex: 'status', render: (text: string, record: any, index: number) => { return ( @@ -113,41 +116,45 @@ const Dependence = () => { icon={StatusMap[record.status].icon} style={{ marginRight: 0 }} > - {Status[record.status]} + {intl.get(Status[record.status])} ); }, }, { - title: '备注', + title: intl.get('备注'), dataIndex: 'remark', + width: 120, key: 'remark', }, { - title: '更新时间', + title: intl.get('更新时间'), key: 'updatedAt', dataIndex: 'updatedAt', + width: 150, render: (text: string) => { return {dayjs(text).format('YYYY-MM-DD HH:mm:ss')}; }, }, { - title: '创建时间', + title: intl.get('创建时间'), key: 'createdAt', dataIndex: 'createdAt', + width: 150, render: (text: string) => { return {dayjs(text).format('YYYY-MM-DD HH:mm:ss')}; }, }, { - title: '操作', + title: intl.get('操作'), key: 'action', + width: 150, render: (text: string, record: any, index: number) => { const isPc = !isPhone; return ( - + { setLogDependence({ ...record, timestamp: Date.now() }); @@ -159,17 +166,17 @@ const Dependence = () => { {record.status !== Status.安装中 && record.status !== Status.删除中 && ( <> - + reInstallDependence(record, index)}> - + deleteDependence(record, index)}> - + deleteDependence(record, index, true)}> @@ -223,14 +230,14 @@ const Dependence = () => { force: boolean = false, ) => { Modal.confirm({ - title: '确认删除', + title: intl.get('确认删除'), content: ( <> - 确认删除依赖{' '} + {intl.get('确认删除依赖')}{' '} {record.name} {' '} - 吗 + {intl.get('吗')} ), onOk() { @@ -257,14 +264,14 @@ const Dependence = () => { const reInstallDependence = (record: any, index: number) => { Modal.confirm({ - title: '确认重新安装', + title: intl.get('确认重新安装'), content: ( <> - 确认重新安装{' '} + {intl.get('确认重新安装')}{' '} {record.name} {' '} - 吗 + {intl.get('吗')} ), onOk() { @@ -314,8 +321,8 @@ const Dependence = () => { const delDependencies = (force: boolean) => { const forceUrl = force ? '/force' : ''; Modal.confirm({ - title: '确认删除', - content: <>确认删除选中的依赖吗, + title: intl.get('确认删除'), + content: <>{intl.get('确认删除选中的依赖吗')}, onOk() { request .delete(`${config.apiPrefix}dependencies${forceUrl}`, { @@ -336,8 +343,8 @@ const Dependence = () => { const handlereInstallDependencies = () => { Modal.confirm({ - title: '确认重新安装', - content: <>确认重新安装选中的依赖吗, + title: intl.get('确认重新安装'), + content: <>{intl.get('确认重新安装选中的依赖吗')}, onOk() { request .put(`${config.apiPrefix}dependencies/reinstall`, selectedRowIds) @@ -454,17 +461,17 @@ const Dependence = () => { return ( , , ]} header={{ @@ -499,25 +506,26 @@ const Dependence = () => { style={{ marginBottom: 5, marginLeft: 8 }} onClick={() => handlereInstallDependencies()} > - 批量安装 + {intl.get('批量安装')} - 已选择 - {selectedRowIds?.length}项 + {intl.get('已选择')} + {selectedRowIds?.length} + {intl.get('项')}
)} diff --git a/src/pages/dependence/logModal.tsx b/src/pages/dependence/logModal.tsx index 962b2a3a..87599139 100644 --- a/src/pages/dependence/logModal.tsx +++ b/src/pages/dependence/logModal.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useEffect, useState } from 'react'; import { Modal, message, Input, Form, Statistic, Button } from 'antd'; import { request } from '@/utils/http'; @@ -38,7 +39,7 @@ const DependenceLogModal = ({ {executing && } {!executing && } - 日志 - {dependence && dependence.name} + {intl.get('日志 -')} {dependence && dependence.name} {' '} ); @@ -130,7 +131,7 @@ const DependenceLogModal = ({ onCancel={() => cancel()} footer={[ , ]} > diff --git a/src/pages/dependence/modal.tsx b/src/pages/dependence/modal.tsx index 24f24d5b..cab283bc 100644 --- a/src/pages/dependence/modal.tsx +++ b/src/pages/dependence/modal.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useEffect, useState } from 'react'; import { Modal, message, Input, Form, Radio, Select } from 'antd'; import { request } from '@/utils/http'; @@ -66,7 +67,7 @@ const DependenceModal = ({ return ( + + diff --git a/src/pages/diff/index.tsx b/src/pages/diff/index.tsx index 2674ed2d..4b6190f9 100644 --- a/src/pages/diff/index.tsx +++ b/src/pages/diff/index.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { PureComponent, useRef, useState, useEffect } from 'react'; import { Button, message, Select, Form, Row, Col } from 'antd'; import config from '@/utils/config'; @@ -93,7 +94,7 @@ const Diff = () => { return ( { extra={ !isPhone && [ , ] } > - + {files.map((x) => (
)} diff --git a/src/pages/env/modal.tsx b/src/pages/env/modal.tsx index df3faa45..0a051b0e 100644 --- a/src/pages/env/modal.tsx +++ b/src/pages/env/modal.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal' import React, { useEffect, useState } from 'react'; import { Modal, message, Input, Form, Radio } from 'antd'; import { request } from '@/utils/http'; @@ -43,7 +44,7 @@ const EnvModal = ({ ); if (code === 200) { - message.success(env ? '更新变量成功' : '新建变量成功'); + message.success(env ? intl.get('更新变量成功') : intl.get('创建变量成功')); handleCancel(data); } setLoading(false); @@ -58,7 +59,7 @@ const EnvModal = ({ return ( - + {!env && ( - - + {intl.get('是')} + {intl.get('否')} )} - - + + diff --git a/src/pages/error/index.tsx b/src/pages/error/index.tsx index c185e86b..7a0572d4 100644 --- a/src/pages/error/index.tsx +++ b/src/pages/error/index.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useState, useEffect, useRef } from 'react'; import config from '@/utils/config'; import { request } from '@/utils/http'; @@ -54,22 +55,24 @@ const Error = () => { type="error" message={ - 服务启动超时 + {intl.get('服务启动超时')} } description={ -
请先按如下方式修复:
+
{intl.get('请先按如下方式修复:')}
1. 宿主机执行 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower -cR <容器名>
-
2. 容器内执行 ql -l check、ql -l update
+
{intl.get('2. 容器内执行 ql -l check、ql -l update')}
- 3. 如果无法解决,容器内执行 pm2 logs,拷贝执行结果 + {intl.get( + '3. 如果无法解决,容器内执行 pm2 logs,拷贝执行结果', + )} - 提交 issue + {intl.get('提交 issue')}
@@ -81,7 +84,7 @@ const Error = () => { ) : ( - + )} ); diff --git a/src/pages/initialization/index.tsx b/src/pages/initialization/index.tsx index 16962174..6952b5d8 100644 --- a/src/pages/initialization/index.tsx +++ b/src/pages/initialization/index.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { Fragment, useEffect, useState } from 'react'; import { Button, @@ -70,15 +71,15 @@ const Initialization = () => { const steps = [ { - title: '欢迎使用', + title: intl.get('欢迎使用'), content: (
- 欢迎使用青龙 + {intl.get('欢迎使用青龙')} - 支持python3、javaScript、shell、typescript 的定时任务管理面板(A - timed task management panel that supports typescript, javaScript, - python3, and shell.) + {intl.get( + '支持python3、javascript、shell、typescript 的定时任务管理面板', + )}
@@ -88,42 +89,42 @@ const Initialization = () => { next(); }} > - 开始安装 + {intl.get('开始安装')}
), }, { - title: '账户设置', + title: intl.get('账户设置'), content: (
- + - + { if (!value || getFieldValue('password') === value) { return Promise.resolve(); } - return Promise.reject(new Error('您输入的两个密码不匹配!')); + return Promise.reject( + new Error(intl.get('您输入的两个密码不匹配!')), + ); }, }), ]} > - +
), }, { - title: '通知设置', + title: intl.get('通知设置'), content: (
{ style={{ width: '100%' }} loading={verifying} > - 验证 + {intl.get('验证')} ) : (
- + - + {waitTime ? ( ) : ( )} @@ -220,7 +233,9 @@ const Login = () => { {twoFactor ? (
- 在您的设备上打开两步验证应用程序以查看您的身份验证代码并验证您的身份。 + {intl.get( + '在您的设备上打开两步验证应用程序以查看您的身份验证代码并验证您的身份。', + )}
) : ( '' diff --git a/src/pages/script/editModal.tsx b/src/pages/script/editModal.tsx index 16bfbaff..3e36dda7 100644 --- a/src/pages/script/editModal.tsx +++ b/src/pages/script/editModal.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useEffect, useState, useRef } from 'react'; import { Drawer, Button, Tabs, Badge, Select, TreeSelect } from 'antd'; import { request } from '@/utils/http'; @@ -161,7 +162,7 @@ const EditModal = ({ value={selectedKey} dropdownStyle={{ maxHeight: 400, overflow: 'auto' }} treeData={treeData} - placeholder="请选择脚本文件" + placeholder={intl.get('请选择脚本文件')} fieldNames={{ value: 'key', label: 'title' }} showSearch onSelect={onSelect} @@ -183,7 +184,7 @@ const EditModal = ({ style={{ marginRight: 8 }} onClick={isRunning ? stop : run} > - {isRunning ? '停止' : '运行'} + {isRunning ? intl.get('停止') : intl.get('运行')} } diff --git a/src/pages/script/editNameModal.tsx b/src/pages/script/editNameModal.tsx index b2c1c0f1..cd499d3c 100644 --- a/src/pages/script/editNameModal.tsx +++ b/src/pages/script/editNameModal.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useEffect, useState } from 'react'; import { Modal, @@ -47,7 +48,9 @@ const EditScriptNameModal = ({ .post(`${config.apiPrefix}scripts`, formData) .then(({ code, data }) => { if (code === 200) { - message.success(directory ? '新建文件夹成功' : '新建文件成功'); + message.success( + directory ? intl.get('创建文件夹成功') : intl.get('创建文件成功'), + ); const key = path ? `${path}/` : ''; const filename = file ? file.name : inputFilename; handleCancel({ @@ -96,7 +99,7 @@ const EditScriptNameModal = ({ return ( - 空文件 - 本地文件 - 文件夹 + {intl.get('空文件')} + {intl.get('本地文件')} + {intl.get('文件夹')} {type === 'blank' && ( value.includes('/') - ? Promise.reject(new Error('文件名不能包含斜杠')) + ? Promise.reject(new Error(intl.get('文件名不能包含斜杠'))) : Promise.resolve(), }, ]} > - + )} {type === 'directory' && ( - + )} - + {type === 'upload' && ( - +

-

点击或者拖拽文件到此区域上传

+

+ {intl.get('点击或者拖拽文件到此区域上传')} +

)} diff --git a/src/pages/script/index.tsx b/src/pages/script/index.tsx index b0fb7b6c..fa6d6e86 100644 --- a/src/pages/script/index.tsx +++ b/src/pages/script/index.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import { useState, useEffect, useCallback, Key, useRef } from 'react'; import { TreeSelect, @@ -55,7 +56,7 @@ const LangMap: any = { const Script = () => { const { headerStyle, isPhone, theme, socketMessage } = useOutletContext(); - const [value, setValue] = useState('请选择脚本文件'); + const [value, setValue] = useState(intl.get('请选择脚本文件')); const [select, setSelect] = useState(''); const [data, setData] = useState([]); const [loading, setLoading] = useState(false); @@ -128,7 +129,7 @@ const Script = () => { } if (node.type === 'directory') { - setValue('请选择脚本文件'); + setValue(intl.get('请选择脚本文件')); return; } @@ -146,7 +147,7 @@ const Script = () => { if (content !== value) { Modal.confirm({ title: `确认离开`, - content: <>当前修改未保存,确定离开吗, + content: <>{intl.get('当前修改未保存,确定离开吗')}, onOk() { onSelect(keys[0], e.node); setIsEditing(false); @@ -209,11 +210,11 @@ const Script = () => { title: `确认保存`, content: ( <> - 确认保存文件 + {intl.get('确认保存文件')} {currentNode.title} {' '} - ,保存后不可恢复 + {intl.get(',保存后不可恢复')} ), onOk() { @@ -249,12 +250,13 @@ const Script = () => { title: `确认删除`, content: ( <> - 确认删除 + {intl.get('确认删除')} {select} - 文件{currentNode.type === 'directory' ? '夹及其子文件' : ''} - ,删除后不可恢复 + {intl.get('文件')} + {currentNode.type === 'directory' ? intl.get('夹及其子文件') : ''} + {intl.get(',删除后不可恢复')} ), onOk() { @@ -358,7 +360,7 @@ const Script = () => { const initState = () => { setSelect(''); setCurrentNode(null); - setValue('请选择脚本文件'); + setValue(intl.get('请选择脚本文件')); }; useEffect(() => { @@ -406,8 +408,8 @@ const Script = () => { const menu: MenuProps = isEditing ? { items: [ - { label: '保存', key: 'save', icon: }, - { label: '退出编辑', key: 'exit', icon: }, + { label: intl.get('保存'), key: 'save', icon: }, + { label: intl.get('退出编辑'), key: 'exit', icon: }, ], onClick: ({ key, domEvent }) => { domEvent.stopPropagation(); @@ -416,21 +418,21 @@ const Script = () => { } : { items: [ - { label: '新建', key: 'add', icon: }, + { label: intl.get('创建'), key: 'add', icon: }, { - label: '编辑', + label: intl.get('编辑'), key: 'edit', icon: , disabled: !select, }, { - label: '重命名', + label: intl.get('重命名'), key: 'rename', icon: , disabled: !select, }, { - label: '删除', + label: intl.get('删除'), key: 'delete', icon: , disabled: !select, @@ -456,7 +458,7 @@ const Script = () => { value={select} dropdownStyle={{ maxHeight: 400, overflow: 'auto' }} treeData={data} - placeholder="请选择脚本" + placeholder={intl.get('请选择脚本')} fieldNames={{ value: 'key' }} treeNodeFilterProp="title" showSearch @@ -470,21 +472,21 @@ const Script = () => { : isEditing ? [ , , ] : [ - + , ] } @@ -532,7 +534,7 @@ const Script = () => {
@@ -560,7 +562,7 @@ const Script = () => { }} >
diff --git a/src/pages/script/renameModal.tsx b/src/pages/script/renameModal.tsx index 17c0b8c7..86e033aa 100644 --- a/src/pages/script/renameModal.tsx +++ b/src/pages/script/renameModal.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useEffect, useState } from 'react'; import { Modal, message, Input, Form } from 'antd'; import { request } from '@/utils/http'; @@ -43,7 +44,7 @@ const RenameModal = ({ return ( - + diff --git a/src/pages/script/saveModal.tsx b/src/pages/script/saveModal.tsx index 31c45f00..52dedaea 100644 --- a/src/pages/script/saveModal.tsx +++ b/src/pages/script/saveModal.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useEffect, useState } from 'react'; import { Modal, message, Input, Form } from 'antd'; import { request } from '@/utils/http'; @@ -36,7 +37,7 @@ const SaveModal = ({ return ( - + - - + + diff --git a/src/pages/script/setting.tsx b/src/pages/script/setting.tsx index 09fe1643..54758286 100644 --- a/src/pages/script/setting.tsx +++ b/src/pages/script/setting.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useEffect, useState } from 'react'; import { Modal, message, Input, Form } from 'antd'; import { request } from '@/utils/http'; @@ -36,7 +37,7 @@ const SettingModal = ({ return ( - + diff --git a/src/pages/setting/about.tsx b/src/pages/setting/about.tsx index 291768ea..491edf53 100644 --- a/src/pages/setting/about.tsx +++ b/src/pages/setting/about.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useEffect, useState } from 'react'; import { Typography, Input, Form, Button, message, Descriptions } from 'antd'; import styles from './index.less'; @@ -20,27 +21,25 @@ const About = ({ systemInfo }: { systemInfo: SharedContext['systemInfo'] }) => { src="https://qn.whyour.cn/logo.png" />
- 青龙 + {intl.get('青龙')} - 支持python3、javaScript、shell、typescript 的定时任务管理面板(A timed - task management panel that supports typescript, javaScript, python3, - and shell.) + {intl.get( + '支持python3、javascript、shell、typescript 的定时任务管理面板', + )} - - {TVersion[systemInfo.branch]} v{systemInfo.version} + + {intl.get(TVersion[systemInfo.branch])} v{systemInfo.version} - - {dayjs(systemInfo.publishTime * 1000).format( - 'YYYY-MM-DD HH:mm', - )} + + {dayjs(systemInfo.publishTime * 1000).format('YYYY-MM-DD HH:mm')} - + - 查看 + {intl.get('查看')} @@ -57,13 +56,13 @@ const About = ({ systemInfo }: { systemInfo: SharedContext['systemInfo'] }) => { target="_blank" style={{ marginRight: 15 }} > - Telegram频道 + {intl.get('Telegram频道')} - 提交BUG + {intl.get('提交BUG')}
diff --git a/src/pages/setting/appModal.tsx b/src/pages/setting/appModal.tsx index bbdd18c5..d83cfd15 100644 --- a/src/pages/setting/appModal.tsx +++ b/src/pages/setting/appModal.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useEffect, useState } from 'react'; import { Modal, message, Input, Form, Select } from 'antd'; import { request } from '@/utils/http'; @@ -29,7 +30,9 @@ const AppModal = ({ ); if (code === 200) { - message.success(app ? '更新应用成功' : '新建应用成功'); + message.success( + app ? intl.get('更新应用成功') : intl.get('创建应用成功'), + ); handleCancel(data); } setLoading(false); @@ -44,7 +47,7 @@ const AppModal = ({ return ( ['system'].includes(value) - ? Promise.reject(new Error('名称不能为保留关键字')) + ? Promise.reject(new Error(intl.get('名称不能为保留关键字'))) : Promise.resolve(), }, ]} > - + - + { placeholder="123456" /> ) : ( @@ -176,35 +178,35 @@ const SecuritySettings = ({ user, userChange }: any) => { paddingBottom: 4, }} > - 修改用户名密码 + {intl.get('修改用户名密码')}
- + - +
@@ -217,14 +219,14 @@ const SecuritySettings = ({ user, userChange }: any) => { marginTop: 16, }} > - 两步验证 + {intl.get('两步验证')}
{ marginTop: 16, }} > - 头像 + {intl.get('头像')}
} src={avatar} /> @@ -252,7 +254,7 @@ const SecuritySettings = ({ user, userChange }: any) => { }} > diff --git a/src/pages/subscription/index.tsx b/src/pages/subscription/index.tsx index ed6ffea7..b955aa0e 100644 --- a/src/pages/subscription/index.tsx +++ b/src/pages/subscription/index.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useState, useEffect, useRef } from 'react'; import { Button, @@ -64,7 +65,7 @@ const Subscription = () => { const columns: any = [ { - title: '名称', + title: intl.get('名称'), dataIndex: 'name', key: 'name', width: 150, @@ -74,7 +75,7 @@ const Subscription = () => { }, }, { - title: '链接', + title: intl.get('链接'), dataIndex: 'url', key: 'url', sorter: { @@ -96,7 +97,7 @@ const Subscription = () => { }, }, { - title: '类型', + title: intl.get('类型'), dataIndex: 'type', key: 'type', width: 130, @@ -105,7 +106,7 @@ const Subscription = () => { }, }, { - title: '分支', + title: intl.get('分支'), dataIndex: 'branch', key: 'branch', width: 130, @@ -114,7 +115,7 @@ const Subscription = () => { }, }, { - title: '定时规则', + title: intl.get('定时规则'), width: 180, render: (text: string, record: any) => { if (record.schedule_type === 'interval') { @@ -125,21 +126,21 @@ const Subscription = () => { }, }, { - title: '状态', + title: intl.get('状态'), key: 'status', dataIndex: 'status', width: 110, filters: [ { - text: '运行中', + text: intl.get('运行中'), value: 0, }, { - text: '空闲中', + text: intl.get('空闲中'), value: 1, }, { - text: '已禁用', + text: intl.get('已禁用'), value: 2, }, ], @@ -157,7 +158,7 @@ const Subscription = () => { <> {record.status === SubscriptionStatus.idle && ( } color="default"> - 空闲中 + {intl.get('空闲中')} )} {record.status === SubscriptionStatus.running && ( @@ -165,7 +166,7 @@ const Subscription = () => { icon={} color="processing" > - 运行中 + {intl.get('运行中')} )} @@ -173,14 +174,14 @@ const Subscription = () => { {record.is_disabled === 1 && record.status === SubscriptionStatus.idle && ( } color="error"> - 已禁用 + {intl.get('已禁用')} )} ), }, { - title: '操作', + title: intl.get('操作'), key: 'action', width: 130, render: (text: string, record: any, index: number) => { @@ -188,7 +189,7 @@ const Subscription = () => { return ( {record.status === SubscriptionStatus.idle && ( - + { e.stopPropagation(); @@ -200,7 +201,7 @@ const Subscription = () => { )} {record.status !== SubscriptionStatus.idle && ( - + { e.stopPropagation(); @@ -211,7 +212,7 @@ const Subscription = () => { )} - + { e.stopPropagation(); @@ -242,14 +243,14 @@ const Subscription = () => { const runSubscription = (record: any, index: number) => { Modal.confirm({ - title: '确认运行', + title: intl.get('确认运行'), content: ( <> - 确认运行定时任务{' '} + {intl.get('确认运行定时任务')}{' '} {record.name} {' '} - 吗 + {intl.get('吗')} ), onOk() { @@ -277,14 +278,14 @@ const Subscription = () => { const stopSubsciption = (record: any, index: number) => { Modal.confirm({ - title: '确认停止', + title: intl.get('确认停止'), content: ( <> - 确认停止定时任务{' '} + {intl.get('确认停止定时任务')}{' '} {record.name} {' '} - 吗 + {intl.get('吗')} ), onOk() { @@ -336,14 +337,14 @@ const Subscription = () => { const delSubscription = (record: any, index: number) => { Modal.confirm({ - title: '确认删除', + title: intl.get('确认删除'), content: ( <> - 确认删除定时订阅{' '} + {intl.get('确认删除定时订阅')}{' '} {record.name} {' '} - 吗 + {intl.get('吗')} ), onOk() { @@ -369,15 +370,18 @@ const Subscription = () => { const enabledOrDisabledSubscription = (record: any, index: number) => { Modal.confirm({ - title: `确认${record.is_disabled === 1 ? '启用' : '禁用'}`, + title: `确认${ + record.is_disabled === 1 ? intl.get('启用') : intl.get('禁用') + }`, content: ( <> - 确认{record.is_disabled === 1 ? '启用' : '禁用'} - 定时订阅{' '} + {intl.get('确认')} + {record.is_disabled === 1 ? intl.get('启用') : intl.get('禁用')} + {intl.get('定时订阅')}{' '} {record.name} {' '} - 吗 + {intl.get('吗')} ), onOk() { @@ -418,9 +422,10 @@ const Subscription = () => { trigger={['click']} menu={{ items: [ - { label: '编辑', key: 'edit', icon: }, + { label: intl.get('编辑'), key: 'edit', icon: }, { - label: record.is_disabled === 1 ? '启用' : '禁用', + label: + record.is_disabled === 1 ? intl.get('启用') : intl.get('禁用'), key: 'enableOrDisable', icon: record.is_disabled === 1 ? ( @@ -429,7 +434,7 @@ const Subscription = () => { ), }, - { label: '删除', key: 'delete', icon: }, + { label: intl.get('删除'), key: 'delete', icon: }, ], onClick: ({ key, domEvent }) => { domEvent.stopPropagation(); @@ -531,10 +536,10 @@ const Subscription = () => { return ( { onSearch={onSearch} />, , ]} header={{ diff --git a/src/pages/subscription/logModal.tsx b/src/pages/subscription/logModal.tsx index f450b36b..51bb292e 100644 --- a/src/pages/subscription/logModal.tsx +++ b/src/pages/subscription/logModal.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useEffect, useState } from 'react'; import { Modal, message, Input, Form, Statistic, Button } from 'antd'; import { request } from '@/utils/http'; @@ -43,7 +44,7 @@ const SubscriptionLogModal = ({ localStorage.getItem('logSubscription') === String(subscription.id) ) { const log = data as string; - setValue(log || '暂无日志'); + setValue(log || intl.get('暂无日志')); setExecuting(log && !logEnded(log)); if (log && !logEnded(log)) { setTimeout(() => { @@ -106,7 +107,7 @@ const SubscriptionLogModal = ({ onCancel={() => cancel()} footer={[ , ]} > diff --git a/src/pages/subscription/modal.tsx b/src/pages/subscription/modal.tsx index d97e25b2..a3e5795c 100644 --- a/src/pages/subscription/modal.tsx +++ b/src/pages/subscription/modal.tsx @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import React, { useCallback, useEffect, useState } from 'react'; import { Modal, @@ -50,7 +51,9 @@ const SubscriptionModal = ({ payload, ); if (code === 200) { - message.success(subscription ? '更新订阅成功' : '新建订阅成功'); + message.success( + subscription ? intl.get('更新订阅成功') : intl.get('创建订阅成功'), + ); handleCancel(data); } setLoading(false); @@ -141,7 +144,7 @@ const SubscriptionModal = ({ return ( ); @@ -170,31 +173,31 @@ const SubscriptionModal = ({ return type === 'ssh-key' ? ( ) : ( <> - + - + ); @@ -274,7 +277,7 @@ const SubscriptionModal = ({ return (
- + - 公开仓库 - 私有仓库 - 单文件 + {intl.get('公开仓库')} + {intl.get('私有仓库')} + {intl.get('单文件')} {type !== 'file' && ( - + @@ -338,23 +345,23 @@ const SubscriptionModal = ({ )} - + {type === 'private-repo' && ( <> - 私钥 - 用户名密码/Token + {intl.get('私钥')} + {intl.get('用户名密码/Token')} @@ -362,7 +369,7 @@ const SubscriptionModal = ({ )} @@ -373,7 +380,7 @@ const SubscriptionModal = ({ ) : ( - + )} {type !== 'file' && ( <> - + )} @@ -487,7 +508,7 @@ const SubscriptionModal = ({ diff --git a/src/utils/config.ts b/src/utils/config.ts index afa99905..074d7c22 100644 --- a/src/utils/config.ts +++ b/src/utils/config.ts @@ -1,7 +1,8 @@ +import intl from 'react-intl-universal'; const baseUrl = window.__ENV__QlBaseUrl || '/'; export default { - siteName: '青龙', + siteName: intl.get('青龙'), apiPrefix: `${baseUrl}api/`, authKey: 'token', @@ -30,7 +31,7 @@ export default { }, { key: 'zh', - title: '中文', + title: intl.get('中文'), flag: '/china.svg', }, ], @@ -38,254 +39,302 @@ export default { }, scopes: [ { - name: '定时任务', + name: intl.get('定时任务'), value: 'crons', }, { - name: '环境变量', + name: intl.get('环境变量'), value: 'envs', }, { - name: '订阅管理', + name: intl.get('订阅管理'), value: 'subscriptions', }, { - name: '配置文件', + name: intl.get('配置文件'), value: 'configs', }, { - name: '脚本管理', + name: intl.get('脚本管理'), value: 'scripts', }, { - name: '日志管理', + name: intl.get('日志管理'), value: 'logs', }, { - name: '依赖管理', + name: intl.get('依赖管理'), value: 'dependencies', }, { - name: '系统信息', + name: intl.get('系统信息'), value: 'system', }, ], scopesMap: { - crons: '定时任务', - envs: '环境变量', - subscriptions: '订阅管理', - configs: '配置文件', - scripts: '脚本管理', - logs: '日志管理', - dependencies: '依赖管理', - system: '系统信息', + crons: intl.get('定时任务'), + envs: intl.get('环境变量'), + subscriptions: intl.get('订阅管理'), + configs: intl.get('配置文件'), + scripts: intl.get('脚本管理'), + logs: intl.get('日志管理'), + dependencies: intl.get('依赖管理'), + system: intl.get('系统信息'), }, notificationModes: [ { value: 'gotify', label: 'Gotify' }, { value: 'goCqHttpBot', label: 'GoCqHttpBot' }, - { value: 'serverChan', label: 'Server酱' }, + { value: 'serverChan', label: intl.get('Server酱') }, { value: 'pushDeer', label: 'PushDeer' }, { value: 'bark', label: 'Bark' }, - { value: 'telegramBot', label: 'Telegram机器人' }, - { value: 'dingtalkBot', label: '钉钉机器人' }, - { value: 'weWorkBot', label: '企业微信机器人' }, - { value: 'weWorkApp', label: '企业微信应用' }, - { value: 'aibotk', label: '智能微秘书' }, + { value: 'telegramBot', label: intl.get('Telegram机器人') }, + { value: 'dingtalkBot', label: intl.get('钉钉机器人') }, + { value: 'weWorkBot', label: intl.get('企业微信机器人') }, + { value: 'weWorkApp', label: intl.get('企业微信应用') }, + { value: 'aibotk', label: intl.get('智能微秘书') }, { value: 'iGot', label: 'IGot' }, { value: 'pushPlus', label: 'PushPlus' }, - { value: 'chat', label: '群晖chat' }, - { value: 'email', label: '邮箱' }, - { value: 'lark', label: '飞书机器人' }, + { value: 'chat', label: intl.get('群晖chat') }, + { value: 'email', label: intl.get('邮箱') }, + { value: 'lark', label: intl.get('飞书机器人') }, { value: 'pushMe', label: 'PushMe' }, - { value: 'webhook', label: '自定义通知' }, - { value: 'closed', label: '已关闭' }, + { value: 'webhook', label: intl.get('自定义通知') }, + { value: 'closed', label: intl.get('已关闭') }, ], notificationModeMap: { gotify: [ { label: 'gotifyUrl', - tip: 'gotify的url地址,例如 https://push.example.de:8080', + tip: intl.get('gotify的url地址,例如 https://push.example.de:8080'), required: true, }, - { label: 'gotifyToken', tip: 'gotify的消息应用token码', required: true }, - { label: 'gotifyPriority', tip: '推送消息的优先级' }, + { + label: 'gotifyToken', + tip: intl.get('gotify的消息应用token码'), + required: true, + }, + { label: 'gotifyPriority', tip: intl.get('推送消息的优先级') }, ], chat: [ { label: 'chatUrl', - tip: 'chat的url地址', + tip: intl.get('chat的url地址'), required: true, }, - { label: 'chatToken', tip: 'chat的token码', required: true }, + { label: 'chatToken', tip: intl.get('chat的token码'), required: true }, ], goCqHttpBot: [ { label: 'goCqHttpBotUrl', - tip: '推送到个人QQ: http://127.0.0.1/send_private_msg,群:http://127.0.0.1/send_group_msg', + tip: intl.get( + '推送到个人QQ: http://127.0.0.1/send_private_msg,群:http://127.0.0.1/send_group_msg', + ), required: true, }, - { label: 'goCqHttpBotToken', tip: '访问密钥', required: true }, + { label: 'goCqHttpBotToken', tip: intl.get('访问密钥'), required: true }, { label: 'goCqHttpBotQq', - tip: '如果GOBOT_URL设置 /send_private_msg 则需要填入 user_id=个人QQ 相反如果是 /send_group_msg 则需要填入 group_id=QQ群', + tip: intl.get( + '如果GOBOT_URL设置 /send_private_msg 则需要填入 user_id=个人QQ 相反如果是 /send_group_msg 则需要填入 group_id=QQ群', + ), required: true, }, ], serverChan: [ - { label: 'serverChanKey', tip: 'Server酱SENDKEY', required: true }, + { + label: 'serverChanKey', + tip: intl.get('Server酱SENDKEY'), + required: true, + }, ], pushDeer: [ { label: 'pushDeerKey', - tip: 'PushDeer的Key,https://github.com/easychen/pushdeer', + tip: intl.get('PushDeer的Key,https://github.com/easychen/pushdeer'), required: true, }, { label: 'pushDeerUrl', - tip: 'PushDeer的自架API endpoint,默认是 https://api2.pushdeer.com/message/push', + tip: intl.get( + 'PushDeer的自架API endpoint,默认是 https://api2.pushdeer.com/message/push', + ), }, ], bark: [ { label: 'barkPush', - tip: 'Bark的信息IP/设备码,例如:https://api.day.app/XXXXXXXX', + tip: intl.get( + 'Bark的信息IP/设备码,例如:https://api.day.app/XXXXXXXX', + ), required: true, }, { label: 'barkIcon', - tip: 'BARK推送图标,自定义推送图标 (需iOS15或以上才能显示)', + tip: intl.get('BARK推送图标,自定义推送图标 (需iOS15或以上才能显示)'), + }, + { + label: 'barkSound', + tip: intl.get('BARK推送铃声,铃声列表去APP查看复制填写'), + }, + { + label: 'barkGroup', + tip: intl.get('BARK推送消息的分组, 默认为qinglong'), }, - { label: 'barkSound', tip: 'BARK推送铃声,铃声列表去APP查看复制填写' }, - { label: 'barkGroup', tip: 'BARK推送消息的分组, 默认为qinglong' }, ], telegramBot: [ { label: 'telegramBotToken', - tip: 'telegram机器人的token,例如:1077xxx4424:AAFjv0FcqxxxxxxgEMGfi22B4yh15R5uw', + tip: intl.get( + 'telegram机器人的token,例如:1077xxx4424:AAFjv0FcqxxxxxxgEMGfi22B4yh15R5uw', + ), required: true, }, { label: 'telegramBotUserId', - tip: 'telegram用户的id,例如:129xxx206', + tip: intl.get('telegram用户的id,例如:129xxx206'), required: true, }, - { label: 'telegramBotProxyHost', tip: '代理IP' }, - { label: 'telegramBotProxyPort', tip: '代理端口' }, + { label: 'telegramBotProxyHost', tip: intl.get('代理IP') }, + { label: 'telegramBotProxyPort', tip: intl.get('代理端口') }, { label: 'telegramBotProxyAuth', - tip: 'telegram代理配置认证参数, 用户名与密码用英文冒号连接 user:password', + tip: intl.get( + 'telegram代理配置认证参数, 用户名与密码用英文冒号连接 user:password', + ), }, { label: 'telegramBotApiHost', - tip: 'telegram api自建的反向代理地址,默认tg官方api', + tip: intl.get('telegram api自建的反向代理地址,默认tg官方api'), }, ], dingtalkBot: [ { label: 'dingtalkBotToken', - tip: '钉钉机器人webhook token,例如:5a544165465465645d0f31dca676e7bd07415asdasd', + tip: intl.get( + '钉钉机器人webhook token,例如:5a544165465465645d0f31dca676e7bd07415asdasd', + ), required: true, }, { label: 'dingtalkBotSecret', - tip: '密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串', + tip: intl.get( + '密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串', + ), }, ], weWorkBot: [ { label: 'weWorkBotKey', - tip: '企业微信机器人的 webhook(详见文档 https://work.weixin.qq.com/api/doc/90000/90136/91770),例如:693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa', + tip: intl.get( + '企业微信机器人的 webhook(详见文档 https://work.weixin.qq.com/api/doc/90000/90136/91770),例如:693a91f6-7xxx-4bc4-97a0-0ec2sifa5aaa', + ), required: true, }, { label: 'weWorkOrigin', - tip: '企业微信代理地址', + tip: intl.get('企业微信代理地址'), }, ], weWorkApp: [ { label: 'weWorkAppKey', - tip: 'corpid,corpsecret,touser(注:多个成员ID使用|隔开),agentid,消息类型(选填,不填默认文本消息类型) 注意用,号隔开(英文输入法的逗号),例如:wwcfrs,B-76WERQ,qinglong,1000001,2COat', + tip: intl.get( + 'corpid,corpsecret,touser(注:多个成员ID使用|隔开),agentid,消息类型(选填,不填默认文本消息类型) 注意用,号隔开(英文输入法的逗号),例如:wwcfrs,B-76WERQ,qinglong,1000001,2COat', + ), required: true, }, { label: 'weWorkOrigin', - tip: '企业微信代理地址', + tip: intl.get('企业微信代理地址'), }, ], aibotk: [ { label: 'aibotkKey', - tip: '密钥key,智能微秘书个人中心获取apikey,申请地址:https://wechat.aibotk.com/signup?from=ql', + tip: intl.get( + '密钥key,智能微秘书个人中心获取apikey,申请地址:https://wechat.aibotk.com/signup?from=ql', + ), required: true, }, { label: 'aibotkType', - tip: '发送的目标,群组或者好友', + tip: intl.get('发送的目标,群组或者好友'), required: true, - placeholder: '请输入要发送的目标', + placeholder: intl.get('请输入要发送的目标'), items: [ - { value: 'room', label: '群聊' }, - { value: 'contact', label: '好友' }, + { value: 'room', label: intl.get('群聊') }, + { value: 'contact', label: intl.get('好友') }, ], }, { label: 'aibotkName', - tip: '要发送的用户昵称或群名,如果目标是群,需要填群名,如果目标是好友,需要填好友昵称', + tip: intl.get( + '要发送的用户昵称或群名,如果目标是群,需要填群名,如果目标是好友,需要填好友昵称', + ), required: true, }, ], iGot: [ { label: 'iGotPushKey', - tip: 'iGot的信息推送key,例如:https://push.hellyw.com/XXXXXXXX', + tip: intl.get( + 'iGot的信息推送key,例如:https://push.hellyw.com/XXXXXXXX', + ), required: true, }, ], pushPlus: [ { label: 'pushPlusToken', - tip: '微信扫码登录后一对一推送或一对多推送下面的token(您的Token),不提供PUSH_PLUS_USER则默认为一对一推送,参考 https://www.pushplus.plus/', + tip: intl.get( + '微信扫码登录后一对一推送或一对多推送下面的token(您的Token),不提供PUSH_PLUS_USER则默认为一对一推送,参考 https://www.pushplus.plus/', + ), required: true, }, { label: 'pushPlusUser', - tip: '一对多推送的“群组编码”(一对多推送下面->您的群组(如无则新建)->群组编码,如果您是创建群组人。也需点击“查看二维码”扫描绑定,否则不能接受群组消息推送)', + tip: intl.get( + '一对多推送的“群组编码”(一对多推送下面->您的群组(如无则新建)->群组编码,如果您是创建群组人。也需点击“查看二维码”扫描绑定,否则不能接受群组消息推送)', + ), }, ], lark: [ { label: 'larkKey', - tip: '飞书群组机器人:https://www.feishu.cn/hc/zh-CN/articles/360024984973', + tip: intl.get( + '飞书群组机器人:https://www.feishu.cn/hc/zh-CN/articles/360024984973', + ), required: true, }, ], email: [ { label: 'emailService', - tip: '邮箱服务名称,比如126、163、Gmail、QQ等,支持列表https://nodemailer.com/smtp/well-known/', + tip: intl.get( + '邮箱服务名称,比如126、163、Gmail、QQ等,支持列表https://nodemailer.com/smtp/well-known/', + ), required: true, }, - { label: 'emailUser', tip: '邮箱地址', required: true }, - { label: 'emailPass', tip: '邮箱SMTP授权码', required: true }, + { label: 'emailUser', tip: intl.get('邮箱地址'), required: true }, + { label: 'emailPass', tip: intl.get('邮箱SMTP授权码'), required: true }, ], pushMe: [ { label: 'pushMeKey', - tip: 'PushMe的Key,https://push.i-i.me/', + tip: intl.get('PushMe的Key,https://push.i-i.me/'), required: true, }, ], webhook: [ { label: 'webhookMethod', - tip: '请求方法', + tip: intl.get('请求方法'), required: true, items: [{ value: 'GET' }, { value: 'POST' }, { value: 'PUT' }], }, { label: 'webhookContentType', - tip: '请求头Content-Type', + tip: intl.get('请求头Content-Type'), required: true, items: [ { value: 'application/json' }, @@ -295,35 +344,39 @@ export default { }, { label: 'webhookUrl', - tip: '请求链接以http或者https开头。url或者body中必须包含$title,$content可选,对应api内容的位置', + tip: intl.get( + '请求链接以http或者https开头。url或者body中必须包含$title,$content可选,对应api内容的位置', + ), required: true, placeholder: 'https://xxx.cn/api?content=$title\n', }, { label: 'webhookHeaders', - tip: '请求头格式Custom-Header1: Header1,多个换行分割', + tip: intl.get('请求头格式Custom-Header1: Header1,多个换行分割'), placeholder: 'Custom-Header1: Header1\nCustom-Header2: Header2', }, { label: 'webhookBody', - tip: '请求体格式key1: value1,多个换行分割。url或者body中必须包含$title,$content可选,对应api内容的位置', + tip: intl.get( + '请求体格式key1: value1,多个换行分割。url或者body中必须包含$title,$content可选,对应api内容的位置', + ), placeholder: 'key1: $title\nkey2: $content', }, ], }, documentTitleMap: { - '/login': '登录', - '/initialization': '初始化', - '/crontab': '定时任务', - '/env': '环境变量', - '/subscription': '订阅管理', - '/config': '配置文件', - '/script': '脚本管理', - '/diff': '对比工具', - '/log': '日志管理', - '/setting': '系统设置', - '/error': '错误日志', - '/dependence': '依赖管理', + '/login': intl.get('登录'), + '/initialization': intl.get('初始化'), + '/crontab': intl.get('定时任务'), + '/env': intl.get('环境变量'), + '/subscription': intl.get('订阅管理'), + '/config': intl.get('配置文件'), + '/script': intl.get('脚本管理'), + '/diff': intl.get('对比工具'), + '/log': intl.get('日志管理'), + '/setting': intl.get('系统设置'), + '/error': intl.get('错误日志'), + '/dependence': intl.get('依赖管理'), }, dependenceTypes: ['nodejs', 'python3', 'linux'], }; diff --git a/src/utils/http.ts b/src/utils/http.ts index 5dc1d20a..ada85f1a 100644 --- a/src/utils/http.ts +++ b/src/utils/http.ts @@ -1,11 +1,7 @@ import { message } from 'antd'; import config from './config'; import { history } from '@umijs/max'; -import axios, { - AxiosError, - AxiosInstance, - AxiosRequestConfig, -} from 'axios'; +import axios, { AxiosError, AxiosInstance, AxiosRequestConfig } from 'axios'; interface IResponseData { code?: number; @@ -26,9 +22,7 @@ message.config({ }); const time = Date.now(); -const errorHandler = function ( - error: AxiosError, -) { +const errorHandler = function (error: AxiosError) { if (error.response) { const msg = error.response.data ? error.response.data.message || error.message || error.response.data @@ -99,29 +93,32 @@ _request.interceptors.response.use(async (response) => { }); } return res; - } catch (error) { } + } catch (error) {} return response; } return response; }, errorHandler); -export const request = _request as Override( - url: string, - config?: AxiosRequestConfig, - ): Promise; - delete( - url: string, - config?: AxiosRequestConfig, - ): Promise; - post( - url: string, - data?: D, - config?: AxiosRequestConfig, - ): Promise; - put( - url: string, - data?: D, - config?: AxiosRequestConfig, - ): Promise; -}>; +export const request = _request as Override< + AxiosInstance, + { + get( + url: string, + config?: AxiosRequestConfig, + ): Promise; + delete( + url: string, + config?: AxiosRequestConfig, + ): Promise; + post( + url: string, + data?: D, + config?: AxiosRequestConfig, + ): Promise; + put( + url: string, + data?: D, + config?: AxiosRequestConfig, + ): Promise; + } +>; diff --git a/src/utils/index.ts b/src/utils/index.ts index 44297cf7..a96262b4 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,3 +1,4 @@ +import intl from 'react-intl-universal'; import { LOG_END_SYMBOL } from './const'; import cron_parser from 'cron-parser'; @@ -297,7 +298,7 @@ export function findNode & { children?: T[] }>( } export function logEnded(log: string): boolean { - const endTips = [LOG_END_SYMBOL, '执行结束']; + const endTips = [LOG_END_SYMBOL, intl.get('执行结束')]; return endTips.some((x) => log.includes(x)); }