diff --git a/frontend_vue/src/mock/index.js b/frontend_vue/src/mock/index.js index 70cfb24..5f4fa3f 100644 --- a/frontend_vue/src/mock/index.js +++ b/frontend_vue/src/mock/index.js @@ -1,15 +1,15 @@ import { isIE } from '@/utils/util' -// 本地开发已有完整后端 API,禁用 mock 以避免请求被拦截 -// 如需启用 mock,将下面的 false 改为 true +// Local development already has a complete backend API, so mock is disabled +// to avoid intercepting real requests. Set this to true if you need mock data. const ENABLE_MOCK = false -// 判断环境不是 prod 或者 preview 是 true 时,加载 mock 服务 +// Load mock services only outside production, or when preview mode is enabled. if (ENABLE_MOCK && (process.env.NODE_ENV !== 'production' || process.env.VUE_APP_PREVIEW === 'true')) { if (isIE()) { } - // 使用同步加载依赖 - // 防止 vuex 中的 GetInfo 早于 mock 运行,导致无法 mock 请求返回结果 + // Use synchronous loading so the mock layer is ready before Vuex requests + // run. This prevents early GetInfo calls from bypassing mocked responses. const Mock = require('mockjs2') require('./services/auth') require('./services/user') diff --git a/frontend_vue/src/router/README.md b/frontend_vue/src/router/README.md index b736444..993a7c5 100644 --- a/frontend_vue/src/router/README.md +++ b/frontend_vue/src/router/README.md @@ -1,8 +1,8 @@ -路由/菜单说明 +Router and Menu Notes ==== -格式和说明 +Format and Overview ---- ```ecmascript 6 @@ -22,34 +22,32 @@ const routerObject = { -`{ Route }` 对象 +`{ Route }` object -| 参数 | 说明 | 类型 | 默认值 | -| -------- | ----------------------------------------- | ------- | ------ | -| hidden | 控制路由是否显示在 sidebar | boolean | false | -| redirect | 重定向地址, 访问这个路由时,自定进行重定向 | string | - | -| name | 路由名称, 必须设置,且不能重名 | string | - | -| meta | 路由元信息(路由附带扩展信息) | object | {} | -| hideChildrenInMenu | 强制菜单显示为Item而不是SubItem(配合 meta.hidden) | boolean | - | +| Field | Description | Type | Default | +| ----- | ----------- | ---- | ------- | +| hidden | Controls whether the route is shown in the sidebar | boolean | false | +| redirect | Redirect target used when the route is accessed | string | - | +| name | Route name. Must be unique and is required | string | - | +| meta | Route metadata (extended route information) | object | {} | +| hideChildrenInMenu | Forces the menu to render as an item instead of a submenu, typically used with `meta.hidden` | boolean | - | -`{ Meta }` 路由元信息对象 +`{ Meta }` route metadata object -| 参数 | 说明 | 类型 | 默认值 | -| ------------------- | ------------------------------------------------------------ | ------- | ------ | -| title | 路由标题, 用于显示面包屑, 页面标题 *推荐设置 | string | - | -| icon | 路由在 menu 上显示的图标 | [string,svg] | - | -| keepAlive | 缓存该路由 | boolean | false | -| target | 菜单链接跳转目标(参考 html a 标记) | string | - | -| hidden | 配合`hideChildrenInMenu`使用,用于隐藏菜单时,提供递归到父菜单显示 选中菜单项_(可参考 个人页 配置方式)_ | boolean | false | -| hiddenHeaderContent | *特殊 隐藏 [PageHeader](https://github.com/vueComponent/ant-design-vue-pro/blob/master/src/components/PageHeader/PageHeader.vue#L6) 组件中的页面带的 面包屑和页面标题栏 | boolean | false | -| permission | 与项目提供的权限拦截匹配的权限,如果不匹配,则会被禁止访问该路由页面 | array | [] | +| Field | Description | Type | Default | +| ----- | ----------- | ---- | ------- | +| title | Route title used for breadcrumbs and page titles. Recommended | string | - | +| icon | Icon shown in the menu | [string,svg] | - | +| keepAlive | Whether the route should be cached | boolean | false | +| target | Link target for menu navigation, similar to the HTML `a` tag | string | - | +| hidden | Used together with `hideChildrenInMenu` to keep the correct parent menu item selected when the current menu node is hidden | boolean | false | +| hiddenHeaderContent | Hides the breadcrumb and page header content in the [PageHeader](https://github.com/vueComponent/ant-design-vue-pro/blob/master/src/components/PageHeader/PageHeader.vue#L6) component | boolean | false | +| permission | Permission keys checked by the app permission guard. Routes without a matching permission are blocked | array | [] | -> 路由自定义 `Icon` 请引入自定义 `svg` Icon 文件,然后传递给路由的 `meta.icon` 参数即可 +> For a custom route `Icon`, import the corresponding custom `svg` file and pass it through the route `meta.icon` field. -路由构建例子方案1 - -路由例子 +Example Route Configuration ---- ```ecmascript 6 @@ -58,7 +56,7 @@ const asyncRouterMap = [ path: '/', name: 'index', component: BasicLayout, - meta: { title: '首页' }, + meta: { title: 'Home' }, redirect: '/ai-analysis', children: [ { @@ -66,51 +64,51 @@ const asyncRouterMap = [ component: RouteView, name: 'dashboard', redirect: '/dashboard/workplace', - meta: {title: '仪表盘', icon: 'dashboard', permission: ['dashboard']}, + meta: { title: 'Dashboard', icon: 'dashboard', permission: ['dashboard'] }, children: [ { path: '/ai-analysis', name: 'Analysis', component: () => import('@/views/dashboard/Analysis'), - meta: {title: '分析页', permission: ['dashboard']} + meta: { title: 'Analysis', permission: ['dashboard'] } }, { path: '/dashboard/monitor', name: 'Monitor', hidden: true, component: () => import('@/views/dashboard/Monitor'), - meta: {title: '监控页', permission: ['dashboard']} + meta: { title: 'Monitor', permission: ['dashboard'] } }, { path: '/dashboard/workplace', name: 'Workplace', component: () => import('@/views/dashboard/Workplace'), - meta: {title: '工作台', permission: ['dashboard']} + meta: { title: 'Workplace', permission: ['dashboard'] } } ] }, - // result + // Result pages { path: '/result', name: 'result', component: PageView, redirect: '/result/success', - meta: { title: '结果页', icon: 'check-circle-o', permission: [ 'result' ] }, + meta: { title: 'Result', icon: 'check-circle-o', permission: [ 'result' ] }, children: [ { path: '/result/success', name: 'ResultSuccess', component: () => import(/* webpackChunkName: "result" */ '@/views/result/Success'), - // 该页面隐藏面包屑和页面标题栏 - meta: { title: '成功', hiddenHeaderContent: true, permission: [ 'result' ] } + // This page hides breadcrumbs and the page title bar. + meta: { title: 'Success', hiddenHeaderContent: true, permission: [ 'result' ] } }, { path: '/result/fail', name: 'ResultFail', component: () => import(/* webpackChunkName: "result" */ '@/views/result/Error'), - // 该页面隐藏面包屑和页面标题栏 - meta: { title: '失败', hiddenHeaderContent: true, permission: [ 'result' ] } + // This page hides breadcrumbs and the page title bar. + meta: { title: 'Failure', hiddenHeaderContent: true, permission: [ 'result' ] } } ] }, @@ -120,15 +118,16 @@ const asyncRouterMap = [ ] ``` -> 1. 请注意 `component: () => import('..') ` 方式引入路由的页面组件为 懒加载模式。具体可以看 [Vue 官方文档](https://router.vuejs.org/zh/guide/advanced/lazy-loading.html) -> 2. 增加新的路由应该增加在 '/' (index) 路由的 `children` 内 -> 3. 子路由的父级路由必须有 `router-view` 才能让子路由渲染出来,请仔细查阅 vue-router 文档 -> 4. `permission` 可以进行自定义修改,只需要对这个模块进行自定义修改即可 [src/store/modules/permission.js#L10](https://github.com/vueComponent/ant-design-vue-pro/blob/master/src/store/modules/permission.js#L10) +> 1. `component: () => import('..')` uses lazy-loaded route components. See the [Vue Router docs](https://router.vuejs.org/guide/advanced/lazy-loading.html) for details. +> 2. New top-level application routes should usually be added under the `'/'` route `children`. +> 3. A parent route for nested children must expose `router-view`, otherwise child routes cannot render. +> 4. The `permission` system can be customized in the corresponding permission module, for example [src/store/modules/permission.js#L10](https://github.com/vueComponent/ant-design-vue-pro/blob/master/src/store/modules/permission.js#L10). -附权限路由结构: +Permission Route Structure -![权限结构](https://static-2.loacg.com/open/static/github/permissions.png) +![Permission Structure](https://static-2.loacg.com/open/static/github/permissions.png) -第二种前端路由由后端动态生成的设计,可以前往官网文档 https://pro.antdv.com/docs/authority-management 参考 +If you prefer backend-driven dynamic route generation, refer to the official documentation: +https://pro.antdv.com/docs/authority-management diff --git a/quantdinger_vue/.browserslistrc b/quantdinger_vue/.browserslistrc deleted file mode 100644 index 8f96043..0000000 --- a/quantdinger_vue/.browserslistrc +++ /dev/null @@ -1,3 +0,0 @@ -> 1% -last 2 versions -not ie <= 10 diff --git a/quantdinger_vue/.dockerignore b/quantdinger_vue/.dockerignore deleted file mode 100644 index ac8548e..0000000 --- a/quantdinger_vue/.dockerignore +++ /dev/null @@ -1,41 +0,0 @@ -# Dependencies -node_modules/ - -# Build output (会在容器内构建) -dist/ - -# IDE -.idea/ -.vscode/ -*.swp -*.swo - -# Logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* - -# Environment -.env -.env.local -.env.*.local - -# Git -.git/ -.gitignore - -# Tests -tests/ -coverage/ -.nyc_output/ - -# Documentation -*.md -!README.md - -# OS -.DS_Store -Thumbs.db - diff --git a/quantdinger_vue/.editorconfig b/quantdinger_vue/.editorconfig deleted file mode 100644 index 6f77dff..0000000 --- a/quantdinger_vue/.editorconfig +++ /dev/null @@ -1,39 +0,0 @@ -[*] -charset=utf-8 -end_of_line=lf -insert_final_newline=false -indent_style=space -indent_size=2 - -[{*.ng,*.sht,*.html,*.shtm,*.shtml,*.htm}] -indent_style=space -indent_size=2 - -[{*.jhm,*.xslt,*.xul,*.rng,*.xsl,*.xsd,*.ant,*.tld,*.fxml,*.jrxml,*.xml,*.jnlp,*.wsdl}] -indent_style=space -indent_size=2 - -[{.babelrc,.stylelintrc,jest.config,.eslintrc,.prettierrc,*.json,*.jsb3,*.jsb2,*.bowerrc}] -indent_style=space -indent_size=2 - -[*.svg] -indent_style=space -indent_size=2 - -[*.js.map] -indent_style=space -indent_size=2 - -[*.less] -indent_style=space -indent_size=2 - -[*.vue] -indent_style=space -indent_size=2 - -[{.analysis_options,*.yml,*.yaml}] -indent_style=space -indent_size=2 - diff --git a/quantdinger_vue/.env b/quantdinger_vue/.env deleted file mode 100644 index 5a5c073..0000000 --- a/quantdinger_vue/.env +++ /dev/null @@ -1,3 +0,0 @@ -NODE_ENV=production -VUE_APP_PREVIEW=false -VUE_APP_API_BASE_URL=/api \ No newline at end of file diff --git a/quantdinger_vue/.env.development b/quantdinger_vue/.env.development deleted file mode 100644 index 166c0bc..0000000 --- a/quantdinger_vue/.env.development +++ /dev/null @@ -1,3 +0,0 @@ -NODE_ENV=development -VUE_APP_PREVIEW=true -VUE_APP_API_BASE_URL=/api \ No newline at end of file diff --git a/quantdinger_vue/.env.preview b/quantdinger_vue/.env.preview deleted file mode 100644 index a9e44c8..0000000 --- a/quantdinger_vue/.env.preview +++ /dev/null @@ -1,3 +0,0 @@ -NODE_ENV=production -VUE_APP_PREVIEW=true -VUE_APP_API_BASE_URL=/api \ No newline at end of file diff --git a/quantdinger_vue/.eslintrc.js b/quantdinger_vue/.eslintrc.js deleted file mode 100644 index 5bece06..0000000 --- a/quantdinger_vue/.eslintrc.js +++ /dev/null @@ -1,75 +0,0 @@ -module.exports = { - root: true, - env: { - node: true - }, - 'extends': [ - 'plugin:vue/strongly-recommended', - '@vue/standard' - ], - rules: { - 'no-console': 'off', - 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', - 'generator-star-spacing': 'off', - 'no-mixed-operators': 0, - 'vue/max-attributes-per-line': [ - 2, - { - 'singleline': 5, - 'multiline': { - 'max': 1, - 'allowFirstLine': false - } - } - ], - 'vue/attribute-hyphenation': 0, - 'vue/html-self-closing': 0, - 'vue/component-name-in-template-casing': 0, - 'vue/html-closing-bracket-spacing': 0, - 'vue/singleline-html-element-content-newline': 0, - 'vue/no-unused-components': 0, - 'vue/multiline-html-element-content-newline': 0, - 'vue/no-use-v-if-with-v-for': 0, - 'vue/html-closing-bracket-newline': 0, - 'vue/no-parsing-error': 0, - 'no-tabs': 0, - 'quotes': [ - 2, - 'single', - { - 'avoidEscape': true, - 'allowTemplateLiterals': true - } - ], - 'semi': [ - 2, - 'never', - { - 'beforeStatementContinuationChars': 'never' - } - ], - 'no-delete-var': 2, - 'prefer-const': [ - 2, - { - 'ignoreReadBeforeAssign': false - } - ], - 'template-curly-spacing': 'off', - 'indent': 'off' - }, - parserOptions: { - parser: 'babel-eslint' - }, - overrides: [ - { - files: [ - '**/__tests__/*.{j,t}s?(x)', - '**/tests/unit/**/*.spec.{j,t}s?(x)' - ], - env: { - jest: true - } - } - ] -} diff --git a/quantdinger_vue/.eslintrc.json b/quantdinger_vue/.eslintrc.json deleted file mode 100644 index ed223c7..0000000 --- a/quantdinger_vue/.eslintrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rules": { - "space-before-function-paren": 0 - } -} diff --git a/quantdinger_vue/.gitattributes b/quantdinger_vue/.gitattributes deleted file mode 100644 index a801add..0000000 --- a/quantdinger_vue/.gitattributes +++ /dev/null @@ -1,11 +0,0 @@ -public/* linguist-vendored - -# Automatically normalize line endings (to LF) for all text-based files. -* text=auto eol=lf - -# Declare files that will always have CRLF line endings on checkout. -*.{cmd,[cC][mM][dD]} text eol=crlf -*.{bat,[bB][aA][tT]} text eol=crlf - -# Denote all files that are truly binary and should not be modified. -*.{ico,png,jpg,jpeg,gif,webp,svg,woff,woff2} binary \ No newline at end of file diff --git a/quantdinger_vue/.gitignore b/quantdinger_vue/.gitignore deleted file mode 100644 index 945cf3c..0000000 --- a/quantdinger_vue/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ -.DS_Store -node_modules -/dist -# local env files -.env.local -.env.*.local - -# Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw* -package-lock.json - -# Pyodide (large offline runtime assets) -# - Download via `scripts/fetch_pyodide.ps1` -# - If you want fully offline distribution, remove this ignore and commit the assets. -/public/assets/pyodide/ diff --git a/quantdinger_vue/.husky/.gitignore b/quantdinger_vue/.husky/.gitignore deleted file mode 100644 index 31354ec..0000000 --- a/quantdinger_vue/.husky/.gitignore +++ /dev/null @@ -1 +0,0 @@ -_ diff --git a/quantdinger_vue/.lintstagedrc.json b/quantdinger_vue/.lintstagedrc.json deleted file mode 100644 index bcffb34..0000000 --- a/quantdinger_vue/.lintstagedrc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "*.js": "eslint --fix", - "*.{css,less}": "stylelint --fix" -} \ No newline at end of file diff --git a/quantdinger_vue/.prettierrc b/quantdinger_vue/.prettierrc deleted file mode 100644 index b0e80f7..0000000 --- a/quantdinger_vue/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "printWidth": 120, - "semi": false, - "singleQuote": true, - "prettier.spaceBeforeFunctionParen": true -} diff --git a/quantdinger_vue/.stylelintrc.js b/quantdinger_vue/.stylelintrc.js deleted file mode 100644 index 412e214..0000000 --- a/quantdinger_vue/.stylelintrc.js +++ /dev/null @@ -1,102 +0,0 @@ -module.exports = { - processors: [], - plugins: ['stylelint-order'], - extends: [ - 'stylelint-config-standard', - 'stylelint-config-css-modules' - ], - rules: { - 'selector-class-pattern': null, - 'string-quotes': 'single', // 单引号 - 'at-rule-empty-line-before': null, - 'at-rule-no-unknown': null, - 'at-rule-name-case': 'lower', // 指定@规则名的大小写 - 'length-zero-no-unit': true, // 禁止零长度的单位(可自动修复) - 'shorthand-property-no-redundant-values': true, // 简写属性 - 'number-leading-zero': 'never', // 小数不带0 - 'declaration-block-no-duplicate-properties': null, // 禁止声明快重复属性 - 'no-descending-specificity': null, // 禁止在具有较高优先级的选择器后出现被其覆盖的较低优先级的选择器。 - 'selector-max-id': 3, // 限制一个选择器中 ID 选择器的数量 - 'max-nesting-depth': 4, - 'indentation': [2, { // 指定缩进 warning 提醒 - 'severity': 'warning' - }], - 'order/properties-order': [ // 规则顺序 - 'position', - 'top', - 'right', - 'bottom', - 'left', - 'z-index', - 'display', - 'float', - 'width', - 'height', - 'max-width', - 'max-height', - 'min-width', - 'min-height', - 'padding', - 'padding-top', - 'padding-right', - 'padding-bottom', - 'padding-left', - 'margin', - 'margin-top', - 'margin-right', - 'margin-bottom', - 'margin-left', - 'margin-collapse', - 'margin-top-collapse', - 'margin-right-collapse', - 'margin-bottom-collapse', - 'margin-left-collapse', - 'overflow', - 'overflow-x', - 'overflow-y', - 'clip', - 'clear', - 'font', - 'font-family', - 'font-size', - 'font-smoothing', - 'osx-font-smoothing', - 'font-style', - 'font-weight', - 'line-height', - 'letter-spacing', - 'word-spacing', - 'color', - 'text-align', - 'text-decoration', - 'text-indent', - 'text-overflow', - 'text-rendering', - 'text-size-adjust', - 'text-shadow', - 'text-transform', - 'word-break', - 'word-wrap', - 'white-space', - 'vertical-align', - 'list-style', - 'list-style-type', - 'list-style-position', - 'list-style-image', - 'pointer-events', - 'cursor', - 'background', - 'background-color', - 'border', - 'border-radius', - 'content', - 'outline', - 'outline-offset', - 'opacity', - 'filter', - 'visibility', - 'size', - 'transform' - ] - } -} diff --git a/quantdinger_vue/.travis.yml b/quantdinger_vue/.travis.yml deleted file mode 100644 index a08bfcb..0000000 --- a/quantdinger_vue/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: node_js -node_js: - - 10.15.0 -cache: yarn -script: - - yarn - - yarn run lint --no-fix && yarn run build diff --git a/quantdinger_vue/Dockerfile b/quantdinger_vue/Dockerfile deleted file mode 100644 index cc9976e..0000000 --- a/quantdinger_vue/Dockerfile +++ /dev/null @@ -1,33 +0,0 @@ -# QuantDinger Frontend Dockerfile -# Stage 1: Build -FROM node:18-alpine as builder - -WORKDIR /app - -# Copy package files -COPY package*.json ./ -COPY pnpm-lock.yaml* ./ -COPY yarn.lock* ./ - -# Install dependencies (prefer npm) -RUN npm install --legacy-peer-deps - -# Copy source code -COPY . . - -# Build production version -RUN npm run build - -# Stage 2: Production image (using nginx) -FROM nginx:alpine - -# Copy build artifacts -COPY --from=builder /app/dist /usr/share/nginx/html - -# Copy nginx configuration -COPY deploy/nginx-docker.conf /etc/nginx/conf.d/default.conf - -# Expose port -EXPOSE 80 - -CMD ["nginx", "-g", "daemon off;"] diff --git a/quantdinger_vue/README.md b/quantdinger_vue/README.md deleted file mode 100644 index d3ac37c..0000000 --- a/quantdinger_vue/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# QuantDinger Web UI (Vue 2) - -This is the QuantDinger frontend web UI built with **Vue 2** + **Ant Design Vue**. It connects to the Python backend (`backend_api_python/`) through HTTP APIs to provide charts, indicators, backtests, AI analysis, and strategy management. - -> This UI is based on the open-source `ant-design-vue-pro` ecosystem, heavily adapted for QuantDinger. - -## What you get - -- **Dashboards**: summary views and operational panels -- **Indicator analysis**: Kline charts + indicator editing + backtest history -- **AI analysis**: multi-agent reports (optional LLM/search, configured on backend) -- **Trading assistant**: strategy lifecycle + positions/records (depending on backend capability) -- **Local auth**: login with backend-configured admin credentials - -## Quick start (local development) - -### Prerequisites - -- Node.js 16+ recommended -- Backend running at `http://localhost:5000` (see `backend_api_python/README.md`) - -### 1) Install dependencies - -```bash -cd quantdinger_vue -npm install -``` - -### 2) Start dev server - -```bash -npm run serve -``` - -Dev server runs at `http://localhost:8000`. - -### 3) API proxy (important) - -In dev mode, this project proxies `/api/*` to the backend: - -- Proxy config: `quantdinger_vue/vue.config.js` -- Default target: `http://localhost:5000` - -If your backend runs on a different host/port, update `vue.config.js` accordingly. - -## Production build - -```bash -npm run build -``` - -The output will be generated under `quantdinger_vue/dist/`. - -## Notes - -- **CORS**: when using the dev proxy, you typically don’t need extra CORS config. -- **Login**: use the credentials defined in `backend_api_python/.env` (`ADMIN_USER` / `ADMIN_PASSWORD`). - -## License - -Apache License 2.0. See repository root `LICENSE`. - diff --git a/quantdinger_vue/babel.config.js b/quantdinger_vue/babel.config.js deleted file mode 100644 index 4fe6229..0000000 --- a/quantdinger_vue/babel.config.js +++ /dev/null @@ -1,30 +0,0 @@ -const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV) -const IS_PREVIEW = process.env.VUE_APP_PREVIEW === 'true' - -const plugins = [] -if (IS_PROD && !IS_PREVIEW) { - // 去除日志的插件, - plugins.push('transform-remove-console') -} - -// lazy load ant-design-vue -// if your use import on Demand, Use this code -plugins.push(['import', { - 'libraryName': 'ant-design-vue', - 'libraryDirectory': 'es', - 'style': true // `style: true` 会加载 less 文件 -}]) - -module.exports = { - presets: [ - '@vue/cli-plugin-babel/preset', - [ - '@babel/preset-env', - { - 'useBuiltIns': 'entry', - 'corejs': 3 - } - ] - ], - plugins -} diff --git a/quantdinger_vue/commitlint.config.js b/quantdinger_vue/commitlint.config.js deleted file mode 100644 index 7197cc6..0000000 --- a/quantdinger_vue/commitlint.config.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * feat:新增功能 - * fix:bug 修复 - * docs:文档更新 - * style:不影响程序逻辑的代码修改(修改空白字符,格式缩进,补全缺失的分号等,没有改变代码逻辑) - * refactor:重构代码(既没有新增功能,也没有修复 bug) - * perf:性能, 体验优化 - * test:新增测试用例或是更新现有测试 - * build:主要目的是修改项目构建系统(例如 glup,webpack,rollup 的配置等)的提交 - * ci:主要目的是修改项目继续集成流程(例如 Travis,Jenkins,GitLab CI,Circle等)的提交 - * chore:不属于以上类型的其他类型,比如构建流程, 依赖管理 - * revert:回滚某个更早之前的提交 - */ - -module.exports = { - extends: ['@commitlint/config-conventional'], - rules: { - 'type-enum': [ - 2, - 'always', - ['feat', 'fix', 'docs', 'style', 'refactor', 'test', 'chore', 'revert'] - ], - 'subject-full-stop': [0, 'never'], - 'subject-case': [0, 'never'] - } -} diff --git a/quantdinger_vue/config/plugin.config.js b/quantdinger_vue/config/plugin.config.js deleted file mode 100644 index bb51b98..0000000 --- a/quantdinger_vue/config/plugin.config.js +++ /dev/null @@ -1,49 +0,0 @@ -const ThemeColorReplacer = require('webpack-theme-color-replacer') -const generate = require('@ant-design/colors/lib/generate').default - -const getAntdSerials = (color) => { - // 淡化(即less的tint) - const lightens = new Array(9).fill().map((t, i) => { - return ThemeColorReplacer.varyColor.lighten(color, i / 10) - }) - const colorPalettes = generate(color) - const rgb = ThemeColorReplacer.varyColor.toNum3(color.replace('#', '')).join(',') - return lightens.concat(colorPalettes).concat(rgb) -} - -const themePluginOption = { - fileName: 'css/theme-colors-[contenthash:8].css', - matchColors: getAntdSerials('#1890ff'), // 主色系列 - // 改变样式选择器,解决样式覆盖问题 - changeSelector (selector) { - switch (selector) { - case '.ant-calendar-today .ant-calendar-date': - return ':not(.ant-calendar-selected-date):not(.ant-calendar-selected-day)' + selector - case '.ant-btn:focus,.ant-btn:hover': - return '.ant-btn:focus:not(.ant-btn-primary):not(.ant-btn-danger),.ant-btn:hover:not(.ant-btn-primary):not(.ant-btn-danger)' - case '.ant-btn.active,.ant-btn:active': - return '.ant-btn.active:not(.ant-btn-primary):not(.ant-btn-danger),.ant-btn:active:not(.ant-btn-primary):not(.ant-btn-danger)' - case '.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon': - case '.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon': - return ':not(.ant-steps-item-process)' + selector - // fixed https://github.com/vueComponent/ant-design-vue-pro/issues/876 - case '.ant-steps-item-process .ant-steps-item-icon': - return ':not(.ant-steps-item-custom)' + selector - case '.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-item-open,.ant-menu-horizontal>.ant-menu-item-selected,.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-submenu-active,.ant-menu-horizontal>.ant-menu-submenu-open,.ant-menu-horizontal>.ant-menu-submenu-selected,.ant-menu-horizontal>.ant-menu-submenu:hover': - case '.ant-menu-horizontal > .ant-menu-item-active,.ant-menu-horizontal > .ant-menu-item-open,.ant-menu-horizontal > .ant-menu-item-selected,.ant-menu-horizontal > .ant-menu-item:hover,.ant-menu-horizontal > .ant-menu-submenu-active,.ant-menu-horizontal > .ant-menu-submenu-open,.ant-menu-horizontal > .ant-menu-submenu-selected,.ant-menu-horizontal > .ant-menu-submenu:hover': - return '.ant-menu-horizontal > .ant-menu-item-active,.ant-menu-horizontal > .ant-menu-item-open,.ant-menu-horizontal > .ant-menu-item-selected,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item:hover,.ant-menu-horizontal > .ant-menu-submenu-active,.ant-menu-horizontal > .ant-menu-submenu-open,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-selected,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu:hover' - case '.ant-menu-horizontal > .ant-menu-item-selected > a': - case '.ant-menu-horizontal>.ant-menu-item-selected>a': - return '.ant-menu-horizontal:not(ant-menu-light):not(.ant-menu-dark) > .ant-menu-item-selected > a' - case '.ant-menu-horizontal > .ant-menu-item > a:hover': - case '.ant-menu-horizontal>.ant-menu-item>a:hover': - return '.ant-menu-horizontal:not(ant-menu-light):not(.ant-menu-dark) > .ant-menu-item > a:hover' - default : - return selector - } - } -} - -const createThemeColorReplacerPlugin = () => new ThemeColorReplacer(themePluginOption) - -module.exports = createThemeColorReplacerPlugin diff --git a/quantdinger_vue/config/themePluginConfig.js b/quantdinger_vue/config/themePluginConfig.js deleted file mode 100644 index d35ef8b..0000000 --- a/quantdinger_vue/config/themePluginConfig.js +++ /dev/null @@ -1,115 +0,0 @@ -export default { - theme: [ - { - key: 'dark', - fileName: 'dark.css', - theme: 'dark' - }, - { - key: '#F5222D', - fileName: '#F5222D.css', - modifyVars: { - '@primary-color': '#F5222D' - } - }, - { - key: '#FA541C', - fileName: '#FA541C.css', - modifyVars: { - '@primary-color': '#FA541C' - } - }, - { - key: '#FAAD14', - fileName: '#FAAD14.css', - modifyVars: { - '@primary-color': '#FAAD14' - } - }, - { - key: '#13C2C2', - fileName: '#13C2C2.css', - modifyVars: { - '@primary-color': '#13C2C2' - } - }, - { - key: '#52C41A', - fileName: '#52C41A.css', - modifyVars: { - '@primary-color': '#52C41A' - } - }, - { - key: '#2F54EB', - fileName: '#2F54EB.css', - modifyVars: { - '@primary-color': '#2F54EB' - } - }, - { - key: '#722ED1', - fileName: '#722ED1.css', - modifyVars: { - '@primary-color': '#722ED1' - } - }, - - { - key: '#F5222D', - theme: 'dark', - fileName: 'dark-#F5222D.css', - modifyVars: { - '@primary-color': '#F5222D' - } - }, - { - key: '#FA541C', - theme: 'dark', - fileName: 'dark-#FA541C.css', - modifyVars: { - '@primary-color': '#FA541C' - } - }, - { - key: '#FAAD14', - theme: 'dark', - fileName: 'dark-#FAAD14.css', - modifyVars: { - '@primary-color': '#FAAD14' - } - }, - { - key: '#13C2C2', - theme: 'dark', - fileName: 'dark-#13C2C2.css', - modifyVars: { - '@primary-color': '#13C2C2' - } - }, - { - key: '#52C41A', - theme: 'dark', - fileName: 'dark-#52C41A.css', - modifyVars: { - '@primary-color': '#52C41A' - } - }, - { - key: '#2F54EB', - theme: 'dark', - fileName: 'dark-#2F54EB.css', - modifyVars: { - '@primary-color': '#2F54EB' - } - }, - { - key: '#722ED1', - theme: 'dark', - fileName: 'dark-#722ED1.css', - modifyVars: { - '@primary-color': '#722ED1' - } - } - ] -} diff --git a/quantdinger_vue/deploy/caddy.conf b/quantdinger_vue/deploy/caddy.conf deleted file mode 100644 index acd5c0e..0000000 --- a/quantdinger_vue/deploy/caddy.conf +++ /dev/null @@ -1,9 +0,0 @@ -0.0.0.0:80 { - gzip - root /usr/share/nginx/html - - rewrite { - r .* - to {path} / - } -} \ No newline at end of file diff --git a/quantdinger_vue/deploy/nginx-docker.conf b/quantdinger_vue/deploy/nginx-docker.conf deleted file mode 100644 index 891ded4..0000000 --- a/quantdinger_vue/deploy/nginx-docker.conf +++ /dev/null @@ -1,43 +0,0 @@ -server { - listen 80; - server_name localhost; - root /usr/share/nginx/html; - index index.html; - - # Gzip compression - gzip on; - gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; - gzip_min_length 1000; - - # Static asset caching - location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { - expires 1y; - add_header Cache-Control "public, immutable"; - } - - # API proxy to backend - location /api/ { - proxy_pass http://backend:5000/api/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_cache_bypass $http_upgrade; - proxy_read_timeout 300s; - proxy_connect_timeout 75s; - } - - # SPA routing support - location / { - try_files $uri $uri/ /index.html; - } - - # Health check - location /health { - return 200 'OK'; - add_header Content-Type text/plain; - } -} diff --git a/quantdinger_vue/deploy/nginx.conf b/quantdinger_vue/deploy/nginx.conf deleted file mode 100644 index 5ddb66d..0000000 --- a/quantdinger_vue/deploy/nginx.conf +++ /dev/null @@ -1,24 +0,0 @@ -server { - listen 80; - server_name _; - # gzip config - gzip on; - gzip_min_length 1k; - gzip_comp_level 6; - gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml; - gzip_vary on; - gzip_disable "MSIE [1-6]\."; - - root /usr/share/nginx/html; - include /etc/nginx/mime.types; - - location / { - try_files $uri $uri/ /index.html; - } - -# location /api { -# proxy_pass https://preview.pro.antdv.com/api; -# proxy_set_header X-Forwarded-Proto $scheme; -# proxy_set_header X-Real-IP $remote_addr; -# } -} diff --git a/quantdinger_vue/jest.config.js b/quantdinger_vue/jest.config.js deleted file mode 100644 index 29fee32..0000000 --- a/quantdinger_vue/jest.config.js +++ /dev/null @@ -1,23 +0,0 @@ -module.exports = { - moduleFileExtensions: [ - 'js', - 'jsx', - 'json', - 'vue' - ], - transform: { - '^.+\\.vue$': 'vue-jest', - '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub', - '^.+\\.jsx?$': 'babel-jest' - }, - moduleNameMapper: { - '^@/(.*)$': '/src/$1' - }, - snapshotSerializers: [ - 'jest-serializer-vue' - ], - testMatch: [ - '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' - ], - testURL: 'http://localhost/' -} diff --git a/quantdinger_vue/jsconfig.json b/quantdinger_vue/jsconfig.json deleted file mode 100644 index 68fb8a4..0000000 --- a/quantdinger_vue/jsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "target": "es6", - "baseUrl": ".", - "paths": { - "@/*": ["src/*"] - } - }, - "exclude": ["node_modules", "dist"], - "include": ["src/**/*"] -} \ No newline at end of file diff --git a/quantdinger_vue/package.json b/quantdinger_vue/package.json deleted file mode 100644 index ebd6a67..0000000 --- a/quantdinger_vue/package.json +++ /dev/null @@ -1,104 +0,0 @@ -{ - "name": "vue-antd-pro", - "version": "3.0.4", - "private": true, - "scripts": { - "serve": "vue-cli-service serve --no-lint", - "build": "vue-cli-service build --no-lint", - "test:unit": "vue-cli-service test:unit", - "lint": "vue-cli-service lint", - "build:preview": "vue-cli-service build --no-module --mode preview", - "lint:nofix": "vue-cli-service lint --no-fix", - "lint:js": "eslint src/**/*.js --fix", - "lint:css": "stylelint src/**/*.*ss --fix --custom-syntax postcss-less", - "prepare": "husky install" - }, - "dependencies": { - "@ant-design-vue/pro-layout": "^1.0.12", - "@antv/data-set": "^0.10.2", - "@iconify/vue2": "^2.1.0", - "ant-design-vue": "^1.7.8", - "axios": "^0.26.1", - "babel-loader": "8", - "codemirror": "^5.65.16", - "core-js": "^3.21.1", - "crypto-js": "^4.2.0", - "echarts": "^6.0.0", - "enquire.js": "^2.1.6", - "klinecharts": "^9.8.0", - "lightweight-charts": "^5.0.8", - "lodash.clonedeep": "^4.5.0", - "lodash.get": "^4.4.2", - "lodash.pick": "^4.4.0", - "md5": "^2.3.0", - "mockjs2": "1.0.8", - "moment": "^2.29.2", - "nprogress": "^0.2.0", - "store": "^2.0.12", - "viser-vue": "^2.4.8", - "vue": "^2.6.14", - "vue-clipboard2": "^0.2.1", - "vue-cropper": "0.4.9", - "vue-i18n": "^8.27.1", - "vue-quill-editor": "^3.0.6", - "vue-router": "^3.5.3", - "vue-svg-component-runtime": "^1.0.1", - "vue-template-compiler": "^2.6.14", - "vuex": "^3.6.2", - "wangeditor": "^3.1.1" - }, - "devDependencies": { - "@ant-design/colors": "^3.2.2", - "@commitlint/cli": "^12.1.4", - "@commitlint/config-conventional": "^12.1.4", - "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", - "@vue/cli-plugin-babel": "~5.0.8", - "@vue/cli-plugin-eslint": "~5.0.8", - "@vue/cli-plugin-router": "~5.0.8", - "@vue/cli-plugin-unit-jest": "~5.0.8", - "@vue/cli-plugin-vuex": "~5.0.8", - "@vue/cli-service": "~5.0.8", - "@vue/eslint-config-standard": "^4.0.0", - "@vue/test-utils": "^1.3.0", - "babel-eslint": "^10.1.0", - "babel-plugin-import": "^1.13.3", - "babel-plugin-transform-remove-console": "^6.9.4", - "commitizen": "^4.2.4", - "cz-conventional-changelog": "^3.3.0", - "eslint": "^7.0.0", - "eslint-plugin-html": "^5.0.5", - "eslint-plugin-vue": "^5.2.3", - "file-loader": "^6.2.0", - "git-revision-webpack-plugin": "^3.0.6", - "husky": "^6.0.0", - "less": "^3.13.1", - "less-loader": "^5.0.0", - "lint-staged": "^12.5.0", - "postcss": "^8.3.5", - "postcss-less": "^6.0.0", - "regenerator-runtime": "^0.13.9", - "stylelint": "^14.8.5", - "stylelint-config-css-modules": "^4.1.0", - "stylelint-config-recess-order": "^3.0.0", - "stylelint-config-recommended": "^7.0.0", - "stylelint-config-standard": "^25.0.0", - "stylelint-order": "^5.0.0", - "vue-svg-icon-loader": "^2.1.1", - "vue-svg-loader": "0.16.0", - "webpack-theme-color-replacer": "^1.3.26" - }, - "config": { - "commitizen": { - "path": "./node_modules/cz-conventional-changelog" - } - }, - "husky": { - "hooks": { - "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" - } - }, - "gitHooks": { - "pre-commit": "lint-staged" - }, - "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" -} diff --git a/quantdinger_vue/pnpm-lock.yaml b/quantdinger_vue/pnpm-lock.yaml deleted file mode 100644 index 85a5224..0000000 --- a/quantdinger_vue/pnpm-lock.yaml +++ /dev/null @@ -1,11874 +0,0 @@ -lockfileVersion: 5.4 - -specifiers: - '@ant-design-vue/pro-layout': ^1.0.12 - '@ant-design/colors': ^3.2.2 - '@antv/data-set': ^0.10.2 - '@commitlint/cli': ^12.1.4 - '@commitlint/config-conventional': ^12.1.4 - '@vue/babel-helper-vue-jsx-merge-props': ^1.2.1 - '@vue/cli-plugin-babel': ~5.0.8 - '@vue/cli-plugin-eslint': ~5.0.8 - '@vue/cli-plugin-router': ~5.0.8 - '@vue/cli-plugin-unit-jest': ~5.0.8 - '@vue/cli-plugin-vuex': ~5.0.8 - '@vue/cli-service': ~5.0.8 - '@vue/eslint-config-standard': ^4.0.0 - '@vue/test-utils': ^1.3.0 - ant-design-vue: ^1.7.8 - axios: ^0.26.1 - babel-eslint: ^10.1.0 - babel-loader: '8' - babel-plugin-import: ^1.13.3 - babel-plugin-transform-remove-console: ^6.9.4 - commitizen: ^4.2.4 - core-js: ^3.21.1 - cz-conventional-changelog: ^3.3.0 - enquire.js: ^2.1.6 - eslint: ^7.0.0 - eslint-plugin-html: ^5.0.5 - eslint-plugin-vue: ^5.2.3 - file-loader: ^6.2.0 - git-revision-webpack-plugin: ^3.0.6 - husky: ^6.0.0 - less: ^3.13.1 - less-loader: ^5.0.0 - lint-staged: ^12.5.0 - lodash.clonedeep: ^4.5.0 - lodash.get: ^4.4.2 - lodash.pick: ^4.4.0 - md5: ^2.3.0 - mockjs2: 1.0.8 - moment: ^2.29.2 - nprogress: ^0.2.0 - postcss: ^8.3.5 - postcss-less: ^6.0.0 - regenerator-runtime: ^0.13.9 - store: ^2.0.12 - stylelint: ^14.8.5 - stylelint-config-css-modules: ^4.1.0 - stylelint-config-recess-order: ^3.0.0 - stylelint-config-recommended: ^7.0.0 - stylelint-config-standard: ^25.0.0 - stylelint-order: ^5.0.0 - viser-vue: ^2.4.8 - vue: ^2.6.14 - vue-clipboard2: ^0.2.1 - vue-cropper: 0.4.9 - vue-i18n: ^8.27.1 - vue-quill-editor: ^3.0.6 - vue-router: ^3.5.3 - vue-svg-component-runtime: ^1.0.1 - vue-svg-icon-loader: ^2.1.1 - vue-svg-loader: 0.16.0 - vue-template-compiler: ^2.6.14 - vuex: ^3.6.2 - wangeditor: ^3.1.1 - webpack-theme-color-replacer: ^1.3.26 - -dependencies: - '@ant-design-vue/pro-layout': 1.0.13_vs2ghphrx2fd5pa7rzph6go6hy - '@antv/data-set': 0.10.2 - ant-design-vue: 1.7.8_42puyn3dcxirnpdjnosl7pbb6a - axios: 0.26.1 - babel-loader: 8.2.5 - core-js: 3.24.1 - enquire.js: 2.1.6 - lodash.clonedeep: 4.5.0 - lodash.get: 4.4.2 - lodash.pick: 4.4.0 - md5: 2.3.0 - mockjs2: 1.0.8 - moment: 2.29.4 - nprogress: 0.2.0 - store: 2.0.12 - viser-vue: 2.4.8_vue@2.7.10 - vue: 2.7.10 - vue-clipboard2: 0.2.1 - vue-cropper: 0.4.9 - vue-i18n: 8.27.2_vue@2.7.10 - vue-quill-editor: 3.0.6 - vue-router: 3.6.3_vue@2.7.10 - vue-svg-component-runtime: 1.0.1_vue@2.7.10 - vue-template-compiler: 2.7.10 - vuex: 3.6.2_vue@2.7.10 - wangeditor: 3.1.1 - -devDependencies: - '@ant-design/colors': 3.2.2 - '@commitlint/cli': 12.1.4 - '@commitlint/config-conventional': 12.1.4 - '@vue/babel-helper-vue-jsx-merge-props': 1.2.1 - '@vue/cli-plugin-babel': 5.0.8_2pvo7dpnbf4o5og67iqwgx7rn4 - '@vue/cli-plugin-eslint': 5.0.8_yvnkslq6l73c7sesu7e5hzum2a - '@vue/cli-plugin-router': 5.0.8_@vue+cli-service@5.0.8 - '@vue/cli-plugin-unit-jest': 5.0.8_@vue+cli-service@5.0.8 - '@vue/cli-plugin-vuex': 5.0.8_@vue+cli-service@5.0.8 - '@vue/cli-service': 5.0.8_26d7a3va3smzyfrmey4itzvxkm - '@vue/eslint-config-standard': 4.0.0_eslint@7.32.0 - '@vue/test-utils': 1.3.0_42puyn3dcxirnpdjnosl7pbb6a - babel-eslint: 10.1.0_eslint@7.32.0 - babel-plugin-import: 1.13.5 - babel-plugin-transform-remove-console: 6.9.4 - commitizen: 4.2.5 - cz-conventional-changelog: 3.3.0 - eslint: 7.32.0 - eslint-plugin-html: 5.0.5 - eslint-plugin-vue: 5.2.3_eslint@7.32.0 - file-loader: 6.2.0 - git-revision-webpack-plugin: 3.0.6 - husky: 6.0.0 - less: 3.13.1 - less-loader: 5.0.0_less@3.13.1 - lint-staged: 12.5.0 - postcss: 8.4.16 - postcss-less: 6.0.0_postcss@8.4.16 - regenerator-runtime: 0.13.9 - stylelint: 14.11.0 - stylelint-config-css-modules: 4.1.0_stylelint@14.11.0 - stylelint-config-recess-order: 3.0.0_stylelint@14.11.0 - stylelint-config-recommended: 7.0.0_stylelint@14.11.0 - stylelint-config-standard: 25.0.0_stylelint@14.11.0 - stylelint-order: 5.0.0_stylelint@14.11.0 - vue-svg-icon-loader: 2.1.1_7ijf3dzidy2s7qy7g4vlqxnlga - vue-svg-loader: 0.16.0_abjhqgwglfwb46q2jh7n36fu5u - webpack-theme-color-replacer: 1.4.1 - -packages: - - /@achrinza/node-ipc/9.2.5: - resolution: {integrity: sha512-kBX7Ay911iXZ3VZ1pYltj3Rfu7Ow9H7sK4H4RSfWIfWR2JKNB40K808wppoRIEzE2j2hXLU+r6TJgCAliCGhyQ==} - engines: {node: 8 || 9 || 10 || 11 || 12 || 13 || 14 || 15 || 16 || 17 || 18} - dependencies: - '@node-ipc/js-queue': 2.0.3 - event-pubsub: 4.3.0 - js-message: 1.0.7 - dev: true - - /@ampproject/remapping/2.2.0: - resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.1.1 - '@jridgewell/trace-mapping': 0.3.15 - dev: true - - /@ant-design-vue/pro-layout/1.0.13_vs2ghphrx2fd5pa7rzph6go6hy: - resolution: {integrity: sha512-O0Kixs9C0noECnAVHxnhvkI0MKWqnAJaV9H8O6tr3ad3Bpr4IAPd+f7y9o3y57eDhfZCPaLR3quM4nxfHSgYWA==} - peerDependencies: - ant-design-vue: ^1.6.2 - vue: '>=2.6.0' - vue-template-compiler: '>=2.6.0' - dependencies: - ant-design-vue: 1.7.8_42puyn3dcxirnpdjnosl7pbb6a - classnames: 2.3.1 - insert-css: 2.0.0 - lodash: 4.17.21 - omit.js: 1.0.2 - umi-request: 1.4.0 - vue: 2.7.10 - vue-container-query: 0.1.0 - vue-copy-to-clipboard: 1.0.3_vue@2.7.10 - vue-template-compiler: 2.7.10 - dev: false - - /@ant-design/colors/3.2.2: - resolution: {integrity: sha512-YKgNbG2dlzqMhA9NtI3/pbY16m3Yl/EeWBRa+lB1X1YaYxHrxNexiQYCLTWO/uDvAjLFMEDU+zR901waBtMtjQ==} - dependencies: - tinycolor2: 1.4.2 - - /@ant-design/icons-vue/2.0.0_4oqadidiaueivzvlpdylfsa7xi: - resolution: {integrity: sha512-2c0QQE5hL4N48k5NkPG5sdpMl9YnvyNhf0U7YkdZYDlLnspoRU7vIA0UK9eHBs6OpFLcJB6o8eJrIl2ajBskPg==} - peerDependencies: - '@ant-design/icons': ^2.0.0 - vue: '>=2.5.0' - vue-template-compiler: '>=2.5.0' - dependencies: - '@ant-design/colors': 3.2.2 - '@ant-design/icons': 2.1.1 - babel-runtime: 6.26.0 - vue: 2.7.10 - vue-template-compiler: 2.7.10 - dev: false - - /@ant-design/icons/2.1.1: - resolution: {integrity: sha512-jCH+k2Vjlno4YWl6g535nHR09PwCEmTBKAG6VqF+rhkrSPRLfgpU2maagwbZPLjaHuU5Jd1DFQ2KJpQuI6uG8w==} - dev: false - - /@antv/adjust/0.1.1: - resolution: {integrity: sha512-9FaMOyBlM4AgoRL0b5o0VhEKAYkexBNUrxV8XmpHU/9NBPJONBOB/NZUlQDqxtLItrt91tCfbAuMQmF529UX2Q==} - dependencies: - '@antv/util': 1.3.1 - dev: false - - /@antv/attr/0.1.2: - resolution: {integrity: sha512-QXjP+T2I+pJQcwZx1oCA4tipG43vgeCeKcGGKahlcxb71OBAzjJZm1QbF4frKXcnOqRkxVXtCr70X9TRair3Ew==} - dependencies: - '@antv/util': 1.3.1 - dev: false - - /@antv/component/0.3.10: - resolution: {integrity: sha512-8HLkgdhc0jXrnNrkaACPrWx2JB/51VGscL9t0pH2xoLdxiDQVtTUad2geWxbac5k/ZZHG+bDPWWb83CZIR9A9w==} - dependencies: - '@antv/attr': 0.1.2 - '@antv/g': 3.3.6 - '@antv/util': 1.3.1 - wolfy87-eventemitter: 5.1.0 - dev: false - - /@antv/coord/0.1.0: - resolution: {integrity: sha512-W1R8h3Jfb3AfMBVfCreFPMVetgEYuwHBIGn0+d3EgYXe2ckOF8XWjkpGF1fZhOMHREMr+Gt27NGiQh8yBdLUgg==} - dependencies: - '@antv/util': 1.3.1 - dev: false - - /@antv/data-set/0.10.2: - resolution: {integrity: sha512-FFWG5tiTiFiUrLDRwulraU5XfOdDjkYOlZna+AMT9FJw406D/gfS8eXM9YibscBH28M/+KLAVO8xEwuD1sc3bw==} - dependencies: - '@antv/hierarchy': 0.4.0 - '@antv/util': 1.3.1 - d3-array: 1.2.4 - d3-composite-projections: 1.2.3 - d3-dsv: 1.0.10 - d3-geo: 1.6.4 - d3-geo-projection: 2.1.2 - d3-hexjson: 1.0.1 - d3-hierarchy: 1.1.9 - d3-sankey: 0.7.1 - d3-voronoi: 1.1.4 - dagre: 0.8.5 - point-at-length: 1.0.2 - regression: 2.0.1 - simple-statistics: 6.1.1 - topojson-client: 3.0.1 - wolfy87-eventemitter: 5.1.0 - dev: false - - /@antv/g/3.3.6: - resolution: {integrity: sha512-2GtyTz++s0BbN6s0ZL2/nrqGYCkd52pVoNH92YkrTdTOvpO6Z4DNoo6jGVgZdPX6Nzwli6yduC8MinVAhE8X6g==} - dependencies: - '@antv/gl-matrix': 2.7.1 - '@antv/util': 1.3.1 - d3-ease: 1.0.7 - d3-interpolate: 1.1.6 - d3-timer: 1.0.10 - wolfy87-eventemitter: 5.1.0 - dev: false - - /@antv/g/3.4.10: - resolution: {integrity: sha512-pKy/L1SyRBsXuujdkggqrdBA0/ciAgHiArYBdIJsxHRxCneUP01wGwHdGfDayh2+S0gcSBHynjhoEahsaZaLkw==} - dependencies: - '@antv/gl-matrix': 2.7.1 - '@antv/util': 1.3.1 - d3-ease: 1.0.7 - d3-interpolate: 1.1.6 - d3-timer: 1.0.10 - detect-browser: 5.3.0 - dev: false - - /@antv/g2-brush/0.0.2: - resolution: {integrity: sha512-7O9szwem19nmEgReXhFB8kVLRaz8J5MHvrzDSDY36YaBOaHSWRGHnvYt2KkkPqgWtHtLY1srssk4X/UmP5govA==} - dev: false - - /@antv/g2-plugin-slider/2.1.1_@antv+g2@3.5.19: - resolution: {integrity: sha512-nB678VEGG3FkrvkDDFADAKjLQIeXzITEYqey5oeOpbf0vT5jOa55lQDyJDZ79cK8PmU/Hz6VPeSb3CNQBA+/FQ==} - peerDependencies: - '@antv/g2': '>=3.2.8' - dependencies: - '@antv/g2': 3.5.19 - dev: false - - /@antv/g2/3.5.19: - resolution: {integrity: sha512-OWWDJof1ghfsxDYO20TxVF9TUhDsyOE/yzbSdSu+N9Ft1zQxKJQlgG43/FO+rOsdC/k1dXoYOBRPQ7kk5EBaJA==} - dependencies: - '@antv/adjust': 0.1.1 - '@antv/attr': 0.1.2 - '@antv/component': 0.3.10 - '@antv/coord': 0.1.0 - '@antv/g': 3.4.10 - '@antv/scale': 0.1.5 - '@antv/util': 1.3.1 - core-js: 2.6.12 - venn.js: 0.2.20 - wolfy87-eventemitter: 5.1.0 - dev: false - - /@antv/gl-matrix/2.7.1: - resolution: {integrity: sha512-oOWcVNlpELIKi9x+Mm1Vwbz8pXfkbJKykoCIOJ/dNK79hSIANbpXJ5d3Rra9/wZqK6MC961B7sybFhPlLraT3Q==} - dev: false - - /@antv/hierarchy/0.4.0: - resolution: {integrity: sha512-ols+m+Z8QA4895SWMTOSjVImOX4tEbWQTwJ0NE+WATc0WLSKs6D9y2yaR+ZWt6P60BMGVIKS6lIfabO3CwGgnQ==} - dependencies: - '@antv/util': 1.3.1 - dev: false - - /@antv/scale/0.1.5: - resolution: {integrity: sha512-7RAu4iH5+Hk21h6+aBMiDTfmLf4IibK2SWjx/+E4f4AXRpqucO+8u7IbZdFkakAWxvqhJtN3oePJuTKqOMcmlg==} - dependencies: - '@antv/util': 1.3.1 - fecha: 2.3.3 - dev: false - - /@antv/util/1.3.1: - resolution: {integrity: sha512-cbUta0hIJrKEaW3eKoGarz3Ita+9qUPF2YzTj8A6wds/nNiy20G26ztIWHU+5ThLc13B1n5Ik52LbaCaeg9enA==} - dependencies: - '@antv/gl-matrix': 2.7.1 - dev: false - - /@babel/code-frame/7.12.11: - resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} - dependencies: - '@babel/highlight': 7.18.6 - dev: true - - /@babel/code-frame/7.18.6: - resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.18.6 - dev: true - - /@babel/compat-data/7.18.13: - resolution: {integrity: sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core/7.18.13: - resolution: {integrity: sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.0 - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.18.13 - '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.13 - '@babel/helper-module-transforms': 7.18.9 - '@babel/helpers': 7.18.9 - '@babel/parser': 7.18.13 - '@babel/template': 7.18.10 - '@babel/traverse': 7.18.13 - '@babel/types': 7.18.13 - convert-source-map: 1.8.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.1 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator/7.18.13: - resolution: {integrity: sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.18.13 - '@jridgewell/gen-mapping': 0.3.2 - jsesc: 2.5.2 - dev: true - - /@babel/helper-annotate-as-pure/7.18.6: - resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.18.13 - dev: true - - /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: - resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-explode-assignable-expression': 7.18.6 - '@babel/types': 7.18.13 - dev: true - - /@babel/helper-compilation-targets/7.18.9: - resolution: {integrity: sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.18.13 - '@babel/helper-validator-option': 7.18.6 - browserslist: 4.21.3 - semver: 6.3.0 - dev: true - - /@babel/helper-compilation-targets/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.18.13 - '@babel/core': 7.18.13 - '@babel/helper-validator-option': 7.18.6 - browserslist: 4.21.3 - semver: 6.3.0 - dev: true - - /@babel/helper-create-class-features-plugin/7.18.13_@babel+core@7.18.13: - resolution: {integrity: sha512-hDvXp+QYxSRL+23mpAlSGxHMDyIGChm0/AwTfTAAK5Ufe40nCsyNdaYCGuK91phn/fVu9kqayImRDkvNAgdrsA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.18.9 - '@babel/helper-member-expression-to-functions': 7.18.9 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.18.9 - '@babel/helper-split-export-declaration': 7.18.6 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-create-regexp-features-plugin/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-annotate-as-pure': 7.18.6 - regexpu-core: 5.1.0 - dev: true - - /@babel/helper-define-polyfill-provider/0.3.2_@babel+core@7.18.13: - resolution: {integrity: sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==} - peerDependencies: - '@babel/core': ^7.4.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - debug: 4.3.4 - lodash.debounce: 4.0.8 - resolve: 1.22.1 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-environment-visitor/7.18.9: - resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-explode-assignable-expression/7.18.6: - resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.18.13 - dev: true - - /@babel/helper-function-name/7.18.9: - resolution: {integrity: sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.18.13 - 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.18.13 - dev: true - - /@babel/helper-member-expression-to-functions/7.18.9: - resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.18.13 - dev: true - - /@babel/helper-module-imports/7.18.6: - resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.18.13 - dev: true - - /@babel/helper-module-transforms/7.18.9: - resolution: {integrity: sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-simple-access': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/helper-validator-identifier': 7.18.6 - '@babel/template': 7.18.10 - '@babel/traverse': 7.18.13 - '@babel/types': 7.18.13 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-optimise-call-expression/7.18.6: - resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.18.13 - dev: true - - /@babel/helper-plugin-utils/7.18.9: - resolution: {integrity: sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-wrap-function': 7.18.11 - '@babel/types': 7.18.13 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-replace-supers/7.18.9: - resolution: {integrity: sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-member-expression-to-functions': 7.18.9 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/traverse': 7.18.13 - '@babel/types': 7.18.13 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-simple-access/7.18.6: - resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.18.13 - dev: true - - /@babel/helper-skip-transparent-expression-wrappers/7.18.9: - resolution: {integrity: sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.18.13 - dev: true - - /@babel/helper-split-export-declaration/7.18.6: - resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.18.13 - dev: true - - /@babel/helper-string-parser/7.18.10: - resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==} - engines: {node: '>=6.9.0'} - - /@babel/helper-validator-identifier/7.18.6: - resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} - engines: {node: '>=6.9.0'} - - /@babel/helper-validator-option/7.18.6: - resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-wrap-function/7.18.11: - resolution: {integrity: sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-function-name': 7.18.9 - '@babel/template': 7.18.10 - '@babel/traverse': 7.18.13 - '@babel/types': 7.18.13 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helpers/7.18.9: - resolution: {integrity: sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.18.10 - '@babel/traverse': 7.18.13 - '@babel/types': 7.18.13 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/highlight/7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.18.6 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser/7.18.13: - resolution: {integrity: sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.18.13 - - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.18.13 - dev: true - - /@babel/plugin-proposal-async-generator-functions/7.18.10_@babel+core@7.18.13: - resolution: {integrity: sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.18.13 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.18.13 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-create-class-features-plugin': 7.18.13_@babel+core@7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-create-class-features-plugin': 7.18.13_@babel+core@7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.18.13 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-decorators/7.18.10_@babel+core@7.18.13: - resolution: {integrity: sha512-wdGTwWF5QtpTY/gbBtQLAiCnoxfD4qMbN87NYZle1dOZ9Os8Y6zXcKrIaOU8W+TIvFUWVGG9tUgNww3CjXRVVw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-create-class-features-plugin': 7.18.13_@babel+core@7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-replace-supers': 7.18.9 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/plugin-syntax-decorators': 7.18.6_@babel+core@7.18.13 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.18.13 - dev: true - - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.18.13 - dev: true - - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.18.13 - dev: true - - /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.18.13 - dev: true - - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.18.13 - dev: true - - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.18.13 - dev: true - - /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.18.13 - '@babel/core': 7.18.13 - '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.18.13 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.18.13 - dev: true - - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.18.13 - dev: true - - /@babel/plugin-proposal-optional-chaining/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.18.13 - dev: true - - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-create-class-features-plugin': 7.18.13_@babel+core@7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.18.13_@babel+core@7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.18.13 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} - engines: {node: '>=4'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.18.13: - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.18.13: - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.18.13: - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.18.13: - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-decorators/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-fqyLgjcxf/1yhyZ6A+yo1u9gJ7eleFQod2lkaUsF9DQ7sbbY3Ligym3L0+I2c0WmqNKDpoD9UTb1AKP3qRMOAQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.18.13: - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.18.13: - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-import-assertions/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.18.13: - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.18.13: - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.18.13: - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.18.13: - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.18.13: - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.18.13: - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.18.13: - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.18.13: - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.18.13: - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.18.13: - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.18.13 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-classes/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.18.9 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-replace-supers': 7.18.9 - '@babel/helper-split-export-declaration': 7.18.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.18.13: - resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.18.13: - resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.13 - '@babel/helper-function-name': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-module-transforms': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-module-transforms': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-simple-access': 7.18.6 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-systemjs/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-validator-identifier': 7.18.6 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-module-transforms': 7.18.9 - '@babel/helper-plugin-utils': 7.18.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-named-capturing-groups-regex/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-replace-supers': 7.18.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-parameters/7.18.8_@babel+core@7.18.13: - resolution: {integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - regenerator-transform: 0.15.0 - dev: true - - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-runtime/7.18.10_@babel+core@7.18.13: - resolution: {integrity: sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.18.9 - babel-plugin-polyfill-corejs2: 0.3.2_@babel+core@7.18.13 - babel-plugin-polyfill-corejs3: 0.5.3_@babel+core@7.18.13 - babel-plugin-polyfill-regenerator: 0.4.0_@babel+core@7.18.13 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-spread/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - dev: true - - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.18.13: - resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.18.13: - resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.18.13: - resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - dev: true - - /@babel/preset-env/7.18.10_@babel+core@7.18.13: - resolution: {integrity: sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.18.13 - '@babel/core': 7.18.13 - '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.18.13 - '@babel/plugin-proposal-async-generator-functions': 7.18.10_@babel+core@7.18.13 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.18.13 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.18.13 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.18.13 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.18.13 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.18.13 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.18.13 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.18.13 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.18.13 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.18.13 - '@babel/plugin-syntax-import-assertions': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.18.13 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.18.13 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.18.13 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.18.13 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.18.13 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.18.13 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.18.13 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.18.13 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.18.13 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.18.13 - '@babel/plugin-transform-classes': 7.18.9_@babel+core@7.18.13 - '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.18.13 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.18.13 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.18.13 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.18.13 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.18.13 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.18.13 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-modules-systemjs': 7.18.9_@babel+core@7.18.13 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-named-capturing-groups-regex': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.18.13 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-spread': 7.18.9_@babel+core@7.18.13 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.18.13 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.18.13 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.18.13 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.18.13 - '@babel/preset-modules': 0.1.5_@babel+core@7.18.13 - '@babel/types': 7.18.13 - babel-plugin-polyfill-corejs2: 0.3.2_@babel+core@7.18.13 - babel-plugin-polyfill-corejs3: 0.5.3_@babel+core@7.18.13 - babel-plugin-polyfill-regenerator: 0.4.0_@babel+core@7.18.13 - core-js-compat: 3.24.1 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/preset-modules/0.1.5_@babel+core@7.18.13: - resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.18.13 - '@babel/types': 7.18.13 - esutils: 2.0.3 - dev: true - - /@babel/runtime/7.18.9: - resolution: {integrity: sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.13.9 - dev: true - - /@babel/template/7.18.10: - resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/parser': 7.18.13 - '@babel/types': 7.18.13 - dev: true - - /@babel/traverse/7.18.13: - resolution: {integrity: sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/generator': 7.18.13 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.18.9 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.18.13 - '@babel/types': 7.18.13 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types/7.18.13: - resolution: {integrity: sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.18.10 - '@babel/helper-validator-identifier': 7.18.6 - to-fast-properties: 2.0.0 - - /@bcoe/v8-coverage/0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - - /@commitlint/cli/12.1.4: - resolution: {integrity: sha512-ZR1WjXLvqEffYyBPT0XdnSxtt3Ty1TMoujEtseW5o3vPnkA1UNashAMjQVg/oELqfaiAMnDw8SERPMN0e/0kLg==} - engines: {node: '>=v10'} - hasBin: true - dependencies: - '@commitlint/format': 12.1.4 - '@commitlint/lint': 12.1.4 - '@commitlint/load': 12.1.4 - '@commitlint/read': 12.1.4 - '@commitlint/types': 12.1.4 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: 16.2.0 - dev: true - - /@commitlint/config-conventional/12.1.4: - resolution: {integrity: sha512-ZIdzmdy4o4WyqywMEpprRCrehjCSQrHkaRTVZV411GyLigFQHlEBSJITAihLAWe88Qy/8SyoIe5uKvAsV5vRqQ==} - engines: {node: '>=v10'} - dependencies: - conventional-changelog-conventionalcommits: 4.6.3 - dev: true - - /@commitlint/config-validator/17.0.3: - resolution: {integrity: sha512-3tLRPQJKapksGE7Kee9axv+9z5I2GDHitDH4q63q7NmNA0wkB+DAorJ0RHz2/K00Zb1/MVdHzhCga34FJvDihQ==} - engines: {node: '>=v14'} - dependencies: - '@commitlint/types': 17.0.0 - ajv: 8.11.0 - dev: true - optional: true - - /@commitlint/ensure/12.1.4: - resolution: {integrity: sha512-MxHIBuAG9M4xl33qUfIeMSasbv3ktK0W+iygldBxZOL4QSYC2Gn66pZAQMnV9o3V+sVFHoAK2XUKqBAYrgbEqw==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/types': 12.1.4 - lodash: 4.17.21 - dev: true - - /@commitlint/execute-rule/12.1.4: - resolution: {integrity: sha512-h2S1j8SXyNeABb27q2Ok2vD1WfxJiXvOttKuRA9Or7LN6OQoC/KtT3844CIhhWNteNMu/wE0gkTqGxDVAnJiHg==} - engines: {node: '>=v10'} - dev: true - - /@commitlint/execute-rule/17.0.0: - resolution: {integrity: sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==} - engines: {node: '>=v14'} - dev: true - optional: true - - /@commitlint/format/12.1.4: - resolution: {integrity: sha512-h28ucMaoRjVvvgS6Bdf85fa/+ZZ/iu1aeWGCpURnQV7/rrVjkhNSjZwGlCOUd5kDV1EnZ5XdI7L18SUpRjs26g==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/types': 12.1.4 - chalk: 4.1.2 - dev: true - - /@commitlint/is-ignored/12.1.4: - resolution: {integrity: sha512-uTu2jQU2SKvtIRVLOzMQo3KxDtO+iJ1p0olmncwrqy4AfPLgwoyCP2CiULq5M7xpR3+dE3hBlZXbZTQbD7ycIw==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/types': 12.1.4 - semver: 7.3.5 - dev: true - - /@commitlint/lint/12.1.4: - resolution: {integrity: sha512-1kZ8YDp4to47oIPFELUFGLiLumtPNKJigPFDuHt2+f3Q3IKdQ0uk53n3CPl4uoyso/Og/EZvb1mXjFR/Yce4cA==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/is-ignored': 12.1.4 - '@commitlint/parse': 12.1.4 - '@commitlint/rules': 12.1.4 - '@commitlint/types': 12.1.4 - dev: true - - /@commitlint/load/12.1.4: - resolution: {integrity: sha512-Keszi0IOjRzKfxT+qES/n+KZyLrxy79RQz8wWgssCboYjKEp+wC+fLCgbiMCYjI5k31CIzIOq/16J7Ycr0C0EA==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/execute-rule': 12.1.4 - '@commitlint/resolve-extends': 12.1.4 - '@commitlint/types': 12.1.4 - chalk: 4.1.2 - cosmiconfig: 7.0.1 - lodash: 4.17.21 - resolve-from: 5.0.0 - dev: true - - /@commitlint/load/17.0.3: - resolution: {integrity: sha512-3Dhvr7GcKbKa/ey4QJ5MZH3+J7QFlARohUow6hftQyNjzoXXROm+RwpBes4dDFrXG1xDw9QPXA7uzrOShCd4bw==} - engines: {node: '>=v14'} - requiresBuild: true - dependencies: - '@commitlint/config-validator': 17.0.3 - '@commitlint/execute-rule': 17.0.0 - '@commitlint/resolve-extends': 17.0.3 - '@commitlint/types': 17.0.0 - '@types/node': 18.7.13 - chalk: 4.1.2 - cosmiconfig: 7.0.1 - cosmiconfig-typescript-loader: 2.0.2_57uwcby55h6tzvkj3v5sfcgxoe - lodash: 4.17.21 - resolve-from: 5.0.0 - typescript: 4.7.4 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - dev: true - optional: true - - /@commitlint/message/12.1.4: - resolution: {integrity: sha512-6QhalEKsKQ/Y16/cTk5NH4iByz26fqws2ub+AinHPtM7Io0jy4e3rym9iE+TkEqiqWZlUigZnTwbPvRJeSUBaA==} - engines: {node: '>=v10'} - dev: true - - /@commitlint/parse/12.1.4: - resolution: {integrity: sha512-yqKSAsK2V4X/HaLb/yYdrzs6oD/G48Ilt0EJ2Mp6RJeWYxG14w/Out6JrneWnr/cpzemyN5hExOg6+TB19H/Lw==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/types': 12.1.4 - conventional-changelog-angular: 5.0.13 - conventional-commits-parser: 3.2.4 - dev: true - - /@commitlint/read/12.1.4: - resolution: {integrity: sha512-TnPQSJgD8Aod5Xeo9W4SaYKRZmIahukjcCWJ2s5zb3ZYSmj6C85YD9cR5vlRyrZjj78ItLUV/X4FMWWVIS38Jg==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/top-level': 12.1.4 - '@commitlint/types': 12.1.4 - fs-extra: 9.1.0 - git-raw-commits: 2.0.11 - dev: true - - /@commitlint/resolve-extends/12.1.4: - resolution: {integrity: sha512-R9CoUtsXLd6KSCfsZly04grsH6JVnWFmVtWgWs1KdDpdV+G3TSs37tColMFqglpkx3dsWu8dsPD56+D9YnJfqg==} - engines: {node: '>=v10'} - dependencies: - import-fresh: 3.3.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - dev: true - - /@commitlint/resolve-extends/17.0.3: - resolution: {integrity: sha512-H/RFMvrcBeJCMdnVC4i8I94108UDccIHrTke2tyQEg9nXQnR5/Hd6MhyNWkREvcrxh9Y+33JLb+PiPiaBxCtBA==} - engines: {node: '>=v14'} - dependencies: - '@commitlint/config-validator': 17.0.3 - '@commitlint/types': 17.0.0 - import-fresh: 3.3.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - dev: true - optional: true - - /@commitlint/rules/12.1.4: - resolution: {integrity: sha512-W8m6ZSjg7RuIsIfzQiFHa48X5mcPXeKT9yjBxVmjHvYfS2FDBf1VxCQ7vO0JTVIdV4ohjZ0eKg/wxxUuZHJAZg==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/ensure': 12.1.4 - '@commitlint/message': 12.1.4 - '@commitlint/to-lines': 12.1.4 - '@commitlint/types': 12.1.4 - dev: true - - /@commitlint/to-lines/12.1.4: - resolution: {integrity: sha512-TParumvbi8bdx3EdLXz2MaX+e15ZgoCqNUgqHsRLwyqLUTRbqCVkzrfadG1UcMQk8/d5aMbb327ZKG3Q4BRorw==} - engines: {node: '>=v10'} - dev: true - - /@commitlint/top-level/12.1.4: - resolution: {integrity: sha512-d4lTJrOT/dXlpY+NIt4CUl77ciEzYeNVc0VFgUQ6VA+b1rqYD2/VWFjBlWVOrklxtSDeKyuEhs36RGrppEFAvg==} - engines: {node: '>=v10'} - dependencies: - find-up: 5.0.0 - dev: true - - /@commitlint/types/12.1.4: - resolution: {integrity: sha512-KRIjdnWNUx6ywz+SJvjmNCbQKcKP6KArhjZhY2l+CWKxak0d77SOjggkMwFTiSgLODOwmuLTbarR2ZfWPiPMlw==} - engines: {node: '>=v10'} - dependencies: - chalk: 4.1.2 - dev: true - - /@commitlint/types/17.0.0: - resolution: {integrity: sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==} - engines: {node: '>=v14'} - dependencies: - chalk: 4.1.2 - dev: true - optional: true - - /@cspotcode/source-map-support/0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - dev: true - optional: true - - /@csstools/selector-specificity/2.0.2_pnx64jze6bptzcedy5bidi3zdi: - resolution: {integrity: sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==} - engines: {node: ^12 || ^14 || >=16} - peerDependencies: - postcss: ^8.2 - postcss-selector-parser: ^6.0.10 - dependencies: - postcss: 8.4.16 - postcss-selector-parser: 6.0.10 - dev: true - - /@eslint/eslintrc/0.4.3: - resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 7.3.1 - globals: 13.17.0 - ignore: 4.0.6 - import-fresh: 3.3.0 - js-yaml: 3.14.1 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@hapi/hoek/9.3.0: - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - dev: true - - /@hapi/topo/5.1.0: - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - dependencies: - '@hapi/hoek': 9.3.0 - dev: true - - /@humanwhocodes/config-array/0.5.0: - resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/object-schema/1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - dev: true - - /@istanbuljs/load-nyc-config/1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - - /@istanbuljs/schema/0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - - /@jest/console/27.5.1: - resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@types/node': 18.7.13 - chalk: 4.1.2 - jest-message-util: 27.5.1 - jest-util: 27.5.1 - slash: 3.0.0 - dev: true - - /@jest/console/28.1.3: - resolution: {integrity: sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - dependencies: - '@jest/types': 28.1.3 - '@types/node': 18.7.13 - chalk: 4.1.2 - jest-message-util: 28.1.3 - jest-util: 28.1.3 - slash: 3.0.0 - dev: true - - /@jest/core/27.5.1: - resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 27.5.1 - '@jest/reporters': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.7.13 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.8.1 - exit: 0.1.2 - graceful-fs: 4.2.10 - jest-changed-files: 27.5.1 - jest-config: 27.5.1 - jest-haste-map: 27.5.1 - jest-message-util: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-resolve-dependencies: 27.5.1 - jest-runner: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - jest-watcher: 27.5.1 - micromatch: 4.0.5 - rimraf: 3.0.2 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: true - - /@jest/environment/27.5.1: - resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.7.13 - jest-mock: 27.5.1 - dev: true - - /@jest/fake-timers/27.5.1: - resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@sinonjs/fake-timers': 8.1.0 - '@types/node': 18.7.13 - jest-message-util: 27.5.1 - jest-mock: 27.5.1 - jest-util: 27.5.1 - dev: true - - /@jest/globals/27.5.1: - resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/types': 27.5.1 - expect: 27.5.1 - dev: true - - /@jest/reporters/27.5.1: - resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.7.13 - chalk: 4.1.2 - collect-v8-coverage: 1.0.1 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.10 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 5.2.0 - istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.5 - jest-haste-map: 27.5.1 - jest-resolve: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - slash: 3.0.0 - source-map: 0.6.1 - string-length: 4.0.2 - terminal-link: 2.1.1 - v8-to-istanbul: 8.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/schemas/28.1.3: - resolution: {integrity: sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - dependencies: - '@sinclair/typebox': 0.24.28 - dev: true - - /@jest/source-map/27.5.1: - resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - callsites: 3.1.0 - graceful-fs: 4.2.10 - source-map: 0.6.1 - dev: true - - /@jest/test-result/27.5.1: - resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/console': 27.5.1 - '@jest/types': 27.5.1 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 - dev: true - - /@jest/test-result/28.1.3: - resolution: {integrity: sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - dependencies: - '@jest/console': 28.1.3 - '@jest/types': 28.1.3 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.1 - dev: true - - /@jest/test-sequencer/27.5.1: - resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/test-result': 27.5.1 - graceful-fs: 4.2.10 - jest-haste-map: 27.5.1 - jest-runtime: 27.5.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/transform/27.5.1: - resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@babel/core': 7.18.13 - '@jest/types': 27.5.1 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 1.8.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.10 - jest-haste-map: 27.5.1 - jest-regex-util: 27.5.1 - jest-util: 27.5.1 - micromatch: 4.0.5 - pirates: 4.0.5 - slash: 3.0.0 - source-map: 0.6.1 - write-file-atomic: 3.0.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/types/27.5.1: - resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 18.7.13 - '@types/yargs': 16.0.4 - chalk: 4.1.2 - dev: true - - /@jest/types/28.1.3: - resolution: {integrity: sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - dependencies: - '@jest/schemas': 28.1.3 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.1 - '@types/node': 18.7.13 - '@types/yargs': 17.0.11 - chalk: 4.1.2 - dev: true - - /@jridgewell/gen-mapping/0.1.1: - resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /@jridgewell/gen-mapping/0.3.2: - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.15 - dev: true - - /@jridgewell/resolve-uri/3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/set-array/1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/source-map/0.3.2: - resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==} - dependencies: - '@jridgewell/gen-mapping': 0.3.2 - '@jridgewell/trace-mapping': 0.3.15 - dev: true - - /@jridgewell/sourcemap-codec/1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} - dev: true - - /@jridgewell/trace-mapping/0.3.15: - resolution: {integrity: sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - - /@jridgewell/trace-mapping/0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.0 - '@jridgewell/sourcemap-codec': 1.4.14 - dev: true - optional: true - - /@leichtgewicht/ip-codec/2.0.4: - resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} - dev: true - - /@node-ipc/js-queue/2.0.3: - resolution: {integrity: sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw==} - engines: {node: '>=1.0.0'} - dependencies: - easy-stack: 1.0.1 - dev: true - - /@nodelib/fs.scandir/2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat/2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk/1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.13.0 - dev: true - - /@polka/url/1.0.0-next.21: - resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} - dev: true - - /@sideway/address/4.1.4: - resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} - dependencies: - '@hapi/hoek': 9.3.0 - dev: true - - /@sideway/formula/3.0.0: - resolution: {integrity: sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==} - dev: true - - /@sideway/pinpoint/2.0.0: - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - dev: true - - /@simonwep/pickr/1.7.4: - resolution: {integrity: sha512-fq7jgKJT21uWGC1mARBHvvd1JYlEf93o7SuVOB4Lr0x/2UPuNC9Oe9n/GzVeg4oVtqMDfh1wIEJpsdOJEZb+3g==} - dependencies: - core-js: 3.24.1 - nanopop: 2.1.0 - dev: false - - /@sinclair/typebox/0.24.28: - resolution: {integrity: sha512-dgJd3HLOkLmz4Bw50eZx/zJwtBq65nms3N9VBYu5LTjJ883oBFkTyXRlCB/ZGGwqYpJJHA5zW2Ibhl5ngITfow==} - dev: true - - /@sinonjs/commons/1.8.3: - resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers/8.1.0: - resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} - dependencies: - '@sinonjs/commons': 1.8.3 - dev: true - - /@soda/friendly-errors-webpack-plugin/1.8.1_webpack@5.74.0: - resolution: {integrity: sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg==} - engines: {node: '>=8.0.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - chalk: 3.0.0 - error-stack-parser: 2.1.4 - string-width: 4.2.3 - strip-ansi: 6.0.1 - webpack: 5.74.0 - dev: true - - /@soda/get-current-script/1.0.2: - resolution: {integrity: sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w==} - dev: true - - /@tootallnate/once/1.1.2: - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} - dev: true - - /@trysound/sax/0.2.0: - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} - dev: true - - /@tsconfig/node10/1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - dev: true - optional: true - - /@tsconfig/node12/1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - dev: true - optional: true - - /@tsconfig/node14/1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - dev: true - optional: true - - /@tsconfig/node16/1.0.3: - resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} - dev: true - optional: true - - /@types/babel__core/7.1.19: - resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} - dependencies: - '@babel/parser': 7.18.13 - '@babel/types': 7.18.13 - '@types/babel__generator': 7.6.4 - '@types/babel__template': 7.4.1 - '@types/babel__traverse': 7.18.0 - dev: true - - /@types/babel__generator/7.6.4: - resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} - dependencies: - '@babel/types': 7.18.13 - dev: true - - /@types/babel__template/7.4.1: - resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} - dependencies: - '@babel/parser': 7.18.13 - '@babel/types': 7.18.13 - dev: true - - /@types/babel__traverse/7.18.0: - resolution: {integrity: sha512-v4Vwdko+pgymgS+A2UIaJru93zQd85vIGWObM5ekZNdXCKtDYqATlEYnWgfo86Q6I1Lh0oXnksDnMU1cwmlPDw==} - dependencies: - '@babel/types': 7.18.13 - dev: true - - /@types/body-parser/1.19.2: - resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} - dependencies: - '@types/connect': 3.4.35 - '@types/node': 18.7.13 - dev: true - - /@types/bonjour/3.5.10: - resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} - dependencies: - '@types/node': 18.7.13 - dev: true - - /@types/connect-history-api-fallback/1.3.5: - resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} - dependencies: - '@types/express-serve-static-core': 4.17.30 - '@types/node': 18.7.13 - dev: true - - /@types/connect/3.4.35: - resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} - dependencies: - '@types/node': 18.7.13 - dev: true - - /@types/d3-format/3.0.1: - resolution: {integrity: sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==} - dev: false - - /@types/eslint-scope/3.7.4: - resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} - dependencies: - '@types/eslint': 8.4.6 - '@types/estree': 0.0.51 - dev: true - - /@types/eslint/8.4.6: - resolution: {integrity: sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==} - dependencies: - '@types/estree': 1.0.0 - '@types/json-schema': 7.0.11 - dev: true - - /@types/estree/0.0.51: - resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} - dev: true - - /@types/estree/1.0.0: - resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} - dev: true - - /@types/express-serve-static-core/4.17.30: - resolution: {integrity: sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==} - dependencies: - '@types/node': 18.7.13 - '@types/qs': 6.9.7 - '@types/range-parser': 1.2.4 - dev: true - - /@types/express/4.17.13: - resolution: {integrity: sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==} - dependencies: - '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.30 - '@types/qs': 6.9.7 - '@types/serve-static': 1.15.0 - dev: true - - /@types/graceful-fs/4.1.5: - resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} - dependencies: - '@types/node': 18.7.13 - dev: true - - /@types/html-minifier-terser/6.1.0: - resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - dev: true - - /@types/http-proxy/1.17.9: - resolution: {integrity: sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==} - dependencies: - '@types/node': 18.7.13 - dev: true - - /@types/istanbul-lib-coverage/2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: true - - /@types/istanbul-lib-report/3.0.0: - resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - dev: true - - /@types/istanbul-reports/3.0.1: - resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} - dependencies: - '@types/istanbul-lib-report': 3.0.0 - dev: true - - /@types/jest/27.5.2: - resolution: {integrity: sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==} - dependencies: - jest-matcher-utils: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /@types/json-schema/7.0.11: - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} - - /@types/json5/0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true - - /@types/loader-utils/1.1.3: - resolution: {integrity: sha512-euKGFr2oCB3ASBwG39CYJMR3N9T0nanVqXdiH7Zu/Nqddt6SmFRxytq/i2w9LQYNQekEtGBz+pE3qG6fQTNvRg==} - dependencies: - '@types/node': 8.9.5 - '@types/webpack': 5.28.0 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack-cli - dev: true - - /@types/lodash/4.14.184: - resolution: {integrity: sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==} - dev: false - - /@types/mime/3.0.1: - resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} - dev: true - - /@types/minimist/1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - dev: true - - /@types/node/18.7.13: - resolution: {integrity: sha512-46yIhxSe5xEaJZXWdIBP7GU4HDTG8/eo0qd9atdiL+lFpA03y8KS+lkTN834TWJj5767GbWv4n/P6efyTFt1Dw==} - - /@types/node/8.10.66: - resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} - dev: false - - /@types/node/8.9.5: - resolution: {integrity: sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==} - dev: true - - /@types/normalize-package-data/2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} - dev: true - - /@types/parse-json/4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - dev: true - - /@types/prettier/2.7.0: - resolution: {integrity: sha512-RI1L7N4JnW5gQw2spvL7Sllfuf1SaHdrZpCHiBlCXjIlufi1SMNnbu2teze3/QE67Fg2tBlH7W+mi4hVNk4p0A==} - dev: true - - /@types/q/1.5.5: - resolution: {integrity: sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==} - dev: true - - /@types/qs/6.9.7: - resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} - dev: true - - /@types/range-parser/1.2.4: - resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} - dev: true - - /@types/retry/0.12.0: - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - dev: true - - /@types/serve-index/1.9.1: - resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} - dependencies: - '@types/express': 4.17.13 - dev: true - - /@types/serve-static/1.15.0: - resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} - dependencies: - '@types/mime': 3.0.1 - '@types/node': 18.7.13 - dev: true - - /@types/sockjs/0.3.33: - resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} - dependencies: - '@types/node': 18.7.13 - dev: true - - /@types/stack-utils/2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - dev: true - - /@types/webpack/5.28.0: - resolution: {integrity: sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w==} - dependencies: - '@types/node': 8.9.5 - tapable: 2.2.1 - webpack: 5.74.0 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack-cli - dev: true - - /@types/ws/8.5.3: - resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} - dependencies: - '@types/node': 18.7.13 - dev: true - - /@types/yargs-parser/21.0.0: - resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - dev: true - - /@types/yargs/16.0.4: - resolution: {integrity: sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: true - - /@types/yargs/17.0.11: - resolution: {integrity: sha512-aB4y9UDUXTSMxmM4MH+YnuR0g5Cph3FLQBoWoMB21DSvFVAxRVEHEMx3TLh+zUZYMCQtKiqazz0Q4Rre31f/OA==} - dependencies: - '@types/yargs-parser': 21.0.0 - dev: true - - /@vue/babel-helper-vue-jsx-merge-props/1.2.1: - resolution: {integrity: sha512-QOi5OW45e2R20VygMSNhyQHvpdUwQZqGPc748JLGCYEy+yp8fNFNdbNIGAgZmi9e+2JHPd6i6idRuqivyicIkA==} - dev: true - - /@vue/babel-helper-vue-transform-on/1.0.2: - resolution: {integrity: sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==} - dev: true - - /@vue/babel-plugin-jsx/1.1.1_@babel+core@7.18.13: - resolution: {integrity: sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==} - dependencies: - '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.18.13 - '@babel/template': 7.18.10 - '@babel/traverse': 7.18.13 - '@babel/types': 7.18.13 - '@vue/babel-helper-vue-transform-on': 1.0.2 - camelcase: 6.3.0 - html-tags: 3.2.0 - svg-tags: 1.0.0 - transitivePeerDependencies: - - '@babel/core' - - supports-color - dev: true - - /@vue/babel-plugin-transform-vue-jsx/1.2.1_@babel+core@7.18.13: - resolution: {integrity: sha512-HJuqwACYehQwh1fNT8f4kyzqlNMpBuUK4rSiSES5D4QsYncv5fxFsLyrxFPG2ksO7t5WP+Vgix6tt6yKClwPzA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.18.13 - '@vue/babel-helper-vue-jsx-merge-props': 1.2.1 - html-tags: 2.0.0 - lodash.kebabcase: 4.1.1 - svg-tags: 1.0.0 - dev: true - - /@vue/babel-preset-app/5.0.8_core-js@3.24.1+vue@2.7.10: - resolution: {integrity: sha512-yl+5qhpjd8e1G4cMXfORkkBlvtPCIgmRf3IYCWYDKIQ7m+PPa5iTm4feiNmCMD6yGqQWMhhK/7M3oWGL9boKwg==} - peerDependencies: - core-js: ^3 - vue: ^2 || ^3.2.13 - peerDependenciesMeta: - core-js: - optional: true - vue: - optional: true - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.13 - '@babel/helper-module-imports': 7.18.6 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-proposal-decorators': 7.18.10_@babel+core@7.18.13 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.18.13 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.18.13 - '@babel/plugin-transform-runtime': 7.18.10_@babel+core@7.18.13 - '@babel/preset-env': 7.18.10_@babel+core@7.18.13 - '@babel/runtime': 7.18.9 - '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.18.13 - '@vue/babel-preset-jsx': 1.3.1_d4nzpive36rkayolpiak62ahei - babel-plugin-dynamic-import-node: 2.3.3 - core-js: 3.24.1 - core-js-compat: 3.24.1 - semver: 7.3.7 - vue: 2.7.10 - transitivePeerDependencies: - - supports-color - dev: true - - /@vue/babel-preset-jsx/1.3.1_d4nzpive36rkayolpiak62ahei: - resolution: {integrity: sha512-ml+nqcSKp8uAqFZLNc7OWLMzR7xDBsUfkomF98DtiIBlLqlq4jCQoLINARhgqRIyKdB+mk/94NWpIb4pL6D3xw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - vue: '*' - peerDependenciesMeta: - vue: - optional: true - dependencies: - '@babel/core': 7.18.13 - '@vue/babel-helper-vue-jsx-merge-props': 1.2.1 - '@vue/babel-plugin-transform-vue-jsx': 1.2.1_@babel+core@7.18.13 - '@vue/babel-sugar-composition-api-inject-h': 1.3.0_@babel+core@7.18.13 - '@vue/babel-sugar-composition-api-render-instance': 1.3.0_@babel+core@7.18.13 - '@vue/babel-sugar-functional-vue': 1.2.2_@babel+core@7.18.13 - '@vue/babel-sugar-inject-h': 1.2.2_@babel+core@7.18.13 - '@vue/babel-sugar-v-model': 1.3.0_@babel+core@7.18.13 - '@vue/babel-sugar-v-on': 1.3.0_@babel+core@7.18.13 - vue: 2.7.10 - dev: true - - /@vue/babel-sugar-composition-api-inject-h/1.3.0_@babel+core@7.18.13: - resolution: {integrity: sha512-pIDOutEpqbURdVw7xhgxmuDW8Tl+lTgzJZC5jdlUu0lY2+izT9kz3Umd/Tbu0U5cpCJ2Yhu87BZFBzWpS0Xemg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.18.13 - dev: true - - /@vue/babel-sugar-composition-api-render-instance/1.3.0_@babel+core@7.18.13: - resolution: {integrity: sha512-NYNnU2r7wkJLMV5p9Zj4pswmCs037O/N2+/Fs6SyX7aRFzXJRP1/2CZh5cIwQxWQajHXuCUd5mTb7DxoBVWyTg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.18.13 - dev: true - - /@vue/babel-sugar-functional-vue/1.2.2_@babel+core@7.18.13: - resolution: {integrity: sha512-JvbgGn1bjCLByIAU1VOoepHQ1vFsroSA/QkzdiSs657V79q6OwEWLCQtQnEXD/rLTA8rRit4rMOhFpbjRFm82w==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.18.13 - dev: true - - /@vue/babel-sugar-inject-h/1.2.2_@babel+core@7.18.13: - resolution: {integrity: sha512-y8vTo00oRkzQTgufeotjCLPAvlhnpSkcHFEp60+LJUwygGcd5Chrpn5480AQp/thrxVm8m2ifAk0LyFel9oCnw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.18.13 - dev: true - - /@vue/babel-sugar-v-model/1.3.0_@babel+core@7.18.13: - resolution: {integrity: sha512-zcsabmdX48JmxTObn3xmrvvdbEy8oo63DphVyA3WRYGp4SEvJRpu/IvZCVPl/dXLuob2xO/QRuncqPgHvZPzpA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.18.13 - '@vue/babel-helper-vue-jsx-merge-props': 1.2.1 - '@vue/babel-plugin-transform-vue-jsx': 1.2.1_@babel+core@7.18.13 - camelcase: 5.3.1 - html-tags: 2.0.0 - svg-tags: 1.0.0 - dev: true - - /@vue/babel-sugar-v-on/1.3.0_@babel+core@7.18.13: - resolution: {integrity: sha512-8VZgrS0G5bh7+Prj7oJkzg9GvhSPnuW5YT6MNaVAEy4uwxRLJ8GqHenaStfllChTao4XZ3EZkNtHB4Xbr/ePdA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.18.13 - '@vue/babel-plugin-transform-vue-jsx': 1.2.1_@babel+core@7.18.13 - camelcase: 5.3.1 - dev: true - - /@vue/cli-overlay/5.0.8: - resolution: {integrity: sha512-KmtievE/B4kcXp6SuM2gzsnSd8WebkQpg3XaB6GmFh1BJGRqa1UiW9up7L/Q67uOdTigHxr5Ar2lZms4RcDjwQ==} - dev: true - - /@vue/cli-plugin-babel/5.0.8_2pvo7dpnbf4o5og67iqwgx7rn4: - resolution: {integrity: sha512-a4qqkml3FAJ3auqB2kN2EMPocb/iu0ykeELwed+9B1c1nQ1HKgslKMHMPavYx3Cd/QAx2mBD4hwKBqZXEI/CsQ==} - peerDependencies: - '@vue/cli-service': ^3.0.0 || ^4.0.0 || ^5.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@vue/babel-preset-app': 5.0.8_core-js@3.24.1+vue@2.7.10 - '@vue/cli-service': 5.0.8_26d7a3va3smzyfrmey4itzvxkm - '@vue/cli-shared-utils': 5.0.8 - babel-loader: 8.2.5_tb6moc662p5idmcg3l5ipbhpta - thread-loader: 3.0.4_webpack@5.74.0 - webpack: 5.74.0 - transitivePeerDependencies: - - '@swc/core' - - core-js - - encoding - - esbuild - - supports-color - - uglify-js - - vue - - webpack-cli - dev: true - - /@vue/cli-plugin-eslint/5.0.8_yvnkslq6l73c7sesu7e5hzum2a: - resolution: {integrity: sha512-d11+I5ONYaAPW1KyZj9GlrV/E6HZePq5L5eAF5GgoVdu6sxr6bDgEoxzhcS1Pk2eh8rn1MxG/FyyR+eCBj/CNg==} - peerDependencies: - '@vue/cli-service': ^3.0.0 || ^4.0.0 || ^5.0.0-0 - eslint: '>=7.5.0' - dependencies: - '@vue/cli-service': 5.0.8_26d7a3va3smzyfrmey4itzvxkm - '@vue/cli-shared-utils': 5.0.8 - eslint: 7.32.0 - eslint-webpack-plugin: 3.2.0_2gji4j2x5okmdz3i2csw4u63de - globby: 11.1.0 - webpack: 5.74.0 - yorkie: 2.0.0 - transitivePeerDependencies: - - '@swc/core' - - encoding - - esbuild - - uglify-js - - webpack-cli - dev: true - - /@vue/cli-plugin-router/5.0.8_@vue+cli-service@5.0.8: - resolution: {integrity: sha512-Gmv4dsGdAsWPqVijz3Ux2OS2HkMrWi1ENj2cYL75nUeL+Xj5HEstSqdtfZ0b1q9NCce+BFB6QnHfTBXc/fCvMg==} - peerDependencies: - '@vue/cli-service': ^3.0.0 || ^4.0.0 || ^5.0.0-0 - dependencies: - '@vue/cli-service': 5.0.8_26d7a3va3smzyfrmey4itzvxkm - '@vue/cli-shared-utils': 5.0.8 - transitivePeerDependencies: - - encoding - dev: true - - /@vue/cli-plugin-unit-jest/5.0.8_@vue+cli-service@5.0.8: - resolution: {integrity: sha512-8aTmXUxEUdhJEjMHHoHI1wgi2SHzVRgCQQWIn5lgCAV2xJnXng09+wv8Ap0dhO4Z5vOOA/7xnubMQ9pDLqiskg==} - peerDependencies: - '@vue/cli-service': ^3.0.0 || ^4.0.0 || ^5.0.0-0 - '@vue/vue2-jest': ^27.0.0-alpha.3 - '@vue/vue3-jest': ^27.0.0-alpha.3 - ts-jest: ^27.0.4 - peerDependenciesMeta: - '@vue/vue2-jest': - optional: true - '@vue/vue3-jest': - optional: true - ts-jest: - optional: true - dependencies: - '@babel/core': 7.18.13 - '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.18.13 - '@types/jest': 27.5.2 - '@vue/cli-service': 5.0.8_26d7a3va3smzyfrmey4itzvxkm - '@vue/cli-shared-utils': 5.0.8 - babel-jest: 27.5.1_@babel+core@7.18.13 - deepmerge: 4.2.2 - jest: 27.5.1 - jest-serializer-vue: 2.0.2 - jest-transform-stub: 2.0.0 - jest-watch-typeahead: 1.1.0_jest@27.5.1 - transitivePeerDependencies: - - bufferutil - - canvas - - encoding - - node-notifier - - supports-color - - ts-node - - utf-8-validate - dev: true - - /@vue/cli-plugin-vuex/5.0.8_@vue+cli-service@5.0.8: - resolution: {integrity: sha512-HSYWPqrunRE5ZZs8kVwiY6oWcn95qf/OQabwLfprhdpFWAGtLStShjsGED2aDpSSeGAskQETrtR/5h7VqgIlBA==} - peerDependencies: - '@vue/cli-service': ^3.0.0 || ^4.0.0 || ^5.0.0-0 - dependencies: - '@vue/cli-service': 5.0.8_26d7a3va3smzyfrmey4itzvxkm - dev: true - - /@vue/cli-service/5.0.8_26d7a3va3smzyfrmey4itzvxkm: - resolution: {integrity: sha512-nV7tYQLe7YsTtzFrfOMIHc5N2hp5lHG2rpYr0aNja9rNljdgcPZLyQRb2YRivTHqTv7lI962UXFURcpStHgyFw==} - engines: {node: ^12.0.0 || >= 14.0.0} - hasBin: true - peerDependencies: - cache-loader: '*' - less-loader: '*' - pug-plain-loader: '*' - raw-loader: '*' - sass-loader: '*' - stylus-loader: '*' - vue-template-compiler: ^2.0.0 - webpack-sources: '*' - peerDependenciesMeta: - cache-loader: - optional: true - less-loader: - optional: true - pug-plain-loader: - optional: true - raw-loader: - optional: true - sass-loader: - optional: true - stylus-loader: - optional: true - vue-template-compiler: - optional: true - webpack-sources: - optional: true - dependencies: - '@babel/helper-compilation-targets': 7.18.9 - '@soda/friendly-errors-webpack-plugin': 1.8.1_webpack@5.74.0 - '@soda/get-current-script': 1.0.2 - '@types/minimist': 1.2.2 - '@vue/cli-overlay': 5.0.8 - '@vue/cli-plugin-router': 5.0.8_@vue+cli-service@5.0.8 - '@vue/cli-plugin-vuex': 5.0.8_@vue+cli-service@5.0.8 - '@vue/cli-shared-utils': 5.0.8 - '@vue/component-compiler-utils': 3.3.0 - '@vue/vue-loader-v15': /vue-loader/15.10.0_vsyllalxesco42bbuzcqgel7xq - '@vue/web-component-wrapper': 1.3.0 - acorn: 8.8.0 - acorn-walk: 8.2.0 - address: 1.2.0 - autoprefixer: 10.4.8_postcss@8.4.16 - browserslist: 4.21.3 - case-sensitive-paths-webpack-plugin: 2.4.0 - cli-highlight: 2.1.11 - clipboardy: 2.3.0 - cliui: 7.0.4 - copy-webpack-plugin: 9.1.0_webpack@5.74.0 - css-loader: 6.7.1_webpack@5.74.0 - css-minimizer-webpack-plugin: 3.4.1_webpack@5.74.0 - cssnano: 5.1.13_postcss@8.4.16 - debug: 4.3.4 - default-gateway: 6.0.3 - dotenv: 10.0.0 - dotenv-expand: 5.1.0 - fs-extra: 9.1.0 - globby: 11.1.0 - hash-sum: 2.0.0 - html-webpack-plugin: 5.5.0_webpack@5.74.0 - is-file-esm: 1.0.0 - launch-editor-middleware: 2.6.0 - less-loader: 5.0.0_less@3.13.1 - lodash.defaultsdeep: 4.6.1 - lodash.mapvalues: 4.6.0 - mini-css-extract-plugin: 2.6.1_webpack@5.74.0 - minimist: 1.2.6 - module-alias: 2.2.2 - portfinder: 1.0.32 - postcss: 8.4.16 - postcss-loader: 6.2.1_qjv4cptcpse3y5hrjkrbb7drda - progress-webpack-plugin: 1.0.16_webpack@5.74.0 - ssri: 8.0.1 - terser-webpack-plugin: 5.3.5_webpack@5.74.0 - thread-loader: 3.0.4_webpack@5.74.0 - vue-loader: 17.0.0_webpack@5.74.0 - vue-style-loader: 4.1.3 - vue-template-compiler: 2.7.10 - webpack: 5.74.0 - webpack-bundle-analyzer: 4.6.1 - webpack-chain: 6.5.1 - webpack-dev-server: 4.10.0_debug@4.3.4+webpack@5.74.0 - webpack-merge: 5.8.0 - webpack-virtual-modules: 0.4.4 - whatwg-fetch: 3.6.2 - transitivePeerDependencies: - - '@babel/core' - - '@parcel/css' - - '@swc/core' - - '@vue/compiler-sfc' - - arc-templates - - atpl - - babel-core - - bracket-template - - bufferutil - - clean-css - - coffee-script - - csso - - dot - - dust - - dustjs-helpers - - dustjs-linkedin - - eco - - ect - - ejs - - encoding - - esbuild - - haml-coffee - - hamlet - - hamljs - - handlebars - - hogan.js - - htmling - - jade - - jazz - - jqtpl - - just - - liquid-node - - liquor - - lodash - - marko - - mote - - mustache - - nunjucks - - plates - - pug - - qejs - - ractive - - razor-tmpl - - react - - react-dom - - slm - - squirrelly - - supports-color - - swig - - swig-templates - - teacup - - templayed - - then-jade - - then-pug - - tinyliquid - - toffee - - twig - - twing - - uglify-js - - underscore - - utf-8-validate - - vash - - velocityjs - - walrus - - webpack-cli - - whiskers - dev: true - - /@vue/cli-shared-utils/5.0.8: - resolution: {integrity: sha512-uK2YB7bBVuQhjOJF+O52P9yFMXeJVj7ozqJkwYE9PlMHL1LMHjtCYm4cSdOebuPzyP+/9p0BimM/OqxsevIopQ==} - dependencies: - '@achrinza/node-ipc': 9.2.5 - chalk: 4.1.2 - execa: 1.0.0 - joi: 17.6.0 - launch-editor: 2.6.0 - lru-cache: 6.0.0 - node-fetch: 2.6.7 - open: 8.4.0 - ora: 5.4.1 - read-pkg: 5.2.0 - semver: 7.3.7 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - encoding - dev: true - - /@vue/compiler-sfc/2.7.10: - resolution: {integrity: sha512-55Shns6WPxlYsz4WX7q9ZJBL77sKE1ZAYNYStLs6GbhIOMrNtjMvzcob6gu3cGlfpCR4bT7NXgyJ3tly2+Hx8Q==} - dependencies: - '@babel/parser': 7.18.13 - postcss: 8.4.16 - source-map: 0.6.1 - - /@vue/component-compiler-utils/3.3.0: - resolution: {integrity: sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==} - dependencies: - consolidate: 0.15.1 - hash-sum: 1.0.2 - lru-cache: 4.1.5 - merge-source-map: 1.1.0 - postcss: 7.0.39 - postcss-selector-parser: 6.0.10 - source-map: 0.6.1 - vue-template-es2015-compiler: 1.9.1 - optionalDependencies: - prettier: 2.7.1 - transitivePeerDependencies: - - arc-templates - - atpl - - babel-core - - bracket-template - - coffee-script - - dot - - dust - - dustjs-helpers - - dustjs-linkedin - - eco - - ect - - ejs - - haml-coffee - - hamlet - - hamljs - - handlebars - - hogan.js - - htmling - - jade - - jazz - - jqtpl - - just - - liquid-node - - liquor - - lodash - - marko - - mote - - mustache - - nunjucks - - plates - - pug - - qejs - - ractive - - razor-tmpl - - react - - react-dom - - slm - - squirrelly - - swig - - swig-templates - - teacup - - templayed - - then-jade - - then-pug - - tinyliquid - - toffee - - twig - - twing - - underscore - - vash - - velocityjs - - walrus - - whiskers - dev: true - - /@vue/eslint-config-standard/4.0.0_eslint@7.32.0: - resolution: {integrity: sha512-bQghq1cw1BuMRHNhr3tRpAJx1tpGy0QtajQX873kLtA9YVuOIoXR7nAWnTN09bBHnSUh2N288vMsqPi2fI4Hzg==} - dependencies: - eslint-config-standard: 12.0.0_txevqkd2r4b3zo3ootu35nzt3u - eslint-plugin-import: 2.26.0_eslint@7.32.0 - eslint-plugin-node: 8.0.1_eslint@7.32.0 - eslint-plugin-promise: 4.3.1 - eslint-plugin-standard: 4.1.0_eslint@7.32.0 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - /@vue/test-utils/1.3.0_42puyn3dcxirnpdjnosl7pbb6a: - resolution: {integrity: sha512-Xk2Xiyj2k5dFb8eYUKkcN9PzqZSppTlx7LaQWBbdA8tqh3jHr/KHX2/YLhNFc/xwDrgeLybqd+4ZCPJSGPIqeA==} - peerDependencies: - vue: 2.x - vue-template-compiler: ^2.x - dependencies: - dom-event-types: 1.1.0 - lodash: 4.17.21 - pretty: 2.0.0 - vue: 2.7.10 - vue-template-compiler: 2.7.10 - dev: true - - /@vue/web-component-wrapper/1.3.0: - resolution: {integrity: sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA==} - dev: true - - /@webassemblyjs/ast/1.11.1: - resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} - dependencies: - '@webassemblyjs/helper-numbers': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - dev: true - - /@webassemblyjs/floating-point-hex-parser/1.11.1: - resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} - dev: true - - /@webassemblyjs/helper-api-error/1.11.1: - resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} - dev: true - - /@webassemblyjs/helper-buffer/1.11.1: - resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} - dev: true - - /@webassemblyjs/helper-numbers/1.11.1: - resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.1 - '@webassemblyjs/helper-api-error': 1.11.1 - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/helper-wasm-bytecode/1.11.1: - resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} - dev: true - - /@webassemblyjs/helper-wasm-section/1.11.1: - resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 - dev: true - - /@webassemblyjs/ieee754/1.11.1: - resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} - dependencies: - '@xtuc/ieee754': 1.2.0 - dev: true - - /@webassemblyjs/leb128/1.11.1: - resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} - dependencies: - '@xtuc/long': 4.2.2 - dev: true - - /@webassemblyjs/utf8/1.11.1: - resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} - dev: true - - /@webassemblyjs/wasm-edit/1.11.1: - resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/helper-wasm-section': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 - '@webassemblyjs/wasm-opt': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 - '@webassemblyjs/wast-printer': 1.11.1 - dev: true - - /@webassemblyjs/wasm-gen/1.11.1: - resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/ieee754': 1.11.1 - '@webassemblyjs/leb128': 1.11.1 - '@webassemblyjs/utf8': 1.11.1 - dev: true - - /@webassemblyjs/wasm-opt/1.11.1: - resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-buffer': 1.11.1 - '@webassemblyjs/wasm-gen': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 - dev: true - - /@webassemblyjs/wasm-parser/1.11.1: - resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/helper-api-error': 1.11.1 - '@webassemblyjs/helper-wasm-bytecode': 1.11.1 - '@webassemblyjs/ieee754': 1.11.1 - '@webassemblyjs/leb128': 1.11.1 - '@webassemblyjs/utf8': 1.11.1 - dev: true - - /@webassemblyjs/wast-printer/1.11.1: - resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} - dependencies: - '@webassemblyjs/ast': 1.11.1 - '@xtuc/long': 4.2.2 - dev: true - - /@xtuc/ieee754/1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true - - /@xtuc/long/4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true - - /JSONStream/1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - dev: true - - /abab/2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - dev: true - - /abbrev/1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true - - /abs-svg-path/0.1.1: - resolution: {integrity: sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==} - dev: false - - /accepts/1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - dev: true - - /acorn-globals/6.0.0: - resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} - dependencies: - acorn: 7.4.1 - acorn-walk: 7.2.0 - dev: true - - /acorn-import-assertions/1.8.0_acorn@8.8.0: - resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.8.0 - dev: true - - /acorn-jsx/5.3.2_acorn@6.4.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 6.4.2 - dev: true - - /acorn-jsx/5.3.2_acorn@7.4.1: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 7.4.1 - dev: true - - /acorn-walk/7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn-walk/8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - dev: true - - /acorn/6.4.2: - resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /acorn/7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /acorn/8.8.0: - resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /add-dom-event-listener/1.1.0: - resolution: {integrity: sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==} - dependencies: - object-assign: 4.1.1 - dev: false - - /address/1.2.0: - resolution: {integrity: sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==} - engines: {node: '>= 10.0.0'} - dev: true - - /agent-base/6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - - /aggregate-error/3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: true - - /ajv-formats/2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependenciesMeta: - ajv: - optional: true - dependencies: - ajv: 8.11.0 - dev: true - - /ajv-keywords/3.5.2_ajv@6.12.6: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - dependencies: - ajv: 6.12.6 - - /ajv-keywords/5.1.0_ajv@8.11.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - dependencies: - ajv: 8.11.0 - fast-deep-equal: 3.1.3 - dev: true - - /ajv/6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /ajv/8.11.0: - resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: true - - /align-text/0.1.4: - resolution: {integrity: sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==} - engines: {node: '>=0.10.0'} - dependencies: - kind-of: 3.2.2 - longest: 1.0.1 - repeat-string: 1.6.1 - dev: false - - /amdefine/1.0.1: - resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} - engines: {node: '>=0.4.2'} - dev: false - - /ansi-colors/4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true - - /ansi-escapes/3.2.0: - resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} - engines: {node: '>=4'} - dev: true - - /ansi-escapes/4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true - - /ansi-html-community/0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} - hasBin: true - dev: true - - /ansi-regex/2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: false - - /ansi-regex/3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} - dev: true - - /ansi-regex/5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-regex/6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: true - - /ansi-styles/2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: false - - /ansi-styles/3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles/4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /ansi-styles/5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /ansi-styles/6.1.0: - resolution: {integrity: sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==} - engines: {node: '>=12'} - dev: true - - /ant-design-vue/1.7.8_42puyn3dcxirnpdjnosl7pbb6a: - resolution: {integrity: sha512-F1hmiS9vwbyfuFvlamdW5l9bHKqRlj9wHaGDIE41NZMWXyWy8qL0UFa/+I0Wl8gQWZCqODW5pN6Yfoyn85At3A==} - requiresBuild: true - peerDependencies: - vue: ^2.6.0 - vue-template-compiler: ^2.6.0 - dependencies: - '@ant-design/icons': 2.1.1 - '@ant-design/icons-vue': 2.0.0_4oqadidiaueivzvlpdylfsa7xi - '@simonwep/pickr': 1.7.4 - add-dom-event-listener: 1.1.0 - array-tree-filter: 2.1.0 - async-validator: 3.5.2 - babel-helper-vue-jsx-merge-props: 2.0.3 - babel-runtime: 6.26.0 - classnames: 2.3.1 - component-classes: 1.2.6 - dom-align: 1.12.3 - dom-closest: 0.2.0 - dom-scroll-into-view: 2.0.1 - enquire.js: 2.1.6 - intersperse: 1.0.0 - is-mobile: 2.2.2 - is-negative-zero: 2.0.2 - ismobilejs: 1.1.1 - json2mq: 0.2.0 - lodash: 4.17.21 - moment: 2.29.4 - mutationobserver-shim: 0.3.7 - node-emoji: 1.11.0 - omit.js: 1.0.2 - raf: 3.4.1 - resize-observer-polyfill: 1.5.1 - shallow-equal: 1.2.1 - shallowequal: 1.1.0 - vue: 2.7.10 - vue-ref: 2.0.0 - vue-template-compiler: 2.7.10 - warning: 4.0.3 - dev: false - - /any-promise/1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true - - /anymatch/3.1.2: - resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /arch/2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} - dev: true - - /arg/4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true - optional: true - - /argparse/1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - - /array-flatten/1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - dev: true - - /array-flatten/2.1.2: - resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} - dev: true - - /array-ify/1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: true - - /array-includes/3.1.5: - resolution: {integrity: sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - get-intrinsic: 1.1.2 - is-string: 1.0.7 - dev: true - - /array-tree-filter/2.1.0: - resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} - dev: false - - /array-union/2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - - /array.prototype.flat/1.3.0: - resolution: {integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - es-shim-unscopables: 1.0.0 - dev: true - - /array.prototype.reduce/1.0.4: - resolution: {integrity: sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - es-array-method-boxes-properly: 1.0.0 - is-string: 1.0.7 - dev: true - - /arrify/1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true - - /astral-regex/2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - dev: true - - /async-validator/3.5.2: - resolution: {integrity: sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ==} - dev: false - - /async/2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} - dependencies: - lodash: 4.17.21 - dev: true - - /asynckit/0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true - - /at-least-node/1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: true - - /autoprefixer/10.4.8_postcss@8.4.16: - resolution: {integrity: sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - dependencies: - browserslist: 4.21.3 - caniuse-lite: 1.0.30001382 - fraction.js: 4.2.0 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - dev: true - - /axios/0.26.1: - resolution: {integrity: sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==} - dependencies: - follow-redirects: 1.15.1 - transitivePeerDependencies: - - debug - dev: false - - /babel-eslint/10.1.0_eslint@7.32.0: - resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} - engines: {node: '>=6'} - deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. - peerDependencies: - eslint: '>= 4.12.1' - dependencies: - '@babel/code-frame': 7.18.6 - '@babel/parser': 7.18.13 - '@babel/traverse': 7.18.13 - '@babel/types': 7.18.13 - eslint: 7.32.0 - eslint-visitor-keys: 1.3.0 - resolve: 1.22.1 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-helper-vue-jsx-merge-props/2.0.3: - resolution: {integrity: sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg==} - dev: false - - /babel-jest/27.5.1_@babel+core@7.18.13: - resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.18.13 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/babel__core': 7.1.19 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 27.5.1_@babel+core@7.18.13 - chalk: 4.1.2 - graceful-fs: 4.2.10 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-loader/8.2.5: - resolution: {integrity: sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==} - engines: {node: '>= 8.9'} - peerDependencies: - '@babel/core': ^7.0.0 - webpack: '>=2' - dependencies: - find-cache-dir: 3.3.2 - loader-utils: 2.0.2 - make-dir: 3.1.0 - schema-utils: 2.7.1 - dev: false - - /babel-loader/8.2.5_tb6moc662p5idmcg3l5ipbhpta: - resolution: {integrity: sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==} - engines: {node: '>= 8.9'} - peerDependencies: - '@babel/core': ^7.0.0 - webpack: '>=2' - dependencies: - '@babel/core': 7.18.13 - find-cache-dir: 3.3.2 - loader-utils: 2.0.2 - make-dir: 3.1.0 - schema-utils: 2.7.1 - webpack: 5.74.0 - dev: true - - /babel-plugin-dynamic-import-node/2.3.3: - resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} - dependencies: - object.assign: 4.1.4 - dev: true - - /babel-plugin-import/1.13.5: - resolution: {integrity: sha512-IkqnoV+ov1hdJVofly9pXRJmeDm9EtROfrc5i6eII0Hix2xMs5FEm8FG3ExMvazbnZBbgHIt6qdO8And6lCloQ==} - dependencies: - '@babel/helper-module-imports': 7.18.6 - dev: true - - /babel-plugin-istanbul/6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': 7.18.9 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.0 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-jest-hoist/27.5.1: - resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.18.13 - '@types/babel__core': 7.1.19 - '@types/babel__traverse': 7.18.0 - dev: true - - /babel-plugin-polyfill-corejs2/0.3.2_@babel+core@7.18.13: - resolution: {integrity: sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.18.13 - '@babel/core': 7.18.13 - '@babel/helper-define-polyfill-provider': 0.3.2_@babel+core@7.18.13 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-polyfill-corejs3/0.5.3_@babel+core@7.18.13: - resolution: {integrity: sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-define-polyfill-provider': 0.3.2_@babel+core@7.18.13 - core-js-compat: 3.24.1 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-polyfill-regenerator/0.4.0_@babel+core@7.18.13: - resolution: {integrity: sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.18.13 - '@babel/helper-define-polyfill-provider': 0.3.2_@babel+core@7.18.13 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-transform-remove-console/6.9.4: - resolution: {integrity: sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg==} - dev: true - - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.18.13: - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.13 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.18.13 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.18.13 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.18.13 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.18.13 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.18.13 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.18.13 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.18.13 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.18.13 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.18.13 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.18.13 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.18.13 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.18.13 - dev: true - - /babel-preset-jest/27.5.1_@babel+core@7.18.13: - resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.18.13 - babel-plugin-jest-hoist: 27.5.1 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.18.13 - dev: true - - /babel-runtime/6.26.0: - resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} - dependencies: - core-js: 2.6.12 - regenerator-runtime: 0.11.1 - dev: false - - /balanced-match/1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /balanced-match/2.0.0: - resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} - dev: true - - /base64-js/1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true - - /batch-processor/1.0.0: - resolution: {integrity: sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==} - dev: false - - /batch/0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - dev: true - - /big.js/3.2.0: - resolution: {integrity: sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==} - dev: true - - /big.js/5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - - /binary-extensions/2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true - - /bl/4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.0 - dev: true - - /bluebird/3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: true - - /body-parser/1.20.0: - resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.4 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.10.3 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /bonjour-service/1.0.13: - resolution: {integrity: sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==} - dependencies: - array-flatten: 2.1.2 - dns-equal: 1.0.0 - fast-deep-equal: 3.1.3 - multicast-dns: 7.2.5 - dev: true - - /boolbase/1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true - - /brace-expansion/1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /brace-expansion/2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: true - - /braces/3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: true - - /browser-process-hrtime/1.0.0: - resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} - dev: true - - /browserslist/4.21.3: - resolution: {integrity: sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001382 - electron-to-chromium: 1.4.228 - node-releases: 2.0.6 - update-browserslist-db: 1.0.5_browserslist@4.21.3 - dev: true - - /bser/2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: true - - /buffer-from/1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer/5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /bytes/3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - dev: true - - /bytes/3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - dev: true - - /cachedir/2.3.0: - resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} - engines: {node: '>=6'} - dev: true - - /call-bind/1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.1.2 - - /callsites/3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /camel-case/4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - dependencies: - pascal-case: 3.1.2 - tslib: 2.4.0 - dev: true - - /camelcase-keys/6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - dev: true - - /camelcase/1.2.1: - resolution: {integrity: sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==} - engines: {node: '>=0.10.0'} - dev: false - - /camelcase/5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /camelcase/6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - - /caniuse-api/3.0.0: - resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - dependencies: - browserslist: 4.21.3 - caniuse-lite: 1.0.30001382 - lodash.memoize: 4.1.2 - lodash.uniq: 4.5.0 - dev: true - - /caniuse-lite/1.0.30001382: - resolution: {integrity: sha512-2rtJwDmSZ716Pxm1wCtbPvHtbDWAreTPxXbkc5RkKglow3Ig/4GNGazDI9/BVnXbG/wnv6r3B5FEbkfg9OcTGg==} - dev: true - - /case-sensitive-paths-webpack-plugin/2.4.0: - resolution: {integrity: sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==} - engines: {node: '>=4'} - dev: true - - /center-align/0.1.3: - resolution: {integrity: sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==} - engines: {node: '>=0.10.0'} - dependencies: - align-text: 0.1.4 - lazy-cache: 1.0.4 - dev: false - - /chalk/1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-styles: 2.2.1 - escape-string-regexp: 1.0.5 - has-ansi: 2.0.0 - strip-ansi: 3.0.1 - supports-color: 2.0.0 - dev: false - - /chalk/2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk/3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chalk/4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /char-regex/1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - dev: true - - /char-regex/2.0.1: - resolution: {integrity: sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==} - engines: {node: '>=12.20'} - dev: true - - /chardet/0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true - - /charenc/0.0.2: - resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - dev: false - - /chokidar/3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - requiresBuild: true - dependencies: - anymatch: 3.1.2 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /chrome-trace-event/1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true - - /ci-info/1.6.0: - resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} - dev: true - - /ci-info/3.3.2: - resolution: {integrity: sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==} - dev: true - - /cjs-module-lexer/1.2.2: - resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} - dev: true - - /classnames/2.3.1: - resolution: {integrity: sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==} - dev: false - - /clean-css/5.3.1: - resolution: {integrity: sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==} - engines: {node: '>= 10.0'} - dependencies: - source-map: 0.6.1 - dev: true - - /clean-stack/2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: true - - /cli-cursor/2.1.0: - resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} - engines: {node: '>=4'} - dependencies: - restore-cursor: 2.0.0 - dev: true - - /cli-cursor/3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - dependencies: - restore-cursor: 3.1.0 - dev: true - - /cli-highlight/2.1.11: - resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true - dependencies: - chalk: 4.1.2 - highlight.js: 10.7.3 - mz: 2.7.0 - parse5: 5.1.1 - parse5-htmlparser2-tree-adapter: 6.0.1 - yargs: 16.2.0 - dev: true - - /cli-spinners/2.7.0: - resolution: {integrity: sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==} - engines: {node: '>=6'} - dev: true - - /cli-truncate/2.1.0: - resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} - engines: {node: '>=8'} - dependencies: - slice-ansi: 3.0.0 - string-width: 4.2.3 - dev: true - - /cli-truncate/3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - slice-ansi: 5.0.0 - string-width: 5.1.2 - dev: true - - /cli-width/3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - dev: true - - /clipboard/2.0.11: - resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==} - dependencies: - good-listener: 1.2.2 - select: 1.1.2 - tiny-emitter: 2.1.0 - dev: false - - /clipboardy/2.3.0: - resolution: {integrity: sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==} - engines: {node: '>=8'} - dependencies: - arch: 2.2.0 - execa: 1.0.0 - is-wsl: 2.2.0 - dev: true - - /cliui/2.1.0: - resolution: {integrity: sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==} - dependencies: - center-align: 0.1.3 - right-align: 0.1.3 - wordwrap: 0.0.2 - dev: false - - /cliui/7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /clone-deep/4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - dev: true - - /clone/1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: true - - /clone/2.1.2: - resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} - engines: {node: '>=0.8'} - - /co/4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - - /coa/2.0.2: - resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} - engines: {node: '>= 4.0'} - dependencies: - '@types/q': 1.5.5 - chalk: 2.4.2 - q: 1.5.1 - dev: true - - /collect-v8-coverage/1.0.1: - resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} - dev: true - - /color-convert/1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - - /color-convert/2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name/1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - - /color-name/1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /colord/2.9.3: - resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} - dev: true - - /colorette/2.0.19: - resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} - dev: true - - /combined-stream/1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true - - /commander/2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - /commander/7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - dev: true - - /commander/8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - dev: true - - /commander/9.4.0: - resolution: {integrity: sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==} - engines: {node: ^12.20.0 || >=14} - - /commitizen/4.2.5: - resolution: {integrity: sha512-9sXju8Qrz1B4Tw7kC5KhnvwYQN88qs2zbiB8oyMsnXZyJ24PPGiNM3nHr73d32dnE3i8VJEXddBFIbOgYSEXtQ==} - engines: {node: '>= 12'} - hasBin: true - dependencies: - cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0 - dedent: 0.7.0 - detect-indent: 6.1.0 - find-node-modules: 2.1.3 - find-root: 1.1.0 - fs-extra: 9.1.0 - glob: 7.2.3 - inquirer: 8.2.4 - is-utf8: 0.2.1 - lodash: 4.17.21 - minimist: 1.2.6 - strip-bom: 4.0.0 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - dev: true - - /commondir/1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - - /compare-func/2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - dev: true - - /component-classes/1.2.6: - resolution: {integrity: sha512-hPFGULxdwugu1QWW3SvVOCUHLzO34+a2J6Wqy0c5ASQkfi9/8nZcBB0ZohaEbXOQlCflMAEMmEWk7u7BVs4koA==} - dependencies: - component-indexof: 0.0.3 - dev: false - - /component-indexof/0.0.3: - resolution: {integrity: sha512-puDQKvx/64HZXb4hBwIcvQLaLgux8o1CbWl39s41hrIIZDl1lJiD5jc22gj3RBeGK0ovxALDYpIbyjqDUUl0rw==} - dev: false - - /compressible/2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /compression/1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9 - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /concat-map/0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /condense-newlines/0.2.1: - resolution: {integrity: sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg==} - engines: {node: '>=0.10.0'} - dependencies: - extend-shallow: 2.0.1 - is-whitespace: 0.3.0 - kind-of: 3.2.2 - dev: true - - /config-chain/1.1.13: - resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - dependencies: - ini: 1.3.8 - proto-list: 1.2.4 - dev: true - - /connect-history-api-fallback/2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} - dev: true - - /consolidate/0.15.1: - resolution: {integrity: sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==} - engines: {node: '>= 0.10.0'} - peerDependencies: - arc-templates: ^0.5.3 - atpl: '>=0.7.6' - babel-core: ^6.26.3 - bracket-template: ^1.1.5 - coffee-script: ^1.12.7 - dot: ^1.1.3 - dust: ^0.3.0 - dustjs-helpers: ^1.7.4 - dustjs-linkedin: ^2.7.5 - eco: ^1.1.0-rc-3 - ect: ^0.5.9 - ejs: ^3.1.5 - haml-coffee: ^1.14.1 - hamlet: ^0.3.3 - hamljs: ^0.6.2 - handlebars: ^4.7.6 - hogan.js: ^3.0.2 - htmling: ^0.0.8 - jade: ^1.11.0 - jazz: ^0.0.18 - jqtpl: ~1.1.0 - just: ^0.1.8 - liquid-node: ^3.0.1 - liquor: ^0.0.5 - lodash: ^4.17.20 - marko: ^3.14.4 - mote: ^0.2.0 - mustache: ^3.0.0 - nunjucks: ^3.2.2 - plates: ~0.4.11 - pug: ^3.0.0 - qejs: ^3.0.5 - ractive: ^1.3.12 - razor-tmpl: ^1.3.1 - react: ^16.13.1 - react-dom: ^16.13.1 - slm: ^2.0.0 - squirrelly: ^5.1.0 - swig: ^1.4.2 - swig-templates: ^2.0.3 - teacup: ^2.0.0 - templayed: '>=0.2.3' - then-jade: '*' - then-pug: '*' - tinyliquid: ^0.2.34 - toffee: ^0.3.6 - twig: ^1.15.2 - twing: ^5.0.2 - underscore: ^1.11.0 - vash: ^0.13.0 - velocityjs: ^2.0.1 - walrus: ^0.10.1 - whiskers: ^0.4.0 - peerDependenciesMeta: - arc-templates: - optional: true - atpl: - optional: true - babel-core: - optional: true - bracket-template: - optional: true - coffee-script: - optional: true - dot: - optional: true - dust: - optional: true - dustjs-helpers: - optional: true - dustjs-linkedin: - optional: true - eco: - optional: true - ect: - optional: true - ejs: - optional: true - haml-coffee: - optional: true - hamlet: - optional: true - hamljs: - optional: true - handlebars: - optional: true - hogan.js: - optional: true - htmling: - optional: true - jade: - optional: true - jazz: - optional: true - jqtpl: - optional: true - just: - optional: true - liquid-node: - optional: true - liquor: - optional: true - lodash: - optional: true - marko: - optional: true - mote: - optional: true - mustache: - optional: true - nunjucks: - optional: true - plates: - optional: true - pug: - optional: true - qejs: - optional: true - ractive: - optional: true - razor-tmpl: - optional: true - react: - optional: true - react-dom: - optional: true - slm: - optional: true - squirrelly: - optional: true - swig: - optional: true - swig-templates: - optional: true - teacup: - optional: true - templayed: - optional: true - then-jade: - optional: true - then-pug: - optional: true - tinyliquid: - optional: true - toffee: - optional: true - twig: - optional: true - twing: - optional: true - underscore: - optional: true - vash: - optional: true - velocityjs: - optional: true - walrus: - optional: true - whiskers: - optional: true - dependencies: - bluebird: 3.7.2 - dev: true - - /container-query-toolkit/0.1.3: - resolution: {integrity: sha512-B1EvYaLzFKz81vgWDm+zL0X7fzFUjlN6lF/RivDeNT4xW9mFsTh1oiC9rtvFFiwG52e3JUmYLXwPpqNBf2AXHA==} - dev: false - - /content-disposition/0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /content-type/1.0.4: - resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} - engines: {node: '>= 0.6'} - dev: true - - /contour_plot/0.0.1: - resolution: {integrity: sha512-Nil2HI76Xux6sVGORvhSS8v66m+/h5CwFkBJDO+U5vWaMdNC0yXNCsGDPbzPhvqOEU5koebhdEvD372LI+IyLw==} - dev: false - - /conventional-changelog-angular/5.0.13: - resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} - engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - q: 1.5.1 - dev: true - - /conventional-changelog-conventionalcommits/4.6.3: - resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} - engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - lodash: 4.17.21 - q: 1.5.1 - dev: true - - /conventional-commit-types/3.0.0: - resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} - dev: true - - /conventional-commits-parser/3.2.4: - resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} - engines: {node: '>=10'} - hasBin: true - dependencies: - JSONStream: 1.3.5 - is-text-path: 1.0.1 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true - - /convert-source-map/1.8.0: - resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} - dependencies: - safe-buffer: 5.1.2 - dev: true - - /cookie-signature/1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - dev: true - - /cookie/0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - dev: true - - /copy-anything/2.0.6: - resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} - dependencies: - is-what: 3.14.1 - dev: true - - /copy-to-clipboard/3.3.2: - resolution: {integrity: sha512-Vme1Z6RUDzrb6xAI7EZlVZ5uvOk2F//GaxKUxajDqm9LhOVM1inxNAD2vy+UZDYsd0uyA9s7b3/FVZPSxqrCfg==} - dependencies: - toggle-selection: 1.0.6 - dev: false - - /copy-webpack-plugin/9.1.0_webpack@5.74.0: - resolution: {integrity: sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.1.0 - dependencies: - fast-glob: 3.2.11 - glob-parent: 6.0.2 - globby: 11.1.0 - normalize-path: 3.0.0 - schema-utils: 3.1.1 - serialize-javascript: 6.0.0 - webpack: 5.74.0 - dev: true - - /core-js-compat/3.24.1: - resolution: {integrity: sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==} - dependencies: - browserslist: 4.21.3 - semver: 7.0.0 - dev: true - - /core-js/2.6.12: - resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} - deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - requiresBuild: true - dev: false - - /core-js/3.24.1: - resolution: {integrity: sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg==} - requiresBuild: true - - /core-util-is/1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true - - /cosmiconfig-typescript-loader/2.0.2_57uwcby55h6tzvkj3v5sfcgxoe: - resolution: {integrity: sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==} - engines: {node: '>=12', npm: '>=6'} - peerDependencies: - '@types/node': '*' - typescript: '>=3' - dependencies: - '@types/node': 18.7.13 - cosmiconfig: 7.0.1 - ts-node: 10.9.1_57uwcby55h6tzvkj3v5sfcgxoe - typescript: 4.7.4 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - dev: true - optional: true - - /cosmiconfig/7.0.1: - resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} - engines: {node: '>=10'} - dependencies: - '@types/parse-json': 4.0.0 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - dev: true - - /create-require/1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true - optional: true - - /cross-spawn/5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - - /cross-spawn/6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.1 - shebang-command: 1.2.0 - which: 1.3.1 - dev: true - - /cross-spawn/7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /crypt/0.0.2: - resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} - dev: false - - /css-declaration-sorter/6.3.0_postcss@8.4.16: - resolution: {integrity: sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==} - engines: {node: ^10 || ^12 || >=14} - peerDependencies: - postcss: ^8.0.9 - dependencies: - postcss: 8.4.16 - dev: true - - /css-functions-list/3.1.0: - resolution: {integrity: sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==} - engines: {node: '>=12.22'} - dev: true - - /css-loader/6.7.1_webpack@5.74.0: - resolution: {integrity: sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 - dependencies: - icss-utils: 5.1.0_postcss@8.4.16 - postcss: 8.4.16 - postcss-modules-extract-imports: 3.0.0_postcss@8.4.16 - postcss-modules-local-by-default: 4.0.0_postcss@8.4.16 - postcss-modules-scope: 3.0.0_postcss@8.4.16 - postcss-modules-values: 4.0.0_postcss@8.4.16 - postcss-value-parser: 4.2.0 - semver: 7.3.7 - webpack: 5.74.0 - dev: true - - /css-minimizer-webpack-plugin/3.4.1_webpack@5.74.0: - resolution: {integrity: sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==} - engines: {node: '>= 12.13.0'} - peerDependencies: - '@parcel/css': '*' - clean-css: '*' - csso: '*' - esbuild: '*' - webpack: ^5.0.0 - peerDependenciesMeta: - '@parcel/css': - optional: true - clean-css: - optional: true - csso: - optional: true - esbuild: - optional: true - dependencies: - cssnano: 5.1.13_postcss@8.4.16 - jest-worker: 27.5.1 - postcss: 8.4.16 - schema-utils: 4.0.0 - serialize-javascript: 6.0.0 - source-map: 0.6.1 - webpack: 5.74.0 - dev: true - - /css-select-base-adapter/0.1.1: - resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} - dev: true - - /css-select/2.1.0: - resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} - dependencies: - boolbase: 1.0.0 - css-what: 3.4.2 - domutils: 1.7.0 - nth-check: 1.0.2 - dev: true - - /css-select/4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 4.3.1 - domutils: 2.8.0 - nth-check: 2.1.1 - dev: true - - /css-tree/1.0.0-alpha.37: - resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} - engines: {node: '>=8.0.0'} - dependencies: - mdn-data: 2.0.4 - source-map: 0.6.1 - dev: true - - /css-tree/1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} - dependencies: - mdn-data: 2.0.14 - source-map: 0.6.1 - dev: true - - /css-what/3.4.2: - resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} - engines: {node: '>= 6'} - dev: true - - /css-what/6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: true - - /cssesc/3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /cssnano-preset-default/5.2.12_postcss@8.4.16: - resolution: {integrity: sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - css-declaration-sorter: 6.3.0_postcss@8.4.16 - cssnano-utils: 3.1.0_postcss@8.4.16 - postcss: 8.4.16 - postcss-calc: 8.2.4_postcss@8.4.16 - postcss-colormin: 5.3.0_postcss@8.4.16 - postcss-convert-values: 5.1.2_postcss@8.4.16 - postcss-discard-comments: 5.1.2_postcss@8.4.16 - postcss-discard-duplicates: 5.1.0_postcss@8.4.16 - postcss-discard-empty: 5.1.1_postcss@8.4.16 - postcss-discard-overridden: 5.1.0_postcss@8.4.16 - postcss-merge-longhand: 5.1.6_postcss@8.4.16 - postcss-merge-rules: 5.1.2_postcss@8.4.16 - postcss-minify-font-values: 5.1.0_postcss@8.4.16 - postcss-minify-gradients: 5.1.1_postcss@8.4.16 - postcss-minify-params: 5.1.3_postcss@8.4.16 - postcss-minify-selectors: 5.2.1_postcss@8.4.16 - postcss-normalize-charset: 5.1.0_postcss@8.4.16 - postcss-normalize-display-values: 5.1.0_postcss@8.4.16 - postcss-normalize-positions: 5.1.1_postcss@8.4.16 - postcss-normalize-repeat-style: 5.1.1_postcss@8.4.16 - postcss-normalize-string: 5.1.0_postcss@8.4.16 - postcss-normalize-timing-functions: 5.1.0_postcss@8.4.16 - postcss-normalize-unicode: 5.1.0_postcss@8.4.16 - postcss-normalize-url: 5.1.0_postcss@8.4.16 - postcss-normalize-whitespace: 5.1.1_postcss@8.4.16 - postcss-ordered-values: 5.1.3_postcss@8.4.16 - postcss-reduce-initial: 5.1.0_postcss@8.4.16 - postcss-reduce-transforms: 5.1.0_postcss@8.4.16 - postcss-svgo: 5.1.0_postcss@8.4.16 - postcss-unique-selectors: 5.1.1_postcss@8.4.16 - dev: true - - /cssnano-utils/3.1.0_postcss@8.4.16: - resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - dev: true - - /cssnano/5.1.13_postcss@8.4.16: - resolution: {integrity: sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - cssnano-preset-default: 5.2.12_postcss@8.4.16 - lilconfig: 2.0.6 - postcss: 8.4.16 - yaml: 1.10.2 - dev: true - - /csso/4.2.0: - resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} - engines: {node: '>=8.0.0'} - dependencies: - css-tree: 1.1.3 - dev: true - - /cssom/0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - dev: true - - /cssom/0.4.4: - resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} - dev: true - - /cssstyle/2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - dependencies: - cssom: 0.3.8 - dev: true - - /csstype/3.1.0: - resolution: {integrity: sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==} - - /cz-conventional-changelog/3.3.0: - resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} - engines: {node: '>= 10'} - dependencies: - chalk: 2.4.2 - commitizen: 4.2.5 - conventional-commit-types: 3.0.0 - lodash.map: 4.6.0 - longest: 2.0.1 - word-wrap: 1.2.3 - optionalDependencies: - '@commitlint/load': 17.0.3 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - dev: true - - /d3-array/1.2.4: - resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} - dev: false - - /d3-collection/1.0.7: - resolution: {integrity: sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==} - dev: false - - /d3-color/1.4.1: - resolution: {integrity: sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==} - dev: false - - /d3-composite-projections/1.2.3: - resolution: {integrity: sha512-RxNBoRGf3epTnQBUKeEpaXpD8BA/Ud0xRuLwWxyI7dWfuuYgJZMKw6ZsZOwfDNC0ZbMWaU0eBFlL05A2jlcsWg==} - dependencies: - d3-geo: 1.12.1 - d3-path: 1.0.9 - dev: false - - /d3-dispatch/1.0.6: - resolution: {integrity: sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==} - dev: false - - /d3-dsv/1.0.10: - resolution: {integrity: sha512-vqklfpxmtO2ZER3fq/B33R/BIz3A1PV0FaZRuFM8w6jLo7sUX1BZDh73fPlr0s327rzq4H6EN1q9U+eCBCSN8g==} - hasBin: true - dependencies: - commander: 2.20.3 - iconv-lite: 0.4.24 - rw: 1.3.3 - dev: false - - /d3-ease/1.0.7: - resolution: {integrity: sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==} - dev: false - - /d3-format/1.4.5: - resolution: {integrity: sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==} - dev: false - - /d3-geo-projection/2.1.2: - resolution: {integrity: sha512-zft6RRvPaB1qplTodBVcSH5Ftvmvvg0qoDiqpt+fyNthGr/qr+DD30cizNDluXjW7jmo7EKUTjvFCAHofv08Ow==} - hasBin: true - dependencies: - commander: 2.20.3 - d3-array: 1.2.4 - d3-geo: 1.6.4 - dev: false - - /d3-geo/1.12.1: - resolution: {integrity: sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==} - dependencies: - d3-array: 1.2.4 - dev: false - - /d3-geo/1.6.4: - resolution: {integrity: sha512-O5Q3iftLc6/EdU1MHUm+O29NoKKN/cyQtySnD9/yEEcinN+q4ng+H56e2Yn1YWdfZBoiaRVtR2NoJ3ivKX5ptQ==} - dependencies: - d3-array: 1.2.4 - dev: false - - /d3-hexjson/1.0.1: - resolution: {integrity: sha512-TeH4T0PSbDazMm3gHgc4ulO0PfrZpz0Uk3y5tCGz+NgC7HnX7KBdem7uAN+j9x3ZshTh7raN3V/bFhaLB2C8DA==} - dependencies: - d3-array: 1.2.4 - dev: false - - /d3-hierarchy/1.1.9: - resolution: {integrity: sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==} - dev: false - - /d3-interpolate/1.1.6: - resolution: {integrity: sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==} - dependencies: - d3-color: 1.4.1 - dev: false - - /d3-interpolate/1.4.0: - resolution: {integrity: sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==} - dependencies: - d3-color: 1.4.1 - dev: false - - /d3-path/1.0.9: - resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} - dev: false - - /d3-sankey/0.7.1: - resolution: {integrity: sha512-KAyowBWtTLQxyXq1UhXcdCXKbuCQvL51FgqOS+fKlNTQ/4FfSWabRlWs2DezzwKyredAsOhBSQZN/i0XdeE2tQ==} - dependencies: - d3-array: 1.2.4 - d3-collection: 1.0.7 - d3-shape: 1.3.7 - dev: false - - /d3-selection/1.4.2: - resolution: {integrity: sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==} - dev: false - - /d3-shape/1.3.7: - resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} - dependencies: - d3-path: 1.0.9 - dev: false - - /d3-timer/1.0.10: - resolution: {integrity: sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==} - dev: false - - /d3-transition/1.3.2: - resolution: {integrity: sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==} - dependencies: - d3-color: 1.4.1 - d3-dispatch: 1.0.6 - d3-ease: 1.0.7 - d3-interpolate: 1.4.0 - d3-selection: 1.4.2 - d3-timer: 1.0.10 - dev: false - - /d3-voronoi/1.1.4: - resolution: {integrity: sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==} - dev: false - - /dagre/0.8.5: - resolution: {integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==} - dependencies: - graphlib: 2.1.8 - lodash: 4.17.21 - dev: false - - /dargs/7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - dev: true - - /data-urls/2.0.0: - resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} - engines: {node: '>=10'} - dependencies: - abab: 2.0.6 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - dev: true - - /de-indent/1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - - /debug/2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.0.0 - dev: true - - /debug/3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - - /debug/4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - dev: true - - /debug/4.3.4_supports-color@9.2.2: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 9.2.2 - dev: true - - /decamelize-keys/1.1.0: - resolution: {integrity: sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==} - engines: {node: '>=0.10.0'} - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: true - - /decamelize/1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - /decimal.js/10.4.0: - resolution: {integrity: sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==} - dev: true - - /dedent/0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dev: true - - /deep-equal/1.1.1: - resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==} - dependencies: - is-arguments: 1.1.1 - is-date-object: 1.0.5 - is-regex: 1.1.4 - object-is: 1.1.5 - object-keys: 1.1.1 - regexp.prototype.flags: 1.4.3 - dev: false - - /deep-is/0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /deepmerge/1.5.2: - resolution: {integrity: sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==} - engines: {node: '>=0.10.0'} - dev: true - - /deepmerge/4.2.2: - resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} - engines: {node: '>=0.10.0'} - dev: true - - /default-gateway/6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} - dependencies: - execa: 5.1.1 - dev: true - - /defaults/1.0.3: - resolution: {integrity: sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==} - dependencies: - clone: 1.0.4 - dev: true - - /define-lazy-prop/2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: true - - /define-properties/1.1.4: - resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} - engines: {node: '>= 0.4'} - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - - /defined/1.0.0: - resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==} - dev: false - - /delayed-stream/1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: true - - /delegate/3.2.0: - resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} - dev: false - - /depd/1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - dev: true - - /depd/2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: true - - /destroy/1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dev: true - - /detect-browser/5.3.0: - resolution: {integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==} - dev: false - - /detect-file/1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} - engines: {node: '>=0.10.0'} - dev: true - - /detect-indent/6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: true - - /detect-newline/3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: true - - /detect-node/2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - dev: true - - /diff-sequences/27.5.1: - resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: true - - /diff/4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: true - optional: true - - /dir-glob/3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /dns-equal/1.0.0: - resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} - dev: true - - /dns-packet/5.4.0: - resolution: {integrity: sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==} - engines: {node: '>=6'} - dependencies: - '@leichtgewicht/ip-codec': 2.0.4 - dev: true - - /doctrine/2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /doctrine/3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /dom-align/1.12.3: - resolution: {integrity: sha512-Gj9hZN3a07cbR6zviMUBOMPdWxYhbMI+x+WS0NAIu2zFZmbK8ys9R79g+iG9qLnlCwpFoaB+fKy8Pdv470GsPA==} - dev: false - - /dom-closest/0.2.0: - resolution: {integrity: sha512-6neTn1BtJlTSt+XSISXpnOsF1uni1CHsP/tmzZMGWxasYFHsBOqrHPnzmneqEgKhpagnfnfSfbvRRW0xFsBHAA==} - dependencies: - dom-matches: 2.0.0 - dev: false - - /dom-converter/0.2.0: - resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} - dependencies: - utila: 0.4.0 - dev: true - - /dom-event-types/1.1.0: - resolution: {integrity: sha512-jNCX+uNJ3v38BKvPbpki6j5ItVlnSqVV6vDWGS6rExzCMjsc39frLjm1n91o6YaKK6AZl0wLloItW6C6mr61BQ==} - dev: true - - /dom-matches/2.0.0: - resolution: {integrity: sha512-2VI856xEDCLXi19W+4BechR5/oIS6bKCKqcf16GR8Pg7dGLJ/eBOWVbCmQx2ISvYH6wTNx5Ef7JTOw1dRGRx6A==} - dev: false - - /dom-scroll-into-view/2.0.1: - resolution: {integrity: sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==} - dev: false - - /dom-serializer/0.2.2: - resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} - dependencies: - domelementtype: 2.3.0 - entities: 2.2.0 - dev: true - - /dom-serializer/1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - dev: true - - /domelementtype/1.3.1: - resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} - dev: true - - /domelementtype/2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true - - /domexception/2.0.1: - resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} - engines: {node: '>=8'} - dependencies: - webidl-conversions: 5.0.0 - dev: true - - /domhandler/2.4.2: - resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==} - dependencies: - domelementtype: 1.3.1 - dev: true - - /domhandler/4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: true - - /domutils/1.7.0: - resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} - dependencies: - dom-serializer: 0.2.2 - domelementtype: 1.3.1 - dev: true - - /domutils/2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - dev: true - - /dot-case/3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dependencies: - no-case: 3.0.4 - tslib: 2.4.0 - dev: true - - /dot-prop/5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - dependencies: - is-obj: 2.0.0 - dev: true - - /dotenv-expand/5.1.0: - resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} - dev: true - - /dotenv/10.0.0: - resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} - engines: {node: '>=10'} - dev: true - - /dotignore/0.1.2: - resolution: {integrity: sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==} - hasBin: true - dependencies: - minimatch: 3.1.2 - dev: false - - /duplexer/0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - dev: true - - /eastasianwidth/0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: true - - /easy-stack/1.0.1: - resolution: {integrity: sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w==} - engines: {node: '>=6.0.0'} - dev: true - - /editorconfig/0.15.3: - resolution: {integrity: sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==} - hasBin: true - dependencies: - commander: 2.20.3 - lru-cache: 4.1.5 - semver: 5.7.1 - sigmund: 1.0.1 - dev: true - - /ee-first/1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - dev: true - - /electron-to-chromium/1.4.228: - resolution: {integrity: sha512-XfDHCvou7CsDMlFwb0WZ1tWmW48e7Sn7VBRyPfZsZZila9esRsJl1trO+OqDNV97GggFSt0ISbWslKXfQkG//g==} - dev: true - - /element-resize-detector/1.1.13: - resolution: {integrity: sha512-QzMTvOM+hSXzPGxO4XeHq8OJAJZ/0kZQRbIBVGlR4GRVWHdfv/I/udYzIcQCZtzN1LdwkrGsNPWTIDbC8Tj7PA==} - dependencies: - batch-processor: 1.0.0 - dev: false - - /emittery/0.10.2: - resolution: {integrity: sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==} - engines: {node: '>=12'} - dev: true - - /emittery/0.8.1: - resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} - engines: {node: '>=10'} - dev: true - - /emoji-regex/8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - - /emoji-regex/9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: true - - /emojis-list/2.1.0: - resolution: {integrity: sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==} - engines: {node: '>= 0.10'} - dev: true - - /emojis-list/3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - - /encodeurl/1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - dev: true - - /encoding/0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - dependencies: - iconv-lite: 0.6.3 - dev: false - - /end-of-stream/1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: true - - /enhanced-resolve/5.10.0: - resolution: {integrity: sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.10 - tapable: 2.2.1 - dev: true - - /enquire.js/2.1.6: - resolution: {integrity: sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==} - dev: false - - /enquirer/2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} - dependencies: - ansi-colors: 4.1.3 - dev: true - - /entities/1.1.2: - resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} - dev: true - - /entities/2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - dev: true - - /errno/0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - dependencies: - prr: 1.0.1 - dev: true - optional: true - - /error-ex/1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - - /error-stack-parser/2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - dependencies: - stackframe: 1.3.4 - dev: true - - /es-abstract/1.20.1: - resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - es-to-primitive: 1.2.1 - function-bind: 1.1.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.1.2 - get-symbol-description: 1.0.0 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-symbols: 1.0.3 - internal-slot: 1.0.3 - is-callable: 1.2.4 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-weakref: 1.0.2 - object-inspect: 1.12.2 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 - string.prototype.trimend: 1.0.5 - string.prototype.trimstart: 1.0.5 - unbox-primitive: 1.0.2 - - /es-array-method-boxes-properly/1.0.0: - resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - dev: true - - /es-module-lexer/0.9.3: - resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} - dev: true - - /es-shim-unscopables/1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} - dependencies: - has: 1.0.3 - dev: true - - /es-to-primitive/1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.4 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - - /escalade/3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /escape-html/1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: true - - /escape-string-regexp/1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - /escape-string-regexp/2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true - - /escape-string-regexp/4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /escodegen/2.0.0: - resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==} - engines: {node: '>=6.0'} - hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.6.1 - dev: true - - /eslint-config-standard/12.0.0_txevqkd2r4b3zo3ootu35nzt3u: - resolution: {integrity: sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==} - peerDependencies: - eslint: '>=5.0.0' - eslint-plugin-import: '>=2.13.0' - eslint-plugin-node: '>=7.0.0' - eslint-plugin-promise: '>=4.0.0' - eslint-plugin-standard: '>=4.0.0' - dependencies: - eslint: 7.32.0 - eslint-plugin-import: 2.26.0_eslint@7.32.0 - eslint-plugin-node: 8.0.1_eslint@7.32.0 - eslint-plugin-promise: 4.3.1 - eslint-plugin-standard: 4.1.0_eslint@7.32.0 - dev: true - - /eslint-import-resolver-node/0.3.6: - resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} - dependencies: - debug: 3.2.7 - resolve: 1.22.1 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-module-utils/2.7.4_gw5q3jyuku4zrugqrckhwmprvm: - resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - debug: 3.2.7 - eslint: 7.32.0 - eslint-import-resolver-node: 0.3.6 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-plugin-es/1.4.1_eslint@7.32.0: - resolution: {integrity: sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==} - engines: {node: '>=6.5.0'} - peerDependencies: - eslint: '>=4.19.1' - dependencies: - eslint: 7.32.0 - eslint-utils: 1.4.3 - regexpp: 2.0.1 - dev: true - - /eslint-plugin-html/5.0.5: - resolution: {integrity: sha512-v/33i3OD0fuXcRXexVyXXBOe4mLBLBQoF1UO1Uy9D+XLq4MC8K45GcQKfqjC/FnHAHp3pYUjpHHktYNCtShGmg==} - dependencies: - htmlparser2: 3.10.1 - dev: true - - /eslint-plugin-import/2.26.0_eslint@7.32.0: - resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - array-includes: 3.1.5 - array.prototype.flat: 1.3.0 - debug: 2.6.9 - doctrine: 2.1.0 - eslint: 7.32.0 - eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.4_gw5q3jyuku4zrugqrckhwmprvm - has: 1.0.3 - is-core-module: 2.10.0 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.values: 1.1.5 - resolve: 1.22.1 - tsconfig-paths: 3.14.1 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - - /eslint-plugin-node/8.0.1_eslint@7.32.0: - resolution: {integrity: sha512-ZjOjbjEi6jd82rIpFSgagv4CHWzG9xsQAVp1ZPlhRnnYxcTgENUVBvhYmkQ7GvT1QFijUSo69RaiOJKhMu6i8w==} - engines: {node: '>=6'} - peerDependencies: - eslint: '>=4.19.1' - dependencies: - eslint: 7.32.0 - eslint-plugin-es: 1.4.1_eslint@7.32.0 - eslint-utils: 1.4.3 - ignore: 5.2.0 - minimatch: 3.1.2 - resolve: 1.22.1 - semver: 5.7.1 - dev: true - - /eslint-plugin-promise/4.3.1: - resolution: {integrity: sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ==} - engines: {node: '>=6'} - dev: true - - /eslint-plugin-standard/4.1.0_eslint@7.32.0: - resolution: {integrity: sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==} - peerDependencies: - eslint: '>=5.0.0' - dependencies: - eslint: 7.32.0 - dev: true - - /eslint-plugin-vue/5.2.3_eslint@7.32.0: - resolution: {integrity: sha512-mGwMqbbJf0+VvpGR5Lllq0PMxvTdrZ/ZPjmhkacrCHbubJeJOt+T6E3HUzAifa2Mxi7RSdJfC9HFpOeSYVMMIw==} - engines: {node: '>=6.5'} - peerDependencies: - eslint: ^5.0.0 - dependencies: - eslint: 7.32.0 - vue-eslint-parser: 5.0.0_eslint@7.32.0 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-scope/4.0.3: - resolution: {integrity: sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==} - engines: {node: '>=4.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /eslint-scope/5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - - /eslint-utils/1.4.3: - resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} - engines: {node: '>=6'} - dependencies: - eslint-visitor-keys: 1.3.0 - dev: true - - /eslint-utils/2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} - dependencies: - eslint-visitor-keys: 1.3.0 - dev: true - - /eslint-visitor-keys/1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - dev: true - - /eslint-visitor-keys/2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true - - /eslint-webpack-plugin/3.2.0_2gji4j2x5okmdz3i2csw4u63de: - resolution: {integrity: sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==} - engines: {node: '>= 12.13.0'} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - webpack: ^5.0.0 - dependencies: - '@types/eslint': 8.4.6 - eslint: 7.32.0 - jest-worker: 28.1.3 - micromatch: 4.0.5 - normalize-path: 3.0.0 - schema-utils: 4.0.0 - webpack: 5.74.0 - dev: true - - /eslint/7.32.0: - resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} - engines: {node: ^10.12.0 || >=12.0.0} - hasBin: true - dependencies: - '@babel/code-frame': 7.12.11 - '@eslint/eslintrc': 0.4.3 - '@humanwhocodes/config-array': 0.5.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - enquirer: 2.3.6 - escape-string-regexp: 4.0.0 - eslint-scope: 5.1.1 - eslint-utils: 2.1.0 - eslint-visitor-keys: 2.1.0 - espree: 7.3.1 - esquery: 1.4.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 5.1.2 - globals: 13.17.0 - ignore: 4.0.6 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - js-yaml: 3.14.1 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.1 - progress: 2.0.3 - regexpp: 3.2.0 - semver: 7.3.7 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - table: 6.8.0 - text-table: 0.2.0 - v8-compile-cache: 2.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /espree/4.1.0: - resolution: {integrity: sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w==} - engines: {node: '>=6.0.0'} - dependencies: - acorn: 6.4.2 - acorn-jsx: 5.3.2_acorn@6.4.2 - eslint-visitor-keys: 1.3.0 - dev: true - - /espree/7.3.1: - resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - acorn: 7.4.1 - acorn-jsx: 5.3.2_acorn@7.4.1 - eslint-visitor-keys: 1.3.0 - dev: true - - /esprima/4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /esquery/1.4.0: - resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse/4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse/4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true - - /estraverse/5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - - /esutils/2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /etag/1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - dev: true - - /event-pubsub/4.3.0: - resolution: {integrity: sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==} - engines: {node: '>=4.0.0'} - dev: true - - /eventemitter3/2.0.3: - resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==} - dev: false - - /eventemitter3/4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: true - - /events/3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: true - - /execa/0.8.0: - resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} - engines: {node: '>=4'} - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - dev: true - - /execa/1.0.0: - resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} - engines: {node: '>=6'} - dependencies: - cross-spawn: 6.0.5 - get-stream: 4.1.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - dev: true - - /execa/5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /exit/0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - dev: true - - /expand-tilde/2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} - dependencies: - homedir-polyfill: 1.0.3 - dev: true - - /expect/27.5.1: - resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - jest-get-type: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - dev: true - - /express/4.18.1: - resolution: {integrity: sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.0 - content-disposition: 0.5.4 - content-type: 1.0.4 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.10.3 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /extend-shallow/2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - dependencies: - is-extendable: 0.1.1 - dev: true - - /extend/3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: false - - /external-editor/3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - dev: true - - /fast-deep-equal/3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - /fast-diff/1.1.2: - resolution: {integrity: sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==} - dev: false - - /fast-glob/3.2.11: - resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-json-stable-stringify/2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - /fast-levenshtein/2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fastest-levenshtein/1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} - dev: true - - /fastq/1.13.0: - resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} - dependencies: - reusify: 1.0.4 - dev: true - - /faye-websocket/0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} - dependencies: - websocket-driver: 0.7.4 - dev: true - - /fb-watchman/2.0.1: - resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} - dependencies: - bser: 2.1.1 - dev: true - - /fecha/2.3.3: - resolution: {integrity: sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg==} - dev: false - - /figures/2.0.0: - resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} - engines: {node: '>=4'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - - /figures/3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - - /file-entry-cache/6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.0.4 - dev: true - - /file-loader/6.2.0: - resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - loader-utils: 2.0.2 - schema-utils: 3.1.1 - dev: true - - /fill-range/7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /finalhandler/1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /find-cache-dir/3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - dependencies: - commondir: 1.0.1 - make-dir: 3.1.0 - pkg-dir: 4.2.0 - - /find-node-modules/2.1.3: - resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} - dependencies: - findup-sync: 4.0.0 - merge: 2.1.1 - dev: true - - /find-root/1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: true - - /find-up/4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - /find-up/5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /findup-sync/4.0.0: - resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} - engines: {node: '>= 8'} - dependencies: - detect-file: 1.0.0 - is-glob: 4.0.3 - micromatch: 4.0.5 - resolve-dir: 1.0.1 - dev: true - - /flat-cache/3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.2.7 - rimraf: 3.0.2 - dev: true - - /flatted/3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - dev: true - - /fmin/0.0.2: - resolution: {integrity: sha512-sSi6DzInhl9d8yqssDfGZejChO8d2bAGIpysPsvYsxFe898z89XhCZg6CPNV3nhUhFefeC/AXZK2bAJxlBjN6A==} - dependencies: - contour_plot: 0.0.1 - json2module: 0.0.3 - rollup: 0.25.8 - tape: 4.16.0 - uglify-js: 2.8.29 - dev: false - - /follow-redirects/1.15.1: - resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - /for-each/0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - dependencies: - is-callable: 1.2.4 - dev: false - - /form-data/3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: true - - /forwarded/0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - dev: true - - /fraction.js/4.2.0: - resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} - dev: true - - /fresh/0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - dev: true - - /fs-extra/9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.10 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - - /fs-monkey/1.0.3: - resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} - dev: true - - /fs.realpath/1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents/2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind/1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - - /function.prototype.name/1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - functions-have-names: 1.2.3 - - /functional-red-black-tree/1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - dev: true - - /functions-have-names/1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - /gensync/1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - - /get-caller-file/2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /get-intrinsic/1.1.2: - resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==} - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.3 - - /get-package-type/0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true - - /get-stream/3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - dev: true - - /get-stream/4.1.0: - resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} - engines: {node: '>=6'} - dependencies: - pump: 3.0.0 - dev: true - - /get-stream/6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - - /get-symbol-description/1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.1.2 - - /git-raw-commits/2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} - hasBin: true - dependencies: - dargs: 7.0.0 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true - - /git-revision-webpack-plugin/3.0.6: - resolution: {integrity: sha512-vW/9dBahGbpKPcccy3xKkHgdWoH/cAPPc3lQw+3edl7b4j29JfNGVrja0a1d8ZoRe4nTN8GCPrF9aBErDnzx5Q==} - engines: {node: '>=6.11.5'} - dev: true - - /glob-parent/5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-parent/6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-to-regexp/0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true - - /glob/7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob/8.0.3: - resolution: {integrity: sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.0 - once: 1.4.0 - dev: true - - /global-dirs/0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} - dependencies: - ini: 1.3.8 - dev: true - - /global-modules/1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} - dependencies: - global-prefix: 1.0.2 - is-windows: 1.0.2 - resolve-dir: 1.0.1 - dev: true - - /global-modules/2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} - dependencies: - global-prefix: 3.0.0 - dev: true - - /global-prefix/1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} - dependencies: - expand-tilde: 2.0.2 - homedir-polyfill: 1.0.3 - ini: 1.3.8 - is-windows: 1.0.2 - which: 1.3.1 - dev: true - - /global-prefix/3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} - dependencies: - ini: 1.3.8 - kind-of: 6.0.3 - which: 1.3.1 - dev: true - - /globals/11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - - /globals/13.17.0: - resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globby/11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.2.11 - ignore: 5.2.0 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /globjoin/0.1.4: - resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==} - dev: true - - /good-listener/1.2.2: - resolution: {integrity: sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==} - dependencies: - delegate: 3.2.0 - dev: false - - /graceful-fs/4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - dev: true - - /graphlib/2.1.8: - resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==} - dependencies: - lodash: 4.17.21 - dev: false - - /gzip-size/6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} - dependencies: - duplexer: 0.1.2 - dev: true - - /handle-thing/2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - dev: true - - /hard-rejection/2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true - - /has-ansi/2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: false - - /has-bigints/1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - - /has-flag/3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-flag/4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has-property-descriptors/1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - dependencies: - get-intrinsic: 1.1.2 - - /has-symbols/1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - /has-tostringtag/1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - - /has/1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - - /hash-sum/1.0.2: - resolution: {integrity: sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==} - dev: true - - /hash-sum/2.0.0: - resolution: {integrity: sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==} - dev: true - - /he/1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - /highlight.js/10.7.3: - resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - dev: true - - /homedir-polyfill/1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} - dependencies: - parse-passwd: 1.0.0 - dev: true - - /hosted-git-info/2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: true - - /hosted-git-info/4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - dependencies: - lru-cache: 6.0.0 - dev: true - - /hpack.js/2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} - dependencies: - inherits: 2.0.4 - obuf: 1.1.2 - readable-stream: 2.3.7 - wbuf: 1.7.3 - dev: true - - /html-encoding-sniffer/2.0.1: - resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} - engines: {node: '>=10'} - dependencies: - whatwg-encoding: 1.0.5 - dev: true - - /html-entities/2.3.3: - resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} - dev: true - - /html-escaper/2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - - /html-minifier-terser/6.1.0: - resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} - engines: {node: '>=12'} - hasBin: true - dependencies: - camel-case: 4.1.2 - clean-css: 5.3.1 - commander: 8.3.0 - he: 1.2.0 - param-case: 3.0.4 - relateurl: 0.2.7 - terser: 5.15.0 - dev: true - - /html-tags/2.0.0: - resolution: {integrity: sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==} - engines: {node: '>=4'} - dev: true - - /html-tags/3.2.0: - resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==} - engines: {node: '>=8'} - dev: true - - /html-webpack-plugin/5.5.0_webpack@5.74.0: - resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} - engines: {node: '>=10.13.0'} - peerDependencies: - webpack: ^5.20.0 - dependencies: - '@types/html-minifier-terser': 6.1.0 - html-minifier-terser: 6.1.0 - lodash: 4.17.21 - pretty-error: 4.0.0 - tapable: 2.2.1 - webpack: 5.74.0 - dev: true - - /htmlparser2/3.10.1: - resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==} - dependencies: - domelementtype: 1.3.1 - domhandler: 2.4.2 - domutils: 1.7.0 - entities: 1.1.2 - inherits: 2.0.4 - readable-stream: 3.6.0 - dev: true - - /htmlparser2/6.1.0: - resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 2.2.0 - dev: true - - /http-deceiver/1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - dev: true - - /http-errors/1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} - dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.5.0 - dev: true - - /http-errors/2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - dev: true - - /http-parser-js/0.5.8: - resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - dev: true - - /http-proxy-agent/4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - - /http-proxy-middleware/2.0.6_vw7eq5saxorls4jwsr6ncij7dm: - resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/express': ^4.17.13 - peerDependenciesMeta: - '@types/express': - optional: true - dependencies: - '@types/express': 4.17.13 - '@types/http-proxy': 1.17.9 - http-proxy: 1.18.1_debug@4.3.4 - is-glob: 4.0.3 - is-plain-obj: 3.0.0 - micromatch: 4.0.5 - transitivePeerDependencies: - - debug - dev: true - - /http-proxy/1.18.1_debug@4.3.4: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.1 - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - dev: true - - /https-proxy-agent/5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - - /human-signals/2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - - /husky/6.0.0: - resolution: {integrity: sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==} - hasBin: true - dev: true - - /iconv-lite/0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - - /iconv-lite/0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: false - - /icss-utils/5.1.0_postcss@8.4.16: - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.16 - dev: true - - /ieee754/1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - - /ignore/4.0.6: - resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} - engines: {node: '>= 4'} - dev: true - - /ignore/5.2.0: - resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} - engines: {node: '>= 4'} - dev: true - - /image-size/0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} - engines: {node: '>=0.10.0'} - hasBin: true - requiresBuild: true - dev: true - optional: true - - /import-fresh/3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /import-lazy/4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - dev: true - - /import-local/3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true - - /imurmurhash/0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /indent-string/4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true - - /inflight/1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits/2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - dev: true - - /inherits/2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /ini/1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true - - /inquirer/8.2.4: - resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} - engines: {node: '>=12.0.0'} - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.5.6 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 7.0.0 - dev: true - - /insert-css/2.0.0: - resolution: {integrity: sha512-xGq5ISgcUP5cvGkS2MMFLtPDBtrtQPSFfC6gA6U8wHKqfjTIMZLZNxOItQnoSjdOzlXOLU/yD32RKC4SvjNbtA==} - dev: false - - /internal-slot/1.0.3: - resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.1.2 - has: 1.0.3 - side-channel: 1.0.4 - - /intersperse/1.0.0: - resolution: {integrity: sha512-LGcfug7OTeWkaQ8PEq8XbTy9Jl6uCNg8DrPnQUmwxSY8UETj1Y+LLmpdD0qHdEj6KVchuH3BE3ZzIXQ1t3oFUw==} - dev: false - - /ipaddr.js/1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - dev: true - - /ipaddr.js/2.0.1: - resolution: {integrity: sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==} - engines: {node: '>= 10'} - dev: true - - /is-arguments/1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: false - - /is-arrayish/0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true - - /is-bigint/1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - dependencies: - has-bigints: 1.0.2 - - /is-binary-path/2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - dev: true - - /is-boolean-object/1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - - /is-buffer/1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - - /is-callable/1.2.4: - resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} - engines: {node: '>= 0.4'} - - /is-ci/1.2.1: - resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} - hasBin: true - dependencies: - ci-info: 1.6.0 - dev: true - - /is-core-module/2.10.0: - resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==} - dependencies: - has: 1.0.3 - - /is-date-object/1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - - /is-docker/2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true - - /is-extendable/0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - dev: true - - /is-extglob/2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-file-esm/1.0.0: - resolution: {integrity: sha512-rZlaNKb4Mr8WlRu2A9XdeoKgnO5aA53XdPHgCKVyCrQ/rWi89RET1+bq37Ru46obaQXeiX4vmFIm1vks41hoSA==} - dependencies: - read-pkg-up: 7.0.1 - dev: true - - /is-fullwidth-code-point/2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - dev: true - - /is-fullwidth-code-point/3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - - /is-fullwidth-code-point/4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: true - - /is-generator-fn/2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: true - - /is-glob/4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-interactive/1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - dev: true - - /is-mobile/2.2.2: - resolution: {integrity: sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg==} - dev: false - - /is-negative-zero/2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - - /is-number-object/1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - - /is-number/7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-obj/2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true - - /is-plain-obj/1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true - - /is-plain-obj/3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - dev: true - - /is-plain-object/2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - dev: true - - /is-plain-object/5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - dev: true - - /is-potential-custom-element-name/1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: true - - /is-regex/1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - - /is-shared-array-buffer/1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - dependencies: - call-bind: 1.0.2 - - /is-stream/1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - - /is-stream/2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-string/1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - - /is-symbol/1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.0.3 - - /is-text-path/1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} - dependencies: - text-extensions: 1.9.0 - dev: true - - /is-typedarray/1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true - - /is-unicode-supported/0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: true - - /is-utf8/0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - dev: true - - /is-weakref/1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - dependencies: - call-bind: 1.0.2 - - /is-what/3.14.1: - resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - dev: true - - /is-whitespace/0.3.0: - resolution: {integrity: sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg==} - engines: {node: '>=0.10.0'} - dev: true - - /is-windows/1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true - - /is-wsl/2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - dev: true - - /isarray/0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: false - - /isarray/1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true - - /isexe/2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /ismobilejs/1.1.1: - resolution: {integrity: sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==} - dev: false - - /isobject/3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - dev: true - - /isomorphic-fetch/2.2.1: - resolution: {integrity: sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==} - dependencies: - node-fetch: 1.7.3 - whatwg-fetch: 3.6.2 - dev: false - - /istanbul-lib-coverage/3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-instrument/5.2.0: - resolution: {integrity: sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.18.13 - '@babel/parser': 7.18.13 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-report/3.0.0: - resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} - engines: {node: '>=8'} - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 3.1.0 - supports-color: 7.2.0 - dev: true - - /istanbul-lib-source-maps/4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports/3.1.5: - resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.0 - dev: true - - /javascript-stringify/2.1.0: - resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} - dev: true - - /jest-changed-files/27.5.1: - resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - execa: 5.1.1 - throat: 6.0.1 - dev: true - - /jest-circus/27.5.1: - resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.7.13 - chalk: 4.1.2 - co: 4.6.0 - dedent: 0.7.0 - expect: 27.5.1 - is-generator-fn: 2.1.0 - jest-each: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - slash: 3.0.0 - stack-utils: 2.0.5 - throat: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-cli/27.5.1: - resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.10 - import-local: 3.1.0 - jest-config: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - prompts: 2.4.2 - yargs: 16.2.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: true - - /jest-config/27.5.1: - resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - peerDependencies: - ts-node: '>=9.0.0' - peerDependenciesMeta: - ts-node: - optional: true - dependencies: - '@babel/core': 7.18.13 - '@jest/test-sequencer': 27.5.1 - '@jest/types': 27.5.1 - babel-jest: 27.5.1_@babel+core@7.18.13 - chalk: 4.1.2 - ci-info: 3.3.2 - deepmerge: 4.2.2 - glob: 7.2.3 - graceful-fs: 4.2.10 - jest-circus: 27.5.1 - jest-environment-jsdom: 27.5.1 - jest-environment-node: 27.5.1 - jest-get-type: 27.5.1 - jest-jasmine2: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-runner: 27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 27.5.1 - slash: 3.0.0 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - - /jest-diff/27.5.1: - resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /jest-docblock/27.5.1: - resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - detect-newline: 3.1.0 - dev: true - - /jest-each/27.5.1: - resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - chalk: 4.1.2 - jest-get-type: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /jest-environment-jsdom/27.5.1: - resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.7.13 - jest-mock: 27.5.1 - jest-util: 27.5.1 - jsdom: 16.7.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - - /jest-environment-node/27.5.1: - resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/fake-timers': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.7.13 - jest-mock: 27.5.1 - jest-util: 27.5.1 - dev: true - - /jest-get-type/27.5.1: - resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: true - - /jest-haste-map/27.5.1: - resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@types/graceful-fs': 4.1.5 - '@types/node': 18.7.13 - anymatch: 3.1.2 - fb-watchman: 2.0.1 - graceful-fs: 4.2.10 - jest-regex-util: 27.5.1 - jest-serializer: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /jest-jasmine2/27.5.1: - resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/source-map': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.7.13 - chalk: 4.1.2 - co: 4.6.0 - expect: 27.5.1 - is-generator-fn: 2.1.0 - jest-each: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-runtime: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - pretty-format: 27.5.1 - throat: 6.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-leak-detector/27.5.1: - resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /jest-matcher-utils/27.5.1: - resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 27.5.1 - jest-get-type: 27.5.1 - pretty-format: 27.5.1 - dev: true - - /jest-message-util/27.5.1: - resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@babel/code-frame': 7.18.6 - '@jest/types': 27.5.1 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.10 - micromatch: 4.0.5 - pretty-format: 27.5.1 - slash: 3.0.0 - stack-utils: 2.0.5 - dev: true - - /jest-message-util/28.1.3: - resolution: {integrity: sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - dependencies: - '@babel/code-frame': 7.18.6 - '@jest/types': 28.1.3 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.10 - micromatch: 4.0.5 - pretty-format: 28.1.3 - slash: 3.0.0 - stack-utils: 2.0.5 - dev: true - - /jest-mock/27.5.1: - resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@types/node': 18.7.13 - dev: true - - /jest-pnp-resolver/1.2.2_jest-resolve@27.5.1: - resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 27.5.1 - dev: true - - /jest-regex-util/27.5.1: - resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dev: true - - /jest-regex-util/28.0.2: - resolution: {integrity: sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - dev: true - - /jest-resolve-dependencies/27.5.1: - resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - jest-regex-util: 27.5.1 - jest-snapshot: 27.5.1 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-resolve/27.5.1: - resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - chalk: 4.1.2 - graceful-fs: 4.2.10 - jest-haste-map: 27.5.1 - jest-pnp-resolver: 1.2.2_jest-resolve@27.5.1 - jest-util: 27.5.1 - jest-validate: 27.5.1 - resolve: 1.22.1 - resolve.exports: 1.1.0 - slash: 3.0.0 - dev: true - - /jest-runner/27.5.1: - resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/console': 27.5.1 - '@jest/environment': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.7.13 - chalk: 4.1.2 - emittery: 0.8.1 - graceful-fs: 4.2.10 - jest-docblock: 27.5.1 - jest-environment-jsdom: 27.5.1 - jest-environment-node: 27.5.1 - jest-haste-map: 27.5.1 - jest-leak-detector: 27.5.1 - jest-message-util: 27.5.1 - jest-resolve: 27.5.1 - jest-runtime: 27.5.1 - jest-util: 27.5.1 - jest-worker: 27.5.1 - source-map-support: 0.5.21 - throat: 6.0.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: true - - /jest-runtime/27.5.1: - resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/environment': 27.5.1 - '@jest/fake-timers': 27.5.1 - '@jest/globals': 27.5.1 - '@jest/source-map': 27.5.1 - '@jest/test-result': 27.5.1 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - chalk: 4.1.2 - cjs-module-lexer: 1.2.2 - collect-v8-coverage: 1.0.1 - execa: 5.1.1 - glob: 7.2.3 - graceful-fs: 4.2.10 - jest-haste-map: 27.5.1 - jest-message-util: 27.5.1 - jest-mock: 27.5.1 - jest-regex-util: 27.5.1 - jest-resolve: 27.5.1 - jest-snapshot: 27.5.1 - jest-util: 27.5.1 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-serializer-vue/2.0.2: - resolution: {integrity: sha512-nK/YIFo6qe3i9Ge+hr3h4PpRehuPPGZFt8LDBdTHYldMb7ZWlkanZS8Ls7D8h6qmQP2lBQVDLP0DKn5bJ9QApQ==} - dependencies: - pretty: 2.0.0 - dev: true - - /jest-serializer/27.5.1: - resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@types/node': 18.7.13 - graceful-fs: 4.2.10 - dev: true - - /jest-snapshot/27.5.1: - resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@babel/core': 7.18.13 - '@babel/generator': 7.18.13 - '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.18.13 - '@babel/traverse': 7.18.13 - '@babel/types': 7.18.13 - '@jest/transform': 27.5.1 - '@jest/types': 27.5.1 - '@types/babel__traverse': 7.18.0 - '@types/prettier': 2.7.0 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.18.13 - chalk: 4.1.2 - expect: 27.5.1 - graceful-fs: 4.2.10 - jest-diff: 27.5.1 - jest-get-type: 27.5.1 - jest-haste-map: 27.5.1 - jest-matcher-utils: 27.5.1 - jest-message-util: 27.5.1 - jest-util: 27.5.1 - natural-compare: 1.4.0 - pretty-format: 27.5.1 - semver: 7.3.7 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-transform-stub/2.0.0: - resolution: {integrity: sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg==} - dev: true - - /jest-util/27.5.1: - resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - '@types/node': 18.7.13 - chalk: 4.1.2 - ci-info: 3.3.2 - graceful-fs: 4.2.10 - picomatch: 2.3.1 - dev: true - - /jest-util/28.1.3: - resolution: {integrity: sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - dependencies: - '@jest/types': 28.1.3 - '@types/node': 18.7.13 - chalk: 4.1.2 - ci-info: 3.3.2 - graceful-fs: 4.2.10 - picomatch: 2.3.1 - dev: true - - /jest-validate/27.5.1: - resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/types': 27.5.1 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 27.5.1 - leven: 3.1.0 - pretty-format: 27.5.1 - dev: true - - /jest-watch-typeahead/1.1.0_jest@27.5.1: - resolution: {integrity: sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - jest: ^27.0.0 || ^28.0.0 - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - jest: 27.5.1 - jest-regex-util: 28.0.2 - jest-watcher: 28.1.3 - slash: 4.0.0 - string-length: 5.0.1 - strip-ansi: 7.0.1 - dev: true - - /jest-watcher/27.5.1: - resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - '@jest/test-result': 27.5.1 - '@jest/types': 27.5.1 - '@types/node': 18.7.13 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - jest-util: 27.5.1 - string-length: 4.0.2 - dev: true - - /jest-watcher/28.1.3: - resolution: {integrity: sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - dependencies: - '@jest/test-result': 28.1.3 - '@jest/types': 28.1.3 - '@types/node': 18.7.13 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.10.2 - jest-util: 28.1.3 - string-length: 4.0.2 - dev: true - - /jest-worker/27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/node': 18.7.13 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest-worker/28.1.3: - resolution: {integrity: sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - dependencies: - '@types/node': 18.7.13 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest/27.5.1: - resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 27.5.1 - import-local: 3.1.0 - jest-cli: 27.5.1 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - ts-node - - utf-8-validate - dev: true - - /joi/17.6.0: - resolution: {integrity: sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==} - dependencies: - '@hapi/hoek': 9.3.0 - '@hapi/topo': 5.1.0 - '@sideway/address': 4.1.4 - '@sideway/formula': 3.0.0 - '@sideway/pinpoint': 2.0.0 - dev: true - - /js-beautify/1.14.6: - resolution: {integrity: sha512-GfofQY5zDp+cuHc+gsEXKPpNw2KbPddreEo35O6jT6i0RVK6LhsoYBhq5TvK4/n74wnA0QbK8gGd+jUZwTMKJw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - config-chain: 1.1.13 - editorconfig: 0.15.3 - glob: 8.0.3 - nopt: 6.0.0 - dev: true - - /js-message/1.0.7: - resolution: {integrity: sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA==} - engines: {node: '>=0.6.0'} - dev: true - - /js-tokens/4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - /js-yaml/3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - - /jsdom/16.7.0: - resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} - engines: {node: '>=10'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - dependencies: - abab: 2.0.6 - acorn: 8.8.0 - acorn-globals: 6.0.0 - cssom: 0.4.4 - cssstyle: 2.3.0 - data-urls: 2.0.0 - decimal.js: 10.4.0 - domexception: 2.0.1 - escodegen: 2.0.0 - form-data: 3.0.1 - html-encoding-sniffer: 2.0.1 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.1 - parse5: 6.0.1 - saxes: 5.0.1 - symbol-tree: 3.2.4 - tough-cookie: 4.1.0 - w3c-hr-time: 1.0.2 - w3c-xmlserializer: 2.0.0 - webidl-conversions: 6.1.0 - whatwg-encoding: 1.0.5 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - ws: 7.5.9 - xml-name-validator: 3.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /jsesc/0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: true - - /jsesc/2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /json-parse-better-errors/1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true - - /json-parse-even-better-errors/2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - - /json-schema-traverse/0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - /json-schema-traverse/1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true - - /json-stable-stringify-without-jsonify/1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /json2module/0.0.3: - resolution: {integrity: sha512-qYGxqrRrt4GbB8IEOy1jJGypkNsjWoIMlZt4bAsmUScCA507Hbc2p1JOhBzqn45u3PWafUgH2OnzyNU7udO/GA==} - hasBin: true - dependencies: - rw: 1.3.3 - dev: false - - /json2mq/0.2.0: - resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} - dependencies: - string-convert: 0.2.1 - dev: false - - /json5/0.5.1: - resolution: {integrity: sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==} - hasBin: true - dev: true - - /json5/1.0.1: - resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} - hasBin: true - dependencies: - minimist: 1.2.6 - dev: true - - /json5/2.2.1: - resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} - engines: {node: '>=6'} - hasBin: true - - /jsonfile/6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.10 - dev: true - - /jsonparse/1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true - - /kind-of/3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - dependencies: - is-buffer: 1.1.6 - - /kind-of/6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true - - /kleur/3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true - - /klona/2.0.5: - resolution: {integrity: sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==} - engines: {node: '>= 8'} - dev: true - - /known-css-properties/0.25.0: - resolution: {integrity: sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==} - dev: true - - /launch-editor-middleware/2.6.0: - resolution: {integrity: sha512-K2yxgljj5TdCeRN1lBtO3/J26+AIDDDw+04y6VAiZbWcTdBwsYN6RrZBnW5DN/QiSIdKNjKdATLUUluWWFYTIA==} - dependencies: - launch-editor: 2.6.0 - dev: true - - /launch-editor/2.6.0: - resolution: {integrity: sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==} - dependencies: - picocolors: 1.0.0 - shell-quote: 1.7.3 - dev: true - - /lazy-cache/1.0.4: - resolution: {integrity: sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==} - engines: {node: '>=0.10.0'} - dev: false - - /less-loader/5.0.0_less@3.13.1: - resolution: {integrity: sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==} - engines: {node: '>= 4.8.0'} - peerDependencies: - less: ^2.3.1 || ^3.0.0 - webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 - dependencies: - clone: 2.1.2 - less: 3.13.1 - loader-utils: 1.4.0 - pify: 4.0.1 - dev: true - - /less/3.13.1: - resolution: {integrity: sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==} - engines: {node: '>=6'} - hasBin: true - dependencies: - copy-anything: 2.0.6 - tslib: 1.14.1 - optionalDependencies: - errno: 0.1.8 - graceful-fs: 4.2.10 - image-size: 0.5.5 - make-dir: 2.1.0 - mime: 1.6.0 - native-request: 1.1.0 - source-map: 0.6.1 - dev: true - - /leven/3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: true - - /levn/0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - type-check: 0.3.2 - dev: true - - /levn/0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /lilconfig/2.0.5: - resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} - engines: {node: '>=10'} - dev: true - - /lilconfig/2.0.6: - resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} - engines: {node: '>=10'} - dev: true - - /lines-and-columns/1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true - - /lint-staged/12.5.0: - resolution: {integrity: sha512-BKLUjWDsKquV/JuIcoQW4MSAI3ggwEImF1+sB4zaKvyVx1wBk3FsG7UK9bpnmBTN1pm7EH2BBcMwINJzCRv12g==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - dependencies: - cli-truncate: 3.1.0 - colorette: 2.0.19 - commander: 9.4.0 - debug: 4.3.4_supports-color@9.2.2 - execa: 5.1.1 - lilconfig: 2.0.5 - listr2: 4.0.5 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-inspect: 1.12.2 - pidtree: 0.5.0 - string-argv: 0.3.1 - supports-color: 9.2.2 - yaml: 1.10.2 - transitivePeerDependencies: - - enquirer - dev: true - - /listr2/4.0.5: - resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==} - engines: {node: '>=12'} - peerDependencies: - enquirer: '>= 2.3.0 < 3' - peerDependenciesMeta: - enquirer: - optional: true - dependencies: - cli-truncate: 2.1.0 - colorette: 2.0.19 - log-update: 4.0.0 - p-map: 4.0.0 - rfdc: 1.3.0 - rxjs: 7.5.6 - through: 2.3.8 - wrap-ansi: 7.0.0 - dev: true - - /loader-runner/4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: true - - /loader-utils/1.1.0: - resolution: {integrity: sha512-gkD9aSEG9UGglyPcDJqY9YBTUtCLKaBK6ihD2VP1d1X60lTfFspNZNulGBBbUZLkPygy4LySYHyxBpq+VhjObQ==} - engines: {node: '>=4.0.0'} - dependencies: - big.js: 3.2.0 - emojis-list: 2.1.0 - json5: 0.5.1 - dev: true - - /loader-utils/1.4.0: - resolution: {integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==} - engines: {node: '>=4.0.0'} - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 1.0.1 - dev: true - - /loader-utils/2.0.2: - resolution: {integrity: sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==} - engines: {node: '>=8.9.0'} - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.1 - - /locate-path/5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - - /locate-path/6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash.clonedeep/4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - dev: false - - /lodash.debounce/4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - dev: true - - /lodash.defaultsdeep/4.6.1: - resolution: {integrity: sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==} - dev: true - - /lodash.get/4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: false - - /lodash.kebabcase/4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - dev: true - - /lodash.map/4.6.0: - resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} - dev: true - - /lodash.mapvalues/4.6.0: - resolution: {integrity: sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==} - dev: true - - /lodash.memoize/4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true - - /lodash.merge/4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /lodash.pick/4.4.0: - resolution: {integrity: sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==} - dev: false - - /lodash.truncate/4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - dev: true - - /lodash.uniq/4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - dev: true - - /lodash/4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - /log-symbols/4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - dev: true - - /log-update/2.3.0: - resolution: {integrity: sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==} - engines: {node: '>=4'} - dependencies: - ansi-escapes: 3.2.0 - cli-cursor: 2.1.0 - wrap-ansi: 3.0.1 - dev: true - - /log-update/4.0.0: - resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} - engines: {node: '>=10'} - dependencies: - ansi-escapes: 4.3.2 - cli-cursor: 3.1.0 - slice-ansi: 4.0.0 - wrap-ansi: 6.2.0 - dev: true - - /longest/1.0.1: - resolution: {integrity: sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==} - engines: {node: '>=0.10.0'} - dev: false - - /longest/2.0.1: - resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} - engines: {node: '>=0.10.0'} - dev: true - - /loose-envify/1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 - dev: false - - /lower-case/2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - dependencies: - tslib: 2.4.0 - dev: true - - /lru-cache/4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: true - - /lru-cache/6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /make-dir/2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} - dependencies: - pify: 4.0.1 - semver: 5.7.1 - dev: true - optional: true - - /make-dir/3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.0 - - /make-error/1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true - optional: true - - /makeerror/1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 - dev: true - - /map-obj/1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true - - /map-obj/4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true - - /mathml-tag-names/2.1.3: - resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==} - dev: true - - /md5/2.3.0: - resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} - dependencies: - charenc: 0.0.2 - crypt: 0.0.2 - is-buffer: 1.1.6 - dev: false - - /mdn-data/2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - dev: true - - /mdn-data/2.0.4: - resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} - dev: true - - /media-typer/0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - dev: true - - /memfs/3.4.7: - resolution: {integrity: sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==} - engines: {node: '>= 4.0.0'} - dependencies: - fs-monkey: 1.0.3 - dev: true - - /meow/8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} - dependencies: - '@types/minimist': 1.2.2 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.0 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true - - /meow/9.0.0: - resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} - engines: {node: '>=10'} - dependencies: - '@types/minimist': 1.2.2 - camelcase-keys: 6.2.2 - decamelize: 1.2.0 - decamelize-keys: 1.1.0 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true - - /merge-descriptors/1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - dev: true - - /merge-source-map/1.1.0: - resolution: {integrity: sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==} - dependencies: - source-map: 0.6.1 - dev: true - - /merge-stream/2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /merge/2.1.1: - resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} - dev: true - - /merge2/1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /methods/1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: true - - /micromatch/4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /mime-db/1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true - - /mime-types/2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: true - - /mime/1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /mimic-fn/1.2.0: - resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} - engines: {node: '>=4'} - dev: true - - /mimic-fn/2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true - - /min-indent/1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true - - /mini-css-extract-plugin/2.6.1_webpack@5.74.0: - resolution: {integrity: sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 - dependencies: - schema-utils: 4.0.0 - webpack: 5.74.0 - dev: true - - /minimalistic-assert/1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - dev: true - - /minimatch/3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - - /minimatch/5.1.0: - resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: true - - /minimist-options/4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 - dev: true - - /minimist/1.2.6: - resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} - - /minipass/3.3.4: - resolution: {integrity: sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==} - engines: {node: '>=8'} - dependencies: - yallist: 4.0.0 - dev: true - - /mkdirp/0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - dependencies: - minimist: 1.2.6 - dev: true - - /mockjs2/1.0.8: - resolution: {integrity: sha512-IXY9wzq3Pr2tybkJnT+dzrTz0GBRTtgXc7Cke/UUQyyWtbjDrck8uZ3NmMF4LaWgAD8vm8EMGcBk4Itc6nzpRg==} - hasBin: true - dependencies: - commander: 9.4.0 - dev: false - - /module-alias/2.2.2: - resolution: {integrity: sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==} - dev: true - - /moment/2.29.4: - resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} - dev: false - - /mrmime/1.0.1: - resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} - engines: {node: '>=10'} - dev: true - - /ms/2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: true - - /ms/2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: true - - /ms/2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - - /multicast-dns/7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} - hasBin: true - dependencies: - dns-packet: 5.4.0 - thunky: 1.1.0 - dev: true - - /mutationobserver-shim/0.3.7: - resolution: {integrity: sha512-oRIDTyZQU96nAiz2AQyngwx1e89iApl2hN5AOYwyxLUB47UYsU3Wv9lJWqH5y/QdiYkc5HQLi23ZNB3fELdHcQ==} - dev: false - - /mute-stream/0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true - - /mz/2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: true - - /nanoid/3.3.4: - resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - /nanopop/2.1.0: - resolution: {integrity: sha512-jGTwpFRexSH+fxappnGQtN9dspgE2ipa1aOjtR24igG0pv6JCxImIAmrLRHX+zUF5+1wtsFVbKyfP51kIGAVNw==} - dev: false - - /native-request/1.1.0: - resolution: {integrity: sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==} - requiresBuild: true - dev: true - optional: true - - /natural-compare/1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /negotiator/0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: true - - /neo-async/2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true - - /nice-try/1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - dev: true - - /no-case/3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - dependencies: - lower-case: 2.0.2 - tslib: 2.4.0 - dev: true - - /node-emoji/1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - dependencies: - lodash: 4.17.21 - dev: false - - /node-fetch/1.7.3: - resolution: {integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==} - dependencies: - encoding: 0.1.13 - is-stream: 1.1.0 - dev: false - - /node-fetch/2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - - /node-forge/1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - dev: true - - /node-int64/0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true - - /node-releases/2.0.6: - resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} - dev: true - - /nopt/6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: true - - /normalize-package-data/2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.1 - semver: 5.7.1 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-package-data/3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.10.0 - semver: 7.3.7 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-path/1.0.0: - resolution: {integrity: sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-path/3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-range/0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: true - - /normalize-url/6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - dev: true - - /npm-run-path/2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - dependencies: - path-key: 2.0.1 - dev: true - - /npm-run-path/4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - - /nprogress/0.2.0: - resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} - dev: false - - /nth-check/1.0.2: - resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} - dependencies: - boolbase: 1.0.0 - dev: true - - /nth-check/2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - dependencies: - boolbase: 1.0.0 - dev: true - - /nwsapi/2.2.1: - resolution: {integrity: sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==} - dev: true - - /object-assign/4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - /object-inspect/1.12.2: - resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} - - /object-is/1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - dev: false - - /object-keys/1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - /object.assign/4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - /object.getownpropertydescriptors/2.1.4: - resolution: {integrity: sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==} - engines: {node: '>= 0.8'} - dependencies: - array.prototype.reduce: 1.0.4 - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - dev: true - - /object.values/1.1.5: - resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - dev: true - - /obuf/1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - dev: true - - /omit.js/1.0.2: - resolution: {integrity: sha512-/QPc6G2NS+8d4L/cQhbk6Yit1WTB6Us2g84A7A/1+w9d/eRGHyEqC5kkQtHVoHZ5NFWGG7tUGgrhVZwgZanKrQ==} - dependencies: - babel-runtime: 6.26.0 - dev: false - - /on-finished/2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - dependencies: - ee-first: 1.1.1 - dev: true - - /on-headers/1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - dev: true - - /once/1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /onetime/2.0.1: - resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} - engines: {node: '>=4'} - dependencies: - mimic-fn: 1.2.0 - dev: true - - /onetime/5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: true - - /open/8.4.0: - resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} - engines: {node: '>=12'} - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - dev: true - - /opener/1.5.2: - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} - hasBin: true - dev: true - - /optionator/0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.3.0 - prelude-ls: 1.1.2 - type-check: 0.3.2 - word-wrap: 1.2.3 - dev: true - - /optionator/0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.3 - dev: true - - /ora/5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.7.0 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - dev: true - - /os-tmpdir/1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true - - /p-finally/1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: true - - /p-limit/2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - - /p-limit/3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate/4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - - /p-locate/5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /p-map/4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - dependencies: - aggregate-error: 3.1.0 - dev: true - - /p-retry/4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} - dependencies: - '@types/retry': 0.12.0 - retry: 0.13.1 - dev: true - - /p-try/2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - /param-case/3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} - dependencies: - dot-case: 3.0.4 - tslib: 2.4.0 - dev: true - - /parchment/1.1.4: - resolution: {integrity: sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==} - dev: false - - /parent-module/1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /parse-json/5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.18.6 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true - - /parse-passwd/1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} - dev: true - - /parse-svg-path/0.1.2: - resolution: {integrity: sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==} - dev: false - - /parse5-htmlparser2-tree-adapter/6.0.1: - resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} - dependencies: - parse5: 6.0.1 - dev: true - - /parse5/5.1.1: - resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} - dev: true - - /parse5/6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: true - - /parseurl/1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - dev: true - - /pascal-case/3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - dependencies: - no-case: 3.0.4 - tslib: 2.4.0 - dev: true - - /path-exists/4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - /path-is-absolute/1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-key/2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: true - - /path-key/3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-parse/1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - /path-to-regexp/0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - dev: true - - /path-type/4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /performance-now/2.1.0: - resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - dev: false - - /picocolors/0.2.1: - resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} - dev: true - - /picocolors/1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - /picomatch/2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /pidtree/0.5.0: - resolution: {integrity: sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==} - engines: {node: '>=0.10'} - hasBin: true - dev: true - - /pify/4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: true - - /pirates/4.0.5: - resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} - engines: {node: '>= 6'} - dev: true - - /pkg-dir/4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - - /point-at-length/1.0.2: - resolution: {integrity: sha512-DSGca2Q7A/4rGS6324Z+0hCVAPT729RFjsISPc6N11D6+r1TpP6KjktGL7HxN8XRYY0Z7EG8n9dBJ5dbrEP4SQ==} - dependencies: - abs-svg-path: 0.1.1 - isarray: 0.0.1 - parse-svg-path: 0.1.2 - dev: false - - /portfinder/1.0.32: - resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} - engines: {node: '>= 0.12.0'} - dependencies: - async: 2.6.4 - debug: 3.2.7 - mkdirp: 0.5.6 - transitivePeerDependencies: - - supports-color - dev: true - - /postcss-calc/8.2.4_postcss@8.4.16: - resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} - peerDependencies: - postcss: ^8.2.2 - dependencies: - postcss: 8.4.16 - postcss-selector-parser: 6.0.10 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-colormin/5.3.0_postcss@8.4.16: - resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.3 - caniuse-api: 3.0.0 - colord: 2.9.3 - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-convert-values/5.1.2_postcss@8.4.16: - resolution: {integrity: sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.3 - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-discard-comments/5.1.2_postcss@8.4.16: - resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - dev: true - - /postcss-discard-duplicates/5.1.0_postcss@8.4.16: - resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - dev: true - - /postcss-discard-empty/5.1.1_postcss@8.4.16: - resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - dev: true - - /postcss-discard-overridden/5.1.0_postcss@8.4.16: - resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - dev: true - - /postcss-less/6.0.0_postcss@8.4.16: - resolution: {integrity: sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==} - engines: {node: '>=12'} - peerDependencies: - postcss: ^8.3.5 - dependencies: - postcss: 8.4.16 - dev: true - - /postcss-loader/6.2.1_qjv4cptcpse3y5hrjkrbb7drda: - resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} - engines: {node: '>= 12.13.0'} - peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 - dependencies: - cosmiconfig: 7.0.1 - klona: 2.0.5 - postcss: 8.4.16 - semver: 7.3.7 - webpack: 5.74.0 - dev: true - - /postcss-media-query-parser/0.2.3: - resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} - dev: true - - /postcss-merge-longhand/5.1.6_postcss@8.4.16: - resolution: {integrity: sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - stylehacks: 5.1.0_postcss@8.4.16 - dev: true - - /postcss-merge-rules/5.1.2_postcss@8.4.16: - resolution: {integrity: sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.3 - caniuse-api: 3.0.0 - cssnano-utils: 3.1.0_postcss@8.4.16 - postcss: 8.4.16 - postcss-selector-parser: 6.0.10 - dev: true - - /postcss-minify-font-values/5.1.0_postcss@8.4.16: - resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-minify-gradients/5.1.1_postcss@8.4.16: - resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - colord: 2.9.3 - cssnano-utils: 3.1.0_postcss@8.4.16 - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-minify-params/5.1.3_postcss@8.4.16: - resolution: {integrity: sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.3 - cssnano-utils: 3.1.0_postcss@8.4.16 - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-minify-selectors/5.2.1_postcss@8.4.16: - resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - postcss-selector-parser: 6.0.10 - dev: true - - /postcss-modules-extract-imports/3.0.0_postcss@8.4.16: - resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.16 - dev: true - - /postcss-modules-local-by-default/4.0.0_postcss@8.4.16: - resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - icss-utils: 5.1.0_postcss@8.4.16 - postcss: 8.4.16 - postcss-selector-parser: 6.0.10 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-modules-scope/3.0.0_postcss@8.4.16: - resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.16 - postcss-selector-parser: 6.0.10 - dev: true - - /postcss-modules-values/4.0.0_postcss@8.4.16: - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - icss-utils: 5.1.0_postcss@8.4.16 - postcss: 8.4.16 - dev: true - - /postcss-normalize-charset/5.1.0_postcss@8.4.16: - resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - dev: true - - /postcss-normalize-display-values/5.1.0_postcss@8.4.16: - resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-normalize-positions/5.1.1_postcss@8.4.16: - resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-normalize-repeat-style/5.1.1_postcss@8.4.16: - resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-normalize-string/5.1.0_postcss@8.4.16: - resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-normalize-timing-functions/5.1.0_postcss@8.4.16: - resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-normalize-unicode/5.1.0_postcss@8.4.16: - resolution: {integrity: sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.3 - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-normalize-url/5.1.0_postcss@8.4.16: - resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - normalize-url: 6.1.0 - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-normalize-whitespace/5.1.1_postcss@8.4.16: - resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-ordered-values/5.1.3_postcss@8.4.16: - resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - cssnano-utils: 3.1.0_postcss@8.4.16 - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-reduce-initial/5.1.0_postcss@8.4.16: - resolution: {integrity: sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.3 - caniuse-api: 3.0.0 - postcss: 8.4.16 - dev: true - - /postcss-reduce-transforms/5.1.0_postcss@8.4.16: - resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-resolve-nested-selector/0.1.1: - resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==} - dev: true - - /postcss-safe-parser/6.0.0_postcss@8.4.16: - resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.3.3 - dependencies: - postcss: 8.4.16 - dev: true - - /postcss-selector-parser/6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: true - - /postcss-sorting/7.0.1_postcss@8.4.16: - resolution: {integrity: sha512-iLBFYz6VRYyLJEJsBJ8M3TCqNcckVzz4wFounSc5Oez35ogE/X+aoC5fFu103Ot7NyvjU3/xqIXn93Gp3kJk4g==} - peerDependencies: - postcss: ^8.3.9 - dependencies: - postcss: 8.4.16 - dev: true - - /postcss-svgo/5.1.0_postcss@8.4.16: - resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - postcss-value-parser: 4.2.0 - svgo: 2.8.0 - dev: true - - /postcss-unique-selectors/5.1.1_postcss@8.4.16: - resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - postcss: 8.4.16 - postcss-selector-parser: 6.0.10 - dev: true - - /postcss-value-parser/4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true - - /postcss/7.0.39: - resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==} - engines: {node: '>=6.0.0'} - dependencies: - picocolors: 0.2.1 - source-map: 0.6.1 - dev: true - - /postcss/8.4.16: - resolution: {integrity: sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.4 - picocolors: 1.0.0 - source-map-js: 1.0.2 - - /prelude-ls/1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - dev: true - - /prelude-ls/1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /prettier/2.7.1: - resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} - engines: {node: '>=10.13.0'} - hasBin: true - requiresBuild: true - dev: true - optional: true - - /pretty-error/4.0.0: - resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} - dependencies: - lodash: 4.17.21 - renderkid: 3.0.0 - dev: true - - /pretty-format/27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - dev: true - - /pretty-format/28.1.3: - resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} - engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} - dependencies: - '@jest/schemas': 28.1.3 - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /pretty/2.0.0: - resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} - engines: {node: '>=0.10.0'} - dependencies: - condense-newlines: 0.2.1 - extend-shallow: 2.0.1 - js-beautify: 1.14.6 - dev: true - - /process-nextick-args/2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true - - /progress-webpack-plugin/1.0.16_webpack@5.74.0: - resolution: {integrity: sha512-sdiHuuKOzELcBANHfrupYo+r99iPRyOnw15qX+rNlVUqXGfjXdH4IgxriKwG1kNJwVswKQHMdj1hYZMcb9jFaA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - dependencies: - chalk: 2.4.2 - figures: 2.0.0 - log-update: 2.3.0 - webpack: 5.74.0 - dev: true - - /progress/2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - dev: true - - /prompts/2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: true - - /proto-list/1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - dev: true - - /proxy-addr/2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - dev: true - - /prr/1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} - dev: true - optional: true - - /pseudomap/1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: true - - /psl/1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: true - - /pump/3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - - /punycode/2.1.1: - resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} - engines: {node: '>=6'} - - /q/1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - dev: true - - /qs/6.10.3: - resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: true - - /qs/6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: false - - /querystringify/2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: true - - /queue-microtask/1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /quick-lru/4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true - - /quill-delta/3.6.3: - resolution: {integrity: sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==} - engines: {node: '>=0.10'} - dependencies: - deep-equal: 1.1.1 - extend: 3.0.2 - fast-diff: 1.1.2 - dev: false - - /quill/1.3.7: - resolution: {integrity: sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==} - dependencies: - clone: 2.1.2 - deep-equal: 1.1.1 - eventemitter3: 2.0.3 - extend: 3.0.2 - parchment: 1.1.4 - quill-delta: 3.6.3 - dev: false - - /raf/3.4.1: - resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} - dependencies: - performance-now: 2.1.0 - dev: false - - /randombytes/2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /range-parser/1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - dev: true - - /raw-body/2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - dev: true - - /react-is/17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - dev: true - - /react-is/18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true - - /read-pkg-up/7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 - dev: true - - /read-pkg/5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - dependencies: - '@types/normalize-package-data': 2.4.1 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 - dev: true - - /readable-stream/2.3.7: - resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: true - - /readable-stream/3.6.0: - resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - - /readdirp/3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - dev: true - - /redent/3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - dev: true - - /regenerate-unicode-properties/10.0.1: - resolution: {integrity: sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==} - engines: {node: '>=4'} - dependencies: - regenerate: 1.4.2 - dev: true - - /regenerate/1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - dev: true - - /regenerator-runtime/0.11.1: - resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} - dev: false - - /regenerator-runtime/0.13.9: - resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} - dev: true - - /regenerator-transform/0.15.0: - resolution: {integrity: sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==} - dependencies: - '@babel/runtime': 7.18.9 - dev: true - - /regexp.prototype.flags/1.4.3: - resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - functions-have-names: 1.2.3 - - /regexpp/2.0.1: - resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} - engines: {node: '>=6.5.0'} - dev: true - - /regexpp/3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - dev: true - - /regexpu-core/5.1.0: - resolution: {integrity: sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==} - engines: {node: '>=4'} - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 10.0.1 - regjsgen: 0.6.0 - regjsparser: 0.8.4 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.0.0 - dev: true - - /regjsgen/0.6.0: - resolution: {integrity: sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==} - dev: true - - /regjsparser/0.8.4: - resolution: {integrity: sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==} - hasBin: true - dependencies: - jsesc: 0.5.0 - dev: true - - /regression/2.0.1: - resolution: {integrity: sha512-A4XYsc37dsBaNOgEjkJKzfJlE394IMmUPlI/p3TTI9u3T+2a+eox5Pr/CPUqF0eszeWZJPAc6QkroAhuUpWDJQ==} - dev: false - - /relateurl/0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} - dev: true - - /renderkid/3.0.0: - resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} - dependencies: - css-select: 4.3.0 - dom-converter: 0.2.0 - htmlparser2: 6.1.0 - lodash: 4.17.21 - strip-ansi: 6.0.1 - dev: true - - /repeat-string/1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - dev: false - - /require-directory/2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - - /require-from-string/2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true - - /requires-port/1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: true - - /resize-observer-lite/0.2.3: - resolution: {integrity: sha512-k/p+pjCTQkQ7x94bWsxcVwEJI5SrcO95j7czrCKMpHjXFQ+HmKRGLTdAkZoL3+wG1Pe/4L9Sl652zy9lU54dFg==} - dependencies: - element-resize-detector: 1.1.13 - dev: false - - /resize-observer-polyfill/1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} - dev: false - - /resolve-cwd/3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - dependencies: - resolve-from: 5.0.0 - dev: true - - /resolve-dir/1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} - dependencies: - expand-tilde: 2.0.2 - global-modules: 1.0.0 - dev: true - - /resolve-from/4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve-from/5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true - - /resolve-global/1.0.0: - resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} - engines: {node: '>=8'} - dependencies: - global-dirs: 0.1.1 - dev: true - - /resolve.exports/1.1.0: - resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} - engines: {node: '>=10'} - dev: true - - /resolve/1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} - hasBin: true - dependencies: - is-core-module: 2.10.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - /restore-cursor/2.0.0: - resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} - engines: {node: '>=4'} - dependencies: - onetime: 2.0.1 - signal-exit: 3.0.7 - dev: true - - /restore-cursor/3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: true - - /resumer/0.0.0: - resolution: {integrity: sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w==} - dependencies: - through: 2.3.8 - dev: false - - /retry/0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - dev: true - - /reusify/1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rfdc/1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} - dev: true - - /right-align/0.1.3: - resolution: {integrity: sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==} - engines: {node: '>=0.10.0'} - dependencies: - align-text: 0.1.4 - dev: false - - /rimraf/3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /rollup/0.25.8: - resolution: {integrity: sha512-a2S4Bh3bgrdO4BhKr2E4nZkjTvrJ2m2bWjMTzVYtoqSCn0HnuxosXnaJUHrMEziOWr3CzL9GjilQQKcyCQpJoA==} - hasBin: true - dependencies: - chalk: 1.1.3 - minimist: 1.2.6 - source-map-support: 0.3.3 - dev: false - - /run-async/2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - dev: true - - /run-parallel/1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /rw/1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - dev: false - - /rxjs/7.5.6: - resolution: {integrity: sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==} - dependencies: - tslib: 2.4.0 - dev: true - - /safe-buffer/5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true - - /safe-buffer/5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /safer-buffer/2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - /sax/1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - dev: true - - /saxes/5.0.1: - resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} - engines: {node: '>=10'} - dependencies: - xmlchars: 2.2.0 - dev: true - - /schema-utils/2.7.1: - resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} - engines: {node: '>= 8.9.0'} - dependencies: - '@types/json-schema': 7.0.11 - ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 - - /schema-utils/3.1.1: - resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/json-schema': 7.0.11 - ajv: 6.12.6 - ajv-keywords: 3.5.2_ajv@6.12.6 - dev: true - - /schema-utils/4.0.0: - resolution: {integrity: sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==} - engines: {node: '>= 12.13.0'} - dependencies: - '@types/json-schema': 7.0.11 - ajv: 8.11.0 - ajv-formats: 2.1.1 - ajv-keywords: 5.1.0_ajv@8.11.0 - dev: true - - /select-hose/2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - dev: true - - /select/1.1.2: - resolution: {integrity: sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==} - dev: false - - /selfsigned/2.0.1: - resolution: {integrity: sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==} - engines: {node: '>=10'} - dependencies: - node-forge: 1.3.1 - dev: true - - /semver/5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - dev: true - - /semver/6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} - hasBin: true - - /semver/7.0.0: - resolution: {integrity: sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==} - hasBin: true - dev: true - - /semver/7.3.5: - resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /semver/7.3.7: - resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /send/0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - - /serialize-javascript/6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - dependencies: - randombytes: 2.1.0 - dev: true - - /serve-index/1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} - dependencies: - accepts: 1.3.8 - batch: 0.6.1 - debug: 2.6.9 - escape-html: 1.0.3 - http-errors: 1.6.3 - mime-types: 2.1.35 - parseurl: 1.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /serve-static/1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color - dev: true - - /setprototypeof/1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - dev: true - - /setprototypeof/1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: true - - /shallow-clone/3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - dependencies: - kind-of: 6.0.3 - dev: true - - /shallow-equal/1.2.1: - resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==} - dev: false - - /shallowequal/1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - dev: false - - /shebang-command/1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - dev: true - - /shebang-command/2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex/1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: true - - /shebang-regex/3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /shell-quote/1.7.3: - resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} - dev: true - - /side-channel/1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.1.2 - object-inspect: 1.12.2 - - /sigmund/1.0.1: - resolution: {integrity: sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==} - dev: true - - /signal-exit/3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true - - /simple-statistics/6.1.1: - resolution: {integrity: sha512-zGwn0DDRa9Zel4H4n2pjTFIyGoAGpnpjrGIctreCxj5XWrcx9v7Xy7270FkC967WMmcvuc8ZU7m0ZG+hGN7gAA==} - dev: false - - /sirv/1.0.19: - resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==} - engines: {node: '>= 10'} - dependencies: - '@polka/url': 1.0.0-next.21 - mrmime: 1.0.1 - totalist: 1.1.0 - dev: true - - /sisteransi/1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true - - /slash/3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /slash/4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true - - /slice-ansi/3.0.0: - resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true - - /slice-ansi/4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 - dev: true - - /slice-ansi/5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.1.0 - is-fullwidth-code-point: 4.0.0 - dev: true - - /sockjs/0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} - dependencies: - faye-websocket: 0.11.4 - uuid: 8.3.2 - websocket-driver: 0.7.4 - dev: true - - /source-map-js/1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - - /source-map-support/0.3.3: - resolution: {integrity: sha512-9O4+y9n64RewmFoKUZ/5Tx9IHIcXM6Q+RTSw6ehnqybUz4a7iwR3Eaw80uLtqqQ5D0C+5H03D4KKGo9PdP33Gg==} - dependencies: - source-map: 0.1.32 - dev: false - - /source-map-support/0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map/0.1.32: - resolution: {integrity: sha512-htQyLrrRLkQ87Zfrir4/yN+vAUd6DNjVayEjTSHXu29AYQJw57I4/xEL/M6p6E/woPNJwvZt6rVlzc7gFEJccQ==} - engines: {node: '>=0.8.0'} - dependencies: - amdefine: 1.0.1 - dev: false - - /source-map/0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - dev: false - - /source-map/0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - /source-map/0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: true - - /spdx-correct/3.1.1: - resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.12 - dev: true - - /spdx-exceptions/2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: true - - /spdx-expression-parse/3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.12 - dev: true - - /spdx-license-ids/3.0.12: - resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} - dev: true - - /spdy-transport/3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} - dependencies: - debug: 4.3.4 - detect-node: 2.1.0 - hpack.js: 2.1.6 - obuf: 1.1.2 - readable-stream: 3.6.0 - wbuf: 1.7.3 - transitivePeerDependencies: - - supports-color - dev: true - - /spdy/4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} - dependencies: - debug: 4.3.4 - handle-thing: 2.0.1 - http-deceiver: 1.2.7 - select-hose: 2.0.0 - spdy-transport: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /split2/3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} - dependencies: - readable-stream: 3.6.0 - dev: true - - /sprintf-js/1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true - - /ssri/8.0.1: - resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.4 - dev: true - - /stable/0.1.8: - resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} - deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' - dev: true - - /stack-utils/2.0.5: - resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 - dev: true - - /stackframe/1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} - dev: true - - /statuses/1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - dev: true - - /statuses/2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: true - - /store/2.0.12: - resolution: {integrity: sha512-eO9xlzDpXLiMr9W1nQ3Nfp9EzZieIQc10zPPMP5jsVV7bLOziSFFBP0XoDXACEIFtdI+rIz0NwWVA/QVJ8zJtw==} - dev: false - - /string-argv/0.3.1: - resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} - engines: {node: '>=0.6.19'} - dev: true - - /string-convert/0.2.1: - resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} - dev: false - - /string-length/4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - dev: true - - /string-length/5.0.1: - resolution: {integrity: sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==} - engines: {node: '>=12.20'} - dependencies: - char-regex: 2.0.1 - strip-ansi: 7.0.1 - dev: true - - /string-width/2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 - dev: true - - /string-width/4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - - /string-width/5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.0.1 - dev: true - - /string.prototype.trim/1.2.6: - resolution: {integrity: sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - dev: false - - /string.prototype.trimend/1.0.5: - resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - - /string.prototype.trimstart/1.0.5: - resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - - /string_decoder/1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: true - - /string_decoder/1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /strip-ansi/3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-regex: 2.1.1 - dev: false - - /strip-ansi/4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} - dependencies: - ansi-regex: 3.0.1 - dev: true - - /strip-ansi/6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-ansi/7.0.1: - resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - dev: true - - /strip-bom/3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-bom/4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - - /strip-eof/1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - dev: true - - /strip-final-newline/2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - - /strip-indent/2.0.0: - resolution: {integrity: sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==} - engines: {node: '>=4'} - dev: true - - /strip-indent/3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - dependencies: - min-indent: 1.0.1 - dev: true - - /strip-json-comments/3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /style-search/0.1.0: - resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} - dev: true - - /stylehacks/5.1.0_postcss@8.4.16: - resolution: {integrity: sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==} - engines: {node: ^10 || ^12 || >=14.0} - peerDependencies: - postcss: ^8.2.15 - dependencies: - browserslist: 4.21.3 - postcss: 8.4.16 - postcss-selector-parser: 6.0.10 - dev: true - - /stylelint-config-css-modules/4.1.0_stylelint@14.11.0: - resolution: {integrity: sha512-w6d552NscwvpUEaUcmq8GgWXKRv6lVHLbDj6QIHSM2vCWr83qRqRvXBJCfXDyaG/J3Zojw2inU9VvU99ZlXuUw==} - peerDependencies: - stylelint: ^14.5.1 - dependencies: - stylelint: 14.11.0 - optionalDependencies: - stylelint-scss: 4.3.0_stylelint@14.11.0 - dev: true - - /stylelint-config-recess-order/3.0.0_stylelint@14.11.0: - resolution: {integrity: sha512-uNXrlDz570Q7HJlrq8mNjgfO/xlKIh2hKVKEFMTG1/ih/6tDLcTbuvO1Zoo2dnQay990OAkWLDpTDOorB+hmBw==} - peerDependencies: - stylelint: '>=14' - dependencies: - stylelint: 14.11.0 - stylelint-order: 5.0.0_stylelint@14.11.0 - dev: true - - /stylelint-config-recommended/7.0.0_stylelint@14.11.0: - resolution: {integrity: sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==} - peerDependencies: - stylelint: ^14.4.0 - dependencies: - stylelint: 14.11.0 - dev: true - - /stylelint-config-standard/25.0.0_stylelint@14.11.0: - resolution: {integrity: sha512-21HnP3VSpaT1wFjFvv9VjvOGDtAviv47uTp3uFmzcN+3Lt+RYRv6oAplLaV51Kf792JSxJ6svCJh/G18E9VnCA==} - peerDependencies: - stylelint: ^14.4.0 - dependencies: - stylelint: 14.11.0 - stylelint-config-recommended: 7.0.0_stylelint@14.11.0 - dev: true - - /stylelint-order/5.0.0_stylelint@14.11.0: - resolution: {integrity: sha512-OWQ7pmicXufDw5BlRqzdz3fkGKJPgLyDwD1rFY3AIEfIH/LQY38Vu/85v8/up0I+VPiuGRwbc2Hg3zLAsJaiyw==} - peerDependencies: - stylelint: ^14.0.0 - dependencies: - postcss: 8.4.16 - postcss-sorting: 7.0.1_postcss@8.4.16 - stylelint: 14.11.0 - dev: true - - /stylelint-scss/4.3.0_stylelint@14.11.0: - resolution: {integrity: sha512-GvSaKCA3tipzZHoz+nNO7S02ZqOsdBzMiCx9poSmLlb3tdJlGddEX/8QzCOD8O7GQan9bjsvLMsO5xiw6IhhIQ==} - requiresBuild: true - peerDependencies: - stylelint: ^14.5.1 - dependencies: - lodash: 4.17.21 - postcss-media-query-parser: 0.2.3 - postcss-resolve-nested-selector: 0.1.1 - postcss-selector-parser: 6.0.10 - postcss-value-parser: 4.2.0 - stylelint: 14.11.0 - dev: true - optional: true - - /stylelint/14.11.0: - resolution: {integrity: sha512-OTLjLPxpvGtojEfpESWM8Ir64Z01E89xsisaBMUP/ngOx1+4VG2DPRcUyCCiin9Rd3kPXPsh/uwHd9eqnvhsYA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - dependencies: - '@csstools/selector-specificity': 2.0.2_pnx64jze6bptzcedy5bidi3zdi - balanced-match: 2.0.0 - colord: 2.9.3 - cosmiconfig: 7.0.1 - css-functions-list: 3.1.0 - debug: 4.3.4 - fast-glob: 3.2.11 - fastest-levenshtein: 1.0.16 - file-entry-cache: 6.0.1 - global-modules: 2.0.0 - globby: 11.1.0 - globjoin: 0.1.4 - html-tags: 3.2.0 - ignore: 5.2.0 - import-lazy: 4.0.0 - imurmurhash: 0.1.4 - is-plain-object: 5.0.0 - known-css-properties: 0.25.0 - mathml-tag-names: 2.1.3 - meow: 9.0.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.16 - postcss-media-query-parser: 0.2.3 - postcss-resolve-nested-selector: 0.1.1 - postcss-safe-parser: 6.0.0_postcss@8.4.16 - postcss-selector-parser: 6.0.10 - postcss-value-parser: 4.2.0 - resolve-from: 5.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - style-search: 0.1.0 - supports-hyperlinks: 2.2.0 - svg-tags: 1.0.0 - table: 6.8.0 - v8-compile-cache: 2.3.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /supports-color/2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - dev: false - - /supports-color/5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color/7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-color/8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-color/9.2.2: - resolution: {integrity: sha512-XC6g/Kgux+rJXmwokjm9ECpD6k/smUoS5LKlUCcsYr4IY3rW0XyAympon2RmxGrlnZURMpg5T18gWDP9CsHXFA==} - engines: {node: '>=12'} - dev: true - - /supports-hyperlinks/2.2.0: - resolution: {integrity: sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - dev: true - - /supports-preserve-symlinks-flag/1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - /svg-tags/1.0.0: - resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==} - dev: true - - /svg-to-vue/0.7.0_abjhqgwglfwb46q2jh7n36fu5u: - resolution: {integrity: sha512-Tg2nMmf3BQorYCAjxbtTkYyWPVSeox5AZUFvfy4MoWK/5tuQlnA/h3LAlTjV3sEvOC5FtUNovRSj3p784l4KOA==} - peerDependencies: - vue-template-compiler: ^2.0.0 - dependencies: - svgo: 1.3.2 - vue-template-compiler: 2.7.10 - dev: true - - /svgo/1.3.2: - resolution: {integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==} - engines: {node: '>=4.0.0'} - deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. - hasBin: true - dependencies: - chalk: 2.4.2 - coa: 2.0.2 - css-select: 2.1.0 - css-select-base-adapter: 0.1.1 - css-tree: 1.0.0-alpha.37 - csso: 4.2.0 - js-yaml: 3.14.1 - mkdirp: 0.5.6 - object.values: 1.1.5 - sax: 1.2.4 - stable: 0.1.8 - unquote: 1.1.1 - util.promisify: 1.0.1 - dev: true - - /svgo/2.8.0: - resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} - engines: {node: '>=10.13.0'} - hasBin: true - dependencies: - '@trysound/sax': 0.2.0 - commander: 7.2.0 - css-select: 4.3.0 - css-tree: 1.1.3 - csso: 4.2.0 - picocolors: 1.0.0 - stable: 0.1.8 - dev: true - - /symbol-tree/3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: true - - /table/6.8.0: - resolution: {integrity: sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==} - engines: {node: '>=10.0.0'} - dependencies: - ajv: 8.11.0 - lodash.truncate: 4.4.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /tapable/2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true - - /tape/4.16.0: - resolution: {integrity: sha512-mBlqYFr2mHysgCFXAuSarIQ+ffhielpb7a5/IbeOhMaLnQYhkJLUm6CwO1RszWeHRxnIpMessZ3xL2Cfo94BWw==} - hasBin: true - dependencies: - call-bind: 1.0.2 - deep-equal: 1.1.1 - defined: 1.0.0 - dotignore: 0.1.2 - for-each: 0.3.3 - glob: 7.2.3 - has: 1.0.3 - inherits: 2.0.4 - is-regex: 1.1.4 - minimist: 1.2.6 - object-inspect: 1.12.2 - resolve: 1.22.1 - resumer: 0.0.0 - string.prototype.trim: 1.2.6 - through: 2.3.8 - dev: false - - /terminal-link/2.1.1: - resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} - engines: {node: '>=8'} - dependencies: - ansi-escapes: 4.3.2 - supports-hyperlinks: 2.2.0 - dev: true - - /terser-webpack-plugin/5.3.5_webpack@5.74.0: - resolution: {integrity: sha512-AOEDLDxD2zylUGf/wxHxklEkOe2/r+seuyOWujejFrIxHf11brA1/dWQNIgXa1c6/Wkxgu7zvv0JhOWfc2ELEA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.15 - jest-worker: 27.5.1 - schema-utils: 3.1.1 - serialize-javascript: 6.0.0 - terser: 5.15.0 - webpack: 5.74.0 - dev: true - - /terser/5.15.0: - resolution: {integrity: sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - '@jridgewell/source-map': 0.3.2 - acorn: 8.8.0 - commander: 2.20.3 - source-map-support: 0.5.21 - dev: true - - /test-exclude/6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - - /text-extensions/1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} - dev: true - - /text-table/0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /thenify-all/1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: true - - /thenify/3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: true - - /thread-loader/3.0.4_webpack@5.74.0: - resolution: {integrity: sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.27.0 || ^5.0.0 - dependencies: - json-parse-better-errors: 1.0.2 - loader-runner: 4.3.0 - loader-utils: 2.0.2 - neo-async: 2.6.2 - schema-utils: 3.1.1 - webpack: 5.74.0 - dev: true - - /throat/6.0.1: - resolution: {integrity: sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w==} - dev: true - - /through/2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - /through2/4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - dependencies: - readable-stream: 3.6.0 - dev: true - - /thunky/1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - dev: true - - /tiny-emitter/2.1.0: - resolution: {integrity: sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==} - dev: false - - /tinycolor2/1.4.2: - resolution: {integrity: sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==} - - /tmp/0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - dependencies: - os-tmpdir: 1.0.2 - dev: true - - /tmpl/1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true - - /to-fast-properties/2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - - /to-regex-range/5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /toggle-selection/1.0.6: - resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} - dev: false - - /toidentifier/1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: true - - /topojson-client/3.0.1: - resolution: {integrity: sha512-rfGGzyqefpxOaxvV9OTF9t+1g+WhjGEbAIuCcmKYrQkxr0nttjMMyzZsK+NhLW4cTl2g1bz2jQczPUtEshpbVQ==} - hasBin: true - dependencies: - commander: 2.20.3 - dev: false - - /totalist/1.1.0: - resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} - engines: {node: '>=6'} - dev: true - - /tough-cookie/4.1.0: - resolution: {integrity: sha512-IVX6AagLelGwl6F0E+hoRpXzuD192cZhAcmT7/eoLr0PnsB1wv2E5c+A2O+V8xth9FlL2p0OstFsWn0bZpVn4w==} - engines: {node: '>=6'} - dependencies: - psl: 1.9.0 - punycode: 2.1.1 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: true - - /tr46/0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true - - /tr46/2.1.0: - resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} - engines: {node: '>=8'} - dependencies: - punycode: 2.1.1 - dev: true - - /trim-newlines/3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true - - /ts-node/10.9.1_57uwcby55h6tzvkj3v5sfcgxoe: - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - '@types/node': 18.7.13 - acorn: 8.8.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 4.7.4 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - optional: true - - /tsconfig-paths/3.14.1: - resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.1 - minimist: 1.2.6 - strip-bom: 3.0.0 - dev: true - - /tslib/1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - - /tslib/2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - dev: true - - /type-check/0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.1.2 - dev: true - - /type-check/0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-detect/4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /type-fest/0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - dev: true - - /type-fest/0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /type-fest/0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true - - /type-fest/0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true - - /type-fest/0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true - - /type-is/1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - dev: true - - /typedarray-to-buffer/3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - dependencies: - is-typedarray: 1.0.0 - dev: true - - /typescript/4.7.4: - resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} - engines: {node: '>=4.2.0'} - hasBin: true - dev: true - optional: true - - /uglify-js/2.8.29: - resolution: {integrity: sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==} - engines: {node: '>=0.8.0'} - hasBin: true - dependencies: - source-map: 0.5.7 - yargs: 3.10.0 - optionalDependencies: - uglify-to-browserify: 1.0.2 - dev: false - - /uglify-to-browserify/1.0.2: - resolution: {integrity: sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==} - requiresBuild: true - dev: false - optional: true - - /umi-request/1.4.0: - resolution: {integrity: sha512-OknwtQZddZHi0Ggi+Vr/olJ7HNMx4AzlywyK0W3NZBT7B0stjeZ9lcztA85dBgdAj3KVk8uPJPZSnGaDjELhrA==} - dependencies: - isomorphic-fetch: 2.2.1 - qs: 6.11.0 - dev: false - - /unbox-primitive/1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - dependencies: - call-bind: 1.0.2 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - - /unicode-canonical-property-names-ecmascript/2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} - dev: true - - /unicode-match-property-ecmascript/2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 - unicode-property-aliases-ecmascript: 2.0.0 - dev: true - - /unicode-match-property-value-ecmascript/2.0.0: - resolution: {integrity: sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==} - engines: {node: '>=4'} - dev: true - - /unicode-property-aliases-ecmascript/2.0.0: - resolution: {integrity: sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==} - engines: {node: '>=4'} - dev: true - - /universalify/0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: true - - /universalify/2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - dev: true - - /unpipe/1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - dev: true - - /unquote/1.1.1: - resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} - dev: true - - /update-browserslist-db/1.0.5_browserslist@4.21.3: - resolution: {integrity: sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.3 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - - /uri-js/4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.1.1 - - /url-parse/1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: true - - /util-deprecate/1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - - /util.promisify/1.0.1: - resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} - dependencies: - define-properties: 1.1.4 - es-abstract: 1.20.1 - has-symbols: 1.0.3 - object.getownpropertydescriptors: 2.1.4 - dev: true - - /utila/0.4.0: - resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} - dev: true - - /utils-merge/1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - dev: true - - /uuid/8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: true - - /v8-compile-cache-lib/3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true - optional: true - - /v8-compile-cache/2.3.0: - resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} - dev: true - - /v8-to-istanbul/8.1.1: - resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} - engines: {node: '>=10.12.0'} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.8.0 - source-map: 0.7.4 - dev: true - - /validate-npm-package-license/3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - dependencies: - spdx-correct: 3.1.1 - spdx-expression-parse: 3.0.1 - dev: true - - /vary/1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - dev: true - - /venn.js/0.2.20: - resolution: {integrity: sha512-bb5SYq/wamY9fvcuErb9a0FJkgIFHJjkLZWonQ+DoKKuDX3WPH2B4ouI1ce4K2iejBklQy6r1ly8nOGIyOCO6w==} - dependencies: - d3-selection: 1.4.2 - d3-transition: 1.3.2 - fmin: 0.0.2 - dev: false - - /viser-vue/2.4.8_vue@2.7.10: - resolution: {integrity: sha512-ERAREN+6k/ywrwT+swcMo4CDIAq6dBjnB0+lhmsSfaip06BGHSBfNKg6yl7/4GJ9Nk2kioUw3llNhEboJuIKmQ==} - peerDependencies: - vue: '>=1' - dependencies: - '@types/node': 18.7.13 - viser: 2.4.9 - vue: 2.7.10 - dev: false - - /viser/2.4.9: - resolution: {integrity: sha512-DKsqtMa3TZYQHEZ7jp4kpNp1Iqomda7d+3IkkIjIdKQvfL8OeksXfy/ECZUY1hTrGoOe7cq85+6PMS+MPn4mgQ==} - dependencies: - '@antv/g2': 3.5.19 - '@antv/g2-brush': 0.0.2 - '@antv/g2-plugin-slider': 2.1.1_@antv+g2@3.5.19 - '@types/d3-format': 3.0.1 - '@types/lodash': 4.14.184 - '@types/node': 8.10.66 - d3-format: 1.4.5 - lodash: 4.17.21 - dev: false - - /vue-clipboard2/0.2.1: - resolution: {integrity: sha512-n6ie/0g0bKohmLlC/5ja1esq2Q0jQ5hWmhNSZcvCsWfDeDnVARjl6cBB9p72XV1nlVfuqsZcfV8HTjjZAIlLBA==} - dependencies: - clipboard: 2.0.11 - dev: false - - /vue-container-query/0.1.0: - resolution: {integrity: sha512-WPXn/x1xE5NoCJIHDL919ELln6ZUpsJJBgxuR5tJWfvfxy6zT4Tm4iOhaVmSomtdPzdo9edeMrPXl4e/9MUhfA==} - dependencies: - container-query-toolkit: 0.1.3 - resize-observer-lite: 0.2.3 - vue: 2.7.10 - dev: false - - /vue-copy-to-clipboard/1.0.3_vue@2.7.10: - resolution: {integrity: sha512-FSgewqG+2NwNsAnKOZqZ6GZqNvrbauVh/Y5z+xkbu9AmFqiWlQLKaFc+7BcsYCVZ2TaQnhjcHbDycVRVGFJypQ==} - peerDependencies: - vue: '>=2.6.0' - dependencies: - copy-to-clipboard: 3.3.2 - vue: 2.7.10 - dev: false - - /vue-cropper/0.4.9: - resolution: {integrity: sha512-Uf1i/sCh+ZqSM9hb2YTGRENzJFH+mvDuv8N2brGLjK7UBuF7XDP7zbis8g/dcqZiMojAcBDtObFCn4ERFbRMxQ==} - dev: false - - /vue-eslint-parser/5.0.0_eslint@7.32.0: - resolution: {integrity: sha512-JlHVZwBBTNVvzmifwjpZYn0oPWH2SgWv5dojlZBsrhablDu95VFD+hriB1rQGwbD+bms6g+rAFhQHk6+NyiS6g==} - engines: {node: '>=6.5'} - peerDependencies: - eslint: ^5.0.0 - dependencies: - debug: 4.3.4 - eslint: 7.32.0 - eslint-scope: 4.0.3 - eslint-visitor-keys: 1.3.0 - espree: 4.1.0 - esquery: 1.4.0 - lodash: 4.17.21 - transitivePeerDependencies: - - supports-color - dev: true - - /vue-hot-reload-api/2.3.4: - resolution: {integrity: sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==} - dev: true - - /vue-i18n/8.27.2_vue@2.7.10: - resolution: {integrity: sha512-QVzn7u2WVH8F7eSKIM00lujC7x1mnuGPaTnDTmB01Hd709jDtB9kYtBqM+MWmp5AJRx3gnqAdZbee9MelqwFBg==} - peerDependencies: - vue: ^2 - dependencies: - vue: 2.7.10 - dev: false - - /vue-loader/15.10.0_vsyllalxesco42bbuzcqgel7xq: - resolution: {integrity: sha512-VU6tuO8eKajrFeBzMssFUP9SvakEeeSi1BxdTH5o3+1yUyrldp8IERkSdXlMI2t4kxF2sqYUDsQY+WJBxzBmZg==} - peerDependencies: - '@vue/compiler-sfc': ^3.0.8 - cache-loader: '*' - css-loader: '*' - vue-template-compiler: '*' - webpack: ^3.0.0 || ^4.1.0 || ^5.0.0-0 - peerDependenciesMeta: - '@vue/compiler-sfc': - optional: true - cache-loader: - optional: true - vue-template-compiler: - optional: true - dependencies: - '@vue/component-compiler-utils': 3.3.0 - css-loader: 6.7.1_webpack@5.74.0 - hash-sum: 1.0.2 - loader-utils: 1.4.0 - vue-hot-reload-api: 2.3.4 - vue-style-loader: 4.1.3 - vue-template-compiler: 2.7.10 - webpack: 5.74.0 - transitivePeerDependencies: - - arc-templates - - atpl - - babel-core - - bracket-template - - coffee-script - - dot - - dust - - dustjs-helpers - - dustjs-linkedin - - eco - - ect - - ejs - - haml-coffee - - hamlet - - hamljs - - handlebars - - hogan.js - - htmling - - jade - - jazz - - jqtpl - - just - - liquid-node - - liquor - - lodash - - marko - - mote - - mustache - - nunjucks - - plates - - pug - - qejs - - ractive - - razor-tmpl - - react - - react-dom - - slm - - squirrelly - - swig - - swig-templates - - teacup - - templayed - - then-jade - - then-pug - - tinyliquid - - toffee - - twig - - twing - - underscore - - vash - - velocityjs - - walrus - - whiskers - dev: true - - /vue-loader/17.0.0_webpack@5.74.0: - resolution: {integrity: sha512-OWSXjrzIvbF2LtOUmxT3HYgwwubbfFelN8PAP9R9dwpIkj48TVioHhWWSx7W7fk+iF5cgg3CBJRxwTdtLU4Ecg==} - peerDependencies: - webpack: ^4.1.0 || ^5.0.0-0 - dependencies: - chalk: 4.1.2 - hash-sum: 2.0.0 - loader-utils: 2.0.2 - webpack: 5.74.0 - dev: true - - /vue-quill-editor/3.0.6: - resolution: {integrity: sha512-g20oSZNWg8Hbu41Kinjd55e235qVWPLfg4NvsLW6d+DhgBTFbEuMpcWlUdrD6qT3+Noim6DRu18VLM9lVShXOQ==} - engines: {node: '>= 4.0.0', npm: '>= 3.0.0'} - dependencies: - object-assign: 4.1.1 - quill: 1.3.7 - dev: false - - /vue-ref/2.0.0: - resolution: {integrity: sha512-uKNKpFOVeWNqS2mrBZqnpLyXJo5Q+vnkex6JvpENvhXHFNBW/SJTP8vJywLuVT3DpxwXcF9N0dyIiZ4/NpTexQ==} - dev: false - - /vue-router/3.6.3_vue@2.7.10: - resolution: {integrity: sha512-G21CKd8o/Mr3h8Xgi6zwg2ixJ5OxBG9G5w/b5McEFfLBqyQJc/7HDGsibf2FAl2enpZla+OJ3IlYipRusGN/4w==} - peerDependencies: - vue: ^2 - dependencies: - vue: 2.7.10 - dev: false - - /vue-style-loader/4.1.3: - resolution: {integrity: sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==} - dependencies: - hash-sum: 1.0.2 - loader-utils: 1.4.0 - dev: true - - /vue-svg-component-builder/2.0.3_7ijf3dzidy2s7qy7g4vlqxnlga: - resolution: {integrity: sha512-We9ZLSYPQx9y3v5+HNWyjkGFaxZMlWPTqYBU08y4YT46f453BQ4JxIoS8rV0a8PIxnKap7m/YIzrdIfoHxrpaA==} - peerDependencies: - vue: '>= 2.5.0' - vue-svg-component-runtime: ^1.0.0 - vue-template-compiler: '>= 2.5.0' - dependencies: - vue: 2.7.10 - vue-svg-component-runtime: 1.0.1_vue@2.7.10 - vue-template-compiler: 2.7.10 - dev: true - - /vue-svg-component-runtime/1.0.1_vue@2.7.10: - resolution: {integrity: sha512-TkmZ1qwFeFJSRH6b6KVqDU2f8DCSdoNoo/veKqog7FsyF0UETTI66ALKX1rrLXy/KT6LSaJB5IfZkuuSfaQsEA==} - peerDependencies: - vue: '>= 2.5.0' - dependencies: - vue: 2.7.10 - - /vue-svg-icon-loader/2.1.1_7ijf3dzidy2s7qy7g4vlqxnlga: - resolution: {integrity: sha512-JOL4fyh9rnbcqMLTF5NVG8YVupnLIMHMY+3CLMaEb9xDUmfk6Cp3RqyI/8gBea7d51i4lyNdzZ3tQ/EJLQxQDA==} - engines: {node: '>= 6.0'} - peerDependencies: - vue: '>= 2.0' - vue-svg-component-runtime: ^1.0.0 - dependencies: - '@types/loader-utils': 1.1.3 - '@types/node': 8.9.5 - loader-utils: 1.1.0 - vue: 2.7.10 - vue-svg-component-builder: 2.0.3_7ijf3dzidy2s7qy7g4vlqxnlga - vue-svg-component-runtime: 1.0.1_vue@2.7.10 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - vue-template-compiler - - webpack-cli - dev: true - - /vue-svg-loader/0.16.0_abjhqgwglfwb46q2jh7n36fu5u: - resolution: {integrity: sha512-2RtFXlTCYWm8YAEO2qAOZ2SuIF2NvLutB5muc3KDYoZq5ZeCHf8ggzSan3ksbbca7CJ/Aw57ZnDF4B7W/AkGtw==} - peerDependencies: - vue-template-compiler: ^2.0.0 - dependencies: - loader-utils: 1.4.0 - svg-to-vue: 0.7.0_abjhqgwglfwb46q2jh7n36fu5u - vue-template-compiler: 2.7.10 - dev: true - - /vue-template-compiler/2.7.10: - resolution: {integrity: sha512-QO+8R9YRq1Gudm8ZMdo/lImZLJVUIAM8c07Vp84ojdDAf8HmPJc7XB556PcXV218k2AkKznsRz6xB5uOjAC4EQ==} - dependencies: - de-indent: 1.0.2 - he: 1.2.0 - - /vue-template-es2015-compiler/1.9.1: - resolution: {integrity: sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==} - dev: true - - /vue/2.7.10: - resolution: {integrity: sha512-HmFC70qarSHPXcKtW8U8fgIkF6JGvjEmDiVInTkKZP0gIlEPhlVlcJJLkdGIDiNkIeA2zJPQTWJUI4iWe+AVfg==} - dependencies: - '@vue/compiler-sfc': 2.7.10 - csstype: 3.1.0 - - /vuex/3.6.2_vue@2.7.10: - resolution: {integrity: sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==} - peerDependencies: - vue: ^2.0.0 - dependencies: - vue: 2.7.10 - dev: false - - /w3c-hr-time/1.0.2: - resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} - dependencies: - browser-process-hrtime: 1.0.0 - dev: true - - /w3c-xmlserializer/2.0.0: - resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} - engines: {node: '>=10'} - dependencies: - xml-name-validator: 3.0.0 - dev: true - - /walker/1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: true - - /wangeditor/3.1.1: - resolution: {integrity: sha512-co18zRS96xVKhLyhTIqgqWs5khSbNPlZeoT8/B2dxnVKQMntRGu1D8ks+nbNOvZcIjyrdhhtde6LjqzVECL6DA==} - dev: false - - /warning/4.0.3: - resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} - dependencies: - loose-envify: 1.4.0 - dev: false - - /watchpack/2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 - dev: true - - /wbuf/1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} - dependencies: - minimalistic-assert: 1.0.1 - dev: true - - /wcwidth/1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - dependencies: - defaults: 1.0.3 - dev: true - - /webidl-conversions/3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true - - /webidl-conversions/5.0.0: - resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} - engines: {node: '>=8'} - dev: true - - /webidl-conversions/6.1.0: - resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} - engines: {node: '>=10.4'} - dev: true - - /webpack-bundle-analyzer/4.6.1: - resolution: {integrity: sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==} - engines: {node: '>= 10.13.0'} - hasBin: true - dependencies: - acorn: 8.8.0 - acorn-walk: 8.2.0 - chalk: 4.1.2 - commander: 7.2.0 - gzip-size: 6.0.0 - lodash: 4.17.21 - opener: 1.5.2 - sirv: 1.0.19 - ws: 7.5.9 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true - - /webpack-chain/6.5.1: - resolution: {integrity: sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==} - engines: {node: '>=8'} - dependencies: - deepmerge: 1.5.2 - javascript-stringify: 2.1.0 - dev: true - - /webpack-dev-middleware/5.3.3_webpack@5.74.0: - resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - colorette: 2.0.19 - memfs: 3.4.7 - mime-types: 2.1.35 - range-parser: 1.2.1 - schema-utils: 4.0.0 - webpack: 5.74.0 - dev: true - - /webpack-dev-server/4.10.0_debug@4.3.4+webpack@5.74.0: - resolution: {integrity: sha512-7dezwAs+k6yXVFZ+MaL8VnE+APobiO3zvpp3rBHe/HmWQ+avwh0Q3d0xxacOiBybZZ3syTZw9HXzpa3YNbAZDQ==} - engines: {node: '>= 12.13.0'} - hasBin: true - peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/bonjour': 3.5.10 - '@types/connect-history-api-fallback': 1.3.5 - '@types/express': 4.17.13 - '@types/serve-index': 1.9.1 - '@types/serve-static': 1.15.0 - '@types/sockjs': 0.3.33 - '@types/ws': 8.5.3 - ansi-html-community: 0.0.8 - bonjour-service: 1.0.13 - chokidar: 3.5.3 - colorette: 2.0.19 - compression: 1.7.4 - connect-history-api-fallback: 2.0.0 - default-gateway: 6.0.3 - express: 4.18.1 - graceful-fs: 4.2.10 - html-entities: 2.3.3 - http-proxy-middleware: 2.0.6_vw7eq5saxorls4jwsr6ncij7dm - ipaddr.js: 2.0.1 - open: 8.4.0 - p-retry: 4.6.2 - rimraf: 3.0.2 - schema-utils: 4.0.0 - selfsigned: 2.0.1 - serve-index: 1.9.1 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack: 5.74.0 - webpack-dev-middleware: 5.3.3_webpack@5.74.0 - ws: 8.8.1 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - dev: true - - /webpack-merge/5.8.0: - resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} - engines: {node: '>=10.0.0'} - dependencies: - clone-deep: 4.0.1 - wildcard: 2.0.0 - dev: true - - /webpack-sources/3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true - - /webpack-theme-color-replacer/1.4.1: - resolution: {integrity: sha512-WLKWieQzp2LPqn4qV3Qu/wJ410nIqjopYVDkrOv66qQfZpYJJZ5WX4PLUXVpFNVPjn3OH49DGT5NGVvsVpneIg==} - dependencies: - webpack-sources: 3.2.3 - dev: true - - /webpack-virtual-modules/0.4.4: - resolution: {integrity: sha512-h9atBP/bsZohWpHnr+2sic8Iecb60GxftXsWNLLLSqewgIsGzByd2gcIID4nXcG+3tNe4GQG3dLcff3kXupdRA==} - dev: true - - /webpack/5.74.0: - resolution: {integrity: sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.4 - '@types/estree': 0.0.51 - '@webassemblyjs/ast': 1.11.1 - '@webassemblyjs/wasm-edit': 1.11.1 - '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.8.0 - acorn-import-assertions: 1.8.0_acorn@8.8.0 - browserslist: 4.21.3 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.10.0 - es-module-lexer: 0.9.3 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.10 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.1.1 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.5_webpack@5.74.0 - watchpack: 2.4.0 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - dev: true - - /websocket-driver/0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} - dependencies: - http-parser-js: 0.5.8 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - dev: true - - /websocket-extensions/0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - dev: true - - /whatwg-encoding/1.0.5: - resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} - dependencies: - iconv-lite: 0.4.24 - dev: true - - /whatwg-fetch/3.6.2: - resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==} - - /whatwg-mimetype/2.3.0: - resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} - dev: true - - /whatwg-url/5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: true - - /whatwg-url/8.7.0: - resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} - engines: {node: '>=10'} - dependencies: - lodash: 4.17.21 - tr46: 2.1.0 - webidl-conversions: 6.1.0 - dev: true - - /which-boxed-primitive/1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - /which/1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /which/2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /wildcard/2.0.0: - resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} - dev: true - - /window-size/0.1.0: - resolution: {integrity: sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==} - engines: {node: '>= 0.8.0'} - dev: false - - /wolfy87-eventemitter/5.1.0: - resolution: {integrity: sha512-VakY4+17DbamV2VW4nZERrSuilclCRcYtfchPWe6jlma8k0AeLJxBR+C5OSFFtICArDFdXk0yw67HUGrTCdrEg==} - dev: false - - /word-wrap/1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} - dev: true - - /wordwrap/0.0.2: - resolution: {integrity: sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==} - engines: {node: '>=0.4.0'} - dev: false - - /wrap-ansi/3.0.1: - resolution: {integrity: sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ==} - engines: {node: '>=4'} - dependencies: - string-width: 2.1.1 - strip-ansi: 4.0.0 - dev: true - - /wrap-ansi/6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrap-ansi/7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /wrappy/1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /write-file-atomic/3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - dev: true - - /write-file-atomic/4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - - /ws/7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - /ws/8.8.1: - resolution: {integrity: sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - /xml-name-validator/3.0.0: - resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} - dev: true - - /xmlchars/2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: true - - /y18n/5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - - /yallist/2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: true - - /yallist/4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yaml/1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: true - - /yargs-parser/20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true - - /yargs/16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: true - - /yargs/3.10.0: - resolution: {integrity: sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==} - dependencies: - camelcase: 1.2.1 - cliui: 2.1.0 - decamelize: 1.2.0 - window-size: 0.1.0 - dev: false - - /yn/3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: true - optional: true - - /yocto-queue/0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true - - /yorkie/2.0.0: - resolution: {integrity: sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw==} - engines: {node: '>=4'} - requiresBuild: true - dependencies: - execa: 0.8.0 - is-ci: 1.2.1 - normalize-path: 1.0.0 - strip-indent: 2.0.0 - dev: true diff --git a/quantdinger_vue/postcss.config.js b/quantdinger_vue/postcss.config.js deleted file mode 100644 index 961986e..0000000 --- a/quantdinger_vue/postcss.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - plugins: { - autoprefixer: {} - } -} diff --git a/quantdinger_vue/public/avatar2.jpg b/quantdinger_vue/public/avatar2.jpg deleted file mode 100644 index 59dc7ff..0000000 Binary files a/quantdinger_vue/public/avatar2.jpg and /dev/null differ diff --git a/quantdinger_vue/public/index.html b/quantdinger_vue/public/index.html deleted file mode 100644 index 3ecf915..0000000 --- a/quantdinger_vue/public/index.html +++ /dev/null @@ -1,477 +0,0 @@ - - - - - - - - QuantDinger - - - <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %> - - <% } %> - - - -
-
-

Landing

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
QuantDinger
-
-
- - <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %> - - <% } %> - - - diff --git a/quantdinger_vue/public/logo.png b/quantdinger_vue/public/logo.png deleted file mode 100644 index 69a77a7..0000000 Binary files a/quantdinger_vue/public/logo.png and /dev/null differ diff --git a/quantdinger_vue/public/slogo.png b/quantdinger_vue/public/slogo.png deleted file mode 100644 index 02a796a..0000000 Binary files a/quantdinger_vue/public/slogo.png and /dev/null differ diff --git a/quantdinger_vue/scripts/fetch_pyodide.ps1 b/quantdinger_vue/scripts/fetch_pyodide.ps1 deleted file mode 100644 index a8352c7..0000000 --- a/quantdinger_vue/scripts/fetch_pyodide.ps1 +++ /dev/null @@ -1,40 +0,0 @@ -$ErrorActionPreference = "Stop" - -$version = "0.25.0" -$projectRoot = Split-Path -Parent $PSScriptRoot -$dest = Join-Path $projectRoot "public/assets/pyodide/v$version/full" -$tmpDir = Join-Path $env:TEMP "quantdinger-pyodide-$version" -$archive = Join-Path $tmpDir "pyodide-$version.tar.bz2" -$extractRoot = Join-Path $tmpDir "extract" - -New-Item -ItemType Directory -Force -Path $tmpDir | Out-Null -New-Item -ItemType Directory -Force -Path $extractRoot | Out-Null - -Write-Host "Downloading Pyodide $version ..." -$url = "https://github.com/pyodide/pyodide/releases/download/$version/pyodide-$version.tar.bz2" -Invoke-WebRequest -Uri $url -OutFile $archive - -Write-Host "Extracting archive ..." -if (Test-Path $extractRoot) { Remove-Item -Recurse -Force $extractRoot } -New-Item -ItemType Directory -Force -Path $extractRoot | Out-Null -tar -xjf $archive -C $extractRoot - -# Try to locate a folder that contains pyodide.js -$pyodideJs = Get-ChildItem -Path $extractRoot -Recurse -File -Filter "pyodide.js" | Select-Object -First 1 -if (-not $pyodideJs) { - throw "pyodide.js not found after extraction. Please check the archive structure." -} - -$sourceDir = Split-Path -Parent $pyodideJs.FullName -Write-Host "Found Pyodide files at: $sourceDir" - -Write-Host "Copying to: $dest" -if (Test-Path $dest) { Remove-Item -Recurse -Force $dest } -New-Item -ItemType Directory -Force -Path $dest | Out-Null -Copy-Item -Path (Join-Path $sourceDir "*") -Destination $dest -Recurse -Force - -Write-Host "Done." -Write-Host "You can now load Pyodide locally from: /assets/pyodide/v$version/full/pyodide.js" -Write-Host "Note: quantdinger_vue/.gitignore ignores /public/assets/pyodide/ by default." - - diff --git a/quantdinger_vue/src/App.vue b/quantdinger_vue/src/App.vue deleted file mode 100644 index f9d9e09..0000000 --- a/quantdinger_vue/src/App.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - diff --git a/quantdinger_vue/src/api/ai-trading.js b/quantdinger_vue/src/api/ai-trading.js deleted file mode 100644 index 0961230..0000000 --- a/quantdinger_vue/src/api/ai-trading.js +++ /dev/null @@ -1,113 +0,0 @@ -import request from '@/utils/request' - -const api = { - strategies: '/addons/quantdinger/strategy/strategies', - createAIStrategy: '/addons/quantdinger/strategy/aiCreate', - updateAIStrategy: '/addons/quantdinger/strategy/aiUpdate', - deleteStrategy: '/addons/quantdinger/strategy/delete', - startStrategy: '/addons/quantdinger/strategy/start', - stopStrategy: '/addons/quantdinger/strategy/stop', - testConnection: '/addons/quantdinger/strategy/testConnection', - aiDecisions: '/addons/quantdinger/strategy/aiDecisions', - getCryptoSymbols: '/addons/quantdinger/strategy/getCryptoSymbols' -} - -/** - * 获取AI交易策略列表 - */ -export function getStrategies () { - return request({ - url: api.strategies, - method: 'get' - }) -} - -/** - * 创建AI交易策略 - */ -export function createAIStrategy (data) { - return request({ - url: api.createAIStrategy, - method: 'post', - data - }) -} - -/** - * 更新AI交易策略 - */ -export function updateAIStrategy (data) { - return request({ - url: api.updateAIStrategy, - method: 'post', - data - }) -} - -/** - * 删除策略 - */ -export function deleteStrategy (strategyId) { - return request({ - url: api.deleteStrategy, - method: 'delete', - params: { id: strategyId } - }) -} - -/** - * 启动策略 - */ -export function startStrategy (strategyId) { - return request({ - url: api.startStrategy, - method: 'post', - params: { id: strategyId } - }) -} - -/** - * 停止策略 - */ -export function stopStrategy (strategyId) { - return request({ - url: api.stopStrategy, - method: 'post', - params: { id: strategyId } - }) -} - -/** - * 测试交易所连接 - */ -export function testConnection (data) { - return request({ - url: api.testConnection, - method: 'post', - data - }) -} - -/** - * 获取AI决策记录 - */ -export function getAIDecisions (strategyId, params) { - return request({ - url: api.aiDecisions, - method: 'get', - params: { - strategy_id: strategyId, - ...params - } - }) -} - -/** - * 获取系统支持的交易对列表 - */ -export function getCryptoSymbols () { - return request({ - url: api.getCryptoSymbols, - method: 'get' - }) -} diff --git a/quantdinger_vue/src/api/auth.js b/quantdinger_vue/src/api/auth.js deleted file mode 100644 index 5212a6f..0000000 --- a/quantdinger_vue/src/api/auth.js +++ /dev/null @@ -1,131 +0,0 @@ -import request from '@/utils/request' - -function joinApiBase (path) { - const base = (process.env.VUE_APP_API_BASE_URL || '').trim() - const p = path.startsWith('/') ? path : `/${path}` - if (!base) return p - - const b = base.replace(/\/+$/, '') - // Avoid duplicate "/api/api/*" when base is "/api" or ends with "/api" - if (b.endsWith('/api') && p.startsWith('/api/')) { - return b + p.slice('/api'.length) - } - return b + p -} - -/** - * Get security configuration (Turnstile, OAuth settings) - */ -export function getSecurityConfig () { - return request({ - url: '/api/auth/security-config', - method: 'get' - }) -} - -/** - * User login - * @param {Object} data - { username, password, turnstile_token } - */ -export function login (data) { - return request({ - url: '/api/auth/login', - method: 'post', - data - }) -} - -/** - * User logout - */ -export function logout () { - return request({ - url: '/api/auth/logout', - method: 'post' - }) -} - -/** - * Get current user info - */ -export function getUserInfo () { - return request({ - url: '/api/auth/info', - method: 'get' - }) -} - -/** - * Send verification code - * @param {Object} data - { email, type, turnstile_token } - * type: 'register' | 'login' | 'reset_password' | 'change_password' | 'change_email' - */ -export function sendVerificationCode (data) { - return request({ - url: '/api/auth/send-code', - method: 'post', - data - }) -} - -/** - * Login with email verification code (quick login) - * @param {Object} data - { email, code, turnstile_token } - */ -export function loginWithCode (data) { - return request({ - url: '/api/auth/login-code', - method: 'post', - data - }) -} - -/** - * User registration - * @param {Object} data - { email, code, username, password, turnstile_token } - */ -export function register (data) { - return request({ - url: '/api/auth/register', - method: 'post', - data - }) -} - -/** - * Reset password - * @param {Object} data - { email, code, new_password, turnstile_token } - */ -export function resetPassword (data) { - return request({ - url: '/api/auth/reset-password', - method: 'post', - data - }) -} - -/** - * Change password (for logged-in users) - * @param {Object} data - { code, new_password } - */ -export function changePassword (data) { - return request({ - url: '/api/auth/change-password', - method: 'post', - data - }) -} - -/** - * Get Google OAuth URL - */ -export function getGoogleOAuthUrl () { - return joinApiBase('/api/auth/oauth/google') -} - -/** - * Get GitHub OAuth URL - */ -export function getGitHubOAuthUrl () { - return joinApiBase('/api/auth/oauth/github') -} diff --git a/quantdinger_vue/src/api/credentials.js b/quantdinger_vue/src/api/credentials.js deleted file mode 100644 index 85c8a21..0000000 --- a/quantdinger_vue/src/api/credentials.js +++ /dev/null @@ -1,40 +0,0 @@ -import request from '@/utils/request' - -const api = { - list: '/api/credentials/list', - get: '/api/credentials/get', - create: '/api/credentials/create', - delete: '/api/credentials/delete' -} - -export function listExchangeCredentials (params = {}) { - return request({ - url: api.list, - method: 'get', - params - }) -} - -export function getExchangeCredential (id, params = {}) { - return request({ - url: api.get, - method: 'get', - params: { id, ...params } - }) -} - -export function createExchangeCredential (data) { - return request({ - url: api.create, - method: 'post', - data - }) -} - -export function deleteExchangeCredential (id, params = {}) { - return request({ - url: api.delete, - method: 'delete', - params: { id, ...params } - }) -} diff --git a/quantdinger_vue/src/api/dashboard.js b/quantdinger_vue/src/api/dashboard.js deleted file mode 100644 index 0cd1da7..0000000 --- a/quantdinger_vue/src/api/dashboard.js +++ /dev/null @@ -1,30 +0,0 @@ - -import request from '@/utils/request' - -// Dashboard API -const api = { - summary: '/api/dashboard/summary', - pendingOrders: '/api/dashboard/pendingOrders' -} - -export function getDashboardSummary () { - return request({ - url: api.summary, - method: 'get' - }) -} - -export function getPendingOrders (params) { - return request({ - url: api.pendingOrders, - method: 'get', - params - }) -} - -export function deletePendingOrder (id) { - return request({ - url: `${api.pendingOrders}/${id}`, - method: 'delete' - }) -} diff --git a/quantdinger_vue/src/api/login.js b/quantdinger_vue/src/api/login.js deleted file mode 100644 index 5bd228f..0000000 --- a/quantdinger_vue/src/api/login.js +++ /dev/null @@ -1,59 +0,0 @@ -import request from '@/utils/request' - -const userApi = { - Login: '/api/auth/login', - Logout: '/api/auth/logout', - UserInfo: '/api/auth/info', - UserMenu: '/user/nav' -} - -/** - * login func - * parameter: { - * username: '', - * password: '', - * remember_me: true, - * captcha: '12345' - * } - * @param parameter - * @returns {*} - */ -export function login (parameter) { - return request({ - url: userApi.Login, - method: 'post', - data: parameter - }) -} - -export function getInfo () { - return request({ - url: userApi.UserInfo, - method: 'get', - headers: { - 'Content-Type': 'application/json;charset=UTF-8' - } - }) -} - -// Backward-compatible alias: some modules still call getUserInfo() -export function getUserInfo () { - return getInfo() -} - -export function logout () { - return request({ - url: userApi.Logout, - method: 'post', - headers: { - 'Content-Type': 'application/json;charset=UTF-8' - } - }) -} - -export function getCurrentUserNav () { - return request({ - url: userApi.UserMenu, - method: 'get' - }) -} diff --git a/quantdinger_vue/src/api/manage.js b/quantdinger_vue/src/api/manage.js deleted file mode 100644 index 46a4a41..0000000 --- a/quantdinger_vue/src/api/manage.js +++ /dev/null @@ -1,70 +0,0 @@ -import request from '@/utils/request' - -const api = { - user: '/user', - role: '/role', - service: '/service', - permission: '/permission', - permissionNoPager: '/permission/no-pager', - orgTree: '/org/tree' -} - -export default api - -export function getUserList (parameter) { - return request({ - url: api.user, - method: 'get', - params: parameter - }) -} - -export function getRoleList (parameter) { - return request({ - url: api.role, - method: 'get', - params: parameter - }) -} - -export function getServiceList (parameter) { - return request({ - url: api.service, - method: 'get', - params: parameter - }) -} - -export function getPermissions (parameter) { - return request({ - url: api.permissionNoPager, - method: 'get', - params: parameter - }) -} - -export function getOrgTree (parameter) { - return request({ - url: api.orgTree, - method: 'get', - params: parameter - }) -} - -// id == 0 add post -// id != 0 update put -export function saveService (parameter) { - return request({ - url: api.service, - method: parameter.id === 0 ? 'post' : 'put', - data: parameter - }) -} - -export function saveSub (sub) { - return request({ - url: '/sub', - method: sub.id === 0 ? 'post' : 'put', - data: sub - }) -} diff --git a/quantdinger_vue/src/api/market.js b/quantdinger_vue/src/api/market.js deleted file mode 100644 index 01ada51..0000000 --- a/quantdinger_vue/src/api/market.js +++ /dev/null @@ -1,259 +0,0 @@ -import request, { ANALYSIS_TIMEOUT } from '@/utils/request' - -const marketApi = { - // Watchlist - GetWatchlist: '/api/market/watchlist/get', - AddWatchlist: '/api/market/watchlist/add', - RemoveWatchlist: '/api/market/watchlist/remove', - GetWatchlistPrices: '/api/market/watchlist/prices', - // Analysis - MultiAnalysis: '/api/analysis/multiAnalysis', - CreateAnalysisTask: '/api/analysis/createTask', - GetAnalysisTaskStatus: '/api/analysis/getTaskStatus', - GetAnalysisHistoryList: '/api/analysis/getHistoryList', - DeleteAnalysisTask: '/api/analysis/deleteTask', - ReflectAnalysis: '/api/analysis/reflect', - // AI chat (optional) - ChatMessage: '/api/ai/chat/message', - GetChatHistory: '/api/ai/chat/history', - SaveChatHistory: '/api/ai/chat/history/save', - // Public config - GetConfig: '/api/market/config', - GetMenuFooterConfig: '/api/market/menuFooterConfig', - // Market metadata - GetMarketTypes: '/api/market/types', - // Symbol search - SearchSymbols: '/api/market/symbols/search', - GetHotSymbols: '/api/market/symbols/hot' -} - -/** - * 获取自选股列表 - * @param parameter { userid: number } - * @returns {*} - */ -export function getWatchlist (parameter) { - return request({ - url: marketApi.GetWatchlist, - method: 'get', - params: parameter - }) -} - -/** - * 添加自选股 - * @param parameter { userid: number, market: string, symbol: string } - * @returns {*} - */ -export function addWatchlist (parameter) { - return request({ - url: marketApi.AddWatchlist, - method: 'post', - data: parameter - }) -} - -/** - * 删除自选股 - * @param parameter { userid: number, symbol: string } - * @returns {*} - */ -export function removeWatchlist (parameter) { - return request({ - url: marketApi.RemoveWatchlist, - method: 'post', - data: parameter - }) -} - -/** - * 获取自选股价格 - * @param parameter { watchlist: array } watchlist格式:[{market: 'USStock', symbol: 'AAPL'}, ...] - * @returns {*} - */ -export function getWatchlistPrices (parameter) { - return request({ - url: marketApi.GetWatchlistPrices, - method: 'get', - params: { - watchlist: JSON.stringify(parameter.watchlist || []) - } - }) -} - -/** - * 发送 AI 聊天消息 - * @param parameter { userid: number, message: string, chatId?: string } - * @returns {*} - */ -export function chatMessage (parameter) { - return request({ - url: marketApi.ChatMessage, - method: 'post', - data: parameter - }) -} - -/** - * 获取聊天历史 - * @param parameter { userid: number } - * @returns {*} - */ -export function getChatHistory (parameter) { - return request({ - url: marketApi.GetChatHistory, - method: 'get', - params: parameter - }) -} - -/** - * 保存聊天历史 - * @param parameter { userid: number, chatHistory: array } - * @returns {*} - */ -export function saveChatHistory (parameter) { - return request({ - url: marketApi.SaveChatHistory, - method: 'post', - data: parameter - }) -} - -/** - * 执行多维度分析 - * @param parameter { userid: number, market: string, symbol: string } - * @returns {*} - */ -export function multiAnalysis (parameter) { - return request({ - url: marketApi.MultiAnalysis, - method: 'post', - data: parameter, - timeout: ANALYSIS_TIMEOUT // Extended timeout for AI analysis - }) -} - -/** - * 创建分析任务 - * @param parameter { userid: number, market: string, symbol: string } - * @returns {*} - */ -export function createAnalysisTask (parameter) { - return request({ - url: marketApi.CreateAnalysisTask, - method: 'post', - data: parameter - }) -} - -/** - * 获取分析任务状态 - * @param parameter { task_id: number } - * @returns {*} - */ -export function getAnalysisTaskStatus (parameter) { - return request({ - url: marketApi.GetAnalysisTaskStatus, - method: 'get', - params: parameter - }) -} - -/** - * 获取历史分析列表 - * @param parameter { userid: number, page?: number, pagesize?: number } - * @returns {*} - */ -export function getAnalysisHistoryList (parameter) { - return request({ - url: marketApi.GetAnalysisHistoryList, - method: 'get', - params: parameter - }) -} - -/** - * Delete analysis task - * @param parameter { task_id: number } - * @returns {*} - */ -export function deleteAnalysisTask (parameter) { - return request({ - url: marketApi.DeleteAnalysisTask, - method: 'post', - data: parameter - }) -} - -/** - * 反思学习 - * @param parameter { market: string, symbol: string, decision: string, returns?: number, result?: string } - * @returns {*} - */ -export function reflectAnalysis (parameter) { - return request({ - url: marketApi.ReflectAnalysis, - method: 'post', - data: parameter - }) -} - -/** - * 获取插件配置 - * @returns {*} - */ -export function getConfig () { - return request({ - url: marketApi.GetConfig, - method: 'get' - }) -} - -/** - * 获取菜单底部配置 - * @returns {*} - */ -export function getMenuFooterConfig () { - return request({ - url: marketApi.GetMenuFooterConfig, - method: 'get' - }) -} - -/** - * 获取股票类型列表 - * @returns {*} - */ -export function getMarketTypes () { - return request({ - url: marketApi.GetMarketTypes, - method: 'get' - }) -} - -/** - * 搜索金融产品 - * @param parameter { market: string, keyword: string, limit?: number } - * @returns {*} - */ -export function searchSymbols (parameter) { - return request({ - url: marketApi.SearchSymbols, - method: 'get', - params: parameter - }) -} - -/** - * 获取热门标的 - * @param parameter { market: string, limit?: number } - * @returns {*} - */ -export function getHotSymbols (parameter) { - return request({ - url: marketApi.GetHotSymbols, - method: 'get', - params: parameter - }) -} diff --git a/quantdinger_vue/src/api/portfolio.js b/quantdinger_vue/src/api/portfolio.js deleted file mode 100644 index 732508e..0000000 --- a/quantdinger_vue/src/api/portfolio.js +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Portfolio API - Manual positions and monitoring - */ -import request from '@/utils/request' - -// ==================== Positions ==================== - -export function getPositions (params = {}) { - return request({ - url: '/api/portfolio/positions', - method: 'get', - params - }) -} - -export function addPosition (data) { - return request({ - url: '/api/portfolio/positions', - method: 'post', - data - }) -} - -export function updatePosition (id, data) { - return request({ - url: `/api/portfolio/positions/${id}`, - method: 'put', - data - }) -} - -export function deletePosition (id) { - return request({ - url: `/api/portfolio/positions/${id}`, - method: 'delete' - }) -} - -export function getPortfolioSummary (params = {}) { - return request({ - url: '/api/portfolio/summary', - method: 'get', - params - }) -} - -// ==================== Monitors ==================== - -export function getMonitors () { - return request({ - url: '/api/portfolio/monitors', - method: 'get' - }) -} - -export function addMonitor (data) { - return request({ - url: '/api/portfolio/monitors', - method: 'post', - data - }) -} - -export function updateMonitor (id, data) { - return request({ - url: `/api/portfolio/monitors/${id}`, - method: 'put', - data - }) -} - -export function deleteMonitor (id) { - return request({ - url: `/api/portfolio/monitors/${id}`, - method: 'delete' - }) -} - -export function runMonitor (id, params = {}) { - return request({ - url: `/api/portfolio/monitors/${id}/run`, - method: 'post', - data: params - }) -} - -// ==================== Alerts ==================== - -export function getAlerts () { - return request({ - url: '/api/portfolio/alerts', - method: 'get' - }) -} - -export function addAlert (data) { - return request({ - url: '/api/portfolio/alerts', - method: 'post', - data - }) -} - -export function updateAlert (id, data) { - return request({ - url: `/api/portfolio/alerts/${id}`, - method: 'put', - data - }) -} - -export function deleteAlert (id) { - return request({ - url: `/api/portfolio/alerts/${id}`, - method: 'delete' - }) -} - -// ==================== Groups ==================== - -export function getGroups () { - return request({ - url: '/api/portfolio/groups', - method: 'get' - }) -} - -export function renameGroup (data) { - return request({ - url: '/api/portfolio/groups/rename', - method: 'post', - data - }) -} - -// ==================== Market (reuse from market.js) ==================== - -export function searchSymbols (data) { - return request({ - url: '/api/market/symbols/search', - method: 'post', - data - }) -} - -export function getMarketTypes () { - return request({ - url: '/api/market/types', - method: 'get' - }) -} diff --git a/quantdinger_vue/src/api/settings.js b/quantdinger_vue/src/api/settings.js deleted file mode 100644 index f721e94..0000000 --- a/quantdinger_vue/src/api/settings.js +++ /dev/null @@ -1,56 +0,0 @@ -import request from '@/utils/request' - -/** - * 获取配置项定义 - */ -export function getSettingsSchema () { - return request({ - url: '/api/settings/schema', - method: 'get' - }) -} - -/** - * 获取当前配置值 - */ -export function getSettingsValues () { - return request({ - url: '/api/settings/values', - method: 'get' - }) -} - -/** - * 保存配置 - * @param {Object} data - 配置数据 - */ -export function saveSettings (data) { - return request({ - url: '/api/settings/save', - method: 'post', - data - }) -} - -/** - * 测试API连接 - * @param {string} service - 服务名称 (openrouter, finnhub, etc.) - * @param {Object} params - 额外参数 - */ -export function testConnection (service, params = {}) { - return request({ - url: '/api/settings/test-connection', - method: 'post', - data: { service, ...params } - }) -} - -/** - * 查询 OpenRouter 账户余额 - */ -export function getOpenRouterBalance () { - return request({ - url: '/api/settings/openrouter-balance', - method: 'get' - }) -} diff --git a/quantdinger_vue/src/api/strategy.js b/quantdinger_vue/src/api/strategy.js deleted file mode 100644 index 6c2abae..0000000 --- a/quantdinger_vue/src/api/strategy.js +++ /dev/null @@ -1,237 +0,0 @@ -import request from '@/utils/request' - -const api = { - // Local Python backend - strategies: '/api/strategies', - strategyDetail: '/api/strategies/detail', - createStrategy: '/api/strategies/create', - batchCreateStrategies: '/api/strategies/batch-create', - updateStrategy: '/api/strategies/update', - stopStrategy: '/api/strategies/stop', - startStrategy: '/api/strategies/start', - deleteStrategy: '/api/strategies/delete', - batchStartStrategies: '/api/strategies/batch-start', - batchStopStrategies: '/api/strategies/batch-stop', - batchDeleteStrategies: '/api/strategies/batch-delete', - testConnection: '/api/strategies/test-connection', - trades: '/api/strategies/trades', - positions: '/api/strategies/positions', - equityCurve: '/api/strategies/equityCurve', - notifications: '/api/strategies/notifications' -} - -/** - * 获取策略列表 - * @param {Object} params - 查询参数 - * @param {number} params.user_id - 用户ID(可选) - */ -export function getStrategyList (params = {}) { - return request({ - url: api.strategies, - method: 'get', - params - }) -} - -/** - * 获取策略详情 - * @param {number} id - 策略ID - */ -export function getStrategyDetail (id) { - return request({ - url: api.strategyDetail, - method: 'get', - params: { id } - }) -} - -/** - * 创建策略 - * @param {Object} data - 策略数据 - * @param {number} data.user_id - 用户ID - * @param {string} data.strategy_name - 策略名称 - * @param {string} data.strategy_type - 策略类型 - * @param {Object} data.llm_model_config - LLM模型配置 - * @param {Object} data.exchange_config - 交易所配置 - * @param {Object} data.trading_config - 交易配置 - */ -export function createStrategy (data) { - return request({ - url: api.createStrategy, - method: 'post', - data - }) -} - -/** - * 批量创建策略(多币种) - * @param {Object} data - 策略数据 - * @param {string} data.strategy_name - 策略基础名称 - * @param {Array} data.symbols - 币种数组,如 ["Crypto:BTC/USDT", "Crypto:ETH/USDT"] - */ -export function batchCreateStrategies (data) { - return request({ - url: api.batchCreateStrategies, - method: 'post', - data - }) -} - -/** - * 更新策略 - * @param {number} id - 策略ID - * @param {Object} data - 策略数据 - * @param {string} data.strategy_name - 策略名称(可选) - * @param {Object} data.indicator_config - 技术指标配置(可选) - * @param {Object} data.exchange_config - 交易所配置(可选) - * @param {Object} data.trading_config - 交易配置(可选) - */ -export function updateStrategy (id, data) { - return request({ - url: api.updateStrategy, - method: 'put', - params: { id }, - data - }) -} - -/** - * 停止策略 - * @param {number} id - 策略ID - */ -export function stopStrategy (id) { - return request({ - url: api.stopStrategy, - method: 'post', - params: { id } - }) -} - -/** - * 启动策略 - * @param {number} id - 策略ID - */ -export function startStrategy (id) { - return request({ - url: api.startStrategy, - method: 'post', - params: { id } - }) -} - -/** - * 删除策略 - * @param {number} id - 策略ID - */ -export function deleteStrategy (id) { - return request({ - url: api.deleteStrategy, - method: 'delete', - params: { id } - }) -} - -/** - * 批量启动策略 - * @param {Object} data - * @param {Array} data.strategy_ids - 策略ID数组 - * @param {string} data.strategy_group_id - 策略组ID(可选,与strategy_ids二选一) - */ -export function batchStartStrategies (data) { - return request({ - url: api.batchStartStrategies, - method: 'post', - data - }) -} - -/** - * 批量停止策略 - * @param {Object} data - * @param {Array} data.strategy_ids - 策略ID数组 - * @param {string} data.strategy_group_id - 策略组ID(可选,与strategy_ids二选一) - */ -export function batchStopStrategies (data) { - return request({ - url: api.batchStopStrategies, - method: 'post', - data - }) -} - -/** - * 批量删除策略 - * @param {Object} data - * @param {Array} data.strategy_ids - 策略ID数组 - * @param {string} data.strategy_group_id - 策略组ID(可选,与strategy_ids二选一) - */ -export function batchDeleteStrategies (data) { - return request({ - url: api.batchDeleteStrategies, - method: 'delete', - data - }) -} - -/** - * 测试交易所连接 - * @param {Object} exchangeConfig - 交易所配置 - */ -export function testExchangeConnection (exchangeConfig) { - return request({ - url: api.testConnection, - method: 'post', - data: { exchange_config: exchangeConfig } - }) -} - -/** - * 获取策略交易记录 - * @param {number} id - 策略ID - */ -export function getStrategyTrades (id) { - return request({ - url: api.trades, - method: 'get', - params: { id } - }) -} - -/** - * 获取策略持仓记录 - * @param {number} id - 策略ID - */ -export function getStrategyPositions (id) { - return request({ - url: api.positions, - method: 'get', - params: { id } - }) -} - -/** - * 获取策略净值曲线 - * @param {number} id - 策略ID - */ -export function getStrategyEquityCurve (id) { - return request({ - url: api.equityCurve, - method: 'get', - params: { id } - }) -} - -/** - * Strategy signal notifications (browser channel persistence). - * @param {Object} params - * @param {number} params.id - strategy id (optional) - * @param {number} params.limit - max items (optional) - * @param {number} params.since_id - return items with id > since_id (optional) - */ -export function getStrategyNotifications (params = {}) { - return request({ - url: api.notifications, - method: 'get', - params - }) -} diff --git a/quantdinger_vue/src/api/user.js b/quantdinger_vue/src/api/user.js deleted file mode 100644 index 9a4f08a..0000000 --- a/quantdinger_vue/src/api/user.js +++ /dev/null @@ -1,188 +0,0 @@ -/** - * User Management API - */ -import request from '@/utils/request' - -// ==================== Admin APIs ==================== - -/** - * Get user list (admin only) - * @param {Object} params - { page, page_size, search } - */ -export function getUserList (params) { - return request({ - url: '/api/users/list', - method: 'get', - params - }) -} - -/** - * Get user detail (admin only) - * @param {Number} id - User ID - */ -export function getUserDetail (id) { - return request({ - url: '/api/users/detail', - method: 'get', - params: { id } - }) -} - -/** - * Create new user (admin only) - * @param {Object} data - { username, password, email, nickname, role } - */ -export function createUser (data) { - return request({ - url: '/api/users/create', - method: 'post', - data - }) -} - -/** - * Update user (admin only) - * @param {Number} id - User ID - * @param {Object} data - { email, nickname, role, status } - */ -export function updateUser (id, data) { - return request({ - url: '/api/users/update', - method: 'put', - params: { id }, - data - }) -} - -/** - * Delete user (admin only) - * @param {Number} id - User ID - */ -export function deleteUser (id) { - return request({ - url: '/api/users/delete', - method: 'delete', - params: { id } - }) -} - -/** - * Reset user password (admin only) - * @param {Object} data - { user_id, new_password } - */ -export function resetUserPassword (data) { - return request({ - url: '/api/users/reset-password', - method: 'post', - data - }) -} - -/** - * Get available roles - */ -export function getRoles () { - return request({ - url: '/api/users/roles', - method: 'get' - }) -} - -// ==================== Self-Service APIs ==================== - -/** - * Get current user profile - */ -export function getProfile () { - return request({ - url: '/api/users/profile', - method: 'get' - }) -} - -/** - * Update current user profile - * @param {Object} data - { nickname, email, avatar } - */ -export function updateProfile (data) { - return request({ - url: '/api/users/profile/update', - method: 'put', - data - }) -} - -/** - * Change current user password - * @param {Object} data - { old_password, new_password } - */ -export function changePassword (data) { - return request({ - url: '/api/users/change-password', - method: 'post', - data - }) -} - -/** - * Get current user's credits log - * @param {Object} params - { page, page_size } - */ -export function getMyCreditsLog (params) { - return request({ - url: '/api/users/my-credits-log', - method: 'get', - params - }) -} - -/** - * Get current user's referral list - * @param {Object} params - { page, page_size } - */ -export function getMyReferrals (params) { - return request({ - url: '/api/users/my-referrals', - method: 'get', - params - }) -} - -// ==================== Billing Management (Admin) ==================== - -/** - * Set user credits (admin only) - * @param {Object} data - { user_id, credits, remark } - */ -export function setUserCredits (data) { - return request({ - url: '/api/users/set-credits', - method: 'post', - data - }) -} - -/** - * Set user VIP status (admin only) - * @param {Object} data - { user_id, vip_days, vip_expires_at, remark } - */ -export function setUserVip (data) { - return request({ - url: '/api/users/set-vip', - method: 'post', - data - }) -} - -/** - * Get user credits log (admin only) - * @param {Object} params - { user_id, page, page_size } - */ -export function getUserCreditsLog (params) { - return request({ - url: '/api/users/credits-log', - method: 'get', - params - }) -} diff --git a/quantdinger_vue/src/assets/background.svg b/quantdinger_vue/src/assets/background.svg deleted file mode 100644 index 89c2597..0000000 --- a/quantdinger_vue/src/assets/background.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - Group 21 - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/quantdinger_vue/src/assets/icons/bx-analyse.svg b/quantdinger_vue/src/assets/icons/bx-analyse.svg deleted file mode 100644 index b02a8d6..0000000 --- a/quantdinger_vue/src/assets/icons/bx-analyse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/quantdinger_vue/src/assets/logo.png b/quantdinger_vue/src/assets/logo.png deleted file mode 100644 index 536e42f..0000000 Binary files a/quantdinger_vue/src/assets/logo.png and /dev/null differ diff --git a/quantdinger_vue/src/assets/logo.svg b/quantdinger_vue/src/assets/logo.svg deleted file mode 100644 index 07ac542..0000000 --- a/quantdinger_vue/src/assets/logo.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - Vue - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/quantdinger_vue/src/assets/slogo.png b/quantdinger_vue/src/assets/slogo.png deleted file mode 100644 index 02a796a..0000000 Binary files a/quantdinger_vue/src/assets/slogo.png and /dev/null differ diff --git a/quantdinger_vue/src/components/ArticleListContent/ArticleListContent.vue b/quantdinger_vue/src/components/ArticleListContent/ArticleListContent.vue deleted file mode 100644 index 25a6820..0000000 --- a/quantdinger_vue/src/components/ArticleListContent/ArticleListContent.vue +++ /dev/null @@ -1,89 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/ArticleListContent/index.js b/quantdinger_vue/src/components/ArticleListContent/index.js deleted file mode 100644 index 37d35c7..0000000 --- a/quantdinger_vue/src/components/ArticleListContent/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import ArticleListContent from './ArticleListContent' - -export default ArticleListContent diff --git a/quantdinger_vue/src/components/AvatarList/Item.jsx b/quantdinger_vue/src/components/AvatarList/Item.jsx deleted file mode 100644 index 8019fac..0000000 --- a/quantdinger_vue/src/components/AvatarList/Item.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import PropTypes from 'ant-design-vue/es/_util/vue-types' -import { Tooltip, Avatar } from 'ant-design-vue' -import { getSlotOptions } from 'ant-design-vue/lib/_util/props-util' -import { warning } from 'ant-design-vue/lib/vc-util/warning' - -export const AvatarListItemProps = { - tips: PropTypes.string, - src: PropTypes.string.def('') -} - -const Item = { - __ANT_AVATAR_CHILDREN: true, - name: 'AvatarListItem', - props: AvatarListItemProps, - created () { - warning(getSlotOptions(this.$parent).__ANT_AVATAR_LIST, 'AvatarListItem must be a subcomponent of AvatarList') - }, - render () { - const size = this.$parent.size === 'mini' ? 'small' : this.$parent.size - const AvatarDom = - return (this.tips && {AvatarDom}) || - } -} - -export default Item diff --git a/quantdinger_vue/src/components/AvatarList/List.jsx b/quantdinger_vue/src/components/AvatarList/List.jsx deleted file mode 100644 index bff7092..0000000 --- a/quantdinger_vue/src/components/AvatarList/List.jsx +++ /dev/null @@ -1,72 +0,0 @@ -import './index.less' - -import PropTypes from 'ant-design-vue/es/_util/vue-types' -import Avatar from 'ant-design-vue/es/avatar' -import Item from './Item.jsx' -import { filterEmpty } from '@/components/_util/util' - -/** - * size: `number`、 `large`、`small`、`default` 默认值: default - * maxLength: number - * excessItemsStyle: CSSProperties - */ -const AvatarListProps = { - prefixCls: PropTypes.string.def('ant-pro-avatar-list'), - size: { - validator: val => { - return typeof val === 'number' || ['small', 'large', 'default'].includes(val) - }, - default: 'default' - }, - maxLength: PropTypes.number.def(0), - excessItemsStyle: PropTypes.object.def({ - color: '#f56a00', - backgroundColor: '#fde3cf' - }) -} - -const AvatarList = { - __ANT_AVATAR_LIST: true, - Item, - name: 'AvatarList', - props: AvatarListProps, - render (h) { - const { prefixCls, size } = this.$props - const className = { - [`${prefixCls}`]: true, - [`${size}`]: true - } - - const items = filterEmpty(this.$slots.default) - const itemsDom = items && items.length ?
    {this.getItems(items)}
: null - return ( -
- {itemsDom} -
- ) - }, - methods: { - getItems (items) { - const className = { - [`${this.prefixCls}-item`]: true, - [`${this.size}`]: true - } - const totalSize = items.length - - if (this.maxLength > 0) { - items = items.slice(0, this.maxLength) - items.push(({`+${totalSize - this.maxLength}`})) - } - return items.map((item) => ( -
  • {item}
  • - )) - } - } -} - -AvatarList.install = function (Vue) { - Vue.component(AvatarList.name, AvatarList) - Vue.component(AvatarList.Item.name, AvatarList.Item) -} - -export default AvatarList diff --git a/quantdinger_vue/src/components/AvatarList/index.js b/quantdinger_vue/src/components/AvatarList/index.js deleted file mode 100644 index b047432..0000000 --- a/quantdinger_vue/src/components/AvatarList/index.js +++ /dev/null @@ -1,9 +0,0 @@ -import AvatarList from './List' -import Item from './Item' - -export { - AvatarList, - Item as AvatarListItem -} - -export default AvatarList diff --git a/quantdinger_vue/src/components/AvatarList/index.less b/quantdinger_vue/src/components/AvatarList/index.less deleted file mode 100644 index 87cc4b5..0000000 --- a/quantdinger_vue/src/components/AvatarList/index.less +++ /dev/null @@ -1,59 +0,0 @@ -@import '../index'; - -@avatar-list-prefix-cls: ~"@{ant-pro-prefix}-avatar-list"; -@avatar-list-item-prefix-cls: ~"@{ant-pro-prefix}-avatar-list-item"; - -.@{avatar-list-prefix-cls} { - display: inline-block; - - ul { - display: inline-block; - padding: 0; - margin: 0 0 0 8px; - font-size: 0; - list-style: none; - } -} - -.@{avatar-list-item-prefix-cls} { - display: inline-block; - width: @avatar-size-base; - height: @avatar-size-base; - margin-left: -8px; - font-size: @font-size-base; - - :global { - .ant-avatar { - cursor: pointer; - border: 1px solid #fff; - } - } - - &.large { - width: @avatar-size-lg; - height: @avatar-size-lg; - } - - &.small { - width: @avatar-size-sm; - height: @avatar-size-sm; - } - - &.mini { - width: 20px; - height: 20px; - - :global { - .ant-avatar { - width: 20px; - height: 20px; - line-height: 20px; - - .ant-avatar-string { - font-size: 12px; - line-height: 18px; - } - } - } - } -} diff --git a/quantdinger_vue/src/components/AvatarList/index.md b/quantdinger_vue/src/components/AvatarList/index.md deleted file mode 100644 index 75e022c..0000000 --- a/quantdinger_vue/src/components/AvatarList/index.md +++ /dev/null @@ -1,64 +0,0 @@ -# AvatarList 用户头像列表 - - -一组用户头像,常用在项目/团队成员列表。可通过设置 `size` 属性来指定头像大小。 - - - -引用方式: - -```javascript -import AvatarList from '@/components/AvatarList' -const AvatarListItem = AvatarList.Item - -export default { - components: { - AvatarList, - AvatarListItem - } -} -``` - - - -## 代码演示 [demo](https://pro.loacg.com/test/home) - -```html - - - - - -``` -或 -```html - - - - - - - - - -``` - - - -## API - -### AvatarList - -| 参数 | 说明 | 类型 | 默认值 | -| ---------------- | -------- | ---------------------------------- | --------- | -| size | 头像大小 | `large`、`small` 、`mini`, `default` | `default` | -| maxLength | 要显示的最大项目 | number | - | -| excessItemsStyle | 多余的项目风格 | CSSProperties | - | - -### AvatarList.Item - -| 参数 | 说明 | 类型 | 默认值 | -| ---- | ------ | --------- | --- | -| tips | 头像展示文案 | string | - | -| src | 头像图片连接 | string | - | - diff --git a/quantdinger_vue/src/components/Charts/Bar.vue b/quantdinger_vue/src/components/Charts/Bar.vue deleted file mode 100644 index 4482845..0000000 --- a/quantdinger_vue/src/components/Charts/Bar.vue +++ /dev/null @@ -1,62 +0,0 @@ - - - diff --git a/quantdinger_vue/src/components/Charts/ChartCard.vue b/quantdinger_vue/src/components/Charts/ChartCard.vue deleted file mode 100644 index fc1f425..0000000 --- a/quantdinger_vue/src/components/Charts/ChartCard.vue +++ /dev/null @@ -1,120 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/Liquid.vue b/quantdinger_vue/src/components/Charts/Liquid.vue deleted file mode 100644 index 4019fb1..0000000 --- a/quantdinger_vue/src/components/Charts/Liquid.vue +++ /dev/null @@ -1,67 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/MiniArea.vue b/quantdinger_vue/src/components/Charts/MiniArea.vue deleted file mode 100644 index 58fe92c..0000000 --- a/quantdinger_vue/src/components/Charts/MiniArea.vue +++ /dev/null @@ -1,56 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/MiniBar.vue b/quantdinger_vue/src/components/Charts/MiniBar.vue deleted file mode 100644 index beac404..0000000 --- a/quantdinger_vue/src/components/Charts/MiniBar.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/MiniProgress.vue b/quantdinger_vue/src/components/Charts/MiniProgress.vue deleted file mode 100644 index e691363..0000000 --- a/quantdinger_vue/src/components/Charts/MiniProgress.vue +++ /dev/null @@ -1,75 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/MiniSmoothArea.vue b/quantdinger_vue/src/components/Charts/MiniSmoothArea.vue deleted file mode 100644 index e5455c2..0000000 --- a/quantdinger_vue/src/components/Charts/MiniSmoothArea.vue +++ /dev/null @@ -1,40 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/Radar.vue b/quantdinger_vue/src/components/Charts/Radar.vue deleted file mode 100644 index 5ee88ad..0000000 --- a/quantdinger_vue/src/components/Charts/Radar.vue +++ /dev/null @@ -1,68 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/RankList.vue b/quantdinger_vue/src/components/Charts/RankList.vue deleted file mode 100644 index afb56a1..0000000 --- a/quantdinger_vue/src/components/Charts/RankList.vue +++ /dev/null @@ -1,77 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/TagCloud.vue b/quantdinger_vue/src/components/Charts/TagCloud.vue deleted file mode 100644 index 74d1b3f..0000000 --- a/quantdinger_vue/src/components/Charts/TagCloud.vue +++ /dev/null @@ -1,113 +0,0 @@ - - - diff --git a/quantdinger_vue/src/components/Charts/TransferBar.vue b/quantdinger_vue/src/components/Charts/TransferBar.vue deleted file mode 100644 index 7f96f0b..0000000 --- a/quantdinger_vue/src/components/Charts/TransferBar.vue +++ /dev/null @@ -1,64 +0,0 @@ - - - diff --git a/quantdinger_vue/src/components/Charts/Trend.vue b/quantdinger_vue/src/components/Charts/Trend.vue deleted file mode 100644 index 2dce37e..0000000 --- a/quantdinger_vue/src/components/Charts/Trend.vue +++ /dev/null @@ -1,82 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/chart.less b/quantdinger_vue/src/components/Charts/chart.less deleted file mode 100644 index f79e17d..0000000 --- a/quantdinger_vue/src/components/Charts/chart.less +++ /dev/null @@ -1,13 +0,0 @@ -.antv-chart-mini { - position: relative; - width: 100%; - - .chart-wrapper { - position: absolute; - bottom: -28px; - width: 100%; - - /* margin: 0 -5px; - overflow: hidden; */ - } -} diff --git a/quantdinger_vue/src/components/Charts/smooth.area.less b/quantdinger_vue/src/components/Charts/smooth.area.less deleted file mode 100644 index d31ff2f..0000000 --- a/quantdinger_vue/src/components/Charts/smooth.area.less +++ /dev/null @@ -1,14 +0,0 @@ -@import '../index'; - -@smoothArea-prefix-cls: ~"@{ant-pro-prefix}-smooth-area"; - -.@{smoothArea-prefix-cls} { - position: relative; - width: 100%; - - .chart-wrapper { - position: absolute; - bottom: -28px; - width: 100%; - } -} diff --git a/quantdinger_vue/src/components/Dialog.js b/quantdinger_vue/src/components/Dialog.js deleted file mode 100644 index 78e95b2..0000000 --- a/quantdinger_vue/src/components/Dialog.js +++ /dev/null @@ -1,113 +0,0 @@ -import Modal from 'ant-design-vue/es/modal' -export default (Vue) => { - function dialog (component, componentProps, modalProps) { - const _vm = this - modalProps = modalProps || {} - if (!_vm || !_vm._isVue) { - return - } - let dialogDiv = document.querySelector('body>div[type=dialog]') - if (!dialogDiv) { - dialogDiv = document.createElement('div') - dialogDiv.setAttribute('type', 'dialog') - document.body.appendChild(dialogDiv) - } - - const handle = function (checkFunction, afterHandel) { - if (checkFunction instanceof Function) { - const res = checkFunction() - if (res instanceof Promise) { - res.then(c => { - c && afterHandel() - }) - } else { - res && afterHandel() - } - } else { - // checkFunction && afterHandel() - checkFunction || afterHandel() - } - } - - const dialogInstance = new Vue({ - data () { - return { - visible: true - } - }, - router: _vm.$router, - store: _vm.$store, - mounted () { - this.$on('close', (v) => { - this.handleClose() - }) - }, - methods: { - handleClose () { - handle(this.$refs._component.onCancel, () => { - this.visible = false - this.$refs._component.$emit('close') - this.$refs._component.$emit('cancel') - dialogInstance.$destroy() - }) - }, - handleOk () { - handle(this.$refs._component.onOK || this.$refs._component.onOk, () => { - this.visible = false - this.$refs._component.$emit('close') - this.$refs._component.$emit('ok') - dialogInstance.$destroy() - }) - } - }, - render: function (h) { - const that = this - const modalModel = modalProps && modalProps.model - if (modalModel) { - delete modalProps.model - } - const ModalProps = Object.assign({}, modalModel && { model: modalModel } || {}, { - attrs: Object.assign({}, { - ...(modalProps.attrs || modalProps) - }, { - visible: this.visible - }), - on: Object.assign({}, { - ...(modalProps.on || modalProps) - }, { - ok: () => { - that.handleOk() - }, - cancel: () => { - that.handleClose() - } - }) - }) - - const componentModel = componentProps && componentProps.model - if (componentModel) { - delete componentProps.model - } - const ComponentProps = Object.assign({}, componentModel && { model: componentModel } || {}, { - ref: '_component', - attrs: Object.assign({}, { - ...((componentProps && componentProps.attrs) || componentProps) - }), - on: Object.assign({}, { - ...((componentProps && componentProps.on) || componentProps) - }) - }) - - return h(Modal, ModalProps, [h(component, ComponentProps)]) - } - }).$mount(dialogDiv) - } - - Object.defineProperty(Vue.prototype, '$dialog', { - get: () => { - return function () { - dialog.apply(this, arguments) - } - } - }) -} diff --git a/quantdinger_vue/src/components/Editor/QuillEditor.vue b/quantdinger_vue/src/components/Editor/QuillEditor.vue deleted file mode 100644 index a9610ee..0000000 --- a/quantdinger_vue/src/components/Editor/QuillEditor.vue +++ /dev/null @@ -1,79 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Editor/WangEditor.vue b/quantdinger_vue/src/components/Editor/WangEditor.vue deleted file mode 100644 index d9c71c7..0000000 --- a/quantdinger_vue/src/components/Editor/WangEditor.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Ellipsis/Ellipsis.vue b/quantdinger_vue/src/components/Ellipsis/Ellipsis.vue deleted file mode 100644 index 5d59200..0000000 --- a/quantdinger_vue/src/components/Ellipsis/Ellipsis.vue +++ /dev/null @@ -1,64 +0,0 @@ - diff --git a/quantdinger_vue/src/components/Ellipsis/index.js b/quantdinger_vue/src/components/Ellipsis/index.js deleted file mode 100644 index 91e3ff4..0000000 --- a/quantdinger_vue/src/components/Ellipsis/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import Ellipsis from './Ellipsis' - -export default Ellipsis diff --git a/quantdinger_vue/src/components/Ellipsis/index.md b/quantdinger_vue/src/components/Ellipsis/index.md deleted file mode 100644 index f528ac7..0000000 --- a/quantdinger_vue/src/components/Ellipsis/index.md +++ /dev/null @@ -1,38 +0,0 @@ -# Ellipsis 文本自动省略号 - -文本过长自动处理省略号,支持按照文本长度和最大行数两种方式截取。 - - - -引用方式: - -```javascript -import Ellipsis from '@/components/Ellipsis' - -export default { - components: { - Ellipsis - } -} -``` - - - -## 代码演示 [demo](https://pro.loacg.com/test/home) - -```html - - There were injuries alleged in three cases in 2015, and a - fourth incident in September, according to the safety recall report. After meeting with US regulators in October, the firm decided to issue a voluntary recall. - -``` - - - -## API - - -参数 | 说明 | 类型 | 默认值 -----|------|-----|------ -tooltip | 移动到文本展示完整内容的提示 | boolean | - -length | 在按照长度截取下的文本最大字符数,超过则截取省略 | number | - \ No newline at end of file diff --git a/quantdinger_vue/src/components/FooterToolbar/FooterToolBar.vue b/quantdinger_vue/src/components/FooterToolbar/FooterToolBar.vue deleted file mode 100644 index ea07123..0000000 --- a/quantdinger_vue/src/components/FooterToolbar/FooterToolBar.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/FooterToolbar/index.js b/quantdinger_vue/src/components/FooterToolbar/index.js deleted file mode 100644 index a0bf145..0000000 --- a/quantdinger_vue/src/components/FooterToolbar/index.js +++ /dev/null @@ -1,4 +0,0 @@ -import FooterToolBar from './FooterToolBar' -import './index.less' - -export default FooterToolBar diff --git a/quantdinger_vue/src/components/FooterToolbar/index.less b/quantdinger_vue/src/components/FooterToolbar/index.less deleted file mode 100644 index 3f49436..0000000 --- a/quantdinger_vue/src/components/FooterToolbar/index.less +++ /dev/null @@ -1,23 +0,0 @@ -@import '../index'; - -@footer-toolbar-prefix-cls: ~"@{ant-pro-prefix}-footer-toolbar"; - -.@{footer-toolbar-prefix-cls} { - position: fixed; - right: 0; - bottom: 0; - z-index: 9; - width: 100%; - height: 56px; - padding: 0 24px; - line-height: 56px; - background: #fff; - box-shadow: 0 -1px 2px rgb(0 0 0 / 3%); - border-top: 1px solid #e8e8e8; - - &::after { - display: block; - clear: both; - content: ''; - } -} diff --git a/quantdinger_vue/src/components/FooterToolbar/index.md b/quantdinger_vue/src/components/FooterToolbar/index.md deleted file mode 100644 index c1aec2c..0000000 --- a/quantdinger_vue/src/components/FooterToolbar/index.md +++ /dev/null @@ -1,48 +0,0 @@ -# FooterToolbar 底部工具栏 - -固定在底部的工具栏。 - - - -## 何时使用 - -固定在内容区域的底部,不随滚动条移动,常用于长页面的数据搜集和提交工作。 - - - -引用方式: - -```javascript -import FooterToolBar from '@/components/FooterToolbar' - -export default { - components: { - FooterToolBar - } -} -``` - - - -## 代码演示 - -```html - - 提交 - -``` -或 -```html - - 提交 - -``` - - -## API - -参数 | 说明 | 类型 | 默认值 -----|------|-----|------ -children (slot) | 工具栏内容,向右对齐 | - | - -extra | 额外信息,向左对齐 | String, Object | - - diff --git a/quantdinger_vue/src/components/GlobalFooter/index.vue b/quantdinger_vue/src/components/GlobalFooter/index.vue deleted file mode 100644 index 564af54..0000000 --- a/quantdinger_vue/src/components/GlobalFooter/index.vue +++ /dev/null @@ -1,129 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/GlobalHeader/AvatarDropdown.vue b/quantdinger_vue/src/components/GlobalHeader/AvatarDropdown.vue deleted file mode 100644 index 8255146..0000000 --- a/quantdinger_vue/src/components/GlobalHeader/AvatarDropdown.vue +++ /dev/null @@ -1,103 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/GlobalHeader/RightContent.vue b/quantdinger_vue/src/components/GlobalHeader/RightContent.vue deleted file mode 100644 index 667d407..0000000 --- a/quantdinger_vue/src/components/GlobalHeader/RightContent.vue +++ /dev/null @@ -1,139 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/IconSelector/IconSelector.vue b/quantdinger_vue/src/components/IconSelector/IconSelector.vue deleted file mode 100644 index 810d297..0000000 --- a/quantdinger_vue/src/components/IconSelector/IconSelector.vue +++ /dev/null @@ -1,86 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/IconSelector/README.md b/quantdinger_vue/src/components/IconSelector/README.md deleted file mode 100644 index 503095d..0000000 --- a/quantdinger_vue/src/components/IconSelector/README.md +++ /dev/null @@ -1,48 +0,0 @@ -IconSelector -==== - -> 图标选择组件,常用于为某一个数据设定一个图标时使用 -> eg: 设定菜单列表时,为每个菜单设定一个图标 - -该组件由 [@Saraka](https://github.com/saraka-tsukai) 封装 - - - -### 使用方式 - -```vue - - - -``` - - - -### 事件 - - -| 名称 | 说明 | 类型 | 默认值 | -| ------ | -------------------------- | ------ | ------ | -| change | 当改变了 `icon` 选中项触发 | String | - | diff --git a/quantdinger_vue/src/components/IconSelector/icons.js b/quantdinger_vue/src/components/IconSelector/icons.js deleted file mode 100644 index 920f464..0000000 --- a/quantdinger_vue/src/components/IconSelector/icons.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * 增加新的图标时,请遵循以下数据结构 - * Adding new icon please follow the data structure below - */ -export default [ - { - key: 'directional', - title: '方向性图标', - icons: ['step-backward', 'step-forward', 'fast-backward', 'fast-forward', 'shrink', 'arrows-alt', 'down', 'up', 'left', 'right', 'caret-up', 'caret-down', 'caret-left', 'caret-right', 'up-circle', 'down-circle', 'left-circle', 'right-circle', 'double-right', 'double-left', 'vertical-left', 'vertical-right', 'forward', 'backward', 'rollback', 'enter', 'retweet', 'swap', 'swap-left', 'swap-right', 'arrow-up', 'arrow-down', 'arrow-left', 'arrow-right', 'play-circle', 'up-square', 'down-square', 'left-square', 'right-square', 'login', 'logout', 'menu-fold', 'menu-unfold', 'border-bottom', 'border-horizontal', 'border-inner', 'border-left', 'border-right', 'border-top', 'border-verticle', 'pic-center', 'pic-left', 'pic-right', 'radius-bottomleft', 'radius-bottomright', 'radius-upleft', 'fullscreen', 'fullscreen-exit'] - }, - { - key: 'suggested', - title: '提示建议性图标', - icons: ['question', 'question-circle', 'plus', 'plus-circle', 'pause', 'pause-circle', 'minus', 'minus-circle', 'plus-square', 'minus-square', 'info', 'info-circle', 'exclamation', 'exclamation-circle', 'close', 'close-circle', 'close-square', 'check', 'check-circle', 'check-square', 'clock-circle', 'warning', 'issues-close', 'stop'] - }, - { - key: 'editor', - title: '编辑类图标', - icons: ['edit', 'form', 'copy', 'scissor', 'delete', 'snippets', 'diff', 'highlight', 'align-center', 'align-left', 'align-right', 'bg-colors', 'bold', 'italic', 'underline', 'strikethrough', 'redo', 'undo', 'zoom-in', 'zoom-out', 'font-colors', 'font-size', 'line-height', 'colum-height', 'dash', 'small-dash', 'sort-ascending', 'sort-descending', 'drag', 'ordered-list', 'radius-setting'] - }, - { - key: 'data', - title: '数据类图标', - icons: ['area-chart', 'pie-chart', 'bar-chart', 'dot-chart', 'line-chart', 'radar-chart', 'heat-map', 'fall', 'rise', 'stock', 'box-plot', 'fund', 'sliders'] - }, - { - key: 'brand_logo', - title: '网站通用图标', - icons: ['lock', 'unlock', 'bars', 'book', 'calendar', 'cloud', 'cloud-download', 'code', 'copy', 'credit-card', 'delete', 'desktop', 'download', 'ellipsis', 'file', 'file-text', 'file-unknown', 'file-pdf', 'file-word', 'file-excel', 'file-jpg', 'file-ppt', 'file-markdown', 'file-add', 'folder', 'folder-open', 'folder-add', 'hdd', 'frown', 'meh', 'smile', 'inbox', 'laptop', 'appstore', 'link', 'mail', 'mobile', 'notification', 'paper-clip', 'picture', 'poweroff', 'reload', 'search', 'setting', 'share-alt', 'shopping-cart', 'tablet', 'tag', 'tags', 'to-top', 'upload', 'user', 'video-camera', 'home', 'loading', 'loading-3-quarters', 'cloud-upload', 'star', 'heart', 'environment', 'eye', 'camera', 'save', 'team', 'solution', 'phone', 'filter', 'exception', 'export', 'customer-service', 'qrcode', 'scan', 'like', 'dislike', 'message', 'pay-circle', 'calculator', 'pushpin', 'bulb', 'select', 'switcher', 'rocket', 'bell', 'disconnect', 'database', 'compass', 'barcode', 'hourglass', 'key', 'flag', 'layout', 'printer', 'sound', 'usb', 'skin', 'tool', 'sync', 'wifi', 'car', 'schedule', 'user-add', 'user-delete', 'usergroup-add', 'usergroup-delete', 'man', 'woman', 'shop', 'gift', 'idcard', 'medicine-box', 'red-envelope', 'coffee', 'copyright', 'trademark', 'safety', 'wallet', 'bank', 'trophy', 'contacts', 'global', 'shake', 'api', 'fork', 'dashboard', 'table', 'profile', 'alert', 'audit', 'branches', 'build', 'border', 'crown', 'experiment', 'fire', 'money-collect', 'property-safety', 'read', 'reconciliation', 'rest', 'security-scan', 'insurance', 'interation', 'safety-certificate', 'project', 'thunderbolt', 'block', 'cluster', 'deployment-unit', 'dollar', 'euro', 'pound', 'file-done', 'file-exclamation', 'file-protect', 'file-search', 'file-sync', 'gateway', 'gold', 'robot', 'shopping'] - }, - { - key: 'application', - title: '品牌和标识', - icons: ['android', 'apple', 'windows', 'ie', 'chrome', 'github', 'aliwangwang', 'dingding', 'weibo-square', 'weibo-circle', 'taobao-circle', 'html5', 'weibo', 'twitter', 'wechat', 'youtube', 'alipay-circle', 'taobao', 'skype', 'qq', 'medium-workmark', 'gitlab', 'medium', 'linkedin', 'google-plus', 'dropbox', 'facebook', 'codepen', 'code-sandbox', 'amazon', 'google', 'codepen-circle', 'alipay', 'ant-design', 'aliyun', 'zhihu', 'slack', 'slack-square', 'behance', 'behance-square', 'dribbble', 'dribbble-square', 'instagram', 'yuque', 'alibaba', 'yahoo'] - } -] diff --git a/quantdinger_vue/src/components/IconSelector/index.js b/quantdinger_vue/src/components/IconSelector/index.js deleted file mode 100644 index 2d27d70..0000000 --- a/quantdinger_vue/src/components/IconSelector/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import IconSelector from './IconSelector' -export default IconSelector diff --git a/quantdinger_vue/src/components/MultiTab/MultiTab.vue b/quantdinger_vue/src/components/MultiTab/MultiTab.vue deleted file mode 100644 index fe2c3f7..0000000 --- a/quantdinger_vue/src/components/MultiTab/MultiTab.vue +++ /dev/null @@ -1,161 +0,0 @@ - diff --git a/quantdinger_vue/src/components/MultiTab/events.js b/quantdinger_vue/src/components/MultiTab/events.js deleted file mode 100644 index b0230b5..0000000 --- a/quantdinger_vue/src/components/MultiTab/events.js +++ /dev/null @@ -1,2 +0,0 @@ -import Vue from 'vue' -export default new Vue() diff --git a/quantdinger_vue/src/components/MultiTab/index.js b/quantdinger_vue/src/components/MultiTab/index.js deleted file mode 100644 index 02a1c77..0000000 --- a/quantdinger_vue/src/components/MultiTab/index.js +++ /dev/null @@ -1,40 +0,0 @@ -import events from './events' -import MultiTab from './MultiTab' -import './index.less' - -const api = { - /** - * open new tab on route fullPath - * @param config - */ - open: function (config) { - events.$emit('open', config) - }, - rename: function (key, name) { - events.$emit('rename', { key: key, name: name }) - }, - /** - * close current page - */ - closeCurrentPage: function () { - this.close() - }, - /** - * close route fullPath tab - * @param config - */ - close: function (config) { - events.$emit('close', config) - } -} - -MultiTab.install = function (Vue) { - if (Vue.prototype.$multiTab) { - return - } - api.instance = events - Vue.prototype.$multiTab = api - Vue.component('multi-tab', MultiTab) -} - -export default MultiTab diff --git a/quantdinger_vue/src/components/MultiTab/index.less b/quantdinger_vue/src/components/MultiTab/index.less deleted file mode 100644 index d9d9fa6..0000000 --- a/quantdinger_vue/src/components/MultiTab/index.less +++ /dev/null @@ -1,25 +0,0 @@ -@import '../index'; - -@multi-tab-prefix-cls: ~"@{ant-pro-prefix}-multi-tab"; -@multi-tab-wrapper-prefix-cls: ~"@{ant-pro-prefix}-multi-tab-wrapper"; - -/* -.topmenu .@{multi-tab-prefix-cls} { - max-width: 1200px; - margin: -23px auto 24px auto; -} -*/ -.@{multi-tab-prefix-cls} { - margin: -23px -24px 24px; - background: #fff; -} - -.topmenu .@{multi-tab-wrapper-prefix-cls} { - max-width: 1200px; - margin: 0 auto; -} - -.topmenu.content-width-Fluid .@{multi-tab-wrapper-prefix-cls} { - max-width: 100%; - margin: 0 auto; -} diff --git a/quantdinger_vue/src/components/NProgress/nprogress.less b/quantdinger_vue/src/components/NProgress/nprogress.less deleted file mode 100644 index 6593834..0000000 --- a/quantdinger_vue/src/components/NProgress/nprogress.less +++ /dev/null @@ -1,70 +0,0 @@ -@import url('../index.less'); - -/* Make clicks pass-through */ -#nprogress { - pointer-events: none; -} - -#nprogress .bar { - position: fixed; - top: 0; - left: 0; - z-index: 1031; - width: 100%; - height: 2px; - background: @primary-color; -} - -/* Fancy blur effect */ -#nprogress .peg { - position: absolute; - right: 0; - display: block; - width: 100px; - height: 100%; - opacity: 1; - transform: rotate(3deg) translate(0, -4px); - transform: rotate(3deg) translate(0, -4px); - transform: rotate(3deg) translate(0, -4px); - box-shadow: 0 0 10px @primary-color, 0 0 5px @primary-color; -} - -/* Remove these to get rid of the spinner */ -#nprogress .spinner { - position: fixed; - top: 15px; - right: 15px; - z-index: 1031; - display: block; -} - -#nprogress .spinner-icon { - width: 18px; - height: 18px; - box-sizing: border-box; - border: solid 2px transparent; - border-top-color: @primary-color; - border-left-color: @primary-color; - border-radius: 50%; - animation: nprogress-spinner 400ms linear infinite; - animation: nprogress-spinner 400ms linear infinite; -} - -.nprogress-custom-parent { - position: relative; - overflow: hidden; -} - -.nprogress-custom-parent #nprogress .spinner, -.nprogress-custom-parent #nprogress .bar { - position: absolute; -} - -@keyframes nprogress-spinner { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} -@keyframes nprogress-spinner { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} diff --git a/quantdinger_vue/src/components/NoticeIcon/NoticeIcon.vue b/quantdinger_vue/src/components/NoticeIcon/NoticeIcon.vue deleted file mode 100644 index 8134c4b..0000000 --- a/quantdinger_vue/src/components/NoticeIcon/NoticeIcon.vue +++ /dev/null @@ -1,789 +0,0 @@ - - - - - - - diff --git a/quantdinger_vue/src/components/NoticeIcon/index.js b/quantdinger_vue/src/components/NoticeIcon/index.js deleted file mode 100644 index 659b9ec..0000000 --- a/quantdinger_vue/src/components/NoticeIcon/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import NoticeIcon from './NoticeIcon' -export default NoticeIcon diff --git a/quantdinger_vue/src/components/NumberInfo/NumberInfo.vue b/quantdinger_vue/src/components/NumberInfo/NumberInfo.vue deleted file mode 100644 index bdde3e0..0000000 --- a/quantdinger_vue/src/components/NumberInfo/NumberInfo.vue +++ /dev/null @@ -1,54 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/NumberInfo/index.js b/quantdinger_vue/src/components/NumberInfo/index.js deleted file mode 100644 index 659a2f3..0000000 --- a/quantdinger_vue/src/components/NumberInfo/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import NumberInfo from './NumberInfo' - -export default NumberInfo diff --git a/quantdinger_vue/src/components/NumberInfo/index.less b/quantdinger_vue/src/components/NumberInfo/index.less deleted file mode 100644 index 82cbd7e..0000000 --- a/quantdinger_vue/src/components/NumberInfo/index.less +++ /dev/null @@ -1,55 +0,0 @@ -@import '../index'; - -@numberInfo-prefix-cls: ~"@{ant-pro-prefix}-number-info"; - -.@{numberInfo-prefix-cls} { - .ant-pro-number-info-subtitle { - height: 22px; - overflow: hidden; - font-size: @font-size-base; - line-height: 22px; - color: @text-color-secondary; - text-overflow: ellipsis; - word-break: break-all; - white-space: nowrap; - } - - .number-info-value { - margin-top: 4px; - overflow: hidden; - font-size: 0; - text-overflow: ellipsis; - word-break: break-all; - white-space: nowrap; - - & > span { - display: inline-block; - height: 32px; - margin-right: 32px; - font-size: 24px; - line-height: 32px; - color: @heading-color; - } - - .sub-total { - margin-right: 0; - font-size: @font-size-lg; - color: @text-color-secondary; - vertical-align: top; - - i { - margin-left: 4px; - font-size: 12px; - transform: scale(.82); - } - - .anticon-caret-up { - color: @red-6; - } - - .anticon-caret-down { - color: @green-6; - } - } - } -} diff --git a/quantdinger_vue/src/components/NumberInfo/index.md b/quantdinger_vue/src/components/NumberInfo/index.md deleted file mode 100644 index 147adc4..0000000 --- a/quantdinger_vue/src/components/NumberInfo/index.md +++ /dev/null @@ -1,43 +0,0 @@ -# NumberInfo 数据文本 - -常用在数据卡片中,用于突出展示某个业务数据。 - - - -引用方式: - -```javascript -import NumberInfo from '@/components/NumberInfo' - -export default { - components: { - NumberInfo - } -} -``` - - - -## 代码演示 [demo](https://pro.loacg.com/test/home) - -```html - -``` - - - -## API - -参数 | 说明 | 类型 | 默认值 -----|------|-----|------ -title | 标题 | ReactNode\|string | - -subTitle | 子标题 | ReactNode\|string | - -total | 总量 | ReactNode\|string | - -subTotal | 子总量 | ReactNode\|string | - -status | 增加状态 | 'up \| down' | - -theme | 状态样式 | string | 'light' -gap | 设置数字和描述之间的间距(像素)| number | 8 diff --git a/quantdinger_vue/src/components/Other/CarbonAds.vue b/quantdinger_vue/src/components/Other/CarbonAds.vue deleted file mode 100644 index 32099c6..0000000 --- a/quantdinger_vue/src/components/Other/CarbonAds.vue +++ /dev/null @@ -1,62 +0,0 @@ - - - diff --git a/quantdinger_vue/src/components/PageLoading/index.jsx b/quantdinger_vue/src/components/PageLoading/index.jsx deleted file mode 100644 index af6d6d6..0000000 --- a/quantdinger_vue/src/components/PageLoading/index.jsx +++ /dev/null @@ -1,106 +0,0 @@ -import { Spin } from 'ant-design-vue' - -export const PageLoading = { - name: 'PageLoading', - props: { - tip: { - type: String, - default: 'Loading..' - }, - size: { - type: String, - default: 'large' - } - }, - render () { - const style = { - textAlign: 'center', - background: 'rgba(0,0,0,0.6)', - position: 'fixed', - top: 0, - bottom: 0, - left: 0, - right: 0, - zIndex: 1100 - } - const spinStyle = { - position: 'absolute', - left: '50%', - top: '40%', - transform: 'translate(-50%, -50%)' - } - return (
    - -
    ) - } -} - -const version = '0.0.1' -const loading = {} - -loading.newInstance = (Vue, options) => { - let loadingElement = document.querySelector('body>div[type=loading]') - if (!loadingElement) { - loadingElement = document.createElement('div') - loadingElement.setAttribute('type', 'loading') - loadingElement.setAttribute('class', 'ant-loading-wrapper') - document.body.appendChild(loadingElement) - } - - const cdProps = Object.assign({ visible: false, size: 'large', tip: 'Loading...' }, options) - - const instance = new Vue({ - data () { - return { - ...cdProps - } - }, - render () { - const { tip } = this - const props = {} - this.tip && (props.tip = tip) - if (this.visible) { - return - } - return null - } - }).$mount(loadingElement) - - function update (config) { - const { visible, size, tip } = { ...cdProps, ...config } - instance.$set(instance, 'visible', visible) - if (tip) { - instance.$set(instance, 'tip', tip) - } - if (size) { - instance.$set(instance, 'size', size) - } - } - - return { - instance, - update - } -} - -const api = { - show: function (options) { - this.instance.update({ ...options, visible: true }) - }, - hide: function () { - this.instance.update({ visible: false }) - } -} - -const install = function (Vue, options) { - if (Vue.prototype.$loading) { - return - } - api.instance = loading.newInstance(Vue, options) - Vue.prototype.$loading = api -} - -export default { - version, - install -} diff --git a/quantdinger_vue/src/components/Search/GlobalSearch.jsx b/quantdinger_vue/src/components/Search/GlobalSearch.jsx deleted file mode 100644 index 13bfa56..0000000 --- a/quantdinger_vue/src/components/Search/GlobalSearch.jsx +++ /dev/null @@ -1,62 +0,0 @@ -import { Select } from 'ant-design-vue' -import './index.less' - -const GlobalSearch = { - name: 'GlobalSearch', - data () { - return { - visible: false - } - }, - mounted () { - const keyboardHandle = (e) => { - e.preventDefault() - e.stopPropagation() - const { ctrlKey, shiftKey, altKey, keyCode } = e - // key is `K` and hold ctrl - if (keyCode === 75 && ctrlKey && !shiftKey && !altKey) { - this.visible = !this.visible - } - } - document.addEventListener('keydown', keyboardHandle) - }, - render () { - const { visible } = this - const handleSearch = (e) => { - this.$emit('search', e) - } - - const handleChange = (e) => { - this.$emit('change', e) - } - if (!visible) { - return null - } - return ( - - ) - } -} - -GlobalSearch.install = function (Vue) { - Vue.component(GlobalSearch.name, GlobalSearch) -} - -export default GlobalSearch diff --git a/quantdinger_vue/src/components/Search/index.less b/quantdinger_vue/src/components/Search/index.less deleted file mode 100644 index f8b51b5..0000000 --- a/quantdinger_vue/src/components/Search/index.less +++ /dev/null @@ -1,25 +0,0 @@ -@import '~ant-design-vue/es/style/themes/default'; - -.global-search-wrapper { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: @zindex-modal-mask; - background: @modal-mask-bg; - - .global-search-box { - position: absolute; - top: 20%; - left: 50%; - width: 450px; - transform: translate(-50%, -50%); - - .global-search-tips { - font-size: @font-size-lg; - color: @white; - text-align: right; - } - } -} diff --git a/quantdinger_vue/src/components/SelectLang/index.jsx b/quantdinger_vue/src/components/SelectLang/index.jsx deleted file mode 100644 index 237bbfe..0000000 --- a/quantdinger_vue/src/components/SelectLang/index.jsx +++ /dev/null @@ -1,70 +0,0 @@ -import './index.less' - -import { Icon, Menu, Dropdown } from 'ant-design-vue' -import { i18nRender } from '@/locales' -import i18nMixin from '@/store/i18n-mixin' - -const locales = ['en-US', 'ja-JP', 'ko-KR', 'vi-VN', 'th-TH', 'ar-SA', 'fr-FR', 'de-DE', 'zh-TW', 'zh-CN'] -const languageLabels = { - 'zh-CN': '简体中文', - 'zh-TW': '繁體中文', - 'en-US': 'English', - 'ja-JP': '日本語', - 'ko-KR': '한국어', - 'vi-VN': 'Tiếng Việt', - 'th-TH': 'ไทย', - 'ar-SA': 'العربية', - 'fr-FR': 'Français', - 'de-DE': 'Deutsch' -} -// eslint-disable-next-line -const languageIcons = { - 'zh-CN': '🇨🇳', - 'zh-TW': 'sg', - 'en-US': '🇺🇸', - 'ja-JP': '🇯🇵', - 'ko-KR': '🇰🇷', - 'vi-VN': '🇻🇳', - 'th-TH': '🇹🇭', - 'ar-SA': '🇸🇦', - 'fr-FR': '🇫🇷', - 'de-DE': '🇩🇪' -} - -const SelectLang = { - props: { - prefixCls: { - type: String, - default: 'ant-pro-drop-down' - } - }, - name: 'SelectLang', - mixins: [i18nMixin], - render () { - const { prefixCls } = this - const changeLang = ({ key }) => { - this.setLang(key) - } - const langMenu = ( - - {locales.map(locale => ( - - - {languageIcons[locale]} - {' '} - {languageLabels[locale]} - - ))} - - ) - return ( - - - - - - ) - } -} - -export default SelectLang diff --git a/quantdinger_vue/src/components/SelectLang/index.less b/quantdinger_vue/src/components/SelectLang/index.less deleted file mode 100644 index a71f69c..0000000 --- a/quantdinger_vue/src/components/SelectLang/index.less +++ /dev/null @@ -1,30 +0,0 @@ -@import '~ant-design-vue/es/style/themes/default'; - -@header-menu-prefix-cls: ~'@{ant-prefix}-pro-header-menu'; -@header-drop-down-prefix-cls: ~'@{ant-prefix}-pro-drop-down'; - -.@{header-menu-prefix-cls} { - .anticon { - margin-right: 8px; - } - - .ant-dropdown-menu-item { - min-width: 160px; - } -} - -.@{header-drop-down-prefix-cls} { - line-height: @layout-header-height; - vertical-align: top; - cursor: pointer; - - > i { - font-size: 16px !important; - transform: none !important; - - svg { - position: relative; - top: -1px; - } - } -} diff --git a/quantdinger_vue/src/components/SettingDrawer/SettingDrawer.vue b/quantdinger_vue/src/components/SettingDrawer/SettingDrawer.vue deleted file mode 100644 index 7a19873..0000000 --- a/quantdinger_vue/src/components/SettingDrawer/SettingDrawer.vue +++ /dev/null @@ -1,355 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/SettingDrawer/SettingItem.vue b/quantdinger_vue/src/components/SettingDrawer/SettingItem.vue deleted file mode 100644 index 2b3b553..0000000 --- a/quantdinger_vue/src/components/SettingDrawer/SettingItem.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/SettingDrawer/index.js b/quantdinger_vue/src/components/SettingDrawer/index.js deleted file mode 100644 index 8260f2d..0000000 --- a/quantdinger_vue/src/components/SettingDrawer/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import SettingDrawer from './SettingDrawer' -export default SettingDrawer diff --git a/quantdinger_vue/src/components/SettingDrawer/settingConfig.js b/quantdinger_vue/src/components/SettingDrawer/settingConfig.js deleted file mode 100644 index 9e715d7..0000000 --- a/quantdinger_vue/src/components/SettingDrawer/settingConfig.js +++ /dev/null @@ -1,53 +0,0 @@ -import message from 'ant-design-vue/es/message' -// import defaultSettings from '../defaultSettings'; -import themeColor from './themeColor.js' -import i18n from '@/locales' - -// let lessNodesAppended -const getColorList = () => { - return [ - { - key: i18n.t('app.setting.themecolor.dust'), color: '#F5222D' - }, - { - key: i18n.t('app.setting.themecolor.volcano'), color: '#FA541C' - }, - { - key: i18n.t('app.setting.themecolor.sunset'), color: '#FAAD14' - }, - { - key: i18n.t('app.setting.themecolor.cyan'), color: '#13C2C2' - }, - { - key: i18n.t('app.setting.themecolor.green'), color: '#52C41A' - }, - { - key: i18n.t('app.setting.themecolor.daybreak'), color: '#1890FF' - }, - { - key: i18n.t('app.setting.themecolor.geekblue'), color: '#2F54EB' - }, - { - key: i18n.t('app.setting.themecolor.purple'), color: '#722ED1' - } - ] -} - -const updateTheme = (newPrimaryColor, silent = false) => { - const hideMessage = silent ? null : message.loading(i18n.t('app.setting.theme.switching'), 0) - themeColor.changeColor(newPrimaryColor).finally(() => { - if (hideMessage) { - setTimeout(() => { - hideMessage() - }, 10) - } - }) -} - -const updateColorWeak = colorWeak => { - // document.body.className = colorWeak ? 'colorWeak' : ''; - const app = document.body.querySelector('#app') - colorWeak ? app.classList.add('colorWeak') : app.classList.remove('colorWeak') -} - -export { updateTheme, getColorList, updateColorWeak } diff --git a/quantdinger_vue/src/components/SettingDrawer/themeColor.js b/quantdinger_vue/src/components/SettingDrawer/themeColor.js deleted file mode 100644 index 68f1369..0000000 --- a/quantdinger_vue/src/components/SettingDrawer/themeColor.js +++ /dev/null @@ -1,36 +0,0 @@ -import client from 'webpack-theme-color-replacer/client' -import generate from '@ant-design/colors/lib/generate' - -export default { - getAntdSerials (color) { - // 淡化(即less的tint) - const lightens = new Array(9).fill().map((t, i) => { - return client.varyColor.lighten(color, i / 10) - }) - // colorPalette变换得到颜色值 - const colorPalettes = generate(color) - const rgb = client.varyColor.toNum3(color.replace('#', '')).join(',') - return lightens.concat(colorPalettes).concat(rgb) - }, - changeColor (newColor) { - // Check if client.changer is available (plugin might not be loaded in some build configs) - if (!client || !client.changer || typeof client.changer.changeColor !== 'function') { - // Return a resolved promise to avoid breaking the calling code - return Promise.resolve() - } - - var options = { - newColors: this.getAntdSerials(newColor), // new colors array, one-to-one corresponde with `matchColors` - changeUrl (cssUrl) { - return `/${cssUrl}` // while router is not `hash` mode, it needs absolute path - } - } - - try { - return client.changer.changeColor(options, Promise) - } catch (error) { - // Return a resolved promise to avoid breaking the calling code - return Promise.resolve() - } - } -} diff --git a/quantdinger_vue/src/components/StandardFormRow/StandardFormRow.vue b/quantdinger_vue/src/components/StandardFormRow/StandardFormRow.vue deleted file mode 100644 index febc684..0000000 --- a/quantdinger_vue/src/components/StandardFormRow/StandardFormRow.vue +++ /dev/null @@ -1,122 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/StandardFormRow/index.js b/quantdinger_vue/src/components/StandardFormRow/index.js deleted file mode 100644 index 8155cc7..0000000 --- a/quantdinger_vue/src/components/StandardFormRow/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import StandardFormRow from './StandardFormRow' - -export default StandardFormRow diff --git a/quantdinger_vue/src/components/Table/README.md b/quantdinger_vue/src/components/Table/README.md deleted file mode 100644 index 1d2c9d0..0000000 --- a/quantdinger_vue/src/components/Table/README.md +++ /dev/null @@ -1,341 +0,0 @@ -Table 重封装组件说明 -==== - - -封装说明 ----- - -> 基础的使用方式与 API 与 [官方版(Table)](https://vuecomponent.github.io/ant-design-vue/components/table-cn/) 本一致,在其基础上,封装了加载数据的方法。 -> -> 你无需在你是用表格的页面进行分页逻辑处理,仅需向 Table 组件传递绑定 `:data="Promise"` 对象即可 - -该 `table` 由 [@Saraka](https://github.com/saraka-tsukai) 完成封装 - - -例子1 ----- -(基础使用) - -```vue - - - - - -``` - - - -例子2 ----- - -(简单的表格,最后一列是各种操作) - -```vue - - - -``` - - - -内置方法 ----- - -通过 `this.$refs.table` 调用 - -`this.$refs.table.refresh(true)` 刷新列表 (用户新增/修改数据后,重载列表数据) - -> 注意:要调用 `refresh(bool)` 需要给表格组件设定 `ref` 值 -> -> `refresh()` 方法可以传一个 `bool` 值,当有传值 或值为 `true` 时,则刷新时会强制刷新到第一页(常用户页面 搜索 按钮进行搜索时,结果从第一页开始分页) - - -内置属性 ----- -> 除去 `a-table` 自带属性外,还而外提供了一些额外属性属性 - - -| 属性 | 说明 | 类型 | 默认值 | -| -------------- | ----------------------------------------------- | ----------------- | ------ | -| alert | 设置是否显示表格信息栏 | [object, boolean] | null | -| showPagination | 显示分页选择器,可传 'auto' \| boolean | [string, boolean] | 'auto' | -| data | 加载数据方法 必须为 `Promise` 对象 **必须绑定** | Promise | - | - - -`alert` 属性对象: - -```javascript -alert: { - show: Boolean, - clear: [Function, Boolean] -} -``` - -注意事项 ----- - -> 你可能需要为了与后端提供的接口返回结果一致而去修改以下代码: -> (需要注意的是,这里的修改是全局性的,意味着整个项目所有使用该 table 组件都需要遵守这个返回结果定义的字段。) -> -> 文档中的结构有可能由于组件 bug 进行修正而改动。实际修改请以当时最新版本为准 - -修改 `@/components/table/index.js` 第 156 行起 - - - -```javascript -result.then(r => { - this.localPagination = this.showPagination && Object.assign({}, this.localPagination, { - current: r.pageNo, // 返回结果中的当前分页数 - total: r.totalCount, // 返回结果中的总记录数 - showSizeChanger: this.showSizeChanger, - pageSize: (pagination && pagination.pageSize) || - this.localPagination.pageSize - }) || false - // 为防止删除数据后导致页面当前页面数据长度为 0 ,自动翻页到上一页 - if (r.data.length === 0 && this.showPagination && this.localPagination.current > 1) { - this.localPagination.current-- - this.loadData() - return - } - - // 这里用于判断接口是否有返回 r.totalCount 且 this.showPagination = true 且 pageNo 和 pageSize 存在 且 totalCount 小于等于 pageNo * pageSize 的大小 - // 当情况满足时,表示数据不满足分页大小,关闭 table 分页功能 - try { - if ((['auto', true].includes(this.showPagination) && r.totalCount <= (r.pageNo * this.localPagination.pageSize))) { - this.localPagination.hideOnSinglePage = true - } - } catch (e) { - this.localPagination = false - } - console.log('loadData -> this.localPagination', this.localPagination) - this.localDataSource = r.data // 返回结果中的数组数据 - this.localLoading = false - }) -``` -返回 JSON 例子: -```json -{ - "message": "", - "result": { - "data": [{ - id: 1, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', - title: 'Alipay', - description: '那是一种内在的东西, 他们到达不了,也无法触及的', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 2, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', - title: 'Angular', - description: '希望是一个好东西,也许是最好的,好东西是不会消亡的', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 3, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', - title: 'Ant Design', - description: '城镇中有那么多的酒馆,她却偏偏走进了我的酒馆', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 4, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', - title: 'Ant Design Pro', - description: '那时候我只会想自己想要什么,从不想自己拥有什么', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 5, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', - title: 'Bootstrap', - description: '凛冬将至', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 6, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png', - title: 'Vue', - description: '生命就像一盒巧克力,结果往往出人意料', - status: 1, - updatedAt: '2018-07-26 00:00:00' - } - ], - "pageSize": 10, - "pageNo": 0, - "totalPage": 6, - "totalCount": 57 - }, - "status": 200, - "timestamp": 1534955098193 -} -``` - - - -更新时间 ----- - -该文档最后更新于: 2019-06-23 PM 17:19 \ No newline at end of file diff --git a/quantdinger_vue/src/components/Table/index.js b/quantdinger_vue/src/components/Table/index.js deleted file mode 100644 index a407a41..0000000 --- a/quantdinger_vue/src/components/Table/index.js +++ /dev/null @@ -1,325 +0,0 @@ -import T from 'ant-design-vue/es/table/Table' -import get from 'lodash.get' - -export default { - data () { - return { - needTotalList: [], - - selectedRows: [], - selectedRowKeys: [], - - localLoading: false, - localDataSource: [], - localPagination: Object.assign({}, this.pagination), - - // 存储表格onchange时的filters, sorter对象 - filters: {}, - sorter: {} - } - }, - props: Object.assign({}, T.props, { - rowKey: { - type: [String, Function], - default: 'key' - }, - data: { - type: Function, - required: true - }, - pageNum: { - type: Number, - default: 1 - }, - pageSize: { - type: Number, - default: 10 - }, - showSizeChanger: { - type: Boolean, - default: true - }, - size: { - type: String, - default: 'default' - }, - /** - * alert: { - * show: true, - * clear: Function - * } - */ - alert: { - type: [Object, Boolean], - default: null - }, - rowSelection: { - type: Object, - default: null - }, - /** @Deprecated */ - showAlertInfo: { - type: Boolean, - default: false - }, - showPagination: { - type: String | Boolean, - default: 'auto' - }, - /** - * enable page URI mode - * - * e.g: - * /users/1 - * /users/2 - * /users/3?queryParam=test - * ... - */ - pageURI: { - type: Boolean, - default: false - } - }), - watch: { - 'localPagination.current' (val) { - this.pageURI && this.$router.push({ - ...this.$route, - name: this.$route.name, - params: Object.assign({}, this.$route.params, { - pageNo: val - }) - }) - // change pagination, reset total data - this.needTotalList = this.initTotalList(this.columns) - this.selectedRowKeys = [] - this.selectedRows = [] - }, - pageNum (val) { - Object.assign(this.localPagination, { - current: val - }) - }, - pageSize (val) { - Object.assign(this.localPagination, { - pageSize: val - }) - }, - showSizeChanger (val) { - Object.assign(this.localPagination, { - showSizeChanger: val - }) - } - }, - created () { - const { pageNo } = this.$route.params - const localPageNum = this.pageURI && (pageNo && parseInt(pageNo)) || this.pageNum - this.localPagination = ['auto', true].includes(this.showPagination) && Object.assign({}, this.localPagination, { - current: localPageNum, - pageSize: this.pageSize, - showSizeChanger: this.showSizeChanger - }) || false - this.needTotalList = this.initTotalList(this.columns) - this.loadData() - }, - methods: { - /** - * 表格重新加载方法 - * 如果参数为 true, 则强制刷新到第一页 - * @param Boolean bool - */ - refresh (bool = false) { - bool && (this.localPagination = Object.assign({}, { - current: 1, pageSize: this.pageSize - })) - this.loadData() - }, - /** - * 加载数据方法 - * @param {Object} pagination 分页选项器 - * @param {Object} filters 过滤条件 - * @param {Object} sorter 排序条件 - */ - loadData (pagination, filters = this.filters, sorter = this.sorter) { - this.filters = filters - this.sorter = sorter - - this.localLoading = true - const parameter = Object.assign({ - pageNo: (pagination && pagination.current) || - this.showPagination && this.localPagination.current || this.pageNum, - pageSize: (pagination && pagination.pageSize) || - this.showPagination && this.localPagination.pageSize || this.pageSize - }, - (sorter && sorter.field && { - sortField: sorter.field - }) || {}, - (sorter && sorter.order && { - sortOrder: sorter.order - }) || {}, { - ...filters - } - ) - const result = this.data(parameter) - // 对接自己的通用数据接口需要修改下方代码中的 r.pageNo, r.totalCount, r.data - // eslint-disable-next-line - if ((typeof result === 'object' || typeof result === 'function') && typeof result.then === 'function') { - result.then(r => { - this.localPagination = this.showPagination && Object.assign({}, this.localPagination, { - current: r.pageNo, // 返回结果中的当前分页数 - total: r.totalCount, // 返回结果中的总记录数 - showSizeChanger: this.showSizeChanger, - pageSize: (pagination && pagination.pageSize) || - this.localPagination.pageSize - }) || false - // 为防止删除数据后导致页面当前页面数据长度为 0 ,自动翻页到上一页 - if (r.data.length === 0 && this.showPagination && this.localPagination.current > 1) { - this.localPagination.current-- - this.loadData() - return - } - - // 这里用于判断接口是否有返回 r.totalCount 且 this.showPagination = true 且 pageNo 和 pageSize 存在 且 totalCount 小于等于 pageNo * pageSize 的大小 - // 当情况满足时,表示数据不满足分页大小,关闭 table 分页功能 - try { - if ((['auto', true].includes(this.showPagination) && r.totalCount <= (r.pageNo * this.localPagination.pageSize))) { - this.localPagination.hideOnSinglePage = true - } - } catch (e) { - this.localPagination = false - } - this.localDataSource = r.data // 返回结果中的数组数据 - }) - .finally(() => { - this.localLoading = false - }) - } - }, - initTotalList (columns) { - const totalList = [] - columns && columns instanceof Array && columns.forEach(column => { - if (column.needTotal) { - totalList.push({ - ...column, - total: 0 - }) - } - }) - return totalList - }, - /** - * 用于更新已选中的列表数据 total 统计 - * @param selectedRowKeys - * @param selectedRows - */ - updateSelect (selectedRowKeys, selectedRows) { - this.selectedRows = selectedRows - this.selectedRowKeys = selectedRowKeys - const list = this.needTotalList - this.needTotalList = list.map(item => { - return { - ...item, - total: selectedRows.reduce((sum, val) => { - const total = sum + parseInt(get(val, item.dataIndex)) - return isNaN(total) ? 0 : total - }, 0) - } - }) - }, - /** - * 清空 table 已选中项 - */ - clearSelected () { - if (this.rowSelection) { - this.rowSelection.onChange([], []) - this.updateSelect([], []) - } - }, - /** - * 处理交给 table 使用者去处理 clear 事件时,内部选中统计同时调用 - * @param callback - * @returns {*} - */ - renderClear (callback) { - if (this.selectedRowKeys.length <= 0) return null - return ( - { - callback() - this.clearSelected() - }}>清空 - ) - }, - renderAlert () { - // 绘制统计列数据 - const needTotalItems = this.needTotalList.map((item) => { - return ( - {item.title}总计 {!item.customRender ? item.total : item.customRender(item.total)} - ) - }) - - // 绘制 清空 按钮 - const clearItem = (typeof this.alert.clear === 'boolean' && this.alert.clear) ? ( - this.renderClear(this.clearSelected) - ) : (this.alert !== null && typeof this.alert.clear === 'function') ? ( - this.renderClear(this.alert.clear) - ) : null - - // 绘制 alert 组件 - return ( - - - - ) - } - }, - - render () { - const props = {} - const localKeys = Object.keys(this.$data) - const showAlert = (typeof this.alert === 'object' && this.alert !== null && this.alert.show) && typeof this.rowSelection.selectedRowKeys !== 'undefined' || this.alert - - Object.keys(T.props).forEach(k => { - const localKey = `local${k.substring(0, 1).toUpperCase()}${k.substring(1)}` - if (localKeys.includes(localKey)) { - props[k] = this[localKey] - return props[k] - } - if (k === 'rowSelection') { - if (showAlert && this.rowSelection) { - // 如果需要使用alert,则重新绑定 rowSelection 事件 - props[k] = { - ...this.rowSelection, - selectedRows: this.selectedRows, - selectedRowKeys: this.selectedRowKeys, - onChange: (selectedRowKeys, selectedRows) => { - this.updateSelect(selectedRowKeys, selectedRows) - typeof this[k].onChange !== 'undefined' && this[k].onChange(selectedRowKeys, selectedRows) - } - } - return props[k] - } else if (!this.rowSelection) { - // 如果没打算开启 rowSelection 则清空默认的选择项 - props[k] = null - return props[k] - } - } - this[k] && (props[k] = this[k]) - return props[k] - }) - const table = ( - { this.$emit('expand', expanded, record) } }> - { Object.keys(this.$slots).map(name => ()) } - - ) - - return ( -
    - { showAlert ? this.renderAlert() : null } - { table } -
    - ) - } -} diff --git a/quantdinger_vue/src/components/TagSelect/TagSelectOption.jsx b/quantdinger_vue/src/components/TagSelect/TagSelectOption.jsx deleted file mode 100644 index b5ae799..0000000 --- a/quantdinger_vue/src/components/TagSelect/TagSelectOption.jsx +++ /dev/null @@ -1,45 +0,0 @@ -import { Tag } from 'ant-design-vue' -const { CheckableTag } = Tag - -export default { - name: 'TagSelectOption', - props: { - prefixCls: { - type: String, - default: 'ant-pro-tag-select-option' - }, - value: { - type: [String, Number, Object], - default: '' - }, - checked: { - type: Boolean, - default: false - } - }, - data () { - return { - localChecked: this.checked || false - } - }, - watch: { - 'checked' (val) { - this.localChecked = val - }, - '$parent.items': { - handler: function (val) { - this.value && val.hasOwnProperty(this.value) && (this.localChecked = val[this.value]) - }, - deep: true - } - }, - render () { - const { $slots, value } = this - const onChange = (checked) => { - this.$emit('change', { value, checked }) - } - return ( - {$slots.default} - ) - } -} diff --git a/quantdinger_vue/src/components/TagSelect/index.jsx b/quantdinger_vue/src/components/TagSelect/index.jsx deleted file mode 100644 index af98ad7..0000000 --- a/quantdinger_vue/src/components/TagSelect/index.jsx +++ /dev/null @@ -1,113 +0,0 @@ -import PropTypes from 'ant-design-vue/es/_util/vue-types' -import Option from './TagSelectOption.jsx' -import { filterEmpty } from '@/components/_util/util' - -export default { - Option, - name: 'TagSelect', - model: { - prop: 'checked', - event: 'change' - }, - props: { - prefixCls: { - type: String, - default: 'ant-pro-tag-select' - }, - defaultValue: { - type: PropTypes.array, - default: null - }, - value: { - type: PropTypes.array, - default: null - }, - expandable: { - type: Boolean, - default: false - }, - hideCheckAll: { - type: Boolean, - default: false - } - }, - data () { - return { - expand: false, - localCheckAll: false, - items: this.getItemsKey(filterEmpty(this.$slots.default)), - val: this.value || this.defaultValue || [] - } - }, - methods: { - onChange (checked) { - const key = Object.keys(this.items).filter(key => key === checked.value) - this.items[key] = checked.checked - const bool = Object.values(this.items).lastIndexOf(false) - if (bool === -1) { - this.localCheckAll = true - } else { - this.localCheckAll = false - } - }, - onCheckAll (checked) { - Object.keys(this.items).forEach(v => { - this.items[v] = checked.checked - }) - this.localCheckAll = checked.checked - }, - getItemsKey (items) { - const totalItem = {} - items.forEach(item => { - totalItem[item.componentOptions.propsData && item.componentOptions.propsData.value] = false - }) - return totalItem - }, - // CheckAll Button - renderCheckAll () { - const props = { - on: { - change: (checked) => { - this.onCheckAll(checked) - checked.value = 'total' - this.$emit('change', checked) - } - } - } - const checkAllElement = - return !this.hideCheckAll && checkAllElement || null - }, - // expandable - renderExpandable () { - - }, - // render option - renderTags (items) { - const listeners = { - change: (checked) => { - this.onChange(checked) - this.$emit('change', checked) - } - } - - return items.map(vnode => { - const options = vnode.componentOptions - options.listeners = listeners - return vnode - }) - } - }, - render () { - const { $props: { prefixCls } } = this - const classString = { - [`${prefixCls}`]: true - } - const tagItems = filterEmpty(this.$slots.default) - return ( -
    - {this.renderCheckAll()} - {this.renderTags(tagItems)} -
    - ) - } -} diff --git a/quantdinger_vue/src/components/TextArea/index.jsx b/quantdinger_vue/src/components/TextArea/index.jsx deleted file mode 100644 index 1aa63ae..0000000 --- a/quantdinger_vue/src/components/TextArea/index.jsx +++ /dev/null @@ -1,67 +0,0 @@ -import './style.less' -import { getStrFullLength, cutStrByFullLength } from '../_util/util' -import Input from 'ant-design-vue/es/input' -const TextArea = Input.TextArea - -export default { - name: 'LimitTextArea', - model: { - prop: 'value', - event: 'change' - }, - props: Object.assign({}, TextArea.props, { - prefixCls: { - type: String, - default: 'ant-textarea-limit' - }, - // eslint-disable-next-line - value: { - type: String - }, - limit: { - type: Number, - default: 200 - } - }), - data () { - return { - currentLimit: 0 - } - }, - watch: { - value (val) { - this.calcLimitNum(val) - } - }, - created () { - this.calcLimitNum(this.value) - }, - methods: { - handleChange (e) { - const value = e.target.value - const len = getStrFullLength(value) - if (len <= this.limit) { - this.currentLimit = len - this.$emit('change', value) - } else { - const str = cutStrByFullLength(value, this.limit) - this.currentLimit = getStrFullLength(str) - this.$emit('change', str) - } - }, - calcLimitNum (val) { - const len = getStrFullLength(val) - this.currentLimit = len - } - }, - render () { - const { prefixCls, ...props } = this.$props - return ( -
    - - {this.currentLimit}/{this.limit} -
    - ) - } -} diff --git a/quantdinger_vue/src/components/TextArea/style.less b/quantdinger_vue/src/components/TextArea/style.less deleted file mode 100644 index ba544bf..0000000 --- a/quantdinger_vue/src/components/TextArea/style.less +++ /dev/null @@ -1,12 +0,0 @@ -.ant-textarea-limit { - position: relative; - - .limit { - position: absolute; - right: 10px; - bottom: 5px; - font-size: 12px; - color: #909399; - background: #fff; - } -} diff --git a/quantdinger_vue/src/components/Tree/Tree.jsx b/quantdinger_vue/src/components/Tree/Tree.jsx deleted file mode 100644 index e5a2a11..0000000 --- a/quantdinger_vue/src/components/Tree/Tree.jsx +++ /dev/null @@ -1,124 +0,0 @@ -import { Menu, Icon, Input } from 'ant-design-vue' - -const { Item, ItemGroup, SubMenu } = Menu -const { Search } = Input - -export default { - name: 'Tree', - props: { - dataSource: { - type: Array, - required: true - }, - openKeys: { - type: Array, - default: () => [] - }, - search: { - type: Boolean, - default: false - } - }, - created () { - this.localOpenKeys = this.openKeys.slice(0) - }, - data () { - return { - localOpenKeys: [] - } - }, - methods: { - handlePlus (item) { - this.$emit('add', item) - }, - handleTitleClick (...args) { - this.$emit('titleClick', { args }) - }, - - renderSearch () { - return ( - - ) - }, - renderIcon (icon) { - return icon && () || null - }, - renderMenuItem (item) { - return ( - - { this.renderIcon(item.icon) } - { item.title } - this.handlePlus(item) } }}> - - ) - }, - renderItem (item) { - return item.children ? this.renderSubItem(item, item.key) : this.renderMenuItem(item, item.key) - }, - renderItemGroup (item) { - const childrenItems = item.children.map(o => { - return this.renderItem(o, o.key) - }) - - return ( - - - { childrenItems } - - ) - }, - renderSubItem (item, key) { - const childrenItems = item.children && item.children.map(o => { - return this.renderItem(o, o.key) - }) - - const title = ( - - { this.renderIcon(item.icon) } - { item.title } - - ) - - if (item.group) { - return this.renderItemGroup(item) - } - // titleClick={this.handleTitleClick(item)} - return ( - - { title } - { childrenItems } - - ) - } - }, - render () { - const { dataSource, search } = this.$props - - // this.localOpenKeys = openKeys.slice(0) - const list = dataSource.map(item => { - return this.renderItem(item) - }) - - return ( -
    - { search ? this.renderSearch() : null } - this.$emit('click', item), 'update:openKeys': val => { this.localOpenKeys = val } } }} openKeys={this.localOpenKeys}> - { list } - -
    - ) - } -} diff --git a/quantdinger_vue/src/components/Trend/Trend.vue b/quantdinger_vue/src/components/Trend/Trend.vue deleted file mode 100644 index 526e1cc..0000000 --- a/quantdinger_vue/src/components/Trend/Trend.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Trend/index.js b/quantdinger_vue/src/components/Trend/index.js deleted file mode 100644 index 9f14228..0000000 --- a/quantdinger_vue/src/components/Trend/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import Trend from './Trend.vue' - -export default Trend diff --git a/quantdinger_vue/src/components/Trend/index.less b/quantdinger_vue/src/components/Trend/index.less deleted file mode 100644 index d02ac16..0000000 --- a/quantdinger_vue/src/components/Trend/index.less +++ /dev/null @@ -1,44 +0,0 @@ -@import '../index'; - -@trend-prefix-cls: ~"@{ant-pro-prefix}-trend"; - -.@{trend-prefix-cls} { - display: inline-block; - font-size: @font-size-base; - line-height: 22px; - - .up, - .down { - position: relative; - top: 1px; - margin-left: 4px; - - i { - font-size: 12px; - transform: scale(.83); - } - } - - .item-text { - display: inline-block; - margin-left: 8px; - color: rgb(0 0 0 / 85%); - } - - .up { - color: @red-6; - } - - .down { - top: -1px; - color: @green-6; - } - - &.reverse-color .up { - color: @green-6; - } - - &.reverse-color .down { - color: @red-6; - } -} diff --git a/quantdinger_vue/src/components/Trend/index.md b/quantdinger_vue/src/components/Trend/index.md deleted file mode 100644 index 8881f0e..0000000 --- a/quantdinger_vue/src/components/Trend/index.md +++ /dev/null @@ -1,45 +0,0 @@ -# Trend 趋势标记 - -趋势符号,标记上升和下降趋势。通常用绿色代表“好”,红色代表“不好”,股票涨跌场景除外。 - - - -引用方式: - -```javascript -import Trend from '@/components/Trend' - -export default { - components: { - Trend - } -} -``` - - - -## 代码演示 [demo](https://pro.loacg.com/test/home) - -```html -5% -``` -或 -```html - - 工资 - 5% - -``` -或 -```html -5% -``` - - -## API - -| 参数 | 说明 | 类型 | 默认值 | -|----------|------------------------------------------|-------------|-------| -| flag | 上升下降标识:`up|down` | string | - | -| reverseColor | 颜色反转 | Boolean | false | - diff --git a/quantdinger_vue/src/components/Turnstile/index.vue b/quantdinger_vue/src/components/Turnstile/index.vue deleted file mode 100644 index 2444cd2..0000000 --- a/quantdinger_vue/src/components/Turnstile/index.vue +++ /dev/null @@ -1,199 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/_util/util.js b/quantdinger_vue/src/components/_util/util.js deleted file mode 100644 index dd33231..0000000 --- a/quantdinger_vue/src/components/_util/util.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * components util - */ - -/** - * 清理空值,对象 - * @param children - * @returns {*[]} - */ -export function filterEmpty (children = []) { - return children.filter(c => c.tag || (c.text && c.text.trim() !== '')) -} - -/** - * 获取字符串长度,英文字符 长度1,中文字符长度2 - * @param {*} str - */ -export const getStrFullLength = (str = '') => - str.split('').reduce((pre, cur) => { - const charCode = cur.charCodeAt(0) - if (charCode >= 0 && charCode <= 128) { - return pre + 1 - } - return pre + 2 - }, 0) - -/** - * 截取字符串,根据 maxLength 截取后返回 - * @param {*} str - * @param {*} maxLength - */ -export const cutStrByFullLength = (str = '', maxLength) => { - let showLength = 0 - return str.split('').reduce((pre, cur) => { - const charCode = cur.charCodeAt(0) - if (charCode >= 0 && charCode <= 128) { - showLength += 1 - } else { - showLength += 2 - } - if (showLength <= maxLength) { - return pre + cur - } - return pre - }, '') -} diff --git a/quantdinger_vue/src/components/index.js b/quantdinger_vue/src/components/index.js deleted file mode 100644 index 401ae0d..0000000 --- a/quantdinger_vue/src/components/index.js +++ /dev/null @@ -1,56 +0,0 @@ -// chart -import Bar from '@/components/Charts/Bar' -import ChartCard from '@/components/Charts/ChartCard' -import Liquid from '@/components/Charts/Liquid' -import MiniArea from '@/components/Charts/MiniArea' -import MiniSmoothArea from '@/components/Charts/MiniSmoothArea' -import MiniBar from '@/components/Charts/MiniBar' -import MiniProgress from '@/components/Charts/MiniProgress' -import Radar from '@/components/Charts/Radar' -import RankList from '@/components/Charts/RankList' -import TransferBar from '@/components/Charts/TransferBar' -import TagCloud from '@/components/Charts/TagCloud' - -// pro components -import AvatarList from '@/components/AvatarList' -import Ellipsis from '@/components/Ellipsis' -import FooterToolbar from '@/components/FooterToolbar' -import NumberInfo from '@/components/NumberInfo' -import Tree from '@/components/Tree/Tree' -import Trend from '@/components/Trend' -import STable from '@/components/Table' -import MultiTab from '@/components/MultiTab' -import IconSelector from '@/components/IconSelector' -import TagSelect from '@/components/TagSelect' -import StandardFormRow from '@/components/StandardFormRow' -import ArticleListContent from '@/components/ArticleListContent' - -import Dialog from '@/components/Dialog' - -export { - AvatarList, - Bar, - ChartCard, - Liquid, - MiniArea, - MiniSmoothArea, - MiniBar, - MiniProgress, - Radar, - TagCloud, - RankList, - TransferBar, - Trend, - Ellipsis, - FooterToolbar, - NumberInfo, - Tree, - STable, - MultiTab, - IconSelector, - TagSelect, - StandardFormRow, - ArticleListContent, - - Dialog -} diff --git a/quantdinger_vue/src/components/index.less b/quantdinger_vue/src/components/index.less deleted file mode 100644 index 01ef050..0000000 --- a/quantdinger_vue/src/components/index.less +++ /dev/null @@ -1,6 +0,0 @@ -@import '~ant-design-vue/lib/style/index'; - -// The prefix to use on all css classes from ant-pro. -@ant-pro-prefix : ant-pro; -@ant-global-sider-zindex : 106; -@ant-global-header-zindex : 105; diff --git a/quantdinger_vue/src/components/tools/TwoStepCaptcha.vue b/quantdinger_vue/src/components/tools/TwoStepCaptcha.vue deleted file mode 100644 index 638489c..0000000 --- a/quantdinger_vue/src/components/tools/TwoStepCaptcha.vue +++ /dev/null @@ -1,102 +0,0 @@ - - - - diff --git a/quantdinger_vue/src/config/aiModels.js b/quantdinger_vue/src/config/aiModels.js deleted file mode 100644 index cfb3e4c..0000000 --- a/quantdinger_vue/src/config/aiModels.js +++ /dev/null @@ -1,41 +0,0 @@ -// Unified AI model support list for frontend. -// Model IDs follow OpenRouter-style `provider/model` naming. - -export const DEFAULT_AI_MODEL_MAP = { - 'x-ai/grok-code-fast-1': 'xAI: Grok Code Fast 1', - 'x-ai/grok-4-fast': 'xAI: Grok 4 Fast', - 'x-ai/grok-4.1-fast': 'xAI: Grok 4.1 Fast', - 'google/gemini-2.5-flash': 'Google: Gemini 2.5 Flash', - 'google/gemini-2.0-flash-001': 'Google: Gemini 2.0 Flash', - 'google/gemini-3-pro-preview': 'Google: Gemini 3 Pro Preview', - 'google/gemini-2.5-flash-lite': 'Google: Gemini 2.5 Flash Lite', - 'google/gemini-2.5-pro': 'Google: Gemini 2.5 Pro', - 'openai/gpt-4o-mini': 'OpenAI: GPT-4o-mini', - 'openai/gpt-5-mini': 'OpenAI: GPT-5 Mini', - 'openai/gpt-oss-120b': 'OpenAI: gpt-oss-120b', - 'deepseek/deepseek-v3.2': 'DeepSeek: DeepSeek V3.2', - 'minimax/minimax-m2': 'MiniMax: MiniMax M2', - 'anthropic/claude-sonnet-4': 'Anthropic: Claude Sonnet 4', - 'anthropic/claude-sonnet-4.5': 'Anthropic: Claude Sonnet 4.5', - 'anthropic/claude-opus-4.5': 'Anthropic: Claude Opus 4.5', - 'anthropic/claude-haiku-4.5': 'Anthropic: Claude Haiku 4.5', - 'z-ai/glm-4.6': 'Z.AI: GLM 4.6' -} - -export function isPlainObject (val) { - return val !== null && typeof val === 'object' && !Array.isArray(val) -} - -export function mergeModelMaps (baseMap, overrideMap) { - const base = isPlainObject(baseMap) ? baseMap : {} - const override = isPlainObject(overrideMap) ? overrideMap : {} - return { ...base, ...override } -} - -export function modelMapToOptions (modelMap) { - const map = isPlainObject(modelMap) ? modelMap : {} - return Object.keys(map).map(key => ({ - value: key, - label: map[key] - })) -} diff --git a/quantdinger_vue/src/config/defaultSettings.js b/quantdinger_vue/src/config/defaultSettings.js deleted file mode 100644 index 7e4e629..0000000 --- a/quantdinger_vue/src/config/defaultSettings.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * 项目默认配置项 - * primaryColor - 默认主题色, 如果修改颜色不生效,请清理 localStorage - * navTheme - sidebar theme ['dark', 'light'] 两种主题 - * colorWeak - 色盲模式 - * layout - 整体布局方式 ['sidemenu', 'topmenu'] 两种布局 - * fixedHeader - 固定 Header : boolean - * fixSiderbar - 固定左侧菜单栏 : boolean - * contentWidth - 内容区布局: 流式 | 固定 - * - * storageOptions: {} - Vue-ls 插件配置项 (localStorage/sessionStorage) - * - */ - -export const PYTHON_API_BASE_URL = process.env.VUE_APP_PYTHON_API_BASE_URL || 'http://localhost:5000' - -export default { - navTheme: 'light', // theme for nav menu - primaryColor: '#13C2C2', // '#F5222D', // primary color of ant design - layout: 'sidemenu', // nav menu position: `sidemenu` or `topmenu` - contentWidth: 'Fluid', // layout of content: `Fluid` or `Fixed`, only works when layout is topmenu - fixedHeader: true, // sticky header - 固定顶部导航栏 - fixSiderbar: true, // sticky siderbar - 固定左侧边栏 - colorWeak: false, - menu: { - locale: true - }, - title: 'QuantDinger', - pwa: false, - iconfontUrl: '', - production: process.env.NODE_ENV === 'production' && process.env.VUE_APP_PREVIEW !== 'true' - -} diff --git a/quantdinger_vue/src/config/router.config.js b/quantdinger_vue/src/config/router.config.js deleted file mode 100644 index 3ae59a2..0000000 --- a/quantdinger_vue/src/config/router.config.js +++ /dev/null @@ -1,170 +0,0 @@ -// eslint-disable-next-line -import { UserLayout, BasicLayout, BlankLayout } from '@/layouts' - -export const asyncRouterMap = [ - { - path: '/', - name: 'index', - component: BasicLayout, - meta: { title: 'menu.home' }, - redirect: '/dashboard', - children: [ - // 仪表盘 - { - path: '/dashboard', - name: 'Dashboard', - component: () => import('@/views/dashboard'), - meta: { title: 'menu.dashboard', keepAlive: true, icon: 'dashboard', permission: ['dashboard'] } - }, - // AI 分析 - { - path: '/ai-analysis/:pageNo([1-9]\\d*)?', - name: 'Analysis', - component: () => import('@/views/ai-analysis'), - meta: { title: 'menu.dashboard.analysis', keepAlive: false, icon: 'thunderbolt', permission: ['dashboard'] } - }, - // 指标分析 - { - path: '/indicator-analysis', - name: 'Indicator', - component: () => import('@/views/indicator-analysis'), - meta: { title: 'menu.dashboard.indicator', keepAlive: true, icon: 'line-chart', permission: ['dashboard'] } - }, - // 交易助手 - { - path: '/trading-assistant', - name: 'TradingAssistant', - component: () => import('@/views/trading-assistant'), - meta: { title: 'menu.dashboard.tradingAssistant', keepAlive: true, icon: 'robot', permission: ['dashboard'] } - }, - // 资产监测 - { - path: '/portfolio', - name: 'Portfolio', - component: () => import('@/views/portfolio'), - meta: { title: 'menu.dashboard.portfolio', keepAlive: true, icon: 'fund', permission: ['dashboard'] } - }, - // 指标社区(keepAlive disabled intentionally for iframe page) - { - path: '/indicator-community', - name: 'IndicatorCommunity', - component: () => import('@/views/indicator-community'), - meta: { title: 'menu.dashboard.community', keepAlive: false, icon: 'shop', permission: ['dashboard'] } - }, - // 系统设置 (admin only) - { - path: '/settings', - name: 'Settings', - component: () => import('@/views/settings'), - meta: { title: 'menu.settings', keepAlive: false, icon: 'setting', permission: ['admin'] } - }, - // 用户管理 (admin only) - { - path: '/user-manage', - name: 'UserManage', - component: () => import('@/views/user-manage'), - meta: { title: 'menu.userManage', keepAlive: false, icon: 'team', permission: ['admin'] } - }, - // 个人中心 - { - path: '/profile', - name: 'Profile', - component: () => import('@/views/profile'), - meta: { title: 'menu.myProfile', keepAlive: false, icon: 'user', permission: ['dashboard'] } - } - - // other - /* - { - path: '/other', - name: 'otherPage', - component: PageView, - meta: { title: '其他组件', icon: 'slack', permission: [ 'dashboard' ] }, - redirect: '/other/icon-selector', - children: [ - { - path: '/other/icon-selector', - name: 'TestIconSelect', - component: () => import('@/views/other/IconSelectorView'), - meta: { title: 'IconSelector', icon: 'tool', keepAlive: true, permission: [ 'dashboard' ] } - }, - { - path: '/other/list', - component: RouteView, - meta: { title: '业务布局', icon: 'layout', permission: [ 'support' ] }, - redirect: '/other/list/tree-list', - children: [ - { - path: '/other/list/tree-list', - name: 'TreeList', - component: () => import('@/views/other/TreeList'), - meta: { title: '树目录表格', keepAlive: true } - }, - { - path: '/other/list/edit-table', - name: 'EditList', - component: () => import('@/views/other/TableInnerEditList'), - meta: { title: '内联编辑表格', keepAlive: true } - }, - { - path: '/other/list/user-list', - name: 'UserList', - component: () => import('@/views/other/UserList'), - meta: { title: '用户列表', keepAlive: true } - }, - { - path: '/other/list/role-list', - name: 'RoleList', - component: () => import('@/views/other/RoleList'), - meta: { title: '角色列表', keepAlive: true } - }, - { - path: '/other/list/system-role', - name: 'SystemRole', - component: () => import('@/views/role/RoleList'), - meta: { title: '角色列表2', keepAlive: true } - }, - { - path: '/other/list/permission-list', - name: 'PermissionList', - component: () => import('@/views/other/PermissionList'), - meta: { title: '权限列表', keepAlive: true } - } - ] - } - ] - } - */ - ] - }, - { - path: '*', - redirect: '/404', - hidden: true - } -] - -/** - * 基础路由 - * @type { *[] } - */ -export const constantRouterMap = [ - { - path: '/user', - component: UserLayout, - redirect: '/user/login', - hidden: true, - children: [ - { - path: 'login', - name: 'login', - component: () => import(/* webpackChunkName: "user" */ '@/views/user/Login') - } - ] - }, - - { - path: '/404', - component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/404') - } -] diff --git a/quantdinger_vue/src/core/bootstrap.js b/quantdinger_vue/src/core/bootstrap.js deleted file mode 100644 index 298851c..0000000 --- a/quantdinger_vue/src/core/bootstrap.js +++ /dev/null @@ -1,37 +0,0 @@ -import store from '@/store' -import storage from 'store' -import { - ACCESS_TOKEN, - APP_LANGUAGE, - TOGGLE_CONTENT_WIDTH, - TOGGLE_FIXED_HEADER, - TOGGLE_FIXED_SIDEBAR, TOGGLE_HIDE_HEADER, - TOGGLE_LAYOUT, TOGGLE_NAV_THEME, TOGGLE_WEAK, - TOGGLE_COLOR, TOGGLE_MULTI_TAB -} from '@/store/mutation-types' -import { printANSI } from '@/utils/screenLog' -import defaultSettings from '@/config/defaultSettings' - -export default function Initializer () { - printANSI() // 请自行移除该行. please remove this line - - store.commit(TOGGLE_LAYOUT, storage.get(TOGGLE_LAYOUT, defaultSettings.layout)) - store.commit(TOGGLE_FIXED_HEADER, storage.get(TOGGLE_FIXED_HEADER, defaultSettings.fixedHeader)) - store.commit(TOGGLE_FIXED_SIDEBAR, storage.get(TOGGLE_FIXED_SIDEBAR, defaultSettings.fixSiderbar)) - store.commit(TOGGLE_CONTENT_WIDTH, storage.get(TOGGLE_CONTENT_WIDTH, defaultSettings.contentWidth)) - store.commit(TOGGLE_HIDE_HEADER, storage.get(TOGGLE_HIDE_HEADER, defaultSettings.autoHideHeader)) - store.commit(TOGGLE_NAV_THEME, storage.get(TOGGLE_NAV_THEME, defaultSettings.navTheme)) - store.commit(TOGGLE_WEAK, storage.get(TOGGLE_WEAK, defaultSettings.colorWeak)) - store.commit(TOGGLE_COLOR, storage.get(TOGGLE_COLOR, defaultSettings.primaryColor)) - store.commit(TOGGLE_MULTI_TAB, storage.get(TOGGLE_MULTI_TAB, defaultSettings.multiTab)) - // 处理 token 可能是字符串或对象的情况 - let token = storage.get(ACCESS_TOKEN) - if (token && typeof token !== 'string') { - token = token.token || token.value || (typeof token === 'object' ? null : token) - } - token = typeof token === 'string' ? token : null - store.commit('SET_TOKEN', token) - - store.dispatch('setLang', storage.get(APP_LANGUAGE, 'en-US')) - // last step -} diff --git a/quantdinger_vue/src/core/directives/action.js b/quantdinger_vue/src/core/directives/action.js deleted file mode 100644 index 42563f1..0000000 --- a/quantdinger_vue/src/core/directives/action.js +++ /dev/null @@ -1,34 +0,0 @@ -import Vue from 'vue' -import store from '@/store' - -/** - * Action 权限指令 - * 指令用法: - * - 在需要控制 action 级别权限的组件上使用 v-action:[method] , 如下: - * 添加用户 - * 删除用户 - * 修改 - * - * - 当前用户没有权限时,组件上使用了该指令则会被隐藏 - * - 当后台权限跟 pro 提供的模式不同时,只需要针对这里的权限过滤进行修改即可 - * - * @see https://github.com/vueComponent/ant-design-vue-pro/pull/53 - */ -const action = Vue.directive('action', { - inserted: function (el, binding, vnode) { - const actionName = binding.arg - const roles = store.getters.roles - const elVal = vnode.context.$route.meta.permission - const permissionId = Object.prototype.toString.call(elVal) === '[object String]' && [elVal] || elVal - roles.permissions.forEach(p => { - if (!permissionId.includes(p.permissionId)) { - return - } - if (p.actionList && !p.actionList.includes(actionName)) { - el.parentNode && el.parentNode.removeChild(el) || (el.style.display = 'none') - } - }) - } -}) - -export default action diff --git a/quantdinger_vue/src/core/icons.js b/quantdinger_vue/src/core/icons.js deleted file mode 100644 index 46b7261..0000000 --- a/quantdinger_vue/src/core/icons.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Custom icon list - * All icons are loaded here for easy management - * @see https://vue.ant.design/components/icon/#Custom-Font-Icon - * - * 自定义图标加载表 - * 所有图标均从这里加载,方便管理 - */ -import bxAnaalyse from '@/assets/icons/bx-analyse.svg?inline' // path to your '*.svg?inline' file. - -export { bxAnaalyse } diff --git a/quantdinger_vue/src/core/lazy_use.js b/quantdinger_vue/src/core/lazy_use.js deleted file mode 100644 index 0cfa083..0000000 --- a/quantdinger_vue/src/core/lazy_use.js +++ /dev/null @@ -1,129 +0,0 @@ -import Vue from 'vue' - -// base library -import { - ConfigProvider, - Layout, - Input, - InputNumber, - Button, - Switch, - Radio, - Checkbox, - Select, - Card, - Collapse, - Form, - FormModel, - Row, - Col, - Modal, - Table, - Tabs, - Icon, - Badge, - Popover, - Dropdown, - List, - Avatar, - Breadcrumb, - Steps, - Spin, - Menu, - Drawer, - Tooltip, - Alert, - Tag, - Divider, - DatePicker, - TimePicker, - Upload, - Progress, - Skeleton, - Popconfirm, - PageHeader, - Result, - Statistic, - Descriptions, - Space, - Empty, - Rate, - AutoComplete, - message, - notification -} from 'ant-design-vue' -// import Viser from 'viser-vue' - -// ext library -import VueCropper from 'vue-cropper' -import Dialog from '@/components/Dialog' -import MultiTab from '@/components/MultiTab' -import PageLoading from '@/components/PageLoading' -import PermissionHelper from '@/core/permission/permission' -import './directives/action' - -Vue.use(ConfigProvider) -Vue.use(Layout) -Vue.use(Input) -Vue.use(InputNumber) -Vue.use(Button) -Vue.use(Switch) -Vue.use(Radio) -Vue.use(Checkbox) -Vue.use(Select) -Vue.use(Card) -Vue.use(Collapse) -Vue.use(Form) -Vue.use(FormModel) -Vue.use(Row) -Vue.use(Col) -Vue.use(Modal) -Vue.use(Table) -Vue.use(Tabs) -Vue.use(Icon) -Vue.use(Badge) -Vue.use(Popover) -Vue.use(Dropdown) -Vue.use(List) -Vue.use(Avatar) -Vue.use(Breadcrumb) -Vue.use(Steps) -Vue.use(Spin) -Vue.use(Menu) -Vue.use(Drawer) -Vue.use(Tooltip) -Vue.use(Alert) -Vue.use(Tag) -Vue.use(Divider) -Vue.use(DatePicker) -Vue.use(TimePicker) -Vue.use(Upload) -Vue.use(Progress) -Vue.use(Skeleton) -Vue.use(Popconfirm) -Vue.use(PageHeader) -Vue.use(Result) -Vue.use(Statistic) -Vue.use(Descriptions) -Vue.use(Space) -Vue.use(Empty) -Vue.use(Rate) -Vue.use(AutoComplete) -// Textarea 是 Input 组件的一部分,通过 Vue.use(Input) 已自动注册 - -Vue.prototype.$confirm = Modal.confirm -Vue.prototype.$message = message -Vue.prototype.$notification = notification -Vue.prototype.$info = Modal.info -Vue.prototype.$success = Modal.success -Vue.prototype.$error = Modal.error -Vue.prototype.$warning = Modal.warning - -// Vue.use(Viser) -Vue.use(Dialog) // this.$dialog func -Vue.use(MultiTab) -Vue.use(PageLoading) -Vue.use(PermissionHelper) -Vue.use(VueCropper) - -process.env.NODE_ENV !== 'production' && console.warn('[antd-pro] NOTICE: Antd use lazy-load.') diff --git a/quantdinger_vue/src/core/permission/permission.js b/quantdinger_vue/src/core/permission/permission.js deleted file mode 100644 index fb69844..0000000 --- a/quantdinger_vue/src/core/permission/permission.js +++ /dev/null @@ -1,55 +0,0 @@ -export const PERMISSION_ENUM = { - 'add': { key: 'add', label: '新增' }, - 'delete': { key: 'delete', label: '删除' }, - 'edit': { key: 'edit', label: '修改' }, - 'query': { key: 'query', label: '查询' }, - 'get': { key: 'get', label: '详情' }, - 'enable': { key: 'enable', label: '启用' }, - 'disable': { key: 'disable', label: '禁用' }, - 'import': { key: 'import', label: '导入' }, - 'export': { key: 'export', label: '导出' } -} - -/** - * Button - * @param Vue - */ -function plugin (Vue) { - if (plugin.installed) { - return - } - - !Vue.prototype.$auth && Object.defineProperties(Vue.prototype, { - $auth: { - get () { - const _this = this - return (permissions) => { - const [permission, action] = permissions.split('.') - const permissionList = _this.$store.getters.roles.permissions - return permissionList.find((val) => { - return val.permissionId === permission - }).actionList.findIndex((val) => { - return val === action - }) > -1 - } - } - } - }) - - !Vue.prototype.$enum && Object.defineProperties(Vue.prototype, { - $enum: { - get () { - // const _this = this; - return (val) => { - let result = PERMISSION_ENUM - val && val.split('.').forEach(v => { - result = result && result[v] || null - }) - return result - } - } - } - }) -} - -export default plugin diff --git a/quantdinger_vue/src/core/use.js b/quantdinger_vue/src/core/use.js deleted file mode 100644 index d98cd16..0000000 --- a/quantdinger_vue/src/core/use.js +++ /dev/null @@ -1,27 +0,0 @@ -import Vue from 'vue' - -// base library -import Antd from 'ant-design-vue' -import Viser from 'viser-vue' -import VueCropper from 'vue-cropper' -import 'ant-design-vue/dist/antd.less' - -// ext library -import VueClipboard from 'vue-clipboard2' -import MultiTab from '@/components/MultiTab' -import PageLoading from '@/components/PageLoading' -import PermissionHelper from '@/core/permission/permission' -// import '@/components/use' -import './directives/action' - -VueClipboard.config.autoSetContainer = true - -Vue.use(Antd) -Vue.use(Viser) -Vue.use(MultiTab) -Vue.use(PageLoading) -Vue.use(VueClipboard) -Vue.use(PermissionHelper) -Vue.use(VueCropper) - -process.env.NODE_ENV !== 'production' && console.warn('[antd-pro] WARNING: Antd now use fulled imported.') diff --git a/quantdinger_vue/src/global.less b/quantdinger_vue/src/global.less deleted file mode 100644 index 680736d..0000000 --- a/quantdinger_vue/src/global.less +++ /dev/null @@ -1,117 +0,0 @@ -@import '~ant-design-vue/es/style/themes/default.less'; - -html, -body, -#app, -#root { - height: 100%; -} - -.colorWeak { - filter: invert(80%); -} - -.ant-layout.layout-basic { - height: 100vh; - min-height: 100vh; -} - -canvas { - display: block; -} - -body { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - text-rendering: optimizelegibility; -} - -ul, -ol { - list-style: none; -} - -// 数据列表 样式 -.table-alert { - margin-bottom: 16px; -} -// 数据列表 操作 -.table-operator { - margin-bottom: 18px; - - button { - margin-right: 8px; - } -} -// 数据列表 搜索条件 -.table-page-search-wrapper { - .ant-form-inline { - .ant-form-item { - display: flex; - margin-right: 0; - margin-bottom: 24px; - - .ant-form-item-control-wrapper { - flex: 1 1; - display: inline-block; - vertical-align: middle; - } - - > .ant-form-item-label { - width: auto; - padding-right: 8px; - line-height: 32px; - } - - .ant-form-item-control { - height: 32px; - line-height: 32px; - } - } - } - - .table-page-search-submitButtons { - display: block; - margin-bottom: 24px; - white-space: nowrap; - } -} - -@media (max-width: @screen-xs) { - .ant-table { - width: 100%; - overflow-x: auto; - - &-thead > tr, - &-tbody > tr { - > th, - > td { - white-space: pre; - - > span { - display: block; - } - } - } - } -} - -// Hide noisy webpack dev server overlay on mobile (ResizeObserver loop warnings) -#webpack-dev-server-client-overlay, -#webpack-hot-middleware-client-overlay, -.webpack-dev-server-client-overlay { - display: none !important; - pointer-events: none !important; - visibility: hidden !important; -} - -// 手机端强制覆盖 logo padding -@media (max-width: 768px) { - .ant-pro-global-header-logo { - padding: 0 !important; - padding-left: 0 !important; - padding-right: 0 !important; - padding-top: 0 !important; - padding-bottom: 0 !important; - } -} \ No newline at end of file diff --git a/quantdinger_vue/src/layouts/BasicLayout.less b/quantdinger_vue/src/layouts/BasicLayout.less deleted file mode 100644 index 81f02ff..0000000 --- a/quantdinger_vue/src/layouts/BasicLayout.less +++ /dev/null @@ -1,423 +0,0 @@ -@import '~ant-design-vue/es/style/themes/default.less'; - -/* ========== 完全隐藏 ant-layout-footer ========== */ -:global { - /* 全局隐藏所有 ant-layout-footer */ - .ant-layout-footer, - footer.ant-layout-footer, - .ant-pro-layout .ant-layout-footer, - .ant-layout .ant-layout-footer { - display: none !important; - height: 0 !important; - padding: 0 !important; - margin: 0 !important; - border: none !important; - min-height: 0 !important; - visibility: hidden !important; - overflow: hidden !important; - } -} - -/* ========== ant-layout-header 主题适配 ========== */ -/* 全局样式:根据 body 或 layout 的主题类自动适配 */ -:global { - /* 暗黑主题下的 ant-layout-header */ - body.dark .ant-layout-header, - body.realdark .ant-layout-header, - .ant-layout.dark .ant-layout-header, - .ant-layout.realdark .ant-layout-header, - .ant-pro-layout.dark .ant-layout-header, - .ant-pro-layout.realdark .ant-layout-header { - background: #001529 !important; - border-bottom: 1px solid #1f1f1f !important; - box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08) !important; - color: rgba(255, 255, 255, 0.85) !important; - - /* Header 内的所有文字和图标 */ - * { - color: rgba(255, 255, 255, 0.85) !important; - } - - /* Header 内的图标按钮 */ - .anticon { - color: rgba(255, 255, 255, 0.85) !important; - - &:hover { - color: #1890ff !important; - background: rgba(255, 255, 255, 0.08) !important; - border-radius: 4px; - } - } - - /* Header 内的链接 */ - a { - color: rgba(255, 255, 255, 0.85) !important; - - &:hover { - color: #1890ff !important; - } - } - - /* Header 内的工具提示容器 */ - .ant-tooltip-open { - .anticon { - color: rgba(255, 255, 255, 0.85) !important; - } - } - } - - - /* 浅色主题下的 ant-layout-header(确保覆盖默认样式) */ - body.light .ant-layout-header, - .ant-layout.light .ant-layout-header, - .ant-pro-layout.light .ant-layout-header { - background: #fff !important; - border-bottom: 1px solid #e8e8e8 !important; - box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08) !important; - color: rgba(0, 0, 0, 0.85) !important; - } - - /* ========== ant-layout-content 主题适配(中间页面内容区域) ========== */ - /* 暗黑主题下的内容区域 */ - body.dark .ant-layout-content, - body.realdark .ant-layout-content, - .ant-layout.dark .ant-layout-content, - .ant-layout.realdark .ant-layout-content, - .ant-pro-layout.dark .ant-layout-content, - .ant-pro-layout.realdark .ant-layout-content { - background: #141414 !important; - color: rgba(255, 255, 255, 0.85) !important; - } - - - - /* 浅色主题下的内容区域 */ - body.light .ant-layout-content, - .ant-layout.light .ant-layout-content, - .ant-pro-layout.light .ant-layout-content { - background: #f0f2f5 !important; - color: rgba(0, 0, 0, 0.85) !important; - } - - - - - - /* ========== GlobalHeader 核心样式(基于 .ant-pro-global-header) ========== */ - /* 暗黑主题下的 .ant-pro-global-header - 这是控制顶部标题栏的关键样式 */ - body.dark .ant-pro-global-header, - body.realdark .ant-pro-global-header, - .ant-layout.dark .ant-pro-global-header, - .ant-layout.realdark .ant-pro-global-header, - .ant-pro-layout.dark .ant-pro-global-header, - .ant-pro-layout.realdark .ant-pro-global-header, - body.dark .ant-layout-header .ant-pro-global-header, - body.realdark .ant-layout-header .ant-pro-global-header, - .ant-pro-layout.dark .ant-layout-header .ant-pro-global-header, - .ant-pro-layout.realdark .ant-layout-header .ant-pro-global-header { - /* 核心:背景色和边框 */ - background: #001529 !important; - border-bottom: 1px solid #1f1f1f !important; - box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08) !important; - color: rgba(255, 255, 255, 0.85) !important; - - /* 强制所有子元素文字颜色 */ - * { - color: rgba(255, 255, 255, 0.85) !important; - } - - /* Logo 区域 */ - .ant-pro-global-header-logo { - background: transparent !important; - color: rgba(255, 255, 255, 0.85) !important; - - h1 { - color: rgba(255, 255, 255, 0.85) !important; - } - - img { - opacity: 0.9; - } - - * { - color: rgba(255, 255, 255, 0.85) !important; - } - } - } - - /* Header 内容区域(中间部分,包含刷新按钮等) */ - .ant-pro-global-header-content { - background: transparent !important; - color: rgba(255, 255, 255, 0.85) !important; - - * { - color: rgba(255, 255, 255, 0.85) !important; - } - - /* 刷新按钮等图标 */ - .anticon { - color: rgba(255, 255, 255, 0.85) !important; - - &:hover { - color: #1890ff !important; - background: rgba(255, 255, 255, 0.08) !important; - border-radius: 4px; - } - } - - /* 工具提示内的图标 */ - .ant-tooltip-open .anticon { - color: rgba(255, 255, 255, 0.85) !important; - } - } - - /* Header 右侧内容区域(包含头像、语言选择、设置按钮) */ - .ant-pro-global-header-index-right { - background: transparent !important; - color: rgba(255, 255, 255, 0.85) !important; - - * { - color: rgba(255, 255, 255, 0.85) !important; - } - - /* 操作按钮(头像、语言、设置) */ - .ant-pro-global-header-index-action { - color: rgba(255, 255, 255, 0.85) !important; - - &:hover { - color: #1890ff !important; - background: rgba(255, 255, 255, 0.08) !important; - } - - .anticon { - color: rgba(255, 255, 255, 0.85) !important; - } - } - - /* 头像区域 */ - .ant-pro-account-avatar { - color: rgba(255, 255, 255, 0.85) !important; - - span { - color: rgba(255, 255, 255, 0.85) !important; - } - - .antd-pro-global-header-index-avatar { - background: rgba(255, 255, 255, 0.25) !important; - } - } - - /* 下拉菜单触发器 */ - .ant-pro-drop-down, - .ant-dropdown-trigger { - color: rgba(255, 255, 255, 0.85) !important; - - &:hover { - color: #1890ff !important; - background: rgba(255, 255, 255, 0.08) !important; - } - - .anticon { - color: rgba(255, 255, 255, 0.85) !important; - } - } - } - - /* 链接样式 */ - a { - color: rgba(255, 255, 255, 0.85) !important; - - &:hover { - color: #1890ff !important; - } - } - - /* 所有图标 */ - .anticon { - color: rgba(255, 255, 255, 0.85) !important; - - &:hover { - color: #1890ff !important; - } - } - - /* 浅色主题下的 .ant-pro-global-header */ - body.light .ant-pro-global-header, - .ant-layout.light .ant-pro-global-header, - .ant-pro-layout.light .ant-pro-global-header, - body.light .ant-layout-header .ant-pro-global-header, - .ant-pro-layout.light .ant-layout-header .ant-pro-global-header { - background: #fff !important; - border-bottom: 1px solid #e8e8e8 !important; - color: rgba(0, 0, 0, 0.85) !important; - } -} - -/* ========== 全局布局主题适配 - 强化覆盖 ========== */ -:global(.ant-pro-layout) { - /* 暗黑主题下的完整布局 */ - &.dark, - &.realdark { - /* 0. 基础 Layout 背景 - 确保整体背景变暗 */ - :global(.ant-layout) { - background-color: #001529 !important; - } - - /* 1. 顶部 Header */ - :global(.ant-layout-header) { - background: #001529 !important; - border-bottom: 1px solid #1f1f1f !important; - color: rgba(255, 255, 255, 0.85) !important; - - :global(.ant-pro-global-header) { - background: #001529 !important; - border-bottom: none !important; - color: rgba(255, 255, 255, 0.85) !important; - - * { - color: rgba(255, 255, 255, 0.85) !important; - } - } - } - - /* 2. 中间内容区域 */ - :global(.ant-layout-content) { - background: #141414 !important; - color: rgba(255, 255, 255, 0.85) !important; - } - - :global(.ant-pro-basicLayout-content) { - background: #141414 !important; - color: rgba(255, 255, 255, 0.85) !important; - } - - } - - /* 浅色主题下的完整布局 */ - &.light { - /* 0. 基础 Layout 背景 */ - :global(.ant-layout) { - background-color: #f0f2f5 !important; - } - - /* 1. 顶部 Header */ - :global(.ant-layout-header) { - background: #fff !important; - border-bottom: 1px solid #e8e8e8 !important; - color: rgba(0, 0, 0, 0.85) !important; - } - - /* 2. 中间内容区域 */ - :global(.ant-layout-content) { - background: #f0f2f5 !important; - color: rgba(0, 0, 0, 0.85) !important; - } - - :global(.ant-pro-basicLayout-content) { - background: #f0f2f5 !important; - color: rgba(0, 0, 0, 0.85) !important; - } - - } -} - -.ant-pro-global-header-index-right { - margin-right: 8px; - - &.ant-pro-global-header-index-dark { - .ant-pro-global-header-index-action { - color: hsl(0deg 0% 100% / 85%); - - &:hover { - background: #1890ff; - } - } - - /* 暗黑主题下的头像下拉菜单 */ - .ant-pro-account-avatar { - color: rgba(255, 255, 255, 0.85); - - .antd-pro-global-header-index-avatar { - background: rgba(255, 255, 255, 0.25) !important; - } - - span { - color: rgba(255, 255, 255, 0.85); - } - } - - /* 语言选择器和设置按钮 */ - .ant-pro-drop-down { - color: rgba(255, 255, 255, 0.85); - - &:hover { - color: #1890ff; - background: rgba(255, 255, 255, 0.08); - } - } - } - - /* 浅色主题下的头像样式 */ - .ant-pro-account-avatar { - .antd-pro-global-header-index-avatar { - margin: ~'calc((@{layout-header-height} - 24px) / 2)' 0; - margin-right: 8px; - color: @primary-color; - vertical-align: top; - background: rgb(255 255 255 / 85%); - } - } - - .menu { - .anticon { - margin-right: 8px; - } - - .ant-dropdown-menu-item { - min-width: 100px; - } - } -} - -/* 暗黑主题下的下拉菜单样式 */ -:global { - .ant-pro-layout.dark, - .ant-pro-layout.realdark { - .ant-dropdown-menu { - background: #1f1f1f !important; - border: 1px solid #303030 !important; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3) !important; - - .ant-dropdown-menu-item { - color: rgba(255, 255, 255, 0.85) !important; - - &:hover { - background: #262626 !important; - color: #1890ff !important; - } - } - - .ant-dropdown-menu-item-divider { - background: #303030 !important; - } - } - } -} - -/* 手机端适配 */ -@media (max-width: 768px) { - :global { - /* 使用更具体的选择器强制覆盖 */ - .ant-layout-header .ant-pro-global-header .ant-pro-global-header-logo, - .ant-pro-layout .ant-layout-header .ant-pro-global-header .ant-pro-global-header-logo, - body .ant-layout-header .ant-pro-global-header .ant-pro-global-header-logo, - .ant-pro-global-header-logo { - padding: 0 !important; - padding-left: 0 !important; - padding-right: 0 !important; - padding-top: 0 !important; - padding-bottom: 0 !important; - } - } -} - diff --git a/quantdinger_vue/src/layouts/BasicLayout.vue b/quantdinger_vue/src/layouts/BasicLayout.vue deleted file mode 100644 index 61ab348..0000000 --- a/quantdinger_vue/src/layouts/BasicLayout.vue +++ /dev/null @@ -1,1028 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/layouts/BlankLayout.vue b/quantdinger_vue/src/layouts/BlankLayout.vue deleted file mode 100644 index 1bfbfbf..0000000 --- a/quantdinger_vue/src/layouts/BlankLayout.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/layouts/PageView.vue b/quantdinger_vue/src/layouts/PageView.vue deleted file mode 100644 index 86df485..0000000 --- a/quantdinger_vue/src/layouts/PageView.vue +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/quantdinger_vue/src/layouts/RouteView.vue b/quantdinger_vue/src/layouts/RouteView.vue deleted file mode 100644 index edae19e..0000000 --- a/quantdinger_vue/src/layouts/RouteView.vue +++ /dev/null @@ -1,32 +0,0 @@ - diff --git a/quantdinger_vue/src/layouts/UserLayout.vue b/quantdinger_vue/src/layouts/UserLayout.vue deleted file mode 100644 index 66ce38a..0000000 --- a/quantdinger_vue/src/layouts/UserLayout.vue +++ /dev/null @@ -1,264 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/layouts/index.js b/quantdinger_vue/src/layouts/index.js deleted file mode 100644 index 1d62d6c..0000000 --- a/quantdinger_vue/src/layouts/index.js +++ /dev/null @@ -1,7 +0,0 @@ -import UserLayout from './UserLayout' -import BlankLayout from './BlankLayout' -import BasicLayout from './BasicLayout' -import RouteView from './RouteView' -import PageView from './PageView' - -export { UserLayout, BasicLayout, BlankLayout, RouteView, PageView } diff --git a/quantdinger_vue/src/locales/index.js b/quantdinger_vue/src/locales/index.js deleted file mode 100644 index 69beb80..0000000 --- a/quantdinger_vue/src/locales/index.js +++ /dev/null @@ -1,68 +0,0 @@ -import Vue from 'vue' -import VueI18n from 'vue-i18n' -import storage from 'store' -import moment from 'moment' - -// default lang -import enUS from './lang/en-US' - -Vue.use(VueI18n) - -export const defaultLang = 'en-US' - -const messages = { - 'en-US': { - ...enUS - } -} - -const i18n = new VueI18n({ - silentTranslationWarn: true, - locale: defaultLang, - fallbackLocale: defaultLang, - messages -}) - -const loadedLanguages = [defaultLang] - -function setI18nLanguage (lang) { - i18n.locale = lang - const html = document.documentElement - const isRtl = /^ar/i.test(lang) - if (html) { - // request.headers['Accept-Language'] = lang - html.setAttribute('lang', lang) - html.setAttribute('dir', isRtl ? 'rtl' : 'ltr') - } - if (document.body) { - document.body.setAttribute('dir', isRtl ? 'rtl' : 'ltr') - document.body.classList.toggle('rtl', isRtl) - } - return lang -} - -export function loadLanguageAsync (lang = defaultLang) { - return new Promise(resolve => { - // 缓存语言设置 - storage.set('lang', lang) - if (i18n.locale !== lang) { - if (!loadedLanguages.includes(lang)) { - return import(/* webpackChunkName: "lang-[request]" */ `./lang/${lang}`).then(msg => { - const locale = msg.default - i18n.setLocaleMessage(lang, locale) - loadedLanguages.push(lang) - moment.updateLocale(locale.momentName, locale.momentLocale) - return setI18nLanguage(lang) - }) - } - return resolve(setI18nLanguage(lang)) - } - return resolve(lang) - }) -} - -export function i18nRender (key) { - return i18n.t(`${key}`) -} - -export default i18n diff --git a/quantdinger_vue/src/locales/lang/ar-SA.js b/quantdinger_vue/src/locales/lang/ar-SA.js deleted file mode 100644 index 9f166ef..0000000 --- a/quantdinger_vue/src/locales/lang/ar-SA.js +++ /dev/null @@ -1,1790 +0,0 @@ -import antdArEG from 'ant-design-vue/es/locale-provider/ar_EG' -import momentAR from 'moment/locale/ar' - -const components = { - antLocale: antdArEG, - momentName: 'ar', - momentLocale: momentAR -} -const locale = { - 'submit': 'إرسال', - 'save': 'حفظ', - 'submit.ok': 'تم التقديم بنجاح', - 'save.ok': 'تم الحفظ بنجاح', - 'menu.welcome': 'مرحبا بكم', - 'menu.home': 'الصفحة الرئيسية', - 'menu.dashboard': 'لوحة القيادة', - 'menu.dashboard.indicator': 'تحليل المؤشر', - 'menu.dashboard.community': 'مجتمع المؤشرات', - 'menu.dashboard.analysis': 'تحليل الذكاء الاصطناعي', - 'menu.dashboard.tradingAssistant': 'مساعد التداول', - 'menu.dashboard.aiTradingAssistant': 'مساعد التداول بالذكاء الاصطناعي', - 'menu.dashboard.signalRobot': 'روبوت الإشارة', - 'menu.dashboard.monitor': 'صفحة المراقبة', - 'menu.dashboard.workplace': 'طاولة العمل', - 'menu.form': 'صفحة النموذج', - 'menu.form.basic-form': 'الشكل الأساسي', - 'menu.form.step-form': 'شكل خطوة بخطوة', - 'menu.form.step-form.info': 'نموذج خطوة بخطوة (املأ معلومات النقل)', - 'menu.form.step-form.confirm': 'نموذج خطوة بخطوة (تأكيد معلومات النقل)', - 'menu.form.step-form.result': 'نموذج خطوة بخطوة (كامل)', - 'menu.form.advanced-form': 'نماذج متقدمة', - 'menu.list': 'صفحة القائمة', - 'menu.list.table-list': 'نموذج الاستفسار', - 'menu.list.basic-list': 'القائمة القياسية', - 'menu.list.card-list': 'قائمة البطاقات', - 'menu.list.search-list': 'قائمة البحث', - 'menu.list.search-list.articles': 'قائمة البحث (المقالات)', - 'menu.list.search-list.projects': 'قائمة البحث (المشروع)', - 'menu.list.search-list.applications': 'قائمة البحث (التطبيق)', - 'menu.profile': 'صفحة التفاصيل', - 'menu.profile.basic': 'صفحة التفاصيل الأساسية', - 'menu.profile.advanced': 'صفحة التفاصيل المتقدمة', - 'menu.result': 'صفحة النتائج', - 'menu.result.success': 'صفحة النجاح', - 'menu.result.fail': 'صفحة الفشل', - 'menu.exception': 'صفحة الاستثناء', - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': 'خطأ الزناد', - 'menu.account': 'الصفحة الشخصية', - 'menu.account.center': 'مركز شخصي', - 'menu.account.settings': 'الإعدادات الشخصية', - 'menu.account.trigger': 'خطأ الزناد', - 'menu.account.logout': 'تسجيل الخروج', - 'menu.wallet': 'محفظتي', - 'menu.docs': 'مركز الوثائق', - 'menu.docs.detail': 'تفاصيل الوثيقة', - 'menu.header.refreshPage': 'تحديث الصفحة', - 'menu.invite.friends': 'دعوة الأصدقاء', - 'app.setting.pagestyle': 'إعدادات النمط الشاملة', - 'app.setting.pagestyle.light': 'نمط القائمة مشرق', - 'app.setting.pagestyle.dark': 'نمط القائمة المظلمة', - 'app.setting.pagestyle.realdark': 'الوضع المظلم', - 'app.setting.themecolor': 'لون الموضوع', - 'app.setting.navigationmode': 'وضع التنقل', - 'app.setting.sidemenu.nav': 'التنقل في الشريط الجانبي', - 'app.setting.topmenu.nav': 'التنقل في الشريط العلوي', - 'app.setting.content-width': 'عرض منطقة المحتوى', - 'app.setting.content-width.tooltip': 'يكون هذا الإعداد فعالاً فقط عندما يكون [Top Bar Navigation]', - 'app.setting.content-width.fixed': 'ثابت', - 'app.setting.content-width.fluid': 'البث', - 'app.setting.fixedheader': 'رأس ثابت', - 'app.setting.fixedheader.tooltip': 'شكلي عندما رأس ثابت', - 'app.setting.autoHideHeader': 'إخفاء الرأس عند التمرير', - 'app.setting.fixedsidebar': 'القائمة الجانبية الثابتة', - 'app.setting.sidemenu': 'تخطيط القائمة الجانبية', - 'app.setting.topmenu': 'تخطيط القائمة العلوية', - 'app.setting.othersettings': 'إعدادات أخرى', - 'app.setting.weakmode': 'وضع ضعف اللون', - 'app.setting.multitab': 'وضع علامات التبويب المتعددة', - 'app.setting.copy': 'إعدادات النسخ', - 'app.setting.loading': 'جارٍ تحميل الموضوع', - 'app.setting.copyinfo': 'انسخ الإعدادات بنجاح src/config/defaultSettings.js', - 'app.setting.copy.success': 'اكتمل النسخ', - 'app.setting.copy.fail': 'فشل النسخ', - 'app.setting.theme.switching': 'تغيير الموضوع!', - 'app.setting.production.hint': 'يتم استخدام شريط التكوين فقط للمعاينة في بيئة التطوير ولن يتم عرضه في بيئة الإنتاج. يرجى نسخ وتعديل ملف التكوين يدويا.', - 'app.setting.themecolor.daybreak': 'الأزرق الداكن (افتراضي)', - 'app.setting.themecolor.dust': 'الغسق', - 'app.setting.themecolor.volcano': 'بركان', - 'app.setting.themecolor.sunset': 'غروب الشمس', - 'app.setting.themecolor.cyan': 'مينغكينغ', - 'app.setting.themecolor.green': 'أورورا الخضراء', - 'app.setting.themecolor.geekblue': 'المهوس الأزرق', - 'app.setting.themecolor.purple': 'جيانغ زي', - 'app.setting.tooltip': 'إعدادات الصفحة', - 'user.login.userName': 'اسم المستخدم', - 'user.login.password': 'كلمة المرور', - 'user.login.username.placeholder': 'الحساب: المشرف', - 'user.login.password.placeholder': 'كلمة المرور: admin أو ant.design', - 'user.login.message-invalid-credentials': 'فشل تسجيل الدخول، يرجى التحقق من البريد الإلكتروني الخاص بك ورمز التحقق', - 'user.login.message-invalid-verification-code': 'خطأ في رمز التحقق', - 'user.login.tab-login-credentials': 'تسجيل الدخول بكلمة مرور الحساب', - 'user.login.tab-login-email': 'تسجيل الدخول بالبريد الإلكتروني', - 'user.login.tab-login-mobile': 'تسجيل الدخول برقم الهاتف المحمول', - 'user.login.captcha.placeholder': 'الرجاء إدخال رمز التحقق الرسومي', - 'user.login.mobile.placeholder': 'رقم الهاتف المحمول', - 'user.login.mobile.verification-code.placeholder': 'رمز التحقق', - 'user.login.email.placeholder': 'الرجاء إدخال عنوان البريد الإلكتروني الخاص بك', - 'user.login.email.verification-code.placeholder': 'الرجاء إدخال رمز التحقق', - 'user.login.email.sending': 'جاري إرسال رمز التحقق...', - 'user.login.email.send-success-title': 'نصائح', - 'user.login.email.send-success': 'تم إرسال رمز التحقق بنجاح، يرجى التحقق من بريدك الإلكتروني', - 'user.login.sms.send-success': 'تم إرسال رمز التحقق بنجاح، يرجى التحقق من الرسالة النصية', - 'user.login.remember-me': 'تسجيل الدخول التلقائي', - 'user.login.forgot-password': 'نسيت كلمة المرور', - 'user.login.sign-in-with': 'طرق تسجيل الدخول الأخرى', - 'user.login.signup': 'تسجيل حساب', - 'user.login.login': 'تسجيل الدخول', - 'user.register.register': 'سجل', - 'user.register.email.placeholder': 'البريد الإلكتروني', - 'user.register.password.placeholder': 'الرجاء إدخال 6 أحرف على الأقل. يرجى عدم استخدام كلمات المرور التي يمكن تخمينها بسهولة.', - 'user.register.password.popover-message': 'الرجاء إدخال 6 أحرف على الأقل. يرجى عدم استخدام كلمات المرور التي يمكن تخمينها بسهولة.', - 'user.register.confirm-password.placeholder': 'تأكيد كلمة المرور', - 'user.register.get-verification-code': 'الحصول على رمز التحقق', - 'user.register.sign-in': 'قم بتسجيل الدخول باستخدام حساب موجود', - 'user.register-result.msg': 'حسابك: {email} تم التسجيل بنجاح', - 'user.register-result.activation-email': 'تم إرسال رسالة التفعيل إلى صندوق البريد الخاص بك وهي صالحة لمدة 24 ساعة. يرجى تسجيل الدخول إلى بريدك الإلكتروني على الفور والنقر على الرابط الموجود في البريد الإلكتروني لتفعيل حسابك.', - 'user.register-result.back-home': 'العودة إلى الصفحة الرئيسية', - 'user.register-result.view-mailbox': 'تحقق من صندوق البريد الخاص بك', - 'user.email.required': 'الرجاء إدخال عنوان البريد الإلكتروني الخاص بك!', - 'user.email.wrong-format': 'تنسيق عنوان البريد الإلكتروني خاطئ!', - 'user.userName.required': 'الرجاء إدخال اسم حسابك أو عنوان البريد الإلكتروني الخاص بك', - 'user.password.required': 'الرجاء إدخال كلمة المرور الخاصة بك!', - 'user.password.twice.msg': 'كلمات المرور التي تم إدخالها مرتين غير متطابقة!', - 'user.password.strength.msg': 'كلمة المرور ليست قوية بما فيه الكفاية', - 'user.password.strength.strong': 'القوة : قوية', - 'user.password.strength.medium': 'القوة: متوسطة', - 'user.password.strength.low': 'القوة: منخفضة', - 'user.password.strength.short': 'القوة : قصيرة جداً', - 'user.confirm-password.required': 'الرجاء تأكيد كلمة المرور الخاصة بك!', - 'user.phone-number.required': 'الرجاء إدخال رقم الهاتف المحمول الصحيح', - 'user.phone-number.wrong-format': 'تنسيق رقم الهاتف المحمول خاطئ!', - 'user.verification-code.required': 'الرجاء إدخال رمز التحقق!', - 'user.captcha.required': 'الرجاء إدخال رمز التحقق الرسومي!', - 'user.login.infos': 'QuantDinger هي أداة مساعدة لتحليل الأسهم متعددة الوكلاء تعمل بالذكاء الاصطناعي ولا تتمتع بمؤهلات استشارية في مجال الاستثمار في الأوراق المالية. يتم إنشاء جميع نتائج التحليل والدرجات والآراء المرجعية في المنصة تلقائيًا بواسطة الذكاء الاصطناعي استنادًا إلى البيانات التاريخية وتستخدم فقط للتعلم والبحث والتبادل الفني، ولا تشكل أي نصيحة استثمارية أو أساس لصنع القرار. ينطوي الاستثمار في الأسهم على مخاطر مختلفة مثل مخاطر السوق، ومخاطر السيولة، ومخاطر السياسة، وما إلى ذلك، مما قد يؤدي إلى خسارة رأس المال. يجب على المستخدمين اتخاذ قرارات مستقلة بناءً على قدرتهم على تحمل المخاطر، ويجب أن يتحمل المستخدم أي سلوك استثماري وعواقب تنشأ عن استخدام هذه الأداة. السوق محفوف بالمخاطر والاستثمار يحتاج إلى الحذر.', - 'user.login.tab-login-web3': 'تسجيل الدخول إلى Web3', - 'user.login.web3.tip': 'تسجيل الدخول بالتوقيع باستخدام المحفظة', - 'user.login.web3.connect': 'ربط المحفظة وتسجيل الدخول', - 'user.login.web3.no-wallet': 'لم يتم الكشف عن المحفظة', - 'user.login.web3.no-address': 'لم يتم الحصول على عنوان المحفظة', - 'user.login.web3.nonce-failed': 'فشل الحصول على رقم عشوائي', - 'user.login.web3.verify-failed': 'فشل التحقق من التوقيع', - 'user.login.web3.success': 'تم تسجيل الدخول بنجاح', - 'user.login.web3.failed': 'فشل تسجيل الدخول إلى المحفظة', - 'nav.no_wallet': 'لم يتم الكشف عن المحفظة', - 'nav.copy': 'نسخ', - 'nav.copy_success': 'تم النسخ بنجاح', - 'user.login.oauth.google': 'قم بتسجيل الدخول باستخدام جوجل', - 'user.login.oauth.github': 'قم بتسجيل الدخول باستخدام جيثب', - 'user.login.oauth.loading': 'جارٍ إعادة التوجيه إلى صفحة التفويض...', - 'user.login.oauth.failed': 'فشل تسجيل الدخول باستخدام OAuth', - 'user.login.oauth.get-url-failed': 'فشل الحصول على رابط الترخيص', - 'user.login.subtitle': 'رؤى كمية مدفوعة في الأسواق العالمية', - 'user.login.legal.title': 'إخلاء المسؤولية القانونية', - 'user.login.legal.view': 'عرض إخلاء المسؤولية القانونية', - 'user.login.legal.collapse': 'طي إخلاء المسؤولية القانونية', - 'user.login.legal.agree': 'لقد قرأت ووافقت على إخلاء المسؤولية القانونية', - 'user.login.legal.required': 'يرجى قراءة والتحقق من إخلاء المسؤولية القانونية أولا', - 'user.login.legal.content': 'QuantDinger هي أداة مساعدة لتحليل الأسهم متعددة الوكلاء تعمل بالذكاء الاصطناعي ولا تتمتع بمؤهلات استشارية في مجال الاستثمار في الأوراق المالية. يتم إنشاء جميع نتائج التحليل والتقييمات والآراء المرجعية في المنصة تلقائيًا بواسطة الذكاء الاصطناعي استنادًا إلى البيانات التاريخية وتستخدم فقط للتعلم والبحث والتبادل الفني، ولا تشكل أي نصيحة استثمارية أو أساس لصنع القرار. ينطوي الاستثمار في الأسهم على مخاطر مختلفة مثل مخاطر السوق، ومخاطر السيولة، ومخاطر السياسة، وما إلى ذلك، مما قد يؤدي إلى خسارة رأس المال. يجب على المستخدمين اتخاذ قرارات مستقلة بناءً على قدرتهم على تحمل المخاطر، ويجب أن يتحمل المستخدم أي سلوك استثماري وعواقب تنشأ عن استخدام هذه الأداة. السوق محفوف بالمخاطر والاستثمار يحتاج إلى الحذر.', - 'user.login.privacy.title': 'سياسة خصوصية المستخدم', - 'user.login.privacy.view': 'عرض سياسة خصوصية المستخدم', - 'user.login.privacy.collapse': 'إغلاق شروط خصوصية المستخدم', - 'user.login.privacy.content': 'نحن نقدر خصوصيتك وحماية البيانات. 1) نطاق التجميع: يتم جمع المعلومات المطلوبة لتنفيذ الوظيفة فقط (مثل البريد الإلكتروني ورقم الهاتف المحمول ورمز المنطقة وعنوان محفظة Web3) والسجلات الضرورية ومعلومات الجهاز. 2) الغرض من الاستخدام: لتسجيل الدخول إلى الحساب والتحقق من الأمان وتوفير وظيفة الخدمة واستكشاف الأخطاء وإصلاحها ومتطلبات الامتثال. 3) التخزين والأمان: يتم تشفير البيانات وتخزينها، ويتم اتخاذ الأذونات اللازمة وإجراءات التحكم في الوصول لمحاولة منع الوصول غير المصرح به أو الكشف عنها أو فقدانها. 4) المشاركة مع أطراف ثالثة: ما لم يكن ذلك مطلوبًا بموجب القوانين واللوائح أو ضروريًا لأداء الخدمات، لن تتم مشاركة معلوماتك الشخصية مع أطراف ثالثة؛ إذا كانت هناك خدمات تابعة لجهات خارجية (مثل المحافظ ومقدمي خدمات الرسائل النصية القصيرة)، فلن تتم معالجتها إلا إلى الحد الأدنى اللازم لتنفيذ الوظيفة. 5) ملفات تعريف الارتباط/التخزين المحلي: تُستخدم لحالة تسجيل الدخول وصيانة الجلسة الضرورية (مثل الرموز المميزة، PHPSESSID)، ويمكنك مسحها أو تقييدها في المتصفح. 6) الحقوق الشخصية: يمكنك ممارسة حقوقك في الاستفسار والتصحيح والحذف وسحب الموافقة وما إلى ذلك وفقًا للقوانين واللوائح. 7) التغييرات والإشعارات: عند تحديث هذه الشروط، سيتم عرضها بشكل بارز على الصفحة. من خلال الاستمرار في استخدام هذه الخدمة، يعتبر أنك قد قرأت المحتوى المحدث ووافقت عليه. إذا كنت لا توافق على هذه الشروط أو أي تحديثات لها، فيرجى التوقف عن استخدام الخدمة والاتصال بنا.', - 'account.basicInfo': 'المعلومات الأساسية', - 'account.id': 'معرف المستخدم', - 'account.username': 'اسم المستخدم', - 'account.nickname': 'اللقب', - 'account.email': 'البريد الإلكتروني', - 'account.mobile': 'رقم الهاتف المحمول', - 'account.web3address': 'عنوان المحفظة', - 'account.pid': 'معرف المرجع', - 'account.level': 'مستوى المستخدم', - 'account.money': 'التوازن', - 'account.qdtBalance': 'رصيد كيو دي تي', - 'account.score': 'النقاط', - 'account.createtime': 'وقت التسجيل', - 'account.inviteLink': 'رابط الدعوة', - 'account.recharge': 'إعادة الشحن', - 'account.rechargeTip': 'يرجى استخدام WeChat أو Alipay لمسح رمز الاستجابة السريعة أدناه لإعادة الشحن.', - 'account.qrCodePlaceholder': 'العنصر النائب لرمز الاستجابة السريعة (المحاكاة)', - 'account.rechargeAmount': 'مبلغ إعادة الشحن', - 'account.enterAmount': 'الرجاء إدخال مبلغ إعادة الشحن', - 'account.rechargeHint': 'الحد الأدنى لمبلغ الإيداع: 1 QDT', - 'account.confirmRecharge': 'تأكيد إعادة الشحن', - 'account.enterValidAmount': 'الرجاء إدخال مبلغ تعبئة صالح', - 'account.rechargeSuccess': 'تم إعادة الشحن بنجاح! تم إيداع {amount} QDT', - 'account.settings.menuMap.basic': 'الإعدادات الأساسية', - 'account.settings.menuMap.security': 'إعدادات الأمان', - 'account.settings.menuMap.notification': 'إشعار الرسالة الجديدة', - 'account.settings.menuMap.moneyLog': 'تفاصيل الصندوق', - 'account.moneyLog.empty': 'لا توجد تفاصيل الصندوق حتى الآن', - 'account.moneyLog.total': '{total} السجلات في المجموع', - 'account.moneyLog.type.purchase': 'مؤشر الشراء', - 'account.moneyLog.type.recharge': 'إعادة الشحن', - 'account.moneyLog.type.refund': 'استرداد', - 'account.moneyLog.type.reward': 'مكافأة', - 'account.moneyLog.type.income': 'دخل المؤشر', - 'account.moneyLog.type.commission': 'رسوم التعامل مع المنصة', - 'wallet.balance': 'رصيد كيو دي تي', - 'wallet.recharge': 'إعادة الشحن', - 'wallet.withdraw': 'سحب النقود', - 'wallet.filter': 'تصفية', - 'wallet.reset': 'إعادة تعيين', - 'wallet.totalRecharge': 'التغذية المتراكمة', - 'wallet.totalWithdraw': 'عمليات السحب التراكمية', - 'wallet.totalIncome': 'الدخل التراكمي', - 'wallet.records': 'سجلات المعاملات وتفاصيل الصندوق', - 'wallet.tradingRecords': 'تاريخ المعاملة', - 'wallet.moneyLog': 'تفاصيل الصندوق', - 'wallet.rechargeTip': 'يرجى استخدام WeChat أو Alipay لمسح رمز الاستجابة السريعة أدناه لإعادة الشحن.', - 'wallet.qrCodePlaceholder': 'العنصر النائب لرمز الاستجابة السريعة (المحاكاة)', - 'wallet.rechargeAmount': 'مبلغ إعادة الشحن', - 'wallet.enterAmount': 'الرجاء إدخال مبلغ إعادة الشحن', - 'wallet.rechargeHint': 'الحد الأدنى لمبلغ الإيداع: 1 QDT', - 'wallet.confirmRecharge': 'تأكيد إعادة الشحن', - 'wallet.enterValidAmount': 'الرجاء إدخال مبلغ تعبئة صالح', - 'wallet.rechargeSuccess': 'تم إعادة الشحن بنجاح! تم إيداع {amount} QDT', - 'wallet.rechargeFailed': 'فشلت عملية إعادة الشحن', - 'wallet.withdrawTip': 'الرجاء إدخال مبلغ السحب وعنوان السحب', - 'wallet.withdrawAmount': 'سحب المبلغ', - 'wallet.enterWithdrawAmount': 'الرجاء إدخال مبلغ السحب', - 'wallet.withdrawHint': 'الحد الأدنى لمبلغ السحب: 1 QDT', - 'wallet.withdrawAddress': 'عنوان السحب (اختياري)', - 'wallet.enterWithdrawAddress': 'الرجاء إدخال عنوان السحب', - 'wallet.confirmWithdraw': 'تأكيد الانسحاب', - 'wallet.enterValidWithdrawAmount': 'الرجاء إدخال مبلغ سحب صالح', - 'wallet.insufficientBalance': 'رصيد غير كاف', - 'wallet.withdrawSuccess': 'تم السحب بنجاح! تم سحب {المبلغ} QDT', - 'wallet.withdrawFailed': 'فشل الانسحاب', - 'wallet.noTradingRecords': 'لا يوجد سجل المعاملات حتى الآن', - 'wallet.noMoneyLog': 'لا توجد تفاصيل الصندوق حتى الآن', - 'wallet.loadTradingRecordsFailed': 'فشل في تحميل سجلات المعاملات', - 'wallet.loadMoneyLogFailed': 'فشل في تحميل تفاصيل الصندوق', - 'wallet.moneyLogTotal': '{total} السجلات في المجموع', - 'wallet.moneyLogTypeTitle': 'اكتب', - 'wallet.moneyLogType.all': 'جميع الأنواع', - 'wallet.table.time': 'الوقت', - 'wallet.table.type': 'اكتب', - 'wallet.table.price': 'السعر', - 'wallet.table.amount': 'الكمية', - 'wallet.table.money': 'المبلغ', - 'wallet.table.balance': 'التوازن', - 'wallet.table.memo': 'ملاحظات', - 'wallet.table.value': 'قيمة', - 'wallet.table.profit': 'الربح والخسارة', - 'wallet.table.commission': 'رسوم المناولة', - 'wallet.table.total': '{total} السجلات في المجموع', - 'wallet.tradeType.buy': 'شراء', - 'wallet.tradeType.sell': 'بيع', - 'wallet.tradeType.liquidation': 'التصفية القسرية', - 'wallet.tradeType.openLong': 'مفتوح لفترة طويلة', - 'wallet.tradeType.addLong': 'غادوت', - 'wallet.tradeType.closeLong': 'بيندو', - 'wallet.tradeType.closeLongStop': 'وقف الخسارة وطويلة', - 'wallet.tradeType.closeLongProfit': 'جني الربح ومستوى أكثر', - 'wallet.tradeType.openShort': 'فتح قصيرة', - 'wallet.tradeType.addShort': 'إضافة قصيرة', - 'wallet.tradeType.closeShort': 'فارغ', - 'wallet.tradeType.closeShortStop': 'وقف الخسارة', - 'wallet.tradeType.closeShortProfit': 'جني الأرباح وأغلق على المكشوف', - 'wallet.moneyLogType.purchase': 'مؤشر الشراء', - 'wallet.moneyLogType.recharge': 'إعادة الشحن', - 'wallet.moneyLogType.withdraw': 'سحب النقود', - 'wallet.moneyLogType.refund': 'استرداد', - 'wallet.moneyLogType.reward': 'مكافأة', - 'wallet.moneyLogType.income': 'الدخل', - 'wallet.moneyLogType.commission': 'رسوم المناولة', - 'wallet.web3Address.required': 'يرجى ملء عنوان محفظة Web3 أولاً', - 'wallet.web3Address.requiredDescription': 'قبل إعادة الشحن، تحتاج إلى ربط عنوان محفظة Web3 الخاص بك لتلقي إعادة الشحن.', - 'wallet.web3Address.placeholder': 'الرجاء إدخال عنوان محفظة Web3 الخاص بك (يبدأ بـ 0x)', - 'wallet.web3Address.save': 'حفظ عنوان المحفظة', - 'wallet.web3Address.saveSuccess': 'تم حفظ عنوان المحفظة بنجاح', - 'wallet.web3Address.saveFailed': 'فشل في حفظ عنوان المحفظة', - 'wallet.web3Address.invalidFormat': 'يرجى إدخال عنوان محفظة Web3 صالح (تنسيق Ethereum: 42 حرفًا يبدأ بـ 0x، أو تنسيق TRC20: 34 حرفًا يبدأ بـ T)', - 'wallet.selectCoin': 'اختر العملة', - 'wallet.selectChain': 'سلسلة الاختيار', - 'wallet.chain.eth': 'إيثريوم (ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'ش.م.ب', - 'wallet.targetQdtAmount': 'مقدار QDT الذي تريد استرداده (اختياري)', - 'wallet.targetQdtAmount.placeholder': 'يرجى إدخال كمية QDT التي تريد استردادها، وسعر QDT الحالي: {price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': 'تحتاج إلى إعادة الشحن: {amount} USDT', - 'wallet.rechargeAddress': 'عنوان إعادة الشحن', - 'wallet.copyAddress': 'نسخ', - 'wallet.copySuccess': 'تم النسخ بنجاح!', - 'wallet.copyFailed': 'فشل النسخ، يرجى النسخ يدويًا', - 'wallet.rechargeAddressHint': 'يرجى التأكد من استخدام {chain} لإيداع {coin} في هذا العنوان', - 'wallet.qdtPrice.loading': 'جار التحميل...', - 'wallet.rechargeTip.new': 'يرجى تحديد العملة والسلسلة، ثم مسح رمز الاستجابة السريعة أدناه لإعادة الشحن', - 'wallet.exchangeRate': '1 QDT ≈ {معدل} USDT', - 'wallet.withdrawableAmount': 'المبلغ النقدي المتاح', - 'wallet.totalBalance': 'الرصيد الإجمالي', - 'wallet.insufficientWithdrawable': 'المبلغ النقدي الذي يمكن سحبه غير كاف. المبلغ الحالي الذي يمكن سحبه هو: {amount} QDT', - 'wallet.withdrawAddressRequired': 'الرجاء إدخال عنوان السحب', - 'wallet.withdrawAddressHint': 'يرجى التأكد من صحة العنوان. وبعد الانسحاب لا يمكن إلغاؤه.', - 'wallet.withdrawSubmitSuccess': 'تم إرسال طلب السحب بنجاح، برجاء انتظار المراجعة', - 'menu.footer.contactUs': 'اتصل بنا', - 'menu.footer.getSupport': 'احصل على الدعم', - 'menu.footer.socialAccounts': 'حساب اجتماعي', - 'menu.footer.userAgreement': 'اتفاقية المستخدم', - 'menu.footer.privacyPolicy': 'سياسة الخصوصية', - 'menu.footer.support': 'الدعم', - 'menu.footer.featureRequest': 'طلب الميزة', - 'menu.footer.email': 'البريد الإلكتروني', - 'menu.footer.liveChat': '24/7 الدردشة الحية', - 'dashboard.analysis.title': 'التحليل متعدد الأبعاد', - 'dashboard.analysis.subtitle': 'منصة تحليل مالي شاملة تعتمد على الذكاء الاصطناعي', - 'dashboard.analysis.selectSymbol': 'حدد أو أدخل الرمز الأساسي', - 'dashboard.analysis.selectModel': 'حدد النموذج', - 'dashboard.analysis.startAnalysis': 'ابدأ التحليل', - 'dashboard.analysis.history': 'التاريخ', - 'dashboard.analysis.tab.overview': 'تحليل شامل', - 'dashboard.analysis.tab.fundamental': 'الأساسيات', - 'dashboard.analysis.tab.technical': 'التكنولوجيا', - 'dashboard.analysis.tab.news': 'أخبار', - 'dashboard.analysis.tab.sentiment': 'العواطف', - 'dashboard.analysis.tab.risk': 'خطر', - 'dashboard.analysis.tab.debate': 'المناقشة الطويلة والقصيرة', - 'dashboard.analysis.tab.decision': 'القرار النهائي', - 'dashboard.analysis.empty.selectSymbol': 'حدد هدفًا لبدء التحليل', - 'dashboard.analysis.empty.selectSymbolDesc': 'اختر من قائمة الأسهم المحددة ذاتيًا أو أدخل الكود الأساسي للحصول على تقرير تحليل الذكاء الاصطناعي متعدد الأبعاد', - 'dashboard.analysis.empty.startAnalysis': 'انقر فوق الزر "بدء التحليل" لإجراء تحليل متعدد الأبعاد', - 'dashboard.analysis.empty.startAnalysisDesc': 'سنزودك بتحليل شامل من أبعاد متعددة مثل الأساسيات والتكنولوجيا والأخبار والمشاعر والمخاطر', - 'dashboard.analysis.empty.noData': 'لا توجد حاليًا أي بيانات تحليل {type}، يرجى إجراء تحليل شامل أولاً', - 'dashboard.analysis.empty.noWatchlist': 'لا يوجد حاليا أي أسهم مختارة ذاتيا', - 'dashboard.analysis.empty.noHistory': 'لا يوجد تاريخ بعد', - 'dashboard.analysis.empty.watchlistHint': 'لا يوجد حاليا أي أسهم مختارة ذاتيا، يرجى أولا', - 'dashboard.analysis.empty.noDebateData': 'لا توجد بيانات مناقشة حتى الآن', - 'dashboard.analysis.empty.noDecisionData': 'لا توجد بيانات القرار حتى الآن', - 'dashboard.analysis.empty.selectAgent': 'الرجاء تحديد وكيل لعرض نتائج التحليل', - 'dashboard.analysis.loading.analyzing': 'جارٍ التحليل، يرجى الانتظار...', - 'dashboard.analysis.loading.fundamental': 'تحليل البيانات الأساسية...', - 'dashboard.analysis.loading.technical': 'تحليل المؤشرات الفنية...', - 'dashboard.analysis.loading.news': 'تحليل بيانات الأخبار...', - 'dashboard.analysis.loading.sentiment': 'تحليل معنويات السوق..', - 'dashboard.analysis.loading.risk': 'تقييم المخاطر...', - 'dashboard.analysis.loading.debate': 'والنقاش الطويل والقصير مستمر..', - 'dashboard.analysis.loading.decision': 'إصدار القرار النهائي...', - 'dashboard.analysis.score.overall': 'التقييم العام', - 'dashboard.analysis.score.recommendation': 'نصيحة استثمارية', - 'dashboard.analysis.score.confidence': 'الثقة', - 'dashboard.analysis.dimension.fundamental': 'الأساسيات', - 'dashboard.analysis.dimension.technical': 'التكنولوجيا', - 'dashboard.analysis.dimension.news': 'أخبار', - 'dashboard.analysis.dimension.sentiment': 'العواطف', - 'dashboard.analysis.dimension.risk': 'خطر', - 'dashboard.analysis.card.dimensionScores': 'التقييمات لكل البعد', - 'dashboard.analysis.card.overviewReport': 'تقرير التحليل الشامل', - 'dashboard.analysis.card.financialMetrics': 'المؤشرات المالية', - 'dashboard.analysis.card.fundamentalReport': 'تقرير التحليل الأساسي', - 'dashboard.analysis.card.technicalIndicators': 'المؤشرات الفنية', - 'dashboard.analysis.card.technicalReport': 'تقرير التحليل الفني', - 'dashboard.analysis.card.newsList': 'أخبار ذات صلة', - 'dashboard.analysis.card.newsReport': 'تقرير تحليل الأخبار', - 'dashboard.analysis.card.sentimentIndicators': 'مؤشر المشاعر', - 'dashboard.analysis.card.sentimentReport': 'تقرير تحليل المشاعر', - 'dashboard.analysis.card.riskMetrics': 'مؤشرات المخاطر', - 'dashboard.analysis.card.riskReport': 'تقرير تقييم المخاطر', - 'dashboard.analysis.card.bullView': 'النظرة الصعودية (الثور)', - 'dashboard.analysis.card.bearView': 'وجهة النظر الهبوطية (الدب)', - 'dashboard.analysis.card.researchConclusion': 'استنتاج الباحث', - 'dashboard.analysis.card.traderPlan': 'خطة التاجر', - 'dashboard.analysis.card.riskDebate': 'مناقشة لجنة المخاطر', - 'dashboard.analysis.card.finalDecision': 'القرار النهائي', - 'dashboard.analysis.card.tradePlanDetail': 'تفاصيل خطة التداول', - 'dashboard.analysis.tradingPlan.entry_price': 'سعر القبول', - 'dashboard.analysis.tradingPlan.position_size': 'حجم الموقف', - 'dashboard.analysis.tradingPlan.stop_loss': 'وقف الخسارة', - 'dashboard.analysis.tradingPlan.take_profit': 'جني الربح', - 'dashboard.analysis.label.confidence': 'الثقة', - 'dashboard.analysis.label.keyPoints': 'النقاط الأساسية', - 'dashboard.analysis.label.riskWarning': 'تحذير من المخاطر', - 'dashboard.analysis.risk.risky': 'محفوف بالمخاطر', - 'dashboard.analysis.risk.neutral': 'وجهة نظر محايدة (محايدة)', - 'dashboard.analysis.risk.safe': 'وجهة نظر محافظة (آمنة)', - 'dashboard.analysis.risk.conclusion': 'الاستنتاج', - 'dashboard.analysis.feature.fundamental': 'التحليل الأساسي', - 'dashboard.analysis.feature.technical': 'التحليل الفني', - 'dashboard.analysis.feature.news': 'تحليل الأخبار', - 'dashboard.analysis.feature.sentiment': 'تحليل المشاعر', - 'dashboard.analysis.feature.risk': 'تقييم المخاطر', - 'dashboard.analysis.watchlist.title': 'اختيار الأسهم الخاصة بي', - 'dashboard.analysis.watchlist.add': 'إضافة', - 'dashboard.analysis.watchlist.addStock': 'إضافة مخزون', - 'dashboard.analysis.modal.addStock.title': 'إضافة أسهم اختيارية', - 'dashboard.analysis.modal.addStock.confirm': 'حسنًا', - 'dashboard.analysis.modal.addStock.cancel': 'إلغاء', - 'dashboard.analysis.modal.addStock.market': 'نوع السوق', - 'dashboard.analysis.modal.addStock.marketPlaceholder': 'الرجاء تحديد السوق', - 'dashboard.analysis.modal.addStock.marketRequired': 'الرجاء تحديد نوع السوق', - 'dashboard.analysis.modal.addStock.symbol': 'رمز المخزون', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': 'على سبيل المثال: AAPL، TSLA، GOOGL، 000001، BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': 'الرجاء إدخال رمز المخزون', - 'dashboard.analysis.modal.addStock.searchPlaceholder': 'البحث عن رمز الهدف أو الاسم', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': 'ابحث عن الرمز الأساسي أو أدخله (على سبيل المثال: AAPL، BTC/USDT، EUR/USD)', - 'dashboard.analysis.modal.addStock.searchOrInputHint': 'يدعم البحث عن الكائنات في قاعدة البيانات، أو إدخال الكود مباشرة (سيحصل النظام على الاسم تلقائيًا)', - 'dashboard.analysis.modal.addStock.search': 'بحث', - 'dashboard.analysis.modal.addStock.searchResults': 'نتائج البحث', - 'dashboard.analysis.modal.addStock.hotSymbols': 'أهداف شعبية', - 'dashboard.analysis.modal.addStock.noHotSymbols': 'لا توجد أهداف شعبية حتى الآن', - 'dashboard.analysis.modal.addStock.selectedSymbol': 'مختارة', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': 'الرجاء تحديد الهدف أولاً', - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': 'الرجاء تحديد هدف أو إدخال رمز الهدف أولاً', - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': 'الرجاء إدخال رمز الهدف', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': 'الرجاء تحديد نوع السوق أولا', - 'dashboard.analysis.modal.addStock.searchFailed': 'فشل البحث، يرجى المحاولة مرة أخرى في وقت لاحق', - 'dashboard.analysis.modal.addStock.noSearchResults': 'لم يتم العثور على هدف مطابق', - 'dashboard.analysis.modal.addStock.willAutoFetchName': 'سيحصل النظام تلقائيًا على الاسم', - 'dashboard.analysis.modal.addStock.addDirectly': 'أضف مباشرة', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': 'سيتم التقاط الاسم تلقائيًا عند إضافته', - 'dashboard.analysis.market.AShare': 'أسهم', - 'dashboard.analysis.market.USStock': 'الأسهم الأمريكية', - 'dashboard.analysis.market.HShare': 'أسهم هونج كونج', - 'dashboard.analysis.market.Crypto': 'عملة مشفرة', - 'dashboard.analysis.market.Forex': 'الفوركس', - 'dashboard.analysis.market.Futures': 'العقود الآجلة', - 'dashboard.analysis.modal.history.title': 'سجلات التحليل التاريخي', - 'dashboard.analysis.modal.history.viewResult': 'عرض النتائج', - 'dashboard.analysis.modal.history.completeTime': 'وقت الانتهاء', - 'dashboard.analysis.modal.history.error': 'خطأ', - 'dashboard.analysis.status.pending': 'في انتظار', - 'dashboard.analysis.status.processing': 'المعالجة', - 'dashboard.analysis.status.completed': 'مكتمل', - 'dashboard.analysis.status.failed': 'فشل', - 'dashboard.analysis.message.selectSymbol': 'الرجاء تحديد الهدف أولا', - 'dashboard.analysis.message.taskCreated': 'تم إنشاء مهمة التحليل ويتم تنفيذها في الخلفية...', - 'dashboard.analysis.message.analysisComplete': 'اكتمل التحليل', - 'dashboard.analysis.message.analysisCompleteCache': 'اكتمل التحليل (باستخدام البيانات المخزنة مؤقتًا)', - 'dashboard.analysis.message.analysisFailed': 'فشل التحليل، يرجى المحاولة مرة أخرى في وقت لاحق', - 'dashboard.analysis.message.addStockSuccess': 'تمت الإضافة بنجاح', - 'dashboard.analysis.message.addStockFailed': 'فشلت الإضافة', - 'dashboard.analysis.message.removeStockSuccess': 'تمت الإزالة بنجاح', - 'dashboard.analysis.message.removeStockFailed': 'فشلت عملية الإزالة', - 'dashboard.analysis.message.resumingAnalysis': 'جاري استئناف مهمة التحليل...', - 'dashboard.analysis.message.deleteSuccess': 'تم الحذف بنجاح', - 'dashboard.analysis.message.deleteFailed': 'فشل الحذف', - 'dashboard.analysis.modal.history.delete': 'حذف', - 'dashboard.analysis.modal.history.deleteConfirm': 'هل أنت متأكد أنك تريد حذف سجل التحليل هذا؟', - 'dashboard.analysis.test': 'متجر رقم {no}، طريق Gongzhuan', - 'dashboard.analysis.introduce': 'وصف المؤشر', - 'dashboard.analysis.total-sales': 'إجمالي المبيعات', - 'dashboard.analysis.day-sales': 'متوسط المبيعات اليومية¥', - 'dashboard.analysis.visits': 'الزيارات', - 'dashboard.analysis.visits-trend': 'اتجاهات المرور', - 'dashboard.analysis.visits-ranking': 'ترتيب زيارة المتجر', - 'dashboard.analysis.day-visits': 'زيارات يومية', - 'dashboard.analysis.week': 'أسبوعية على أساس سنوي', - 'dashboard.analysis.day': 'سنة بعد سنة', - 'dashboard.analysis.payments': 'عدد الدفعات', - 'dashboard.analysis.conversion-rate': 'معدل التحويل', - 'dashboard.analysis.operational-effect': 'آثار النشاط التشغيلي', - 'dashboard.analysis.sales-trend': 'اتجاهات المبيعات', - 'dashboard.analysis.sales-ranking': 'ترتيب مبيعات المتجر', - 'dashboard.analysis.all-year': 'على مدار السنة', - 'dashboard.analysis.all-month': 'هذا الشهر', - 'dashboard.analysis.all-week': 'هذا الاسبوع', - 'dashboard.analysis.all-day': 'اليوم', - 'dashboard.analysis.search-users': 'عدد مستخدمي البحث', - 'dashboard.analysis.per-capita-search': 'عمليات البحث للفرد', - 'dashboard.analysis.online-top-search': 'عمليات البحث الشائعة على الإنترنت', - 'dashboard.analysis.the-proportion-of-sales': 'نسبة فئة المبيعات', - 'dashboard.analysis.dropdown-option-one': 'العملية الأولى', - 'dashboard.analysis.dropdown-option-two': 'العملية 2', - 'dashboard.analysis.channel.all': 'جميع القنوات', - 'dashboard.analysis.channel.online': 'على الانترنت', - 'dashboard.analysis.channel.stores': 'متجر', - 'dashboard.analysis.sales': 'المبيعات', - 'dashboard.analysis.traffic': 'تدفق الركاب', - 'dashboard.analysis.table.rank': 'الترتيب', - 'dashboard.analysis.table.search-keyword': 'البحث عن الكلمات الرئيسية', - 'dashboard.analysis.table.users': 'عدد المستخدمين', - 'dashboard.analysis.table.weekly-range': 'زيادة أسبوعية', - 'dashboard.indicator.selectSymbol': 'حدد أو أدخل الرمز الأساسي', - 'dashboard.indicator.emptyWatchlistHint': 'لا يوجد حاليا أي أسهم مختارة ذاتيا، يرجى إضافتها أولا', - 'dashboard.indicator.hint.selectSymbol': 'الرجاء تحديد هدف لبدء التحليل', - 'dashboard.indicator.hint.selectSymbolDesc': 'حدد أو أدخل رمز السهم في مربع البحث أعلاه لعرض مخططات K-line والمؤشرات الفنية', - 'dashboard.indicator.retry': 'حاول مرة أخرى', - 'dashboard.indicator.panel.title': 'المؤشرات الفنية', - 'dashboard.indicator.panel.realtimeOn': 'قم بإيقاف تشغيل التحديثات في الوقت الفعلي', - 'dashboard.indicator.panel.realtimeOff': 'تمكين التحديثات في الوقت الحقيقي', - 'dashboard.indicator.panel.themeLight': 'التبديل إلى المظهر الداكن', - 'dashboard.indicator.panel.themeDark': 'التبديل إلى موضوع الضوء', - 'dashboard.indicator.section.enabled': 'ممكّن', - 'dashboard.indicator.section.added': 'المؤشرات التي أضفتها', - 'dashboard.indicator.section.custom': 'المؤشرات التي أنشأتها بنفسك', - 'dashboard.indicator.section.bought': 'المؤشرات التي اشتريتها', - 'dashboard.indicator.section.myCreated': 'المؤشرات التي قمت بإنشائها', - 'dashboard.indicator.empty': 'لا يوجد مؤشر حتى الآن، يرجى إضافة أو إنشاء مؤشر أولاً', - 'dashboard.indicator.buy': 'مؤشر الشراء', - 'dashboard.indicator.action.start': 'ابدأ', - 'dashboard.indicator.action.stop': 'إغلاق', - 'dashboard.indicator.action.edit': 'تحرير', - 'dashboard.indicator.action.delete': 'حذف', - 'dashboard.indicator.action.backtest': 'com.backtest', - 'dashboard.indicator.status.normal': 'عادي', - 'dashboard.indicator.status.normalPermanent': 'عادي (صالح بشكل دائم)', - 'dashboard.indicator.status.expired': 'انتهت صلاحيتها', - 'dashboard.indicator.expiry.permanent': 'صالحة بشكل دائم', - 'dashboard.indicator.expiry.noExpiry': 'لا يوجد وقت انتهاء الصلاحية', - 'dashboard.indicator.expiry.expired': 'انتهت الصلاحية: {التاريخ}', - 'dashboard.indicator.expiry.expiresOn': 'وقت انتهاء الصلاحية: {التاريخ}', - 'dashboard.indicator.delete.confirmTitle': 'تأكيد الحذف', - 'dashboard.indicator.delete.confirmContent': 'هل أنت متأكد أنك تريد حذف المؤشر "{name}"؟ هذه العملية لا رجعة فيها.', - 'dashboard.indicator.delete.confirmOk': 'حذف', - 'dashboard.indicator.delete.confirmCancel': 'إلغاء', - 'dashboard.indicator.delete.success': 'تم الحذف بنجاح', - 'dashboard.indicator.delete.failed': 'فشل الحذف', - 'dashboard.indicator.save.success': 'تم الحفظ بنجاح', - 'dashboard.indicator.save.failed': 'فشل الحفظ', - 'dashboard.indicator.error.loadWatchlistFailed': 'فشل تحميل الأسهم الاختيارية', - 'dashboard.indicator.error.chartNotReady': 'لم تتم تهيئة مكون المخطط. يرجى تحديد الهدف أولاً وانتظر حتى يتم تحميل المخطط.', - 'dashboard.indicator.error.chartMethodNotReady': 'طريقة مكون المخطط ليست جاهزة، يرجى المحاولة مرة أخرى لاحقًا', - 'dashboard.indicator.error.chartExecuteNotReady': 'طريقة تنفيذ مكون الرسم البياني ليست جاهزة، يرجى المحاولة مرة أخرى لاحقًا', - 'dashboard.indicator.error.parseFailed': 'غير قادر على تحليل كود بايثون', - 'dashboard.indicator.error.parseFailedCheck': 'غير قادر على تحليل كود بايثون، يرجى التحقق من تنسيق الكود', - 'dashboard.indicator.error.addIndicatorFailed': 'فشل في إضافة المؤشر', - 'dashboard.indicator.error.runIndicatorFailed': 'فشل مؤشر التشغيل', - 'dashboard.indicator.error.pleaseLogin': 'الرجاء تسجيل الدخول أولا', - 'dashboard.indicator.error.loadDataFailed': 'فشل تحميل البيانات', - 'dashboard.indicator.error.loadDataFailedDesc': 'يرجى التحقق من اتصال الشبكة', - 'dashboard.indicator.error.pythonEngineFailed': 'فشل محرك Python في التحميل وقد لا تكون وظيفة المؤشر متاحة.', - 'dashboard.indicator.error.chartInitFailed': 'فشلت تهيئة المخطط', - 'dashboard.indicator.warning.enterCode': 'الرجاء إدخال رمز المؤشر أولا', - 'dashboard.indicator.warning.pyodideLoadFailed': 'فشل محرك بايثون في التحميل', - 'dashboard.indicator.warning.pyodideLoadFailedDesc': 'هذه الميزة غير متوفرة في منطقتك الحالية أو بيئة الشبكة الحالية', - 'dashboard.indicator.warning.chartNotInitialized': 'لم تتم تهيئة المخطط ولا يمكن استخدام أداة رسم الخط.', - 'dashboard.indicator.success.runIndicator': 'يعمل المؤشر بنجاح', - 'dashboard.indicator.success.clearDrawings': 'تم مسح كافة الرسومات الخطية', - 'dashboard.indicator.sma': 'SMA (مجموعة المتوسطات المتحركة)', - 'dashboard.indicator.ema': 'EMA (مجموعة المتوسط المتحرك الأسي)', - 'dashboard.indicator.rsi': 'مؤشر القوة النسبية (القوة النسبية)', - 'dashboard.indicator.macd': 'ماكد', - 'dashboard.indicator.bb': 'بولينجر باند', - 'dashboard.indicator.atr': 'ATR (متوسط المدى الحقيقي)', - 'dashboard.indicator.cci': 'CCI (مؤشر قناة السلع)', - 'dashboard.indicator.williams': 'ويليامز %R (مؤشر ويليامز)', - 'dashboard.indicator.mfi': 'مؤسسات التمويل الأصغر (مؤشر تدفق الأموال)', - 'dashboard.indicator.adx': 'ADX (مؤشر الاتجاه المتوسط)', - 'dashboard.indicator.obv': 'OBV (موجة الطاقة)', - 'dashboard.indicator.adosc': 'ADOSC (مذبذب التجميع/الإرسال)', - 'dashboard.indicator.ad': 'AD (خط التجميع/التوزيع)', - 'dashboard.indicator.kdj': 'KDJ (مؤشر ستوكاستيك)', - 'dashboard.indicator.signal.buy': 'شراء', - 'dashboard.indicator.signal.sell': 'بيع', - 'dashboard.indicator.signal.supertrendBuy': 'شراء سوبر تريند', - 'dashboard.indicator.signal.supertrendSell': 'بيع سوبر تريند', - 'dashboard.indicator.chart.kline': 'خط K', - 'dashboard.indicator.chart.volume': 'الحجم', - 'dashboard.indicator.chart.uptrend': 'الاتجاه الصعودي', - 'dashboard.indicator.chart.downtrend': 'الاتجاه الهابط', - 'dashboard.indicator.tooltip.time': 'الوقت', - 'dashboard.indicator.tooltip.open': 'مفتوح', - 'dashboard.indicator.tooltip.close': 'تلقي', - 'dashboard.indicator.tooltip.high': 'عالية', - 'dashboard.indicator.tooltip.low': 'منخفض', - 'dashboard.indicator.tooltip.volume': 'الحجم', - 'dashboard.indicator.drawing.line': 'قطعة الخط', - 'dashboard.indicator.drawing.horizontalLine': 'خط أفقي', - 'dashboard.indicator.drawing.verticalLine': 'خط عمودي', - 'dashboard.indicator.drawing.ray': 'راي', - 'dashboard.indicator.drawing.straightLine': 'خط مستقيم', - 'dashboard.indicator.drawing.parallelLine': 'خطوط متوازية', - 'dashboard.indicator.drawing.priceLine': 'خط السعر', - 'dashboard.indicator.drawing.priceChannel': 'قناة السعر', - 'dashboard.indicator.drawing.fibonacciLine': 'خطوط فيبوناتشي', - 'dashboard.indicator.drawing.clearAll': 'مسح كافة الرسومات الخطية', - 'dashboard.indicator.market.AShare': 'أسهم', - 'dashboard.indicator.market.USStock': 'الأسهم الأمريكية', - 'dashboard.indicator.market.HShare': 'أسهم هونج كونج', - 'dashboard.indicator.market.Crypto': 'عملة مشفرة', - 'dashboard.indicator.market.Forex': 'الفوركس', - 'dashboard.indicator.market.Futures': 'العقود الآجلة', - 'dashboard.indicator.create': 'إنشاء مؤشر', - 'dashboard.indicator.editor.title': 'إنشاء/تحرير المؤشرات', - 'dashboard.indicator.editor.name': 'اسم المؤشر', - 'dashboard.indicator.editor.nameRequired': 'الرجاء إدخال اسم المؤشر', - 'dashboard.indicator.editor.namePlaceholder': 'الرجاء إدخال اسم المؤشر', - 'dashboard.indicator.editor.description': 'وصف المؤشر', - 'dashboard.indicator.editor.descriptionPlaceholder': 'الرجاء إدخال وصف للمؤشر (اختياري)', - 'dashboard.indicator.editor.code': 'كود بايثون', - 'dashboard.indicator.editor.codeRequired': 'الرجاء إدخال رمز المؤشر', - 'dashboard.indicator.editor.codePlaceholder': 'الرجاء إدخال رمز بايثون', - 'dashboard.indicator.editor.run': 'تشغيل', - 'dashboard.indicator.editor.runHint': 'انقر فوق زر التشغيل لمعاينة تأثير المؤشر على مخطط K-line', - 'dashboard.indicator.editor.guide': 'دليل التطوير', - 'dashboard.indicator.editor.guideTitle': 'دليل تطوير مؤشر بايثون', - 'dashboard.indicator.editor.save': 'حفظ', - 'dashboard.indicator.editor.cancel': 'إلغاء', - 'dashboard.indicator.editor.unnamed': 'مؤشر بدون اسم', - 'dashboard.indicator.editor.publishToCommunity': 'نشر إلى المجتمع', - 'dashboard.indicator.editor.publishToCommunityHint': 'بمجرد النشر، يمكن للمستخدمين الآخرين عرض واستخدام المؤشر الخاص بك في المجتمع', - 'dashboard.indicator.editor.indicatorType': 'نوع المؤشر', - 'dashboard.indicator.editor.indicatorTypeRequired': 'الرجاء تحديد نوع المؤشر', - 'dashboard.indicator.editor.indicatorTypePlaceholder': 'الرجاء تحديد نوع المؤشر', - 'dashboard.indicator.editor.previewImage': 'معاينة', - 'dashboard.indicator.editor.uploadImage': 'تحميل الصور', - 'dashboard.indicator.editor.previewImageHint': 'الحجم الموصى به: 800×400، ولا يزيد عن 2 ميجابايت', - 'dashboard.indicator.editor.pricing': 'سعر البيع (QDT)', - 'dashboard.indicator.editor.pricingType.free': 'مجانا', - 'dashboard.indicator.editor.pricingType.permanent': 'دائم', - 'dashboard.indicator.editor.pricingType.monthly': 'الدفع الشهري', - 'dashboard.indicator.editor.price': 'السعر', - 'dashboard.indicator.editor.priceRequired': 'الرجاء إدخال السعر', - 'dashboard.indicator.editor.pricePlaceholder': 'الرجاء إدخال السعر', - 'dashboard.indicator.editor.pricingHint': 'على الرغم من أن سعر المؤشرات المجانية هو 0، إلا أن المنصة ستكافئك (QDT) بناءً على استخدام المؤشر الخاص بك ومعدل الثناء.', - 'dashboard.indicator.editor.aiGenerate': 'جيل ذكي', - 'dashboard.indicator.editor.aiPromptPlaceholder': 'أخبرني بأفكارك وسأقوم بإنشاء رمز مؤشر بايثون لك', - 'dashboard.indicator.editor.aiGenerateBtn': 'كود تم إنشاؤه بواسطة الذكاء الاصطناعي', - 'dashboard.indicator.editor.aiPromptRequired': 'الرجاء إدخال أفكارك', - 'dashboard.indicator.editor.aiGenerateSuccess': 'تم إنشاء الكود بنجاح', - 'dashboard.indicator.editor.aiGenerateError': 'فشل إنشاء الكود، يرجى المحاولة مرة أخرى لاحقًا', - 'dashboard.indicator.backtest.title': 'اختبار خلفي للمؤشر', - 'dashboard.indicator.backtest.config': 'معلمات الاختبار الخلفي', - 'dashboard.indicator.backtest.startDate': 'تاريخ البدء', - 'dashboard.indicator.backtest.endDate': 'تاريخ الانتهاء', - 'dashboard.indicator.backtest.selectStartDate': 'حدد تاريخ البدء', - 'dashboard.indicator.backtest.selectEndDate': 'حدد تاريخ الانتهاء', - 'dashboard.indicator.backtest.startDateRequired': 'الرجاء تحديد تاريخ البدء', - 'dashboard.indicator.backtest.endDateRequired': 'الرجاء تحديد تاريخ الانتهاء', - 'dashboard.indicator.backtest.initialCapital': 'رأس المال الأولي', - 'dashboard.indicator.backtest.initialCapitalRequired': 'الرجاء إدخال الأموال الأولية', - 'dashboard.indicator.backtest.commission': 'رسوم المناولة', - 'dashboard.indicator.backtest.leverage': 'نسبة الرافعة المالية', - 'dashboard.indicator.backtest.tradeDirection': 'اتجاه التداول', - 'dashboard.indicator.backtest.longOnly': 'اذهب لفترة طويلة', - 'dashboard.indicator.backtest.shortOnly': 'قصيرة', - 'dashboard.indicator.backtest.both': 'في اتجاهين', - 'dashboard.indicator.backtest.run': 'ابدأ الاختبار الخلفي', - 'dashboard.indicator.backtest.rerun': 'باك تست مرة أخرى', - 'dashboard.indicator.backtest.close': 'إغلاق', - 'dashboard.indicator.backtest.running': 'الاختبار الخلفي للمؤشر قيد التقدم...', - 'dashboard.indicator.backtest.results': 'نتائج الاختبار الخلفي', - 'dashboard.indicator.backtest.totalReturn': 'العائد الإجمالي', - 'dashboard.indicator.backtest.annualReturn': 'الدخل السنوي', - 'dashboard.indicator.backtest.maxDrawdown': 'الحد الأقصى للسحب', - 'dashboard.indicator.backtest.sharpeRatio': 'نسبة شارب', - 'dashboard.indicator.backtest.winRate': 'معدل الفوز', - 'dashboard.indicator.backtest.profitFactor': 'نسبة الربح إلى الخسارة', - 'dashboard.indicator.backtest.totalTrades': 'عدد المعاملات', - 'dashboard.indicator.totalReturn': 'العائد الإجمالي', - 'dashboard.indicator.annualReturn': 'معدل العائد السنوي', - 'dashboard.indicator.maxDrawdown': 'الحد الأقصى للسحب', - 'dashboard.indicator.sharpeRatio': 'نسبة شارب', - 'dashboard.indicator.winRate': 'معدل الفوز', - 'dashboard.indicator.profitFactor': 'نسبة الربح إلى الخسارة', - 'dashboard.indicator.totalTrades': 'إجمالي عدد المعاملات', - 'dashboard.indicator.backtest.totalCommission': 'إجمالي رسوم المناولة', - 'dashboard.indicator.backtest.equityCurve': 'منحنى العائد', - 'dashboard.indicator.backtest.strategy': 'دخل المؤشر', - 'dashboard.indicator.backtest.benchmark': 'العودة المرجعية', - 'dashboard.indicator.backtest.tradeHistory': 'تاريخ المعاملة', - 'dashboard.indicator.backtest.tradeTime': 'الوقت', - 'dashboard.indicator.backtest.tradeType': 'اكتب', - 'dashboard.indicator.backtest.buy': 'شراء', - 'dashboard.indicator.backtest.sell': 'بيع', - 'dashboard.indicator.backtest.liquidation': 'التصفية', - 'dashboard.indicator.backtest.openLong': 'مفتوح لفترة طويلة', - 'dashboard.indicator.backtest.closeLong': 'بيندو', - 'dashboard.indicator.backtest.closeLongStop': 'قريب من الشراء (وقف الخسارة)', - 'dashboard.indicator.backtest.closeLongProfit': 'إغلاق المزيد (جني الأرباح)', - 'dashboard.indicator.backtest.addLong': 'إضافة موقف طويل', - 'dashboard.indicator.backtest.openShort': 'فتح قصيرة', - 'dashboard.indicator.backtest.closeShort': 'فارغ', - 'dashboard.indicator.backtest.closeShortStop': 'إغلاق (وقف الخسارة)', - 'dashboard.indicator.backtest.closeShortProfit': 'إغلاق (جني الأرباح)', - 'dashboard.indicator.backtest.addShort': 'إضافة موقف قصير', - 'dashboard.indicator.backtest.price': 'السعر', - 'dashboard.indicator.backtest.amount': 'الكمية', - 'dashboard.indicator.backtest.balance': 'رصيد الحساب', - 'dashboard.indicator.backtest.profit': 'الربح والخسارة', - 'dashboard.indicator.backtest.success': 'تم الانتهاء من الاختبار الخلفي', - 'dashboard.indicator.backtest.failed': 'فشل الاختبار الخلفي، يرجى المحاولة مرة أخرى لاحقًا', - 'dashboard.indicator.backtest.noIndicatorCode': 'لا يوجد رمز قابل للاختبار الخلفي لهذا المؤشر', - 'dashboard.indicator.backtest.noSymbol': 'يرجى تحديد هدف المعاملة أولاً', - 'dashboard.indicator.backtest.dateRangeExceeded': 'يتجاوز النطاق الزمني للاختبار الخلفي الحد الأقصى: يمكن اختبار الفترة الزمنية {timeframe} بحد أقصى {maxRange}', - 'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)', - 'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}', - 'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}', - 'dashboard.indicator.backtest.prev': 'Previous', - 'dashboard.indicator.backtest.next': 'Next', - 'dashboard.indicator.backtest.steps.strategy.title': 'Strategy', - 'dashboard.indicator.backtest.steps.strategy.desc': 'Position sizing & risk controls', - 'dashboard.indicator.backtest.steps.trading.title': 'Trading settings', - 'dashboard.indicator.backtest.steps.trading.desc': 'Time range, capital, fees, leverage', - 'dashboard.indicator.backtest.steps.results.title': 'Results', - 'dashboard.indicator.backtest.steps.results.desc': 'Backtest output', - 'dashboard.indicator.backtest.panel.risk': 'Risk management (SL/TP/Trailing)', - 'dashboard.indicator.backtest.panel.scale': 'Scale in / DCA (trend & mean-reversion)', - 'dashboard.indicator.backtest.panel.reduce': 'Reduce position (trend & adverse)', - 'dashboard.indicator.backtest.panel.position': 'Position sizing', - 'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)', - 'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)', - 'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit', - 'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)', - 'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)', - 'dashboard.indicator.backtest.field.slippage': 'Slippage (%)', - 'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in', - 'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion DCA', - 'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.dcaAddStepPct': 'DCA trigger (%)', - 'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.dcaAddSizePct': 'DCA size (% of capital)', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max DCA times', - 'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce', - 'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)', - 'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times', - 'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)', - 'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)', - 'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)', - 'dashboard.indicator.backtest.reduceLong': 'Reduce Long', - 'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)', - 'dashboard.indicator.backtest.reduceShort': 'Reduce Short', - 'dashboard.docs.title': 'مركز الوثائق', - 'dashboard.docs.search.placeholder': 'بحث في المستندات...', - 'dashboard.docs.category.all': 'الكل', - 'dashboard.docs.category.guide': 'دليل التطوير', - 'dashboard.docs.category.api': 'وثائق واجهة برمجة التطبيقات', - 'dashboard.docs.category.tutorial': 'البرنامج التعليمي', - 'dashboard.docs.category.faq': 'الأسئلة الشائعة', - 'dashboard.docs.featured.title': 'الوثائق الموصى بها', - 'dashboard.docs.featured.tag': 'موصى به', - 'dashboard.docs.list.views': 'تصفح', - 'dashboard.docs.list.author': 'المؤلف', - 'dashboard.docs.list.empty': 'لا توجد وثيقة بعد', - 'dashboard.docs.list.backToAll': 'العودة إلى جميع الوثائق', - 'dashboard.docs.list.total': '{count} من المستندات في المجموع', - 'dashboard.docs.detail.back': 'العودة إلى قائمة المستندات', - 'dashboard.docs.detail.updatedAt': 'تم التحديث على', - 'dashboard.docs.detail.related': 'الوثائق ذات الصلة', - 'dashboard.docs.detail.notFound': 'الوثيقة غير موجودة', - 'dashboard.docs.detail.error': 'المستند غير موجود أو تم حذفه', - 'dashboard.docs.search.result': 'نتائج البحث', - 'dashboard.docs.search.keyword': 'الكلمات الرئيسية', - 'community.filter.indicatorType': 'نوع المؤشر', - 'community.filter.all': 'الكل', - 'community.filter.other': 'خيارات أخرى', - 'community.filter.pricing': 'نوع التسعير', - 'community.filter.allPricing': 'جميع التسعير', - 'community.filter.sortBy': 'الترتيب حسب', - 'community.filter.search': 'بحث', - 'community.filter.searchPlaceholder': 'البحث عن اسم المقياس', - 'community.indicatorType.trend': 'نوع الاتجاه', - 'community.indicatorType.momentum': 'نوع الزخم', - 'community.indicatorType.volatility': 'التقلب', - 'community.indicatorType.volume': 'الحجم', - 'community.indicatorType.custom': 'تخصيص', - 'community.pricing.free': 'مجانا', - 'community.pricing.paid': 'ادفع', - 'community.sort.downloads': 'التنزيلات', - 'community.sort.rating': 'التقييم', - 'community.sort.newest': 'أحدث الإصدارات', - 'community.pagination.total': '{total} مؤشرات في المجموع', - 'community.noDescription': 'لا يوجد وصف بعد', - 'community.detail.type': 'اكتب', - 'community.detail.pricing': 'التسعير', - 'community.detail.rating': 'التقييم', - 'community.detail.downloads': 'التنزيلات', - 'community.detail.author': 'المؤلف', - 'community.detail.description': 'مقدمة', - 'community.detail.detailContent': 'وصف تفصيلي', - 'community.detail.backtestStats': 'إحصائيات الاختبار الخلفي', - 'community.action.purchase': 'مؤشر الشراء', - 'community.action.addToMyIndicators': 'أضف إلى مؤشراتي', - 'community.action.favorite': 'المجموعة', - 'community.action.unfavorite': 'إلغاء المفضلة', - 'community.action.buyNow': 'اشتري الآن', - 'community.action.renew': 'التجديد', - 'community.purchase.price': 'السعر', - 'community.purchase.permanent': 'دائم', - 'community.purchase.monthly': 'شهر', - 'community.purchase.confirmBuy': 'هل تريد تأكيد شراء هذا المؤشر ({price} QDT)؟', - 'community.purchase.confirmRenew': 'هل تريد تأكيد تجديد هذا المؤشر ({price} QDT/month)؟', - 'community.purchase.confirmFree': 'هل تريد تأكيد إضافة هذا المؤشر المجاني؟', - 'community.purchase.confirmTitle': 'تأكيد الإجراء', - 'community.purchase.owned': 'لقد قمت بشراء هذا المؤشر (صالح بشكل دائم)', - 'community.purchase.ownIndicator': 'هذا هو المقياس الذي نشرته', - 'community.purchase.expired': 'لقد انتهت صلاحية اشتراكك', - 'community.purchase.expiresOn': 'وقت انتهاء الصلاحية: {التاريخ}', - 'community.tabs.detail': 'تفاصيل المؤشر', - 'community.tabs.backtest': 'بيانات الاختبار الخلفي', - 'community.tabs.ratings': 'مراجعات المستخدم', - 'community.rating.myRating': 'تقييمي', - 'community.rating.stars': '{عد} النجوم', - 'community.rating.commentPlaceholder': 'شارك تجربتك...', - 'community.rating.submit': 'إرسال التقييم', - 'community.rating.modify': 'تعديل', - 'community.rating.saveModify': 'حفظ التغييرات', - 'community.rating.cancel': 'إلغاء', - 'community.rating.selectRating': 'الرجاء تحديد التقييم', - 'community.rating.success': 'التقييم ناجح', - 'community.rating.modifySuccess': 'تم تعديل المراجعة بنجاح', - 'community.rating.failed': 'فشل التقييم', - 'community.rating.noRatings': 'لا توجد تعليقات حتى الآن', - 'community.backtest.note': 'البيانات المذكورة أعلاه هي نتائج اختبار خلفي تاريخية وهي للإشارة فقط ولا تمثل أرباحًا مستقبلية.', - 'community.backtest.noData': 'لا توجد بيانات باكتست حتى الآن', - 'community.backtest.uploadHint': 'لم يقم المؤلف بتحميل بيانات الاختبار الخلفي حتى الآن', - 'community.message.loadFailed': 'فشل تحميل قائمة المؤشرات', - 'community.message.purchaseProcessing': 'جارٍ معالجة طلب الشراء...', - 'community.message.downloadSuccess': 'تمت إضافة المقياس إلى قائمة المقاييس الخاصة بي', - 'community.message.favoriteSuccess': 'تم التجميع بنجاح', - 'community.message.unfavoriteSuccess': 'تم إلغاء التجميع بنجاح', - 'community.message.operationSuccess': 'العملية ناجحة', - 'community.message.operationFailed': 'فشلت العملية', - 'community.banner.readOnly': 'للقراءة فقط', - 'community.banner.loginHint': 'لل تسجيل الدخول أو التسجيل، يرجى النقر على الزر للانتقال إلى صفحة مستقلة لتجنب مشاكل CSRF', - 'community.banner.jumpButton': 'الانتقال إلى تسجيل الدخول/التسجيل', - 'dashboard.totalEquity': 'إجمالي حقوق الملكية', - 'dashboard.totalPnL': 'إجمالي الربح والخسارة', - 'dashboard.aiStrategies': 'استراتيجية الذكاء الاصطناعي', - 'dashboard.indicatorStrategies': 'استراتيجية المؤشر', - 'dashboard.running': 'الجري', - 'dashboard.pnlHistory': 'الأرباح والخسائر التاريخية', - 'dashboard.strategyPerformance': 'نسبة الربح والخسارة في الاستراتيجية', - 'dashboard.recentTrades': 'المعاملات الأخيرة', - 'dashboard.currentPositions': 'الوضع الحالي', - 'dashboard.table.time': 'الوقت', - 'dashboard.table.strategy': 'اسم السياسة', - 'dashboard.table.symbol': 'الهدف', - 'dashboard.table.type': 'اكتب', - 'dashboard.table.side': 'الاتجاه', - 'dashboard.table.size': 'الفائدة المفتوحة', - 'dashboard.table.entryPrice': 'متوسط سعر الافتتاح', - 'dashboard.table.price': 'السعر', - 'dashboard.table.amount': 'الكمية', - 'dashboard.table.profit': 'الربح والخسارة', - 'dashboard.pendingOrders': 'سجل تنفيذ الطلبات', - 'dashboard.totalOrders': 'إجمالي {total} طلب', - 'dashboard.viewError': 'عرض الخطأ', - 'dashboard.filled': 'تم التنفيذ', - 'dashboard.orderTable.time': 'وقت الإنشاء', - 'dashboard.orderTable.strategy': 'الإستراتيجية', - 'dashboard.orderTable.symbol': 'زوج التداول', - 'dashboard.orderTable.signalType': 'نوع الإشارة', - 'dashboard.orderTable.amount': 'الكمية', - 'dashboard.orderTable.price': 'سعر التنفيذ', - 'dashboard.orderTable.status': 'الحالة', - 'dashboard.orderTable.executedAt': 'وقت التنفيذ', - 'dashboard.signalType.openLong': 'فتح Long', - 'dashboard.signalType.openShort': 'فتح Short', - 'dashboard.signalType.closeLong': 'إغلاق Long', - 'dashboard.signalType.closeShort': 'إغلاق Short', - 'dashboard.signalType.addLong': 'إضافة Long', - 'dashboard.signalType.addShort': 'إضافة Short', - 'dashboard.status.pending': 'قيد الانتظار', - 'dashboard.status.processing': 'قيد المعالجة', - 'dashboard.status.completed': 'مكتمل', - 'dashboard.status.failed': 'فشل', - 'dashboard.status.cancelled': 'ملغي', - 'dashboard.table.pnl': 'الربح أو الخسارة غير المحققة', - 'form.basic-form.basic.title': 'الشكل الأساسي', - 'form.basic-form.basic.description': 'تُستخدم صفحات النماذج لجمع المعلومات من المستخدمين أو التحقق منها. تُستخدم النماذج الأساسية بشكل شائع في سيناريوهات النماذج التي تحتوي على عدد قليل من عناصر البيانات.', - 'form.basic-form.title.label': 'العنوان', - 'form.basic-form.title.placeholder': 'إعطاء الهدف اسما', - 'form.basic-form.title.required': 'الرجاء إدخال عنوان', - 'form.basic-form.date.label': 'تاريخ البدء والانتهاء', - 'form.basic-form.placeholder.start': 'تاريخ البدء', - 'form.basic-form.placeholder.end': 'تاريخ الانتهاء', - 'form.basic-form.date.required': 'الرجاء تحديد تاريخي البدء والانتهاء', - 'form.basic-form.goal.label': 'وصف الهدف', - 'form.basic-form.goal.placeholder': 'الرجاء إدخال أهداف العمل المرحلية', - 'form.basic-form.goal.required': 'الرجاء إدخال وصف الهدف', - 'form.basic-form.standard.label': 'قياس', - 'form.basic-form.standard.placeholder': 'الرجاء إدخال المقاييس', - 'form.basic-form.standard.required': 'الرجاء إدخال المقاييس', - 'form.basic-form.client.label': 'العميل', - 'form.basic-form.client.required': 'يرجى وصف العملاء الذين تخدمهم', - 'form.basic-form.label.tooltip': 'متلقي الخدمة المستهدفين', - 'form.basic-form.client.placeholder': 'يرجى وصف العملاء الذين تخدمهم، والعملاء الداخليين مباشرةً @الاسم/رقم الوظيفة', - 'form.basic-form.invites.label': 'دعوة المراجعين', - 'form.basic-form.invites.placeholder': 'يرجى إرسال @الاسم/رقم الموظف مباشرةً، ويمكنك دعوة ما يصل إلى 5 أشخاص', - 'form.basic-form.weight.label': 'الوزن', - 'form.basic-form.weight.placeholder': 'من فضلك أدخل', - 'form.basic-form.public.label': 'تستهدف الجمهور', - 'form.basic-form.label.help': 'تتم مشاركة العملاء والمراجعين بشكل افتراضي', - 'form.basic-form.radio.public': 'عام', - 'form.basic-form.radio.partially-public': 'عامة جزئيا', - 'form.basic-form.radio.private': 'خاص', - 'form.basic-form.publicUsers.placeholder': 'مفتوح ل', - 'form.basic-form.option.A': 'زميل 1', - 'form.basic-form.option.B': 'زميل 2', - 'form.basic-form.option.C': 'زميل ثلاثة', - 'form.basic-form.email.required': 'الرجاء إدخال عنوان البريد الإلكتروني الخاص بك!', - 'form.basic-form.email.wrong-format': 'تنسيق عنوان البريد الإلكتروني خاطئ!', - 'form.basic-form.userName.required': 'الرجاء إدخال اسم المستخدم!', - 'form.basic-form.password.required': 'الرجاء إدخال كلمة المرور الخاصة بك!', - 'form.basic-form.password.twice': 'كلمات المرور التي تم إدخالها مرتين غير متطابقة!', - 'form.basic-form.strength.msg': 'الرجاء إدخال 6 أحرف على الأقل. يرجى عدم استخدام كلمات المرور التي يمكن تخمينها بسهولة.', - 'form.basic-form.strength.strong': 'القوة : قوية', - 'form.basic-form.strength.medium': 'القوة: متوسطة', - 'form.basic-form.strength.short': 'القوة : قصيرة جداً', - 'form.basic-form.confirm-password.required': 'الرجاء تأكيد كلمة المرور الخاصة بك!', - 'form.basic-form.phone-number.required': 'الرجاء إدخال رقم هاتفك المحمول!', - 'form.basic-form.phone-number.wrong-format': 'تنسيق رقم الهاتف المحمول خاطئ!', - 'form.basic-form.verification-code.required': 'الرجاء إدخال رمز التحقق!', - 'form.basic-form.form.get-captcha': 'الحصول على رمز التحقق', - 'form.basic-form.captcha.second': 'ثواني', - 'form.basic-form.form.optional': '(اختياري)', - 'form.basic-form.form.submit': 'إرسال', - 'form.basic-form.form.save': 'حفظ', - 'form.basic-form.email.placeholder': 'البريد الإلكتروني', - 'form.basic-form.password.placeholder': 'كلمة المرور مكونة من 6 أحرف على الأقل، حساسة لحالة الأحرف', - 'form.basic-form.confirm-password.placeholder': 'تأكيد كلمة المرور', - 'form.basic-form.phone-number.placeholder': 'رقم الهاتف المحمول', - 'form.basic-form.verification-code.placeholder': 'رمز التحقق', - 'result.success.title': 'تم التقديم بنجاح', - 'result.success.description': 'يتم استخدام صفحة نتائج الإرسال لتقديم تعليقات على نتائج المعالجة لسلسلة من مهام التشغيل. إذا كانت عملية بسيطة فقط، فاستخدم رسالة الملاحظات العامة السريعة. يمكن لمنطقة النص هذه عرض تعليمات تكميلية بسيطة. إذا كانت هناك حاجة لعرض "المستندات"، فيمكن للمنطقة الرمادية أدناه عرض محتوى أكثر تعقيدًا.', - 'result.success.operate-title': 'اسم المشروع', - 'result.success.operate-id': 'معرف المشروع', - 'result.success.principal': 'الشخص المسؤول', - 'result.success.operate-time': 'الوقت الفعال', - 'result.success.step1-title': 'إنشاء مشروع', - 'result.success.step1-operator': 'تشو ليلي', - 'result.success.step2-title': 'المراجعة الأولية للقسم', - 'result.success.step2-operator': 'تشو ماوماو', - 'result.success.step2-extra': 'عاجل', - 'result.success.step3-title': 'المراجعة المالية', - 'result.success.step4-title': 'كامل', - 'result.success.btn-return': 'العودة إلى القائمة', - 'result.success.btn-project': 'عرض العناصر', - 'result.success.btn-print': 'طباعة', - 'result.fail.error.title': 'فشل التقديم', - 'result.fail.error.description': 'يرجى التحقق من المعلومات التالية وتعديلها قبل إعادة الإرسال.', - 'result.fail.error.hint-title': 'يحتوي المحتوى الذي أرسلته على الأخطاء التالية:', - 'result.fail.error.hint-text1': 'لقد تم تجميد حسابك', - 'result.fail.error.hint-btn1': 'ذوبان الجليد على الفور', - 'result.fail.error.hint-text2': 'حسابك ليس مؤهلاً بعد للتقديم', - 'result.fail.error.hint-btn2': 'قم بالترقية الآن', - 'result.fail.error.btn-text': 'العودة إلى التعديل', - 'account.settings.menuMap.custom': 'التخصيص', - 'account.settings.menuMap.binding': 'ربط الحساب', - 'account.settings.basic.avatar': 'الصورة الرمزية', - 'account.settings.basic.change-avatar': 'تغيير الصورة الرمزية', - 'account.settings.basic.email': 'البريد الإلكتروني', - 'account.settings.basic.email-message': 'الرجاء إدخال البريد الإلكتروني الخاص بك!', - 'account.settings.basic.nickname': 'اللقب', - 'account.settings.basic.nickname-message': 'الرجاء إدخال اللقب الخاص بك!', - 'account.settings.basic.profile': 'الملف الشخصي', - 'account.settings.basic.profile-message': 'الرجاء إدخال ملف التعريف الشخصي الخاص بك!', - 'account.settings.basic.profile-placeholder': 'الملف الشخصي', - 'account.settings.basic.country': 'البلد/المنطقة', - 'account.settings.basic.country-message': 'الرجاء إدخال بلدك أو منطقتك!', - 'account.settings.basic.geographic': 'المحافظة والمدينة', - 'account.settings.basic.geographic-message': 'من فضلك أدخل محافظتك ومدينتك!', - 'account.settings.basic.address': 'عنوان الشارع', - 'account.settings.basic.address-message': 'الرجاء إدخال عنوان الشارع الخاص بك!', - 'account.settings.basic.phone': 'رقم الاتصال', - 'account.settings.basic.phone-message': 'الرجاء إدخال رقم الاتصال الخاص بك!', - 'account.settings.basic.update': 'تحديث المعلومات الأساسية', - 'account.settings.basic.update.success': 'تم تحديث المعلومات الأساسية بنجاح', - 'account.settings.security.strong': 'قوي', - 'account.settings.security.medium': 'في', - 'account.settings.security.weak': 'ضعيف', - 'account.settings.security.password': 'كلمة مرور الحساب', - 'account.settings.security.password-description': 'قوة كلمة المرور الحالية:', - 'account.settings.security.phone': 'الهاتف المحمول الأمن', - 'account.settings.security.phone-description': 'الهاتف المحمول المرتبط بالفعل:', - 'account.settings.security.question': 'القضايا الأمنية', - 'account.settings.security.question-description': 'لم يتم تعيين أي أسئلة أمنية، الأمر الذي يمكن أن يحمي أمان الحساب بشكل فعال.', - 'account.settings.security.email': 'ربط البريد الإلكتروني', - 'account.settings.security.email-description': 'عنوان البريد الإلكتروني المرتبط بالفعل:', - 'account.settings.security.mfa': 'جهاز ام اف ايه', - 'account.settings.security.mfa-description': 'جهاز MFA غير مقيد. بعد الربط، يمكنك التأكيد مرة أخرى.', - 'account.settings.security.modify': 'تعديل', - 'account.settings.security.set': 'الإعدادات', - 'account.settings.security.bind': 'ملزمة', - 'account.settings.binding.taobao': 'ربط تاوباو', - 'account.settings.binding.taobao-description': 'حساب تاوباو غير ملزم حاليا', - 'account.settings.binding.alipay': 'ربط عليباي', - 'account.settings.binding.alipay-description': 'حساب Alipay غير ملزم حاليا', - 'account.settings.binding.dingding': 'ملزمة DingTalk', - 'account.settings.binding.dingding-description': 'لا يوجد حساب DingTalk مرتبط حاليًا', - 'account.settings.binding.bind': 'ملزمة', - 'account.settings.notification.password': 'كلمة مرور الحساب', - 'account.settings.notification.password-description': 'سيتم إخطار الرسائل الواردة من المستخدمين الآخرين في شكل رسائل موقع.', - 'account.settings.notification.messages': 'رسائل النظام', - 'account.settings.notification.messages-description': 'سيتم إخطار رسائل النظام في شكل رسائل الموقع.', - 'account.settings.notification.todo': 'المهام الواجبة', - 'account.settings.notification.todo-description': 'سيتم إخطار المهام الواجبة في شكل رسائل داخل الموقع', - 'account.settings.settings.open': 'مفتوح', - 'account.settings.settings.close': 'قريب', - 'trading-assistant.title': 'مساعد التداول', - 'trading-assistant.strategyList': 'قائمة الإستراتيجية', - 'trading-assistant.createStrategy': 'إنشاء سياسة', - 'trading-assistant.noStrategy': 'لا توجد استراتيجية حتى الآن', - 'trading-assistant.selectStrategy': 'يرجى تحديد استراتيجية من اليسار لعرض التفاصيل', - 'trading-assistant.startStrategy': 'استراتيجية الإطلاق', - 'trading-assistant.stopStrategy': 'استراتيجية التوقف', - 'trading-assistant.editStrategy': 'استراتيجية التحرير', - 'trading-assistant.deleteStrategy': 'حذف السياسة', - 'trading-assistant.status.running': 'الجري', - 'trading-assistant.status.stopped': 'توقف', - 'trading-assistant.status.error': 'خطأ', - 'trading-assistant.strategyType.IndicatorStrategy': 'استراتيجية المؤشر الفني', - 'trading-assistant.strategyType.PromptBasedStrategy': 'استراتيجية الكلمات الدلالية', - 'trading-assistant.strategyType.GridStrategy': 'استراتيجية الشبكة', - 'trading-assistant.tabs.tradingRecords': 'تاريخ المعاملة', - 'trading-assistant.tabs.positions': 'سجل الموقف', - 'trading-assistant.tabs.equityCurve': 'منحنى الأسهم', - 'trading-assistant.form.step1': 'حدد المؤشرات', - 'trading-assistant.form.step2': 'تكوين الصرف', - 'trading-assistant.form.step3': 'معلمات الاستراتيجية', - 'trading-assistant.form.indicator': 'حدد المؤشرات', - 'trading-assistant.form.indicatorHint': 'يمكنك فقط تحديد المؤشرات الفنية التي اشتريتها أو أنشأتها', - 'trading-assistant.form.qdtCostHints': 'سيؤدي استخدام الإستراتيجية إلى استهلاك QDT، يرجى التأكد من أن الحساب به رصيد كافٍ من QDT', - 'trading-assistant.form.indicatorDescription': 'وصف المؤشر', - 'trading-assistant.form.noDescription': 'لا يوجد وصف بعد', - 'trading-assistant.form.exchange': 'اختر الصرف', - 'trading-assistant.form.apiKey': 'مفتاح واجهة برمجة التطبيقات', - 'trading-assistant.form.secretKey': 'المفتاح السري', - 'trading-assistant.form.passphrase': 'عبارة المرور', - 'trading-assistant.form.testConnection': 'اتصال الاختبار', - 'trading-assistant.form.strategyName': 'اسم السياسة', - 'trading-assistant.form.symbol': 'زوج التداول', - 'trading-assistant.form.symbolHint': 'حاليًا، يتم دعم أزواج تداول العملات المشفرة فقط', - 'trading-assistant.form.initialCapital': 'حجم الاستثمار', - 'trading-assistant.form.marketType': 'نوع السوق', - 'trading-assistant.form.marketTypeFutures': 'العقد', - 'trading-assistant.form.marketTypeSpot': 'بقعة', - 'trading-assistant.form.marketTypeHint': 'يدعم العقد التداول في اتجاهين والرافعة المالية، في حين أن السعر الفوري يدعم فقط المراكز الطويلة والرافعة المالية ثابتة عند 1x', - 'trading-assistant.form.leverage': 'الاستفادة المتعددة', - 'trading-assistant.form.leverageHint': 'العقد: 1-125 مرة، البقعة: ثابتة 1 مرة', - 'trading-assistant.form.spotLeverageFixed': 'الرافعة المالية للتداول الفوري ثابتة عند 1x', - 'trading-assistant.form.spotOnlyLongHint': 'التداول الفوري يدعم فقط المراكز الطويلة', - 'trading-assistant.form.tradeDirection': 'اتجاه التداول', - 'trading-assistant.form.tradeDirectionLong': 'طويلة فقط', - 'trading-assistant.form.tradeDirectionShort': 'قصيرة فقط', - 'trading-assistant.form.tradeDirectionBoth': 'معاملة في اتجاهين', - 'trading-assistant.form.timeframe': 'الفترة الزمنية', - 'trading-assistant.form.klinePeriod': 'فترة K-Line', - 'trading-assistant.form.timeframe1m': '1 دقيقة', - 'trading-assistant.form.timeframe5m': '5 دقائق', - 'trading-assistant.form.timeframe15m': '15 دقيقة', - 'trading-assistant.form.timeframe30m': '30 دقيقة', - 'trading-assistant.form.timeframe1H': '1 ساعة', - 'trading-assistant.form.timeframe4H': '4 ساعات', - 'trading-assistant.form.timeframe1D': 'يوم واحد', - 'trading-assistant.form.selectStrategyType': 'اختر نوع الاستراتيجية', - 'trading-assistant.form.indicatorStrategy': 'استراتيجية المؤشر', - 'trading-assistant.form.indicatorStrategyDesc': 'استراتيجية تداول آلية تعتمد على المؤشرات الفنية', - 'trading-assistant.form.aiStrategy': 'استراتيجية AI', - 'trading-assistant.form.aiStrategyDesc': 'استراتيجية تداول آلية تعتمد على اتخاذ القرار الذكي للذكاء الاصطناعي', - 'trading-assistant.form.enableAiFilter': 'تفعيل مرشح اتخاذ القرار الذكي للذكاء الاصطناعي', - 'trading-assistant.form.enableAiFilterHint': 'عند التفعيل، سيتم تصفية إشارات المؤشر بواسطة الذكاء الاصطناعي لتحسين جودة التداول', - 'trading-assistant.form.aiFilterPrompt': 'موجه مخصص', - 'trading-assistant.form.aiFilterPromptHint': 'توفير تعليمات مخصصة لتصفية الذكاء الاصطناعي، اتركه فارغًا لاستخدام الإعداد الافتراضي للنظام', - 'trading-assistant.validation.strategyTypeRequired': 'يرجى اختيار نوع الاستراتيجية', - 'trading-assistant.form.advancedSettings': 'الإعدادات المتقدمة', - 'trading-assistant.form.orderMode': 'وضع الطلب', - 'trading-assistant.form.orderModeMaker': 'صانع', - 'trading-assistant.form.orderModeTaker': 'سعر السوق (المتلقي)', - 'trading-assistant.form.orderModeHint': 'يستخدم وضع الأمر المعلق أوامر الحد وتكون رسوم المناولة أقل؛ يتم تنفيذ وضع سعر السوق على الفور وتكون رسوم المناولة أعلى.', - 'trading-assistant.form.makerWaitSec': 'وقت الانتظار للأوامر المعلقة (ثواني)', - 'trading-assistant.form.makerWaitSecHint': 'الوقت اللازم لانتظار المعاملة بعد تقديم الطلب. قم بالإلغاء وحاول مرة أخرى بعد انتهاء المهلة.', - 'trading-assistant.form.makerRetries': 'عدد مرات إعادة المحاولة للأوامر المعلقة', - 'trading-assistant.form.makerRetriesHint': 'الحد الأقصى لعدد مرات إعادة المحاولة عندما لا يتم تنفيذ الأمر المعلق', - 'trading-assistant.form.fallbackToMarket': 'يفشل الأمر المعلق ويتم تخفيض سعر السوق.', - 'trading-assistant.form.fallbackToMarketHint': 'عندما لا يتم إكمال أمر الفتح/الإغلاق المعلق، ما إذا كان ينبغي تخفيضه إلى أمر سوق لضمان اكتمال المعاملة.', - 'trading-assistant.form.marginMode': 'وضع الهامش', - 'trading-assistant.form.marginModeCross': 'مستودع كامل', - 'trading-assistant.form.marginModeIsolated': 'موقف معزول', - 'trading-assistant.form.stopLossPct': 'نسبة وقف الخسارة (٪)', - 'trading-assistant.form.stopLossPctHint': 'قم بتعيين نسبة وقف الخسارة، 0 يعني عدم تمكين وقف الخسارة', - 'trading-assistant.form.takeProfitPct': 'نسبة جني الأرباح (%)', - 'trading-assistant.form.takeProfitPctHint': 'قم بتعيين نسبة أخذ الربح، 0 يعني تعطيل أخذ الربح', - 'trading-assistant.form.signalMode': 'وضع الإشارة', - 'trading-assistant.form.signalModeConfirmed': 'تأكيد الوضع', - 'trading-assistant.form.signalModeAggressive': 'الوضع العدواني', - 'trading-assistant.form.signalModeHint': 'وضع التأكيد: يتحقق فقط من خطوط K المكتملة؛ الوضع العدواني: يتحقق أيضًا من تشكيل خطوط K', - 'trading-assistant.form.cancel': 'إلغاء', - 'trading-assistant.form.prev': 'الخطوة السابقة', - 'trading-assistant.form.next': 'الخطوة التالية', - 'trading-assistant.form.confirmCreate': 'تأكيد الإنشاء', - 'trading-assistant.form.confirmEdit': 'تأكيد التغييرات', - 'trading-assistant.messages.createSuccess': 'تم إنشاء الإستراتيجية بنجاح', - 'trading-assistant.messages.createFailed': 'فشل في إنشاء السياسة', - 'trading-assistant.messages.updateSuccess': 'تم تحديث السياسة بنجاح', - 'trading-assistant.messages.updateFailed': 'فشل تحديث السياسة', - 'trading-assistant.messages.deleteSuccess': 'تم حذف السياسة بنجاح', - 'trading-assistant.messages.deleteFailed': 'فشل سياسة الحذف', - 'trading-assistant.messages.startSuccess': 'بدأت الإستراتيجية بنجاح', - 'trading-assistant.messages.startFailed': 'فشل في بدء السياسة', - 'trading-assistant.messages.stopSuccess': 'تم إيقاف الإستراتيجية بنجاح', - 'trading-assistant.messages.stopFailed': 'فشلت استراتيجية التوقف', - 'trading-assistant.messages.loadFailed': 'فشل الحصول على قائمة السياسات', - 'trading-assistant.messages.runningWarning': 'الاستراتيجية قيد التشغيل. يرجى إيقاف الإستراتيجية قبل تعديلها.', - 'trading-assistant.messages.deleteConfirmWithName': 'هل أنت متأكد أنك تريد حذف السياسة "{name}"؟ هذه العملية لا رجعة فيها.', - 'trading-assistant.messages.deleteConfirm': 'هل أنت متأكد أنك تريد حذف هذه السياسة؟ هذه العملية لا رجعة فيها.', - 'trading-assistant.messages.loadTradesFailed': 'فشل في الحصول على سجلات المعاملات', - 'trading-assistant.messages.loadPositionsFailed': 'فشل الحصول على سجل الموقف', - 'trading-assistant.messages.loadEquityFailed': 'فشل في الحصول على منحنى الأسهم', - 'trading-assistant.messages.loadIndicatorsFailed': 'فشل تحميل قائمة المؤشرات، يرجى المحاولة مرة أخرى في وقت لاحق', - 'trading-assistant.messages.spotLimitations': 'تم ضبط التداول الفوري تلقائيًا على رافعة مالية طويلة فقط بمقدار 1x', - 'trading-assistant.messages.autoFillApiConfig': 'تمت تعبئة تكوين واجهة برمجة التطبيقات التاريخية للبورصة تلقائيًا', - 'trading-assistant.placeholders.selectIndicator': 'الرجاء تحديد مؤشر', - 'trading-assistant.placeholders.selectExchange': 'الرجاء تحديد التبادل', - 'trading-assistant.placeholders.inputApiKey': 'الرجاء إدخال مفتاح API', - 'trading-assistant.placeholders.inputSecretKey': 'الرجاء إدخال المفتاح السري', - 'trading-assistant.placeholders.inputPassphrase': 'الرجاء إدخال عبارة المرور', - 'trading-assistant.placeholders.inputStrategyName': 'الرجاء إدخال اسم السياسة', - 'trading-assistant.placeholders.selectSymbol': 'يرجى اختيار زوج التداول', - 'trading-assistant.placeholders.selectTimeframe': 'الرجاء تحديد الفترة الزمنية', - 'trading-assistant.placeholders.selectKlinePeriod': 'الرجاء تحديد فترة K-Line', - 'trading-assistant.placeholders.inputAiFilterPrompt': 'الرجاء إدخال موجه مخصص (اختياري)', - 'trading-assistant.validation.indicatorRequired': 'الرجاء تحديد مؤشر', - 'trading-assistant.validation.exchangeRequired': 'الرجاء تحديد التبادل', - 'trading-assistant.validation.apiKeyRequired': 'الرجاء إدخال مفتاح API', - 'trading-assistant.validation.secretKeyRequired': 'الرجاء إدخال المفتاح السري', - 'trading-assistant.validation.passphraseRequired': 'الرجاء إدخال عبارة المرور', - 'trading-assistant.validation.exchangeConfigIncomplete': 'يرجى ملء معلومات تكوين التبادل الكاملة', - 'trading-assistant.validation.testConnectionRequired': 'يرجى النقر على زر "اختبار الاتصال" أولاً والتأكد من نجاح الاتصال', - 'trading-assistant.validation.testConnectionFailed': 'فشل اختبار الاتصال، يرجى التحقق من التكوين وإعادة المحاولة', - 'trading-assistant.validation.strategyNameRequired': 'الرجاء إدخال اسم السياسة', - 'trading-assistant.validation.symbolRequired': 'يرجى اختيار زوج التداول', - 'trading-assistant.validation.initialCapitalRequired': 'الرجاء إدخال مبلغ الاستثمار', - 'trading-assistant.validation.leverageRequired': 'الرجاء إدخال نسبة الرافعة المالية', - 'trading-assistant.table.time': 'الوقت', - 'trading-assistant.table.type': 'اكتب', - 'trading-assistant.table.price': 'السعر', - 'trading-assistant.table.amount': 'الكمية', - 'trading-assistant.table.value': 'المبلغ', - 'trading-assistant.table.commission': 'رسوم المناولة', - 'trading-assistant.table.symbol': 'زوج التداول', - 'trading-assistant.table.side': 'الاتجاه', - 'trading-assistant.table.size': 'كمية الموقف', - 'trading-assistant.table.entryPrice': 'سعر الافتتاح', - 'trading-assistant.table.currentPrice': 'السعر الحالي', - 'trading-assistant.table.unrealizedPnl': 'الربح أو الخسارة غير المحققة', - 'trading-assistant.table.pnlPercent': 'نسبة الربح والخسارة', - 'trading-assistant.table.buy': 'شراء', - 'trading-assistant.table.sell': 'بيع', - 'trading-assistant.table.long': 'اذهب لفترة طويلة', - 'trading-assistant.table.short': 'قصيرة', - 'trading-assistant.table.noPositions': 'لا توجد مناصب حتى الآن', - 'trading-assistant.detail.title': 'تفاصيل الاستراتيجية', - 'trading-assistant.detail.strategyName': 'اسم السياسة', - 'trading-assistant.detail.strategyType': 'نوع الإستراتيجية', - 'trading-assistant.detail.status': 'الحالة', - 'trading-assistant.detail.tradingMode': 'نموذج التداول', - 'trading-assistant.detail.exchange': 'تبادل', - 'trading-assistant.detail.initialCapital': 'رأس المال الأولي', - 'trading-assistant.detail.totalInvestment': 'إجمالي مبلغ الاستثمار', - 'trading-assistant.detail.currentEquity': 'صافي القيمة الحالية', - 'trading-assistant.detail.totalPnl': 'إجمالي الربح والخسارة', - 'trading-assistant.detail.indicatorName': 'اسم المؤشر', - 'trading-assistant.detail.maxLeverage': 'الحد الأقصى للرافعة المالية', - 'trading-assistant.detail.decideInterval': 'الفاصل الزمني للقرار', - 'trading-assistant.detail.symbols': 'كائن المعاملة', - 'trading-assistant.detail.createdAt': 'وقت الخلق', - 'trading-assistant.detail.updatedAt': 'وقت التحديث', - 'trading-assistant.detail.llmConfig': 'تكوين نموذج الذكاء الاصطناعي', - 'trading-assistant.detail.exchangeConfig': 'تكوين الصرف', - 'trading-assistant.detail.provider': 'مزود', - 'trading-assistant.detail.modelId': 'معرف النموذج', - 'trading-assistant.detail.close': 'إغلاق', - 'trading-assistant.detail.loadFailed': 'فشل الحصول على تفاصيل السياسة', - 'trading-assistant.equity.noData': 'لا توجد بيانات عن صافي القيمة حتى الآن', - 'trading-assistant.equity.equity': 'صافي القيمة', - 'trading-assistant.exchange.tradingMode': 'نموذج التداول', - 'trading-assistant.exchange.virtual': 'محاكاة التداول', - 'trading-assistant.exchange.live': 'معاملة حقيقية', - 'trading-assistant.exchange.selectExchange': 'اختر الصرف', - 'trading-assistant.exchange.walletAddress': 'عنوان المحفظة', - 'trading-assistant.exchange.walletAddressPlaceholder': 'الرجاء إدخال عنوان محفظتك (يبدأ بـ 0x)', - 'trading-assistant.exchange.privateKey': 'مفتاح خاص', - 'trading-assistant.exchange.privateKeyPlaceholder': 'الرجاء إدخال المفتاح الخاص (64 حرفًا)', - 'trading-assistant.exchange.testConnection': 'اتصال الاختبار', - 'trading-assistant.exchange.connectionSuccess': 'تم الاتصال بنجاح', - 'trading-assistant.exchange.connectionFailed': 'فشل الاتصال', - 'trading-assistant.exchange.testFailed': 'فشل اختبار الاتصال', - 'trading-assistant.exchange.fillComplete': 'يرجى ملء معلومات تكوين التبادل الكاملة', - 'trading-assistant.strategyTypeOptions.ai': 'استراتيجية تعتمد على الذكاء الاصطناعي', - 'trading-assistant.strategyTypeOptions.indicator': 'استراتيجية المؤشر الفني', - 'trading-assistant.strategyTypeOptions.aiDeveloping': 'إن وظيفة الإستراتيجية المبنية على الذكاء الاصطناعي قيد التطوير، لذا ترقبوا ذلك', - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'ميزات الإستراتيجية المعتمدة على الذكاء الاصطناعي قيد التطوير', - 'trading-assistant.indicatorType.trend': 'الاتجاه', - 'trading-assistant.indicatorType.momentum': 'الزخم', - 'trading-assistant.indicatorType.volatility': 'التقلب', - 'trading-assistant.indicatorType.volume': 'الحجم', - 'trading-assistant.indicatorType.custom': 'تخصيص', - 'trading-assistant.exchangeNames': { - 'okx': 'أوكي إكس', - 'binance': 'بينانس', - 'hyperliquid': 'السائل الزائد', - 'blockchaincom': 'Blockchain.com', - 'coinbaseexchange': 'كوين بيس', - 'gate': 'بوابة.io', - 'mexc': 'ميكسك', - 'kraken': 'كراكن', - 'bitfinex': 'بيتفينكس', - 'bybit': 'بايبيت', - 'kucoin': 'كيو كوين', - 'huobi': 'هوبي', - 'bitget': 'بيتجيت', - 'bitmex': 'بيتميكس', - 'deribit': 'ديربيت', - 'phemex': 'فيميكس', - 'bitmart': 'بيتمارت', - 'bitstamp': 'بيتستامب', - 'bittrex': 'بيتريكس', - 'poloniex': 'بولونيكس', - 'gemini': 'الجوزاء', - 'cryptocom': 'تشفير.كوم', - 'bitflyer': 'bitFlyer', - 'upbit': 'أوبيت', - 'bithumb': 'بيتهامب', - 'coinone': 'عملة واحدة', - 'zb': 'ZB', - 'lbank': 'بنك إل', - 'bibox': 'بيبوكس', - 'bigone': 'BigONE', - 'bitrue': 'صحيح', - 'coinex': 'كوين إكس', - 'digifinex': 'DigiFinex', - 'ftx': 'إف تي إكس', - 'ftxus': 'إف تي إكس الولايات المتحدة', - 'binanceus': 'بينانس الولايات المتحدة', - 'binancecoinm': 'عملة بينانس-M', - 'binanceusdm': 'Binance USDⓈ-M' - }, - 'ai-trading-assistant.title': 'مساعد التداول بالذكاء الاصطناعي', - 'ai-trading-assistant.strategyList': 'قائمة الإستراتيجية', - 'ai-trading-assistant.createStrategy': 'إنشاء سياسة', - 'ai-trading-assistant.noStrategy': 'لا توجد استراتيجية حتى الآن', - 'ai-trading-assistant.selectStrategy': 'يرجى تحديد استراتيجية من اليسار لعرض التفاصيل', - 'ai-trading-assistant.startStrategy': 'استراتيجية الإطلاق', - 'ai-trading-assistant.stopStrategy': 'استراتيجية التوقف', - 'ai-trading-assistant.editStrategy': 'استراتيجية التحرير', - 'ai-trading-assistant.deleteStrategy': 'حذف السياسة', - 'ai-trading-assistant.status.running': 'الجري', - 'ai-trading-assistant.status.stopped': 'توقف', - 'ai-trading-assistant.status.error': 'خطأ', - 'ai-trading-assistant.tabs.tradingRecords': 'تاريخ المعاملة', - 'ai-trading-assistant.tabs.positions': 'سجل الموقف', - 'ai-trading-assistant.tabs.aiDecisions': 'سجل قرار الذكاء الاصطناعي', - 'ai-trading-assistant.tabs.equityCurve': 'منحنى الأسهم', - 'ai-trading-assistant.form.createTitle': 'إنشاء استراتيجيات التداول بالذكاء الاصطناعي', - 'ai-trading-assistant.form.editTitle': 'تحرير استراتيجية التداول بالذكاء الاصطناعي', - 'ai-trading-assistant.form.strategyName': 'اسم السياسة', - 'ai-trading-assistant.form.modelId': 'نموذج الذكاء الاصطناعي', - 'ai-trading-assistant.form.modelIdHint': 'استخدم خدمة OpenRouter الخاصة بالنظام دون تكوين مفتاح API', - 'ai-trading-assistant.form.decideInterval': 'الفاصل الزمني للقرار', - 'ai-trading-assistant.form.decideInterval5m': '5 دقائق', - 'ai-trading-assistant.form.decideInterval10m': '10 دقائق', - 'ai-trading-assistant.form.decideInterval30m': '30 دقيقة', - 'ai-trading-assistant.form.decideInterval1h': '1 ساعة', - 'ai-trading-assistant.form.decideInterval4h': '4 ساعات', - 'ai-trading-assistant.form.decideInterval1d': 'يوم واحد', - 'ai-trading-assistant.form.decideInterval1w': '1 أسبوع', - 'ai-trading-assistant.form.decideIntervalHint': 'الفاصل الزمني للذكاء الاصطناعي لاتخاذ القرارات', - 'ai-trading-assistant.form.runPeriod': 'تشغيل دورة', - 'ai-trading-assistant.form.runPeriodHint': 'وقت البدء ووقت الانتهاء لتشغيل الإستراتيجية', - 'ai-trading-assistant.form.startDate': 'تاريخ البدء', - 'ai-trading-assistant.form.endDate': 'تاريخ الانتهاء', - 'ai-trading-assistant.form.qdtCostTitle': 'تعليمات خصم QDT', - 'ai-trading-assistant.form.qdtCostHint': 'سيتم خصم {cost} QDT لكل قرار للذكاء الاصطناعي. يرجى التأكد من أن حسابك يحتوي على رصيد QDT كافٍ. أثناء تنفيذ الإستراتيجية، سيتم خصم الرسوم في الوقت الفعلي لكل قرار.', - 'ai-trading-assistant.form.apiKey': 'مفتاح واجهة برمجة التطبيقات', - 'ai-trading-assistant.form.exchange': 'اختر الصرف', - 'ai-trading-assistant.form.secretKey': 'المفتاح السري', - 'ai-trading-assistant.form.passphrase': 'عبارة المرور', - 'ai-trading-assistant.form.testConnection': 'اتصال الاختبار', - 'ai-trading-assistant.form.symbol': 'زوج التداول', - 'ai-trading-assistant.form.symbolHint': 'حدد زوج التداول للتداول', - 'ai-trading-assistant.form.initialCapital': 'المبلغ المستثمر (الهامش)', - 'ai-trading-assistant.form.leverage': 'الاستفادة المتعددة', - 'ai-trading-assistant.form.timeframe': 'الفترة الزمنية', - 'ai-trading-assistant.form.timeframe1m': '1 دقيقة', - 'ai-trading-assistant.form.timeframe5m': '5 دقائق', - 'ai-trading-assistant.form.timeframe15m': '15 دقيقة', - 'ai-trading-assistant.form.timeframe30m': '30 دقيقة', - 'ai-trading-assistant.form.timeframe1H': '1 ساعة', - 'ai-trading-assistant.form.timeframe4H': '4 ساعات', - 'ai-trading-assistant.form.timeframe1D': 'يوم واحد', - 'ai-trading-assistant.form.marketType': 'نوع السوق', - 'ai-trading-assistant.form.marketTypeFutures': 'العقد', - 'ai-trading-assistant.form.marketTypeSpot': 'بقعة', - 'ai-trading-assistant.form.totalPnl': 'إجمالي الربح والخسارة', - 'ai-trading-assistant.form.customPrompt': 'كلمات موجهة مخصصة', - 'ai-trading-assistant.form.customPromptHint': 'اختياري، يُستخدم لتخصيص استراتيجيات التداول بالذكاء الاصطناعي ومنطق اتخاذ القرار', - 'ai-trading-assistant.form.cancel': 'إلغاء', - 'ai-trading-assistant.form.prev': 'الخطوة السابقة', - 'ai-trading-assistant.form.next': 'الخطوة التالية', - 'ai-trading-assistant.form.confirmCreate': 'تأكيد الإنشاء', - 'ai-trading-assistant.form.confirmEdit': 'تأكيد التغييرات', - 'ai-trading-assistant.messages.createSuccess': 'تم إنشاء الإستراتيجية بنجاح', - 'ai-trading-assistant.messages.createFailed': 'فشل في إنشاء السياسة', - 'ai-trading-assistant.messages.updateSuccess': 'تم تحديث السياسة بنجاح', - 'ai-trading-assistant.messages.updateFailed': 'فشل تحديث السياسة', - 'ai-trading-assistant.messages.deleteSuccess': 'تم حذف السياسة بنجاح', - 'ai-trading-assistant.messages.deleteFailed': 'فشل سياسة الحذف', - 'ai-trading-assistant.messages.startSuccess': 'بدأت الإستراتيجية بنجاح', - 'ai-trading-assistant.messages.startFailed': 'فشل في بدء السياسة', - 'ai-trading-assistant.messages.stopSuccess': 'تم إيقاف الإستراتيجية بنجاح', - 'ai-trading-assistant.messages.stopFailed': 'فشلت استراتيجية التوقف', - 'ai-trading-assistant.messages.loadFailed': 'فشل الحصول على قائمة السياسات', - 'ai-trading-assistant.messages.loadDecisionsFailed': 'فشل في الحصول على سجل قرار الذكاء الاصطناعي', - 'ai-trading-assistant.messages.deleteConfirm': 'هل أنت متأكد أنك تريد حذف هذه السياسة؟ هذه العملية لا رجعة فيها.', - 'ai-trading-assistant.placeholders.inputStrategyName': 'الرجاء إدخال اسم السياسة', - 'ai-trading-assistant.placeholders.selectModelId': 'الرجاء تحديد نموذج الذكاء الاصطناعي', - 'ai-trading-assistant.placeholders.selectDecideInterval': 'الرجاء تحديد الفاصل الزمني للقرار', - 'ai-trading-assistant.placeholders.startTime': 'وقت البدء', - 'ai-trading-assistant.placeholders.endTime': 'وقت النهاية', - 'ai-trading-assistant.placeholders.inputApiKey': 'الرجاء إدخال مفتاح API', - 'ai-trading-assistant.placeholders.selectExchange': 'الرجاء تحديد التبادل', - 'ai-trading-assistant.placeholders.inputSecretKey': 'الرجاء إدخال المفتاح السري', - 'ai-trading-assistant.placeholders.inputPassphrase': 'الرجاء إدخال عبارة المرور', - 'ai-trading-assistant.placeholders.selectSymbol': 'يرجى تحديد زوج تداول، مثل: BTC/USDT', - 'ai-trading-assistant.placeholders.selectTimeframe': 'الرجاء تحديد الفترة الزمنية', - 'ai-trading-assistant.placeholders.inputCustomPrompt': 'الرجاء إدخال كلمة مطالبة مخصصة (اختياري)', - 'ai-trading-assistant.validation.strategyNameRequired': 'الرجاء إدخال اسم السياسة', - 'ai-trading-assistant.validation.modelIdRequired': 'الرجاء تحديد نموذج الذكاء الاصطناعي', - 'ai-trading-assistant.validation.runPeriodRequired': 'الرجاء تحديد دورة التشغيل', - 'ai-trading-assistant.validation.apiKeyRequired': 'الرجاء إدخال مفتاح API', - 'ai-trading-assistant.validation.exchangeRequired': 'الرجاء تحديد التبادل', - 'ai-trading-assistant.validation.secretKeyRequired': 'الرجاء إدخال المفتاح السري', - 'ai-trading-assistant.validation.symbolRequired': 'يرجى اختيار زوج التداول', - 'ai-trading-assistant.validation.initialCapitalRequired': 'الرجاء إدخال مبلغ الاستثمار', - 'ai-trading-assistant.table.time': 'الوقت', - 'ai-trading-assistant.table.type': 'اكتب', - 'ai-trading-assistant.table.price': 'السعر', - 'ai-trading-assistant.table.amount': 'الكمية', - 'ai-trading-assistant.table.value': 'المبلغ', - 'ai-trading-assistant.table.symbol': 'زوج التداول', - 'ai-trading-assistant.table.side': 'الاتجاه', - 'ai-trading-assistant.table.size': 'كمية الموقف', - 'ai-trading-assistant.table.entryPrice': 'سعر الافتتاح', - 'ai-trading-assistant.table.currentPrice': 'السعر الحالي', - 'ai-trading-assistant.table.unrealizedPnl': 'الربح أو الخسارة غير المحققة', - 'ai-trading-assistant.table.profit': 'الربح والخسارة', - 'ai-trading-assistant.table.openLong': 'مفتوح لفترة طويلة', - 'ai-trading-assistant.table.closeLong': 'بيندو', - 'ai-trading-assistant.table.openShort': 'فتح قصيرة', - 'ai-trading-assistant.table.closeShort': 'فارغ', - 'ai-trading-assistant.table.addLong': 'غادوت', - 'ai-trading-assistant.table.addShort': 'إضافة قصيرة', - 'ai-trading-assistant.table.closeShortProfit': 'جني الأرباح من المركز القصير', - 'ai-trading-assistant.table.closeShortStop': 'وقف الخسارة', - 'ai-trading-assistant.table.closeLongProfit': 'توقف لفترة طويلة وجني الأرباح', - 'ai-trading-assistant.table.closeLongStop': 'وقف الخسارة', - 'ai-trading-assistant.table.buy': 'شراء', - 'ai-trading-assistant.table.sell': 'بيع', - 'ai-trading-assistant.table.long': 'اذهب لفترة طويلة', - 'ai-trading-assistant.table.short': 'قصيرة', - 'ai-trading-assistant.table.hold': 'عقد', - 'ai-trading-assistant.table.reasoning': 'سبب التحليل', - 'ai-trading-assistant.table.decisions': 'صنع القرار', - 'ai-trading-assistant.table.riskAssessment': 'تقييم المخاطر', - 'ai-trading-assistant.table.confidence': 'الثقة', - 'ai-trading-assistant.table.totalRecords': '{total} السجلات في المجموع', - 'ai-trading-assistant.table.noPositions': 'لا توجد مناصب حتى الآن', - 'ai-trading-assistant.detail.title': 'تفاصيل الاستراتيجية', - 'ai-trading-assistant.equity.noData': 'لا توجد بيانات عن صافي القيمة حتى الآن', - 'ai-trading-assistant.equity.equity': 'صافي القيمة', - 'ai-trading-assistant.exchange.testFailed': 'فشل اختبار الاتصال', - 'ai-trading-assistant.exchange.connectionSuccess': 'تم الاتصال بنجاح', - 'ai-trading-assistant.exchange.connectionFailed': 'فشل الاتصال', - 'ai-trading-assistant.form.advancedSettings': 'الإعدادات المتقدمة', - 'ai-trading-assistant.form.orderMode': 'وضع الطلب', - 'ai-trading-assistant.form.orderModeMaker': 'صانع', - 'ai-trading-assistant.form.orderModeTaker': 'سعر السوق (المتلقي)', - 'ai-trading-assistant.form.orderModeHint': 'يستخدم وضع الأمر المعلق أوامر الحد وتكون رسوم المناولة أقل؛ يتم تنفيذ وضع سعر السوق على الفور وتكون رسوم المناولة أعلى.', - 'ai-trading-assistant.form.makerWaitSec': 'وقت الانتظار للأوامر المعلقة (ثواني)', - 'ai-trading-assistant.form.makerWaitSecHint': 'الوقت اللازم لانتظار المعاملة بعد تقديم الطلب. قم بالإلغاء وحاول مرة أخرى بعد انتهاء المهلة.', - 'ai-trading-assistant.form.makerRetries': 'عدد مرات إعادة المحاولة للأوامر المعلقة', - 'ai-trading-assistant.form.makerRetriesHint': 'الحد الأقصى لعدد مرات إعادة المحاولة عندما لا يتم تنفيذ الأمر المعلق', - 'ai-trading-assistant.form.fallbackToMarket': 'يفشل الأمر المعلق ويتم تخفيض سعر السوق.', - 'ai-trading-assistant.form.fallbackToMarketHint': 'عندما لا يتم إكمال أمر الفتح/الإغلاق المعلق، ما إذا كان ينبغي تخفيضه إلى أمر سوق لضمان اكتمال المعاملة.', - 'ai-trading-assistant.form.marginMode': 'وضع الهامش', - 'ai-trading-assistant.form.marginModeCross': 'مستودع كامل', - 'ai-trading-assistant.form.marginModeIsolated': 'موقف معزول', - 'ai-analysis.title': 'محرك التداول الكمي', - 'ai-analysis.system.online': 'على الانترنت', - 'ai-analysis.system.agents': 'وكيل', - 'ai-analysis.system.active': 'نشط', - 'ai-analysis.system.stage': 'المرحلة', - 'ai-analysis.panel.roster': 'تشكيلة الوكيل', - 'ai-analysis.panel.thinking': 'أفكر...', - 'ai-analysis.panel.done': 'كامل', - 'ai-analysis.panel.standby': 'الاستعداد', - 'ai-analysis.input.title': 'محرك التداول الكمي', - 'ai-analysis.input.placeholder': 'حدد الأصول المستهدفة (مثل BTC/USDT)', - 'ai-analysis.input.watchlist': 'الأسهم الاختيارية', - 'ai-analysis.input.start': 'ابدأ التحليل', - 'ai-analysis.input.recent': 'المهام الأخيرة:', - 'ai-analysis.vis.stage': 'المرحلة', - 'ai-analysis.vis.processing': 'المعالجة', - 'ai-analysis.result.complete': 'اكتمل التحليل', - 'ai-analysis.result.signal': 'الإشارة النهائية', - 'ai-analysis.result.confidence': 'الثقة:', - 'ai-analysis.result.new': 'تحليل جديد', - 'ai-analysis.result.full': 'عرض التقرير كاملا', - 'ai-analysis.logs.title': 'سجل النظام', - 'ai-analysis.modal.title': 'تقرير سري', - 'ai-analysis.modal.fundamental': 'التحليل الأساسي', - 'ai-analysis.modal.technical': 'التحليل الفني', - 'ai-analysis.modal.sentiment': 'التحليل العاطفي', - 'ai-analysis.modal.risk': 'تقييم المخاطر', - 'ai-analysis.stage.idle': 'الاستعداد', - 'ai-analysis.stage.1': 'المرحلة الأولى: التحليل متعدد الأبعاد', - 'ai-analysis.stage.2': 'المرحلة الثانية: المناقشة الطويلة والقصيرة', - 'ai-analysis.stage.3': 'المرحلة الثالثة: التخطيط الاستراتيجي', - 'ai-analysis.stage.4': 'المرحلة الرابعة: مراجعة مراقبة المخاطر', - 'ai-analysis.stage.complete': 'كامل', - 'ai-analysis.agent.investment_director': 'مدير الاستثمار', - 'ai-analysis.agent.role.investment_director': 'تحليل شامل واستنتاج نهائي', - 'ai-analysis.agent.market': 'محلل السوق', - 'ai-analysis.agent.role.market': 'التكنولوجيا وبيانات السوق', - 'ai-analysis.agent.fundamental': 'محلل أساسي', - 'ai-analysis.agent.role.fundamental': 'التمويل والتقييم', - 'ai-analysis.agent.technical': 'محلل فني', - 'ai-analysis.agent.role.technical': 'المؤشرات الفنية والرسوم البيانية', - 'ai-analysis.agent.news': 'محلل اخبار', - 'ai-analysis.agent.role.news': 'مرشح الأخبار العالمية', - 'ai-analysis.agent.sentiment': 'محلل المشاعر', - 'ai-analysis.agent.role.sentiment': 'الاجتماعية والعاطفية', - 'ai-analysis.agent.risk': 'محلل المخاطر', - 'ai-analysis.agent.role.risk': 'فحص المخاطر الأساسية', - 'ai-analysis.agent.bull': 'الباحث الصاعد', - 'ai-analysis.agent.role.bull': 'التعدين محفز النمو', - 'ai-analysis.agent.bear': 'الباحث الهابط', - 'ai-analysis.agent.role.bear': 'حفر المخاطر والعيوب', - 'ai-analysis.agent.manager': 'مدير البحوث', - 'ai-analysis.agent.role.manager': 'مشرف المناقشة', - 'ai-analysis.agent.trader': 'تاجر', - 'ai-analysis.agent.role.trader': 'استراتيجي تنفيذي', - 'ai-analysis.agent.risky': 'محلل ناشط', - 'ai-analysis.agent.role.risky': 'استراتيجية عدوانية', - 'ai-analysis.agent.neutral': 'محلل التوازن', - 'ai-analysis.agent.role.neutral': 'استراتيجية التوازن', - 'ai-analysis.agent.safe': 'محلل محافظ', - 'ai-analysis.agent.role.safe': 'استراتيجية محافظة', - 'ai-analysis.agent.cro': 'مدير مراقبة المخاطر (CRO)', - 'ai-analysis.agent.role.cro': 'سلطة اتخاذ القرار النهائي', - 'ai-analysis.script.market': 'جارٍ جلب بيانات OHLCV من البورصات الرئيسية...', - 'ai-analysis.script.fundamental': 'استخراج التقارير المالية الربع سنوية...', - 'ai-analysis.script.technical': 'تحليل المؤشرات الفنية وأنماط الرسم البياني.', - 'ai-analysis.script.news': 'متابعة الأخبار المالية العالمية...', - 'ai-analysis.script.sentiment': 'تحليل اتجاهات وسائل التواصل الاجتماعي...', - 'ai-analysis.script.risk': 'حساب التقلبات التاريخية...', - 'invite.inviteLink': 'رابط الدعوة', - 'invite.copy': 'انسخ الرابط', - 'invite.copySuccess': 'تم النسخ بنجاح!', - 'invite.copyFailed': 'فشل النسخ، يرجى النسخ يدويًا', - 'invite.noInviteLink': 'لم يتم إنشاء رابط الدعوة', - 'invite.totalInvites': 'الدعوات التراكمية', - 'invite.totalReward': 'المكافآت التراكمية', - 'invite.rules': 'قواعد الدعوة', - 'invite.rule1': 'في كل مرة تقوم فيها بدعوة صديق بنجاح للتسجيل، سوف تحصل على مكافأة', - 'invite.rule2': 'إذا أكمل الصديق المدعو المعاملة الأولى، فستحصل على مكافآت إضافية', - 'invite.rule3': 'سيتم إرسال مكافآت الدعوة مباشرة إلى حسابك', - 'invite.inviteList': 'قائمة الدعوة', - 'invite.tasks': 'مركز البعثة', - 'invite.inviteeName': 'المدعو', - 'invite.inviteTime': 'وقت الدعوة', - 'invite.status': 'الحالة', - 'invite.reward': 'مكافأة', - 'invite.active': 'نشط', - 'invite.inactive': 'لم يتم تفعيلها', - 'invite.completed': 'مكتمل', - 'invite.claimed': 'تم الاستلام', - 'invite.pending': 'ليتم الانتهاء منها', - 'invite.goToTask': 'لإكمال', - 'invite.claimReward': 'المطالبة بالمكافآت', - 'invite.verify': 'اكتمل التحقق', - 'invite.verifySuccess': 'تم التحقق بنجاح! اكتملت المهمة', - 'invite.verifyNotCompleted': 'المهمة لم تكتمل بعد، يرجى إكمال المهمة أولا', - 'invite.verifyFailed': 'فشل التحقق، يرجى المحاولة مرة أخرى في وقت لاحق', - 'invite.claimSuccess': 'تم استلام {reward} QDT بنجاح!', - 'invite.claimFailed': 'فشل التجميع، يرجى المحاولة مرة أخرى لاحقًا', - 'invite.totalRecords': '{total} السجلات في المجموع', - 'invite.task.twitter.title': 'إعادة تغريد إلى X (تويتر)', - 'invite.task.twitter.desc': 'شارك تغريداتنا الرسمية على حساب X (Twitter) الخاص بك', - 'invite.task.youtube.title': 'تابع قناتنا على اليوتيوب', - 'invite.task.youtube.desc': 'اشترك وتابع قناتنا الرسمية على اليوتيوب', - 'invite.task.telegram.title': 'انضم إلى مجموعة تيليجرام', - 'invite.task.telegram.desc': 'انضم إلى مجموعة مجتمع Telegram الرسمية لدينا', - 'invite.task.discord.title': 'انضم إلى خادم Discord', - 'invite.task.discord.desc': 'انضم إلى خادم مجتمع Discord الخاص بنا', - 'message': '-', - 'layouts.usermenu.dialog.title': 'معلومات', - 'layouts.usermenu.dialog.content': 'هل أنت متأكد أنك تريد تسجيل الخروج؟', - 'layouts.userLayout.title': 'ابحث عن الحقيقة في حالة عدم اليقين', - // Auto-filled missing keys from en-US (fallback to English) - 'dashboard.indicator.boundary.message': 'Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.', - 'dashboard.indicator.boundary.indicatorRule': "Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.", - 'dashboard.indicator.boundary.backtestRule': 'Rule: If a bar has a main signal (buy/sell → open/close/reverse), scaling in/out is skipped on the same bar.', - 'dashboard.indicator.guide.title': 'Python Indicator & Strategy Development Guide', - 'dashboard.indicator.guide.intro': 'This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.', - 'dashboard.indicator.guide.section1.title': '1. Runtime Environment & Predefined Variables', - 'dashboard.indicator.guide.section1.env': 'Your code runs in a browser-based Python environment (Pyodide).', - 'dashboard.indicator.guide.section1.libs': 'Pre-installed Libraries', - 'dashboard.indicator.guide.section1.libsDesc': 'The following libraries are imported by default, no need to import again:', - 'dashboard.indicator.guide.section1.libsList': 'pandas (pd), numpy (np), math, json', - 'dashboard.indicator.guide.section1.data': 'Input Data: df', - 'dashboard.indicator.guide.section1.dataDesc': 'The system automatically converts current K-line data into a Pandas DataFrame object, variable name is df.', - 'dashboard.indicator.guide.section1.dataColumns': 'df contains the following columns (all float type):', - 'dashboard.indicator.guide.section1.dataColumnsList': 'time (timestamp, seconds), open, high, low, close, volume', - 'dashboard.indicator.guide.section1.dataNote': 'Data index is arranged from old to new (0 is the earliest data, last row is the latest data).', - 'dashboard.indicator.guide.section1.dataIndex': 'Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using .values which loses the index.', - 'dashboard.indicator.guide.section2.title': '2. Parameter Definition', - 'dashboard.indicator.guide.section2.desc': 'You can define variables as parameters at the beginning of your code. The system will try to parse statements like variable = value as adjustable parameters.', - 'dashboard.indicator.guide.section2.example': 'Parameter Example', - 'dashboard.indicator.guide.section2.exampleCode': 'span = 20 or multiplier = 2.0', - 'dashboard.indicator.guide.section3.title': '3. Backtest Signal Setup (Important!)', - 'dashboard.indicator.guide.section3.desc': 'If you want your indicator to support backtesting, you must set the following two columns in your code:', - 'dashboard.indicator.guide.section3.backtestRequired': 'Required for Backtesting:', - 'dashboard.indicator.guide.section3.backtestBuySignal': "df['buy_signal'] - Boolean Series, True indicates buy signal", - 'dashboard.indicator.guide.section3.backtestSellSignal': "df['sell_signal'] - Boolean Series, True indicates sell signal", - 'dashboard.indicator.guide.section3.backtestExample': 'Example:', - 'dashboard.indicator.guide.section3.backtestExampleCode': "df['buy_signal'] = condition_buy
    df['sell_signal'] = condition_sell", - 'dashboard.indicator.guide.section3.backtestNote': 'Note: Even if you only set output.signals for chart display, you must set these two columns to enable backtesting.', - 'dashboard.indicator.guide.section4.title': '4. Output Requirements: output', - 'dashboard.indicator.guide.section4.desc': 'At the end of code execution, you must define a dictionary named output to tell the chart how to display results.', - 'dashboard.indicator.guide.section4.fields': 'The output dictionary contains the following fields:', - 'dashboard.indicator.guide.section4.plots': 'plots - For drawing lines (e.g., moving averages, RSI)', - 'dashboard.indicator.guide.section4.signals': 'signals - For marking buy/sell signals (e.g., arrows, labels)', - 'dashboard.indicator.guide.section4.name': 'name - Indicator name (optional)', - 'dashboard.indicator.guide.section4.calculatedVars': 'calculatedVars - Calculated variables (optional, for displaying additional information)', - 'dashboard.indicator.guide.section5.title': '5. Plot Configuration (Plots)', - 'dashboard.indicator.guide.section5.desc': 'Each object in the plots list represents a line.', - 'dashboard.indicator.guide.section5.table.field': 'Field', - 'dashboard.indicator.guide.section5.table.type': 'Type', - 'dashboard.indicator.guide.section5.table.required': 'Required', - 'dashboard.indicator.guide.section5.table.requiredYes': 'Yes', - 'dashboard.indicator.guide.section5.table.requiredNo': 'No', - 'dashboard.indicator.guide.section5.table.desc': 'Description', - 'dashboard.indicator.guide.section5.table.name': 'The name of the indicator line, displayed in the legend', - 'dashboard.indicator.guide.section5.table.data': 'Data list, length must match the number of rows in df. Recommended to use series.tolist()', - 'dashboard.indicator.guide.section5.table.color': "Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign", - 'dashboard.indicator.guide.section5.table.typeDesc': "Chart type, default is 'line'", - 'dashboard.indicator.guide.section5.table.overlay': 'Important. True means display on main chart (with K-line), False means display on sub-chart (independent area)', - 'dashboard.indicator.guide.section5.example': 'Example: Draw Simple Moving Average (SMA)', - 'dashboard.indicator.guide.section5.exampleCalc': 'Calculate SMA', - 'dashboard.indicator.guide.section5.exampleOutput': 'Construct Output', - 'dashboard.indicator.guide.section5.exampleOverlay': 'Display on main chart', - 'dashboard.indicator.guide.section6.title': '6. Signal Markers (Signals)', - 'dashboard.indicator.guide.section6.desc': "signals are used to mark buy/sell points on specific K-lines through icons or text. Note: This is only for chart display. The backtest system uses df['buy_signal'] and df['sell_signal'].", - 'dashboard.indicator.guide.section6.table.type': "Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)", - 'dashboard.indicator.guide.section6.table.data': 'Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions', - 'dashboard.indicator.guide.section6.table.text': 'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")', - 'dashboard.indicator.guide.section6.table.color': 'Marker color', - 'dashboard.indicator.guide.section6.hint': 'The system automatically handles positioning.', - 'dashboard.indicator.guide.section6.buy': 'Markers will be automatically positioned below the Low of the current K-line', - 'dashboard.indicator.guide.section6.sell': 'Markers will be automatically positioned above the High of the current K-line', - 'dashboard.indicator.guide.section6.example': 'Example: Draw Buy/Sell Signals', - 'dashboard.indicator.guide.section6.exampleInit': 'Initialize signal list, fill all with None', - 'dashboard.indicator.guide.section6.exampleLogic': 'Simple logic: mark buy when close price is greater than open price', - 'dashboard.indicator.guide.section6.exampleNote': 'In actual logic, please use loops or vectorized operations', - 'dashboard.indicator.guide.section6.examplePrice': 'Record price', - 'dashboard.indicator.guide.section6.exampleText': 'Buy', - 'dashboard.indicator.guide.section7.title': '7. Complete Code Examples', - 'dashboard.indicator.guide.section7.exampleA': 'Example A: Dual EMA Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleACode': "# 1. Calculate indicators
    df['ema_fast'] = df['close'].ewm(span=5, adjust=False).mean()
    df['ema_slow'] = df['close'].ewm(span=13, adjust=False).mean()

    # 2. Calculate crossover signals
    cross_up = (df['ema_fast'] > df['ema_slow']) & (df['ema_fast'].shift(1) <= df['ema_slow'].shift(1))
    cross_down = (df['ema_fast'] < df['ema_slow']) & (df['ema_fast'].shift(1) >= df['ema_slow'].shift(1))

    # 3. 【Important】Set NEW backtest signal columns (bool)
    df['open_long'] = cross_up
    df['close_long'] = cross_down
    df['open_short'] = cross_down
    df['close_short'] = cross_up

    # 4. Generate signal data for chart display
    buy_signals = [df['low'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]

    # 5. Build output
    output = {
    \"name\": \"Dual EMA Strategy\",
    \"plots\": [
    {\"name\": \"EMA 5\", \"data\": df['ema_fast'].tolist(), \"color\": \"#FF6B6B\", \"overlay\": True},
    {\"name\": \"EMA 13\", \"data\": df['ema_slow'].tolist(), \"color\": \"#4ECDC4\", \"overlay\": True}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleB': 'Example B: Bollinger Bands - Chart Display Only', - 'dashboard.indicator.guide.section7.exampleBCode': "# Calculate Bollinger Bands (chart display only, no backtesting)
    length = 20
    mult = 2.0
    df['sma'] = df['close'].rolling(length).mean()
    df['std'] = df['close'].rolling(length).std()
    df['upper'] = df['sma'] + mult * df['std']
    df['lower'] = df['sma'] - mult * df['std']

    output = {
    \"name\": \"Bollinger Bands\",
    \"plots\": [
    {\"name\": \"Upper\", \"data\": df['upper'].tolist(), \"color\": \"#FF5252\", \"overlay\": True},
    {\"name\": \"Middle\", \"data\": df['sma'].tolist(), \"color\": \"#2196F3\", \"overlay\": True},
    {\"name\": \"Lower\", \"data\": df['lower'].tolist(), \"color\": \"#00E676\", \"overlay\": True}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleC': 'Example C: RSI Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleCCode': "# Calculate RSI
    delta = df['close'].diff()
    up = delta.clip(lower=0)
    down = -1 * delta.clip(upper=0)
    ema_up = up.ewm(com=13, adjust=False).mean()
    ema_down = down.ewm(com=13, adjust=False).mean()
    rs = ema_up / ema_down
    df['rsi'] = 100 - (100 / (1 + rs))

    # Generate trading signals
    buy_condition = df['rsi'] < 30 # Oversold buy
    sell_condition = df['rsi'] > 70 # Overbought sell

    # 【Important】Set NEW backtest signal columns (bool)
    df['open_long'] = buy_condition
    df['close_long'] = sell_condition
    df['open_short'] = sell_condition
    df['close_short'] = buy_condition

    # Generate chart signals
    buy_signals = [df['low'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]

    output = {
    \"name\": \"RSI Strategy\",
    \"plots\": [
    {\"name\": \"RSI\", \"data\": df['rsi'].tolist(), \"color\": \"#9C27B0\", \"overlay\": False},
    {\"name\": \"Overbought\", \"data\": [70] * len(df), \"color\": \"#FF5252\", \"style\": \"dashed\", \"overlay\": False},
    {\"name\": \"Oversold\", \"data\": [30] * len(df), \"color\": \"#00E676\", \"style\": \"dashed\", \"overlay\": False}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section6.param': 'Parameters', - 'dashboard.indicator.guide.section6.calc': 'Calculate', - 'dashboard.indicator.guide.section6.output': 'Output', - 'dashboard.indicator.guide.section6.generate': 'Generate signal data (initialize with None)', - 'dashboard.indicator.guide.section6.subchart': 'Display on sub-chart', - 'dashboard.indicator.guide.section8.title': '8. Frequently Asked Questions (FAQ)', - 'dashboard.indicator.guide.section8.q1': "Q: Why can't my indicator be backtested?", - 'dashboard.indicator.guide.section8.a1': "A: The backtest system requires NEW signal columns: df['open_long'], df['close_long'], df['open_short'], df['close_short'] (boolean). Even if you set output.signals for chart display, you must set these columns to enable backtesting.", - 'dashboard.indicator.guide.section8.q2': 'Q: Data length mismatch?', - 'dashboard.indicator.guide.section8.a2': "A: The data list in plots and signals must have exactly the same length as the K-line data. If you use df['xxx'].tolist(), there is usually no problem.", - 'dashboard.indicator.guide.section8.q3': 'Q: How to handle NaN (empty values)?', - 'dashboard.indicator.guide.section8.a3': "A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use df.fillna(0) or other methods.", - 'dashboard.indicator.guide.section8.q4': 'Q: Index mismatch causing all signals to be NaN?', - 'dashboard.indicator.guide.section8.a4': "A: Please ensure you preserve the original df index (timestamp). Avoid using .values to create new Series. Use columns directly like df['close'] for operations.", - 'dashboard.indicator.guide.section8.q5': 'Q: Can I use third-party network libraries?', - 'dashboard.indicator.guide.section8.a5': 'A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.', - 'dashboard.indicator.guide.section8.q6': 'Q: How to debug code?', - 'dashboard.indicator.guide.section8.a6': 'A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.', - 'dashboard.indicator.guide.section8.q7': 'Q: Backtest shows 0 signals?', - 'dashboard.indicator.guide.section8.a7': "A: Please check the data type of df['open_long']/df['close_long']/df['open_short']/df['close_short']. They should be boolean (True/False), not numeric. Use condition.fillna(False).astype(bool) to ensure correct type.", - 'dashboard.indicator.backtest.commissionHint': 'Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.', - 'dashboard.indicator.backtest.historyTitle': 'Backtest History', - 'dashboard.indicator.backtest.historyRefresh': 'Refresh', - 'dashboard.indicator.backtest.historyView': 'View', - 'dashboard.indicator.backtest.historyNoData': 'No backtest history', - 'dashboard.indicator.backtest.historyUseCurrent': 'Only current symbol/timeframe', - 'dashboard.indicator.backtest.historyFilterSymbol': 'Symbol', - 'dashboard.indicator.backtest.historyFilterTimeframe': 'Timeframe', - 'dashboard.indicator.backtest.historyApply': 'Apply filters', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AI Analyze', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI Suggestions', - 'dashboard.indicator.backtest.historyNoAIResult': 'No AI analysis result', - 'dashboard.indicator.backtest.historyRunId': 'Run ID', - 'dashboard.indicator.backtest.historyCreatedAt': 'Time', - 'dashboard.indicator.backtest.historyRange': 'Range', - 'dashboard.indicator.backtest.historyStatus': 'Status', - 'dashboard.indicator.backtest.historyStatusSuccess': 'Success', - 'dashboard.indicator.backtest.historyStatusFailed': 'Failed', - 'dashboard.indicator.backtest.historyActions': 'Actions', - 'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)', - 'trading-assistant.exchange.ipWhitelistTip': 'Please add the following IPs to the whitelist in your exchange API settings:', - 'signal-robot.title': 'Signal Robot Console', - 'signal-robot.createBot': 'Create New Bot', - 'signal-robot.search.nameOrSymbol': 'Name/Symbol', - 'signal-robot.search.placeholder': 'Search bot name or symbol', - 'signal-robot.search.status': 'Status', - 'signal-robot.search.statusAll': 'All', - 'signal-robot.search.statusRunning': 'Running', - 'signal-robot.search.statusPaused': 'Paused', - 'signal-robot.search.query': 'Query', - 'signal-robot.search.reset': 'Reset', - 'signal-robot.table.botName': 'Bot Name', - 'signal-robot.table.symbolTimeframe': 'Symbol/Timeframe', - 'signal-robot.table.triggerStrategy': 'Trigger Strategy', - 'signal-robot.table.notificationChannels': 'Notification Channels', - 'signal-robot.table.status': 'Status', - 'signal-robot.table.action': 'Action', - 'signal-robot.table.triggerConditions': '{count} trigger conditions', - 'signal-robot.table.monitoring': 'Monitoring', - 'signal-robot.table.paused': 'Paused', - 'signal-robot.table.edit': 'Edit', - 'signal-robot.table.pause': 'Pause', - 'signal-robot.table.start': 'Start', - 'signal-robot.table.delete': 'Delete', - 'signal-robot.table.deleteConfirm': 'Are you sure you want to delete this bot?', - 'signal-robot.table.deleteSuccess': 'Deleted successfully', - 'signal-robot.table.startSuccess': 'Bot started', - 'signal-robot.table.pauseSuccess': 'Bot paused', - 'signal-robot.channel.telegram': 'Telegram', - 'signal-robot.channel.discord': 'Discord', - 'signal-robot.channel.email': 'Email', - 'signal-robot.channel.webhook': 'Webhook', - 'signal-robot.channel.browser': 'Browser Push', - 'signal-robot.modal.createTitle': 'Create New Signal Robot', - 'signal-robot.modal.editTitle': 'Edit Signal Robot', - 'signal-robot.modal.step.basic': 'Basic Settings', - 'signal-robot.modal.step.entry': 'Entry Strategy', - 'signal-robot.modal.step.position': 'Position Management', - 'signal-robot.modal.step.risk': 'Risk Control', - 'signal-robot.modal.step.notify': 'Notification Config', - 'signal-robot.modal.prev': 'Previous', - 'signal-robot.modal.next': 'Next', - 'signal-robot.modal.preview': 'Preview Backtest', - 'signal-robot.modal.complete': 'Complete & Run', - 'signal-robot.modal.saveSuccess': 'Saved successfully', - 'signal-robot.modal.previewDeveloping': 'Preview feature is under development...', - 'signal-robot.modal.basicInfoRequired': 'Please complete basic information', - 'signal-robot.basic.alert': 'Set basic information for the bot', - 'signal-robot.basic.title': 'Basic Information', - 'signal-robot.basic.botName': 'Bot Name', - 'signal-robot.basic.botNamePlaceholder': 'e.g.: BTC SuperTrend Strategy', - 'signal-robot.basic.symbol': 'Trading Pair', - 'signal-robot.basic.symbolPlaceholder': 'Select from watchlist', - 'signal-robot.basic.noWatchlist': 'No watchlist items, please add in market page first', - 'signal-robot.basic.timeframe': 'K-Line Period', - 'signal-robot.basic.timeframe15m': '15 Minutes', - 'signal-robot.basic.timeframe30m': '30 Minutes', - 'signal-robot.basic.timeframe1h': '1 Hour', - 'signal-robot.basic.timeframe4h': '4 Hours', - 'signal-robot.basic.timeframe1d': '1 Day', - 'signal-robot.basic.autoNameSuggestion': '{symbol} Signal Robot', - 'signal-robot.entry.alert': 'Trigger entry signal when all conditions below are met', - 'signal-robot.entry.condition': 'Condition {index}', - 'signal-robot.entry.indicator': 'Indicator', - 'signal-robot.entry.indicatorSupertrend': 'SuperTrend', - 'signal-robot.entry.indicatorEma': 'EMA (Exponential Moving Average)', - 'signal-robot.entry.indicatorRsi': 'RSI (Relative Strength Index)', - 'signal-robot.entry.indicatorMacd': 'MACD', - 'signal-robot.entry.indicatorBollinger': 'Bollinger Bands', - 'signal-robot.entry.atrPeriod': 'ATR Period', - 'signal-robot.entry.multiplier': 'Multiplier', - 'signal-robot.entry.triggerSignal': 'Trigger Signal', - 'signal-robot.entry.signalTrendBullish': 'Trend Bullish', - 'signal-robot.entry.signalTrendBearish': 'Trend Bearish', - 'signal-robot.entry.signalIsUptrend': 'Is Uptrend', - 'signal-robot.entry.signalIsDowntrend': 'Is Downtrend', - 'signal-robot.entry.period': 'Period', - 'signal-robot.entry.compareCondition': 'Compare Condition', - 'signal-robot.entry.priceAbove': 'Price > EMA (Price Above)', - 'signal-robot.entry.priceBelow': 'Price < EMA (Price Below)', - 'signal-robot.entry.crossUp': 'Price Crosses Above EMA (Golden Cross)', - 'signal-robot.entry.crossDown': 'Price Crosses Below EMA (Death Cross)', - 'signal-robot.entry.compare': 'Compare', - 'signal-robot.entry.greaterThan': 'Greater Than', - 'signal-robot.entry.lessThan': 'Less Than', - 'signal-robot.entry.crossUpShort': 'Cross Up', - 'signal-robot.entry.crossDownShort': 'Cross Down', - 'signal-robot.entry.threshold': 'Threshold', - 'signal-robot.entry.selectIndicator': 'Please select an indicator to configure parameters', - 'signal-robot.entry.addCondition': 'Add Condition', - 'signal-robot.position.alert': 'Configure initial position size, leverage and pyramiding rules', - 'signal-robot.position.basicTitle': 'Basic Position Management', - 'signal-robot.position.initialSize': 'Initial Size (Capital %)', - 'signal-robot.position.initialSizeHint': 'Recommended 5% - 20%', - 'signal-robot.position.leverage': 'Leverage', - 'signal-robot.position.leverageHint': 'Please ensure your exchange account supports this leverage', - 'signal-robot.position.maxPyramiding': 'Max Pyramiding Times', - 'signal-robot.position.maxPyramidingHint': '0 means no pyramiding', - 'signal-robot.position.pyramidingTitle': 'Pyramiding Rules', - 'signal-robot.position.pyramidingEnabled': 'Enabled', - 'signal-robot.position.pyramidingDisabled': 'Disabled', - 'signal-robot.position.pyramidingCondition': 'Pyramiding Trigger Condition', - 'signal-robot.position.priceRisePct': 'Price Rises (Long) / Falls (Short)', - 'signal-robot.position.profitPct': 'Profit Reaches', - 'signal-robot.position.triggerThreshold': 'Trigger Threshold (%)', - 'signal-robot.position.triggerThresholdHint': 'e.g. 3%: add position once every 3% rise', - 'signal-robot.position.addSize': 'Single Add Size (Capital %)', - 'signal-robot.position.pyramidingDisabledHint': 'Pyramiding disabled, only initial position will be executed', - 'signal-robot.risk.alert': 'Configure take profit, stop loss and exit rules', - 'signal-robot.risk.stopLossTitle': 'Stop Loss', - 'signal-robot.risk.stopLossEnabled': 'Enabled', - 'signal-robot.risk.stopLossDisabled': 'Disabled', - 'signal-robot.risk.stopLossType': 'Stop Loss Type', - 'signal-robot.risk.stopLossFixedPct': 'Fixed Percentage', - 'signal-robot.risk.stopLossAtrMultiplier': 'ATR Multiplier', - 'signal-robot.risk.stopLossValue': 'Value', - 'signal-robot.risk.stopLossFixedHint': 'e.g. 2%: stop loss when loss reaches 2%', - 'signal-robot.risk.stopLossAtrHint': 'e.g. 2.0: stop loss when price touches ATR*2.0', - 'signal-robot.risk.stopLossDisabledHint': 'Stop loss disabled (high risk)', - 'signal-robot.risk.trailingStopTitle': 'Trailing Stop', - 'signal-robot.risk.activationProfit': 'Activation Profit (%)', - 'signal-robot.risk.activationProfitHint': 'Start trailing when profit reaches this level', - 'signal-robot.risk.callbackPct': 'Callback (%)', - 'signal-robot.risk.callbackPctHint': 'Trigger take profit when price falls from peak by this percentage', - 'signal-robot.risk.trailingStopDisabledHint': 'Trailing stop disabled', - 'signal-robot.risk.otherExitTitle': 'Other Exit Rules', - 'signal-robot.risk.signalExit': 'Allow Signal Exit', - 'signal-robot.risk.signalExitHint': 'Close position immediately when reverse signal appears (e.g. close long when short signal appears)', - 'signal-robot.notify.alert': 'Configure notification methods when signal is triggered', - 'signal-robot.notify.channelTitle': 'Notification Channels', - 'signal-robot.notify.discordWebhook': 'Discord Webhook', - 'signal-robot.notify.genericWebhook': 'Generic Webhook', - 'signal-robot.notify.webhookUrl': 'Webhook URL', - 'signal-robot.notify.webhookUrlPlaceholder': 'https://example.com/webhook', - 'signal-robot.notify.discordUrl': 'Discord URL', - 'signal-robot.notify.discordUrlPlaceholder': 'https://discord.com/api/webhooks/...', - 'signal-robot.operator.greaterThan': 'Greater Than', - 'signal-robot.operator.lessThan': 'Less Than', - 'signal-robot.operator.equal': 'Equal', - 'signal-robot.operator.goldenCross': 'Golden Cross', - 'signal-robot.operator.deathCross': 'Death Cross', - 'signal-robot.operator.increaseBy': 'Increase By', - 'signal-robot.operator.decreaseBy': 'Decrease By', - 'signal-robot.indicator.price': 'Price', - 'signal-robot.indicator.rsi': 'RSI', - 'signal-robot.indicator.kdjK': 'KDJ(K)', - 'signal-robot.indicator.kdjJ': 'KDJ(J)', - 'signal-robot.indicator.macd': 'MACD', - 'signal-robot.indicator.macdHist': 'MACD Histogram', - 'signal-robot.indicator.bollingerUp': 'Bollinger Upper', - 'signal-robot.indicator.bollingerLow': 'Bollinger Lower', - 'signal-robot.indicator.volume': 'Volume', - 'signal-robot.indicator.changePct1h': '1H Change %', - 'signal-robot.indicator.changePct24h': '24H Change %', - 'signal-robot.indicator.signalLine': 'Signal Line', - - // Settings (Memory/Reflection) - 'settings.group.agent_memory': 'الذاكرة/الانعكاس', - 'settings.group.reflection_worker': 'عامل التحقق التلقائي للانعكاس', - 'settings.field.ENABLE_AGENT_MEMORY': 'تمكين ذاكرة الوكيل', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'تمكين الاسترجاع المتجهي (محلي)', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'بُعد التضمين', - 'settings.field.AGENT_MEMORY_TOP_K': 'عدد الاسترجاع Top-K', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'حجم نافذة المرشحين', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': 'نصف عمر تلاشي الزمن (أيام)', - 'settings.field.AGENT_MEMORY_W_SIM': 'وزن التشابه', - 'settings.field.AGENT_MEMORY_W_RECENCY': 'وزن الحداثة', - 'settings.field.AGENT_MEMORY_W_RETURNS': 'وزن العائد', - 'settings.field.ENABLE_REFLECTION_WORKER': 'تمكين التحقق التلقائي', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': 'فاصل التحقق (ثانية)' -} - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/de-DE.js b/quantdinger_vue/src/locales/lang/de-DE.js deleted file mode 100644 index 22da1bd..0000000 --- a/quantdinger_vue/src/locales/lang/de-DE.js +++ /dev/null @@ -1,1840 +0,0 @@ -import antdDeDE from 'ant-design-vue/es/locale-provider/de_DE' -import momentDE from 'moment/locale/de' - -const components = { - antLocale: antdDeDE, - momentName: 'de', - momentLocale: momentDE -} - -const locale = { - 'submit': 'Senden', - 'save': 'speichern', - 'submit.ok': 'Übermittlung erfolgreich', - 'save.ok': 'Erfolgreich gespeichert', - 'menu.welcome': 'Willkommen', - 'menu.home': 'Startseite', - 'menu.dashboard': 'Armaturenbrett', - 'menu.dashboard.indicator': 'Indikatorenanalyse', - 'menu.dashboard.community': 'Indikatorgemeinschaft', - 'menu.dashboard.analysis': 'KI-Analyse', - 'menu.dashboard.tradingAssistant': 'Handelsassistent', - 'menu.dashboard.aiTradingAssistant': 'KI-Handelsassistent', - 'menu.dashboard.signalRobot': 'Signal-Roboter', - 'menu.dashboard.monitor': 'Überwachungsseite', - 'menu.dashboard.workplace': 'Werkbank', - 'menu.form': 'Formularseite', - 'menu.form.basic-form': 'Grundform', - 'menu.form.step-form': 'Schritt-für-Schritt-Formular', - 'menu.form.step-form.info': 'Schritt-für-Schritt-Formular (Übertragungsinformationen ausfüllen)', - 'menu.form.step-form.confirm': 'Schritt-für-Schritt-Formular (Übertragungsinformationen bestätigen)', - 'menu.form.step-form.result': 'Schritt-für-Schritt-Formular (vollständig)', - 'menu.form.advanced-form': 'Erweiterte Formulare', - 'menu.list': 'Listenseite', - 'menu.list.table-list': 'Anfrageformular', - 'menu.list.basic-list': 'Standardliste', - 'menu.list.card-list': 'Kartenliste', - 'menu.list.search-list': 'Suchliste', - 'menu.list.search-list.articles': 'Suchliste (Artikel)', - 'menu.list.search-list.projects': 'Suchliste (Projekt)', - 'menu.list.search-list.applications': 'Suchliste (App)', - 'menu.profile': 'Detailseite', - 'menu.profile.basic': 'Grundlegende Detailseite', - 'menu.profile.advanced': 'Erweiterte Detailseite', - 'menu.result': 'Ergebnisseite', - 'menu.result.success': 'Erfolgsseite', - 'menu.result.fail': 'Fehlerseite', - 'menu.exception': 'Ausnahmeseite', - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': 'Fehler auslösen', - 'menu.account': 'Persönliche Seite', - 'menu.account.center': 'Persönliches Zentrum', - 'menu.account.settings': 'persönliche Einstellungen', - 'menu.account.trigger': 'Triggerfehler', - 'menu.account.logout': 'Abmelden', - 'menu.wallet': 'meine Brieftasche', - 'menu.docs': 'Dokumentenzentrum', - 'menu.docs.detail': 'Dokumentdetails', - 'menu.header.refreshPage': 'Seite aktualisieren', - 'menu.invite.friends': 'Freunde einladen', - 'app.setting.pagestyle': 'allgemeine Stileinstellungen', - 'app.setting.pagestyle.light': 'Heller Menüstil', - 'app.setting.pagestyle.dark': 'Dunkler Menüstil', - 'app.setting.pagestyle.realdark': 'Dunkelmodus', - 'app.setting.themecolor': 'Themenfarbe', - 'app.setting.navigationmode': 'Navigationsmodus', - 'app.setting.sidemenu.nav': 'Seitenleistennavigation', - 'app.setting.topmenu.nav': 'Navigation in der oberen Leiste', - 'app.setting.content-width': 'Breite des Inhaltsbereichs', - 'app.setting.content-width.tooltip': 'Diese Einstellung ist nur wirksam, wenn [Navigation in der oberen Leiste]', - 'app.setting.content-width.fixed': 'Behoben', - 'app.setting.content-width.fluid': 'Streaming', - 'app.setting.fixedheader': 'Fester Header', - 'app.setting.fixedheader.tooltip': 'Bei festem Header konfigurierbar', - 'app.setting.autoHideHeader': 'Kopfzeile beim Scrollen ausblenden', - 'app.setting.fixedsidebar': 'Seitenmenü korrigiert', - 'app.setting.sidemenu': 'Seitenmenü-Layout', - 'app.setting.topmenu': 'Oberes Menülayout', - 'app.setting.othersettings': 'Andere Einstellungen', - 'app.setting.weakmode': 'Farbschwächemodus', - 'app.setting.multitab': 'Multi-Tab-Modus', - 'app.setting.copy': 'Einstellungen kopieren', - 'app.setting.loading': 'Thema wird geladen', - 'app.setting.copyinfo': 'Einstellungen erfolgreich kopieren src/config/defaultSettings.js', - 'app.setting.copy.success': 'Kopieren abgeschlossen', - 'app.setting.copy.fail': 'Der Kopiervorgang ist fehlgeschlagen', - 'app.setting.theme.switching': 'Wechselndes Thema!', - 'app.setting.production.hint': 'Die Konfigurationsleiste dient nur der Vorschau in der Entwicklungsumgebung und wird in der Produktionsumgebung nicht angezeigt. Bitte kopieren und ändern Sie die Konfigurationsdatei manuell.', - 'app.setting.themecolor.daybreak': 'Morgenblau (Standard)', - 'app.setting.themecolor.dust': 'Dämmerung', - 'app.setting.themecolor.volcano': 'Vulkan', - 'app.setting.themecolor.sunset': 'Sonnenuntergang', - 'app.setting.themecolor.cyan': 'Mingqing', - 'app.setting.themecolor.green': 'Auroragrün', - 'app.setting.themecolor.geekblue': 'Geek blau', - 'app.setting.themecolor.purple': 'Jiang Zi', - 'app.setting.tooltip': 'Seiteneinstellungen', - 'user.login.userName': 'Benutzername', - 'user.login.password': 'Passwort', - 'user.login.username.placeholder': 'Konto: Admin', - 'user.login.password.placeholder': 'Passwort: admin oder ant.design', - 'user.login.message-invalid-credentials': 'Die Anmeldung ist fehlgeschlagen. Bitte überprüfen Sie Ihre E-Mail-Adresse und Ihren Bestätigungscode', - 'user.login.message-invalid-verification-code': 'Fehler beim Bestätigungscode', - 'user.login.tab-login-credentials': 'Anmeldung mit Kontopasswort', - 'user.login.tab-login-email': 'E-Mail-Login', - 'user.login.tab-login-mobile': 'Anmeldung über die Mobiltelefonnummer', - 'user.login.captcha.placeholder': 'Bitte geben Sie den grafischen Bestätigungscode ein', - 'user.login.mobile.placeholder': 'Mobiltelefonnummer', - 'user.login.mobile.verification-code.placeholder': 'Bestätigungscode', - 'user.login.email.placeholder': 'Bitte geben Sie Ihre E-Mail-Adresse ein', - 'user.login.email.verification-code.placeholder': 'Bitte geben Sie den Bestätigungscode ein', - 'user.login.email.sending': 'Bestätigungscode wird gesendet...', - 'user.login.email.send-success-title': 'Tipps', - 'user.login.email.send-success': 'Der Bestätigungscode wurde erfolgreich gesendet. Bitte überprüfen Sie Ihre E-Mails', - 'user.login.sms.send-success': 'Der Bestätigungscode wurde erfolgreich gesendet. Bitte überprüfen Sie die Textnachricht', - 'user.login.remember-me': 'Automatische Anmeldung', - 'user.login.forgot-password': 'Passwort vergessen', - 'user.login.sign-in-with': 'Andere Anmeldemethoden', - 'user.login.signup': 'Registrieren Sie ein Konto', - 'user.login.login': 'Anmelden', - 'user.register.register': 'Registrieren', - 'user.register.email.placeholder': 'E-Mail', - 'user.register.password.placeholder': 'Bitte geben Sie mindestens 6 Zeichen ein. Bitte verwenden Sie keine Passwörter, die leicht zu erraten sind.', - 'user.register.password.popover-message': 'Bitte geben Sie mindestens 6 Zeichen ein. Bitte verwenden Sie keine Passwörter, die leicht zu erraten sind.', - 'user.register.confirm-password.placeholder': 'Passwort bestätigen', - 'user.register.get-verification-code': 'Holen Sie sich den Bestätigungscode', - 'user.register.sign-in': 'Melden Sie sich mit einem bestehenden Konto an', - 'user.register-result.msg': 'Ihr Konto: {email} Registrierung erfolgreich', - 'user.register-result.activation-email': 'Die Aktivierungs-E-Mail wurde an Ihr Postfach gesendet und ist 24 Stunden lang gültig. Bitte melden Sie sich umgehend bei Ihrem E-Mail-Konto an und klicken Sie auf den Link in der E-Mail, um Ihr Konto zu aktivieren.', - 'user.register-result.back-home': 'Zurück zur Startseite', - 'user.register-result.view-mailbox': 'Überprüfen Sie Ihr Postfach', - 'user.email.required': 'Bitte geben Sie Ihre E-Mail-Adresse ein!', - 'user.email.wrong-format': 'Das E-Mail-Adressformat ist falsch!', - 'user.userName.required': 'Bitte geben Sie Ihren Kontonamen oder Ihre E-Mail-Adresse ein', - 'user.password.required': 'Bitte geben Sie Ihr Passwort ein!', - 'user.password.twice.msg': 'Die doppelt eingegebenen Passwörter stimmen nicht überein!', - 'user.password.strength.msg': 'Das Passwort ist nicht sicher genug', - 'user.password.strength.strong': 'Stärke: Stark', - 'user.password.strength.medium': 'Stärke: Mittel', - 'user.password.strength.low': 'Stärke: gering', - 'user.password.strength.short': 'Stärke: zu kurz', - 'user.confirm-password.required': 'Bitte bestätigen Sie Ihr Passwort!', - 'user.phone-number.required': 'Bitte geben Sie die korrekte Mobiltelefonnummer ein', - 'user.phone-number.wrong-format': 'Das Format der Mobiltelefonnummer ist falsch!', - 'user.verification-code.required': 'Bitte geben Sie den Verifizierungscode ein!', - 'user.captcha.required': 'Bitte geben Sie den grafischen Verifizierungscode ein!', - 'user.login.infos': 'QuantDinger ist ein AI-Multi-Agent-Hilfstool für die Aktienanalyse und verfügt nicht über Qualifikationen als Wertpapieranlageberater. Alle Analyseergebnisse, Scores und Referenzmeinungen in der Plattform werden von KI automatisch auf Basis historischer Daten generiert und dienen ausschließlich der Ausbildung, Forschung und dem technischen Austausch und stellen keine Anlageberatung oder Entscheidungsgrundlage dar. Aktienanlagen bergen verschiedene Risiken wie Marktrisiko, Liquiditätsrisiko, politisches Risiko usw., die zu einem Kapitalverlust führen können. Benutzer sollten unabhängige Entscheidungen auf der Grundlage ihrer eigenen Risikotoleranz treffen, und jegliches Investitionsverhalten und alle Konsequenzen, die sich aus der Verwendung dieses Tools ergeben, sind vom Benutzer zu tragen. Der Markt ist riskant und Investitionen müssen vorsichtig sein.', - 'user.login.tab-login-web3': 'Web3-Anmeldung', - 'user.login.web3.tip': 'Signatur-Login mit Wallet', - 'user.login.web3.connect': 'Wallet verbinden und anmelden', - 'user.login.web3.no-wallet': 'Wallet nicht erkannt', - 'user.login.web3.no-address': 'Wallet-Adresse nicht erhalten', - 'user.login.web3.nonce-failed': 'Zufallszahl konnte nicht abgerufen werden', - 'user.login.web3.verify-failed': 'Die Signaturüberprüfung ist fehlgeschlagen', - 'user.login.web3.success': 'Anmeldung erfolgreich', - 'user.login.web3.failed': 'Die Wallet-Anmeldung ist fehlgeschlagen', - 'nav.no_wallet': 'Wallet nicht erkannt', - 'nav.copy': 'Kopieren', - 'nav.copy_success': 'Erfolgreich kopiert', - 'user.login.oauth.google': 'Melden Sie sich mit Google an', - 'user.login.oauth.github': 'Melden Sie sich mit GitHub an', - 'user.login.oauth.loading': 'Weiterleitung zur Autorisierungsseite...', - 'user.login.oauth.failed': 'Die OAuth-Anmeldung ist fehlgeschlagen', - 'user.login.oauth.get-url-failed': 'Der Autorisierungslink konnte nicht abgerufen werden', - 'user.login.subtitle': 'Gezielte quantitative Einblicke in globale Märkte', - 'user.login.legal.title': 'Haftungsausschluss', - 'user.login.legal.view': 'Rechtlichen Haftungsausschluss anzeigen', - 'user.login.legal.collapse': 'Haftungsausschluss einklappen', - 'user.login.legal.agree': 'Ich habe den Haftungsausschluss gelesen und stimme ihm zu', - 'user.login.legal.required': 'Bitte lesen und überprüfen Sie zunächst den rechtlichen Haftungsausschluss', - 'user.login.legal.content': 'QuantDinger ist ein AI-Multi-Agent-Hilfstool für die Aktienanalyse und verfügt nicht über Qualifikationen als Wertpapieranlageberater. Alle Analyseergebnisse, Bewertungen und Referenzmeinungen in der Plattform werden von KI automatisch auf Basis historischer Daten generiert und dienen ausschließlich der Ausbildung, Forschung und dem technischen Austausch und stellen keine Anlageberatung oder Entscheidungsgrundlage dar. Aktienanlagen bergen verschiedene Risiken wie Marktrisiko, Liquiditätsrisiko, politisches Risiko usw., die zu einem Kapitalverlust führen können. Benutzer sollten unabhängige Entscheidungen auf der Grundlage ihrer eigenen Risikotoleranz treffen, und jegliches Investitionsverhalten und alle Konsequenzen, die sich aus der Verwendung dieses Tools ergeben, sind vom Benutzer zu tragen. Der Markt ist riskant und Investitionen müssen vorsichtig sein.', - 'user.login.privacy.title': 'Datenschutzrichtlinie für Benutzer', - 'user.login.privacy.view': 'Datenschutzrichtlinie für Benutzer anzeigen', - 'user.login.privacy.collapse': 'Schließen Sie die Datenschutzbestimmungen für Benutzer', - 'user.login.privacy.content': 'Wir legen Wert auf Ihre Privatsphäre und Ihren Datenschutz. 1) Erfassungsumfang: Es werden nur die zur Umsetzung der Funktion erforderlichen Informationen (z. B. E-Mail, Mobiltelefonnummer, Vorwahl, Web3-Wallet-Adresse) sowie notwendige Protokolle und Geräteinformationen erfasst. 2) Verwendungszweck: Zur Kontoanmeldung und Sicherheitsüberprüfung, Bereitstellung von Servicefunktionen, Fehlerbehebung und Compliance-Anforderungen. 3) Speicherung und Sicherheit: Daten werden verschlüsselt und gespeichert, und es werden die erforderlichen Berechtigungen und Zugriffskontrollmaßnahmen ergriffen, um unbefugten Zugriff, Offenlegung oder Verlust zu verhindern. 4) Weitergabe an Dritte: Sofern dies nicht durch Gesetze und Vorschriften vorgeschrieben oder für die Erbringung von Dienstleistungen erforderlich ist, werden Ihre personenbezogenen Daten nicht an Dritte weitergegeben. Bei Einbindung von Diensten Dritter (z. B. Wallets, SMS-Dienstleister) erfolgt die Verarbeitung nur im für die Umsetzung der Funktion erforderlichen Mindestumfang. 5) Cookies/lokale Speicherung: werden für den Anmeldestatus und die notwendige Sitzungswartung verwendet (z. B. Token, PHPSESSID). Sie können sie im Browser löschen oder einschränken. 6) Persönlichkeitsrechte: Sie können Ihre Rechte auf Auskunft, Berichtigung, Löschung, Widerruf der Einwilligung usw. gemäß den Gesetzen und Vorschriften ausüben. 7) Änderungen und Hinweise: Wenn diese Bedingungen aktualisiert werden, werden sie gut sichtbar auf der Seite angezeigt. Durch die weitere Nutzung dieses Dienstes wird davon ausgegangen, dass Sie den aktualisierten Inhalt gelesen und ihm zugestimmt haben. Wenn Sie diesen Bedingungen oder deren Aktualisierungen nicht zustimmen, stellen Sie bitte die Nutzung des Dienstes ein und kontaktieren Sie uns.', - 'account.basicInfo': 'Grundlegende Informationen', - 'account.id': 'Benutzer-ID', - 'account.username': 'Benutzername', - 'account.nickname': 'Spitzname', - 'account.email': 'E-Mail', - 'account.mobile': 'Mobiltelefonnummer', - 'account.web3address': 'Wallet-Adresse', - 'account.pid': 'Referrer-ID', - 'account.level': 'Benutzerebene', - 'account.money': 'Gleichgewicht', - 'account.qdtBalance': 'QDT-Balance', - 'account.score': 'Punkte', - 'account.createtime': 'Anmeldezeit', - 'account.inviteLink': 'Einladungslink', - 'account.recharge': 'Aufladen', - 'account.rechargeTip': 'Bitte verwenden Sie WeChat oder Alipay, um den untenstehenden QR-Code zum Aufladen zu scannen.', - 'account.qrCodePlaceholder': 'QR-Code-Platzhalter (Emulation)', - 'account.rechargeAmount': 'Aufladebetrag', - 'account.enterAmount': 'Bitte geben Sie den Aufladebetrag ein', - 'account.rechargeHint': 'Mindesteinzahlungsbetrag: 1 QDT', - 'account.confirmRecharge': 'Bestätigen Sie das Aufladen', - 'account.enterValidAmount': 'Bitte geben Sie einen gültigen Aufladebetrag ein', - 'account.rechargeSuccess': 'Aufladen erfolgreich! {amount} QDT eingezahlt', - 'account.settings.menuMap.basic': 'Grundeinstellungen', - 'account.settings.menuMap.security': 'Sicherheitseinstellungen', - 'account.settings.menuMap.notification': 'Benachrichtigung über neue Nachrichten', - 'account.settings.menuMap.moneyLog': 'Details zum Fonds', - 'account.moneyLog.empty': 'Noch keine Fondsdetails', - 'account.moneyLog.total': 'Insgesamt {total} Datensätze', - 'account.moneyLog.type.purchase': 'Kaufindikator', - 'account.moneyLog.type.recharge': 'Aufladen', - 'account.moneyLog.type.refund': 'Rückerstattung', - 'account.moneyLog.type.reward': 'Belohnung', - 'account.moneyLog.type.income': 'Indikatoreinkommen', - 'account.moneyLog.type.commission': 'Bearbeitungsgebühr für die Plattform', - 'wallet.balance': 'QDT-Balance', - 'wallet.recharge': 'Aufladen', - 'wallet.withdraw': 'Bargeld abheben', - 'wallet.filter': 'Filtern', - 'wallet.reset': 'zurückgesetzt', - 'wallet.totalRecharge': 'Akkumulierte Aufladung', - 'wallet.totalWithdraw': 'Kumulierte Abhebungen', - 'wallet.totalIncome': 'Kumuliertes Einkommen', - 'wallet.records': 'Transaktionsaufzeichnungen und Fondsdetails', - 'wallet.tradingRecords': 'Transaktionsverlauf', - 'wallet.moneyLog': 'Details zum Fonds', - 'wallet.rechargeTip': 'Bitte verwenden Sie WeChat oder Alipay, um den untenstehenden QR-Code zum Aufladen zu scannen.', - 'wallet.qrCodePlaceholder': 'QR-Code-Platzhalter (Emulation)', - 'wallet.rechargeAmount': 'Aufladebetrag', - 'wallet.enterAmount': 'Bitte geben Sie den Aufladebetrag ein', - 'wallet.rechargeHint': 'Mindesteinzahlungsbetrag: 1 QDT', - 'wallet.confirmRecharge': 'Bestätigen Sie das Aufladen', - 'wallet.enterValidAmount': 'Bitte geben Sie einen gültigen Aufladebetrag ein', - 'wallet.rechargeSuccess': 'Aufladen erfolgreich! {amount} QDT eingezahlt', - 'wallet.rechargeFailed': 'Das Aufladen ist fehlgeschlagen', - 'wallet.withdrawTip': 'Bitte geben Sie den Auszahlungsbetrag und die Auszahlungsadresse ein', - 'wallet.withdrawAmount': 'Betrag abheben', - 'wallet.enterWithdrawAmount': 'Bitte geben Sie den Auszahlungsbetrag ein', - 'wallet.withdrawHint': 'Mindestauszahlungsbetrag: 1 QDT', - 'wallet.withdrawAddress': 'Auszahlungsadresse (optional)', - 'wallet.enterWithdrawAddress': 'Bitte geben Sie die Auszahlungsadresse ein', - 'wallet.confirmWithdraw': 'Auszahlung bestätigen', - 'wallet.enterValidWithdrawAmount': 'Bitte geben Sie einen gültigen Auszahlungsbetrag ein', - 'wallet.insufficientBalance': 'Unzureichendes Gleichgewicht', - 'wallet.withdrawSuccess': 'Auszahlung erfolgreich! {Betrag} QDT abgehoben', - 'wallet.withdrawFailed': 'Die Auszahlung ist fehlgeschlagen', - 'wallet.noTradingRecords': 'Noch kein Transaktionsdatensatz', - 'wallet.noMoneyLog': 'Noch keine Fondsdetails', - 'wallet.loadTradingRecordsFailed': 'Transaktionsdatensätze konnten nicht geladen werden', - 'wallet.loadMoneyLogFailed': 'Die Fondsdetails konnten nicht geladen werden', - 'wallet.moneyLogTotal': 'Insgesamt {total} Datensätze', - 'wallet.moneyLogTypeTitle': 'Typ', - 'wallet.moneyLogType.all': 'Alle Arten', - 'wallet.table.time': 'Zeit', - 'wallet.table.type': 'Typ', - 'wallet.table.price': 'Preis', - 'wallet.table.amount': 'Menge', - 'wallet.table.money': 'Betrag', - 'wallet.table.balance': 'Gleichgewicht', - 'wallet.table.memo': 'Bemerkungen', - 'wallet.table.value': 'Wert', - 'wallet.table.profit': 'Gewinn und Verlust', - 'wallet.table.commission': 'Bearbeitungsgebühr', - 'wallet.table.total': 'Insgesamt {total} Datensätze', - 'wallet.tradeType.buy': 'kaufen', - 'wallet.tradeType.sell': 'verkaufen', - 'wallet.tradeType.liquidation': 'Zwangsliquidation', - 'wallet.tradeType.openLong': 'Lange geöffnet', - 'wallet.tradeType.addLong': 'Gadot', - 'wallet.tradeType.closeLong': 'Pinduo', - 'wallet.tradeType.closeLongStop': 'Stop-Loss und Long', - 'wallet.tradeType.closeLongProfit': 'Nehmen Sie Gewinn mit und steigern Sie Ihr Level', - 'wallet.tradeType.openShort': 'Kurz öffnen', - 'wallet.tradeType.addShort': 'kurz hinzufügen', - 'wallet.tradeType.closeShort': 'leer', - 'wallet.tradeType.closeShortStop': 'Stop-Loss', - 'wallet.tradeType.closeShortProfit': 'Nehmen Sie den Gewinn mit und schließen Sie mit Leerverkäufen', - 'wallet.moneyLogType.purchase': 'Kaufindikator', - 'wallet.moneyLogType.recharge': 'Aufladen', - 'wallet.moneyLogType.withdraw': 'Bargeld abheben', - 'wallet.moneyLogType.refund': 'Rückerstattung', - 'wallet.moneyLogType.reward': 'Belohnung', - 'wallet.moneyLogType.income': 'Einkommen', - 'wallet.moneyLogType.commission': 'Bearbeitungsgebühr', - 'wallet.web3Address.required': 'Bitte geben Sie zuerst die Web3-Wallet-Adresse ein', - 'wallet.web3Address.requiredDescription': 'Vor dem Aufladen müssen Sie Ihre Web3-Wallet-Adresse verknüpfen, um eine Aufladung zu erhalten.', - 'wallet.web3Address.placeholder': 'Bitte geben Sie Ihre Web3-Wallet-Adresse ein (beginnend mit 0x)', - 'wallet.web3Address.save': 'Wallet-Adresse speichern', - 'wallet.web3Address.saveSuccess': 'Wallet-Adresse erfolgreich gespeichert', - 'wallet.web3Address.saveFailed': 'Wallet-Adresse konnte nicht gespeichert werden', - 'wallet.web3Address.invalidFormat': 'Bitte geben Sie eine gültige Web3-Wallet-Adresse ein (Ethereum-Format: 42 Zeichen, beginnend mit 0x, oder TRC20-Format: 34 Zeichen, beginnend mit T)', - 'wallet.selectCoin': 'Währung auswählen', - 'wallet.selectChain': 'Auswahlkette', - 'wallet.chain.eth': 'ETH(ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'BSC', - 'wallet.targetQdtAmount': 'Der QDT-Betrag, den Sie einlösen möchten (optional)', - 'wallet.targetQdtAmount.placeholder': 'Bitte geben Sie die Menge an QDT ein, die Sie einlösen möchten, den aktuellen QDT-Preis: {price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': 'Aufladung erforderlich: {amount} USDT', - 'wallet.rechargeAddress': 'Aufladeadresse', - 'wallet.copyAddress': 'Kopieren', - 'wallet.copySuccess': 'Erfolgreich kopieren!', - 'wallet.copyFailed': 'Der Kopiervorgang ist fehlgeschlagen. Bitte manuell kopieren', - 'wallet.rechargeAddressHint': 'Bitte stellen Sie sicher, dass Sie {chain} verwenden, um {coin} an diese Adresse einzuzahlen', - 'wallet.qdtPrice.loading': 'Laden...', - 'wallet.rechargeTip.new': 'Bitte wählen Sie die Währung und die Kette aus und scannen Sie dann den untenstehenden QR-Code zum Aufladen', - 'wallet.exchangeRate': '1 QDT ≈ {rate} USDT', - 'wallet.withdrawableAmount': 'Verfügbarer Bargeldbetrag', - 'wallet.totalBalance': 'Gesamtsaldo', - 'wallet.insufficientWithdrawable': 'Der Bargeldbetrag, der abgehoben werden kann, reicht nicht aus. Der aktuelle Betrag, der abgehoben werden kann, ist: {amount} QDT', - 'wallet.withdrawAddressRequired': 'Bitte geben Sie die Auszahlungsadresse ein', - 'wallet.withdrawAddressHint': 'Bitte stellen Sie sicher, dass die Adresse korrekt ist. Nach dem Widerruf ist ein Widerruf nicht mehr möglich.', - 'wallet.withdrawSubmitSuccess': 'Auszahlungsantrag erfolgreich eingereicht, bitte warten Sie auf die Prüfung', - 'menu.footer.contactUs': 'Kontaktieren Sie uns', - 'menu.footer.getSupport': 'Holen Sie sich Unterstützung', - 'menu.footer.socialAccounts': 'soziales Konto', - 'menu.footer.userAgreement': 'Benutzervereinbarung', - 'menu.footer.privacyPolicy': 'Datenschutzrichtlinie', - 'menu.footer.support': 'Unterstützung', - 'menu.footer.featureRequest': 'Funktionsanfrage', - 'menu.footer.email': 'E-Mail', - 'menu.footer.liveChat': 'Live-Chat rund um die Uhr', - 'dashboard.analysis.title': 'Mehrdimensionale Analyse', - 'dashboard.analysis.subtitle': 'KI-gesteuerte umfassende Finanzanalyseplattform', - 'dashboard.analysis.selectSymbol': 'Wählen Sie den zugrunde liegenden Code aus oder geben Sie ihn ein', - 'dashboard.analysis.selectModel': 'Modell auswählen', - 'dashboard.analysis.startAnalysis': 'Analyse starten', - 'dashboard.analysis.history': 'Geschichte', - 'dashboard.analysis.tab.overview': 'umfassende Analyse', - 'dashboard.analysis.tab.fundamental': 'Grundlagen', - 'dashboard.analysis.tab.technical': 'Technologie', - 'dashboard.analysis.tab.news': 'Nachrichten', - 'dashboard.analysis.tab.sentiment': 'Emotionen', - 'dashboard.analysis.tab.risk': 'Risiko', - 'dashboard.analysis.tab.debate': 'Die Lang-Kurz-Debatte', - 'dashboard.analysis.tab.decision': 'endgültige Entscheidung', - 'dashboard.analysis.empty.selectSymbol': 'Wählen Sie ein Ziel aus, um die Analyse zu starten', - 'dashboard.analysis.empty.selectSymbolDesc': 'Wählen Sie aus der selbstgewählten Aktienliste aus oder geben Sie den zugrunde liegenden Code ein, um einen mehrdimensionalen KI-Analysebericht zu erhalten', - 'dashboard.analysis.empty.startAnalysis': 'Klicken Sie auf die Schaltfläche „Analyse starten“, um eine mehrdimensionale Analyse durchzuführen', - 'dashboard.analysis.empty.startAnalysisDesc': 'Wir bieten Ihnen umfassende Analysen aus mehreren Dimensionen wie Fundamentaldaten, Technologie, Nachrichten, Stimmung und Risiko', - 'dashboard.analysis.empty.noData': 'Derzeit liegen keine {type}-Analysedaten vor. Bitte führen Sie zunächst eine umfassende Analyse durch', - 'dashboard.analysis.empty.noWatchlist': 'Derzeit gibt es keine selbstgewählten Aktien', - 'dashboard.analysis.empty.noHistory': 'Noch keine Geschichte', - 'dashboard.analysis.empty.watchlistHint': 'Derzeit sind keine selbstgewählten Aktien vorhanden, bitte zuerst', - 'dashboard.analysis.empty.noDebateData': 'Noch keine Debattendaten', - 'dashboard.analysis.empty.noDecisionData': 'Noch keine Entscheidungsdaten', - 'dashboard.analysis.empty.selectAgent': 'Bitte wählen Sie einen Agenten aus, um die Analyseergebnisse anzuzeigen', - 'dashboard.analysis.loading.analyzing': 'Analyse läuft, bitte warten...', - 'dashboard.analysis.loading.fundamental': 'Fundamentaldaten analysieren...', - 'dashboard.analysis.loading.technical': 'Analyse technischer Indikatoren...', - 'dashboard.analysis.loading.news': 'Nachrichtendaten werden analysiert...', - 'dashboard.analysis.loading.sentiment': 'Marktstimmung analysieren...', - 'dashboard.analysis.loading.risk': 'Risiko einschätzen...', - 'dashboard.analysis.loading.debate': 'Die Lang-Kurz-Debatte geht weiter...', - 'dashboard.analysis.loading.decision': 'Endgültige Entscheidung generieren...', - 'dashboard.analysis.score.overall': 'Gesamtbewertung', - 'dashboard.analysis.score.recommendation': 'Anlageberatung', - 'dashboard.analysis.score.confidence': 'Vertrauen', - 'dashboard.analysis.dimension.fundamental': 'Grundlagen', - 'dashboard.analysis.dimension.technical': 'Technologie', - 'dashboard.analysis.dimension.news': 'Nachrichten', - 'dashboard.analysis.dimension.sentiment': 'Emotionen', - 'dashboard.analysis.dimension.risk': 'Risiko', - 'dashboard.analysis.card.dimensionScores': 'Bewertungen für jede Dimension', - 'dashboard.analysis.card.overviewReport': 'Umfassender Analysebericht', - 'dashboard.analysis.card.financialMetrics': 'Finanzindikatoren', - 'dashboard.analysis.card.fundamentalReport': 'Fundamentalanalysebericht', - 'dashboard.analysis.card.technicalIndicators': 'Technische Indikatoren', - 'dashboard.analysis.card.technicalReport': 'Technischer Analysebericht', - 'dashboard.analysis.card.newsList': 'Verwandte Neuigkeiten', - 'dashboard.analysis.card.newsReport': 'Bericht zur Nachrichtenanalyse', - 'dashboard.analysis.card.sentimentIndicators': 'Stimmungsindikator', - 'dashboard.analysis.card.sentimentReport': 'Stimmungsanalysebericht', - 'dashboard.analysis.card.riskMetrics': 'Risikoindikatoren', - 'dashboard.analysis.card.riskReport': 'Risikobewertungsbericht', - 'dashboard.analysis.card.bullView': 'Bullische Sichtweise (Bull)', - 'dashboard.analysis.card.bearView': 'Bärische Sichtweise (Bär)', - 'dashboard.analysis.card.researchConclusion': 'Fazit des Forschers', - 'dashboard.analysis.card.traderPlan': 'Händlerplan', - 'dashboard.analysis.card.riskDebate': 'Debatte im Risikoausschuss', - 'dashboard.analysis.card.finalDecision': 'Endgültige Entscheidung', - 'dashboard.analysis.card.tradePlanDetail': 'Einzelheiten zum Handelsplan', - 'dashboard.analysis.tradingPlan.entry_price': 'Eintrittspreis', - 'dashboard.analysis.tradingPlan.position_size': 'Positionsgröße', - 'dashboard.analysis.tradingPlan.stop_loss': 'Stop-Loss', - 'dashboard.analysis.tradingPlan.take_profit': 'Nehmen Sie Gewinn mit', - 'dashboard.analysis.label.confidence': 'Vertrauen', - 'dashboard.analysis.label.keyPoints': 'Kernpunkte', - 'dashboard.analysis.label.riskWarning': 'Risikowarnung', - 'dashboard.analysis.risk.risky': 'Riskant', - 'dashboard.analysis.risk.neutral': 'Neutraler Standpunkt (Neutral)', - 'dashboard.analysis.risk.safe': 'Konservative Sichtweise (sicher)', - 'dashboard.analysis.risk.conclusion': 'Fazit', - 'dashboard.analysis.feature.fundamental': 'Fundamentalanalyse', - 'dashboard.analysis.feature.technical': 'technische Analyse', - 'dashboard.analysis.feature.news': 'Nachrichtenanalyse', - 'dashboard.analysis.feature.sentiment': 'Stimmungsanalyse', - 'dashboard.analysis.feature.risk': 'Risikobewertung', - 'dashboard.analysis.watchlist.title': 'Meine Aktienauswahl', - 'dashboard.analysis.watchlist.add': 'hinzufügen', - 'dashboard.analysis.watchlist.addStock': 'Brühe hinzufügen', - 'dashboard.analysis.modal.addStock.title': 'Fügen Sie optionale Aktien hinzu', - 'dashboard.analysis.modal.addStock.confirm': 'Okay', - 'dashboard.analysis.modal.addStock.cancel': 'Abbrechen', - 'dashboard.analysis.modal.addStock.market': 'Markttyp', - 'dashboard.analysis.modal.addStock.marketPlaceholder': 'Bitte wählen Sie einen Markt aus', - 'dashboard.analysis.modal.addStock.marketRequired': 'Bitte wählen Sie den Markttyp aus', - 'dashboard.analysis.modal.addStock.symbol': 'Lagercode', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': 'Zum Beispiel: AAPL, TSLA, GOOGL, 000001, BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': 'Bitte Lagercode eingeben', - 'dashboard.analysis.modal.addStock.searchPlaceholder': 'Suchen Sie nach Zielcode oder Name', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': 'Suchen Sie den zugrunde liegenden Code oder geben Sie ihn ein (z. B. AAPL, BTC/USDT, EUR/USD).', - 'dashboard.analysis.modal.addStock.searchOrInputHint': 'Unterstützt die Suche nach Objekten in der Datenbank oder die direkte Eingabe des Codes (das System erhält den Namen automatisch).', - 'dashboard.analysis.modal.addStock.search': 'Suchen', - 'dashboard.analysis.modal.addStock.searchResults': 'Suchergebnisse', - 'dashboard.analysis.modal.addStock.hotSymbols': 'Beliebte Ziele', - 'dashboard.analysis.modal.addStock.noHotSymbols': 'Noch keine beliebten Ziele', - 'dashboard.analysis.modal.addStock.selectedSymbol': 'Ausgewählt', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': 'Bitte wählen Sie zunächst ein Ziel aus', - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': 'Bitte wählen Sie ein Ziel aus oder geben Sie zuerst den Zielcode ein', - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': 'Bitte geben Sie den Zielcode ein', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': 'Bitte wählen Sie zunächst den Markttyp aus', - 'dashboard.analysis.modal.addStock.searchFailed': 'Die Suche ist fehlgeschlagen. Bitte versuchen Sie es später erneut', - 'dashboard.analysis.modal.addStock.noSearchResults': 'Kein passendes Ziel gefunden', - 'dashboard.analysis.modal.addStock.willAutoFetchName': 'Das System erhält den Namen automatisch', - 'dashboard.analysis.modal.addStock.addDirectly': 'Direkt hinzufügen', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': 'Der Name wird beim Hinzufügen automatisch übernommen', - 'dashboard.analysis.market.AShare': 'A-Aktien', - 'dashboard.analysis.market.USStock': 'US-Aktien', - 'dashboard.analysis.market.HShare': 'Aktien aus Hongkong', - 'dashboard.analysis.market.Crypto': 'Kryptowährung', - 'dashboard.analysis.market.Forex': 'Forex', - 'dashboard.analysis.market.Futures': 'Futures', - 'dashboard.analysis.modal.history.title': 'Historische Analyseaufzeichnungen', - 'dashboard.analysis.modal.history.viewResult': 'Ergebnisse anzeigen', - 'dashboard.analysis.modal.history.completeTime': 'Fertigstellungszeit', - 'dashboard.analysis.modal.history.error': 'Fehler', - 'dashboard.analysis.status.pending': 'Ausstehend', - 'dashboard.analysis.status.processing': 'Verarbeitung', - 'dashboard.analysis.status.completed': 'Abgeschlossen', - 'dashboard.analysis.status.failed': 'gescheitert', - 'dashboard.analysis.message.selectSymbol': 'Bitte wählen Sie zuerst das Ziel aus', - 'dashboard.analysis.message.taskCreated': 'Die Analyseaufgabe wurde erstellt und wird im Hintergrund ausgeführt...', - 'dashboard.analysis.message.analysisComplete': 'Analyse abgeschlossen', - 'dashboard.analysis.message.analysisCompleteCache': 'Analyse abgeschlossen (unter Verwendung zwischengespeicherter Daten)', - 'dashboard.analysis.message.analysisFailed': 'Die Analyse ist fehlgeschlagen. Bitte versuchen Sie es später noch einmal', - 'dashboard.analysis.message.addStockSuccess': 'Erfolgreich hinzugefügt', - 'dashboard.analysis.message.addStockFailed': 'Das Hinzufügen ist fehlgeschlagen', - 'dashboard.analysis.message.removeStockSuccess': 'Erfolgreich entfernt', - 'dashboard.analysis.message.removeStockFailed': 'Das Entfernen ist fehlgeschlagen', - 'dashboard.analysis.message.resumingAnalysis': 'Analyseaufgabe wird fortgesetzt...', - 'dashboard.analysis.message.deleteSuccess': 'Erfolgreich gelöscht', - 'dashboard.analysis.message.deleteFailed': 'Löschen fehlgeschlagen', - 'dashboard.analysis.modal.history.delete': 'Löschen', - 'dashboard.analysis.modal.history.deleteConfirm': 'Möchten Sie diesen Analysedatensatz wirklich löschen?', - 'dashboard.analysis.test': 'Geschäft Nr. {no}, Gongzhuan Road', - 'dashboard.analysis.introduce': 'Beschreibung des Indikators', - 'dashboard.analysis.total-sales': 'Gesamtumsatz', - 'dashboard.analysis.day-sales': 'Durchschnittlicher Tagesumsatz¥', - 'dashboard.analysis.visits': 'Besuche', - 'dashboard.analysis.visits-trend': 'Verkehrstrends', - 'dashboard.analysis.visits-ranking': 'Ranking der Ladenbesuche', - 'dashboard.analysis.day-visits': 'Tägliche Besuche', - 'dashboard.analysis.week': 'Wöchentlich im Jahresvergleich', - 'dashboard.analysis.day': 'Jahr für Jahr', - 'dashboard.analysis.payments': 'Anzahl der Zahlungen', - 'dashboard.analysis.conversion-rate': 'Umrechnungskurs', - 'dashboard.analysis.operational-effect': 'Auswirkungen der betrieblichen Tätigkeit', - 'dashboard.analysis.sales-trend': 'Verkaufstrends', - 'dashboard.analysis.sales-ranking': 'Ranking der Filialverkäufe', - 'dashboard.analysis.all-year': 'Das ganze Jahr über', - 'dashboard.analysis.all-month': 'diesen Monat', - 'dashboard.analysis.all-week': 'diese Woche', - 'dashboard.analysis.all-day': 'heute', - 'dashboard.analysis.search-users': 'Anzahl der Suchbenutzer', - 'dashboard.analysis.per-capita-search': 'Suchanfragen pro Kopf', - 'dashboard.analysis.online-top-search': 'Beliebte Suchanfragen im Internet', - 'dashboard.analysis.the-proportion-of-sales': 'Anteil der Verkaufskategorie', - 'dashboard.analysis.dropdown-option-one': 'Operation eins', - 'dashboard.analysis.dropdown-option-two': 'Betrieb 2', - 'dashboard.analysis.channel.all': 'Alle Kanäle', - 'dashboard.analysis.channel.online': 'online', - 'dashboard.analysis.channel.stores': 'speichern', - 'dashboard.analysis.sales': 'Verkäufe', - 'dashboard.analysis.traffic': 'Passagierfluss', - 'dashboard.analysis.table.rank': 'Rangliste', - 'dashboard.analysis.table.search-keyword': 'Suchbegriffe suchen', - 'dashboard.analysis.table.users': 'Anzahl der Benutzer', - 'dashboard.analysis.table.weekly-range': 'Wöchentliche Erhöhung', - 'dashboard.indicator.selectSymbol': 'Wählen Sie den zugrunde liegenden Code aus oder geben Sie ihn ein', - 'dashboard.indicator.emptyWatchlistHint': 'Derzeit sind keine selbst ausgewählten Aktien vorhanden. Bitte fügen Sie diese zuerst hinzu', - 'dashboard.indicator.hint.selectSymbol': 'Bitte wählen Sie ein Ziel aus, um mit der Analyse zu beginnen', - 'dashboard.indicator.hint.selectSymbolDesc': 'Wählen Sie einen Aktiencode aus oder geben Sie ihn in das Suchfeld oben ein, um K-Line-Diagramme und technische Indikatoren anzuzeigen', - 'dashboard.indicator.retry': 'Versuchen Sie es erneut', - 'dashboard.indicator.panel.title': 'Technische Indikatoren', - 'dashboard.indicator.panel.realtimeOn': 'Deaktivieren Sie Echtzeit-Updates', - 'dashboard.indicator.panel.realtimeOff': 'Aktivieren Sie Echtzeit-Updates', - 'dashboard.indicator.panel.themeLight': 'Wechseln Sie zum dunklen Thema', - 'dashboard.indicator.panel.themeDark': 'Wechseln Sie zum Lichtthema', - 'dashboard.indicator.section.enabled': 'Aktiviert', - 'dashboard.indicator.section.added': 'Indikatoren, die ich hinzugefügt habe', - 'dashboard.indicator.section.custom': 'Von Ihnen selbst erstellte Indikatoren', - 'dashboard.indicator.section.bought': 'Indikatoren, die ich gekauft habe', - 'dashboard.indicator.section.myCreated': 'Von mir erstellte Indikatoren', - 'dashboard.indicator.empty': 'Es gibt noch keinen Indikator. Bitte fügen Sie zuerst einen Indikator hinzu oder erstellen Sie ihn', - 'dashboard.indicator.buy': 'Kaufindikator', - 'dashboard.indicator.action.start': 'beginnen', - 'dashboard.indicator.action.stop': 'Schließen', - 'dashboard.indicator.action.edit': 'Bearbeiten', - 'dashboard.indicator.action.delete': 'Löschen', - 'dashboard.indicator.action.backtest': 'Backtest', - 'dashboard.indicator.status.normal': 'normal', - 'dashboard.indicator.status.normalPermanent': 'Normal (dauerhaft gültig)', - 'dashboard.indicator.status.expired': 'Abgelaufen', - 'dashboard.indicator.expiry.permanent': 'Dauerhaft gültig', - 'dashboard.indicator.expiry.noExpiry': 'Keine Ablaufzeit', - 'dashboard.indicator.expiry.expired': 'Abgelaufen: {Datum}', - 'dashboard.indicator.expiry.expiresOn': 'Ablaufzeit: {Datum}', - 'dashboard.indicator.delete.confirmTitle': 'Bestätigen Sie den Löschvorgang', - 'dashboard.indicator.delete.confirmContent': 'Sind Sie sicher, dass Sie den Indikator „{name}“ löschen möchten? Dieser Vorgang ist irreversibel.', - 'dashboard.indicator.delete.confirmOk': 'Löschen', - 'dashboard.indicator.delete.confirmCancel': 'Abbrechen', - 'dashboard.indicator.delete.success': 'Erfolgreich löschen', - 'dashboard.indicator.delete.failed': 'Das Löschen ist fehlgeschlagen', - 'dashboard.indicator.save.success': 'Erfolgreich gespeichert', - 'dashboard.indicator.save.failed': 'Speichern fehlgeschlagen', - 'dashboard.indicator.error.loadWatchlistFailed': 'Optionale Bestände konnten nicht geladen werden', - 'dashboard.indicator.error.chartNotReady': 'Die Diagrammkomponente ist nicht initialisiert. Bitte wählen Sie zuerst das Ziel aus und warten Sie, bis das Diagramm geladen ist.', - 'dashboard.indicator.error.chartMethodNotReady': 'Die Diagrammkomponentenmethode ist nicht bereit. Bitte versuchen Sie es später erneut', - 'dashboard.indicator.error.chartExecuteNotReady': 'Die Ausführungsmethode der Diagrammkomponente ist nicht bereit. Bitte versuchen Sie es später erneut', - 'dashboard.indicator.error.parseFailed': 'Python-Code kann nicht analysiert werden', - 'dashboard.indicator.error.parseFailedCheck': 'Der Python-Code kann nicht analysiert werden. Bitte überprüfen Sie das Codeformat', - 'dashboard.indicator.error.addIndicatorFailed': 'Der Indikator konnte nicht hinzugefügt werden', - 'dashboard.indicator.error.runIndicatorFailed': 'Die Laufanzeige ist fehlgeschlagen', - 'dashboard.indicator.error.pleaseLogin': 'Bitte melden Sie sich zuerst an', - 'dashboard.indicator.error.loadDataFailed': 'Das Laden der Daten ist fehlgeschlagen', - 'dashboard.indicator.error.loadDataFailedDesc': 'Bitte überprüfen Sie die Netzwerkverbindung', - 'dashboard.indicator.error.pythonEngineFailed': 'Die Python-Engine konnte nicht geladen werden und die Indikatorfunktion ist möglicherweise nicht verfügbar.', - 'dashboard.indicator.error.chartInitFailed': 'Die Initialisierung des Diagramms ist fehlgeschlagen', - 'dashboard.indicator.warning.enterCode': 'Bitte geben Sie zuerst den Indikatorcode ein', - 'dashboard.indicator.warning.pyodideLoadFailed': 'Die Python-Engine konnte nicht geladen werden', - 'dashboard.indicator.warning.pyodideLoadFailedDesc': 'Diese Funktion ist in Ihrer aktuellen Region oder Netzwerkumgebung nicht verfügbar', - 'dashboard.indicator.warning.chartNotInitialized': 'Das Diagramm ist nicht initialisiert und das Linienzeichnungstool kann nicht verwendet werden.', - 'dashboard.indicator.success.runIndicator': 'Indikator läuft erfolgreich', - 'dashboard.indicator.success.clearDrawings': 'Alle Strichzeichnungen gelöscht', - 'dashboard.indicator.sma': 'SMA (gleitende Durchschnittskombination)', - 'dashboard.indicator.ema': 'EMA (exponentielle gleitende Durchschnittskombination)', - 'dashboard.indicator.rsi': 'RSI (relative Stärke)', - 'dashboard.indicator.macd': 'MACD', - 'dashboard.indicator.bb': 'Bollinger-Bänder', - 'dashboard.indicator.atr': 'ATR (Average True Range)', - 'dashboard.indicator.cci': 'CCI (Commodity Channel Index)', - 'dashboard.indicator.williams': 'Williams %R (Williams-Indikator)', - 'dashboard.indicator.mfi': 'MFI (Geldflussindex)', - 'dashboard.indicator.adx': 'ADX (durchschnittlicher Trendindex)', - 'dashboard.indicator.obv': 'OBV (Energiewelle)', - 'dashboard.indicator.adosc': 'ADOSC (Akkumulieren/Dispatch-Oszillator)', - 'dashboard.indicator.ad': 'AD (Sammel-/Verteilungsleitung)', - 'dashboard.indicator.kdj': 'KDJ (stochastischer Indikator)', - 'dashboard.indicator.signal.buy': 'KAUFEN', - 'dashboard.indicator.signal.sell': 'VERKAUFEN', - 'dashboard.indicator.signal.supertrendBuy': 'SuperTrend kaufen', - 'dashboard.indicator.signal.supertrendSell': 'SuperTrend verkaufen', - 'dashboard.indicator.chart.kline': 'K-Linie', - 'dashboard.indicator.chart.volume': 'Lautstärke', - 'dashboard.indicator.chart.uptrend': 'Aufwärtstrend', - 'dashboard.indicator.chart.downtrend': 'Abwärtstrend', - 'dashboard.indicator.tooltip.time': 'Zeit', - 'dashboard.indicator.tooltip.open': 'offen', - 'dashboard.indicator.tooltip.close': 'erhalten', - 'dashboard.indicator.tooltip.high': 'hoch', - 'dashboard.indicator.tooltip.low': 'niedrig', - 'dashboard.indicator.tooltip.volume': 'Lautstärke', - 'dashboard.indicator.drawing.line': 'Liniensegment', - 'dashboard.indicator.drawing.horizontalLine': 'horizontale Linie', - 'dashboard.indicator.drawing.verticalLine': 'vertikale Linie', - 'dashboard.indicator.drawing.ray': 'Strahl', - 'dashboard.indicator.drawing.straightLine': 'gerade Linie', - 'dashboard.indicator.drawing.parallelLine': 'parallele Linien', - 'dashboard.indicator.drawing.priceLine': 'Preislinie', - 'dashboard.indicator.drawing.priceChannel': 'Preiskanal', - 'dashboard.indicator.drawing.fibonacciLine': 'Fibonacci-Linien', - 'dashboard.indicator.drawing.clearAll': 'Löschen Sie alle Strichzeichnungen', - 'dashboard.indicator.market.AShare': 'A-Aktien', - 'dashboard.indicator.market.USStock': 'US-Aktien', - 'dashboard.indicator.market.HShare': 'Aktien aus Hongkong', - 'dashboard.indicator.market.Crypto': 'Kryptowährung', - 'dashboard.indicator.market.Forex': 'Forex', - 'dashboard.indicator.market.Futures': 'Futures', - 'dashboard.indicator.create': 'Indikator erstellen', - 'dashboard.indicator.editor.title': 'Indikatoren erstellen/bearbeiten', - 'dashboard.indicator.editor.name': 'Indikatorname', - 'dashboard.indicator.editor.nameRequired': 'Bitte geben Sie den Indikatornamen ein', - 'dashboard.indicator.editor.namePlaceholder': 'Bitte geben Sie den Indikatornamen ein', - 'dashboard.indicator.editor.description': 'Beschreibung des Indikators', - 'dashboard.indicator.editor.descriptionPlaceholder': 'Bitte geben Sie eine Beschreibung des Indikators ein (optional)', - 'dashboard.indicator.editor.code': 'Python-Code', - 'dashboard.indicator.editor.codeRequired': 'Bitte geben Sie den Indikatorcode ein', - 'dashboard.indicator.editor.codePlaceholder': 'Bitte geben Sie Python-Code ein', - 'dashboard.indicator.editor.run': 'laufen', - 'dashboard.indicator.editor.runHint': 'Klicken Sie auf die Schaltfläche „Ausführen“, um eine Vorschau des Indikatoreffekts im K-Liniendiagramm anzuzeigen', - 'dashboard.indicator.editor.guide': 'Entwicklungshandbuch', - 'dashboard.indicator.editor.guideTitle': 'Leitfaden zur Entwicklung von Python-Indikatoren', - 'dashboard.indicator.editor.save': 'speichern', - 'dashboard.indicator.editor.cancel': 'Abbrechen', - 'dashboard.indicator.editor.unnamed': 'Unbenannter Indikator', - 'dashboard.indicator.editor.publishToCommunity': 'In der Community posten', - 'dashboard.indicator.editor.publishToCommunityHint': 'Nach der Veröffentlichung können andere Benutzer Ihren Indikator in der Community anzeigen und verwenden', - 'dashboard.indicator.editor.indicatorType': 'Indikatortyp', - 'dashboard.indicator.editor.indicatorTypeRequired': 'Bitte wählen Sie den Indikatortyp aus', - 'dashboard.indicator.editor.indicatorTypePlaceholder': 'Bitte wählen Sie den Indikatortyp aus', - 'dashboard.indicator.editor.previewImage': 'Vorschau', - 'dashboard.indicator.editor.uploadImage': 'Bilder hochladen', - 'dashboard.indicator.editor.previewImageHint': 'Empfohlene Größe: 800 x 400, nicht mehr als 2 MB', - 'dashboard.indicator.editor.pricing': 'Verkaufspreis (QDT)', - 'dashboard.indicator.editor.pricingType.free': 'kostenlos', - 'dashboard.indicator.editor.pricingType.permanent': 'dauerhaft', - 'dashboard.indicator.editor.pricingType.monthly': 'monatliche Zahlung', - 'dashboard.indicator.editor.price': 'Preis', - 'dashboard.indicator.editor.priceRequired': 'Bitte geben Sie den Preis ein', - 'dashboard.indicator.editor.pricePlaceholder': 'Bitte geben Sie den Preis ein', - 'dashboard.indicator.editor.pricingHint': 'Obwohl der Preis für kostenlose Indikatoren 0 beträgt, belohnt Sie die Plattform (QDT) basierend auf Ihrer Indikatornutzung und Lobrate.', - 'dashboard.indicator.editor.aiGenerate': 'Intelligente Generation', - 'dashboard.indicator.editor.aiPromptPlaceholder': 'Teilen Sie mir Ihre Ideen mit und ich werde den Python-Indikatorcode für Sie generieren', - 'dashboard.indicator.editor.aiGenerateBtn': 'KI-generierter Code', - 'dashboard.indicator.editor.aiPromptRequired': 'Bitte geben Sie Ihre Gedanken ein', - 'dashboard.indicator.editor.aiGenerateSuccess': 'Codegenerierung erfolgreich', - 'dashboard.indicator.editor.aiGenerateError': 'Die Codegenerierung ist fehlgeschlagen. Bitte versuchen Sie es später noch einmal', - 'dashboard.indicator.backtest.title': 'Indikator-Backtest', - 'dashboard.indicator.backtest.config': 'Backtest-Parameter', - 'dashboard.indicator.backtest.startDate': 'Startdatum', - 'dashboard.indicator.backtest.endDate': 'Enddatum', - 'dashboard.indicator.backtest.selectStartDate': 'Wählen Sie das Startdatum', - 'dashboard.indicator.backtest.selectEndDate': 'Wählen Sie das Enddatum aus', - 'dashboard.indicator.backtest.startDateRequired': 'Bitte wählen Sie ein Startdatum aus', - 'dashboard.indicator.backtest.endDateRequired': 'Bitte wählen Sie ein Enddatum aus', - 'dashboard.indicator.backtest.initialCapital': 'Anfangskapital', - 'dashboard.indicator.backtest.initialCapitalRequired': 'Bitte geben Sie den Anfangsbetrag ein', - 'dashboard.indicator.backtest.commission': 'Bearbeitungsgebühr', - 'dashboard.indicator.backtest.leverage': 'Verschuldungsquote', - 'dashboard.indicator.backtest.tradeDirection': 'Handelsrichtung', - 'dashboard.indicator.backtest.longOnly': 'Geh lange', - 'dashboard.indicator.backtest.shortOnly': 'kurz', - 'dashboard.indicator.backtest.both': 'Zweiseitig', - 'dashboard.indicator.backtest.run': 'Beginnen Sie mit dem Backtesting', - 'dashboard.indicator.backtest.rerun': 'Nochmals Backtest', - 'dashboard.indicator.backtest.close': 'Schließen', - 'dashboard.indicator.backtest.running': 'Indikator-Backtest läuft...', - 'dashboard.indicator.backtest.results': 'Backtest-Ergebnisse', - 'dashboard.indicator.backtest.totalReturn': 'Gesamtrendite', - 'dashboard.indicator.backtest.annualReturn': 'annualisiertes Einkommen', - 'dashboard.indicator.backtest.maxDrawdown': 'maximaler Drawdown', - 'dashboard.indicator.backtest.sharpeRatio': 'Sharpe-Ratio', - 'dashboard.indicator.backtest.winRate': 'Gewinnquote', - 'dashboard.indicator.backtest.profitFactor': 'Gewinn-Verlust-Verhältnis', - 'dashboard.indicator.backtest.totalTrades': 'Anzahl der Transaktionen', - 'dashboard.indicator.totalReturn': 'Gesamtrendite', - 'dashboard.indicator.annualReturn': 'annualisierte Rendite', - 'dashboard.indicator.maxDrawdown': 'maximaler Drawdown', - 'dashboard.indicator.sharpeRatio': 'Sharpe-Ratio', - 'dashboard.indicator.winRate': 'Gewinnquote', - 'dashboard.indicator.profitFactor': 'Gewinn-Verlust-Verhältnis', - 'dashboard.indicator.totalTrades': 'Gesamtzahl der Transaktionen', - 'dashboard.indicator.backtest.totalCommission': 'Gesamtbearbeitungsgebühr', - 'dashboard.indicator.backtest.equityCurve': 'Zinskurve', - 'dashboard.indicator.backtest.strategy': 'Indikatoreinkommen', - 'dashboard.indicator.backtest.benchmark': 'Benchmark-Rendite', - 'dashboard.indicator.backtest.tradeHistory': 'Transaktionsverlauf', - 'dashboard.indicator.backtest.tradeTime': 'Zeit', - 'dashboard.indicator.backtest.tradeType': 'Typ', - 'dashboard.indicator.backtest.buy': 'kaufen', - 'dashboard.indicator.backtest.sell': 'verkaufen', - 'dashboard.indicator.backtest.liquidation': 'Liquidation', - 'dashboard.indicator.backtest.openLong': 'Lange geöffnet', - 'dashboard.indicator.backtest.closeLong': 'Pinduo', - 'dashboard.indicator.backtest.closeLongStop': 'Nahezu long (Stop-Loss)', - 'dashboard.indicator.backtest.closeLongProfit': 'Mehr schließen (Gewinn mitnehmen)', - 'dashboard.indicator.backtest.addLong': 'Long-Position hinzufügen', - 'dashboard.indicator.backtest.openShort': 'Kurz öffnen', - 'dashboard.indicator.backtest.closeShort': 'leer', - 'dashboard.indicator.backtest.closeShortStop': 'Schließen (Stop-Loss)', - 'dashboard.indicator.backtest.closeShortProfit': 'Schließen (Gewinn mitnehmen)', - 'dashboard.indicator.backtest.addShort': 'Short-Position hinzufügen', - 'dashboard.indicator.backtest.price': 'Preis', - 'dashboard.indicator.backtest.amount': 'Menge', - 'dashboard.indicator.backtest.balance': 'Kontostand', - 'dashboard.indicator.backtest.profit': 'Gewinn und Verlust', - 'dashboard.indicator.backtest.success': 'Backtest abgeschlossen', - 'dashboard.indicator.backtest.failed': 'Der Backtest ist fehlgeschlagen. Bitte versuchen Sie es später noch einmal', - 'dashboard.indicator.backtest.noIndicatorCode': 'Für diesen Indikator gibt es keinen rückprüfbaren Code', - 'dashboard.indicator.backtest.noSymbol': 'Bitte wählen Sie zunächst das Transaktionsziel aus', - 'dashboard.indicator.backtest.dateRangeExceeded': 'Der Backtest-Zeitbereich überschreitet das Limit: {timeframe} Zeitraum kann höchstens {maxRange} backtestet werden', - 'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)', - 'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}', - 'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}', - 'dashboard.indicator.backtest.prev': 'Previous', - 'dashboard.indicator.backtest.next': 'Next', - 'dashboard.indicator.backtest.steps.strategy.title': 'Strategy', - 'dashboard.indicator.backtest.steps.strategy.desc': 'Position sizing & risk controls', - 'dashboard.indicator.backtest.steps.trading.title': 'Trading settings', - 'dashboard.indicator.backtest.steps.trading.desc': 'Time range, capital, fees, leverage', - 'dashboard.indicator.backtest.steps.results.title': 'Results', - 'dashboard.indicator.backtest.steps.results.desc': 'Backtest output', - 'dashboard.indicator.backtest.panel.risk': 'Risk management (SL/TP/Trailing)', - 'dashboard.indicator.backtest.panel.scale': 'Scale in / DCA (trend & mean-reversion)', - 'dashboard.indicator.backtest.panel.reduce': 'Reduce position (trend & adverse)', - 'dashboard.indicator.backtest.panel.position': 'Position sizing', - 'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)', - 'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)', - 'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit', - 'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)', - 'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)', - 'dashboard.indicator.backtest.field.slippage': 'Slippage (%)', - 'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in', - 'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion DCA', - 'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.dcaAddStepPct': 'DCA trigger (%)', - 'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.dcaAddSizePct': 'DCA size (% of capital)', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max DCA times', - 'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce', - 'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)', - 'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times', - 'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)', - 'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)', - 'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)', - 'dashboard.indicator.backtest.reduceLong': 'Reduce Long', - 'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)', - 'dashboard.indicator.backtest.reduceShort': 'Reduce Short', - 'dashboard.docs.title': 'Dokumentenzentrum', - 'dashboard.docs.search.placeholder': 'Dokumente durchsuchen...', - 'dashboard.docs.category.all': 'Alle', - 'dashboard.docs.category.guide': 'Entwicklungshandbuch', - 'dashboard.docs.category.api': 'API-Dokumentation', - 'dashboard.docs.category.tutorial': 'Anleitung', - 'dashboard.docs.category.faq': 'FAQ', - 'dashboard.docs.featured.title': 'Empfohlene Dokumentation', - 'dashboard.docs.featured.tag': 'Empfohlen', - 'dashboard.docs.list.views': 'Durchsuchen', - 'dashboard.docs.list.author': 'Autor', - 'dashboard.docs.list.empty': 'Noch kein Dokument', - 'dashboard.docs.list.backToAll': 'Zurück zu allen Dokumenten', - 'dashboard.docs.list.total': 'Insgesamt {count} Dokumente', - 'dashboard.docs.detail.back': 'Zurück zur Dokumentenliste', - 'dashboard.docs.detail.updatedAt': 'aktualisiert am', - 'dashboard.docs.detail.related': 'Verwandte Dokumente', - 'dashboard.docs.detail.notFound': 'Dokument existiert nicht', - 'dashboard.docs.detail.error': 'Das Dokument existiert nicht oder wurde gelöscht', - 'dashboard.docs.search.result': 'Suchergebnisse', - 'dashboard.docs.search.keyword': 'Schlüsselwörter', - 'community.filter.indicatorType': 'Indikatortyp', - 'community.filter.all': 'Alle', - 'community.filter.other': 'Andere Optionen', - 'community.filter.pricing': 'Preisart', - 'community.filter.allPricing': 'Alle Preise', - 'community.filter.sortBy': 'Sortieren nach', - 'community.filter.search': 'Suchen', - 'community.filter.searchPlaceholder': 'Metrikname suchen', - 'community.indicatorType.trend': 'Trendtyp', - 'community.indicatorType.momentum': 'Impulstyp', - 'community.indicatorType.volatility': 'Volatilität', - 'community.indicatorType.volume': 'Lautstärke', - 'community.indicatorType.custom': 'Anpassen', - 'community.pricing.free': 'kostenlos', - 'community.pricing.paid': 'Bezahlen', - 'community.sort.downloads': 'Downloads', - 'community.sort.rating': 'Bewertung', - 'community.sort.newest': 'Neueste Veröffentlichungen', - 'community.pagination.total': '{total} Indikatoren insgesamt', - 'community.noDescription': 'Noch keine Beschreibung', - 'community.detail.type': 'Typ', - 'community.detail.pricing': 'Preise', - 'community.detail.rating': 'Bewertung', - 'community.detail.downloads': 'Downloads', - 'community.detail.author': 'Autor', - 'community.detail.description': 'Einführung', - 'community.detail.detailContent': 'Detaillierte Beschreibung', - 'community.detail.backtestStats': 'Backtest-Statistiken', - 'community.action.purchase': 'Kaufindikator', - 'community.action.addToMyIndicators': 'Zu meinen Indikatoren hinzufügen', - 'community.action.favorite': 'Sammlung', - 'community.action.unfavorite': 'Favoriten abbrechen', - 'community.action.buyNow': 'Jetzt kaufen', - 'community.action.renew': 'Erneuerung', - 'community.purchase.price': 'Preis', - 'community.purchase.permanent': 'dauerhaft', - 'community.purchase.monthly': 'Monat', - 'community.purchase.confirmBuy': 'Bestätigen Sie den Kauf dieses Indikators ({price} QDT)?', - 'community.purchase.confirmRenew': 'Bestätigen Sie die Erneuerung dieses Indikators ({price} QDT/Monat)?', - 'community.purchase.confirmFree': 'Bestätigen Sie, dass Sie diesen kostenlosen Indikator hinzufügen möchten?', - 'community.purchase.confirmTitle': 'Aktion bestätigen', - 'community.purchase.owned': 'Sie haben diesen Indikator erworben (dauerhaft gültig)', - 'community.purchase.ownIndicator': 'Dies ist die von Ihnen veröffentlichte Metrik', - 'community.purchase.expired': 'Ihr Abonnement ist abgelaufen', - 'community.purchase.expiresOn': 'Ablaufzeit: {Datum}', - 'community.tabs.detail': 'Indikatordetails', - 'community.tabs.backtest': 'Backtest-Daten', - 'community.tabs.ratings': 'Benutzerbewertungen', - 'community.rating.myRating': 'Meine Bewertung', - 'community.rating.stars': '{count} Sterne', - 'community.rating.commentPlaceholder': 'Teilen Sie Ihre Erfahrungen...', - 'community.rating.submit': 'Bewertung abgeben', - 'community.rating.modify': 'Ändern', - 'community.rating.saveModify': 'Änderungen speichern', - 'community.rating.cancel': 'Abbrechen', - 'community.rating.selectRating': 'Bitte wählen Sie eine Bewertung aus', - 'community.rating.success': 'Bewertung erfolgreich', - 'community.rating.modifySuccess': 'Bewertung erfolgreich geändert', - 'community.rating.failed': 'Bewertung fehlgeschlagen', - 'community.rating.noRatings': 'Noch keine Kommentare', - 'community.backtest.note': 'Die oben genannten Daten sind historische Backtest-Ergebnisse und dienen nur als Referenz und stellen keine zukünftigen Erträge dar.', - 'community.backtest.noData': 'Noch keine Backtest-Daten', - 'community.backtest.uploadHint': 'Der Autor hat noch keine Backtest-Daten hochgeladen', - 'community.message.loadFailed': 'Die Indikatorliste konnte nicht geladen werden', - 'community.message.purchaseProcessing': 'Kaufanfrage wird bearbeitet...', - 'community.message.downloadSuccess': 'Die Metrik wurde zu meiner Metrikliste hinzugefügt', - 'community.message.favoriteSuccess': 'Sammlung erfolgreich', - 'community.message.unfavoriteSuccess': 'Abholung erfolgreich abbrechen', - 'community.message.operationSuccess': 'Operation erfolgreich', - 'community.message.operationFailed': 'Der Vorgang ist fehlgeschlagen', - 'community.banner.readOnly': 'Nur lesen', - 'community.banner.loginHint': 'Für Login oder Registrierung bitte auf die Schaltfläche klicken, um zu einer unabhängigen Seite zu wechseln und CSRF-Probleme zu vermeiden', - 'community.banner.jumpButton': 'Zur Anmeldung/Registrierung', - 'dashboard.totalEquity': 'Gesamteigenkapital', - 'dashboard.totalPnL': 'Gesamtgewinn und -verlust', - 'dashboard.aiStrategies': 'KI-Strategie', - 'dashboard.indicatorStrategies': 'Indikatorstrategie', - 'dashboard.running': 'Laufen', - 'dashboard.pnlHistory': 'historischer Gewinn und Verlust', - 'dashboard.strategyPerformance': 'Gewinn- und Verlustquote der Strategie', - 'dashboard.recentTrades': 'aktuelle Transaktionen', - 'dashboard.currentPositions': 'Aktuelle Position', - 'dashboard.table.time': 'Zeit', - 'dashboard.table.strategy': 'Richtlinienname', - 'dashboard.table.symbol': 'Ziel', - 'dashboard.table.type': 'Typ', - 'dashboard.table.side': 'Richtung', - 'dashboard.table.size': 'Offenes Interesse', - 'dashboard.table.entryPrice': 'durchschnittlicher Eröffnungspreis', - 'dashboard.table.price': 'Preis', - 'dashboard.table.amount': 'Menge', - 'dashboard.table.profit': 'Gewinn und Verlust', - 'dashboard.pendingOrders': 'Auftragsausführungsprotokoll', - 'dashboard.totalOrders': 'Gesamt {total} Aufträge', - 'dashboard.viewError': 'Fehler anzeigen', - 'dashboard.filled': 'Ausgeführt', - 'dashboard.orderTable.time': 'Erstellungszeit', - 'dashboard.orderTable.strategy': 'Strategie', - 'dashboard.orderTable.symbol': 'Handelspaar', - 'dashboard.orderTable.signalType': 'Signaltyp', - 'dashboard.orderTable.amount': 'Menge', - 'dashboard.orderTable.price': 'Ausführungspreis', - 'dashboard.orderTable.status': 'Status', - 'dashboard.orderTable.executedAt': 'Ausführungszeit', - 'dashboard.signalType.openLong': 'Long öffnen', - 'dashboard.signalType.openShort': 'Short öffnen', - 'dashboard.signalType.closeLong': 'Long schließen', - 'dashboard.signalType.closeShort': 'Short schließen', - 'dashboard.signalType.addLong': 'Long hinzufügen', - 'dashboard.signalType.addShort': 'Short hinzufügen', - 'dashboard.status.pending': 'Ausstehend', - 'dashboard.status.processing': 'In Bearbeitung', - 'dashboard.status.completed': 'Abgeschlossen', - 'dashboard.status.failed': 'Fehlgeschlagen', - 'dashboard.status.cancelled': 'Storniert', - 'dashboard.table.pnl': 'nicht realisierter Gewinn oder Verlust', - 'form.basic-form.basic.title': 'Grundform', - 'form.basic-form.basic.description': 'Formularseiten werden verwendet, um Informationen von Benutzern zu sammeln oder zu überprüfen. Grundformulare werden häufig in Formularszenarien mit wenigen Datenelementen verwendet.', - 'form.basic-form.title.label': 'Titel', - 'form.basic-form.title.placeholder': 'Geben Sie dem Ziel einen Namen', - 'form.basic-form.title.required': 'Bitte geben Sie einen Titel ein', - 'form.basic-form.date.label': 'Start- und Enddatum', - 'form.basic-form.placeholder.start': 'Startdatum', - 'form.basic-form.placeholder.end': 'Enddatum', - 'form.basic-form.date.required': 'Bitte wählen Sie Start- und Enddatum aus', - 'form.basic-form.goal.label': 'Zielbeschreibung', - 'form.basic-form.goal.placeholder': 'Bitte geben Sie Ihre schrittweisen Arbeitsziele ein', - 'form.basic-form.goal.required': 'Bitte geben Sie eine Zielbeschreibung ein', - 'form.basic-form.standard.label': 'messen', - 'form.basic-form.standard.placeholder': 'Bitte geben Sie Messwerte ein', - 'form.basic-form.standard.required': 'Bitte geben Sie Messwerte ein', - 'form.basic-form.client.label': 'Kunde', - 'form.basic-form.client.required': 'Bitte beschreiben Sie die Kunden, die Sie betreuen', - 'form.basic-form.label.tooltip': 'Zielgruppe der Leistungsempfänger', - 'form.basic-form.client.placeholder': 'Bitte beschreiben Sie die von Ihnen betreuten Kunden, interne Kunden direkt @Name/Auftragsnummer', - 'form.basic-form.invites.label': 'Laden Sie Gutachter ein', - 'form.basic-form.invites.placeholder': 'Bitte direkt @Name/Mitarbeiternummer angeben, es können bis zu 5 Personen einladen', - 'form.basic-form.weight.label': 'Gewicht', - 'form.basic-form.weight.placeholder': 'Bitte treten Sie ein', - 'form.basic-form.public.label': 'Zielpublikum', - 'form.basic-form.label.help': 'Kunden und Rezensenten werden standardmäßig geteilt', - 'form.basic-form.radio.public': 'öffentlich', - 'form.basic-form.radio.partially-public': 'Teilweise öffentlich', - 'form.basic-form.radio.private': 'privat', - 'form.basic-form.publicUsers.placeholder': 'offen für', - 'form.basic-form.option.A': 'Kollege 1', - 'form.basic-form.option.B': 'Kollege 2', - 'form.basic-form.option.C': 'Kollege drei', - 'form.basic-form.email.required': 'Bitte geben Sie Ihre E-Mail-Adresse ein!', - 'form.basic-form.email.wrong-format': 'Das E-Mail-Adressformat ist falsch!', - 'form.basic-form.userName.required': 'Bitte Benutzernamen eingeben!', - 'form.basic-form.password.required': 'Bitte geben Sie Ihr Passwort ein!', - 'form.basic-form.password.twice': 'Die doppelt eingegebenen Passwörter stimmen nicht überein!', - 'form.basic-form.strength.msg': 'Bitte geben Sie mindestens 6 Zeichen ein. Bitte verwenden Sie keine Passwörter, die leicht zu erraten sind.', - 'form.basic-form.strength.strong': 'Stärke: Stark', - 'form.basic-form.strength.medium': 'Stärke: Mittel', - 'form.basic-form.strength.short': 'Stärke: zu kurz', - 'form.basic-form.confirm-password.required': 'Bitte bestätigen Sie Ihr Passwort!', - 'form.basic-form.phone-number.required': 'Bitte geben Sie Ihre Mobiltelefonnummer ein!', - 'form.basic-form.phone-number.wrong-format': 'Das Format der Mobiltelefonnummer ist falsch!', - 'form.basic-form.verification-code.required': 'Bitte geben Sie den Verifizierungscode ein!', - 'form.basic-form.form.get-captcha': 'Holen Sie sich den Bestätigungscode', - 'form.basic-form.captcha.second': 'Sekunden', - 'form.basic-form.form.optional': '(optional)', - 'form.basic-form.form.submit': 'Senden', - 'form.basic-form.form.save': 'speichern', - 'form.basic-form.email.placeholder': 'E-Mail', - 'form.basic-form.password.placeholder': 'Passwort mit mindestens 6 Zeichen, Groß- und Kleinschreibung beachten', - 'form.basic-form.confirm-password.placeholder': 'Passwort bestätigen', - 'form.basic-form.phone-number.placeholder': 'Mobiltelefonnummer', - 'form.basic-form.verification-code.placeholder': 'Bestätigungscode', - 'result.success.title': 'Übermittlung erfolgreich', - 'result.success.description': 'Die Seite mit den Übermittlungsergebnissen wird verwendet, um Rückmeldungen zu den Verarbeitungsergebnissen einer Reihe von Vorgangsaufgaben zu geben. Wenn es sich nur um einen einfachen Vorgang handelt, verwenden Sie das globale Eingabeaufforderungs-Feedback „Nachricht“. In diesem Textbereich können einfache Zusatzanweisungen angezeigt werden. Bei Bedarf zur Darstellung von „Dokumenten“ können im grauen Bereich darunter komplexere Inhalte angezeigt werden.', - 'result.success.operate-title': 'Projektname', - 'result.success.operate-id': 'Projekt-ID', - 'result.success.principal': 'Verantwortliche Person', - 'result.success.operate-time': 'Effektive Zeit', - 'result.success.step1-title': 'Projekt erstellen', - 'result.success.step1-operator': 'Qu Lili', - 'result.success.step2-title': 'Vorläufige Prüfung der Abteilung', - 'result.success.step2-operator': 'Zhou Maomao', - 'result.success.step2-extra': 'Dringend', - 'result.success.step3-title': 'Finanzielle Überprüfung', - 'result.success.step4-title': 'Komplett', - 'result.success.btn-return': 'Zurück zur Liste', - 'result.success.btn-project': 'Artikel ansehen', - 'result.success.btn-print': 'Drucken', - 'result.fail.error.title': 'Die Übermittlung ist fehlgeschlagen', - 'result.fail.error.description': 'Bitte überprüfen und ändern Sie die folgenden Informationen, bevor Sie sie erneut einreichen.', - 'result.fail.error.hint-title': 'Der von Ihnen übermittelte Inhalt enthält die folgenden Fehler:', - 'result.fail.error.hint-text1': 'Ihr Konto wurde gesperrt', - 'result.fail.error.hint-btn1': 'Sofort auftauen', - 'result.fail.error.hint-text2': 'Ihr Konto ist noch nicht antragsberechtigt', - 'result.fail.error.hint-btn2': 'Jetzt upgraden', - 'result.fail.error.btn-text': 'Zurück zur Änderung', - 'account.settings.menuMap.custom': 'Personalisierung', - 'account.settings.menuMap.binding': 'Kontobindung', - 'account.settings.basic.avatar': 'Avatar', - 'account.settings.basic.change-avatar': 'Avatar ändern', - 'account.settings.basic.email': 'E-Mail', - 'account.settings.basic.email-message': 'Bitte geben Sie Ihre E-Mail ein!', - 'account.settings.basic.nickname': 'Spitzname', - 'account.settings.basic.nickname-message': 'Bitte geben Sie Ihren Spitznamen ein!', - 'account.settings.basic.profile': 'Profil', - 'account.settings.basic.profile-message': 'Bitte geben Sie Ihr persönliches Profil ein!', - 'account.settings.basic.profile-placeholder': 'Profil', - 'account.settings.basic.country': 'Land/Region', - 'account.settings.basic.country-message': 'Bitte geben Sie Ihr Land oder Ihre Region ein!', - 'account.settings.basic.geographic': 'Provinz und Stadt', - 'account.settings.basic.geographic-message': 'Bitte geben Sie Ihr Bundesland und Ihre Stadt ein!', - 'account.settings.basic.address': 'Straßenadresse', - 'account.settings.basic.address-message': 'Bitte geben Sie Ihre Straße ein!', - 'account.settings.basic.phone': 'Kontaktnummer', - 'account.settings.basic.phone-message': 'Bitte geben Sie Ihre Kontaktnummer ein!', - 'account.settings.basic.update': 'Grundlegende Informationen aktualisieren', - 'account.settings.basic.update.success': 'Grundlegende Informationen erfolgreich aktualisieren', - 'account.settings.security.strong': 'Stark', - 'account.settings.security.medium': 'in', - 'account.settings.security.weak': 'schwach', - 'account.settings.security.password': 'Kontopasswort', - 'account.settings.security.password-description': 'Aktuelle Passwortstärke:', - 'account.settings.security.phone': 'Sicherheitshandy', - 'account.settings.security.phone-description': 'Bereits gebundenes Mobiltelefon:', - 'account.settings.security.question': 'Sicherheitsprobleme', - 'account.settings.security.question-description': 'Es werden keine Sicherheitsfragen gestellt, wodurch die Kontosicherheit wirksam geschützt werden kann.', - 'account.settings.security.email': 'E-Mail binden', - 'account.settings.security.email-description': 'Bereits gebundene E-Mail-Adresse:', - 'account.settings.security.mfa': 'MFA-Gerät', - 'account.settings.security.mfa-description': 'Das MFA-Gerät ist nicht gebunden. Nach der Bindung können Sie noch einmal bestätigen.', - 'account.settings.security.modify': 'Ändern', - 'account.settings.security.set': 'Einstellungen', - 'account.settings.security.bind': 'verbindlich', - 'account.settings.binding.taobao': 'Binde Taobao', - 'account.settings.binding.taobao-description': 'Das Taobao-Konto ist derzeit nicht gebunden', - 'account.settings.binding.alipay': 'Alipay binden', - 'account.settings.binding.alipay-description': 'Das Alipay-Konto ist derzeit nicht gebunden', - 'account.settings.binding.dingding': 'Bindung von DingTalk', - 'account.settings.binding.dingding-description': 'Derzeit ist kein DingTalk-Konto gebunden', - 'account.settings.binding.bind': 'verbindlich', - 'account.settings.notification.password': 'Kontopasswort', - 'account.settings.notification.password-description': 'Nachrichten von anderen Benutzern werden in Form von Site-Nachrichten benachrichtigt.', - 'account.settings.notification.messages': 'Systemmeldungen', - 'account.settings.notification.messages-description': 'Systemmeldungen werden in Form von Site-Nachrichten benachrichtigt.', - 'account.settings.notification.todo': 'Zu erledigende Aufgaben', - 'account.settings.notification.todo-description': 'Zu erledigende Aufgaben werden in Form von In-Site-Nachrichten benachrichtigt', - 'account.settings.settings.open': 'offen', - 'account.settings.settings.close': 'schließen', - 'trading-assistant.title': 'Handelsassistent', - 'trading-assistant.strategyList': 'Strategieliste', - 'trading-assistant.createStrategy': 'Richtlinie erstellen', - 'trading-assistant.noStrategy': 'Noch keine Strategie', - 'trading-assistant.selectStrategy': 'Bitte wählen Sie links eine Strategie aus, um Details anzuzeigen', - 'trading-assistant.startStrategy': 'Startstrategie', - 'trading-assistant.stopStrategy': 'Stoppstrategie', - 'trading-assistant.editStrategy': 'Redaktionelle Strategie', - 'trading-assistant.deleteStrategy': 'Richtlinie löschen', - 'trading-assistant.status.running': 'Laufen', - 'trading-assistant.status.stopped': 'Angehalten', - 'trading-assistant.status.error': 'Fehler', - 'trading-assistant.strategyType.IndicatorStrategy': 'Technische Indikatorstrategie', - 'trading-assistant.strategyType.PromptBasedStrategy': 'Stichwortstrategie', - 'trading-assistant.strategyType.GridStrategy': 'Grid-Strategie', - 'trading-assistant.tabs.tradingRecords': 'Transaktionsverlauf', - 'trading-assistant.tabs.positions': 'Positionsaufzeichnung', - 'trading-assistant.tabs.equityCurve': 'Eigenkapitalkurve', - 'trading-assistant.form.step1': 'Wählen Sie Indikatoren aus', - 'trading-assistant.form.step2': 'Exchange-Konfiguration', - 'trading-assistant.form.step3': 'Strategieparameter', - 'trading-assistant.form.step2Params': 'Parameter', - 'trading-assistant.form.step3Signal': 'Signalzustellung', - 'trading-assistant.form.marketCategory': 'Marktkategorie', - 'trading-assistant.form.marketCategoryHint': 'Wählen Sie zuerst den Markt. Nur Krypto kann Live-Trading aktivieren; andere Märkte sind nur Signal.', - 'trading-assistant.market.AShare': 'A-Aktien', - 'trading-assistant.market.USStock': 'US-Aktien', - 'trading-assistant.market.Crypto': 'Krypto', - 'trading-assistant.market.Forex': 'Forex', - 'trading-assistant.form.indicator': 'Wählen Sie Indikatoren aus', - 'trading-assistant.form.indicatorHint': 'Sie können nur technische Indikatoren auswählen, die Sie gekauft oder erstellt haben', - 'trading-assistant.form.qdtCostHints': 'Bei Verwendung dieser Strategie wird QDT verbraucht. Bitte stellen Sie sicher, dass das Konto über ausreichend QDT-Guthaben verfügt', - 'trading-assistant.form.indicatorDescription': 'Beschreibung des Indikators', - 'trading-assistant.form.noDescription': 'Noch keine Beschreibung', - 'trading-assistant.form.exchange': 'Austausch auswählen', - 'trading-assistant.form.apiKey': 'API-Schlüssel', - 'trading-assistant.form.secretKey': 'Geheimer Schlüssel', - 'trading-assistant.form.passphrase': 'Passphrase', - 'trading-assistant.form.testConnection': 'Testverbindung', - 'trading-assistant.form.strategyName': 'Richtlinienname', - 'trading-assistant.form.symbol': 'Handelspaar', - 'trading-assistant.form.symbolHint': 'Das Symbolformat hängt vom ausgewählten Markt ab', - 'trading-assistant.form.symbolHintCrypto': 'Krypto: z.B. BTC/USDT', - 'trading-assistant.form.symbolHintGeneral': 'Geben Sie das Symbol des gewählten Marktes ein (z.B. 600519, AAPL, EURUSD).', - 'trading-assistant.form.initialCapital': 'Höhe der Investition', - 'trading-assistant.form.marketType': 'Markttyp', - 'trading-assistant.form.marketTypeFutures': 'Vertrag', - 'trading-assistant.form.marketTypeSpot': 'Spot', - 'trading-assistant.form.marketTypeHint': 'Der Kontrakt unterstützt bidirektionalen Handel und Leverage, während der Spot nur Long-Positionen unterstützt und der Leverage auf 1x festgelegt ist', - 'trading-assistant.form.leverage': 'Nutzen Sie mehrere', - 'trading-assistant.form.leverageHint': 'Vertrag: 1-125 Mal, Spot: 1 Mal fest', - 'trading-assistant.form.spotLeverageFixed': 'Der Hebel für den Spothandel ist auf 1x festgelegt', - 'trading-assistant.form.spotOnlyLongHint': 'Der Spothandel unterstützt nur Long-Positionen', - 'trading-assistant.form.tradeDirection': 'Handelsrichtung', - 'trading-assistant.form.tradeDirectionLong': 'Nur lang', - 'trading-assistant.form.tradeDirectionShort': 'Nur kurz', - 'trading-assistant.form.tradeDirectionBoth': 'zweiseitige Transaktion', - 'trading-assistant.form.timeframe': 'Zeitraum', - 'trading-assistant.form.klinePeriod': 'K-Linien-Zeitraum', - 'trading-assistant.form.timeframe1m': '1 Minute', - 'trading-assistant.form.timeframe5m': '5 Minuten', - 'trading-assistant.form.timeframe15m': '15 Minuten', - 'trading-assistant.form.timeframe30m': '30 Minuten', - 'trading-assistant.form.timeframe1H': '1 Stunde', - 'trading-assistant.form.timeframe4H': '4 Stunden', - 'trading-assistant.form.timeframe1D': '1 Tag', - 'trading-assistant.form.selectStrategyType': 'Strategietyp auswählen', - 'trading-assistant.form.indicatorStrategy': 'Indikator-Strategie', - 'trading-assistant.form.indicatorStrategyDesc': 'Automatisierte Handelsstrategie basierend auf technischen Indikatoren', - 'trading-assistant.form.aiStrategy': 'KI-Strategie', - 'trading-assistant.form.aiStrategyDesc': 'Automatisierte Handelsstrategie basierend auf KI-Intelligenzentscheidungen', - 'trading-assistant.form.enableAiFilter': 'KI-Intelligenzentscheidungsfilter aktivieren', - 'trading-assistant.form.enableAiFilterHint': 'Wenn aktiviert, werden Indikatorsignale von KI gefiltert, um die Handelsqualität zu verbessern', - 'trading-assistant.form.aiFilterPrompt': 'Benutzerdefinierte Eingabeaufforderung', - 'trading-assistant.form.aiFilterPromptHint': 'Benutzerdefinierte Anweisungen für KI-Filterung bereitstellen, leer lassen, um die Systemstandardwerte zu verwenden', - 'trading-assistant.validation.strategyTypeRequired': 'Bitte wählen Sie einen Strategietyp', - 'trading-assistant.validation.marketCategoryRequired': 'Bitte wählen Sie eine Marktkategorie', - 'trading-assistant.form.advancedSettings': 'Erweiterte Einstellungen', - 'trading-assistant.form.orderMode': 'Bestellmodus', - 'trading-assistant.form.orderModeMaker': 'Hersteller', - 'trading-assistant.form.orderModeTaker': 'Marktpreis (Taker)', - 'trading-assistant.form.orderModeHint': 'Im Pending-Order-Modus werden Limit-Orders verwendet und die Bearbeitungsgebühr ist niedriger; Der Marktpreismodus wird sofort ausgeführt und die Bearbeitungsgebühr ist höher.', - 'trading-assistant.form.makerWaitSec': 'Wartezeit für ausstehende Bestellungen (Sekunden)', - 'trading-assistant.form.makerWaitSecHint': 'Die Zeit, die nach der Bestellung auf die Transaktion gewartet wird. Brechen Sie ab und versuchen Sie es nach einer Zeitüberschreitung erneut.', - 'trading-assistant.form.makerRetries': 'Anzahl der Wiederholungsversuche für ausstehende Bestellungen', - 'trading-assistant.form.makerRetriesHint': 'Die maximale Anzahl von Wiederholungsversuchen, wenn eine ausstehende Order nicht ausgeführt wird', - 'trading-assistant.form.fallbackToMarket': 'Die ausstehende Bestellung schlägt fehl und der Marktpreis wird herabgestuft.', - 'trading-assistant.form.fallbackToMarketHint': 'Wenn die ausstehende Eröffnungs-/Schließorder nicht abgeschlossen wurde, wird angegeben, ob sie auf eine Marktorder herabgestuft werden soll, um sicherzustellen, dass die Transaktion abgeschlossen wird.', - 'trading-assistant.form.marginMode': 'Margin-Modus', - 'trading-assistant.form.marginModeCross': 'Volles Lager', - 'trading-assistant.form.marginModeIsolated': 'Isolierte Lage', - 'trading-assistant.form.stopLossPct': 'Stop-Loss-Verhältnis (%)', - 'trading-assistant.form.stopLossPctHint': 'Legen Sie den Stop-Loss-Prozentsatz fest. 0 bedeutet, dass Stop-Loss nicht aktiviert ist', - 'trading-assistant.form.takeProfitPct': 'Take-Profit-Quote (%)', - 'trading-assistant.form.takeProfitPctHint': 'Legen Sie den Take-Profit-Prozentsatz fest. 0 bedeutet, dass Take-Profit deaktiviert ist', - 'trading-assistant.form.commission': 'Gebühr (%)', - 'trading-assistant.form.commissionHint': 'Handelsgebühr in Prozent (optional)', - 'trading-assistant.form.slippage': 'Slippage (%)', - 'trading-assistant.form.slippageHint': 'Geschätzter Slippage-Prozentsatz (optional)', - 'trading-assistant.form.executionMode': 'Ausführung', - 'trading-assistant.form.executionModeSignal': 'Nur Signal (Benachrichtigungen)', - 'trading-assistant.form.executionModeLive': 'Live-Trading (nur Krypto)', - 'trading-assistant.form.liveTradingCryptoOnlyHint': 'Live-Trading ist nur für Krypto verfügbar. Andere Märkte können nur Signale senden.', - 'trading-assistant.form.notifyChannels': 'Benachrichtigungskanäle', - 'trading-assistant.form.notifyChannelsHint': 'Wählen Sie aus, wie Sie Kauf/Verkauf- und Risikosignale erhalten möchten.', - 'trading-assistant.notify.browser': 'Browser', - 'trading-assistant.notify.email': 'E-Mail', - 'trading-assistant.notify.phone': 'Telefon', - 'trading-assistant.notify.telegram': 'Telegram', - 'trading-assistant.notify.discord': 'Discord', - 'trading-assistant.notify.webhook': 'Webhook', - 'trading-assistant.form.notifyEmail': 'E-Mail', - 'trading-assistant.form.notifyPhone': 'Telefonnummer', - 'trading-assistant.form.notifyTelegram': 'Telegram (Chat-ID / Benutzername)', - 'trading-assistant.form.notifyDiscord': 'Discord (Webhook-URL)', - 'trading-assistant.form.notifyWebhook': 'Webhook-URL', - 'trading-assistant.form.liveTradingConfigTitle': 'Exchange-Zugangsdaten', - 'trading-assistant.form.liveTradingConfigHint': 'Geben Sie Ihre Exchange-API-Zugangsdaten ein. Sie können die Verbindung vor dem Speichern testen.', - 'trading-assistant.form.savedCredential': 'Gespeicherte Zugangsdaten', - 'trading-assistant.form.savedCredentialHint': 'Optional: Wählen Sie gespeicherte Zugangsdaten zum automatischen Ausfüllen.', - 'trading-assistant.form.saveCredential': 'Diese Zugangsdaten für später speichern', - 'trading-assistant.form.credentialName': 'Name (optional)', - 'trading-assistant.form.signalMode': 'Signalmodus', - 'trading-assistant.form.signalModeConfirmed': 'Bestätigen Sie den Modus', - 'trading-assistant.form.signalModeAggressive': 'Aggressiver Modus', - 'trading-assistant.form.signalModeHint': 'Bestätigungsmodus: prüft nur abgeschlossene K-Zeilen; Aggressiver Modus: Überprüft auch die Bildung von K-Linien', - 'trading-assistant.form.cancel': 'Abbrechen', - 'trading-assistant.form.prev': 'Vorheriger Schritt', - 'trading-assistant.form.next': 'Nächster Schritt', - 'trading-assistant.form.confirmCreate': 'Bestätigen Sie die Erstellung', - 'trading-assistant.form.confirmEdit': 'Bestätigen Sie die Änderungen', - 'trading-assistant.messages.createSuccess': 'Strategie erfolgreich erstellt', - 'trading-assistant.messages.createFailed': 'Richtlinie konnte nicht erstellt werden', - 'trading-assistant.messages.updateSuccess': 'Richtlinienaktualisierung erfolgreich', - 'trading-assistant.messages.updateFailed': 'Die Aktualisierungsrichtlinie ist fehlgeschlagen', - 'trading-assistant.messages.deleteSuccess': 'Richtlinienlöschung erfolgreich', - 'trading-assistant.messages.deleteFailed': 'Das Löschen der Richtlinie ist fehlgeschlagen', - 'trading-assistant.messages.startSuccess': 'Strategie erfolgreich gestartet', - 'trading-assistant.messages.startFailed': 'Die Richtlinie konnte nicht gestartet werden', - 'trading-assistant.messages.stopSuccess': 'Die Strategie wurde erfolgreich beendet', - 'trading-assistant.messages.stopFailed': 'Die Stoppstrategie ist fehlgeschlagen', - 'trading-assistant.messages.loadFailed': 'Richtlinienliste konnte nicht abgerufen werden', - 'trading-assistant.messages.runningWarning': 'Die Strategie läuft. Bitte stoppen Sie die Strategie, bevor Sie sie ändern.', - 'trading-assistant.messages.deleteConfirmWithName': 'Sind Sie sicher, dass Sie die Richtlinie „{name}“ löschen möchten? Dieser Vorgang ist irreversibel.', - 'trading-assistant.messages.deleteConfirm': 'Sind Sie sicher, dass Sie diese Richtlinie löschen möchten? Dieser Vorgang ist irreversibel.', - 'trading-assistant.messages.loadTradesFailed': 'Transaktionsdatensätze konnten nicht abgerufen werden', - 'trading-assistant.messages.loadPositionsFailed': 'Positionsdatensatz konnte nicht abgerufen werden', - 'trading-assistant.messages.loadEquityFailed': 'Die Eigenkapitalkurve konnte nicht ermittelt werden', - 'trading-assistant.messages.loadIndicatorsFailed': 'Die Indikatorliste konnte nicht geladen werden. Bitte versuchen Sie es später noch einmal', - 'trading-assistant.messages.spotLimitations': 'Der Spot-Handel wurde automatisch auf „Nur Long“ mit 1-facher Hebelwirkung eingestellt', - 'trading-assistant.messages.autoFillApiConfig': 'Die historische API-Konfiguration der Börse wurde automatisch ausgefüllt', - 'trading-assistant.placeholders.selectIndicator': 'Bitte wählen Sie einen Indikator aus', - 'trading-assistant.placeholders.selectExchange': 'Bitte wählen Sie einen Austausch aus', - 'trading-assistant.placeholders.selectMarketCategory': 'Bitte Marktkategorie auswählen', - 'trading-assistant.placeholders.inputApiKey': 'Bitte geben Sie den API-Schlüssel ein', - 'trading-assistant.placeholders.inputSecretKey': 'Bitte geben Sie den Geheimschlüssel ein', - 'trading-assistant.placeholders.inputPassphrase': 'Bitte geben Sie die Passphrase ein', - 'trading-assistant.placeholders.inputStrategyName': 'Bitte geben Sie einen Richtliniennamen ein', - 'trading-assistant.placeholders.selectSymbol': 'Bitte wählen Sie ein Handelspaar aus', - 'trading-assistant.placeholders.inputSymbol': 'Bitte Symbol eingeben', - 'trading-assistant.placeholders.selectTimeframe': 'Bitte wählen Sie einen Zeitraum aus', - 'trading-assistant.placeholders.selectKlinePeriod': 'Bitte wählen Sie einen K-Linien-Zeitraum aus', - 'trading-assistant.placeholders.inputAiFilterPrompt': 'Bitte geben Sie eine benutzerdefinierte Eingabeaufforderung ein (optional)', - 'trading-assistant.placeholders.inputEmail': 'Bitte E-Mail eingeben', - 'trading-assistant.placeholders.inputPhone': 'Bitte Telefonnummer eingeben', - 'trading-assistant.placeholders.inputTelegram': 'Bitte Telegram Chat-ID / Benutzername eingeben', - 'trading-assistant.placeholders.inputDiscord': 'Bitte Discord Webhook-URL eingeben', - 'trading-assistant.placeholders.inputWebhook': 'Bitte Webhook-URL eingeben', - 'trading-assistant.placeholders.selectSavedCredential': 'Gespeicherte Zugangsdaten auswählen', - 'trading-assistant.placeholders.inputCredentialName': 'Zum Beispiel: Binance Hauptschlüssel', - 'trading-assistant.validation.indicatorRequired': 'Bitte wählen Sie einen Indikator aus', - 'trading-assistant.validation.exchangeRequired': 'Bitte wählen Sie einen Austausch aus', - 'trading-assistant.validation.apiKeyRequired': 'Bitte geben Sie den API-Schlüssel ein', - 'trading-assistant.validation.secretKeyRequired': 'Bitte geben Sie den Geheimschlüssel ein', - 'trading-assistant.validation.passphraseRequired': 'Bitte geben Sie die Passphrase ein', - 'trading-assistant.validation.exchangeConfigIncomplete': 'Bitte geben Sie die vollständigen Exchange-Konfigurationsinformationen ein', - 'trading-assistant.validation.testConnectionRequired': 'Bitte klicken Sie zuerst auf die Schaltfläche "Verbindung testen" und stellen Sie sicher, dass die Verbindung erfolgreich ist', - 'trading-assistant.validation.testConnectionFailed': 'Verbindungstest fehlgeschlagen, bitte überprüfen Sie die Konfiguration und testen Sie erneut', - 'trading-assistant.validation.strategyNameRequired': 'Bitte geben Sie einen Richtliniennamen ein', - 'trading-assistant.validation.symbolRequired': 'Bitte wählen Sie ein Handelspaar aus', - 'trading-assistant.validation.initialCapitalRequired': 'Bitte geben Sie den Anlagebetrag ein', - 'trading-assistant.validation.leverageRequired': 'Bitte geben Sie die Leverage Ratio ein', - 'trading-assistant.validation.emailInvalid': 'Ungültige E-Mail-Adresse', - 'trading-assistant.validation.notifyChannelRequired': 'Bitte wählen Sie mindestens einen Benachrichtigungskanal aus', - 'trading-assistant.table.time': 'Zeit', - 'trading-assistant.table.type': 'Typ', - 'trading-assistant.table.price': 'Preis', - 'trading-assistant.table.amount': 'Menge', - 'trading-assistant.table.value': 'Betrag', - 'trading-assistant.table.commission': 'Bearbeitungsgebühr', - 'trading-assistant.table.symbol': 'Handelspaar', - 'trading-assistant.table.side': 'Richtung', - 'trading-assistant.table.size': 'Positionsmenge', - 'trading-assistant.table.entryPrice': 'Eröffnungspreis', - 'trading-assistant.table.currentPrice': 'aktueller Preis', - 'trading-assistant.table.unrealizedPnl': 'nicht realisierter Gewinn oder Verlust', - 'trading-assistant.table.pnlPercent': 'Gewinn- und Verlustquote', - 'trading-assistant.table.buy': 'kaufen', - 'trading-assistant.table.sell': 'verkaufen', - 'trading-assistant.table.long': 'Geh lange', - 'trading-assistant.table.short': 'kurz', - 'trading-assistant.table.noPositions': 'Noch keine Stellen', - 'trading-assistant.detail.title': 'Strategiedetails', - 'trading-assistant.detail.strategyName': 'Richtlinienname', - 'trading-assistant.detail.strategyType': 'Strategietyp', - 'trading-assistant.detail.status': 'Status', - 'trading-assistant.detail.tradingMode': 'Handelsmodell', - 'trading-assistant.detail.exchange': 'Austausch', - 'trading-assistant.detail.initialCapital': 'Anfangskapital', - 'trading-assistant.detail.totalInvestment': 'Gesamtinvestitionsbetrag', - 'trading-assistant.detail.currentEquity': 'Aktuelles Nettovermögen', - 'trading-assistant.detail.totalPnl': 'Gesamtgewinn und -verlust', - 'trading-assistant.detail.indicatorName': 'Indikatorname', - 'trading-assistant.detail.maxLeverage': 'Maximale Hebelwirkung', - 'trading-assistant.detail.decideInterval': 'Entscheidungsintervall', - 'trading-assistant.detail.symbols': 'Transaktionsobjekt', - 'trading-assistant.detail.createdAt': 'Schöpfungszeit', - 'trading-assistant.detail.updatedAt': 'Aktualisierungszeit', - 'trading-assistant.detail.llmConfig': 'Konfiguration des KI-Modells', - 'trading-assistant.detail.exchangeConfig': 'Exchange-Konfiguration', - 'trading-assistant.detail.provider': 'Anbieter', - 'trading-assistant.detail.modelId': 'Modell-ID', - 'trading-assistant.detail.close': 'Schließen', - 'trading-assistant.detail.loadFailed': 'Richtliniendetails konnten nicht abgerufen werden', - 'trading-assistant.equity.noData': 'Noch keine Daten zum Vermögen', - 'trading-assistant.equity.equity': 'Nettovermögen', - 'trading-assistant.exchange.tradingMode': 'Handelsmodell', - 'trading-assistant.exchange.virtual': 'simulierter Handel', - 'trading-assistant.exchange.live': 'Echte Transaktion', - 'trading-assistant.exchange.selectExchange': 'Austausch auswählen', - 'trading-assistant.exchange.walletAddress': 'Wallet-Adresse', - 'trading-assistant.exchange.walletAddressPlaceholder': 'Bitte geben Sie Ihre Wallet-Adresse ein (beginnend mit 0x)', - 'trading-assistant.exchange.privateKey': 'privater Schlüssel', - 'trading-assistant.exchange.privateKeyPlaceholder': 'Bitte geben Sie den privaten Schlüssel ein (64 Zeichen)', - 'trading-assistant.exchange.testConnection': 'Testverbindung', - 'trading-assistant.exchange.connectionSuccess': 'Verbindung erfolgreich', - 'trading-assistant.exchange.connectionFailed': 'Verbindung fehlgeschlagen', - 'trading-assistant.exchange.testFailed': 'Verbindungstest fehlgeschlagen', - 'trading-assistant.exchange.fillComplete': 'Bitte geben Sie die vollständigen Exchange-Konfigurationsinformationen ein', - 'trading-assistant.strategyTypeOptions.ai': 'KI-gesteuerte Strategie', - 'trading-assistant.strategyTypeOptions.indicator': 'Technische Indikatorstrategie', - 'trading-assistant.strategyTypeOptions.aiDeveloping': 'Die KI-gesteuerte Strategiefunktion befindet sich in der Entwicklung, also bleiben Sie dran', - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'KI-gesteuerte Strategiefunktionen sind in der Entwicklung', - 'trading-assistant.indicatorType.trend': 'Trend', - 'trading-assistant.indicatorType.momentum': 'Schwung', - 'trading-assistant.indicatorType.volatility': 'Fluktuation', - 'trading-assistant.indicatorType.volume': 'Lautstärke', - 'trading-assistant.indicatorType.custom': 'Anpassen', - 'trading-assistant.exchangeNames': { - 'okx': 'OKX', - 'binance': 'Binance', - 'hyperliquid': 'Hyperliquid', - 'blockchaincom': 'Blockchain.com', - 'coinbaseexchange': 'Coinbase', - 'gate': 'Gate.io', - 'mexc': 'MEXC', - 'kraken': 'Kraken', - 'bitfinex': 'Bitfinex', - 'bybit': 'Bybit', - 'kucoin': 'KuCoin', - 'huobi': 'Huobi', - 'bitget': 'Bitget', - 'bitmex': 'BitMEX', - 'deribit': 'Deribit', - 'phemex': 'Phemex', - 'bitmart': 'BitMart', - 'bitstamp': 'Bitstamp', - 'bittrex': 'Bittrex', - 'poloniex': 'Poloniex', - 'gemini': 'Zwillinge', - 'cryptocom': 'Crypto.com', - 'bitflyer': 'bitFlyer', - 'upbit': 'Upbit', - 'bithumb': 'Bithumb', - 'coinone': 'Coinone', - 'zb': 'ZB', - 'lbank': 'LBank', - 'bibox': 'Bibox', - 'bigone': 'BigONE', - 'bitrue': 'Bitrue', - 'coinex': 'CoinEx', - 'digifinex': 'DigiFinex', - 'ftx': 'FTX', - 'ftxus': 'FTX USA', - 'binanceus': 'Binance USA', - 'binancecoinm': 'Binance COIN-M', - 'binanceusdm': 'Binance USDⓈ-M' - }, - 'ai-trading-assistant.title': 'KI-Handelsassistent', - 'ai-trading-assistant.strategyList': 'Strategieliste', - 'ai-trading-assistant.createStrategy': 'Richtlinie erstellen', - 'ai-trading-assistant.noStrategy': 'Noch keine Strategie', - 'ai-trading-assistant.selectStrategy': 'Bitte wählen Sie links eine Strategie aus, um Details anzuzeigen', - 'ai-trading-assistant.startStrategy': 'Startstrategie', - 'ai-trading-assistant.stopStrategy': 'Stoppstrategie', - 'ai-trading-assistant.editStrategy': 'Redaktionelle Strategie', - 'ai-trading-assistant.deleteStrategy': 'Richtlinie löschen', - 'ai-trading-assistant.status.running': 'Laufen', - 'ai-trading-assistant.status.stopped': 'Angehalten', - 'ai-trading-assistant.status.error': 'Fehler', - 'ai-trading-assistant.tabs.tradingRecords': 'Transaktionsverlauf', - 'ai-trading-assistant.tabs.positions': 'Positionsaufzeichnung', - 'ai-trading-assistant.tabs.aiDecisions': 'KI-Entscheidungsaufzeichnung', - 'ai-trading-assistant.tabs.equityCurve': 'Eigenkapitalkurve', - 'ai-trading-assistant.form.createTitle': 'Erstellen Sie KI-Handelsstrategien', - 'ai-trading-assistant.form.editTitle': 'Bearbeiten Sie die KI-Handelsstrategie', - 'ai-trading-assistant.form.strategyName': 'Richtlinienname', - 'ai-trading-assistant.form.modelId': 'KI-Modell', - 'ai-trading-assistant.form.modelIdHint': 'Verwenden Sie den OpenRouter-Systemdienst, ohne den API-Schlüssel zu konfigurieren', - 'ai-trading-assistant.form.decideInterval': 'Entscheidungsintervall', - 'ai-trading-assistant.form.decideInterval5m': '5 Minuten', - 'ai-trading-assistant.form.decideInterval10m': '10 Minuten', - 'ai-trading-assistant.form.decideInterval30m': '30 Minuten', - 'ai-trading-assistant.form.decideInterval1h': '1 Stunde', - 'ai-trading-assistant.form.decideInterval4h': '4 Stunden', - 'ai-trading-assistant.form.decideInterval1d': '1 Tag', - 'ai-trading-assistant.form.decideInterval1w': '1 Woche', - 'ai-trading-assistant.form.decideIntervalHint': 'Das Zeitintervall, in dem die KI Entscheidungen trifft', - 'ai-trading-assistant.form.runPeriod': 'Laufzyklus', - 'ai-trading-assistant.form.runPeriodHint': 'Die Startzeit und Endzeit des Strategielaufs', - 'ai-trading-assistant.form.startDate': 'Startdatum', - 'ai-trading-assistant.form.endDate': 'Enddatum', - 'ai-trading-assistant.form.qdtCostTitle': 'Anweisungen zum QDT-Abzug', - 'ai-trading-assistant.form.qdtCostHint': '{cost} QDT wird für jede KI-Entscheidung abgezogen. Bitte stellen Sie sicher, dass Ihr Konto über ausreichend QDT-Guthaben verfügt. Während der Umsetzung der Strategie werden für jede Entscheidung Gebühren in Echtzeit abgezogen.', - 'ai-trading-assistant.form.apiKey': 'API-Schlüssel', - 'ai-trading-assistant.form.exchange': 'Austausch auswählen', - 'ai-trading-assistant.form.secretKey': 'Geheimer Schlüssel', - 'ai-trading-assistant.form.passphrase': 'Passphrase', - 'ai-trading-assistant.form.testConnection': 'Testverbindung', - 'ai-trading-assistant.form.symbol': 'Handelspaar', - 'ai-trading-assistant.form.symbolHint': 'Wählen Sie das Handelspaar aus, mit dem Sie handeln möchten', - 'ai-trading-assistant.form.initialCapital': 'Investierter Betrag (Marge)', - 'ai-trading-assistant.form.leverage': 'Nutzen Sie mehrere', - 'ai-trading-assistant.form.timeframe': 'Zeitraum', - 'ai-trading-assistant.form.timeframe1m': '1 Minute', - 'ai-trading-assistant.form.timeframe5m': '5 Minuten', - 'ai-trading-assistant.form.timeframe15m': '15 Minuten', - 'ai-trading-assistant.form.timeframe30m': '30 Minuten', - 'ai-trading-assistant.form.timeframe1H': '1 Stunde', - 'ai-trading-assistant.form.timeframe4H': '4 Stunden', - 'ai-trading-assistant.form.timeframe1D': '1 Tag', - 'ai-trading-assistant.form.marketType': 'Markttyp', - 'ai-trading-assistant.form.marketTypeFutures': 'Vertrag', - 'ai-trading-assistant.form.marketTypeSpot': 'Spot', - 'ai-trading-assistant.form.totalPnl': 'Gesamtgewinn und -verlust', - 'ai-trading-assistant.form.customPrompt': 'Benutzerdefinierte Aufforderungswörter', - 'ai-trading-assistant.form.customPromptHint': 'Optional, wird zur Anpassung von KI-Handelsstrategien und Entscheidungslogik verwendet', - 'ai-trading-assistant.form.cancel': 'Abbrechen', - 'ai-trading-assistant.form.prev': 'Vorheriger Schritt', - 'ai-trading-assistant.form.next': 'Nächster Schritt', - 'ai-trading-assistant.form.confirmCreate': 'Bestätigen Sie die Erstellung', - 'ai-trading-assistant.form.confirmEdit': 'Bestätigen Sie die Änderungen', - 'ai-trading-assistant.messages.createSuccess': 'Strategie erfolgreich erstellt', - 'ai-trading-assistant.messages.createFailed': 'Richtlinie konnte nicht erstellt werden', - 'ai-trading-assistant.messages.updateSuccess': 'Richtlinienaktualisierung erfolgreich', - 'ai-trading-assistant.messages.updateFailed': 'Die Aktualisierungsrichtlinie ist fehlgeschlagen', - 'ai-trading-assistant.messages.deleteSuccess': 'Richtlinienlöschung erfolgreich', - 'ai-trading-assistant.messages.deleteFailed': 'Das Löschen der Richtlinie ist fehlgeschlagen', - 'ai-trading-assistant.messages.startSuccess': 'Strategie erfolgreich gestartet', - 'ai-trading-assistant.messages.startFailed': 'Die Richtlinie konnte nicht gestartet werden', - 'ai-trading-assistant.messages.stopSuccess': 'Die Strategie wurde erfolgreich beendet', - 'ai-trading-assistant.messages.stopFailed': 'Die Stoppstrategie ist fehlgeschlagen', - 'ai-trading-assistant.messages.loadFailed': 'Richtlinienliste konnte nicht abgerufen werden', - 'ai-trading-assistant.messages.loadDecisionsFailed': 'Der KI-Entscheidungsdatensatz konnte nicht abgerufen werden', - 'ai-trading-assistant.messages.deleteConfirm': 'Sind Sie sicher, dass Sie diese Richtlinie löschen möchten? Dieser Vorgang ist irreversibel.', - 'ai-trading-assistant.placeholders.inputStrategyName': 'Bitte geben Sie einen Richtliniennamen ein', - 'ai-trading-assistant.placeholders.selectModelId': 'Bitte wählen Sie ein KI-Modell aus', - 'ai-trading-assistant.placeholders.selectDecideInterval': 'Bitte wählen Sie ein Entscheidungsintervall aus', - 'ai-trading-assistant.placeholders.startTime': 'Startzeit', - 'ai-trading-assistant.placeholders.endTime': 'Endzeit', - 'ai-trading-assistant.placeholders.inputApiKey': 'Bitte geben Sie den API-Schlüssel ein', - 'ai-trading-assistant.placeholders.selectExchange': 'Bitte wählen Sie einen Austausch aus', - 'ai-trading-assistant.placeholders.inputSecretKey': 'Bitte geben Sie den Geheimschlüssel ein', - 'ai-trading-assistant.placeholders.inputPassphrase': 'Bitte geben Sie die Passphrase ein', - 'ai-trading-assistant.placeholders.selectSymbol': 'Bitte wählen Sie ein Handelspaar aus, zum Beispiel: BTC/USDT', - 'ai-trading-assistant.placeholders.selectTimeframe': 'Bitte wählen Sie einen Zeitraum aus', - 'ai-trading-assistant.placeholders.inputCustomPrompt': 'Bitte geben Sie ein benutzerdefiniertes Aufforderungswort ein (optional)', - 'ai-trading-assistant.validation.strategyNameRequired': 'Bitte geben Sie einen Richtliniennamen ein', - 'ai-trading-assistant.validation.modelIdRequired': 'Bitte wählen Sie ein KI-Modell aus', - 'ai-trading-assistant.validation.runPeriodRequired': 'Bitte wählen Sie einen Laufzyklus aus', - 'ai-trading-assistant.validation.apiKeyRequired': 'Bitte geben Sie den API-Schlüssel ein', - 'ai-trading-assistant.validation.exchangeRequired': 'Bitte wählen Sie einen Austausch aus', - 'ai-trading-assistant.validation.secretKeyRequired': 'Bitte geben Sie den Geheimschlüssel ein', - 'ai-trading-assistant.validation.symbolRequired': 'Bitte wählen Sie ein Handelspaar aus', - 'ai-trading-assistant.validation.initialCapitalRequired': 'Bitte geben Sie den Anlagebetrag ein', - 'ai-trading-assistant.table.time': 'Zeit', - 'ai-trading-assistant.table.type': 'Typ', - 'ai-trading-assistant.table.price': 'Preis', - 'ai-trading-assistant.table.amount': 'Menge', - 'ai-trading-assistant.table.value': 'Betrag', - 'ai-trading-assistant.table.symbol': 'Handelspaar', - 'ai-trading-assistant.table.side': 'Richtung', - 'ai-trading-assistant.table.size': 'Positionsmenge', - 'ai-trading-assistant.table.entryPrice': 'Eröffnungspreis', - 'ai-trading-assistant.table.currentPrice': 'aktueller Preis', - 'ai-trading-assistant.table.unrealizedPnl': 'nicht realisierter Gewinn oder Verlust', - 'ai-trading-assistant.table.profit': 'Gewinn und Verlust', - 'ai-trading-assistant.table.openLong': 'Lange geöffnet', - 'ai-trading-assistant.table.closeLong': 'Pinduo', - 'ai-trading-assistant.table.openShort': 'Kurz öffnen', - 'ai-trading-assistant.table.closeShort': 'leer', - 'ai-trading-assistant.table.addLong': 'Gadot', - 'ai-trading-assistant.table.addShort': 'kurz hinzufügen', - 'ai-trading-assistant.table.closeShortProfit': 'Nehmen Sie Gewinne aus Short-Positionen mit', - 'ai-trading-assistant.table.closeShortStop': 'Stop-Loss', - 'ai-trading-assistant.table.closeLongProfit': 'Halten Sie lange inne und nehmen Sie Gewinn mit', - 'ai-trading-assistant.table.closeLongStop': 'Stop-Loss', - 'ai-trading-assistant.table.buy': 'kaufen', - 'ai-trading-assistant.table.sell': 'verkaufen', - 'ai-trading-assistant.table.long': 'Geh lange', - 'ai-trading-assistant.table.short': 'kurz', - 'ai-trading-assistant.table.hold': 'halten', - 'ai-trading-assistant.table.reasoning': 'Analysegrund', - 'ai-trading-assistant.table.decisions': 'Entscheidungsfindung', - 'ai-trading-assistant.table.riskAssessment': 'Risikobewertung', - 'ai-trading-assistant.table.confidence': 'Vertrauen', - 'ai-trading-assistant.table.totalRecords': 'Insgesamt {total} Datensätze', - 'ai-trading-assistant.table.noPositions': 'Noch keine Stellen', - 'ai-trading-assistant.detail.title': 'Strategiedetails', - 'ai-trading-assistant.equity.noData': 'Noch keine Daten zum Vermögen', - 'ai-trading-assistant.equity.equity': 'Nettovermögen', - 'ai-trading-assistant.exchange.testFailed': 'Verbindungstest fehlgeschlagen', - 'ai-trading-assistant.exchange.connectionSuccess': 'Verbindung erfolgreich', - 'ai-trading-assistant.exchange.connectionFailed': 'Verbindung fehlgeschlagen', - 'ai-trading-assistant.form.advancedSettings': 'Erweiterte Einstellungen', - 'ai-trading-assistant.form.orderMode': 'Bestellmodus', - 'ai-trading-assistant.form.orderModeMaker': 'Hersteller', - 'ai-trading-assistant.form.orderModeTaker': 'Marktpreis (Taker)', - 'ai-trading-assistant.form.orderModeHint': 'Im Pending-Order-Modus werden Limit-Orders verwendet und die Bearbeitungsgebühr ist niedriger; Der Marktpreismodus wird sofort ausgeführt und die Bearbeitungsgebühr ist höher.', - 'ai-trading-assistant.form.makerWaitSec': 'Wartezeit für ausstehende Bestellungen (Sekunden)', - 'ai-trading-assistant.form.makerWaitSecHint': 'Die Zeit, die nach der Bestellung auf die Transaktion gewartet wird. Brechen Sie ab und versuchen Sie es nach einer Zeitüberschreitung erneut.', - 'ai-trading-assistant.form.makerRetries': 'Anzahl der Wiederholungsversuche für ausstehende Bestellungen', - 'ai-trading-assistant.form.makerRetriesHint': 'Die maximale Anzahl von Wiederholungsversuchen, wenn eine ausstehende Order nicht ausgeführt wird', - 'ai-trading-assistant.form.fallbackToMarket': 'Die ausstehende Bestellung schlägt fehl und der Marktpreis wird herabgestuft.', - 'ai-trading-assistant.form.fallbackToMarketHint': 'Wenn die ausstehende Eröffnungs-/Schließorder nicht abgeschlossen wurde, wird angegeben, ob sie auf eine Marktorder herabgestuft werden soll, um sicherzustellen, dass die Transaktion abgeschlossen wird.', - 'ai-trading-assistant.form.marginMode': 'Margin-Modus', - 'ai-trading-assistant.form.marginModeCross': 'Volles Lager', - 'ai-trading-assistant.form.marginModeIsolated': 'Isolierte Lage', - 'ai-analysis.title': 'Quantenhandelsmaschine', - 'ai-analysis.system.online': 'online', - 'ai-analysis.system.agents': 'Agent', - 'ai-analysis.system.active': 'aktiv', - 'ai-analysis.system.stage': 'Bühne', - 'ai-analysis.panel.roster': 'Agentenaufstellung', - 'ai-analysis.panel.thinking': 'Denken...', - 'ai-analysis.panel.done': 'Komplett', - 'ai-analysis.panel.standby': 'Standby', - 'ai-analysis.input.title': 'Quantenhandelsmaschine', - 'ai-analysis.input.placeholder': 'Zielwert auswählen (z. B. BTC/USDT)', - 'ai-analysis.input.watchlist': 'Optionale Bestände', - 'ai-analysis.input.start': 'Analyse starten', - 'ai-analysis.input.recent': 'Letzte Aufgaben:', - 'ai-analysis.vis.stage': 'Bühne', - 'ai-analysis.vis.processing': 'Verarbeitung', - 'ai-analysis.result.complete': 'Analyse abgeschlossen', - 'ai-analysis.result.signal': 'Schlusssignal', - 'ai-analysis.result.confidence': 'Vertrauen:', - 'ai-analysis.result.new': 'neue Analyse', - 'ai-analysis.result.full': 'Vollständigen Bericht ansehen', - 'ai-analysis.logs.title': 'Systemprotokoll', - 'ai-analysis.modal.title': 'vertraulicher Bericht', - 'ai-analysis.modal.fundamental': 'Fundamentalanalyse', - 'ai-analysis.modal.technical': 'Technische Analyse', - 'ai-analysis.modal.sentiment': 'Emotionale Analyse', - 'ai-analysis.modal.risk': 'Risikobewertung', - 'ai-analysis.stage.idle': 'Standby', - 'ai-analysis.stage.1': 'Phase Eins: Mehrdimensionale Analyse', - 'ai-analysis.stage.2': 'Phase Zwei: Lang-Kurz-Debatte', - 'ai-analysis.stage.3': 'Phase drei: Strategische Planung', - 'ai-analysis.stage.4': 'Die vierte Stufe: Überprüfung der Risikokontrolle', - 'ai-analysis.stage.complete': 'Komplett', - 'ai-analysis.agent.investment_director': 'Investmentdirektor', - 'ai-analysis.agent.role.investment_director': 'Umfassende Analyse und abschließendes Fazit', - 'ai-analysis.agent.market': 'Marktanalyst', - 'ai-analysis.agent.role.market': 'Technologie- und Marktdaten', - 'ai-analysis.agent.fundamental': 'Fundamentalanalytiker', - 'ai-analysis.agent.role.fundamental': 'Finanzen und Bewertung', - 'ai-analysis.agent.technical': 'Technischer Analyst', - 'ai-analysis.agent.role.technical': 'Technische Indikatoren und Diagramme', - 'ai-analysis.agent.news': 'Nachrichtenanalyst', - 'ai-analysis.agent.role.news': 'Globaler Nachrichtenfilter', - 'ai-analysis.agent.sentiment': 'Stimmungsanalytiker', - 'ai-analysis.agent.role.sentiment': 'Sozial und emotional', - 'ai-analysis.agent.risk': 'Risikoanalytiker', - 'ai-analysis.agent.role.risk': 'Grundlegender Risikocheck', - 'ai-analysis.agent.bull': 'bullischer Forscher', - 'ai-analysis.agent.role.bull': 'Wachstumskatalysator-Bergbau', - 'ai-analysis.agent.bear': 'bärischer Forscher', - 'ai-analysis.agent.role.bear': 'Risiko- und Fehlersuche', - 'ai-analysis.agent.manager': 'Forschungsmanager', - 'ai-analysis.agent.role.manager': 'Debattenmoderator', - 'ai-analysis.agent.trader': 'Händler', - 'ai-analysis.agent.role.trader': 'Führungsstratege', - 'ai-analysis.agent.risky': 'aktivistischer Analytiker', - 'ai-analysis.agent.role.risky': 'aggressive Strategie', - 'ai-analysis.agent.neutral': 'Bilanzanalytiker', - 'ai-analysis.agent.role.neutral': 'Ausgleichsstrategie', - 'ai-analysis.agent.safe': 'konservativer Analytiker', - 'ai-analysis.agent.role.safe': 'konservative Strategie', - 'ai-analysis.agent.cro': 'Risikokontrollmanager (CRO)', - 'ai-analysis.agent.role.cro': 'letzte Entscheidungsbefugnis', - 'ai-analysis.script.market': 'OHLCV-Daten werden von wichtigen Börsen abgerufen...', - 'ai-analysis.script.fundamental': 'Quartalsfinanzberichte abrufen...', - 'ai-analysis.script.technical': 'Analyse technischer Indikatoren und Chartmuster...', - 'ai-analysis.script.news': 'Globale Finanznachrichten scannen...', - 'ai-analysis.script.sentiment': 'Analyse von Social-Media-Trends...', - 'ai-analysis.script.risk': 'Berechnung der historischen Volatilität...', - 'invite.inviteLink': 'Einladungslink', - 'invite.copy': 'Link kopieren', - 'invite.copySuccess': 'Erfolgreich kopieren!', - 'invite.copyFailed': 'Der Kopiervorgang ist fehlgeschlagen. Bitte manuell kopieren', - 'invite.noInviteLink': 'Der Einladungslink wurde nicht generiert', - 'invite.totalInvites': 'Kumulierte Einladungen', - 'invite.totalReward': 'Kumulative Belohnungen', - 'invite.rules': 'Einladungsregeln', - 'invite.rule1': 'Jedes Mal, wenn Sie einen Freund erfolgreich zur Registrierung einladen, erhalten Sie eine Belohnung', - 'invite.rule2': 'Wenn der eingeladene Freund die erste Transaktion abschließt, erhalten Sie zusätzliche Belohnungen', - 'invite.rule3': 'Einladungsprämien werden direkt an Ihr Konto gesendet', - 'invite.inviteList': 'Einladungsliste', - 'invite.tasks': 'Missionszentrum', - 'invite.inviteeName': 'Eingeladen', - 'invite.inviteTime': 'Einladungszeit', - 'invite.status': 'Status', - 'invite.reward': 'Belohnung', - 'invite.active': 'aktiv', - 'invite.inactive': 'Nicht aktiviert', - 'invite.completed': 'Abgeschlossen', - 'invite.claimed': 'Erhalten', - 'invite.pending': 'Zu vervollständigen', - 'invite.goToTask': 'zu vervollständigen', - 'invite.claimReward': 'Belohnungen einfordern', - 'invite.verify': 'Verifizierung abgeschlossen', - 'invite.verifySuccess': 'Verifizierung erfolgreich! Aufgabe abgeschlossen', - 'invite.verifyNotCompleted': 'Die Aufgabe wurde noch nicht abgeschlossen. Bitte schließen Sie die Aufgabe zuerst ab', - 'invite.verifyFailed': 'Die Verifizierung ist fehlgeschlagen. Bitte versuchen Sie es später noch einmal', - 'invite.claimSuccess': '{reward} QDT erfolgreich erhalten!', - 'invite.claimFailed': 'Fehler beim Sammeln. Bitte versuchen Sie es später noch einmal', - 'invite.totalRecords': 'Insgesamt {total} Datensätze', - 'invite.task.twitter.title': 'Retweeten an X (Twitter)', - 'invite.task.twitter.desc': 'Teilen Sie unsere offiziellen Tweets mit Ihrem X-Konto (Twitter).', - 'invite.task.youtube.title': 'Folgen Sie unserem YouTube-Kanal', - 'invite.task.youtube.desc': 'Abonnieren und folgen Sie unserem offiziellen YouTube-Kanal', - 'invite.task.telegram.title': 'Treten Sie der Telegram-Gruppe bei', - 'invite.task.telegram.desc': 'Treten Sie unserer offiziellen Telegram-Community-Gruppe bei', - 'invite.task.discord.title': 'Treten Sie einem Discord-Server bei', - 'invite.task.discord.desc': 'Treten Sie unserem Discord-Community-Server bei', - 'message': '-', - 'layouts.usermenu.dialog.title': 'Informationen', - 'layouts.usermenu.dialog.content': 'Möchten Sie sich wirklich abmelden?', - 'layouts.userLayout.title': 'Finden Sie die Wahrheit in der Unsicherheit', - // Auto-filled missing keys from en-US (fallback to English) - 'dashboard.indicator.boundary.message': 'Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.', - 'dashboard.indicator.boundary.indicatorRule': "Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.", - 'dashboard.indicator.boundary.backtestRule': 'Rule: If a bar has a main signal (buy/sell → open/close/reverse), scaling in/out is skipped on the same bar.', - 'dashboard.indicator.guide.title': 'Python Indicator & Strategy Development Guide', - 'dashboard.indicator.guide.intro': 'This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.', - 'dashboard.indicator.guide.section1.title': '1. Runtime Environment & Predefined Variables', - 'dashboard.indicator.guide.section1.env': 'Your code runs in a browser-based Python environment (Pyodide).', - 'dashboard.indicator.guide.section1.libs': 'Pre-installed Libraries', - 'dashboard.indicator.guide.section1.libsDesc': 'The following libraries are imported by default, no need to import again:', - 'dashboard.indicator.guide.section1.libsList': 'pandas (pd), numpy (np), math, json', - 'dashboard.indicator.guide.section1.data': 'Input Data: df', - 'dashboard.indicator.guide.section1.dataDesc': 'The system automatically converts current K-line data into a Pandas DataFrame object, variable name is df.', - 'dashboard.indicator.guide.section1.dataColumns': 'df contains the following columns (all float type):', - 'dashboard.indicator.guide.section1.dataColumnsList': 'time (timestamp, seconds), open, high, low, close, volume', - 'dashboard.indicator.guide.section1.dataNote': 'Data index is arranged from old to new (0 is the earliest data, last row is the latest data).', - 'dashboard.indicator.guide.section1.dataIndex': 'Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using .values which loses the index.', - 'dashboard.indicator.guide.section2.title': '2. Parameter Definition', - 'dashboard.indicator.guide.section2.desc': 'You can define variables as parameters at the beginning of your code. The system will try to parse statements like variable = value as adjustable parameters.', - 'dashboard.indicator.guide.section2.example': 'Parameter Example', - 'dashboard.indicator.guide.section2.exampleCode': 'span = 20 or multiplier = 2.0', - 'dashboard.indicator.guide.section3.title': '3. Backtest Signal Setup (Important!)', - 'dashboard.indicator.guide.section3.desc': 'If you want your indicator to support backtesting, you must set the following two columns in your code:', - 'dashboard.indicator.guide.section3.backtestRequired': 'Required for Backtesting:', - 'dashboard.indicator.guide.section3.backtestBuySignal': "df['buy_signal'] - Boolean Series, True indicates buy signal", - 'dashboard.indicator.guide.section3.backtestSellSignal': "df['sell_signal'] - Boolean Series, True indicates sell signal", - 'dashboard.indicator.guide.section3.backtestExample': 'Example:', - 'dashboard.indicator.guide.section3.backtestExampleCode': "df['buy_signal'] = condition_buy
    df['sell_signal'] = condition_sell", - 'dashboard.indicator.guide.section3.backtestNote': 'Note: Even if you only set output.signals for chart display, you must set these two columns to enable backtesting.', - 'dashboard.indicator.guide.section4.title': '4. Output Requirements: output', - 'dashboard.indicator.guide.section4.desc': 'At the end of code execution, you must define a dictionary named output to tell the chart how to display results.', - 'dashboard.indicator.guide.section4.fields': 'The output dictionary contains the following fields:', - 'dashboard.indicator.guide.section4.plots': 'plots - For drawing lines (e.g., moving averages, RSI)', - 'dashboard.indicator.guide.section4.signals': 'signals - For marking buy/sell signals (e.g., arrows, labels)', - 'dashboard.indicator.guide.section4.name': 'name - Indicator name (optional)', - 'dashboard.indicator.guide.section4.calculatedVars': 'calculatedVars - Calculated variables (optional, for displaying additional information)', - 'dashboard.indicator.guide.section5.title': '5. Plot Configuration (Plots)', - 'dashboard.indicator.guide.section5.desc': 'Each object in the plots list represents a line.', - 'dashboard.indicator.guide.section5.table.field': 'Field', - 'dashboard.indicator.guide.section5.table.type': 'Type', - 'dashboard.indicator.guide.section5.table.required': 'Required', - 'dashboard.indicator.guide.section5.table.requiredYes': 'Yes', - 'dashboard.indicator.guide.section5.table.requiredNo': 'No', - 'dashboard.indicator.guide.section5.table.desc': 'Description', - 'dashboard.indicator.guide.section5.table.name': 'The name of the indicator line, displayed in the legend', - 'dashboard.indicator.guide.section5.table.data': 'Data list, length must match the number of rows in df. Recommended to use series.tolist()', - 'dashboard.indicator.guide.section5.table.color': "Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign", - 'dashboard.indicator.guide.section5.table.typeDesc': "Chart type, default is 'line'", - 'dashboard.indicator.guide.section5.table.overlay': 'Important. True means display on main chart (with K-line), False means display on sub-chart (independent area)', - 'dashboard.indicator.guide.section5.example': 'Example: Draw Simple Moving Average (SMA)', - 'dashboard.indicator.guide.section5.exampleCalc': 'Calculate SMA', - 'dashboard.indicator.guide.section5.exampleOutput': 'Construct Output', - 'dashboard.indicator.guide.section5.exampleOverlay': 'Display on main chart', - 'dashboard.indicator.guide.section6.title': '6. Signal Markers (Signals)', - 'dashboard.indicator.guide.section6.desc': "signals are used to mark buy/sell points on specific K-lines through icons or text. Note: This is only for chart display. The backtest system uses df['buy_signal'] and df['sell_signal'].", - 'dashboard.indicator.guide.section6.table.type': "Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)", - 'dashboard.indicator.guide.section6.table.data': 'Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions', - 'dashboard.indicator.guide.section6.table.text': 'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")', - 'dashboard.indicator.guide.section6.table.color': 'Marker color', - 'dashboard.indicator.guide.section6.hint': 'The system automatically handles positioning.', - 'dashboard.indicator.guide.section6.buy': 'Markers will be automatically positioned below the Low of the current K-line', - 'dashboard.indicator.guide.section6.sell': 'Markers will be automatically positioned above the High of the current K-line', - 'dashboard.indicator.guide.section6.example': 'Example: Draw Buy/Sell Signals', - 'dashboard.indicator.guide.section6.exampleInit': 'Initialize signal list, fill all with None', - 'dashboard.indicator.guide.section6.exampleLogic': 'Simple logic: mark buy when close price is greater than open price', - 'dashboard.indicator.guide.section6.exampleNote': 'In actual logic, please use loops or vectorized operations', - 'dashboard.indicator.guide.section6.examplePrice': 'Record price', - 'dashboard.indicator.guide.section6.exampleText': 'Buy', - 'dashboard.indicator.guide.section7.title': '7. Complete Code Examples', - 'dashboard.indicator.guide.section7.exampleA': 'Example A: Dual EMA Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleACode': "# 1. Calculate indicators
    df['ema_fast'] = df['close'].ewm(span=5, adjust=False).mean()
    df['ema_slow'] = df['close'].ewm(span=13, adjust=False).mean()

    # 2. Calculate crossover signals
    cross_up = (df['ema_fast'] > df['ema_slow']) & (df['ema_fast'].shift(1) <= df['ema_slow'].shift(1))
    cross_down = (df['ema_fast'] < df['ema_slow']) & (df['ema_fast'].shift(1) >= df['ema_slow'].shift(1))

    # 3. 【Important】Set NEW backtest signal columns (bool)
    df['open_long'] = cross_up
    df['close_long'] = cross_down
    df['open_short'] = cross_down
    df['close_short'] = cross_up

    # 4. Generate signal data for chart display
    buy_signals = [df['low'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]

    # 5. Build output
    output = {
    \"name\": \"Dual EMA Strategy\",
    \"plots\": [
    {\"name\": \"EMA 5\", \"data\": df['ema_fast'].tolist(), \"color\": \"#FF6B6B\", \"overlay\": True},
    {\"name\": \"EMA 13\", \"data\": df['ema_slow'].tolist(), \"color\": \"#4ECDC4\", \"overlay\": True}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleB': 'Example B: Bollinger Bands - Chart Display Only', - 'dashboard.indicator.guide.section7.exampleBCode': "# Calculate Bollinger Bands (chart display only, no backtesting)
    length = 20
    mult = 2.0
    df['sma'] = df['close'].rolling(length).mean()
    df['std'] = df['close'].rolling(length).std()
    df['upper'] = df['sma'] + mult * df['std']
    df['lower'] = df['sma'] - mult * df['std']

    output = {
    \"name\": \"Bollinger Bands\",
    \"plots\": [
    {\"name\": \"Upper\", \"data\": df['upper'].tolist(), \"color\": \"#FF5252\", \"overlay\": True},
    {\"name\": \"Middle\", \"data\": df['sma'].tolist(), \"color\": \"#2196F3\", \"overlay\": True},
    {\"name\": \"Lower\", \"data\": df['lower'].tolist(), \"color\": \"#00E676\", \"overlay\": True}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleC': 'Example C: RSI Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleCCode': "# Calculate RSI
    delta = df['close'].diff()
    up = delta.clip(lower=0)
    down = -1 * delta.clip(upper=0)
    ema_up = up.ewm(com=13, adjust=False).mean()
    ema_down = down.ewm(com=13, adjust=False).mean()
    rs = ema_up / ema_down
    df['rsi'] = 100 - (100 / (1 + rs))

    # Generate trading signals
    buy_condition = df['rsi'] < 30 # Oversold buy
    sell_condition = df['rsi'] > 70 # Overbought sell

    # 【Important】Set NEW backtest signal columns (bool)
    df['open_long'] = buy_condition
    df['close_long'] = sell_condition
    df['open_short'] = sell_condition
    df['close_short'] = buy_condition

    # Generate chart signals
    buy_signals = [df['low'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]

    output = {
    \"name\": \"RSI Strategy\",
    \"plots\": [
    {\"name\": \"RSI\", \"data\": df['rsi'].tolist(), \"color\": \"#9C27B0\", \"overlay\": False},
    {\"name\": \"Overbought\", \"data\": [70] * len(df), \"color\": \"#FF5252\", \"style\": \"dashed\", \"overlay\": False},
    {\"name\": \"Oversold\", \"data\": [30] * len(df), \"color\": \"#00E676\", \"style\": \"dashed\", \"overlay\": False}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section6.param': 'Parameters', - 'dashboard.indicator.guide.section6.calc': 'Calculate', - 'dashboard.indicator.guide.section6.output': 'Output', - 'dashboard.indicator.guide.section6.generate': 'Generate signal data (initialize with None)', - 'dashboard.indicator.guide.section6.subchart': 'Display on sub-chart', - 'dashboard.indicator.guide.section8.title': '8. Frequently Asked Questions (FAQ)', - 'dashboard.indicator.guide.section8.q1': "Q: Why can't my indicator be backtested?", - 'dashboard.indicator.guide.section8.a1': "A: The backtest system requires NEW signal columns: df['open_long'], df['close_long'], df['open_short'], df['close_short'] (boolean). Even if you set output.signals for chart display, you must set these columns to enable backtesting.", - 'dashboard.indicator.guide.section8.q2': 'Q: Data length mismatch?', - 'dashboard.indicator.guide.section8.a2': "A: The data list in plots and signals must have exactly the same length as the K-line data. If you use df['xxx'].tolist(), there is usually no problem.", - 'dashboard.indicator.guide.section8.q3': 'Q: How to handle NaN (empty values)?', - 'dashboard.indicator.guide.section8.a3': "A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use df.fillna(0) or other methods.", - 'dashboard.indicator.guide.section8.q4': 'Q: Index mismatch causing all signals to be NaN?', - 'dashboard.indicator.guide.section8.a4': "A: Please ensure you preserve the original df index (timestamp). Avoid using .values to create new Series. Use columns directly like df['close'] for operations.", - 'dashboard.indicator.guide.section8.q5': 'Q: Can I use third-party network libraries?', - 'dashboard.indicator.guide.section8.a5': 'A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.', - 'dashboard.indicator.guide.section8.q6': 'Q: How to debug code?', - 'dashboard.indicator.guide.section8.a6': 'A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.', - 'dashboard.indicator.guide.section8.q7': 'Q: Backtest shows 0 signals?', - 'dashboard.indicator.guide.section8.a7': "A: Please check the data type of df['open_long']/df['close_long']/df['open_short']/df['close_short']. They should be boolean (True/False), not numeric. Use condition.fillna(False).astype(bool) to ensure correct type.", - 'dashboard.indicator.backtest.commissionHint': 'Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.', - 'dashboard.indicator.backtest.historyTitle': 'Backtest History', - 'dashboard.indicator.backtest.historyRefresh': 'Refresh', - 'dashboard.indicator.backtest.historyView': 'View', - 'dashboard.indicator.backtest.historyNoData': 'No backtest history', - 'dashboard.indicator.backtest.historyUseCurrent': 'Only current symbol/timeframe', - 'dashboard.indicator.backtest.historyFilterSymbol': 'Symbol', - 'dashboard.indicator.backtest.historyFilterTimeframe': 'Timeframe', - 'dashboard.indicator.backtest.historyApply': 'Apply filters', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AI Analyze', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI Suggestions', - 'dashboard.indicator.backtest.historyNoAIResult': 'No AI analysis result', - 'dashboard.indicator.backtest.historyRunId': 'Run ID', - 'dashboard.indicator.backtest.historyCreatedAt': 'Time', - 'dashboard.indicator.backtest.historyRange': 'Range', - 'dashboard.indicator.backtest.historyStatus': 'Status', - 'dashboard.indicator.backtest.historyStatusSuccess': 'Success', - 'dashboard.indicator.backtest.historyStatusFailed': 'Failed', - 'dashboard.indicator.backtest.historyActions': 'Actions', - 'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)', - 'trading-assistant.exchange.ipWhitelistTip': 'Please add the following IPs to the whitelist in your exchange API settings:', - 'signal-robot.title': 'Signal Robot Console', - 'signal-robot.createBot': 'Create New Bot', - 'signal-robot.search.nameOrSymbol': 'Name/Symbol', - 'signal-robot.search.placeholder': 'Search bot name or symbol', - 'signal-robot.search.status': 'Status', - 'signal-robot.search.statusAll': 'All', - 'signal-robot.search.statusRunning': 'Running', - 'signal-robot.search.statusPaused': 'Paused', - 'signal-robot.search.query': 'Query', - 'signal-robot.search.reset': 'Reset', - 'signal-robot.table.botName': 'Bot Name', - 'signal-robot.table.symbolTimeframe': 'Symbol/Timeframe', - 'signal-robot.table.triggerStrategy': 'Trigger Strategy', - 'signal-robot.table.notificationChannels': 'Notification Channels', - 'signal-robot.table.status': 'Status', - 'signal-robot.table.action': 'Action', - 'signal-robot.table.triggerConditions': '{count} trigger conditions', - 'signal-robot.table.monitoring': 'Monitoring', - 'signal-robot.table.paused': 'Paused', - 'signal-robot.table.edit': 'Edit', - 'signal-robot.table.pause': 'Pause', - 'signal-robot.table.start': 'Start', - 'signal-robot.table.delete': 'Delete', - 'signal-robot.table.deleteConfirm': 'Are you sure you want to delete this bot?', - 'signal-robot.table.deleteSuccess': 'Deleted successfully', - 'signal-robot.table.startSuccess': 'Bot started', - 'signal-robot.table.pauseSuccess': 'Bot paused', - 'signal-robot.channel.telegram': 'Telegram', - 'signal-robot.channel.discord': 'Discord', - 'signal-robot.channel.email': 'Email', - 'signal-robot.channel.webhook': 'Webhook', - 'signal-robot.channel.browser': 'Browser Push', - 'signal-robot.modal.createTitle': 'Create New Signal Robot', - 'signal-robot.modal.editTitle': 'Edit Signal Robot', - 'signal-robot.modal.step.basic': 'Basic Settings', - 'signal-robot.modal.step.entry': 'Entry Strategy', - 'signal-robot.modal.step.position': 'Position Management', - 'signal-robot.modal.step.risk': 'Risk Control', - 'signal-robot.modal.step.notify': 'Notification Config', - 'signal-robot.modal.prev': 'Previous', - 'signal-robot.modal.next': 'Next', - 'signal-robot.modal.preview': 'Preview Backtest', - 'signal-robot.modal.complete': 'Complete & Run', - 'signal-robot.modal.saveSuccess': 'Saved successfully', - 'signal-robot.modal.previewDeveloping': 'Preview feature is under development...', - 'signal-robot.modal.basicInfoRequired': 'Please complete basic information', - 'signal-robot.basic.alert': 'Set basic information for the bot', - 'signal-robot.basic.title': 'Basic Information', - 'signal-robot.basic.botName': 'Bot Name', - 'signal-robot.basic.botNamePlaceholder': 'e.g.: BTC SuperTrend Strategy', - 'signal-robot.basic.symbol': 'Trading Pair', - 'signal-robot.basic.symbolPlaceholder': 'Select from watchlist', - 'signal-robot.basic.noWatchlist': 'No watchlist items, please add in market page first', - 'signal-robot.basic.timeframe': 'K-Line Period', - 'signal-robot.basic.timeframe15m': '15 Minutes', - 'signal-robot.basic.timeframe30m': '30 Minutes', - 'signal-robot.basic.timeframe1h': '1 Hour', - 'signal-robot.basic.timeframe4h': '4 Hours', - 'signal-robot.basic.timeframe1d': '1 Day', - 'signal-robot.basic.autoNameSuggestion': '{symbol} Signal Robot', - 'signal-robot.entry.alert': 'Trigger entry signal when all conditions below are met', - 'signal-robot.entry.condition': 'Condition {index}', - 'signal-robot.entry.indicator': 'Indicator', - 'signal-robot.entry.indicatorSupertrend': 'SuperTrend', - 'signal-robot.entry.indicatorEma': 'EMA (Exponential Moving Average)', - 'signal-robot.entry.indicatorRsi': 'RSI (Relative Strength Index)', - 'signal-robot.entry.indicatorMacd': 'MACD', - 'signal-robot.entry.indicatorBollinger': 'Bollinger Bands', - 'signal-robot.entry.atrPeriod': 'ATR Period', - 'signal-robot.entry.multiplier': 'Multiplier', - 'signal-robot.entry.triggerSignal': 'Trigger Signal', - 'signal-robot.entry.signalTrendBullish': 'Trend Bullish', - 'signal-robot.entry.signalTrendBearish': 'Trend Bearish', - 'signal-robot.entry.signalIsUptrend': 'Is Uptrend', - 'signal-robot.entry.signalIsDowntrend': 'Is Downtrend', - 'signal-robot.entry.period': 'Period', - 'signal-robot.entry.compareCondition': 'Compare Condition', - 'signal-robot.entry.priceAbove': 'Price > EMA (Price Above)', - 'signal-robot.entry.priceBelow': 'Price < EMA (Price Below)', - 'signal-robot.entry.crossUp': 'Price Crosses Above EMA (Golden Cross)', - 'signal-robot.entry.crossDown': 'Price Crosses Below EMA (Death Cross)', - 'signal-robot.entry.compare': 'Compare', - 'signal-robot.entry.greaterThan': 'Greater Than', - 'signal-robot.entry.lessThan': 'Less Than', - 'signal-robot.entry.crossUpShort': 'Cross Up', - 'signal-robot.entry.crossDownShort': 'Cross Down', - 'signal-robot.entry.threshold': 'Threshold', - 'signal-robot.entry.selectIndicator': 'Please select an indicator to configure parameters', - 'signal-robot.entry.addCondition': 'Add Condition', - 'signal-robot.position.alert': 'Configure initial position size, leverage and pyramiding rules', - 'signal-robot.position.basicTitle': 'Basic Position Management', - 'signal-robot.position.initialSize': 'Initial Size (Capital %)', - 'signal-robot.position.initialSizeHint': 'Recommended 5% - 20%', - 'signal-robot.position.leverage': 'Leverage', - 'signal-robot.position.leverageHint': 'Please ensure your exchange account supports this leverage', - 'signal-robot.position.maxPyramiding': 'Max Pyramiding Times', - 'signal-robot.position.maxPyramidingHint': '0 means no pyramiding', - 'signal-robot.position.pyramidingTitle': 'Pyramiding Rules', - 'signal-robot.position.pyramidingEnabled': 'Enabled', - 'signal-robot.position.pyramidingDisabled': 'Disabled', - 'signal-robot.position.pyramidingCondition': 'Pyramiding Trigger Condition', - 'signal-robot.position.priceRisePct': 'Price Rises (Long) / Falls (Short)', - 'signal-robot.position.profitPct': 'Profit Reaches', - 'signal-robot.position.triggerThreshold': 'Trigger Threshold (%)', - 'signal-robot.position.triggerThresholdHint': 'e.g. 3%: add position once every 3% rise', - 'signal-robot.position.addSize': 'Single Add Size (Capital %)', - 'signal-robot.position.pyramidingDisabledHint': 'Pyramiding disabled, only initial position will be executed', - 'signal-robot.risk.alert': 'Configure take profit, stop loss and exit rules', - 'signal-robot.risk.stopLossTitle': 'Stop Loss', - 'signal-robot.risk.stopLossEnabled': 'Enabled', - 'signal-robot.risk.stopLossDisabled': 'Disabled', - 'signal-robot.risk.stopLossType': 'Stop Loss Type', - 'signal-robot.risk.stopLossFixedPct': 'Fixed Percentage', - 'signal-robot.risk.stopLossAtrMultiplier': 'ATR Multiplier', - 'signal-robot.risk.stopLossValue': 'Value', - 'signal-robot.risk.stopLossFixedHint': 'e.g. 2%: stop loss when loss reaches 2%', - 'signal-robot.risk.stopLossAtrHint': 'e.g. 2.0: stop loss when price touches ATR*2.0', - 'signal-robot.risk.stopLossDisabledHint': 'Stop loss disabled (high risk)', - 'signal-robot.risk.trailingStopTitle': 'Trailing Stop', - 'signal-robot.risk.activationProfit': 'Activation Profit (%)', - 'signal-robot.risk.activationProfitHint': 'Start trailing when profit reaches this level', - 'signal-robot.risk.callbackPct': 'Callback (%)', - 'signal-robot.risk.callbackPctHint': 'Trigger take profit when price falls from peak by this percentage', - 'signal-robot.risk.trailingStopDisabledHint': 'Trailing stop disabled', - 'signal-robot.risk.otherExitTitle': 'Other Exit Rules', - 'signal-robot.risk.signalExit': 'Allow Signal Exit', - 'signal-robot.risk.signalExitHint': 'Close position immediately when reverse signal appears (e.g. close long when short signal appears)', - 'signal-robot.notify.alert': 'Configure notification methods when signal is triggered', - 'signal-robot.notify.channelTitle': 'Notification Channels', - 'signal-robot.notify.discordWebhook': 'Discord Webhook', - 'signal-robot.notify.genericWebhook': 'Generic Webhook', - 'signal-robot.notify.webhookUrl': 'Webhook URL', - 'signal-robot.notify.webhookUrlPlaceholder': 'https://example.com/webhook', - 'signal-robot.notify.discordUrl': 'Discord URL', - 'signal-robot.notify.discordUrlPlaceholder': 'https://discord.com/api/webhooks/...', - 'signal-robot.operator.greaterThan': 'Greater Than', - 'signal-robot.operator.lessThan': 'Less Than', - 'signal-robot.operator.equal': 'Equal', - 'signal-robot.operator.goldenCross': 'Golden Cross', - 'signal-robot.operator.deathCross': 'Death Cross', - 'signal-robot.operator.increaseBy': 'Increase By', - 'signal-robot.operator.decreaseBy': 'Decrease By', - 'signal-robot.indicator.price': 'Price', - 'signal-robot.indicator.rsi': 'RSI', - 'signal-robot.indicator.kdjK': 'KDJ(K)', - 'signal-robot.indicator.kdjJ': 'KDJ(J)', - 'signal-robot.indicator.macd': 'MACD', - 'signal-robot.indicator.macdHist': 'MACD Histogram', - 'signal-robot.indicator.bollingerUp': 'Bollinger Upper', - 'signal-robot.indicator.bollingerLow': 'Bollinger Lower', - 'signal-robot.indicator.volume': 'Volume', - 'signal-robot.indicator.changePct1h': '1H Change %', - 'signal-robot.indicator.changePct24h': '24H Change %', - 'signal-robot.indicator.signalLine': 'Signal Line', - - // Settings (Memory/Reflection) - 'settings.group.agent_memory': 'Gedächtnis/Reflexion', - 'settings.group.reflection_worker': 'Automatischer Reflexions-Prüf-Worker', - 'settings.field.ENABLE_AGENT_MEMORY': 'Agenten-Gedächtnis aktivieren', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'Vektorsuche aktivieren (lokal)', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'Embedding-Dimension', - 'settings.field.AGENT_MEMORY_TOP_K': 'Top-K Abrufanzahl', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'Kandidatenfenstergröße', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': 'Halbwertszeit der Zeitabnahme (Tage)', - 'settings.field.AGENT_MEMORY_W_SIM': 'Ähnlichkeitsgewicht', - 'settings.field.AGENT_MEMORY_W_RECENCY': 'Aktualitätsgewicht', - 'settings.field.AGENT_MEMORY_W_RETURNS': 'Renditegewicht', - 'settings.field.ENABLE_REFLECTION_WORKER': 'Automatische Verifikation aktivieren', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': 'Verifikationsintervall (Sek.)' -} - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/en-US.js b/quantdinger_vue/src/locales/lang/en-US.js deleted file mode 100644 index cd78c3b..0000000 --- a/quantdinger_vue/src/locales/lang/en-US.js +++ /dev/null @@ -1,2555 +0,0 @@ -import antdEnUS from 'ant-design-vue/es/locale-provider/en_US' -import momentEU from 'moment/locale/eu' - -const components = { - antLocale: antdEnUS, - momentName: 'eu', - momentLocale: momentEU -} - -const locale = { - // Common - 'common.confirm': 'Confirm', - 'common.cancel': 'Cancel', - 'common.save': 'Save', - 'common.delete': 'Delete', - 'common.edit': 'Edit', - 'common.add': 'Add', - 'common.close': 'Close', - 'common.ok': 'OK', - 'submit': 'Submit', - 'save': 'Save', - 'submit.ok': 'Submit successfully', - 'save.ok': 'Saved successfully', - 'menu.welcome': 'Welcome', - 'menu.home': 'Home', - 'menu.dashboard': 'Dashboard', - 'menu.dashboard.analysis': 'AI Analysis', - 'menu.dashboard.indicator': 'Indicator Analysis', - 'menu.dashboard.community': 'Indicator Community', - 'menu.dashboard.tradingAssistant': 'Trading Assistant', - 'menu.dashboard.portfolio': 'Portfolio', - 'menu.settings': 'Settings', - 'menu.dashboard.aiTradingAssistant': 'AI Trading Assistant', - 'menu.dashboard.signalRobot': 'Signal Robot', - 'menu.dashboard.monitor': 'Monitor', - 'menu.dashboard.workplace': 'Workplace', - 'menu.form': 'Form', - 'menu.form.basic-form': 'Basic Form', - 'menu.form.step-form': 'Step Form', - 'menu.form.step-form.info': 'Step Form(write transfer information)', - 'menu.form.step-form.confirm': 'Step Form(confirm transfer information)', - 'menu.form.step-form.result': 'Step Form(finished)', - 'menu.form.advanced-form': 'Advanced Form', - 'menu.list': 'List', - 'menu.list.table-list': 'Search Table', - 'menu.list.basic-list': 'Basic List', - 'menu.list.card-list': 'Card List', - 'menu.list.search-list': 'Search List', - 'menu.list.search-list.articles': 'Search List(articles)', - 'menu.list.search-list.projects': 'Search List(projects)', - 'menu.list.search-list.applications': 'Search List(applications)', - 'menu.profile': 'Profile', - 'menu.profile.basic': 'Basic Profile', - 'menu.profile.advanced': 'Advanced Profile', - 'menu.result': 'Result', - 'menu.result.success': 'Success', - 'menu.result.fail': 'Fail', - 'menu.exception': 'Exception', - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': 'Trigger', - 'menu.account': 'Account', - 'menu.account.center': 'Account Center', - 'menu.account.settings': 'Account Settings', - 'menu.account.trigger': 'Trigger Error', - 'menu.account.logout': 'Logout', - 'menu.wallet': 'My Wallet', - 'menu.docs': 'Documentation', - 'menu.docs.detail': 'Doc Detail', - 'menu.header.refreshPage': 'Refresh Page', - 'menu.invite.friends': 'Invite Friends', - 'app.setting.pagestyle': 'Page Style Setting', - 'app.setting.pagestyle.light': 'Light Menu Style', - 'app.setting.pagestyle.dark': 'Dark Menu Style', - 'app.setting.pagestyle.realdark': 'RealDark style', - 'app.setting.themecolor': 'Theme Color', - 'app.setting.navigationmode': 'Navigation Mode', - 'app.setting.sidemenu.nav': 'Sidebar Navigation', - 'app.setting.topmenu.nav': 'Top Navigation', - 'app.setting.content-width': 'Content Width', - 'app.setting.content-width.tooltip': 'This setting is only effective for [Top Navigation]', - 'app.setting.content-width.fixed': 'Fixed', - 'app.setting.content-width.fluid': 'Fluid', - 'app.setting.fixedheader': 'Fixed Header', - 'app.setting.fixedheader.tooltip': 'Configurable when Header is fixed', - 'app.setting.autoHideHeader': 'Hide Header on Scroll', - 'app.setting.fixedsidebar': 'Fixed Sidebar Menu', - 'app.setting.sidemenu': 'Side Menu Layout', - 'app.setting.topmenu': 'Top Menu Layout', - 'app.setting.othersettings': 'Other Settings', - 'app.setting.weakmode': 'Weak Mode', - 'app.setting.multitab': 'Multi-Tab Mode', - 'app.setting.copy': 'Copy Setting', - 'app.setting.loading': 'Loading theme', - 'app.setting.copyinfo': 'copy success,please replace defaultSettings in src/config/defaultSettings.js', - 'app.setting.copy.success': 'Copy Success', - 'app.setting.copy.fail': 'Copy Failed', - 'app.setting.theme.switching': 'Switching theme...', - 'app.setting.production.hint': 'Setting panel shows in development environment only, please manually modify', - 'app.setting.themecolor.daybreak': 'Daybreak Blue (Default)', - 'app.setting.themecolor.dust': 'Dust Red', - 'app.setting.themecolor.volcano': 'Volcano', - 'app.setting.themecolor.sunset': 'Sunset Orange', - 'app.setting.themecolor.cyan': 'Cyan', - 'app.setting.themecolor.green': 'Polar Green', - 'app.setting.themecolor.geekblue': 'Geek Blue', - 'app.setting.themecolor.purple': 'Golden Purple', - 'app.setting.tooltip': 'Page Settings', - - // Notification Center - 'notice.title': 'Notifications', - 'notice.empty': 'No notifications', - 'notice.markAllRead': 'Mark all as read', - 'notice.clear': 'Clear all', - 'notice.close': 'Close', - 'notice.justNow': 'Just now', - 'notice.minutesAgo': 'minutes ago', - 'notice.hoursAgo': 'hours ago', - 'notice.daysAgo': 'days ago', - 'notice.detailInfo': 'Details', - 'notice.aiDecision': 'AI Decision', - 'notice.confidence': 'Confidence', - 'notice.reasoning': 'Reasoning', - 'notice.symbol': 'Symbol', - 'notice.currentPrice': 'Current Price', - 'notice.triggerPrice': 'Trigger Price', - 'notice.action': 'Action', - 'notice.quantity': 'Quantity', - 'notice.viewPortfolio': 'View Portfolio', - 'notice.type.aiMonitor': 'AI Monitor', - 'notice.type.priceAlert': 'Price Alert', - 'notice.type.signal': 'Trade Signal', - 'notice.type.buy': 'Buy Signal', - 'notice.type.sell': 'Sell Signal', - 'notice.type.hold': 'Hold Suggestion', - 'notice.type.trade': 'Trade Execution', - 'notice.type.notification': 'Notification', - - 'user.login.userName': 'userName', - 'user.login.password': 'password', - 'user.login.username.placeholder': 'Account: admin', - 'user.login.password.placeholder': 'password: admin or ant.design', - 'user.login.message-invalid-credentials': 'Login failed, please check your email and verification code', - 'user.login.message-invalid-verification-code': 'Invalid verification code', - 'user.login.tab-login-credentials': 'Credentials', - 'user.login.tab-login-email': 'Email', - 'user.login.tab-login-mobile': 'Mobile number', - 'user.login.captcha.placeholder': 'Please enter captcha', - 'user.login.mobile.placeholder': 'Mobile number', - 'user.login.mobile.verification-code.placeholder': 'Verification code', - 'user.login.email.placeholder': 'Please enter your email address', - 'user.login.email.verification-code.placeholder': 'Please enter verification code', - 'user.login.email.sending': 'Sending verification code...', - 'user.login.email.send-success-title': 'Notice', - 'user.login.email.send-success': 'Verification code sent successfully, please check your email', - 'user.login.sms.send-success': 'Verification code sent successfully, please check your SMS', - 'user.login.remember-me': 'Remember me', - 'user.login.forgot-password': 'Forgot your password?', - 'user.login.sign-in-with': 'Sign in with', - 'user.login.signup': 'Sign up', - 'user.login.login': 'Login', - 'user.register.register': 'Register', - 'user.register.email.placeholder': 'Email', - 'user.register.password.placeholder': 'Password ', - 'user.register.password.popover-message': 'Please enter at least 6 characters. Please do not use passwords that are easy to guess. ', - 'user.register.confirm-password.placeholder': 'Confirm password', - 'user.register.get-verification-code': 'Get code', - 'user.register.sign-in': 'Already have an account?', - 'user.register-result.msg': 'Account:registered at {email}', - 'user.register-result.activation-email': 'The activation email has been sent to your email address and is valid for 24 hours. Please log in to the email in time and click on the link in the email to activate the account.', - 'user.register-result.back-home': 'Back to home', - 'user.register-result.view-mailbox': 'View mailbox', - 'user.email.required': 'Please enter your email!', - 'user.email.wrong-format': 'The email address is in the wrong format!', - 'user.userName.required': 'Please enter account name or email address', - 'user.password.required': 'Please enter your password!', - 'user.password.twice.msg': 'The passwords entered twice do not match!', - 'user.password.strength.msg': 'The password is not strong enough', - 'user.password.strength.strong': 'Strength: strong', - 'user.password.strength.medium': 'Strength: medium', - 'user.password.strength.low': 'Strength: low', - 'user.password.strength.short': 'Strength: too short', - 'user.confirm-password.required': 'Please confirm your password!', - 'user.phone-number.required': 'Please enter your phone number!', - 'user.phone-number.wrong-format': 'Please enter a valid phone number', - 'user.verification-code.required': 'Please enter the verification code!', - 'user.captcha.required': 'Please enter captcha!', - 'user.login.infos': 'QuantDinger is an AI multi-agent stock analysis tool that does not have securities investment consulting qualifications. All analysis results, scores, and reference opinions on the platform are automatically generated by AI based on historical data, and are only for learning, research, and technical exchanges, and do not constitute any investment advice or decision-making basis. Stock investment involves market risk, liquidity risk, policy risk and other risks, which may lead to losses of principal. Users should make independent decisions based on their risk tolerance capacity, and bear the consequences of any investment behavior and its results using this tool. Market risk, investment needs to be cautious.', - 'user.login.tab-login-web3': 'Web3 Login', - 'user.login.web3.tip': 'Sign in with your wallet via signature', - 'user.login.web3.connect': 'Connect wallet and login', - 'user.login.web3.no-wallet': 'No wallet detected', - 'user.login.web3.no-address': 'Wallet address not found', - 'user.login.web3.nonce-failed': 'Failed to get nonce', - 'user.login.web3.verify-failed': 'Signature verification failed', - 'user.login.web3.success': 'Login success', - 'user.login.web3.failed': 'Wallet login failed', - 'nav.no_wallet': 'No wallet detected', - 'nav.copy': 'Copy', - 'nav.copy_success': 'Copied', - 'user.login.oauth.google': 'Sign in with Google', - 'user.login.oauth.github': 'Sign in with GitHub', - 'user.login.oauth.loading': 'Redirecting to authorization page...', - 'user.login.oauth.failed': 'OAuth login failed', - 'user.login.oauth.get-url-failed': 'Failed to get authorization URL', - 'user.login.subtitle': 'driven quantitative insights for global markets', - 'user.login.legal.title': 'Legal Disclaimer', - 'user.login.legal.view': 'View Legal Disclaimer', - 'user.login.legal.collapse': 'Hide Legal Disclaimer', - 'user.login.legal.agree': 'I have read and agree to the Legal Disclaimer', - 'user.login.legal.required': 'Please read and check the Legal Disclaimer first', - 'user.login.legal.content': 'QuantDinger is an AI multi-agent stock analysis tool and does not provide investment advice. All analysis results, scores, and references are generated by AI based on historical data and are for learning, research, and technical exchange only. They do not constitute investment advice or a basis for decision-making. Stock investments involve market, liquidity, and policy risks, which may lead to loss of principal. Users should make independent decisions based on their risk tolerance and bear the consequences of any investment behavior and results using this tool.', - 'user.login.privacy.title': 'Privacy Policy', - 'user.login.privacy.view': 'View Privacy Policy', - 'user.login.privacy.collapse': 'Hide Privacy Policy', - 'user.login.privacy.content': 'We value your privacy and data protection. (1) Scope of collection: We only collect information necessary to provide the service (e.g., email, mobile number, country code, Web3 wallet address) and limited logs/device data. (2) Purpose of use: Account login and security verification, feature provisioning, troubleshooting, and compliance requirements. (3) Storage & security: Data is encrypted and access-controlled to prevent unauthorized access, disclosure, or loss. (4) Sharing & third parties: We do not share personal data with third parties except as required by law or to deliver the service; where third-party services are involved (e.g., wallets, SMS providers), processing is limited to the minimum scope required. (5) Cookies/local storage: Used for session and login state (e.g., tokens, PHPSESSID). You may clear or restrict them in your browser. (6) Your rights: You may exercise rights of access, correction, deletion, and consent withdrawal as permitted by law. (7) Changes & notices: We will provide prominent notice for updates. Continued use indicates that you have read and agreed to the updated terms. If you do not agree, please stop using the service and contact us.', - - // Login page additions - 'user.login.username': 'Username', - 'user.login.usernameRequired': 'Please enter username', - 'user.login.passwordRequired': 'Please enter password', - 'user.login.tab': 'Login', - 'user.login.submit': 'Login', - 'user.login.register': 'Create Account', - 'user.login.forgotPassword': 'Forgot Password?', - 'user.login.orLoginWith': 'Or login with', - 'user.login.methodPassword': 'Password', - 'user.login.methodCode': 'Email Code', - 'user.login.email': 'Email', - 'user.login.emailRequired': 'Please enter email', - 'user.login.emailInvalid': 'Invalid email format', - 'user.login.verificationCode': 'Verification Code', - 'user.login.codeRequired': 'Please enter verification code', - 'user.login.sendCode': 'Send', - 'user.login.codeSent': 'Verification code sent', - 'user.login.codeLoginHint': 'New users will be auto-registered', - 'user.login.welcomeNew': 'Welcome!', - 'user.login.accountCreated': 'Your account has been created', - - // OAuth - 'user.oauth.processing': 'Processing login...', - 'user.oauth.error.missing_params': 'Missing required parameters', - 'user.oauth.error.invalid_state': 'Invalid state parameter', - 'user.oauth.error.user_creation_failed': 'Failed to create user', - 'user.oauth.error.server_error': 'Server error', - - // Register page - 'user.register.tab': 'Register', - 'user.register.title': 'Create Account', - 'user.register.email': 'Email', - 'user.register.emailRequired': 'Please enter email', - 'user.register.emailInvalid': 'Invalid email format', - 'user.register.verificationCode': 'Verification Code', - 'user.register.codeRequired': 'Please enter verification code', - 'user.register.sendCode': 'Send Code', - 'user.register.codeSent': 'Verification code sent', - 'user.register.username': 'Username', - 'user.register.usernameRequired': 'Please enter username', - 'user.register.usernameLength': 'Username must be 3-30 characters', - 'user.register.usernamePattern': 'Start with letter, letters/numbers/underscore only', - 'user.register.password': 'Password', - 'user.register.passwordRequired': 'Please enter password', - 'user.register.confirmPassword': 'Confirm Password', - 'user.register.confirmPasswordRequired': 'Please confirm password', - 'user.register.passwordMismatch': 'Passwords do not match', - 'user.register.submit': 'Create Account', - 'user.register.haveAccount': 'Already have an account?', - 'user.register.login': 'Login', - 'user.register.success': 'Registration successful', - 'user.register.pleaseLogin': 'Please login with your new account', - 'user.register.pwdMinLength': 'At least 8 characters', - 'user.register.pwdUppercase': 'At least one uppercase letter', - 'user.register.pwdLowercase': 'At least one lowercase letter', - 'user.register.pwdNumber': 'At least one number', - - // Reset password page - 'user.resetPassword.title': 'Reset Password', - 'user.resetPassword.email': 'Email', - 'user.resetPassword.emailRequired': 'Please enter email', - 'user.resetPassword.emailInvalid': 'Invalid email format', - 'user.resetPassword.verificationCode': 'Verification Code', - 'user.resetPassword.codeRequired': 'Please enter verification code', - 'user.resetPassword.sendCode': 'Send Code', - 'user.resetPassword.codeSent': 'Verification code sent', - 'user.resetPassword.next': 'Next', - 'user.resetPassword.backToLogin': 'Back to Login', - 'user.resetPassword.resettingFor': 'Resetting password for', - 'user.resetPassword.newPassword': 'New Password', - 'user.resetPassword.passwordRequired': 'Please enter new password', - 'user.resetPassword.confirmPassword': 'Confirm New Password', - 'user.resetPassword.confirmPasswordRequired': 'Please confirm password', - 'user.resetPassword.submit': 'Reset Password', - 'user.resetPassword.back': 'Back', - 'user.resetPassword.successTitle': 'Password Reset Successful', - 'user.resetPassword.successSubtitle': 'You can now login with your new password', - 'user.resetPassword.goToLogin': 'Go to Login', - - // Security - 'user.security.retry': 'Retry', - - // Profile - change password - 'profile.passwordHintNew': 'For security, email verification is required to change password. Password must be at least 8 characters with uppercase, lowercase, and number.', - 'profile.verificationCode': 'Verification Code', - 'profile.codeRequired': 'Please enter verification code', - 'profile.codePlaceholder': 'Enter verification code', - 'profile.sendCode': 'Send Code', - 'profile.codeSent': 'Verification code sent', - 'profile.codeWillSendTo': 'Code will be sent to', - 'profile.noEmailWarning': 'Please set your email first in Basic Info tab', - - 'account.basicInfo': 'Basic Information', - 'account.id': 'User ID', - 'account.username': 'Username', - 'account.nickname': 'Nickname', - 'account.email': 'Email', - 'account.mobile': 'Mobile', - 'account.web3address': 'Wallet Address', - 'account.pid': 'Referrer ID', - 'account.level': 'Level', - 'account.money': 'Balance', - 'account.qdtBalance': 'QDT Balance', - 'account.score': 'Score', - 'account.createtime': 'Registration Time', - 'account.inviteLink': 'Invite Link', - 'account.recharge': 'Recharge', - 'account.rechargeTip': 'Please scan the QR code below with WeChat or Alipay to recharge', - 'account.qrCodePlaceholder': 'QR Code Placeholder (Mock)', - 'account.rechargeAmount': 'Recharge Amount', - 'account.enterAmount': 'Please enter recharge amount', - 'account.rechargeHint': 'Minimum recharge amount: 1 QDT', - 'account.confirmRecharge': 'Confirm Recharge', - 'account.enterValidAmount': 'Please enter a valid recharge amount', - 'account.rechargeSuccess': 'Recharge successful! Recharged {amount} QDT', - 'account.settings.menuMap.basic': 'Basic Settings', - 'account.settings.menuMap.security': 'Security Settings', - 'account.settings.menuMap.notification': 'New Message Notification', - 'account.settings.menuMap.moneyLog': 'Transaction History', - 'account.moneyLog.empty': 'No transaction history', - 'account.moneyLog.total': 'Total {total} records', - 'account.moneyLog.type.purchase': 'Purchase Indicator', - 'account.moneyLog.type.recharge': 'Recharge', - 'account.moneyLog.type.refund': 'Refund', - 'account.moneyLog.type.reward': 'Reward', - 'account.moneyLog.type.income': 'Indicator Income', - 'account.moneyLog.type.commission': 'Platform Fee', - 'wallet.balance': 'QDT Balance', - 'wallet.recharge': 'Recharge', - 'wallet.withdraw': 'Withdraw', - 'wallet.filter': 'Filter', - 'wallet.reset': 'Reset', - 'wallet.totalRecharge': 'Total Recharge', - 'wallet.totalWithdraw': 'Total Withdraw', - 'wallet.totalIncome': 'Total Income', - 'wallet.records': 'Trading Records & Transaction History', - 'wallet.tradingRecords': 'Trading Records', - 'wallet.moneyLog': 'Transaction History', - 'wallet.rechargeTip': 'Please scan the QR code below with WeChat or Alipay to recharge', - 'wallet.qrCodePlaceholder': 'QR Code Placeholder (Simulated)', - 'wallet.rechargeAmount': 'Recharge Amount', - 'wallet.enterAmount': 'Please enter recharge amount', - 'wallet.rechargeHint': 'Minimum recharge amount: 1 QDT', - 'wallet.confirmRecharge': 'Confirm Recharge', - 'wallet.enterValidAmount': 'Please enter a valid recharge amount', - 'wallet.rechargeSuccess': 'Recharge successful! Recharged {amount} QDT', - 'wallet.rechargeFailed': 'Recharge failed', - 'wallet.withdrawTip': 'Please enter withdrawal amount and address', - 'wallet.withdrawAmount': 'Withdrawal Amount', - 'wallet.enterWithdrawAmount': 'Please enter withdrawal amount', - 'wallet.withdrawHint': 'Minimum withdrawal amount: 1 QDT', - 'wallet.withdrawAddress': 'Withdrawal Address (Optional)', - 'wallet.enterWithdrawAddress': 'Please enter withdrawal address', - 'wallet.confirmWithdraw': 'Confirm Withdrawal', - 'wallet.enterValidWithdrawAmount': 'Please enter a valid withdrawal amount', - 'wallet.insufficientBalance': 'Insufficient balance', - 'wallet.withdrawSuccess': 'Withdrawal successful! Withdrew {amount} QDT', - 'wallet.withdrawFailed': 'Withdrawal failed', - 'wallet.noTradingRecords': 'No trading records', - 'wallet.noMoneyLog': 'No transaction history', - 'wallet.loadTradingRecordsFailed': 'Failed to load trading records', - 'wallet.loadMoneyLogFailed': 'Failed to load transaction history', - 'wallet.moneyLogTotal': 'Total {total} records', - 'wallet.moneyLogTypeTitle': 'Type', - 'wallet.moneyLogType.all': 'All types', - 'wallet.table.time': 'Time', - 'wallet.table.type': 'Type', - 'wallet.table.price': 'Price', - 'wallet.table.amount': 'Amount', - 'wallet.table.money': 'Amount', - 'wallet.table.balance': 'Balance', - 'wallet.table.memo': 'Memo', - 'wallet.table.value': 'Value', - 'wallet.table.profit': 'P/L', - 'wallet.table.commission': 'Commission', - 'wallet.table.total': 'Total {total} records', - 'wallet.tradeType.buy': 'Buy', - 'wallet.tradeType.sell': 'Sell', - 'wallet.tradeType.liquidation': 'Liquidation', - 'wallet.tradeType.openLong': 'Open Long', - 'wallet.tradeType.addLong': 'Add Long', - 'wallet.tradeType.closeLong': 'Close Long', - 'wallet.tradeType.closeLongStop': 'Stop Loss Close Long', - 'wallet.tradeType.closeLongProfit': 'Take Profit Close Long', - 'wallet.tradeType.openShort': 'Open Short', - 'wallet.tradeType.addShort': 'Add Short', - 'wallet.tradeType.closeShort': 'Close Short', - 'wallet.tradeType.closeShortStop': 'Stop Loss Close Short', - 'wallet.tradeType.closeShortProfit': 'Take Profit Close Short', - 'wallet.moneyLogType.purchase': 'Purchase Indicator', - 'wallet.moneyLogType.recharge': 'Recharge', - 'wallet.moneyLogType.withdraw': 'Withdraw', - 'wallet.moneyLogType.refund': 'Refund', - 'wallet.moneyLogType.reward': 'Reward', - 'wallet.moneyLogType.income': 'Income', - 'wallet.moneyLogType.commission': 'Commission', - 'wallet.web3Address.required': 'Please fill in Web3 wallet address first', - 'wallet.web3Address.requiredDescription': 'You need to bind your Web3 wallet address before recharging to receive deposits', - 'wallet.web3Address.placeholder': 'Please enter your Web3 wallet address (starts with 0x)', - 'wallet.web3Address.save': 'Save Wallet Address', - 'wallet.web3Address.saveSuccess': 'Wallet address saved successfully', - 'wallet.web3Address.saveFailed': 'Failed to save wallet address', - 'wallet.web3Address.invalidFormat': 'Please enter a valid Web3 wallet address (Ethereum format: 42 characters starting with 0x, or TRC20 format: 34 characters starting with T)', - 'wallet.selectCoin': 'Select Coin', - 'wallet.selectChain': 'Select Chain', - 'wallet.chain.eth': 'ETH(ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'BSC', - 'wallet.targetQdtAmount': 'Target QDT Amount (Optional)', - 'wallet.targetQdtAmount.placeholder': 'Enter the QDT amount you want to exchange, current QDT price: {price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': 'Required USDT: {amount}', - 'wallet.rechargeAddress': 'Recharge Address', - 'wallet.copyAddress': 'Copy', - 'wallet.copySuccess': 'Copied successfully!', - 'wallet.copyFailed': 'Copy failed, please copy manually', - 'wallet.rechargeAddressHint': 'Please ensure you use {chain} chain to recharge {coin} to this address', - 'wallet.qdtPrice.loading': 'Loading...', - 'wallet.rechargeTip.new': 'Please select coin and chain, then scan the QR code below to recharge', - 'wallet.exchangeRate': '1 QDT ≈ {rate} USDT', - 'wallet.withdrawableAmount': 'Withdrawable Amount', - 'wallet.totalBalance': 'Total Balance', - 'wallet.insufficientWithdrawable': 'Insufficient withdrawable amount, current withdrawable: {amount} QDT', - 'wallet.withdrawAddressRequired': 'Please enter withdrawal address', - 'wallet.withdrawAddressHint': 'Please ensure the address is correct, withdrawal cannot be revoked', - 'wallet.withdrawSubmitSuccess': 'Withdrawal application submitted successfully, please wait for review', - 'menu.footer.contactUs': 'Contact Us', - 'menu.footer.getSupport': 'Get Support', - 'menu.footer.socialAccounts': 'Social Accounts', - 'menu.footer.userAgreement': 'User Agreement', - 'menu.footer.privacyPolicy': 'Privacy Policy', - 'menu.footer.support': 'Support', - 'menu.footer.featureRequest': 'Feature request', - 'menu.footer.email': 'Email', - 'menu.footer.liveChat': '24/7 live chat', - 'dashboard.analysis.title': 'Multi-Dimensional Analysis', - 'dashboard.analysis.subtitle': 'AI-Powered Comprehensive Financial Analysis Platform', - 'dashboard.analysis.selectSymbol': 'Select or enter symbol code', - 'dashboard.analysis.selectModel': 'Select Model', - 'dashboard.analysis.startAnalysis': 'Start Analysis', - 'dashboard.analysis.history': 'History', - 'dashboard.analysis.tab.overview': 'Overview', - 'dashboard.analysis.tab.fundamental': 'Fundamental', - 'dashboard.analysis.tab.technical': 'Technical', - 'dashboard.analysis.tab.news': 'News', - 'dashboard.analysis.tab.sentiment': 'Sentiment', - 'dashboard.analysis.tab.risk': 'Risk', - 'dashboard.analysis.tab.debate': 'Debate', - 'dashboard.analysis.tab.decision': 'Final Decision', - 'dashboard.analysis.empty.selectSymbol': 'Select Symbol to Start Analysis', - 'dashboard.analysis.empty.selectSymbolDesc': 'Select from watchlist or enter symbol code to get multi-dimensional AI analysis report', - 'dashboard.analysis.empty.startAnalysis': 'Click "Start Analysis" button to perform multi-dimensional analysis', - 'dashboard.analysis.empty.startAnalysisDesc': 'We will provide comprehensive analysis from multiple dimensions including fundamental, technical, news, sentiment and risk', - 'dashboard.analysis.empty.noData': 'No {type} analysis data available, please perform comprehensive analysis first', - 'dashboard.analysis.empty.noWatchlist': 'No watchlist items', - 'dashboard.analysis.empty.noHistory': 'No history records', - 'dashboard.analysis.empty.watchlistHint': 'No watchlist, please', - 'dashboard.analysis.empty.noDebateData': 'No debate data available', - 'dashboard.analysis.empty.noDecisionData': 'No decision data available', - 'dashboard.analysis.empty.selectAgent': 'Please select an Agent to view analysis results', - 'dashboard.analysis.loading.analyzing': 'Analyzing, please wait...', - 'dashboard.analysis.loading.fundamental': 'Analyzing fundamental data...', - 'dashboard.analysis.loading.technical': 'Analyzing technical indicators...', - 'dashboard.analysis.loading.news': 'Analyzing news data...', - 'dashboard.analysis.loading.sentiment': 'Analyzing market sentiment...', - 'dashboard.analysis.loading.risk': 'Assessing risks...', - 'dashboard.analysis.loading.debate': 'Debating...', - 'dashboard.analysis.loading.decision': 'Generating final decision...', - 'dashboard.analysis.score.overall': 'Overall Score', - 'dashboard.analysis.score.recommendation': 'Recommendation', - 'dashboard.analysis.score.confidence': 'Confidence', - 'dashboard.analysis.dimension.fundamental': 'Fundamental', - 'dashboard.analysis.dimension.technical': 'Technical', - 'dashboard.analysis.dimension.news': 'News', - 'dashboard.analysis.dimension.sentiment': 'Sentiment', - 'dashboard.analysis.dimension.risk': 'Risk', - 'dashboard.analysis.card.dimensionScores': 'Dimension Scores', - 'dashboard.analysis.card.overviewReport': 'Overview Report', - 'dashboard.analysis.card.financialMetrics': 'Financial Metrics', - 'dashboard.analysis.card.fundamentalReport': 'Fundamental Analysis Report', - 'dashboard.analysis.card.technicalIndicators': 'Technical Indicators', - 'dashboard.analysis.card.technicalReport': 'Technical Analysis Report', - 'dashboard.analysis.card.newsList': 'Related News', - 'dashboard.analysis.card.newsReport': 'News Analysis Report', - 'dashboard.analysis.card.sentimentIndicators': 'Sentiment Indicators', - 'dashboard.analysis.card.sentimentReport': 'Sentiment Analysis Report', - 'dashboard.analysis.card.riskMetrics': 'Risk Metrics', - 'dashboard.analysis.card.riskReport': 'Risk Assessment Report', - 'dashboard.analysis.card.bullView': 'Bullish View (Bull)', - 'dashboard.analysis.card.bearView': 'Bearish View (Bear)', - 'dashboard.analysis.card.researchConclusion': 'Researcher Conclusion', - 'dashboard.analysis.card.traderPlan': 'Trader Plan', - 'dashboard.analysis.card.riskDebate': 'Risk Committee Debate', - 'dashboard.analysis.card.finalDecision': 'Final Decision', - 'dashboard.analysis.card.tradePlanDetail': 'Trading Plan Details', - 'dashboard.analysis.tradingPlan.entry_price': 'Entry Price', - 'dashboard.analysis.tradingPlan.position_size': 'Position Size', - 'dashboard.analysis.tradingPlan.stop_loss': 'Stop Loss', - 'dashboard.analysis.tradingPlan.take_profit': 'Take Profit', - 'dashboard.analysis.label.confidence': 'Confidence', - 'dashboard.analysis.label.keyPoints': 'Key Points', - 'dashboard.analysis.label.riskWarning': 'Risk Warning', - 'dashboard.analysis.risk.risky': 'Aggressive View (Risky)', - 'dashboard.analysis.risk.neutral': 'Neutral View (Neutral)', - 'dashboard.analysis.risk.safe': 'Conservative View (Safe)', - 'dashboard.analysis.risk.conclusion': 'Conclusion', - 'dashboard.analysis.feature.fundamental': 'Fundamental Analysis', - 'dashboard.analysis.feature.technical': 'Technical Analysis', - 'dashboard.analysis.feature.news': 'News Analysis', - 'dashboard.analysis.feature.sentiment': 'Sentiment Analysis', - 'dashboard.analysis.feature.risk': 'Risk Assessment', - 'dashboard.analysis.watchlist.title': 'My Watchlist', - 'dashboard.analysis.watchlist.add': 'Add', - 'dashboard.analysis.watchlist.addStock': 'Add Stock', - 'dashboard.analysis.modal.addStock.title': 'Add to Watchlist', - 'dashboard.analysis.modal.addStock.confirm': 'Confirm', - 'dashboard.analysis.modal.addStock.cancel': 'Cancel', - 'dashboard.analysis.modal.addStock.market': 'Market Type', - 'dashboard.analysis.modal.addStock.marketPlaceholder': 'Please select market', - 'dashboard.analysis.modal.addStock.marketRequired': 'Please select market type', - 'dashboard.analysis.modal.addStock.symbol': 'Symbol', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': 'e.g.: AAPL, TSLA, GOOGL, 000001, BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': 'Please enter symbol code', - 'dashboard.analysis.modal.addStock.searchPlaceholder': 'Search symbol code or name', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': 'Search or enter symbol code (e.g.: AAPL, BTC/USDT, EUR/USD)', - 'dashboard.analysis.modal.addStock.searchOrInputHint': 'Search in database or enter code directly (name will be fetched automatically)', - 'dashboard.analysis.modal.addStock.search': 'Search', - 'dashboard.analysis.modal.addStock.searchResults': 'Search Results', - 'dashboard.analysis.modal.addStock.hotSymbols': 'Hot Symbols', - 'dashboard.analysis.modal.addStock.noHotSymbols': 'No hot symbols available', - 'dashboard.analysis.modal.addStock.selectedSymbol': 'Selected Symbol', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': 'Please select a symbol first', - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': 'Please select a symbol or enter symbol code', - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': 'Please enter symbol code', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': 'Please select market type first', - 'dashboard.analysis.modal.addStock.searchFailed': 'Search failed, please try again later', - 'dashboard.analysis.modal.addStock.noSearchResults': 'No matching symbols found', - 'dashboard.analysis.modal.addStock.willAutoFetchName': 'Name will be fetched automatically', - 'dashboard.analysis.modal.addStock.addDirectly': 'Add Directly', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': 'Name will be fetched automatically when adding', - 'dashboard.analysis.market.AShare': 'A-Share', - 'dashboard.analysis.market.USStock': 'US Stock', - 'dashboard.analysis.market.HShare': 'H-Share', - 'dashboard.analysis.market.Crypto': 'Cryptocurrency', - 'dashboard.analysis.market.Forex': 'Forex', - 'dashboard.analysis.market.Futures': 'Futures', - 'dashboard.analysis.modal.history.title': 'Analysis History', - 'dashboard.analysis.modal.history.viewResult': 'View Result', - 'dashboard.analysis.modal.history.completeTime': 'Complete Time', - 'dashboard.analysis.modal.history.error': 'Error', - 'dashboard.analysis.status.pending': 'Pending', - 'dashboard.analysis.status.processing': 'Processing', - 'dashboard.analysis.status.completed': 'Completed', - 'dashboard.analysis.status.failed': 'Failed', - 'dashboard.analysis.message.selectSymbol': 'Please select a symbol first', - 'dashboard.analysis.message.taskCreated': 'Analysis task created, executing in background...', - 'dashboard.analysis.message.analysisComplete': 'Analysis Complete', - 'dashboard.analysis.message.analysisCompleteCache': 'Analysis Complete (Using Cache)', - 'dashboard.analysis.message.analysisFailed': 'Analysis failed, please try again later', - 'dashboard.analysis.message.addStockSuccess': 'Added successfully', - 'dashboard.analysis.message.addStockFailed': 'Failed to add', - 'dashboard.analysis.message.removeStockSuccess': 'Removed successfully', - 'dashboard.analysis.message.removeStockFailed': 'Failed to remove', - 'dashboard.analysis.message.resumingAnalysis': 'Resuming analysis task...', - 'dashboard.analysis.message.deleteSuccess': 'Deleted successfully', - 'dashboard.analysis.message.deleteFailed': 'Failed to delete', - 'dashboard.analysis.modal.history.delete': 'Delete', - 'dashboard.analysis.modal.history.deleteConfirm': 'Are you sure you want to delete this analysis record?', - 'dashboard.analysis.test': 'Gongzhuan No.{no} shop', - 'dashboard.analysis.introduce': 'Introduce', - 'dashboard.analysis.total-sales': 'Total Sales', - 'dashboard.analysis.day-sales': 'Daily Sales', - 'dashboard.analysis.visits': 'Visits', - 'dashboard.analysis.visits-trend': 'Visits Trend', - 'dashboard.analysis.visits-ranking': 'Visits Ranking', - 'dashboard.analysis.day-visits': 'Daily Visits', - 'dashboard.analysis.week': 'WoW Change', - 'dashboard.analysis.day': 'DoD Change', - 'dashboard.analysis.payments': 'Payments', - 'dashboard.analysis.conversion-rate': 'Conversion Rate', - 'dashboard.analysis.operational-effect': 'Operational Effect', - 'dashboard.analysis.sales-trend': 'Stores Sales Trend', - 'dashboard.analysis.sales-ranking': 'Sales Ranking', - 'dashboard.analysis.all-year': 'All Year', - 'dashboard.analysis.all-month': 'All Month', - 'dashboard.analysis.all-week': 'All Week', - 'dashboard.analysis.all-day': 'All day', - 'dashboard.analysis.search-users': 'Search Users', - 'dashboard.analysis.per-capita-search': 'Per Capita Search', - 'dashboard.analysis.online-top-search': 'Online Top Search', - 'dashboard.analysis.the-proportion-of-sales': 'The Proportion Of Sales', - 'dashboard.analysis.dropdown-option-one': 'Operation one', - 'dashboard.analysis.dropdown-option-two': 'Operation two', - 'dashboard.analysis.channel.all': 'ALL', - 'dashboard.analysis.channel.online': 'Online', - 'dashboard.analysis.channel.stores': 'Stores', - 'dashboard.analysis.sales': 'Sales', - 'dashboard.analysis.traffic': 'Traffic', - 'dashboard.analysis.table.rank': 'Rank', - 'dashboard.analysis.table.search-keyword': 'Keyword', - 'dashboard.analysis.table.users': 'Users', - 'dashboard.analysis.table.weekly-range': 'Weekly Range', - 'dashboard.indicator.selectSymbol': 'Select or enter symbol code', - 'dashboard.indicator.emptyWatchlistHint': 'No watchlist, please add first', - 'dashboard.indicator.hint.selectSymbol': 'Please select a symbol to start analysis', - 'dashboard.indicator.hint.selectSymbolDesc': 'Select or enter stock code in the search box above to view K-line chart and technical indicators', - 'dashboard.indicator.retry': 'Retry', - 'dashboard.indicator.panel.title': 'Technical Indicators', - 'dashboard.indicator.panel.realtimeOn': 'Turn off real-time update', - 'dashboard.indicator.panel.realtimeOff': 'Turn on real-time update', - 'dashboard.indicator.panel.themeLight': 'Switch to dark theme', - 'dashboard.indicator.panel.themeDark': 'Switch to light theme', - 'dashboard.indicator.section.enabled': 'Enabled', - 'dashboard.indicator.section.added': 'My Added Indicators', - 'dashboard.indicator.section.custom': 'My Created Indicators', - 'dashboard.indicator.section.bought': 'Purchased Indicators', - 'dashboard.indicator.section.myCreated': 'My Created Indicators', - 'dashboard.indicator.empty': 'No indicators, please add or create indicators first', - 'dashboard.indicator.buy': 'Buy Indicators', - 'dashboard.indicator.action.start': 'Start', - 'dashboard.indicator.action.stop': 'Stop', - 'dashboard.indicator.action.edit': 'Edit', - 'dashboard.indicator.action.delete': 'Delete', - 'dashboard.indicator.action.backtest': 'Backtest', - 'dashboard.indicator.status.normal': 'Active', - 'dashboard.indicator.status.normalPermanent': 'Active (Permanent)', - 'dashboard.indicator.status.expired': 'Expired', - 'dashboard.indicator.expiry.permanent': 'Permanent', - 'dashboard.indicator.expiry.noExpiry': 'No expiration', - 'dashboard.indicator.expiry.expired': 'Expired: {date}', - 'dashboard.indicator.expiry.expiresOn': 'Expires: {date}', - 'dashboard.indicator.delete.confirmTitle': 'Confirm Deletion', - 'dashboard.indicator.delete.confirmContent': 'Are you sure you want to delete indicator "{name}"? This action cannot be undone.', - 'dashboard.indicator.delete.confirmOk': 'Delete', - 'dashboard.indicator.delete.confirmCancel': 'Cancel', - 'dashboard.indicator.delete.success': 'Deleted successfully', - 'dashboard.indicator.delete.failed': 'Failed to delete', - 'dashboard.indicator.save.success': 'Saved successfully', - 'dashboard.indicator.save.failed': 'Failed to save', - 'dashboard.indicator.error.loadWatchlistFailed': 'Failed to load watchlist', - 'dashboard.indicator.error.chartNotReady': 'Chart component not initialized, please select a symbol and wait for the chart to load', - 'dashboard.indicator.error.chartMethodNotReady': 'Chart component method not ready, please try again later', - 'dashboard.indicator.error.chartExecuteNotReady': 'Chart component execute method not ready, please try again later', - 'dashboard.indicator.error.parseFailed': 'Failed to parse Python code', - 'dashboard.indicator.error.parseFailedCheck': 'Failed to parse Python code, please check the code format', - 'dashboard.indicator.error.addIndicatorFailed': 'Failed to add indicator', - 'dashboard.indicator.error.runIndicatorFailed': 'Failed to run indicator', - 'dashboard.indicator.error.pleaseLogin': 'Please login first', - 'dashboard.indicator.error.loadDataFailed': 'Failed to load data', - 'dashboard.indicator.error.loadDataFailedDesc': 'Please check network connection', - 'dashboard.indicator.error.tiingoSubscription': 'Forex 1-minute data requires Tiingo paid subscription. Please use other timeframes or upgrade your subscription.', - 'dashboard.indicator.error.pythonEngineFailed': 'Python engine failed to load, indicator functionality may be unavailable', - 'dashboard.indicator.error.chartInitFailed': 'Chart initialization failed', - 'dashboard.indicator.warning.enterCode': 'Please enter indicator code first', - 'dashboard.indicator.warning.chartNotInitialized': 'Chart not initialized, cannot use drawing tools', - 'dashboard.indicator.warning.pyodideLoadFailed': 'Python Engine Load Failed', - 'dashboard.indicator.warning.pyodideLoadFailedDesc': 'Your current region or network environment cannot use this feature', - 'dashboard.indicator.success.runIndicator': 'Indicator ran successfully', - 'dashboard.indicator.success.clearDrawings': 'All drawings cleared', - 'dashboard.indicator.sma': 'SMA (Moving Average Group)', - 'dashboard.indicator.ema': 'EMA (Exponential Moving Average Group)', - 'dashboard.indicator.rsi': 'RSI (Relative Strength Index)', - 'dashboard.indicator.macd': 'MACD', - 'dashboard.indicator.bb': 'Bollinger Bands', - 'dashboard.indicator.atr': 'ATR (Average True Range)', - 'dashboard.indicator.cci': 'CCI (Commodity Channel Index)', - 'dashboard.indicator.williams': 'Williams %R', - 'dashboard.indicator.mfi': 'MFI (Money Flow Index)', - 'dashboard.indicator.adx': 'ADX (Average Directional Index)', - 'dashboard.indicator.obv': 'OBV (On Balance Volume)', - 'dashboard.indicator.adosc': 'ADOSC (Accumulation/Distribution Oscillator)', - 'dashboard.indicator.ad': 'AD (Accumulation/Distribution Line)', - 'dashboard.indicator.kdj': 'KDJ (Stochastic Indicator)', - 'dashboard.indicator.signal.buy': 'BUY', - 'dashboard.indicator.signal.sell': 'SELL', - 'dashboard.indicator.signal.supertrendBuy': 'SuperTrend Buy', - 'dashboard.indicator.signal.supertrendSell': 'SuperTrend Sell', - 'dashboard.indicator.chart.kline': 'K-Line', - 'dashboard.indicator.chart.volume': 'Volume', - 'dashboard.indicator.chart.uptrend': 'Up Trend', - 'dashboard.indicator.chart.downtrend': 'Down Trend', - 'dashboard.indicator.tooltip.time': 'Time', - 'dashboard.indicator.tooltip.open': 'O', - 'dashboard.indicator.tooltip.close': 'C', - 'dashboard.indicator.tooltip.high': 'H', - 'dashboard.indicator.tooltip.low': 'L', - 'dashboard.indicator.tooltip.volume': 'Volume', - 'dashboard.indicator.drawing.line': 'Line', - 'dashboard.indicator.drawing.horizontalLine': 'Horizontal Line', - 'dashboard.indicator.drawing.verticalLine': 'Vertical Line', - 'dashboard.indicator.drawing.ray': 'Ray', - 'dashboard.indicator.drawing.straightLine': 'Straight Line', - 'dashboard.indicator.drawing.parallelLine': 'Parallel Line', - 'dashboard.indicator.drawing.priceLine': 'Price Line', - 'dashboard.indicator.drawing.priceChannel': 'Price Channel', - 'dashboard.indicator.drawing.fibonacciLine': 'Fibonacci Line', - 'dashboard.indicator.drawing.clearAll': 'Clear All Drawings', - 'dashboard.indicator.market.AShare': 'A-Share', - 'dashboard.indicator.market.USStock': 'US Stock', - 'dashboard.indicator.market.HShare': 'H-Share', - 'dashboard.indicator.market.Crypto': 'Cryptocurrency', - 'dashboard.indicator.market.Forex': 'Forex', - 'dashboard.indicator.market.Futures': 'Futures', - 'dashboard.indicator.create': 'Create Indicator', - 'dashboard.indicator.editor.title': 'Create/Edit Indicator', - 'dashboard.indicator.editor.name': 'Indicator Name', - 'dashboard.indicator.editor.nameRequired': 'Please enter indicator name', - 'dashboard.indicator.editor.namePlaceholder': 'Enter indicator name', - 'dashboard.indicator.editor.description': 'Description', - 'dashboard.indicator.editor.descriptionPlaceholder': 'Enter description (optional)', - 'dashboard.indicator.editor.code': 'Python Code', - 'dashboard.indicator.editor.codeRequired': 'Please enter indicator code', - 'dashboard.indicator.editor.codePlaceholder': 'Enter Python code', - 'dashboard.indicator.editor.run': 'Run', - 'dashboard.indicator.editor.runHint': 'Click Run button to preview indicator on K-line chart', - 'dashboard.indicator.editor.guide': 'Development Guide', - 'dashboard.indicator.editor.guideTitle': 'Python Indicator Development Guide', - 'dashboard.indicator.editor.save': 'Save', - 'dashboard.indicator.editor.cancel': 'Cancel', - 'dashboard.indicator.editor.unnamed': 'Unnamed Indicator', - 'dashboard.indicator.editor.publishToCommunity': 'Publish to Community', - 'dashboard.indicator.editor.publishToCommunityHint': 'After publishing, other users can view and use your indicator in the community', - 'dashboard.indicator.editor.indicatorType': 'Indicator Type', - 'dashboard.indicator.editor.indicatorTypeRequired': 'Please select indicator type', - 'dashboard.indicator.editor.indicatorTypePlaceholder': 'Please select indicator type', - 'dashboard.indicator.editor.previewImage': 'Preview Image', - 'dashboard.indicator.editor.uploadImage': 'Upload Image', - 'dashboard.indicator.editor.previewImageHint': 'Recommended size: 800x400, max 2MB', - 'dashboard.indicator.editor.pricing': 'Pricing (QDT)', - 'dashboard.indicator.editor.pricingType.free': 'Free', - 'dashboard.indicator.editor.pricingType.permanent': 'Permanent', - 'dashboard.indicator.editor.pricingType.monthly': 'Monthly', - 'dashboard.indicator.editor.price': 'Price', - 'dashboard.indicator.editor.priceRequired': 'Please enter price', - 'dashboard.indicator.editor.pricePlaceholder': 'Please enter price', - 'dashboard.indicator.editor.pricingHint': 'Free indicators (price 0) will still receive platform rewards based on usage and ratings (QDT)', - 'dashboard.indicator.editor.aiGenerate': 'AI Generate', - 'dashboard.indicator.editor.aiPromptPlaceholder': 'Describe your signal logic (buy/sell only) and plots. Position sizing, risk, scaling, fees/slippage are configured in backtest.', - 'dashboard.indicator.boundary.message': 'Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.', - 'dashboard.indicator.boundary.indicatorRule': "Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.", - 'dashboard.indicator.boundary.backtestRule': 'Rule: If a bar has a main signal (buy/sell → open/close/reverse), scaling in/out is skipped on the same bar.', - 'dashboard.indicator.editor.aiGenerateBtn': 'AI Generate Code', - 'dashboard.indicator.editor.aiPromptRequired': 'Please enter your idea', - 'dashboard.indicator.editor.aiGenerateSuccess': 'Code generated successfully', - 'dashboard.indicator.editor.aiGenerateError': 'Code generation failed, please try again later', - 'dashboard.indicator.editor.verifyCode': 'Verify Code', - 'dashboard.indicator.editor.verifyCodeSuccess': 'Verification Passed', - 'dashboard.indicator.editor.verifyCodeFailed': 'Verification Failed', - 'dashboard.indicator.editor.verifyCodeEmpty': 'Code cannot be empty', - 'dashboard.indicator.guide.title': 'Python Indicator & Strategy Development Guide', - 'dashboard.indicator.guide.intro': 'This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.', - 'dashboard.indicator.guide.section1.title': '1. Runtime Environment & Predefined Variables', - 'dashboard.indicator.guide.section1.env': 'Your code runs in a browser-based Python environment (Pyodide).', - 'dashboard.indicator.guide.section1.libs': 'Pre-installed Libraries', - 'dashboard.indicator.guide.section1.libsDesc': 'The following libraries are imported by default, no need to import again:', - 'dashboard.indicator.guide.section1.libsList': 'pandas (pd), numpy (np), math, json', - 'dashboard.indicator.guide.section1.data': 'Input Data: df', - 'dashboard.indicator.guide.section1.dataDesc': 'The system automatically converts current K-line data into a Pandas DataFrame object, variable name is df.', - 'dashboard.indicator.guide.section1.dataColumns': 'df contains the following columns (all float type):', - 'dashboard.indicator.guide.section1.dataColumnsList': 'time (timestamp, seconds), open, high, low, close, volume', - 'dashboard.indicator.guide.section1.dataNote': 'Data index is arranged from old to new (0 is the earliest data, last row is the latest data).', - 'dashboard.indicator.guide.section1.dataIndex': 'Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using .values which loses the index.', - 'dashboard.indicator.guide.section2.title': '2. Parameter Definition', - 'dashboard.indicator.guide.section2.desc': 'You can define variables as parameters at the beginning of your code. The system will try to parse statements like variable = value as adjustable parameters.', - 'dashboard.indicator.guide.section2.example': 'Parameter Example', - 'dashboard.indicator.guide.section2.exampleCode': 'span = 20 or multiplier = 2.0', - 'dashboard.indicator.guide.section3.title': '3. Backtest Signal Setup (Important!)', - 'dashboard.indicator.guide.section3.desc': 'If you want your indicator to support backtesting, you must set the following two columns in your code:', - 'dashboard.indicator.guide.section3.backtestRequired': 'Required for Backtesting:', - 'dashboard.indicator.guide.section3.backtestBuySignal': "df['buy_signal'] - Boolean Series, True indicates buy signal", - 'dashboard.indicator.guide.section3.backtestSellSignal': "df['sell_signal'] - Boolean Series, True indicates sell signal", - 'dashboard.indicator.guide.section3.backtestExample': 'Example:', - 'dashboard.indicator.guide.section3.backtestExampleCode': "df['buy_signal'] = condition_buy
    df['sell_signal'] = condition_sell", - 'dashboard.indicator.guide.section3.backtestNote': 'Note: Even if you only set output.signals for chart display, you must set these two columns to enable backtesting.', - 'dashboard.indicator.guide.section4.title': '4. Output Requirements: output', - 'dashboard.indicator.guide.section4.desc': 'At the end of code execution, you must define a dictionary named output to tell the chart how to display results.', - 'dashboard.indicator.guide.section4.fields': 'The output dictionary contains the following fields:', - 'dashboard.indicator.guide.section4.plots': 'plots - For drawing lines (e.g., moving averages, RSI)', - 'dashboard.indicator.guide.section4.signals': 'signals - For marking buy/sell signals (e.g., arrows, labels)', - 'dashboard.indicator.guide.section4.name': 'name - Indicator name (optional)', - 'dashboard.indicator.guide.section4.calculatedVars': 'calculatedVars - Calculated variables (optional, for displaying additional information)', - 'dashboard.indicator.guide.section5.title': '5. Plot Configuration (Plots)', - 'dashboard.indicator.guide.section5.desc': 'Each object in the plots list represents a line.', - 'dashboard.indicator.guide.section5.table.field': 'Field', - 'dashboard.indicator.guide.section5.table.type': 'Type', - 'dashboard.indicator.guide.section5.table.required': 'Required', - 'dashboard.indicator.guide.section5.table.requiredYes': 'Yes', - 'dashboard.indicator.guide.section5.table.requiredNo': 'No', - 'dashboard.indicator.guide.section5.table.desc': 'Description', - 'dashboard.indicator.guide.section5.table.name': 'The name of the indicator line, displayed in the legend', - 'dashboard.indicator.guide.section5.table.data': 'Data list, length must match the number of rows in df. Recommended to use series.tolist()', - 'dashboard.indicator.guide.section5.table.color': "Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign", - 'dashboard.indicator.guide.section5.table.typeDesc': "Chart type, default is 'line'", - 'dashboard.indicator.guide.section5.table.overlay': 'Important. True means display on main chart (with K-line), False means display on sub-chart (independent area)', - 'dashboard.indicator.guide.section5.example': 'Example: Draw Simple Moving Average (SMA)', - 'dashboard.indicator.guide.section5.exampleCalc': 'Calculate SMA', - 'dashboard.indicator.guide.section5.exampleOutput': 'Construct Output', - 'dashboard.indicator.guide.section5.exampleOverlay': 'Display on main chart', - 'dashboard.indicator.guide.section6.title': '6. Signal Markers (Signals)', - 'dashboard.indicator.guide.section6.desc': "signals are used to mark buy/sell points on specific K-lines through icons or text. Note: This is only for chart display. The backtest system uses df['buy_signal'] and df['sell_signal'].", - 'dashboard.indicator.guide.section6.table.type': "Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)", - 'dashboard.indicator.guide.section6.table.data': 'Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions', - 'dashboard.indicator.guide.section6.table.text': 'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")', - 'dashboard.indicator.guide.section6.table.color': 'Marker color', - 'dashboard.indicator.guide.section6.hint': 'The system automatically handles positioning.', - 'dashboard.indicator.guide.section6.buy': 'Markers will be automatically positioned below the Low of the current K-line', - 'dashboard.indicator.guide.section6.sell': 'Markers will be automatically positioned above the High of the current K-line', - 'dashboard.indicator.guide.section6.example': 'Example: Draw Buy/Sell Signals', - 'dashboard.indicator.guide.section6.exampleInit': 'Initialize signal list, fill all with None', - 'dashboard.indicator.guide.section6.exampleLogic': 'Simple logic: mark buy when close price is greater than open price', - 'dashboard.indicator.guide.section6.exampleNote': 'In actual logic, please use loops or vectorized operations', - 'dashboard.indicator.guide.section6.examplePrice': 'Record price', - 'dashboard.indicator.guide.section6.exampleText': 'Buy', - 'dashboard.indicator.guide.section7.title': '7. Complete Code Examples', - 'dashboard.indicator.guide.section7.exampleA': 'Example A: Dual EMA Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleACode': "# 1. Calculate indicators
    df['ema_fast'] = df['close'].ewm(span=5, adjust=False).mean()
    df['ema_slow'] = df['close'].ewm(span=13, adjust=False).mean()

    # 2. Calculate crossover signals
    cross_up = (df['ema_fast'] > df['ema_slow']) & (df['ema_fast'].shift(1) <= df['ema_slow'].shift(1))
    cross_down = (df['ema_fast'] < df['ema_slow']) & (df['ema_fast'].shift(1) >= df['ema_slow'].shift(1))

    # 3. 【Important】Set NEW backtest signal columns (bool)
    df['open_long'] = cross_up
    df['close_long'] = cross_down
    df['open_short'] = cross_down
    df['close_short'] = cross_up

    # 4. Generate signal data for chart display
    buy_signals = [df['low'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]

    # 5. Build output
    output = {
    \"name\": \"Dual EMA Strategy\",
    \"plots\": [
    {\"name\": \"EMA 5\", \"data\": df['ema_fast'].tolist(), \"color\": \"#FF6B6B\", \"overlay\": True},
    {\"name\": \"EMA 13\", \"data\": df['ema_slow'].tolist(), \"color\": \"#4ECDC4\", \"overlay\": True}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleB': 'Example B: Bollinger Bands - Chart Display Only', - 'dashboard.indicator.guide.section7.exampleBCode': "# Calculate Bollinger Bands (chart display only, no backtesting)
    length = 20
    mult = 2.0
    df['sma'] = df['close'].rolling(length).mean()
    df['std'] = df['close'].rolling(length).std()
    df['upper'] = df['sma'] + mult * df['std']
    df['lower'] = df['sma'] - mult * df['std']

    output = {
    \"name\": \"Bollinger Bands\",
    \"plots\": [
    {\"name\": \"Upper\", \"data\": df['upper'].tolist(), \"color\": \"#FF5252\", \"overlay\": True},
    {\"name\": \"Middle\", \"data\": df['sma'].tolist(), \"color\": \"#2196F3\", \"overlay\": True},
    {\"name\": \"Lower\", \"data\": df['lower'].tolist(), \"color\": \"#00E676\", \"overlay\": True}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleC': 'Example C: RSI Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleCCode': "# Calculate RSI
    delta = df['close'].diff()
    up = delta.clip(lower=0)
    down = -1 * delta.clip(upper=0)
    ema_up = up.ewm(com=13, adjust=False).mean()
    ema_down = down.ewm(com=13, adjust=False).mean()
    rs = ema_up / ema_down
    df['rsi'] = 100 - (100 / (1 + rs))

    # Generate trading signals
    buy_condition = df['rsi'] < 30 # Oversold buy
    sell_condition = df['rsi'] > 70 # Overbought sell

    # 【Important】Set NEW backtest signal columns (bool)
    df['open_long'] = buy_condition
    df['close_long'] = sell_condition
    df['open_short'] = sell_condition
    df['close_short'] = buy_condition

    # Generate chart signals
    buy_signals = [df['low'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]

    output = {
    \"name\": \"RSI Strategy\",
    \"plots\": [
    {\"name\": \"RSI\", \"data\": df['rsi'].tolist(), \"color\": \"#9C27B0\", \"overlay\": False},
    {\"name\": \"Overbought\", \"data\": [70] * len(df), \"color\": \"#FF5252\", \"style\": \"dashed\", \"overlay\": False},
    {\"name\": \"Oversold\", \"data\": [30] * len(df), \"color\": \"#00E676\", \"style\": \"dashed\", \"overlay\": False}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section6.param': 'Parameters', - 'dashboard.indicator.guide.section6.calc': 'Calculate', - 'dashboard.indicator.guide.section6.output': 'Output', - 'dashboard.indicator.guide.section6.generate': 'Generate signal data (initialize with None)', - 'dashboard.indicator.guide.section6.subchart': 'Display on sub-chart', - 'dashboard.indicator.guide.section8.title': '8. Frequently Asked Questions (FAQ)', - 'dashboard.indicator.guide.section8.q1': "Q: Why can't my indicator be backtested?", - 'dashboard.indicator.guide.section8.a1': "A: The backtest system requires NEW signal columns: df['open_long'], df['close_long'], df['open_short'], df['close_short'] (boolean). Even if you set output.signals for chart display, you must set these columns to enable backtesting.", - 'dashboard.indicator.guide.section8.q2': 'Q: Data length mismatch?', - 'dashboard.indicator.guide.section8.a2': "A: The data list in plots and signals must have exactly the same length as the K-line data. If you use df['xxx'].tolist(), there is usually no problem.", - 'dashboard.indicator.guide.section8.q3': 'Q: How to handle NaN (empty values)?', - 'dashboard.indicator.guide.section8.a3': "A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use df.fillna(0) or other methods.", - 'dashboard.indicator.guide.section8.q4': 'Q: Index mismatch causing all signals to be NaN?', - 'dashboard.indicator.guide.section8.a4': "A: Please ensure you preserve the original df index (timestamp). Avoid using .values to create new Series. Use columns directly like df['close'] for operations.", - 'dashboard.indicator.guide.section8.q5': 'Q: Can I use third-party network libraries?', - 'dashboard.indicator.guide.section8.a5': 'A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.', - 'dashboard.indicator.guide.section8.q6': 'Q: How to debug code?', - 'dashboard.indicator.guide.section8.a6': 'A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.', - 'dashboard.indicator.guide.section8.q7': 'Q: Backtest shows 0 signals?', - 'dashboard.indicator.guide.section8.a7': "A: Please check the data type of df['open_long']/df['close_long']/df['open_short']/df['close_short']. They should be boolean (True/False), not numeric. Use condition.fillna(False).astype(bool) to ensure correct type.", - 'dashboard.indicator.backtest.title': 'Indicator Backtest', - 'dashboard.indicator.backtest.config': 'Backtest Parameters', - 'dashboard.indicator.backtest.startDate': 'Start Date', - 'dashboard.indicator.backtest.endDate': 'End Date', - 'dashboard.indicator.backtest.selectStartDate': 'Select start date', - 'dashboard.indicator.backtest.selectEndDate': 'Select end date', - 'dashboard.indicator.backtest.startDateRequired': 'Please select start date', - 'dashboard.indicator.backtest.endDateRequired': 'Please select end date', - 'dashboard.indicator.backtest.initialCapital': 'Initial Capital', - 'dashboard.indicator.backtest.initialCapitalRequired': 'Please enter initial capital', - 'dashboard.indicator.backtest.commission': 'Commission Rate (%)', - 'dashboard.indicator.backtest.commissionHint': 'Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.', - 'dashboard.indicator.backtest.leverage': 'Leverage', - 'dashboard.indicator.backtest.timeframe': 'Timeframe', - 'dashboard.indicator.backtest.tradeDirection': 'Trade Direction', - 'dashboard.indicator.backtest.longOnly': 'Long Only', - 'dashboard.indicator.backtest.shortOnly': 'Short Only', - 'dashboard.indicator.backtest.both': 'Both', - 'dashboard.indicator.backtest.run': 'Run Backtest', - 'dashboard.indicator.backtest.rerun': 'Run Again', - 'dashboard.indicator.backtest.close': 'Close', - 'dashboard.indicator.backtest.running': 'Running indicator backtest...', - 'dashboard.indicator.backtest.loadingTip1': 'Fetching historical K-line data...', - 'dashboard.indicator.backtest.loadingTip2': 'Executing strategy signal calculation...', - 'dashboard.indicator.backtest.loadingTip3': 'Simulating trade execution...', - 'dashboard.indicator.backtest.loadingTip4': 'Calculating backtest metrics...', - 'dashboard.indicator.backtest.loadingTip5': 'Almost done, please wait...', - 'dashboard.indicator.backtest.results': 'Backtest Results', - 'dashboard.indicator.backtest.totalReturn': 'Total Return', - 'dashboard.indicator.backtest.annualReturn': 'Annual Return', - 'dashboard.indicator.backtest.maxDrawdown': 'Max Drawdown', - 'dashboard.indicator.backtest.sharpeRatio': 'Sharpe Ratio', - 'dashboard.indicator.backtest.winRate': 'Win Rate', - 'dashboard.indicator.backtest.profitFactor': 'Profit Factor', - 'dashboard.indicator.backtest.totalTrades': 'Total Trades', - 'dashboard.indicator.totalReturn': 'Total Return', - 'dashboard.indicator.annualReturn': 'Annual Return', - 'dashboard.indicator.maxDrawdown': 'Max Drawdown', - 'dashboard.indicator.sharpeRatio': 'Sharpe Ratio', - 'dashboard.indicator.winRate': 'Win Rate', - 'dashboard.indicator.profitFactor': 'Profit Factor', - 'dashboard.indicator.totalTrades': 'Total Trades', - 'dashboard.indicator.backtest.totalCommission': 'Total Commission', - 'dashboard.indicator.backtest.equityCurve': 'Equity Curve', - 'dashboard.indicator.backtest.strategy': 'Indicator', - 'dashboard.indicator.backtest.benchmark': 'Benchmark', - 'dashboard.indicator.backtest.tradeHistory': 'Trade History', - 'dashboard.indicator.backtest.tradeTime': 'Time', - 'dashboard.indicator.backtest.tradeType': 'Type', - 'dashboard.indicator.backtest.buy': 'Buy', - 'dashboard.indicator.backtest.sell': 'Sell', - 'dashboard.indicator.backtest.liquidation': 'Liquidation', - 'dashboard.indicator.backtest.openLong': 'Open Long', - 'dashboard.indicator.backtest.closeLong': 'Close Long', - 'dashboard.indicator.backtest.closeLongStop': 'Close Long (Stop Loss)', - 'dashboard.indicator.backtest.closeLongProfit': 'Close Long (Take Profit)', - 'dashboard.indicator.backtest.addLong': 'Add Long', - 'dashboard.indicator.backtest.openShort': 'Open Short', - 'dashboard.indicator.backtest.closeShort': 'Close Short', - 'dashboard.indicator.backtest.closeShortStop': 'Close Short (Stop Loss)', - 'dashboard.indicator.backtest.closeShortProfit': 'Close Short (Take Profit)', - 'dashboard.indicator.backtest.addShort': 'Add Short', - 'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)', - 'dashboard.indicator.backtest.reduceLong': 'Reduce Long', - 'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)', - 'dashboard.indicator.backtest.reduceShort': 'Reduce Short', - 'dashboard.indicator.backtest.price': 'Price', - 'dashboard.indicator.backtest.amount': 'Amount', - 'dashboard.indicator.backtest.balance': 'Balance', - 'dashboard.indicator.backtest.profit': 'P&L', - 'dashboard.indicator.backtest.success': 'Backtest completed', - 'dashboard.indicator.backtest.failed': 'Backtest failed, please try again later', - 'dashboard.indicator.backtest.quickSelect': 'Quick Select', - // Multi-timeframe backtest precision hints - 'dashboard.indicator.backtest.precisionMode': 'Backtest Precision Mode', - 'dashboard.indicator.backtest.estimatedCandles': 'Est. {count} candles to process', - 'dashboard.indicator.backtest.highPrecisionDesc': 'Using 1-minute candles for high-precision backtest, stop-loss/take-profit triggers are more accurate', - 'dashboard.indicator.backtest.mediumPrecisionDesc': 'Range exceeds 30 days, using 5-minute candles to balance precision and performance', - 'dashboard.indicator.backtest.standardModeWarning': 'Using Standard Backtest Mode', - 'dashboard.indicator.backtest.standardModeDesc': 'Current config does not support high-precision backtest, using strategy timeframe', - 'dashboard.indicator.backtest.onlyCryptoSupported': 'High-precision backtest only supports cryptocurrency market', - 'dashboard.indicator.backtest.noIndicatorCode': 'This indicator has no backtestable code', - 'dashboard.indicator.backtest.noSymbol': 'Please select a trading symbol first', - 'dashboard.indicator.backtest.dateRangeExceeded': 'Backtest date range exceeded: {timeframe} timeframe allows max {maxRange}', - 'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)', - 'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}', - 'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}', - 'dashboard.indicator.backtest.historyTitle': 'Backtest History', - 'dashboard.indicator.backtest.historyRefresh': 'Refresh', - 'dashboard.indicator.backtest.historyView': 'View', - 'dashboard.indicator.backtest.historyNoData': 'No backtest history', - 'dashboard.indicator.backtest.historyUseCurrent': 'Only current symbol/timeframe', - 'dashboard.indicator.backtest.historyFilterSymbol': 'Symbol', - 'dashboard.indicator.backtest.historyFilterTimeframe': 'Timeframe', - 'dashboard.indicator.backtest.historyApply': 'Apply filters', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AI Analyze', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI Suggestions', - 'dashboard.indicator.backtest.historyNoAIResult': 'No AI analysis result', - 'dashboard.indicator.backtest.historyRunId': 'Run ID', - 'dashboard.indicator.backtest.historyCreatedAt': 'Time', - 'dashboard.indicator.backtest.historyRange': 'Range', - 'dashboard.indicator.backtest.historyStatus': 'Status', - 'dashboard.indicator.backtest.historyStatusSuccess': 'Success', - 'dashboard.indicator.backtest.historyStatusFailed': 'Failed', - 'dashboard.indicator.backtest.historyActions': 'Actions', - 'dashboard.indicator.backtest.prev': 'Previous', - 'dashboard.indicator.backtest.next': 'Next', - 'dashboard.indicator.backtest.steps.strategy.title': 'Execution Config', - 'dashboard.indicator.backtest.steps.strategy.desc': 'Position, risk, scaling', - 'dashboard.indicator.backtest.steps.trading.title': 'Backtest Setup', - 'dashboard.indicator.backtest.steps.trading.desc': 'Time, capital, fees, leverage, slippage', - 'dashboard.indicator.backtest.steps.results.title': 'Results', - 'dashboard.indicator.backtest.steps.results.desc': 'Summary & trades', - 'dashboard.indicator.backtest.panel.risk': 'Execution: Risk (SL / trailing)', - 'dashboard.indicator.backtest.panel.scale': 'Execution: Scale-in (Trend / DCA)', - 'dashboard.indicator.backtest.panel.reduce': 'Execution: Scale-out (Trend / Adverse)', - 'dashboard.indicator.backtest.panel.position': 'Execution: Entry sizing', - 'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)', - 'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)', - 'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit', - 'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)', - 'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)', - 'dashboard.indicator.backtest.field.slippage': 'Slippage (%)', - 'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in', - 'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion DCA', - 'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.dcaAddStepPct': 'DCA trigger (%)', - 'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.dcaAddSizePct': 'DCA size (% of capital)', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max DCA times', - 'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce', - 'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)', - 'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times', - 'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)', - 'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)', - 'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)', - 'dashboard.docs.title': 'Documentation', - 'dashboard.docs.search.placeholder': 'Search documents...', - 'dashboard.docs.category.all': 'All', - 'dashboard.docs.category.guide': 'Guides', - 'dashboard.docs.category.api': 'API Reference', - 'dashboard.docs.category.tutorial': 'Tutorials', - 'dashboard.docs.category.faq': 'FAQ', - 'dashboard.docs.featured.title': 'Featured Documents', - 'dashboard.docs.featured.tag': 'Featured', - 'dashboard.docs.list.views': 'views', - 'dashboard.docs.list.author': 'Author', - 'dashboard.docs.list.empty': 'No documents', - 'dashboard.docs.list.backToAll': 'Back to All Documents', - 'dashboard.docs.list.total': 'Total {count} documents', - 'dashboard.docs.detail.back': 'Back to List', - 'dashboard.docs.detail.updatedAt': 'Updated at', - 'dashboard.docs.detail.related': 'Related Documents', - 'dashboard.docs.detail.notFound': 'Document Not Found', - 'dashboard.docs.detail.error': 'Document does not exist or has been deleted', - 'dashboard.docs.search.result': 'Search Results', - 'dashboard.docs.search.keyword': 'Keyword', - 'community.filter.indicatorType': 'Indicator Type', - 'community.filter.all': 'All', - 'community.filter.other': 'Other Options', - 'community.filter.pricing': 'Pricing Type', - 'community.filter.allPricing': 'All Pricing', - 'community.filter.sortBy': 'Sort By', - 'community.filter.search': 'Search', - 'community.filter.searchPlaceholder': 'Search indicator name', - 'community.indicatorType.trend': 'Trend', - 'community.indicatorType.momentum': 'Momentum', - 'community.indicatorType.volatility': 'Volatility', - 'community.indicatorType.volume': 'Volume', - 'community.indicatorType.custom': 'Custom', - 'community.pricing.free': 'Free', - 'community.pricing.paid': 'Paid', - 'community.sort.downloads': 'Downloads', - 'community.sort.rating': 'Rating', - 'community.sort.newest': 'Newest', - 'community.pagination.total': 'Total {total} indicators', - 'community.noDescription': 'No description', - 'community.detail.type': 'Type', - 'community.detail.pricing': 'Pricing', - 'community.detail.rating': 'Rating', - 'community.detail.downloads': 'Downloads', - 'community.detail.author': 'Author', - 'community.detail.description': 'Description', - 'community.detail.detailContent': 'Detail Content', - 'community.detail.backtestStats': 'Backtest Statistics', - 'community.action.purchase': 'Purchase', - 'community.action.addToMyIndicators': 'Add to My Indicators', - 'community.action.favorite': 'Favorite', - 'community.action.unfavorite': 'Unfavorite', - 'community.action.buyNow': 'Buy Now', - 'community.action.renew': 'Renew', - 'community.purchase.price': 'Price', - 'community.purchase.permanent': 'Permanent', - 'community.purchase.monthly': 'Month', - 'community.purchase.confirmBuy': 'Confirm purchase ({price} QDT)?', - 'community.purchase.confirmRenew': 'Confirm renewal ({price} QDT/month)?', - 'community.purchase.confirmFree': 'Confirm to add this free indicator?', - 'community.purchase.confirmTitle': 'Confirm', - 'community.purchase.owned': 'You own this indicator (permanent)', - 'community.purchase.ownIndicator': 'This is your published indicator', - 'community.purchase.expired': 'Your subscription has expired', - 'community.purchase.expiresOn': 'Expires on: {date}', - 'community.tabs.detail': 'Details', - 'community.tabs.backtest': 'Backtest', - 'community.tabs.ratings': 'Reviews', - 'community.rating.myRating': 'My Rating', - 'community.rating.stars': '{count} Stars', - 'community.rating.commentPlaceholder': 'Share your experience...', - 'community.rating.submit': 'Submit Rating', - 'community.rating.modify': 'Edit', - 'community.rating.saveModify': 'Save Changes', - 'community.rating.cancel': 'Cancel', - 'community.rating.selectRating': 'Please select a rating', - 'community.rating.success': 'Rating submitted successfully', - 'community.rating.modifySuccess': 'Review modified successfully', - 'community.rating.failed': 'Failed to submit rating', - 'community.rating.noRatings': 'No reviews yet', - 'community.backtest.note': 'The above data is from historical backtesting, for reference only, and does not represent future returns', - 'community.backtest.noData': 'No backtest data available', - 'community.backtest.uploadHint': 'Author has not uploaded backtest data yet', - 'community.message.loadFailed': 'Failed to load indicators', - 'community.message.purchaseProcessing': 'Processing purchase...', - 'community.message.downloadSuccess': 'Indicator added to your list', - 'community.message.favoriteSuccess': 'Favorited successfully', - 'community.message.unfavoriteSuccess': 'Unfavorited successfully', - 'community.message.operationSuccess': 'Operation successful', - 'community.message.operationFailed': 'Operation failed', - 'community.banner.readOnly': 'Read Only', - 'community.banner.loginHint': 'For login or registration, please click the button to jump to an independent page to avoid CSRF issues', - 'community.banner.jumpButton': 'Go to Login/Register', - 'dashboard.totalEquity': 'Total Equity', - 'dashboard.totalPnL': 'Total P&L', - 'dashboard.aiStrategies': 'AI Strategies', - 'dashboard.indicatorStrategies': 'Indicator Strategies', - 'dashboard.running': 'Running', - 'dashboard.enabled': 'Enabled', - 'dashboard.pnlHistory': 'P&L History', - 'dashboard.strategyPerformance': 'Strategy Performance', - 'dashboard.strategyRanking': 'Strategy Ranking', - // New KPI labels - 'dashboard.winRate': 'Win Rate', - 'dashboard.profitFactor': 'Profit Factor', - 'dashboard.maxDrawdown': 'Max Drawdown', - 'dashboard.totalTrades': 'Total Trades', - 'dashboard.runningStrategies': 'Running Strategies', - 'dashboard.equityCurve': 'Equity Curve', - 'dashboard.strategyAllocation': 'Strategy Allocation', - 'dashboard.drawdownCurve': 'Drawdown Curve', - 'dashboard.drawdown': 'Drawdown', - 'dashboard.hourlyDistribution': 'Hourly Distribution', - // Chart labels - 'dashboard.dailyPnl': 'Daily P&L', - 'dashboard.cumulativePnl': 'Cumulative P&L', - 'dashboard.tradeCount': 'Trade Count', - 'dashboard.profit': 'Profit', - 'dashboard.noData': 'No Data', - 'dashboard.noStrategyData': 'No strategy data', - // Ranking labels - 'dashboard.ranking.totalProfit': 'Total Profit', - 'dashboard.ranking.roi': 'ROI', - 'dashboard.ranking.trades': 'Trades', - // Units and labels - 'dashboard.unit.trades': '', - 'dashboard.unit.strategies': '', - 'dashboard.label.avgDaily': 'Avg Daily', - 'dashboard.label.avgProfit': 'Avg Profit', - 'dashboard.label.win': 'W', - 'dashboard.label.lose': 'L', - 'dashboard.label.trade': 'Trades', - 'dashboard.label.indicator': 'Indicator', - 'dashboard.label.totalPnl': 'Total P&L', - 'dashboard.label.maxDrawdownPoint': 'Max DD', - 'dashboard.profitCalendar': 'Profit Calendar', - 'dashboard.recentTrades': 'Recent Trades', - 'dashboard.currentPositions': 'Current Positions', - 'dashboard.table.time': 'Time', - 'dashboard.table.strategy': 'Strategy', - 'dashboard.table.symbol': 'Symbol', - 'dashboard.table.type': 'Type', - 'dashboard.table.side': 'Side', - 'dashboard.table.size': 'Size', - 'dashboard.table.entryPrice': 'Entry Price', - 'dashboard.table.price': 'Price', - 'dashboard.table.amount': 'Amount', - 'dashboard.table.profit': 'Profit', - 'dashboard.pendingOrders': 'Order Execution Records', - 'dashboard.totalOrders': 'Total {total} orders', - 'dashboard.viewError': 'View Error', - 'dashboard.filled': 'Filled', - 'dashboard.orderTable.time': 'Created Time', - 'dashboard.orderTable.strategy': 'Strategy', - 'dashboard.orderTable.symbol': 'Symbol', - 'dashboard.orderTable.signalType': 'Signal Type', - 'dashboard.orderTable.amount': 'Amount', - 'dashboard.orderTable.price': 'Filled Price', - 'dashboard.orderTable.status': 'Status', - 'dashboard.orderTable.timeInfo': 'Time', - 'dashboard.orderTable.executedAt': 'Executed Time', - 'dashboard.orderTable.exchange': 'Exchange', - 'dashboard.orderTable.notify': 'Notify', - 'dashboard.orderTable.actions': 'Actions', - 'dashboard.orderTable.delete': 'Delete', - 'dashboard.orderTable.deleteConfirm': 'Delete this record?', - 'dashboard.orderTable.deleteSuccess': 'Deleted', - 'dashboard.orderTable.deleteFailed': 'Delete failed', - 'dashboard.newOrderNotify': 'New Order Alert', - 'dashboard.newOrderDesc': 'New order execution record', - 'dashboard.soundEnabled': 'Sound notification enabled', - 'dashboard.soundDisabled': 'Sound notification disabled', - 'dashboard.clickToMute': 'Click to mute', - 'dashboard.clickToUnmute': 'Click to unmute', - 'dashboard.signalType.openLong': 'Open Long', - 'dashboard.signalType.openShort': 'Open Short', - 'dashboard.signalType.closeLong': 'Close Long', - 'dashboard.signalType.closeShort': 'Close Short', - 'dashboard.signalType.addLong': 'Add Long', - 'dashboard.signalType.addShort': 'Add Short', - 'dashboard.status.pending': 'Pending', - 'dashboard.status.processing': 'Processing', - 'dashboard.status.completed': 'Completed', - 'dashboard.status.failed': 'Failed', - 'dashboard.status.cancelled': 'Cancelled', - 'dashboard.table.pnl': 'Unrealized P&L', - 'form.basic-form.basic.title': 'Basic form', - 'form.basic-form.basic.description': 'Form pages are used to collect or verify information to users, and basic forms are common in scenarios where there are fewer data items.', - 'form.basic-form.title.label': 'Title', - 'form.basic-form.title.placeholder': 'Give the target a name', - 'form.basic-form.title.required': 'Please enter a title', - 'form.basic-form.date.label': 'Start and end date', - 'form.basic-form.placeholder.start': 'Start date', - 'form.basic-form.placeholder.end': 'End date', - 'form.basic-form.date.required': 'Please select the start and end date', - 'form.basic-form.goal.label': 'Goal description', - 'form.basic-form.goal.placeholder': 'Please enter your work goals', - 'form.basic-form.goal.required': 'Please enter a description of the goal', - 'form.basic-form.standard.label': 'Metrics', - 'form.basic-form.standard.placeholder': 'Please enter a metric', - 'form.basic-form.standard.required': 'Please enter a metric', - 'form.basic-form.client.label': 'Client', - 'form.basic-form.label.tooltip': 'Target service object', - 'form.basic-form.client.placeholder': 'Please describe your customer service, internal customers directly @ Name / job number', - 'form.basic-form.client.required': 'Please describe the customers you serve', - 'form.basic-form.invites.label': 'Inviting critics', - 'form.basic-form.invites.placeholder': 'Please direct @ Name / job number, you can invite up to 5 people', - 'form.basic-form.weight.label': 'Weight', - 'form.basic-form.weight.placeholder': 'Please enter weight', - 'form.basic-form.public.label': 'Target disclosure', - 'form.basic-form.label.help': 'Customers and invitees are shared by default', - 'form.basic-form.radio.public': 'Public', - 'form.basic-form.radio.partially-public': 'Partially public', - 'form.basic-form.radio.private': 'Private', - 'form.basic-form.publicUsers.placeholder': 'Open to', - 'form.basic-form.option.A': 'Colleague A', - 'form.basic-form.option.B': 'Colleague B', - 'form.basic-form.option.C': 'Colleague C', - 'form.basic-form.email.required': 'Please enter your email!', - 'form.basic-form.email.wrong-format': 'The email address is in the wrong format!', - 'form.basic-form.userName.required': 'Please enter your userName!', - 'form.basic-form.password.required': 'Please enter your password!', - 'form.basic-form.password.twice': 'The passwords entered twice do not match!', - 'form.basic-form.strength.msg': "Please enter at least 6 characters and don't use passwords that are easy to guess.", - 'form.basic-form.strength.strong': 'Strength: strong', - 'form.basic-form.strength.medium': 'Strength: medium', - 'form.basic-form.strength.short': 'Strength: too short', - 'form.basic-form.confirm-password.required': 'Please confirm your password!', - 'form.basic-form.phone-number.required': 'Please enter your phone number!', - 'form.basic-form.phone-number.wrong-format': 'Malformed phone number!', - 'form.basic-form.verification-code.required': 'Please enter the verification code!', - 'form.basic-form.form.get-captcha': 'Get Captcha', - 'form.basic-form.captcha.second': 'sec', - 'form.basic-form.form.optional': ' (optional) ', - 'form.basic-form.form.submit': 'Submit', - 'form.basic-form.form.save': 'Save', - 'form.basic-form.email.placeholder': 'Email', - 'form.basic-form.password.placeholder': 'Password', - 'form.basic-form.confirm-password.placeholder': 'Confirm password', - 'form.basic-form.phone-number.placeholder': 'Phone number', - 'form.basic-form.verification-code.placeholder': 'Verification code', - 'result.success.title': 'Submission Success', - 'result.success.description': 'The submission results page is used to feed back the results of a series of operational tasks. If it is a simple operation, use the Message global prompt feedback. This text area can show a simple supplementary explanation. If there is a similar requirement for displaying “documents”, the following gray area can present more complicated content.', - 'result.success.operate-title': 'Project Name', - 'result.success.operate-id': 'Project ID', - 'result.success.principal': 'Principal', - 'result.success.operate-time': 'Effective time', - 'result.success.step1-title': 'Create project', - 'result.success.step1-operator': 'Qu Lili', - 'result.success.step2-title': 'Departmental preliminary review', - 'result.success.step2-operator': 'Zhou Maomao', - 'result.success.step2-extra': 'Urge', - 'result.success.step3-title': 'Financial review', - 'result.success.step4-title': 'Finish', - 'result.success.btn-return': 'Back List', - 'result.success.btn-project': 'View Project', - 'result.success.btn-print': 'Print', - 'result.fail.error.title': 'Submission Failed', - 'result.fail.error.description': 'Please check and modify the following information before resubmitting.', - 'result.fail.error.hint-title': 'The content you submitted has the following error:', - 'result.fail.error.hint-text1': 'Your account has been frozen', - 'result.fail.error.hint-btn1': 'Thaw immediately', - 'result.fail.error.hint-text2': 'Your account is not yet eligible to apply', - 'result.fail.error.hint-btn2': 'Upgrade immediately', - 'result.fail.error.btn-text': 'Return to modify', - 'account.settings.menuMap.custom': 'Custom Settings', - 'account.settings.menuMap.binding': 'Account Binding', - 'account.settings.basic.avatar': 'Avatar', - 'account.settings.basic.change-avatar': 'Change avatar', - 'account.settings.basic.email': 'Email', - 'account.settings.basic.email-message': 'Please input your email!', - 'account.settings.basic.nickname': 'Nickname', - 'account.settings.basic.nickname-message': 'Please input your Nickname!', - 'account.settings.basic.profile': 'Personal profile', - 'account.settings.basic.profile-message': 'Please input your personal profile!', - 'account.settings.basic.profile-placeholder': 'Brief introduction to yourself', - 'account.settings.basic.country': 'Country/Region', - 'account.settings.basic.country-message': 'Please input your country!', - 'account.settings.basic.geographic': 'Province or city', - 'account.settings.basic.geographic-message': 'Please input your geographic info!', - 'account.settings.basic.address': 'Street Address', - 'account.settings.basic.address-message': 'Please input your address!', - 'account.settings.basic.phone': 'Phone Number', - 'account.settings.basic.phone-message': 'Please input your phone!', - 'account.settings.basic.update': 'Update Information', - 'account.settings.basic.update.success': 'Update basic information successfully', - 'account.settings.security.strong': 'Strong', - 'account.settings.security.medium': 'Medium', - 'account.settings.security.weak': 'Weak', - 'account.settings.security.password': 'Account Password', - 'account.settings.security.password-description': 'Current password strength:', - 'account.settings.security.phone': 'Security Phone', - 'account.settings.security.phone-description': 'Bound phone:', - 'account.settings.security.question': 'Security Question', - 'account.settings.security.question-description': 'The security question is not set, and the security policy can effectively protect the account security', - 'account.settings.security.email': 'Bound Email', - 'account.settings.security.email-description': 'Bound Email:', - 'account.settings.security.mfa': 'MFA Device', - 'account.settings.security.mfa-description': 'Unbound MFA device, after binding, can be confirmed twice', - 'account.settings.security.modify': 'Modify', - 'account.settings.security.set': 'Set', - 'account.settings.security.bind': 'Bind', - 'account.settings.binding.taobao': 'Binding Taobao', - 'account.settings.binding.taobao-description': 'Currently unbound Taobao account', - 'account.settings.binding.alipay': 'Binding Alipay', - 'account.settings.binding.alipay-description': 'Currently unbound Alipay account', - 'account.settings.binding.dingding': 'Binding DingTalk', - 'account.settings.binding.dingding-description': 'Currently unbound DingTalk account', - 'account.settings.binding.bind': 'Bind', - 'account.settings.notification.password': 'Account Password', - 'account.settings.notification.password-description': 'Messages from other users will be notified in the form of a station letter', - 'account.settings.notification.messages': 'System Messages', - 'account.settings.notification.messages-description': 'System messages will be notified in the form of a station letter', - 'account.settings.notification.todo': 'To-do Notification', - 'account.settings.notification.todo-description': 'The to-do list will be notified in the form of a letter from the station', - 'account.settings.settings.open': 'Open', - 'account.settings.settings.close': 'Close', - 'trading-assistant.title': 'Trading Assistant', - 'trading-assistant.strategyList': 'Strategy List', - 'trading-assistant.createStrategy': 'Create Strategy', - 'trading-assistant.noStrategy': 'No strategies', - 'trading-assistant.selectStrategy': 'Please select a strategy from the left to view details', - 'trading-assistant.startStrategy': 'Start Strategy', - 'trading-assistant.stopStrategy': 'Stop Strategy', - 'trading-assistant.editStrategy': 'Edit Strategy', - 'trading-assistant.deleteStrategy': 'Delete Strategy', - 'trading-assistant.startAll': 'Start All', - 'trading-assistant.stopAll': 'Stop All', - 'trading-assistant.deleteAll': 'Delete All', - 'trading-assistant.symbolCount': 'symbols', - 'trading-assistant.status.running': 'Running', - 'trading-assistant.status.stopped': 'Stopped', - 'trading-assistant.status.error': 'Error', - 'trading-assistant.strategyType.IndicatorStrategy': 'Indicator Strategy', - 'trading-assistant.strategyType.PromptBasedStrategy': 'Prompt Strategy', - 'trading-assistant.strategyType.GridStrategy': 'Grid Strategy', - 'trading-assistant.tabs.tradingRecords': 'Trading Records', - 'trading-assistant.tabs.positions': 'Positions', - 'trading-assistant.tabs.equityCurve': 'Equity Curve', - 'trading-assistant.form.step1': 'Select Indicator', - 'trading-assistant.form.step2': 'Exchange Configuration', - 'trading-assistant.form.step3': 'Strategy Parameters', - 'trading-assistant.form.step2Params': 'Parameters', - 'trading-assistant.form.step3Signal': 'Signal Delivery', - 'trading-assistant.form.marketCategory': 'Market Category', - 'trading-assistant.form.marketCategoryHint': 'Select a market first. Only Crypto can enable live trading; other markets are signal-only.', - 'trading-assistant.market.AShare': 'A-Share', - 'trading-assistant.market.USStock': 'US Stock', - 'trading-assistant.market.Crypto': 'Crypto', - 'trading-assistant.market.Forex': 'Forex', - 'trading-assistant.form.indicator': 'Select Indicator', - 'trading-assistant.form.indicatorHint': 'You can only select indicators you have purchased or created', - 'trading-assistant.form.qdtCostHints': 'Using strategies will consume QDT, please ensure your account has sufficient QDT balance', - 'trading-assistant.form.indicatorDescription': 'Indicator Description', - 'trading-assistant.form.noDescription': 'No description', - 'trading-assistant.form.exchange': 'Select Exchange', - 'trading-assistant.form.apiKey': 'API Key', - 'trading-assistant.form.secretKey': 'Secret Key', - 'trading-assistant.form.passphrase': 'Passphrase', - 'trading-assistant.form.testConnection': 'Test Connection', - 'trading-assistant.form.strategyName': 'Strategy Name', - 'trading-assistant.form.symbol': 'Trading Pair', - 'trading-assistant.form.symbols': 'Trading Pairs (Multi-select)', - 'trading-assistant.form.symbolHint': 'Symbol format depends on the selected market', - 'trading-assistant.form.symbolsHint': 'Select multiple pairs to create strategies for each', - 'trading-assistant.form.symbolHintCrypto': 'Crypto: use trading pairs like BTC/USDT', - 'trading-assistant.form.symbolHintGeneral': 'Enter the symbol for the selected market (e.g. 600519, AAPL, EURUSD).', - 'trading-assistant.form.initialCapital': 'Initial Capital', - 'trading-assistant.form.marketType': 'Market Type', - 'trading-assistant.form.marketTypeFutures': 'Futures', - 'trading-assistant.form.marketTypeSpot': 'Spot', - 'trading-assistant.form.marketTypeHint': 'Futures support bidirectional trading and leverage, spot only supports long positions with fixed 1x leverage', - 'trading-assistant.form.leverage': 'Leverage', - 'trading-assistant.form.leverageHint': 'Futures: 1-125x, Spot: Fixed 1x', - 'trading-assistant.form.spotLeverageFixed': 'Spot trading leverage is fixed at 1x', - 'trading-assistant.form.spotOnlyLongHint': 'Spot trading only supports long positions', - 'trading-assistant.form.tradeDirection': 'Trade Direction', - 'trading-assistant.form.tradeDirectionLong': 'Long Only', - 'trading-assistant.form.tradeDirectionShort': 'Short Only', - 'trading-assistant.form.tradeDirectionBoth': 'Both', - 'trading-assistant.form.timeframe': 'Timeframe', - 'trading-assistant.form.klinePeriod': 'K-Line Period', - 'trading-assistant.form.timeframe1m': '1 Minute', - 'trading-assistant.form.timeframe5m': '5 Minutes', - 'trading-assistant.form.timeframe15m': '15 Minutes', - 'trading-assistant.form.timeframe30m': '30 Minutes', - 'trading-assistant.form.timeframe1H': '1 Hour', - 'trading-assistant.form.timeframe4H': '4 Hours', - 'trading-assistant.form.timeframe1D': '1 Day', - 'trading-assistant.form.selectStrategyType': 'Select Strategy Type', - 'trading-assistant.form.indicatorStrategy': 'Indicator Strategy', - 'trading-assistant.form.indicatorStrategyDesc': 'Automated trading strategy based on technical indicators', - 'trading-assistant.form.aiStrategy': 'AI Strategy', - 'trading-assistant.form.aiStrategyDesc': 'Automated trading strategy based on AI intelligent decision-making', - 'trading-assistant.form.enableAiFilter': 'Enable AI Intelligent Decision Filter', - 'trading-assistant.form.enableAiFilterHint': 'When enabled, indicator signals will be filtered by AI to improve trading quality', - 'trading-assistant.form.aiFilterPrompt': 'Custom Prompt', - 'trading-assistant.form.aiFilterPromptHint': 'Provide custom instructions for AI filtering, leave blank to use system default', - 'trading-assistant.validation.strategyTypeRequired': 'Please select a strategy type', - 'trading-assistant.validation.marketCategoryRequired': 'Please select a market category', - 'trading-assistant.form.advancedSettings': 'Advanced Settings', - 'trading-assistant.form.orderMode': 'Order Mode', - 'trading-assistant.form.orderModeMaker': 'Maker (Limit)', - 'trading-assistant.form.orderModeTaker': 'Taker (Market)', - 'trading-assistant.form.orderModeHint': 'Maker mode uses limit orders with lower fees; Taker mode executes immediately with higher fees', - 'trading-assistant.form.makerWaitSec': 'Maker Wait Time (seconds)', - 'trading-assistant.form.makerWaitSecHint': 'Time to wait for order fill before canceling and retrying', - 'trading-assistant.form.makerRetries': 'Maker Retries', - 'trading-assistant.form.makerRetriesHint': 'Maximum number of retries when maker order is not filled', - 'trading-assistant.form.fallbackToMarket': 'Fallback to Market on failure', - 'trading-assistant.form.fallbackToMarketHint': 'If limit order (open/close) is not filled, downgrade to market order to ensure execution', - 'trading-assistant.form.marginMode': 'Margin Mode', - 'trading-assistant.form.marginModeCross': 'Cross Margin', - 'trading-assistant.form.marginModeIsolated': 'Isolated Margin', - 'trading-assistant.form.stopLossPct': 'Stop Loss (%)', - 'trading-assistant.form.stopLossPctHint': 'Set stop loss percentage, 0 means disabled', - 'trading-assistant.form.takeProfitPct': 'Take Profit (%)', - 'trading-assistant.form.takeProfitPctHint': 'Set take profit percentage, 0 means disabled', - 'trading-assistant.form.commission': 'Commission (%)', - 'trading-assistant.form.commissionHint': 'Trading fee percentage (optional)', - 'trading-assistant.form.slippage': 'Slippage (%)', - 'trading-assistant.form.slippageHint': 'Estimated slippage percentage (optional)', - 'trading-assistant.form.executionMode': 'Execution', - 'trading-assistant.form.executionModeSignal': 'Signal only (push notifications)', - 'trading-assistant.form.executionModeLive': 'Live trading', - 'trading-assistant.form.liveTradingCryptoOnlyHint': 'Live trading is available for Crypto only. Other markets can only push signals.', - 'trading-assistant.form.liveTradingNotSupportedHint': 'Live trading is not available for this market', - 'trading-assistant.form.broker': 'Broker', - 'trading-assistant.form.ibkrConnectionTitle': 'Interactive Brokers Connection', - 'trading-assistant.form.ibkrConnectionHint': 'Make sure TWS or IB Gateway is running with API enabled', - 'trading-assistant.validation.brokerRequired': 'Please select a broker', - 'trading-assistant.placeholders.selectBroker': 'Select broker', - 'trading-assistant.brokerNames': { - 'ibkr': 'Interactive Brokers (IBKR)', - 'mt5': 'MetaTrader 5 (MT5)', - 'mt4': 'MetaTrader 4 (MT4)', - 'futu': 'Futu Securities', - 'tiger': 'Tiger Brokers', - 'td': 'TD Ameritrade', - 'schwab': 'Charles Schwab' - }, - 'trading-assistant.form.ibkrHost': 'Host', - 'trading-assistant.form.ibkrPort': 'Port', - 'trading-assistant.form.ibkrPortHint': 'TWS Live:7497, TWS Paper:7496, Gateway Live:4001, Gateway Paper:4002', - 'trading-assistant.form.ibkrClientId': 'Client ID', - 'trading-assistant.form.ibkrAccount': 'Account', - 'trading-assistant.form.ibkrAccountHint': 'Leave empty to auto-select first account. Specify for multi-account users.', - 'trading-assistant.placeholders.ibkrAccount': 'Optional, e.g. U1234567', - 'trading-assistant.exchange.ibkrConnectionSuccess': 'IBKR connected successfully', - 'trading-assistant.exchange.ibkrConnectionFailed': 'IBKR connection failed. Please check if TWS/Gateway is running.', - // MT5/Forex configuration - 'trading-assistant.form.forexBroker': 'Forex Broker', - 'trading-assistant.form.mt5ConnectionTitle': 'MetaTrader 5 Connection', - 'trading-assistant.form.mt5ConnectionHint': 'Make sure MT5 terminal is running and logged in (Windows only)', - 'trading-assistant.form.mt5Server': 'Server', - 'trading-assistant.form.mt5ServerHint': 'Broker server name (e.g., ICMarkets-Demo)', - 'trading-assistant.form.mt5Login': 'Account Number', - 'trading-assistant.form.mt5Password': 'Password', - 'trading-assistant.form.mt5TerminalPath': 'MT5 Terminal Path (Optional)', - 'trading-assistant.form.mt5TerminalPathHint': 'If MT5 terminal is not installed in the default location, specify the full path to terminal64.exe (e.g., C:\\Program Files\\MetaTrader 5\\terminal64.exe)', - 'trading-assistant.placeholders.mt5Server': 'e.g., ICMarkets-Demo', - 'trading-assistant.placeholders.mt5Login': 'e.g., 12345678', - 'trading-assistant.placeholders.mt5Password': 'Your MT5 password', - 'trading-assistant.placeholders.mt5TerminalPath': 'e.g., C:\\Program Files\\MetaTrader 5\\terminal64.exe', - 'trading-assistant.validation.mt5ServerRequired': 'Please enter MT5 server', - 'trading-assistant.validation.mt5LoginRequired': 'Please enter MT5 account number', - 'trading-assistant.validation.mt5PasswordRequired': 'Please enter MT5 password', - 'trading-assistant.exchange.mt5ConnectionSuccess': 'MT5 connected successfully', - 'trading-assistant.exchange.mt5ConnectionFailed': 'MT5 connection failed. Please check if terminal is running.', - 'trading-assistant.form.notifyChannels': 'Notification Channels', - 'trading-assistant.form.notifyChannelsHint': 'Choose how you want to receive buy/sell and risk-management signals.', - 'trading-assistant.notify.browser': 'Browser', - 'trading-assistant.notify.email': 'Email', - 'trading-assistant.notify.phone': 'Phone', - 'trading-assistant.notify.telegram': 'Telegram', - 'trading-assistant.notify.discord': 'Discord', - 'trading-assistant.notify.webhook': 'Webhook', - 'trading-assistant.form.notifyEmail': 'Email', - 'trading-assistant.form.notifyPhone': 'Phone number', - 'trading-assistant.form.notifyTelegram': 'Telegram (chat id / username)', - 'trading-assistant.form.notifyDiscord': 'Discord (webhook url)', - 'trading-assistant.form.notifyWebhook': 'Webhook URL', - 'trading-assistant.form.liveTradingConfigTitle': 'Exchange Credentials', - 'trading-assistant.form.liveTradingConfigHint': 'Provide your exchange API credentials. You can test the connection before saving.', - 'trading-assistant.form.savedCredential': 'Saved credential', - 'trading-assistant.form.savedCredentialHint': 'Select a saved credential to auto-fill API keys (optional).', - 'trading-assistant.form.saveCredential': 'Save this credential for future use', - 'trading-assistant.form.credentialName': 'Credential name (optional)', - 'trading-assistant.form.signalMode': 'Signal Mode', - 'trading-assistant.form.signalModeConfirmed': 'Confirmed', - 'trading-assistant.form.signalModeAggressive': 'Aggressive', - 'trading-assistant.form.signalModeHint': 'Confirmed: only check completed candles; Aggressive: also check forming candles', - 'trading-assistant.form.cancel': 'Cancel', - 'trading-assistant.form.prev': 'Previous', - 'trading-assistant.form.next': 'Next', - 'trading-assistant.form.confirmCreate': 'Confirm Create', - 'trading-assistant.form.confirmEdit': 'Confirm Edit', - 'trading-assistant.messages.createSuccess': 'Strategy created successfully', - 'trading-assistant.messages.createFailed': 'Failed to create strategy', - 'trading-assistant.messages.updateSuccess': 'Strategy updated successfully', - 'trading-assistant.messages.updateFailed': 'Failed to update strategy', - 'trading-assistant.messages.deleteSuccess': 'Strategy deleted successfully', - 'trading-assistant.messages.deleteFailed': 'Failed to delete strategy', - 'trading-assistant.messages.startSuccess': 'Strategy started successfully', - 'trading-assistant.messages.startFailed': 'Failed to start strategy', - 'trading-assistant.messages.stopSuccess': 'Strategy stopped successfully', - 'trading-assistant.messages.stopFailed': 'Failed to stop strategy', - 'trading-assistant.messages.loadFailed': 'Failed to load strategy list', - 'trading-assistant.messages.runningWarning': 'Strategy is running, please stop it before editing', - 'trading-assistant.messages.deleteConfirmWithName': 'Are you sure you want to delete strategy "{name}"? This action cannot be undone.', - 'trading-assistant.messages.deleteConfirm': 'Are you sure you want to delete this strategy? This action cannot be undone.', - 'trading-assistant.messages.loadTradesFailed': 'Failed to load trading records', - 'trading-assistant.messages.loadPositionsFailed': 'Failed to load position records', - 'trading-assistant.messages.loadEquityFailed': 'Failed to load equity curve', - 'trading-assistant.messages.loadIndicatorsFailed': 'Failed to load indicator list, please try again later', - 'trading-assistant.messages.spotLimitations': 'Spot trading has been automatically set to long only with 1x leverage', - 'trading-assistant.messages.autoFillApiConfig': 'Auto-filled API configuration for this exchange from history', - 'trading-assistant.messages.batchCreateSuccess': 'Successfully created {count} strategies', - 'trading-assistant.messages.batchStartSuccess': 'Successfully started {count} strategies', - 'trading-assistant.messages.batchStartFailed': 'Failed to start strategies', - 'trading-assistant.messages.batchStopSuccess': 'Successfully stopped {count} strategies', - 'trading-assistant.messages.batchStopFailed': 'Failed to stop strategies', - 'trading-assistant.messages.batchDeleteSuccess': 'Successfully deleted {count} strategies', - 'trading-assistant.messages.batchDeleteFailed': 'Failed to delete strategies', - 'trading-assistant.messages.batchDeleteConfirm': 'Are you sure you want to delete {count} strategies in group "{name}"? This action cannot be undone.', - 'trading-assistant.placeholders.selectIndicator': 'Please select an indicator', - 'trading-assistant.placeholders.selectExchange': 'Please select an exchange', - 'trading-assistant.placeholders.selectMarketCategory': 'Please select market category', - 'trading-assistant.placeholders.inputApiKey': 'Please enter API Key', - 'trading-assistant.placeholders.inputSecretKey': 'Please enter Secret Key', - 'trading-assistant.placeholders.inputPassphrase': 'Please enter Passphrase', - 'trading-assistant.placeholders.inputStrategyName': 'Please enter strategy name', - 'trading-assistant.placeholders.selectSymbol': 'Please select trading pair', - 'trading-assistant.placeholders.selectSymbols': 'Please select trading pairs (multi-select)', - 'trading-assistant.placeholders.inputSymbol': 'Please enter symbol', - 'trading-assistant.placeholders.selectTimeframe': 'Please select timeframe', - 'trading-assistant.placeholders.selectKlinePeriod': 'Please select K-line period', - 'trading-assistant.placeholders.inputAiFilterPrompt': 'Please enter custom prompt (optional)', - 'trading-assistant.placeholders.inputEmail': 'Please enter email', - 'trading-assistant.placeholders.inputPhone': 'Please enter phone number', - 'trading-assistant.placeholders.inputTelegram': 'Please enter Telegram chat id / username', - 'trading-assistant.placeholders.inputDiscord': 'Please enter Discord webhook url', - 'trading-assistant.placeholders.inputWebhook': 'Please enter webhook url', - 'trading-assistant.placeholders.selectSavedCredential': 'Select saved credential', - 'trading-assistant.placeholders.inputCredentialName': 'For example: Binance main key', - 'trading-assistant.validation.indicatorRequired': 'Please select an indicator', - 'trading-assistant.validation.exchangeRequired': 'Please select an exchange', - 'trading-assistant.validation.apiKeyRequired': 'Please enter API Key', - 'trading-assistant.validation.secretKeyRequired': 'Please enter Secret Key', - 'trading-assistant.validation.passphraseRequired': 'Please enter Passphrase', - 'trading-assistant.validation.exchangeConfigIncomplete': 'Please fill in complete exchange configuration information', - 'trading-assistant.validation.testConnectionRequired': 'Please click "Test Connection" button and ensure the connection is successful', - 'trading-assistant.validation.testConnectionFailed': 'Connection test failed, please check the configuration and test again', - 'trading-assistant.validation.strategyNameRequired': 'Please enter strategy name', - 'trading-assistant.validation.symbolRequired': 'Please select trading pair', - 'trading-assistant.validation.symbolsRequired': 'Please select at least one trading pair', - 'trading-assistant.validation.initialCapitalRequired': 'Please enter initial capital', - 'trading-assistant.validation.leverageRequired': 'Please enter leverage', - 'trading-assistant.validation.emailInvalid': 'Invalid email address', - 'trading-assistant.validation.notifyChannelRequired': 'Please select at least one notification channel', - 'trading-assistant.table.time': 'Time', - 'trading-assistant.table.type': 'Type', - 'trading-assistant.table.price': 'Price', - 'trading-assistant.table.amount': 'Amount', - 'trading-assistant.table.value': 'Value', - 'trading-assistant.table.commission': 'Commission', - 'trading-assistant.table.symbol': 'Trading Pair', - 'trading-assistant.table.side': 'Side', - 'trading-assistant.table.size': 'Position Size', - 'trading-assistant.table.entryPrice': 'Entry Price', - 'trading-assistant.table.currentPrice': 'Current Price', - 'trading-assistant.table.unrealizedPnl': 'Unrealized P&L', - 'trading-assistant.table.pnlPercent': 'P&L %', - 'trading-assistant.table.buy': 'Buy', - 'trading-assistant.table.sell': 'Sell', - 'trading-assistant.table.long': 'Long', - 'trading-assistant.table.short': 'Short', - 'trading-assistant.table.noPositions': 'No positions', - 'trading-assistant.detail.title': 'Strategy Details', - 'trading-assistant.detail.strategyName': 'Strategy Name', - 'trading-assistant.detail.strategyType': 'Strategy Type', - 'trading-assistant.detail.status': 'Status', - 'trading-assistant.detail.tradingMode': 'Trading Mode', - 'trading-assistant.detail.exchange': 'Exchange', - 'trading-assistant.detail.initialCapital': 'Initial Capital', - 'trading-assistant.detail.totalInvestment': 'Total Investment', - 'trading-assistant.detail.currentEquity': 'Current Equity', - 'trading-assistant.detail.totalPnl': 'Total P&L', - 'trading-assistant.detail.indicatorName': 'Indicator Name', - 'trading-assistant.detail.maxLeverage': 'Max Leverage', - 'trading-assistant.detail.decideInterval': 'Decision Interval', - 'trading-assistant.detail.symbols': 'Trading Symbols', - 'trading-assistant.detail.createdAt': 'Created At', - 'trading-assistant.detail.updatedAt': 'Updated At', - 'trading-assistant.detail.llmConfig': 'AI Model Configuration', - 'trading-assistant.detail.exchangeConfig': 'Exchange Configuration', - 'trading-assistant.detail.provider': 'Provider', - 'trading-assistant.detail.modelId': 'Model ID', - 'trading-assistant.detail.close': 'Close', - 'trading-assistant.detail.loadFailed': 'Failed to load strategy details', - 'trading-assistant.equity.noData': 'No equity data', - 'trading-assistant.equity.equity': 'Equity', - 'trading-assistant.exchange.tradingMode': 'Trading Mode', - 'trading-assistant.exchange.virtual': 'Virtual Trading', - 'trading-assistant.exchange.live': 'Live Trading', - 'trading-assistant.exchange.selectExchange': 'Select Exchange', - 'trading-assistant.exchange.walletAddress': 'Wallet Address', - 'trading-assistant.exchange.walletAddressPlaceholder': 'Please enter wallet address (starts with 0x)', - 'trading-assistant.exchange.privateKey': 'Private Key', - 'trading-assistant.exchange.privateKeyPlaceholder': 'Please enter private key (64 characters)', - 'trading-assistant.exchange.testConnection': 'Test Connection', - 'trading-assistant.exchange.connectionSuccess': 'Connection successful', - 'trading-assistant.exchange.connectionFailed': 'Connection failed', - 'trading-assistant.exchange.testFailed': 'Connection test failed', - 'trading-assistant.exchange.fillComplete': 'Please fill in complete exchange configuration information', - 'trading-assistant.exchange.ipWhitelistTip': 'Please add the following IPs to the whitelist in your exchange API settings:', - 'trading-assistant.strategyTypeOptions.ai': 'AI-Driven Strategy', - 'trading-assistant.strategyTypeOptions.indicator': 'Indicator Strategy', - 'trading-assistant.strategyTypeOptions.aiDeveloping': 'AI-Driven Strategy feature is under development, stay tuned', - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'AI-Driven Strategy feature is under development', - 'trading-assistant.indicatorType.trend': 'Trend', - 'trading-assistant.indicatorType.momentum': 'Momentum', - 'trading-assistant.indicatorType.volatility': 'Volatility', - 'trading-assistant.indicatorType.volume': 'Volume', - 'trading-assistant.indicatorType.custom': 'Custom', - 'trading-assistant.exchangeNames': { - 'okx': 'OKX', - 'binance': 'Binance', - 'hyperliquid': 'Hyperliquid', - 'blockchaincom': 'Blockchain.com', - 'coinbaseexchange': 'Coinbase', - 'gate': 'Gate.io', - 'mexc': 'MEXC', - 'kraken': 'Kraken', - 'bitfinex': 'Bitfinex', - 'bybit': 'Bybit', - 'kucoin': 'KuCoin', - 'huobi': 'Huobi', - 'bitget': 'Bitget', - 'bitmex': 'BitMEX', - 'deribit': 'Deribit', - 'phemex': 'Phemex', - 'bitmart': 'BitMart', - 'bitstamp': 'Bitstamp', - 'bittrex': 'Bittrex', - 'poloniex': 'Poloniex', - 'gemini': 'Gemini', - 'cryptocom': 'Crypto.com', - 'bitflyer': 'bitFlyer', - 'upbit': 'Upbit', - 'bithumb': 'Bithumb', - 'coinone': 'Coinone', - 'zb': 'ZB', - 'lbank': 'LBank', - 'bibox': 'Bibox', - 'bigone': 'BigONE', - 'bitrue': 'Bitrue', - 'coinex': 'CoinEx', - 'digifinex': 'DigiFinex', - 'ftx': 'FTX', - 'ftxus': 'FTX US', - 'binanceus': 'Binance US', - 'binancecoinm': 'Binance COIN-M', - 'binanceusdm': 'Binance USDⓈ-M', - 'ibkr': 'Interactive Brokers (IBKR)' - }, - 'ai-trading-assistant.title': 'AI Trading Assistant', - 'ai-trading-assistant.strategyList': 'Strategy List', - 'ai-trading-assistant.createStrategy': 'Create Strategy', - 'ai-trading-assistant.noStrategy': 'No strategies', - 'ai-trading-assistant.selectStrategy': 'Please select a strategy from the left to view details', - 'ai-trading-assistant.startStrategy': 'Start Strategy', - 'ai-trading-assistant.stopStrategy': 'Stop Strategy', - 'ai-trading-assistant.editStrategy': 'Edit Strategy', - 'ai-trading-assistant.deleteStrategy': 'Delete Strategy', - 'ai-trading-assistant.status.running': 'Running', - 'ai-trading-assistant.status.stopped': 'Stopped', - 'ai-trading-assistant.status.error': 'Error', - 'ai-trading-assistant.tabs.tradingRecords': 'Trading Records', - 'ai-trading-assistant.tabs.positions': 'Positions', - 'ai-trading-assistant.tabs.aiDecisions': 'AI Decisions', - 'ai-trading-assistant.tabs.equityCurve': 'Equity Curve', - 'ai-trading-assistant.form.createTitle': 'Create AI Trading Strategy', - 'ai-trading-assistant.form.editTitle': 'Edit AI Trading Strategy', - 'ai-trading-assistant.form.strategyName': 'Strategy Name', - 'ai-trading-assistant.form.modelId': 'AI Model', - 'ai-trading-assistant.form.modelIdHint': 'Using system OpenRouter service, no API Key configuration needed', - 'ai-trading-assistant.form.decideInterval': 'Decision Interval', - 'ai-trading-assistant.form.decideInterval5m': '5 Minutes', - 'ai-trading-assistant.form.decideInterval10m': '10 Minutes', - 'ai-trading-assistant.form.decideInterval30m': '30 Minutes', - 'ai-trading-assistant.form.decideInterval1h': '1 Hour', - 'ai-trading-assistant.form.decideInterval4h': '4 Hours', - 'ai-trading-assistant.form.decideInterval1d': '1 Day', - 'ai-trading-assistant.form.decideInterval1w': '1 Week', - 'ai-trading-assistant.form.decideIntervalHint': 'Time interval for AI decision making', - 'ai-trading-assistant.form.runPeriod': 'Run Period', - 'ai-trading-assistant.form.runPeriodHint': 'Start and end time for strategy execution', - 'ai-trading-assistant.form.startDate': 'Start Date', - 'ai-trading-assistant.form.endDate': 'End Date', - 'ai-trading-assistant.form.qdtCostTitle': 'QDT Cost Notice', - 'ai-trading-assistant.form.qdtCostHint': 'Each AI decision will cost {cost} QDT. Please ensure your account has sufficient QDT balance. During strategy execution, each decision will be charged in real-time.', - 'ai-trading-assistant.form.apiKey': 'API Key', - 'ai-trading-assistant.form.exchange': 'Select Exchange', - 'ai-trading-assistant.form.secretKey': 'Secret Key', - 'ai-trading-assistant.form.passphrase': 'Passphrase', - 'ai-trading-assistant.form.testConnection': 'Test Connection', - 'ai-trading-assistant.form.symbol': 'Trading Pair', - 'ai-trading-assistant.form.symbolHint': 'Select the trading pair to trade', - 'ai-trading-assistant.form.initialCapital': 'Initial Capital (Margin)', - 'ai-trading-assistant.form.leverage': 'Leverage', - 'ai-trading-assistant.form.timeframe': 'Timeframe', - 'ai-trading-assistant.form.timeframe1m': '1 Minute', - 'ai-trading-assistant.form.timeframe5m': '5 Minutes', - 'ai-trading-assistant.form.timeframe15m': '15 Minutes', - 'ai-trading-assistant.form.timeframe30m': '30 Minutes', - 'ai-trading-assistant.form.timeframe1H': '1 Hour', - 'ai-trading-assistant.form.timeframe4H': '4 Hours', - 'ai-trading-assistant.form.timeframe1D': '1 Day', - 'ai-trading-assistant.form.marketType': 'Market Type', - 'ai-trading-assistant.form.marketTypeFutures': 'Futures', - 'ai-trading-assistant.form.marketTypeSpot': 'Spot', - 'ai-trading-assistant.form.totalPnl': 'Total PnL', - 'ai-trading-assistant.form.customPrompt': 'Custom Prompt', - 'ai-trading-assistant.form.customPromptHint': 'Optional, used to customize AI trading strategy and decision logic', - 'ai-trading-assistant.form.cancel': 'Cancel', - 'ai-trading-assistant.form.prev': 'Previous', - 'ai-trading-assistant.form.next': 'Next', - 'ai-trading-assistant.form.confirmCreate': 'Confirm Create', - 'ai-trading-assistant.form.confirmEdit': 'Confirm Edit', - 'ai-trading-assistant.messages.createSuccess': 'Strategy created successfully', - 'ai-trading-assistant.messages.createFailed': 'Failed to create strategy', - 'ai-trading-assistant.messages.updateSuccess': 'Strategy updated successfully', - 'ai-trading-assistant.messages.updateFailed': 'Failed to update strategy', - 'ai-trading-assistant.messages.deleteSuccess': 'Strategy deleted successfully', - 'ai-trading-assistant.messages.deleteFailed': 'Failed to delete strategy', - 'ai-trading-assistant.messages.startSuccess': 'Strategy started successfully', - 'ai-trading-assistant.messages.startFailed': 'Failed to start strategy', - 'ai-trading-assistant.messages.stopSuccess': 'Strategy stopped successfully', - 'ai-trading-assistant.messages.stopFailed': 'Failed to stop strategy', - 'ai-trading-assistant.messages.loadFailed': 'Failed to load strategy list', - 'ai-trading-assistant.messages.loadDecisionsFailed': 'Failed to load AI decision records', - 'ai-trading-assistant.messages.deleteConfirm': 'Are you sure you want to delete this strategy? This action cannot be undone.', - 'ai-trading-assistant.placeholders.inputStrategyName': 'Please enter strategy name', - 'ai-trading-assistant.placeholders.selectModelId': 'Please select AI model', - 'ai-trading-assistant.placeholders.selectDecideInterval': 'Please select decision interval', - 'ai-trading-assistant.placeholders.startTime': 'Start Time', - 'ai-trading-assistant.placeholders.endTime': 'End Time', - 'ai-trading-assistant.placeholders.inputApiKey': 'Please enter API Key', - 'ai-trading-assistant.placeholders.selectExchange': 'Please select an exchange', - 'ai-trading-assistant.placeholders.inputSecretKey': 'Please enter Secret Key', - 'ai-trading-assistant.placeholders.inputPassphrase': 'Please enter Passphrase', - 'ai-trading-assistant.placeholders.selectSymbol': 'Please select trading pair, e.g.: BTC/USDT', - 'ai-trading-assistant.placeholders.selectTimeframe': 'Please select timeframe', - 'ai-trading-assistant.placeholders.inputCustomPrompt': 'Please enter custom prompt (optional)', - 'ai-trading-assistant.validation.strategyNameRequired': 'Please enter strategy name', - 'ai-trading-assistant.validation.modelIdRequired': 'Please select AI model', - 'ai-trading-assistant.validation.runPeriodRequired': 'Please select run period', - 'ai-trading-assistant.validation.apiKeyRequired': 'Please enter API Key', - 'ai-trading-assistant.validation.exchangeRequired': 'Please select an exchange', - 'ai-trading-assistant.validation.secretKeyRequired': 'Please enter Secret Key', - 'ai-trading-assistant.validation.symbolRequired': 'Please select trading pair', - 'ai-trading-assistant.validation.initialCapitalRequired': 'Please enter initial capital', - 'ai-trading-assistant.table.time': 'Time', - 'ai-trading-assistant.table.type': 'Type', - 'ai-trading-assistant.table.price': 'Price', - 'ai-trading-assistant.table.amount': 'Amount', - 'ai-trading-assistant.table.value': 'Value', - 'ai-trading-assistant.table.symbol': 'Trading Pair', - 'ai-trading-assistant.table.side': 'Side', - 'ai-trading-assistant.table.size': 'Position Size', - 'ai-trading-assistant.table.entryPrice': 'Entry Price', - 'ai-trading-assistant.table.currentPrice': 'Current Price', - 'ai-trading-assistant.table.unrealizedPnl': 'Unrealized P&L', - 'ai-trading-assistant.table.profit': 'Profit', - 'ai-trading-assistant.table.openLong': 'Open Long', - 'ai-trading-assistant.table.closeLong': 'Close Long', - 'ai-trading-assistant.table.openShort': 'Open Short', - 'ai-trading-assistant.table.closeShort': 'Close Short', - 'ai-trading-assistant.table.addLong': 'Add Long', - 'ai-trading-assistant.table.addShort': 'Add Short', - 'ai-trading-assistant.table.closeShortProfit': 'Close Short (TP)', - 'ai-trading-assistant.table.closeShortStop': 'Close Short (SL)', - 'ai-trading-assistant.table.closeLongProfit': 'Close Long (TP)', - 'ai-trading-assistant.table.closeLongStop': 'Close Long (SL)', - 'ai-trading-assistant.table.buy': 'Buy', - 'ai-trading-assistant.table.sell': 'Sell', - 'ai-trading-assistant.table.long': 'Long', - 'ai-trading-assistant.table.short': 'Short', - 'ai-trading-assistant.table.hold': 'Hold', - 'ai-trading-assistant.table.reasoning': 'Analysis Reasoning', - 'ai-trading-assistant.table.decisions': 'Decisions', - 'ai-trading-assistant.table.riskAssessment': 'Risk', - 'ai-trading-assistant.table.confidence': 'Confidence', - 'ai-trading-assistant.table.totalRecords': 'Total {total} records', - 'ai-trading-assistant.table.noPositions': 'No positions', - 'ai-trading-assistant.detail.title': 'Strategy Details', - 'ai-trading-assistant.equity.noData': 'No equity data', - 'ai-trading-assistant.equity.equity': 'Equity', - 'ai-trading-assistant.exchange.testFailed': 'Connection test failed', - 'ai-trading-assistant.exchange.connectionSuccess': 'Connection successful', - 'ai-trading-assistant.exchange.connectionFailed': 'Connection failed', - 'ai-trading-assistant.form.advancedSettings': 'Advanced Settings', - 'ai-trading-assistant.form.orderMode': 'Order Mode', - 'ai-trading-assistant.form.orderModeMaker': 'Maker (Limit)', - 'ai-trading-assistant.form.orderModeTaker': 'Taker (Market)', - 'ai-trading-assistant.form.orderModeHint': 'Maker mode uses limit orders with lower fees; Taker mode executes immediately with higher fees', - 'ai-trading-assistant.form.makerWaitSec': 'Maker Wait Time (seconds)', - 'ai-trading-assistant.form.makerWaitSecHint': 'Time to wait for order fill before canceling and retrying', - 'ai-trading-assistant.form.makerRetries': 'Maker Retries', - 'ai-trading-assistant.form.makerRetriesHint': 'Maximum number of retries when maker order is not filled', - 'ai-trading-assistant.form.fallbackToMarket': 'Fallback to Market on failure', - 'ai-trading-assistant.form.fallbackToMarketHint': 'If limit order (open/close) is not filled, downgrade to market order to ensure execution', - 'ai-trading-assistant.form.marginMode': 'Margin Mode', - 'ai-trading-assistant.form.marginModeCross': 'Cross Margin', - 'ai-trading-assistant.form.marginModeIsolated': 'Isolated Margin', - 'ai-analysis.title': 'Quantum Trading Engine', - 'ai-analysis.system.online': 'ONLINE', - 'ai-analysis.system.agents': 'AGENTS', - 'ai-analysis.system.active': 'ACTIVE', - 'ai-analysis.system.stage': 'STAGE', - 'ai-analysis.panel.roster': 'AGENTS ROSTER', - 'ai-analysis.panel.thinking': 'Thinking...', - 'ai-analysis.panel.done': 'Done', - 'ai-analysis.panel.standby': 'Standby', - 'ai-analysis.input.title': 'QUANTUM TRADING ENGINE', - 'ai-analysis.input.placeholder': 'SELECT TARGET ASSET (e.g. BTC/USDT)', - 'ai-analysis.input.watchlist': 'Watchlist', - 'ai-analysis.input.start': 'START ANALYSIS', - 'ai-analysis.input.recent': 'RECENT MISSIONS:', - 'ai-analysis.vis.stage': 'STAGE', - 'ai-analysis.vis.processing': 'PROCESSING', - 'ai-analysis.result.complete': 'ANALYSIS COMPLETE', - 'ai-analysis.result.signal': 'FINAL SIGNAL', - 'ai-analysis.result.confidence': 'CONFIDENCE:', - 'ai-analysis.result.new': 'NEW ANALYSIS', - 'ai-analysis.result.full': 'VIEW FULL DOSSIER', - 'ai-analysis.logs.title': 'SYSTEM LOGS', - 'ai-analysis.modal.title': 'CLASSIFIED REPORT', - 'ai-analysis.modal.fundamental': 'FUNDAMENTAL ANALYSIS', - 'ai-analysis.modal.technical': 'TECHNICAL ANALYSIS', - 'ai-analysis.modal.sentiment': 'SENTIMENT ANALYSIS', - 'ai-analysis.modal.risk': 'RISK ASSESSMENT', - 'ai-analysis.stage.idle': 'IDLE', - 'ai-analysis.stage.1': 'PHASE 1: MULTI-DIMENSIONAL ANALYSIS', - 'ai-analysis.stage.2': 'PHASE 2: BULL/BEAR DEBATE', - 'ai-analysis.stage.3': 'PHASE 3: STRATEGIC PLANNING', - 'ai-analysis.stage.4': 'PHASE 4: RISK COMMITTEE REVIEW', - 'ai-analysis.stage.complete': 'COMPLETE', - 'ai-analysis.agent.investment_director': 'Investment Director', - 'ai-analysis.agent.role.investment_director': 'Comprehensive Analysis & Final Conclusion', - 'ai-analysis.agent.market': 'Market Analyst', - 'ai-analysis.agent.role.market': 'Technical & Market Data', - 'ai-analysis.agent.fundamental': 'Fundamental Analyst', - 'ai-analysis.agent.role.fundamental': 'Financials & Valuation', - 'ai-analysis.agent.technical': 'Technical Analyst', - 'ai-analysis.agent.role.technical': 'Technical Indicators & Charts', - 'ai-analysis.agent.news': 'News Analyst', - 'ai-analysis.agent.role.news': 'Global News Filter', - 'ai-analysis.agent.sentiment': 'Sentiment Analyst', - 'ai-analysis.agent.role.sentiment': 'Social & Emotional', - 'ai-analysis.agent.risk': 'Risk Analyst', - 'ai-analysis.agent.role.risk': 'Basic Risk Check', - 'ai-analysis.agent.bull': 'Bull Researcher', - 'ai-analysis.agent.role.bull': 'Growth Catalyst Hunter', - 'ai-analysis.agent.bear': 'Bear Researcher', - 'ai-analysis.agent.role.bear': 'Risk & Flaw Hunter', - 'ai-analysis.agent.manager': 'Research Manager', - 'ai-analysis.agent.role.manager': 'Debate Moderator', - 'ai-analysis.agent.trader': 'Trader Agent', - 'ai-analysis.agent.role.trader': 'Execution Strategist', - 'ai-analysis.agent.risky': 'Risky Analyst', - 'ai-analysis.agent.role.risky': 'Aggressive Strategy', - 'ai-analysis.agent.neutral': 'Neutral Analyst', - 'ai-analysis.agent.role.neutral': 'Balanced Strategy', - 'ai-analysis.agent.safe': 'Safe Analyst', - 'ai-analysis.agent.role.safe': 'Conservative Strategy', - 'ai-analysis.agent.cro': 'Risk Manager (CRO)', - 'ai-analysis.agent.role.cro': 'Final Decision Authority', - 'ai-analysis.script.market': 'Fetching OHLCV data from major exchanges...', - 'ai-analysis.script.fundamental': 'Retrieving quarterly financial reports...', - 'ai-analysis.script.technical': 'Analyzing technical indicators and chart patterns...', - 'ai-analysis.script.news': 'Scanning global financial news feeds...', - 'ai-analysis.script.sentiment': 'Analyzing social media trends...', - 'ai-analysis.script.risk': 'Calculating historical volatility...', - 'invite.inviteLink': 'Invite Link', - 'invite.copy': 'Copy Link', - 'invite.copySuccess': 'Copied successfully!', - 'invite.copyFailed': 'Copy failed, please copy manually', - 'invite.noInviteLink': 'Invite link not generated', - 'invite.totalInvites': 'Total Invites', - 'invite.totalReward': 'Total Reward', - 'invite.rules': 'Invite Rules', - 'invite.rule1': 'You will receive a reward for each friend you successfully invite to register', - 'invite.rule2': 'When your invited friend completes their first transaction, you will receive an additional reward', - 'invite.rule3': 'Invite rewards will be directly credited to your account', - 'invite.inviteList': 'Invite List', - 'invite.tasks': 'Task Center', - 'invite.inviteeName': 'Invitee', - 'invite.inviteTime': 'Invite Time', - 'invite.status': 'Status', - 'invite.reward': 'Reward', - 'invite.active': 'Active', - 'invite.inactive': 'Inactive', - 'invite.completed': 'Completed', - 'invite.claimed': 'Claimed', - 'invite.pending': 'Pending', - 'invite.goToTask': 'Go to Task', - 'invite.claimReward': 'Claim Reward', - 'invite.verify': 'Verify', - 'invite.verifySuccess': 'Verification successful! Task completed', - 'invite.verifyNotCompleted': 'Task not completed yet, please complete the task first', - 'invite.verifyFailed': 'Verification failed, please try again later', - 'invite.claimSuccess': 'Successfully claimed {reward} QDT!', - 'invite.claimFailed': 'Claim failed, please try again later', - 'invite.totalRecords': 'Total {total} records', - 'invite.task.twitter.title': 'Share Tweet on X (Twitter)', - 'invite.task.twitter.desc': 'Share our official tweet to your X (Twitter) account', - 'invite.task.youtube.title': 'Follow our YouTube Channel', - 'invite.task.youtube.desc': 'Subscribe and follow our official YouTube channel', - 'invite.task.telegram.title': 'Join Telegram Group', - 'invite.task.telegram.desc': 'Join our official Telegram community group', - 'invite.task.discord.title': 'Join Discord Server', - 'invite.task.discord.desc': 'Join our Discord community server', - 'message': '-', - 'layouts.usermenu.dialog.title': 'Message', - 'layouts.usermenu.dialog.content': 'Are you sure you would like to logout?', - 'layouts.userLayout.title': 'Clarity from Uncertainty', - // Signal Robot - 'signal-robot.title': 'Signal Robot Console', - 'signal-robot.createBot': 'Create New Bot', - 'signal-robot.search.nameOrSymbol': 'Name/Symbol', - 'signal-robot.search.placeholder': 'Search bot name or symbol', - 'signal-robot.search.status': 'Status', - 'signal-robot.search.statusAll': 'All', - 'signal-robot.search.statusRunning': 'Running', - 'signal-robot.search.statusPaused': 'Paused', - 'signal-robot.search.query': 'Query', - 'signal-robot.search.reset': 'Reset', - 'signal-robot.table.botName': 'Bot Name', - 'signal-robot.table.symbolTimeframe': 'Symbol/Timeframe', - 'signal-robot.table.triggerStrategy': 'Trigger Strategy', - 'signal-robot.table.notificationChannels': 'Notification Channels', - 'signal-robot.table.status': 'Status', - 'signal-robot.table.action': 'Action', - 'signal-robot.table.triggerConditions': '{count} trigger conditions', - 'signal-robot.table.monitoring': 'Monitoring', - 'signal-robot.table.paused': 'Paused', - 'signal-robot.table.edit': 'Edit', - 'signal-robot.table.pause': 'Pause', - 'signal-robot.table.start': 'Start', - 'signal-robot.table.delete': 'Delete', - 'signal-robot.table.deleteConfirm': 'Are you sure you want to delete this bot?', - 'signal-robot.table.deleteSuccess': 'Deleted successfully', - 'signal-robot.table.startSuccess': 'Bot started', - 'signal-robot.table.pauseSuccess': 'Bot paused', - 'signal-robot.channel.telegram': 'Telegram', - 'signal-robot.channel.discord': 'Discord', - 'signal-robot.channel.email': 'Email', - 'signal-robot.channel.webhook': 'Webhook', - 'signal-robot.channel.browser': 'Browser Push', - 'signal-robot.modal.createTitle': 'Create New Signal Robot', - 'signal-robot.modal.editTitle': 'Edit Signal Robot', - 'signal-robot.modal.step.basic': 'Basic Settings', - 'signal-robot.modal.step.entry': 'Entry Strategy', - 'signal-robot.modal.step.position': 'Position Management', - 'signal-robot.modal.step.risk': 'Risk Control', - 'signal-robot.modal.step.notify': 'Notification Config', - 'signal-robot.modal.prev': 'Previous', - 'signal-robot.modal.next': 'Next', - 'signal-robot.modal.preview': 'Preview Backtest', - 'signal-robot.modal.complete': 'Complete & Run', - 'signal-robot.modal.saveSuccess': 'Saved successfully', - 'signal-robot.modal.previewDeveloping': 'Preview feature is under development...', - 'signal-robot.modal.basicInfoRequired': 'Please complete basic information', - 'signal-robot.basic.alert': 'Set basic information for the bot', - 'signal-robot.basic.title': 'Basic Information', - 'signal-robot.basic.botName': 'Bot Name', - 'signal-robot.basic.botNamePlaceholder': 'e.g.: BTC SuperTrend Strategy', - 'signal-robot.basic.symbol': 'Trading Pair', - 'signal-robot.basic.symbolPlaceholder': 'Select from watchlist', - 'signal-robot.basic.noWatchlist': 'No watchlist items, please add in market page first', - 'signal-robot.basic.timeframe': 'K-Line Period', - 'signal-robot.basic.timeframe15m': '15 Minutes', - 'signal-robot.basic.timeframe30m': '30 Minutes', - 'signal-robot.basic.timeframe1h': '1 Hour', - 'signal-robot.basic.timeframe4h': '4 Hours', - 'signal-robot.basic.timeframe1d': '1 Day', - 'signal-robot.basic.autoNameSuggestion': '{symbol} Signal Robot', - 'signal-robot.entry.alert': 'Trigger entry signal when all conditions below are met', - 'signal-robot.entry.condition': 'Condition {index}', - 'signal-robot.entry.indicator': 'Indicator', - 'signal-robot.entry.indicatorSupertrend': 'SuperTrend', - 'signal-robot.entry.indicatorEma': 'EMA (Exponential Moving Average)', - 'signal-robot.entry.indicatorRsi': 'RSI (Relative Strength Index)', - 'signal-robot.entry.indicatorMacd': 'MACD', - 'signal-robot.entry.indicatorBollinger': 'Bollinger Bands', - 'signal-robot.entry.atrPeriod': 'ATR Period', - 'signal-robot.entry.multiplier': 'Multiplier', - 'signal-robot.entry.triggerSignal': 'Trigger Signal', - 'signal-robot.entry.signalTrendBullish': 'Trend Bullish', - 'signal-robot.entry.signalTrendBearish': 'Trend Bearish', - 'signal-robot.entry.signalIsUptrend': 'Is Uptrend', - 'signal-robot.entry.signalIsDowntrend': 'Is Downtrend', - 'signal-robot.entry.period': 'Period', - 'signal-robot.entry.compareCondition': 'Compare Condition', - 'signal-robot.entry.priceAbove': 'Price > EMA (Price Above)', - 'signal-robot.entry.priceBelow': 'Price < EMA (Price Below)', - 'signal-robot.entry.crossUp': 'Price Crosses Above EMA (Golden Cross)', - 'signal-robot.entry.crossDown': 'Price Crosses Below EMA (Death Cross)', - 'signal-robot.entry.compare': 'Compare', - 'signal-robot.entry.greaterThan': 'Greater Than', - 'signal-robot.entry.lessThan': 'Less Than', - 'signal-robot.entry.crossUpShort': 'Cross Up', - 'signal-robot.entry.crossDownShort': 'Cross Down', - 'signal-robot.entry.threshold': 'Threshold', - 'signal-robot.entry.selectIndicator': 'Please select an indicator to configure parameters', - 'signal-robot.entry.addCondition': 'Add Condition', - 'signal-robot.position.alert': 'Configure initial position size, leverage and pyramiding rules', - 'signal-robot.position.basicTitle': 'Basic Position Management', - 'signal-robot.position.initialSize': 'Initial Size (Capital %)', - 'signal-robot.position.initialSizeHint': 'Recommended 5% - 20%', - 'signal-robot.position.leverage': 'Leverage', - 'signal-robot.position.leverageHint': 'Please ensure your exchange account supports this leverage', - 'signal-robot.position.maxPyramiding': 'Max Pyramiding Times', - 'signal-robot.position.maxPyramidingHint': '0 means no pyramiding', - 'signal-robot.position.pyramidingTitle': 'Pyramiding Rules', - 'signal-robot.position.pyramidingEnabled': 'Enabled', - 'signal-robot.position.pyramidingDisabled': 'Disabled', - 'signal-robot.position.pyramidingCondition': 'Pyramiding Trigger Condition', - 'signal-robot.position.priceRisePct': 'Price Rises (Long) / Falls (Short)', - 'signal-robot.position.profitPct': 'Profit Reaches', - 'signal-robot.position.triggerThreshold': 'Trigger Threshold (%)', - 'signal-robot.position.triggerThresholdHint': 'e.g. 3%: add position once every 3% rise', - 'signal-robot.position.addSize': 'Single Add Size (Capital %)', - 'signal-robot.position.pyramidingDisabledHint': 'Pyramiding disabled, only initial position will be executed', - 'signal-robot.risk.alert': 'Configure take profit, stop loss and exit rules', - 'signal-robot.risk.stopLossTitle': 'Stop Loss', - 'signal-robot.risk.stopLossEnabled': 'Enabled', - 'signal-robot.risk.stopLossDisabled': 'Disabled', - 'signal-robot.risk.stopLossType': 'Stop Loss Type', - 'signal-robot.risk.stopLossFixedPct': 'Fixed Percentage', - 'signal-robot.risk.stopLossAtrMultiplier': 'ATR Multiplier', - 'signal-robot.risk.stopLossValue': 'Value', - 'signal-robot.risk.stopLossFixedHint': 'e.g. 2%: stop loss when loss reaches 2%', - 'signal-robot.risk.stopLossAtrHint': 'e.g. 2.0: stop loss when price touches ATR*2.0', - 'signal-robot.risk.stopLossDisabledHint': 'Stop loss disabled (high risk)', - 'signal-robot.risk.trailingStopTitle': 'Trailing Stop', - 'signal-robot.risk.activationProfit': 'Activation Profit (%)', - 'signal-robot.risk.activationProfitHint': 'Start trailing when profit reaches this level', - 'signal-robot.risk.callbackPct': 'Callback (%)', - 'signal-robot.risk.callbackPctHint': 'Trigger take profit when price falls from peak by this percentage', - 'signal-robot.risk.trailingStopDisabledHint': 'Trailing stop disabled', - 'signal-robot.risk.otherExitTitle': 'Other Exit Rules', - 'signal-robot.risk.signalExit': 'Allow Signal Exit', - 'signal-robot.risk.signalExitHint': 'Close position immediately when reverse signal appears (e.g. close long when short signal appears)', - 'signal-robot.notify.alert': 'Configure notification methods when signal is triggered', - 'signal-robot.notify.channelTitle': 'Notification Channels', - 'signal-robot.notify.discordWebhook': 'Discord Webhook', - 'signal-robot.notify.genericWebhook': 'Generic Webhook', - 'signal-robot.notify.webhookUrl': 'Webhook URL', - 'signal-robot.notify.webhookUrlPlaceholder': 'https://example.com/webhook', - 'signal-robot.notify.discordUrl': 'Discord URL', - 'signal-robot.notify.discordUrlPlaceholder': 'https://discord.com/api/webhooks/...', - 'signal-robot.operator.greaterThan': 'Greater Than', - 'signal-robot.operator.lessThan': 'Less Than', - 'signal-robot.operator.equal': 'Equal', - 'signal-robot.operator.goldenCross': 'Golden Cross', - 'signal-robot.operator.deathCross': 'Death Cross', - 'signal-robot.operator.increaseBy': 'Increase By', - 'signal-robot.operator.decreaseBy': 'Decrease By', - 'signal-robot.indicator.price': 'Price', - 'signal-robot.indicator.rsi': 'RSI', - 'signal-robot.indicator.kdjK': 'KDJ(K)', - 'signal-robot.indicator.kdjJ': 'KDJ(J)', - 'signal-robot.indicator.macd': 'MACD', - 'signal-robot.indicator.macdHist': 'MACD Histogram', - 'signal-robot.indicator.bollingerUp': 'Bollinger Upper', - 'signal-robot.indicator.bollingerLow': 'Bollinger Lower', - 'signal-robot.indicator.volume': 'Volume', - 'signal-robot.indicator.changePct1h': '1H Change %', - 'signal-robot.indicator.changePct24h': '24H Change %', - 'signal-robot.indicator.signalLine': 'Signal Line', - - // Settings - 'settings.title': 'System Settings', - 'settings.description': 'Configure application settings, API keys, and system preferences', - 'settings.save': 'Save Settings', - 'settings.reset': 'Reset', - 'settings.saveSuccess': 'Settings saved successfully', - 'settings.saveFailed': 'Failed to save settings', - 'settings.loadFailed': 'Failed to load settings', - 'settings.openrouterBalance': 'OpenRouter Account Balance', - 'settings.queryBalance': 'Query Balance', - 'settings.balanceUsage': 'Used', - 'settings.balanceRemaining': 'Remaining', - 'settings.balanceLimit': 'Total Limit', - 'settings.balanceQuerySuccess': 'Balance query successful', - 'settings.balanceQueryFailed': 'Failed to query balance', - 'settings.balanceNotQueried': 'Click "Query Balance" to get account info', - 'settings.default': 'Default', - 'settings.pleaseSelect': 'Please select', - 'settings.inputApiKey': 'Enter key', - 'settings.getApi': 'Get API', - // Settings link texts - 'settings.link.getApi': 'Get API', - 'settings.link.getApiKey': 'Get API Key', - 'settings.link.getToken': 'Get Token', - 'settings.link.createBot': 'Create Bot', - 'settings.link.viewModels': 'View Models', - 'settings.link.freeRegister': 'Free Register', - 'settings.link.supportedExchanges': 'Supported Exchanges', - 'settings.link.applyApi': 'Apply API', - 'settings.link.createSearchEngine': 'Create Search Engine', - 'settings.link.getTurnstileKey': 'Get Turnstile Key', - 'settings.link.getGoogleCredentials': 'Get Google Credentials', - 'settings.link.getGithubCredentials': 'Get GitHub Credentials', - 'settings.restartRequired': 'Settings saved. Some changes require Python service restart to take effect.', - 'settings.copyRestartCmd': 'Copy restart command', - 'settings.copySuccess': 'Copied', - 'settings.copyFailed': 'Copy failed', - // Settings groups - // Settings groups (ordered by backend order) - 'settings.group.server': 'Server Configuration', - 'settings.group.auth': 'Security & Authentication', - 'settings.group.ai': 'AI / LLM Configuration', - 'settings.group.trading': 'Live Trading', - 'settings.group.strategy': 'Strategy Execution', - 'settings.group.data_source': 'Data Sources', - 'settings.group.notification': 'Notifications', - 'settings.group.email': 'Email (SMTP)', - 'settings.group.sms': 'SMS (Twilio)', - 'settings.group.agent': 'AI Agent', - 'settings.group.network': 'Network & Proxy', - 'settings.group.search': 'Web Search', - 'settings.group.security': 'Registration & Security', - 'settings.group.app': 'Application', - // Settings fields - Auth - 'settings.field.SECRET_KEY': 'Secret Key', - 'settings.field.ADMIN_USER': 'Admin Username', - 'settings.field.ADMIN_PASSWORD': 'Admin Password', - 'settings.field.ADMIN_EMAIL': 'Admin Email', - // Settings fields - Security - 'settings.field.ENABLE_REGISTRATION': 'Enable Registration', - 'settings.field.TURNSTILE_SITE_KEY': 'Turnstile Site Key', - 'settings.field.TURNSTILE_SECRET_KEY': 'Turnstile Secret Key', - 'settings.field.FRONTEND_URL': 'Frontend URL', - 'settings.field.GOOGLE_CLIENT_ID': 'Google Client ID', - 'settings.field.GOOGLE_CLIENT_SECRET': 'Google Client Secret', - 'settings.field.GOOGLE_REDIRECT_URI': 'Google Redirect URI', - 'settings.field.GITHUB_CLIENT_ID': 'GitHub Client ID', - 'settings.field.GITHUB_CLIENT_SECRET': 'GitHub Client Secret', - 'settings.field.GITHUB_REDIRECT_URI': 'GitHub Redirect URI', - 'settings.field.SECURITY_IP_MAX_ATTEMPTS': 'IP Max Failed Attempts', - 'settings.field.SECURITY_IP_WINDOW_MINUTES': 'IP Window (minutes)', - 'settings.field.SECURITY_IP_BLOCK_MINUTES': 'IP Block Duration (minutes)', - 'settings.field.SECURITY_ACCOUNT_MAX_ATTEMPTS': 'Account Max Failed Attempts', - 'settings.field.SECURITY_ACCOUNT_WINDOW_MINUTES': 'Account Window (minutes)', - 'settings.field.SECURITY_ACCOUNT_BLOCK_MINUTES': 'Account Block Duration (minutes)', - 'settings.field.VERIFICATION_CODE_EXPIRE_MINUTES': 'Verification Code Expiry (minutes)', - 'settings.field.VERIFICATION_CODE_RATE_LIMIT': 'Code Rate Limit (seconds)', - 'settings.field.VERIFICATION_CODE_IP_HOURLY_LIMIT': 'Code Hourly Limit per IP', - 'settings.field.VERIFICATION_CODE_MAX_ATTEMPTS': 'Code Max Attempts', - 'settings.field.VERIFICATION_CODE_LOCK_MINUTES': 'Code Lock Minutes', - // Settings fields - Server - 'settings.field.PYTHON_API_HOST': 'Listen Address', - 'settings.field.PYTHON_API_PORT': 'Port', - 'settings.field.PYTHON_API_DEBUG': 'Debug Mode', - // Settings fields - Worker - 'settings.field.ENABLE_PENDING_ORDER_WORKER': 'Enable Order Worker', - 'settings.field.PENDING_ORDER_STALE_SEC': 'Order Stale Timeout (sec)', - // Settings fields - Trading - 'settings.field.ORDER_MODE': 'Order Mode', - 'settings.field.MAKER_WAIT_SEC': 'Limit Order Wait Time (sec)', - 'settings.field.MAKER_OFFSET_BPS': 'Limit Order Price Offset (bps)', - // Settings fields - Notification - 'settings.field.SIGNAL_WEBHOOK_URL': 'Webhook URL', - 'settings.field.SIGNAL_WEBHOOK_TOKEN': 'Webhook Token', - 'settings.field.SIGNAL_NOTIFY_TIMEOUT_SEC': 'Notify Timeout (sec)', - 'settings.field.TELEGRAM_BOT_TOKEN': 'Telegram Bot Token', - // Settings fields - SMTP - 'settings.field.SMTP_HOST': 'SMTP Host', - 'settings.field.SMTP_PORT': 'SMTP Port', - 'settings.field.SMTP_USER': 'SMTP Username', - 'settings.field.SMTP_PASSWORD': 'SMTP Password', - 'settings.field.SMTP_FROM': 'From Address', - 'settings.field.SMTP_USE_TLS': 'Use TLS', - 'settings.field.SMTP_USE_SSL': 'Use SSL', - // Settings fields - Twilio - 'settings.field.TWILIO_ACCOUNT_SID': 'Account SID', - 'settings.field.TWILIO_AUTH_TOKEN': 'Auth Token', - 'settings.field.TWILIO_FROM_NUMBER': 'From Number', - // Settings fields - Strategy - 'settings.field.DISABLE_RESTORE_RUNNING_STRATEGIES': 'Disable Auto Restore', - 'settings.field.STRATEGY_TICK_INTERVAL_SEC': 'Tick Interval (sec)', - 'settings.field.PRICE_CACHE_TTL_SEC': 'Price Cache TTL (sec)', - // Settings fields - Proxy - 'settings.field.PROXY_PORT': 'Proxy Port', - 'settings.field.PROXY_HOST': 'Proxy Host', - 'settings.field.PROXY_SCHEME': 'Proxy Scheme', - 'settings.field.PROXY_URL': 'Full Proxy URL', - // Settings fields - App - 'settings.field.CORS_ORIGINS': 'CORS Origins', - 'settings.field.RATE_LIMIT': 'Rate Limit (per min)', - 'settings.field.ENABLE_CACHE': 'Enable Cache', - 'settings.field.ENABLE_REQUEST_LOG': 'Enable Request Log', - 'settings.field.ENABLE_AI_ANALYSIS': 'Enable AI Analysis', - // Settings fields - Memory/Reflection - 'settings.field.ENABLE_AGENT_MEMORY': 'Enable Agent Memory', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'Enable Vector Retrieval (Local)', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'Embedding Dimension', - 'settings.field.AGENT_MEMORY_TOP_K': 'Top-K Retrieval Count', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'Candidate Window Size', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': 'Time Decay Half-life (days)', - 'settings.field.AGENT_MEMORY_W_SIM': 'Similarity Weight', - 'settings.field.AGENT_MEMORY_W_RECENCY': 'Recency Weight', - 'settings.field.AGENT_MEMORY_W_RETURNS': 'Returns Weight', - // Settings fields - Reflection Worker - 'settings.field.ENABLE_REFLECTION_WORKER': 'Enable Auto Verification', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': 'Verification Interval (sec)', - // Settings fields - AI - 'settings.field.OPENROUTER_API_KEY': 'OpenRouter API Key', - 'settings.field.OPENROUTER_API_URL': 'OpenRouter API URL', - 'settings.field.OPENROUTER_MODEL': 'Default Model', - 'settings.field.OPENROUTER_TEMPERATURE': 'Temperature', - 'settings.field.OPENROUTER_MAX_TOKENS': 'Max Tokens', - 'settings.field.OPENROUTER_TIMEOUT': 'Timeout (sec)', - 'settings.field.OPENROUTER_CONNECT_TIMEOUT': 'Connect Timeout (sec)', - 'settings.field.AI_MODELS_JSON': 'Models JSON', - // Settings fields - Market - 'settings.field.MARKET_TYPES_JSON': 'Market Types JSON', - 'settings.field.TRADING_SUPPORTED_SYMBOLS_JSON': 'Supported Symbols JSON', - // Settings fields - Data Source - 'settings.field.DATA_SOURCE_TIMEOUT': 'Timeout (sec)', - 'settings.field.DATA_SOURCE_RETRY': 'Retry Count', - 'settings.field.DATA_SOURCE_RETRY_BACKOFF': 'Retry Backoff (sec)', - 'settings.field.FINNHUB_API_KEY': 'Finnhub API Key', - 'settings.field.FINNHUB_TIMEOUT': 'Finnhub Timeout (sec)', - 'settings.field.FINNHUB_RATE_LIMIT': 'Finnhub Rate Limit', - 'settings.field.CCXT_DEFAULT_EXCHANGE': 'CCXT Default Exchange', - 'settings.field.CCXT_TIMEOUT': 'CCXT Timeout (ms)', - 'settings.field.CCXT_PROXY': 'CCXT Proxy', - 'settings.field.AKSHARE_TIMEOUT': 'Akshare Timeout (sec)', - 'settings.field.YFINANCE_TIMEOUT': 'YFinance Timeout (sec)', - 'settings.field.TIINGO_API_KEY': 'Tiingo API Key', - 'settings.field.TIINGO_TIMEOUT': 'Tiingo Timeout (sec)', - // Settings fields - Search - 'settings.field.SEARCH_PROVIDER': 'Search Provider', - 'settings.field.SEARCH_MAX_RESULTS': 'Max Results', - 'settings.field.SEARCH_GOOGLE_API_KEY': 'Google API Key', - 'settings.field.SEARCH_GOOGLE_CX': 'Google CX', - 'settings.field.SEARCH_BING_API_KEY': 'Bing API Key', - 'settings.field.INTERNAL_API_KEY': 'Internal API Key', - - // Settings descriptions (config item descriptions) - // Note: These are optional since backend already provides English descriptions - 'settings.desc.ORDER_MODE': 'maker: Limit order first (lower fees), market: Market order (instant fill)', - 'settings.desc.MAKER_WAIT_SEC': 'Wait time for limit order fill before switching to market order', - 'settings.desc.MAKER_OFFSET_BPS': 'Price offset in basis points. Buy: price*(1-offset), Sell: price*(1+offset)', - 'settings.desc.TIINGO_API_KEY': 'Tiingo API key for Forex/Metals data (free tier does not support 1-minute data)', - 'settings.desc.TIINGO_TIMEOUT': 'Tiingo API request timeout', - - // Portfolio - 'portfolio.summary.totalValue': 'Total Value', - 'portfolio.summary.totalCost': 'Total Cost', - 'portfolio.summary.totalPnl': 'Total P&L', - 'portfolio.summary.positionCount': 'Positions', - 'portfolio.summary.profitLossRatio': 'Profit/Loss', - 'portfolio.summary.today': 'Today', - 'portfolio.summary.todayPnl': 'Today P&L', - 'portfolio.summary.bestPerformer': 'Best Performer', - 'portfolio.summary.worstPerformer': 'Worst Performer', - 'portfolio.summary.priceSync': 'Price Sync', - 'portfolio.summary.syncInterval': 'Refresh', - 'portfolio.summary.justNow': 'Just now', - 'portfolio.summary.ago': ' ago', - 'portfolio.positions.title': 'My Positions', - 'portfolio.positions.add': 'Add Position', - 'portfolio.positions.addFirst': 'Add Your First Position', - 'portfolio.positions.empty': 'No positions yet', - 'portfolio.positions.deleteConfirm': 'Are you sure to delete this position?', - 'portfolio.positions.currentPrice': 'Current', - 'portfolio.positions.entryPrice': 'Entry', - 'portfolio.positions.quantity': 'Quantity', - 'portfolio.positions.side': 'Side', - 'portfolio.positions.long': 'Long', - 'portfolio.positions.short': 'Short', - 'portfolio.positions.marketValue': 'Value', - 'portfolio.positions.pnl': 'P&L', - 'portfolio.positions.items': 'positions', - 'portfolio.monitors.title': 'AI Monitors', - 'portfolio.monitors.add': 'Add Monitor', - 'portfolio.monitors.addFirst': 'Add AI Monitor', - 'portfolio.monitors.empty': 'No monitors yet', - 'portfolio.monitors.deleteConfirm': 'Are you sure to delete this monitor?', - 'portfolio.monitors.interval': 'Interval', - 'portfolio.monitors.lastRun': 'Last Run', - 'portfolio.monitors.nextRun': 'Next Run', - 'portfolio.monitors.channels': 'Channels', - 'portfolio.monitors.runNow': 'Run Now', - 'portfolio.monitors.analysisResult': 'AI Analysis Result', - 'portfolio.monitors.runningTitle': 'AI Analysis Started', - 'portfolio.monitors.runningDesc': 'Analysis is running in background. Results will be pushed via notification. Analyzing multiple positions may take a few minutes.', - 'portfolio.monitors.timeoutTitle': 'Request Timeout', - 'portfolio.monitors.timeoutDesc': 'Analysis may still be running in background. Please check notifications for results later. If no notification is received, please try again.', - 'portfolio.modal.addPosition': 'Add Position', - 'portfolio.modal.editPosition': 'Edit Position', - 'portfolio.modal.addMonitor': 'Add Monitor', - 'portfolio.modal.editMonitor': 'Edit Monitor', - 'portfolio.form.market': 'Market', - 'portfolio.form.marketRequired': 'Please select a market', - 'portfolio.form.selectMarket': 'Select Market', - 'portfolio.form.symbol': 'Symbol', - 'portfolio.form.symbolRequired': 'Please enter symbol', - 'portfolio.form.searchSymbol': 'Search or enter symbol', - 'portfolio.form.useAsSymbol': 'Use', - 'portfolio.form.asSymbolCode': 'as symbol code', - 'portfolio.form.symbolHint': 'Search symbols or enter any code directly', - 'portfolio.form.side': 'Side', - 'portfolio.form.quantity': 'Quantity', - 'portfolio.form.quantityRequired': 'Please enter quantity', - 'portfolio.form.enterQuantity': 'Enter quantity', - 'portfolio.form.entryPrice': 'Entry Price', - 'portfolio.form.entryPriceRequired': 'Please enter entry price', - 'portfolio.form.enterEntryPrice': 'Enter entry price', - 'portfolio.form.notes': 'Notes', - 'portfolio.form.enterNotes': 'Optional: Add notes', - 'portfolio.form.monitorName': 'Monitor Name', - 'portfolio.form.monitorNameRequired': 'Please enter monitor name', - 'portfolio.form.enterMonitorName': 'e.g. Daily Portfolio Analysis', - 'portfolio.form.interval': 'Interval', - 'portfolio.form.minutes': 'minutes', - 'portfolio.form.hour': 'hour', - 'portfolio.form.hours': 'hours', - 'portfolio.form.notifyChannels': 'Notify Channels', - 'portfolio.form.browser': 'Browser', - 'portfolio.form.email': 'Email', - 'portfolio.form.telegramChatId': 'Telegram Chat ID', - 'portfolio.form.enterTelegramChatId': 'Enter Telegram Chat ID', - 'portfolio.form.telegramRequired': 'Please enter Telegram Chat ID', - 'portfolio.form.emailAddress': 'Email Address', - 'portfolio.form.enterEmail': 'Enter email address', - 'portfolio.form.emailRequired': 'Please enter email address', - 'portfolio.form.emailInvalid': 'Please enter a valid email address', - 'portfolio.form.customPrompt': 'Custom Prompt', - 'portfolio.form.customPromptPlaceholder': 'Optional: Add focus areas, e.g. "Focus on tech stock risks"', - 'portfolio.form.monitorScope': 'Monitor Scope', - 'portfolio.form.allPositions': 'All Positions', - 'portfolio.form.selectedPositions': 'Selected Positions', - 'portfolio.form.selectPositions': 'Select Positions', - 'portfolio.form.selectAll': 'Select All', - 'portfolio.form.deselectAll': 'Deselect All', - 'portfolio.form.selectedCount': '{count} of {total} selected', - 'portfolio.form.pleaseSelectPositions': 'Please select at least one position to monitor', - 'portfolio.message.loadFailed': 'Failed to load data', - 'portfolio.message.saveSuccess': 'Saved successfully', - 'portfolio.message.saveFailed': 'Failed to save', - 'portfolio.message.deleteSuccess': 'Deleted successfully', - 'portfolio.message.deleteFailed': 'Failed to delete', - 'portfolio.message.updateFailed': 'Failed to update', - 'portfolio.message.monitorEnabled': 'Monitor enabled', - 'portfolio.message.monitorDisabled': 'Monitor paused', - 'portfolio.message.monitorRunSuccess': 'Analysis completed', - 'portfolio.message.monitorRunFailed': 'Analysis failed', - 'portfolio.message.monitorRunning': 'AI analysis started, please wait for notification', - // Portfolio - Groups - 'portfolio.groups.all': 'All Positions', - 'portfolio.groups.ungrouped': 'Ungrouped', - 'portfolio.form.group': 'Group', - 'portfolio.form.enterGroup': 'Enter or select group', - // Portfolio - Alerts - 'portfolio.alerts.title': 'Price/PnL Alerts', - 'portfolio.alerts.addAlert': 'Add Alert', - 'portfolio.alerts.editAlert': 'Edit Alert', - 'portfolio.alerts.alertType': 'Alert Type', - 'portfolio.alerts.priceAbove': 'Price Above', - 'portfolio.alerts.priceBelow': 'Price Below', - 'portfolio.alerts.pnlAbove': 'Profit Above (%)', - 'portfolio.alerts.pnlBelow': 'Loss Below (%)', - 'portfolio.alerts.threshold': 'Threshold', - 'portfolio.alerts.thresholdRequired': 'Please enter threshold', - 'portfolio.alerts.enterPrice': 'Enter price', - 'portfolio.alerts.enterPercent': 'Enter percentage', - 'portfolio.alerts.currentPrice': 'Current Price', - 'portfolio.alerts.currentPriceHint': 'Current price', - 'portfolio.alerts.repeatInterval': 'Repeat Alert', - 'portfolio.alerts.noRepeat': 'No repeat (trigger once)', - 'portfolio.alerts.every5min': 'Every 5 minutes', - 'portfolio.alerts.every15min': 'Every 15 minutes', - 'portfolio.alerts.every30min': 'Every 30 minutes', - 'portfolio.alerts.every1hour': 'Every 1 hour', - 'portfolio.alerts.every4hours': 'Every 4 hours', - 'portfolio.alerts.onceDaily': 'Once daily', - 'portfolio.alerts.enabled': 'Enable Alert', - 'portfolio.alerts.enabledDesc': 'Auto-monitor and trigger notifications', - 'portfolio.alerts.delete': 'Delete', - 'portfolio.alerts.deleteConfirm': 'Are you sure you want to delete this alert?', - 'portfolio.modal.addAlert': 'Add Alert', - 'portfolio.modal.editAlert': 'Edit Alert', - - // User Management - 'menu.userManage': 'User Management', - 'menu.myProfile': 'My Profile', - 'common.actions': 'Actions', - 'common.refresh': 'Refresh', - - 'userManage.title': 'User Management', - 'userManage.searchPlaceholder': 'Search by username/email/nickname', - 'userManage.description': 'Manage system users, roles and permissions', - 'userManage.createUser': 'Create User', - 'userManage.editUser': 'Edit User', - 'userManage.username': 'Username', - 'userManage.password': 'Password', - 'userManage.nickname': 'Nickname', - 'userManage.email': 'Email', - 'userManage.role': 'Role', - 'userManage.status': 'Status', - 'userManage.lastLogin': 'Last Login', - 'userManage.active': 'Active', - 'userManage.disabled': 'Disabled', - 'userManage.neverLogin': 'Never', - 'userManage.usernameRequired': 'Please enter username', - 'userManage.usernamePlaceholder': 'Enter username', - 'userManage.passwordRequired': 'Please enter password', - 'userManage.passwordPlaceholder': 'Enter password (min 6 chars)', - 'userManage.passwordMin': 'Password must be at least 6 characters', - 'userManage.nicknamePlaceholder': 'Enter nickname', - 'userManage.emailPlaceholder': 'Enter email', - 'userManage.emailInvalid': 'Invalid email format', - 'userManage.rolePlaceholder': 'Select role', - 'userManage.statusPlaceholder': 'Select status', - 'userManage.resetPassword': 'Reset Password', - 'userManage.resetPasswordWarning': 'This will reset the user\'s password', - 'userManage.newPassword': 'New Password', - 'userManage.newPasswordPlaceholder': 'Enter new password', - 'userManage.confirmDelete': 'Are you sure to delete this user?', - 'userManage.roleAdmin': 'Admin', - 'userManage.roleManager': 'Manager', - 'userManage.roleUser': 'User', - 'userManage.roleViewer': 'Viewer', - - // Profile - 'profile.title': 'My Profile', - 'profile.description': 'Manage your account settings and preferences', - 'profile.basicInfo': 'Basic Info', - 'profile.changePassword': 'Change Password', - 'profile.username': 'Username', - 'profile.nickname': 'Nickname', - 'profile.email': 'Email', - 'profile.lastLogin': 'Last Login', - 'profile.nicknamePlaceholder': 'Enter your nickname', - 'profile.emailPlaceholder': 'Enter your email', - 'profile.emailInvalid': 'Invalid email format', - 'profile.emailCannotChange': 'Email cannot be changed after registration', - 'profile.passwordHint': 'Password must be at least 6 characters', - 'profile.oldPassword': 'Current Password', - 'profile.newPassword': 'New Password', - 'profile.confirmPassword': 'Confirm Password', - 'profile.oldPasswordRequired': 'Please enter current password', - 'profile.oldPasswordPlaceholder': 'Enter current password', - 'profile.newPasswordRequired': 'Please enter new password', - 'profile.newPasswordPlaceholder': 'Enter new password', - 'profile.confirmPasswordRequired': 'Please confirm password', - 'profile.confirmPasswordPlaceholder': 'Confirm new password', - 'profile.passwordMin': 'Password must be at least 6 characters', - 'profile.passwordMismatch': 'Passwords do not match', - - // Profile - Credits - 'profile.credits.title': 'My Credits', - 'profile.credits.unit': 'Credits', - 'profile.credits.recharge': 'Top Up', - 'profile.credits.vipExpires': 'VIP expires on', - 'profile.credits.vipExpired': 'VIP expired', - 'profile.credits.noVip': 'Not a VIP', - 'profile.credits.hint': 'AI analysis and other features consume credits. VIP users get free access.', - - // Profile - Credits Log - 'profile.creditsLog': 'Credits History', - 'profile.creditsLog.time': 'Time', - 'profile.creditsLog.action': 'Type', - 'profile.creditsLog.amount': 'Change', - 'profile.creditsLog.balance': 'Balance', - 'profile.creditsLog.remark': 'Remark', - 'profile.creditsLog.actionConsume': 'Consume', - 'profile.creditsLog.actionRecharge': 'Recharge', - 'profile.creditsLog.actionAdjust': 'Adjust', - 'profile.creditsLog.actionRefund': 'Refund', - 'profile.creditsLog.actionVipGrant': 'VIP Grant', - 'profile.creditsLog.actionVipRevoke': 'VIP Revoke', - 'profile.creditsLog.actionRegisterBonus': 'Register Bonus', - 'profile.creditsLog.actionReferralBonus': 'Referral Bonus', - - // Profile - Referral - 'profile.referral.title': 'Invite Friends', - 'profile.referral.listTab': 'Referrals', - 'profile.referral.totalInvited': 'Invited', - 'profile.referral.bonusPerInvite': 'Per Invite', - 'profile.referral.yourLink': 'Your Referral Link', - 'profile.referral.copyLink': 'Copy Link', - 'profile.referral.linkCopied': 'Referral link copied', - 'profile.referral.newUserBonus': 'New users get', - 'profile.referral.user': 'User', - 'profile.referral.registerTime': 'Registered', - 'profile.referral.noReferrals': 'No referrals yet', - 'profile.referral.shareNow': 'Share Now', - - // User Manage - Credits & VIP - 'userManage.credits': 'Credits', - 'userManage.adjustCredits': 'Adjust Credits', - 'userManage.setVip': 'Set VIP', - 'userManage.currentCredits': 'Current Credits', - 'userManage.newCredits': 'New Credits', - 'userManage.enterCredits': 'Enter new credits amount', - 'userManage.creditsNonNegative': 'Credits cannot be negative', - 'userManage.currentVip': 'Current VIP Status', - 'userManage.vipActive': 'Active', - 'userManage.vipExpired': 'Expired', - 'userManage.vipDays': 'VIP Days', - 'userManage.vipExpiresAt': 'VIP Expires At', - 'userManage.cancelVip': 'Cancel VIP', - 'userManage.days': 'days', - 'userManage.customDate': 'Custom Date', - 'userManage.selectDate': 'Please select a date', - 'userManage.remark': 'Remark', - 'userManage.remarkPlaceholder': 'Optional remark', - - // Settings - Billing - 'settings.group.billing': 'Billing & Credits', - 'settings.field.BILLING_ENABLED': 'Enable Billing', - 'settings.field.BILLING_VIP_BYPASS': 'VIP Free Access', - 'settings.field.BILLING_COST_AI_ANALYSIS': 'AI Analysis Cost', - 'settings.field.BILLING_COST_STRATEGY_RUN': 'Strategy Run Cost', - 'settings.field.BILLING_COST_BACKTEST': 'Backtest Cost', - 'settings.field.BILLING_COST_PORTFOLIO_MONITOR': 'Portfolio Monitor Cost', - 'settings.field.CREDITS_REGISTER_BONUS': 'Register Bonus', - 'settings.field.CREDITS_REFERRAL_BONUS': 'Referral Bonus', - 'settings.field.RECHARGE_TELEGRAM_URL': 'Recharge Telegram URL', - 'settings.desc.BILLING_ENABLED': 'Enable billing system. Users need credits to use certain features when enabled', - 'settings.desc.BILLING_VIP_BYPASS': 'VIP users can use all paid features for free during VIP period', - 'settings.desc.BILLING_COST_AI_ANALYSIS': 'Credits consumed per AI analysis request', - 'settings.desc.BILLING_COST_STRATEGY_RUN': 'Credits consumed when starting a strategy', - 'settings.desc.BILLING_COST_BACKTEST': 'Credits consumed per backtest run', - 'settings.desc.BILLING_COST_PORTFOLIO_MONITOR': 'Credits consumed per portfolio AI monitoring run', - 'settings.desc.CREDITS_REGISTER_BONUS': 'Credits awarded to new users on registration', - 'settings.desc.CREDITS_REFERRAL_BONUS': 'Credits awarded to referrer when someone signs up with their referral code', - 'settings.desc.VERIFICATION_CODE_MAX_ATTEMPTS': 'Maximum attempts to verify a code before lockout', - 'settings.desc.VERIFICATION_CODE_LOCK_MINUTES': 'Lockout duration after exceeding max attempts', - 'settings.desc.RECHARGE_TELEGRAM_URL': 'Telegram customer service URL for recharge inquiries' -} - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/fr-FR.js b/quantdinger_vue/src/locales/lang/fr-FR.js deleted file mode 100644 index 4e02ffd..0000000 --- a/quantdinger_vue/src/locales/lang/fr-FR.js +++ /dev/null @@ -1,1791 +0,0 @@ -import antdFrFR from 'ant-design-vue/es/locale-provider/fr_FR' -import momentFR from 'moment/locale/fr' - -const components = { - antLocale: antdFrFR, - momentName: 'fr', - momentLocale: momentFR -} - -const locale = { - 'submit': 'Soumettre', - 'save': 'enregistrer', - 'submit.ok': 'Soumission réussie', - 'save.ok': 'Enregistré avec succès', - 'menu.welcome': 'bienvenue', - 'menu.home': "Page d'accueil", - 'menu.dashboard': 'Tableau de bord', - 'menu.dashboard.indicator': 'Analyse des indicateurs', - 'menu.dashboard.community': 'communauté des indicateurs', - 'menu.dashboard.analysis': "Analyse de l'IA", - 'menu.dashboard.tradingAssistant': 'Assistante commerciale', - 'menu.dashboard.aiTradingAssistant': 'Assistant de trading IA', - 'menu.dashboard.signalRobot': 'Robot de signal', - 'menu.dashboard.monitor': 'Page de surveillance', - 'menu.dashboard.workplace': 'établi', - 'menu.form': 'page de formulaire', - 'menu.form.basic-form': 'forme de base', - 'menu.form.step-form': 'formulaire étape par étape', - 'menu.form.step-form.info': 'Formulaire étape par étape (remplir les informations de transfert)', - 'menu.form.step-form.confirm': 'Formulaire étape par étape (confirmer les informations de transfert)', - 'menu.form.step-form.result': 'Formulaire étape par étape (à compléter)', - 'menu.form.advanced-form': 'Formulaires avancés', - 'menu.list': 'Page de liste', - 'menu.list.table-list': 'Formulaire de demande', - 'menu.list.basic-list': 'Liste standard', - 'menu.list.card-list': 'liste de cartes', - 'menu.list.search-list': 'liste de recherche', - 'menu.list.search-list.articles': 'Liste de recherche (articles)', - 'menu.list.search-list.projects': 'Liste de recherche (projet)', - 'menu.list.search-list.applications': 'Liste de recherche (application)', - 'menu.profile': 'Page de détails', - 'menu.profile.basic': 'Page de détails de base', - 'menu.profile.advanced': 'Page de détails avancés', - 'menu.result': 'Page de résultats', - 'menu.result.success': 'page de réussite', - 'menu.result.fail': "page d'échec", - 'menu.exception': "Page d'exceptions", - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': 'erreur de déclenchement', - 'menu.account': 'Page personnelle', - 'menu.account.center': 'Centre personnel', - 'menu.account.settings': 'paramètres personnels', - 'menu.account.trigger': 'Erreur de déclenchement', - 'menu.account.logout': 'Se déconnecter', - 'menu.wallet': 'mon portefeuille', - 'menu.docs': 'Centre de documentation', - 'menu.docs.detail': 'Détails du document', - 'menu.header.refreshPage': 'actualiser la page', - 'menu.invite.friends': 'Inviter des amis', - 'app.setting.pagestyle': 'paramètres de style généraux', - 'app.setting.pagestyle.light': 'Style de menu lumineux', - 'app.setting.pagestyle.dark': 'style de menu sombre', - 'app.setting.pagestyle.realdark': 'mode sombre', - 'app.setting.themecolor': 'couleur du thème', - 'app.setting.navigationmode': 'Mode navigation', - 'app.setting.sidemenu.nav': 'Navigation dans la barre latérale', - 'app.setting.topmenu.nav': 'Navigation dans la barre supérieure', - 'app.setting.content-width': 'largeur de la zone de contenu', - 'app.setting.content-width.tooltip': "Ce paramètre n'est efficace que lorsque [Navigation dans la barre supérieure]", - 'app.setting.content-width.fixed': 'Corrigé', - 'app.setting.content-width.fluid': 'diffusion en continu', - 'app.setting.fixedheader': 'En-tête fixe', - 'app.setting.fixedheader.tooltip': "Configurable lorsqu'il est fixe", - 'app.setting.autoHideHeader': "Masquer l'en-tête lors du défilement", - 'app.setting.fixedsidebar': 'Menu latéral fixe', - 'app.setting.sidemenu': 'Disposition du menu latéral', - 'app.setting.topmenu': 'Disposition du menu supérieur', - 'app.setting.othersettings': 'Autres paramètres', - 'app.setting.weakmode': 'Mode de faiblesse des couleurs', - 'app.setting.multitab': 'Mode multi-onglets', - 'app.setting.copy': 'Paramètres de copie', - 'app.setting.loading': 'Chargement du thème', - 'app.setting.copyinfo': 'Copiez les paramètres avec succès src/config/defaultSettings.js', - 'app.setting.copy.success': 'Copie terminée', - 'app.setting.copy.fail': 'Échec de la copie', - 'app.setting.theme.switching': 'Changer de thème !', - 'app.setting.production.hint': "La barre de configuration est uniquement utilisée pour l'aperçu dans l'environnement de développement et ne sera pas affichée dans l'environnement de production. Veuillez copier et modifier le fichier de configuration manuellement.", - 'app.setting.themecolor.daybreak': 'Bleu aube (par défaut)', - 'app.setting.themecolor.dust': 'crépuscule', - 'app.setting.themecolor.volcano': 'volcan', - 'app.setting.themecolor.sunset': 'coucher de soleil', - 'app.setting.themecolor.cyan': 'Mingqing', - 'app.setting.themecolor.green': 'aurore verte', - 'app.setting.themecolor.geekblue': 'bleu geek', - 'app.setting.themecolor.purple': 'Jiang Zi', - 'app.setting.tooltip': 'Paramètres des pages', - 'user.login.userName': "Nom d'utilisateur", - 'user.login.password': 'Mot de passe', - 'user.login.username.placeholder': 'Compte : administrateur', - 'user.login.password.placeholder': 'Mot de passe : admin ou ant.design', - 'user.login.message-invalid-credentials': 'La connexion a échoué, veuillez vérifier votre e-mail et votre code de vérification', - 'user.login.message-invalid-verification-code': 'Erreur de code de vérification', - 'user.login.tab-login-credentials': 'Connexion par mot de passe du compte', - 'user.login.tab-login-email': 'Connexion par e-mail', - 'user.login.tab-login-mobile': 'Connexion au numéro de téléphone portable', - 'user.login.captcha.placeholder': 'Veuillez saisir le code de vérification graphique', - 'user.login.mobile.placeholder': 'Numéro de téléphone portable', - 'user.login.mobile.verification-code.placeholder': 'Code de vérification', - 'user.login.email.placeholder': 'Veuillez entrer votre adresse e-mail', - 'user.login.email.verification-code.placeholder': 'Veuillez entrer le code de vérification', - 'user.login.email.sending': "Le code de vérification est en cours d'envoi...", - 'user.login.email.send-success-title': 'Conseils', - 'user.login.email.send-success': 'Code de vérification envoyé avec succès, veuillez vérifier votre email', - 'user.login.sms.send-success': 'Code de vérification envoyé avec succès, veuillez vérifier le message texte', - 'user.login.remember-me': 'Connexion automatique', - 'user.login.forgot-password': 'Mot de passe oublié', - 'user.login.sign-in-with': 'Autres méthodes de connexion', - 'user.login.signup': 'Créer un compte', - 'user.login.login': 'Connexion', - 'user.register.register': "S'inscrire", - 'user.register.email.placeholder': 'Courriel', - 'user.register.password.placeholder': 'Veuillez saisir au moins 6 caractères. Veuillez ne pas utiliser de mots de passe faciles à deviner.', - 'user.register.password.popover-message': 'Veuillez saisir au moins 6 caractères. Veuillez ne pas utiliser de mots de passe faciles à deviner.', - 'user.register.confirm-password.placeholder': 'Confirmer le mot de passe', - 'user.register.get-verification-code': 'Obtenir le code de vérification', - 'user.register.sign-in': 'Connectez-vous en utilisant un compte existant', - 'user.register-result.msg': 'Votre compte : {email} Inscription réussie', - 'user.register-result.activation-email': "L'e-mail d'activation a été envoyé dans votre boîte mail et est valable 24 heures. Veuillez vous connecter rapidement à votre messagerie et cliquer sur le lien contenu dans l'e-mail pour activer votre compte.", - 'user.register-result.back-home': "Retour à la page d'accueil", - 'user.register-result.view-mailbox': 'Vérifiez votre boîte aux lettres', - 'user.email.required': 'Veuillez entrer votre adresse e-mail !', - 'user.email.wrong-format': "Le format de l'adresse e-mail est incorrect !", - 'user.userName.required': 'Veuillez saisir votre nom de compte ou votre adresse e-mail', - 'user.password.required': 'Veuillez entrer votre mot de passe !', - 'user.password.twice.msg': 'Les mots de passe saisis deux fois ne correspondent pas !', - 'user.password.strength.msg': "Le mot de passe n'est pas assez fort", - 'user.password.strength.strong': 'Force : Forte', - 'user.password.strength.medium': 'Force : moyenne', - 'user.password.strength.low': 'Force : faible', - 'user.password.strength.short': 'Force : trop courte', - 'user.confirm-password.required': 'Veuillez confirmer votre mot de passe !', - 'user.phone-number.required': 'Veuillez saisir le bon numéro de téléphone portable', - 'user.phone-number.wrong-format': 'Le format du numéro de téléphone portable est erroné !', - 'user.verification-code.required': 'Veuillez entrer le code de vérification !', - 'user.captcha.required': 'Veuillez saisir le code de vérification graphique !', - 'user.login.infos': "QuantDinger est un outil auxiliaire d'analyse boursière multi-agents d'IA et n'a pas de qualifications en conseil en investissement en valeurs mobilières. Tous les résultats d'analyse, scores et avis de référence de la plateforme sont automatiquement générés par l'IA sur la base de données historiques et sont utilisés uniquement à des fins d'apprentissage, de recherche et d'échange technique, et ne constituent aucun conseil d'investissement ou base de prise de décision. L'investissement en actions implique divers risques tels que le risque de marché, le risque de liquidité, le risque politique, etc., qui peuvent entraîner une perte du principal. Les utilisateurs doivent prendre des décisions indépendantes en fonction de leur propre tolérance au risque, et tout comportement d'investissement et conséquences découlant de l'utilisation de cet outil seront à la charge de l'utilisateur. Le marché est risqué et les investissements doivent être prudents.", - 'user.login.tab-login-web3': 'Connexion Web3', - 'user.login.web3.tip': "Connexion par signature à l'aide du portefeuille", - 'user.login.web3.connect': 'Connectez le portefeuille et connectez-vous', - 'user.login.web3.no-wallet': 'Portefeuille non détecté', - 'user.login.web3.no-address': 'Adresse du portefeuille non obtenue', - 'user.login.web3.nonce-failed': "Impossible d'obtenir un nombre aléatoire", - 'user.login.web3.verify-failed': 'La vérification de la signature a échoué', - 'user.login.web3.success': 'Connexion réussie', - 'user.login.web3.failed': 'Échec de la connexion au portefeuille', - 'nav.no_wallet': 'Portefeuille non détecté', - 'nav.copy': 'Copier', - 'nav.copy_success': 'Copié avec succès', - 'user.login.oauth.google': 'Connectez-vous avec Google', - 'user.login.oauth.github': 'Connectez-vous avec GitHub', - 'user.login.oauth.loading': "Redirection vers la page d'autorisation...", - 'user.login.oauth.failed': 'Échec de la connexion OAuth', - 'user.login.oauth.get-url-failed': "Échec de l'obtention du lien d'autorisation", - 'user.login.subtitle': 'Informations quantitatives sur les marchés mondiaux', - 'user.login.legal.title': 'Mentions légales', - 'user.login.legal.view': 'Voir les mentions légales', - 'user.login.legal.collapse': 'Réduire les mentions légales', - 'user.login.legal.agree': "J'ai lu et j'accepte les mentions légales", - 'user.login.legal.required': "Veuillez d'abord lire et vérifier les mentions légales", - 'user.login.legal.content': "QuantDinger est un outil auxiliaire d'analyse boursière multi-agents d'IA et n'a pas de qualifications en conseil en investissement en valeurs mobilières. Tous les résultats d'analyse, notes et avis de référence de la plateforme sont automatiquement générés par l'IA sur la base de données historiques et sont utilisés uniquement à des fins d'apprentissage, de recherche et d'échange technique, et ne constituent aucun conseil d'investissement ou base de prise de décision. L'investissement en actions implique divers risques tels que le risque de marché, le risque de liquidité, le risque politique, etc., qui peuvent entraîner une perte du principal. Les utilisateurs doivent prendre des décisions indépendantes en fonction de leur propre tolérance au risque, et tout comportement d'investissement et conséquences découlant de l'utilisation de cet outil seront à la charge de l'utilisateur. Le marché est risqué et les investissements doivent être prudents.", - 'user.login.privacy.title': 'Politique de confidentialité des utilisateurs', - 'user.login.privacy.view': 'Afficher la politique de confidentialité des utilisateurs', - 'user.login.privacy.collapse': 'Fermer les conditions de confidentialité des utilisateurs', - 'user.login.privacy.content': "Nous accordons une grande importance à votre vie privée et à la protection de vos données. 1) Portée de la collecte : seules les informations nécessaires à la mise en œuvre de la fonction (telles que l'e-mail, le numéro de téléphone mobile, l'indicatif régional, l'adresse du portefeuille Web3) ainsi que les journaux et informations sur l'appareil nécessaires sont collectés. 2) Objectif d'utilisation : Pour la connexion au compte et la vérification de la sécurité, la fourniture de fonctions de service, le dépannage et les exigences de conformité. 3) Stockage et sécurité : les données sont cryptées et stockées, et les autorisations et mesures de contrôle d'accès nécessaires sont prises pour tenter d'empêcher tout accès non autorisé, toute divulgation ou toute perte. 4) Partage avec des tiers : sauf si les lois et réglementations l'exigent ou si cela est nécessaire à l'exécution des services, vos informations personnelles ne seront pas partagées avec des tiers ; si des services tiers (tels que des portefeuilles, des fournisseurs de services SMS) sont impliqués, ils ne seront traités que dans la mesure minimale nécessaire à la mise en œuvre de la fonction. 5) Cookies/stockage local : utilisés pour le statut de connexion et la maintenance de session nécessaire (tels que les jetons, PHPSESSID), vous pouvez les effacer ou les restreindre dans le navigateur. 6) Droits personnels : Vous pouvez exercer vos droits d'information, de rectification, de suppression, de retrait de consentement, etc. conformément aux lois et règlements. 7) Modifications et avis : lorsque ces conditions seront mises à jour, elles seront affichées bien en évidence sur la page. En continuant à utiliser ce service, vous êtes réputé avoir lu et accepté le contenu mis à jour. Si vous n'acceptez pas ces Conditions ou toute mise à jour de celles-ci, veuillez cesser d'utiliser le Service et nous contacter.", - 'account.basicInfo': 'Informations de base', - 'account.id': 'Identifiant utilisateur', - 'account.username': "Nom d'utilisateur", - 'account.nickname': 'Surnom', - 'account.email': 'Courriel', - 'account.mobile': 'Numéro de téléphone portable', - 'account.web3address': 'adresse du portefeuille', - 'account.pid': 'Identifiant du référent', - 'account.level': 'Niveau utilisateur', - 'account.money': 'équilibre', - 'account.qdtBalance': 'Solde QDT', - 'account.score': 'Points', - 'account.createtime': "Heure d'inscription", - 'account.inviteLink': "Lien d'invitation", - 'account.recharge': 'Recharger', - 'account.rechargeTip': 'Veuillez utiliser WeChat ou Alipay pour scanner le code QR ci-dessous pour recharger.', - 'account.qrCodePlaceholder': 'Espace réservé au code QR (émulation)', - 'account.rechargeAmount': 'Montant de la recharge', - 'account.enterAmount': 'Veuillez saisir le montant de la recharge', - 'account.rechargeHint': 'Montant minimum du dépôt : 1 QDT', - 'account.confirmRecharge': 'Confirmer la recharge', - 'account.enterValidAmount': 'Veuillez saisir un montant de recharge valide', - 'account.rechargeSuccess': 'Recharge réussie ! Déposé {montant} QDT', - 'account.settings.menuMap.basic': 'Paramètres de base', - 'account.settings.menuMap.security': 'Paramètres de sécurité', - 'account.settings.menuMap.notification': 'Notification de nouveau message', - 'account.settings.menuMap.moneyLog': 'Détails du fonds', - 'account.moneyLog.empty': "Aucun détail sur le fonds pour l'instant", - 'account.moneyLog.total': '{total} enregistrements au total', - 'account.moneyLog.type.purchase': "indicateur d'achat", - 'account.moneyLog.type.recharge': 'Recharger', - 'account.moneyLog.type.refund': 'Remboursement', - 'account.moneyLog.type.reward': 'récompense', - 'account.moneyLog.type.income': "Revenu de l'indicateur", - 'account.moneyLog.type.commission': 'Frais de gestion de la plateforme', - 'wallet.balance': 'Solde QDT', - 'wallet.recharge': 'Recharger', - 'wallet.withdraw': "Retirer de l'argent", - 'wallet.filter': 'Filtrer', - 'wallet.reset': 'réinitialiser', - 'wallet.totalRecharge': 'Recharge accumulée', - 'wallet.totalWithdraw': 'Retraits cumulés', - 'wallet.totalIncome': 'Revenu cumulé', - 'wallet.records': 'Enregistrements de transactions et détails des fonds', - 'wallet.tradingRecords': 'historique des transactions', - 'wallet.moneyLog': 'Détails du fonds', - 'wallet.rechargeTip': 'Veuillez utiliser WeChat ou Alipay pour scanner le code QR ci-dessous pour recharger.', - 'wallet.qrCodePlaceholder': 'Espace réservé au code QR (émulation)', - 'wallet.rechargeAmount': 'Montant de la recharge', - 'wallet.enterAmount': 'Veuillez saisir le montant de la recharge', - 'wallet.rechargeHint': 'Montant minimum du dépôt : 1 QDT', - 'wallet.confirmRecharge': 'Confirmer la recharge', - 'wallet.enterValidAmount': 'Veuillez saisir un montant de recharge valide', - 'wallet.rechargeSuccess': 'Recharge réussie ! Déposé {montant} QDT', - 'wallet.rechargeFailed': 'La recharge a échoué', - 'wallet.withdrawTip': "Veuillez saisir le montant du retrait et l'adresse de retrait", - 'wallet.withdrawAmount': 'Montant du retrait', - 'wallet.enterWithdrawAmount': 'Veuillez saisir le montant du retrait', - 'wallet.withdrawHint': 'Montant minimum de retrait : 1 QDT', - 'wallet.withdrawAddress': 'Adresse de retrait (facultatif)', - 'wallet.enterWithdrawAddress': "Veuillez saisir l'adresse de retrait", - 'wallet.confirmWithdraw': 'Confirmer le retrait', - 'wallet.enterValidWithdrawAmount': 'Veuillez saisir un montant de retrait valide', - 'wallet.insufficientBalance': 'Solde insuffisant', - 'wallet.withdrawSuccess': 'Retrait réussi ! Retiré {montant} QDT', - 'wallet.withdrawFailed': 'Échec du retrait', - 'wallet.noTradingRecords': "Aucun enregistrement de transaction pour l'instant", - 'wallet.noMoneyLog': "Aucun détail sur le fonds pour l'instant", - 'wallet.loadTradingRecordsFailed': 'Échec du chargement des enregistrements de transaction', - 'wallet.loadMoneyLogFailed': 'Échec du chargement des détails du fonds', - 'wallet.moneyLogTotal': '{total} enregistrements au total', - 'wallet.moneyLogTypeTitle': 'Tapez', - 'wallet.moneyLogType.all': 'Tous types', - 'wallet.table.time': 'temps', - 'wallet.table.type': 'Tapez', - 'wallet.table.price': 'prix', - 'wallet.table.amount': 'Quantité', - 'wallet.table.money': 'Montant', - 'wallet.table.balance': 'équilibre', - 'wallet.table.memo': 'Remarques', - 'wallet.table.value': 'valeur', - 'wallet.table.profit': 'Profits et pertes', - 'wallet.table.commission': 'frais de traitement', - 'wallet.table.total': '{total} enregistrements au total', - 'wallet.tradeType.buy': 'acheter', - 'wallet.tradeType.sell': 'vendre', - 'wallet.tradeType.liquidation': 'liquidation forcée', - 'wallet.tradeType.openLong': 'Ouvert longtemps', - 'wallet.tradeType.addLong': 'Gadot', - 'wallet.tradeType.closeLong': 'Pinduo', - 'wallet.tradeType.closeLongStop': 'Stop loss et long', - 'wallet.tradeType.closeLongProfit': 'Prenez des bénéfices et gagnez plus de niveaux', - 'wallet.tradeType.openShort': 'Ouvert court', - 'wallet.tradeType.addShort': 'ajouter un court', - 'wallet.tradeType.closeShort': 'vide', - 'wallet.tradeType.closeShortStop': 'Arrêter la perte', - 'wallet.tradeType.closeShortProfit': 'Prenez des bénéfices et clôturez à découvert', - 'wallet.moneyLogType.purchase': "indicateur d'achat", - 'wallet.moneyLogType.recharge': 'Recharger', - 'wallet.moneyLogType.withdraw': "Retirer de l'argent", - 'wallet.moneyLogType.refund': 'Remboursement', - 'wallet.moneyLogType.reward': 'récompense', - 'wallet.moneyLogType.income': 'revenu', - 'wallet.moneyLogType.commission': 'frais de traitement', - 'wallet.web3Address.required': "Veuillez d'abord remplir l'adresse du portefeuille Web3", - 'wallet.web3Address.requiredDescription': "Avant de recharger, vous devez lier l'adresse de votre portefeuille Web3 pour recevoir la recharge.", - 'wallet.web3Address.placeholder': "Veuillez saisir l'adresse de votre portefeuille Web3 (en commençant par 0x)", - 'wallet.web3Address.save': "Enregistrer l'adresse du portefeuille", - 'wallet.web3Address.saveSuccess': 'Adresse du portefeuille enregistrée avec succès', - 'wallet.web3Address.saveFailed': "Échec de l'enregistrement de l'adresse du portefeuille", - 'wallet.web3Address.invalidFormat': 'Veuillez saisir une adresse de portefeuille Web3 valide (format Ethereum : 42 caractères commençant par 0x, ou format TRC20 : 34 caractères commençant par T)', - 'wallet.selectCoin': 'Sélectionnez la devise', - 'wallet.selectChain': 'chaîne de sélection', - 'wallet.chain.eth': 'ETH(ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'BSC', - 'wallet.targetQdtAmount': 'Le montant de QDT que vous souhaitez échanger (facultatif)', - 'wallet.targetQdtAmount.placeholder': 'Veuillez saisir la quantité de QDT que vous souhaitez utiliser, le prix actuel du QDT : {price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': 'Besoin de recharge : {amount} USDT', - 'wallet.rechargeAddress': 'Adresse de recharge', - 'wallet.copyAddress': 'Copier', - 'wallet.copySuccess': 'Copiez avec succès !', - 'wallet.copyFailed': 'Échec de la copie, veuillez copier manuellement', - 'wallet.rechargeAddressHint': "Veuillez vous assurer d'utiliser {chain} pour déposer {coin} à cette adresse", - 'wallet.qdtPrice.loading': 'Chargement...', - 'wallet.rechargeTip.new': 'Veuillez sélectionner la devise et la chaîne, puis scannez le code QR ci-dessous pour recharger', - 'wallet.exchangeRate': '1 QDT ≈ {taux} USDT', - 'wallet.withdrawableAmount': 'Montant des liquidités disponibles', - 'wallet.totalBalance': 'solde total', - 'wallet.insufficientWithdrawable': 'Le montant en espèces pouvant être retiré est insuffisant. Le montant actuel qui peut être retiré est : {amount} QDT', - 'wallet.withdrawAddressRequired': "Veuillez saisir l'adresse de retrait", - 'wallet.withdrawAddressHint': "Veuillez vous assurer que l'adresse est correcte. Après le retrait, il ne peut être révoqué.", - 'wallet.withdrawSubmitSuccess': "Demande de retrait soumise avec succès, veuillez attendre l'examen", - 'menu.footer.contactUs': 'Contactez-nous', - 'menu.footer.getSupport': "Obtenir de l'aide", - 'menu.footer.socialAccounts': 'compte social', - 'menu.footer.userAgreement': "Contrat d'utilisation", - 'menu.footer.privacyPolicy': 'politique de confidentialité', - 'menu.footer.support': 'Assistance', - 'menu.footer.featureRequest': 'Demande de fonctionnalité', - 'menu.footer.email': 'Courriel', - 'menu.footer.liveChat': 'Chat en direct 24h/24 et 7j/7', - 'dashboard.analysis.title': 'Analyse multidimensionnelle', - 'dashboard.analysis.subtitle': "Plateforme d'analyse financière complète basée sur l'IA", - 'dashboard.analysis.selectSymbol': 'Sélectionnez ou saisissez le code sous-jacent', - 'dashboard.analysis.selectModel': 'Sélectionnez le modèle', - 'dashboard.analysis.startAnalysis': "Démarrer l'analyse", - 'dashboard.analysis.history': 'Histoire', - 'dashboard.analysis.tab.overview': 'analyse complète', - 'dashboard.analysis.tab.fundamental': 'Fondamentaux', - 'dashboard.analysis.tab.technical': 'technologie', - 'dashboard.analysis.tab.news': 'Actualités', - 'dashboard.analysis.tab.sentiment': 'émotions', - 'dashboard.analysis.tab.risk': 'risque', - 'dashboard.analysis.tab.debate': 'Le débat long-court', - 'dashboard.analysis.tab.decision': 'décision finale', - 'dashboard.analysis.empty.selectSymbol': "Sélectionnez une cible pour démarrer l'analyse", - 'dashboard.analysis.empty.selectSymbolDesc': "Sélectionnez dans la liste d'actions auto-sélectionnée ou entrez le code sous-jacent pour obtenir un rapport d'analyse IA multidimensionnel", - 'dashboard.analysis.empty.startAnalysis': "Cliquez sur le bouton \"Démarrer l'analyse\" pour effectuer une analyse multidimensionnelle", - 'dashboard.analysis.empty.startAnalysisDesc': "Nous vous fournirons une analyse complète portant sur plusieurs dimensions telles que les fondamentaux, la technologie, l'actualité, le sentiment et le risque.", - 'dashboard.analysis.empty.noData': "Il n'y a actuellement aucune donnée d'analyse {type}, veuillez d'abord effectuer une analyse complète", - 'dashboard.analysis.empty.noWatchlist': "Il n'y a actuellement aucun titre auto-sélectionné", - 'dashboard.analysis.empty.noHistory': "Pas encore d'historique", - 'dashboard.analysis.empty.watchlistHint': "Il n'y a actuellement aucun stock auto-sélectionné, veuillez d'abord", - 'dashboard.analysis.empty.noDebateData': "Aucune donnée de débat pour l'instant", - 'dashboard.analysis.empty.noDecisionData': "Aucune donnée de décision pour l'instant", - 'dashboard.analysis.empty.selectAgent': "Veuillez sélectionner un agent pour afficher les résultats de l'analyse", - 'dashboard.analysis.loading.analyzing': 'Analyse, veuillez patienter...', - 'dashboard.analysis.loading.fundamental': 'Analyser les données fondamentales...', - 'dashboard.analysis.loading.technical': 'Analyse des indicateurs techniques...', - 'dashboard.analysis.loading.news': "Analyser les données d'actualité...", - 'dashboard.analysis.loading.sentiment': 'Analyser le sentiment du marché...', - 'dashboard.analysis.loading.risk': 'Évaluer le risque...', - 'dashboard.analysis.loading.debate': 'Le débat long-court est en cours...', - 'dashboard.analysis.loading.decision': 'Générer la décision finale...', - 'dashboard.analysis.score.overall': 'Note globale', - 'dashboard.analysis.score.recommendation': 'conseil en investissement', - 'dashboard.analysis.score.confidence': 'Confiance', - 'dashboard.analysis.dimension.fundamental': 'Fondamentaux', - 'dashboard.analysis.dimension.technical': 'technologie', - 'dashboard.analysis.dimension.news': 'Actualités', - 'dashboard.analysis.dimension.sentiment': 'émotions', - 'dashboard.analysis.dimension.risk': 'risque', - 'dashboard.analysis.card.dimensionScores': 'Notes pour chaque dimension', - 'dashboard.analysis.card.overviewReport': "Rapport d'analyse complet", - 'dashboard.analysis.card.financialMetrics': 'indicateurs financiers', - 'dashboard.analysis.card.fundamentalReport': "Rapport d'analyse fondamentale", - 'dashboard.analysis.card.technicalIndicators': 'Indicateurs techniques', - 'dashboard.analysis.card.technicalReport': "rapport d'analyse technique", - 'dashboard.analysis.card.newsList': 'Actualités connexes', - 'dashboard.analysis.card.newsReport': "Rapport d'analyse de l'actualité", - 'dashboard.analysis.card.sentimentIndicators': 'indicateur de sentiment', - 'dashboard.analysis.card.sentimentReport': "Rapport d'analyse des sentiments", - 'dashboard.analysis.card.riskMetrics': 'indicateurs de risque', - 'dashboard.analysis.card.riskReport': "rapport d'évaluation des risques", - 'dashboard.analysis.card.bullView': 'Vue haussière (Taureau)', - 'dashboard.analysis.card.bearView': 'Vue baissière (ours)', - 'dashboard.analysis.card.researchConclusion': 'Conclusion du chercheur', - 'dashboard.analysis.card.traderPlan': 'plan de commerçant', - 'dashboard.analysis.card.riskDebate': 'Débat en commission des risques', - 'dashboard.analysis.card.finalDecision': 'Décision finale', - 'dashboard.analysis.card.tradePlanDetail': 'Détails du plan de trading', - 'dashboard.analysis.tradingPlan.entry_price': "Prix d'entrée", - 'dashboard.analysis.tradingPlan.position_size': 'Taille du poste', - 'dashboard.analysis.tradingPlan.stop_loss': 'arrêter les pertes', - 'dashboard.analysis.tradingPlan.take_profit': 'Profiter', - 'dashboard.analysis.label.confidence': 'Confiance', - 'dashboard.analysis.label.keyPoints': 'points essentiels', - 'dashboard.analysis.label.riskWarning': 'Avertissement de risque', - 'dashboard.analysis.risk.risky': 'Risqué', - 'dashboard.analysis.risk.neutral': 'Point de vue neutre (Neutre)', - 'dashboard.analysis.risk.safe': 'Vue conservatrice (sûr)', - 'dashboard.analysis.risk.conclusion': 'Conclusion', - 'dashboard.analysis.feature.fundamental': 'analyse fondamentale', - 'dashboard.analysis.feature.technical': 'analyse technique', - 'dashboard.analysis.feature.news': "analyse de l'actualité", - 'dashboard.analysis.feature.sentiment': 'analyse des sentiments', - 'dashboard.analysis.feature.risk': 'évaluation des risques', - 'dashboard.analysis.watchlist.title': 'Ma sélection de titres', - 'dashboard.analysis.watchlist.add': 'ajouter', - 'dashboard.analysis.watchlist.addStock': 'ajouter du stock', - 'dashboard.analysis.modal.addStock.title': 'Ajouter des actions facultatives', - 'dashboard.analysis.modal.addStock.confirm': "D'accord", - 'dashboard.analysis.modal.addStock.cancel': 'Annuler', - 'dashboard.analysis.modal.addStock.market': 'type de marché', - 'dashboard.analysis.modal.addStock.marketPlaceholder': 'Veuillez sélectionner un marché', - 'dashboard.analysis.modal.addStock.marketRequired': 'Veuillez sélectionner le type de marché', - 'dashboard.analysis.modal.addStock.symbol': 'Code de stock', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': 'Par exemple : AAPL, TSLA, GOOGL, 000001, BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': 'Veuillez entrer le code de stock', - 'dashboard.analysis.modal.addStock.searchPlaceholder': 'Rechercher le code ou le nom de la cible', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': 'Recherchez ou saisissez le code sous-jacent (par exemple : AAPL, BTC/USDT, EUR/USD)', - 'dashboard.analysis.modal.addStock.searchOrInputHint': "Prend en charge la recherche d'objets dans la base de données ou la saisie directe du code (le système obtiendra automatiquement le nom)", - 'dashboard.analysis.modal.addStock.search': 'Rechercher', - 'dashboard.analysis.modal.addStock.searchResults': 'Résultats de la recherche', - 'dashboard.analysis.modal.addStock.hotSymbols': 'Cibles populaires', - 'dashboard.analysis.modal.addStock.noHotSymbols': "Aucune cible populaire pour l'instant", - 'dashboard.analysis.modal.addStock.selectedSymbol': 'Sélectionné', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': "Veuillez d'abord sélectionner une cible", - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': "Veuillez sélectionner une cible ou saisir d'abord le code cible", - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': 'Veuillez entrer le code cible', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': "Veuillez d'abord sélectionner le type de marché", - 'dashboard.analysis.modal.addStock.searchFailed': 'La recherche a échoué, veuillez réessayer plus tard', - 'dashboard.analysis.modal.addStock.noSearchResults': 'Aucune cible correspondante trouvée', - 'dashboard.analysis.modal.addStock.willAutoFetchName': 'Le système obtiendra automatiquement le nom', - 'dashboard.analysis.modal.addStock.addDirectly': 'Ajouter directement', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': 'Le nom sera récupéré automatiquement une fois ajouté', - 'dashboard.analysis.market.AShare': 'Un partage', - 'dashboard.analysis.market.USStock': 'Actions américaines', - 'dashboard.analysis.market.HShare': 'Actions de Hong Kong', - 'dashboard.analysis.market.Crypto': 'crypto-monnaie', - 'dashboard.analysis.market.Forex': 'Forex', - 'dashboard.analysis.market.Futures': 'Contrats à terme', - 'dashboard.analysis.modal.history.title': "Enregistrements d'analyse historique", - 'dashboard.analysis.modal.history.viewResult': 'Afficher les résultats', - 'dashboard.analysis.modal.history.completeTime': "temps d'achèvement", - 'dashboard.analysis.modal.history.error': 'Erreur', - 'dashboard.analysis.status.pending': 'En attente', - 'dashboard.analysis.status.processing': 'Traitement', - 'dashboard.analysis.status.completed': 'Terminé', - 'dashboard.analysis.status.failed': 'échoué', - 'dashboard.analysis.message.selectSymbol': "Veuillez d'abord sélectionner la cible", - 'dashboard.analysis.message.taskCreated': "La tâche d'analyse a été créée et est exécutée en arrière-plan...", - 'dashboard.analysis.message.analysisComplete': 'Analyse terminée', - 'dashboard.analysis.message.analysisCompleteCache': "Analyse terminée (à l'aide des données mises en cache)", - 'dashboard.analysis.message.analysisFailed': "L'analyse a échoué, veuillez réessayer plus tard", - 'dashboard.analysis.message.addStockSuccess': 'Ajouté avec succès', - 'dashboard.analysis.message.addStockFailed': "L'ajout a échoué", - 'dashboard.analysis.message.removeStockSuccess': 'Supprimé avec succès', - 'dashboard.analysis.message.removeStockFailed': 'Échec de la suppression', - 'dashboard.analysis.message.resumingAnalysis': "Reprise de la tâche d'analyse...", - 'dashboard.analysis.message.deleteSuccess': 'Supprimé avec succès', - 'dashboard.analysis.message.deleteFailed': 'Échec de la suppression', - 'dashboard.analysis.modal.history.delete': 'Supprimer', - 'dashboard.analysis.modal.history.deleteConfirm': "Êtes-vous sûr de vouloir supprimer cet enregistrement d'analyse ?", - 'dashboard.analysis.test': 'Magasin n° {no}, route Gongzhuan', - 'dashboard.analysis.introduce': "Description de l'indicateur", - 'dashboard.analysis.total-sales': 'ventes totales', - 'dashboard.analysis.day-sales': 'Ventes quotidiennes moyennes¥', - 'dashboard.analysis.visits': 'Visites', - 'dashboard.analysis.visits-trend': 'Tendances du trafic', - 'dashboard.analysis.visits-ranking': 'Classement des visites en magasin', - 'dashboard.analysis.day-visits': 'Visites quotidiennes', - 'dashboard.analysis.week': 'Hebdomadaire, année sur année', - 'dashboard.analysis.day': 'Année après année', - 'dashboard.analysis.payments': 'Nombre de paiements', - 'dashboard.analysis.conversion-rate': 'taux de conversion', - 'dashboard.analysis.operational-effect': "Effets sur l'activité opérationnelle", - 'dashboard.analysis.sales-trend': 'tendances des ventes', - 'dashboard.analysis.sales-ranking': 'Classement des ventes en magasin', - 'dashboard.analysis.all-year': "Toute l'année", - 'dashboard.analysis.all-month': 'ce mois-ci', - 'dashboard.analysis.all-week': 'cette semaine', - 'dashboard.analysis.all-day': "aujourd'hui", - 'dashboard.analysis.search-users': "Nombre d'utilisateurs de recherche", - 'dashboard.analysis.per-capita-search': 'Recherches par habitant', - 'dashboard.analysis.online-top-search': 'Recherches populaires en ligne', - 'dashboard.analysis.the-proportion-of-sales': 'Proportion de la catégorie de ventes', - 'dashboard.analysis.dropdown-option-one': 'Première opération', - 'dashboard.analysis.dropdown-option-two': 'Opération 2', - 'dashboard.analysis.channel.all': 'Toutes les chaînes', - 'dashboard.analysis.channel.online': 'en ligne', - 'dashboard.analysis.channel.stores': 'magasin', - 'dashboard.analysis.sales': 'ventes', - 'dashboard.analysis.traffic': 'flux de passagers', - 'dashboard.analysis.table.rank': 'Classement', - 'dashboard.analysis.table.search-keyword': 'Rechercher des mots-clés', - 'dashboard.analysis.table.users': "Nombre d'utilisateurs", - 'dashboard.analysis.table.weekly-range': 'Augmentation hebdomadaire', - 'dashboard.indicator.selectSymbol': 'Sélectionnez ou saisissez le code sous-jacent', - 'dashboard.indicator.emptyWatchlistHint': "Il n'y a actuellement aucun titre auto-sélectionné, veuillez d'abord les ajouter", - 'dashboard.indicator.hint.selectSymbol': "Veuillez sélectionner une cible pour démarrer l'analyse", - 'dashboard.indicator.hint.selectSymbolDesc': 'Sélectionnez ou entrez un code boursier dans la zone de recherche ci-dessus pour afficher les graphiques K-line et les indicateurs techniques.', - 'dashboard.indicator.retry': 'Réessayez', - 'dashboard.indicator.panel.title': 'Indicateurs techniques', - 'dashboard.indicator.panel.realtimeOn': 'Désactivez les mises à jour en temps réel', - 'dashboard.indicator.panel.realtimeOff': 'Activer les mises à jour en temps réel', - 'dashboard.indicator.panel.themeLight': 'Passer au thème sombre', - 'dashboard.indicator.panel.themeDark': 'Passer au thème clair', - 'dashboard.indicator.section.enabled': 'Activé', - 'dashboard.indicator.section.added': "Indicateurs que j'ai ajoutés", - 'dashboard.indicator.section.custom': 'Indicateurs créés par vous-même', - 'dashboard.indicator.section.bought': "Indicateurs que j'ai achetés", - 'dashboard.indicator.section.myCreated': "Indicateurs que j'ai créés", - 'dashboard.indicator.empty': "Il n'y a pas encore d'indicateur, veuillez d'abord ajouter ou créer un indicateur", - 'dashboard.indicator.buy': "indicateur d'achat", - 'dashboard.indicator.action.start': 'commencer', - 'dashboard.indicator.action.stop': 'Fermer', - 'dashboard.indicator.action.edit': 'Modifier', - 'dashboard.indicator.action.delete': 'Supprimer', - 'dashboard.indicator.action.backtest': 'backtest', - 'dashboard.indicator.status.normal': 'normal', - 'dashboard.indicator.status.normalPermanent': 'Normal (valable en permanence)', - 'dashboard.indicator.status.expired': 'Expiré', - 'dashboard.indicator.expiry.permanent': 'Valable en permanence', - 'dashboard.indicator.expiry.noExpiry': "Pas de délai d'expiration", - 'dashboard.indicator.expiry.expired': 'Expiré : {date}', - 'dashboard.indicator.expiry.expiresOn': "Heure d'expiration : {date}", - 'dashboard.indicator.delete.confirmTitle': 'Confirmer la suppression', - 'dashboard.indicator.delete.confirmContent': "Êtes-vous sûr de vouloir supprimer l'indicateur \"{name}\" ? Cette opération est irréversible.", - 'dashboard.indicator.delete.confirmOk': 'Supprimer', - 'dashboard.indicator.delete.confirmCancel': 'Annuler', - 'dashboard.indicator.delete.success': 'Supprimer avec succès', - 'dashboard.indicator.delete.failed': 'Échec de la suppression', - 'dashboard.indicator.save.success': 'Enregistré avec succès', - 'dashboard.indicator.save.failed': "Échec de l'enregistrement", - 'dashboard.indicator.error.loadWatchlistFailed': 'Échec du chargement des stocks facultatifs', - 'dashboard.indicator.error.chartNotReady': "Le composant graphique n'est pas initialisé. Veuillez d'abord sélectionner la cible et attendre que le graphique se charge.", - 'dashboard.indicator.error.chartMethodNotReady': "La méthode du composant graphique n'est pas prête, veuillez réessayer plus tard", - 'dashboard.indicator.error.chartExecuteNotReady': "La méthode d'exécution du composant graphique n'est pas prête, veuillez réessayer plus tard", - 'dashboard.indicator.error.parseFailed': "Impossible d'analyser le code Python", - 'dashboard.indicator.error.parseFailedCheck': "Impossible d'analyser le code Python, veuillez vérifier le format du code", - 'dashboard.indicator.error.addIndicatorFailed': "Échec de l'ajout de l'indicateur", - 'dashboard.indicator.error.runIndicatorFailed': "L'indicateur de fonctionnement a échoué", - 'dashboard.indicator.error.pleaseLogin': "Veuillez d'abord vous connecter", - 'dashboard.indicator.error.loadDataFailed': 'Le chargement des données a échoué', - 'dashboard.indicator.error.loadDataFailedDesc': 'Veuillez vérifier la connexion réseau', - 'dashboard.indicator.error.pythonEngineFailed': "Le moteur Python n'a pas pu se charger et la fonction d'indicateur peut ne pas être disponible.", - 'dashboard.indicator.error.chartInitFailed': "L'initialisation du graphique a échoué", - 'dashboard.indicator.warning.enterCode': "Veuillez d'abord saisir le code de l'indicateur", - 'dashboard.indicator.warning.pyodideLoadFailed': "Le moteur Python n'a pas pu se charger", - 'dashboard.indicator.warning.pyodideLoadFailedDesc': "Cette fonctionnalité n'est pas disponible dans votre région ou environnement réseau actuel", - 'dashboard.indicator.warning.chartNotInitialized': "Le graphique n'est pas initialisé et l'outil de dessin au trait ne peut pas être utilisé.", - 'dashboard.indicator.success.runIndicator': "L'indicateur s'exécute avec succès", - 'dashboard.indicator.success.clearDrawings': 'Tous les dessins au trait effacés', - 'dashboard.indicator.sma': 'SMA (combinaison de moyenne mobile)', - 'dashboard.indicator.ema': 'EMA (combinaison de moyennes mobiles exponentielles)', - 'dashboard.indicator.rsi': 'RSI (force relative)', - 'dashboard.indicator.macd': 'MACD', - 'dashboard.indicator.bb': 'Bandes de Bollinger', - 'dashboard.indicator.atr': 'ATR (plage réelle moyenne)', - 'dashboard.indicator.cci': 'CCI (indice des canaux de matières premières)', - 'dashboard.indicator.williams': 'Williams %R (indicateur Williams)', - 'dashboard.indicator.mfi': 'IMF (indice de flux monétaire)', - 'dashboard.indicator.adx': 'ADX (indice de tendance moyen)', - 'dashboard.indicator.obv': "OBV (vague d'énergie)", - 'dashboard.indicator.adosc': "ADOSC (oscillateur d'accumulation/répartition)", - 'dashboard.indicator.ad': "AD (ligne d'accumulation/distribution)", - 'dashboard.indicator.kdj': 'KDJ (indicateur stochastique)', - 'dashboard.indicator.signal.buy': 'ACHETER', - 'dashboard.indicator.signal.sell': 'VENDRE', - 'dashboard.indicator.signal.supertrendBuy': 'Acheter SuperTrend', - 'dashboard.indicator.signal.supertrendSell': 'Vente SuperTrend', - 'dashboard.indicator.chart.kline': 'Ligne K', - 'dashboard.indicator.chart.volume': 'Volume', - 'dashboard.indicator.chart.uptrend': 'Tendance à la hausse', - 'dashboard.indicator.chart.downtrend': 'Tendance à la baisse', - 'dashboard.indicator.tooltip.time': 'temps', - 'dashboard.indicator.tooltip.open': 'ouvert', - 'dashboard.indicator.tooltip.close': 'recevoir', - 'dashboard.indicator.tooltip.high': 'haut', - 'dashboard.indicator.tooltip.low': 'faible', - 'dashboard.indicator.tooltip.volume': 'Volume', - 'dashboard.indicator.drawing.line': 'segment de ligne', - 'dashboard.indicator.drawing.horizontalLine': 'ligne horizontale', - 'dashboard.indicator.drawing.verticalLine': 'ligne verticale', - 'dashboard.indicator.drawing.ray': 'rayon', - 'dashboard.indicator.drawing.straightLine': 'ligne droite', - 'dashboard.indicator.drawing.parallelLine': 'lignes parallèles', - 'dashboard.indicator.drawing.priceLine': 'ligne de prix', - 'dashboard.indicator.drawing.priceChannel': 'canal de prix', - 'dashboard.indicator.drawing.fibonacciLine': 'Lignes de Fibonacci', - 'dashboard.indicator.drawing.clearAll': 'Effacer tous les dessins au trait', - 'dashboard.indicator.market.AShare': 'Un partage', - 'dashboard.indicator.market.USStock': 'Actions américaines', - 'dashboard.indicator.market.HShare': 'Actions de Hong Kong', - 'dashboard.indicator.market.Crypto': 'crypto-monnaie', - 'dashboard.indicator.market.Forex': 'Forex', - 'dashboard.indicator.market.Futures': 'Contrats à terme', - 'dashboard.indicator.create': 'Créer un indicateur', - 'dashboard.indicator.editor.title': 'Créer/modifier des indicateurs', - 'dashboard.indicator.editor.name': "Nom de l'indicateur", - 'dashboard.indicator.editor.nameRequired': "Veuillez saisir le nom de l'indicateur", - 'dashboard.indicator.editor.namePlaceholder': "Veuillez saisir le nom de l'indicateur", - 'dashboard.indicator.editor.description': "Description de l'indicateur", - 'dashboard.indicator.editor.descriptionPlaceholder': "Veuillez saisir une description de l'indicateur (facultatif)", - 'dashboard.indicator.editor.code': 'Code Python', - 'dashboard.indicator.editor.codeRequired': "Veuillez entrer le code de l'indicateur", - 'dashboard.indicator.editor.codePlaceholder': 'Veuillez saisir le code Python', - 'dashboard.indicator.editor.run': 'courir', - 'dashboard.indicator.editor.runHint': "Cliquez sur le bouton Exécuter pour prévisualiser l'effet de l'indicateur sur le graphique K-line", - 'dashboard.indicator.editor.guide': 'Guide de développement', - 'dashboard.indicator.editor.guideTitle': "Guide de développement d'indicateurs Python", - 'dashboard.indicator.editor.save': 'enregistrer', - 'dashboard.indicator.editor.cancel': 'Annuler', - 'dashboard.indicator.editor.unnamed': 'Indicateur sans nom', - 'dashboard.indicator.editor.publishToCommunity': 'Publier sur la communauté', - 'dashboard.indicator.editor.publishToCommunityHint': 'Une fois publié, les autres utilisateurs peuvent visualiser et utiliser votre indicateur dans la communauté', - 'dashboard.indicator.editor.indicatorType': "Type d'indicateur", - 'dashboard.indicator.editor.indicatorTypeRequired': "Veuillez sélectionner le type d'indicateur", - 'dashboard.indicator.editor.indicatorTypePlaceholder': "Veuillez sélectionner le type d'indicateur", - 'dashboard.indicator.editor.previewImage': 'Aperçu', - 'dashboard.indicator.editor.uploadImage': 'Télécharger des photos', - 'dashboard.indicator.editor.previewImageHint': 'Taille recommandée : 800 x 400, pas plus de 2 Mo', - 'dashboard.indicator.editor.pricing': 'Prix de vente (QDT)', - 'dashboard.indicator.editor.pricingType.free': 'gratuit', - 'dashboard.indicator.editor.pricingType.permanent': 'permanent', - 'dashboard.indicator.editor.pricingType.monthly': 'paiement mensuel', - 'dashboard.indicator.editor.price': 'prix', - 'dashboard.indicator.editor.priceRequired': 'Veuillez entrer le prix', - 'dashboard.indicator.editor.pricePlaceholder': 'Veuillez entrer le prix', - 'dashboard.indicator.editor.pricingHint': "Bien que le prix des indicateurs gratuits soit de 0, la plateforme vous récompensera (QDT) en fonction de votre utilisation de l'indicateur et de votre taux d'éloges.", - 'dashboard.indicator.editor.aiGenerate': 'Génération intelligente', - 'dashboard.indicator.editor.aiPromptPlaceholder': "Dites-moi vos idées et je générerai le code de l'indicateur Python pour vous", - 'dashboard.indicator.editor.aiGenerateBtn': "Code généré par l'IA", - 'dashboard.indicator.editor.aiPromptRequired': 'Veuillez entrer vos pensées', - 'dashboard.indicator.editor.aiGenerateSuccess': 'Génération de code réussie', - 'dashboard.indicator.editor.aiGenerateError': 'Échec de la génération du code, veuillez réessayer plus tard', - 'dashboard.indicator.backtest.title': 'Backtest des indicateurs', - 'dashboard.indicator.backtest.config': 'Paramètres de backtest', - 'dashboard.indicator.backtest.startDate': 'date de début', - 'dashboard.indicator.backtest.endDate': 'date de fin', - 'dashboard.indicator.backtest.selectStartDate': 'Sélectionnez la date de début', - 'dashboard.indicator.backtest.selectEndDate': 'Sélectionnez la date de fin', - 'dashboard.indicator.backtest.startDateRequired': 'Veuillez sélectionner une date de début', - 'dashboard.indicator.backtest.endDateRequired': 'Veuillez sélectionner une date de fin', - 'dashboard.indicator.backtest.initialCapital': 'Capital initial', - 'dashboard.indicator.backtest.initialCapitalRequired': 'Veuillez saisir les fonds initiaux', - 'dashboard.indicator.backtest.commission': 'Frais de traitement', - 'dashboard.indicator.backtest.leverage': 'Ratio de levier', - 'dashboard.indicator.backtest.tradeDirection': 'Orientation commerciale', - 'dashboard.indicator.backtest.longOnly': 'Allez-y longtemps', - 'dashboard.indicator.backtest.shortOnly': 'court', - 'dashboard.indicator.backtest.both': 'Bidirectionnel', - 'dashboard.indicator.backtest.run': 'Commencer le backtest', - 'dashboard.indicator.backtest.rerun': 'Backtester à nouveau', - 'dashboard.indicator.backtest.close': 'Fermer', - 'dashboard.indicator.backtest.running': 'Backtest des indicateurs en cours...', - 'dashboard.indicator.backtest.results': 'Résultats du backtest', - 'dashboard.indicator.backtest.totalReturn': 'rendement total', - 'dashboard.indicator.backtest.annualReturn': 'revenu annualisé', - 'dashboard.indicator.backtest.maxDrawdown': 'prélèvement maximum', - 'dashboard.indicator.backtest.sharpeRatio': 'Rapport de netteté', - 'dashboard.indicator.backtest.winRate': 'taux de réussite', - 'dashboard.indicator.backtest.profitFactor': 'ratio profits/pertes', - 'dashboard.indicator.backtest.totalTrades': 'Nombre de transactions', - 'dashboard.indicator.totalReturn': 'rendement total', - 'dashboard.indicator.annualReturn': 'taux de rendement annualisé', - 'dashboard.indicator.maxDrawdown': 'prélèvement maximum', - 'dashboard.indicator.sharpeRatio': 'Rapport de netteté', - 'dashboard.indicator.winRate': 'taux de réussite', - 'dashboard.indicator.profitFactor': 'ratio profits/pertes', - 'dashboard.indicator.totalTrades': 'nombre total de transactions', - 'dashboard.indicator.backtest.totalCommission': 'frais de traitement totaux', - 'dashboard.indicator.backtest.equityCurve': 'courbe des taux', - 'dashboard.indicator.backtest.strategy': "Revenu de l'indicateur", - 'dashboard.indicator.backtest.benchmark': 'Rendement de référence', - 'dashboard.indicator.backtest.tradeHistory': 'historique des transactions', - 'dashboard.indicator.backtest.tradeTime': 'temps', - 'dashboard.indicator.backtest.tradeType': 'Tapez', - 'dashboard.indicator.backtest.buy': 'acheter', - 'dashboard.indicator.backtest.sell': 'vendre', - 'dashboard.indicator.backtest.liquidation': 'Liquidation', - 'dashboard.indicator.backtest.openLong': 'Ouvert longtemps', - 'dashboard.indicator.backtest.closeLong': 'Pinduo', - 'dashboard.indicator.backtest.closeLongStop': 'Près du long (stop loss)', - 'dashboard.indicator.backtest.closeLongProfit': 'Fermez davantage (prenez des bénéfices)', - 'dashboard.indicator.backtest.addLong': 'Ajouter une position longue', - 'dashboard.indicator.backtest.openShort': 'Ouvert court', - 'dashboard.indicator.backtest.closeShort': 'vide', - 'dashboard.indicator.backtest.closeShortStop': 'Fermer (stopper la perte)', - 'dashboard.indicator.backtest.closeShortProfit': 'Fermer (prendre des bénéfices)', - 'dashboard.indicator.backtest.addShort': 'Ajouter une position courte', - 'dashboard.indicator.backtest.price': 'prix', - 'dashboard.indicator.backtest.amount': 'Quantité', - 'dashboard.indicator.backtest.balance': 'Solde du compte', - 'dashboard.indicator.backtest.profit': 'Profits et pertes', - 'dashboard.indicator.backtest.success': 'Backtest terminé', - 'dashboard.indicator.backtest.failed': 'Échec du backtest, veuillez réessayer plus tard', - 'dashboard.indicator.backtest.noIndicatorCode': "Il n'y a pas de code backtestable pour cet indicateur", - 'dashboard.indicator.backtest.noSymbol': "Veuillez d'abord sélectionner la cible de la transaction", - 'dashboard.indicator.backtest.dateRangeExceeded': 'La plage de temps du backtest dépasse la limite : {timeframe} la période peut être backtestée au maximum {maxRange}', - 'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)', - 'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}', - 'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}', - 'dashboard.indicator.backtest.prev': 'Previous', - 'dashboard.indicator.backtest.next': 'Next', - 'dashboard.indicator.backtest.steps.strategy.title': 'Strategy', - 'dashboard.indicator.backtest.steps.strategy.desc': 'Position sizing & risk controls', - 'dashboard.indicator.backtest.steps.trading.title': 'Trading settings', - 'dashboard.indicator.backtest.steps.trading.desc': 'Time range, capital, fees, leverage', - 'dashboard.indicator.backtest.steps.results.title': 'Results', - 'dashboard.indicator.backtest.steps.results.desc': 'Backtest output', - 'dashboard.indicator.backtest.panel.risk': 'Risk management (SL/TP/Trailing)', - 'dashboard.indicator.backtest.panel.scale': 'Scale in / DCA (trend & mean-reversion)', - 'dashboard.indicator.backtest.panel.reduce': 'Reduce position (trend & adverse)', - 'dashboard.indicator.backtest.panel.position': 'Position sizing', - 'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)', - 'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)', - 'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit', - 'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)', - 'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)', - 'dashboard.indicator.backtest.field.slippage': 'Slippage (%)', - 'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in', - 'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion DCA', - 'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.dcaAddStepPct': 'DCA trigger (%)', - 'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.dcaAddSizePct': 'DCA size (% of capital)', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max DCA times', - 'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce', - 'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)', - 'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times', - 'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)', - 'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)', - 'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)', - 'dashboard.indicator.backtest.reduceLong': 'Reduce Long', - 'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)', - 'dashboard.indicator.backtest.reduceShort': 'Reduce Short', - 'dashboard.docs.title': 'Centre de documentation', - 'dashboard.docs.search.placeholder': 'Rechercher des documents...', - 'dashboard.docs.category.all': 'Tout', - 'dashboard.docs.category.guide': 'Guide de développement', - 'dashboard.docs.category.api': 'Documentation API', - 'dashboard.docs.category.tutorial': 'Tutoriel', - 'dashboard.docs.category.faq': 'FAQ', - 'dashboard.docs.featured.title': 'Documentation recommandée', - 'dashboard.docs.featured.tag': 'Recommandé', - 'dashboard.docs.list.views': 'Parcourir', - 'dashboard.docs.list.author': 'Auteur', - 'dashboard.docs.list.empty': "Aucun document pour l'instant", - 'dashboard.docs.list.backToAll': 'Retour à tous les documents', - 'dashboard.docs.list.total': '{count} documents au total', - 'dashboard.docs.detail.back': 'Retour à la liste des documents', - 'dashboard.docs.detail.updatedAt': 'mis à jour sur', - 'dashboard.docs.detail.related': 'Documents associés', - 'dashboard.docs.detail.notFound': "Le document n'existe pas", - 'dashboard.docs.detail.error': "Le document n'existe pas ou a été supprimé", - 'dashboard.docs.search.result': 'Résultats de la recherche', - 'dashboard.docs.search.keyword': 'mots-clés', - 'community.filter.indicatorType': "Type d'indicateur", - 'community.filter.all': 'Tout', - 'community.filter.other': 'Autres options', - 'community.filter.pricing': 'Type de prix', - 'community.filter.allPricing': 'Tous les tarifs', - 'community.filter.sortBy': 'Trier par', - 'community.filter.search': 'Rechercher', - 'community.filter.searchPlaceholder': 'Rechercher le nom de la métrique', - 'community.indicatorType.trend': 'Type de tendance', - 'community.indicatorType.momentum': "type d'élan", - 'community.indicatorType.volatility': 'Volatilité', - 'community.indicatorType.volume': 'Volume', - 'community.indicatorType.custom': 'Personnaliser', - 'community.pricing.free': 'gratuit', - 'community.pricing.paid': 'Payer', - 'community.sort.downloads': 'Téléchargements', - 'community.sort.rating': 'Note', - 'community.sort.newest': 'Dernières versions', - 'community.pagination.total': '{total} indicateurs au total', - 'community.noDescription': 'Pas encore de description', - 'community.detail.type': 'Tapez', - 'community.detail.pricing': 'Tarifs', - 'community.detail.rating': 'Note', - 'community.detail.downloads': 'Téléchargements', - 'community.detail.author': 'Auteur', - 'community.detail.description': 'Présentation', - 'community.detail.detailContent': 'Description détaillée', - 'community.detail.backtestStats': 'Statistiques de backtest', - 'community.action.purchase': "indicateur d'achat", - 'community.action.addToMyIndicators': 'Ajouter à mes indicateurs', - 'community.action.favorite': 'Collecte', - 'community.action.unfavorite': 'Annuler les favoris', - 'community.action.buyNow': 'Acheter maintenant', - 'community.action.renew': 'Renouvellement', - 'community.purchase.price': 'prix', - 'community.purchase.permanent': 'permanent', - 'community.purchase.monthly': 'mois', - 'community.purchase.confirmBuy': 'Confirmer pour acheter cet indicateur ({price} QDT) ?', - 'community.purchase.confirmRenew': 'Confirmer le renouvellement de cet indicateur ({price} QDT/mois) ?', - 'community.purchase.confirmFree': 'Confirmer pour ajouter cet indicateur gratuit ?', - 'community.purchase.confirmTitle': "Confirmer l'action", - 'community.purchase.owned': 'Vous avez acheté cet indicateur (valable en permanence)', - 'community.purchase.ownIndicator': "Il s'agit de la métrique que vous avez publiée", - 'community.purchase.expired': 'Votre abonnement a expiré', - 'community.purchase.expiresOn': "Heure d'expiration : {date}", - 'community.tabs.detail': "Détails de l'indicateur", - 'community.tabs.backtest': 'Données de backtest', - 'community.tabs.ratings': "Avis d'utilisateurs", - 'community.rating.myRating': 'Ma note', - 'community.rating.stars': '{count} étoiles', - 'community.rating.commentPlaceholder': 'Partagez votre expérience...', - 'community.rating.submit': 'Soumettre une note', - 'community.rating.modify': 'Modifier', - 'community.rating.saveModify': 'Enregistrer les modifications', - 'community.rating.cancel': 'Annuler', - 'community.rating.selectRating': 'Veuillez sélectionner une note', - 'community.rating.success': 'Évaluation réussie', - 'community.rating.modifySuccess': 'Avis modifié avec succès', - 'community.rating.failed': 'Échec de la notation', - 'community.rating.noRatings': 'Pas encore de commentaires', - 'community.backtest.note': 'Les données ci-dessus sont des résultats de backtest historiques et sont fournies à titre de référence uniquement et ne représentent pas les bénéfices futurs.', - 'community.backtest.noData': "Aucune donnée de backtest pour l'instant", - 'community.backtest.uploadHint': "L'auteur n'a pas encore téléchargé les données de backtest", - 'community.message.loadFailed': 'Échec du chargement de la liste des indicateurs', - 'community.message.purchaseProcessing': "Traitement de la demande d'achat...", - 'community.message.downloadSuccess': 'La métrique a été ajoutée à ma liste de métriques', - 'community.message.favoriteSuccess': 'Collecte réussie', - 'community.message.unfavoriteSuccess': 'Annuler la collecte avec succès', - 'community.message.operationSuccess': 'Opération réussie', - 'community.message.operationFailed': "L'opération a échoué", - 'community.banner.readOnly': 'Lecture seule', - 'community.banner.loginHint': 'Pour vous connecter ou vous inscrire, veuillez cliquer sur le bouton pour accéder à une page indépendante afin d\'éviter les problèmes CSRF', - 'community.banner.jumpButton': 'Aller à Connexion/Inscription', - 'dashboard.totalEquity': 'capitaux propres totaux', - 'dashboard.totalPnL': 'Total des profits et pertes', - 'dashboard.aiStrategies': "Stratégie d'IA", - 'dashboard.indicatorStrategies': 'Stratégie des indicateurs', - 'dashboard.running': 'Courir', - 'dashboard.pnlHistory': 'profits et pertes historiques', - 'dashboard.strategyPerformance': 'Ratio de profits et pertes de la stratégie', - 'dashboard.recentTrades': 'transactions récentes', - 'dashboard.currentPositions': 'Poste actuel', - 'dashboard.table.time': 'temps', - 'dashboard.table.strategy': 'Nom de la stratégie', - 'dashboard.table.symbol': 'Cible', - 'dashboard.table.type': 'Tapez', - 'dashboard.table.side': 'direction', - 'dashboard.table.size': 'Intérêt ouvert', - 'dashboard.table.entryPrice': "cours d'ouverture moyen", - 'dashboard.table.price': 'prix', - 'dashboard.table.amount': 'Quantité', - 'dashboard.table.profit': 'Profits et pertes', - 'dashboard.pendingOrders': 'Historique d\'exécution des ordres', - 'dashboard.totalOrders': 'Total {total} ordres', - 'dashboard.viewError': 'Voir l\'erreur', - 'dashboard.filled': 'Rempli', - 'dashboard.orderTable.time': 'Heure de création', - 'dashboard.orderTable.strategy': 'Stratégie', - 'dashboard.orderTable.symbol': 'Paire de trading', - 'dashboard.orderTable.signalType': 'Type de signal', - 'dashboard.orderTable.amount': 'Quantité', - 'dashboard.orderTable.price': 'Prix de remplissage', - 'dashboard.orderTable.status': 'Statut', - 'dashboard.orderTable.executedAt': 'Heure d\'exécution', - 'dashboard.signalType.openLong': 'Ouvrir Long', - 'dashboard.signalType.openShort': 'Ouvrir Short', - 'dashboard.signalType.closeLong': 'Fermer Long', - 'dashboard.signalType.closeShort': 'Fermer Short', - 'dashboard.signalType.addLong': 'Ajouter Long', - 'dashboard.signalType.addShort': 'Ajouter Short', - 'dashboard.status.pending': 'En attente', - 'dashboard.status.processing': 'En cours', - 'dashboard.status.completed': 'Terminé', - 'dashboard.status.failed': 'Échoué', - 'dashboard.status.cancelled': 'Annulé', - 'dashboard.table.pnl': 'profit ou perte non réalisé', - 'form.basic-form.basic.title': 'forme de base', - 'form.basic-form.basic.description': "Les pages de formulaire sont utilisées pour collecter ou vérifier les informations des utilisateurs. Les formulaires de base sont couramment utilisés dans des scénarios de formulaire comportant peu d'éléments de données.", - 'form.basic-form.title.label': 'Titre', - 'form.basic-form.title.placeholder': "Donnez un nom à l'objectif", - 'form.basic-form.title.required': 'Veuillez entrer un titre', - 'form.basic-form.date.label': 'Date de début et de fin', - 'form.basic-form.placeholder.start': 'date de début', - 'form.basic-form.placeholder.end': 'date de fin', - 'form.basic-form.date.required': 'Veuillez sélectionner les dates de début et de fin', - 'form.basic-form.goal.label': "Description de l'objectif", - 'form.basic-form.goal.placeholder': 'Veuillez saisir vos objectifs de travail par étapes', - 'form.basic-form.goal.required': "Veuillez saisir une description de l'objectif", - 'form.basic-form.standard.label': 'mesurer', - 'form.basic-form.standard.placeholder': 'Veuillez saisir des statistiques', - 'form.basic-form.standard.required': 'Veuillez saisir des statistiques', - 'form.basic-form.client.label': 'Client', - 'form.basic-form.client.required': 'Veuillez décrire les clients que vous servez', - 'form.basic-form.label.tooltip': 'destinataires de services cibles', - 'form.basic-form.client.placeholder': 'Veuillez décrire les clients que vous servez, les clients internes directement @nom/numéro de poste', - 'form.basic-form.invites.label': 'Inviter des réviseurs', - 'form.basic-form.invites.placeholder': "Veuillez directement @nom/numéro d'employé, vous pouvez inviter jusqu'à 5 personnes", - 'form.basic-form.weight.label': 'poids', - 'form.basic-form.weight.placeholder': 'Veuillez entrer', - 'form.basic-form.public.label': 'public cible', - 'form.basic-form.label.help': 'Les clients et les évaluateurs sont partagés par défaut', - 'form.basic-form.radio.public': 'publique', - 'form.basic-form.radio.partially-public': 'Partiellement public', - 'form.basic-form.radio.private': 'privé', - 'form.basic-form.publicUsers.placeholder': 'ouvert à', - 'form.basic-form.option.A': 'Collègue 1', - 'form.basic-form.option.B': 'Collègue 2', - 'form.basic-form.option.C': 'Collègue trois', - 'form.basic-form.email.required': 'Veuillez entrer votre adresse e-mail !', - 'form.basic-form.email.wrong-format': "Le format de l'adresse e-mail est incorrect !", - 'form.basic-form.userName.required': "Veuillez entrer votre nom d'utilisateur !", - 'form.basic-form.password.required': 'Veuillez entrer votre mot de passe !', - 'form.basic-form.password.twice': 'Les mots de passe saisis deux fois ne correspondent pas !', - 'form.basic-form.strength.msg': 'Veuillez saisir au moins 6 caractères. Veuillez ne pas utiliser de mots de passe faciles à deviner.', - 'form.basic-form.strength.strong': 'Force : Forte', - 'form.basic-form.strength.medium': 'Force : moyenne', - 'form.basic-form.strength.short': 'Force : trop courte', - 'form.basic-form.confirm-password.required': 'Veuillez confirmer votre mot de passe !', - 'form.basic-form.phone-number.required': 'Veuillez entrer votre numéro de téléphone portable !', - 'form.basic-form.phone-number.wrong-format': 'Le format du numéro de téléphone portable est erroné !', - 'form.basic-form.verification-code.required': 'Veuillez entrer le code de vérification !', - 'form.basic-form.form.get-captcha': 'Obtenir le code de vérification', - 'form.basic-form.captcha.second': 'secondes', - 'form.basic-form.form.optional': '(facultatif)', - 'form.basic-form.form.submit': 'Soumettre', - 'form.basic-form.form.save': 'enregistrer', - 'form.basic-form.email.placeholder': 'Courriel', - 'form.basic-form.password.placeholder': "Mot de passe d'au moins 6 caractères, sensible à la casse", - 'form.basic-form.confirm-password.placeholder': 'Confirmer le mot de passe', - 'form.basic-form.phone-number.placeholder': 'Numéro de téléphone portable', - 'form.basic-form.verification-code.placeholder': 'Code de vérification', - 'result.success.title': 'Soumission réussie', - 'result.success.description': "La page de résultats de soumission est utilisée pour renvoyer les résultats de traitement d'une série de tâches opérationnelles. S'il ne s'agit que d'une opération simple, utilisez le retour d'invite global du message. Cette zone de texte peut afficher des instructions supplémentaires simples. S'il est nécessaire d'afficher des « documents », la zone grise ci-dessous peut afficher des contenus plus complexes.", - 'result.success.operate-title': 'Nom du projet', - 'result.success.operate-id': 'ID du projet', - 'result.success.principal': 'responsable', - 'result.success.operate-time': 'Temps effectif', - 'result.success.step1-title': 'Créer un projet', - 'result.success.step1-operator': 'Qu Lili', - 'result.success.step2-title': 'Examen préliminaire du ministère', - 'result.success.step2-operator': 'Zhou Maomao', - 'result.success.step2-extra': 'Urgent', - 'result.success.step3-title': 'examen financier', - 'result.success.step4-title': 'Terminé', - 'result.success.btn-return': 'Retour à la liste', - 'result.success.btn-project': 'Afficher les articles', - 'result.success.btn-print': 'Imprimer', - 'result.fail.error.title': 'Échec de la soumission', - 'result.fail.error.description': 'Veuillez vérifier et modifier les informations suivantes avant de soumettre à nouveau.', - 'result.fail.error.hint-title': 'Le contenu que vous avez soumis contient les erreurs suivantes :', - 'result.fail.error.hint-text1': 'Votre compte a été gelé', - 'result.fail.error.hint-btn1': 'Décongeler immédiatement', - 'result.fail.error.hint-text2': "Votre compte n'est pas encore éligible pour postuler", - 'result.fail.error.hint-btn2': 'Mettre à niveau maintenant', - 'result.fail.error.btn-text': 'Retour à la modification', - 'account.settings.menuMap.custom': 'personnalisation', - 'account.settings.menuMap.binding': 'Liaison de compte', - 'account.settings.basic.avatar': 'avatar', - 'account.settings.basic.change-avatar': "Changer d'avatar", - 'account.settings.basic.email': 'Courriel', - 'account.settings.basic.email-message': 'Veuillez entrer votre email!', - 'account.settings.basic.nickname': 'Surnom', - 'account.settings.basic.nickname-message': 'Veuillez entrer votre pseudo !', - 'account.settings.basic.profile': 'Profil', - 'account.settings.basic.profile-message': 'Veuillez entrer votre profil personnel !', - 'account.settings.basic.profile-placeholder': 'Profil', - 'account.settings.basic.country': 'Pays/Région', - 'account.settings.basic.country-message': 'Veuillez entrer votre pays ou région !', - 'account.settings.basic.geographic': 'Province et ville', - 'account.settings.basic.geographic-message': 'Veuillez entrer votre province et votre ville !', - 'account.settings.basic.address': 'adresse postale', - 'account.settings.basic.address-message': 'Veuillez entrer votre adresse postale !', - 'account.settings.basic.phone': 'Numéro de contact', - 'account.settings.basic.phone-message': 'Veuillez entrer votre numéro de contact !', - 'account.settings.basic.update': 'Mettre à jour les informations de base', - 'account.settings.basic.update.success': 'Mettre à jour les informations de base avec succès', - 'account.settings.security.strong': 'Fort', - 'account.settings.security.medium': 'dans', - 'account.settings.security.weak': 'faible', - 'account.settings.security.password': 'Mot de passe du compte', - 'account.settings.security.password-description': 'Force actuelle du mot de passe :', - 'account.settings.security.phone': 'Téléphone mobile de sécurité', - 'account.settings.security.phone-description': 'Téléphone mobile déjà lié :', - 'account.settings.security.question': 'Problèmes de sécurité', - 'account.settings.security.question-description': "Aucune question de sécurité n'est définie, ce qui peut protéger efficacement la sécurité du compte.", - 'account.settings.security.email': 'Lier un e-mail', - 'account.settings.security.email-description': 'Adresse e-mail déjà liée :', - 'account.settings.security.mfa': 'Appareil MFA', - 'account.settings.security.mfa-description': 'Le périphérique MFA n’est pas lié. Après la liaison, vous pouvez confirmer à nouveau.', - 'account.settings.security.modify': 'Modifier', - 'account.settings.security.set': 'paramètres', - 'account.settings.security.bind': 'reliure', - 'account.settings.binding.taobao': 'Lier Taobao', - 'account.settings.binding.taobao-description': "Le compte Taobao n'est actuellement pas lié", - 'account.settings.binding.alipay': 'Lier Alipay', - 'account.settings.binding.alipay-description': "Le compte Alipay n'est actuellement pas lié", - 'account.settings.binding.dingding': 'Liaison DingTalk', - 'account.settings.binding.dingding-description': "Aucun compte DingTalk n'est actuellement lié", - 'account.settings.binding.bind': 'reliure', - 'account.settings.notification.password': 'Mot de passe du compte', - 'account.settings.notification.password-description': 'Les messages des autres utilisateurs seront notifiés sous forme de messages du site.', - 'account.settings.notification.messages': 'Messages système', - 'account.settings.notification.messages-description': 'Les messages système seront notifiés sous forme de messages de site.', - 'account.settings.notification.todo': 'Tâches à faire', - 'account.settings.notification.todo-description': 'Les tâches à effectuer seront notifiées sous forme de messages sur site', - 'account.settings.settings.open': 'ouvert', - 'account.settings.settings.close': 'fermer', - 'trading-assistant.title': 'Assistante commerciale', - 'trading-assistant.strategyList': 'Liste de stratégies', - 'trading-assistant.createStrategy': 'Créer une politique', - 'trading-assistant.noStrategy': 'Pas encore de stratégie', - 'trading-assistant.selectStrategy': 'Veuillez sélectionner une stratégie à gauche pour afficher les détails', - 'trading-assistant.startStrategy': 'stratégie de lancement', - 'trading-assistant.stopStrategy': "stratégie d'arrêt", - 'trading-assistant.editStrategy': 'Stratégie éditoriale', - 'trading-assistant.deleteStrategy': 'Supprimer la stratégie', - 'trading-assistant.status.running': 'Courir', - 'trading-assistant.status.stopped': 'Arrêté', - 'trading-assistant.status.error': 'Erreur', - 'trading-assistant.strategyType.IndicatorStrategy': "Stratégie d'indicateurs techniques", - 'trading-assistant.strategyType.PromptBasedStrategy': 'stratégie de mots indicateurs', - 'trading-assistant.strategyType.GridStrategy': 'stratégie de grille', - 'trading-assistant.tabs.tradingRecords': 'historique des transactions', - 'trading-assistant.tabs.positions': 'Enregistrement de poste', - 'trading-assistant.tabs.equityCurve': 'courbe des actions', - 'trading-assistant.form.step1': 'Sélectionner des indicateurs', - 'trading-assistant.form.step2': "Configuration d'échange", - 'trading-assistant.form.step3': 'Paramètres de stratégie', - 'trading-assistant.form.indicator': 'Sélectionner des indicateurs', - 'trading-assistant.form.indicatorHint': 'Vous ne pouvez sélectionner que les indicateurs techniques que vous avez achetés ou créés', - 'trading-assistant.form.qdtCostHints': "L'utilisation de la stratégie consommera du QDT, veuillez vous assurer que le compte dispose d'un solde QDT suffisant", - 'trading-assistant.form.indicatorDescription': "Description de l'indicateur", - 'trading-assistant.form.noDescription': 'Pas encore de description', - 'trading-assistant.form.exchange': 'Sélectionnez un échange', - 'trading-assistant.form.apiKey': 'Clé API', - 'trading-assistant.form.secretKey': 'Clé secrète', - 'trading-assistant.form.passphrase': 'Phrase secrète', - 'trading-assistant.form.testConnection': 'tester la connexion', - 'trading-assistant.form.strategyName': 'Nom de la stratégie', - 'trading-assistant.form.symbol': 'paire de trading', - 'trading-assistant.form.symbolHint': 'Actuellement, seules les paires de trading de cryptomonnaies sont prises en charge', - 'trading-assistant.form.initialCapital': "Montant de l'investissement", - 'trading-assistant.form.marketType': 'type de marché', - 'trading-assistant.form.marketTypeFutures': 'contrat', - 'trading-assistant.form.marketTypeSpot': 'Spot', - 'trading-assistant.form.marketTypeHint': "Le contrat prend en charge le trading bidirectionnel et l'effet de levier, tandis que le spot ne prend en charge que les positions longues et l'effet de levier est fixé à 1x.", - 'trading-assistant.form.leverage': 'Tirer parti de plusieurs', - 'trading-assistant.form.leverageHint': 'Contrat : 1-125 fois, spot : fixe 1 fois', - 'trading-assistant.form.spotLeverageFixed': "L'effet de levier du trading au comptant est fixé à 1x", - 'trading-assistant.form.spotOnlyLongHint': 'Le trading au comptant ne prend en charge que les positions longues', - 'trading-assistant.form.tradeDirection': 'Orientation commerciale', - 'trading-assistant.form.tradeDirectionLong': 'Seulement longtemps', - 'trading-assistant.form.tradeDirectionShort': 'Seulement court', - 'trading-assistant.form.tradeDirectionBoth': 'transaction bidirectionnelle', - 'trading-assistant.form.timeframe': 'période', - 'trading-assistant.form.klinePeriod': 'Période K-Line', - 'trading-assistant.form.timeframe1m': '1 minute', - 'trading-assistant.form.timeframe5m': '5 minutes', - 'trading-assistant.form.timeframe15m': '15 minutes', - 'trading-assistant.form.timeframe30m': '30 minutes', - 'trading-assistant.form.timeframe1H': '1 heure', - 'trading-assistant.form.timeframe4H': '4 heures', - 'trading-assistant.form.timeframe1D': '1 jour', - 'trading-assistant.form.selectStrategyType': 'Sélectionner le type de stratégie', - 'trading-assistant.form.indicatorStrategy': 'Stratégie d\'indicateur', - 'trading-assistant.form.indicatorStrategyDesc': 'Stratégie de trading automatisée basée sur des indicateurs techniques', - 'trading-assistant.form.aiStrategy': 'Stratégie IA', - 'trading-assistant.form.aiStrategyDesc': 'Stratégie de trading automatisée basée sur la prise de décision intelligente IA', - 'trading-assistant.form.enableAiFilter': 'Activer le filtre de décision intelligente IA', - 'trading-assistant.form.enableAiFilterHint': 'Lorsqu\'il est activé, les signaux d\'indicateur seront filtrés par l\'IA pour améliorer la qualité des transactions', - 'trading-assistant.form.aiFilterPrompt': 'Invite personnalisée', - 'trading-assistant.form.aiFilterPromptHint': 'Fournir des instructions personnalisées pour le filtrage IA, laisser vide pour utiliser la valeur par défaut du système', - 'trading-assistant.validation.strategyTypeRequired': 'Veuillez sélectionner un type de stratégie', - 'trading-assistant.form.advancedSettings': 'Paramètres avancés', - 'trading-assistant.form.orderMode': 'Mode de commande', - 'trading-assistant.form.orderModeMaker': 'Créateur', - 'trading-assistant.form.orderModeTaker': 'Prix du marché (Preneur)', - 'trading-assistant.form.orderModeHint': "Le mode d'ordre en attente utilise des ordres limités et les frais de traitement sont inférieurs ; le mode prix du marché est exécuté immédiatement et les frais de traitement sont plus élevés.", - 'trading-assistant.form.makerWaitSec': "Temps d'attente pour les commandes en attente (secondes)", - 'trading-assistant.form.makerWaitSecHint': "Le temps d'attente pour la transaction après avoir passé une commande. Annulez et réessayez après l'expiration du délai.", - 'trading-assistant.form.makerRetries': 'Nombre de tentatives pour les commandes en attente', - 'trading-assistant.form.makerRetriesHint': "Le nombre maximum de tentatives lorsqu'un ordre en attente n'est pas exécuté", - 'trading-assistant.form.fallbackToMarket': "L'ordre en attente échoue et le prix du marché est dégradé.", - 'trading-assistant.form.fallbackToMarketHint': "Lorsque l'ordre en attente d'ouverture/de clôture n'a pas été exécuté, s'il doit être rétrogradé en ordre au marché pour garantir que la transaction soit terminée.", - 'trading-assistant.form.marginMode': 'Mode marge', - 'trading-assistant.form.marginModeCross': 'Entrepôt complet', - 'trading-assistant.form.marginModeIsolated': 'Position isolée', - 'trading-assistant.form.stopLossPct': "Taux d'arrêt des pertes (%)", - 'trading-assistant.form.stopLossPctHint': "Définissez le pourcentage de stop loss, 0 signifie que le stop loss n'est pas activé", - 'trading-assistant.form.takeProfitPct': 'Ratio de profit (%)', - 'trading-assistant.form.takeProfitPctHint': 'Définissez le pourcentage de profit, 0 signifie désactiver le profit', - 'trading-assistant.form.signalMode': 'Mode signal', - 'trading-assistant.form.signalModeConfirmed': 'Mode de confirmation', - 'trading-assistant.form.signalModeAggressive': 'Mode agressif', - 'trading-assistant.form.signalModeHint': 'Mode de confirmation : vérifie uniquement les lignes K terminées ; Mode agressif : vérifie également la formation de lignes K', - 'trading-assistant.form.cancel': 'Annuler', - 'trading-assistant.form.prev': 'Étape précédente', - 'trading-assistant.form.next': 'Étape suivante', - 'trading-assistant.form.confirmCreate': 'Confirmer la création', - 'trading-assistant.form.confirmEdit': 'Confirmer les modifications', - 'trading-assistant.messages.createSuccess': 'Stratégie créée avec succès', - 'trading-assistant.messages.createFailed': 'Échec de la création de la stratégie', - 'trading-assistant.messages.updateSuccess': 'Mise à jour de la stratégie réussie', - 'trading-assistant.messages.updateFailed': 'Échec de la mise à jour de la stratégie', - 'trading-assistant.messages.deleteSuccess': 'Suppression de la stratégie réussie', - 'trading-assistant.messages.deleteFailed': 'Échec de la suppression de la stratégie', - 'trading-assistant.messages.startSuccess': 'La stratégie a démarré avec succès', - 'trading-assistant.messages.startFailed': 'Échec du démarrage de la stratégie', - 'trading-assistant.messages.stopSuccess': "La stratégie s'est arrêtée avec succès", - 'trading-assistant.messages.stopFailed': "La stratégie d'arrêt a échoué", - 'trading-assistant.messages.loadFailed': "Échec de l'obtention de la liste des règles", - 'trading-assistant.messages.runningWarning': 'La stratégie est en marche. Veuillez arrêter la stratégie avant de la modifier.', - 'trading-assistant.messages.deleteConfirmWithName': 'Êtes-vous sûr de vouloir supprimer la stratégie « {name} » ? Cette opération est irréversible.', - 'trading-assistant.messages.deleteConfirm': 'Êtes-vous sûr de vouloir supprimer cette stratégie ? Cette opération est irréversible.', - 'trading-assistant.messages.loadTradesFailed': "Échec de l'obtention des enregistrements de transaction", - 'trading-assistant.messages.loadPositionsFailed': "Impossible d'obtenir l'enregistrement de position", - 'trading-assistant.messages.loadEquityFailed': "Impossible d'obtenir la courbe des capitaux propres", - 'trading-assistant.messages.loadIndicatorsFailed': 'Échec du chargement de la liste des indicateurs, veuillez réessayer plus tard', - 'trading-assistant.messages.spotLimitations': 'Le trading au comptant a été automatiquement réglé sur position longue uniquement, effet de levier 1x', - 'trading-assistant.messages.autoFillApiConfig': "La configuration historique de l'API de l'échange a été automatiquement renseignée", - 'trading-assistant.placeholders.selectIndicator': 'Veuillez sélectionner un indicateur', - 'trading-assistant.placeholders.selectExchange': 'Veuillez sélectionner un échange', - 'trading-assistant.placeholders.inputApiKey': 'Veuillez saisir la clé API', - 'trading-assistant.placeholders.inputSecretKey': 'Veuillez entrer la clé secrète', - 'trading-assistant.placeholders.inputPassphrase': 'Veuillez saisir la phrase secrète', - 'trading-assistant.placeholders.inputStrategyName': 'Veuillez saisir un nom de stratégie', - 'trading-assistant.placeholders.selectSymbol': 'Veuillez sélectionner une paire de trading', - 'trading-assistant.placeholders.selectTimeframe': 'Veuillez sélectionner une période', - 'trading-assistant.placeholders.selectKlinePeriod': 'Veuillez sélectionner une période K-Line', - 'trading-assistant.placeholders.inputAiFilterPrompt': 'Veuillez entrer une invite personnalisée (optionnel)', - 'trading-assistant.validation.indicatorRequired': 'Veuillez sélectionner un indicateur', - 'trading-assistant.validation.exchangeRequired': 'Veuillez sélectionner un échange', - 'trading-assistant.validation.apiKeyRequired': 'Veuillez saisir la clé API', - 'trading-assistant.validation.secretKeyRequired': 'Veuillez entrer la clé secrète', - 'trading-assistant.validation.passphraseRequired': 'Veuillez saisir la phrase secrète', - 'trading-assistant.validation.exchangeConfigIncomplete': "Veuillez remplir les informations complètes de configuration de l'échange", - 'trading-assistant.validation.testConnectionRequired': 'Veuillez d\'abord cliquer sur le bouton "Tester la connexion" et vous assurer que la connexion est réussie', - 'trading-assistant.validation.testConnectionFailed': 'Le test de connexion a échoué, veuillez vérifier la configuration et réessayer', - 'trading-assistant.validation.strategyNameRequired': 'Veuillez saisir un nom de stratégie', - 'trading-assistant.validation.symbolRequired': 'Veuillez sélectionner une paire de trading', - 'trading-assistant.validation.initialCapitalRequired': "Veuillez saisir le montant de l'investissement", - 'trading-assistant.validation.leverageRequired': 'Veuillez saisir le ratio de levier', - 'trading-assistant.table.time': 'temps', - 'trading-assistant.table.type': 'Tapez', - 'trading-assistant.table.price': 'prix', - 'trading-assistant.table.amount': 'Quantité', - 'trading-assistant.table.value': 'Montant', - 'trading-assistant.table.commission': 'frais de traitement', - 'trading-assistant.table.symbol': 'paire de trading', - 'trading-assistant.table.side': 'direction', - 'trading-assistant.table.size': 'Quantité de position', - 'trading-assistant.table.entryPrice': "Prix d'ouverture", - 'trading-assistant.table.currentPrice': 'prix actuel', - 'trading-assistant.table.unrealizedPnl': 'profit ou perte non réalisé', - 'trading-assistant.table.pnlPercent': 'Ratio de profits et pertes', - 'trading-assistant.table.buy': 'acheter', - 'trading-assistant.table.sell': 'vendre', - 'trading-assistant.table.long': 'Allez-y longtemps', - 'trading-assistant.table.short': 'court', - 'trading-assistant.table.noPositions': "Aucun poste pour l'instant", - 'trading-assistant.detail.title': 'Détails de la stratégie', - 'trading-assistant.detail.strategyName': 'Nom de la stratégie', - 'trading-assistant.detail.strategyType': 'Type de stratégie', - 'trading-assistant.detail.status': 'Statut', - 'trading-assistant.detail.tradingMode': 'modèle commercial', - 'trading-assistant.detail.exchange': 'échange', - 'trading-assistant.detail.initialCapital': 'Capital initial', - 'trading-assistant.detail.totalInvestment': "montant total de l'investissement", - 'trading-assistant.detail.currentEquity': 'Valeur nette actuelle', - 'trading-assistant.detail.totalPnl': 'Total des profits et pertes', - 'trading-assistant.detail.indicatorName': "Nom de l'indicateur", - 'trading-assistant.detail.maxLeverage': 'Effet de levier maximal', - 'trading-assistant.detail.decideInterval': 'intervalle de décision', - 'trading-assistant.detail.symbols': 'Objet de transaction', - 'trading-assistant.detail.createdAt': 'temps de création', - 'trading-assistant.detail.updatedAt': 'Heure de mise à jour', - 'trading-assistant.detail.llmConfig': "Configuration du modèle d'IA", - 'trading-assistant.detail.exchangeConfig': "Configuration d'échange", - 'trading-assistant.detail.provider': 'fournisseur', - 'trading-assistant.detail.modelId': 'ID du modèle', - 'trading-assistant.detail.close': 'Fermer', - 'trading-assistant.detail.loadFailed': "Échec de l'obtention des détails de la stratégie", - 'trading-assistant.equity.noData': "Aucune donnée sur la valeur nette pour l'instant", - 'trading-assistant.equity.equity': 'valeur nette', - 'trading-assistant.exchange.tradingMode': 'modèle commercial', - 'trading-assistant.exchange.virtual': 'trading simulé', - 'trading-assistant.exchange.live': 'Transaction réelle', - 'trading-assistant.exchange.selectExchange': 'Sélectionnez un échange', - 'trading-assistant.exchange.walletAddress': 'adresse du portefeuille', - 'trading-assistant.exchange.walletAddressPlaceholder': "Veuillez saisir l'adresse de votre portefeuille (en commençant par 0x)", - 'trading-assistant.exchange.privateKey': 'clé privée', - 'trading-assistant.exchange.privateKeyPlaceholder': 'Veuillez saisir la clé privée (64 caractères)', - 'trading-assistant.exchange.testConnection': 'tester la connexion', - 'trading-assistant.exchange.connectionSuccess': 'Connexion réussie', - 'trading-assistant.exchange.connectionFailed': 'La connexion a échoué', - 'trading-assistant.exchange.testFailed': 'Le test de connexion a échoué', - 'trading-assistant.exchange.fillComplete': "Veuillez remplir les informations complètes de configuration de l'échange", - 'trading-assistant.strategyTypeOptions.ai': "Stratégie basée sur l'IA", - 'trading-assistant.strategyTypeOptions.indicator': "Stratégie d'indicateurs techniques", - 'trading-assistant.strategyTypeOptions.aiDeveloping': "La fonction de stratégie basée sur l'IA est en cours de développement, alors restez à l'écoute", - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': "Des fonctionnalités de stratégie basées sur l'IA sont en cours de développement", - 'trading-assistant.indicatorType.trend': 'Tendance', - 'trading-assistant.indicatorType.momentum': 'élan', - 'trading-assistant.indicatorType.volatility': 'Fluctuations', - 'trading-assistant.indicatorType.volume': 'Volume', - 'trading-assistant.indicatorType.custom': 'Personnaliser', - 'trading-assistant.exchangeNames': { - 'okx': 'OKX', - 'binance': 'Binance', - 'hyperliquid': 'Hyperliquide', - 'blockchaincom': 'Blockchain.com', - 'coinbaseexchange': 'Coinbase', - 'gate': 'Porte.io', - 'mexc': 'MEXIQUE', - 'kraken': 'Kraken', - 'bitfinex': 'Bitfinex', - 'bybit': 'Bybit', - 'kucoin': 'KuCoin', - 'huobi': 'Huobi', - 'bitget': 'Bitget', - 'bitmex': 'BitMEX', - 'deribit': 'Déribuer', - 'phemex': 'Phemex', - 'bitmart': 'BitMart', - 'bitstamp': 'Timbre de bits', - 'bittrex': 'Bittrex', - 'poloniex': 'Poloniex', - 'gemini': 'Gémeaux', - 'cryptocom': 'Crypto.com', - 'bitflyer': 'bitFlyer', - 'upbit': 'Débit ascendant', - 'bithumb': 'Bithumb', - 'coinone': 'Coinone', - 'zb': 'ZB', - 'lbank': 'LBanque', - 'bibox': 'Bibox', - 'bigone': 'BigONE', - 'bitrue': 'Bitrue', - 'coinex': 'CoinEx', - 'digifinex': 'DigiFinex', - 'ftx': 'FTX', - 'ftxus': 'FTX États-Unis', - 'binanceus': 'Binance États-Unis', - 'binancecoinm': 'Binance COIN-M', - 'binanceusdm': 'Binance USDⓈ-M' - }, - 'ai-trading-assistant.title': 'Assistant de trading IA', - 'ai-trading-assistant.strategyList': 'Liste de stratégies', - 'ai-trading-assistant.createStrategy': 'Créer une politique', - 'ai-trading-assistant.noStrategy': 'Pas encore de stratégie', - 'ai-trading-assistant.selectStrategy': 'Veuillez sélectionner une stratégie à gauche pour afficher les détails', - 'ai-trading-assistant.startStrategy': 'stratégie de lancement', - 'ai-trading-assistant.stopStrategy': "stratégie d'arrêt", - 'ai-trading-assistant.editStrategy': 'Stratégie éditoriale', - 'ai-trading-assistant.deleteStrategy': 'Supprimer la stratégie', - 'ai-trading-assistant.status.running': 'Courir', - 'ai-trading-assistant.status.stopped': 'Arrêté', - 'ai-trading-assistant.status.error': 'Erreur', - 'ai-trading-assistant.tabs.tradingRecords': 'historique des transactions', - 'ai-trading-assistant.tabs.positions': 'Enregistrement de poste', - 'ai-trading-assistant.tabs.aiDecisions': 'Enregistrement de décision IA', - 'ai-trading-assistant.tabs.equityCurve': 'courbe des actions', - 'ai-trading-assistant.form.createTitle': 'Créer des stratégies de trading IA', - 'ai-trading-assistant.form.editTitle': "Modifier la stratégie de trading de l'IA", - 'ai-trading-assistant.form.strategyName': 'Nom de la stratégie', - 'ai-trading-assistant.form.modelId': "Modèle d'IA", - 'ai-trading-assistant.form.modelIdHint': 'Utilisez le service système OpenRouter sans configurer la clé API', - 'ai-trading-assistant.form.decideInterval': 'intervalle de décision', - 'ai-trading-assistant.form.decideInterval5m': '5 minutes', - 'ai-trading-assistant.form.decideInterval10m': '10 minutes', - 'ai-trading-assistant.form.decideInterval30m': '30 minutes', - 'ai-trading-assistant.form.decideInterval1h': '1 heure', - 'ai-trading-assistant.form.decideInterval4h': '4 heures', - 'ai-trading-assistant.form.decideInterval1d': '1 jour', - 'ai-trading-assistant.form.decideInterval1w': '1 semaine', - 'ai-trading-assistant.form.decideIntervalHint': 'L’intervalle de temps nécessaire à l’IA pour prendre des décisions', - 'ai-trading-assistant.form.runPeriod': "Cycle d'exécution", - 'ai-trading-assistant.form.runPeriodHint': "L'heure de début et l'heure de fin de l'exécution de la stratégie", - 'ai-trading-assistant.form.startDate': 'date de début', - 'ai-trading-assistant.form.endDate': 'date de fin', - 'ai-trading-assistant.form.qdtCostTitle': 'Instructions de déduction QDT', - 'ai-trading-assistant.form.qdtCostHint': "{cost} QDT sera déduit pour chaque décision de l'IA. Veuillez vous assurer que votre compte dispose d'un solde QDT suffisant. Lors de l'exécution de la stratégie, des frais seront déduits en temps réel pour chaque décision.", - 'ai-trading-assistant.form.apiKey': 'Clé API', - 'ai-trading-assistant.form.exchange': 'Sélectionnez un échange', - 'ai-trading-assistant.form.secretKey': 'Clé secrète', - 'ai-trading-assistant.form.passphrase': 'Phrase secrète', - 'ai-trading-assistant.form.testConnection': 'tester la connexion', - 'ai-trading-assistant.form.symbol': 'paire de trading', - 'ai-trading-assistant.form.symbolHint': 'Sélectionnez la paire de trading à trader', - 'ai-trading-assistant.form.initialCapital': 'Montant investi (marge)', - 'ai-trading-assistant.form.leverage': 'Tirer parti de plusieurs', - 'ai-trading-assistant.form.timeframe': 'période', - 'ai-trading-assistant.form.timeframe1m': '1 minute', - 'ai-trading-assistant.form.timeframe5m': '5 minutes', - 'ai-trading-assistant.form.timeframe15m': '15 minutes', - 'ai-trading-assistant.form.timeframe30m': '30 minutes', - 'ai-trading-assistant.form.timeframe1H': '1 heure', - 'ai-trading-assistant.form.timeframe4H': '4 heures', - 'ai-trading-assistant.form.timeframe1D': '1 jour', - 'ai-trading-assistant.form.marketType': 'type de marché', - 'ai-trading-assistant.form.marketTypeFutures': 'contrat', - 'ai-trading-assistant.form.marketTypeSpot': 'Spot', - 'ai-trading-assistant.form.totalPnl': 'Total des profits et pertes', - 'ai-trading-assistant.form.customPrompt': "Mots d'invite personnalisés", - 'ai-trading-assistant.form.customPromptHint': "Facultatif, utilisé pour personnaliser les stratégies de trading de l'IA et la logique de prise de décision", - 'ai-trading-assistant.form.cancel': 'Annuler', - 'ai-trading-assistant.form.prev': 'Étape précédente', - 'ai-trading-assistant.form.next': 'Étape suivante', - 'ai-trading-assistant.form.confirmCreate': 'Confirmer la création', - 'ai-trading-assistant.form.confirmEdit': 'Confirmer les modifications', - 'ai-trading-assistant.messages.createSuccess': 'Stratégie créée avec succès', - 'ai-trading-assistant.messages.createFailed': 'Échec de la création de la stratégie', - 'ai-trading-assistant.messages.updateSuccess': 'Mise à jour de la stratégie réussie', - 'ai-trading-assistant.messages.updateFailed': 'Échec de la mise à jour de la stratégie', - 'ai-trading-assistant.messages.deleteSuccess': 'Suppression de la stratégie réussie', - 'ai-trading-assistant.messages.deleteFailed': 'Échec de la suppression de la stratégie', - 'ai-trading-assistant.messages.startSuccess': 'La stratégie a démarré avec succès', - 'ai-trading-assistant.messages.startFailed': 'Échec du démarrage de la stratégie', - 'ai-trading-assistant.messages.stopSuccess': "La stratégie s'est arrêtée avec succès", - 'ai-trading-assistant.messages.stopFailed': "La stratégie d'arrêt a échoué", - 'ai-trading-assistant.messages.loadFailed': "Échec de l'obtention de la liste des règles", - 'ai-trading-assistant.messages.loadDecisionsFailed': "Échec de l'obtention du dossier de décision de l'IA", - 'ai-trading-assistant.messages.deleteConfirm': 'Êtes-vous sûr de vouloir supprimer cette stratégie ? Cette opération est irréversible.', - 'ai-trading-assistant.placeholders.inputStrategyName': 'Veuillez saisir un nom de stratégie', - 'ai-trading-assistant.placeholders.selectModelId': "Veuillez sélectionner un modèle d'IA", - 'ai-trading-assistant.placeholders.selectDecideInterval': 'Veuillez sélectionner un intervalle de décision', - 'ai-trading-assistant.placeholders.startTime': 'heure de début', - 'ai-trading-assistant.placeholders.endTime': 'heure de fin', - 'ai-trading-assistant.placeholders.inputApiKey': 'Veuillez saisir la clé API', - 'ai-trading-assistant.placeholders.selectExchange': 'Veuillez sélectionner un échange', - 'ai-trading-assistant.placeholders.inputSecretKey': 'Veuillez entrer la clé secrète', - 'ai-trading-assistant.placeholders.inputPassphrase': 'Veuillez saisir la phrase secrète', - 'ai-trading-assistant.placeholders.selectSymbol': 'Veuillez sélectionner une paire de trading, telle que : BTC/USDT', - 'ai-trading-assistant.placeholders.selectTimeframe': 'Veuillez sélectionner une période', - 'ai-trading-assistant.placeholders.inputCustomPrompt': "Veuillez saisir un mot d'invite personnalisé (facultatif)", - 'ai-trading-assistant.validation.strategyNameRequired': 'Veuillez saisir un nom de stratégie', - 'ai-trading-assistant.validation.modelIdRequired': "Veuillez sélectionner un modèle d'IA", - 'ai-trading-assistant.validation.runPeriodRequired': "Veuillez sélectionner un cycle d'exécution", - 'ai-trading-assistant.validation.apiKeyRequired': 'Veuillez saisir la clé API', - 'ai-trading-assistant.validation.exchangeRequired': 'Veuillez sélectionner un échange', - 'ai-trading-assistant.validation.secretKeyRequired': 'Veuillez entrer la clé secrète', - 'ai-trading-assistant.validation.symbolRequired': 'Veuillez sélectionner une paire de trading', - 'ai-trading-assistant.validation.initialCapitalRequired': "Veuillez saisir le montant de l'investissement", - 'ai-trading-assistant.table.time': 'temps', - 'ai-trading-assistant.table.type': 'Tapez', - 'ai-trading-assistant.table.price': 'prix', - 'ai-trading-assistant.table.amount': 'Quantité', - 'ai-trading-assistant.table.value': 'Montant', - 'ai-trading-assistant.table.symbol': 'paire de trading', - 'ai-trading-assistant.table.side': 'direction', - 'ai-trading-assistant.table.size': 'Quantité de position', - 'ai-trading-assistant.table.entryPrice': "Prix d'ouverture", - 'ai-trading-assistant.table.currentPrice': 'prix actuel', - 'ai-trading-assistant.table.unrealizedPnl': 'profit ou perte non réalisé', - 'ai-trading-assistant.table.profit': 'Profits et pertes', - 'ai-trading-assistant.table.openLong': 'Ouvert longtemps', - 'ai-trading-assistant.table.closeLong': 'Pinduo', - 'ai-trading-assistant.table.openShort': 'Ouvert court', - 'ai-trading-assistant.table.closeShort': 'vide', - 'ai-trading-assistant.table.addLong': 'Gadot', - 'ai-trading-assistant.table.addShort': 'ajouter un court', - 'ai-trading-assistant.table.closeShortProfit': 'Prendre des bénéfices sur une position courte', - 'ai-trading-assistant.table.closeShortStop': 'Arrêter la perte', - 'ai-trading-assistant.table.closeLongProfit': 'Arrêtez-vous longtemps et profitez', - 'ai-trading-assistant.table.closeLongStop': 'Arrêter la perte', - 'ai-trading-assistant.table.buy': 'acheter', - 'ai-trading-assistant.table.sell': 'vendre', - 'ai-trading-assistant.table.long': 'Allez-y longtemps', - 'ai-trading-assistant.table.short': 'court', - 'ai-trading-assistant.table.hold': 'tenir', - 'ai-trading-assistant.table.reasoning': "Raison de l'analyse", - 'ai-trading-assistant.table.decisions': 'prise de décision', - 'ai-trading-assistant.table.riskAssessment': 'évaluation des risques', - 'ai-trading-assistant.table.confidence': 'Confiance', - 'ai-trading-assistant.table.totalRecords': '{total} enregistrements au total', - 'ai-trading-assistant.table.noPositions': "Aucun poste pour l'instant", - 'ai-trading-assistant.detail.title': 'Détails de la stratégie', - 'ai-trading-assistant.equity.noData': "Aucune donnée sur la valeur nette pour l'instant", - 'ai-trading-assistant.equity.equity': 'valeur nette', - 'ai-trading-assistant.exchange.testFailed': 'Le test de connexion a échoué', - 'ai-trading-assistant.exchange.connectionSuccess': 'Connexion réussie', - 'ai-trading-assistant.exchange.connectionFailed': 'La connexion a échoué', - 'ai-trading-assistant.form.advancedSettings': 'Paramètres avancés', - 'ai-trading-assistant.form.orderMode': 'Mode de commande', - 'ai-trading-assistant.form.orderModeMaker': 'Créateur', - 'ai-trading-assistant.form.orderModeTaker': 'Prix du marché (Preneur)', - 'ai-trading-assistant.form.orderModeHint': "Le mode d'ordre en attente utilise des ordres limités et les frais de traitement sont inférieurs ; le mode prix du marché est exécuté immédiatement et les frais de traitement sont plus élevés.", - 'ai-trading-assistant.form.makerWaitSec': "Temps d'attente pour les commandes en attente (secondes)", - 'ai-trading-assistant.form.makerWaitSecHint': "Le temps d'attente pour la transaction après avoir passé une commande. Annulez et réessayez après l'expiration du délai.", - 'ai-trading-assistant.form.makerRetries': 'Nombre de tentatives pour les commandes en attente', - 'ai-trading-assistant.form.makerRetriesHint': "Le nombre maximum de tentatives lorsqu'un ordre en attente n'est pas exécuté", - 'ai-trading-assistant.form.fallbackToMarket': "L'ordre en attente échoue et le prix du marché est dégradé.", - 'ai-trading-assistant.form.fallbackToMarketHint': "Lorsque l'ordre en attente d'ouverture/de clôture n'a pas été exécuté, s'il doit être rétrogradé en ordre au marché pour garantir que la transaction soit terminée.", - 'ai-trading-assistant.form.marginMode': 'Mode marge', - 'ai-trading-assistant.form.marginModeCross': 'Entrepôt complet', - 'ai-trading-assistant.form.marginModeIsolated': 'Position isolée', - 'ai-analysis.title': 'Moteur de trading quantique', - 'ai-analysis.system.online': 'en ligne', - 'ai-analysis.system.agents': 'agent', - 'ai-analysis.system.active': 'actif', - 'ai-analysis.system.stage': 'scène', - 'ai-analysis.panel.roster': 'Composition des agents', - 'ai-analysis.panel.thinking': 'En pensant...', - 'ai-analysis.panel.done': 'Terminé', - 'ai-analysis.panel.standby': 'veille', - 'ai-analysis.input.title': 'Moteur de trading quantique', - 'ai-analysis.input.placeholder': "Sélectionnez l'actif cible (par exemple BTC/USDT)", - 'ai-analysis.input.watchlist': 'Stocks optionnels', - 'ai-analysis.input.start': "Démarrer l'analyse", - 'ai-analysis.input.recent': 'Tâches récentes :', - 'ai-analysis.vis.stage': 'étape', - 'ai-analysis.vis.processing': 'Traitement', - 'ai-analysis.result.complete': 'Analyse terminée', - 'ai-analysis.result.signal': 'signal final', - 'ai-analysis.result.confidence': 'Confiance :', - 'ai-analysis.result.new': 'nouvelle analyse', - 'ai-analysis.result.full': 'Voir le rapport complet', - 'ai-analysis.logs.title': 'Journal système', - 'ai-analysis.modal.title': 'rapport confidentiel', - 'ai-analysis.modal.fundamental': 'analyse fondamentale', - 'ai-analysis.modal.technical': 'Analyse technique', - 'ai-analysis.modal.sentiment': 'Analyse émotionnelle', - 'ai-analysis.modal.risk': 'évaluation des risques', - 'ai-analysis.stage.idle': 'veille', - 'ai-analysis.stage.1': 'Première phase : analyse multidimensionnelle', - 'ai-analysis.stage.2': 'Phase deux : débat long-court', - 'ai-analysis.stage.3': 'Phase trois : planification stratégique', - 'ai-analysis.stage.4': 'La quatrième étape : la revue du contrôle des risques', - 'ai-analysis.stage.complete': 'Terminé', - 'ai-analysis.agent.investment_director': 'Directeur des investissements', - 'ai-analysis.agent.role.investment_director': 'Analyse complète et conclusion finale', - 'ai-analysis.agent.market': 'analyste de marché', - 'ai-analysis.agent.role.market': 'Données technologiques et de marché', - 'ai-analysis.agent.fundamental': 'analyste fondamental', - 'ai-analysis.agent.role.fundamental': 'Finances et valorisation', - 'ai-analysis.agent.technical': 'analyste technique', - 'ai-analysis.agent.role.technical': 'Indicateurs et graphiques techniques', - 'ai-analysis.agent.news': 'analyste de nouvelles', - 'ai-analysis.agent.role.news': "Filtre d'actualités mondiales", - 'ai-analysis.agent.sentiment': 'analyste des sentiments', - 'ai-analysis.agent.role.sentiment': 'Social et émotionnel', - 'ai-analysis.agent.risk': 'analyste des risques', - 'ai-analysis.agent.role.risk': 'Vérification des risques de base', - 'ai-analysis.agent.bull': 'chercheur optimiste', - 'ai-analysis.agent.role.bull': 'Extraction de catalyseurs de croissance', - 'ai-analysis.agent.bear': 'chercheur baissier', - 'ai-analysis.agent.role.bear': 'Recherche de risques et de défauts', - 'ai-analysis.agent.manager': 'directeur de recherche', - 'ai-analysis.agent.role.manager': 'modérateur du débat', - 'ai-analysis.agent.trader': 'commerçant', - 'ai-analysis.agent.role.trader': 'Stratège exécutif', - 'ai-analysis.agent.risky': 'analyste activiste', - 'ai-analysis.agent.role.risky': 'stratégie agressive', - 'ai-analysis.agent.neutral': "analyste d'équilibre", - 'ai-analysis.agent.role.neutral': "stratégie d'équilibrage", - 'ai-analysis.agent.safe': 'analyste conservateur', - 'ai-analysis.agent.role.safe': 'stratégie conservatrice', - 'ai-analysis.agent.cro': 'Responsable du contrôle des risques (CRO)', - 'ai-analysis.agent.role.cro': 'autorité décisionnelle finale', - 'ai-analysis.script.market': 'Récupération des données OHLCV des principaux échanges...', - 'ai-analysis.script.fundamental': 'Récupération des rapports financiers trimestriels...', - 'ai-analysis.script.technical': 'Analyser les indicateurs techniques et les modèles de graphiques...', - 'ai-analysis.script.news': "Analyse de l'actualité financière mondiale...", - 'ai-analysis.script.sentiment': 'Analyser les tendances des réseaux sociaux...', - 'ai-analysis.script.risk': 'Calcul de la volatilité historique...', - 'invite.inviteLink': "Lien d'invitation", - 'invite.copy': 'Copier le lien', - 'invite.copySuccess': 'Copiez avec succès !', - 'invite.copyFailed': 'Échec de la copie, veuillez copier manuellement', - 'invite.noInviteLink': "Lien d'invitation non généré", - 'invite.totalInvites': 'Invitations cumulées', - 'invite.totalReward': 'Récompenses cumulées', - 'invite.rules': "Règles d'invitation", - 'invite.rule1': "Chaque fois que vous invitez avec succès un ami à s'inscrire, vous recevrez une récompense", - 'invite.rule2': "Si l'ami invité termine la première transaction, vous recevrez des récompenses supplémentaires", - 'invite.rule3': "Les récompenses d'invitation seront envoyées directement sur votre compte", - 'invite.inviteList': "Liste d'invitations", - 'invite.tasks': 'centre de mission', - 'invite.inviteeName': 'Invité', - 'invite.inviteTime': "Heure d'invitation", - 'invite.status': 'Statut', - 'invite.reward': 'récompense', - 'invite.active': 'actif', - 'invite.inactive': 'Non activé', - 'invite.completed': 'Terminé', - 'invite.claimed': 'Reçu', - 'invite.pending': 'A compléter', - 'invite.goToTask': 'compléter', - 'invite.claimReward': 'réclamer des récompenses', - 'invite.verify': 'Vérification terminée', - 'invite.verifySuccess': 'Vérification réussie ! Tâche terminée', - 'invite.verifyNotCompleted': "La tâche n'est pas encore terminée, veuillez d'abord la terminer", - 'invite.verifyFailed': 'La vérification a échoué, veuillez réessayer plus tard', - 'invite.claimSuccess': 'Vous avez reçu avec succès {reward} QDT !', - 'invite.claimFailed': 'Échec de la collecte, veuillez réessayer plus tard', - 'invite.totalRecords': '{total} enregistrements au total', - 'invite.task.twitter.title': 'Retweeter sur X (Twitter)', - 'invite.task.twitter.desc': 'Partagez nos tweets officiels sur votre compte X (Twitter)', - 'invite.task.youtube.title': 'Suivez notre chaîne YouTube', - 'invite.task.youtube.desc': 'Abonnez-vous et suivez notre chaîne YouTube officielle', - 'invite.task.telegram.title': 'Rejoindre le groupe Telegram', - 'invite.task.telegram.desc': 'Rejoignez notre groupe communautaire officiel Telegram', - 'invite.task.discord.title': 'Rejoignez un serveur Discord', - 'invite.task.discord.desc': 'Rejoignez notre serveur communautaire Discord', - 'message': '-', - 'layouts.usermenu.dialog.title': 'informations', - 'layouts.usermenu.dialog.content': 'Êtes-vous sûr de vouloir vous déconnecter ?', - 'layouts.userLayout.title': "Trouver la vérité dans l'incertitude", - // Auto-filled missing keys from en-US (fallback to English) - 'dashboard.indicator.boundary.message': 'Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.', - 'dashboard.indicator.boundary.indicatorRule': "Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.", - 'dashboard.indicator.boundary.backtestRule': 'Rule: If a bar has a main signal (buy/sell → open/close/reverse), scaling in/out is skipped on the same bar.', - 'dashboard.indicator.guide.title': 'Python Indicator & Strategy Development Guide', - 'dashboard.indicator.guide.intro': 'This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.', - 'dashboard.indicator.guide.section1.title': '1. Runtime Environment & Predefined Variables', - 'dashboard.indicator.guide.section1.env': 'Your code runs in a browser-based Python environment (Pyodide).', - 'dashboard.indicator.guide.section1.libs': 'Pre-installed Libraries', - 'dashboard.indicator.guide.section1.libsDesc': 'The following libraries are imported by default, no need to import again:', - 'dashboard.indicator.guide.section1.libsList': 'pandas (pd), numpy (np), math, json', - 'dashboard.indicator.guide.section1.data': 'Input Data: df', - 'dashboard.indicator.guide.section1.dataDesc': 'The system automatically converts current K-line data into a Pandas DataFrame object, variable name is df.', - 'dashboard.indicator.guide.section1.dataColumns': 'df contains the following columns (all float type):', - 'dashboard.indicator.guide.section1.dataColumnsList': 'time (timestamp, seconds), open, high, low, close, volume', - 'dashboard.indicator.guide.section1.dataNote': 'Data index is arranged from old to new (0 is the earliest data, last row is the latest data).', - 'dashboard.indicator.guide.section1.dataIndex': 'Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using .values which loses the index.', - 'dashboard.indicator.guide.section2.title': '2. Parameter Definition', - 'dashboard.indicator.guide.section2.desc': 'You can define variables as parameters at the beginning of your code. The system will try to parse statements like variable = value as adjustable parameters.', - 'dashboard.indicator.guide.section2.example': 'Parameter Example', - 'dashboard.indicator.guide.section2.exampleCode': 'span = 20 or multiplier = 2.0', - 'dashboard.indicator.guide.section3.title': '3. Backtest Signal Setup (Important!)', - 'dashboard.indicator.guide.section3.desc': 'If you want your indicator to support backtesting, you must set the following two columns in your code:', - 'dashboard.indicator.guide.section3.backtestRequired': 'Required for Backtesting:', - 'dashboard.indicator.guide.section3.backtestBuySignal': "df['buy_signal'] - Boolean Series, True indicates buy signal", - 'dashboard.indicator.guide.section3.backtestSellSignal': "df['sell_signal'] - Boolean Series, True indicates sell signal", - 'dashboard.indicator.guide.section3.backtestExample': 'Example:', - 'dashboard.indicator.guide.section3.backtestExampleCode': "df['buy_signal'] = condition_buy
    df['sell_signal'] = condition_sell", - 'dashboard.indicator.guide.section3.backtestNote': 'Note: Even if you only set output.signals for chart display, you must set these two columns to enable backtesting.', - 'dashboard.indicator.guide.section4.title': '4. Output Requirements: output', - 'dashboard.indicator.guide.section4.desc': 'At the end of code execution, you must define a dictionary named output to tell the chart how to display results.', - 'dashboard.indicator.guide.section4.fields': 'The output dictionary contains the following fields:', - 'dashboard.indicator.guide.section4.plots': 'plots - For drawing lines (e.g., moving averages, RSI)', - 'dashboard.indicator.guide.section4.signals': 'signals - For marking buy/sell signals (e.g., arrows, labels)', - 'dashboard.indicator.guide.section4.name': 'name - Indicator name (optional)', - 'dashboard.indicator.guide.section4.calculatedVars': 'calculatedVars - Calculated variables (optional, for displaying additional information)', - 'dashboard.indicator.guide.section5.title': '5. Plot Configuration (Plots)', - 'dashboard.indicator.guide.section5.desc': 'Each object in the plots list represents a line.', - 'dashboard.indicator.guide.section5.table.field': 'Field', - 'dashboard.indicator.guide.section5.table.type': 'Type', - 'dashboard.indicator.guide.section5.table.required': 'Required', - 'dashboard.indicator.guide.section5.table.requiredYes': 'Yes', - 'dashboard.indicator.guide.section5.table.requiredNo': 'No', - 'dashboard.indicator.guide.section5.table.desc': 'Description', - 'dashboard.indicator.guide.section5.table.name': 'The name of the indicator line, displayed in the legend', - 'dashboard.indicator.guide.section5.table.data': 'Data list, length must match the number of rows in df. Recommended to use series.tolist()', - 'dashboard.indicator.guide.section5.table.color': "Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign", - 'dashboard.indicator.guide.section5.table.typeDesc': "Chart type, default is 'line'", - 'dashboard.indicator.guide.section5.table.overlay': 'Important. True means display on main chart (with K-line), False means display on sub-chart (independent area)', - 'dashboard.indicator.guide.section5.example': 'Example: Draw Simple Moving Average (SMA)', - 'dashboard.indicator.guide.section5.exampleCalc': 'Calculate SMA', - 'dashboard.indicator.guide.section5.exampleOutput': 'Construct Output', - 'dashboard.indicator.guide.section5.exampleOverlay': 'Display on main chart', - 'dashboard.indicator.guide.section6.title': '6. Signal Markers (Signals)', - 'dashboard.indicator.guide.section6.desc': "signals are used to mark buy/sell points on specific K-lines through icons or text. Note: This is only for chart display. The backtest system uses df['buy_signal'] and df['sell_signal'].", - 'dashboard.indicator.guide.section6.table.type': "Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)", - 'dashboard.indicator.guide.section6.table.data': 'Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions', - 'dashboard.indicator.guide.section6.table.text': 'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")', - 'dashboard.indicator.guide.section6.table.color': 'Marker color', - 'dashboard.indicator.guide.section6.hint': 'The system automatically handles positioning.', - 'dashboard.indicator.guide.section6.buy': 'Markers will be automatically positioned below the Low of the current K-line', - 'dashboard.indicator.guide.section6.sell': 'Markers will be automatically positioned above the High of the current K-line', - 'dashboard.indicator.guide.section6.example': 'Example: Draw Buy/Sell Signals', - 'dashboard.indicator.guide.section6.exampleInit': 'Initialize signal list, fill all with None', - 'dashboard.indicator.guide.section6.exampleLogic': 'Simple logic: mark buy when close price is greater than open price', - 'dashboard.indicator.guide.section6.exampleNote': 'In actual logic, please use loops or vectorized operations', - 'dashboard.indicator.guide.section6.examplePrice': 'Record price', - 'dashboard.indicator.guide.section6.exampleText': 'Buy', - 'dashboard.indicator.guide.section7.title': '7. Complete Code Examples', - 'dashboard.indicator.guide.section7.exampleA': 'Example A: Dual EMA Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleACode': "# 1. Calculate indicators
    df['ema_fast'] = df['close'].ewm(span=5, adjust=False).mean()
    df['ema_slow'] = df['close'].ewm(span=13, adjust=False).mean()

    # 2. Calculate crossover signals
    cross_up = (df['ema_fast'] > df['ema_slow']) & (df['ema_fast'].shift(1) <= df['ema_slow'].shift(1))
    cross_down = (df['ema_fast'] < df['ema_slow']) & (df['ema_fast'].shift(1) >= df['ema_slow'].shift(1))

    # 3. 【Important】Set NEW backtest signal columns (bool)
    df['open_long'] = cross_up
    df['close_long'] = cross_down
    df['open_short'] = cross_down
    df['close_short'] = cross_up

    # 4. Generate signal data for chart display
    buy_signals = [df['low'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]

    # 5. Build output
    output = {
    \"name\": \"Dual EMA Strategy\",
    \"plots\": [
    {\"name\": \"EMA 5\", \"data\": df['ema_fast'].tolist(), \"color\": \"#FF6B6B\", \"overlay\": True},
    {\"name\": \"EMA 13\", \"data\": df['ema_slow'].tolist(), \"color\": \"#4ECDC4\", \"overlay\": True}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleB': 'Example B: Bollinger Bands - Chart Display Only', - 'dashboard.indicator.guide.section7.exampleBCode': "# Calculate Bollinger Bands (chart display only, no backtesting)
    length = 20
    mult = 2.0
    df['sma'] = df['close'].rolling(length).mean()
    df['std'] = df['close'].rolling(length).std()
    df['upper'] = df['sma'] + mult * df['std']
    df['lower'] = df['sma'] - mult * df['std']

    output = {
    \"name\": \"Bollinger Bands\",
    \"plots\": [
    {\"name\": \"Upper\", \"data\": df['upper'].tolist(), \"color\": \"#FF5252\", \"overlay\": True},
    {\"name\": \"Middle\", \"data\": df['sma'].tolist(), \"color\": \"#2196F3\", \"overlay\": True},
    {\"name\": \"Lower\", \"data\": df['lower'].tolist(), \"color\": \"#00E676\", \"overlay\": True}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleC': 'Example C: RSI Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleCCode': "# Calculate RSI
    delta = df['close'].diff()
    up = delta.clip(lower=0)
    down = -1 * delta.clip(upper=0)
    ema_up = up.ewm(com=13, adjust=False).mean()
    ema_down = down.ewm(com=13, adjust=False).mean()
    rs = ema_up / ema_down
    df['rsi'] = 100 - (100 / (1 + rs))

    # Generate trading signals
    buy_condition = df['rsi'] < 30 # Oversold buy
    sell_condition = df['rsi'] > 70 # Overbought sell

    # 【Important】Set NEW backtest signal columns (bool)
    df['open_long'] = buy_condition
    df['close_long'] = sell_condition
    df['open_short'] = sell_condition
    df['close_short'] = buy_condition

    # Generate chart signals
    buy_signals = [df['low'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]

    output = {
    \"name\": \"RSI Strategy\",
    \"plots\": [
    {\"name\": \"RSI\", \"data\": df['rsi'].tolist(), \"color\": \"#9C27B0\", \"overlay\": False},
    {\"name\": \"Overbought\", \"data\": [70] * len(df), \"color\": \"#FF5252\", \"style\": \"dashed\", \"overlay\": False},
    {\"name\": \"Oversold\", \"data\": [30] * len(df), \"color\": \"#00E676\", \"style\": \"dashed\", \"overlay\": False}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section6.param': 'Parameters', - 'dashboard.indicator.guide.section6.calc': 'Calculate', - 'dashboard.indicator.guide.section6.output': 'Output', - 'dashboard.indicator.guide.section6.generate': 'Generate signal data (initialize with None)', - 'dashboard.indicator.guide.section6.subchart': 'Display on sub-chart', - 'dashboard.indicator.guide.section8.title': '8. Frequently Asked Questions (FAQ)', - 'dashboard.indicator.guide.section8.q1': "Q: Why can't my indicator be backtested?", - 'dashboard.indicator.guide.section8.a1': "A: The backtest system requires NEW signal columns: df['open_long'], df['close_long'], df['open_short'], df['close_short'] (boolean). Even if you set output.signals for chart display, you must set these columns to enable backtesting.", - 'dashboard.indicator.guide.section8.q2': 'Q: Data length mismatch?', - 'dashboard.indicator.guide.section8.a2': "A: The data list in plots and signals must have exactly the same length as the K-line data. If you use df['xxx'].tolist(), there is usually no problem.", - 'dashboard.indicator.guide.section8.q3': 'Q: How to handle NaN (empty values)?', - 'dashboard.indicator.guide.section8.a3': "A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use df.fillna(0) or other methods.", - 'dashboard.indicator.guide.section8.q4': 'Q: Index mismatch causing all signals to be NaN?', - 'dashboard.indicator.guide.section8.a4': "A: Please ensure you preserve the original df index (timestamp). Avoid using .values to create new Series. Use columns directly like df['close'] for operations.", - 'dashboard.indicator.guide.section8.q5': 'Q: Can I use third-party network libraries?', - 'dashboard.indicator.guide.section8.a5': 'A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.', - 'dashboard.indicator.guide.section8.q6': 'Q: How to debug code?', - 'dashboard.indicator.guide.section8.a6': 'A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.', - 'dashboard.indicator.guide.section8.q7': 'Q: Backtest shows 0 signals?', - 'dashboard.indicator.guide.section8.a7': "A: Please check the data type of df['open_long']/df['close_long']/df['open_short']/df['close_short']. They should be boolean (True/False), not numeric. Use condition.fillna(False).astype(bool) to ensure correct type.", - 'dashboard.indicator.backtest.commissionHint': 'Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.', - 'dashboard.indicator.backtest.historyTitle': 'Backtest History', - 'dashboard.indicator.backtest.historyRefresh': 'Refresh', - 'dashboard.indicator.backtest.historyView': 'View', - 'dashboard.indicator.backtest.historyNoData': 'No backtest history', - 'dashboard.indicator.backtest.historyUseCurrent': 'Only current symbol/timeframe', - 'dashboard.indicator.backtest.historyFilterSymbol': 'Symbol', - 'dashboard.indicator.backtest.historyFilterTimeframe': 'Timeframe', - 'dashboard.indicator.backtest.historyApply': 'Apply filters', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AI Analyze', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI Suggestions', - 'dashboard.indicator.backtest.historyNoAIResult': 'No AI analysis result', - 'dashboard.indicator.backtest.historyRunId': 'Run ID', - 'dashboard.indicator.backtest.historyCreatedAt': 'Time', - 'dashboard.indicator.backtest.historyRange': 'Range', - 'dashboard.indicator.backtest.historyStatus': 'Status', - 'dashboard.indicator.backtest.historyStatusSuccess': 'Success', - 'dashboard.indicator.backtest.historyStatusFailed': 'Failed', - 'dashboard.indicator.backtest.historyActions': 'Actions', - 'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)', - 'trading-assistant.exchange.ipWhitelistTip': 'Please add the following IPs to the whitelist in your exchange API settings:', - 'signal-robot.title': 'Signal Robot Console', - 'signal-robot.createBot': 'Create New Bot', - 'signal-robot.search.nameOrSymbol': 'Name/Symbol', - 'signal-robot.search.placeholder': 'Search bot name or symbol', - 'signal-robot.search.status': 'Status', - 'signal-robot.search.statusAll': 'All', - 'signal-robot.search.statusRunning': 'Running', - 'signal-robot.search.statusPaused': 'Paused', - 'signal-robot.search.query': 'Query', - 'signal-robot.search.reset': 'Reset', - 'signal-robot.table.botName': 'Bot Name', - 'signal-robot.table.symbolTimeframe': 'Symbol/Timeframe', - 'signal-robot.table.triggerStrategy': 'Trigger Strategy', - 'signal-robot.table.notificationChannels': 'Notification Channels', - 'signal-robot.table.status': 'Status', - 'signal-robot.table.action': 'Action', - 'signal-robot.table.triggerConditions': '{count} trigger conditions', - 'signal-robot.table.monitoring': 'Monitoring', - 'signal-robot.table.paused': 'Paused', - 'signal-robot.table.edit': 'Edit', - 'signal-robot.table.pause': 'Pause', - 'signal-robot.table.start': 'Start', - 'signal-robot.table.delete': 'Delete', - 'signal-robot.table.deleteConfirm': 'Are you sure you want to delete this bot?', - 'signal-robot.table.deleteSuccess': 'Deleted successfully', - 'signal-robot.table.startSuccess': 'Bot started', - 'signal-robot.table.pauseSuccess': 'Bot paused', - 'signal-robot.channel.telegram': 'Telegram', - 'signal-robot.channel.discord': 'Discord', - 'signal-robot.channel.email': 'Email', - 'signal-robot.channel.webhook': 'Webhook', - 'signal-robot.channel.browser': 'Browser Push', - 'signal-robot.modal.createTitle': 'Create New Signal Robot', - 'signal-robot.modal.editTitle': 'Edit Signal Robot', - 'signal-robot.modal.step.basic': 'Basic Settings', - 'signal-robot.modal.step.entry': 'Entry Strategy', - 'signal-robot.modal.step.position': 'Position Management', - 'signal-robot.modal.step.risk': 'Risk Control', - 'signal-robot.modal.step.notify': 'Notification Config', - 'signal-robot.modal.prev': 'Previous', - 'signal-robot.modal.next': 'Next', - 'signal-robot.modal.preview': 'Preview Backtest', - 'signal-robot.modal.complete': 'Complete & Run', - 'signal-robot.modal.saveSuccess': 'Saved successfully', - 'signal-robot.modal.previewDeveloping': 'Preview feature is under development...', - 'signal-robot.modal.basicInfoRequired': 'Please complete basic information', - 'signal-robot.basic.alert': 'Set basic information for the bot', - 'signal-robot.basic.title': 'Basic Information', - 'signal-robot.basic.botName': 'Bot Name', - 'signal-robot.basic.botNamePlaceholder': 'e.g.: BTC SuperTrend Strategy', - 'signal-robot.basic.symbol': 'Trading Pair', - 'signal-robot.basic.symbolPlaceholder': 'Select from watchlist', - 'signal-robot.basic.noWatchlist': 'No watchlist items, please add in market page first', - 'signal-robot.basic.timeframe': 'K-Line Period', - 'signal-robot.basic.timeframe15m': '15 Minutes', - 'signal-robot.basic.timeframe30m': '30 Minutes', - 'signal-robot.basic.timeframe1h': '1 Hour', - 'signal-robot.basic.timeframe4h': '4 Hours', - 'signal-robot.basic.timeframe1d': '1 Day', - 'signal-robot.basic.autoNameSuggestion': '{symbol} Signal Robot', - 'signal-robot.entry.alert': 'Trigger entry signal when all conditions below are met', - 'signal-robot.entry.condition': 'Condition {index}', - 'signal-robot.entry.indicator': 'Indicator', - 'signal-robot.entry.indicatorSupertrend': 'SuperTrend', - 'signal-robot.entry.indicatorEma': 'EMA (Exponential Moving Average)', - 'signal-robot.entry.indicatorRsi': 'RSI (Relative Strength Index)', - 'signal-robot.entry.indicatorMacd': 'MACD', - 'signal-robot.entry.indicatorBollinger': 'Bollinger Bands', - 'signal-robot.entry.atrPeriod': 'ATR Period', - 'signal-robot.entry.multiplier': 'Multiplier', - 'signal-robot.entry.triggerSignal': 'Trigger Signal', - 'signal-robot.entry.signalTrendBullish': 'Trend Bullish', - 'signal-robot.entry.signalTrendBearish': 'Trend Bearish', - 'signal-robot.entry.signalIsUptrend': 'Is Uptrend', - 'signal-robot.entry.signalIsDowntrend': 'Is Downtrend', - 'signal-robot.entry.period': 'Period', - 'signal-robot.entry.compareCondition': 'Compare Condition', - 'signal-robot.entry.priceAbove': 'Price > EMA (Price Above)', - 'signal-robot.entry.priceBelow': 'Price < EMA (Price Below)', - 'signal-robot.entry.crossUp': 'Price Crosses Above EMA (Golden Cross)', - 'signal-robot.entry.crossDown': 'Price Crosses Below EMA (Death Cross)', - 'signal-robot.entry.compare': 'Compare', - 'signal-robot.entry.greaterThan': 'Greater Than', - 'signal-robot.entry.lessThan': 'Less Than', - 'signal-robot.entry.crossUpShort': 'Cross Up', - 'signal-robot.entry.crossDownShort': 'Cross Down', - 'signal-robot.entry.threshold': 'Threshold', - 'signal-robot.entry.selectIndicator': 'Please select an indicator to configure parameters', - 'signal-robot.entry.addCondition': 'Add Condition', - 'signal-robot.position.alert': 'Configure initial position size, leverage and pyramiding rules', - 'signal-robot.position.basicTitle': 'Basic Position Management', - 'signal-robot.position.initialSize': 'Initial Size (Capital %)', - 'signal-robot.position.initialSizeHint': 'Recommended 5% - 20%', - 'signal-robot.position.leverage': 'Leverage', - 'signal-robot.position.leverageHint': 'Please ensure your exchange account supports this leverage', - 'signal-robot.position.maxPyramiding': 'Max Pyramiding Times', - 'signal-robot.position.maxPyramidingHint': '0 means no pyramiding', - 'signal-robot.position.pyramidingTitle': 'Pyramiding Rules', - 'signal-robot.position.pyramidingEnabled': 'Enabled', - 'signal-robot.position.pyramidingDisabled': 'Disabled', - 'signal-robot.position.pyramidingCondition': 'Pyramiding Trigger Condition', - 'signal-robot.position.priceRisePct': 'Price Rises (Long) / Falls (Short)', - 'signal-robot.position.profitPct': 'Profit Reaches', - 'signal-robot.position.triggerThreshold': 'Trigger Threshold (%)', - 'signal-robot.position.triggerThresholdHint': 'e.g. 3%: add position once every 3% rise', - 'signal-robot.position.addSize': 'Single Add Size (Capital %)', - 'signal-robot.position.pyramidingDisabledHint': 'Pyramiding disabled, only initial position will be executed', - 'signal-robot.risk.alert': 'Configure take profit, stop loss and exit rules', - 'signal-robot.risk.stopLossTitle': 'Stop Loss', - 'signal-robot.risk.stopLossEnabled': 'Enabled', - 'signal-robot.risk.stopLossDisabled': 'Disabled', - 'signal-robot.risk.stopLossType': 'Stop Loss Type', - 'signal-robot.risk.stopLossFixedPct': 'Fixed Percentage', - 'signal-robot.risk.stopLossAtrMultiplier': 'ATR Multiplier', - 'signal-robot.risk.stopLossValue': 'Value', - 'signal-robot.risk.stopLossFixedHint': 'e.g. 2%: stop loss when loss reaches 2%', - 'signal-robot.risk.stopLossAtrHint': 'e.g. 2.0: stop loss when price touches ATR*2.0', - 'signal-robot.risk.stopLossDisabledHint': 'Stop loss disabled (high risk)', - 'signal-robot.risk.trailingStopTitle': 'Trailing Stop', - 'signal-robot.risk.activationProfit': 'Activation Profit (%)', - 'signal-robot.risk.activationProfitHint': 'Start trailing when profit reaches this level', - 'signal-robot.risk.callbackPct': 'Callback (%)', - 'signal-robot.risk.callbackPctHint': 'Trigger take profit when price falls from peak by this percentage', - 'signal-robot.risk.trailingStopDisabledHint': 'Trailing stop disabled', - 'signal-robot.risk.otherExitTitle': 'Other Exit Rules', - 'signal-robot.risk.signalExit': 'Allow Signal Exit', - 'signal-robot.risk.signalExitHint': 'Close position immediately when reverse signal appears (e.g. close long when short signal appears)', - 'signal-robot.notify.alert': 'Configure notification methods when signal is triggered', - 'signal-robot.notify.channelTitle': 'Notification Channels', - 'signal-robot.notify.discordWebhook': 'Discord Webhook', - 'signal-robot.notify.genericWebhook': 'Generic Webhook', - 'signal-robot.notify.webhookUrl': 'Webhook URL', - 'signal-robot.notify.webhookUrlPlaceholder': 'https://example.com/webhook', - 'signal-robot.notify.discordUrl': 'Discord URL', - 'signal-robot.notify.discordUrlPlaceholder': 'https://discord.com/api/webhooks/...', - 'signal-robot.operator.greaterThan': 'Greater Than', - 'signal-robot.operator.lessThan': 'Less Than', - 'signal-robot.operator.equal': 'Equal', - 'signal-robot.operator.goldenCross': 'Golden Cross', - 'signal-robot.operator.deathCross': 'Death Cross', - 'signal-robot.operator.increaseBy': 'Increase By', - 'signal-robot.operator.decreaseBy': 'Decrease By', - 'signal-robot.indicator.price': 'Price', - 'signal-robot.indicator.rsi': 'RSI', - 'signal-robot.indicator.kdjK': 'KDJ(K)', - 'signal-robot.indicator.kdjJ': 'KDJ(J)', - 'signal-robot.indicator.macd': 'MACD', - 'signal-robot.indicator.macdHist': 'MACD Histogram', - 'signal-robot.indicator.bollingerUp': 'Bollinger Upper', - 'signal-robot.indicator.bollingerLow': 'Bollinger Lower', - 'signal-robot.indicator.volume': 'Volume', - 'signal-robot.indicator.changePct1h': '1H Change %', - 'signal-robot.indicator.changePct24h': '24H Change %', - 'signal-robot.indicator.signalLine': 'Signal Line', - - // Settings (Memory/Reflection) - 'settings.group.agent_memory': 'Mémoire/Réflexion', - 'settings.group.reflection_worker': 'Worker de vérification de réflexion automatique', - 'settings.field.ENABLE_AGENT_MEMORY': 'Activer la mémoire de l’agent', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'Activer la recherche vectorielle (local)', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'Dimension d’embedding', - 'settings.field.AGENT_MEMORY_TOP_K': 'Nombre Top-K', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'Taille de la fenêtre de candidats', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': 'Demi-vie de décroissance temporelle (jours)', - 'settings.field.AGENT_MEMORY_W_SIM': 'Poids de similarité', - 'settings.field.AGENT_MEMORY_W_RECENCY': 'Poids de récence', - 'settings.field.AGENT_MEMORY_W_RETURNS': 'Poids des rendements', - 'settings.field.ENABLE_REFLECTION_WORKER': 'Activer la vérification automatique', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': 'Intervalle de vérification (s)' -} - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/ja-JP.js b/quantdinger_vue/src/locales/lang/ja-JP.js deleted file mode 100644 index 22269ec..0000000 --- a/quantdinger_vue/src/locales/lang/ja-JP.js +++ /dev/null @@ -1,1795 +0,0 @@ -import antdJaJP from 'ant-design-vue/es/locale-provider/ja_JP' -import momentJA from 'moment/locale/ja' - -const components = { - antLocale: antdJaJP, - momentName: 'ja', - momentLocale: momentJA -} - -const locale = { - 'submit': '送信する', - 'save': '保存する', - 'submit.ok': '送信成功', - 'save.ok': '正常に保存されました', - 'menu.welcome': 'ようこそ', - 'menu.home': 'ホームページ', - 'menu.dashboard': 'ダッシュボード', - 'menu.dashboard.indicator': '指標分析', - 'menu.dashboard.community': 'インジケーターコミュニティ', - 'menu.dashboard.analysis': 'AI分析', - 'menu.dashboard.tradingAssistant': '取引アシスタント', - 'menu.dashboard.aiTradingAssistant': 'AI取引アシスタント', - 'menu.dashboard.signalRobot': 'シグナルロボット', - 'menu.dashboard.monitor': 'モニタリングページ', - 'menu.dashboard.workplace': '作業台', - 'menu.form': 'フォームページ', - 'menu.form.basic-form': '基本形', - 'menu.form.step-form': 'ステップバイステップフォーム', - 'menu.form.step-form.info': 'ステップバイステップフォーム(転送情報を記入)', - 'menu.form.step-form.confirm': 'ステップバイステップフォーム(振込情報の確認)', - 'menu.form.step-form.result': 'ステップバイステップのフォーム(完了)', - 'menu.form.advanced-form': '高度なフォーム', - 'menu.list': '一覧ページ', - 'menu.list.table-list': 'お問い合わせフォーム', - 'menu.list.basic-list': '規格一覧', - 'menu.list.card-list': 'カードリスト', - 'menu.list.search-list': '検索リスト', - 'menu.list.search-list.articles': '検索リスト(記事)', - 'menu.list.search-list.projects': '検索リスト(プロジェクト)', - 'menu.list.search-list.applications': '検索リスト(アプリ)', - 'menu.profile': '詳細ページ', - 'menu.profile.basic': '基本詳細ページ', - 'menu.profile.advanced': '詳細ページ', - 'menu.result': '結果ページ', - 'menu.result.success': '成功ページ', - 'menu.result.fail': '失敗ページ', - 'menu.exception': '例外ページ', - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': 'トリガーエラー', - 'menu.account': '個人ページ', - 'menu.account.center': 'パーソナルセンター', - 'menu.account.settings': '個人設定', - 'menu.account.trigger': 'トリガーエラー', - 'menu.account.logout': 'ログアウト', - 'menu.wallet': '私の財布', - 'menu.docs': 'ドキュメントセンター', - 'menu.docs.detail': '文書の詳細', - 'menu.header.refreshPage': 'ページを更新する', - 'menu.invite.friends': '友達を招待する', - 'app.setting.pagestyle': '全体的なスタイル設定', - 'app.setting.pagestyle.light': '明るいメニュースタイル', - 'app.setting.pagestyle.dark': 'ダークメニュースタイル', - 'app.setting.pagestyle.realdark': 'ダークモード', - 'app.setting.themecolor': 'テーマカラー', - 'app.setting.navigationmode': 'ナビゲーションモード', - 'app.setting.sidemenu.nav': 'サイドバーのナビゲーション', - 'app.setting.topmenu.nav': 'トップバーのナビゲーション', - 'app.setting.content-width': 'コンテンツ領域の幅', - 'app.setting.content-width.tooltip': 'この設定は、[トップバーナビゲーション]時のみ有効です。', - 'app.setting.content-width.fixed': '修正済み', - 'app.setting.content-width.fluid': 'ストリーミング', - 'app.setting.fixedheader': '固定ヘッダー', - 'app.setting.fixedheader.tooltip': '固定ヘッダー時に設定可能', - 'app.setting.autoHideHeader': 'スクロール時にヘッダーを非表示にする', - 'app.setting.fixedsidebar': 'サイドメニューを修正', - 'app.setting.sidemenu': 'サイドメニューのレイアウト', - 'app.setting.topmenu': 'トップメニューのレイアウト', - 'app.setting.othersettings': 'その他の設定', - 'app.setting.weakmode': 'カラーウィークネスモード', - 'app.setting.multitab': 'マルチタブモード', - 'app.setting.copy': '設定をコピーする', - 'app.setting.loading': 'テーマを読み込み中', - 'app.setting.copyinfo': '設定が正常にコピーされました src/config/defaultSettings.js', - 'app.setting.copy.success': 'コピー完了', - 'app.setting.copy.fail': 'コピーに失敗しました', - 'app.setting.theme.switching': 'テーマ変更!', - 'app.setting.production.hint': '構成バーは開発環境でのプレビューにのみ使用され、運用環境では表示されません。 構成ファイルを手動でコピーして変更してください。', - 'app.setting.themecolor.daybreak': 'ドーンブルー(デフォルト)', - 'app.setting.themecolor.dust': '夕暮れ', - 'app.setting.themecolor.volcano': '火山', - 'app.setting.themecolor.sunset': '日没', - 'app.setting.themecolor.cyan': '明清', - 'app.setting.themecolor.green': 'オーロラグリーン', - 'app.setting.themecolor.geekblue': 'オタクブルー', - 'app.setting.themecolor.purple': 'ジャン・ジー', - 'app.setting.tooltip': 'ページ設定', - 'user.login.userName': 'ユーザー名', - 'user.login.password': 'パスワード', - 'user.login.username.placeholder': 'アカウント: 管理者', - 'user.login.password.placeholder': 'パスワード: admin または ant.design', - 'user.login.message-invalid-credentials': 'ログインに失敗しました。メールアドレスと確認コードを確認してください', - 'user.login.message-invalid-verification-code': '認証コードエラー', - 'user.login.tab-login-credentials': 'アカウントパスワードログイン', - 'user.login.tab-login-email': 'メールログイン', - 'user.login.tab-login-mobile': '携帯電話番号ログイン', - 'user.login.captcha.placeholder': 'グラフィック認証コードを入力してください', - 'user.login.mobile.placeholder': '携帯電話番号', - 'user.login.mobile.verification-code.placeholder': '認証コード', - 'user.login.email.placeholder': 'メールアドレスを入力してください', - 'user.login.email.verification-code.placeholder': '確認コードを入力してください', - 'user.login.email.sending': '認証コードが送信されています...', - 'user.login.email.send-success-title': 'ヒント', - 'user.login.email.send-success': '確認コードは正常に送信されました。メールを確認してください', - 'user.login.sms.send-success': '確認コードが正常に送信されました。テキスト メッセージを確認してください。', - 'user.login.remember-me': '自動ログイン', - 'user.login.forgot-password': 'パスワードを忘れた場合', - 'user.login.sign-in-with': 'その他のログイン方法', - 'user.login.signup': 'アカウントを登録する', - 'user.login.login': 'ログイン', - 'user.register.register': '登録する', - 'user.register.email.placeholder': '電子メール', - 'user.register.password.placeholder': '6文字以上を入力してください。 推測されやすいパスワードは使用しないでください。', - 'user.register.password.popover-message': '6文字以上を入力してください。 推測されやすいパスワードは使用しないでください。', - 'user.register.confirm-password.placeholder': 'パスワードの確認', - 'user.register.get-verification-code': '確認コードを取得する', - 'user.register.sign-in': '既存のアカウントを使用してログインする', - 'user.register-result.msg': 'あなたのアカウント: {email} 登録が成功しました', - 'user.register-result.activation-email': 'アクティベーション電子メールはメールボックスに送信され、24 時間有効です。 すぐにメールにログインし、メール内のリンクをクリックしてアカウントをアクティブにしてください。', - 'user.register-result.back-home': 'ホームページに戻る', - 'user.register-result.view-mailbox': 'メールボックスを確認してください', - 'user.email.required': 'メールアドレスを入力してください!', - 'user.email.wrong-format': 'メールアドレスの形式が間違っています!', - 'user.userName.required': 'アカウント名またはメールアドレスを入力してください', - 'user.password.required': 'パスワードを入力してください。', - 'user.password.twice.msg': '2 回入力したパスワードが一致しません。', - 'user.password.strength.msg': 'パスワードの強度が十分ではありません', - 'user.password.strength.strong': '強さ: 強い', - 'user.password.strength.medium': '強さ: 中', - 'user.password.strength.low': '強度: 低い', - 'user.password.strength.short': '強さ:短すぎる', - 'user.confirm-password.required': 'パスワードを確認してください。', - 'user.phone-number.required': '正しい携帯電話番号を入力してください', - 'user.phone-number.wrong-format': '携帯電話番号の形式が間違っています。', - 'user.verification-code.required': '確認コードを入力してください。', - 'user.captcha.required': 'グラフィック認証コードを入力してください。', - 'user.login.infos': 'QuantDingerはAIマルチエージェント株分析補助ツールであり、証券投資コンサルティング資格はございません。 プラットフォーム内のすべての分析結果、スコア、参考意見は過去のデータに基づいてAIによって自動的に生成され、学習、研究、技術交流のみに使用され、投資アドバイスや意思決定の基礎を構成するものではありません。 株式投資には市場リスク、流動性リスク、政策リスク等の様々なリスクが伴い、元本を割り込む可能性があります。 ユーザーは自身のリスク許容度に基づいて独立した決定を行う必要があり、本ツールの使用から生じる投資行動および結果はユーザーが負担するものとします。 市場にはリスクがあり、投資は慎重になる必要があります。', - 'user.login.tab-login-web3': 'Web3ログイン', - 'user.login.web3.tip': 'ウォレットを使用した署名ログイン', - 'user.login.web3.connect': 'ウォレットに接続してログインする', - 'user.login.web3.no-wallet': 'ウォレットが検出されない', - 'user.login.web3.no-address': 'ウォレットアドレスが取得できませんでした', - 'user.login.web3.nonce-failed': '乱数の取得に失敗しました', - 'user.login.web3.verify-failed': '署名検証に失敗しました', - 'user.login.web3.success': 'ログイン成功', - 'user.login.web3.failed': 'ウォレットへのログインに失敗しました', - 'nav.no_wallet': 'ウォレットが検出されない', - 'nav.copy': 'コピー', - 'nav.copy_success': '正常にコピーされました', - 'user.login.oauth.google': 'Googleでサインイン', - 'user.login.oauth.github': 'GitHub でサインインする', - 'user.login.oauth.loading': '認証ページにリダイレクトしています...', - 'user.login.oauth.failed': 'OAuthログインに失敗しました', - 'user.login.oauth.get-url-failed': '認証リンクの取得に失敗しました', - 'user.login.subtitle': '世界市場に対する定量的な洞察を推進', - 'user.login.legal.title': '法的免責事項', - 'user.login.legal.view': '法的免責事項を表示', - 'user.login.legal.collapse': '法的免責事項を折りたたむ', - 'user.login.legal.agree': '法的免責事項を読み、同意します', - 'user.login.legal.required': 'まず法的免責事項を読んで確認してください', - 'user.login.legal.content': 'QuantDingerはAIマルチエージェント株分析補助ツールであり、証券投資コンサルティング資格はございません。 プラットフォーム内のすべての分析結果、評価、参考意見は過去のデータに基づいてAIによって自動的に生成され、学習、研究、技術交流のみに使用され、投資アドバイスや意思決定の基礎を構成するものではありません。 株式投資には市場リスク、流動性リスク、政策リスク等の様々なリスクが伴い、元本を割り込む可能性があります。 ユーザーは自身のリスク許容度に基づいて独立した決定を行う必要があり、本ツールの使用から生じる投資行動および結果はユーザーが負担するものとします。 市場にはリスクがあり、投資は慎重になる必要があります。', - 'user.login.privacy.title': 'ユーザープライバシーポリシー', - 'user.login.privacy.view': 'ユーザーのプライバシー ポリシーを表示する', - 'user.login.privacy.collapse': 'ユーザーのプライバシー規約を閉じる', - 'user.login.privacy.content': '私たちはあなたのプライバシーとデータ保護を大切にしています。 1) 収集範囲:機能の実現に必要な情報(メールアドレス、携帯電話番号、市外局番、Web3ウォレットアドレスなど)と必要なログ、端末情報のみを収集します。 2) 利用目的:アカウントへのログインおよびセキュリティ確認、サービス機能の提供、トラブルシューティングおよびコンプライアンス要件のため。 3) 保管とセキュリティ: データは暗号化されて保管され、不正なアクセス、開示、損失を防ぐために必要な許可とアクセス制御手段が講じられます。 4) 第三者との共有: 法令で義務付けられている場合、またはサービスの実行に必要な場合を除き、お客様の個人情報は第三者と共有されることはありません。サードパーティのサービス (ウォレット、SMS サービスプロバイダーなど) が関与する場合、機能の実装に必要な最小限の範囲でのみ処理されます。 5) Cookie/ローカル ストレージ: ログイン ステータスと必要なセッション維持 (トークン、PHPSESSID など) に使用され、ブラウザーでクリアまたは制限できます。 6) 個人の権利:法令に基づき、照会、訂正、削除、同意の撤回等を行う権利を行使することができます。 7) 変更と通知: これらの条件が更新されると、ページ上で目立つように表示されます。 このサービスを継続して使用することにより、更新された内容を読み、同意したものとみなされます。 本規約またはその更新に同意できない場合は、サービスの使用を中止し、当社までご連絡ください。', - 'account.basicInfo': '基本情報', - 'account.id': 'ユーザーID', - 'account.username': 'ユーザー名', - 'account.nickname': 'ニックネーム', - 'account.email': '電子メール', - 'account.mobile': '携帯電話番号', - 'account.web3address': 'ウォレットアドレス', - 'account.pid': '紹介者ID', - 'account.level': 'ユーザーレベル', - 'account.money': 'バランス', - 'account.qdtBalance': 'QDTバランス', - 'account.score': 'ポイント', - 'account.createtime': '登録時間', - 'account.inviteLink': '招待リンク', - 'account.recharge': 'リチャージ', - 'account.rechargeTip': 'WeChat または Alipay を使用して、以下の QR コードをスキャンしてチャージしてください。', - 'account.qrCodePlaceholder': 'QR コード プレースホルダー (エミュレーション)', - 'account.rechargeAmount': 'チャージ金額', - 'account.enterAmount': 'チャージ金額を入力してください', - 'account.rechargeHint': '最低入金額: 1 QDT', - 'account.confirmRecharge': 'リチャージを確認する', - 'account.enterValidAmount': '有効なリチャージ金額を入力してください', - 'account.rechargeSuccess': 'リチャージ成功! {金額} QDT を入金しました', - 'account.settings.menuMap.basic': '基本設定', - 'account.settings.menuMap.security': 'セキュリティ設定', - 'account.settings.menuMap.notification': '新着メッセージ通知', - 'account.settings.menuMap.moneyLog': 'ファンドの詳細', - 'account.moneyLog.empty': 'ファンドの詳細はまだありません', - 'account.moneyLog.total': '合計 {total} レコード', - 'account.moneyLog.type.purchase': '購入インジケーター', - 'account.moneyLog.type.recharge': 'リチャージ', - 'account.moneyLog.type.refund': '払い戻し', - 'account.moneyLog.type.reward': '報酬', - 'account.moneyLog.type.income': '指標収入', - 'account.moneyLog.type.commission': 'プラットフォーム手数料', - 'wallet.balance': 'QDTバランス', - 'wallet.recharge': 'リチャージ', - 'wallet.withdraw': '現金を引き出す', - 'wallet.filter': 'フィルター', - 'wallet.reset': 'リセット', - 'wallet.totalRecharge': '累積リチャージ', - 'wallet.totalWithdraw': '累積引き出し額', - 'wallet.totalIncome': '累計収入', - 'wallet.records': '取引記録と資金の詳細', - 'wallet.tradingRecords': '取引履歴', - 'wallet.moneyLog': 'ファンドの詳細', - 'wallet.rechargeTip': 'WeChat または Alipay を使用して、以下の QR コードをスキャンしてチャージしてください。', - 'wallet.qrCodePlaceholder': 'QR コード プレースホルダー (エミュレーション)', - 'wallet.rechargeAmount': 'チャージ金額', - 'wallet.enterAmount': 'チャージ金額を入力してください', - 'wallet.rechargeHint': '最低入金額: 1 QDT', - 'wallet.confirmRecharge': 'リチャージを確認する', - 'wallet.enterValidAmount': '有効なリチャージ金額を入力してください', - 'wallet.rechargeSuccess': 'リチャージ成功! {金額} QDT を入金しました', - 'wallet.rechargeFailed': '再充電に失敗しました', - 'wallet.withdrawTip': '出金金額と出金アドレスを入力してください', - 'wallet.withdrawAmount': '出金額', - 'wallet.enterWithdrawAmount': '出金額を入力してください', - 'wallet.withdrawHint': '最低出金額: 1 QDT', - 'wallet.withdrawAddress': '出金アドレス (オプション)', - 'wallet.enterWithdrawAddress': '出金アドレスを入力してください', - 'wallet.confirmWithdraw': '出金の確認', - 'wallet.enterValidWithdrawAmount': '有効な出金額を入力してください', - 'wallet.insufficientBalance': '残高不足', - 'wallet.withdrawSuccess': '引き出し成功! {金額} QDT を引き出しました', - 'wallet.withdrawFailed': '出金に失敗しました', - 'wallet.noTradingRecords': 'まだ取引記録がありません', - 'wallet.noMoneyLog': 'ファンドの詳細はまだありません', - 'wallet.loadTradingRecordsFailed': 'トランザクションレコードのロードに失敗しました', - 'wallet.loadMoneyLogFailed': 'ファンドの詳細をロードできませんでした', - 'wallet.moneyLogTotal': '合計 {total} レコード', - 'wallet.moneyLogTypeTitle': 'タイプ', - 'wallet.moneyLogType.all': '全種類', - 'wallet.table.time': '時間', - 'wallet.table.type': 'タイプ', - 'wallet.table.price': '価格', - 'wallet.table.amount': '数量', - 'wallet.table.money': '金額', - 'wallet.table.balance': 'バランス', - 'wallet.table.memo': '備考', - 'wallet.table.value': '値', - 'wallet.table.profit': '損益', - 'wallet.table.commission': '手数料', - 'wallet.table.total': '合計 {total} レコード', - 'wallet.tradeType.buy': '買う', - 'wallet.tradeType.sell': '売る', - 'wallet.tradeType.liquidation': '強制清算', - 'wallet.tradeType.openLong': '長く開く', - 'wallet.tradeType.addLong': 'ガドット', - 'wallet.tradeType.closeLong': 'ピンドゥオ', - 'wallet.tradeType.closeLongStop': 'ストップロスとロング', - 'wallet.tradeType.closeLongProfit': '利益を得てさらに平準化する', - 'wallet.tradeType.openShort': 'オープンショート', - 'wallet.tradeType.addShort': '短く追加する', - 'wallet.tradeType.closeShort': '空の', - 'wallet.tradeType.closeShortStop': 'ストップロス', - 'wallet.tradeType.closeShortProfit': '利益を確定して空売りを終了する', - 'wallet.moneyLogType.purchase': '購入インジケーター', - 'wallet.moneyLogType.recharge': 'リチャージ', - 'wallet.moneyLogType.withdraw': '現金を引き出す', - 'wallet.moneyLogType.refund': '払い戻し', - 'wallet.moneyLogType.reward': '報酬', - 'wallet.moneyLogType.income': '収入', - 'wallet.moneyLogType.commission': '手数料', - 'wallet.web3Address.required': '最初に Web3 ウォレットのアドレスを入力してください', - 'wallet.web3Address.requiredDescription': 'リチャージする前に、リチャージを受け取るために Web3 ウォレット アドレスをバインドする必要があります。', - 'wallet.web3Address.placeholder': 'Web3 ウォレットのアドレスを入力してください (0x で始まる)', - 'wallet.web3Address.save': 'ウォレットアドレスを保存する', - 'wallet.web3Address.saveSuccess': 'ウォレットアドレスが正常に保存されました', - 'wallet.web3Address.saveFailed': 'ウォレットアドレスの保存に失敗しました', - 'wallet.web3Address.invalidFormat': '有効な Web3 ウォレット アドレスを入力してください (イーサリアム形式: 0x で始まる 42 文字、または TRC20 形式: T で始まる 34 文字)', - 'wallet.selectCoin': '通貨を選択してください', - 'wallet.selectChain': '選択チェーン', - 'wallet.chain.eth': 'イーサリアム(ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'BSC', - 'wallet.targetQdtAmount': '引き換えたいQDTの量(オプション)', - 'wallet.targetQdtAmount.placeholder': '引き換えたい QDT の数量、現在の QDT 価格を入力してください: {price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': 'リチャージが必要: {amount} USDT', - 'wallet.rechargeAddress': 'リチャージアドレス', - 'wallet.copyAddress': 'コピー', - 'wallet.copySuccess': 'コピー成功!', - 'wallet.copyFailed': 'コピーに失敗しました。手動でコピーしてください', - 'wallet.rechargeAddressHint': 'このアドレスに {coin} を入金するには、必ず {chain} を使用してください。', - 'wallet.qdtPrice.loading': '読み込み中...', - 'wallet.rechargeTip.new': '通貨とチェーンを選択し、下の QR コードをスキャンしてリチャージしてください', - 'wallet.exchangeRate': '1 QDT ≈ {レート} USDT', - 'wallet.withdrawableAmount': '利用可能な現金の量', - 'wallet.totalBalance': '合計残高', - 'wallet.insufficientWithdrawable': '引き出すことができる現金の量が不足しています。現在出金できる金額は次のとおりです: {amount} QDT', - 'wallet.withdrawAddressRequired': '出金アドレスを入力してください', - 'wallet.withdrawAddressHint': 'アドレスが正しいことを確認してください。退会後は取り消すことはできません。', - 'wallet.withdrawSubmitSuccess': '出金申請が正常に送信されました。審査をお待ちください', - 'menu.footer.contactUs': 'お問い合わせ', - 'menu.footer.getSupport': 'サポートを受ける', - 'menu.footer.socialAccounts': 'ソーシャルアカウント', - 'menu.footer.userAgreement': 'ユーザー同意書', - 'menu.footer.privacyPolicy': 'プライバシーポリシー', - 'menu.footer.support': 'サポート', - 'menu.footer.featureRequest': '機能リクエスト', - 'menu.footer.email': '電子メール', - 'menu.footer.liveChat': '24時間年中無休のライブチャット', - 'dashboard.analysis.title': '多次元分析', - 'dashboard.analysis.subtitle': 'AIを活用した総合財務分析プラットフォーム', - 'dashboard.analysis.selectSymbol': '基礎となるコードを選択または入力します', - 'dashboard.analysis.selectModel': 'モデルを選択してください', - 'dashboard.analysis.startAnalysis': '分析を開始する', - 'dashboard.analysis.history': '歴史', - 'dashboard.analysis.tab.overview': '総合的な分析', - 'dashboard.analysis.tab.fundamental': '基本', - 'dashboard.analysis.tab.technical': 'テクノロジー', - 'dashboard.analysis.tab.news': 'ニュース', - 'dashboard.analysis.tab.sentiment': '感情', - 'dashboard.analysis.tab.risk': 'リスク', - 'dashboard.analysis.tab.debate': '長短の議論', - 'dashboard.analysis.tab.decision': '最終決定', - 'dashboard.analysis.empty.selectSymbol': '分析を開始するターゲットを選択してください', - 'dashboard.analysis.empty.selectSymbolDesc': '独自に選択した銘柄リストから選択するか、基礎となるコードを入力して多次元 AI 分析レポートを取得します', - 'dashboard.analysis.empty.startAnalysis': '「分析開始」ボタンをクリックすると、多次元分析が実行されます。', - 'dashboard.analysis.empty.startAnalysisDesc': 'ファンダメンタルズ、テクノロジー、ニュース、センチメント、リスクなどの多次元から総合的な分析を提供します。', - 'dashboard.analysis.empty.noData': '現在、{type} の分析データはありません。最初に包括的な分析を行ってください。', - 'dashboard.analysis.empty.noWatchlist': '現在、自主選定銘柄はありません', - 'dashboard.analysis.empty.noHistory': 'まだ履歴がありません', - 'dashboard.analysis.empty.watchlistHint': '現在、独自に選択した銘柄はありません。まずご確認ください。', - 'dashboard.analysis.empty.noDebateData': '議論のデータはまだありません', - 'dashboard.analysis.empty.noDecisionData': '決定データはまだありません', - 'dashboard.analysis.empty.selectAgent': '分析結果を表示するにはエージェントを選択してください', - 'dashboard.analysis.loading.analyzing': '分析中です、お待ちください...', - 'dashboard.analysis.loading.fundamental': '基本データを分析中...', - 'dashboard.analysis.loading.technical': 'テクニカル指標を分析中...', - 'dashboard.analysis.loading.news': 'ニュースデータを分析中...', - 'dashboard.analysis.loading.sentiment': '市場センチメントを分析中...', - 'dashboard.analysis.loading.risk': 'リスクを評価中...', - 'dashboard.analysis.loading.debate': '長短の議論は続いています...', - 'dashboard.analysis.loading.decision': '最終決定を生成中...', - 'dashboard.analysis.score.overall': '総合評価', - 'dashboard.analysis.score.recommendation': '投資アドバイス', - 'dashboard.analysis.score.confidence': '自信', - 'dashboard.analysis.dimension.fundamental': '基本', - 'dashboard.analysis.dimension.technical': 'テクノロジー', - 'dashboard.analysis.dimension.news': 'ニュース', - 'dashboard.analysis.dimension.sentiment': '感情', - 'dashboard.analysis.dimension.risk': 'リスク', - 'dashboard.analysis.card.dimensionScores': '各次元の評価', - 'dashboard.analysis.card.overviewReport': '総合分析レポート', - 'dashboard.analysis.card.financialMetrics': '財務指標', - 'dashboard.analysis.card.fundamentalReport': 'ファンダメンタルズ分析レポート', - 'dashboard.analysis.card.technicalIndicators': 'テクニカル指標', - 'dashboard.analysis.card.technicalReport': 'テクニカル分析レポート', - 'dashboard.analysis.card.newsList': '関連ニュース', - 'dashboard.analysis.card.newsReport': 'ニュース分析レポート', - 'dashboard.analysis.card.sentimentIndicators': '感情指標', - 'dashboard.analysis.card.sentimentReport': 'センチメント分析レポート', - 'dashboard.analysis.card.riskMetrics': 'リスク指標', - 'dashboard.analysis.card.riskReport': 'リスク評価レポート', - 'dashboard.analysis.card.bullView': '強気の見方(強気)', - 'dashboard.analysis.card.bearView': '弱気の見方(ベア)', - 'dashboard.analysis.card.researchConclusion': '研究者の結論', - 'dashboard.analysis.card.traderPlan': 'トレーダープラン', - 'dashboard.analysis.card.riskDebate': 'リスク委員会の議論', - 'dashboard.analysis.card.finalDecision': '最終決定', - 'dashboard.analysis.card.tradePlanDetail': '取引プランの詳細', - 'dashboard.analysis.tradingPlan.entry_price': '入場料', - 'dashboard.analysis.tradingPlan.position_size': 'ポジションサイズ', - 'dashboard.analysis.tradingPlan.stop_loss': 'ストップロス', - 'dashboard.analysis.tradingPlan.take_profit': '利益確定', - 'dashboard.analysis.label.confidence': '自信', - 'dashboard.analysis.label.keyPoints': 'コアポイント', - 'dashboard.analysis.label.riskWarning': 'リスク警告', - 'dashboard.analysis.risk.risky': '危険な', - 'dashboard.analysis.risk.neutral': '中立的な視点(ニュートラル)', - 'dashboard.analysis.risk.safe': '保守的な見解(安全)', - 'dashboard.analysis.risk.conclusion': '結論', - 'dashboard.analysis.feature.fundamental': 'ファンダメンタルズ分析', - 'dashboard.analysis.feature.technical': 'テクニカル分析', - 'dashboard.analysis.feature.news': 'ニュース分析', - 'dashboard.analysis.feature.sentiment': '感情分析', - 'dashboard.analysis.feature.risk': 'リスク評価', - 'dashboard.analysis.watchlist.title': '私の銘柄選択', - 'dashboard.analysis.watchlist.add': '追加する', - 'dashboard.analysis.watchlist.addStock': '在庫を追加する', - 'dashboard.analysis.modal.addStock.title': 'オプションのストックを追加する', - 'dashboard.analysis.modal.addStock.confirm': 'OK', - 'dashboard.analysis.modal.addStock.cancel': 'キャンセル', - 'dashboard.analysis.modal.addStock.market': '市場タイプ', - 'dashboard.analysis.modal.addStock.marketPlaceholder': 'マーケットを選択してください', - 'dashboard.analysis.modal.addStock.marketRequired': 'マーケットタイプを選択してください', - 'dashboard.analysis.modal.addStock.symbol': '証券コード', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': '例: AAPL、TSLA、GOOGL、000001、BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': '証券コードを入力してください', - 'dashboard.analysis.modal.addStock.searchPlaceholder': '検索対象のコードまたは名前', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': '基礎となるコードを検索または入力します (例: AAPL、BTC/USDT、EUR/USD)', - 'dashboard.analysis.modal.addStock.searchOrInputHint': 'データベース内のオブジェクトの検索、またはコードの直接入力をサポート (システムが自動的に名前を取得します)', - 'dashboard.analysis.modal.addStock.search': '検索', - 'dashboard.analysis.modal.addStock.searchResults': '検索結果', - 'dashboard.analysis.modal.addStock.hotSymbols': '人気のターゲット', - 'dashboard.analysis.modal.addStock.noHotSymbols': '人気のあるターゲットはまだありません', - 'dashboard.analysis.modal.addStock.selectedSymbol': '選択済み', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': '最初にターゲットを選択してください', - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': 'ターゲットを選択するか、最初にターゲット コードを入力してください', - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': 'ターゲットコードを入力してください', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': '最初にマーケットタイプを選択してください', - 'dashboard.analysis.modal.addStock.searchFailed': '検索に失敗しました。後でもう一度お試しください', - 'dashboard.analysis.modal.addStock.noSearchResults': '一致するターゲットが見つかりません', - 'dashboard.analysis.modal.addStock.willAutoFetchName': 'システムが自動的に名前を取得します', - 'dashboard.analysis.modal.addStock.addDirectly': '直接追加', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': '名前は追加時に自動的に取得されます', - 'dashboard.analysis.market.AShare': 'A株', - 'dashboard.analysis.market.USStock': '米国株', - 'dashboard.analysis.market.HShare': '香港株', - 'dashboard.analysis.market.Crypto': '暗号通貨', - 'dashboard.analysis.market.Forex': '外国為替', - 'dashboard.analysis.market.Futures': '先物', - 'dashboard.analysis.modal.history.title': '過去の分析記録', - 'dashboard.analysis.modal.history.viewResult': '結果を見る', - 'dashboard.analysis.modal.history.completeTime': '完了時間', - 'dashboard.analysis.modal.history.error': 'エラー', - 'dashboard.analysis.status.pending': '保留中', - 'dashboard.analysis.status.processing': '処理中', - 'dashboard.analysis.status.completed': '完了', - 'dashboard.analysis.status.failed': '失敗しました', - 'dashboard.analysis.message.selectSymbol': '最初にターゲットを選択してください', - 'dashboard.analysis.message.taskCreated': '分析タスクが作成され、バックグラウンドで実行されています...', - 'dashboard.analysis.message.analysisComplete': '分析完了', - 'dashboard.analysis.message.analysisCompleteCache': '分析完了(キャッシュされたデータを使用)', - 'dashboard.analysis.message.analysisFailed': '分析に失敗しました。後でもう一度お試しください。', - 'dashboard.analysis.message.addStockSuccess': '正常に追加されました', - 'dashboard.analysis.message.addStockFailed': '追加に失敗しました', - 'dashboard.analysis.message.removeStockSuccess': '正常に削除されました', - 'dashboard.analysis.message.removeStockFailed': '削除に失敗しました', - 'dashboard.analysis.message.resumingAnalysis': '分析タスクを再開しています...', - 'dashboard.analysis.message.deleteSuccess': '正常に削除されました', - 'dashboard.analysis.message.deleteFailed': '削除に失敗しました', - 'dashboard.analysis.modal.history.delete': '削除', - 'dashboard.analysis.modal.history.deleteConfirm': 'この分析記録を削除してもよろしいですか?', - 'dashboard.analysis.test': 'ショップ番号 {no}、公庄路', - 'dashboard.analysis.introduce': 'インジケーターの説明', - 'dashboard.analysis.total-sales': '総売上高', - 'dashboard.analysis.day-sales': '平均日販¥', - 'dashboard.analysis.visits': '訪問', - 'dashboard.analysis.visits-trend': 'トラフィックの傾向', - 'dashboard.analysis.visits-ranking': '来店ランキング', - 'dashboard.analysis.day-visits': '毎日の訪問', - 'dashboard.analysis.week': '毎週前年比', - 'dashboard.analysis.day': '前年比', - 'dashboard.analysis.payments': '支払い回数', - 'dashboard.analysis.conversion-rate': 'コンバージョン率', - 'dashboard.analysis.operational-effect': '運営活動への影響', - 'dashboard.analysis.sales-trend': '販売動向', - 'dashboard.analysis.sales-ranking': '店舗売上ランキング', - 'dashboard.analysis.all-year': '一年中', - 'dashboard.analysis.all-month': '今月', - 'dashboard.analysis.all-week': '今週', - 'dashboard.analysis.all-day': '今日', - 'dashboard.analysis.search-users': '検索ユーザー数', - 'dashboard.analysis.per-capita-search': '一人当たりの検索数', - 'dashboard.analysis.online-top-search': 'オンラインで人気の検索', - 'dashboard.analysis.the-proportion-of-sales': '売上カテゴリー比率', - 'dashboard.analysis.dropdown-option-one': '作戦1', - 'dashboard.analysis.dropdown-option-two': '操作 2', - 'dashboard.analysis.channel.all': 'すべてのチャンネル', - 'dashboard.analysis.channel.online': 'オンライン', - 'dashboard.analysis.channel.stores': '店', - 'dashboard.analysis.sales': '販売', - 'dashboard.analysis.traffic': '乗客の流れ', - 'dashboard.analysis.table.rank': 'ランキング', - 'dashboard.analysis.table.search-keyword': '検索キーワード', - 'dashboard.analysis.table.users': 'ユーザー数', - 'dashboard.analysis.table.weekly-range': '毎週の増加', - 'dashboard.indicator.selectSymbol': '基礎となるコードを選択または入力します', - 'dashboard.indicator.emptyWatchlistHint': '現在、独自に選択した銘柄はありません。最初に追加してください。', - 'dashboard.indicator.hint.selectSymbol': '分析を開始するにはターゲットを選択してください', - 'dashboard.indicator.hint.selectSymbolDesc': 'K ライン チャートとテクニカル指標を表示するには、上の検索ボックスに銘柄コードを選択または入力します。', - 'dashboard.indicator.retry': 'もう一度試してください', - 'dashboard.indicator.panel.title': 'テクニカル指標', - 'dashboard.indicator.panel.realtimeOn': 'リアルタイム更新をオフにする', - 'dashboard.indicator.panel.realtimeOff': 'リアルタイム更新を有効にする', - 'dashboard.indicator.panel.themeLight': 'ダークテーマに切り替える', - 'dashboard.indicator.panel.themeDark': 'ライトテーマに切り替える', - 'dashboard.indicator.section.enabled': '有効', - 'dashboard.indicator.section.added': '私が追加したインジケーター', - 'dashboard.indicator.section.custom': '自分で作成したインジケーター', - 'dashboard.indicator.section.bought': '購入したインジケーター', - 'dashboard.indicator.section.myCreated': '私が作成したインジケーター', - 'dashboard.indicator.empty': 'まだインジケーターがありません。最初にインジケーターを追加または作成してください', - 'dashboard.indicator.buy': '購入インジケーター', - 'dashboard.indicator.action.start': '始める', - 'dashboard.indicator.action.stop': '閉じる', - 'dashboard.indicator.action.edit': '編集', - 'dashboard.indicator.action.delete': '削除', - 'dashboard.indicator.action.backtest': 'バックテスト', - 'dashboard.indicator.status.normal': '普通の', - 'dashboard.indicator.status.normalPermanent': '通常(永続的に有効)', - 'dashboard.indicator.status.expired': '期限切れ', - 'dashboard.indicator.expiry.permanent': '永久に有効', - 'dashboard.indicator.expiry.noExpiry': '有効期限なし', - 'dashboard.indicator.expiry.expired': '期限切れ: {日付}', - 'dashboard.indicator.expiry.expiresOn': '有効期限: {日付}', - 'dashboard.indicator.delete.confirmTitle': '削除の確認', - 'dashboard.indicator.delete.confirmContent': 'インジケーター「{name}」を削除してもよろしいですか?この操作は元に戻すことができません。', - 'dashboard.indicator.delete.confirmOk': '削除', - 'dashboard.indicator.delete.confirmCancel': 'キャンセル', - 'dashboard.indicator.delete.success': '正常に削除されました', - 'dashboard.indicator.delete.failed': '削除に失敗しました', - 'dashboard.indicator.save.success': '正常に保存されました', - 'dashboard.indicator.save.failed': '保存に失敗しました', - 'dashboard.indicator.error.loadWatchlistFailed': 'オプションのストックをロードできませんでした', - 'dashboard.indicator.error.chartNotReady': 'チャートコンポーネントは初期化されていません。最初にターゲットを選択し、チャートがロードされるまで待ってください。', - 'dashboard.indicator.error.chartMethodNotReady': 'グラフ コンポーネント メソッドの準備ができていません。後でもう一度お試しください。', - 'dashboard.indicator.error.chartExecuteNotReady': 'チャートコンポーネントの実行メソッドの準備ができていません。後でもう一度試してください。', - 'dashboard.indicator.error.parseFailed': 'Pythonコードを解析できません', - 'dashboard.indicator.error.parseFailedCheck': 'Python コードを解析できません。コード形式を確認してください。', - 'dashboard.indicator.error.addIndicatorFailed': 'インジケーターの追加に失敗しました', - 'dashboard.indicator.error.runIndicatorFailed': 'インジケーターの実行に失敗しました', - 'dashboard.indicator.error.pleaseLogin': 'まずログインしてください', - 'dashboard.indicator.error.loadDataFailed': 'データのロードに失敗しました', - 'dashboard.indicator.error.loadDataFailedDesc': 'ネットワーク接続を確認してください', - 'dashboard.indicator.error.pythonEngineFailed': 'Python エンジンのロードに失敗したため、インジケーター機能が使用できない可能性があります。', - 'dashboard.indicator.error.chartInitFailed': 'チャートの初期化に失敗しました', - 'dashboard.indicator.warning.enterCode': '最初にインジケーターコードを入力してください', - 'dashboard.indicator.warning.pyodideLoadFailed': 'Python エンジンのロードに失敗しました', - 'dashboard.indicator.warning.pyodideLoadFailedDesc': 'この機能は、現在の地域またはネットワーク環境では利用できません', - 'dashboard.indicator.warning.chartNotInitialized': 'グラフが初期化されていないため、線描画ツールが使用できません。', - 'dashboard.indicator.success.runIndicator': 'インジケーターは正常に実行されます', - 'dashboard.indicator.success.clearDrawings': '線画をすべてクリアしました', - 'dashboard.indicator.sma': 'SMA(移動平均結合)', - 'dashboard.indicator.ema': 'EMA (指数移動平均結合)', - 'dashboard.indicator.rsi': 'RSI (相対強度)', - 'dashboard.indicator.macd': 'MACD', - 'dashboard.indicator.bb': 'ボリンジャーバンド', - 'dashboard.indicator.atr': 'ATR (平均トゥルーレンジ)', - 'dashboard.indicator.cci': 'CCI (商品チャネル指数)', - 'dashboard.indicator.williams': 'ウィリアムズ %R (ウィリアムズ指標)', - 'dashboard.indicator.mfi': 'MFI(マネーフローインデックス)', - 'dashboard.indicator.adx': 'ADX(平均トレンド指数)', - 'dashboard.indicator.obv': 'OBV(エネルギー波)', - 'dashboard.indicator.adosc': 'ADOSC (アキュムレート/ディスパッチオシレーター)', - 'dashboard.indicator.ad': 'AD(蓄電・配電線)', - 'dashboard.indicator.kdj': 'KDJ (確率的指標)', - 'dashboard.indicator.signal.buy': '買う', - 'dashboard.indicator.signal.sell': '売る', - 'dashboard.indicator.signal.supertrendBuy': 'スーパートレンド購入', - 'dashboard.indicator.signal.supertrendSell': 'スーパートレンドセル', - 'dashboard.indicator.chart.kline': 'Kライン', - 'dashboard.indicator.chart.volume': 'ボリューム', - 'dashboard.indicator.chart.uptrend': '上昇傾向', - 'dashboard.indicator.chart.downtrend': '下降傾向', - 'dashboard.indicator.tooltip.time': '時間', - 'dashboard.indicator.tooltip.open': '開く', - 'dashboard.indicator.tooltip.close': '受け取る', - 'dashboard.indicator.tooltip.high': '高い', - 'dashboard.indicator.tooltip.low': '低い', - 'dashboard.indicator.tooltip.volume': 'ボリューム', - 'dashboard.indicator.drawing.line': '線分', - 'dashboard.indicator.drawing.horizontalLine': '水平線', - 'dashboard.indicator.drawing.verticalLine': '縦線', - 'dashboard.indicator.drawing.ray': '光線', - 'dashboard.indicator.drawing.straightLine': '直線', - 'dashboard.indicator.drawing.parallelLine': '平行線', - 'dashboard.indicator.drawing.priceLine': '価格ライン', - 'dashboard.indicator.drawing.priceChannel': '価格チャネル', - 'dashboard.indicator.drawing.fibonacciLine': 'フィボナッチライン', - 'dashboard.indicator.drawing.clearAll': '線画をすべてクリアする', - 'dashboard.indicator.market.AShare': 'A株', - 'dashboard.indicator.market.USStock': '米国株', - 'dashboard.indicator.market.HShare': '香港株', - 'dashboard.indicator.market.Crypto': '暗号通貨', - 'dashboard.indicator.market.Forex': '外国為替', - 'dashboard.indicator.market.Futures': '先物', - 'dashboard.indicator.create': 'インジケーターの作成', - 'dashboard.indicator.editor.title': 'インジケーターの作成/編集', - 'dashboard.indicator.editor.name': 'インジケーター名', - 'dashboard.indicator.editor.nameRequired': 'インジケーター名を入力してください', - 'dashboard.indicator.editor.namePlaceholder': 'インジケーター名を入力してください', - 'dashboard.indicator.editor.description': 'インジケーターの説明', - 'dashboard.indicator.editor.descriptionPlaceholder': 'インジケーターの説明を入力してください (オプション)', - 'dashboard.indicator.editor.code': 'Pythonコード', - 'dashboard.indicator.editor.codeRequired': 'インジケーターコードを入力してください', - 'dashboard.indicator.editor.codePlaceholder': 'Python コードを入力してください', - 'dashboard.indicator.editor.run': '走る', - 'dashboard.indicator.editor.runHint': '実行ボタンをクリックして、K ライン チャート上のインジケーターの効果をプレビューします。', - 'dashboard.indicator.editor.guide': '開発ガイド', - 'dashboard.indicator.editor.guideTitle': 'Python インジケーター開発ガイド', - 'dashboard.indicator.editor.save': '保存する', - 'dashboard.indicator.editor.cancel': 'キャンセル', - 'dashboard.indicator.editor.unnamed': '名前のないインジケーター', - 'dashboard.indicator.editor.publishToCommunity': 'コミュニティに投稿する', - 'dashboard.indicator.editor.publishToCommunityHint': '公開されると、他のユーザーがコミュニティでインジケーターを表示して使用できるようになります', - 'dashboard.indicator.editor.indicatorType': 'インジケーターの種類', - 'dashboard.indicator.editor.indicatorTypeRequired': 'インジケーターのタイプを選択してください', - 'dashboard.indicator.editor.indicatorTypePlaceholder': 'インジケーターのタイプを選択してください', - 'dashboard.indicator.editor.previewImage': 'プレビュー', - 'dashboard.indicator.editor.uploadImage': '写真をアップロードする', - 'dashboard.indicator.editor.previewImageHint': '推奨サイズ: 800x400、2MB 以下', - 'dashboard.indicator.editor.pricing': '販売価格(QDT)', - 'dashboard.indicator.editor.pricingType.free': '無料', - 'dashboard.indicator.editor.pricingType.permanent': '永久的な', - 'dashboard.indicator.editor.pricingType.monthly': '月々の支払い', - 'dashboard.indicator.editor.price': '価格', - 'dashboard.indicator.editor.priceRequired': '価格を入力してください', - 'dashboard.indicator.editor.pricePlaceholder': '価格を入力してください', - 'dashboard.indicator.editor.pricingHint': '無料のインジケーターの価格は 0 ですが、プラットフォームはインジケーターの使用量と賞賛率に基づいて報酬 (QDT) を与えます。', - 'dashboard.indicator.editor.aiGenerate': 'インテリジェントな世代', - 'dashboard.indicator.editor.aiPromptPlaceholder': 'あなたのアイデアを教えてください。Python インジケーター コードを生成します。', - 'dashboard.indicator.editor.aiGenerateBtn': 'AIが生成したコード', - 'dashboard.indicator.editor.aiPromptRequired': 'あなたの考えを入力してください', - 'dashboard.indicator.editor.aiGenerateSuccess': 'コード生成が成功しました', - 'dashboard.indicator.editor.aiGenerateError': 'コード生成に失敗しました。後でもう一度お試しください。', - 'dashboard.indicator.editor.verifyCode': 'コード検証', - 'dashboard.indicator.editor.verifyCodeSuccess': '検証合格', - 'dashboard.indicator.editor.verifyCodeFailed': '検証失敗', - 'dashboard.indicator.editor.verifyCodeEmpty': 'コードは空にできません', - 'dashboard.indicator.backtest.title': 'インジケーターのバックテスト', - 'dashboard.indicator.backtest.config': 'バックテストパラメータ', - 'dashboard.indicator.backtest.startDate': '開始日', - 'dashboard.indicator.backtest.endDate': '終了日', - 'dashboard.indicator.backtest.selectStartDate': '開始日を選択してください', - 'dashboard.indicator.backtest.selectEndDate': '終了日を選択してください', - 'dashboard.indicator.backtest.startDateRequired': '開始日を選択してください', - 'dashboard.indicator.backtest.endDateRequired': '終了日を選択してください', - 'dashboard.indicator.backtest.initialCapital': '初期資本', - 'dashboard.indicator.backtest.initialCapitalRequired': '初期資金を入力してください', - 'dashboard.indicator.backtest.commission': '手数料', - 'dashboard.indicator.backtest.leverage': 'レバレッジ比率', - 'dashboard.indicator.backtest.tradeDirection': '取引の方向性', - 'dashboard.indicator.backtest.longOnly': '長く続けてください', - 'dashboard.indicator.backtest.shortOnly': '短い', - 'dashboard.indicator.backtest.both': '双方向', - 'dashboard.indicator.backtest.run': 'バックテストを開始する', - 'dashboard.indicator.backtest.rerun': 'もう一度バックテスト', - 'dashboard.indicator.backtest.close': '閉じる', - 'dashboard.indicator.backtest.running': 'インジケーターのバックテストが進行中です...', - 'dashboard.indicator.backtest.results': 'バックテスト結果', - 'dashboard.indicator.backtest.totalReturn': 'トータルリターン', - 'dashboard.indicator.backtest.annualReturn': '年収', - 'dashboard.indicator.backtest.maxDrawdown': '最大ドローダウン', - 'dashboard.indicator.backtest.sharpeRatio': 'シャープレシオ', - 'dashboard.indicator.backtest.winRate': '勝率', - 'dashboard.indicator.backtest.profitFactor': '損益率', - 'dashboard.indicator.backtest.totalTrades': 'トランザクション数', - 'dashboard.indicator.totalReturn': 'トータルリターン', - 'dashboard.indicator.annualReturn': '年換算収益率', - 'dashboard.indicator.maxDrawdown': '最大ドローダウン', - 'dashboard.indicator.sharpeRatio': 'シャープレシオ', - 'dashboard.indicator.winRate': '勝率', - 'dashboard.indicator.profitFactor': '損益率', - 'dashboard.indicator.totalTrades': '総トランザクション数', - 'dashboard.indicator.backtest.totalCommission': '合計手数料', - 'dashboard.indicator.backtest.equityCurve': 'イールドカーブ', - 'dashboard.indicator.backtest.strategy': '指標収入', - 'dashboard.indicator.backtest.benchmark': 'ベンチマークリターン', - 'dashboard.indicator.backtest.tradeHistory': '取引履歴', - 'dashboard.indicator.backtest.tradeTime': '時間', - 'dashboard.indicator.backtest.tradeType': 'タイプ', - 'dashboard.indicator.backtest.buy': '買う', - 'dashboard.indicator.backtest.sell': '売る', - 'dashboard.indicator.backtest.liquidation': '清算', - 'dashboard.indicator.backtest.openLong': '長く開く', - 'dashboard.indicator.backtest.closeLong': 'ピンドゥオ', - 'dashboard.indicator.backtest.closeLongStop': 'ロングに近い(ストップロス)', - 'dashboard.indicator.backtest.closeLongProfit': 'さらに閉じる(利益確定)', - 'dashboard.indicator.backtest.addLong': 'ロングポジションを追加', - 'dashboard.indicator.backtest.openShort': 'オープンショート', - 'dashboard.indicator.backtest.closeShort': '空の', - 'dashboard.indicator.backtest.closeShortStop': 'クローズ(ストップロス)', - 'dashboard.indicator.backtest.closeShortProfit': 'クローズ(利益確定)', - 'dashboard.indicator.backtest.addShort': 'ショートポジションを追加', - 'dashboard.indicator.backtest.price': '価格', - 'dashboard.indicator.backtest.amount': '数量', - 'dashboard.indicator.backtest.balance': '口座残高', - 'dashboard.indicator.backtest.profit': '損益', - 'dashboard.indicator.backtest.success': 'バックテスト完了', - 'dashboard.indicator.backtest.failed': 'バックテストに失敗しました。後でもう一度お試しください', - 'dashboard.indicator.backtest.noIndicatorCode': 'このインジケーターにはバックテスト可能なコードはありません', - 'dashboard.indicator.backtest.noSymbol': '最初に取引対象を選択してください', - 'dashboard.indicator.backtest.dateRangeExceeded': 'バックテストの時間範囲が制限を超えています: {timeframe} 期間は最大でも {maxRange} までバックテストできます', - 'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)', - 'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}', - 'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}', - 'dashboard.indicator.backtest.prev': 'Previous', - 'dashboard.indicator.backtest.next': 'Next', - 'dashboard.indicator.backtest.steps.strategy.title': 'Strategy', - 'dashboard.indicator.backtest.steps.strategy.desc': 'Position sizing & risk controls', - 'dashboard.indicator.backtest.steps.trading.title': 'Trading settings', - 'dashboard.indicator.backtest.steps.trading.desc': 'Time range, capital, fees, leverage', - 'dashboard.indicator.backtest.steps.results.title': 'Results', - 'dashboard.indicator.backtest.steps.results.desc': 'Backtest output', - 'dashboard.indicator.backtest.panel.risk': 'Risk management (SL/TP/Trailing)', - 'dashboard.indicator.backtest.panel.scale': 'Scale in / DCA (trend & mean-reversion)', - 'dashboard.indicator.backtest.panel.reduce': 'Reduce position (trend & adverse)', - 'dashboard.indicator.backtest.panel.position': 'Position sizing', - 'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)', - 'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)', - 'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit', - 'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)', - 'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)', - 'dashboard.indicator.backtest.field.slippage': 'Slippage (%)', - 'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in', - 'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion DCA', - 'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.dcaAddStepPct': 'DCA trigger (%)', - 'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.dcaAddSizePct': 'DCA size (% of capital)', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max DCA times', - 'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce', - 'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)', - 'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times', - 'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)', - 'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)', - 'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)', - 'dashboard.indicator.backtest.reduceLong': 'Reduce Long', - 'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)', - 'dashboard.indicator.backtest.reduceShort': 'Reduce Short', - 'dashboard.docs.title': 'ドキュメントセンター', - 'dashboard.docs.search.placeholder': 'ドキュメントを検索...', - 'dashboard.docs.category.all': 'すべて', - 'dashboard.docs.category.guide': '開発ガイド', - 'dashboard.docs.category.api': 'APIドキュメント', - 'dashboard.docs.category.tutorial': 'チュートリアル', - 'dashboard.docs.category.faq': 'よくある質問', - 'dashboard.docs.featured.title': '推奨ドキュメント', - 'dashboard.docs.featured.tag': 'おすすめ', - 'dashboard.docs.list.views': '閲覧する', - 'dashboard.docs.list.author': '著者', - 'dashboard.docs.list.empty': 'まだ文書がありません', - 'dashboard.docs.list.backToAll': 'すべてのドキュメントに戻る', - 'dashboard.docs.list.total': '合計 {count} 個のドキュメント', - 'dashboard.docs.detail.back': 'ドキュメントリストに戻る', - 'dashboard.docs.detail.updatedAt': 'に更新されました', - 'dashboard.docs.detail.related': '関連資料', - 'dashboard.docs.detail.notFound': 'ドキュメントが存在しません', - 'dashboard.docs.detail.error': 'ドキュメントが存在しないか削除されています', - 'dashboard.docs.search.result': '検索結果', - 'dashboard.docs.search.keyword': 'キーワード', - 'community.filter.indicatorType': 'インジケーターの種類', - 'community.filter.all': 'すべて', - 'community.filter.other': 'その他のオプション', - 'community.filter.pricing': '価格タイプ', - 'community.filter.allPricing': 'すべての価格設定', - 'community.filter.sortBy': '並べ替え順', - 'community.filter.search': '検索', - 'community.filter.searchPlaceholder': '検索メトリクス名', - 'community.indicatorType.trend': 'トレンドタイプ', - 'community.indicatorType.momentum': '勢いタイプ', - 'community.indicatorType.volatility': 'ボラティリティ', - 'community.indicatorType.volume': 'ボリューム', - 'community.indicatorType.custom': 'カスタマイズ', - 'community.pricing.free': '無料', - 'community.pricing.paid': '支払う', - 'community.sort.downloads': 'ダウンロード', - 'community.sort.rating': '評価', - 'community.sort.newest': '最新リリース', - 'community.pagination.total': '合計 {total} 個のインジケーター', - 'community.noDescription': 'まだ説明がありません', - 'community.detail.type': 'タイプ', - 'community.detail.pricing': '価格設定', - 'community.detail.rating': '評価', - 'community.detail.downloads': 'ダウンロード', - 'community.detail.author': '著者', - 'community.detail.description': 'はじめに', - 'community.detail.detailContent': '詳細な説明', - 'community.detail.backtestStats': 'バックテスト統計', - 'community.action.purchase': '購入インジケーター', - 'community.action.addToMyIndicators': '私のインジケーターに追加', - 'community.action.favorite': 'コレクション', - 'community.action.unfavorite': 'お気に入りをキャンセルする', - 'community.action.buyNow': '今すぐ購入', - 'community.action.renew': 'リニューアル', - 'community.purchase.price': '価格', - 'community.purchase.permanent': '永久的な', - 'community.purchase.monthly': '月', - 'community.purchase.confirmBuy': 'このインジケーター ({price} QDT) を購入することを確認しますか?', - 'community.purchase.confirmRenew': 'このインジケーター ({price} QDT/月) を更新することを確認しますか?', - 'community.purchase.confirmFree': 'この無料インジケーターを追加することを確認しますか?', - 'community.purchase.confirmTitle': 'アクションの確認', - 'community.purchase.owned': 'このインジケーターを購入しました (永久に有効です)', - 'community.purchase.ownIndicator': 'これはあなたが公開した指標です', - 'community.purchase.expired': 'サブスクリプションの有効期限が切れました', - 'community.purchase.expiresOn': '有効期限: {日付}', - 'community.tabs.detail': 'インジケーターの詳細', - 'community.tabs.backtest': 'バックテストデータ', - 'community.tabs.ratings': 'ユーザーレビュー', - 'community.rating.myRating': '私の評価', - 'community.rating.stars': '{count} 個の星', - 'community.rating.commentPlaceholder': 'あなたの経験を共有してください...', - 'community.rating.submit': '評価を送信する', - 'community.rating.modify': '変更', - 'community.rating.saveModify': '変更を保存する', - 'community.rating.cancel': 'キャンセル', - 'community.rating.selectRating': '評価を選択してください', - 'community.rating.success': '評価が成功しました', - 'community.rating.modifySuccess': 'レビューが正常に変更されました', - 'community.rating.failed': '評価に失敗しました', - 'community.rating.noRatings': 'まだコメントはありません', - 'community.backtest.note': '上記のデータは過去のバックテスト結果であり、参考のみを目的としており、将来の収益を示すものではありません。', - 'community.backtest.noData': 'バックテストデータはまだありません', - 'community.backtest.uploadHint': '作者はまだバックテストデータをアップロードしていません', - 'community.message.loadFailed': 'インジケーターリストのロードに失敗しました', - 'community.message.purchaseProcessing': '購入リクエストを処理しています...', - 'community.message.downloadSuccess': 'メトリックがメトリック リストに追加されました', - 'community.message.favoriteSuccess': '収集に成功しました', - 'community.message.unfavoriteSuccess': '収集を正常にキャンセルしました', - 'community.message.operationSuccess': '操作は成功しました', - 'community.message.operationFailed': '操作が失敗しました', - 'community.banner.readOnly': '閲覧のみ', - 'community.banner.loginHint': 'ログインまたは登録が必要な場合は、ボタンをクリックして独立したページに移動し、CSRFの問題を回避してください', - 'community.banner.jumpButton': 'ログイン/登録へ', - 'dashboard.totalEquity': '総資本', - 'dashboard.totalPnL': '損益通算', - 'dashboard.aiStrategies': 'AI戦略', - 'dashboard.indicatorStrategies': '指標戦略', - 'dashboard.running': 'ランニング', - 'dashboard.pnlHistory': '過去の損益', - 'dashboard.strategyPerformance': '戦略損益率', - 'dashboard.recentTrades': '最近の取引', - 'dashboard.currentPositions': '現在位置', - 'dashboard.table.time': '時間', - 'dashboard.table.strategy': 'ポリシー名', - 'dashboard.table.symbol': 'ターゲット', - 'dashboard.table.type': 'タイプ', - 'dashboard.table.side': '方向', - 'dashboard.table.size': '建玉', - 'dashboard.table.entryPrice': '平均始値', - 'dashboard.table.price': '価格', - 'dashboard.table.amount': '数量', - 'dashboard.table.profit': '損益', - 'dashboard.pendingOrders': '注文実行記録', - 'dashboard.totalOrders': '合計 {total} 件', - 'dashboard.viewError': 'エラーを表示', - 'dashboard.filled': '約定済み', - 'dashboard.orderTable.time': '作成時間', - 'dashboard.orderTable.strategy': '戦略', - 'dashboard.orderTable.symbol': '取引ペア', - 'dashboard.orderTable.signalType': 'シグナルタイプ', - 'dashboard.orderTable.amount': '数量', - 'dashboard.orderTable.price': '約定価格', - 'dashboard.orderTable.status': 'ステータス', - 'dashboard.orderTable.executedAt': '実行時間', - 'dashboard.signalType.openLong': 'ロング開始', - 'dashboard.signalType.openShort': 'ショート開始', - 'dashboard.signalType.closeLong': 'ロング決済', - 'dashboard.signalType.closeShort': 'ショート決済', - 'dashboard.signalType.addLong': 'ロング追加', - 'dashboard.signalType.addShort': 'ショート追加', - 'dashboard.status.pending': '保留中', - 'dashboard.status.processing': '処理中', - 'dashboard.status.completed': '完了', - 'dashboard.status.failed': '失敗', - 'dashboard.status.cancelled': 'キャンセル済み', - 'dashboard.table.pnl': '未実現損益', - 'form.basic-form.basic.title': '基本形', - 'form.basic-form.basic.description': 'フォーム ページは、ユーザーからの情報を収集または確認するために使用されます。 基本フォームは、データ項目が少ないフォーム シナリオでよく使用されます。', - 'form.basic-form.title.label': 'タイトル', - 'form.basic-form.title.placeholder': '目標に名前を付けます', - 'form.basic-form.title.required': 'タイトルを入力してください', - 'form.basic-form.date.label': '開始日と終了日', - 'form.basic-form.placeholder.start': '開始日', - 'form.basic-form.placeholder.end': '終了日', - 'form.basic-form.date.required': '開始日と終了日を選択してください', - 'form.basic-form.goal.label': '目標の説明', - 'form.basic-form.goal.placeholder': '段階的な作業目標を入力してください', - 'form.basic-form.goal.required': '目標の説明を入力してください', - 'form.basic-form.standard.label': '測る', - 'form.basic-form.standard.placeholder': '指標を入力してください', - 'form.basic-form.standard.required': '指標を入力してください', - 'form.basic-form.client.label': 'お客様', - 'form.basic-form.client.required': 'あなたがサービスを提供しているクライアントについて説明してください', - 'form.basic-form.label.tooltip': '対象サービス受信者', - 'form.basic-form.client.placeholder': 'あなたがサービスを提供している顧客、内部顧客について直接説明してください @名前/役職番号', - 'form.basic-form.invites.label': '査読者を招待する', - 'form.basic-form.invites.placeholder': '@名前/従業員番号を直接送信してください。最大 5 人まで招待できます', - 'form.basic-form.weight.label': '重量', - 'form.basic-form.weight.placeholder': '入力してください', - 'form.basic-form.public.label': 'ターゲットパブリック', - 'form.basic-form.label.help': '顧客とレビュー担当者はデフォルトで共有されます', - 'form.basic-form.radio.public': '公共の', - 'form.basic-form.radio.partially-public': '部分的に公開', - 'form.basic-form.radio.private': 'プライベート', - 'form.basic-form.publicUsers.placeholder': 'にオープン', - 'form.basic-form.option.A': '同僚1', - 'form.basic-form.option.B': '同僚2', - 'form.basic-form.option.C': '同僚3人', - 'form.basic-form.email.required': 'メールアドレスを入力してください!', - 'form.basic-form.email.wrong-format': 'メールアドレスの形式が間違っています!', - 'form.basic-form.userName.required': 'ユーザー名を入力してください!', - 'form.basic-form.password.required': 'パスワードを入力してください。', - 'form.basic-form.password.twice': '2 回入力したパスワードが一致しません。', - 'form.basic-form.strength.msg': '6文字以上を入力してください。 推測されやすいパスワードは使用しないでください。', - 'form.basic-form.strength.strong': '強さ: 強い', - 'form.basic-form.strength.medium': '強さ: 中', - 'form.basic-form.strength.short': '強さ:短すぎる', - 'form.basic-form.confirm-password.required': 'パスワードを確認してください。', - 'form.basic-form.phone-number.required': '携帯電話番号を入力してください!', - 'form.basic-form.phone-number.wrong-format': '携帯電話番号の形式が間違っています。', - 'form.basic-form.verification-code.required': '確認コードを入力してください。', - 'form.basic-form.form.get-captcha': '確認コードを取得する', - 'form.basic-form.captcha.second': '秒', - 'form.basic-form.form.optional': '(オプション)', - 'form.basic-form.form.submit': '送信する', - 'form.basic-form.form.save': '保存する', - 'form.basic-form.email.placeholder': '電子メール', - 'form.basic-form.password.placeholder': 'パスワードは 6 文字以上、大文字と小文字は区別されます', - 'form.basic-form.confirm-password.placeholder': 'パスワードの確認', - 'form.basic-form.phone-number.placeholder': '携帯電話番号', - 'form.basic-form.verification-code.placeholder': '認証コード', - 'result.success.title': '送信成功', - 'result.success.description': '投入結果ページは、一連の運用タスクの処理結果をフィードバックするために使用されます。単純な操作のみの場合は、メッセージ グローバル プロンプト フィードバックを使用します。このテキストエリアには簡単な補足説明を表示できます。 「ドキュメント」を表示する必要がある場合は、下の灰色の領域にさらに複雑なコンテンツを表示できます。', - 'result.success.operate-title': 'プロジェクト名', - 'result.success.operate-id': 'プロジェクトID', - 'result.success.principal': '担当者', - 'result.success.operate-time': '効果時間', - 'result.success.step1-title': 'プロジェクトの作成', - 'result.success.step1-operator': 'ク・リリ', - 'result.success.step2-title': '部門の事前審査', - 'result.success.step2-operator': '周猫猫', - 'result.success.step2-extra': '緊急', - 'result.success.step3-title': '財務レビュー', - 'result.success.step4-title': '完了', - 'result.success.btn-return': 'リストに戻る', - 'result.success.btn-project': 'アイテムを見る', - 'result.success.btn-print': '印刷する', - 'result.fail.error.title': '送信に失敗しました', - 'result.fail.error.description': '再送信する前に、次の情報を確認して変更してください。', - 'result.fail.error.hint-title': '送信したコンテンツには次のエラーが含まれています。', - 'result.fail.error.hint-text1': 'あなたのアカウントは凍結されました', - 'result.fail.error.hint-btn1': 'すぐに解凍してください', - 'result.fail.error.hint-text2': 'あなたのアカウントはまだ申請する資格がありません', - 'result.fail.error.hint-btn2': '今すぐアップグレードしてください', - 'result.fail.error.btn-text': '修正に戻る', - 'account.settings.menuMap.custom': 'パーソナライゼーション', - 'account.settings.menuMap.binding': 'アカウントバインディング', - 'account.settings.basic.avatar': 'アバター', - 'account.settings.basic.change-avatar': 'アバターの変更', - 'account.settings.basic.email': '電子メール', - 'account.settings.basic.email-message': 'メールアドレスを入力してください。', - 'account.settings.basic.nickname': 'ニックネーム', - 'account.settings.basic.nickname-message': 'ニックネームを入力してください!', - 'account.settings.basic.profile': 'プロフィール', - 'account.settings.basic.profile-message': 'あなたの個人プロフィールを入力してください!', - 'account.settings.basic.profile-placeholder': 'プロフィール', - 'account.settings.basic.country': '国/地域', - 'account.settings.basic.country-message': 'あなたの国または地域を入力してください。', - 'account.settings.basic.geographic': '県と市', - 'account.settings.basic.geographic-message': 'あなたの都道府県と市区町村を入力してください。', - 'account.settings.basic.address': '住所', - 'account.settings.basic.address-message': '住所を入力してください。', - 'account.settings.basic.phone': '連絡先番号', - 'account.settings.basic.phone-message': '連絡先番号を入力してください。', - 'account.settings.basic.update': '基本情報を更新', - 'account.settings.basic.update.success': '基本情報が正常に更新されました', - 'account.settings.security.strong': '強い', - 'account.settings.security.medium': 'で', - 'account.settings.security.weak': '弱い', - 'account.settings.security.password': 'アカウントのパスワード', - 'account.settings.security.password-description': '現在のパスワードの強度:', - 'account.settings.security.phone': 'セキュリティ携帯電話', - 'account.settings.security.phone-description': 'すでにバインドされている携帯電話:', - 'account.settings.security.question': 'セキュリティの問題', - 'account.settings.security.question-description': '秘密の質問は設定されていないため、アカウントのセキュリティを効果的に保護できます。', - 'account.settings.security.email': '電子メールをバインドする', - 'account.settings.security.email-description': 'すでにバインドされている電子メール アドレス:', - 'account.settings.security.mfa': 'MFAデバイス', - 'account.settings.security.mfa-description': 'MFA デバイスはバインドされていません。バインド後、再度確認できます。', - 'account.settings.security.modify': '変更', - 'account.settings.security.set': '設定', - 'account.settings.security.bind': 'バインディング', - 'account.settings.binding.taobao': 'タオバオをバインドする', - 'account.settings.binding.taobao-description': 'タオバオアカウントは現在バインドされていません', - 'account.settings.binding.alipay': 'Alipayをバインドする', - 'account.settings.binding.alipay-description': 'Alipay アカウントは現在バインドされていません', - 'account.settings.binding.dingding': 'バインディングディントーク', - 'account.settings.binding.dingding-description': '現在バインドされている DingTalk アカウントはありません', - 'account.settings.binding.bind': 'バインディング', - 'account.settings.notification.password': 'アカウントのパスワード', - 'account.settings.notification.password-description': '他のユーザーからのメッセージは、サイトメッセージの形式で通知されます。', - 'account.settings.notification.messages': 'システムメッセージ', - 'account.settings.notification.messages-description': 'システム メッセージはサイト メッセージの形式で通知されます。', - 'account.settings.notification.todo': 'ToDoタスク', - 'account.settings.notification.todo-description': 'To Do タスクはサイト内メッセージの形式で通知されます', - 'account.settings.settings.open': '開く', - 'account.settings.settings.close': '閉じる', - 'trading-assistant.title': '取引アシスタント', - 'trading-assistant.strategyList': '戦略一覧', - 'trading-assistant.createStrategy': 'ポリシーの作成', - 'trading-assistant.noStrategy': 'まだ戦略はありません', - 'trading-assistant.selectStrategy': '詳細を表示するには、左側から戦略を選択してください', - 'trading-assistant.startStrategy': '戦略を立ち上げる', - 'trading-assistant.stopStrategy': '戦略を停止する', - 'trading-assistant.editStrategy': '編集戦略', - 'trading-assistant.deleteStrategy': 'ポリシーの削除', - 'trading-assistant.status.running': 'ランニング', - 'trading-assistant.status.stopped': '停止しました', - 'trading-assistant.status.error': 'エラー', - 'trading-assistant.strategyType.IndicatorStrategy': 'テクニカル指標戦略', - 'trading-assistant.strategyType.PromptBasedStrategy': '合言葉戦略', - 'trading-assistant.strategyType.GridStrategy': 'グリッド戦略', - 'trading-assistant.tabs.tradingRecords': '取引履歴', - 'trading-assistant.tabs.positions': '位置記録', - 'trading-assistant.tabs.equityCurve': '資本曲線', - 'trading-assistant.form.step1': 'インジケーターの選択', - 'trading-assistant.form.step2': 'Exchangeの構成', - 'trading-assistant.form.step3': '戦略パラメータ', - 'trading-assistant.form.indicator': 'インジケーターの選択', - 'trading-assistant.form.indicatorHint': '購入または作成したテクニカル指標のみを選択できます', - 'trading-assistant.form.qdtCostHints': '戦略を使用すると QDT が消費されます。アカウントに十分な QDT 残高があることを確認してください。', - 'trading-assistant.form.indicatorDescription': 'インジケーターの説明', - 'trading-assistant.form.noDescription': 'まだ説明がありません', - 'trading-assistant.form.exchange': '交換を選択', - 'trading-assistant.form.apiKey': 'APIキー', - 'trading-assistant.form.secretKey': '秘密鍵', - 'trading-assistant.form.passphrase': 'パスフレーズ', - 'trading-assistant.form.testConnection': 'テスト接続', - 'trading-assistant.form.strategyName': 'ポリシー名', - 'trading-assistant.form.symbol': '取引ペア', - 'trading-assistant.form.symbolHint': '現在、暗号通貨取引ペアのみがサポートされています', - 'trading-assistant.form.initialCapital': '投資額', - 'trading-assistant.form.marketType': '市場タイプ', - 'trading-assistant.form.marketTypeFutures': '契約', - 'trading-assistant.form.marketTypeSpot': 'スポット', - 'trading-assistant.form.marketTypeHint': 'この契約は双方向の取引とレバレッジをサポートしますが、スポットはロングポジションのみをサポートし、レバレッジは 1 倍に固定されます。', - 'trading-assistant.form.leverage': '複数を活用する', - 'trading-assistant.form.leverageHint': '契約:1~125回、スポット:固定1回', - 'trading-assistant.form.spotLeverageFixed': '現物取引のレバレッジは1倍に固定されます', - 'trading-assistant.form.spotOnlyLongHint': 'スポット取引はロングポジションのみをサポートします', - 'trading-assistant.form.tradeDirection': '取引の方向性', - 'trading-assistant.form.tradeDirectionLong': 'ただ長いだけ', - 'trading-assistant.form.tradeDirectionShort': '短いだけ', - 'trading-assistant.form.tradeDirectionBoth': '双方向取引', - 'trading-assistant.form.timeframe': '期間', - 'trading-assistant.form.klinePeriod': 'K線期間', - 'trading-assistant.form.timeframe1m': '1分', - 'trading-assistant.form.timeframe5m': '5分', - 'trading-assistant.form.timeframe15m': '15分', - 'trading-assistant.form.timeframe30m': '30分', - 'trading-assistant.form.timeframe1H': '1時間', - 'trading-assistant.form.timeframe4H': '4時間', - 'trading-assistant.form.timeframe1D': '1日', - 'trading-assistant.form.selectStrategyType': '戦略タイプを選択', - 'trading-assistant.form.indicatorStrategy': 'インジケーター戦略', - 'trading-assistant.form.indicatorStrategyDesc': 'テクニカルインジケーターに基づく自動取引戦略', - 'trading-assistant.form.aiStrategy': 'AI戦略', - 'trading-assistant.form.aiStrategyDesc': 'AIインテリジェント意思決定に基づく自動取引戦略', - 'trading-assistant.form.enableAiFilter': 'AIインテリジェント意思決定フィルターを有効化', - 'trading-assistant.form.enableAiFilterHint': '有効にすると、インジケーターシグナルがAIによってフィルタリングされ、取引品質が向上します', - 'trading-assistant.form.aiFilterPrompt': 'カスタムプロンプト', - 'trading-assistant.form.aiFilterPromptHint': 'AIフィルタリングにカスタム指示を提供し、空白のままにするとシステムデフォルトを使用します', - 'trading-assistant.validation.strategyTypeRequired': '戦略タイプを選択してください', - 'trading-assistant.form.advancedSettings': '詳細設定', - 'trading-assistant.form.orderMode': 'オーダーモード', - 'trading-assistant.form.orderModeMaker': 'メーカー', - 'trading-assistant.form.orderModeTaker': '市場価格(テイカー)', - 'trading-assistant.form.orderModeHint': '未決注文モードでは指値注文が使用され、手数料が安くなります。市場価格モードはすぐに実行され、手数料が高くなります。', - 'trading-assistant.form.makerWaitSec': '未決注文の待ち時間 (秒)', - 'trading-assistant.form.makerWaitSecHint': '注文後の取引を待つ時間。キャンセルして、タイムアウト後に再試行してください。', - 'trading-assistant.form.makerRetries': '未決注文の再試行回数', - 'trading-assistant.form.makerRetriesHint': '未決注文が約定しない場合の最大リトライ回数', - 'trading-assistant.form.fallbackToMarket': '未決注文は失敗し、市場価格は引き下げられます。', - 'trading-assistant.form.fallbackToMarketHint': '開始/終了未決注文が完了していない場合、トランザクションを確実に完了させるために成行注文にダウングレードする必要があるかどうか。', - 'trading-assistant.form.marginMode': 'マージンモード', - 'trading-assistant.form.marginModeCross': '倉庫がいっぱい', - 'trading-assistant.form.marginModeIsolated': '孤立した位置', - 'trading-assistant.form.stopLossPct': 'ストップロス率(%)', - 'trading-assistant.form.stopLossPctHint': 'ストップロスのパーセンテージを設定します。0 はストップロスが有効になっていないことを意味します', - 'trading-assistant.form.takeProfitPct': 'テイクプロフィット率(%)', - 'trading-assistant.form.takeProfitPctHint': 'テイクプロフィットのパーセンテージを設定します。0 はテイクプロフィットを無効にすることを意味します', - 'trading-assistant.form.signalMode': '信号モード', - 'trading-assistant.form.signalModeConfirmed': '確認モード', - 'trading-assistant.form.signalModeAggressive': 'アグレッシブモード', - 'trading-assistant.form.signalModeHint': '確認モード: 完了した K 行のみをチェックします。アグレッシブ モード: K ラインの形成もチェックします', - 'trading-assistant.form.cancel': 'キャンセル', - 'trading-assistant.form.prev': '前のステップ', - 'trading-assistant.form.next': '次のステップ', - 'trading-assistant.form.confirmCreate': '作成の確認', - 'trading-assistant.form.confirmEdit': '変更を確認する', - 'trading-assistant.messages.createSuccess': '戦略が正常に作成されました', - 'trading-assistant.messages.createFailed': 'ポリシーの作成に失敗しました', - 'trading-assistant.messages.updateSuccess': 'ポリシーの更新が成功しました', - 'trading-assistant.messages.updateFailed': 'ポリシーの更新に失敗しました', - 'trading-assistant.messages.deleteSuccess': 'ポリシーの削除が成功しました', - 'trading-assistant.messages.deleteFailed': 'ポリシーの削除に失敗しました', - 'trading-assistant.messages.startSuccess': '戦略は無事に開始されました', - 'trading-assistant.messages.startFailed': 'ポリシーの開始に失敗しました', - 'trading-assistant.messages.stopSuccess': '戦略は正常に停止されました', - 'trading-assistant.messages.stopFailed': '停止戦略は失敗しました', - 'trading-assistant.messages.loadFailed': 'ポリシーリストの取得に失敗しました', - 'trading-assistant.messages.runningWarning': '戦略は実行されています。 戦略を変更する前に戦略を停止してください。', - 'trading-assistant.messages.deleteConfirmWithName': 'ポリシー「{name}」を削除してもよろしいですか?この操作は元に戻すことができません。', - 'trading-assistant.messages.deleteConfirm': 'このポリシーを削除してもよろしいですか?この操作は元に戻すことができません。', - 'trading-assistant.messages.loadTradesFailed': '取引記録の取得に失敗しました', - 'trading-assistant.messages.loadPositionsFailed': '位置レコードの取得に失敗しました', - 'trading-assistant.messages.loadEquityFailed': '資本曲線の取得に失敗しました', - 'trading-assistant.messages.loadIndicatorsFailed': 'インジケーター リストの読み込みに失敗しました。後でもう一度お試しください。', - 'trading-assistant.messages.spotLimitations': 'スポット取引は自動的にロングのみ、レバレッジ1倍に設定されています', - 'trading-assistant.messages.autoFillApiConfig': '取引所の過去の API 設定が自動的に入力されます', - 'trading-assistant.placeholders.selectIndicator': 'インジケーターを選択してください', - 'trading-assistant.placeholders.selectExchange': '交換を選択してください', - 'trading-assistant.placeholders.inputApiKey': 'APIキーを入力してください', - 'trading-assistant.placeholders.inputSecretKey': '秘密キーを入力してください', - 'trading-assistant.placeholders.inputPassphrase': 'パスフレーズを入力してください', - 'trading-assistant.placeholders.inputStrategyName': 'ポリシー名を入力してください', - 'trading-assistant.placeholders.selectSymbol': '取引ペアを選択してください', - 'trading-assistant.placeholders.selectTimeframe': '期間を選択してください', - 'trading-assistant.placeholders.selectKlinePeriod': 'K線期間を選択してください', - 'trading-assistant.placeholders.inputAiFilterPrompt': 'カスタムプロンプトを入力してください(オプション)', - 'trading-assistant.validation.indicatorRequired': 'インジケーターを選択してください', - 'trading-assistant.validation.exchangeRequired': '交換を選択してください', - 'trading-assistant.validation.apiKeyRequired': 'APIキーを入力してください', - 'trading-assistant.validation.secretKeyRequired': '秘密キーを入力してください', - 'trading-assistant.validation.passphraseRequired': 'パスフレーズを入力してください', - 'trading-assistant.validation.exchangeConfigIncomplete': '完全な交換構成情報を入力してください', - 'trading-assistant.validation.testConnectionRequired': 'まず「テスト接続」ボタンをクリックし、接続が成功することを確認してください', - 'trading-assistant.validation.testConnectionFailed': '接続テストに失敗しました。設定を確認して再度テストしてください', - 'trading-assistant.validation.strategyNameRequired': 'ポリシー名を入力してください', - 'trading-assistant.validation.symbolRequired': '取引ペアを選択してください', - 'trading-assistant.validation.initialCapitalRequired': '投資額を入力してください', - 'trading-assistant.validation.leverageRequired': 'レバレッジ比率を入力してください', - 'trading-assistant.table.time': '時間', - 'trading-assistant.table.type': 'タイプ', - 'trading-assistant.table.price': '価格', - 'trading-assistant.table.amount': '数量', - 'trading-assistant.table.value': '金額', - 'trading-assistant.table.commission': '手数料', - 'trading-assistant.table.symbol': '取引ペア', - 'trading-assistant.table.side': '方向', - 'trading-assistant.table.size': 'ポジション数量', - 'trading-assistant.table.entryPrice': 'オープン価格', - 'trading-assistant.table.currentPrice': '現在の価格', - 'trading-assistant.table.unrealizedPnl': '未実現損益', - 'trading-assistant.table.pnlPercent': '損益率', - 'trading-assistant.table.buy': '買う', - 'trading-assistant.table.sell': '売る', - 'trading-assistant.table.long': '長く続けてください', - 'trading-assistant.table.short': '短い', - 'trading-assistant.table.noPositions': 'まだポジションがありません', - 'trading-assistant.detail.title': '戦略の詳細', - 'trading-assistant.detail.strategyName': 'ポリシー名', - 'trading-assistant.detail.strategyType': '戦略タイプ', - 'trading-assistant.detail.status': 'ステータス', - 'trading-assistant.detail.tradingMode': '取引モデル', - 'trading-assistant.detail.exchange': '交換', - 'trading-assistant.detail.initialCapital': '初期資本', - 'trading-assistant.detail.totalInvestment': '投資総額', - 'trading-assistant.detail.currentEquity': '現在の純資産', - 'trading-assistant.detail.totalPnl': '損益通算', - 'trading-assistant.detail.indicatorName': 'インジケーター名', - 'trading-assistant.detail.maxLeverage': '最大レバレッジ', - 'trading-assistant.detail.decideInterval': '決定間隔', - 'trading-assistant.detail.symbols': 'トランザクションオブジェクト', - 'trading-assistant.detail.createdAt': '作成時間', - 'trading-assistant.detail.updatedAt': '更新時間', - 'trading-assistant.detail.llmConfig': 'AIモデル構成', - 'trading-assistant.detail.exchangeConfig': 'Exchangeの構成', - 'trading-assistant.detail.provider': 'プロバイダー', - 'trading-assistant.detail.modelId': 'モデルID', - 'trading-assistant.detail.close': '閉じる', - 'trading-assistant.detail.loadFailed': 'ポリシーの詳細を取得できませんでした', - 'trading-assistant.equity.noData': '純資産データはまだありません', - 'trading-assistant.equity.equity': '純資産', - 'trading-assistant.exchange.tradingMode': '取引モデル', - 'trading-assistant.exchange.virtual': '模擬取引', - 'trading-assistant.exchange.live': '実際のトランザクション', - 'trading-assistant.exchange.selectExchange': '交換を選択', - 'trading-assistant.exchange.walletAddress': 'ウォレットアドレス', - 'trading-assistant.exchange.walletAddressPlaceholder': 'ウォレットアドレスを入力してください(0xで始まる)', - 'trading-assistant.exchange.privateKey': '秘密鍵', - 'trading-assistant.exchange.privateKeyPlaceholder': '秘密キーを入力してください(64文字)', - 'trading-assistant.exchange.testConnection': 'テスト接続', - 'trading-assistant.exchange.connectionSuccess': '接続成功', - 'trading-assistant.exchange.connectionFailed': '接続に失敗しました', - 'trading-assistant.exchange.testFailed': '接続テストに失敗しました', - 'trading-assistant.exchange.fillComplete': '完全な交換構成情報を入力してください', - 'trading-assistant.strategyTypeOptions.ai': 'AI主導の戦略', - 'trading-assistant.strategyTypeOptions.indicator': 'テクニカル指標戦略', - 'trading-assistant.strategyTypeOptions.aiDeveloping': 'AIを活用した戦略機能は開発中ですのでご期待ください', - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'AI主導の戦略機能は開発中です', - 'trading-assistant.indicatorType.trend': 'トレンド', - 'trading-assistant.indicatorType.momentum': '勢い', - 'trading-assistant.indicatorType.volatility': '変動', - 'trading-assistant.indicatorType.volume': 'ボリューム', - 'trading-assistant.indicatorType.custom': 'カスタマイズ', - 'trading-assistant.exchangeNames': { - 'okx': 'OKX', - 'binance': 'バイナンス', - 'hyperliquid': '超流動性', - 'blockchaincom': 'Blockchain.com', - 'coinbaseexchange': 'コインベース', - 'gate': 'Gate.io', - 'mexc': 'メキシコ', - 'kraken': 'クラーケン', - 'bitfinex': 'ビットフィネックス', - 'bybit': 'バイビット', - 'kucoin': 'クーコイン', - 'huobi': 'フォビ', - 'bitget': 'ビゲット', - 'bitmex': 'ビットメックス', - 'deribit': 'デリビット', - 'phemex': 'フェメックス', - 'bitmart': 'ビットマート', - 'bitstamp': 'ビットスタンプ', - 'bittrex': 'ビットレックス', - 'poloniex': 'ポロニエックス', - 'gemini': 'ジェミニ', - 'cryptocom': 'Crypto.com', - 'bitflyer': 'ビットフライヤー', - 'upbit': 'アップビット', - 'bithumb': 'ビサム', - 'coinone': 'コイノン', - 'zb': 'ZB', - 'lbank': 'Lバンク', - 'bibox': 'ビボックス', - 'bigone': 'ビッグワン', - 'bitrue': 'ビトゥルー', - 'coinex': 'CoinEx', - 'digifinex': 'デジフィネックス', - 'ftx': 'FTX', - 'ftxus': 'FTX米国', - 'binanceus': 'バイナンスUS', - 'binancecoinm': 'バイナンス COIN-M', - 'binanceusdm': 'バイナンスUSDⓈ-M' - }, - 'ai-trading-assistant.title': 'AI取引アシスタント', - 'ai-trading-assistant.strategyList': '戦略一覧', - 'ai-trading-assistant.createStrategy': 'ポリシーの作成', - 'ai-trading-assistant.noStrategy': 'まだ戦略はありません', - 'ai-trading-assistant.selectStrategy': '詳細を表示するには、左側から戦略を選択してください', - 'ai-trading-assistant.startStrategy': '戦略を立ち上げる', - 'ai-trading-assistant.stopStrategy': '戦略を停止する', - 'ai-trading-assistant.editStrategy': '編集戦略', - 'ai-trading-assistant.deleteStrategy': 'ポリシーの削除', - 'ai-trading-assistant.status.running': 'ランニング', - 'ai-trading-assistant.status.stopped': '停止しました', - 'ai-trading-assistant.status.error': 'エラー', - 'ai-trading-assistant.tabs.tradingRecords': '取引履歴', - 'ai-trading-assistant.tabs.positions': '位置記録', - 'ai-trading-assistant.tabs.aiDecisions': 'AI判定記録', - 'ai-trading-assistant.tabs.equityCurve': '資本曲線', - 'ai-trading-assistant.form.createTitle': 'AI取引戦略を作成する', - 'ai-trading-assistant.form.editTitle': 'AI取引戦略を編集する', - 'ai-trading-assistant.form.strategyName': 'ポリシー名', - 'ai-trading-assistant.form.modelId': 'AIモデル', - 'ai-trading-assistant.form.modelIdHint': 'API キーを設定せずにシステム OpenRouter サービスを使用する', - 'ai-trading-assistant.form.decideInterval': '決定間隔', - 'ai-trading-assistant.form.decideInterval5m': '5分', - 'ai-trading-assistant.form.decideInterval10m': '10分', - 'ai-trading-assistant.form.decideInterval30m': '30分', - 'ai-trading-assistant.form.decideInterval1h': '1時間', - 'ai-trading-assistant.form.decideInterval4h': '4時間', - 'ai-trading-assistant.form.decideInterval1d': '1日', - 'ai-trading-assistant.form.decideInterval1w': '1週間', - 'ai-trading-assistant.form.decideIntervalHint': 'AIが意思決定を行うまでの時間間隔', - 'ai-trading-assistant.form.runPeriod': '実行サイクル', - 'ai-trading-assistant.form.runPeriodHint': '戦略実行の開始時刻と終了時刻', - 'ai-trading-assistant.form.startDate': '開始日', - 'ai-trading-assistant.form.endDate': '終了日', - 'ai-trading-assistant.form.qdtCostTitle': 'QDT 控除の指示', - 'ai-trading-assistant.form.qdtCostHint': 'AI の決定ごとに {cost} QDT が差し引かれます。アカウントに十分な QDT 残高があることを確認してください。戦略の実行中、決定ごとに料金がリアルタイムで差し引かれます。', - 'ai-trading-assistant.form.apiKey': 'APIキー', - 'ai-trading-assistant.form.exchange': '交換を選択', - 'ai-trading-assistant.form.secretKey': '秘密鍵', - 'ai-trading-assistant.form.passphrase': 'パスフレーズ', - 'ai-trading-assistant.form.testConnection': 'テスト接続', - 'ai-trading-assistant.form.symbol': '取引ペア', - 'ai-trading-assistant.form.symbolHint': '取引する取引ペアを選択してください', - 'ai-trading-assistant.form.initialCapital': '投資額(証拠金)', - 'ai-trading-assistant.form.leverage': '複数を活用する', - 'ai-trading-assistant.form.timeframe': '期間', - 'ai-trading-assistant.form.timeframe1m': '1分', - 'ai-trading-assistant.form.timeframe5m': '5分', - 'ai-trading-assistant.form.timeframe15m': '15分', - 'ai-trading-assistant.form.timeframe30m': '30分', - 'ai-trading-assistant.form.timeframe1H': '1時間', - 'ai-trading-assistant.form.timeframe4H': '4時間', - 'ai-trading-assistant.form.timeframe1D': '1日', - 'ai-trading-assistant.form.marketType': '市場タイプ', - 'ai-trading-assistant.form.marketTypeFutures': '契約', - 'ai-trading-assistant.form.marketTypeSpot': 'スポット', - 'ai-trading-assistant.form.totalPnl': '損益通算', - 'ai-trading-assistant.form.customPrompt': 'カスタムのプロンプト単語', - 'ai-trading-assistant.form.customPromptHint': 'オプション。 AI 取引戦略と意思決定ロジックをカスタマイズするために使用されます。', - 'ai-trading-assistant.form.cancel': 'キャンセル', - 'ai-trading-assistant.form.prev': '前のステップ', - 'ai-trading-assistant.form.next': '次のステップ', - 'ai-trading-assistant.form.confirmCreate': '作成の確認', - 'ai-trading-assistant.form.confirmEdit': '変更を確認する', - 'ai-trading-assistant.messages.createSuccess': '戦略が正常に作成されました', - 'ai-trading-assistant.messages.createFailed': 'ポリシーの作成に失敗しました', - 'ai-trading-assistant.messages.updateSuccess': 'ポリシーの更新が成功しました', - 'ai-trading-assistant.messages.updateFailed': 'ポリシーの更新に失敗しました', - 'ai-trading-assistant.messages.deleteSuccess': 'ポリシーの削除が成功しました', - 'ai-trading-assistant.messages.deleteFailed': 'ポリシーの削除に失敗しました', - 'ai-trading-assistant.messages.startSuccess': '戦略は無事に開始されました', - 'ai-trading-assistant.messages.startFailed': 'ポリシーの開始に失敗しました', - 'ai-trading-assistant.messages.stopSuccess': '戦略は正常に停止されました', - 'ai-trading-assistant.messages.stopFailed': '停止戦略は失敗しました', - 'ai-trading-assistant.messages.loadFailed': 'ポリシーリストの取得に失敗しました', - 'ai-trading-assistant.messages.loadDecisionsFailed': 'AI判定記録の取得に失敗しました', - 'ai-trading-assistant.messages.deleteConfirm': 'このポリシーを削除してもよろしいですか?この操作は元に戻すことができません。', - 'ai-trading-assistant.placeholders.inputStrategyName': 'ポリシー名を入力してください', - 'ai-trading-assistant.placeholders.selectModelId': 'AI モデルを選択してください', - 'ai-trading-assistant.placeholders.selectDecideInterval': '決定間隔を選択してください', - 'ai-trading-assistant.placeholders.startTime': '開始時間', - 'ai-trading-assistant.placeholders.endTime': '終了時間', - 'ai-trading-assistant.placeholders.inputApiKey': 'APIキーを入力してください', - 'ai-trading-assistant.placeholders.selectExchange': '交換を選択してください', - 'ai-trading-assistant.placeholders.inputSecretKey': '秘密キーを入力してください', - 'ai-trading-assistant.placeholders.inputPassphrase': 'パスフレーズを入力してください', - 'ai-trading-assistant.placeholders.selectSymbol': 'BTC/USDT などの取引ペアを選択してください。', - 'ai-trading-assistant.placeholders.selectTimeframe': '期間を選択してください', - 'ai-trading-assistant.placeholders.inputCustomPrompt': 'カスタムのプロンプト単語を入力してください (オプション)', - 'ai-trading-assistant.validation.strategyNameRequired': 'ポリシー名を入力してください', - 'ai-trading-assistant.validation.modelIdRequired': 'AI モデルを選択してください', - 'ai-trading-assistant.validation.runPeriodRequired': '実行サイクルを選択してください', - 'ai-trading-assistant.validation.apiKeyRequired': 'APIキーを入力してください', - 'ai-trading-assistant.validation.exchangeRequired': '交換を選択してください', - 'ai-trading-assistant.validation.secretKeyRequired': '秘密キーを入力してください', - 'ai-trading-assistant.validation.symbolRequired': '取引ペアを選択してください', - 'ai-trading-assistant.validation.initialCapitalRequired': '投資額を入力してください', - 'ai-trading-assistant.table.time': '時間', - 'ai-trading-assistant.table.type': 'タイプ', - 'ai-trading-assistant.table.price': '価格', - 'ai-trading-assistant.table.amount': '数量', - 'ai-trading-assistant.table.value': '金額', - 'ai-trading-assistant.table.symbol': '取引ペア', - 'ai-trading-assistant.table.side': '方向', - 'ai-trading-assistant.table.size': 'ポジション数量', - 'ai-trading-assistant.table.entryPrice': 'オープン価格', - 'ai-trading-assistant.table.currentPrice': '現在の価格', - 'ai-trading-assistant.table.unrealizedPnl': '未実現損益', - 'ai-trading-assistant.table.profit': '損益', - 'ai-trading-assistant.table.openLong': '長く開く', - 'ai-trading-assistant.table.closeLong': 'ピンドゥオ', - 'ai-trading-assistant.table.openShort': 'オープンショート', - 'ai-trading-assistant.table.closeShort': '空の', - 'ai-trading-assistant.table.addLong': 'ガドット', - 'ai-trading-assistant.table.addShort': '短く追加する', - 'ai-trading-assistant.table.closeShortProfit': 'ショートポジションで利益確定', - 'ai-trading-assistant.table.closeShortStop': 'ストップロス', - 'ai-trading-assistant.table.closeLongProfit': '長く停止して利益を得る', - 'ai-trading-assistant.table.closeLongStop': 'ストップロス', - 'ai-trading-assistant.table.buy': '買う', - 'ai-trading-assistant.table.sell': '売る', - 'ai-trading-assistant.table.long': '長く続けてください', - 'ai-trading-assistant.table.short': '短い', - 'ai-trading-assistant.table.hold': 'ホールド', - 'ai-trading-assistant.table.reasoning': '分析理由', - 'ai-trading-assistant.table.decisions': '意思決定', - 'ai-trading-assistant.table.riskAssessment': 'リスク評価', - 'ai-trading-assistant.table.confidence': '自信', - 'ai-trading-assistant.table.totalRecords': '合計 {total} レコード', - 'ai-trading-assistant.table.noPositions': 'まだポジションがありません', - 'ai-trading-assistant.detail.title': '戦略の詳細', - 'ai-trading-assistant.equity.noData': '純資産データはまだありません', - 'ai-trading-assistant.equity.equity': '純資産', - 'ai-trading-assistant.exchange.testFailed': '接続テストに失敗しました', - 'ai-trading-assistant.exchange.connectionSuccess': '接続成功', - 'ai-trading-assistant.exchange.connectionFailed': '接続に失敗しました', - 'ai-trading-assistant.form.advancedSettings': '詳細設定', - 'ai-trading-assistant.form.orderMode': 'オーダーモード', - 'ai-trading-assistant.form.orderModeMaker': 'メーカー', - 'ai-trading-assistant.form.orderModeTaker': '市場価格(テイカー)', - 'ai-trading-assistant.form.orderModeHint': '未決注文モードでは指値注文が使用され、手数料が安くなります。市場価格モードはすぐに実行され、手数料が高くなります。', - 'ai-trading-assistant.form.makerWaitSec': '未決注文の待ち時間 (秒)', - 'ai-trading-assistant.form.makerWaitSecHint': '注文後の取引を待つ時間。キャンセルして、タイムアウト後に再試行してください。', - 'ai-trading-assistant.form.makerRetries': '未決注文の再試行回数', - 'ai-trading-assistant.form.makerRetriesHint': '未決注文が約定しない場合の最大リトライ回数', - 'ai-trading-assistant.form.fallbackToMarket': '未決注文は失敗し、市場価格は引き下げられます。', - 'ai-trading-assistant.form.fallbackToMarketHint': '開始/終了未決注文が完了していない場合、トランザクションを確実に完了させるために成行注文にダウングレードする必要があるかどうか。', - 'ai-trading-assistant.form.marginMode': 'マージンモード', - 'ai-trading-assistant.form.marginModeCross': '倉庫がいっぱい', - 'ai-trading-assistant.form.marginModeIsolated': '孤立した位置', - 'ai-analysis.title': 'クォンタムトレーディングエンジン', - 'ai-analysis.system.online': 'オンライン', - 'ai-analysis.system.agents': 'エージェント', - 'ai-analysis.system.active': 'アクティブな', - 'ai-analysis.system.stage': 'ステージ', - 'ai-analysis.panel.roster': 'エージェントラインナップ', - 'ai-analysis.panel.thinking': '考え中...', - 'ai-analysis.panel.done': '完了', - 'ai-analysis.panel.standby': 'スタンバイ', - 'ai-analysis.input.title': 'クォンタムトレーディングエンジン', - 'ai-analysis.input.placeholder': 'ターゲット資産を選択します (例: BTC/USDT)', - 'ai-analysis.input.watchlist': 'オプションストック', - 'ai-analysis.input.start': '分析を開始する', - 'ai-analysis.input.recent': '最近のタスク:', - 'ai-analysis.vis.stage': 'ステージ', - 'ai-analysis.vis.processing': '処理中', - 'ai-analysis.result.complete': '分析完了', - 'ai-analysis.result.signal': '最終信号', - 'ai-analysis.result.confidence': '自信:', - 'ai-analysis.result.new': '新しい分析', - 'ai-analysis.result.full': 'レポート全体を表示', - 'ai-analysis.logs.title': 'システムログ', - 'ai-analysis.modal.title': '機密報告書', - 'ai-analysis.modal.fundamental': 'ファンダメンタルズ分析', - 'ai-analysis.modal.technical': 'テクニカル分析', - 'ai-analysis.modal.sentiment': '感情分析', - 'ai-analysis.modal.risk': 'リスク評価', - 'ai-analysis.stage.idle': 'スタンバイ', - 'ai-analysis.stage.1': 'フェーズ 1: 多次元分析', - 'ai-analysis.stage.2': 'フェーズ 2: 長短討論', - 'ai-analysis.stage.3': 'フェーズ 3: 戦略計画', - 'ai-analysis.stage.4': '第 4 段階: リスク管理のレビュー', - 'ai-analysis.stage.complete': '完了', - 'ai-analysis.agent.investment_director': '投資ディレクター', - 'ai-analysis.agent.role.investment_director': '包括的な分析と最終結論', - 'ai-analysis.agent.market': '市場アナリスト', - 'ai-analysis.agent.role.market': 'テクノロジーと市場データ', - 'ai-analysis.agent.fundamental': 'ファンダメンタルズアナリスト', - 'ai-analysis.agent.role.fundamental': '財務と評価', - 'ai-analysis.agent.technical': 'テクニカルアナリスト', - 'ai-analysis.agent.role.technical': 'テクニカル指標とチャート', - 'ai-analysis.agent.news': 'ニュースアナリスト', - 'ai-analysis.agent.role.news': 'グローバルニュースフィルター', - 'ai-analysis.agent.sentiment': 'センチメントアナリスト', - 'ai-analysis.agent.role.sentiment': '社会的&感情的', - 'ai-analysis.agent.risk': 'リスクアナリスト', - 'ai-analysis.agent.role.risk': '基本的なリスクチェック', - 'ai-analysis.agent.bull': '強気な研究者', - 'ai-analysis.agent.role.bull': '成長触媒の採掘', - 'ai-analysis.agent.bear': '弱気な研究者', - 'ai-analysis.agent.role.bear': 'リスクと欠陥の掘り下げ', - 'ai-analysis.agent.manager': '研究マネージャー', - 'ai-analysis.agent.role.manager': 'ディベートモデレーター', - 'ai-analysis.agent.trader': 'トレーダー', - 'ai-analysis.agent.role.trader': 'エグゼクティブ・ストラテジスト', - 'ai-analysis.agent.risky': '活動家アナリスト', - 'ai-analysis.agent.role.risky': '積極的な戦略', - 'ai-analysis.agent.neutral': 'バランスアナリスト', - 'ai-analysis.agent.role.neutral': 'バランス戦略', - 'ai-analysis.agent.safe': '保守的なアナリスト', - 'ai-analysis.agent.role.safe': '保守的な戦略', - 'ai-analysis.agent.cro': 'リスクコントロールマネージャー (CRO)', - 'ai-analysis.agent.role.cro': '最終的な意思決定権限', - 'ai-analysis.script.market': '主要な取引所から OHLCV データを取得しています...', - 'ai-analysis.script.fundamental': '四半期財務報告書を取得しています...', - 'ai-analysis.script.technical': 'テクニカル指標とチャートパターンを分析しています...', - 'ai-analysis.script.news': '世界的な金融ニュースを調べています...', - 'ai-analysis.script.sentiment': 'ソーシャルメディアのトレンドを分析中...', - 'ai-analysis.script.risk': '過去のボラティリティを計算しています...', - 'invite.inviteLink': '招待リンク', - 'invite.copy': 'リンクをコピー', - 'invite.copySuccess': 'コピー成功!', - 'invite.copyFailed': 'コピーに失敗しました。 手動でコピーしてください', - 'invite.noInviteLink': '招待リンクが生成されませんでした', - 'invite.totalInvites': '累積招待状', - 'invite.totalReward': '累計報酬', - 'invite.rules': '招待ルール', - 'invite.rule1': '友達の登録に成功するたびに、報酬を受け取ります', - 'invite.rule2': '招待された友達が最初のトランザクションを完了すると、追加の報酬を受け取ります', - 'invite.rule3': '招待特典はアカウントに直接送信されます', - 'invite.inviteList': '招待リスト', - 'invite.tasks': 'ミッションセンター', - 'invite.inviteeName': '招待者', - 'invite.inviteTime': '招待時間', - 'invite.status': 'ステータス', - 'invite.reward': '報酬', - 'invite.active': 'アクティブな', - 'invite.inactive': 'アクティブ化されていません', - 'invite.completed': '完了', - 'invite.claimed': '受け取りました', - 'invite.pending': '完成予定', - 'invite.goToTask': '完了する', - 'invite.claimReward': '報酬を請求する', - 'invite.verify': '検証完了', - 'invite.verifySuccess': '検証成功!タスクが完了しました', - 'invite.verifyNotCompleted': 'タスクはまだ完了していません。 最初にタスクを完了してください', - 'invite.verifyFailed': '検証に失敗しました。後でもう一度お試しください', - 'invite.claimSuccess': '{reward} QDT を正常に受け取りました!', - 'invite.claimFailed': '収集に失敗しました。 後でもう一度お試しください', - 'invite.totalRecords': '合計 {total} レコード', - 'invite.task.twitter.title': 'X(Twitter)にリツイート', - 'invite.task.twitter.desc': '公式ツイートを X (Twitter) アカウントに共有します', - 'invite.task.youtube.title': 'YouTube チャンネルをフォローしてください', - 'invite.task.youtube.desc': '公式 YouTube チャンネルを購読してフォローしてください', - 'invite.task.telegram.title': 'テレグラムグループに参加する', - 'invite.task.telegram.desc': '公式 Telegram コミュニティ グループに参加してください', - 'invite.task.discord.title': 'Discordサーバーに参加する', - 'invite.task.discord.desc': 'Discordコミュニティサーバーに参加してください', - 'message': '-', - 'layouts.usermenu.dialog.title': '情報', - 'layouts.usermenu.dialog.content': 'ログアウトしてもよろしいですか?', - 'layouts.userLayout.title': '不確実性の中で真実を見つける', - // Auto-filled missing keys from en-US (fallback to English) - 'dashboard.indicator.boundary.message': 'Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.', - 'dashboard.indicator.boundary.indicatorRule': "Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.", - 'dashboard.indicator.boundary.backtestRule': 'Rule: If a bar has a main signal (buy/sell → open/close/reverse), scaling in/out is skipped on the same bar.', - 'dashboard.indicator.guide.title': 'Python Indicator & Strategy Development Guide', - 'dashboard.indicator.guide.intro': 'This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.', - 'dashboard.indicator.guide.section1.title': '1. Runtime Environment & Predefined Variables', - 'dashboard.indicator.guide.section1.env': 'Your code runs in a browser-based Python environment (Pyodide).', - 'dashboard.indicator.guide.section1.libs': 'Pre-installed Libraries', - 'dashboard.indicator.guide.section1.libsDesc': 'The following libraries are imported by default, no need to import again:', - 'dashboard.indicator.guide.section1.libsList': 'pandas (pd), numpy (np), math, json', - 'dashboard.indicator.guide.section1.data': 'Input Data: df', - 'dashboard.indicator.guide.section1.dataDesc': 'The system automatically converts current K-line data into a Pandas DataFrame object, variable name is df.', - 'dashboard.indicator.guide.section1.dataColumns': 'df contains the following columns (all float type):', - 'dashboard.indicator.guide.section1.dataColumnsList': 'time (timestamp, seconds), open, high, low, close, volume', - 'dashboard.indicator.guide.section1.dataNote': 'Data index is arranged from old to new (0 is the earliest data, last row is the latest data).', - 'dashboard.indicator.guide.section1.dataIndex': 'Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using .values which loses the index.', - 'dashboard.indicator.guide.section2.title': '2. Parameter Definition', - 'dashboard.indicator.guide.section2.desc': 'You can define variables as parameters at the beginning of your code. The system will try to parse statements like variable = value as adjustable parameters.', - 'dashboard.indicator.guide.section2.example': 'Parameter Example', - 'dashboard.indicator.guide.section2.exampleCode': 'span = 20 or multiplier = 2.0', - 'dashboard.indicator.guide.section3.title': '3. Backtest Signal Setup (Important!)', - 'dashboard.indicator.guide.section3.desc': 'If you want your indicator to support backtesting, you must set the following two columns in your code:', - 'dashboard.indicator.guide.section3.backtestRequired': 'Required for Backtesting:', - 'dashboard.indicator.guide.section3.backtestBuySignal': "df['buy_signal'] - Boolean Series, True indicates buy signal", - 'dashboard.indicator.guide.section3.backtestSellSignal': "df['sell_signal'] - Boolean Series, True indicates sell signal", - 'dashboard.indicator.guide.section3.backtestExample': 'Example:', - 'dashboard.indicator.guide.section3.backtestExampleCode': "df['buy_signal'] = condition_buy
    df['sell_signal'] = condition_sell", - 'dashboard.indicator.guide.section3.backtestNote': 'Note: Even if you only set output.signals for chart display, you must set these two columns to enable backtesting.', - 'dashboard.indicator.guide.section4.title': '4. Output Requirements: output', - 'dashboard.indicator.guide.section4.desc': 'At the end of code execution, you must define a dictionary named output to tell the chart how to display results.', - 'dashboard.indicator.guide.section4.fields': 'The output dictionary contains the following fields:', - 'dashboard.indicator.guide.section4.plots': 'plots - For drawing lines (e.g., moving averages, RSI)', - 'dashboard.indicator.guide.section4.signals': 'signals - For marking buy/sell signals (e.g., arrows, labels)', - 'dashboard.indicator.guide.section4.name': 'name - Indicator name (optional)', - 'dashboard.indicator.guide.section4.calculatedVars': 'calculatedVars - Calculated variables (optional, for displaying additional information)', - 'dashboard.indicator.guide.section5.title': '5. Plot Configuration (Plots)', - 'dashboard.indicator.guide.section5.desc': 'Each object in the plots list represents a line.', - 'dashboard.indicator.guide.section5.table.field': 'Field', - 'dashboard.indicator.guide.section5.table.type': 'Type', - 'dashboard.indicator.guide.section5.table.required': 'Required', - 'dashboard.indicator.guide.section5.table.requiredYes': 'Yes', - 'dashboard.indicator.guide.section5.table.requiredNo': 'No', - 'dashboard.indicator.guide.section5.table.desc': 'Description', - 'dashboard.indicator.guide.section5.table.name': 'The name of the indicator line, displayed in the legend', - 'dashboard.indicator.guide.section5.table.data': 'Data list, length must match the number of rows in df. Recommended to use series.tolist()', - 'dashboard.indicator.guide.section5.table.color': "Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign", - 'dashboard.indicator.guide.section5.table.typeDesc': "Chart type, default is 'line'", - 'dashboard.indicator.guide.section5.table.overlay': 'Important. True means display on main chart (with K-line), False means display on sub-chart (independent area)', - 'dashboard.indicator.guide.section5.example': 'Example: Draw Simple Moving Average (SMA)', - 'dashboard.indicator.guide.section5.exampleCalc': 'Calculate SMA', - 'dashboard.indicator.guide.section5.exampleOutput': 'Construct Output', - 'dashboard.indicator.guide.section5.exampleOverlay': 'Display on main chart', - 'dashboard.indicator.guide.section6.title': '6. Signal Markers (Signals)', - 'dashboard.indicator.guide.section6.desc': "signals are used to mark buy/sell points on specific K-lines through icons or text. Note: This is only for chart display. The backtest system uses df['buy_signal'] and df['sell_signal'].", - 'dashboard.indicator.guide.section6.table.type': "Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)", - 'dashboard.indicator.guide.section6.table.data': 'Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions', - 'dashboard.indicator.guide.section6.table.text': 'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")', - 'dashboard.indicator.guide.section6.table.color': 'Marker color', - 'dashboard.indicator.guide.section6.hint': 'The system automatically handles positioning.', - 'dashboard.indicator.guide.section6.buy': 'Markers will be automatically positioned below the Low of the current K-line', - 'dashboard.indicator.guide.section6.sell': 'Markers will be automatically positioned above the High of the current K-line', - 'dashboard.indicator.guide.section6.example': 'Example: Draw Buy/Sell Signals', - 'dashboard.indicator.guide.section6.exampleInit': 'Initialize signal list, fill all with None', - 'dashboard.indicator.guide.section6.exampleLogic': 'Simple logic: mark buy when close price is greater than open price', - 'dashboard.indicator.guide.section6.exampleNote': 'In actual logic, please use loops or vectorized operations', - 'dashboard.indicator.guide.section6.examplePrice': 'Record price', - 'dashboard.indicator.guide.section6.exampleText': 'Buy', - 'dashboard.indicator.guide.section7.title': '7. Complete Code Examples', - 'dashboard.indicator.guide.section7.exampleA': 'Example A: Dual EMA Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleACode': "# 1. Calculate indicators
    df['ema_fast'] = df['close'].ewm(span=5, adjust=False).mean()
    df['ema_slow'] = df['close'].ewm(span=13, adjust=False).mean()

    # 2. Calculate crossover signals
    cross_up = (df['ema_fast'] > df['ema_slow']) & (df['ema_fast'].shift(1) <= df['ema_slow'].shift(1))
    cross_down = (df['ema_fast'] < df['ema_slow']) & (df['ema_fast'].shift(1) >= df['ema_slow'].shift(1))

    # 3. 【Important】Set NEW backtest signal columns (bool)
    df['open_long'] = cross_up
    df['close_long'] = cross_down
    df['open_short'] = cross_down
    df['close_short'] = cross_up

    # 4. Generate signal data for chart display
    buy_signals = [df['low'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]

    # 5. Build output
    output = {
    \"name\": \"Dual EMA Strategy\",
    \"plots\": [
    {\"name\": \"EMA 5\", \"data\": df['ema_fast'].tolist(), \"color\": \"#FF6B6B\", \"overlay\": True},
    {\"name\": \"EMA 13\", \"data\": df['ema_slow'].tolist(), \"color\": \"#4ECDC4\", \"overlay\": True}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleB': 'Example B: Bollinger Bands - Chart Display Only', - 'dashboard.indicator.guide.section7.exampleBCode': "# Calculate Bollinger Bands (chart display only, no backtesting)
    length = 20
    mult = 2.0
    df['sma'] = df['close'].rolling(length).mean()
    df['std'] = df['close'].rolling(length).std()
    df['upper'] = df['sma'] + mult * df['std']
    df['lower'] = df['sma'] - mult * df['std']

    output = {
    \"name\": \"Bollinger Bands\",
    \"plots\": [
    {\"name\": \"Upper\", \"data\": df['upper'].tolist(), \"color\": \"#FF5252\", \"overlay\": True},
    {\"name\": \"Middle\", \"data\": df['sma'].tolist(), \"color\": \"#2196F3\", \"overlay\": True},
    {\"name\": \"Lower\", \"data\": df['lower'].tolist(), \"color\": \"#00E676\", \"overlay\": True}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleC': 'Example C: RSI Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleCCode': "# Calculate RSI
    delta = df['close'].diff()
    up = delta.clip(lower=0)
    down = -1 * delta.clip(upper=0)
    ema_up = up.ewm(com=13, adjust=False).mean()
    ema_down = down.ewm(com=13, adjust=False).mean()
    rs = ema_up / ema_down
    df['rsi'] = 100 - (100 / (1 + rs))

    # Generate trading signals
    buy_condition = df['rsi'] < 30 # Oversold buy
    sell_condition = df['rsi'] > 70 # Overbought sell

    # 【Important】Set NEW backtest signal columns (bool)
    df['open_long'] = buy_condition
    df['close_long'] = sell_condition
    df['open_short'] = sell_condition
    df['close_short'] = buy_condition

    # Generate chart signals
    buy_signals = [df['low'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]

    output = {
    \"name\": \"RSI Strategy\",
    \"plots\": [
    {\"name\": \"RSI\", \"data\": df['rsi'].tolist(), \"color\": \"#9C27B0\", \"overlay\": False},
    {\"name\": \"Overbought\", \"data\": [70] * len(df), \"color\": \"#FF5252\", \"style\": \"dashed\", \"overlay\": False},
    {\"name\": \"Oversold\", \"data\": [30] * len(df), \"color\": \"#00E676\", \"style\": \"dashed\", \"overlay\": False}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section6.param': 'Parameters', - 'dashboard.indicator.guide.section6.calc': 'Calculate', - 'dashboard.indicator.guide.section6.output': 'Output', - 'dashboard.indicator.guide.section6.generate': 'Generate signal data (initialize with None)', - 'dashboard.indicator.guide.section6.subchart': 'Display on sub-chart', - 'dashboard.indicator.guide.section8.title': '8. Frequently Asked Questions (FAQ)', - 'dashboard.indicator.guide.section8.q1': "Q: Why can't my indicator be backtested?", - 'dashboard.indicator.guide.section8.a1': "A: The backtest system requires NEW signal columns: df['open_long'], df['close_long'], df['open_short'], df['close_short'] (boolean). Even if you set output.signals for chart display, you must set these columns to enable backtesting.", - 'dashboard.indicator.guide.section8.q2': 'Q: Data length mismatch?', - 'dashboard.indicator.guide.section8.a2': "A: The data list in plots and signals must have exactly the same length as the K-line data. If you use df['xxx'].tolist(), there is usually no problem.", - 'dashboard.indicator.guide.section8.q3': 'Q: How to handle NaN (empty values)?', - 'dashboard.indicator.guide.section8.a3': "A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use df.fillna(0) or other methods.", - 'dashboard.indicator.guide.section8.q4': 'Q: Index mismatch causing all signals to be NaN?', - 'dashboard.indicator.guide.section8.a4': "A: Please ensure you preserve the original df index (timestamp). Avoid using .values to create new Series. Use columns directly like df['close'] for operations.", - 'dashboard.indicator.guide.section8.q5': 'Q: Can I use third-party network libraries?', - 'dashboard.indicator.guide.section8.a5': 'A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.', - 'dashboard.indicator.guide.section8.q6': 'Q: How to debug code?', - 'dashboard.indicator.guide.section8.a6': 'A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.', - 'dashboard.indicator.guide.section8.q7': 'Q: Backtest shows 0 signals?', - 'dashboard.indicator.guide.section8.a7': "A: Please check the data type of df['open_long']/df['close_long']/df['open_short']/df['close_short']. They should be boolean (True/False), not numeric. Use condition.fillna(False).astype(bool) to ensure correct type.", - 'dashboard.indicator.backtest.commissionHint': 'Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.', - 'dashboard.indicator.backtest.historyTitle': 'Backtest History', - 'dashboard.indicator.backtest.historyRefresh': 'Refresh', - 'dashboard.indicator.backtest.historyView': 'View', - 'dashboard.indicator.backtest.historyNoData': 'No backtest history', - 'dashboard.indicator.backtest.historyUseCurrent': 'Only current symbol/timeframe', - 'dashboard.indicator.backtest.historyFilterSymbol': 'Symbol', - 'dashboard.indicator.backtest.historyFilterTimeframe': 'Timeframe', - 'dashboard.indicator.backtest.historyApply': 'Apply filters', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AI Analyze', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI Suggestions', - 'dashboard.indicator.backtest.historyNoAIResult': 'No AI analysis result', - 'dashboard.indicator.backtest.historyRunId': 'Run ID', - 'dashboard.indicator.backtest.historyCreatedAt': 'Time', - 'dashboard.indicator.backtest.historyRange': 'Range', - 'dashboard.indicator.backtest.historyStatus': 'Status', - 'dashboard.indicator.backtest.historyStatusSuccess': 'Success', - 'dashboard.indicator.backtest.historyStatusFailed': 'Failed', - 'dashboard.indicator.backtest.historyActions': 'Actions', - 'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)', - 'trading-assistant.exchange.ipWhitelistTip': 'Please add the following IPs to the whitelist in your exchange API settings:', - 'signal-robot.title': 'Signal Robot Console', - 'signal-robot.createBot': 'Create New Bot', - 'signal-robot.search.nameOrSymbol': 'Name/Symbol', - 'signal-robot.search.placeholder': 'Search bot name or symbol', - 'signal-robot.search.status': 'Status', - 'signal-robot.search.statusAll': 'All', - 'signal-robot.search.statusRunning': 'Running', - 'signal-robot.search.statusPaused': 'Paused', - 'signal-robot.search.query': 'Query', - 'signal-robot.search.reset': 'Reset', - 'signal-robot.table.botName': 'Bot Name', - 'signal-robot.table.symbolTimeframe': 'Symbol/Timeframe', - 'signal-robot.table.triggerStrategy': 'Trigger Strategy', - 'signal-robot.table.notificationChannels': 'Notification Channels', - 'signal-robot.table.status': 'Status', - 'signal-robot.table.action': 'Action', - 'signal-robot.table.triggerConditions': '{count} trigger conditions', - 'signal-robot.table.monitoring': 'Monitoring', - 'signal-robot.table.paused': 'Paused', - 'signal-robot.table.edit': 'Edit', - 'signal-robot.table.pause': 'Pause', - 'signal-robot.table.start': 'Start', - 'signal-robot.table.delete': 'Delete', - 'signal-robot.table.deleteConfirm': 'Are you sure you want to delete this bot?', - 'signal-robot.table.deleteSuccess': 'Deleted successfully', - 'signal-robot.table.startSuccess': 'Bot started', - 'signal-robot.table.pauseSuccess': 'Bot paused', - 'signal-robot.channel.telegram': 'Telegram', - 'signal-robot.channel.discord': 'Discord', - 'signal-robot.channel.email': 'Email', - 'signal-robot.channel.webhook': 'Webhook', - 'signal-robot.channel.browser': 'Browser Push', - 'signal-robot.modal.createTitle': 'Create New Signal Robot', - 'signal-robot.modal.editTitle': 'Edit Signal Robot', - 'signal-robot.modal.step.basic': 'Basic Settings', - 'signal-robot.modal.step.entry': 'Entry Strategy', - 'signal-robot.modal.step.position': 'Position Management', - 'signal-robot.modal.step.risk': 'Risk Control', - 'signal-robot.modal.step.notify': 'Notification Config', - 'signal-robot.modal.prev': 'Previous', - 'signal-robot.modal.next': 'Next', - 'signal-robot.modal.preview': 'Preview Backtest', - 'signal-robot.modal.complete': 'Complete & Run', - 'signal-robot.modal.saveSuccess': 'Saved successfully', - 'signal-robot.modal.previewDeveloping': 'Preview feature is under development...', - 'signal-robot.modal.basicInfoRequired': 'Please complete basic information', - 'signal-robot.basic.alert': 'Set basic information for the bot', - 'signal-robot.basic.title': 'Basic Information', - 'signal-robot.basic.botName': 'Bot Name', - 'signal-robot.basic.botNamePlaceholder': 'e.g.: BTC SuperTrend Strategy', - 'signal-robot.basic.symbol': 'Trading Pair', - 'signal-robot.basic.symbolPlaceholder': 'Select from watchlist', - 'signal-robot.basic.noWatchlist': 'No watchlist items, please add in market page first', - 'signal-robot.basic.timeframe': 'K-Line Period', - 'signal-robot.basic.timeframe15m': '15 Minutes', - 'signal-robot.basic.timeframe30m': '30 Minutes', - 'signal-robot.basic.timeframe1h': '1 Hour', - 'signal-robot.basic.timeframe4h': '4 Hours', - 'signal-robot.basic.timeframe1d': '1 Day', - 'signal-robot.basic.autoNameSuggestion': '{symbol} Signal Robot', - 'signal-robot.entry.alert': 'Trigger entry signal when all conditions below are met', - 'signal-robot.entry.condition': 'Condition {index}', - 'signal-robot.entry.indicator': 'Indicator', - 'signal-robot.entry.indicatorSupertrend': 'SuperTrend', - 'signal-robot.entry.indicatorEma': 'EMA (Exponential Moving Average)', - 'signal-robot.entry.indicatorRsi': 'RSI (Relative Strength Index)', - 'signal-robot.entry.indicatorMacd': 'MACD', - 'signal-robot.entry.indicatorBollinger': 'Bollinger Bands', - 'signal-robot.entry.atrPeriod': 'ATR Period', - 'signal-robot.entry.multiplier': 'Multiplier', - 'signal-robot.entry.triggerSignal': 'Trigger Signal', - 'signal-robot.entry.signalTrendBullish': 'Trend Bullish', - 'signal-robot.entry.signalTrendBearish': 'Trend Bearish', - 'signal-robot.entry.signalIsUptrend': 'Is Uptrend', - 'signal-robot.entry.signalIsDowntrend': 'Is Downtrend', - 'signal-robot.entry.period': 'Period', - 'signal-robot.entry.compareCondition': 'Compare Condition', - 'signal-robot.entry.priceAbove': 'Price > EMA (Price Above)', - 'signal-robot.entry.priceBelow': 'Price < EMA (Price Below)', - 'signal-robot.entry.crossUp': 'Price Crosses Above EMA (Golden Cross)', - 'signal-robot.entry.crossDown': 'Price Crosses Below EMA (Death Cross)', - 'signal-robot.entry.compare': 'Compare', - 'signal-robot.entry.greaterThan': 'Greater Than', - 'signal-robot.entry.lessThan': 'Less Than', - 'signal-robot.entry.crossUpShort': 'Cross Up', - 'signal-robot.entry.crossDownShort': 'Cross Down', - 'signal-robot.entry.threshold': 'Threshold', - 'signal-robot.entry.selectIndicator': 'Please select an indicator to configure parameters', - 'signal-robot.entry.addCondition': 'Add Condition', - 'signal-robot.position.alert': 'Configure initial position size, leverage and pyramiding rules', - 'signal-robot.position.basicTitle': 'Basic Position Management', - 'signal-robot.position.initialSize': 'Initial Size (Capital %)', - 'signal-robot.position.initialSizeHint': 'Recommended 5% - 20%', - 'signal-robot.position.leverage': 'Leverage', - 'signal-robot.position.leverageHint': 'Please ensure your exchange account supports this leverage', - 'signal-robot.position.maxPyramiding': 'Max Pyramiding Times', - 'signal-robot.position.maxPyramidingHint': '0 means no pyramiding', - 'signal-robot.position.pyramidingTitle': 'Pyramiding Rules', - 'signal-robot.position.pyramidingEnabled': 'Enabled', - 'signal-robot.position.pyramidingDisabled': 'Disabled', - 'signal-robot.position.pyramidingCondition': 'Pyramiding Trigger Condition', - 'signal-robot.position.priceRisePct': 'Price Rises (Long) / Falls (Short)', - 'signal-robot.position.profitPct': 'Profit Reaches', - 'signal-robot.position.triggerThreshold': 'Trigger Threshold (%)', - 'signal-robot.position.triggerThresholdHint': 'e.g. 3%: add position once every 3% rise', - 'signal-robot.position.addSize': 'Single Add Size (Capital %)', - 'signal-robot.position.pyramidingDisabledHint': 'Pyramiding disabled, only initial position will be executed', - 'signal-robot.risk.alert': 'Configure take profit, stop loss and exit rules', - 'signal-robot.risk.stopLossTitle': 'Stop Loss', - 'signal-robot.risk.stopLossEnabled': 'Enabled', - 'signal-robot.risk.stopLossDisabled': 'Disabled', - 'signal-robot.risk.stopLossType': 'Stop Loss Type', - 'signal-robot.risk.stopLossFixedPct': 'Fixed Percentage', - 'signal-robot.risk.stopLossAtrMultiplier': 'ATR Multiplier', - 'signal-robot.risk.stopLossValue': 'Value', - 'signal-robot.risk.stopLossFixedHint': 'e.g. 2%: stop loss when loss reaches 2%', - 'signal-robot.risk.stopLossAtrHint': 'e.g. 2.0: stop loss when price touches ATR*2.0', - 'signal-robot.risk.stopLossDisabledHint': 'Stop loss disabled (high risk)', - 'signal-robot.risk.trailingStopTitle': 'Trailing Stop', - 'signal-robot.risk.activationProfit': 'Activation Profit (%)', - 'signal-robot.risk.activationProfitHint': 'Start trailing when profit reaches this level', - 'signal-robot.risk.callbackPct': 'Callback (%)', - 'signal-robot.risk.callbackPctHint': 'Trigger take profit when price falls from peak by this percentage', - 'signal-robot.risk.trailingStopDisabledHint': 'Trailing stop disabled', - 'signal-robot.risk.otherExitTitle': 'Other Exit Rules', - 'signal-robot.risk.signalExit': 'Allow Signal Exit', - 'signal-robot.risk.signalExitHint': 'Close position immediately when reverse signal appears (e.g. close long when short signal appears)', - 'signal-robot.notify.alert': 'Configure notification methods when signal is triggered', - 'signal-robot.notify.channelTitle': 'Notification Channels', - 'signal-robot.notify.discordWebhook': 'Discord Webhook', - 'signal-robot.notify.genericWebhook': 'Generic Webhook', - 'signal-robot.notify.webhookUrl': 'Webhook URL', - 'signal-robot.notify.webhookUrlPlaceholder': 'https://example.com/webhook', - 'signal-robot.notify.discordUrl': 'Discord URL', - 'signal-robot.notify.discordUrlPlaceholder': 'https://discord.com/api/webhooks/...', - 'signal-robot.operator.greaterThan': 'Greater Than', - 'signal-robot.operator.lessThan': 'Less Than', - 'signal-robot.operator.equal': 'Equal', - 'signal-robot.operator.goldenCross': 'Golden Cross', - 'signal-robot.operator.deathCross': 'Death Cross', - 'signal-robot.operator.increaseBy': 'Increase By', - 'signal-robot.operator.decreaseBy': 'Decrease By', - 'signal-robot.indicator.price': 'Price', - 'signal-robot.indicator.rsi': 'RSI', - 'signal-robot.indicator.kdjK': 'KDJ(K)', - 'signal-robot.indicator.kdjJ': 'KDJ(J)', - 'signal-robot.indicator.macd': 'MACD', - 'signal-robot.indicator.macdHist': 'MACD Histogram', - 'signal-robot.indicator.bollingerUp': 'Bollinger Upper', - 'signal-robot.indicator.bollingerLow': 'Bollinger Lower', - 'signal-robot.indicator.volume': 'Volume', - 'signal-robot.indicator.changePct1h': '1H Change %', - 'signal-robot.indicator.changePct24h': '24H Change %', - 'signal-robot.indicator.signalLine': 'Signal Line', - - // Settings (Memory/Reflection) - 'settings.group.agent_memory': '記憶/反省設定', - 'settings.group.reflection_worker': '自動反省検証ワーカー', - 'settings.field.ENABLE_AGENT_MEMORY': 'エージェント記憶を有効化', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'ベクトル検索を有効化(ローカル)', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': '埋め込み次元', - 'settings.field.AGENT_MEMORY_TOP_K': 'Top-K 取得数', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': '候補ウィンドウサイズ', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': '時間減衰の半減期(日)', - 'settings.field.AGENT_MEMORY_W_SIM': '類似度重み', - 'settings.field.AGENT_MEMORY_W_RECENCY': '新しさ重み', - 'settings.field.AGENT_MEMORY_W_RETURNS': '収益重み', - 'settings.field.ENABLE_REFLECTION_WORKER': '自動検証を有効化', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': '検証間隔(秒)' -} - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/ko-KR.js b/quantdinger_vue/src/locales/lang/ko-KR.js deleted file mode 100644 index fbb3a82..0000000 --- a/quantdinger_vue/src/locales/lang/ko-KR.js +++ /dev/null @@ -1,1794 +0,0 @@ -import antdKoKR from 'ant-design-vue/es/locale-provider/ko_KR' -import momentKO from 'moment/locale/ko' - -const components = { - antLocale: antdKoKR, - momentName: 'ko', - momentLocale: momentKO -} -const locale = { - 'submit': '제출', - 'save': '저장', - 'submit.ok': '제출 성공', - 'save.ok': '성공적으로 저장되었습니다', - 'menu.welcome': '환영합니다', - 'menu.home': '홈페이지', - 'menu.dashboard': '대시보드', - 'menu.dashboard.indicator': '지표분석', - 'menu.dashboard.community': '지표 커뮤니티', - 'menu.dashboard.analysis': 'AI 분석', - 'menu.dashboard.tradingAssistant': '트레이딩 어시스턴트', - 'menu.dashboard.aiTradingAssistant': 'AI 트레이딩 도우미', - 'menu.dashboard.signalRobot': '시그널 로봇', - 'menu.dashboard.monitor': '모니터링 페이지', - 'menu.dashboard.workplace': '작업대', - 'menu.form': '양식 페이지', - 'menu.form.basic-form': '기본 형태', - 'menu.form.step-form': '단계별 양식', - 'menu.form.step-form.info': '단계별 양식(이체 정보 입력)', - 'menu.form.step-form.confirm': '단계별 양식(이체정보 확인)', - 'menu.form.step-form.result': '단계별 양식(완료)', - 'menu.form.advanced-form': '고급 양식', - 'menu.list': '목록 페이지', - 'menu.list.table-list': '문의 양식', - 'menu.list.basic-list': '표준 목록', - 'menu.list.card-list': '카드 목록', - 'menu.list.search-list': '검색 목록', - 'menu.list.search-list.articles': '검색 목록(기사)', - 'menu.list.search-list.projects': '검색 목록(프로젝트)', - 'menu.list.search-list.applications': '검색 목록(앱)', - 'menu.profile': '세부정보 페이지', - 'menu.profile.basic': '기본 세부정보 페이지', - 'menu.profile.advanced': '고급 세부정보 페이지', - 'menu.result': '결과 페이지', - 'menu.result.success': '성공 페이지', - 'menu.result.fail': '실패 페이지', - 'menu.exception': '예외 페이지', - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': '트리거 오류', - 'menu.account': '개인 페이지', - 'menu.account.center': '개인 센터', - 'menu.account.settings': '개인 설정', - 'menu.account.trigger': '트리거 오류', - 'menu.account.logout': '로그아웃', - 'menu.wallet': '내 지갑', - 'menu.docs': '문서 센터', - 'menu.docs.detail': '문서 세부정보', - 'menu.header.refreshPage': '페이지 새로 고침', - 'menu.invite.friends': '친구 초대', - 'app.setting.pagestyle': '전반적인 스타일 설정', - 'app.setting.pagestyle.light': '밝은 메뉴 스타일', - 'app.setting.pagestyle.dark': '어두운 메뉴 스타일', - 'app.setting.pagestyle.realdark': '다크 모드', - 'app.setting.themecolor': '테마 색상', - 'app.setting.navigationmode': '탐색 모드', - 'app.setting.sidemenu.nav': '사이드바 탐색', - 'app.setting.topmenu.nav': '상단 표시줄 탐색', - 'app.setting.content-width': '콘텐츠 영역 너비', - 'app.setting.content-width.tooltip': '이 설정은 [상단 표시줄 탐색]인 경우에만 유효합니다.', - 'app.setting.content-width.fixed': '고정', - 'app.setting.content-width.fluid': '스트리밍', - 'app.setting.fixedheader': '고정 헤더', - 'app.setting.fixedheader.tooltip': '헤더 고정 시 구성 가능', - 'app.setting.autoHideHeader': '스크롤할 때 헤더 숨기기', - 'app.setting.fixedsidebar': '사이드 메뉴 고정', - 'app.setting.sidemenu': '사이드 메뉴 레이아웃', - 'app.setting.topmenu': '상단 메뉴 레이아웃', - 'app.setting.othersettings': '기타 설정', - 'app.setting.weakmode': '색약 모드', - 'app.setting.multitab': '멀티탭 모드', - 'app.setting.copy': '설정 복사', - 'app.setting.loading': '테마 로드 중', - 'app.setting.copyinfo': '설정을 성공적으로 복사했습니다. src/config/defaultSettings.js', - 'app.setting.copy.success': '복사 완료', - 'app.setting.copy.fail': '복사 실패', - 'app.setting.theme.switching': '테마 변경!', - 'app.setting.production.hint': '구성 표시줄은 개발 환경에서 미리 보기에만 사용되며 프로덕션 환경에서는 표시되지 않습니다. 구성 파일을 수동으로 복사하고 수정하십시오.', - 'app.setting.themecolor.daybreak': '새벽 파란색(기본값)', - 'app.setting.themecolor.dust': '황혼', - 'app.setting.themecolor.volcano': '화산', - 'app.setting.themecolor.sunset': '일몰', - 'app.setting.themecolor.cyan': '밍칭', - 'app.setting.themecolor.green': '오로라 그린', - 'app.setting.themecolor.geekblue': '긱 블루', - 'app.setting.themecolor.purple': '장쯔(Jiang Zi)', - 'app.setting.tooltip': '페이지 설정', - 'user.login.userName': '사용자 이름', - 'user.login.password': '비밀번호', - 'user.login.username.placeholder': '계정: 관리자', - 'user.login.password.placeholder': '비밀번호: admin 또는 ant.design', - 'user.login.message-invalid-credentials': '로그인에 실패했습니다. 이메일과 인증 코드를 확인하세요.', - 'user.login.message-invalid-verification-code': '인증코드 오류', - 'user.login.tab-login-credentials': '계정 비밀번호 로그인', - 'user.login.tab-login-email': '이메일 로그인', - 'user.login.tab-login-mobile': '휴대폰번호 로그인', - 'user.login.captcha.placeholder': '그래픽 인증 코드를 입력하세요.', - 'user.login.mobile.placeholder': '휴대전화번호', - 'user.login.mobile.verification-code.placeholder': '인증코드', - 'user.login.email.placeholder': '이메일 주소를 입력해주세요', - 'user.login.email.verification-code.placeholder': '인증번호를 입력해주세요', - 'user.login.email.sending': '인증코드가 전송되는 중입니다...', - 'user.login.email.send-success-title': '팁', - 'user.login.email.send-success': '인증코드가 성공적으로 전송되었습니다. 이메일을 확인해 주세요.', - 'user.login.sms.send-success': '인증번호가 성공적으로 전송되었습니다. 문자 메시지를 확인하세요.', - 'user.login.remember-me': '자동 로그인', - 'user.login.forgot-password': '비밀번호를 잊으셨나요?', - 'user.login.sign-in-with': '기타 로그인 방법', - 'user.login.signup': '계정 등록', - 'user.login.login': '로그인', - 'user.register.register': '등록', - 'user.register.email.placeholder': '이메일', - 'user.register.password.placeholder': '6자 이상 입력해주세요. 쉽게 추측할 수 있는 비밀번호는 사용하지 마세요.', - 'user.register.password.popover-message': '6자 이상 입력해주세요. 쉽게 추측할 수 있는 비밀번호는 사용하지 마세요.', - 'user.register.confirm-password.placeholder': '비밀번호 확인', - 'user.register.get-verification-code': '인증 코드 받기', - 'user.register.sign-in': '기존 계정을 사용하여 로그인', - 'user.register-result.msg': '귀하의 계정: {email} 등록이 완료되었습니다.', - 'user.register-result.activation-email': '활성화 이메일이 귀하의 사서함으로 전송되었으며 24시간 동안 유효합니다. 귀하의 이메일에 즉시 로그인하고 이메일에 있는 링크를 클릭하여 계정을 활성화하십시오.', - 'user.register-result.back-home': '홈페이지로 돌아가기', - 'user.register-result.view-mailbox': '우편함을 확인하세요', - 'user.email.required': '이메일 주소를 입력해주세요!', - 'user.email.wrong-format': '이메일 주소 형식이 잘못되었습니다!', - 'user.userName.required': '계정 이름이나 이메일 주소를 입력하세요', - 'user.password.required': '비밀번호를 입력해주세요!', - 'user.password.twice.msg': '두 번 입력한 비밀번호가 일치하지 않습니다!', - 'user.password.strength.msg': '비밀번호가 충분히 강력하지 않습니다.', - 'user.password.strength.strong': '힘: 강한', - 'user.password.strength.medium': '강도: 중간', - 'user.password.strength.low': '강도: 낮음', - 'user.password.strength.short': '강도: 너무 짧음', - 'user.confirm-password.required': '비밀번호를 확인해 주세요!', - 'user.phone-number.required': '정확한 휴대폰번호를 입력해주세요', - 'user.phone-number.wrong-format': '휴대폰 번호 형식이 잘못되었습니다!', - 'user.verification-code.required': '인증번호를 입력해주세요!', - 'user.captcha.required': '그래픽 인증코드를 입력해주세요!', - 'user.login.infos': 'QuantDinger는 AI 멀티에이전트 주식 분석 보조 도구로 증권 투자 컨설팅 자격이 없습니다. 플랫폼 내 모든 분석 결과, 점수, 참고 의견은 과거 데이터를 기반으로 AI에 의해 자동으로 생성되며 학습, 연구 및 기술 교류에만 사용되며 투자 조언이나 의사 결정 기반을 구성하지 않습니다. 주식투자에는 시장리스크, 유동성리스크, 정책리스크 등 다양한 리스크가 수반되며, 이로 인해 원금 손실이 발생할 수 있습니다. 사용자는 자신의 위험 허용 범위에 따라 독립적인 결정을 내려야 하며, 이 도구의 사용으로 인해 발생하는 모든 투자 행위 및 결과는 사용자가 부담해야 합니다. 시장은 위험하므로 투자에 신중해야 합니다.', - 'user.login.tab-login-web3': 'Web3 로그인', - 'user.login.web3.tip': '지갑을 이용한 서명 로그인', - 'user.login.web3.connect': '지갑을 연결하고 로그인하세요', - 'user.login.web3.no-wallet': '지갑이 감지되지 않음', - 'user.login.web3.no-address': '지갑 주소를 가져오지 못했습니다.', - 'user.login.web3.nonce-failed': '난수를 가져오지 못했습니다.', - 'user.login.web3.verify-failed': '서명 확인 실패', - 'user.login.web3.success': '로그인 성공', - 'user.login.web3.failed': '지갑 로그인 실패', - 'nav.no_wallet': '지갑이 감지되지 않음', - 'nav.copy': '복사', - 'nav.copy_success': '성공적으로 복사되었습니다', - 'user.login.oauth.google': 'Google로 로그인', - 'user.login.oauth.github': 'GitHub로 로그인', - 'user.login.oauth.loading': '승인 페이지로 리디렉션 중...', - 'user.login.oauth.failed': 'OAuth 로그인 실패', - 'user.login.oauth.get-url-failed': '승인 링크를 얻지 못했습니다.', - 'user.login.subtitle': '글로벌 시장에 대한 정량적 통찰력 확보', - 'user.login.legal.title': '법적 고지 사항', - 'user.login.legal.view': '법적 고지사항 보기', - 'user.login.legal.collapse': '법적 면책조항 접기', - 'user.login.legal.agree': '법적 고지 사항을 읽었으며 이에 동의합니다.', - 'user.login.legal.required': '먼저 법적 고지 사항을 읽고 확인하십시오.', - 'user.login.legal.content': 'QuantDinger는 AI 멀티에이전트 주식 분석 보조 도구로 증권 투자 컨설팅 자격이 없습니다. 플랫폼 내 모든 분석 결과, 등급, 참고 의견은 과거 데이터를 기반으로 AI에 의해 자동으로 생성되며 학습, 연구 및 기술 교류에만 사용되며 투자 조언이나 의사 결정 기반을 구성하지 않습니다. 주식투자에는 시장리스크, 유동성리스크, 정책리스크 등 다양한 리스크가 수반되며, 이로 인해 원금 손실이 발생할 수 있습니다. 사용자는 자신의 위험 허용 범위에 따라 독립적인 결정을 내려야 하며, 이 도구의 사용으로 인해 발생하는 모든 투자 행위 및 결과는 사용자가 부담해야 합니다. 시장은 위험하므로 투자에 신중해야 합니다.', - 'user.login.privacy.title': '사용자 개인 정보 보호 정책', - 'user.login.privacy.view': '사용자 개인 정보 보호 정책 보기', - 'user.login.privacy.collapse': '사용자 개인정보 보호 약관 닫기', - 'user.login.privacy.content': '우리는 귀하의 개인 정보 보호와 데이터 보호를 중요하게 생각합니다. 1) 수집 범위 : 기능 구현에 꼭 필요한 정보(이메일, 휴대전화번호, 지역번호, Web3 지갑 주소 등)와 필수 로그, 기기정보만 수집합니다. 2) 이용 목적: 계정 로그인 및 보안 확인, 서비스 기능 제공, 문제 해결 및 규정 준수 요구 사항. 3) 저장 및 보안: 데이터는 암호화되어 저장되며, 무단 접근, 공개 또는 손실을 방지하기 위해 필요한 권한 및 접근 제어 조치가 취해집니다. 4) 제3자와의 공유: 법률 및 규정에 의해 요구되거나 서비스 수행에 필요한 경우를 제외하고, 귀하의 개인정보는 제3자와 공유되지 않습니다. 제3자 서비스(예: 지갑, SMS 서비스 제공업체)가 관련된 경우 해당 기능을 구현하는 데 필요한 최소한의 범위에서만 처리됩니다. 5) 쿠키/로컬 저장소: 로그인 상태 및 필요한 세션 유지 관리(예: 토큰, PHPSESSID)에 사용되며 브라우저에서 이를 삭제하거나 제한할 수 있습니다. 6) 개인권리 : 귀하는 법령에 따른 조회, 정정, 삭제, 동의철회 등의 권리를 행사할 수 있습니다. 7) 변경 및 공지: 본 약관이 업데이트되면 페이지에 눈에 띄게 표시됩니다. 본 서비스를 계속 이용하시면 업데이트된 내용을 읽고 동의하신 것으로 간주됩니다. 본 약관 또는 그에 대한 업데이트에 동의하지 않는 경우 서비스 사용을 중단하고 당사에 문의하십시오.', - 'account.basicInfo': '기본정보', - 'account.id': '사용자 ID', - 'account.username': '사용자 이름', - 'account.nickname': '닉네임', - 'account.email': '이메일', - 'account.mobile': '휴대전화번호', - 'account.web3address': '지갑 주소', - 'account.pid': '추천인 ID', - 'account.level': '사용자 수준', - 'account.money': '균형', - 'account.qdtBalance': 'QDT 잔액', - 'account.score': '포인트', - 'account.createtime': '등록 시간', - 'account.inviteLink': '초대링크', - 'account.recharge': '재충전', - 'account.rechargeTip': '충전하려면 WeChat 또는 Alipay를 사용하여 아래 QR 코드를 스캔하세요.', - 'account.qrCodePlaceholder': 'QR 코드 자리 표시자(에뮬레이션)', - 'account.rechargeAmount': '충전금액', - 'account.enterAmount': '충전금액을 입력해주세요', - 'account.rechargeHint': '최소 입금액: 1 QDT', - 'account.confirmRecharge': '충전 확인', - 'account.enterValidAmount': '유효한 충전 금액을 입력하세요.', - 'account.rechargeSuccess': '재충전 성공! {amount} QDT 입금', - 'account.settings.menuMap.basic': '기본 설정', - 'account.settings.menuMap.security': '보안 설정', - 'account.settings.menuMap.notification': '새 메시지 알림', - 'account.settings.menuMap.moneyLog': '기금 세부정보', - 'account.moneyLog.empty': '아직 펀드 세부정보가 없습니다.', - 'account.moneyLog.total': '총 {total}개 기록', - 'account.moneyLog.type.purchase': '매수 지표', - 'account.moneyLog.type.recharge': '재충전', - 'account.moneyLog.type.refund': '환불', - 'account.moneyLog.type.reward': '보상', - 'account.moneyLog.type.income': '지표소득', - 'account.moneyLog.type.commission': '플랫폼 취급 수수료', - 'wallet.balance': 'QDT 잔액', - 'wallet.recharge': '재충전', - 'wallet.withdraw': '현금 인출', - 'wallet.filter': '필터', - 'wallet.reset': '재설정', - 'wallet.totalRecharge': '누적 충전', - 'wallet.totalWithdraw': '누적 출금', - 'wallet.totalIncome': '누적 수입', - 'wallet.records': '거래기록 및 자금내역', - 'wallet.tradingRecords': '거래 내역', - 'wallet.moneyLog': '기금 세부정보', - 'wallet.rechargeTip': '충전하려면 WeChat 또는 Alipay를 사용하여 아래 QR 코드를 스캔하세요.', - 'wallet.qrCodePlaceholder': 'QR 코드 자리 표시자(에뮬레이션)', - 'wallet.rechargeAmount': '충전금액', - 'wallet.enterAmount': '충전금액을 입력해주세요', - 'wallet.rechargeHint': '최소 입금액: 1 QDT', - 'wallet.confirmRecharge': '충전 확인', - 'wallet.enterValidAmount': '유효한 충전 금액을 입력하세요.', - 'wallet.rechargeSuccess': '재충전 성공! {amount} QDT 입금', - 'wallet.rechargeFailed': '재충전 실패', - 'wallet.withdrawTip': '출금금액과 출금주소를 입력해주세요', - 'wallet.withdrawAmount': '출금금액', - 'wallet.enterWithdrawAmount': '출금금액을 입력해주세요', - 'wallet.withdrawHint': '최소 출금 금액: 1 QDT', - 'wallet.withdrawAddress': '출금주소(선택)', - 'wallet.enterWithdrawAddress': '출금주소를 입력해주세요', - 'wallet.confirmWithdraw': '출금 확인', - 'wallet.enterValidWithdrawAmount': '유효한 인출 금액을 입력하세요.', - 'wallet.insufficientBalance': '잔액 부족', - 'wallet.withdrawSuccess': '출금 성공! 인출된 {금액} QDT', - 'wallet.withdrawFailed': '출금 실패', - 'wallet.noTradingRecords': '아직 거래기록이 없습니다', - 'wallet.noMoneyLog': '아직 펀드 세부정보가 없습니다.', - 'wallet.loadTradingRecordsFailed': '거래 기록을 로드하지 못했습니다.', - 'wallet.loadMoneyLogFailed': '자금 세부정보를 로드하지 못했습니다.', - 'wallet.moneyLogTotal': '총 {total}개 기록', - 'wallet.moneyLogTypeTitle': '유형', - 'wallet.moneyLogType.all': '모든 유형', - 'wallet.table.time': '시간', - 'wallet.table.type': '유형', - 'wallet.table.price': '가격', - 'wallet.table.amount': '수량', - 'wallet.table.money': '금액', - 'wallet.table.balance': '균형', - 'wallet.table.memo': '비고', - 'wallet.table.value': '가치', - 'wallet.table.profit': '이익과 손실', - 'wallet.table.commission': '취급 수수료', - 'wallet.table.total': '총 {total}개 기록', - 'wallet.tradeType.buy': '사다', - 'wallet.tradeType.sell': '팔다', - 'wallet.tradeType.liquidation': '강제청산', - 'wallet.tradeType.openLong': '길게 열다', - 'wallet.tradeType.addLong': '가돗', - 'wallet.tradeType.closeLong': '핀듀오', - 'wallet.tradeType.closeLongStop': '손실을 멈추고 오랫동안', - 'wallet.tradeType.closeLongProfit': '이익을 얻고 더 많은 레벨을 올리세요', - 'wallet.tradeType.openShort': '오픈 쇼트', - 'wallet.tradeType.addShort': '짧게 추가하다', - 'wallet.tradeType.closeShort': '비어 있음', - 'wallet.tradeType.closeShortStop': '손실 중지', - 'wallet.tradeType.closeShortProfit': '이익을 얻고 공매도 마감', - 'wallet.moneyLogType.purchase': '매수 지표', - 'wallet.moneyLogType.recharge': '재충전', - 'wallet.moneyLogType.withdraw': '현금 인출', - 'wallet.moneyLogType.refund': '환불', - 'wallet.moneyLogType.reward': '보상', - 'wallet.moneyLogType.income': '소득', - 'wallet.moneyLogType.commission': '취급 수수료', - 'wallet.web3Address.required': '먼저 Web3 지갑 주소를 입력해주세요', - 'wallet.web3Address.requiredDescription': '충전하기 전에 Web3 지갑 주소를 바인딩해야 충전을 받을 수 있습니다.', - 'wallet.web3Address.placeholder': 'Web3 지갑 주소(0x로 시작)를 입력하세요.', - 'wallet.web3Address.save': '지갑 주소 저장', - 'wallet.web3Address.saveSuccess': '지갑 주소가 성공적으로 저장되었습니다', - 'wallet.web3Address.saveFailed': '지갑 주소 저장 실패', - 'wallet.web3Address.invalidFormat': '유효한 Web3 지갑 주소를 입력하세요. (이더리움 형식: 0x로 시작하는 42자 또는 TRC20 형식: T로 시작하는 34자)', - 'wallet.selectCoin': '통화 선택', - 'wallet.selectChain': '선택 체인', - 'wallet.chain.eth': 'ETH(ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'BSC', - 'wallet.targetQdtAmount': '상환하려는 QDT 금액(선택 사항)', - 'wallet.targetQdtAmount.placeholder': '상환하려는 QDT 수량, 현재 QDT 가격을 입력하세요: {price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': '재충전 필요: {amount} USDT', - 'wallet.rechargeAddress': '충전 주소', - 'wallet.copyAddress': '복사', - 'wallet.copySuccess': '성공적으로 복사되었습니다!', - 'wallet.copyFailed': '복사하지 못했습니다. 수동으로 복사하세요.', - 'wallet.rechargeAddressHint': '이 주소에 {coin}을 입금하려면 반드시 {chain}을 사용하세요.', - 'wallet.qdtPrice.loading': '로드 중...', - 'wallet.rechargeTip.new': '통화와 체인을 선택한 후 아래 QR 코드를 스캔하여 충전하세요.', - 'wallet.exchangeRate': '1 QDT ≒ {rate} USDT', - 'wallet.withdrawableAmount': '사용 가능한 현금 금액', - 'wallet.totalBalance': '총 잔액', - 'wallet.insufficientWithdrawable': '출금 가능한 현금 금액이 부족합니다. 현재 인출할 수 있는 금액은 다음과 같습니다: {amount} QDT', - 'wallet.withdrawAddressRequired': '출금주소를 입력해주세요', - 'wallet.withdrawAddressHint': '주소가 올바른지 확인하십시오. 탈퇴 후에는 취소가 불가능합니다.', - 'wallet.withdrawSubmitSuccess': '철회 신청서가 성공적으로 제출되었습니다. 검토를 기다려 주세요.', - 'menu.footer.contactUs': '문의하기', - 'menu.footer.getSupport': '지원 받기', - 'menu.footer.socialAccounts': '소셜 계정', - 'menu.footer.userAgreement': '사용자 계약', - 'menu.footer.privacyPolicy': '개인 정보 보호 정책', - 'menu.footer.support': '지원', - 'menu.footer.featureRequest': '기능 요청', - 'menu.footer.email': '이메일', - 'menu.footer.liveChat': '연중무휴 라이브 채팅', - 'dashboard.analysis.title': '다차원 분석', - 'dashboard.analysis.subtitle': 'AI 기반 종합재무분석 플랫폼', - 'dashboard.analysis.selectSymbol': '기본 코드 선택 또는 입력', - 'dashboard.analysis.selectModel': '모델 선택', - 'dashboard.analysis.startAnalysis': '분석 시작', - 'dashboard.analysis.history': '역사', - 'dashboard.analysis.tab.overview': '종합적인 분석', - 'dashboard.analysis.tab.fundamental': '기초', - 'dashboard.analysis.tab.technical': '기술', - 'dashboard.analysis.tab.news': '뉴스', - 'dashboard.analysis.tab.sentiment': '감정', - 'dashboard.analysis.tab.risk': '위험', - 'dashboard.analysis.tab.debate': '길고 짧은 논쟁', - 'dashboard.analysis.tab.decision': '최종 결정', - 'dashboard.analysis.empty.selectSymbol': '분석을 시작하려면 대상을 선택하세요.', - 'dashboard.analysis.empty.selectSymbolDesc': '자체 선택한 주식 목록에서 선택하거나 기본 코드를 입력하여 다차원 AI 분석 보고서를 얻습니다.', - 'dashboard.analysis.empty.startAnalysis': '다차원 분석을 수행하려면 "분석 시작" 버튼을 클릭하세요.', - 'dashboard.analysis.empty.startAnalysisDesc': '펀더멘털, 기술, 뉴스, 정서, 리스크 등 다차원에서 종합적인 분석을 제공해드립니다.', - 'dashboard.analysis.empty.noData': '현재 {type} 분석 데이터가 없습니다. 먼저 종합적인 분석을 수행해 주세요.', - 'dashboard.analysis.empty.noWatchlist': '현재 자체선택한 종목이 없습니다.', - 'dashboard.analysis.empty.noHistory': '아직 기록이 없습니다.', - 'dashboard.analysis.empty.watchlistHint': '현재 자체 선택한 주식이 없습니다. 먼저 문의해 주세요.', - 'dashboard.analysis.empty.noDebateData': '아직 토론 데이터가 없습니다.', - 'dashboard.analysis.empty.noDecisionData': '아직 결정 데이터가 없습니다.', - 'dashboard.analysis.empty.selectAgent': '분석 결과를 보려면 에이전트를 선택하세요.', - 'dashboard.analysis.loading.analyzing': '분석 중입니다. 잠시 기다려 주세요...', - 'dashboard.analysis.loading.fundamental': '기본 데이터 분석 중...', - 'dashboard.analysis.loading.technical': '기술 지표 분석 중...', - 'dashboard.analysis.loading.news': '뉴스 데이터 분석 중...', - 'dashboard.analysis.loading.sentiment': '시장 심리 분석 중…', - 'dashboard.analysis.loading.risk': '위험 평가 중...', - 'dashboard.analysis.loading.debate': '롱숏 논쟁이 진행중인데..', - 'dashboard.analysis.loading.decision': '최종 결정을 내리는 중...', - 'dashboard.analysis.score.overall': '종합평가', - 'dashboard.analysis.score.recommendation': '투자 조언', - 'dashboard.analysis.score.confidence': '자신감', - 'dashboard.analysis.dimension.fundamental': '기초', - 'dashboard.analysis.dimension.technical': '기술', - 'dashboard.analysis.dimension.news': '뉴스', - 'dashboard.analysis.dimension.sentiment': '감정', - 'dashboard.analysis.dimension.risk': '위험', - 'dashboard.analysis.card.dimensionScores': '각 차원에 대한 평가', - 'dashboard.analysis.card.overviewReport': '종합분석보고서', - 'dashboard.analysis.card.financialMetrics': '재무 지표', - 'dashboard.analysis.card.fundamentalReport': '기초분석 보고서', - 'dashboard.analysis.card.technicalIndicators': '기술 지표', - 'dashboard.analysis.card.technicalReport': '기술적 분석 보고서', - 'dashboard.analysis.card.newsList': '관련 뉴스', - 'dashboard.analysis.card.newsReport': '뉴스 분석 보고서', - 'dashboard.analysis.card.sentimentIndicators': '감정 지표', - 'dashboard.analysis.card.sentimentReport': '감정 분석 보고서', - 'dashboard.analysis.card.riskMetrics': '위험 지표', - 'dashboard.analysis.card.riskReport': '위험 평가 보고서', - 'dashboard.analysis.card.bullView': '강세 전망(강세)', - 'dashboard.analysis.card.bearView': '약세 전망 (곰)', - 'dashboard.analysis.card.researchConclusion': '연구원의 결론', - 'dashboard.analysis.card.traderPlan': '상인 계획', - 'dashboard.analysis.card.riskDebate': '위험위원회 토론', - 'dashboard.analysis.card.finalDecision': '최종 결정', - 'dashboard.analysis.card.tradePlanDetail': '거래 계획 세부정보', - 'dashboard.analysis.tradingPlan.entry_price': '입장료', - 'dashboard.analysis.tradingPlan.position_size': '위치 크기', - 'dashboard.analysis.tradingPlan.stop_loss': '손실을 막다', - 'dashboard.analysis.tradingPlan.take_profit': '이익을 얻으세요', - 'dashboard.analysis.label.confidence': '자신감', - 'dashboard.analysis.label.keyPoints': '핵심 포인트', - 'dashboard.analysis.label.riskWarning': '위험 경고', - 'dashboard.analysis.risk.risky': '위험하다', - 'dashboard.analysis.risk.neutral': '중립적 관점 (Neutral)', - 'dashboard.analysis.risk.safe': '보수적 관점(안전)', - 'dashboard.analysis.risk.conclusion': '결론', - 'dashboard.analysis.feature.fundamental': '기본적 분석', - 'dashboard.analysis.feature.technical': '기술적 분석', - 'dashboard.analysis.feature.news': '뉴스 분석', - 'dashboard.analysis.feature.sentiment': '감정 분석', - 'dashboard.analysis.feature.risk': '위험 평가', - 'dashboard.analysis.watchlist.title': '나의 주식 선택', - 'dashboard.analysis.watchlist.add': '추가하다', - 'dashboard.analysis.watchlist.addStock': '재고 추가', - 'dashboard.analysis.modal.addStock.title': '옵션 재고 추가', - 'dashboard.analysis.modal.addStock.confirm': '알았어', - 'dashboard.analysis.modal.addStock.cancel': '취소', - 'dashboard.analysis.modal.addStock.market': '시장 유형', - 'dashboard.analysis.modal.addStock.marketPlaceholder': '시장을 선택해주세요', - 'dashboard.analysis.modal.addStock.marketRequired': '시장 유형을 선택하세요.', - 'dashboard.analysis.modal.addStock.symbol': '주식 코드', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': '예: AAPL, TSLA, GOOGL, 000001, BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': '주식코드를 입력해주세요', - 'dashboard.analysis.modal.addStock.searchPlaceholder': '대상 코드 또는 이름 검색', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': '기본 코드를 검색하거나 입력하세요(예: AAPL, BTC/USDT, EUR/USD)', - 'dashboard.analysis.modal.addStock.searchOrInputHint': '데이터베이스에서 객체 검색 또는 코드 직접 입력 지원(시스템이 자동으로 이름을 얻음)', - 'dashboard.analysis.modal.addStock.search': '검색', - 'dashboard.analysis.modal.addStock.searchResults': '검색결과', - 'dashboard.analysis.modal.addStock.hotSymbols': '인기 있는 타겟', - 'dashboard.analysis.modal.addStock.noHotSymbols': '아직 인기 있는 타겟이 없습니다.', - 'dashboard.analysis.modal.addStock.selectedSymbol': '선택됨', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': '먼저 대상을 선택하세요.', - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': '대상을 선택하거나 대상 코드를 먼저 입력하세요', - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': '타겟코드를 입력해주세요', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': '먼저 시장 유형을 선택하세요.', - 'dashboard.analysis.modal.addStock.searchFailed': '검색에 실패했습니다. 나중에 다시 시도해 주세요.', - 'dashboard.analysis.modal.addStock.noSearchResults': '일치하는 대상이 없습니다.', - 'dashboard.analysis.modal.addStock.willAutoFetchName': '시스템에서 자동으로 이름을 가져옵니다.', - 'dashboard.analysis.modal.addStock.addDirectly': '직접 추가', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': '추가되면 이름이 자동으로 선택됩니다.', - 'dashboard.analysis.market.AShare': 'A주', - 'dashboard.analysis.market.USStock': '미국 주식', - 'dashboard.analysis.market.HShare': '홍콩 주식', - 'dashboard.analysis.market.Crypto': '암호화폐', - 'dashboard.analysis.market.Forex': '외환', - 'dashboard.analysis.market.Futures': '선물', - 'dashboard.analysis.modal.history.title': '역사적 분석 기록', - 'dashboard.analysis.modal.history.viewResult': '결과 보기', - 'dashboard.analysis.modal.history.completeTime': '완료 시간', - 'dashboard.analysis.modal.history.error': '오류', - 'dashboard.analysis.status.pending': '보류 중', - 'dashboard.analysis.status.processing': '처리', - 'dashboard.analysis.status.completed': '완료됨', - 'dashboard.analysis.status.failed': '실패했다', - 'dashboard.analysis.message.selectSymbol': '대상을 먼저 선택해주세요', - 'dashboard.analysis.message.taskCreated': '분석 작업이 생성되어 백그라운드에서 실행 중입니다...', - 'dashboard.analysis.message.analysisComplete': '분석 완료', - 'dashboard.analysis.message.analysisCompleteCache': '분석 완료(캐시된 데이터 활용)', - 'dashboard.analysis.message.analysisFailed': '분석에 실패했습니다. 나중에 다시 시도해 주세요.', - 'dashboard.analysis.message.addStockSuccess': '성공적으로 추가되었습니다', - 'dashboard.analysis.message.addStockFailed': '추가 실패', - 'dashboard.analysis.message.removeStockSuccess': '성공적으로 제거되었습니다', - 'dashboard.analysis.message.removeStockFailed': '제거 실패', - 'dashboard.analysis.message.resumingAnalysis': '분석 작업을 재개하는 중...', - 'dashboard.analysis.message.deleteSuccess': '성공적으로 삭제되었습니다', - 'dashboard.analysis.message.deleteFailed': '삭제 실패', - 'dashboard.analysis.modal.history.delete': '삭제', - 'dashboard.analysis.modal.history.deleteConfirm': '이 분석 기록을 삭제하시겠습니까?', - 'dashboard.analysis.test': '상점 번호 {no}, Gongzhuan Road', - 'dashboard.analysis.introduce': '표시기 설명', - 'dashboard.analysis.total-sales': '총매출', - 'dashboard.analysis.day-sales': '일평균 매출엔엔', - 'dashboard.analysis.visits': '방문', - 'dashboard.analysis.visits-trend': '트래픽 동향', - 'dashboard.analysis.visits-ranking': '매장 방문 순위', - 'dashboard.analysis.day-visits': '일일 방문', - 'dashboard.analysis.week': '매주 전년 대비', - 'dashboard.analysis.day': '전년 대비', - 'dashboard.analysis.payments': '결제 횟수', - 'dashboard.analysis.conversion-rate': '전환율', - 'dashboard.analysis.operational-effect': '운영활동 효과', - 'dashboard.analysis.sales-trend': '판매 동향', - 'dashboard.analysis.sales-ranking': '매장판매순위', - 'dashboard.analysis.all-year': '일년 내내', - 'dashboard.analysis.all-month': '이번 달', - 'dashboard.analysis.all-week': '이번 주', - 'dashboard.analysis.all-day': '오늘', - 'dashboard.analysis.search-users': '검색 사용자 수', - 'dashboard.analysis.per-capita-search': '1인당 검색량', - 'dashboard.analysis.online-top-search': '온라인 인기 검색어', - 'dashboard.analysis.the-proportion-of-sales': '판매 카테고리 비율', - 'dashboard.analysis.dropdown-option-one': '첫 번째 작전', - 'dashboard.analysis.dropdown-option-two': '작전 2', - 'dashboard.analysis.channel.all': '모든 채널', - 'dashboard.analysis.channel.online': '온라인', - 'dashboard.analysis.channel.stores': '저장', - 'dashboard.analysis.sales': '판매', - 'dashboard.analysis.traffic': '승객 흐름', - 'dashboard.analysis.table.rank': '순위', - 'dashboard.analysis.table.search-keyword': '키워드 검색', - 'dashboard.analysis.table.users': '사용자 수', - 'dashboard.analysis.table.weekly-range': '주간 증가', - 'dashboard.indicator.selectSymbol': '기본 코드 선택 또는 입력', - 'dashboard.indicator.emptyWatchlistHint': '현재 자체 선택한 주식이 없습니다. 먼저 추가해 주세요.', - 'dashboard.indicator.hint.selectSymbol': '분석을 시작하려면 대상을 선택하세요.', - 'dashboard.indicator.hint.selectSymbolDesc': 'K-라인 차트 및 기술 지표를 보려면 위 검색창에서 주식 코드를 선택하거나 입력하세요.', - 'dashboard.indicator.retry': '다시 시도하세요', - 'dashboard.indicator.panel.title': '기술 지표', - 'dashboard.indicator.panel.realtimeOn': '실시간 업데이트 끄기', - 'dashboard.indicator.panel.realtimeOff': '실시간 업데이트 활성화', - 'dashboard.indicator.panel.themeLight': '어두운 테마로 전환', - 'dashboard.indicator.panel.themeDark': '밝은 테마로 전환', - 'dashboard.indicator.section.enabled': '활성화됨', - 'dashboard.indicator.section.added': '내가 추가한 지표', - 'dashboard.indicator.section.custom': '직접 만든 지표', - 'dashboard.indicator.section.bought': '내가 구매한 지표', - 'dashboard.indicator.section.myCreated': '내가 만든 지표', - 'dashboard.indicator.empty': '아직 표시기가 없습니다. 먼저 표시기를 추가하거나 생성하세요.', - 'dashboard.indicator.buy': '매수 지표', - 'dashboard.indicator.action.start': '시작', - 'dashboard.indicator.action.stop': '닫기', - 'dashboard.indicator.action.edit': '편집', - 'dashboard.indicator.action.delete': '삭제', - 'dashboard.indicator.action.backtest': '백테스트', - 'dashboard.indicator.status.normal': '정상', - 'dashboard.indicator.status.normalPermanent': '일반(영구적으로 유효)', - 'dashboard.indicator.status.expired': '만료됨', - 'dashboard.indicator.expiry.permanent': '영구적으로 유효함', - 'dashboard.indicator.expiry.noExpiry': '만료 시간 없음', - 'dashboard.indicator.expiry.expired': '만료됨: {date}', - 'dashboard.indicator.expiry.expiresOn': '만료 시간: {date}', - 'dashboard.indicator.delete.confirmTitle': '삭제 확인', - 'dashboard.indicator.delete.confirmContent': '"{name}" 표시기를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.', - 'dashboard.indicator.delete.confirmOk': '삭제', - 'dashboard.indicator.delete.confirmCancel': '취소', - 'dashboard.indicator.delete.success': '성공적으로 삭제되었습니다', - 'dashboard.indicator.delete.failed': '삭제 실패', - 'dashboard.indicator.save.success': '성공적으로 저장되었습니다', - 'dashboard.indicator.save.failed': '저장 실패', - 'dashboard.indicator.error.loadWatchlistFailed': '옵션 재고를 로드하지 못했습니다.', - 'dashboard.indicator.error.chartNotReady': '차트 구성 요소가 초기화되지 않았습니다. 먼저 대상을 선택하고 차트가 로드될 때까지 기다려 주세요.', - 'dashboard.indicator.error.chartMethodNotReady': '차트 구성 요소 메서드가 준비되지 않았습니다. 나중에 다시 시도해 주세요.', - 'dashboard.indicator.error.chartExecuteNotReady': '차트 구성요소 실행 방법이 준비되지 않았습니다. 나중에 다시 시도해 주세요.', - 'dashboard.indicator.error.parseFailed': 'Python 코드를 구문 분석할 수 없습니다.', - 'dashboard.indicator.error.parseFailedCheck': 'Python 코드를 구문 분석할 수 없습니다. 코드 형식을 확인하세요.', - 'dashboard.indicator.error.addIndicatorFailed': '표시기를 추가하지 못했습니다.', - 'dashboard.indicator.error.runIndicatorFailed': '실행 표시기 실패', - 'dashboard.indicator.error.pleaseLogin': '먼저 로그인해주세요', - 'dashboard.indicator.error.loadDataFailed': '데이터 로딩 실패', - 'dashboard.indicator.error.loadDataFailedDesc': '네트워크 연결을 확인해주세요', - 'dashboard.indicator.error.pythonEngineFailed': 'Python 엔진을 로드하지 못했고 표시기 기능을 사용하지 못할 수 있습니다.', - 'dashboard.indicator.error.chartInitFailed': '차트 초기화 실패', - 'dashboard.indicator.warning.enterCode': '표시기 코드를 먼저 입력하세요.', - 'dashboard.indicator.warning.pyodideLoadFailed': 'Python 엔진을 로드하지 못했습니다.', - 'dashboard.indicator.warning.pyodideLoadFailedDesc': '현재 지역 또는 네트워크 환경에서는 이 기능을 사용할 수 없습니다.', - 'dashboard.indicator.warning.chartNotInitialized': '차트가 초기화되지 않아 선 그리기 도구를 사용할 수 없습니다.', - 'dashboard.indicator.success.runIndicator': '표시기가 성공적으로 실행됩니다.', - 'dashboard.indicator.success.clearDrawings': '모든 선화 삭제됨', - 'dashboard.indicator.sma': 'SMA(이동 평균 조합)', - 'dashboard.indicator.ema': 'EMA(지수 이동 평균 조합)', - 'dashboard.indicator.rsi': 'RSI(상대강도)', - 'dashboard.indicator.macd': 'MACD', - 'dashboard.indicator.bb': '볼린저 밴드', - 'dashboard.indicator.atr': 'ATR(평균 실제 범위)', - 'dashboard.indicator.cci': 'CCI(상품 채널 지수)', - 'dashboard.indicator.williams': 'Williams %R(윌리엄스 지표)', - 'dashboard.indicator.mfi': 'MFI(자금 흐름 지수)', - 'dashboard.indicator.adx': 'ADX(평균 추세 지수)', - 'dashboard.indicator.obv': 'OBV(에너지파)', - 'dashboard.indicator.adosc': 'ADOSC(누적/디스패치 오실레이터)', - 'dashboard.indicator.ad': 'AD(집적/분배선)', - 'dashboard.indicator.kdj': 'KDJ(확률적 지표)', - 'dashboard.indicator.signal.buy': '구매', - 'dashboard.indicator.signal.sell': '판매', - 'dashboard.indicator.signal.supertrendBuy': '슈퍼트렌드 구매', - 'dashboard.indicator.signal.supertrendSell': '슈퍼트렌드 매도', - 'dashboard.indicator.chart.kline': 'K라인', - 'dashboard.indicator.chart.volume': '볼륨', - 'dashboard.indicator.chart.uptrend': '상승 추세', - 'dashboard.indicator.chart.downtrend': '하락 추세', - 'dashboard.indicator.tooltip.time': '시간', - 'dashboard.indicator.tooltip.open': '열다', - 'dashboard.indicator.tooltip.close': '받다', - 'dashboard.indicator.tooltip.high': '높다', - 'dashboard.indicator.tooltip.low': '낮음', - 'dashboard.indicator.tooltip.volume': '볼륨', - 'dashboard.indicator.drawing.line': '선분', - 'dashboard.indicator.drawing.horizontalLine': '수평선', - 'dashboard.indicator.drawing.verticalLine': '수직선', - 'dashboard.indicator.drawing.ray': '레이', - 'dashboard.indicator.drawing.straightLine': '직선', - 'dashboard.indicator.drawing.parallelLine': '평행선', - 'dashboard.indicator.drawing.priceLine': '가격선', - 'dashboard.indicator.drawing.priceChannel': '가격 채널', - 'dashboard.indicator.drawing.fibonacciLine': '피보나치 라인', - 'dashboard.indicator.drawing.clearAll': '모든 선화 지우기', - 'dashboard.indicator.market.AShare': 'A주', - 'dashboard.indicator.market.USStock': '미국 주식', - 'dashboard.indicator.market.HShare': '홍콩 주식', - 'dashboard.indicator.market.Crypto': '암호화폐', - 'dashboard.indicator.market.Forex': '외환', - 'dashboard.indicator.market.Futures': '선물', - 'dashboard.indicator.create': '지표 생성', - 'dashboard.indicator.editor.title': '지표 생성/편집', - 'dashboard.indicator.editor.name': '지표 이름', - 'dashboard.indicator.editor.nameRequired': '지표 이름을 입력하세요.', - 'dashboard.indicator.editor.namePlaceholder': '지표 이름을 입력하세요.', - 'dashboard.indicator.editor.description': '표시기 설명', - 'dashboard.indicator.editor.descriptionPlaceholder': '표시기에 대한 설명을 입력하세요(선택 사항).', - 'dashboard.indicator.editor.code': '파이썬 코드', - 'dashboard.indicator.editor.codeRequired': '표시 코드를 입력하세요', - 'dashboard.indicator.editor.codePlaceholder': 'Python 코드를 입력하세요.', - 'dashboard.indicator.editor.run': '달리다', - 'dashboard.indicator.editor.runHint': '실행 버튼을 클릭하면 K-라인 차트의 지표 효과를 미리 볼 수 있습니다.', - 'dashboard.indicator.editor.guide': '개발 가이드', - 'dashboard.indicator.editor.guideTitle': 'Python 지표 개발 가이드', - 'dashboard.indicator.editor.save': '저장', - 'dashboard.indicator.editor.cancel': '취소', - 'dashboard.indicator.editor.unnamed': '이름 없는 표시기', - 'dashboard.indicator.editor.publishToCommunity': '커뮤니티에 게시', - 'dashboard.indicator.editor.publishToCommunityHint': '게시되면 다른 사용자가 커뮤니티에서 귀하의 지표를 보고 사용할 수 있습니다.', - 'dashboard.indicator.editor.indicatorType': '표시기 유형', - 'dashboard.indicator.editor.indicatorTypeRequired': '지표 유형을 선택하세요.', - 'dashboard.indicator.editor.indicatorTypePlaceholder': '지표 유형을 선택하세요.', - 'dashboard.indicator.editor.previewImage': '미리보기', - 'dashboard.indicator.editor.uploadImage': '사진 업로드', - 'dashboard.indicator.editor.previewImageHint': '권장 크기: 800x400, 2MB 이하', - 'dashboard.indicator.editor.pricing': '판매가(QDT)', - 'dashboard.indicator.editor.pricingType.free': '무료', - 'dashboard.indicator.editor.pricingType.permanent': '영구', - 'dashboard.indicator.editor.pricingType.monthly': '월별 결제', - 'dashboard.indicator.editor.price': '가격', - 'dashboard.indicator.editor.priceRequired': '가격을 입력해주세요', - 'dashboard.indicator.editor.pricePlaceholder': '가격을 입력해주세요', - 'dashboard.indicator.editor.pricingHint': '무료 지표의 가격은 0이지만 플랫폼은 지표 사용량과 칭찬률에 따라 보상(QDT)을 제공합니다.', - 'dashboard.indicator.editor.aiGenerate': '지능형 세대', - 'dashboard.indicator.editor.aiPromptPlaceholder': '당신의 아이디어를 알려주시면 Python 표시기 코드를 생성해 드리겠습니다.', - 'dashboard.indicator.editor.aiGenerateBtn': 'AI 생성 코드', - 'dashboard.indicator.editor.aiPromptRequired': '당신의 생각을 입력해주세요', - 'dashboard.indicator.editor.aiGenerateSuccess': '코드 생성 성공', - 'dashboard.indicator.editor.aiGenerateError': '코드 생성에 실패했습니다. 나중에 다시 시도해 주세요.', - 'dashboard.indicator.editor.verifyCode': '코드 검증', - 'dashboard.indicator.editor.verifyCodeSuccess': '검증 통과', - 'dashboard.indicator.editor.verifyCodeFailed': '검증 실패', - 'dashboard.indicator.editor.verifyCodeEmpty': '코드는 비워둘 수 없습니다', - 'dashboard.indicator.backtest.title': '지표 백테스트', - 'dashboard.indicator.backtest.config': '백테스트 매개변수', - 'dashboard.indicator.backtest.startDate': '시작일', - 'dashboard.indicator.backtest.endDate': '종료일', - 'dashboard.indicator.backtest.selectStartDate': '시작일 선택', - 'dashboard.indicator.backtest.selectEndDate': '종료일 선택', - 'dashboard.indicator.backtest.startDateRequired': '시작일을 선택하세요.', - 'dashboard.indicator.backtest.endDateRequired': '종료일을 선택하세요.', - 'dashboard.indicator.backtest.initialCapital': '초기자본금', - 'dashboard.indicator.backtest.initialCapitalRequired': '초기자금을 입력해주세요', - 'dashboard.indicator.backtest.commission': '수수료', - 'dashboard.indicator.backtest.leverage': '레버리지 비율', - 'dashboard.indicator.backtest.tradeDirection': '거래 방향', - 'dashboard.indicator.backtest.longOnly': '오래 가세요', - 'dashboard.indicator.backtest.shortOnly': '짧은', - 'dashboard.indicator.backtest.both': '양방향', - 'dashboard.indicator.backtest.run': '백테스팅 시작', - 'dashboard.indicator.backtest.rerun': '다시 백테스트', - 'dashboard.indicator.backtest.close': '닫기', - 'dashboard.indicator.backtest.running': '지표 백테스트 진행 중...', - 'dashboard.indicator.backtest.results': '백테스트 결과', - 'dashboard.indicator.backtest.totalReturn': '총 수익', - 'dashboard.indicator.backtest.annualReturn': '연간 소득', - 'dashboard.indicator.backtest.maxDrawdown': '최대 감소', - 'dashboard.indicator.backtest.sharpeRatio': '샤프비율', - 'dashboard.indicator.backtest.winRate': '승률', - 'dashboard.indicator.backtest.profitFactor': '손익 비율', - 'dashboard.indicator.backtest.totalTrades': '거래수', - 'dashboard.indicator.totalReturn': '총 수익', - 'dashboard.indicator.annualReturn': '연간 수익률', - 'dashboard.indicator.maxDrawdown': '최대 감소', - 'dashboard.indicator.sharpeRatio': '샤프비율', - 'dashboard.indicator.winRate': '승률', - 'dashboard.indicator.profitFactor': '손익 비율', - 'dashboard.indicator.totalTrades': '총 거래 수', - 'dashboard.indicator.backtest.totalCommission': '총 취급 수수료', - 'dashboard.indicator.backtest.equityCurve': '수익률 곡선', - 'dashboard.indicator.backtest.strategy': '지표소득', - 'dashboard.indicator.backtest.benchmark': '벤치마크 수익률', - 'dashboard.indicator.backtest.tradeHistory': '거래 내역', - 'dashboard.indicator.backtest.tradeTime': '시간', - 'dashboard.indicator.backtest.tradeType': '유형', - 'dashboard.indicator.backtest.buy': '사다', - 'dashboard.indicator.backtest.sell': '팔다', - 'dashboard.indicator.backtest.liquidation': '청산', - 'dashboard.indicator.backtest.openLong': '길게 열다', - 'dashboard.indicator.backtest.closeLong': '핀듀오', - 'dashboard.indicator.backtest.closeLongStop': '매수에 가까움(손절매)', - 'dashboard.indicator.backtest.closeLongProfit': '더 닫기 (이익 실현)', - 'dashboard.indicator.backtest.addLong': '롱 포지션 추가', - 'dashboard.indicator.backtest.openShort': '오픈 쇼트', - 'dashboard.indicator.backtest.closeShort': '비어 있음', - 'dashboard.indicator.backtest.closeShortStop': '청산(손절매)', - 'dashboard.indicator.backtest.closeShortProfit': '마감(이익실현)', - 'dashboard.indicator.backtest.addShort': '숏 포지션 추가', - 'dashboard.indicator.backtest.price': '가격', - 'dashboard.indicator.backtest.amount': '수량', - 'dashboard.indicator.backtest.balance': '계좌잔고', - 'dashboard.indicator.backtest.profit': '이익과 손실', - 'dashboard.indicator.backtest.success': '백테스트 완료', - 'dashboard.indicator.backtest.failed': '백테스트에 실패했습니다. 나중에 다시 시도해 주세요.', - 'dashboard.indicator.backtest.noIndicatorCode': '이 지표에 대한 백테스트 가능한 코드가 없습니다.', - 'dashboard.indicator.backtest.noSymbol': '거래대상을 먼저 선택해주세요', - 'dashboard.indicator.backtest.dateRangeExceeded': '백테스트 시간 범위가 한도를 초과합니다. {timeframe} 기간은 최대 {maxRange}까지 백테스트할 수 있습니다.', - 'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)', - 'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}', - 'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}', - 'dashboard.indicator.backtest.prev': 'Previous', - 'dashboard.indicator.backtest.next': 'Next', - 'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)', - 'dashboard.indicator.backtest.steps.strategy.title': 'Strategy', - 'dashboard.indicator.backtest.steps.strategy.desc': 'Position sizing & risk controls', - 'dashboard.indicator.backtest.steps.trading.title': 'Trading settings', - 'dashboard.indicator.backtest.steps.trading.desc': 'Time range, capital, fees, leverage', - 'dashboard.indicator.backtest.steps.results.title': 'Results', - 'dashboard.indicator.backtest.steps.results.desc': 'Backtest output', - 'dashboard.indicator.backtest.panel.risk': 'Risk management (SL/TP/Trailing)', - 'dashboard.indicator.backtest.panel.scale': 'Scale in / DCA (trend & mean-reversion)', - 'dashboard.indicator.backtest.panel.reduce': 'Reduce position (trend & adverse)', - 'dashboard.indicator.backtest.panel.position': 'Position sizing', - 'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)', - 'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)', - 'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit', - 'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)', - 'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)', - 'dashboard.indicator.backtest.field.slippage': 'Slippage (%)', - 'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in', - 'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion scale-in', - 'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.dcaAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.dcaAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce', - 'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)', - 'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times', - 'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)', - 'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)', - 'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)', - 'dashboard.indicator.backtest.reduceLong': 'Reduce Long', - 'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)', - 'dashboard.indicator.backtest.reduceShort': 'Reduce Short', - 'dashboard.docs.title': '문서 센터', - 'dashboard.docs.search.placeholder': '문서 검색...', - 'dashboard.docs.category.all': '모두', - 'dashboard.docs.category.guide': '개발 가이드', - 'dashboard.docs.category.api': 'API 문서', - 'dashboard.docs.category.tutorial': '튜토리얼', - 'dashboard.docs.category.faq': 'FAQ', - 'dashboard.docs.featured.title': '권장 문서', - 'dashboard.docs.featured.tag': '추천', - 'dashboard.docs.list.views': '찾아보기', - 'dashboard.docs.list.author': '작성자', - 'dashboard.docs.list.empty': '아직 문서가 없습니다.', - 'dashboard.docs.list.backToAll': '모든 문서로 돌아가기', - 'dashboard.docs.list.total': '총 {count}개의 문서', - 'dashboard.docs.detail.back': '문서 목록으로 돌아가기', - 'dashboard.docs.detail.updatedAt': '업데이트 날짜', - 'dashboard.docs.detail.related': '관련 문서', - 'dashboard.docs.detail.notFound': '문서가 존재하지 않습니다', - 'dashboard.docs.detail.error': '문서가 존재하지 않거나 삭제되었습니다.', - 'dashboard.docs.search.result': '검색결과', - 'dashboard.docs.search.keyword': '키워드', - 'community.filter.indicatorType': '표시기 유형', - 'community.filter.all': '모두', - 'community.filter.other': '기타 옵션', - 'community.filter.pricing': '가격 유형', - 'community.filter.allPricing': '모든 가격', - 'community.filter.sortBy': '정렬 기준', - 'community.filter.search': '검색', - 'community.filter.searchPlaceholder': '측정항목 이름 검색', - 'community.indicatorType.trend': '트렌드 유형', - 'community.indicatorType.momentum': '모멘텀형', - 'community.indicatorType.volatility': '변동성', - 'community.indicatorType.volume': '볼륨', - 'community.indicatorType.custom': '사용자 정의', - 'community.pricing.free': '무료', - 'community.pricing.paid': '지불', - 'community.sort.downloads': '다운로드', - 'community.sort.rating': '등급', - 'community.sort.newest': '최신 릴리스', - 'community.pagination.total': '총 {total} 지표', - 'community.noDescription': '아직 설명이 없습니다', - 'community.detail.type': '유형', - 'community.detail.pricing': '가격', - 'community.detail.rating': '등급', - 'community.detail.downloads': '다운로드', - 'community.detail.author': '작성자', - 'community.detail.description': '소개', - 'community.detail.detailContent': '자세한 설명', - 'community.detail.backtestStats': '백테스트 통계', - 'community.action.purchase': '매수 지표', - 'community.action.addToMyIndicators': '내 지표에 추가', - 'community.action.favorite': '컬렉션', - 'community.action.unfavorite': '즐겨찾기 취소', - 'community.action.buyNow': '지금 구매', - 'community.action.renew': '갱신', - 'community.purchase.price': '가격', - 'community.purchase.permanent': '영구', - 'community.purchase.monthly': '달', - 'community.purchase.confirmBuy': '이 지표({price} QDT) 구매를 확인하시겠습니까?', - 'community.purchase.confirmRenew': '이 지표({price} QDT/월)를 갱신하시겠습니까?', - 'community.purchase.confirmFree': '이 무료 표시기를 추가하시겠습니까?', - 'community.purchase.confirmTitle': '조치 확인', - 'community.purchase.owned': '이 표시기를 구입하셨습니다(영구적으로 유효함).', - 'community.purchase.ownIndicator': '귀하가 게시한 측정항목입니다.', - 'community.purchase.expired': '구독이 만료되었습니다', - 'community.purchase.expiresOn': '만료 시간: {date}', - 'community.tabs.detail': '지표 세부정보', - 'community.tabs.backtest': '백테스트 데이터', - 'community.tabs.ratings': '사용자 리뷰', - 'community.rating.myRating': '내 평가', - 'community.rating.stars': '별 {count}개', - 'community.rating.commentPlaceholder': '당신의 경험을 공유하세요...', - 'community.rating.submit': '평가 제출', - 'community.rating.modify': '수정', - 'community.rating.saveModify': '변경사항 저장', - 'community.rating.cancel': '취소', - 'community.rating.selectRating': '등급을 선택해 주세요', - 'community.rating.success': '평가 성공', - 'community.rating.modifySuccess': '리뷰가 수정되었습니다.', - 'community.rating.failed': '평가 실패', - 'community.rating.noRatings': '아직 댓글이 없습니다', - 'community.backtest.note': '위 데이터는 과거 백테스트 결과이며 참고용일 뿐 미래 수익을 나타내지는 않습니다.', - 'community.backtest.noData': '아직 백테스트 데이터가 없습니다.', - 'community.backtest.uploadHint': '작성자는 아직 백테스트 데이터를 업로드하지 않았습니다.', - 'community.message.loadFailed': '표시기 목록을 로드하지 못했습니다.', - 'community.message.purchaseProcessing': '구매 요청 처리 중...', - 'community.message.downloadSuccess': '내 측정항목 목록에 측정항목이 추가되었습니다.', - 'community.message.favoriteSuccess': '수집 성공', - 'community.message.unfavoriteSuccess': '수집을 취소했습니다.', - 'community.message.operationSuccess': '작업 성공', - 'community.message.operationFailed': '작업 실패', - 'community.banner.readOnly': '읽기 전용', - 'community.banner.loginHint': '로그인 또는 등록이 필요한 경우 버튼을 클릭하여 독립 페이지로 이동하여 CSRF 문제를 방지하세요', - 'community.banner.jumpButton': '로그인/등록으로 이동', - 'dashboard.totalEquity': '총자본', - 'dashboard.totalPnL': '총손익', - 'dashboard.aiStrategies': 'AI 전략', - 'dashboard.indicatorStrategies': '지표 전략', - 'dashboard.running': '달리기', - 'dashboard.pnlHistory': '역사적 손익', - 'dashboard.strategyPerformance': '전략 손익비율', - 'dashboard.recentTrades': '최근 거래', - 'dashboard.currentPositions': '현재 위치', - 'dashboard.table.time': '시간', - 'dashboard.table.strategy': '정책 이름', - 'dashboard.table.symbol': '대상', - 'dashboard.table.type': '유형', - 'dashboard.table.side': '방향', - 'dashboard.table.size': '미결제약정', - 'dashboard.table.entryPrice': '평균 개장가', - 'dashboard.table.price': '가격', - 'dashboard.table.amount': '수량', - 'dashboard.table.profit': '이익과 손실', - 'dashboard.pendingOrders': '주문 실행 기록', - 'dashboard.totalOrders': '총 {total}건', - 'dashboard.viewError': '오류 보기', - 'dashboard.filled': '체결됨', - 'dashboard.orderTable.time': '생성 시간', - 'dashboard.orderTable.strategy': '전략', - 'dashboard.orderTable.symbol': '거래 쌍', - 'dashboard.orderTable.signalType': '신호 유형', - 'dashboard.orderTable.amount': '수량', - 'dashboard.orderTable.price': '체결 가격', - 'dashboard.orderTable.status': '상태', - 'dashboard.orderTable.executedAt': '실행 시간', - 'dashboard.signalType.openLong': '롱 오픈', - 'dashboard.signalType.openShort': '숏 오픈', - 'dashboard.signalType.closeLong': '롱 청산', - 'dashboard.signalType.closeShort': '숏 청산', - 'dashboard.signalType.addLong': '롱 추가', - 'dashboard.signalType.addShort': '숏 추가', - 'dashboard.status.pending': '대기 중', - 'dashboard.status.processing': '처리 중', - 'dashboard.status.completed': '완료', - 'dashboard.status.failed': '실패', - 'dashboard.status.cancelled': '취소됨', - 'dashboard.table.pnl': '미실현 손익', - 'form.basic-form.basic.title': '기본 형태', - 'form.basic-form.basic.description': '양식 페이지는 사용자로부터 정보를 수집하거나 확인하는 데 사용됩니다. 기본 양식은 데이터 항목이 거의 없는 양식 시나리오에서 일반적으로 사용됩니다.', - 'form.basic-form.title.label': '제목', - 'form.basic-form.title.placeholder': '목표에 이름을 지어주세요', - 'form.basic-form.title.required': '제목을 입력하세요', - 'form.basic-form.date.label': '시작일 및 종료일', - 'form.basic-form.placeholder.start': '시작일', - 'form.basic-form.placeholder.end': '종료일', - 'form.basic-form.date.required': '시작일과 종료일을 선택하세요.', - 'form.basic-form.goal.label': '목표 설명', - 'form.basic-form.goal.placeholder': '단계별 업무 목표를 입력하세요.', - 'form.basic-form.goal.required': '목표 설명을 입력하세요.', - 'form.basic-form.standard.label': '측정하다', - 'form.basic-form.standard.placeholder': '측정항목을 입력하세요.', - 'form.basic-form.standard.required': '측정항목을 입력하세요.', - 'form.basic-form.client.label': '고객', - 'form.basic-form.client.required': '귀하가 서비스를 제공하는 고객에 대해 설명해주세요.', - 'form.basic-form.label.tooltip': '대상 서비스 대상자', - 'form.basic-form.client.placeholder': '귀하가 서비스를 제공하는 고객, 내부 고객을 직접 @이름/직위 번호로 설명하십시오.', - 'form.basic-form.invites.label': '리뷰어 초대', - 'form.basic-form.invites.placeholder': '@이름/사원번호로 직접 보내주세요. 최대 5명까지 초대 가능합니다.', - 'form.basic-form.weight.label': '무게', - 'form.basic-form.weight.placeholder': '입력해주세요', - 'form.basic-form.public.label': '대중을 대상으로', - 'form.basic-form.label.help': '고객과 검토자는 기본적으로 공유됩니다.', - 'form.basic-form.radio.public': '대중', - 'form.basic-form.radio.partially-public': '부분적으로 공개', - 'form.basic-form.radio.private': '비공개', - 'form.basic-form.publicUsers.placeholder': '열려 있다', - 'form.basic-form.option.A': '동료 1', - 'form.basic-form.option.B': '동료 2', - 'form.basic-form.option.C': '동료 3', - 'form.basic-form.email.required': '이메일 주소를 입력해주세요!', - 'form.basic-form.email.wrong-format': '이메일 주소 형식이 잘못되었습니다!', - 'form.basic-form.userName.required': '사용자 이름을 입력해주세요!', - 'form.basic-form.password.required': '비밀번호를 입력해주세요!', - 'form.basic-form.password.twice': '두 번 입력한 비밀번호가 일치하지 않습니다!', - 'form.basic-form.strength.msg': '6자 이상 입력해주세요. 쉽게 추측할 수 있는 비밀번호는 사용하지 마세요.', - 'form.basic-form.strength.strong': '힘: 강한', - 'form.basic-form.strength.medium': '강도: 중간', - 'form.basic-form.strength.short': '강도: 너무 짧음', - 'form.basic-form.confirm-password.required': '비밀번호를 확인해 주세요!', - 'form.basic-form.phone-number.required': '휴대폰번호를 입력해주세요!', - 'form.basic-form.phone-number.wrong-format': '휴대폰 번호 형식이 잘못되었습니다!', - 'form.basic-form.verification-code.required': '인증번호를 입력해주세요!', - 'form.basic-form.form.get-captcha': '인증 코드 받기', - 'form.basic-form.captcha.second': '초', - 'form.basic-form.form.optional': '(선택사항)', - 'form.basic-form.form.submit': '제출', - 'form.basic-form.form.save': '저장', - 'form.basic-form.email.placeholder': '이메일', - 'form.basic-form.password.placeholder': '비밀번호는 6자 이상, 대소문자 구분', - 'form.basic-form.confirm-password.placeholder': '비밀번호 확인', - 'form.basic-form.phone-number.placeholder': '휴대전화번호', - 'form.basic-form.verification-code.placeholder': '인증코드', - 'result.success.title': '제출 성공', - 'result.success.description': '제출 결과 페이지는 일련의 작업 작업의 처리 결과를 피드백하는 데 사용됩니다. 간단한 작업인 경우 메시지 전역 프롬프트 피드백을 사용하세요. 이 텍스트 영역에는 간단한 보충 지침이 표시될 수 있습니다. "문서"를 표시해야 하는 경우 아래 회색 영역에 더 복잡한 내용이 표시될 수 있습니다.', - 'result.success.operate-title': '프로젝트 이름', - 'result.success.operate-id': '프로젝트 ID', - 'result.success.principal': '담당자', - 'result.success.operate-time': '유효시간', - 'result.success.step1-title': '프로젝트 생성', - 'result.success.step1-operator': '쿠 릴리', - 'result.success.step2-title': '학과 사전 검토', - 'result.success.step2-operator': '저우 마오마오', - 'result.success.step2-extra': '긴급', - 'result.success.step3-title': '재무 검토', - 'result.success.step4-title': '완료', - 'result.success.btn-return': '목록으로 돌아가기', - 'result.success.btn-project': '항목 보기', - 'result.success.btn-print': '인쇄', - 'result.fail.error.title': '제출 실패', - 'result.fail.error.description': '다시 제출하기 전에 다음 정보를 확인하고 수정하시기 바랍니다.', - 'result.fail.error.hint-title': '제출한 콘텐츠에 다음 오류가 포함되어 있습니다.', - 'result.fail.error.hint-text1': '귀하의 계정이 동결되었습니다', - 'result.fail.error.hint-btn1': '즉시 해동', - 'result.fail.error.hint-text2': '귀하의 계정은 아직 신청할 수 없습니다', - 'result.fail.error.hint-btn2': '지금 업그레이드', - 'result.fail.error.btn-text': '수정으로 돌아가기', - 'account.settings.menuMap.custom': '개인화', - 'account.settings.menuMap.binding': '계정 바인딩', - 'account.settings.basic.avatar': '아바타', - 'account.settings.basic.change-avatar': '아바타 변경', - 'account.settings.basic.email': '이메일', - 'account.settings.basic.email-message': '이메일을 입력해주세요!', - 'account.settings.basic.nickname': '닉네임', - 'account.settings.basic.nickname-message': '닉네임을 입력해주세요!', - 'account.settings.basic.profile': '프로필', - 'account.settings.basic.profile-message': '개인 프로필을 입력해주세요!', - 'account.settings.basic.profile-placeholder': '프로필', - 'account.settings.basic.country': '국가/지역', - 'account.settings.basic.country-message': '국가나 지역을 입력해주세요!', - 'account.settings.basic.geographic': '지방 및 도시', - 'account.settings.basic.geographic-message': '귀하의 시/도를 입력해주세요!', - 'account.settings.basic.address': '거리 주소', - 'account.settings.basic.address-message': '주소를 입력해주세요!', - 'account.settings.basic.phone': '연락처', - 'account.settings.basic.phone-message': '연락처를 입력해주세요!', - 'account.settings.basic.update': '기본정보 업데이트', - 'account.settings.basic.update.success': '기본 정보를 성공적으로 업데이트했습니다.', - 'account.settings.security.strong': '강한', - 'account.settings.security.medium': '안으로', - 'account.settings.security.weak': '약한', - 'account.settings.security.password': '계정 비밀번호', - 'account.settings.security.password-description': '현재 비밀번호 강도:', - 'account.settings.security.phone': '보안 휴대폰', - 'account.settings.security.phone-description': '이미 바인딩된 휴대폰:', - 'account.settings.security.question': '보안 문제', - 'account.settings.security.question-description': '보안 질문이 설정되지 않아 계정 보안을 효과적으로 보호할 수 있습니다.', - 'account.settings.security.email': '이메일 바인딩', - 'account.settings.security.email-description': '이미 바인딩된 이메일 주소:', - 'account.settings.security.mfa': 'MFA 장치', - 'account.settings.security.mfa-description': 'MFA 디바이스가 바인딩되지 않았습니다. 바인딩 후 다시 확인할 수 있습니다.', - 'account.settings.security.modify': '수정', - 'account.settings.security.set': '설정', - 'account.settings.security.bind': '바인딩', - 'account.settings.binding.taobao': '타오바오 바인딩', - 'account.settings.binding.taobao-description': '현재 타오바오 계정이 연결되어 있지 않습니다', - 'account.settings.binding.alipay': '알리페이 바인딩', - 'account.settings.binding.alipay-description': 'Alipay 계정이 현재 연결되어 있지 않습니다.', - 'account.settings.binding.dingding': '바인딩 딩톡', - 'account.settings.binding.dingding-description': '현재 바인딩된 DingTalk 계정이 없습니다.', - 'account.settings.binding.bind': '바인딩', - 'account.settings.notification.password': '계정 비밀번호', - 'account.settings.notification.password-description': '다른 사용자의 메시지는 사이트 메시지 형식으로 통보됩니다.', - 'account.settings.notification.messages': '시스템 메시지', - 'account.settings.notification.messages-description': '시스템 메시지는 사이트 메시지 형식으로 통보됩니다.', - 'account.settings.notification.todo': '해야 할 일', - 'account.settings.notification.todo-description': '할일은 사이트 내 메시지로 알려드립니다.', - 'account.settings.settings.open': '열다', - 'account.settings.settings.close': '닫기', - 'trading-assistant.title': '트레이딩 어시스턴트', - 'trading-assistant.strategyList': '전략 목록', - 'trading-assistant.createStrategy': '정책 만들기', - 'trading-assistant.noStrategy': '아직 전략이 없습니다.', - 'trading-assistant.selectStrategy': '세부정보를 보려면 왼쪽에서 전략을 선택하세요.', - 'trading-assistant.startStrategy': '출시 전략', - 'trading-assistant.stopStrategy': '중지 전략', - 'trading-assistant.editStrategy': '편집 전략', - 'trading-assistant.deleteStrategy': '정책 삭제', - 'trading-assistant.status.running': '달리기', - 'trading-assistant.status.stopped': '중지됨', - 'trading-assistant.status.error': '오류', - 'trading-assistant.strategyType.IndicatorStrategy': '기술 지표 전략', - 'trading-assistant.strategyType.PromptBasedStrategy': '단서 전략', - 'trading-assistant.strategyType.GridStrategy': '그리드 전략', - 'trading-assistant.tabs.tradingRecords': '거래 내역', - 'trading-assistant.tabs.positions': '직위기록', - 'trading-assistant.tabs.equityCurve': '주식곡선', - 'trading-assistant.form.step1': '지표 선택', - 'trading-assistant.form.step2': '교환 구성', - 'trading-assistant.form.step3': '전략 매개변수', - 'trading-assistant.form.indicator': '지표 선택', - 'trading-assistant.form.indicatorHint': '자신이 구매했거나 생성한 기술 지표만 선택할 수 있습니다.', - 'trading-assistant.form.qdtCostHints': '전략을 사용하면 QDT가 소모됩니다. 계정에 QDT 잔액이 충분한지 확인하세요.', - 'trading-assistant.form.indicatorDescription': '표시기 설명', - 'trading-assistant.form.noDescription': '아직 설명이 없습니다', - 'trading-assistant.form.exchange': '교환 선택', - 'trading-assistant.form.apiKey': 'API 키', - 'trading-assistant.form.secretKey': '비밀키', - 'trading-assistant.form.passphrase': '암호', - 'trading-assistant.form.testConnection': '연결 테스트', - 'trading-assistant.form.strategyName': '정책 이름', - 'trading-assistant.form.symbol': '거래 쌍', - 'trading-assistant.form.symbolHint': '현재는 암호화폐 거래쌍만 지원됩니다', - 'trading-assistant.form.initialCapital': '투자금액', - 'trading-assistant.form.marketType': '시장 유형', - 'trading-assistant.form.marketTypeFutures': '계약', - 'trading-assistant.form.marketTypeSpot': '스팟', - 'trading-assistant.form.marketTypeHint': '계약은 양방향 거래와 레버리지를 지원하는 반면 현물은 롱 포지션만 지원하고 레버리지는 1x로 고정됩니다.', - 'trading-assistant.form.leverage': '여러 가지 활용', - 'trading-assistant.form.leverageHint': '계약 : 1~125회, 현물 : 고정 1회', - 'trading-assistant.form.spotLeverageFixed': '현물 거래 레버리지는 1x로 고정됩니다.', - 'trading-assistant.form.spotOnlyLongHint': '현물 거래는 매수 포지션만 지원합니다', - 'trading-assistant.form.tradeDirection': '거래 방향', - 'trading-assistant.form.tradeDirectionLong': '오직 길다', - 'trading-assistant.form.tradeDirectionShort': '단지 짧다', - 'trading-assistant.form.tradeDirectionBoth': '양방향 거래', - 'trading-assistant.form.timeframe': '기간', - 'trading-assistant.form.klinePeriod': 'K선 기간', - 'trading-assistant.form.timeframe1m': '1분', - 'trading-assistant.form.timeframe5m': '5분', - 'trading-assistant.form.timeframe15m': '15분', - 'trading-assistant.form.timeframe30m': '30분', - 'trading-assistant.form.timeframe1H': '1시간', - 'trading-assistant.form.timeframe4H': '4시간', - 'trading-assistant.form.timeframe1D': '1일', - 'trading-assistant.form.selectStrategyType': '전략 유형 선택', - 'trading-assistant.form.indicatorStrategy': '지표 전략', - 'trading-assistant.form.indicatorStrategyDesc': '기술 지표 기반 자동 거래 전략', - 'trading-assistant.form.aiStrategy': 'AI 전략', - 'trading-assistant.form.aiStrategyDesc': 'AI 지능형 의사결정 기반 자동 거래 전략', - 'trading-assistant.form.enableAiFilter': 'AI 지능형 의사결정 필터 활성화', - 'trading-assistant.form.enableAiFilterHint': '활성화하면 지표 신호가 AI에 의해 필터링되어 거래 품질이 향상됩니다', - 'trading-assistant.form.aiFilterPrompt': '사용자 정의 프롬프트', - 'trading-assistant.form.aiFilterPromptHint': 'AI 필터링을 위한 사용자 정의 지침을 제공하고, 비워두면 시스템 기본값을 사용합니다', - 'trading-assistant.validation.strategyTypeRequired': '전략 유형을 선택하세요', - 'trading-assistant.form.advancedSettings': '고급 설정', - 'trading-assistant.form.orderMode': '주문 모드', - 'trading-assistant.form.orderModeMaker': '메이커', - 'trading-assistant.form.orderModeTaker': '시장가(테이커)', - 'trading-assistant.form.orderModeHint': '지정가 주문 모드는 지정가 주문을 사용하며 처리 수수료가 더 낮습니다. 시장 가격 모드는 즉시 실행되며 처리 수수료가 더 높습니다.', - 'trading-assistant.form.makerWaitSec': '지정가 주문 대기 시간(초)', - 'trading-assistant.form.makerWaitSecHint': '주문 후 거래가 완료될 때까지 기다리는 시간입니다. 취소하고 시간 초과 후 다시 시도하세요.', - 'trading-assistant.form.makerRetries': '보류 중인 주문에 대한 재시도 횟수', - 'trading-assistant.form.makerRetriesHint': '보류 중인 주문이 실행되지 않을 때 최대 재시도 횟수', - 'trading-assistant.form.fallbackToMarket': '지정가 주문이 실패하고 시장 가격이 하락합니다.', - 'trading-assistant.form.fallbackToMarketHint': '개시/청산 보류 주문이 완료되지 않은 경우 거래가 완료되었는지 확인하기 위해 시장가 주문으로 다운그레이드해야 하는지 여부.', - 'trading-assistant.form.marginMode': '마진 모드', - 'trading-assistant.form.marginModeCross': '전체 창고', - 'trading-assistant.form.marginModeIsolated': '고립된 위치', - 'trading-assistant.form.stopLossPct': '정지손해율(%)', - 'trading-assistant.form.stopLossPctHint': '정지 손실 비율을 설정합니다. 0은 정지 손실이 활성화되지 않았음을 의미합니다.', - 'trading-assistant.form.takeProfitPct': '이익 실현 비율(%)', - 'trading-assistant.form.takeProfitPctHint': '이익실현 비율을 설정합니다. 0은 이익실현을 비활성화함을 의미합니다.', - 'trading-assistant.form.signalMode': '신호 모드', - 'trading-assistant.form.signalModeConfirmed': '모드 확인', - 'trading-assistant.form.signalModeAggressive': '공격적 모드', - 'trading-assistant.form.signalModeHint': '확인 모드: 완료된 K 라인만 확인합니다. 공격적 모드: K 라인 형성도 확인합니다.', - 'trading-assistant.form.cancel': '취소', - 'trading-assistant.form.prev': '이전 단계', - 'trading-assistant.form.next': '다음 단계', - 'trading-assistant.form.confirmCreate': '생성 확인', - 'trading-assistant.form.confirmEdit': '변경사항 확인', - 'trading-assistant.messages.createSuccess': '전략이 성공적으로 생성되었습니다.', - 'trading-assistant.messages.createFailed': '정책을 생성하지 못했습니다.', - 'trading-assistant.messages.updateSuccess': '정책 업데이트 성공', - 'trading-assistant.messages.updateFailed': '정책 업데이트 실패', - 'trading-assistant.messages.deleteSuccess': '정책 삭제 성공', - 'trading-assistant.messages.deleteFailed': '정책 삭제 실패', - 'trading-assistant.messages.startSuccess': '전략이 성공적으로 시작되었습니다', - 'trading-assistant.messages.startFailed': '정책을 시작하지 못했습니다.', - 'trading-assistant.messages.stopSuccess': '전략이 성공적으로 중지되었습니다.', - 'trading-assistant.messages.stopFailed': '중지 전략이 실패했습니다.', - 'trading-assistant.messages.loadFailed': '정책 목록을 가져오지 못했습니다.', - 'trading-assistant.messages.runningWarning': '전략이 실행되고 있습니다. 전략을 수정하기 전에 전략을 중지하세요.', - 'trading-assistant.messages.deleteConfirmWithName': '"{name}" 정책을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.', - 'trading-assistant.messages.deleteConfirm': '이 정책을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.', - 'trading-assistant.messages.loadTradesFailed': '거래 기록을 가져오지 못했습니다.', - 'trading-assistant.messages.loadPositionsFailed': '위치 기록을 가져오지 못했습니다.', - 'trading-assistant.messages.loadEquityFailed': '자기자본곡선 획득 실패', - 'trading-assistant.messages.loadIndicatorsFailed': '표시기 목록을 로드하지 못했습니다. 나중에 다시 시도해 주세요.', - 'trading-assistant.messages.spotLimitations': '현물 거래는 자동으로 매수, 1배 레버리지로 설정되었습니다.', - 'trading-assistant.messages.autoFillApiConfig': '거래소의 과거 API 구성이 자동으로 채워졌습니다.', - 'trading-assistant.placeholders.selectIndicator': '지표를 선택하세요', - 'trading-assistant.placeholders.selectExchange': '교환을 선택해주세요', - 'trading-assistant.placeholders.inputApiKey': 'API 키를 입력하세요', - 'trading-assistant.placeholders.inputSecretKey': '비밀키를 입력해주세요', - 'trading-assistant.placeholders.inputPassphrase': '암호를 입력하세요', - 'trading-assistant.placeholders.inputStrategyName': '정책 이름을 입력하세요.', - 'trading-assistant.placeholders.selectSymbol': '거래쌍을 선택해주세요', - 'trading-assistant.placeholders.selectTimeframe': '기간을 선택하세요.', - 'trading-assistant.placeholders.selectKlinePeriod': 'K선 기간을 선택하세요', - 'trading-assistant.placeholders.inputAiFilterPrompt': '사용자 정의 프롬프트를 입력하세요(선택사항)', - 'trading-assistant.validation.indicatorRequired': '지표를 선택하세요', - 'trading-assistant.validation.exchangeRequired': '교환을 선택해주세요', - 'trading-assistant.validation.apiKeyRequired': 'API 키를 입력하세요', - 'trading-assistant.validation.secretKeyRequired': '비밀키를 입력해주세요', - 'trading-assistant.validation.passphraseRequired': '암호를 입력하세요', - 'trading-assistant.validation.exchangeConfigIncomplete': '전체 교환 구성 정보를 입력하세요.', - 'trading-assistant.validation.testConnectionRequired': '먼저 "연결 테스트" 버튼을 클릭하고 연결이 성공했는지 확인하세요', - 'trading-assistant.validation.testConnectionFailed': '연결 테스트에 실패했습니다. 구성을 확인하고 다시 테스트하세요', - 'trading-assistant.validation.strategyNameRequired': '정책 이름을 입력하세요.', - 'trading-assistant.validation.symbolRequired': '거래쌍을 선택해주세요', - 'trading-assistant.validation.initialCapitalRequired': '투자금액을 입력해주세요.', - 'trading-assistant.validation.leverageRequired': '레버리지 비율을 입력하세요.', - 'trading-assistant.table.time': '시간', - 'trading-assistant.table.type': '유형', - 'trading-assistant.table.price': '가격', - 'trading-assistant.table.amount': '수량', - 'trading-assistant.table.value': '금액', - 'trading-assistant.table.commission': '취급 수수료', - 'trading-assistant.table.symbol': '거래쌍', - 'trading-assistant.table.side': '방향', - 'trading-assistant.table.size': '포지션 수량', - 'trading-assistant.table.entryPrice': '개장 가격', - 'trading-assistant.table.currentPrice': '현재 가격', - 'trading-assistant.table.unrealizedPnl': '미실현 손익', - 'trading-assistant.table.pnlPercent': '손익비율', - 'trading-assistant.table.buy': '사다', - 'trading-assistant.table.sell': '팔다', - 'trading-assistant.table.long': '오래 가세요', - 'trading-assistant.table.short': '짧은', - 'trading-assistant.table.noPositions': '아직 직책이 없습니다.', - 'trading-assistant.detail.title': '전략 세부정보', - 'trading-assistant.detail.strategyName': '정책 이름', - 'trading-assistant.detail.strategyType': '전략 유형', - 'trading-assistant.detail.status': '상태', - 'trading-assistant.detail.tradingMode': '거래 모델', - 'trading-assistant.detail.exchange': '교환', - 'trading-assistant.detail.initialCapital': '초기자본금', - 'trading-assistant.detail.totalInvestment': '총투자금액', - 'trading-assistant.detail.currentEquity': '현재 순자산', - 'trading-assistant.detail.totalPnl': '총손익', - 'trading-assistant.detail.indicatorName': '지표 이름', - 'trading-assistant.detail.maxLeverage': '최대 레버리지', - 'trading-assistant.detail.decideInterval': '결정 간격', - 'trading-assistant.detail.symbols': '거래개체', - 'trading-assistant.detail.createdAt': '생성 시간', - 'trading-assistant.detail.updatedAt': '업데이트 시간', - 'trading-assistant.detail.llmConfig': 'AI 모델 구성', - 'trading-assistant.detail.exchangeConfig': '교환 구성', - 'trading-assistant.detail.provider': '공급자', - 'trading-assistant.detail.modelId': '모델 ID', - 'trading-assistant.detail.close': '닫기', - 'trading-assistant.detail.loadFailed': '정책 세부정보를 가져오지 못했습니다.', - 'trading-assistant.equity.noData': '아직 순자산 데이터가 없습니다.', - 'trading-assistant.equity.equity': '순자산', - 'trading-assistant.exchange.tradingMode': '거래 모델', - 'trading-assistant.exchange.virtual': '모의거래', - 'trading-assistant.exchange.live': '실제 거래', - 'trading-assistant.exchange.selectExchange': '교환 선택', - 'trading-assistant.exchange.walletAddress': '지갑 주소', - 'trading-assistant.exchange.walletAddressPlaceholder': '지갑 주소(0x로 시작)를 입력하세요.', - 'trading-assistant.exchange.privateKey': '개인 키', - 'trading-assistant.exchange.privateKeyPlaceholder': '개인키(64자)를 입력해주세요.', - 'trading-assistant.exchange.testConnection': '연결 테스트', - 'trading-assistant.exchange.connectionSuccess': '연결 성공', - 'trading-assistant.exchange.connectionFailed': '연결 실패', - 'trading-assistant.exchange.testFailed': '연결 테스트 실패', - 'trading-assistant.exchange.fillComplete': '전체 교환 구성 정보를 입력하세요.', - 'trading-assistant.strategyTypeOptions.ai': 'AI 중심 전략', - 'trading-assistant.strategyTypeOptions.indicator': '기술 지표 전략', - 'trading-assistant.strategyTypeOptions.aiDeveloping': 'AI 기반 전략 기능은 개발 중이므로 계속 지켜봐 주시기 바랍니다', - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'AI 기반 전략 기능 개발 중', - 'trading-assistant.indicatorType.trend': '추세', - 'trading-assistant.indicatorType.momentum': '추진력', - 'trading-assistant.indicatorType.volatility': '변동', - 'trading-assistant.indicatorType.volume': '볼륨', - 'trading-assistant.indicatorType.custom': '사용자 정의', - 'trading-assistant.exchangeNames': { - 'okx': 'OKX', - 'binance': '바이낸스', - 'hyperliquid': '초액체', - 'blockchaincom': '블록체인닷컴', - 'coinbaseexchange': '코인베이스', - 'gate': 'Gate.io', - 'mexc': '멕시코', - 'kraken': '크라켄', - 'bitfinex': '비트파이넥스', - 'bybit': '바이비트', - 'kucoin': '쿠코인', - 'huobi': '후오비', - 'bitget': '비트겟', - 'bitmex': '비트멕스', - 'deribit': '데리비트', - 'phemex': '페멕스', - 'bitmart': '비트마트', - 'bitstamp': '비트스탬프', - 'bittrex': '비트렉스', - 'poloniex': '폴로닉스', - 'gemini': '쌍둥이자리', - 'cryptocom': '크립토닷컴', - 'bitflyer': '비트플라이어', - 'upbit': '업비트', - 'bithumb': '빗썸', - 'coinone': '코인원', - 'zb': 'ZB', - 'lbank': 'L은행', - 'bibox': '비박스', - 'bigone': '빅원', - 'bitrue': '바이트루', - 'coinex': '코인엑스', - 'digifinex': '디지파이넥스', - 'ftx': 'FTX', - 'ftxus': 'FTX 미국', - 'binanceus': '바이낸스 미국', - 'binancecoinm': '바이낸스 코인-M', - 'binanceusdm': '바이낸스 USDⓈ-M' - }, - 'ai-trading-assistant.title': 'AI 트레이딩 도우미', - 'ai-trading-assistant.strategyList': '전략 목록', - 'ai-trading-assistant.createStrategy': '정책 만들기', - 'ai-trading-assistant.noStrategy': '아직 전략이 없습니다.', - 'ai-trading-assistant.selectStrategy': '세부정보를 보려면 왼쪽에서 전략을 선택하세요.', - 'ai-trading-assistant.startStrategy': '출시 전략', - 'ai-trading-assistant.stopStrategy': '중지 전략', - 'ai-trading-assistant.editStrategy': '편집 전략', - 'ai-trading-assistant.deleteStrategy': '정책 삭제', - 'ai-trading-assistant.status.running': '달리기', - 'ai-trading-assistant.status.stopped': '중지됨', - 'ai-trading-assistant.status.error': '오류', - 'ai-trading-assistant.tabs.tradingRecords': '거래 내역', - 'ai-trading-assistant.tabs.positions': '직위기록', - 'ai-trading-assistant.tabs.aiDecisions': 'AI 의사결정 기록', - 'ai-trading-assistant.tabs.equityCurve': '주식곡선', - 'ai-trading-assistant.form.createTitle': 'AI 거래 전략 수립', - 'ai-trading-assistant.form.editTitle': 'AI 거래 전략 편집', - 'ai-trading-assistant.form.strategyName': '정책 이름', - 'ai-trading-assistant.form.modelId': 'AI 모델', - 'ai-trading-assistant.form.modelIdHint': 'API 키를 구성하지 않고 시스템 OpenRouter 서비스 사용', - 'ai-trading-assistant.form.decideInterval': '결정 간격', - 'ai-trading-assistant.form.decideInterval5m': '5분', - 'ai-trading-assistant.form.decideInterval10m': '10분', - 'ai-trading-assistant.form.decideInterval30m': '30분', - 'ai-trading-assistant.form.decideInterval1h': '1시간', - 'ai-trading-assistant.form.decideInterval4h': '4시간', - 'ai-trading-assistant.form.decideInterval1d': '1일', - 'ai-trading-assistant.form.decideInterval1w': '1주', - 'ai-trading-assistant.form.decideIntervalHint': 'AI가 결정을 내리는 시간 간격', - 'ai-trading-assistant.form.runPeriod': '실행 주기', - 'ai-trading-assistant.form.runPeriodHint': '전략 실행의 시작 시간과 종료 시간', - 'ai-trading-assistant.form.startDate': '시작일', - 'ai-trading-assistant.form.endDate': '종료일', - 'ai-trading-assistant.form.qdtCostTitle': 'QDT 공제 지침', - 'ai-trading-assistant.form.qdtCostHint': '각 AI 결정에 대해 {cost} QDT가 차감됩니다. 귀하의 계정에 충분한 QDT 잔액이 있는지 확인하십시오. 전략을 실행하는 동안 각 결정에 대해 수수료가 실시간으로 차감됩니다.', - 'ai-trading-assistant.form.apiKey': 'API 키', - 'ai-trading-assistant.form.exchange': '교환 선택', - 'ai-trading-assistant.form.secretKey': '비밀키', - 'ai-trading-assistant.form.passphrase': '암호', - 'ai-trading-assistant.form.testConnection': '연결 테스트', - 'ai-trading-assistant.form.symbol': '거래 쌍', - 'ai-trading-assistant.form.symbolHint': '거래할 거래쌍을 선택하세요', - 'ai-trading-assistant.form.initialCapital': '투자금액(마진)', - 'ai-trading-assistant.form.leverage': '여러 가지 활용', - 'ai-trading-assistant.form.timeframe': '기간', - 'ai-trading-assistant.form.timeframe1m': '1분', - 'ai-trading-assistant.form.timeframe5m': '5분', - 'ai-trading-assistant.form.timeframe15m': '15분', - 'ai-trading-assistant.form.timeframe30m': '30분', - 'ai-trading-assistant.form.timeframe1H': '1시간', - 'ai-trading-assistant.form.timeframe4H': '4시간', - 'ai-trading-assistant.form.timeframe1D': '1일', - 'ai-trading-assistant.form.marketType': '시장 유형', - 'ai-trading-assistant.form.marketTypeFutures': '계약', - 'ai-trading-assistant.form.marketTypeSpot': '스팟', - 'ai-trading-assistant.form.totalPnl': '총손익', - 'ai-trading-assistant.form.customPrompt': '맞춤 프롬프트 단어', - 'ai-trading-assistant.form.customPromptHint': '선택 사항, AI 거래 전략 및 의사 결정 논리를 사용자 정의하는 데 사용됩니다.', - 'ai-trading-assistant.form.cancel': '취소', - 'ai-trading-assistant.form.prev': '이전 단계', - 'ai-trading-assistant.form.next': '다음 단계', - 'ai-trading-assistant.form.confirmCreate': '생성 확인', - 'ai-trading-assistant.form.confirmEdit': '변경사항 확인', - 'ai-trading-assistant.messages.createSuccess': '전략이 성공적으로 생성되었습니다.', - 'ai-trading-assistant.messages.createFailed': '정책을 생성하지 못했습니다.', - 'ai-trading-assistant.messages.updateSuccess': '정책 업데이트 성공', - 'ai-trading-assistant.messages.updateFailed': '정책 업데이트 실패', - 'ai-trading-assistant.messages.deleteSuccess': '정책 삭제 성공', - 'ai-trading-assistant.messages.deleteFailed': '정책 삭제 실패', - 'ai-trading-assistant.messages.startSuccess': '전략이 성공적으로 시작되었습니다', - 'ai-trading-assistant.messages.startFailed': '정책을 시작하지 못했습니다.', - 'ai-trading-assistant.messages.stopSuccess': '전략이 성공적으로 중지되었습니다.', - 'ai-trading-assistant.messages.stopFailed': '중지 전략이 실패했습니다.', - 'ai-trading-assistant.messages.loadFailed': '정책 목록을 가져오지 못했습니다.', - 'ai-trading-assistant.messages.loadDecisionsFailed': 'AI 결정 기록을 가져오지 못했습니다.', - 'ai-trading-assistant.messages.deleteConfirm': '이 정책을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.', - 'ai-trading-assistant.placeholders.inputStrategyName': '정책 이름을 입력하세요.', - 'ai-trading-assistant.placeholders.selectModelId': 'AI 모델을 선택해 주세요', - 'ai-trading-assistant.placeholders.selectDecideInterval': '결정 간격을 선택하세요.', - 'ai-trading-assistant.placeholders.startTime': '시작 시간', - 'ai-trading-assistant.placeholders.endTime': '종료 시간', - 'ai-trading-assistant.placeholders.inputApiKey': 'API 키를 입력하세요', - 'ai-trading-assistant.placeholders.selectExchange': '교환을 선택해주세요', - 'ai-trading-assistant.placeholders.inputSecretKey': '비밀키를 입력해주세요', - 'ai-trading-assistant.placeholders.inputPassphrase': '암호를 입력하세요', - 'ai-trading-assistant.placeholders.selectSymbol': '다음과 같은 거래쌍을 선택하세요: BTC/USDT', - 'ai-trading-assistant.placeholders.selectTimeframe': '기간을 선택하세요.', - 'ai-trading-assistant.placeholders.inputCustomPrompt': '맞춤 프롬프트 단어를 입력하세요(선택사항).', - 'ai-trading-assistant.validation.strategyNameRequired': '정책 이름을 입력하세요.', - 'ai-trading-assistant.validation.modelIdRequired': 'AI 모델을 선택해 주세요', - 'ai-trading-assistant.validation.runPeriodRequired': '실행 주기를 선택하세요.', - 'ai-trading-assistant.validation.apiKeyRequired': 'API 키를 입력하세요', - 'ai-trading-assistant.validation.exchangeRequired': '교환을 선택해주세요', - 'ai-trading-assistant.validation.secretKeyRequired': '비밀키를 입력해주세요', - 'ai-trading-assistant.validation.symbolRequired': '거래쌍을 선택해주세요', - 'ai-trading-assistant.validation.initialCapitalRequired': '투자금액을 입력해주세요.', - 'ai-trading-assistant.table.time': '시간', - 'ai-trading-assistant.table.type': '유형', - 'ai-trading-assistant.table.price': '가격', - 'ai-trading-assistant.table.amount': '수량', - 'ai-trading-assistant.table.value': '금액', - 'ai-trading-assistant.table.symbol': '거래 쌍', - 'ai-trading-assistant.table.side': '방향', - 'ai-trading-assistant.table.size': '포지션 수량', - 'ai-trading-assistant.table.entryPrice': '개장 가격', - 'ai-trading-assistant.table.currentPrice': '현재 가격', - 'ai-trading-assistant.table.unrealizedPnl': '미실현 손익', - 'ai-trading-assistant.table.profit': '이익과 손실', - 'ai-trading-assistant.table.openLong': '길게 열다', - 'ai-trading-assistant.table.closeLong': '핀듀오', - 'ai-trading-assistant.table.openShort': '오픈 쇼트', - 'ai-trading-assistant.table.closeShort': '비어 있음', - 'ai-trading-assistant.table.addLong': '가돗', - 'ai-trading-assistant.table.addShort': '짧게 추가하다', - 'ai-trading-assistant.table.closeShortProfit': '숏 포지션에서 이익을 얻으세요', - 'ai-trading-assistant.table.closeShortStop': '손실 중지', - 'ai-trading-assistant.table.closeLongProfit': '오래 멈추고 이익을 얻으십시오', - 'ai-trading-assistant.table.closeLongStop': '손실 중지', - 'ai-trading-assistant.table.buy': '사다', - 'ai-trading-assistant.table.sell': '팔다', - 'ai-trading-assistant.table.long': '오래 가세요', - 'ai-trading-assistant.table.short': '짧은', - 'ai-trading-assistant.table.hold': '보류', - 'ai-trading-assistant.table.reasoning': '분석 이유', - 'ai-trading-assistant.table.decisions': '의사결정', - 'ai-trading-assistant.table.riskAssessment': '위험 평가', - 'ai-trading-assistant.table.confidence': '자신감', - 'ai-trading-assistant.table.totalRecords': '총 {total}개 기록', - 'ai-trading-assistant.table.noPositions': '아직 직책이 없습니다.', - 'ai-trading-assistant.detail.title': '전략 세부정보', - 'ai-trading-assistant.equity.noData': '아직 순자산 데이터가 없습니다.', - 'ai-trading-assistant.equity.equity': '순자산', - 'ai-trading-assistant.exchange.testFailed': '연결 테스트 실패', - 'ai-trading-assistant.exchange.connectionSuccess': '연결 성공', - 'ai-trading-assistant.exchange.connectionFailed': '연결 실패', - 'ai-trading-assistant.form.advancedSettings': '고급 설정', - 'ai-trading-assistant.form.orderMode': '주문 모드', - 'ai-trading-assistant.form.orderModeMaker': '메이커', - 'ai-trading-assistant.form.orderModeTaker': '시장가(테이커)', - 'ai-trading-assistant.form.orderModeHint': '지정가 주문 모드는 지정가 주문을 사용하며 처리 수수료가 더 낮습니다. 시장 가격 모드는 즉시 실행되며 처리 수수료가 더 높습니다.', - 'ai-trading-assistant.form.makerWaitSec': '지정가 주문 대기 시간(초)', - 'ai-trading-assistant.form.makerWaitSecHint': '주문 후 거래가 완료될 때까지 기다리는 시간입니다. 취소하고 시간 초과 후 다시 시도하세요.', - 'ai-trading-assistant.form.makerRetries': '보류 중인 주문에 대한 재시도 횟수', - 'ai-trading-assistant.form.makerRetriesHint': '보류 중인 주문이 실행되지 않을 때 최대 재시도 횟수', - 'ai-trading-assistant.form.fallbackToMarket': '지정가 주문이 실패하고 시장 가격이 하락합니다.', - 'ai-trading-assistant.form.fallbackToMarketHint': '개시/청산 보류 주문이 완료되지 않은 경우 거래가 완료되었는지 확인하기 위해 시장가 주문으로 다운그레이드해야 하는지 여부.', - 'ai-trading-assistant.form.marginMode': '마진 모드', - 'ai-trading-assistant.form.marginModeCross': '전체 창고', - 'ai-trading-assistant.form.marginModeIsolated': '고립된 위치', - 'ai-analysis.title': '퀀트 트레이딩 엔진', - 'ai-analysis.system.online': '온라인', - 'ai-analysis.system.agents': '대리인', - 'ai-analysis.system.active': '활성', - 'ai-analysis.system.stage': '무대', - 'ai-analysis.panel.roster': '에이전트 라인업', - 'ai-analysis.panel.thinking': '생각하다...', - 'ai-analysis.panel.done': '완료', - 'ai-analysis.panel.standby': '대기', - 'ai-analysis.input.title': '퀀트 트레이딩 엔진', - 'ai-analysis.input.placeholder': '대상 자산 선택(예: BTC/USDT)', - 'ai-analysis.input.watchlist': '옵션 주식', - 'ai-analysis.input.start': '분석 시작', - 'ai-analysis.input.recent': '최근 작업:', - 'ai-analysis.vis.stage': '무대', - 'ai-analysis.vis.processing': '처리', - 'ai-analysis.result.complete': '분석 완료', - 'ai-analysis.result.signal': '최종 신호', - 'ai-analysis.result.confidence': '자신감:', - 'ai-analysis.result.new': '새로운 분석', - 'ai-analysis.result.full': '전체 보고서 보기', - 'ai-analysis.logs.title': '시스템 로그', - 'ai-analysis.modal.title': '기밀 보고서', - 'ai-analysis.modal.fundamental': '기본적 분석', - 'ai-analysis.modal.technical': '기술적 분석', - 'ai-analysis.modal.sentiment': '감정 분석', - 'ai-analysis.modal.risk': '위험 평가', - 'ai-analysis.stage.idle': '대기', - 'ai-analysis.stage.1': '1단계: 다차원 분석', - 'ai-analysis.stage.2': '2단계: 장단기 토론', - 'ai-analysis.stage.3': '3단계: 전략적 계획', - 'ai-analysis.stage.4': '네 번째 단계: 위험 통제 검토', - 'ai-analysis.stage.complete': '완료', - 'ai-analysis.agent.investment_director': '투자 이사', - 'ai-analysis.agent.role.investment_director': '종합 분석 및 최종 결론', - 'ai-analysis.agent.market': '시장 분석가', - 'ai-analysis.agent.role.market': '기술 및 시장 데이터', - 'ai-analysis.agent.fundamental': '기본 분석가', - 'ai-analysis.agent.role.fundamental': '재무 및 평가', - 'ai-analysis.agent.technical': '기술 분석가', - 'ai-analysis.agent.role.technical': '기술 지표 및 차트', - 'ai-analysis.agent.news': '뉴스 분석가', - 'ai-analysis.agent.role.news': '글로벌 뉴스 필터', - 'ai-analysis.agent.sentiment': '감정 분석가', - 'ai-analysis.agent.role.sentiment': '사회적 및 정서적', - 'ai-analysis.agent.risk': '위험 분석가', - 'ai-analysis.agent.role.risk': '기본 리스크 점검', - 'ai-analysis.agent.bull': '낙관적인 연구원', - 'ai-analysis.agent.role.bull': '성장촉매 채굴', - 'ai-analysis.agent.bear': '약세 연구원', - 'ai-analysis.agent.role.bear': '위험 및 결함 조사', - 'ai-analysis.agent.manager': '연구 관리자', - 'ai-analysis.agent.role.manager': '토론 진행자', - 'ai-analysis.agent.trader': '상인', - 'ai-analysis.agent.role.trader': '경영 전략가', - 'ai-analysis.agent.risky': '활동가 분석가', - 'ai-analysis.agent.role.risky': '공격적인 전략', - 'ai-analysis.agent.neutral': '균형 분석가', - 'ai-analysis.agent.role.neutral': '균형 전략', - 'ai-analysis.agent.safe': '보수적인 분석가', - 'ai-analysis.agent.role.safe': '보수적 전략', - 'ai-analysis.agent.cro': '위험 통제 관리자(CRO)', - 'ai-analysis.agent.role.cro': '최종 의사결정 권한', - 'ai-analysis.script.market': '주요 거래소에서 OHLCV 데이터를 가져오는 중...', - 'ai-analysis.script.fundamental': '분기별 재무 보고서를 검색하는 중...', - 'ai-analysis.script.technical': '기술지표 및 차트 패턴 분석 중...', - 'ai-analysis.script.news': '글로벌 금융 뉴스를 스캔하는 중...', - 'ai-analysis.script.sentiment': '소셜미디어 트렌드 분석…', - 'ai-analysis.script.risk': '역사적 변동성을 계산하는 중...', - 'invite.inviteLink': '초대링크', - 'invite.copy': '링크 복사', - 'invite.copySuccess': '성공적으로 복사되었습니다!', - 'invite.copyFailed': '복사하지 못했습니다. 수동으로 복사하세요.', - 'invite.noInviteLink': '초대 링크가 생성되지 않았습니다.', - 'invite.totalInvites': '누적 초대', - 'invite.totalReward': '누적 보상', - 'invite.rules': '초대 규칙', - 'invite.rule1': '친구를 등록하도록 성공적으로 초대할 때마다 보상을 받게 됩니다.', - 'invite.rule2': '초대한 친구가 첫 번째 거래를 완료하면 추가 보상을 받을 수 있습니다.', - 'invite.rule3': '초대 보상은 귀하의 계정으로 직접 전송됩니다', - 'invite.inviteList': '초대 목록', - 'invite.tasks': '선교 센터', - 'invite.inviteeName': '초대받은 사람', - 'invite.inviteTime': '초대 시간', - 'invite.status': '상태', - 'invite.reward': '보상', - 'invite.active': '활성', - 'invite.inactive': '활성화되지 않음', - 'invite.completed': '완료됨', - 'invite.claimed': '접수됨', - 'invite.pending': '완료 예정', - 'invite.goToTask': '완료하다', - 'invite.claimReward': '보상 청구', - 'invite.verify': '확인 완료', - 'invite.verifySuccess': '확인에 성공했습니다. 작업 완료', - 'invite.verifyNotCompleted': '작업이 아직 완료되지 않았습니다. 먼저 작업을 완료하세요.', - 'invite.verifyFailed': '확인에 실패했습니다. 나중에 다시 시도해 주세요.', - 'invite.claimSuccess': '{reward} QDT를 성공적으로 받았습니다!', - 'invite.claimFailed': '수집하지 못했습니다. 나중에 다시 시도해 주세요.', - 'invite.totalRecords': '총 {total}개 기록', - 'invite.task.twitter.title': 'X(트위터)로 리트윗', - 'invite.task.twitter.desc': '공식 트윗을 X(트위터) 계정에 공유하세요', - 'invite.task.youtube.title': 'YouTube 채널을 팔로우하세요', - 'invite.task.youtube.desc': '공식 YouTube 채널을 구독하고 팔로우하세요.', - 'invite.task.telegram.title': '텔레그램 그룹에 가입하세요', - 'invite.task.telegram.desc': '공식 텔레그램 커뮤니티 그룹에 가입하세요', - 'invite.task.discord.title': 'Discord 서버에 가입하세요', - 'invite.task.discord.desc': 'Discord 커뮤니티 서버에 가입하세요', - 'message': '-', - 'layouts.usermenu.dialog.title': '정보', - 'layouts.usermenu.dialog.content': '정말로 로그아웃하시겠습니까?', - 'layouts.userLayout.title': '불확실성 속에서 진실을 찾아라', - // Auto-filled missing keys from en-US (fallback to English) - 'dashboard.indicator.boundary.message': 'Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.', - 'dashboard.indicator.boundary.indicatorRule': "Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.", - 'dashboard.indicator.boundary.backtestRule': 'Rule: If a bar has a main signal (buy/sell → open/close/reverse), scaling in/out is skipped on the same bar.', - 'dashboard.indicator.guide.title': 'Python Indicator & Strategy Development Guide', - 'dashboard.indicator.guide.intro': 'This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.', - 'dashboard.indicator.guide.section1.title': '1. Runtime Environment & Predefined Variables', - 'dashboard.indicator.guide.section1.env': 'Your code runs in a browser-based Python environment (Pyodide).', - 'dashboard.indicator.guide.section1.libs': 'Pre-installed Libraries', - 'dashboard.indicator.guide.section1.libsDesc': 'The following libraries are imported by default, no need to import again:', - 'dashboard.indicator.guide.section1.libsList': 'pandas (pd), numpy (np), math, json', - 'dashboard.indicator.guide.section1.data': 'Input Data: df', - 'dashboard.indicator.guide.section1.dataDesc': 'The system automatically converts current K-line data into a Pandas DataFrame object, variable name is df.', - 'dashboard.indicator.guide.section1.dataColumns': 'df contains the following columns (all float type):', - 'dashboard.indicator.guide.section1.dataColumnsList': 'time (timestamp, seconds), open, high, low, close, volume', - 'dashboard.indicator.guide.section1.dataNote': 'Data index is arranged from old to new (0 is the earliest data, last row is the latest data).', - 'dashboard.indicator.guide.section1.dataIndex': 'Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using .values which loses the index.', - 'dashboard.indicator.guide.section2.title': '2. Parameter Definition', - 'dashboard.indicator.guide.section2.desc': 'You can define variables as parameters at the beginning of your code. The system will try to parse statements like variable = value as adjustable parameters.', - 'dashboard.indicator.guide.section2.example': 'Parameter Example', - 'dashboard.indicator.guide.section2.exampleCode': 'span = 20 or multiplier = 2.0', - 'dashboard.indicator.guide.section3.title': '3. Backtest Signal Setup (Important!)', - 'dashboard.indicator.guide.section3.desc': 'If you want your indicator to support backtesting, you must set the following two columns in your code:', - 'dashboard.indicator.guide.section3.backtestRequired': 'Required for Backtesting:', - 'dashboard.indicator.guide.section3.backtestBuySignal': "df['buy_signal'] - Boolean Series, True indicates buy signal", - 'dashboard.indicator.guide.section3.backtestSellSignal': "df['sell_signal'] - Boolean Series, True indicates sell signal", - 'dashboard.indicator.guide.section3.backtestExample': 'Example:', - 'dashboard.indicator.guide.section3.backtestExampleCode': "df['buy_signal'] = condition_buy
    df['sell_signal'] = condition_sell", - 'dashboard.indicator.guide.section3.backtestNote': 'Note: Even if you only set output.signals for chart display, you must set these two columns to enable backtesting.', - 'dashboard.indicator.guide.section4.title': '4. Output Requirements: output', - 'dashboard.indicator.guide.section4.desc': 'At the end of code execution, you must define a dictionary named output to tell the chart how to display results.', - 'dashboard.indicator.guide.section4.fields': 'The output dictionary contains the following fields:', - 'dashboard.indicator.guide.section4.plots': 'plots - For drawing lines (e.g., moving averages, RSI)', - 'dashboard.indicator.guide.section4.signals': 'signals - For marking buy/sell signals (e.g., arrows, labels)', - 'dashboard.indicator.guide.section4.name': 'name - Indicator name (optional)', - 'dashboard.indicator.guide.section4.calculatedVars': 'calculatedVars - Calculated variables (optional, for displaying additional information)', - 'dashboard.indicator.guide.section5.title': '5. Plot Configuration (Plots)', - 'dashboard.indicator.guide.section5.desc': 'Each object in the plots list represents a line.', - 'dashboard.indicator.guide.section5.table.field': 'Field', - 'dashboard.indicator.guide.section5.table.type': 'Type', - 'dashboard.indicator.guide.section5.table.required': 'Required', - 'dashboard.indicator.guide.section5.table.requiredYes': 'Yes', - 'dashboard.indicator.guide.section5.table.requiredNo': 'No', - 'dashboard.indicator.guide.section5.table.desc': 'Description', - 'dashboard.indicator.guide.section5.table.name': 'The name of the indicator line, displayed in the legend', - 'dashboard.indicator.guide.section5.table.data': 'Data list, length must match the number of rows in df. Recommended to use series.tolist()', - 'dashboard.indicator.guide.section5.table.color': "Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign", - 'dashboard.indicator.guide.section5.table.typeDesc': "Chart type, default is 'line'", - 'dashboard.indicator.guide.section5.table.overlay': 'Important. True means display on main chart (with K-line), False means display on sub-chart (independent area)', - 'dashboard.indicator.guide.section5.example': 'Example: Draw Simple Moving Average (SMA)', - 'dashboard.indicator.guide.section5.exampleCalc': 'Calculate SMA', - 'dashboard.indicator.guide.section5.exampleOutput': 'Construct Output', - 'dashboard.indicator.guide.section5.exampleOverlay': 'Display on main chart', - 'dashboard.indicator.guide.section6.title': '6. Signal Markers (Signals)', - 'dashboard.indicator.guide.section6.desc': "signals are used to mark buy/sell points on specific K-lines through icons or text. Note: This is only for chart display. The backtest system uses df['buy_signal'] and df['sell_signal'].", - 'dashboard.indicator.guide.section6.table.type': "Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)", - 'dashboard.indicator.guide.section6.table.data': 'Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions', - 'dashboard.indicator.guide.section6.table.text': 'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")', - 'dashboard.indicator.guide.section6.table.color': 'Marker color', - 'dashboard.indicator.guide.section6.hint': 'The system automatically handles positioning.', - 'dashboard.indicator.guide.section6.buy': 'Markers will be automatically positioned below the Low of the current K-line', - 'dashboard.indicator.guide.section6.sell': 'Markers will be automatically positioned above the High of the current K-line', - 'dashboard.indicator.guide.section6.example': 'Example: Draw Buy/Sell Signals', - 'dashboard.indicator.guide.section6.exampleInit': 'Initialize signal list, fill all with None', - 'dashboard.indicator.guide.section6.exampleLogic': 'Simple logic: mark buy when close price is greater than open price', - 'dashboard.indicator.guide.section6.exampleNote': 'In actual logic, please use loops or vectorized operations', - 'dashboard.indicator.guide.section6.examplePrice': 'Record price', - 'dashboard.indicator.guide.section6.exampleText': 'Buy', - 'dashboard.indicator.guide.section7.title': '7. Complete Code Examples', - 'dashboard.indicator.guide.section7.exampleA': 'Example A: Dual EMA Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleACode': "# 1. Calculate indicators
    df['ema_fast'] = df['close'].ewm(span=5, adjust=False).mean()
    df['ema_slow'] = df['close'].ewm(span=13, adjust=False).mean()

    # 2. Calculate crossover signals
    cross_up = (df['ema_fast'] > df['ema_slow']) & (df['ema_fast'].shift(1) <= df['ema_slow'].shift(1))
    cross_down = (df['ema_fast'] < df['ema_slow']) & (df['ema_fast'].shift(1) >= df['ema_slow'].shift(1))

    # 3. 【Important】Set NEW backtest signal columns (bool)
    df['open_long'] = cross_up
    df['close_long'] = cross_down
    df['open_short'] = cross_down
    df['close_short'] = cross_up

    # 4. Generate signal data for chart display
    buy_signals = [df['low'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]

    # 5. Build output
    output = {
    \"name\": \"Dual EMA Strategy\",
    \"plots\": [
    {\"name\": \"EMA 5\", \"data\": df['ema_fast'].tolist(), \"color\": \"#FF6B6B\", \"overlay\": True},
    {\"name\": \"EMA 13\", \"data\": df['ema_slow'].tolist(), \"color\": \"#4ECDC4\", \"overlay\": True}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleB': 'Example B: Bollinger Bands - Chart Display Only', - 'dashboard.indicator.guide.section7.exampleBCode': "# Calculate Bollinger Bands (chart display only, no backtesting)
    length = 20
    mult = 2.0
    df['sma'] = df['close'].rolling(length).mean()
    df['std'] = df['close'].rolling(length).std()
    df['upper'] = df['sma'] + mult * df['std']
    df['lower'] = df['sma'] - mult * df['std']

    output = {
    \"name\": \"Bollinger Bands\",
    \"plots\": [
    {\"name\": \"Upper\", \"data\": df['upper'].tolist(), \"color\": \"#FF5252\", \"overlay\": True},
    {\"name\": \"Middle\", \"data\": df['sma'].tolist(), \"color\": \"#2196F3\", \"overlay\": True},
    {\"name\": \"Lower\", \"data\": df['lower'].tolist(), \"color\": \"#00E676\", \"overlay\": True}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleC': 'Example C: RSI Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleCCode': "# Calculate RSI
    delta = df['close'].diff()
    up = delta.clip(lower=0)
    down = -1 * delta.clip(upper=0)
    ema_up = up.ewm(com=13, adjust=False).mean()
    ema_down = down.ewm(com=13, adjust=False).mean()
    rs = ema_up / ema_down
    df['rsi'] = 100 - (100 / (1 + rs))

    # Generate trading signals
    buy_condition = df['rsi'] < 30 # Oversold buy
    sell_condition = df['rsi'] > 70 # Overbought sell

    # 【Important】Set NEW backtest signal columns (bool)
    df['open_long'] = buy_condition
    df['close_long'] = sell_condition
    df['open_short'] = sell_condition
    df['close_short'] = buy_condition

    # Generate chart signals
    buy_signals = [df['low'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]

    output = {
    \"name\": \"RSI Strategy\",
    \"plots\": [
    {\"name\": \"RSI\", \"data\": df['rsi'].tolist(), \"color\": \"#9C27B0\", \"overlay\": False},
    {\"name\": \"Overbought\", \"data\": [70] * len(df), \"color\": \"#FF5252\", \"style\": \"dashed\", \"overlay\": False},
    {\"name\": \"Oversold\", \"data\": [30] * len(df), \"color\": \"#00E676\", \"style\": \"dashed\", \"overlay\": False}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section6.param': 'Parameters', - 'dashboard.indicator.guide.section6.calc': 'Calculate', - 'dashboard.indicator.guide.section6.output': 'Output', - 'dashboard.indicator.guide.section6.generate': 'Generate signal data (initialize with None)', - 'dashboard.indicator.guide.section6.subchart': 'Display on sub-chart', - 'dashboard.indicator.guide.section8.title': '8. Frequently Asked Questions (FAQ)', - 'dashboard.indicator.guide.section8.q1': "Q: Why can't my indicator be backtested?", - 'dashboard.indicator.guide.section8.a1': "A: The backtest system requires NEW signal columns: df['open_long'], df['close_long'], df['open_short'], df['close_short'] (boolean). Even if you set output.signals for chart display, you must set these columns to enable backtesting.", - 'dashboard.indicator.guide.section8.q2': 'Q: Data length mismatch?', - 'dashboard.indicator.guide.section8.a2': "A: The data list in plots and signals must have exactly the same length as the K-line data. If you use df['xxx'].tolist(), there is usually no problem.", - 'dashboard.indicator.guide.section8.q3': 'Q: How to handle NaN (empty values)?', - 'dashboard.indicator.guide.section8.a3': "A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use df.fillna(0) or other methods.", - 'dashboard.indicator.guide.section8.q4': 'Q: Index mismatch causing all signals to be NaN?', - 'dashboard.indicator.guide.section8.a4': "A: Please ensure you preserve the original df index (timestamp). Avoid using .values to create new Series. Use columns directly like df['close'] for operations.", - 'dashboard.indicator.guide.section8.q5': 'Q: Can I use third-party network libraries?', - 'dashboard.indicator.guide.section8.a5': 'A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.', - 'dashboard.indicator.guide.section8.q6': 'Q: How to debug code?', - 'dashboard.indicator.guide.section8.a6': 'A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.', - 'dashboard.indicator.guide.section8.q7': 'Q: Backtest shows 0 signals?', - 'dashboard.indicator.guide.section8.a7': "A: Please check the data type of df['open_long']/df['close_long']/df['open_short']/df['close_short']. They should be boolean (True/False), not numeric. Use condition.fillna(False).astype(bool) to ensure correct type.", - 'dashboard.indicator.backtest.commissionHint': 'Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.', - 'dashboard.indicator.backtest.historyTitle': 'Backtest History', - 'dashboard.indicator.backtest.historyRefresh': 'Refresh', - 'dashboard.indicator.backtest.historyView': 'View', - 'dashboard.indicator.backtest.historyNoData': 'No backtest history', - 'dashboard.indicator.backtest.historyUseCurrent': 'Only current symbol/timeframe', - 'dashboard.indicator.backtest.historyFilterSymbol': 'Symbol', - 'dashboard.indicator.backtest.historyFilterTimeframe': 'Timeframe', - 'dashboard.indicator.backtest.historyApply': 'Apply filters', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AI Analyze', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI Suggestions', - 'dashboard.indicator.backtest.historyNoAIResult': 'No AI analysis result', - 'dashboard.indicator.backtest.historyRunId': 'Run ID', - 'dashboard.indicator.backtest.historyCreatedAt': 'Time', - 'dashboard.indicator.backtest.historyRange': 'Range', - 'dashboard.indicator.backtest.historyStatus': 'Status', - 'dashboard.indicator.backtest.historyStatusSuccess': 'Success', - 'dashboard.indicator.backtest.historyStatusFailed': 'Failed', - 'dashboard.indicator.backtest.historyActions': 'Actions', - 'trading-assistant.exchange.ipWhitelistTip': 'Please add the following IPs to the whitelist in your exchange API settings:', - 'signal-robot.title': 'Signal Robot Console', - 'signal-robot.createBot': 'Create New Bot', - 'signal-robot.search.nameOrSymbol': 'Name/Symbol', - 'signal-robot.search.placeholder': 'Search bot name or symbol', - 'signal-robot.search.status': 'Status', - 'signal-robot.search.statusAll': 'All', - 'signal-robot.search.statusRunning': 'Running', - 'signal-robot.search.statusPaused': 'Paused', - 'signal-robot.search.query': 'Query', - 'signal-robot.search.reset': 'Reset', - 'signal-robot.table.botName': 'Bot Name', - 'signal-robot.table.symbolTimeframe': 'Symbol/Timeframe', - 'signal-robot.table.triggerStrategy': 'Trigger Strategy', - 'signal-robot.table.notificationChannels': 'Notification Channels', - 'signal-robot.table.status': 'Status', - 'signal-robot.table.action': 'Action', - 'signal-robot.table.triggerConditions': '{count} trigger conditions', - 'signal-robot.table.monitoring': 'Monitoring', - 'signal-robot.table.paused': 'Paused', - 'signal-robot.table.edit': 'Edit', - 'signal-robot.table.pause': 'Pause', - 'signal-robot.table.start': 'Start', - 'signal-robot.table.delete': 'Delete', - 'signal-robot.table.deleteConfirm': 'Are you sure you want to delete this bot?', - 'signal-robot.table.deleteSuccess': 'Deleted successfully', - 'signal-robot.table.startSuccess': 'Bot started', - 'signal-robot.table.pauseSuccess': 'Bot paused', - 'signal-robot.channel.telegram': 'Telegram', - 'signal-robot.channel.discord': 'Discord', - 'signal-robot.channel.email': 'Email', - 'signal-robot.channel.webhook': 'Webhook', - 'signal-robot.channel.browser': 'Browser Push', - 'signal-robot.modal.createTitle': 'Create New Signal Robot', - 'signal-robot.modal.editTitle': 'Edit Signal Robot', - 'signal-robot.modal.step.basic': 'Basic Settings', - 'signal-robot.modal.step.entry': 'Entry Strategy', - 'signal-robot.modal.step.position': 'Position Management', - 'signal-robot.modal.step.risk': 'Risk Control', - 'signal-robot.modal.step.notify': 'Notification Config', - 'signal-robot.modal.prev': 'Previous', - 'signal-robot.modal.next': 'Next', - 'signal-robot.modal.preview': 'Preview Backtest', - 'signal-robot.modal.complete': 'Complete & Run', - 'signal-robot.modal.saveSuccess': 'Saved successfully', - 'signal-robot.modal.previewDeveloping': 'Preview feature is under development...', - 'signal-robot.modal.basicInfoRequired': 'Please complete basic information', - 'signal-robot.basic.alert': 'Set basic information for the bot', - 'signal-robot.basic.title': 'Basic Information', - 'signal-robot.basic.botName': 'Bot Name', - 'signal-robot.basic.botNamePlaceholder': 'e.g.: BTC SuperTrend Strategy', - 'signal-robot.basic.symbol': 'Trading Pair', - 'signal-robot.basic.symbolPlaceholder': 'Select from watchlist', - 'signal-robot.basic.noWatchlist': 'No watchlist items, please add in market page first', - 'signal-robot.basic.timeframe': 'K-Line Period', - 'signal-robot.basic.timeframe15m': '15 Minutes', - 'signal-robot.basic.timeframe30m': '30 Minutes', - 'signal-robot.basic.timeframe1h': '1 Hour', - 'signal-robot.basic.timeframe4h': '4 Hours', - 'signal-robot.basic.timeframe1d': '1 Day', - 'signal-robot.basic.autoNameSuggestion': '{symbol} Signal Robot', - 'signal-robot.entry.alert': 'Trigger entry signal when all conditions below are met', - 'signal-robot.entry.condition': 'Condition {index}', - 'signal-robot.entry.indicator': 'Indicator', - 'signal-robot.entry.indicatorSupertrend': 'SuperTrend', - 'signal-robot.entry.indicatorEma': 'EMA (Exponential Moving Average)', - 'signal-robot.entry.indicatorRsi': 'RSI (Relative Strength Index)', - 'signal-robot.entry.indicatorMacd': 'MACD', - 'signal-robot.entry.indicatorBollinger': 'Bollinger Bands', - 'signal-robot.entry.atrPeriod': 'ATR Period', - 'signal-robot.entry.multiplier': 'Multiplier', - 'signal-robot.entry.triggerSignal': 'Trigger Signal', - 'signal-robot.entry.signalTrendBullish': 'Trend Bullish', - 'signal-robot.entry.signalTrendBearish': 'Trend Bearish', - 'signal-robot.entry.signalIsUptrend': 'Is Uptrend', - 'signal-robot.entry.signalIsDowntrend': 'Is Downtrend', - 'signal-robot.entry.period': 'Period', - 'signal-robot.entry.compareCondition': 'Compare Condition', - 'signal-robot.entry.priceAbove': 'Price > EMA (Price Above)', - 'signal-robot.entry.priceBelow': 'Price < EMA (Price Below)', - 'signal-robot.entry.crossUp': 'Price Crosses Above EMA (Golden Cross)', - 'signal-robot.entry.crossDown': 'Price Crosses Below EMA (Death Cross)', - 'signal-robot.entry.compare': 'Compare', - 'signal-robot.entry.greaterThan': 'Greater Than', - 'signal-robot.entry.lessThan': 'Less Than', - 'signal-robot.entry.crossUpShort': 'Cross Up', - 'signal-robot.entry.crossDownShort': 'Cross Down', - 'signal-robot.entry.threshold': 'Threshold', - 'signal-robot.entry.selectIndicator': 'Please select an indicator to configure parameters', - 'signal-robot.entry.addCondition': 'Add Condition', - 'signal-robot.position.alert': 'Configure initial position size, leverage and pyramiding rules', - 'signal-robot.position.basicTitle': 'Basic Position Management', - 'signal-robot.position.initialSize': 'Initial Size (Capital %)', - 'signal-robot.position.initialSizeHint': 'Recommended 5% - 20%', - 'signal-robot.position.leverage': 'Leverage', - 'signal-robot.position.leverageHint': 'Please ensure your exchange account supports this leverage', - 'signal-robot.position.maxPyramiding': 'Max Pyramiding Times', - 'signal-robot.position.maxPyramidingHint': '0 means no pyramiding', - 'signal-robot.position.pyramidingTitle': 'Pyramiding Rules', - 'signal-robot.position.pyramidingEnabled': 'Enabled', - 'signal-robot.position.pyramidingDisabled': 'Disabled', - 'signal-robot.position.pyramidingCondition': 'Pyramiding Trigger Condition', - 'signal-robot.position.priceRisePct': 'Price Rises (Long) / Falls (Short)', - 'signal-robot.position.profitPct': 'Profit Reaches', - 'signal-robot.position.triggerThreshold': 'Trigger Threshold (%)', - 'signal-robot.position.triggerThresholdHint': 'e.g. 3%: add position once every 3% rise', - 'signal-robot.position.addSize': 'Single Add Size (Capital %)', - 'signal-robot.position.pyramidingDisabledHint': 'Pyramiding disabled, only initial position will be executed', - 'signal-robot.risk.alert': 'Configure take profit, stop loss and exit rules', - 'signal-robot.risk.stopLossTitle': 'Stop Loss', - 'signal-robot.risk.stopLossEnabled': 'Enabled', - 'signal-robot.risk.stopLossDisabled': 'Disabled', - 'signal-robot.risk.stopLossType': 'Stop Loss Type', - 'signal-robot.risk.stopLossFixedPct': 'Fixed Percentage', - 'signal-robot.risk.stopLossAtrMultiplier': 'ATR Multiplier', - 'signal-robot.risk.stopLossValue': 'Value', - 'signal-robot.risk.stopLossFixedHint': 'e.g. 2%: stop loss when loss reaches 2%', - 'signal-robot.risk.stopLossAtrHint': 'e.g. 2.0: stop loss when price touches ATR*2.0', - 'signal-robot.risk.stopLossDisabledHint': 'Stop loss disabled (high risk)', - 'signal-robot.risk.trailingStopTitle': 'Trailing Stop', - 'signal-robot.risk.activationProfit': 'Activation Profit (%)', - 'signal-robot.risk.activationProfitHint': 'Start trailing when profit reaches this level', - 'signal-robot.risk.callbackPct': 'Callback (%)', - 'signal-robot.risk.callbackPctHint': 'Trigger take profit when price falls from peak by this percentage', - 'signal-robot.risk.trailingStopDisabledHint': 'Trailing stop disabled', - 'signal-robot.risk.otherExitTitle': 'Other Exit Rules', - 'signal-robot.risk.signalExit': 'Allow Signal Exit', - 'signal-robot.risk.signalExitHint': 'Close position immediately when reverse signal appears (e.g. close long when short signal appears)', - 'signal-robot.notify.alert': 'Configure notification methods when signal is triggered', - 'signal-robot.notify.channelTitle': 'Notification Channels', - 'signal-robot.notify.discordWebhook': 'Discord Webhook', - 'signal-robot.notify.genericWebhook': 'Generic Webhook', - 'signal-robot.notify.webhookUrl': 'Webhook URL', - 'signal-robot.notify.webhookUrlPlaceholder': 'https://example.com/webhook', - 'signal-robot.notify.discordUrl': 'Discord URL', - 'signal-robot.notify.discordUrlPlaceholder': 'https://discord.com/api/webhooks/...', - 'signal-robot.operator.greaterThan': 'Greater Than', - 'signal-robot.operator.lessThan': 'Less Than', - 'signal-robot.operator.equal': 'Equal', - 'signal-robot.operator.goldenCross': 'Golden Cross', - 'signal-robot.operator.deathCross': 'Death Cross', - 'signal-robot.operator.increaseBy': 'Increase By', - 'signal-robot.operator.decreaseBy': 'Decrease By', - 'signal-robot.indicator.price': 'Price', - 'signal-robot.indicator.rsi': 'RSI', - 'signal-robot.indicator.kdjK': 'KDJ(K)', - 'signal-robot.indicator.kdjJ': 'KDJ(J)', - 'signal-robot.indicator.macd': 'MACD', - 'signal-robot.indicator.macdHist': 'MACD Histogram', - 'signal-robot.indicator.bollingerUp': 'Bollinger Upper', - 'signal-robot.indicator.bollingerLow': 'Bollinger Lower', - 'signal-robot.indicator.volume': 'Volume', - 'signal-robot.indicator.changePct1h': '1H Change %', - 'signal-robot.indicator.changePct24h': '24H Change %', - 'signal-robot.indicator.signalLine': 'Signal Line', - - // Settings (Memory/Reflection) - 'settings.group.agent_memory': '메모리/리플렉션 설정', - 'settings.group.reflection_worker': '자동 리플렉션 검증 워커', - 'settings.field.ENABLE_AGENT_MEMORY': '에이전트 메모리 사용', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': '벡터 검색 사용(로컬)', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': '임베딩 차원', - 'settings.field.AGENT_MEMORY_TOP_K': 'Top-K 조회 개수', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': '후보 윈도우 크기', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': '시간 감쇠 반감기(일)', - 'settings.field.AGENT_MEMORY_W_SIM': '유사도 가중치', - 'settings.field.AGENT_MEMORY_W_RECENCY': '시간 가중치', - 'settings.field.AGENT_MEMORY_W_RETURNS': '수익 가중치', - 'settings.field.ENABLE_REFLECTION_WORKER': '자동 검증 사용', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': '검증 주기(초)' -} - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/th-TH.js b/quantdinger_vue/src/locales/lang/th-TH.js deleted file mode 100644 index d44f397..0000000 --- a/quantdinger_vue/src/locales/lang/th-TH.js +++ /dev/null @@ -1,1791 +0,0 @@ -import antdThTH from 'ant-design-vue/es/locale-provider/th_TH' -import momentTH from 'moment/locale/th' - -const components = { - antLocale: antdThTH, - momentName: 'th', - momentLocale: momentTH -} - -const locale = { - 'submit': 'ส่ง', - 'save': 'บันทึก', - 'submit.ok': 'ส่งสำเร็จ', - 'save.ok': 'บันทึกเรียบร้อยแล้ว', - 'menu.welcome': 'ยินดีต้อนรับ', - 'menu.home': 'หน้าแรก', - 'menu.dashboard': 'แดชบอร์ด', - 'menu.dashboard.indicator': 'การวิเคราะห์ตัวบ่งชี้', - 'menu.dashboard.community': 'ชุมชนตัวบ่งชี้', - 'menu.dashboard.analysis': 'การวิเคราะห์เอไอ', - 'menu.dashboard.tradingAssistant': 'ผู้ช่วยการซื้อขาย', - 'menu.dashboard.aiTradingAssistant': 'ผู้ช่วยการซื้อขาย AI', - 'menu.dashboard.signalRobot': 'หุ่นยนต์สัญญาณ', - 'menu.dashboard.monitor': 'หน้าติดตาม', - 'menu.dashboard.workplace': 'โต๊ะทำงาน', - 'menu.form': 'หน้าแบบฟอร์ม', - 'menu.form.basic-form': 'แบบฟอร์มพื้นฐาน', - 'menu.form.step-form': 'แบบฟอร์มทีละขั้นตอน', - 'menu.form.step-form.info': 'แบบฟอร์มทีละขั้นตอน (กรอกข้อมูลการโอน)', - 'menu.form.step-form.confirm': 'แบบฟอร์มทีละขั้นตอน (ยืนยันข้อมูลการโอน)', - 'menu.form.step-form.result': 'แบบฟอร์มทีละขั้นตอน (สมบูรณ์)', - 'menu.form.advanced-form': 'แบบฟอร์มขั้นสูง', - 'menu.list': 'หน้ารายการ', - 'menu.list.table-list': 'แบบฟอร์มสอบถาม', - 'menu.list.basic-list': 'รายการมาตรฐาน', - 'menu.list.card-list': 'รายการการ์ด', - 'menu.list.search-list': 'รายการค้นหา', - 'menu.list.search-list.articles': 'รายการค้นหา (บทความ)', - 'menu.list.search-list.projects': 'รายการค้นหา (โครงการ)', - 'menu.list.search-list.applications': 'รายการค้นหา (แอป)', - 'menu.profile': 'หน้ารายละเอียด', - 'menu.profile.basic': 'หน้ารายละเอียดเบื้องต้น', - 'menu.profile.advanced': 'หน้ารายละเอียดขั้นสูง', - 'menu.result': 'หน้าผลลัพธ์', - 'menu.result.success': 'หน้าความสำเร็จ', - 'menu.result.fail': 'หน้าความล้มเหลว', - 'menu.exception': 'หน้าข้อยกเว้น', - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': 'ข้อผิดพลาดของทริกเกอร์', - 'menu.account': 'หน้าส่วนตัว', - 'menu.account.center': 'ศูนย์ส่วนบุคคล', - 'menu.account.settings': 'การตั้งค่าส่วนบุคคล', - 'menu.account.trigger': 'ข้อผิดพลาดของทริกเกอร์', - 'menu.account.logout': 'ออกจากระบบ', - 'menu.wallet': 'กระเป๋าเงินของฉัน', - 'menu.docs': 'ศูนย์เอกสาร', - 'menu.docs.detail': 'รายละเอียดเอกสาร', - 'menu.header.refreshPage': 'รีเฟรชหน้า', - 'menu.invite.friends': 'ชวนเพื่อน', - 'app.setting.pagestyle': 'การตั้งค่าสไตล์โดยรวม', - 'app.setting.pagestyle.light': 'เมนูสไตล์สดใส', - 'app.setting.pagestyle.dark': 'สไตล์เมนูสีเข้ม', - 'app.setting.pagestyle.realdark': 'โหมดมืด', - 'app.setting.themecolor': 'สีของธีม', - 'app.setting.navigationmode': 'โหมดการนำทาง', - 'app.setting.sidemenu.nav': 'การนำทางแถบด้านข้าง', - 'app.setting.topmenu.nav': 'การนำทางแถบด้านบน', - 'app.setting.content-width': 'ความกว้างของพื้นที่เนื้อหา', - 'app.setting.content-width.tooltip': 'การตั้งค่านี้จะมีผลเฉพาะเมื่อ [การนำทางแถบด้านบน]', - 'app.setting.content-width.fixed': 'ที่ตายตัว', - 'app.setting.content-width.fluid': 'สตรีมมิ่ง', - 'app.setting.fixedheader': 'ส่วนหัวคงที่', - 'app.setting.fixedheader.tooltip': 'กำหนดค่าได้เมื่อแก้ไขส่วนหัว', - 'app.setting.autoHideHeader': 'ซ่อนส่วนหัวเมื่อเลื่อน', - 'app.setting.fixedsidebar': 'เมนูด้านข้างคงที่', - 'app.setting.sidemenu': 'เค้าโครงเมนูด้านข้าง', - 'app.setting.topmenu': 'เค้าโครงเมนูด้านบน', - 'app.setting.othersettings': 'การตั้งค่าอื่นๆ', - 'app.setting.weakmode': 'โหมดความอ่อนแอของสี', - 'app.setting.multitab': 'โหมดหลายแท็บ', - 'app.setting.copy': 'การตั้งค่าการทำสำเนา', - 'app.setting.loading': 'กำลังโหลดธีม', - 'app.setting.copyinfo': 'คัดลอกการตั้งค่าสำเร็จ src/config/defaultSettings.js', - 'app.setting.copy.success': 'คัดลอกเสร็จแล้ว', - 'app.setting.copy.fail': 'การคัดลอกล้มเหลว', - 'app.setting.theme.switching': 'เปลี่ยนธีม!', - 'app.setting.production.hint': 'แถบการกำหนดค่าใช้สำหรับการดูตัวอย่างในสภาพแวดล้อมการพัฒนาเท่านั้น และจะไม่แสดงในสภาพแวดล้อมการใช้งานจริง โปรดคัดลอกและแก้ไขไฟล์การกำหนดค่าด้วยตนเอง', - 'app.setting.themecolor.daybreak': 'รุ่งอรุณสีฟ้า (ค่าเริ่มต้น)', - 'app.setting.themecolor.dust': 'พลบค่ำ', - 'app.setting.themecolor.volcano': 'ภูเขาไฟ', - 'app.setting.themecolor.sunset': 'พระอาทิตย์ตก', - 'app.setting.themecolor.cyan': 'หมิงชิง', - 'app.setting.themecolor.green': 'ออโรร่าสีเขียว', - 'app.setting.themecolor.geekblue': 'เกินบรรยายสีฟ้า', - 'app.setting.themecolor.purple': 'เจียงซี', - 'app.setting.tooltip': 'การตั้งค่าหน้า', - 'user.login.userName': 'ชื่อผู้ใช้', - 'user.login.password': 'รหัสผ่าน', - 'user.login.username.placeholder': 'บัญชี: ผู้ดูแลระบบ', - 'user.login.password.placeholder': 'รหัสผ่าน: admin หรือ ant.design', - 'user.login.message-invalid-credentials': 'การเข้าสู่ระบบล้มเหลว โปรดตรวจสอบอีเมลและรหัสยืนยันของคุณ', - 'user.login.message-invalid-verification-code': 'รหัสยืนยันผิดพลาด', - 'user.login.tab-login-credentials': 'เข้าสู่ระบบรหัสผ่านบัญชี', - 'user.login.tab-login-email': 'เข้าสู่ระบบอีเมล', - 'user.login.tab-login-mobile': 'เข้าสู่ระบบหมายเลขโทรศัพท์มือถือ', - 'user.login.captcha.placeholder': 'กรุณากรอกรหัสยืนยันกราฟิก', - 'user.login.mobile.placeholder': 'หมายเลขโทรศัพท์', - 'user.login.mobile.verification-code.placeholder': 'รหัสยืนยัน', - 'user.login.email.placeholder': 'กรุณากรอกที่อยู่อีเมลของคุณ', - 'user.login.email.verification-code.placeholder': 'กรุณากรอกรหัสยืนยัน', - 'user.login.email.sending': 'กำลังส่งรหัสยืนยัน...', - 'user.login.email.send-success-title': 'คำใบ้', - 'user.login.email.send-success': 'ส่งรหัสยืนยันสำเร็จแล้ว โปรดตรวจสอบอีเมลของคุณ', - 'user.login.sms.send-success': 'ส่งรหัสยืนยันสำเร็จแล้ว โปรดตรวจสอบข้อความ', - 'user.login.remember-me': 'เข้าสู่ระบบอัตโนมัติ', - 'user.login.forgot-password': 'ลืมรหัสผ่าน', - 'user.login.sign-in-with': 'วิธีการเข้าสู่ระบบอื่น ๆ', - 'user.login.signup': 'ลงทะเบียนบัญชี', - 'user.login.login': 'เข้าสู่ระบบ', - 'user.register.register': 'ลงทะเบียน', - 'user.register.email.placeholder': 'จดหมาย', - 'user.register.password.placeholder': 'กรุณากรอกอย่างน้อย 6 ตัวอักษร กรุณาอย่าใช้รหัสผ่านที่คาดเดาได้ง่าย', - 'user.register.password.popover-message': 'กรุณากรอกอย่างน้อย 6 ตัวอักษร กรุณาอย่าใช้รหัสผ่านที่คาดเดาได้ง่าย', - 'user.register.confirm-password.placeholder': 'ยืนยันรหัสผ่าน', - 'user.register.get-verification-code': 'รับรหัสยืนยัน', - 'user.register.sign-in': 'เข้าสู่ระบบโดยใช้บัญชีที่มีอยู่', - 'user.register-result.msg': 'บัญชีของคุณ: {email} การลงทะเบียนสำเร็จ', - 'user.register-result.activation-email': 'อีเมลเปิดใช้งานได้ถูกส่งไปยังกล่องจดหมายของคุณแล้ว และมีอายุ 24 ชั่วโมง โปรดเข้าสู่ระบบอีเมลของคุณทันทีและคลิกลิงก์ในอีเมลเพื่อเปิดใช้งานบัญชีของคุณ', - 'user.register-result.back-home': 'กลับไปที่หน้าแรก', - 'user.register-result.view-mailbox': 'ตรวจสอบกล่องจดหมายของคุณ', - 'user.email.required': 'กรุณากรอกที่อยู่อีเมลของคุณ!', - 'user.email.wrong-format': 'รูปแบบที่อยู่อีเมลไม่ถูกต้อง!', - 'user.userName.required': 'กรุณากรอกชื่อบัญชีหรือที่อยู่อีเมลของคุณ', - 'user.password.required': 'กรุณากรอกรหัสผ่านของคุณ!', - 'user.password.twice.msg': 'รหัสผ่านที่ป้อนสองครั้งไม่ตรงกัน!', - 'user.password.strength.msg': 'รหัสผ่านไม่แข็งแกร่งพอ', - 'user.password.strength.strong': 'ความแข็งแกร่ง: แข็งแกร่ง', - 'user.password.strength.medium': 'ความแข็งแกร่ง: ปานกลาง', - 'user.password.strength.low': 'ความแรง: ต่ำ', - 'user.password.strength.short': 'ความแรง: สั้นเกินไป', - 'user.confirm-password.required': 'กรุณายืนยันรหัสผ่านของคุณ!', - 'user.phone-number.required': 'กรุณากรอกหมายเลขโทรศัพท์มือถือที่ถูกต้อง', - 'user.phone-number.wrong-format': 'รูปแบบหมายเลขโทรศัพท์มือถือผิด!', - 'user.verification-code.required': 'กรุณากรอกรหัสยืนยัน!', - 'user.captcha.required': 'กรุณากรอกรหัสยืนยันกราฟิก!', - 'user.login.infos': 'QuantDinger เป็นเครื่องมือเสริมการวิเคราะห์หุ้นแบบหลายตัวแทนด้วย AI และไม่มีคุณสมบัติในการให้คำปรึกษาด้านการลงทุนในหลักทรัพย์ผลการวิเคราะห์ คะแนน และความคิดเห็นอ้างอิงทั้งหมดในแพลตฟอร์มถูกสร้างขึ้นโดยอัตโนมัติโดย AI ตามข้อมูลในอดีต และใช้เพื่อการเรียนรู้ การวิจัย และการแลกเปลี่ยนทางเทคนิคเท่านั้น และไม่ถือเป็นคำแนะนำในการลงทุนหรือพื้นฐานการตัดสินใจใดๆการลงทุนในหุ้นเกี่ยวข้องกับความเสี่ยงต่างๆ เช่น ความเสี่ยงด้านตลาด ความเสี่ยงด้านสภาพคล่อง ความเสี่ยงด้านนโยบาย ฯลฯ ซึ่งอาจนำไปสู่การสูญเสียเงินต้นได้ผู้ใช้ควรตัดสินใจอย่างอิสระโดยพิจารณาจากการยอมรับความเสี่ยงของตนเอง และพฤติกรรมการลงทุนและผลที่ตามมาที่เกิดจากการใช้เครื่องมือนี้จะต้องตกเป็นภาระของผู้ใช้ตลาดมีความเสี่ยงและการลงทุนต้องระมัดระวัง', - 'user.login.tab-login-web3': 'เข้าสู่ระบบ Web3', - 'user.login.web3.tip': 'เข้าสู่ระบบโดยใช้กระเป๋าเงิน', - 'user.login.web3.connect': 'เชื่อมต่อกระเป๋าเงินและเข้าสู่ระบบ', - 'user.login.web3.no-wallet': 'ตรวจไม่พบกระเป๋าเงิน', - 'user.login.web3.no-address': 'ไม่ได้รับที่อยู่กระเป๋าเงิน', - 'user.login.web3.nonce-failed': 'ไม่สามารถรับหมายเลขสุ่มได้', - 'user.login.web3.verify-failed': 'การตรวจสอบลายเซ็นล้มเหลว', - 'user.login.web3.success': 'เข้าสู่ระบบสำเร็จ', - 'user.login.web3.failed': 'การเข้าสู่ระบบ Wallet ล้มเหลว', - 'nav.no_wallet': 'ตรวจไม่พบกระเป๋าเงิน', - 'nav.copy': 'สำเนา', - 'nav.copy_success': 'คัดลอกเรียบร้อยแล้ว', - 'user.login.oauth.google': 'ลงชื่อเข้าใช้งานด้วย Google', - 'user.login.oauth.github': 'ลงชื่อเข้าใช้ด้วย GitHub', - 'user.login.oauth.loading': 'กำลังเปลี่ยนเส้นทางไปยังหน้าการอนุญาต...', - 'user.login.oauth.failed': 'การเข้าสู่ระบบ OAuth ล้มเหลว', - 'user.login.oauth.get-url-failed': 'ไม่สามารถรับลิงก์การอนุญาตได้', - 'user.login.subtitle': 'ขับเคลื่อนข้อมูลเชิงลึกเชิงปริมาณสู่ตลาดโลก', - 'user.login.legal.title': 'ข้อสงวนสิทธิ์ทางกฎหมาย', - 'user.login.legal.view': 'ดูข้อจำกัดความรับผิดชอบทางกฎหมาย', - 'user.login.legal.collapse': 'ยุบข้อจำกัดความรับผิดชอบทางกฎหมาย', - 'user.login.legal.agree': 'ฉันได้อ่านและยอมรับข้อจำกัดความรับผิดชอบทางกฎหมาย', - 'user.login.legal.required': 'โปรดอ่านและตรวจสอบข้อจำกัดความรับผิดชอบทางกฎหมายก่อน', - 'user.login.legal.content': 'QuantDinger เป็นเครื่องมือเสริมการวิเคราะห์หุ้นแบบหลายตัวแทนด้วย AI และไม่มีคุณสมบัติในการให้คำปรึกษาด้านการลงทุนในหลักทรัพย์ผลการวิเคราะห์ การให้คะแนน และความคิดเห็นอ้างอิงทั้งหมดในแพลตฟอร์มถูกสร้างขึ้นโดยอัตโนมัติโดย AI ตามข้อมูลในอดีต และใช้สำหรับการเรียนรู้ การวิจัย และการแลกเปลี่ยนทางเทคนิคเท่านั้น และไม่ถือเป็นคำแนะนำในการลงทุนหรือพื้นฐานการตัดสินใจใดๆการลงทุนในหุ้นเกี่ยวข้องกับความเสี่ยงต่างๆ เช่น ความเสี่ยงด้านตลาด ความเสี่ยงด้านสภาพคล่อง ความเสี่ยงด้านนโยบาย ฯลฯ ซึ่งอาจนำไปสู่การสูญเสียเงินต้นได้ผู้ใช้ควรตัดสินใจอย่างอิสระโดยพิจารณาจากการยอมรับความเสี่ยงของตนเอง และพฤติกรรมการลงทุนและผลที่ตามมาที่เกิดจากการใช้เครื่องมือนี้จะต้องตกเป็นภาระของผู้ใช้ตลาดมีความเสี่ยงและการลงทุนต้องระมัดระวัง', - 'user.login.privacy.title': 'นโยบายความเป็นส่วนตัวของผู้ใช้', - 'user.login.privacy.view': 'ดูนโยบายความเป็นส่วนตัวของผู้ใช้', - 'user.login.privacy.collapse': 'ปิดข้อกำหนดความเป็นส่วนตัวของผู้ใช้', - 'user.login.privacy.content': 'เราให้ความสำคัญกับความเป็นส่วนตัวและการปกป้องข้อมูลของคุณ 1) ขอบเขตของการรวบรวม: เฉพาะข้อมูลที่จำเป็นในการใช้งานฟังก์ชัน (เช่น อีเมล หมายเลขโทรศัพท์มือถือ รหัสพื้นที่ ที่อยู่กระเป๋าสตางค์ของ Web3) และบันทึกและข้อมูลอุปกรณ์ที่จำเป็นเท่านั้นที่จะถูกรวบรวม 2) วัตถุประสงค์การใช้งาน: สำหรับการเข้าสู่ระบบบัญชีและการตรวจสอบความปลอดภัยการให้บริการฟังก์ชั่น การแก้ไขปัญหาและข้อกำหนดการปฏิบัติตาม 3) การจัดเก็บและความปลอดภัย: ข้อมูลได้รับการเข้ารหัสและจัดเก็บและมีการใช้สิทธิ์ที่จำเป็นและมาตรการควบคุมการเข้าถึงเพื่อป้องกันการเข้าถึง การเปิดเผย หรือการสูญหายโดยไม่ได้รับอนุญาต 4) การแบ่งปันกับบุคคลที่สาม: เว้นแต่กฎหมายและข้อบังคับกำหนดไว้หรือจำเป็นในการให้บริการ ข้อมูลส่วนบุคคลของคุณจะไม่ถูกแบ่งปันกับบุคคลที่สามหากเกี่ยวข้องกับบริการของบุคคลที่สาม (เช่น กระเป๋าเงิน ผู้ให้บริการ SMS) จะถูกประมวลผลในขอบเขตขั้นต่ำที่จำเป็นเพื่อใช้งานฟังก์ชันนี้เท่านั้น 5) คุกกี้/ที่เก็บข้อมูลในเครื่อง: ใช้สำหรับสถานะการเข้าสู่ระบบและการบำรุงรักษาเซสชันที่จำเป็น (เช่น โทเค็น PHPSESSID) คุณสามารถล้างหรือจำกัดได้ในเบราว์เซอร์ 6) สิทธิ์ส่วนบุคคล: คุณสามารถใช้สิทธิ์ของคุณในการสอบถาม แก้ไข ลบ เพิกถอนความยินยอม ฯลฯ ตามกฎหมายและข้อบังคับ 7) การเปลี่ยนแปลงและประกาศ: เมื่อมีการอัปเดตข้อกำหนดเหล่านี้จะแสดงอย่างเด่นชัดบนหน้าเว็บการใช้บริการนี้ต่อไปจะถือว่าคุณได้อ่านและยอมรับเนื้อหาที่อัปเดตแล้วหากคุณไม่ยอมรับข้อกำหนดเหล่านี้หรือการปรับปรุงใด ๆ โปรดหยุดใช้บริการและติดต่อเรา', - 'account.basicInfo': 'ข้อมูลพื้นฐาน', - 'account.id': 'รหัสผู้ใช้', - 'account.username': 'ชื่อผู้ใช้', - 'account.nickname': 'ชื่อนิค', - 'account.email': 'จดหมาย', - 'account.mobile': 'หมายเลขโทรศัพท์', - 'account.web3address': 'ที่อยู่กระเป๋าเงิน', - 'account.pid': 'รหัสผู้อ้างอิง', - 'account.level': 'ระดับผู้ใช้', - 'account.money': 'สมดุล', - 'account.qdtBalance': 'ยอดคงเหลือ QDT', - 'account.score': 'บูรณาการ', - 'account.createtime': 'เวลาลงทะเบียน', - 'account.inviteLink': 'ลิงค์คำเชิญ', - 'account.recharge': 'เติมเงิน', - 'account.rechargeTip': 'โปรดใช้ WeChat หรือ Alipay เพื่อสแกนโค้ด QR ด้านล่างเพื่อเติมเงิน', - 'account.qrCodePlaceholder': 'ตัวยึดรหัส QR (การจำลอง)', - 'account.rechargeAmount': 'จำนวนการเติมเงิน', - 'account.enterAmount': 'กรุณากรอกจำนวนเงินที่เติม', - 'account.rechargeHint': 'จำนวนเงินฝากขั้นต่ำ: 1 QDT', - 'account.confirmRecharge': 'ยืนยันการเติมเงิน', - 'account.enterValidAmount': 'กรุณากรอกจำนวนเงินที่เติมให้ถูกต้อง', - 'account.rechargeSuccess': 'เติมเงินสำเร็จ!ฝากแล้ว {amount} QDT', - 'account.settings.menuMap.basic': 'การตั้งค่าพื้นฐาน', - 'account.settings.menuMap.security': 'การตั้งค่าความปลอดภัย', - 'account.settings.menuMap.notification': 'การแจ้งเตือนข้อความใหม่', - 'account.settings.menuMap.moneyLog': 'รายละเอียดกองทุน', - 'account.moneyLog.empty': 'ยังไม่มีรายละเอียดกองทุน', - 'account.moneyLog.total': 'รวม {total} บันทึก', - 'account.moneyLog.type.purchase': 'ตัวบ่งชี้การซื้อ', - 'account.moneyLog.type.recharge': 'เติมเงิน', - 'account.moneyLog.type.refund': 'คืนเงิน', - 'account.moneyLog.type.reward': 'รางวัล', - 'account.moneyLog.type.income': 'ตัวชี้วัดรายได้', - 'account.moneyLog.type.commission': 'ค่าธรรมเนียมการจัดการแพลตฟอร์ม', - 'wallet.balance': 'ยอดคงเหลือ QDT', - 'wallet.recharge': 'เติมเงิน', - 'wallet.withdraw': 'ถอนเงินสด', - 'wallet.filter': 'กรอง', - 'wallet.reset': 'รีเซ็ต', - 'wallet.totalRecharge': 'การเติมเงินสะสม', - 'wallet.totalWithdraw': 'การถอนเงินสะสม', - 'wallet.totalIncome': 'รายได้สะสม', - 'wallet.records': 'บันทึกการทำธุรกรรมและรายละเอียดกองทุน', - 'wallet.tradingRecords': 'ประวัติการทำธุรกรรม', - 'wallet.moneyLog': 'รายละเอียดกองทุน', - 'wallet.rechargeTip': 'โปรดใช้ WeChat หรือ Alipay เพื่อสแกนโค้ด QR ด้านล่างเพื่อเติมเงิน', - 'wallet.qrCodePlaceholder': 'ตัวยึดรหัส QR (การจำลอง)', - 'wallet.rechargeAmount': 'จำนวนการเติมเงิน', - 'wallet.enterAmount': 'กรุณากรอกจำนวนเงินที่เติม', - 'wallet.rechargeHint': 'จำนวนเงินฝากขั้นต่ำ: 1 QDT', - 'wallet.confirmRecharge': 'ยืนยันการเติมเงิน', - 'wallet.enterValidAmount': 'กรุณากรอกจำนวนเงินที่เติมให้ถูกต้อง', - 'wallet.rechargeSuccess': 'เติมเงินสำเร็จ!ฝากแล้ว {amount} QDT', - 'wallet.rechargeFailed': 'การเติมเงินล้มเหลว', - 'wallet.withdrawTip': 'กรุณากรอกจำนวนเงินที่ถอนและที่อยู่การถอน', - 'wallet.withdrawAmount': 'ถอนจำนวนเงิน', - 'wallet.enterWithdrawAmount': 'กรุณากรอกจำนวนเงินที่ถอน', - 'wallet.withdrawHint': 'จำนวนถอนขั้นต่ำ: 1 QDT', - 'wallet.withdrawAddress': 'ที่อยู่การถอนเงิน (ไม่บังคับ)', - 'wallet.enterWithdrawAddress': 'กรุณากรอกที่อยู่การถอนเงิน', - 'wallet.confirmWithdraw': 'ยืนยันการถอนเงิน', - 'wallet.enterValidWithdrawAmount': 'กรุณากรอกจำนวนเงินที่ถอนให้ถูกต้อง', - 'wallet.insufficientBalance': 'ยอดคงเหลือไม่เพียงพอ', - 'wallet.withdrawSuccess': 'การถอนเงินสำเร็จ!ถอนออก {amount} QDT', - 'wallet.withdrawFailed': 'การถอนเงินล้มเหลว', - 'wallet.noTradingRecords': 'ยังไม่มีบันทึกการทำธุรกรรม', - 'wallet.noMoneyLog': 'ยังไม่มีรายละเอียดกองทุน', - 'wallet.loadTradingRecordsFailed': 'โหลดบันทึกธุรกรรมไม่สำเร็จ', - 'wallet.loadMoneyLogFailed': 'โหลดรายละเอียดกองทุนไม่สำเร็จ', - 'wallet.moneyLogTotal': 'รวม {total} บันทึก', - 'wallet.moneyLogTypeTitle': 'พิมพ์', - 'wallet.moneyLogType.all': 'ทุกประเภท', - 'wallet.table.time': 'เวลา', - 'wallet.table.type': 'พิมพ์', - 'wallet.table.price': 'ราคา', - 'wallet.table.amount': 'ปริมาณ', - 'wallet.table.money': 'จำนวน', - 'wallet.table.balance': 'สมดุล', - 'wallet.table.memo': 'หมายเหตุ', - 'wallet.table.value': 'ค่า', - 'wallet.table.profit': 'กำไรและขาดทุน', - 'wallet.table.commission': 'ค่าธรรมเนียมการจัดการ', - 'wallet.table.total': 'รวม {total} บันทึก', - 'wallet.tradeType.buy': 'ซื้อ', - 'wallet.tradeType.sell': 'ขาย', - 'wallet.tradeType.liquidation': 'บังคับให้เลิกกิจการ', - 'wallet.tradeType.openLong': 'เปิดยาวๆ', - 'wallet.tradeType.addLong': 'กาดอต', - 'wallet.tradeType.closeLong': 'ปินตัว', - 'wallet.tradeType.closeLongStop': 'หยุดขาดทุนและยาว', - 'wallet.tradeType.closeLongProfit': 'ขายทำกำไรและระดับมากขึ้น', - 'wallet.tradeType.openShort': 'เปิดสั้น', - 'wallet.tradeType.addShort': 'เพิ่มสั้น', - 'wallet.tradeType.closeShort': 'ว่างเปล่า', - 'wallet.tradeType.closeShortStop': 'หยุดการสูญเสีย', - 'wallet.tradeType.closeShortProfit': 'ขายทำกำไรและปิดการขาย', - 'wallet.moneyLogType.purchase': 'ตัวบ่งชี้การซื้อ', - 'wallet.moneyLogType.recharge': 'เติมเงิน', - 'wallet.moneyLogType.withdraw': 'ถอนเงินสด', - 'wallet.moneyLogType.refund': 'คืนเงิน', - 'wallet.moneyLogType.reward': 'รางวัล', - 'wallet.moneyLogType.income': 'รายได้', - 'wallet.moneyLogType.commission': 'ค่าธรรมเนียมการจัดการ', - 'wallet.web3Address.required': 'กรุณากรอกที่อยู่กระเป๋าเงิน Web3 ก่อน', - 'wallet.web3Address.requiredDescription': 'ก่อนที่จะเติมเงิน คุณต้องผูกที่อยู่กระเป๋าเงิน Web3 ของคุณเพื่อรับการเติมเงิน', - 'wallet.web3Address.placeholder': 'โปรดป้อนที่อยู่กระเป๋าเงิน Web3 ของคุณ (เริ่มต้นด้วย 0x)', - 'wallet.web3Address.save': 'บันทึกที่อยู่กระเป๋าเงิน', - 'wallet.web3Address.saveSuccess': 'บันทึกที่อยู่ Wallet เรียบร้อยแล้ว', - 'wallet.web3Address.saveFailed': 'ไม่สามารถบันทึกที่อยู่กระเป๋าสตางค์ได้', - 'wallet.web3Address.invalidFormat': 'โปรดป้อนที่อยู่กระเป๋าเงิน Web3 ที่ถูกต้อง (รูปแบบ Ethereum: 42 ตัวอักษรเริ่มต้นด้วย 0x หรือรูปแบบ TRC20: 34 ตัวอักษรเริ่มต้นด้วย T)', - 'wallet.selectCoin': 'เลือกสกุลเงิน', - 'wallet.selectChain': 'ห่วงโซ่การคัดเลือก', - 'wallet.chain.eth': 'ผลประโยชน์ทับซ้อน (ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'บีเอสซี', - 'wallet.targetQdtAmount': 'จำนวน QDT ที่คุณต้องการแลก (ไม่บังคับ)', - 'wallet.targetQdtAmount.placeholder': 'กรุณากรอกจำนวน QDT ที่คุณต้องการแลกเปลี่ยน ราคา QDT ปัจจุบันคือ: {price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': 'ต้องเติมเงิน: {amount} USDT', - 'wallet.rechargeAddress': 'ที่อยู่เติมเงิน', - 'wallet.copyAddress': 'สำเนา', - 'wallet.copySuccess': 'คัดลอกสำเร็จ!', - 'wallet.copyFailed': 'การคัดลอกล้มเหลว โปรดคัดลอกด้วยตนเอง', - 'wallet.rechargeAddressHint': 'โปรดตรวจสอบให้แน่ใจว่าได้ใช้เครือข่าย {chain} เพื่อฝาก {coin} ไปยังที่อยู่นี้', - 'wallet.qdtPrice.loading': 'กำลังโหลด...', - 'wallet.rechargeTip.new': 'โปรดเลือกสกุลเงินและห่วงโซ่ จากนั้นสแกนโค้ด QR ด้านล่างเพื่อเติมเงิน', - 'wallet.exchangeRate': '1 คิวดีที กลับไปยัง {rate} ดอลลาร์สหรัฐ', - 'wallet.withdrawableAmount': 'จำนวนเงินสดที่มีอยู่', - 'wallet.totalBalance': 'ยอดรวม', - 'wallet.insufficientWithdrawable': 'จำนวนเงินสดที่สามารถถอนออกได้ไม่เพียงพอ เงินสดที่มีอยู่ในปัจจุบันคือ: {amount} QDT', - 'wallet.withdrawAddressRequired': 'กรุณากรอกที่อยู่การถอนเงิน', - 'wallet.withdrawAddressHint': 'โปรดตรวจสอบให้แน่ใจว่าที่อยู่ถูกต้อง หลังจากถอนแล้วไม่สามารถเพิกถอนได้', - 'wallet.withdrawSubmitSuccess': 'ส่งใบสมัครถอนเรียบร้อยแล้ว โปรดรอการตรวจสอบ', - 'menu.footer.contactUs': 'ติดต่อเรา', - 'menu.footer.getSupport': 'รับการสนับสนุน', - 'menu.footer.socialAccounts': 'บัญชีโซเชียล', - 'menu.footer.userAgreement': 'ข้อตกลงผู้ใช้', - 'menu.footer.privacyPolicy': 'นโยบายความเป็นส่วนตัว', - 'menu.footer.support': 'สนับสนุน', - 'menu.footer.featureRequest': 'คำขอคุณสมบัติ', - 'menu.footer.email': 'อีเมล', - 'menu.footer.liveChat': 'แชทสดทุกวันตลอด 24 ชั่วโมง', - 'dashboard.analysis.title': 'การวิเคราะห์หลายมิติ', - 'dashboard.analysis.subtitle': 'แพลตฟอร์มการวิเคราะห์ทางการเงินที่ครอบคลุมที่ขับเคลื่อนด้วย AI', - 'dashboard.analysis.selectSymbol': 'เลือกหรือป้อนรหัสพื้นฐาน', - 'dashboard.analysis.selectModel': 'เลือกรุ่น', - 'dashboard.analysis.startAnalysis': 'เริ่มการวิเคราะห์', - 'dashboard.analysis.history': 'ประวัติศาสตร์', - 'dashboard.analysis.tab.overview': 'การวิเคราะห์ที่ครอบคลุม', - 'dashboard.analysis.tab.fundamental': 'ความรู้พื้นฐาน', - 'dashboard.analysis.tab.technical': 'เทคโนโลยี', - 'dashboard.analysis.tab.news': 'ข่าว', - 'dashboard.analysis.tab.sentiment': 'อารมณ์', - 'dashboard.analysis.tab.risk': 'เสี่ยง', - 'dashboard.analysis.tab.debate': 'การอภิปรายระยะสั้นยาว', - 'dashboard.analysis.tab.decision': 'การตัดสินใจขั้นสุดท้าย', - 'dashboard.analysis.empty.selectSymbol': 'เลือกเป้าหมายเพื่อเริ่มการวิเคราะห์', - 'dashboard.analysis.empty.selectSymbolDesc': 'เลือกจากรายการหุ้นที่เลือกเองหรือป้อนรหัสที่เกี่ยวข้องเพื่อรับรายงานการวิเคราะห์ AI หลายมิติ', - 'dashboard.analysis.empty.startAnalysis': 'คลิกปุ่ม "เริ่มการวิเคราะห์" เพื่อทำการวิเคราะห์หลายมิติ', - 'dashboard.analysis.empty.startAnalysisDesc': 'เราจะให้การวิเคราะห์ที่ครอบคลุมจากหลายมิติ เช่น ปัจจัยพื้นฐาน เทคโนโลยี ข่าวสาร ความรู้สึก และความเสี่ยง', - 'dashboard.analysis.empty.noData': 'ขณะนี้ไม่มีข้อมูลการวิเคราะห์ {type} โปรดดำเนินการวิเคราะห์ที่ครอบคลุมก่อน', - 'dashboard.analysis.empty.noWatchlist': 'ขณะนี้ไม่มีหุ้นที่เลือกเอง', - 'dashboard.analysis.empty.noHistory': 'ยังไม่มีประวัติ', - 'dashboard.analysis.empty.watchlistHint': 'ขณะนี้ไม่มีหุ้นที่เลือกเองกรุณาก่อน', - 'dashboard.analysis.empty.noDebateData': 'ยังไม่มีข้อมูลการอภิปราย', - 'dashboard.analysis.empty.noDecisionData': 'ยังไม่มีข้อมูลการตัดสินใจ', - 'dashboard.analysis.empty.selectAgent': 'โปรดเลือกตัวแทนเพื่อดูผลการวิเคราะห์', - 'dashboard.analysis.loading.analyzing': 'กำลังวิเคราะห์ กรุณารอสักครู่...', - 'dashboard.analysis.loading.fundamental': 'กำลังวิเคราะห์ข้อมูลพื้นฐาน...', - 'dashboard.analysis.loading.technical': 'กำลังวิเคราะห์ตัวชี้วัดทางเทคนิค...', - 'dashboard.analysis.loading.news': 'กำลังวิเคราะห์ข้อมูลข่าว...', - 'dashboard.analysis.loading.sentiment': 'วิเคราะห์อารมณ์ตลาด...', - 'dashboard.analysis.loading.risk': 'กำลังประเมินความเสี่ยง...', - 'dashboard.analysis.loading.debate': 'การอภิปรายระยะสั้นระยะสั้นกำลังดำเนินอยู่...', - 'dashboard.analysis.loading.decision': 'กำลังสร้างการตัดสินใจขั้นสุดท้าย...', - 'dashboard.analysis.score.overall': 'คะแนนโดยรวม', - 'dashboard.analysis.score.recommendation': 'คำแนะนำการลงทุน', - 'dashboard.analysis.score.confidence': 'ความมั่นใจ', - 'dashboard.analysis.dimension.fundamental': 'ความรู้พื้นฐาน', - 'dashboard.analysis.dimension.technical': 'เทคโนโลยี', - 'dashboard.analysis.dimension.news': 'ข่าว', - 'dashboard.analysis.dimension.sentiment': 'อารมณ์', - 'dashboard.analysis.dimension.risk': 'เสี่ยง', - 'dashboard.analysis.card.dimensionScores': 'การให้คะแนนสำหรับแต่ละมิติ', - 'dashboard.analysis.card.overviewReport': 'รายงานการวิเคราะห์ที่ครอบคลุม', - 'dashboard.analysis.card.financialMetrics': 'ตัวชี้วัดทางการเงิน', - 'dashboard.analysis.card.fundamentalReport': 'รายงานการวิเคราะห์ปัจจัยพื้นฐาน', - 'dashboard.analysis.card.technicalIndicators': 'ตัวชี้วัดทางเทคนิค', - 'dashboard.analysis.card.technicalReport': 'รายงานการวิเคราะห์ทางเทคนิค', - 'dashboard.analysis.card.newsList': 'ข่าวที่เกี่ยวข้อง', - 'dashboard.analysis.card.newsReport': 'รายงานการวิเคราะห์ข่าว', - 'dashboard.analysis.card.sentimentIndicators': 'ตัวบ่งชี้ความรู้สึก', - 'dashboard.analysis.card.sentimentReport': 'รายงานการวิเคราะห์ความรู้สึก', - 'dashboard.analysis.card.riskMetrics': 'ตัวชี้วัดความเสี่ยง', - 'dashboard.analysis.card.riskReport': 'รายงานการประเมินความเสี่ยง', - 'dashboard.analysis.card.bullView': 'มุมมองรั้น (กระทิง)', - 'dashboard.analysis.card.bearView': 'มุมมองหยาบคาย (หมี)', - 'dashboard.analysis.card.researchConclusion': 'ข้อสรุปของผู้วิจัย', - 'dashboard.analysis.card.traderPlan': 'แผนผู้ค้า', - 'dashboard.analysis.card.riskDebate': 'การอภิปรายคณะกรรมการความเสี่ยง', - 'dashboard.analysis.card.finalDecision': 'การตัดสินใจครั้งสุดท้าย', - 'dashboard.analysis.card.tradePlanDetail': 'รายละเอียดแผนการเทรด', - 'dashboard.analysis.tradingPlan.entry_price': 'ราคาค่าเข้าชม', - 'dashboard.analysis.tradingPlan.position_size': 'ขนาดตำแหน่ง', - 'dashboard.analysis.tradingPlan.stop_loss': 'หยุดการสูญเสีย', - 'dashboard.analysis.tradingPlan.take_profit': 'ขายทำกำไร', - 'dashboard.analysis.label.confidence': 'ความมั่นใจ', - 'dashboard.analysis.label.keyPoints': 'จุดหลัก', - 'dashboard.analysis.label.riskWarning': 'คำเตือนความเสี่ยง', - 'dashboard.analysis.risk.risky': 'เสี่ยง', - 'dashboard.analysis.risk.neutral': 'มุมมองที่เป็นกลาง (เป็นกลาง)', - 'dashboard.analysis.risk.safe': 'มุมมองแบบอนุรักษ์นิยม (ปลอดภัย)', - 'dashboard.analysis.risk.conclusion': 'สรุปแล้ว', - 'dashboard.analysis.feature.fundamental': 'การวิเคราะห์พื้นฐาน', - 'dashboard.analysis.feature.technical': 'การวิเคราะห์ทางเทคนิค', - 'dashboard.analysis.feature.news': 'การวิเคราะห์ข่าว', - 'dashboard.analysis.feature.sentiment': 'การวิเคราะห์ความรู้สึก', - 'dashboard.analysis.feature.risk': 'การประเมินความเสี่ยง', - 'dashboard.analysis.watchlist.title': 'การเลือกหุ้นของฉัน', - 'dashboard.analysis.watchlist.add': 'เพิ่มไปที่', - 'dashboard.analysis.watchlist.addStock': 'เพิ่มสต็อก', - 'dashboard.analysis.modal.addStock.title': 'เพิ่มหุ้นเสริม', - 'dashboard.analysis.modal.addStock.confirm': 'แน่นอน', - 'dashboard.analysis.modal.addStock.cancel': 'ยกเลิก', - 'dashboard.analysis.modal.addStock.market': 'ประเภทตลาด', - 'dashboard.analysis.modal.addStock.marketPlaceholder': 'กรุณาเลือกตลาด', - 'dashboard.analysis.modal.addStock.marketRequired': 'กรุณาเลือกประเภทตลาด', - 'dashboard.analysis.modal.addStock.symbol': 'รหัสสต๊อกสินค้า', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': 'ตัวอย่างเช่น: AAPL, TSLA, GOOGL, 000001, BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': 'กรุณากรอกรหัสสต๊อกสินค้า', - 'dashboard.analysis.modal.addStock.searchPlaceholder': 'ค้นหารหัสหรือชื่อเป้าหมาย', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': 'ค้นหาหรือป้อนรหัสอ้างอิง (เช่น AAPL, BTC/USDT, EUR/USD)', - 'dashboard.analysis.modal.addStock.searchOrInputHint': 'รองรับการค้นหาวัตถุในฐานข้อมูลหรือป้อนรหัสโดยตรง (ระบบจะรับชื่อโดยอัตโนมัติ)', - 'dashboard.analysis.modal.addStock.search': 'ค้นหา', - 'dashboard.analysis.modal.addStock.searchResults': 'ผลการค้นหา', - 'dashboard.analysis.modal.addStock.hotSymbols': 'เป้าหมายยอดนิยม', - 'dashboard.analysis.modal.addStock.noHotSymbols': 'ยังไม่มีเป้าหมายยอดนิยม', - 'dashboard.analysis.modal.addStock.selectedSymbol': 'เลือกแล้ว', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': 'โปรดเลือกเป้าหมายก่อน', - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': 'โปรดเลือกเป้าหมายหรือป้อนรหัสเป้าหมายก่อน', - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': 'กรุณากรอกรหัสเป้าหมาย', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': 'โปรดเลือกประเภทตลาดก่อน', - 'dashboard.analysis.modal.addStock.searchFailed': 'การค้นหาล้มเหลว โปรดลองอีกครั้งในภายหลัง', - 'dashboard.analysis.modal.addStock.noSearchResults': 'ไม่พบเป้าหมายที่ตรงกัน', - 'dashboard.analysis.modal.addStock.willAutoFetchName': 'ระบบจะรับชื่อให้อัตโนมัติ', - 'dashboard.analysis.modal.addStock.addDirectly': 'เพิ่มโดยตรง', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': 'ชื่อจะถูกหยิบขึ้นมาโดยอัตโนมัติเมื่อเพิ่ม', - 'dashboard.analysis.market.AShare': 'มีหุ้น', - 'dashboard.analysis.market.USStock': 'หุ้นสหรัฐ', - 'dashboard.analysis.market.HShare': 'หุ้นฮ่องกง', - 'dashboard.analysis.market.Crypto': 'สกุลเงินดิจิทัล', - 'dashboard.analysis.market.Forex': 'ฟอเร็กซ์', - 'dashboard.analysis.market.Futures': 'ฟิวเจอร์ส', - 'dashboard.analysis.modal.history.title': 'บันทึกการวิเคราะห์ทางประวัติศาสตร์', - 'dashboard.analysis.modal.history.viewResult': 'ดูผลลัพธ์', - 'dashboard.analysis.modal.history.completeTime': 'เวลาเสร็จสิ้น', - 'dashboard.analysis.modal.history.error': 'ความผิดพลาด', - 'dashboard.analysis.status.pending': 'รอดำเนินการ', - 'dashboard.analysis.status.processing': 'กำลังประมวลผล', - 'dashboard.analysis.status.completed': 'สมบูรณ์', - 'dashboard.analysis.status.failed': 'ล้มเหลว', - 'dashboard.analysis.message.selectSymbol': 'โปรดเลือกเป้าหมายก่อน', - 'dashboard.analysis.message.taskCreated': 'งานการวิเคราะห์ได้ถูกสร้างขึ้นแล้วและกำลังดำเนินการอยู่เบื้องหลัง...', - 'dashboard.analysis.message.analysisComplete': 'การวิเคราะห์เสร็จสมบูรณ์', - 'dashboard.analysis.message.analysisCompleteCache': 'การวิเคราะห์เสร็จสมบูรณ์ (ใช้ข้อมูลที่แคชไว้)', - 'dashboard.analysis.message.analysisFailed': 'การวิเคราะห์ล้มเหลว โปรดลองอีกครั้งในภายหลัง', - 'dashboard.analysis.message.addStockSuccess': 'เพิ่มเรียบร้อยแล้ว', - 'dashboard.analysis.message.addStockFailed': 'เพิ่มล้มเหลว', - 'dashboard.analysis.message.removeStockSuccess': 'ลบสำเร็จแล้ว', - 'dashboard.analysis.message.removeStockFailed': 'การลบล้มเหลว', - 'dashboard.analysis.message.resumingAnalysis': 'กำลังดำเนินการงานวิเคราะห์ต่อ...', - 'dashboard.analysis.message.deleteSuccess': 'ลบสำเร็จแล้ว', - 'dashboard.analysis.message.deleteFailed': 'การลบล้มเหลว', - 'dashboard.analysis.modal.history.delete': 'ลบ', - 'dashboard.analysis.modal.history.deleteConfirm': 'คุณแน่ใจหรือไม่ว่าต้องการลบบันทึกการวิเคราะห์นี้?', - 'dashboard.analysis.test': 'ร้านค้าเลขที่ {no} ถนน Gongzhan', - 'dashboard.analysis.introduce': 'คำอธิบายตัวบ่งชี้', - 'dashboard.analysis.total-sales': 'ยอดขายรวม', - 'dashboard.analysis.day-sales': 'ยอดขายเฉลี่ยต่อวัน¥', - 'dashboard.analysis.visits': 'การเข้าชม', - 'dashboard.analysis.visits-trend': 'แนวโน้มการเข้าชม', - 'dashboard.analysis.visits-ranking': 'อันดับการเข้าชมร้านค้า', - 'dashboard.analysis.day-visits': 'การเข้าชมรายวัน', - 'dashboard.analysis.week': 'รายสัปดาห์ปีต่อปี', - 'dashboard.analysis.day': 'ปีต่อปี', - 'dashboard.analysis.payments': 'จำนวนการชำระเงิน', - 'dashboard.analysis.conversion-rate': 'อัตราการแปลง', - 'dashboard.analysis.operational-effect': 'ผลกระทบจากกิจกรรมการดำเนินงาน', - 'dashboard.analysis.sales-trend': 'แนวโน้มการขาย', - 'dashboard.analysis.sales-ranking': 'อันดับยอดขายของร้าน', - 'dashboard.analysis.all-year': 'ประจำปี', - 'dashboard.analysis.all-month': 'เดือนนี้', - 'dashboard.analysis.all-week': 'สัปดาห์นี้', - 'dashboard.analysis.all-day': 'วันนี้', - 'dashboard.analysis.search-users': 'จำนวนผู้ใช้การค้นหา', - 'dashboard.analysis.per-capita-search': 'การค้นหาต่อหัว', - 'dashboard.analysis.online-top-search': 'การค้นหายอดนิยมออนไลน์', - 'dashboard.analysis.the-proportion-of-sales': 'สัดส่วนประเภทการขาย', - 'dashboard.analysis.dropdown-option-one': 'ปฏิบัติการที่หนึ่ง', - 'dashboard.analysis.dropdown-option-two': 'ปฏิบัติการ 2', - 'dashboard.analysis.channel.all': 'ทุกช่อง', - 'dashboard.analysis.channel.online': 'ออนไลน์', - 'dashboard.analysis.channel.stores': 'เก็บ', - 'dashboard.analysis.sales': 'ฝ่ายขาย', - 'dashboard.analysis.traffic': 'การไหลของผู้โดยสาร', - 'dashboard.analysis.table.rank': 'การจัดอันดับ', - 'dashboard.analysis.table.search-keyword': 'ค้นหาคำสำคัญ', - 'dashboard.analysis.table.users': 'จำนวนผู้ใช้', - 'dashboard.analysis.table.weekly-range': 'เพิ่มขึ้นรายสัปดาห์', - 'dashboard.indicator.selectSymbol': 'เลือกหรือป้อนรหัสพื้นฐาน', - 'dashboard.indicator.emptyWatchlistHint': 'ขณะนี้ไม่มีหุ้นที่เลือกเอง กรุณาเพิ่มก่อน', - 'dashboard.indicator.hint.selectSymbol': 'โปรดเลือกเป้าหมายเพื่อเริ่มการวิเคราะห์', - 'dashboard.indicator.hint.selectSymbolDesc': 'เลือกหรือป้อนรหัสหุ้นในช่องค้นหาด้านบนเพื่อดูกราฟ K-line และตัวชี้วัดทางเทคนิค', - 'dashboard.indicator.retry': 'ลองอีกครั้ง', - 'dashboard.indicator.panel.title': 'ตัวชี้วัดทางเทคนิค', - 'dashboard.indicator.panel.realtimeOn': 'ปิดการอัพเดตแบบเรียลไทม์', - 'dashboard.indicator.panel.realtimeOff': 'เปิดใช้งานการอัปเดตแบบเรียลไทม์', - 'dashboard.indicator.panel.themeLight': 'เปลี่ยนเป็นธีมสีเข้ม', - 'dashboard.indicator.panel.themeDark': 'เปลี่ยนเป็นธีมสว่าง', - 'dashboard.indicator.section.enabled': 'เปิดใช้งานแล้ว', - 'dashboard.indicator.section.added': 'ตัวบ่งชี้ที่ฉันเพิ่ม', - 'dashboard.indicator.section.custom': 'ตัวชี้วัดที่สร้างขึ้นด้วยตัวเอง', - 'dashboard.indicator.section.bought': 'ตัวบ่งชี้ที่ฉันซื้อ', - 'dashboard.indicator.section.myCreated': 'ตัวบ่งชี้ที่ฉันสร้างขึ้น', - 'dashboard.indicator.empty': 'ยังไม่มีตัวบ่งชี้ โปรดเพิ่มหรือสร้างตัวบ่งชี้ก่อน', - 'dashboard.indicator.buy': 'ตัวบ่งชี้การซื้อ', - 'dashboard.indicator.action.start': 'เริ่มต้นขึ้น', - 'dashboard.indicator.action.stop': 'ปิด', - 'dashboard.indicator.action.edit': 'แก้ไข', - 'dashboard.indicator.action.delete': 'ลบ', - 'dashboard.indicator.action.backtest': 'การทดสอบย้อนหลัง', - 'dashboard.indicator.status.normal': 'ปกติ', - 'dashboard.indicator.status.normalPermanent': 'ปกติ (ใช้ได้ถาวร)', - 'dashboard.indicator.status.expired': 'หมดอายุแล้ว', - 'dashboard.indicator.expiry.permanent': 'มีผลถาวร', - 'dashboard.indicator.expiry.noExpiry': 'ไม่มีเวลาหมดอายุ', - 'dashboard.indicator.expiry.expired': 'หมดอายุ: {date}', - 'dashboard.indicator.expiry.expiresOn': 'เวลาหมดอายุ: {date}', - 'dashboard.indicator.delete.confirmTitle': 'ยืนยันการลบ', - 'dashboard.indicator.delete.confirmContent': 'คุณแน่ใจหรือไม่ว่าต้องการลบตัวบ่งชี้ "{name}"?การดำเนินการนี้ไม่สามารถย้อนกลับได้', - 'dashboard.indicator.delete.confirmOk': 'ลบ', - 'dashboard.indicator.delete.confirmCancel': 'ยกเลิก', - 'dashboard.indicator.delete.success': 'ลบสำเร็จ', - 'dashboard.indicator.delete.failed': 'ลบไม่สำเร็จ', - 'dashboard.indicator.save.success': 'บันทึกเรียบร้อยแล้ว', - 'dashboard.indicator.save.failed': 'บันทึกล้มเหลว', - 'dashboard.indicator.error.loadWatchlistFailed': 'ไม่สามารถโหลดหุ้นเสริมได้', - 'dashboard.indicator.error.chartNotReady': 'ส่วนประกอบแผนภูมิไม่ได้เตรียมใช้งาน โปรดเลือกเป้าหมายก่อนแล้วรอให้แผนภูมิโหลด', - 'dashboard.indicator.error.chartMethodNotReady': 'วิธีส่วนประกอบแผนภูมิไม่พร้อม โปรดลองอีกครั้งในภายหลัง', - 'dashboard.indicator.error.chartExecuteNotReady': 'วิธีดำเนินการส่วนประกอบแผนภูมิไม่พร้อม โปรดลองอีกครั้งในภายหลัง', - 'dashboard.indicator.error.parseFailed': 'ไม่สามารถแยกวิเคราะห์โค้ด Python', - 'dashboard.indicator.error.parseFailedCheck': 'ไม่สามารถแยกวิเคราะห์โค้ด Python ได้ โปรดตรวจสอบรูปแบบโค้ด', - 'dashboard.indicator.error.addIndicatorFailed': 'ไม่สามารถเพิ่มตัวบ่งชี้ได้', - 'dashboard.indicator.error.runIndicatorFailed': 'ตัวบ่งชี้การทำงานล้มเหลว', - 'dashboard.indicator.error.pleaseLogin': 'กรุณาเข้าสู่ระบบก่อน', - 'dashboard.indicator.error.loadDataFailed': 'การโหลดข้อมูลล้มเหลว', - 'dashboard.indicator.error.loadDataFailedDesc': 'โปรดตรวจสอบการเชื่อมต่อเครือข่าย', - 'dashboard.indicator.error.pythonEngineFailed': 'โหลดกลไก Python ล้มเหลวและฟังก์ชันตัวบ่งชี้อาจไม่พร้อมใช้งาน', - 'dashboard.indicator.error.chartInitFailed': 'การเริ่มต้นแผนภูมิล้มเหลว', - 'dashboard.indicator.warning.enterCode': 'กรุณากรอกรหัสตัวบ่งชี้ก่อน', - 'dashboard.indicator.warning.pyodideLoadFailed': 'โปรแกรม Python ไม่สามารถโหลดได้', - 'dashboard.indicator.warning.pyodideLoadFailedDesc': 'คุณสมบัตินี้ไม่สามารถใช้ได้ในภูมิภาคหรือสภาพแวดล้อมเครือข่ายปัจจุบันของคุณ', - 'dashboard.indicator.warning.chartNotInitialized': 'แผนภูมิไม่ได้เตรียมใช้งานและไม่สามารถใช้เครื่องมือวาดเส้นได้', - 'dashboard.indicator.success.runIndicator': 'ตัวบ่งชี้ทำงานสำเร็จ', - 'dashboard.indicator.success.clearDrawings': 'ล้างภาพวาดเส้นทั้งหมดแล้ว', - 'dashboard.indicator.sma': 'SMA (ชุดค่าผสมค่าเฉลี่ยเคลื่อนที่)', - 'dashboard.indicator.ema': 'EMA (ชุดค่าผสมค่าเฉลี่ยเคลื่อนที่เอ็กซ์โปเนนเชียล)', - 'dashboard.indicator.rsi': 'RSI (ความแรงสัมพัทธ์)', - 'dashboard.indicator.macd': 'MACD', - 'dashboard.indicator.bb': 'โบลินเจอร์ แบนด์', - 'dashboard.indicator.atr': 'ATR (ช่วงที่แท้จริงเฉลี่ย)', - 'dashboard.indicator.cci': 'CCI (ดัชนีช่องสินค้าโภคภัณฑ์)', - 'dashboard.indicator.williams': 'วิลเลียมส์ %R (ตัวบ่งชี้วิลเลียมส์)', - 'dashboard.indicator.mfi': 'MFI (ดัชนีการไหลของเงิน)', - 'dashboard.indicator.adx': 'ADX (ดัชนีแนวโน้มเฉลี่ย)', - 'dashboard.indicator.obv': 'OBV (คลื่นพลังงาน)', - 'dashboard.indicator.adosc': 'ADOSC (ออสซิลเลเตอร์สะสม/ส่ง)', - 'dashboard.indicator.ad': 'AD (เส้นการสะสม/การกระจาย)', - 'dashboard.indicator.kdj': 'KDJ (ตัวบ่งชี้สุ่ม)', - 'dashboard.indicator.signal.buy': 'ซื้อ', - 'dashboard.indicator.signal.sell': 'ขาย', - 'dashboard.indicator.signal.supertrendBuy': 'ซื้อ SuperTrend', - 'dashboard.indicator.signal.supertrendSell': 'ขาย SuperTrend', - 'dashboard.indicator.chart.kline': 'เคไลน์', - 'dashboard.indicator.chart.volume': 'ปริมาณ', - 'dashboard.indicator.chart.uptrend': 'อัพเทรนด์', - 'dashboard.indicator.chart.downtrend': 'เทรนด์ขาลง', - 'dashboard.indicator.tooltip.time': 'เวลา', - 'dashboard.indicator.tooltip.open': 'เปิด', - 'dashboard.indicator.tooltip.close': 'รับ', - 'dashboard.indicator.tooltip.high': 'สูง', - 'dashboard.indicator.tooltip.low': 'ต่ำ', - 'dashboard.indicator.tooltip.volume': 'ปริมาณ', - 'dashboard.indicator.drawing.line': 'ส่วนของเส้น', - 'dashboard.indicator.drawing.horizontalLine': 'เส้นแนวนอน', - 'dashboard.indicator.drawing.verticalLine': 'เส้นแนวตั้ง', - 'dashboard.indicator.drawing.ray': 'รังสี', - 'dashboard.indicator.drawing.straightLine': 'เส้นตรง', - 'dashboard.indicator.drawing.parallelLine': 'เส้นขนาน', - 'dashboard.indicator.drawing.priceLine': 'เส้นราคา', - 'dashboard.indicator.drawing.priceChannel': 'ช่องราคา', - 'dashboard.indicator.drawing.fibonacciLine': 'เส้นฟีโบนักชี', - 'dashboard.indicator.drawing.clearAll': 'ล้างภาพวาดเส้นทั้งหมด', - 'dashboard.indicator.market.AShare': 'มีหุ้น', - 'dashboard.indicator.market.USStock': 'หุ้นสหรัฐ', - 'dashboard.indicator.market.HShare': 'หุ้นฮ่องกง', - 'dashboard.indicator.market.Crypto': 'สกุลเงินดิจิทัล', - 'dashboard.indicator.market.Forex': 'ฟอเร็กซ์', - 'dashboard.indicator.market.Futures': 'ฟิวเจอร์ส', - 'dashboard.indicator.create': 'สร้างตัวบ่งชี้', - 'dashboard.indicator.editor.title': 'สร้าง/แก้ไขตัวบ่งชี้', - 'dashboard.indicator.editor.name': 'ชื่อตัวบ่งชี้', - 'dashboard.indicator.editor.nameRequired': 'กรุณากรอกชื่อตัวบ่งชี้', - 'dashboard.indicator.editor.namePlaceholder': 'กรุณากรอกชื่อตัวบ่งชี้', - 'dashboard.indicator.editor.description': 'คำอธิบายตัวบ่งชี้', - 'dashboard.indicator.editor.descriptionPlaceholder': 'โปรดป้อนคำอธิบายของตัวบ่งชี้ (ตัวเลือก)', - 'dashboard.indicator.editor.code': 'รหัสหลาม', - 'dashboard.indicator.editor.codeRequired': 'กรุณากรอกรหัสตัวบ่งชี้', - 'dashboard.indicator.editor.codePlaceholder': 'กรุณากรอกรหัสไพธอน', - 'dashboard.indicator.editor.run': 'วิ่ง', - 'dashboard.indicator.editor.runHint': 'คลิกปุ่มเรียกใช้เพื่อดูตัวอย่างเอฟเฟกต์ตัวบ่งชี้บนแผนภูมิเส้น K', - 'dashboard.indicator.editor.guide': 'คู่มือการพัฒนา', - 'dashboard.indicator.editor.guideTitle': 'คู่มือการพัฒนาตัวบ่งชี้ Python', - 'dashboard.indicator.editor.save': 'บันทึก', - 'dashboard.indicator.editor.cancel': 'ยกเลิก', - 'dashboard.indicator.editor.unnamed': 'ตัวบ่งชี้ที่ไม่มีชื่อ', - 'dashboard.indicator.editor.publishToCommunity': 'โพสต์ไปที่ชุมชน', - 'dashboard.indicator.editor.publishToCommunityHint': 'เมื่อเผยแพร่แล้ว ผู้ใช้รายอื่นจะสามารถดูและใช้ตัวบ่งชี้ของคุณในชุมชนได้', - 'dashboard.indicator.editor.indicatorType': 'ประเภทตัวบ่งชี้', - 'dashboard.indicator.editor.indicatorTypeRequired': 'โปรดเลือกประเภทตัวบ่งชี้', - 'dashboard.indicator.editor.indicatorTypePlaceholder': 'โปรดเลือกประเภทตัวบ่งชี้', - 'dashboard.indicator.editor.previewImage': 'ดูตัวอย่าง', - 'dashboard.indicator.editor.uploadImage': 'อัพโหลดรูปภาพ', - 'dashboard.indicator.editor.previewImageHint': 'ขนาดที่แนะนำ: 800x400 ไม่เกิน 2MB', - 'dashboard.indicator.editor.pricing': 'ราคาขาย (QDT)', - 'dashboard.indicator.editor.pricingType.free': 'ฟรี', - 'dashboard.indicator.editor.pricingType.permanent': 'ถาวร', - 'dashboard.indicator.editor.pricingType.monthly': 'การชำระเงินรายเดือน', - 'dashboard.indicator.editor.price': 'ราคา', - 'dashboard.indicator.editor.priceRequired': 'กรุณากรอกราคา', - 'dashboard.indicator.editor.pricePlaceholder': 'กรุณากรอกราคา', - 'dashboard.indicator.editor.pricingHint': 'แม้ว่าราคาของตัวบ่งชี้ฟรีจะเป็น 0 แต่แพลตฟอร์มจะให้รางวัลแก่คุณ (QDT) ตามการใช้ตัวบ่งชี้และอัตราการชมเชยของคุณ', - 'dashboard.indicator.editor.aiGenerate': 'รุ่นอัจฉริยะ', - 'dashboard.indicator.editor.aiPromptPlaceholder': 'บอกความคิดของคุณมาให้ฉัน แล้วฉันจะสร้างโค้ดตัวบ่งชี้ Python ให้กับคุณ', - 'dashboard.indicator.editor.aiGenerateBtn': 'AI สร้างโค้ด', - 'dashboard.indicator.editor.aiPromptRequired': 'กรุณากรอกความคิดของคุณ', - 'dashboard.indicator.editor.aiGenerateSuccess': 'การสร้างรหัสสำเร็จ', - 'dashboard.indicator.editor.aiGenerateError': 'การสร้างโค้ดล้มเหลว โปรดลองอีกครั้งในภายหลัง', - 'dashboard.indicator.backtest.title': 'ตัวบ่งชี้ย้อนกลับ', - 'dashboard.indicator.backtest.config': 'พารามิเตอร์การทดสอบย้อนกลับ', - 'dashboard.indicator.backtest.startDate': 'วันที่เริ่มต้น', - 'dashboard.indicator.backtest.endDate': 'วันที่สิ้นสุด', - 'dashboard.indicator.backtest.selectStartDate': 'เลือกวันที่เริ่มต้น', - 'dashboard.indicator.backtest.selectEndDate': 'เลือกวันที่สิ้นสุด', - 'dashboard.indicator.backtest.startDateRequired': 'โปรดเลือกวันที่เริ่มต้น', - 'dashboard.indicator.backtest.endDateRequired': 'โปรดเลือกวันที่สิ้นสุด', - 'dashboard.indicator.backtest.initialCapital': 'ทุนเริ่มต้น', - 'dashboard.indicator.backtest.initialCapitalRequired': 'กรุณากรอกเงินทุนเริ่มต้น', - 'dashboard.indicator.backtest.commission': 'ค่าธรรมเนียมการจัดการ', - 'dashboard.indicator.backtest.leverage': 'อัตราส่วนเลเวอเรจ', - 'dashboard.indicator.backtest.tradeDirection': 'ทิศทางการซื้อขาย', - 'dashboard.indicator.backtest.longOnly': 'ยาวไป', - 'dashboard.indicator.backtest.shortOnly': 'สั้น', - 'dashboard.indicator.backtest.both': 'สองทาง', - 'dashboard.indicator.backtest.run': 'เริ่มการทดสอบย้อนหลัง', - 'dashboard.indicator.backtest.rerun': 'ทดสอบย้อนหลังอีกครั้ง', - 'dashboard.indicator.backtest.close': 'ปิด', - 'dashboard.indicator.backtest.running': 'อยู่ระหว่างการทดสอบตัวบ่งชี้ย้อนกลับ...', - 'dashboard.indicator.backtest.results': 'ผลการทดสอบย้อนหลัง', - 'dashboard.indicator.backtest.totalReturn': 'ผลตอบแทนรวม', - 'dashboard.indicator.backtest.annualReturn': 'รายได้ต่อปี', - 'dashboard.indicator.backtest.maxDrawdown': 'การเบิกถอนสูงสุด', - 'dashboard.indicator.backtest.sharpeRatio': 'อัตราส่วนความคมชัด', - 'dashboard.indicator.backtest.winRate': 'อัตราการชนะ', - 'dashboard.indicator.backtest.profitFactor': 'อัตราส่วนกำไร-ขาดทุน', - 'dashboard.indicator.backtest.totalTrades': 'จำนวนธุรกรรม', - 'dashboard.indicator.totalReturn': 'ผลตอบแทนรวม', - 'dashboard.indicator.annualReturn': 'อัตราผลตอบแทนต่อปี', - 'dashboard.indicator.maxDrawdown': 'การเบิกถอนสูงสุด', - 'dashboard.indicator.sharpeRatio': 'อัตราส่วนความคมชัด', - 'dashboard.indicator.winRate': 'อัตราการชนะ', - 'dashboard.indicator.profitFactor': 'อัตราส่วนกำไร-ขาดทุน', - 'dashboard.indicator.totalTrades': 'จำนวนธุรกรรมทั้งหมด', - 'dashboard.indicator.backtest.totalCommission': 'ค่าธรรมเนียมการจัดการทั้งหมด', - 'dashboard.indicator.backtest.equityCurve': 'เส้นอัตราผลตอบแทน', - 'dashboard.indicator.backtest.strategy': 'ตัวชี้วัดรายได้', - 'dashboard.indicator.backtest.benchmark': 'ผลตอบแทนมาตรฐาน', - 'dashboard.indicator.backtest.tradeHistory': 'ประวัติการทำธุรกรรม', - 'dashboard.indicator.backtest.tradeTime': 'เวลา', - 'dashboard.indicator.backtest.tradeType': 'พิมพ์', - 'dashboard.indicator.backtest.buy': 'ซื้อ', - 'dashboard.indicator.backtest.sell': 'ขาย', - 'dashboard.indicator.backtest.liquidation': 'การชำระบัญชี', - 'dashboard.indicator.backtest.openLong': 'เปิดยาวๆ', - 'dashboard.indicator.backtest.closeLong': 'ปินตัว', - 'dashboard.indicator.backtest.closeLongStop': 'ใกล้ถึงระยะยาว (หยุดการสูญเสีย)', - 'dashboard.indicator.backtest.closeLongProfit': 'ปิดมากขึ้น (ทำกำไร)', - 'dashboard.indicator.backtest.addLong': 'เพิ่มตำแหน่งยาว', - 'dashboard.indicator.backtest.openShort': 'เปิดสั้น', - 'dashboard.indicator.backtest.closeShort': 'ว่างเปล่า', - 'dashboard.indicator.backtest.closeShortStop': 'ปิด (หยุดการสูญเสีย)', - 'dashboard.indicator.backtest.closeShortProfit': 'ปิด (ทำกำไร)', - 'dashboard.indicator.backtest.addShort': 'เพิ่มตำแหน่งสั้น', - 'dashboard.indicator.backtest.price': 'ราคา', - 'dashboard.indicator.backtest.amount': 'ปริมาณ', - 'dashboard.indicator.backtest.balance': 'ยอดเงินในบัญชี', - 'dashboard.indicator.backtest.profit': 'กำไรและขาดทุน', - 'dashboard.indicator.backtest.success': 'การทดสอบย้อนกลับเสร็จสมบูรณ์', - 'dashboard.indicator.backtest.failed': 'การทดสอบย้อนกลับล้มเหลว โปรดลองอีกครั้งในภายหลัง', - 'dashboard.indicator.backtest.noIndicatorCode': 'ไม่มีรหัสที่ทดสอบย้อนกลับได้สำหรับตัวบ่งชี้นี้', - 'dashboard.indicator.backtest.noSymbol': 'โปรดเลือกเป้าหมายการทำธุรกรรมก่อน', - 'dashboard.indicator.backtest.dateRangeExceeded': 'ช่วงเวลาการทดสอบย้อนหลังเกินขีดจำกัด: {timeframe} รอบสามารถทดสอบย้อนหลังได้สูงสุด {maxRange}', - 'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)', - 'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}', - 'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}', - 'dashboard.indicator.backtest.prev': 'Previous', - 'dashboard.indicator.backtest.next': 'Next', - 'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)', - 'dashboard.indicator.backtest.steps.strategy.title': 'Strategy', - 'dashboard.indicator.backtest.steps.strategy.desc': 'Position sizing & risk controls', - 'dashboard.indicator.backtest.steps.trading.title': 'Trading settings', - 'dashboard.indicator.backtest.steps.trading.desc': 'Time range, capital, fees, leverage', - 'dashboard.indicator.backtest.steps.results.title': 'Results', - 'dashboard.indicator.backtest.steps.results.desc': 'Backtest output', - 'dashboard.indicator.backtest.panel.risk': 'Risk management (SL/TP/Trailing)', - 'dashboard.indicator.backtest.panel.scale': 'Scale in / DCA (trend & mean-reversion)', - 'dashboard.indicator.backtest.panel.reduce': 'Reduce position (trend & adverse)', - 'dashboard.indicator.backtest.panel.position': 'Position sizing', - 'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)', - 'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)', - 'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit', - 'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)', - 'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)', - 'dashboard.indicator.backtest.field.slippage': 'Slippage (%)', - 'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in', - 'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion scale-in', - 'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.dcaAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.dcaAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce', - 'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)', - 'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times', - 'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)', - 'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)', - 'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)', - 'dashboard.indicator.backtest.reduceLong': 'Reduce Long', - 'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)', - 'dashboard.indicator.backtest.reduceShort': 'Reduce Short', - 'dashboard.docs.title': 'ศูนย์เอกสาร', - 'dashboard.docs.search.placeholder': 'ค้นหาเอกสาร...', - 'dashboard.docs.category.all': 'ทั้งหมด', - 'dashboard.docs.category.guide': 'คู่มือการพัฒนา', - 'dashboard.docs.category.api': 'เอกสารประกอบ API', - 'dashboard.docs.category.tutorial': 'บทช่วยสอน', - 'dashboard.docs.category.faq': 'คำถามที่พบบ่อย', - 'dashboard.docs.featured.title': 'เอกสารแนะนำ', - 'dashboard.docs.featured.tag': 'แนะนำ', - 'dashboard.docs.list.views': 'เรียกดู', - 'dashboard.docs.list.author': 'ผู้เขียน', - 'dashboard.docs.list.empty': 'ยังไม่มีเอกสาร', - 'dashboard.docs.list.backToAll': 'กลับไปที่เอกสารทั้งหมด', - 'dashboard.docs.list.total': 'เอกสารทั้งหมด {count}', - 'dashboard.docs.detail.back': 'กลับไปยังรายการเอกสาร', - 'dashboard.docs.detail.updatedAt': 'อัปเดตเมื่อ', - 'dashboard.docs.detail.related': 'เอกสารที่เกี่ยวข้อง', - 'dashboard.docs.detail.notFound': 'ไม่มีเอกสารอยู่', - 'dashboard.docs.detail.error': 'เอกสารไม่มีอยู่หรือถูกลบไปแล้ว', - 'dashboard.docs.search.result': 'ผลการค้นหา', - 'dashboard.docs.search.keyword': 'คำหลัก', - 'community.filter.indicatorType': 'ประเภทตัวบ่งชี้', - 'community.filter.all': 'ทั้งหมด', - 'community.filter.other': 'ตัวเลือกอื่นๆ', - 'community.filter.pricing': 'ประเภทการกำหนดราคา', - 'community.filter.allPricing': 'ราคาทั้งหมด', - 'community.filter.sortBy': 'จัดเรียงตาม', - 'community.filter.search': 'ค้นหา', - 'community.filter.searchPlaceholder': 'ค้นหาชื่อเมตริก', - 'community.indicatorType.trend': 'ประเภทเทรนด์', - 'community.indicatorType.momentum': 'ประเภทโมเมนตัม', - 'community.indicatorType.volatility': 'ความผันผวน', - 'community.indicatorType.volume': 'ปริมาณ', - 'community.indicatorType.custom': 'ปรับแต่ง', - 'community.pricing.free': 'ฟรี', - 'community.pricing.paid': 'จ่าย', - 'community.sort.downloads': 'ดาวน์โหลด', - 'community.sort.rating': 'คะแนน', - 'community.sort.newest': 'รุ่นล่าสุด', - 'community.pagination.total': 'ตัวชี้วัดทั้งหมด {total}', - 'community.noDescription': 'ยังไม่มีคำอธิบาย', - 'community.detail.type': 'พิมพ์', - 'community.detail.pricing': 'ราคา', - 'community.detail.rating': 'คะแนน', - 'community.detail.downloads': 'ดาวน์โหลด', - 'community.detail.author': 'ผู้เขียน', - 'community.detail.description': 'การแนะนำ', - 'community.detail.detailContent': 'คำอธิบายโดยละเอียด', - 'community.detail.backtestStats': 'สถิติการทดสอบย้อนหลัง', - 'community.action.purchase': 'ตัวบ่งชี้การซื้อ', - 'community.action.addToMyIndicators': 'เพิ่มไปยังตัวบ่งชี้ของฉัน', - 'community.action.favorite': 'เก็บรวบรวม', - 'community.action.unfavorite': 'ยกเลิกรายการโปรด', - 'community.action.buyNow': 'ซื้อเลย', - 'community.action.renew': 'ต่ออายุ', - 'community.purchase.price': 'ราคา', - 'community.purchase.permanent': 'ถาวร', - 'community.purchase.monthly': 'ดวงจันทร์', - 'community.purchase.confirmBuy': 'ยืนยันที่จะซื้อตัวบ่งชี้นี้ ({price} QDT)?', - 'community.purchase.confirmRenew': 'ยืนยันที่จะต่ออายุตัวบ่งชี้นี้ ({price} QDT/เดือน) หรือไม่', - 'community.purchase.confirmFree': 'ยืนยันเพื่อเพิ่มตัวบ่งชี้ฟรีนี้หรือไม่', - 'community.purchase.confirmTitle': 'ยืนยันการดำเนินการ', - 'community.purchase.owned': 'คุณได้ซื้อตัวบ่งชี้นี้ (ใช้ได้ถาวร)', - 'community.purchase.ownIndicator': 'นี่คือเมตริกที่คุณเผยแพร่', - 'community.purchase.expired': 'การสมัครของคุณหมดอายุแล้ว', - 'community.purchase.expiresOn': 'เวลาหมดอายุ: {date}', - 'community.tabs.detail': 'รายละเอียดตัวบ่งชี้', - 'community.tabs.backtest': 'ข้อมูลการทดสอบย้อนหลัง', - 'community.tabs.ratings': 'ความคิดเห็นของผู้ใช้', - 'community.rating.myRating': 'คะแนนของฉัน', - 'community.rating.stars': '{count} ดาว', - 'community.rating.commentPlaceholder': 'แบ่งปันประสบการณ์ของคุณ...', - 'community.rating.submit': 'ส่งเรตติ้ง.', - 'community.rating.modify': 'ปรับปรุงใหม่', - 'community.rating.saveModify': 'บันทึกการเปลี่ยนแปลง', - 'community.rating.cancel': 'ยกเลิก', - 'community.rating.selectRating': 'โปรดเลือกการให้คะแนน', - 'community.rating.success': 'เรตติ้งสำเร็จ', - 'community.rating.modifySuccess': 'แก้ไขการตรวจสอบเรียบร้อยแล้ว', - 'community.rating.failed': 'การให้คะแนนล้มเหลว', - 'community.rating.noRatings': 'ยังไม่มีความคิดเห็น', - 'community.backtest.note': 'ข้อมูลข้างต้นเป็นผลการทดสอบย้อนกลับในอดีตและมีไว้เพื่อการอ้างอิงเท่านั้น และไม่ได้แสดงถึงรายได้ในอนาคต', - 'community.backtest.noData': 'ยังไม่มีข้อมูลย้อนหลัง', - 'community.backtest.uploadHint': 'ผู้เขียนยังไม่ได้อัพโหลดข้อมูล backtest', - 'community.message.loadFailed': 'ไม่สามารถโหลดรายการตัวบ่งชี้', - 'community.message.purchaseProcessing': 'กำลังประมวลผลคำขอซื้อ...', - 'community.message.downloadSuccess': 'เพิ่มเมตริกลงในรายการเมตริกของฉันแล้ว', - 'community.message.favoriteSuccess': 'รวบรวมสำเร็จ', - 'community.message.unfavoriteSuccess': 'ยกเลิกการรวบรวมเรียบร้อยแล้ว', - 'community.message.operationSuccess': 'การดำเนินงานประสบความสำเร็จ', - 'community.message.operationFailed': 'การดำเนินการล้มเหลว', - 'community.banner.readOnly': 'อ่านอย่างเดียว', - 'community.banner.loginHint': 'สำหรับการเข้าสู่ระบบหรือการลงทะเบียน กรุณาคลิกปุ่มเพื่อไปยังหน้าอิสระเพื่อหลีกเลี่ยงปัญหา CSRF', - 'community.banner.jumpButton': 'ไปที่เข้าสู่ระบบ/ลงทะเบียน', - 'dashboard.totalEquity': 'ส่วนของผู้ถือหุ้นทั้งหมด', - 'dashboard.totalPnL': 'กำไรและขาดทุนทั้งหมด', - 'dashboard.aiStrategies': 'กลยุทธ์เอไอ', - 'dashboard.indicatorStrategies': 'กลยุทธ์ตัวบ่งชี้', - 'dashboard.running': 'วิ่ง', - 'dashboard.pnlHistory': 'กำไรและขาดทุนในอดีต', - 'dashboard.strategyPerformance': 'อัตราส่วนกำไรและขาดทุนของกลยุทธ์', - 'dashboard.recentTrades': 'การทำธุรกรรมล่าสุด', - 'dashboard.currentPositions': 'ตำแหน่งปัจจุบัน', - 'dashboard.table.time': 'เวลา', - 'dashboard.table.strategy': 'ชื่อกรมธรรม์', - 'dashboard.table.symbol': 'เป้า', - 'dashboard.table.type': 'พิมพ์', - 'dashboard.table.side': 'ทิศทาง', - 'dashboard.table.size': 'เปิดดอกเบี้ย', - 'dashboard.table.entryPrice': 'ราคาเปิดเฉลี่ย', - 'dashboard.table.price': 'ราคา', - 'dashboard.table.amount': 'ปริมาณ', - 'dashboard.table.profit': 'กำไรและขาดทุน', - 'dashboard.pendingOrders': 'บันทึกการดำเนินการคำสั่งซื้อ', - 'dashboard.totalOrders': 'รวม {total} รายการ', - 'dashboard.viewError': 'ดูข้อผิดพลาด', - 'dashboard.filled': 'ดำเนินการแล้ว', - 'dashboard.orderTable.time': 'เวลาที่สร้าง', - 'dashboard.orderTable.strategy': 'กลยุทธ์', - 'dashboard.orderTable.symbol': 'คู่เทรด', - 'dashboard.orderTable.signalType': 'ประเภทสัญญาณ', - 'dashboard.orderTable.amount': 'จำนวน', - 'dashboard.orderTable.price': 'ราคาที่ดำเนินการ', - 'dashboard.orderTable.status': 'สถานะ', - 'dashboard.orderTable.executedAt': 'เวลาที่ดำเนินการ', - 'dashboard.signalType.openLong': 'เปิด Long', - 'dashboard.signalType.openShort': 'เปิด Short', - 'dashboard.signalType.closeLong': 'ปิด Long', - 'dashboard.signalType.closeShort': 'ปิด Short', - 'dashboard.signalType.addLong': 'เพิ่ม Long', - 'dashboard.signalType.addShort': 'เพิ่ม Short', - 'dashboard.status.pending': 'รอดำเนินการ', - 'dashboard.status.processing': 'กำลังดำเนินการ', - 'dashboard.status.completed': 'เสร็จสิ้น', - 'dashboard.status.failed': 'ล้มเหลว', - 'dashboard.status.cancelled': 'ยกเลิกแล้ว', - 'dashboard.table.pnl': 'กำไรหรือขาดทุนที่ยังไม่เกิดขึ้นจริง', - 'form.basic-form.basic.title': 'แบบฟอร์มพื้นฐาน', - 'form.basic-form.basic.description': 'หน้าแบบฟอร์มใช้เพื่อรวบรวมหรือตรวจสอบข้อมูลจากผู้ใช้ โดยทั่วไปจะใช้แบบฟอร์มพื้นฐานในสถานการณ์จำลองที่มีรายการข้อมูลน้อย', - 'form.basic-form.title.label': 'ชื่อ', - 'form.basic-form.title.placeholder': 'ตั้งชื่อให้เป้าหมาย', - 'form.basic-form.title.required': 'กรุณากรอกชื่อ', - 'form.basic-form.date.label': 'วันที่เริ่มต้นและสิ้นสุด', - 'form.basic-form.placeholder.start': 'วันที่เริ่มต้น', - 'form.basic-form.placeholder.end': 'วันที่สิ้นสุด', - 'form.basic-form.date.required': 'กรุณาเลือกวันที่เริ่มต้นและสิ้นสุด', - 'form.basic-form.goal.label': 'คำอธิบายเป้าหมาย', - 'form.basic-form.goal.placeholder': 'กรุณาป้อนเป้าหมายการทำงานแบบเป็นขั้นตอนของคุณ', - 'form.basic-form.goal.required': 'กรุณากรอกคำอธิบายเป้าหมาย', - 'form.basic-form.standard.label': 'วัด', - 'form.basic-form.standard.placeholder': 'กรุณากรอกตัวชี้วัด', - 'form.basic-form.standard.required': 'กรุณากรอกตัวชี้วัด', - 'form.basic-form.client.label': 'ลูกค้า', - 'form.basic-form.client.required': 'โปรดอธิบายลูกค้าที่คุณให้บริการ', - 'form.basic-form.label.tooltip': 'ผู้รับบริการเป้าหมาย', - 'form.basic-form.client.placeholder': 'โปรดอธิบายลูกค้าที่คุณให้บริการ ลูกค้าภายในโดยตรง @ชื่อ/หมายเลขงาน', - 'form.basic-form.invites.label': 'เชิญผู้วิจารณ์', - 'form.basic-form.invites.placeholder': 'กรุณา @name/หมายเลขพนักงาน โดยตรง คุณสามารถเชิญได้สูงสุด 5 คน', - 'form.basic-form.weight.label': 'น้ำหนัก', - 'form.basic-form.weight.placeholder': 'กรุณาเข้า', - 'form.basic-form.public.label': 'กำหนดเป้าหมายสาธารณะ', - 'form.basic-form.label.help': 'ลูกค้าและผู้ตรวจสอบจะถูกแชร์โดยค่าเริ่มต้น', - 'form.basic-form.radio.public': 'สาธารณะ', - 'form.basic-form.radio.partially-public': 'เปิดเผยต่อสาธารณะบางส่วน', - 'form.basic-form.radio.private': 'ส่วนตัว', - 'form.basic-form.publicUsers.placeholder': 'เปิดให้', - 'form.basic-form.option.A': 'เพื่อนร่วมงาน 1', - 'form.basic-form.option.B': 'เพื่อนร่วมงาน 2', - 'form.basic-form.option.C': 'เพื่อนร่วมงานสามคน', - 'form.basic-form.email.required': 'กรุณากรอกที่อยู่อีเมลของคุณ!', - 'form.basic-form.email.wrong-format': 'รูปแบบที่อยู่อีเมลไม่ถูกต้อง!', - 'form.basic-form.userName.required': 'กรุณากรอกชื่อผู้ใช้!', - 'form.basic-form.password.required': 'กรุณากรอกรหัสผ่านของคุณ!', - 'form.basic-form.password.twice': 'รหัสผ่านที่ป้อนสองครั้งไม่ตรงกัน!', - 'form.basic-form.strength.msg': 'กรุณากรอกอย่างน้อย 6 ตัวอักษร กรุณาอย่าใช้รหัสผ่านที่คาดเดาได้ง่าย', - 'form.basic-form.strength.strong': 'ความแข็งแกร่ง: แข็งแกร่ง', - 'form.basic-form.strength.medium': 'ความแข็งแกร่ง: ปานกลาง', - 'form.basic-form.strength.short': 'ความแรง: สั้นเกินไป', - 'form.basic-form.confirm-password.required': 'กรุณายืนยันรหัสผ่านของคุณ!', - 'form.basic-form.phone-number.required': 'กรุณากรอกหมายเลขโทรศัพท์มือถือของคุณ!', - 'form.basic-form.phone-number.wrong-format': 'รูปแบบหมายเลขโทรศัพท์มือถือผิด!', - 'form.basic-form.verification-code.required': 'กรุณากรอกรหัสยืนยัน!', - 'form.basic-form.form.get-captcha': 'รับรหัสยืนยัน', - 'form.basic-form.captcha.second': 'ที่สอง', - 'form.basic-form.form.optional': '(ไม่จำเป็น)', - 'form.basic-form.form.submit': 'ส่ง', - 'form.basic-form.form.save': 'บันทึก', - 'form.basic-form.email.placeholder': 'จดหมาย', - 'form.basic-form.password.placeholder': 'รหัสผ่านอย่างน้อย 6 ตัวอักษร คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่', - 'form.basic-form.confirm-password.placeholder': 'ยืนยันรหัสผ่าน', - 'form.basic-form.phone-number.placeholder': 'หมายเลขโทรศัพท์', - 'form.basic-form.verification-code.placeholder': 'รหัสยืนยัน', - 'result.success.title': 'ส่งสำเร็จ', - 'result.success.description': 'หน้าผลลัพธ์การส่งใช้เพื่อตอบกลับผลการประมวลผลของชุดงานการดำเนินงาน หากเป็นเพียงการดำเนินการง่ายๆ ให้ใช้ข้อความตอบรับพร้อมท์ทั่วโลกพื้นที่ข้อความนี้สามารถแสดงคำแนะนำเสริมง่ายๆ หากจำเป็นต้องแสดง "เอกสาร" พื้นที่สีเทาด้านล่างสามารถแสดงเนื้อหาที่ซับซ้อนมากขึ้นได้', - 'result.success.operate-title': 'ชื่อโครงการ', - 'result.success.operate-id': 'รหัสโครงการ', - 'result.success.principal': 'บุคคลที่รับผิดชอบ', - 'result.success.operate-time': 'เวลาที่มีประสิทธิภาพ', - 'result.success.step1-title': 'สร้างโครงการ', - 'result.success.step1-operator': 'คู ลิลี่', - 'result.success.step2-title': 'การทบทวนเบื้องต้นของแผนก', - 'result.success.step2-operator': 'โจว เหมาเหมา', - 'result.success.step2-extra': 'ด่วน', - 'result.success.step3-title': 'การตรวจสอบทางการเงิน', - 'result.success.step4-title': 'เสร็จ', - 'result.success.btn-return': 'กลับไปที่รายการ', - 'result.success.btn-project': 'ดูรายการ', - 'result.success.btn-print': 'พิมพ์', - 'result.fail.error.title': 'การส่งล้มเหลว', - 'result.fail.error.description': 'โปรดตรวจสอบและแก้ไขข้อมูลต่อไปนี้ก่อนที่จะส่งอีกครั้ง', - 'result.fail.error.hint-title': 'เนื้อหาที่คุณส่งมีข้อผิดพลาดต่อไปนี้:', - 'result.fail.error.hint-text1': 'บัญชีของคุณถูกระงับ', - 'result.fail.error.hint-btn1': 'ละลายทันที', - 'result.fail.error.hint-text2': 'บัญชีของคุณยังไม่มีสิทธิ์สมัคร', - 'result.fail.error.hint-btn2': 'อัพเกรดตอนนี้', - 'result.fail.error.btn-text': 'กลับไปแก้ไข', - 'account.settings.menuMap.custom': 'การปรับเปลี่ยนในแบบของคุณ', - 'account.settings.menuMap.binding': 'การผูกบัญชี', - 'account.settings.basic.avatar': 'อวตาร', - 'account.settings.basic.change-avatar': 'เปลี่ยนอวตาร', - 'account.settings.basic.email': 'จดหมาย', - 'account.settings.basic.email-message': 'กรุณากรอกอีเมล์ของคุณ!', - 'account.settings.basic.nickname': 'ชื่อนิค', - 'account.settings.basic.nickname-message': 'กรุณากรอกชื่อเล่นของคุณ!', - 'account.settings.basic.profile': 'ประวัติโดยย่อ', - 'account.settings.basic.profile-message': 'กรุณากรอกรายละเอียดส่วนตัวของคุณ!', - 'account.settings.basic.profile-placeholder': 'ประวัติโดยย่อ', - 'account.settings.basic.country': 'ประเทศ/ภูมิภาค', - 'account.settings.basic.country-message': 'กรุณากรอกประเทศหรือภูมิภาคของคุณ!', - 'account.settings.basic.geographic': 'จังหวัดและเมือง', - 'account.settings.basic.geographic-message': 'กรุณากรอกจังหวัดและเมืองของคุณ!', - 'account.settings.basic.address': 'ที่อยู่ถนน', - 'account.settings.basic.address-message': 'กรุณากรอกที่อยู่ของคุณ!', - 'account.settings.basic.phone': 'เบอร์ติดต่อ', - 'account.settings.basic.phone-message': 'กรุณากรอกหมายเลขติดต่อของคุณ!', - 'account.settings.basic.update': 'อัพเดตข้อมูลพื้นฐาน', - 'account.settings.basic.update.success': 'อัปเดตข้อมูลพื้นฐานสำเร็จ', - 'account.settings.security.strong': 'ทรงพลัง', - 'account.settings.security.medium': 'กลาง', - 'account.settings.security.weak': 'อ่อนแอ', - 'account.settings.security.password': 'รหัสผ่านบัญชี', - 'account.settings.security.password-description': 'ความยากของรหัสผ่านปัจจุบัน:', - 'account.settings.security.phone': 'การรักษาความปลอดภัยโทรศัพท์มือถือ', - 'account.settings.security.phone-description': 'โทรศัพท์มือถือที่ผูกไว้แล้ว:', - 'account.settings.security.question': 'ปัญหาด้านความปลอดภัย', - 'account.settings.security.question-description': 'ไม่มีการตั้งค่าคำถามเพื่อความปลอดภัย ซึ่งสามารถปกป้องความปลอดภัยของบัญชีได้อย่างมีประสิทธิภาพ', - 'account.settings.security.email': 'ผูกอีเมล', - 'account.settings.security.email-description': 'ที่อยู่อีเมลที่ถูกผูกไว้แล้ว:', - 'account.settings.security.mfa': 'อุปกรณ์เอ็มเอฟเอ', - 'account.settings.security.mfa-description': 'อุปกรณ์ MFA ไม่ได้ถูกผูกไว้ หลังจากผูกแล้วสามารถยืนยันอีกครั้งได้', - 'account.settings.security.modify': 'ปรับปรุงใหม่', - 'account.settings.security.set': 'ตั้งค่า', - 'account.settings.security.bind': 'ผูกพัน', - 'account.settings.binding.taobao': 'ผูก Taobao', - 'account.settings.binding.taobao-description': 'บัญชี Taobao ไม่ได้ถูกผูกไว้ในขณะนี้', - 'account.settings.binding.alipay': 'ผูกอาลีเพย์', - 'account.settings.binding.alipay-description': 'บัญชี Alipay ไม่ได้ถูกผูกไว้ในขณะนี้', - 'account.settings.binding.dingding': 'การผูกมัด DingTalk', - 'account.settings.binding.dingding-description': 'ขณะนี้ไม่มีบัญชี DingTalk ถูกผูกไว้', - 'account.settings.binding.bind': 'ผูกพัน', - 'account.settings.notification.password': 'รหัสผ่านบัญชี', - 'account.settings.notification.password-description': 'ข้อความจากผู้ใช้รายอื่นจะได้รับแจ้งในรูปแบบของข้อความไซต์', - 'account.settings.notification.messages': 'ข้อความของระบบ', - 'account.settings.notification.messages-description': 'ข้อความของระบบจะได้รับแจ้งในรูปแบบของข้อความไซต์', - 'account.settings.notification.todo': 'งานที่ต้องทำ', - 'account.settings.notification.todo-description': 'งานที่ต้องทำจะได้รับแจ้งในรูปแบบของข้อความในไซต์', - 'account.settings.settings.open': 'เปิด', - 'account.settings.settings.close': 'ปิด', - 'trading-assistant.title': 'ผู้ช่วยการซื้อขาย', - 'trading-assistant.strategyList': 'รายการกลยุทธ์', - 'trading-assistant.createStrategy': 'สร้างนโยบาย', - 'trading-assistant.noStrategy': 'ยังไม่มีกลยุทธ์', - 'trading-assistant.selectStrategy': 'โปรดเลือกกลยุทธ์จากด้านซ้ายเพื่อดูรายละเอียด', - 'trading-assistant.startStrategy': 'กลยุทธ์การเปิดตัว', - 'trading-assistant.stopStrategy': 'กลยุทธ์การหยุด', - 'trading-assistant.editStrategy': 'กลยุทธ์ด้านบรรณาธิการ', - 'trading-assistant.deleteStrategy': 'ลบนโยบาย', - 'trading-assistant.status.running': 'วิ่ง', - 'trading-assistant.status.stopped': 'หยุดแล้ว', - 'trading-assistant.status.error': 'ความผิดพลาด', - 'trading-assistant.strategyType.IndicatorStrategy': 'กลยุทธ์ตัวบ่งชี้ทางเทคนิค', - 'trading-assistant.strategyType.PromptBasedStrategy': 'กลยุทธ์คำคิว', - 'trading-assistant.strategyType.GridStrategy': 'กลยุทธ์กริด', - 'trading-assistant.tabs.tradingRecords': 'ประวัติการทำธุรกรรม', - 'trading-assistant.tabs.positions': 'บันทึกตำแหน่ง', - 'trading-assistant.tabs.equityCurve': 'เส้นส่วนของผู้ถือหุ้น', - 'trading-assistant.form.step1': 'เลือกตัวบ่งชี้', - 'trading-assistant.form.step2': 'การกำหนดค่าการแลกเปลี่ยน', - 'trading-assistant.form.step3': 'พารามิเตอร์กลยุทธ์', - 'trading-assistant.form.indicator': 'เลือกตัวบ่งชี้', - 'trading-assistant.form.indicatorHint': 'คุณสามารถเลือกได้เฉพาะตัวบ่งชี้ทางเทคนิคที่คุณซื้อหรือสร้างขึ้นเท่านั้น', - 'trading-assistant.form.qdtCostHints': 'การใช้กลยุทธ์จะใช้ QDT โปรดตรวจสอบให้แน่ใจว่าบัญชีมียอดคงเหลือ QDT เพียงพอ', - 'trading-assistant.form.indicatorDescription': 'คำอธิบายตัวบ่งชี้', - 'trading-assistant.form.noDescription': 'ยังไม่มีคำอธิบาย', - 'trading-assistant.form.exchange': 'เลือกการแลกเปลี่ยน', - 'trading-assistant.form.apiKey': 'คีย์ API', - 'trading-assistant.form.secretKey': 'รหัสลับ', - 'trading-assistant.form.passphrase': 'ข้อความรหัสผ่าน', - 'trading-assistant.form.testConnection': 'ทดสอบการเชื่อมต่อ', - 'trading-assistant.form.strategyName': 'ชื่อกรมธรรม์', - 'trading-assistant.form.symbol': 'คู่การซื้อขาย', - 'trading-assistant.form.symbolHint': 'ขณะนี้รองรับเฉพาะคู่การซื้อขายสกุลเงินดิจิทัลเท่านั้น', - 'trading-assistant.form.initialCapital': 'จำนวนเงินลงทุน', - 'trading-assistant.form.marketType': 'ประเภทตลาด', - 'trading-assistant.form.marketTypeFutures': 'สัญญา', - 'trading-assistant.form.marketTypeSpot': 'จุดสินค้า', - 'trading-assistant.form.marketTypeHint': 'สัญญารองรับการซื้อขายสองทางและเลเวอเรจ ในขณะที่สปอตรองรับเฉพาะตำแหน่งซื้อและเลเวอเรจคงที่ที่ 1x', - 'trading-assistant.form.leverage': 'ใช้ประโยชน์หลายอย่าง', - 'trading-assistant.form.leverageHint': 'สัญญา: 1-125 ครั้ง, จุด: แก้ไข 1 ครั้ง', - 'trading-assistant.form.spotLeverageFixed': 'เลเวอเรจการซื้อขายสปอตคงที่ที่ 1x', - 'trading-assistant.form.spotOnlyLongHint': 'การซื้อขายแบบสปอตรองรับเฉพาะตำแหน่งซื้อเท่านั้น', - 'trading-assistant.form.tradeDirection': 'ทิศทางการซื้อขาย', - 'trading-assistant.form.tradeDirectionLong': 'ยาวเท่านั้น', - 'trading-assistant.form.tradeDirectionShort': 'สั้นเท่านั้น', - 'trading-assistant.form.tradeDirectionBoth': 'ธุรกรรมสองทาง', - 'trading-assistant.form.timeframe': 'ช่วงเวลา', - 'trading-assistant.form.klinePeriod': 'ช่วงเวลา K-Line', - 'trading-assistant.form.timeframe1m': '1 นาที', - 'trading-assistant.form.timeframe5m': '5 นาที', - 'trading-assistant.form.timeframe15m': '15 นาที', - 'trading-assistant.form.timeframe30m': '30 นาที', - 'trading-assistant.form.timeframe1H': '1 ชั่วโมง', - 'trading-assistant.form.timeframe4H': '4 ชั่วโมง', - 'trading-assistant.form.timeframe1D': '1 วัน', - 'trading-assistant.form.selectStrategyType': 'เลือกประเภทกลยุทธ์', - 'trading-assistant.form.indicatorStrategy': 'กลยุทธ์ตัวบ่งชี้', - 'trading-assistant.form.indicatorStrategyDesc': 'กลยุทธ์การซื้อขายอัตโนมัติตามตัวบ่งชี้ทางเทคนิค', - 'trading-assistant.form.aiStrategy': 'กลยุทธ์ AI', - 'trading-assistant.form.aiStrategyDesc': 'กลยุทธ์การซื้อขายอัตโนมัติตามการตัดสินใจอัจฉริยะของ AI', - 'trading-assistant.form.enableAiFilter': 'เปิดใช้งานตัวกรองการตัดสินใจอัจฉริยะ AI', - 'trading-assistant.form.enableAiFilterHint': 'เมื่อเปิดใช้งาน สัญญาณตัวบ่งชี้จะถูกกรองโดย AI เพื่อปรับปรุงคุณภาพการซื้อขาย', - 'trading-assistant.form.aiFilterPrompt': 'ข้อความแจ้งแบบกำหนดเอง', - 'trading-assistant.form.aiFilterPromptHint': 'ให้คำแนะนำแบบกำหนดเองสำหรับการกรอง AI เว้นว่างไว้เพื่อใช้ค่าเริ่มต้นของระบบ', - 'trading-assistant.validation.strategyTypeRequired': 'กรุณาเลือกประเภทกลยุทธ์', - 'trading-assistant.form.advancedSettings': 'การตั้งค่าขั้นสูง', - 'trading-assistant.form.orderMode': 'โหมดการสั่งซื้อ', - 'trading-assistant.form.orderModeMaker': 'ผู้สร้าง', - 'trading-assistant.form.orderModeTaker': 'ราคาตลาด (เทคเกอร์)', - 'trading-assistant.form.orderModeHint': 'โหมดคำสั่งซื้อที่รอดำเนินการใช้คำสั่งซื้อแบบจำกัดและค่าธรรมเนียมการจัดการต่ำกว่า โหมดราคาตลาดจะดำเนินการทันทีและค่าธรรมเนียมการจัดการจะสูงขึ้น', - 'trading-assistant.form.makerWaitSec': 'เวลารอสำหรับคำสั่งซื้อที่รอดำเนินการ (วินาที)', - 'trading-assistant.form.makerWaitSecHint': 'เวลาที่ต้องรอการทำธุรกรรมหลังจากทำการสั่งซื้อ ยกเลิกและลองอีกครั้งหลังจากหมดเวลา', - 'trading-assistant.form.makerRetries': 'จำนวนการลองใหม่สำหรับคำสั่งซื้อที่รอดำเนินการ', - 'trading-assistant.form.makerRetriesHint': 'จำนวนครั้งสูงสุดในการลองใหม่เมื่อไม่ได้ดำเนินการคำสั่งซื้อที่รอดำเนินการ', - 'trading-assistant.form.fallbackToMarket': 'คำสั่งซื้อที่รอดำเนินการล้มเหลวและราคาตลาดถูกลดระดับลง', - 'trading-assistant.form.fallbackToMarketHint': 'เมื่อการเปิด/ปิดคำสั่งซื้อที่รอดำเนินการไม่เสร็จสมบูรณ์ ควรดาวน์เกรดเป็นคำสั่งซื้อในตลาดเพื่อให้แน่ใจว่าธุรกรรมจะเสร็จสมบูรณ์หรือไม่', - 'trading-assistant.form.marginMode': 'โหมดระยะขอบ', - 'trading-assistant.form.marginModeCross': 'โกดังเต็ม', - 'trading-assistant.form.marginModeIsolated': 'ตำแหน่งที่โดดเดี่ยว', - 'trading-assistant.form.stopLossPct': 'อัตราการสูญเสียหยุด (%)', - 'trading-assistant.form.stopLossPctHint': 'ตั้งค่าเปอร์เซ็นต์การหยุดการขาดทุน 0 หมายถึงไม่ได้เปิดใช้งานการหยุดการขาดทุน', - 'trading-assistant.form.takeProfitPct': 'อัตราส่วนการทำกำไร (%)', - 'trading-assistant.form.takeProfitPctHint': 'ตั้งค่าเปอร์เซ็นต์การทำกำไร 0 หมายถึงปิดการใช้งานการทำกำไร', - 'trading-assistant.form.signalMode': 'โหมดสัญญาณ', - 'trading-assistant.form.signalModeConfirmed': 'ยืนยันโหมด', - 'trading-assistant.form.signalModeAggressive': 'โหมดก้าวร้าว', - 'trading-assistant.form.signalModeHint': 'โหมดการยืนยัน: ตรวจสอบเฉพาะเส้น K ที่เสร็จสมบูรณ์เท่านั้น โหมดก้าวร้าว: ตรวจสอบการสร้างเส้น K ด้วย', - 'trading-assistant.form.cancel': 'ยกเลิก', - 'trading-assistant.form.prev': 'ขั้นตอนก่อนหน้า', - 'trading-assistant.form.next': 'ขั้นตอนต่อไป', - 'trading-assistant.form.confirmCreate': 'ยืนยันการสร้าง', - 'trading-assistant.form.confirmEdit': 'ยืนยันการเปลี่ยนแปลง', - 'trading-assistant.messages.createSuccess': 'สร้างกลยุทธ์สำเร็จแล้ว', - 'trading-assistant.messages.createFailed': 'ไม่สามารถสร้างนโยบายได้', - 'trading-assistant.messages.updateSuccess': 'อัปเดตนโยบายสำเร็จแล้ว', - 'trading-assistant.messages.updateFailed': 'อัปเดตนโยบายไม่สำเร็จ', - 'trading-assistant.messages.deleteSuccess': 'ลบนโยบายสำเร็จแล้ว', - 'trading-assistant.messages.deleteFailed': 'ลบนโยบายล้มเหลว', - 'trading-assistant.messages.startSuccess': 'กลยุทธ์เริ่มต้นได้สำเร็จ', - 'trading-assistant.messages.startFailed': 'ไม่สามารถเริ่มนโยบายได้', - 'trading-assistant.messages.stopSuccess': 'กลยุทธ์หยุดสำเร็จ', - 'trading-assistant.messages.stopFailed': 'กลยุทธ์หยุดล้มเหลว', - 'trading-assistant.messages.loadFailed': 'ไม่สามารถรับรายการนโยบาย', - 'trading-assistant.messages.runningWarning': 'กลยุทธ์กำลังทำงานอยู่ โปรดหยุดกลยุทธ์ก่อนที่จะแก้ไข', - 'trading-assistant.messages.deleteConfirmWithName': 'คุณแน่ใจหรือไม่ว่าต้องการลบนโยบาย "{name}" การดำเนินการนี้ไม่สามารถย้อนกลับได้', - 'trading-assistant.messages.deleteConfirm': 'คุณแน่ใจหรือไม่ว่าต้องการลบนโยบายนี้การดำเนินการนี้ไม่สามารถย้อนกลับได้', - 'trading-assistant.messages.loadTradesFailed': 'ไม่สามารถรับบันทึกธุรกรรมได้', - 'trading-assistant.messages.loadPositionsFailed': 'ไม่สามารถรับบันทึกตำแหน่งได้', - 'trading-assistant.messages.loadEquityFailed': 'ไม่สามารถรับเส้นโค้งส่วนของผู้ถือหุ้นได้', - 'trading-assistant.messages.loadIndicatorsFailed': 'ไม่สามารถโหลดรายการตัวบ่งชี้ โปรดลองอีกครั้งในภายหลัง', - 'trading-assistant.messages.spotLimitations': 'การซื้อขายแบบสปอตได้รับการตั้งค่าโดยอัตโนมัติเป็นระยะยาวเท่านั้น เลเวอเรจ 1 เท่า', - 'trading-assistant.messages.autoFillApiConfig': 'การกำหนดค่า API ในอดีตของการแลกเปลี่ยนได้รับการเติมข้อมูลโดยอัตโนมัติ', - 'trading-assistant.placeholders.selectIndicator': 'โปรดเลือกตัวบ่งชี้', - 'trading-assistant.placeholders.selectExchange': 'กรุณาเลือกการแลกเปลี่ยน', - 'trading-assistant.placeholders.inputApiKey': 'กรุณากรอกคีย์ API', - 'trading-assistant.placeholders.inputSecretKey': 'กรุณากรอกรหัสลับ', - 'trading-assistant.placeholders.inputPassphrase': 'กรุณากรอกรหัสผ่าน', - 'trading-assistant.placeholders.inputStrategyName': 'โปรดป้อนชื่อนโยบาย', - 'trading-assistant.placeholders.selectSymbol': 'กรุณาเลือกคู่การซื้อขาย', - 'trading-assistant.placeholders.selectTimeframe': 'โปรดเลือกช่วงเวลา', - 'trading-assistant.placeholders.selectKlinePeriod': 'โปรดเลือกช่วงเวลา K-Line', - 'trading-assistant.placeholders.inputAiFilterPrompt': 'กรุณาใส่ข้อความแจ้งแบบกำหนดเอง (ไม่บังคับ)', - 'trading-assistant.validation.indicatorRequired': 'โปรดเลือกตัวบ่งชี้', - 'trading-assistant.validation.exchangeRequired': 'กรุณาเลือกการแลกเปลี่ยน', - 'trading-assistant.validation.apiKeyRequired': 'กรุณากรอกคีย์ API', - 'trading-assistant.validation.secretKeyRequired': 'กรุณากรอกรหัสลับ', - 'trading-assistant.validation.passphraseRequired': 'กรุณากรอกรหัสผ่าน', - 'trading-assistant.validation.exchangeConfigIncomplete': 'กรุณากรอกข้อมูลการกำหนดค่าการแลกเปลี่ยนให้ครบถ้วน', - 'trading-assistant.validation.testConnectionRequired': 'กรุณาคลิกปุ่ม "ทดสอบการเชื่อมต่อ" และตรวจสอบให้แน่ใจว่าการเชื่อมต่อสำเร็จ', - 'trading-assistant.validation.testConnectionFailed': 'การทดสอบการเชื่อมต่อล้มเหลว กรุณาตรวจสอบการกำหนดค่าและทดสอบอีกครั้ง', - 'trading-assistant.validation.strategyNameRequired': 'โปรดป้อนชื่อนโยบาย', - 'trading-assistant.validation.symbolRequired': 'กรุณาเลือกคู่การซื้อขาย', - 'trading-assistant.validation.initialCapitalRequired': 'กรุณากรอกจำนวนเงินลงทุน', - 'trading-assistant.validation.leverageRequired': 'กรุณากรอกอัตราส่วนเลเวอเรจ', - 'trading-assistant.table.time': 'เวลา', - 'trading-assistant.table.type': 'พิมพ์', - 'trading-assistant.table.price': 'ราคา', - 'trading-assistant.table.amount': 'ปริมาณ', - 'trading-assistant.table.value': 'จำนวน', - 'trading-assistant.table.commission': 'ค่าธรรมเนียมการจัดการ', - 'trading-assistant.table.symbol': 'คู่การซื้อขาย', - 'trading-assistant.table.side': 'ทิศทาง', - 'trading-assistant.table.size': 'ปริมาณตำแหน่ง', - 'trading-assistant.table.entryPrice': 'ราคาเปิด', - 'trading-assistant.table.currentPrice': 'ราคาปัจจุบัน', - 'trading-assistant.table.unrealizedPnl': 'กำไรหรือขาดทุนที่ยังไม่เกิดขึ้นจริง', - 'trading-assistant.table.pnlPercent': 'อัตราส่วนกำไรและขาดทุน', - 'trading-assistant.table.buy': 'ซื้อ', - 'trading-assistant.table.sell': 'ขาย', - 'trading-assistant.table.long': 'ยาวไป', - 'trading-assistant.table.short': 'สั้น', - 'trading-assistant.table.noPositions': 'ยังไม่มีตำแหน่ง', - 'trading-assistant.detail.title': 'รายละเอียดกลยุทธ์', - 'trading-assistant.detail.strategyName': 'ชื่อกรมธรรม์', - 'trading-assistant.detail.strategyType': 'ประเภทกลยุทธ์', - 'trading-assistant.detail.status': 'สถานะ', - 'trading-assistant.detail.tradingMode': 'รูปแบบการซื้อขาย', - 'trading-assistant.detail.exchange': 'แลกเปลี่ยน', - 'trading-assistant.detail.initialCapital': 'ทุนเริ่มต้น', - 'trading-assistant.detail.totalInvestment': 'จำนวนเงินลงทุนทั้งหมด', - 'trading-assistant.detail.currentEquity': 'มูลค่าสุทธิในปัจจุบัน', - 'trading-assistant.detail.totalPnl': 'กำไรและขาดทุนทั้งหมด', - 'trading-assistant.detail.indicatorName': 'ชื่อตัวบ่งชี้', - 'trading-assistant.detail.maxLeverage': 'เลเวอเรจสูงสุด', - 'trading-assistant.detail.decideInterval': 'ช่วงการตัดสินใจ', - 'trading-assistant.detail.symbols': 'วัตถุธุรกรรม', - 'trading-assistant.detail.createdAt': 'เวลาสร้าง', - 'trading-assistant.detail.updatedAt': 'เวลาอัปเดต', - 'trading-assistant.detail.llmConfig': 'การกำหนดค่าโมเดล AI', - 'trading-assistant.detail.exchangeConfig': 'การกำหนดค่าการแลกเปลี่ยน', - 'trading-assistant.detail.provider': 'ผู้ให้บริการ', - 'trading-assistant.detail.modelId': 'รหัสรุ่น', - 'trading-assistant.detail.close': 'ปิด', - 'trading-assistant.detail.loadFailed': 'ไม่สามารถรับรายละเอียดนโยบายได้', - 'trading-assistant.equity.noData': 'ยังไม่มีข้อมูลมูลค่าสุทธิ', - 'trading-assistant.equity.equity': 'มูลค่าสุทธิ', - 'trading-assistant.exchange.tradingMode': 'รูปแบบการซื้อขาย', - 'trading-assistant.exchange.virtual': 'การซื้อขายจำลอง', - 'trading-assistant.exchange.live': 'การทำธุรกรรมจริง', - 'trading-assistant.exchange.selectExchange': 'เลือกการแลกเปลี่ยน', - 'trading-assistant.exchange.walletAddress': 'ที่อยู่กระเป๋าเงิน', - 'trading-assistant.exchange.walletAddressPlaceholder': 'กรุณากรอกที่อยู่กระเป๋าเงินของคุณ (เริ่มต้นด้วย 0x)', - 'trading-assistant.exchange.privateKey': 'รหัสส่วนตัว', - 'trading-assistant.exchange.privateKeyPlaceholder': 'กรุณากรอกรหัสส่วนตัว (64 ตัวอักษร)', - 'trading-assistant.exchange.testConnection': 'ทดสอบการเชื่อมต่อ', - 'trading-assistant.exchange.connectionSuccess': 'การเชื่อมต่อสำเร็จ', - 'trading-assistant.exchange.connectionFailed': 'การเชื่อมต่อล้มเหลว', - 'trading-assistant.exchange.testFailed': 'การทดสอบการเชื่อมต่อล้มเหลว', - 'trading-assistant.exchange.fillComplete': 'กรุณากรอกข้อมูลการกำหนดค่าการแลกเปลี่ยนให้ครบถ้วน', - 'trading-assistant.strategyTypeOptions.ai': 'กลยุทธ์ที่ขับเคลื่อนด้วย AI', - 'trading-assistant.strategyTypeOptions.indicator': 'กลยุทธ์ตัวบ่งชี้ทางเทคนิค', - 'trading-assistant.strategyTypeOptions.aiDeveloping': 'ฟังก์ชันกลยุทธ์ที่ขับเคลื่อนด้วย AI อยู่ระหว่างการพัฒนา ดังนั้นโปรดคอยติดตาม', - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'คุณสมบัติกลยุทธ์ที่ขับเคลื่อนด้วย AI กำลังอยู่ในการพัฒนา', - 'trading-assistant.indicatorType.trend': 'แนวโน้ม', - 'trading-assistant.indicatorType.momentum': 'โมเมนตัม', - 'trading-assistant.indicatorType.volatility': 'ความผันผวน', - 'trading-assistant.indicatorType.volume': 'ปริมาณ', - 'trading-assistant.indicatorType.custom': 'ปรับแต่ง', - 'trading-assistant.exchangeNames': { - 'okx': 'โอเคเอ็กซ์', - 'binance': 'ไบแนนซ์', - 'hyperliquid': 'ไฮเปอร์ลิควิด', - 'blockchaincom': 'Blockchain.com', - 'coinbaseexchange': 'คอยน์เบส', - 'gate': 'Gate.io', - 'mexc': 'เม็กซิโก', - 'kraken': 'คราเคน', - 'bitfinex': 'Bitfinex', - 'bybit': 'บายบิต', - 'kucoin': 'คูคอยน์', - 'huobi': 'หั่วปี้', - 'bitget': 'บิทเก็ต', - 'bitmex': 'BitMEX', - 'deribit': 'อนุมาน', - 'phemex': 'ฟีเม็กซ์', - 'bitmart': 'บิตมาร์ท', - 'bitstamp': 'บิตสแตมป์', - 'bittrex': 'บิทเทร็กซ์', - 'poloniex': 'โปโลนีกซ์', - 'gemini': 'ราศีเมถุน', - 'cryptocom': 'Crypto.com', - 'bitflyer': 'บิตฟลายเออร์', - 'upbit': 'อัพบิต', - 'bithumb': 'บิธัมบ์', - 'coinone': 'โคโนเน่', - 'zb': 'ซีบี', - 'lbank': 'แอลแบงค์', - 'bibox': 'ไบบ็อกซ์', - 'bigone': 'บิ๊กวัน', - 'bitrue': 'บิตทรู', - 'coinex': 'คอยน์เอ็กซ์', - 'digifinex': 'DigiFinex', - 'ftx': 'เอฟทีเอ็กซ์', - 'ftxus': 'FTX สหรัฐอเมริกา', - 'binanceus': 'Binance สหรัฐอเมริกา', - 'binancecoinm': 'Binance COIN-M', - 'binanceusdm': 'Binance USDⓈ-M' - }, - 'ai-trading-assistant.title': 'ผู้ช่วยการซื้อขาย AI', - 'ai-trading-assistant.strategyList': 'รายการกลยุทธ์', - 'ai-trading-assistant.createStrategy': 'สร้างนโยบาย', - 'ai-trading-assistant.noStrategy': 'ยังไม่มีกลยุทธ์', - 'ai-trading-assistant.selectStrategy': 'โปรดเลือกกลยุทธ์จากด้านซ้ายเพื่อดูรายละเอียด', - 'ai-trading-assistant.startStrategy': 'กลยุทธ์การเปิดตัว', - 'ai-trading-assistant.stopStrategy': 'กลยุทธ์การหยุด', - 'ai-trading-assistant.editStrategy': 'กลยุทธ์ด้านบรรณาธิการ', - 'ai-trading-assistant.deleteStrategy': 'ลบนโยบาย', - 'ai-trading-assistant.status.running': 'วิ่ง', - 'ai-trading-assistant.status.stopped': 'หยุดแล้ว', - 'ai-trading-assistant.status.error': 'ความผิดพลาด', - 'ai-trading-assistant.tabs.tradingRecords': 'ประวัติการทำธุรกรรม', - 'ai-trading-assistant.tabs.positions': 'บันทึกตำแหน่ง', - 'ai-trading-assistant.tabs.aiDecisions': 'บันทึกการตัดสินใจของ AI', - 'ai-trading-assistant.tabs.equityCurve': 'เส้นส่วนของผู้ถือหุ้น', - 'ai-trading-assistant.form.createTitle': 'สร้างกลยุทธ์การซื้อขายด้วย AI', - 'ai-trading-assistant.form.editTitle': 'แก้ไขกลยุทธ์การซื้อขาย AI', - 'ai-trading-assistant.form.strategyName': 'ชื่อกรมธรรม์', - 'ai-trading-assistant.form.modelId': 'โมเดลเอไอ', - 'ai-trading-assistant.form.modelIdHint': 'ใช้บริการระบบ OpenRouter โดยไม่ต้องกำหนดค่า API Key', - 'ai-trading-assistant.form.decideInterval': 'ช่วงการตัดสินใจ', - 'ai-trading-assistant.form.decideInterval5m': '5 นาที', - 'ai-trading-assistant.form.decideInterval10m': '10 นาที', - 'ai-trading-assistant.form.decideInterval30m': '30 นาที', - 'ai-trading-assistant.form.decideInterval1h': '1 ชั่วโมง', - 'ai-trading-assistant.form.decideInterval4h': '4 ชั่วโมง', - 'ai-trading-assistant.form.decideInterval1d': '1 วัน', - 'ai-trading-assistant.form.decideInterval1w': '1 สัปดาห์', - 'ai-trading-assistant.form.decideIntervalHint': 'ช่วงเวลาที่ AI ในการตัดสินใจ', - 'ai-trading-assistant.form.runPeriod': 'วิ่งรอบ', - 'ai-trading-assistant.form.runPeriodHint': 'เวลาเริ่มต้นและเวลาสิ้นสุดของการดำเนินกลยุทธ์', - 'ai-trading-assistant.form.startDate': 'วันที่เริ่มต้น', - 'ai-trading-assistant.form.endDate': 'วันที่สิ้นสุด', - 'ai-trading-assistant.form.qdtCostTitle': 'คำแนะนำการหักเงินของ QDT', - 'ai-trading-assistant.form.qdtCostHint': 'การตัดสินใจของ AI แต่ละครั้งจะถูกหักออก {cost} QDT โปรดตรวจสอบให้แน่ใจว่าบัญชีของคุณมียอดคงเหลือ QDT เพียงพอ ในระหว่างการดำเนินการตามกลยุทธ์ค่าธรรมเนียมจะถูกหักแบบเรียลไทม์สำหรับการตัดสินใจแต่ละครั้ง', - 'ai-trading-assistant.form.apiKey': 'คีย์ API', - 'ai-trading-assistant.form.exchange': 'เลือกการแลกเปลี่ยน', - 'ai-trading-assistant.form.secretKey': 'รหัสลับ', - 'ai-trading-assistant.form.passphrase': 'ข้อความรหัสผ่าน', - 'ai-trading-assistant.form.testConnection': 'ทดสอบการเชื่อมต่อ', - 'ai-trading-assistant.form.symbol': 'คู่การซื้อขาย', - 'ai-trading-assistant.form.symbolHint': 'เลือกคู่การซื้อขายที่จะซื้อขาย', - 'ai-trading-assistant.form.initialCapital': 'จำนวนเงินที่ลงทุน (มาร์จิ้น)', - 'ai-trading-assistant.form.leverage': 'ใช้ประโยชน์หลายอย่าง', - 'ai-trading-assistant.form.timeframe': 'ช่วงเวลา', - 'ai-trading-assistant.form.timeframe1m': '1 นาที', - 'ai-trading-assistant.form.timeframe5m': '5 นาที', - 'ai-trading-assistant.form.timeframe15m': '15 นาที', - 'ai-trading-assistant.form.timeframe30m': '30 นาที', - 'ai-trading-assistant.form.timeframe1H': '1 ชั่วโมง', - 'ai-trading-assistant.form.timeframe4H': '4 ชั่วโมง', - 'ai-trading-assistant.form.timeframe1D': '1 วัน', - 'ai-trading-assistant.form.marketType': 'ประเภทตลาด', - 'ai-trading-assistant.form.marketTypeFutures': 'สัญญา', - 'ai-trading-assistant.form.marketTypeSpot': 'จุดสินค้า', - 'ai-trading-assistant.form.totalPnl': 'กำไรและขาดทุนทั้งหมด', - 'ai-trading-assistant.form.customPrompt': 'คำแจ้งที่กำหนดเอง', - 'ai-trading-assistant.form.customPromptHint': 'ตัวเลือกเสริม ใช้เพื่อปรับแต่งกลยุทธ์การซื้อขาย AI และตรรกะในการตัดสินใจ', - 'ai-trading-assistant.form.cancel': 'ยกเลิก', - 'ai-trading-assistant.form.prev': 'ขั้นตอนก่อนหน้า', - 'ai-trading-assistant.form.next': 'ขั้นตอนต่อไป', - 'ai-trading-assistant.form.confirmCreate': 'ยืนยันการสร้าง', - 'ai-trading-assistant.form.confirmEdit': 'ยืนยันการเปลี่ยนแปลง', - 'ai-trading-assistant.messages.createSuccess': 'สร้างกลยุทธ์สำเร็จแล้ว', - 'ai-trading-assistant.messages.createFailed': 'ไม่สามารถสร้างนโยบายได้', - 'ai-trading-assistant.messages.updateSuccess': 'อัปเดตนโยบายสำเร็จแล้ว', - 'ai-trading-assistant.messages.updateFailed': 'อัปเดตนโยบายไม่สำเร็จ', - 'ai-trading-assistant.messages.deleteSuccess': 'ลบนโยบายสำเร็จแล้ว', - 'ai-trading-assistant.messages.deleteFailed': 'ลบนโยบายล้มเหลว', - 'ai-trading-assistant.messages.startSuccess': 'กลยุทธ์เริ่มต้นได้สำเร็จ', - 'ai-trading-assistant.messages.startFailed': 'ไม่สามารถเริ่มนโยบายได้', - 'ai-trading-assistant.messages.stopSuccess': 'กลยุทธ์หยุดสำเร็จ', - 'ai-trading-assistant.messages.stopFailed': 'กลยุทธ์หยุดล้มเหลว', - 'ai-trading-assistant.messages.loadFailed': 'ไม่สามารถรับรายการนโยบาย', - 'ai-trading-assistant.messages.loadDecisionsFailed': 'ไม่สามารถรับบันทึกการตัดสินใจของ AI', - 'ai-trading-assistant.messages.deleteConfirm': 'คุณแน่ใจหรือไม่ว่าต้องการลบนโยบายนี้การดำเนินการนี้ไม่สามารถย้อนกลับได้', - 'ai-trading-assistant.placeholders.inputStrategyName': 'โปรดป้อนชื่อนโยบาย', - 'ai-trading-assistant.placeholders.selectModelId': 'โปรดเลือกโมเดล AI', - 'ai-trading-assistant.placeholders.selectDecideInterval': 'โปรดเลือกช่วงการตัดสินใจ', - 'ai-trading-assistant.placeholders.startTime': 'เวลาเริ่มต้น', - 'ai-trading-assistant.placeholders.endTime': 'เวลาสิ้นสุด', - 'ai-trading-assistant.placeholders.inputApiKey': 'กรุณากรอกคีย์ API', - 'ai-trading-assistant.placeholders.selectExchange': 'กรุณาเลือกการแลกเปลี่ยน', - 'ai-trading-assistant.placeholders.inputSecretKey': 'กรุณากรอกรหัสลับ', - 'ai-trading-assistant.placeholders.inputPassphrase': 'กรุณากรอกรหัสผ่าน', - 'ai-trading-assistant.placeholders.selectSymbol': 'โปรดเลือกคู่การซื้อขาย เช่น BTC/USDT', - 'ai-trading-assistant.placeholders.selectTimeframe': 'โปรดเลือกช่วงเวลา', - 'ai-trading-assistant.placeholders.inputCustomPrompt': 'โปรดป้อนคำแจ้งที่กำหนดเอง (ไม่บังคับ)', - 'ai-trading-assistant.validation.strategyNameRequired': 'โปรดป้อนชื่อนโยบาย', - 'ai-trading-assistant.validation.modelIdRequired': 'โปรดเลือกโมเดล AI', - 'ai-trading-assistant.validation.runPeriodRequired': 'กรุณาเลือกรอบการทำงาน', - 'ai-trading-assistant.validation.apiKeyRequired': 'กรุณากรอกคีย์ API', - 'ai-trading-assistant.validation.exchangeRequired': 'กรุณาเลือกการแลกเปลี่ยน', - 'ai-trading-assistant.validation.secretKeyRequired': 'กรุณากรอกรหัสลับ', - 'ai-trading-assistant.validation.symbolRequired': 'กรุณาเลือกคู่การซื้อขาย', - 'ai-trading-assistant.validation.initialCapitalRequired': 'กรุณากรอกจำนวนเงินลงทุน', - 'ai-trading-assistant.table.time': 'เวลา', - 'ai-trading-assistant.table.type': 'พิมพ์', - 'ai-trading-assistant.table.price': 'ราคา', - 'ai-trading-assistant.table.amount': 'ปริมาณ', - 'ai-trading-assistant.table.value': 'จำนวน', - 'ai-trading-assistant.table.symbol': 'คู่การซื้อขาย', - 'ai-trading-assistant.table.side': 'ทิศทาง', - 'ai-trading-assistant.table.size': 'ปริมาณตำแหน่ง', - 'ai-trading-assistant.table.entryPrice': 'ราคาเปิด', - 'ai-trading-assistant.table.currentPrice': 'ราคาปัจจุบัน', - 'ai-trading-assistant.table.unrealizedPnl': 'กำไรหรือขาดทุนที่ยังไม่เกิดขึ้นจริง', - 'ai-trading-assistant.table.profit': 'กำไรและขาดทุน', - 'ai-trading-assistant.table.openLong': 'เปิดยาวๆ', - 'ai-trading-assistant.table.closeLong': 'ปินตัว', - 'ai-trading-assistant.table.openShort': 'เปิดสั้น', - 'ai-trading-assistant.table.closeShort': 'ว่างเปล่า', - 'ai-trading-assistant.table.addLong': 'กาดอต', - 'ai-trading-assistant.table.addShort': 'เพิ่มสั้น', - 'ai-trading-assistant.table.closeShortProfit': 'ขายทำกำไรจากสถานะขาย', - 'ai-trading-assistant.table.closeShortStop': 'หยุดการสูญเสีย', - 'ai-trading-assistant.table.closeLongProfit': 'หยุดยาวและทำกำไร', - 'ai-trading-assistant.table.closeLongStop': 'หยุดการสูญเสีย', - 'ai-trading-assistant.table.buy': 'ซื้อ', - 'ai-trading-assistant.table.sell': 'ขาย', - 'ai-trading-assistant.table.long': 'ยาวไป', - 'ai-trading-assistant.table.short': 'สั้น', - 'ai-trading-assistant.table.hold': 'ถือ', - 'ai-trading-assistant.table.reasoning': 'เหตุผลในการวิเคราะห์', - 'ai-trading-assistant.table.decisions': 'การตัดสินใจ', - 'ai-trading-assistant.table.riskAssessment': 'การประเมินความเสี่ยง', - 'ai-trading-assistant.table.confidence': 'ความมั่นใจ', - 'ai-trading-assistant.table.totalRecords': 'รวม {total} บันทึก', - 'ai-trading-assistant.table.noPositions': 'ยังไม่มีตำแหน่ง', - 'ai-trading-assistant.detail.title': 'รายละเอียดกลยุทธ์', - 'ai-trading-assistant.equity.noData': 'ยังไม่มีข้อมูลมูลค่าสุทธิ', - 'ai-trading-assistant.equity.equity': 'มูลค่าสุทธิ', - 'ai-trading-assistant.exchange.testFailed': 'การทดสอบการเชื่อมต่อล้มเหลว', - 'ai-trading-assistant.exchange.connectionSuccess': 'การเชื่อมต่อสำเร็จ', - 'ai-trading-assistant.exchange.connectionFailed': 'การเชื่อมต่อล้มเหลว', - 'ai-trading-assistant.form.advancedSettings': 'การตั้งค่าขั้นสูง', - 'ai-trading-assistant.form.orderMode': 'โหมดการสั่งซื้อ', - 'ai-trading-assistant.form.orderModeMaker': 'ผู้สร้าง', - 'ai-trading-assistant.form.orderModeTaker': 'ราคาตลาด (เทคเกอร์)', - 'ai-trading-assistant.form.orderModeHint': 'โหมดคำสั่งซื้อที่รอดำเนินการใช้คำสั่งซื้อแบบจำกัดและค่าธรรมเนียมการจัดการต่ำกว่า โหมดราคาตลาดจะดำเนินการทันทีและค่าธรรมเนียมการจัดการจะสูงขึ้น', - 'ai-trading-assistant.form.makerWaitSec': 'เวลารอสำหรับคำสั่งซื้อที่รอดำเนินการ (วินาที)', - 'ai-trading-assistant.form.makerWaitSecHint': 'เวลาที่ต้องรอการทำธุรกรรมหลังจากทำการสั่งซื้อ ยกเลิกและลองอีกครั้งหลังจากหมดเวลา', - 'ai-trading-assistant.form.makerRetries': 'จำนวนการลองใหม่สำหรับคำสั่งซื้อที่รอดำเนินการ', - 'ai-trading-assistant.form.makerRetriesHint': 'จำนวนครั้งสูงสุดในการลองใหม่เมื่อไม่ได้ดำเนินการคำสั่งซื้อที่รอดำเนินการ', - 'ai-trading-assistant.form.fallbackToMarket': 'คำสั่งซื้อที่รอดำเนินการล้มเหลวและราคาตลาดถูกลดระดับลง', - 'ai-trading-assistant.form.fallbackToMarketHint': 'เมื่อการเปิด/ปิดคำสั่งซื้อที่รอดำเนินการไม่เสร็จสมบูรณ์ ควรดาวน์เกรดเป็นคำสั่งซื้อในตลาดเพื่อให้แน่ใจว่าธุรกรรมจะเสร็จสมบูรณ์หรือไม่', - 'ai-trading-assistant.form.marginMode': 'โหมดระยะขอบ', - 'ai-trading-assistant.form.marginModeCross': 'โกดังเต็ม', - 'ai-trading-assistant.form.marginModeIsolated': 'ตำแหน่งที่โดดเดี่ยว', - 'ai-analysis.title': 'เครื่องมือการซื้อขายควอนตัม', - 'ai-analysis.system.online': 'ออนไลน์', - 'ai-analysis.system.agents': 'ตัวแทน', - 'ai-analysis.system.active': 'คล่องแคล่ว', - 'ai-analysis.system.stage': 'เวที', - 'ai-analysis.panel.roster': 'รายชื่อตัวแทน', - 'ai-analysis.panel.thinking': 'กำลังคิด...', - 'ai-analysis.panel.done': 'เสร็จ', - 'ai-analysis.panel.standby': 'สแตนด์บาย', - 'ai-analysis.input.title': 'เครื่องมือการซื้อขายควอนตัม', - 'ai-analysis.input.placeholder': 'เลือกสินทรัพย์เป้าหมาย (เช่น BTC/USDT)', - 'ai-analysis.input.watchlist': 'หุ้นทางเลือก', - 'ai-analysis.input.start': 'เริ่มการวิเคราะห์', - 'ai-analysis.input.recent': 'งานล่าสุด:', - 'ai-analysis.vis.stage': 'เวที', - 'ai-analysis.vis.processing': 'กำลังประมวลผล', - 'ai-analysis.result.complete': 'การวิเคราะห์เสร็จสมบูรณ์', - 'ai-analysis.result.signal': 'สัญญาณสุดท้าย', - 'ai-analysis.result.confidence': 'ความมั่นใจ:', - 'ai-analysis.result.new': 'การวิเคราะห์ใหม่', - 'ai-analysis.result.full': 'ดูรายงานฉบับเต็ม', - 'ai-analysis.logs.title': 'บันทึกของระบบ', - 'ai-analysis.modal.title': 'รายงานที่เป็นความลับ', - 'ai-analysis.modal.fundamental': 'การวิเคราะห์พื้นฐาน', - 'ai-analysis.modal.technical': 'การวิเคราะห์ทางเทคนิค', - 'ai-analysis.modal.sentiment': 'การวิเคราะห์อารมณ์', - 'ai-analysis.modal.risk': 'การประเมินความเสี่ยง', - 'ai-analysis.stage.idle': 'สแตนด์บาย', - 'ai-analysis.stage.1': 'ระยะที่หนึ่ง: การวิเคราะห์หลายมิติ', - 'ai-analysis.stage.2': 'ระยะที่สอง: การอภิปรายระยะยาว-ระยะสั้น', - 'ai-analysis.stage.3': 'ระยะที่สาม: การวางแผนเชิงกลยุทธ์', - 'ai-analysis.stage.4': 'ขั้นตอนที่สี่: การทบทวนการควบคุมความเสี่ยง', - 'ai-analysis.stage.complete': 'เสร็จ', - 'ai-analysis.agent.investment_director': 'ผู้อำนวยการฝ่ายการลงทุน', - 'ai-analysis.agent.role.investment_director': 'การวิเคราะห์ที่ครอบคลุมและข้อสรุปขั้นสุดท้าย', - 'ai-analysis.agent.market': 'นักวิเคราะห์ตลาด', - 'ai-analysis.agent.role.market': 'เทคโนโลยีและข้อมูลการตลาด', - 'ai-analysis.agent.fundamental': 'นักวิเคราะห์พื้นฐาน', - 'ai-analysis.agent.role.fundamental': 'การเงินและการประเมินค่า', - 'ai-analysis.agent.technical': 'นักวิเคราะห์ทางเทคนิค', - 'ai-analysis.agent.role.technical': 'ตัวชี้วัดและแผนภูมิทางเทคนิค', - 'ai-analysis.agent.news': 'นักวิเคราะห์ข่าว', - 'ai-analysis.agent.role.news': 'ตัวกรองข่าวทั่วโลก', - 'ai-analysis.agent.sentiment': 'นักวิเคราะห์ความรู้สึก', - 'ai-analysis.agent.role.sentiment': 'สังคมและอารมณ์', - 'ai-analysis.agent.risk': 'นักวิเคราะห์ความเสี่ยง', - 'ai-analysis.agent.role.risk': 'การตรวจสอบความเสี่ยงเบื้องต้น', - 'ai-analysis.agent.bull': 'นักวิจัยรั้น', - 'ai-analysis.agent.role.bull': 'การขุดตัวเร่งปฏิกิริยาการเติบโต', - 'ai-analysis.agent.bear': 'นักวิจัยขาลง', - 'ai-analysis.agent.role.bear': 'การขุดความเสี่ยงและข้อบกพร่อง', - 'ai-analysis.agent.manager': 'ผู้จัดการฝ่ายวิจัย', - 'ai-analysis.agent.role.manager': 'ผู้ดูแลการอภิปราย', - 'ai-analysis.agent.trader': 'พ่อค้า', - 'ai-analysis.agent.role.trader': 'นักยุทธศาสตร์บริหาร', - 'ai-analysis.agent.risky': 'นักวิเคราะห์กิจกรรม', - 'ai-analysis.agent.role.risky': 'กลยุทธ์เชิงรุก', - 'ai-analysis.agent.neutral': 'นักวิเคราะห์ความสมดุล', - 'ai-analysis.agent.role.neutral': 'กลยุทธ์การสร้างสมดุล', - 'ai-analysis.agent.safe': 'นักวิเคราะห์อนุรักษ์นิยม', - 'ai-analysis.agent.role.safe': 'กลยุทธ์อนุรักษ์นิยม', - 'ai-analysis.agent.cro': 'ผู้จัดการฝ่ายควบคุมความเสี่ยง (CRO)', - 'ai-analysis.agent.role.cro': 'อำนาจในการตัดสินใจขั้นสุดท้าย', - 'ai-analysis.script.market': 'กำลังดึงข้อมูล OHLCV จากการแลกเปลี่ยนหลัก...', - 'ai-analysis.script.fundamental': 'กำลังดึงรายงานทางการเงินรายไตรมาส...', - 'ai-analysis.script.technical': 'กำลังวิเคราะห์ตัวชี้วัดทางเทคนิคและรูปแบบกราฟ...', - 'ai-analysis.script.news': 'กำลังสแกนข่าวการเงินทั่วโลก...', - 'ai-analysis.script.sentiment': 'วิเคราะห์เทรนด์โซเชียลมีเดีย...', - 'ai-analysis.script.risk': 'กำลังคำนวณความผันผวนในอดีต...', - 'invite.inviteLink': 'ลิงค์คำเชิญ', - 'invite.copy': 'คัดลอกลิงก์', - 'invite.copySuccess': 'คัดลอกสำเร็จ!', - 'invite.copyFailed': 'การคัดลอกล้มเหลว โปรดคัดลอกด้วยตนเอง', - 'invite.noInviteLink': 'ไม่ได้สร้างลิงก์คำเชิญ', - 'invite.totalInvites': 'คำเชิญสะสม', - 'invite.totalReward': 'รางวัลสะสม', - 'invite.rules': 'กฎการเชิญชวน', - 'invite.rule1': 'ทุกครั้งที่คุณเชิญเพื่อนมาลงทะเบียนสำเร็จ คุณจะได้รับรางวัล', - 'invite.rule2': 'หากเพื่อนที่ได้รับเชิญทำธุรกรรมครั้งแรกสำเร็จ คุณจะได้รับรางวัลเพิ่มเติม', - 'invite.rule3': 'รางวัลคำเชิญจะถูกส่งไปยังบัญชีของคุณโดยตรง', - 'invite.inviteList': 'รายการเชิญ', - 'invite.tasks': 'ศูนย์ภารกิจ', - 'invite.inviteeName': 'ผู้ได้รับเชิญ', - 'invite.inviteTime': 'เวลาเชิญ', - 'invite.status': 'สถานะ', - 'invite.reward': 'รางวัล', - 'invite.active': 'คล่องแคล่ว', - 'invite.inactive': 'ไม่ได้เปิดใช้งาน', - 'invite.completed': 'สมบูรณ์', - 'invite.claimed': 'ได้รับ', - 'invite.pending': 'ให้แล้วเสร็จ', - 'invite.goToTask': 'เพื่อให้เสร็จสมบูรณ์', - 'invite.claimReward': 'รับรางวัล', - 'invite.verify': 'การยืนยันเสร็จสมบูรณ์', - 'invite.verifySuccess': 'การยืนยันสำเร็จ!งานเสร็จสมบูรณ์', - 'invite.verifyNotCompleted': 'งานยังไม่เสร็จสมบูรณ์ กรุณาทำงานให้เสร็จก่อน', - 'invite.verifyFailed': 'การยืนยันล้มเหลว โปรดลองอีกครั้งในภายหลัง', - 'invite.claimSuccess': 'รับ {reward} QDT สำเร็จแล้ว!', - 'invite.claimFailed': 'ไม่สามารถรวบรวมได้ โปรดลองอีกครั้งในภายหลัง', - 'invite.totalRecords': 'รวม {total} บันทึก', - 'invite.task.twitter.title': 'รีทวีตไปที่ X (Twitter)', - 'invite.task.twitter.desc': 'แบ่งปันทวีตอย่างเป็นทางการของเราไปยังบัญชี X (Twitter) ของคุณ', - 'invite.task.youtube.title': 'ติดตามช่อง YouTube ของเรา', - 'invite.task.youtube.desc': 'สมัครสมาชิกและติดตามช่อง YouTube อย่างเป็นทางการของเรา', - 'invite.task.telegram.title': 'เข้าร่วมกลุ่มโทรเลข', - 'invite.task.telegram.desc': 'เข้าร่วมกลุ่มชุมชนโทรเลขอย่างเป็นทางการของเรา', - 'invite.task.discord.title': 'เข้าร่วมเซิร์ฟเวอร์ Discord', - 'invite.task.discord.desc': 'เข้าร่วมเซิร์ฟเวอร์ชุมชน Discord ของเรา', - 'message': '-', - 'layouts.usermenu.dialog.title': 'ข้อมูล', - 'layouts.usermenu.dialog.content': 'คุณแน่ใจหรือไม่ว่าต้องการออกจากระบบ?', - 'layouts.userLayout.title': 'ค้นหาความจริงในความไม่แน่นอน', - // Auto-filled missing keys from en-US (fallback to English) - 'dashboard.indicator.boundary.message': 'Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.', - 'dashboard.indicator.boundary.indicatorRule': "Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.", - 'dashboard.indicator.boundary.backtestRule': 'Rule: If a bar has a main signal (buy/sell → open/close/reverse), scaling in/out is skipped on the same bar.', - 'dashboard.indicator.guide.title': 'Python Indicator & Strategy Development Guide', - 'dashboard.indicator.guide.intro': 'This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.', - 'dashboard.indicator.guide.section1.title': '1. Runtime Environment & Predefined Variables', - 'dashboard.indicator.guide.section1.env': 'Your code runs in a browser-based Python environment (Pyodide).', - 'dashboard.indicator.guide.section1.libs': 'Pre-installed Libraries', - 'dashboard.indicator.guide.section1.libsDesc': 'The following libraries are imported by default, no need to import again:', - 'dashboard.indicator.guide.section1.libsList': 'pandas (pd), numpy (np), math, json', - 'dashboard.indicator.guide.section1.data': 'Input Data: df', - 'dashboard.indicator.guide.section1.dataDesc': 'The system automatically converts current K-line data into a Pandas DataFrame object, variable name is df.', - 'dashboard.indicator.guide.section1.dataColumns': 'df contains the following columns (all float type):', - 'dashboard.indicator.guide.section1.dataColumnsList': 'time (timestamp, seconds), open, high, low, close, volume', - 'dashboard.indicator.guide.section1.dataNote': 'Data index is arranged from old to new (0 is the earliest data, last row is the latest data).', - 'dashboard.indicator.guide.section1.dataIndex': 'Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using .values which loses the index.', - 'dashboard.indicator.guide.section2.title': '2. Parameter Definition', - 'dashboard.indicator.guide.section2.desc': 'You can define variables as parameters at the beginning of your code. The system will try to parse statements like variable = value as adjustable parameters.', - 'dashboard.indicator.guide.section2.example': 'Parameter Example', - 'dashboard.indicator.guide.section2.exampleCode': 'span = 20 or multiplier = 2.0', - 'dashboard.indicator.guide.section3.title': '3. Backtest Signal Setup (Important!)', - 'dashboard.indicator.guide.section3.desc': 'If you want your indicator to support backtesting, you must set the following two columns in your code:', - 'dashboard.indicator.guide.section3.backtestRequired': 'Required for Backtesting:', - 'dashboard.indicator.guide.section3.backtestBuySignal': "df['buy_signal'] - Boolean Series, True indicates buy signal", - 'dashboard.indicator.guide.section3.backtestSellSignal': "df['sell_signal'] - Boolean Series, True indicates sell signal", - 'dashboard.indicator.guide.section3.backtestExample': 'Example:', - 'dashboard.indicator.guide.section3.backtestExampleCode': "df['buy_signal'] = condition_buy
    df['sell_signal'] = condition_sell", - 'dashboard.indicator.guide.section3.backtestNote': 'Note: Even if you only set output.signals for chart display, you must set these two columns to enable backtesting.', - 'dashboard.indicator.guide.section4.title': '4. Output Requirements: output', - 'dashboard.indicator.guide.section4.desc': 'At the end of code execution, you must define a dictionary named output to tell the chart how to display results.', - 'dashboard.indicator.guide.section4.fields': 'The output dictionary contains the following fields:', - 'dashboard.indicator.guide.section4.plots': 'plots - For drawing lines (e.g., moving averages, RSI)', - 'dashboard.indicator.guide.section4.signals': 'signals - For marking buy/sell signals (e.g., arrows, labels)', - 'dashboard.indicator.guide.section4.name': 'name - Indicator name (optional)', - 'dashboard.indicator.guide.section4.calculatedVars': 'calculatedVars - Calculated variables (optional, for displaying additional information)', - 'dashboard.indicator.guide.section5.title': '5. Plot Configuration (Plots)', - 'dashboard.indicator.guide.section5.desc': 'Each object in the plots list represents a line.', - 'dashboard.indicator.guide.section5.table.field': 'Field', - 'dashboard.indicator.guide.section5.table.type': 'Type', - 'dashboard.indicator.guide.section5.table.required': 'Required', - 'dashboard.indicator.guide.section5.table.requiredYes': 'Yes', - 'dashboard.indicator.guide.section5.table.requiredNo': 'No', - 'dashboard.indicator.guide.section5.table.desc': 'Description', - 'dashboard.indicator.guide.section5.table.name': 'The name of the indicator line, displayed in the legend', - 'dashboard.indicator.guide.section5.table.data': 'Data list, length must match the number of rows in df. Recommended to use series.tolist()', - 'dashboard.indicator.guide.section5.table.color': "Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign", - 'dashboard.indicator.guide.section5.table.typeDesc': "Chart type, default is 'line'", - 'dashboard.indicator.guide.section5.table.overlay': 'Important. True means display on main chart (with K-line), False means display on sub-chart (independent area)', - 'dashboard.indicator.guide.section5.example': 'Example: Draw Simple Moving Average (SMA)', - 'dashboard.indicator.guide.section5.exampleCalc': 'Calculate SMA', - 'dashboard.indicator.guide.section5.exampleOutput': 'Construct Output', - 'dashboard.indicator.guide.section5.exampleOverlay': 'Display on main chart', - 'dashboard.indicator.guide.section6.title': '6. Signal Markers (Signals)', - 'dashboard.indicator.guide.section6.desc': "signals are used to mark buy/sell points on specific K-lines through icons or text. Note: This is only for chart display. The backtest system uses df['buy_signal'] and df['sell_signal'].", - 'dashboard.indicator.guide.section6.table.type': "Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)", - 'dashboard.indicator.guide.section6.table.data': 'Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions', - 'dashboard.indicator.guide.section6.table.text': 'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")', - 'dashboard.indicator.guide.section6.table.color': 'Marker color', - 'dashboard.indicator.guide.section6.hint': 'The system automatically handles positioning.', - 'dashboard.indicator.guide.section6.buy': 'Markers will be automatically positioned below the Low of the current K-line', - 'dashboard.indicator.guide.section6.sell': 'Markers will be automatically positioned above the High of the current K-line', - 'dashboard.indicator.guide.section6.example': 'Example: Draw Buy/Sell Signals', - 'dashboard.indicator.guide.section6.exampleInit': 'Initialize signal list, fill all with None', - 'dashboard.indicator.guide.section6.exampleLogic': 'Simple logic: mark buy when close price is greater than open price', - 'dashboard.indicator.guide.section6.exampleNote': 'In actual logic, please use loops or vectorized operations', - 'dashboard.indicator.guide.section6.examplePrice': 'Record price', - 'dashboard.indicator.guide.section6.exampleText': 'Buy', - 'dashboard.indicator.guide.section7.title': '7. Complete Code Examples', - 'dashboard.indicator.guide.section7.exampleA': 'Example A: Dual EMA Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleACode': "# 1. Calculate indicators
    df['ema_fast'] = df['close'].ewm(span=5, adjust=False).mean()
    df['ema_slow'] = df['close'].ewm(span=13, adjust=False).mean()

    # 2. Calculate crossover signals
    cross_up = (df['ema_fast'] > df['ema_slow']) & (df['ema_fast'].shift(1) <= df['ema_slow'].shift(1))
    cross_down = (df['ema_fast'] < df['ema_slow']) & (df['ema_fast'].shift(1) >= df['ema_slow'].shift(1))

    # 3. 【Important】Set NEW backtest signal columns (bool)
    df['open_long'] = cross_up
    df['close_long'] = cross_down
    df['open_short'] = cross_down
    df['close_short'] = cross_up

    # 4. Generate signal data for chart display
    buy_signals = [df['low'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]

    # 5. Build output
    output = {
    \"name\": \"Dual EMA Strategy\",
    \"plots\": [
    {\"name\": \"EMA 5\", \"data\": df['ema_fast'].tolist(), \"color\": \"#FF6B6B\", \"overlay\": True},
    {\"name\": \"EMA 13\", \"data\": df['ema_slow'].tolist(), \"color\": \"#4ECDC4\", \"overlay\": True}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleB': 'Example B: Bollinger Bands - Chart Display Only', - 'dashboard.indicator.guide.section7.exampleBCode': "# Calculate Bollinger Bands (chart display only, no backtesting)
    length = 20
    mult = 2.0
    df['sma'] = df['close'].rolling(length).mean()
    df['std'] = df['close'].rolling(length).std()
    df['upper'] = df['sma'] + mult * df['std']
    df['lower'] = df['sma'] - mult * df['std']

    output = {
    \"name\": \"Bollinger Bands\",
    \"plots\": [
    {\"name\": \"Upper\", \"data\": df['upper'].tolist(), \"color\": \"#FF5252\", \"overlay\": True},
    {\"name\": \"Middle\", \"data\": df['sma'].tolist(), \"color\": \"#2196F3\", \"overlay\": True},
    {\"name\": \"Lower\", \"data\": df['lower'].tolist(), \"color\": \"#00E676\", \"overlay\": True}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleC': 'Example C: RSI Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleCCode': "# Calculate RSI
    delta = df['close'].diff()
    up = delta.clip(lower=0)
    down = -1 * delta.clip(upper=0)
    ema_up = up.ewm(com=13, adjust=False).mean()
    ema_down = down.ewm(com=13, adjust=False).mean()
    rs = ema_up / ema_down
    df['rsi'] = 100 - (100 / (1 + rs))

    # Generate trading signals
    buy_condition = df['rsi'] < 30 # Oversold buy
    sell_condition = df['rsi'] > 70 # Overbought sell

    # 【Important】Set NEW backtest signal columns (bool)
    df['open_long'] = buy_condition
    df['close_long'] = sell_condition
    df['open_short'] = sell_condition
    df['close_short'] = buy_condition

    # Generate chart signals
    buy_signals = [df['low'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]

    output = {
    \"name\": \"RSI Strategy\",
    \"plots\": [
    {\"name\": \"RSI\", \"data\": df['rsi'].tolist(), \"color\": \"#9C27B0\", \"overlay\": False},
    {\"name\": \"Overbought\", \"data\": [70] * len(df), \"color\": \"#FF5252\", \"style\": \"dashed\", \"overlay\": False},
    {\"name\": \"Oversold\", \"data\": [30] * len(df), \"color\": \"#00E676\", \"style\": \"dashed\", \"overlay\": False}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section6.param': 'Parameters', - 'dashboard.indicator.guide.section6.calc': 'Calculate', - 'dashboard.indicator.guide.section6.output': 'Output', - 'dashboard.indicator.guide.section6.generate': 'Generate signal data (initialize with None)', - 'dashboard.indicator.guide.section6.subchart': 'Display on sub-chart', - 'dashboard.indicator.guide.section8.title': '8. Frequently Asked Questions (FAQ)', - 'dashboard.indicator.guide.section8.q1': "Q: Why can't my indicator be backtested?", - 'dashboard.indicator.guide.section8.a1': "A: The backtest system requires NEW signal columns: df['open_long'], df['close_long'], df['open_short'], df['close_short'] (boolean). Even if you set output.signals for chart display, you must set these columns to enable backtesting.", - 'dashboard.indicator.guide.section8.q2': 'Q: Data length mismatch?', - 'dashboard.indicator.guide.section8.a2': "A: The data list in plots and signals must have exactly the same length as the K-line data. If you use df['xxx'].tolist(), there is usually no problem.", - 'dashboard.indicator.guide.section8.q3': 'Q: How to handle NaN (empty values)?', - 'dashboard.indicator.guide.section8.a3': "A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use df.fillna(0) or other methods.", - 'dashboard.indicator.guide.section8.q4': 'Q: Index mismatch causing all signals to be NaN?', - 'dashboard.indicator.guide.section8.a4': "A: Please ensure you preserve the original df index (timestamp). Avoid using .values to create new Series. Use columns directly like df['close'] for operations.", - 'dashboard.indicator.guide.section8.q5': 'Q: Can I use third-party network libraries?', - 'dashboard.indicator.guide.section8.a5': 'A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.', - 'dashboard.indicator.guide.section8.q6': 'Q: How to debug code?', - 'dashboard.indicator.guide.section8.a6': 'A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.', - 'dashboard.indicator.guide.section8.q7': 'Q: Backtest shows 0 signals?', - 'dashboard.indicator.guide.section8.a7': "A: Please check the data type of df['open_long']/df['close_long']/df['open_short']/df['close_short']. They should be boolean (True/False), not numeric. Use condition.fillna(False).astype(bool) to ensure correct type.", - 'dashboard.indicator.backtest.commissionHint': 'Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.', - 'dashboard.indicator.backtest.historyTitle': 'Backtest History', - 'dashboard.indicator.backtest.historyRefresh': 'Refresh', - 'dashboard.indicator.backtest.historyView': 'View', - 'dashboard.indicator.backtest.historyNoData': 'No backtest history', - 'dashboard.indicator.backtest.historyUseCurrent': 'Only current symbol/timeframe', - 'dashboard.indicator.backtest.historyFilterSymbol': 'Symbol', - 'dashboard.indicator.backtest.historyFilterTimeframe': 'Timeframe', - 'dashboard.indicator.backtest.historyApply': 'Apply filters', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AI Analyze', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI Suggestions', - 'dashboard.indicator.backtest.historyNoAIResult': 'No AI analysis result', - 'dashboard.indicator.backtest.historyRunId': 'Run ID', - 'dashboard.indicator.backtest.historyCreatedAt': 'Time', - 'dashboard.indicator.backtest.historyRange': 'Range', - 'dashboard.indicator.backtest.historyStatus': 'Status', - 'dashboard.indicator.backtest.historyStatusSuccess': 'Success', - 'dashboard.indicator.backtest.historyStatusFailed': 'Failed', - 'dashboard.indicator.backtest.historyActions': 'Actions', - 'trading-assistant.exchange.ipWhitelistTip': 'Please add the following IPs to the whitelist in your exchange API settings:', - 'signal-robot.title': 'Signal Robot Console', - 'signal-robot.createBot': 'Create New Bot', - 'signal-robot.search.nameOrSymbol': 'Name/Symbol', - 'signal-robot.search.placeholder': 'Search bot name or symbol', - 'signal-robot.search.status': 'Status', - 'signal-robot.search.statusAll': 'All', - 'signal-robot.search.statusRunning': 'Running', - 'signal-robot.search.statusPaused': 'Paused', - 'signal-robot.search.query': 'Query', - 'signal-robot.search.reset': 'Reset', - 'signal-robot.table.botName': 'Bot Name', - 'signal-robot.table.symbolTimeframe': 'Symbol/Timeframe', - 'signal-robot.table.triggerStrategy': 'Trigger Strategy', - 'signal-robot.table.notificationChannels': 'Notification Channels', - 'signal-robot.table.status': 'Status', - 'signal-robot.table.action': 'Action', - 'signal-robot.table.triggerConditions': '{count} trigger conditions', - 'signal-robot.table.monitoring': 'Monitoring', - 'signal-robot.table.paused': 'Paused', - 'signal-robot.table.edit': 'Edit', - 'signal-robot.table.pause': 'Pause', - 'signal-robot.table.start': 'Start', - 'signal-robot.table.delete': 'Delete', - 'signal-robot.table.deleteConfirm': 'Are you sure you want to delete this bot?', - 'signal-robot.table.deleteSuccess': 'Deleted successfully', - 'signal-robot.table.startSuccess': 'Bot started', - 'signal-robot.table.pauseSuccess': 'Bot paused', - 'signal-robot.channel.telegram': 'Telegram', - 'signal-robot.channel.discord': 'Discord', - 'signal-robot.channel.email': 'Email', - 'signal-robot.channel.webhook': 'Webhook', - 'signal-robot.channel.browser': 'Browser Push', - 'signal-robot.modal.createTitle': 'Create New Signal Robot', - 'signal-robot.modal.editTitle': 'Edit Signal Robot', - 'signal-robot.modal.step.basic': 'Basic Settings', - 'signal-robot.modal.step.entry': 'Entry Strategy', - 'signal-robot.modal.step.position': 'Position Management', - 'signal-robot.modal.step.risk': 'Risk Control', - 'signal-robot.modal.step.notify': 'Notification Config', - 'signal-robot.modal.prev': 'Previous', - 'signal-robot.modal.next': 'Next', - 'signal-robot.modal.preview': 'Preview Backtest', - 'signal-robot.modal.complete': 'Complete & Run', - 'signal-robot.modal.saveSuccess': 'Saved successfully', - 'signal-robot.modal.previewDeveloping': 'Preview feature is under development...', - 'signal-robot.modal.basicInfoRequired': 'Please complete basic information', - 'signal-robot.basic.alert': 'Set basic information for the bot', - 'signal-robot.basic.title': 'Basic Information', - 'signal-robot.basic.botName': 'Bot Name', - 'signal-robot.basic.botNamePlaceholder': 'e.g.: BTC SuperTrend Strategy', - 'signal-robot.basic.symbol': 'Trading Pair', - 'signal-robot.basic.symbolPlaceholder': 'Select from watchlist', - 'signal-robot.basic.noWatchlist': 'No watchlist items, please add in market page first', - 'signal-robot.basic.timeframe': 'K-Line Period', - 'signal-robot.basic.timeframe15m': '15 Minutes', - 'signal-robot.basic.timeframe30m': '30 Minutes', - 'signal-robot.basic.timeframe1h': '1 Hour', - 'signal-robot.basic.timeframe4h': '4 Hours', - 'signal-robot.basic.timeframe1d': '1 Day', - 'signal-robot.basic.autoNameSuggestion': '{symbol} Signal Robot', - 'signal-robot.entry.alert': 'Trigger entry signal when all conditions below are met', - 'signal-robot.entry.condition': 'Condition {index}', - 'signal-robot.entry.indicator': 'Indicator', - 'signal-robot.entry.indicatorSupertrend': 'SuperTrend', - 'signal-robot.entry.indicatorEma': 'EMA (Exponential Moving Average)', - 'signal-robot.entry.indicatorRsi': 'RSI (Relative Strength Index)', - 'signal-robot.entry.indicatorMacd': 'MACD', - 'signal-robot.entry.indicatorBollinger': 'Bollinger Bands', - 'signal-robot.entry.atrPeriod': 'ATR Period', - 'signal-robot.entry.multiplier': 'Multiplier', - 'signal-robot.entry.triggerSignal': 'Trigger Signal', - 'signal-robot.entry.signalTrendBullish': 'Trend Bullish', - 'signal-robot.entry.signalTrendBearish': 'Trend Bearish', - 'signal-robot.entry.signalIsUptrend': 'Is Uptrend', - 'signal-robot.entry.signalIsDowntrend': 'Is Downtrend', - 'signal-robot.entry.period': 'Period', - 'signal-robot.entry.compareCondition': 'Compare Condition', - 'signal-robot.entry.priceAbove': 'Price > EMA (Price Above)', - 'signal-robot.entry.priceBelow': 'Price < EMA (Price Below)', - 'signal-robot.entry.crossUp': 'Price Crosses Above EMA (Golden Cross)', - 'signal-robot.entry.crossDown': 'Price Crosses Below EMA (Death Cross)', - 'signal-robot.entry.compare': 'Compare', - 'signal-robot.entry.greaterThan': 'Greater Than', - 'signal-robot.entry.lessThan': 'Less Than', - 'signal-robot.entry.crossUpShort': 'Cross Up', - 'signal-robot.entry.crossDownShort': 'Cross Down', - 'signal-robot.entry.threshold': 'Threshold', - 'signal-robot.entry.selectIndicator': 'Please select an indicator to configure parameters', - 'signal-robot.entry.addCondition': 'Add Condition', - 'signal-robot.position.alert': 'Configure initial position size, leverage and pyramiding rules', - 'signal-robot.position.basicTitle': 'Basic Position Management', - 'signal-robot.position.initialSize': 'Initial Size (Capital %)', - 'signal-robot.position.initialSizeHint': 'Recommended 5% - 20%', - 'signal-robot.position.leverage': 'Leverage', - 'signal-robot.position.leverageHint': 'Please ensure your exchange account supports this leverage', - 'signal-robot.position.maxPyramiding': 'Max Pyramiding Times', - 'signal-robot.position.maxPyramidingHint': '0 means no pyramiding', - 'signal-robot.position.pyramidingTitle': 'Pyramiding Rules', - 'signal-robot.position.pyramidingEnabled': 'Enabled', - 'signal-robot.position.pyramidingDisabled': 'Disabled', - 'signal-robot.position.pyramidingCondition': 'Pyramiding Trigger Condition', - 'signal-robot.position.priceRisePct': 'Price Rises (Long) / Falls (Short)', - 'signal-robot.position.profitPct': 'Profit Reaches', - 'signal-robot.position.triggerThreshold': 'Trigger Threshold (%)', - 'signal-robot.position.triggerThresholdHint': 'e.g. 3%: add position once every 3% rise', - 'signal-robot.position.addSize': 'Single Add Size (Capital %)', - 'signal-robot.position.pyramidingDisabledHint': 'Pyramiding disabled, only initial position will be executed', - 'signal-robot.risk.alert': 'Configure take profit, stop loss and exit rules', - 'signal-robot.risk.stopLossTitle': 'Stop Loss', - 'signal-robot.risk.stopLossEnabled': 'Enabled', - 'signal-robot.risk.stopLossDisabled': 'Disabled', - 'signal-robot.risk.stopLossType': 'Stop Loss Type', - 'signal-robot.risk.stopLossFixedPct': 'Fixed Percentage', - 'signal-robot.risk.stopLossAtrMultiplier': 'ATR Multiplier', - 'signal-robot.risk.stopLossValue': 'Value', - 'signal-robot.risk.stopLossFixedHint': 'e.g. 2%: stop loss when loss reaches 2%', - 'signal-robot.risk.stopLossAtrHint': 'e.g. 2.0: stop loss when price touches ATR*2.0', - 'signal-robot.risk.stopLossDisabledHint': 'Stop loss disabled (high risk)', - 'signal-robot.risk.trailingStopTitle': 'Trailing Stop', - 'signal-robot.risk.activationProfit': 'Activation Profit (%)', - 'signal-robot.risk.activationProfitHint': 'Start trailing when profit reaches this level', - 'signal-robot.risk.callbackPct': 'Callback (%)', - 'signal-robot.risk.callbackPctHint': 'Trigger take profit when price falls from peak by this percentage', - 'signal-robot.risk.trailingStopDisabledHint': 'Trailing stop disabled', - 'signal-robot.risk.otherExitTitle': 'Other Exit Rules', - 'signal-robot.risk.signalExit': 'Allow Signal Exit', - 'signal-robot.risk.signalExitHint': 'Close position immediately when reverse signal appears (e.g. close long when short signal appears)', - 'signal-robot.notify.alert': 'Configure notification methods when signal is triggered', - 'signal-robot.notify.channelTitle': 'Notification Channels', - 'signal-robot.notify.discordWebhook': 'Discord Webhook', - 'signal-robot.notify.genericWebhook': 'Generic Webhook', - 'signal-robot.notify.webhookUrl': 'Webhook URL', - 'signal-robot.notify.webhookUrlPlaceholder': 'https://example.com/webhook', - 'signal-robot.notify.discordUrl': 'Discord URL', - 'signal-robot.notify.discordUrlPlaceholder': 'https://discord.com/api/webhooks/...', - 'signal-robot.operator.greaterThan': 'Greater Than', - 'signal-robot.operator.lessThan': 'Less Than', - 'signal-robot.operator.equal': 'Equal', - 'signal-robot.operator.goldenCross': 'Golden Cross', - 'signal-robot.operator.deathCross': 'Death Cross', - 'signal-robot.operator.increaseBy': 'Increase By', - 'signal-robot.operator.decreaseBy': 'Decrease By', - 'signal-robot.indicator.price': 'Price', - 'signal-robot.indicator.rsi': 'RSI', - 'signal-robot.indicator.kdjK': 'KDJ(K)', - 'signal-robot.indicator.kdjJ': 'KDJ(J)', - 'signal-robot.indicator.macd': 'MACD', - 'signal-robot.indicator.macdHist': 'MACD Histogram', - 'signal-robot.indicator.bollingerUp': 'Bollinger Upper', - 'signal-robot.indicator.bollingerLow': 'Bollinger Lower', - 'signal-robot.indicator.volume': 'Volume', - 'signal-robot.indicator.changePct1h': '1H Change %', - 'signal-robot.indicator.changePct24h': '24H Change %', - 'signal-robot.indicator.signalLine': 'Signal Line', - - // Settings (Memory/Reflection) - 'settings.group.agent_memory': 'หน่วยความจำ/การสะท้อน', - 'settings.group.reflection_worker': 'ตัวทำงานตรวจสอบการสะท้อนอัตโนมัติ', - 'settings.field.ENABLE_AGENT_MEMORY': 'เปิดใช้หน่วยความจำเอเจนต์', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'เปิดใช้การค้นหาเวกเตอร์ (ในเครื่อง)', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'มิติ Embedding', - 'settings.field.AGENT_MEMORY_TOP_K': 'จำนวนดึงข้อมูล Top-K', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'ขนาดหน้าต่างผู้สมัคร', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': 'ครึ่งชีวิตการลดทอนตามเวลา (วัน)', - 'settings.field.AGENT_MEMORY_W_SIM': 'ค่าน้ำหนักความคล้าย', - 'settings.field.AGENT_MEMORY_W_RECENCY': 'ค่าน้ำหนักเวลา', - 'settings.field.AGENT_MEMORY_W_RETURNS': 'ค่าน้ำหนักผลตอบแทน', - 'settings.field.ENABLE_REFLECTION_WORKER': 'เปิดใช้การตรวจสอบอัตโนมัติ', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': 'ช่วงเวลาตรวจสอบ (วินาที)' -} - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/vi-VN.js b/quantdinger_vue/src/locales/lang/vi-VN.js deleted file mode 100644 index 70b592e..0000000 --- a/quantdinger_vue/src/locales/lang/vi-VN.js +++ /dev/null @@ -1,2924 +0,0 @@ -import antdViVN from 'ant-design-vue/es/locale-provider/vi_VN' -import momentVI from 'moment/locale/vi' - -const components = { - antLocale: antdViVN, - momentName: 'vi', - momentLocale: momentVI -} - -const locale = { - - 'submit': 'Gửi', - - 'save': 'Lưu', - - 'submit.ok': 'Gửi thành công', - - 'save.ok': 'Lưu thành công', - - 'menu.welcome': 'Chào mừng', - - 'menu.home': 'Trang chủ', - - 'menu.dashboard': 'Bảng điều khiển', - - 'menu.dashboard.indicator': 'Phân tích chỉ báo', - - 'menu.dashboard.community': 'Cộng đồng chỉ báo', - - 'menu.dashboard.analysis': 'Phân tích AI', - - 'menu.dashboard.tradingAssistant': 'Trợ lý giao dịch', - - 'menu.dashboard.aiTradingAssistant': 'Trợ lý giao dịch AI', - 'menu.dashboard.signalRobot': 'Robot tín hiệu', - 'menu.dashboard.monitor': 'Giám sát Trang', - - 'menu.dashboard.workplace': 'Nơi làm việc', - - 'menu.form': 'Trang biểu mẫu', - - 'menu.form.basic-form': 'Biểu mẫu cơ bản', - - 'menu.form.step-form': 'Biểu mẫu từng bước', - - 'menu.form.step-form.info': 'Biểu mẫu từng bước (Điền thông tin chuyển khoản)', - - 'menu.form.step-form.confirm': 'Biểu mẫu từng bước (Xác nhận thông tin chuyển khoản)', - - 'menu.form.step-form.result': 'Biểu mẫu từng bước (Hoàn tất)', - - 'menu.form.advanced-form': 'Biểu mẫu nâng cao', - - 'menu.list': 'Trang danh sách', - - 'menu.list.table-list': 'Bảng truy vấn', - - 'menu.list.basic-list': 'Tiêu chuẩn Menu.list', - - 'menu.list.card-list': 'Danh sách thẻ', - - 'menu.list.search-list': 'Tìm kiếm danh sách', - - 'menu.list.search-list.articles': 'Tìm kiếm danh sách (Bài viết)', - - 'menu.list.search-list.projects': 'Tìm kiếm danh sách (Dự án)', - - 'menu.list.search-list.applications': 'Tìm kiếm danh sách (Ứng dụng)', - - 'menu.profile': 'Trang chi tiết', - - 'menu.profile.basic': 'Trang chi tiết cơ bản', - - 'menu.profile.advanced': 'Trang chi tiết nâng cao', - - 'menu.result': 'Trang kết quả', - - 'menu.result.success': 'Trang thành công', - - 'menu.result.fail': 'Trang thất bại', - - 'menu.exception': 'Ngoại lệ Trang', - - 'menu.exception.not-permission': '403', - - 'menu.exception.not-find': '404', - - 'menu.exception.server-error': '500', - - 'menu.exception.trigger': 'Đang gây ra lỗi', - - 'menu.account': 'Trang cá nhân', - - 'menu.account.center': 'Trung tâm cá nhân', - - 'menu.account.settings': 'Cài đặt cá nhân', - - 'menu.account.trigger': 'Đang gây ra lỗi', - - 'menu.account.logout': 'Đăng xuất', - - 'menu.wallet': 'Ví của tôi', - - 'menu.docs': 'Trung tâm tài liệu', - - 'menu.docs.detail': 'Chi tiết tài liệu', - - 'menu.header.refreshPage': 'Làm mới Trang', - - 'menu.invite.friends': 'Mời bạn bè', - - 'app.setting.pagestyle': 'Cài đặt kiểu tổng thể', - - 'app.setting.pagestyle.light': 'Kiểu menu sáng', - - 'app.setting.pagestyle.dark': 'Kiểu menu tối', - - 'app.setting.pagestyle.realdark': 'Chế độ tối', - - 'app.setting.themecolor': 'Màu chủ đề', - - 'app.setting.navigationmode': 'Chế độ điều hướng', - - 'app.setting.sidemenu.nav': 'Điều hướng thanh bên', - - 'app.setting.topmenu.nav': 'Điều hướng trên cùng', - - 'app.setting.content-width': 'Chiều rộng vùng nội dung', - - 'app.setting.content-width.tooltip': 'Cài đặt này chỉ có hiệu lực khi [Điều hướng trên cùng] được bật', - - 'app.setting.content-width.fixed': 'Cố định', - - 'app.setting.content-width.fluid': 'Linh hoạt', - - 'app.setting.fixedheader': 'Tiêu đề cố định', - - 'app.setting.fixedheader.tooltip': 'Có thể cấu hình khi tiêu đề cố định', - - 'app.setting.autoHideHeader': 'Ẩn tiêu đề khi vuốt xuống', - - 'app.setting.fixedsidebar': 'Menu thanh bên cố định', - - 'app.setting.sidemenu': 'Bố cục menu thanh bên', - - 'app.setting.topmenu': 'Bố cục menu trên cùng', - - 'app.setting.othersettings': 'Các cài đặt khác', - - 'app.setting.weakmode': 'Chế độ màu yếu', - - 'app.setting.multitab': 'Chế độ nhiều tab', - - 'app.setting.copy': 'Sao chép cài đặt', - - 'app.setting.loading': 'Đang tải theme', - - 'app.setting.copyinfo': 'Đã sao chép cài đặt thành công src/config/defaultSettings.js', - - 'app.setting.copy.success': 'Sao chép hoàn tất', - - 'app.setting.copy.fail': 'Sao chép thất bại', - - 'app.setting.theme.switching': 'Đang chuyển đổi giao diện!', - - 'app.setting.production.hint': 'Thanh cấu hình chỉ dùng để xem trước trong môi trường phát triển và sẽ không hiển thị trong môi trường sản xuất. Vui lòng sao chép và chỉnh sửa thủ công tệp cấu hình.', - - 'app.setting.themecolor.daybreak': 'Xanh dương bình minh (mặc định)', - - 'app.setting.themecolor.dust': 'Hoàng hôn', - - 'app.setting.themecolor.volcano': 'Núi lửa', - - 'app.setting.themecolor.sunset': 'Hoàng hôn', - - 'app.setting.themecolor.cyan': 'Xanh lam sáng', - - 'app.setting.themecolor.green': 'Xanh lục cực quang', - - 'app.setting.themecolor.geekblue': 'Xanh dương công nghệ', - - 'app.setting.themecolor.purple': 'Tím', - - 'app.setting.tooltip': 'Cài đặt trang', - - 'user.login.userName': 'Tên người dùng', - - 'user.login.password': 'Mật khẩu', - - 'user.login.username.placeholder': 'Tài khoản: admin', - - 'user.login.password.placeholder': 'Mật khẩu: admin hoặc ant.design', - - 'user.login.message-invalid-credentials': 'Đăng nhập thất bại, vui lòng kiểm tra email và mã xác minh của bạn', - - 'user.login.message-invalid-verification-code': 'Mã xác minh không chính xác', - - 'user.login.tab-login-credentials': 'Đăng nhập bằng tài khoản và mật khẩu', - - 'user.login.tab-login-email': 'Đăng nhập bằng email', - - 'user.login.tab-login-mobile': 'Đăng nhập bằng số điện thoại', - - 'user.login.captcha.placeholder': 'Vui lòng nhập mã xác minh hình ảnh', - - 'user.login.mobile.placeholder': 'Số điện thoại Số điện thoại', - - 'user.login.mobile.verification-code.placeholder': 'Mã xác thực', - - 'user.login.email.placeholder': 'Vui lòng nhập địa chỉ email', - - 'user.login.email.verification-code.placeholder': 'Vui lòng nhập mã xác thực', - - 'user.login.email.sending': 'Đang gửi mã xác thực...', - - 'user.login.email.send-success-title': 'Thông báo', - - 'user.login.email.send-success': 'Mã xác thực đã được gửi thành công, vui lòng kiểm tra email của bạn', - - 'user.login.sms.send-success': 'Mã xác thực đã được gửi thành công, vui lòng kiểm tra tin nhắn SMS của bạn', - - 'user.login.remember-me': 'Tự động đăng nhập', - - 'user.login.forgot-password': 'Quên mật khẩu Mật khẩu', - - 'user.login.sign-in-with': 'Các phương thức đăng nhập khác', - - 'user.login.signup': 'Đăng ký tài khoản', - - 'user.login.login': 'Đăng nhập', - - 'user.register.register': 'Đăng ký', - - 'user.register.email.placeholder': 'Email', - - 'user.register.password.placeholder': 'Vui lòng nhập ít nhất 6 ký tự. Vui lòng không sử dụng mật khẩu dễ đoán.', - - 'user.register.password.popover-message': 'Vui lòng nhập ít nhất 6 ký tự. Vui lòng không sử dụng mật khẩu dễ đoán.', - - 'user.register.confirm-password.placeholder': 'Xác nhận mật khẩu', - - 'user.register.get-verification-code': 'Lấy mã xác minh', - - 'user.register.sign-in': 'Đăng nhập bằng tài khoản hiện có', - - 'user.register-result.msg': 'Tài khoản của bạn: {email} đã được đăng ký thành công', - - 'user.register-result.activation-email': 'Email kích hoạt đã được gửi đến hộp thư đến của bạn. Email có hiệu lực trong 24 giờ. Vui lòng đăng nhập vào email của bạn và nhấp vào liên kết trong email để kích hoạt tài khoản.', - - 'user.register-result.back-home': 'Quay lại trang chủ', - - 'user.register-result.view-mailbox': 'Xem email', - - 'user.email.required': 'Vui lòng nhập địa chỉ email của bạn!', - - 'user.email.wrong-format': 'Định dạng địa chỉ email không chính xác!', - - 'user.userName.required': 'Vui lòng nhập tên người dùng hoặc địa chỉ email của bạn', - -'user.password.required': 'Vui lòng nhập mật khẩu của bạn!', - -'user.password.twice.msg': 'Hai mật khẩu không khớp!', - -'user.password.strength.msg': 'Mật khẩu không đủ mạnh', - -'user.password.strength.strong': 'Độ mạnh: Mạnh', - -'user.password.strength.medium': 'Độ mạnh: Trung bình', - -'user.password.strength.low': 'Độ mạnh: Yếu', - -'user.password.strength.short': 'Độ mạnh: Quá ngắn', - -'user.confirm-password.required': 'Vui lòng xác nhận mật khẩu của bạn!', - -'user.phone-number.required': 'Vui lòng nhập số điện thoại hợp lệ', - -'user.phone-number.wrong-format': 'Định dạng số điện thoại không chính xác!', - -'user.verification-code.required': 'Vui lòng nhập mã xác minh!', - -'user.captcha.required': 'Vui lòng nhập mã xác minh hình ảnh!', - -'user.login.infos': 'QuantDinger là công cụ phân tích cổ phiếu đa tác nhân AI và không có chứng chỉ tư vấn đầu tư chứng khoán. Tất cả kết quả phân tích, xếp hạng và ý kiến ​​tham khảo trên nền tảng đều được AI tự động tạo ra dựa trên dữ liệu lịch sử và chỉ dành cho mục đích học tập, nghiên cứu và trao đổi kỹ thuật. Chúng không cấu thành bất kỳ lời khuyên đầu tư hoặc cơ sở ra quyết định nào. Đầu tư cổ phiếu tiềm ẩn nhiều rủi ro như rủi ro thị trường, rủi ro thanh khoản và rủi ro chính sách, có thể dẫn đến mất vốn gốc. Người dùng nên đưa ra quyết định độc lập dựa trên khả năng chấp nhận rủi ro của mình, và mọi hành vi đầu tư và hậu quả phát sinh từ việc sử dụng công cụ này đều do người dùng chịu trách nhiệm. Thị trường đầy rủi ro, và đầu tư cần thận trọng.', - -'user.login.tab-login-web3': 'Đăng nhập Web3', - -'user.login.web3.tip': 'Đăng nhập bằng ví để xác thực chữ ký', - -'user.login.web3.connect': 'Kết nối ví và đăng nhập', - -'user.login.web3.no-wallet': 'Không phát hiện ví', - -'user.login.web3.no-address': 'Không lấy được địa chỉ ví', - -'user.login.web3.nonce-failed': 'Không thể lấy số ngẫu nhiên', - -'user.login.web3.verify-failed': 'Xác thực chữ ký thất bại', - -'user.login.web3.success': 'Đăng nhập thành công', - -'user.login.web3.failed': 'Đăng nhập ví thất bại', - -'nav.no_wallet': 'Ví không được tìm thấy đã phát hiện', - -'nav.copy': 'Sao chép', - -'nav.copy_success': 'Sao chép thành công', - -'user.login.oauth.google': 'Đăng nhập bằng Google', - -'user.login.oauth.github': 'Đăng nhập bằng GitHub', - -'user.login.oauth.loading': 'Đang chuyển hướng đến trang xác thực...', - -'user.login.oauth.failed': 'Đăng nhập OAuth thất bại', - -'user.login.oauth.get-url-failed': 'Không thể lấy liên kết xác thực', - -'user.login.subtitle': 'Thông tin chi tiết định lượng về thị trường toàn cầu', - -'user.login.legal.title': 'Tuyên bố pháp lý', - -'user.login.legal.view': 'Xem tuyên bố pháp lý', - -'user.login.legal.collapse': 'Thu gọn Tuyên bố pháp lý', - -'user.login.legal.agree': 'Tôi đã đọc và đồng ý với tuyên bố pháp lý', - -'user.login.legal.required': 'Vui lòng đọc và kiểm tra tuyên bố pháp lý trước', - -'user.login.legal.content': 'QuantDinger là công cụ phân tích cổ phiếu đa tác nhân AI và không có bằng cấp tư vấn đầu tư chứng khoán. Tất cả kết quả phân tích, xếp hạng và ý kiến ​​tham khảo trên nền tảng đều được AI tự động tạo ra dựa trên dữ liệu lịch sử và chỉ dành cho mục đích học tập, nghiên cứu và trao đổi kỹ thuật, và không cấu thành bất kỳ lời khuyên đầu tư hoặc cơ sở ra quyết định nào. Đầu tư cổ phiếu tiềm ẩn nhiều rủi ro như rủi ro thị trường, rủi ro thanh khoản và rủi ro chính sách, có thể dẫn đến mất vốn gốc. Người dùng nên đưa ra quyết định độc lập dựa trên khả năng chấp nhận rủi ro của mình, và mọi hành vi đầu tư và hậu quả phát sinh từ việc sử dụng công cụ này sẽ do người dùng chịu trách nhiệm. Thị trường đầy rủi ro, và đầu tư cần thận trọng.', - -'user.login.privacy.title': 'Điều khoản Quyền riêng tư Người dùng', - -'user.login.privacy.view': 'Xem Điều khoản Quyền riêng tư Người dùng', - -'user.login.privacy.collapse': 'Thu gọn Điều khoản Quyền riêng tư Người dùng', - -'user.login.privacy.content': 'Chúng tôi coi trọng quyền riêng tư và việc bảo vệ dữ liệu của bạn. 1) Phạm vi Thu thập: Chúng tôi chỉ thu thập thông tin cần thiết để thực hiện các chức năng (chẳng hạn như email, số điện thoại di động, mã vùng, địa chỉ ví Web3) và nhật ký cần thiết cũng như thông tin thiết bị. 2) Mục đích Sử dụng: Để đăng nhập tài khoản và xác minh bảo mật, cung cấp chức năng dịch vụ, khắc phục sự cố và tuân thủ các yêu cầu. 3) Lưu trữ và Bảo mật: Dữ liệu được lưu trữ mã hóa và các biện pháp kiểm soát quyền và truy cập cần thiết được thực hiện để ngăn chặn truy cập trái phép, tiết lộ hoặc mất mát. 4) Chia sẻ và Bên thứ ba: Ngoại trừ trường hợp được yêu cầu bởi luật và quy định hoặc cần thiết để thực hiện dịch vụ, chúng tôi sẽ không chia sẻ thông tin cá nhân của bạn với bên thứ ba; Nếu có sự tham gia của các dịch vụ bên thứ ba (chẳng hạn như ví điện tử, nhà cung cấp dịch vụ SMS), dữ liệu sẽ chỉ được xử lý ở mức tối thiểu cần thiết để thực hiện các chức năng. 5) Cookie/Bộ nhớ cục bộ: Được sử dụng để xác thực trạng thái đăng nhập và duy trì phiên làm việc cần thiết (chẳng hạn như mã thông báo, PHPSESSID). Bạn có thể xóa hoặc hạn chế chúng trong trình duyệt của mình. 6) Quyền cá nhân: Bạn có thể thực hiện các quyền của mình để yêu cầu, sửa đổi, xóa và rút lại sự đồng ý theo luật và quy định hiện hành. 7) Thay đổi và Thông báo: Các bản cập nhật cho các điều khoản này sẽ được hiển thị rõ ràng trên trang. Việc tiếp tục sử dụng dịch vụ này cho thấy bạn đã đọc và đồng ý với nội dung được cập nhật. Nếu bạn không đồng ý với các điều khoản này hoặc bất kỳ bản cập nhật nào trong đó, vui lòng ngừng sử dụng dịch vụ này và liên hệ với chúng tôi. ', - -'account.basicInfo': 'Thông tin cơ bản', - -'account.id': 'ID người dùng', - -'account.username': 'Tên người dùng', - -'account.nickname': 'Biệt danh', - -'account.email': 'Email', - -'account.mobile': 'Số điện thoại', - -'account.web3address': 'Địa chỉ ví', - -'account.pid': 'ID người giới thiệu', - -'account.level': 'Cấp độ người dùng', - -'account.money': 'Số dư', - -'account.qdtBalance': 'Số dư QDT', - -'account.score': 'Điểm', - -'account.createtime': 'Thời gian đăng ký', - -'account.inviteLink': 'Liên kết mời', - -'account.recharge': 'Nạp tiền', - -'account.rechargeTip': 'Mã QR bên dưới để nạp tiền bằng WeChat hoặc Alipay', - -'account.qrCodePlaceholder': 'Mã QR giả lập', - -'account.rechargeAmount': 'Số tiền cần nạp', - -'account.enterAmount': 'Vui lòng nhập số tiền cần nạp', - -'account.rechargeHint': 'Số tiền nạp tối thiểu: 1 QDT', - -'account.confirmRecharge': 'Xác nhận nạp tiền', - -'account.enterValidAmount': 'Vui lòng nhập số tiền hợp lệ', - -'account.rechargeSuccess': 'Nạp tiền thành công! Số tiền {amount} QDT đã được nạp', - -'account.settings.menuMap.basic': 'Cài đặt cơ bản', - -'account.settings.menuMap.security': 'Cài đặt bảo mật', - -'account.settings.menuMap.notification': 'Thông báo tin nhắn mới', - -'account.settings.menuMap.moneyLog': 'Chi tiết quỹ', - -'account.moneyLog.empty': 'Không có chi tiết quỹ', - -'account.moneyLog.total': 'Tổng số {total} giao dịch', - -'account.moneyLog.type.purchase': 'Hạn mức mua hàng', - -'account.moneyLog.type.recharge': 'Nạp tiền', - -'account.moneyLog.type.refund': 'Hoàn tiền', - -'account.moneyLog.type.reward': 'Thưởng', - -'account.moneyLog.type.income': 'Thu nhập Các chỉ báo', - -'account.moneyLog.type.commission': 'Phí nền tảng', - -'wallet.balance': 'Số dư QDT', - -'wallet.recharge': 'Nạp tiền', - -'wallet.withdraw': 'Rút tiền', - -'wallet.filter': 'Lọc', - -'wallet.reset': 'Đặt lại', - -'wallet.totalRecharge': 'Tổng số tiền nạp', - -'wallet.totalWithdraw': 'Tổng số tiền rút', - -'wallet.totalIncome': 'Tổng số tiền thu nhập', - -'wallet.records': 'Lịch sử giao dịch và chi tiết quỹ', - -'wallet.tradingRecords': 'Lịch sử giao dịch', - -'wallet.moneyLog': 'Chi tiết quỹ', - -'wallet.rechargeTip': 'Vui lòng quét mã QR bên dưới bằng WeChat hoặc Alipay để nạp tiền', - -'wallet.qrCodePlaceholder': 'Mã QR (mô phỏng)', - -'wallet.rechargeAmount': 'Số tiền cần nạp', - -'wallet.enterAmount': 'Vui lòng nhập số tiền cần nạp', - -'wallet.rechargeHint': 'Số tiền nạp tối thiểu: 1 QDT', - -'wallet.confirmRecharge': 'Xác nhận nạp tiền', - -'wallet.enterValidAmount': 'Vui lòng nhập số tiền hợp lệ', - -'wallet.rechargeSuccess': 'Nạp tiền thành công! Đã thanh toán {amount} QDT', - -'wallet.rechargeFailed': 'Giao dịch thất bại', - -'wallet.withdrawTip': 'Vui lòng nhập số tiền rút và địa chỉ rút tiền', - -'wallet.withdrawAmount': 'Số tiền rút', - -'wallet.enterWithdrawAmount': 'Vui lòng nhập số tiền rút', - -'wallet.withdrawHint': 'Số tiền rút tối thiểu: 1 QDT', - -'wallet.withdrawAddress': 'Địa chỉ rút tiền (tùy chọn)', - -'wallet.enterWithdrawAddress': 'Vui lòng nhập địa chỉ rút tiền', - -'wallet.confirmWithdraw': 'Xác nhận rút tiền', - -'wallet.enterValidWithdrawAmount': 'Vui lòng nhập số tiền rút hợp lệ', - -'wallet.insufficientBalance': 'Số dư không đủ', - -'wallet.withdrawSuccess': 'Rút tiền thành công! Số tiền {amount} QDT đã rút', - -'wallet.withdrawFailed': 'Giao dịch rút tiền thất bại', - -'wallet.noTradingRecords': 'Không có bản ghi giao dịch nào', - -'wallet.noMoneyLog': 'Không có chi tiết giao dịch', - -'wallet.loadTradingRecordsFailed': 'Không thể tải bản ghi giao dịch', - -'wallet.loadMoneyLogFailed': 'Không thể tải chi tiết giao dịch', - -'wallet.moneyLogTotal': 'Tổng số {total} bản ghi', - -'wallet.moneyLogTypeTitle': 'Loại', - -'wallet.moneyLogType.all': 'Tất cả các loại', - -'wallet.table.time': 'Thời gian', - -'wallet.table.type': 'Loại', - -'wallet.table.price': 'Giá', - -'wallet.table.amount': 'Số lượng', - -'wallet.table.money': 'Số tiền', - -'wallet.table.balance': 'Số dư', - -'wallet.table.memo': 'Ghi chú', - -'wallet.table.value': 'Giá trị', - -'wallet.table.profit': 'Lợi nhuận/Thua lỗ', - -'wallet.table.commission': 'Hoa hồng', - -'wallet.table.total': 'Tổng số {total} bản ghi', - -'wallet.tradeType.buy': 'Mua', - -'wallet.tradeType.sell': 'Bán', - -'wallet.tradeType.liquidation': 'Thanh lý', - -'wallet.tradeType.openLong': 'Mở lệnh mua', - -'wallet.tradeType.addLong': 'Thêm lệnh mua', - -'wallet.tradeType.closeLong': 'Đóng lệnh mua', - -'wallet.tradeType.closeLongStop': 'Đóng lệnh mua và cắt lỗ', - -'wallet.tradeType.closeLongProfit': 'Chốt lời và đóng lệnh mua', -'wallet.tradeType.openShort': 'Mở vị thế bán khống', - -'wallet.tradeType.addShort': 'Thêm vị thế bán khống', - -'wallet.tradeType.closeShort': 'Đóng vị thế bán khống', - -'wallet.tradeType.closeShortStop': 'Đóng vị thế bán khống với lệnh dừng lỗ', - -'wallet.tradeType.closeShortProfit': 'Chốt lời và đóng vị thế bán khống', - -'wallet.moneyLogType.purchase': 'Chỉ báo mua', - -'wallet.moneyLogType.recharge': 'Nạp tiền', - -'wallet.moneyLogType.withdraw': 'Rút tiền mặt', - -'wallet.moneyLogType.refund': 'Hoàn tiền', - -'wallet.moneyLogType.reward': 'Thưởng', - -'wallet.moneyLogType.income': 'Thu nhập', - -'wallet.moneyLogType.commission': 'Phí giao dịch', - -'wallet.web3Address.required': 'Vui lòng nhập địa chỉ ví Web3 của bạn trước', - -'wallet.web3Address.requiredDescription': 'Bạn cần liên kết địa chỉ ví Web3 của mình trước khi gửi tiền để nhận tiền gửi', - -'wallet.web3Address.placeholder': 'Vui lòng nhập địa chỉ ví Web3 của bạn (bắt đầu bằng 0x)', - -'wallet.web3Address.save': 'Lưu địa chỉ ví', - -'wallet.web3Address.saveSuccess': 'Địa chỉ ví đã được lưu thành công', - -'wallet.web3Address.saveFailed': 'Không thể lưu địa chỉ ví', - -'wallet.web3Address.invalidFormat': 'Vui lòng nhập địa chỉ ví Web3 hợp lệ (định dạng Ethereum: 42 ký tự bắt đầu bằng 0x, hoặc TRC20) Định dạng: 34 ký tự bắt đầu bằng T)', - -'wallet.selectCoin': 'Chọn loại tiền điện tử', - -'wallet.selectChain': 'Chọn chuỗi khối', - -'wallet.chain.eth': 'ETH (ERC20)', - -'wallet.chain.trc20': 'TRC20', - -'wallet.chain.bsc': 'BSC', - -'wallet.targetQdtAmount': 'Số lượng QDT bạn muốn đổi (tùy chọn)', - -'wallet.targetQdtAmount.placeholder': 'Vui lòng nhập số lượng QDT bạn muốn đổi, giá QDT hiện tại: {price} USDT', - -'wallet.targetQdtAmount.requiredUsdt': 'Số tiền cần nạp: {amount} USDT', - -'wallet.rechargeAddress': 'Địa chỉ nạp tiền', - -'wallet.copyAddress': 'Sao chép', - -'wallet.copySuccess': 'Sao chép thành công!', - -'wallet.copyFailed': 'Sao chép thất bại, vui lòng sao chép thủ công', - -'wallet.rechargeAddressHint': 'Vui lòng đảm bảo bạn sử dụng chuỗi {chain} để gửi {coin} vào địa chỉ này', - -'wallet.qdtPrice.loading': 'Đang tải...', - -'wallet.rechargeTip.new': 'Vui lòng chọn loại tiền tệ và chuỗi, sau đó quét mã QR bên dưới để gửi tiền', - -'wallet.exchangeRate': '1 QDT ≈ {rate} USDT', - -'wallet.withdrawableAmount': 'Số tiền có thể rút', - -'wallet.totalBalance': 'Tổng số dư', - -'wallet.insufficientWithdrawable': 'Số tiền có thể rút không đủ, hiện tại chỉ có thể rút: {amount} QDT', - -'wallet.withdrawAddressRequired': 'Vui lòng nhập địa chỉ rút tiền địa chỉ', -'wallet.withdrawAddressHint': 'Vui lòng đảm bảo địa chỉ chính xác; không thể hủy bỏ giao dịch rút tiền sau khi đã gửi', - -'wallet.withdrawSubmitSuccess': 'Yêu cầu rút tiền đã được gửi thành công; Vui lòng chờ xem xét', - -'menu.footer.contactUs': 'Liên hệ với chúng tôi', - -'menu.footer.getSupport': 'Nhận hỗ trợ', - -'menu.footer.socialAccounts': 'Tài khoản mạng xã hội', - -'menu.footer.userAgreement': 'Thỏa thuận người dùng', - -'menu.footer.privacyPolicy': 'Chính sách bảo mật', - -'menu.footer.support': 'Hỗ trợ', - -'menu.footer.featureRequest': 'Yêu cầu tính năng', - -'menu.footer.email': 'Email', - -'menu.footer.liveChat': 'Trò chuyện trực tuyến 24/7', - -'dashboard.analysis.title': 'Phân tích đa chiều', - -'dashboard.analysis.subtitle': 'Phân tích tài chính toàn diện dựa trên AI Nền tảng', - -'dashboard.analysis.selectSymbol': 'Chọn hoặc nhập mã chứng khoán', - -'dashboard.analysis.selectModel': 'Chọn mô hình', - -'dashboard.analysis.startAnalysis': 'Bắt ​​đầu phân tích', - -'dashboard.analysis.history': 'Lịch sử', - -'dashboard.analysis.tab.overview': 'Phân tích toàn diện', - -'dashboard.analysis.tab.fundamental': 'Các yếu tố cơ bản', - -'dashboard.analysis.tab.technical': 'Phân tích kỹ thuật', - -'dashboard.analysis.tab.news': 'Tin tức', - -'dashboard.analysis.tab.sentiment': 'Tâm lý thị trường', - -'dashboard.analysis.tab.risk': 'Rủi ro', - -'dashboard.analysis.tab.debate': 'Tăng/Giảm giá', -'dashboard.analysis.tab.decision': 'Quyết định cuối cùng', - -'dashboard.analysis.empty.selectSymbol': 'Chọn mục tiêu để bắt đầu phân tích', - -'dashboard.analysis.empty.selectSymbolDesc': 'Chọn mục tiêu từ danh sách theo dõi của bạn hoặc nhập mã của nó để nhận báo cáo phân tích AI đa chiều', - -'dashboard.analysis.empty.startAnalysis': 'Nhấp vào nút "Bắt đầu phân tích" để phân tích đa chiều', - -'dashboard.analysis.empty.startAnalysisDesc': 'Chúng tôi sẽ cung cấp cho bạn phân tích toàn diện từ nhiều khía cạnh bao gồm cơ bản, kỹ thuật, tin tức, tâm lý và rủi ro', - -'dashboard.analysis.empty.noData': 'Không có dữ liệu phân tích cho {type}, vui lòng thực hiện phân tích toàn diện trước', - -'dashboard.analysis.empty.noWatchlist': 'Không có danh sách theo dõi có sẵn', - -'dashboard.analysis.empty.noHistory': 'Không có dữ liệu lịch sử', - -'dashboard.analysis.empty.watchlistHint': 'Không có danh sách theo dõi, vui lòng thực hiện phân tích toàn diện trước', - -'dashboard.analysis.empty.noDebateData': 'Không có dữ liệu tranh luận', - -'dashboard.analysis.empty.noDecisionData': 'Không có dữ liệu quyết định', - -'dashboard.analysis.empty.selectAgent': 'Vui lòng chọn một Đại lý để xem kết quả phân tích', - -'dashboard.analysis.loading.analyzing': 'Đang phân tích, vui lòng chờ...', - -'dashboard.analysis.loading.fundamental': 'Đang phân tích dữ liệu cơ bản...', - -'dashboard.analysis.loading.technical': 'Đang phân tích các chỉ báo kỹ thuật...', - -'dashboard.analysis.loading.news': 'Đang phân tích dữ liệu tin tức...', - -'dashboard.analysis.loading.sentiment': 'Phân tích tâm lý thị trường...', - -'dashboard.analysis.loading.risk': 'Đánh giá rủi ro...', - -'dashboard.analysis.loading.debate': 'Cuộc tranh luận đang diễn ra giữa phe tăng giá và phe giảm giá...', - -'dashboard.analysis.loading.decision': 'Đưa ra quyết định cuối cùng...', - -'dashboard.analysis.score.overall': 'Điểm tổng thể', - -'dashboard.analysis.score.recommendation': 'Lời khuyên đầu tư', - -'dashboard.analysis.score.confidence': 'Mức độ tin cậy', - -'dashboard.analysis.dimension.fundamental': 'các yếu tố cơ bản', - -'dashboard.analysis.dimension.technical': 'các yếu tố kỹ thuật', - -'dashboard.analysis.dimension.news': 'tin tức', - -'dashboard.analysis.dimension.sentiment': 'tâm lý', - -'dashboard.analysis.dimension.risk': 'rủi ro', - -'dashboard.analysis.card.dimensionScores': 'điểm số cho từng yếu tố', - -'dashboard.analysis.card.overviewReport': 'báo cáo tổng quan', - -'dashboard.analysis.card.financialMetrics': 'các chỉ số tài chính', - -'dashboard.analysis.card.fundamentalReport': 'báo cáo phân tích cơ bản', - -'dashboard.analysis.card.technicalIndicators': 'Các chỉ số kỹ thuật Các chỉ báo', - -'dashboard.analysis.card.technicalReport': 'Báo cáo phân tích kỹ thuật', - -'dashboard.analysis.card.newsList': 'Tin tức liên quan', - -'dashboard.analysis.card.newsReport': 'Báo cáo phân tích tin tức', - -'dashboard.analysis.card.sentimentIndicators': 'Các chỉ báo tâm lý', - -'dashboard.analysis.card.sentimentReport': 'Báo cáo phân tích tâm lý', - -'dashboard.analysis.card.riskMetrics': 'Các chỉ báo rủi ro', - -'dashboard.analysis.card.riskReport': 'Báo cáo đánh giá rủi ro', - -'dashboard.analysis.card.bullView': 'Quan điểm lạc quan', - -'dashboard.analysis.card.bearView': 'Quan điểm bi quan', - -'dashboard.analysis.card.researchConclusion': 'Kết luận của nhà nghiên cứu', - -'dashboard.analysis.card.traderPlan': 'Kế hoạch giao dịch', - -'dashboard.analysis.card.riskDebate': 'Thảo luận của Ủy ban Rủi ro', - -'dashboard.analysis.card.finalDecision': 'Quyết định cuối cùng', - -'dashboard.analysis.card.tradePlanDetail': 'Chi tiết kế hoạch giao dịch', - -'dashboard.analysis.tradingPlan.entry_price': 'Giá vào lệnh', - -'dashboard.analysis.tradingPlan.position_size': 'Quy mô vị thế', - -'dashboard.analysis.tradingPlan.stop_loss': 'Cắt lỗ', - -'dashboard.analysis.tradingPlan.take_profit': 'Chốt lời', - -'dashboard.analysis.label.confidence': 'Mức độ tự tin Mức độ', - -'dashboard.analysis.label.keyPoints': 'Điểm chính', - -'dashboard.analysis.label.riskWarning': 'Cảnh báo rủi ro', - -'dashboard.analysis.risk.risky': 'Quan điểm rủi ro', - -'dashboard.analysis.risk.neutral': 'Quan điểm trung lập', - -'dashboard.analysis.risk.safe': 'Quan điểm an toàn', - -'dashboard.analysis.risk.conclusion': 'Kết luận', - -'dashboard.analysis.feature.fundamental': 'Phân tích cơ bản', - -'dashboard.analysis.feature.technical': 'Phân tích kỹ thuật', - -'dashboard.analysis.feature.news': 'Phân tích tin tức', - -'dashboard.analysis.feature.sentiment': 'Phân tích cảm xúc', - -'dashboard.analysis.feature.risk': 'Rủi ro Đánh giá', - -'dashboard.analysis.watchlist.title': 'Danh sách theo dõi của tôi', - -'dashboard.analysis.watchlist.add': 'Thêm', - -'dashboard.analysis.watchlist.addStock': 'Thêm cổ phiếu', - -'dashboard.analysis.modal.addStock.title': 'Thêm vào danh sách theo dõi', - -'dashboard.analysis.modal.addStock.confirm': 'Xác nhận', - -'dashboard.analysis.modal.addStock.cancel': 'Hủy', - -'dashboard.analysis.modal.addStock.market': 'Loại thị trường', - -'dashboard.analysis.modal.addStock.marketPlaceholder': 'Vui lòng chọn thị trường', - -'dashboard.analysis.modal.addStock.marketRequired': 'Vui lòng chọn loại thị trường', - -'dashboard.analysis.modal.addStock.symbol': 'Mã chứng khoán', - -'dashboard.analysis.modal.addStock.symbolPlaceholder': 'Ví dụ: AAPL, TSLA, GOOGL, 000001, BTC', - -'dashboard.analysis.modal.addStock.symbolRequired': 'Vui lòng nhập mã chứng khoán', - -'dashboard.analysis.modal.addStock.searchPlaceholder': 'Tìm kiếm mã chứng khoán hoặc tên cổ phiếu', - -'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': 'Tìm kiếm hoặc nhập mã chứng khoán (ví dụ: AAPL, BTC/USDT, EUR/USD)', - -'dashboard.analysis.modal.addStock.searchOrInputHint': 'Hỗ trợ tìm kiếm cổ phiếu trong cơ sở dữ liệu hoặc nhập trực tiếp mã (hệ thống sẽ tự động truy xuất tên)', - -'dashboard.analysis.modal.addStock.search': 'Tìm kiếm', - -'dashboard.analysis.modal.addStock.searchResults': 'Kết quả tìm kiếm', - -'dashboard.analysis.modal.addStock.hotSymbols': 'Cổ phiếu nóng', - -'dashboard.analysis.modal.addStock.noHotSymbols': 'Không có cổ phiếu nóng', - -'dashboard.analysis.modal.addStock.selectedSymbol': 'Cổ phiếu đã chọn', - -'dashboard.analysis.modal.addStock.pleaseSelectSymbol': 'Vui lòng chọn cổ phiếu trước', - -'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': 'Vui lòng chọn cổ phiếu hoặc nhập mã cổ phiếu', - -'dashboard.analysis.modal.addStock.pleaseEnterSymbol': 'Vui lòng nhập mã cổ phiếu', - -'dashboard.analysis.modal.addStock.pleaseSelectMarket': 'Vui lòng chọn loại thị trường', - -'dashboard.analysis.modal.addStock.searchFailed': 'Tìm kiếm thất bại, vui lòng thử lại sau', - -'dashboard.analysis.modal.addStock.noSearchResults': 'Không tìm thấy cổ phiếu phù hợp', - -'dashboard.analysis.modal.addStock.willAutoFetchName': 'Hệ thống sẽ tự động lấy tên', - -'dashboard.analysis.modal.addStock.addDirectly': 'Thêm trực tiếp', - -'dashboard.analysis.modal.addStock.nameWillBeFetched': 'Tên sẽ được tự động lấy khi thêm', - -'dashboard.analysis.market.AShare': 'Cổ phiếu loại A', - -'dashboard.analysis.market.USStock': 'Cổ phiếu Mỹ', - -'dashboard.analysis.market.HShare': 'Cổ phiếu Hồng Kông cổ phiếu', - -'dashboard.analysis.market.Crypto': 'Tiền điện tử', - -'dashboard.analysis.market.Forex': 'Ngoại hối', - -'dashboard.analysis.market.Futures': 'Hợp đồng tương lai', - -'dashboard.analysis.modal.history.title': 'Lịch sử phân tích', - -'dashboard.analysis.modal.history.viewResult': 'Xem kết quả', - -'dashboard.analysis.modal.history.completeTime': 'Thời gian hoàn thành', - -'dashboard.analysis.modal.history.error': 'Lỗi', - -'dashboard.analysis.status.pending': 'Đang chờ xử lý', - -'dashboard.analysis.status.processing': 'Đang xử lý', - -'dashboard.analysis.status.completed': 'Hoàn thành', - -'dashboard.analysis.status.failed': 'Thất bại', - -'dashboard.analysis.message.selectSymbol': 'Vui lòng chọn mục tiêu trước', - -'dashboard.analysis.message.taskCreated': 'Tác vụ phân tích đã được tạo, đang thực thi trong nền...', - -'dashboard.analysis.message.analysisComplete': 'Phân tích đã hoàn tất', - -'dashboard.analysis.message.analysisCompleteCache': 'Phân tích đã hoàn tất (sử dụng dữ liệu được lưu trong bộ nhớ cache)', - -'dashboard.analysis.message.analysisFailed': 'Phân tích thất bại, vui lòng thử lại sau', - -'dashboard.analysis.message.addStockSuccess': 'Đã thêm thành công', - -'dashboard.analysis.message.addStockFailed': 'Thêm thất bại', - -'dashboard.analysis.message.removeStockSuccess': 'Đã xóa thành công', - -'dashboard.analysis.message.removeStockFailed': 'Xóa thất bại', - -'dashboard.analysis.message.resumingAnalysis': 'Đang tiếp tục tác vụ phân tích...', - -'dashboard.analysis.message.deleteSuccess': 'Đã xóa thành công', - -'dashboard.analysis.message.deleteFailed': 'Xóa thất bại', - -'dashboard.analysis.modal.history.delete': 'Xóa', - -'dashboard.analysis.modal.history.deleteConfirm': 'Bạn có chắc chắn muốn xóa bản ghi phân tích này không?', - -'dashboard.analysis.test': 'Cửa hàng đường Gongzhuan {không}', - -'dashboard.analysis.introduce': 'Mô tả chỉ báo', - -'dashboard.analysis.total-sales': 'Tổng doanh thu', - -'dashboard.analysis.day-sales': 'Doanh thu trung bình hàng ngày', - -'dashboard.analysis.visits': 'Lượt truy cập', - -'dashboard.analysis.visits-trend': 'Lượt truy cập xu hướng', - -'dashboard.analysis.visits-ranking': 'Xếp hạng lượt truy cập cửa hàng', - -'dashboard.analysis.day-visits': 'Lượt truy cập hàng ngày', - -'dashboard.analysis.week': 'Lượt truy cập hàng tuần so với cùng kỳ năm trước', - -'dashboard.analysis.day': 'Lượt truy cập hàng ngày so với cùng kỳ năm trước', - -'dashboard.analysis.payments': 'Số lượng thanh toán', - -'dashboard.analysis.conversion-rate': 'Tỷ lệ chuyển đổi', - -'dashboard.analysis.operational-effect': 'Hiệu quả hoạt động', - -'dashboard.analysis.sales-trend': 'Xu hướng doanh số', - -'dashboard.analysis.sales-ranking': 'Xếp hạng doanh số cửa hàng', - -'dashboard.analysis.all-year': 'Quanh năm', - -'dashboard.analysis.all-month': 'Tháng này', - -'dashboard.analysis.all-week': 'Tuần này', - -'dashboard.analysis.all-day': 'Hôm nay', - -'dashboard.analysis.search-users': 'Số lượng người dùng tìm kiếm', - -'dashboard.analysis.per-capita-search': 'Số lượt tìm kiếm trung bình trên đầu người', - -'dashboard.analysis.online-top-search': 'Các từ khóa tìm kiếm trực tuyến phổ biến', - -'dashboard.analysis.the-proportion-of-sales': 'Doanh số theo danh mục', - -'dashboard.analysis.dropdown-option-one': 'Phương án một', - -'dashboard.analysis.dropdown-option-two': 'Phương án hai', - -'dashboard.analysis.channel.all': 'Tất cả Kênh', - -'dashboard.analysis.channel.online': 'Trực tuyến', - -'dashboard.analysis.channel.stores': 'Cửa hàng', - -'dashboard.analysis.sales': 'Doanh thu bán hàng', - -'dashboard.analysis.traffic': 'Lưu lượng truy cập', - -'dashboard.analysis.table.rank': 'Xếp hạng', - -'dashboard.analysis.table.search-keyword': 'Từ khóa tìm kiếm', - -'dashboard.analysis.table.users': 'Số lượng người dùng', - -'dashboard.analysis.table.weekly-range': 'Tăng trưởng hàng tuần', - -'dashboard.indicator.selectSymbol': 'Chọn hoặc nhập mã cổ phiếu', - -'dashboard.indicator.emptyWatchlistHint': 'Hiện không có cổ phiếu nào trong danh sách theo dõi, vui lòng thêm vào, Đầu tiên', - -'dashboard.indicator.hint.selectSymbol': 'Vui lòng chọn cổ phiếu để bắt đầu phân tích', - -'dashboard.indicator.hint.selectSymbolDesc': 'Chọn hoặc nhập mã cổ phiếu vào ô tìm kiếm phía trên để xem biểu đồ nến và các chỉ báo kỹ thuật', - -'dashboard.indicator.retry': 'Thử lại', - -'dashboard.indicator.panel.title': 'Các chỉ báo kỹ thuật', - -'dashboard.indicator.panel.realtimeOn': 'Tắt cập nhật thời gian thực', - -'dashboard.indicator.panel.realtimeOff': 'Bật cập nhật thời gian thực', - -'dashboard.indicator.panel.themeLight': 'Chuyển sang chủ đề tối', - -'dashboard.indicator.panel.themeDark': 'Chuyển sang chủ đề sáng theme', - -'dashboard.indicator.section.enabled': 'Đã bật', - -'dashboard.indicator.section.added': 'Các chỉ báo tôi đã thêm', - -'dashboard.indicator.section.custom': 'Chỉ báo do tôi tự tạo', - -'dashboard.indicator.section.bought': 'Các chỉ báo tôi đã mua', - -'dashboard.indicator.section.myCreated': 'Các chỉ báo tôi đã tạo', - -'dashboard.indicator.empty': 'Chưa có chỉ báo nào, vui lòng thêm hoặc tạo chỉ báo trước', - -'dashboard.indicator.buy': 'Mua chỉ báo', - -'dashboard.indicator.action.start': 'Bắt ​​đầu', - -'dashboard.indicator.action.stop': 'Dừng', - -'dashboard.indicator.action.edit': 'Chỉnh sửa', - -'dashboard.indicator.action.delete': 'Xóa', - -'dashboard.indicator.action.backtest': 'Kiểm tra lại', - -'dashboard.indicator.status.normal': 'Bình thường', - -'dashboard.indicator.status.normalPermanent': 'Bình thường (Có hiệu lực vĩnh viễn)', - -'dashboard.indicator.status.expired': 'Đã hết hạn', - -'dashboard.indicator.expiry.permanent': 'Có hiệu lực vĩnh viễn', - -'dashboard.indicator.expiry.noExpiry': 'Không có ngày hết hạn', - -'dashboard.indicator.expiry.expired': 'Đã hết hạn: {date}', - -'dashboard.indicator.expiry.expiresOn': 'Ngày hết hạn: {date}', - -'dashboard.indicator.delete.confirmTitle': 'Xác nhận xóa', - -'dashboard.indicator.delete.confirmContent': 'Bạn có chắc chắn muốn xóa chỉ báo "{name}" không? Thao tác này không thể đảo ngược.', - -'dashboard.indicator.delete.confirmOk': 'Xóa', - -'dashboard.indicator.delete.confirmCancel': 'Hủy', - -'dashboard.indicator.delete.success': 'Xóa thành công', - -'dashboard.indicator.delete.failed': 'Xóa thất bại', - -'dashboard.indicator.save.success': 'Lưu thành công', - -'dashboard.indicator.save.failed': 'Lưu thất bại', - -'dashboard.indicator.error.loadWatchlistFailed': 'Không thể tải danh sách theo dõi', - -'dashboard.indicator.error.chartNotReady': 'Thành phần biểu đồ chưa được khởi tạo, vui lòng chọn mục tiêu và đợi biểu đồ tải xong , load', -'dashboard.indicator.error.chartMethodNotReady': 'Phương thức của thành phần biểu đồ chưa sẵn sàng, vui lòng thử lại sau', - -'dashboard.indicator.error.chartExecuteNotReady': 'Phương thức thực thi của thành phần biểu đồ chưa sẵn sàng, vui lòng thử lại sau', - -'dashboard.indicator.error.parseFailed': 'Không thể phân tích cú pháp mã Python', - -'dashboard.indicator.error.parseFailedCheck': 'Không thể phân tích cú pháp mã Python, vui lòng kiểm tra định dạng mã', - -'dashboard.indicator.error.addIndicatorFailed': 'Không thể thêm chỉ báo', - -'dashboard.indicator.error.runIndicatorFailed': 'Không thể chạy chỉ báo', - -'dashboard.indicator.error.pleaseLogin': 'Vui lòng đăng nhập trước', - -'dashboard.indicator.error.loadDataFailed': 'Tải dữ liệu thất bại', - -'dashboard.indicator.error.loadDataFailedDesc': 'Vui lòng kiểm tra kết nối mạng của bạn', - -'dashboard.indicator.error.pythonEngineFailed': 'Không thể tải công cụ Python; chức năng chỉ báo có thể không khả dụng', - -'dashboard.indicator.error.chartInitFailed': 'Khởi tạo biểu đồ thất bại', - -'dashboard.indicator.warning.enterCode': 'Vui lòng nhập mã chỉ báo trước', - -'dashboard.indicator.warning.pyodideLoadFailed': 'Không thể tải công cụ Python', - -'dashboard.indicator.warning.pyodideLoadFailedDesc': 'Tính năng này không khả dụng trong khu vực hoặc môi trường mạng hiện tại của bạn', - -'dashboard.indicator.warning.chartNotInitialized': 'Biểu đồ chưa được khởi tạo; Công cụ vẽ không khả dụng', - -'dashboard.indicator.success.runIndicator': 'Chỉ báo đã chạy thành công', - -'dashboard.indicator.success.clearDrawings': 'Đã xóa tất cả các đường', - -'dashboard.indicator.sma': 'SMA (Trung bình động ngắn hạn)', - -'dashboard.indicator.ema': 'EMA (Trung bình động hàm mũ)', - -'dashboard.indicator.rsi': 'RSI (Chỉ số sức mạnh tương đối)', - -'dashboard.indicator.macd': 'MACD', - -'dashboard.indicator.bb': 'Dải Bollinger (...Dải Bollinger)', - -'dashboard.indicator.atr': 'ATR (Chỉ số phạm vi trung bình thực)', - -'dashboard.indicator.cci': 'CCI (Chỉ số kênh hàng hóa)', - -'dashboard.indicator.williams': 'Williams %R (Chỉ số Williams %R)', - -'dashboard.indicator.mfi': 'MFI (Chỉ số dòng tiền)', - -'dashboard.indicator.adx': 'ADX (Chỉ số hướng trung bình)', - -'dashboard.indicator.obv': 'OBV (Chỉ số khối lượng cân bằng)', - -'dashboard.indicator.adosc': 'ADOSC (Chỉ báo dao động tích lũy/phân phối)', - -'dashboard.indicator.ad': 'AD (Chỉ báo đường tích lũy/phân phối)', - -'dashboard.indicator.kdj': 'KDJ (Chỉ báo ngẫu nhiên)', -'dashboard.indicator.signal.buy': 'MUA', - -'dashboard.indicator.signal.sell': 'BÁN', - -'dashboard.indicator.signal.supertrendBuy': 'Mua theo xu hướng siêu mạnh', - -'dashboard.indicator.signal.supertrendSell': 'Bán theo xu hướng siêu mạnh', - -'dashboard.indicator.chart.kline': 'Đường K', - -'dashboard.indicator.chart.volume': 'Khối lượng', - -'dashboard.indicator.chart.uptrend': 'Xu hướng tăng', - -'dashboard.indicator.chart.downtrend': 'Xu hướng giảm', - -'dashboard.indicator.tooltip.time': 'Thời gian', -'dashboard.indicator.tooltip.open': 'Mở', - -'dashboard.indicator.tooltip.close': 'Đóng', - -'dashboard.indicator.tooltip.high': 'Cao', - -'dashboard.indicator.tooltip.low': 'Thấp', - -'dashboard.indicator.tooltip.volume': 'Khối lượng', - -'dashboard.indicator.drawing.line': 'Đoạn thẳng', - -'dashboard.indicator.drawing.horizontalLine': 'Đường ngang', - -'dashboard.indicator.drawing.verticalLine': 'Đường thẳng đứng', - -'dashboard.indicator.drawing.ray': 'Tia', - -'dashboard.indicator.drawing.straightLine': 'Đường thẳng', - -'dashboard.indicator.drawing.parallelLine': 'Đường song song', - -'dashboard.indicator.drawing.priceLine': 'Giá', -'dashboard.indicator.drawing.priceChannel': 'kênh giá', - -'dashboard.indicator.drawing.fibonacciLine': 'đường Fibonacci', - -'dashboard.indicator.drawing.clearAll': 'xóa tất cả các đường đã vẽ', - -'dashboard.indicator.market.AShare': 'cổ phiếu A', - -'dashboard.indicator.market.USStock': 'cổ phiếu Mỹ', - -'dashboard.indicator.market.HShare': 'cổ phiếu Hồng Kông', - -'dashboard.indicator.market.Crypto': 'tiền điện tử', - -'dashboard.indicator.market.Forex': 'ngoại hối', - -'dashboard.indicator.market.Futures': 'hợp đồng tương lai', - -'dashboard.indicator.create': 'Tạo Indicator', - -'dashboard.indicator.editor.title': 'Tạo/Chỉnh sửa chỉ báo', - -'dashboard.indicator.editor.name': 'Tên chỉ báo', - -'dashboard.indicator.editor.nameRequired': 'Vui lòng nhập tên chỉ báo', - -'dashboard.indicator.editor.namePlaceholder': 'Vui lòng nhập tên chỉ báo', - -'dashboard.indicator.editor.description': 'Mô tả chỉ báo', - -'dashboard.indicator.editor.descriptionPlaceholder': 'Vui lòng nhập mô tả chỉ báo (tùy chọn)', - -'dashboard.indicator.editor.code': 'Mã Python', - -'dashboard.indicator.editor.codeRequired': 'Vui lòng nhập mã chỉ báo', - -'dashboard.indicator.editor.codePlaceholder': 'Vui lòng nhập mã Python code', - -'dashboard.indicator.editor.run': 'Chạy', - -'dashboard.indicator.editor.runHint': 'Nhấp vào nút chạy để xem trước hiệu ứng của chỉ báo trên biểu đồ nến', - -'dashboard.indicator.editor.guide': 'Hướng dẫn phát triển', - -'dashboard.indicator.editor.guideTitle': 'Hướng dẫn phát triển chỉ báo Python', - -'dashboard.indicator.editor.save': 'Lưu', - -'dashboard.indicator.editor.cancel': 'Hủy', - -'dashboard.indicator.editor.unnamed': 'Chỉ báo chưa được đặt tên', - -'dashboard.indicator.editor.publishToCommunity': 'Chia sẻ lên cộng đồng', - -'dashboard.indicator.editor.publishToCommunityHint': 'Sau khi chia sẻ, người dùng khác có thể xem và sử dụng các chỉ số của bạn, trong cộng đồng', - -'dashboard.indicator.editor.indicatorType': 'Loại chỉ báo', - -'dashboard.indicator.editor.indicatorTypeRequired': 'Vui lòng chọn loại chỉ báo', - -'dashboard.indicator.editor.indicatorTypePlaceholder': 'Vui lòng chọn loại chỉ báo', - -'dashboard.indicator.editor.previewImage': 'Hình ảnh xem trước', - -'dashboard.indicator.editor.uploadImage': 'Tải lên hình ảnh', - -'dashboard.indicator.editor.previewImageHint': 'Kích thước đề xuất: 800x400, kích thước không vượt quá 2MB', - -'dashboard.indicator.editor.pricing': 'Giá (QDT)', - -'dashboard.indicator.editor.pricingType.free': 'Miễn phí', - -'dashboard.indicator.editor.pricingType.permanent': 'Vĩnh viễn', - -'dashboard.indicator.editor.pricingType.monthly': 'Hàng tháng', - -'dashboard.indicator.editor.price': 'Giá', - -'dashboard.indicator.editor.priceRequired': 'Vui lòng nhập giá', - -'dashboard.indicator.editor.pricePlaceholder': 'Vui lòng nhập giá', - -'dashboard.indicator.editor.pricingHint': 'Mặc dù chỉ báo miễn phí có giá 0, nền tảng sẽ thưởng cho bạn dựa trên việc sử dụng chỉ báo và tỷ lệ đánh giá tích cực (QDT)', - -'dashboard.indicator.editor.aiGenerate': 'Tạo thông minh', - -'dashboard.indicator.editor.aiPromptPlaceholder': 'Hãy cho tôi biết ý tưởng của bạn, và Tôi sẽ tạo mã chỉ báo Python cho bạn', - -'dashboard.indicator.editor.aiGenerateBtn': 'Mã được tạo bởi AI', - -'dashboard.indicator.editor.aiPromptRequired': 'Vui lòng nhập ý tưởng của bạn', - -'dashboard.indicator.editor.aiGenerateSuccess': 'Tạo mã thành công', - -'dashboard.indicator.editor.aiGenerateError': 'Tạo mã thất bại, vui lòng thử lại sau', - -'dashboard.indicator.backtest.title': 'Kiểm thử ngược chỉ báo', - -'dashboard.indicator.backtest.config': 'Tham số kiểm thử ngược', - -'dashboard.indicator.backtest.startDate': 'Ngày bắt đầu', - -'dashboard.indicator.backtest.endDate': 'Ngày kết thúc Ngày', - -'dashboard.indicator.backtest.selectStartDate': 'Chọn ngày bắt đầu', - -'dashboard.indicator.backtest.selectEndDate': 'Chọn ngày kết thúc', - -'dashboard.indicator.backtest.startDateRequired': 'Vui lòng chọn ngày bắt đầu', - -'dashboard.indicator.backtest.endDateRequired': 'Vui lòng chọn ngày kết thúc', - -'dashboard.indicator.backtest.initialCapital': 'Vốn ban đầu', - -'dashboard.indicator.backtest.initialCapitalRequired': 'Vui lòng nhập vốn ban đầu', - -'dashboard.indicator.backtest.commission': 'Tỷ lệ hoa hồng', - -'dashboard.indicator.backtest.leverage': 'Tỷ lệ đòn bẩy', - -'dashboard.indicator.backtest.tradeDirection': 'Hướng giao dịch Hướng', - -'dashboard.indicator.backtest.longOnly': 'Mua', - -'dashboard.indicator.backtest.shortOnly': 'Bán', - -'dashboard.indicator.backtest.both': 'Cả hai chiều', -'dashboard.indicator.backtest.run': 'Bắt ​​đầu kiểm thử ngược', - -'dashboard.indicator.backtest.rerun': 'Chạy lại kiểm thử ngược', - -'dashboard.indicator.backtest.close': 'Đóng', - -'dashboard.indicator.backtest.running': 'Đang tiến hành kiểm thử ngược...', - -'dashboard.indicator.backtest.results': 'Kết quả kiểm thử ngược', - -'dashboard.indicator.backtest.totalReturn': 'Tổng lợi nhuận', - -'dashboard.indicator.backtest.annualReturn': 'Lợi nhuận hàng năm', - -'dashboard.indicator.backtest.maxDrawdown': 'Mức giảm tối đa', - -'dashboard.indicator.backtest.sharpeRatio': 'Tỷ lệ Sharpe ratio', - -'dashboard.indicator.backtest.winRate': 'Tỷ lệ thắng', - -'dashboard.indicator.backtest.profitFactor': 'Tỷ lệ lãi/lỗ', - -'dashboard.indicator.backtest.totalTrades': 'Số lượng giao dịch', - -'dashboard.indicator.totalReturn': 'Tổng lợi nhuận', - -'dashboard.indicator.annualReturn': 'Lợi nhuận hàng năm', - -'dashboard.indicator.maxDrawdown': 'Mức giảm tối đa', - -'dashboard.indicator.sharpeRatio': 'Tỷ lệ Sharpe', - -'dashboard.indicator.winRate': 'Tỷ lệ thắng', - -'dashboard.indicator.profitFactor': 'Tỷ lệ lãi/lỗ Tỷ lệ', - -'dashboard.indicator.totalTrades': 'Tổng số giao dịch', - -'dashboard.indicator.backtest.totalCommission': 'Tổng phí hoa hồng', - -'dashboard.indicator.backtest.equityCurve': 'Đường cong vốn chủ sở hữu', - -'dashboard.indicator.backtest.strategy': 'Lợi nhuận của chỉ báo', - -'dashboard.indicator.backtest.benchmark': 'Lợi nhuận chuẩn', - -'dashboard.indicator.backtest.tradeHistory': 'Lịch sử giao dịch', - -'dashboard.indicator.backtest.tradeTime': 'Thời gian', - -'dashboard.indicator.backtest.tradeType': 'Loại giao dịch', - -'dashboard.indicator.backtest.buy': 'Mua', - -'dashboard.indicator.backtest.sell': 'Bán', - -'dashboard.indicator.backtest.liquidation': 'Tài khoản đã bị thanh lý', - -'dashboard.indicator.backtest.openLong': 'Mở lệnh mua', - -'dashboard.indicator.backtest.closeLong': 'Đóng lệnh mua', - -'dashboard.indicator.backtest.closeLongStop': 'Đóng lệnh mua (Cắt lỗ)', - -'dashboard.indicator.backtest.closeLongProfit': 'Đóng lệnh mua (Chốt lời)', - -'dashboard.indicator.backtest.addLong': 'Thêm lệnh mua', - -'dashboard.indicator.backtest.openShort': 'Mở lệnh bán', - -'dashboard.indicator.backtest.closeShort': 'Đóng lệnh bán', - -'dashboard.indicator.backtest.closeShortStop': 'Đóng lệnh bán (Dừng lỗ) Lỗ', - -'dashboard.indicator.backtest.closeShortProfit': 'Đóng vị thế bán khống (chốt lời)', - -'dashboard.indicator.backtest.addShort': 'Thêm vị thế bán khống', - -'dashboard.indicator.backtest.price': 'Giá', - -'dashboard.indicator.backtest.amount': 'Số lượng', - -'dashboard.indicator.backtest.balance': 'Số dư tài khoản', - -'dashboard.indicator.backtest.profit': 'Lãi/Lỗ', - -'dashboard.indicator.backtest.success': 'Kiểm thử ngược thành công', - -'dashboard.indicator.backtest.failed': 'Kiểm thử ngược thất bại, vui lòng thử lại sau', - -'dashboard.indicator.backtest.noIndicatorCode': 'Không có mã nào để kiểm thử ngược này', -'dashboard.indicator.backtest.noSymbol': 'Vui lòng chọn công cụ giao dịch trước', - -'dashboard.indicator.backtest.dateRangeExceeded': 'Thời gian kiểm thử ngược vượt quá giới hạn: chỉ có thể kiểm thử ngược trong khoảng thời gian {timeframe} là {maxRange}', -'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)', -'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)', -'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}', -'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}', -'dashboard.indicator.backtest.prev': 'Previous', -'dashboard.indicator.backtest.next': 'Next', -'dashboard.indicator.backtest.steps.strategy.title': 'Strategy', -'dashboard.indicator.backtest.steps.strategy.desc': 'Position sizing & risk controls', -'dashboard.indicator.backtest.steps.trading.title': 'Trading settings', -'dashboard.indicator.backtest.steps.trading.desc': 'Time range, capital, fees, leverage', -'dashboard.indicator.backtest.steps.results.title': 'Results', -'dashboard.indicator.backtest.steps.results.desc': 'Backtest output', -'dashboard.indicator.backtest.panel.risk': 'Risk management (SL/TP/Trailing)', -'dashboard.indicator.backtest.panel.scale': 'Scale in / DCA (trend & mean-reversion)', -'dashboard.indicator.backtest.panel.reduce': 'Reduce position (trend & adverse)', -'dashboard.indicator.backtest.panel.position': 'Position sizing', -'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)', -'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)', -'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit', -'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)', -'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)', -'dashboard.indicator.backtest.field.slippage': 'Slippage (%)', -'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in', -'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion DCA', -'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)', -'dashboard.indicator.backtest.field.dcaAddStepPct': 'DCA trigger (%)', -'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)', -'dashboard.indicator.backtest.field.dcaAddSizePct': 'DCA size (% of capital)', -'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times', -'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max DCA times', -'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce', -'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce', -'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)', -'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)', -'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)', -'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)', -'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times', -'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times', -'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)', -'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)', -'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)', -'dashboard.indicator.backtest.reduceLong': 'Reduce Long', -'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)', -'dashboard.indicator.backtest.reduceShort': 'Reduce Short', - -'dashboard.docs.title': 'Trung tâm Tài liệu', - -'dashboard.docs.search.placeholder': 'Tìm kiếm Tài liệu...', - -'dashboard.docs.category.all': 'Tất cả', - -'dashboard.docs.category.guide': 'Hướng dẫn dành cho nhà phát triển', - -'dashboard.docs.category.api': 'Tài liệu API', - -'dashboard.docs.category.tutorial': 'Hướng dẫn', - -'dashboard.docs.category.faq': 'Câu hỏi thường gặp Câu hỏi', - -'dashboard.docs.featured.title': 'Tài liệu được đề xuất', - -'dashboard.docs.featured.tag': 'Được đề xuất', - -'dashboard.docs.list.views': 'Lượt xem', - -'dashboard.docs.list.author': 'Tác giả', - -'dashboard.docs.list.empty': 'Không có tài liệu nào', - -'dashboard.docs.list.backToAll': 'Trả về tất cả tài liệu', - -'dashboard.docs.list.total': 'Tổng số {count} tài liệu', - -'dashboard.docs.detail.back': 'Trả về danh sách tài liệu', - -'dashboard.docs.detail.updatedAt': 'Cập nhật lúc', - -'dashboard.docs.detail.related': 'Tài liệu liên quan', - -'dashboard.docs.detail.notFound': 'Không tìm thấy tài liệu tồn tại', - -'dashboard.docs.detail.error': 'Tài liệu không tồn tại hoặc đã bị xóa', - -'dashboard.docs.search.result': 'Kết quả tìm kiếm', - -'dashboard.docs.search.keyword': 'Từ khóa', - -'community.filter.indicatorType': 'Loại chỉ báo', - -'community.filter.all': 'Tất cả', - -'community.filter.other': 'Các tùy chọn khác', - -'community.filter.pricing': 'Loại giá', - -'community.filter.allPricing': 'Tất cả giá', - -'community.filter.sortBy': 'Phương thức sắp xếp', - -'community.filter.search': 'Tìm kiếm', - -'community.filter.searchPlaceholder': 'Tên chỉ báo tìm kiếm', - -'community.indicatorType.trend': 'Định hướng theo xu hướng', - -'community.indicatorType.momentum': 'Động lượng', - -'community.indicatorType.volatility': 'Biến động', - -'community.indicatorType.volume': 'Khối lượng', - -'community.indicatorType.custom': 'Tùy chỉnh', - -'community.pricing.free': 'Miễn phí', - -'community.pricing.paid': 'Trả phí', - -'community.sort.downloads': 'Lượt tải xuống', - -'community.sort.rating': 'Xếp hạng', - -'community.sort.newest': 'Phiên bản mới nhất', - -'community.pagination.total': 'Tổng số {total} chỉ báo', - -'community.noDescription': 'Không có mô tả', - -'community.detail.type': 'Loại', - -'community.detail.pricing': 'Giá cả', - -'community.detail.rating': 'Xếp hạng', - -'community.detail.downloads': 'Lượt tải xuống', - -'community.detail.author': 'Tác giả', - -'community.detail.description': 'Mô tả', - -'community.detail.detailContent': 'Mô tả chi tiết', - -'community.detail.backtestStats': 'Thống kê kiểm thử ngược', - -'community.action.purchase': 'Số liệu mua hàng', - -'community.action.addToMyIndicators': 'Thêm vào chỉ báo của tôi', - -'community.action.favorite': 'Yêu thích', - -'community.action.unfavorite': 'Bỏ yêu thích', - -'community.action.buyNow': 'Mua ngay Ngay bây giờ', - -'community.action.renew': 'Gia hạn', - -'community.purchase.price': 'Giá', - -'community.purchase.permanent': 'Vĩnh viễn', - -'community.purchase.monthly': 'Hàng tháng', - -'community.purchase.confirmBuy': 'Xác nhận mua chỉ số này ({price} QDT)?', - -'community.purchase.confirmRenew': 'Xác nhận gia hạn chỉ số này ({price} QDT/tháng)?', - -'community.purchase.confirmFree': 'Xác nhận thêm chỉ số miễn phí này?', -'community.purchase.confirmTitle': 'Xác nhận thao tác', - -'community.purchase.owned': 'Bạn đã mua chỉ số này (có hiệu lực vĩnh viễn)', - -'community.purchase.ownIndicator': 'Đây là chỉ số bạn đã công bố', - -'community.purchase.expired': 'Gói đăng ký của bạn đã hết hạn', - -'community.purchase.expiresOn': 'Ngày hết hạn: {date}', - -'community.tabs.detail': 'Chi tiết chỉ số', - -'community.tabs.backtest': 'Dữ liệu kiểm thử ngược', - -'community.tabs.ratings': 'Xếp hạng người dùng', - -'community.rating.myRating': 'Xếp hạng của tôi', - -'community.rating.stars': '{count} Stars', - -'community.rating.commentPlaceholder': 'Chia sẻ trải nghiệm người dùng của bạn...', - -'community.rating.submit': 'Gửi đánh giá', - -'community.rating.modify': 'Sửa đổi', - -'community.rating.saveModify': 'Lưu thay đổi', - -'community.rating.cancel': 'Hủy', - -'community.rating.selectRating': 'Vui lòng chọn đánh giá', - -'community.rating.success': 'Đánh giá thành công', - -'community.rating.modifySuccess': 'Đánh giá được sửa đổi thành công', - -'community.rating.failed': 'Đánh giá thất bại', - -'community.rating.noRatings': 'Chưa có đánh giá nào', - -'community.backtest.note': 'Dữ liệu trên là kết quả kiểm thử ngược trong quá khứ, chỉ để tham khảo và không đại diện cho hiệu suất trong tương lai', -'community.backtest.noData': 'Không có dữ liệu kiểm thử ngược', - -'community.backtest.uploadHint': 'Tác giả chưa tải lên dữ liệu kiểm thử ngược', - -'community.message.loadFailed': 'Không thể tải danh sách chỉ báo', - -'community.message.purchaseProcessing': 'Đang xử lý yêu cầu mua hàng...', - -'community.message.downloadSuccess': 'Chỉ báo đã được thêm vào danh sách chỉ báo của tôi', - -'community.message.favoriteSuccess': 'Đã thêm vào mục yêu thích thành công', - -'community.message.unfavoriteSuccess': 'Đã xóa khỏi mục yêu thích thành công', - -'community.message.operationSuccess': 'Thao tác thành công', - -'community.message.operationFailed': 'Thao tác thất bại thất bại', -'community.banner.readOnly': 'Chỉ xem', -'community.banner.loginHint': 'Để đăng nhập hoặc đăng ký, vui lòng nhấp vào nút để chuyển đến trang độc lập nhằm tránh các vấn đề CSRF', -'community.banner.jumpButton': 'Đi đến Đăng nhập/Đăng ký', - -'dashboard.totalEquity': 'Tổng vốn chủ sở hữu', - -'dashboard.totalPnL': 'Tổng lợi nhuận/thua lỗ', - -'dashboard.aiStrategies': 'Chiến lược AI', - -'dashboard.indicatorStrategies': 'Chiến lược chỉ báo', - -'dashboard.running': 'Đang chạy', - -'dashboard.pnlHistory': 'Lịch sử lợi nhuận/thua lỗ', - -'dashboard.strategyPerformance': 'Tỷ lệ lợi nhuận/thua lỗ của chiến lược', - -'dashboard.recentTrades': 'Các giao dịch gần đây', - -'dashboard.currentPositions': 'Vị thế hiện tại', - -'dashboard.table.time': 'Thời gian', - -'dashboard.table.strategy': 'Chiến lược Name', - -'dashboard.table.symbol': 'Tài sản cơ sở', - -'dashboard.table.type': 'Loại', - -'dashboard.table.side': 'Hướng', - -'dashboard.table.size': 'Số lượng', - -'dashboard.table.entryPrice': 'Giá mở cửa trung bình', - -'dashboard.table.price': 'Giá', - -'dashboard.table.amount': 'Số lượng', - -'dashboard.table.profit': 'Lợi nhuận/Thua lỗ', - -'dashboard.pendingOrders': 'Lịch sử thực hiện lệnh', - -'dashboard.totalOrders': 'Tổng {total} lệnh', - -'dashboard.viewError': 'Xem lỗi', - -'dashboard.filled': 'Đã khớp', - -'dashboard.orderTable.time': 'Thời gian tạo', - -'dashboard.orderTable.strategy': 'Chiến lược', - -'dashboard.orderTable.symbol': 'Cặp giao dịch', - -'dashboard.orderTable.signalType': 'Loại tín hiệu', - -'dashboard.orderTable.amount': 'Số lượng', - -'dashboard.orderTable.price': 'Giá khớp', - -'dashboard.orderTable.status': 'Trạng thái', - -'dashboard.orderTable.executedAt': 'Thời gian thực hiện', - -'dashboard.signalType.openLong': 'Mở Long', - -'dashboard.signalType.openShort': 'Mở Short', - -'dashboard.signalType.closeLong': 'Đóng Long', - -'dashboard.signalType.closeShort': 'Đóng Short', - -'dashboard.signalType.addLong': 'Thêm Long', - -'dashboard.signalType.addShort': 'Thêm Short', - -'dashboard.status.pending': 'Đang chờ', - -'dashboard.status.processing': 'Đang xử lý', - -'dashboard.status.completed': 'Hoàn thành', - -'dashboard.status.failed': 'Thất bại', - -'dashboard.status.cancelled': 'Đã hủy', - -'dashboard.table.pnl': 'Lợi nhuận/Thua lỗ chưa thực hiện', - -'form.basic-form.basic.title': 'Biểu mẫu cơ bản', - -'form.basic-form.basic.description': 'Các trang biểu mẫu được sử dụng để thu thập hoặc xác minh thông tin từ người dùng. Biểu mẫu cơ bản thường phổ biến trong các trường hợp có ít mục dữ liệu.', - -'form.basic-form.title.label': 'Tiêu đề', - -'form.basic-form.title.placeholder': 'Đặt tên cho mục tiêu', - -'form.basic-form.title.required': 'Vui lòng nhập tiêu đề', - -'form.basic-form.date.label': 'Ngày bắt đầu và ngày kết thúc', - -'form.basic-form.placeholder.start': 'Ngày bắt đầu', - -'form.basic-form.placeholder.end': 'Ngày kết thúc', - -'form.basic-form.date.required': 'Vui lòng chọn ngày bắt đầu và ngày kết thúc', - -'form.basic-form.goal.label': 'Mô tả mục tiêu', - -'form.basic-form.goal.placeholder': 'Vui lòng nhập mục tiêu công việc theo từng giai đoạn', - -'form.basic-form.goal.required': 'Vui lòng nhập mục tiêu Mô tả', -'form.basic-form.standard.label': 'Số liệu', - -'form.basic-form.standard.placeholder': 'Vui lòng nhập số liệu', - -'form.basic-form.standard.required': 'Vui lòng nhập số liệu', - -'form.basic-form.client.label': 'Khách hàng', - -'form.basic-form.client.required': 'Vui lòng mô tả khách hàng bạn đang phục vụ', - -'form.basic-form.label.tooltip': 'Đối tượng mục tiêu', - -'form.basic-form.client.placeholder': 'Vui lòng mô tả khách hàng bạn đang phục vụ; khách hàng nội bộ có thể trực tiếp là @tên/ID nhân viên', - -'form.basic-form.invites.label': 'Người mời', - -'form.basic-form.invites.placeholder': 'Vui lòng trực tiếp là @tên/ID nhân viên; Có thể mời tối đa 5 người', -'form.basic-form.weight.label': 'Trọng lượng', - -'form.basic-form.weight.placeholder': 'Vui lòng nhập', - -'form.basic-form.public.label': 'Mục tiêu công khai', - -'form.basic-form.label.help': 'Khách hàng và người đánh giá được chia sẻ theo mặc định', - -'form.basic-form.radio.public': 'Công khai', - -'form.basic-form.radio.partially-public': 'Công khai một phần', - -'form.basic-form.radio.private': 'Không công khai', - -'form.basic-form.publicUsers.placeholder': 'Công khai cho', - -'form.basic-form.option.A': 'Đồng nghiệp 1', - -'form.basic-form.option.B': 'Đồng nghiệp 2', - -'form.basic-form.option.C': 'Đồng nghiệp số Ba', - -'form.basic-form.email.required': 'Vui lòng nhập địa chỉ email của bạn!', - -'form.basic-form.email.wrong-format': 'Định dạng địa chỉ email không chính xác!', - -'form.basic-form.userName.required': 'Vui lòng nhập tên người dùng của bạn!', - -'form.basic-form.password.required': 'Vui lòng nhập mật khẩu của bạn!', - -'form.basic-form.password.twice': 'Hai mật khẩu không khớp!', - -'form.basic-form.strength.msg': 'Vui lòng nhập ít nhất 6 ký tự. Vui lòng không sử dụng mật khẩu dễ đoán.', - -'form.basic-form.strength.strong': 'Độ mạnh: Mạnh', - -'form.basic-form.strength.medium': 'Độ mạnh: Trung bình', - -'form.basic-form.strength.short': 'Độ mạnh: Quá ngắn', - -'form.basic-form.confirm-password.required': 'Vui lòng xác nhận mật khẩu!', - -'form.basic-form.phone-number.required': 'Vui lòng nhập số điện thoại của bạn!', - -'form.basic-form.phone-number.wrong-format': 'Định dạng số điện thoại không chính xác!', - -'form.basic-form.verification-code.required': 'Vui lòng nhập mã xác minh!', - -'form.basic-form.form.get-captcha': 'Lấy mã xác minh mã', - -'form.basic-form.captcha.second': 'giây', - -'form.basic-form.form.optional': '(Tùy chọn)', - -'form.basic-form.form.submit': 'Gửi', - -'form.basic-form.form.save': 'Lưu', - -'form.basic-form.email.placeholder': 'Email', - -'form.basic-form.password.placeholder': 'Mật khẩu phải có ít nhất 6 ký tự, phân biệt chữ hoa chữ thường', - -'form.basic-form.confirm-password.placeholder': 'Xác nhận mật khẩu', - -'form.basic-form.phone-number.placeholder': 'Số điện thoại', - -'form.basic-form.verification-code.placeholder': 'Mã xác minh', - -'result.success.title': 'Đã gửi Thành công', - -'result.success.description': 'Trang kết quả nộp bài được sử dụng để cung cấp phản hồi về kết quả xử lý của một loạt các tác vụ vận hành. Nếu chỉ là một thao tác đơn giản, thông báo Tin nhắn toàn cục là đủ. Vùng văn bản này có thể hiển thị các giải thích bổ sung đơn giản. Nếu cần hiển thị nội dung như một "tài liệu", vùng màu xám bên dưới có thể hiển thị nội dung phức tạp hơn.', - -'result.success.operate-title': 'Tên dự án', - -'result.success.operate-id': 'ID dự án', - -'result.success.principal': 'Người phụ trách', - -'result.success.operate-time': 'Thời gian hiệu quả', - -'result.success.step1-title': 'Tạo dự án', - -'result.success.step1-operator': 'Qu Lili', - -'result.success.step2-title': 'Đánh giá ban đầu của phòng ban', - -'result.success.step2-operator': 'Zhou Maomao', - -'result.success.step2-extra': 'Theo dõi', - -'result.success.step3-title': 'Đánh giá tài chính', - -'result.success.step4-title': 'Hoàn thành', - -'result.success.btn-return': 'Quay lại danh sách', - -'result.success.btn-project': 'Xem dự án', - -'result.success.btn-print': 'In', - -'result.fail.error.title': 'Gửi bài không thành công', - -'result.fail.error.description': 'Vui lòng kiểm tra và chỉnh sửa thông tin sau trước khi gửi lại.', - -'result.fail.error.hint-title': 'Nội dung bạn đã gửi có các lỗi sau:', - -'result.fail.error.hint-text1': 'Tài khoản của bạn đã bị đóng băng', - -'result.fail.error.hint-btn1': 'Mở khóa ngay lập tức', - -'result.fail.error.hint-text2': 'Tài khoản của bạn chưa đủ điều kiện để đăng ký', - -'result.fail.error.hint-btn2': 'Nâng cấp ngay lập tức', - -'result.fail.error.btn-text': 'Quay lại chỉnh sửa', - -'account.settings.menuMap.custom': 'Cá nhân hóa', - -'account.settings.menuMap.binding': 'Liên kết tài khoản', - -'account.settings.basic.avatar': 'Avatar', - -'account.settings.basic.change-avatar': 'Thay đổi ảnh đại diện', - -'account.settings.basic.email': 'Địa chỉ email', - -'account.settings.basic.email-message': 'Vui lòng nhập địa chỉ email của bạn!', - -'account.settings.basic.nickname': 'Biệt danh', - -'account.settings.basic.nickname-message': 'Vui lòng nhập biệt danh của bạn!', - -'account.settings.basic.profile': 'Hồ sơ', - -'account.settings.basic.profile-message': 'Vui lòng nhập thông tin hồ sơ của bạn!', - -'account.settings.basic.profile-placeholder': 'Hồ sơ', - -'account.settings.basic.country': 'Quốc gia/Vùng', - -'account.settings.basic.country-message': 'Vui lòng nhập quốc gia của bạn hoặc khu vực!', - -'account.settings.basic.geographic': 'Tỉnh và Thành phố', - -'account.settings.basic.geographic-message': 'Vui lòng nhập tỉnh và thành phố của bạn!', - -'account.settings.basic.address': 'Địa chỉ đường phố', - -'account.settings.basic.address-message': 'Vui lòng nhập địa chỉ đường phố của bạn!', - -'account.settings.basic.phone': 'Số điện thoại', - -'account.settings.basic.phone-message': 'Vui lòng nhập số điện thoại của bạn!', - -'account.settings.basic.update': 'Cập nhật thông tin cơ bản', - -'account.settings.basic.update.success': 'Đã cập nhật thông tin cơ bản thành công', - -'account.settings.security.strong': 'Mạnh', - -'account.settings.security.medium': 'Trung bình', - -'account.settings.security.weak': 'Yếu', - -'account.settings.security.password': 'Mật khẩu tài khoản', - -'account.settings.security.password-description': 'Độ mạnh mật khẩu hiện tại:', - -'account.settings.security.phone': 'Số điện thoại bảo mật', - -'account.settings.security.phone-description': 'Số điện thoại liên kết:', - -'account.settings.security.question': 'Câu hỏi bảo mật', - -'account.settings.security.question-description': 'Chưa thiết lập câu hỏi bảo mật nào. Câu hỏi bảo mật có thể bảo vệ hiệu quả tính bảo mật của tài khoản', - -'account.settings.security.email': 'Email liên kết', - -'account.settings.security.email-description': 'Số email liên kết:', - -'account.settings.security.mfa': 'Thiết bị MFA', - -'account.settings.security.mfa-description': 'Thiết bị MFA chưa liên kết. Việc liên kết sẽ cho phép xác nhận thứ cấp', - -'account.settings.security.modify': 'Sửa đổi', - -'account.settings.security.set': 'Cài đặt', - -'account.settings.security.bind': 'Liên kết', - -'account.settings.binding.taobao': 'Liên kết Taobao', - -'account.settings.binding.taobao-description': 'Hiện chưa được liên kết với tài khoản Taobao', - -'account.settings.binding.alipay': 'Liên kết Alipay', - -'account.settings.binding.alipay-description': 'Hiện chưa được liên kết với tài khoản Alipay', - -'account.settings.binding.dingding': 'Liên kết DingTalk', - -'account.settings.binding.dingding-description': 'Hiện chưa được liên kết với tài khoản DingTalk', - -'account.settings.binding.bind': 'Liên kết', - -'account.settings.notification.password': 'Mật khẩu tài khoản', - -'account.settings.notification.password-description': 'Tin nhắn từ người dùng khác sẽ được gửi qua thông báo trong ứng dụng', - -'account.settings.notification.messages': 'Tin nhắn hệ thống', - -'account.settings.notification.messages-description': 'Tin nhắn hệ thống sẽ được gửi qua thông báo trong ứng dụng', - -'account.settings.notification.todo': 'Việc cần làm', - -'account.settings.notification.todo-description': 'Việc cần làm sẽ được gửi qua thông báo trong ứng dụng', - -'account.settings.settings.open': 'Bật', - -'account.settings.settings.close': 'Tắt', - -'trading-assistant.title': 'Trợ lý giao dịch', - -'trading-assistant.strategyList': 'Chiến lược Danh sách', - -'trading-assistant.createStrategy': 'Tạo chiến lược', - -'trading-assistant.noStrategy': 'Không có chiến lược nào', - -'trading-assistant.selectStrategy': 'Chọn một chiến lược từ bên trái để xem chi tiết', - -'trading-assistant.startStrategy': 'Bắt ​​đầu chiến lược', - -'trading-assistant.stopStrategy': 'Dừng chiến lược', - -'trading-assistant.editStrategy': 'Chỉnh sửa chiến lược', - -'trading-assistant.deleteStrategy': 'Xóa chiến lược', - -'trading-assistant.status.running': 'Đang chạy', - -'trading-assistant.status.stopped': 'Đã dừng', - -'trading-assistant.status.error': 'Lỗi', - -'trading-assistant.strategyType.IndicatorStrategy': 'Chỉ báo kỹ thuật Chiến lược', - -'trading-assistant.strategyType.PromptBasedStrategy': 'Chiến lược dựa trên lời nhắc', - -'trading-assistant.strategyType.GridStrategy': 'Chiến lược lưới', - -'trading-assistant.tabs.tradingRecords': 'Hồ sơ giao dịch', - -'trading-assistant.tabs.positions': 'Vị thế', - -'trading-assistant.tabs.equityCurve': 'Đường cong vốn chủ sở hữu', - -'trading-assistant.form.step1': 'Chọn chỉ báo', - -'trading-assistant.form.step2': 'Cấu hình sàn giao dịch', - -'trading-assistant.form.step3': 'Tham số chiến lược', - -'trading-assistant.form.indicator': 'Chọn chỉ báo', - -'trading-assistant.form.indicatorHint': 'Chỉ chọn các chỉ báo kỹ thuật bạn muốn đã mua hoặc tạo', - -'trading-assistant.form.qdtCostHints': 'Việc sử dụng chiến lược này sẽ tiêu tốn QDT; vui lòng đảm bảo tài khoản của bạn có đủ số dư QDT', - -'trading-assistant.form.indicatorDescription': 'Mô tả chỉ báo', - -'trading-assistant.form.noDescription': 'Không có mô tả', - -'trading-assistant.form.exchange': 'Chọn sàn giao dịch', - -'trading-assistant.form.apiKey': 'Khóa API', - -'trading-assistant.form.secretKey': 'Khóa bí mật', - -'trading-assistant.form.passphrase': 'Mật khẩu', - -'trading-assistant.form.testConnection': 'Kiểm tra kết nối', - -'trading-assistant.form.strategyName': 'Tên chiến lược', - -'trading-assistant.form.symbol': 'Cặp giao dịch', - -'trading-assistant.form.symbolHint': 'Hiện tại chỉ hỗ trợ các cặp giao dịch tiền điện tử', - -'trading-assistant.form.initialCapital': 'Vốn ban đầu', - -'trading-assistant.form.marketType': 'Loại thị trường', - -'trading-assistant.form.marketTypeFutures': 'Hợp đồng tương lai', - -'trading-assistant.form.marketTypeSpot': 'Giao dịch giao ngay', - -'trading-assistant.form.marketTypeHint': 'Hợp đồng hỗ trợ giao dịch hai chiều và đòn bẩy; Giao dịch giao ngay chỉ hỗ trợ vị thế mua với đòn bẩy cố định là 1x', - -'trading-assistant.form.leverage': 'Tỷ lệ đòn bẩy', - -'trading-assistant.form.leverageHint': 'Hợp đồng: 1-125x, Giao ngay: Cố định 1x', - -'trading-assistant.form.spotLeverageFixed': 'Đòn bẩy giao dịch giao ngay được cố định ở mức 1x', - -'trading-assistant.form.spotOnlyLongHint': 'Giao dịch giao ngay chỉ hỗ trợ vị thế mua', - -'trading-assistant.form.tradeDirection': 'Hướng giao dịch', - -'trading-assistant.form.tradeDirectionLong': 'Chỉ mua', - -'trading-assistant.form.tradeDirectionShort': 'Chỉ bán', - -'trading-assistant.form.tradeDirectionBoth': 'Hai chiều giao dịch', - -'trading-assistant.form.timeframe': 'Khung thời gian', - -'trading-assistant.form.klinePeriod': 'Chu kỳ K-Line', - -'trading-assistant.form.timeframe1m': '1 phút', - -'trading-assistant.form.timeframe5m': '5 phút', - -'trading-assistant.form.timeframe15m': '15 phút', - -'trading-assistant.form.timeframe30m': '30 phút', - -'trading-assistant.form.timeframe1H': '1 giờ', - -'trading-assistant.form.timeframe4H': '4 giờ', - -'trading-assistant.form.timeframe1D': '1 ngày', - -'trading-assistant.form.selectStrategyType': 'Chọn loại chiến lược', - -'trading-assistant.form.indicatorStrategy': 'Chiến lược chỉ báo', - -'trading-assistant.form.indicatorStrategyDesc': 'Chiến lược giao dịch tự động dựa trên chỉ báo kỹ thuật', - -'trading-assistant.form.aiStrategy': 'Chiến lược AI', - -'trading-assistant.form.aiStrategyDesc': 'Chiến lược giao dịch tự động dựa trên quyết định thông minh AI', - -'trading-assistant.form.enableAiFilter': 'Bật bộ lọc quyết định thông minh AI', - -'trading-assistant.form.enableAiFilterHint': 'Khi bật, tín hiệu chỉ báo sẽ được lọc bởi AI để cải thiện chất lượng giao dịch', - -'trading-assistant.form.aiFilterPrompt': 'Lời nhắc tùy chỉnh', - -'trading-assistant.form.aiFilterPromptHint': 'Cung cấp hướng dẫn tùy chỉnh cho bộ lọc AI, để trống để sử dụng mặc định hệ thống', - -'trading-assistant.validation.strategyTypeRequired': 'Vui lòng chọn loại chiến lược', - -'trading-assistant.form.advancedSettings': 'Cài đặt nâng cao', - -'trading-assistant.form.orderMode': 'Chế độ đặt lệnh', - -'trading-assistant.form.orderModeMaker': 'Maker', - -'trading-assistant.form.orderModeTaker': 'Giá thị trường', - -'trading-assistant.form.orderModeHint': 'Chế độ Maker sử dụng lệnh giới hạn, phí thấp hơn; chế độ Market thực hiện ngay lập tức, phí cao hơn', - -'trading-assistant.form.makerWaitSec': 'Thời gian chờ của Maker (giây)', - -'trading-assistant.form.makerWaitSecHint': 'Thời gian chờ sau khi đặt lệnh; ', -'trading-assistant.form.makerRetries': 'Số lần thử lại cho lệnh maker', - -'trading-assistant.form.makerRetriesHint': 'Số lần thử lại tối đa nếu lệnh maker không được khớp', - -'trading-assistant.form.fallbackToMarket': 'Hạ cấp lệnh maker thất bại xuống giá thị trường', - -'trading-assistant.form.fallbackToMarketHint': 'Có nên hạ cấp các lệnh mở/đóng đang chờ xử lý thành lệnh thị trường để đảm bảo thực hiện khi chúng không được khớp hay không', - -'trading-assistant.form.marginMode': 'Chế độ ký quỹ', - -'trading-assistant.form.marginModeCross': 'Ký quỹ chéo', - -'trading-assistant.form.marginModeIsolated': 'Ký quỹ riêng biệt Ký quỹ', - -'trading-assistant.form.stopLossPct': 'Tỷ lệ cắt lỗ (%)', - -'trading-assistant.form.stopLossPctHint': 'Thiết lập tỷ lệ cắt lỗ; 0 cho biết lệnh dừng lỗ không được bật', - -'trading-assistant.form.takeProfitPct': 'Tỷ lệ chốt lời (%)', - -'trading-assistant.form.takeProfitPctHint': 'Thiết lập tỷ lệ chốt lời, 0 cho biết lệnh chốt lời không được bật', - -'trading-assistant.form.signalMode': 'Chế độ tín hiệu', - -'trading-assistant.form.signalModeConfirmed': 'Chế độ xác nhận', - -'trading-assistant.form.signalModeAggressive': 'Chế độ giao dịch tích cực', - -'trading-assistant.form.signalModeHint': 'Chế độ xác nhận: Chỉ kiểm tra các nến đã hoàn thành; Chế độ giao dịch tích cực: Kiểm tra cả việc hình thành nến', - -'trading-assistant.form.cancel': 'Hủy', - -'trading-assistant.form.prev': 'Bước trước', - -'trading-assistant.form.next': 'Bước tiếp theo', - -'trading-assistant.form.confirmCreate': 'Xác nhận tạo', - -'trading-assistant.form.confirmEdit': 'Xác nhận chỉnh sửa', - -'trading-assistant.messages.createSuccess': 'Tạo chiến lược thành công', - -'trading-assistant.messages.createFailed': 'Tạo chiến lược thất bại', - -'trading-assistant.messages.updateSuccess': 'Cập nhật chiến lược thành công', - -'trading-assistant.messages.updateFailed': 'Cập nhật chiến lược thất bại', -'trading-assistant.messages.deleteSuccess': 'Xóa chiến lược thành công', - -'trading-assistant.messages.deleteFailed': 'Xóa chiến lược thất bại', - -'trading-assistant.messages.startSuccess': 'Khởi động chiến lược thành công', - -'trading-assistant.messages.startFailed': 'Khởi động chiến lược thất bại', - -'trading-assistant.messages.stopSuccess': 'Chính sách đã dừng thành công', - -'trading-assistant.messages.stopFailed': 'Dừng chính sách thất bại', - -'trading-assistant.messages.loadFailed': 'Không thể tải danh sách chính sách', - -'trading-assistant.messages.runningWarning': 'Chính sách đang chạy, vui lòng dừng chính sách trước khi sửa đổi', -'trading-assistant.messages.deleteConfirmWithName': 'Bạn có chắc chắn muốn xóa chính sách "{name}" không? Thao tác này không thể đảo ngược.', - -'trading-assistant.messages.deleteConfirm': 'Bạn có chắc chắn muốn xóa chính sách này không? Thao tác này không thể đảo ngược.', - -'trading-assistant.messages.loadTradesFailed': 'Không thể truy xuất hồ sơ giao dịch', - -'trading-assistant.messages.loadPositionsFailed': 'Không thể truy xuất hồ sơ vị thế', - -'trading-assistant.messages.loadEquityFailed': 'Không thể truy xuất đường cong vốn chủ sở hữu', - -'trading-assistant.messages.loadIndicatorsFailed': 'Không thể tải danh sách chỉ báo, vui lòng thử lại sau', - -'trading-assistant.messages.spotLimitations': 'Giao dịch giao ngay đã được tự động thiết lập chỉ mua, đòn bẩy 1x', - -'trading-assistant.messages.autoFillApiConfig': 'Cấu hình API lịch sử cho sàn giao dịch này đã được tự động điền', - -'trading-assistant.placeholders.selectIndicator': 'Vui lòng chọn một chỉ báo indicator', -'trading-assistant.placeholders.selectExchange': 'Vui lòng chọn một sàn giao dịch', - -'trading-assistant.placeholders.inputApiKey': 'Vui lòng nhập Khóa API', - -'trading-assistant.placeholders.inputSecretKey': 'Vui lòng nhập Khóa bí mật', - -'trading-assistant.placeholders.inputPassphrase': 'Vui lòng nhập Mật khẩu', - -'trading-assistant.placeholders.inputStrategyName': 'Vui lòng nhập tên chiến lược', - -'trading-assistant.placeholders.selectSymbol': 'Vui lòng chọn một cặp giao dịch', - -'trading-assistant.placeholders.selectTimeframe': 'Vui lòng chọn một khung thời gian', - -'trading-assistant.placeholders.selectKlinePeriod': 'Vui lòng chọn chu kỳ K-Line', - -'trading-assistant.placeholders.inputAiFilterPrompt': 'Vui lòng nhập lời nhắc tùy chỉnh (tùy chọn)', - -'trading-assistant.validation.indicatorRequired': 'Vui lòng chọn một chỉ báo', - -'trading-assistant.validation.exchangeRequired': 'Vui lòng chọn một sàn giao dịch', -'trading-assistant.validation.apiKeyRequired': 'Vui lòng nhập Khóa API', - -'trading-assistant.validation.secretKeyRequired': 'Vui lòng nhập Khóa bí mật', - -'trading-assistant.validation.passphraseRequired': 'Vui lòng nhập Mật khẩu', - -'trading-assistant.validation.exchangeConfigIncomplete': 'Vui lòng điền đầy đủ thông tin cấu hình sàn giao dịch', -'trading-assistant.validation.testConnectionRequired': 'Vui lòng nhấp vào nút "Kiểm tra kết nối" và đảm bảo kết nối thành công', -'trading-assistant.validation.testConnectionFailed': 'Kiểm tra kết nối thất bại, vui lòng kiểm tra cấu hình và thử lại', - -'trading-assistant.validation.strategyNameRequired': 'Vui lòng nhập tên chiến lược', - -'trading-assistant.validation.symbolRequired': 'Vui lòng chọn một cặp giao dịch ...apiKeyRequired', - -'trading-assistant.apiKeyRequired': 'Vui lòng Nhập khóa API', - -'trading-assistant.validation.initialCapitalRequired': 'Vui lòng nhập vốn ban đầu', - -'trading-assistant.validation.leverageRequired': 'Vui lòng nhập tỷ lệ đòn bẩy', - -'trading-assistant.table.time': 'Thời gian', - -'trading-assistant.table.type': 'Loại', - -'trading-assistant.table.price': 'Giá', - -'trading-assistant.table.amount': 'Số tiền', - -'trading-assistant.table.value': 'Số tiền', - -'trading-assistant.table.commission': 'Phí hoa hồng', - -'trading-assistant.table.symbol': 'Cặp giao dịch', - -'trading-assistant.table.side': 'Hướng', - -'trading-assistant.table.size': 'Vị thế kích thước', - -'trading-assistant.table.entryPrice': 'Giá vào lệnh', - -'trading-assistant.table.currentPrice': 'Giá hiện tại', - -'trading-assistant.table.unrealizedPnl': 'Lợi nhuận/Thua lỗ chưa thực hiện', - -'trading-assistant.table.pnlPercent': 'Tỷ lệ lợi nhuận/thua lỗ', - -'trading-assistant.table.buy': 'Mua', - -'trading-assistant.table.sell': 'Bán', - -'trading-assistant.table.long': 'Mua', - -'trading-assistant.table.short': 'Bán', - -'trading-assistant.table.noPositions': 'Không có vị thế', - -'trading-assistant.detail.title': 'Chi tiết chiến lược', - -'trading-assistant.detail.strategyName': 'Chiến lược Tên', - -'trading-assistant.detail.strategyType': 'Loại chiến lược', - -'trading-assistant.detail.status': 'Trạng thái', - -'trading-assistant.detail.tradingMode': 'Chế độ giao dịch', - -'trading-assistant.detail.exchange': 'Sàn giao dịch', - -'trading-assistant.detail.initialCapital': 'Vốn ban đầu', - -'trading-assistant.detail.totalInvestment': 'Tổng vốn đầu tư', - -'trading-assistant.detail.currentEquity': 'Vốn chủ sở hữu hiện tại', - -'trading-assistant.detail.totalPnl': 'Tổng lợi nhuận/thua lỗ', - -'trading-assistant.detail.indicatorName': 'Tên chỉ báo', - -'trading-assistant.detail.maxLeverage': 'Đòn bẩy tối đa Đòn bẩy', - -'trading-assistant.detail.decideInterval': 'Khoảng thời gian quyết định', - -'trading-assistant.detail.symbols': 'Công cụ giao dịch', - -'trading-assistant.detail.createdAt': 'Thời gian tạo', - -'trading-assistant.detail.updatedAt': 'Thời gian cập nhật', - -'trading-assistant.detail.llmConfig': 'Cấu hình mô hình AI', - -'trading-assistant.detail.exchangeConfig': 'Cấu hình sàn giao dịch', - -'trading-assistant.detail.provider': 'Nhà cung cấp', - -'trading-assistant.detail.modelId': 'ID mô hình', - -'trading-assistant.detail.close': 'Đóng', - -'trading-assistant.detail.loadFailed': 'Không thể truy xuất chiến lược chi tiết', - -'trading-assistant.equity.noData': 'Không có dữ liệu giá trị tài sản ròng', - -'trading-assistant.equity.equity': 'Giá trị tài sản ròng', - -'trading-assistant.exchange.tradingMode': 'Chế độ giao dịch', - -'trading-assistant.exchange.virtual': 'Giao dịch thử nghiệm', - -'trading-assistant.exchange.live': 'Giao dịch trực tiếp', - -'trading-assistant.exchange.selectExchange': 'Chọn sàn giao dịch', - -'trading-assistant.exchange.walletAddress': 'Địa chỉ ví', - -'trading-assistant.exchange.walletAddressPlaceholder': 'Vui lòng nhập địa chỉ ví của bạn (bắt đầu bằng 0x)', - -'trading-assistant.exchange.privateKey': 'Khóa riêng tư', - -'trading-assistant.exchange.privateKeyPlaceholder': 'Vui lòng nhập khóa riêng tư của bạn (64 ký tự)', - -'trading-assistant.exchange.testConnection': 'Kiểm tra kết nối', - -'trading-assistant.exchange.connectionSuccess': 'Kết nối thành công', - -'trading-assistant.exchange.connectionFailed': 'Kết nối thất bại', - -'trading-assistant.exchange.testFailed': 'Kiểm tra kết nối thất bại', - -'trading-assistant.exchange.fillComplete': 'Vui lòng điền đầy đủ thông tin cấu hình sàn giao dịch', - -'trading-assistant.strategyTypeOptions.ai': 'Chiến lược dựa trên AI', - -'trading-assistant.strategyTypeOptions.indicator': 'Chiến lược chỉ báo kỹ thuật', - -'trading-assistant.strategyTypeOptions.aiDeveloping': 'Chức năng chiến lược dựa trên AI đang được phát triển, hãy theo dõi', - -'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'Chức năng chiến lược dựa trên AI đang được phát triển', - -'trading-assistant.indicatorType.trend': 'Xu hướng', - -'trading-assistant.indicatorType.momentum': 'Động lượng', - -'trading-assistant.indicatorType.volatility': 'Biến động', - -'trading-assistant.indicatorType.volume': 'Khối lượng', - -'trading-assistant.indicatorType.custom': 'Tùy chỉnh', - -'trading-assistant.exchangeNames': { - -'okx': 'OKX', - -'binance': 'Binance', - -'hyperliquid': 'Hyperliquid', - -'blockchaincom': 'Blockchain.com', - -'coinbaseexchange': 'Coinbase', - -'gate': 'Gate.io', - -'mexc': 'MEXC', - -'kraken': 'Kraken', -'bitfinex': 'Bitfinex', -'bybit': 'Bybit', -'kucoin': 'KuCoin', -'huobi': 'Huobi', -'bitget': 'Bitget', -'bitmex': 'BitMEX', -'gạch từ': 'Dựa trên', -'phemex': 'Phemex', -'bitmart': 'BitMart', -'bitstamp': 'Bitstamp', -'bittrex': 'Bittrex', -'poloniex': 'Poloniex', -'song tử': 'song tử', -'tiền điện tử': 'Crypto.com', -'bitflyer': 'bitFlyer', -'upbit': 'Upbit', -'bithumb': 'Bithumb', -'coinone': 'Coinone', -'zb': 'ZB', -'ngân hàng': 'LBank', - -'bibox': 'Bibox', - -'bigone': 'BigONE', - -'bitrue': 'Bitrue', - -'coinex': 'CoinEx', - -'digifinex': 'DigiFinex', - -'ftx': 'FTX', - -'ftxus': 'FTX US', - -'binanceus': 'Binance US', - -'binancecoinm': 'Binance COIN-M', - -'binanceusdm': 'Binance USDⓈ-M' - -}, - -'ai-trading-assistant.title': 'Trợ lý giao dịch AI', - -'ai-trading-assistant.strategyList': 'Danh sách chiến lược', - -'ai-trading-assistant.createStrategy': 'Tạo chiến lược', - -'ai-trading-assistant.noStrategy': 'Không có chiến lược Có sẵn', - -'ai-trading-assistant.selectStrategy': 'Chọn chiến lược từ bên trái để xem chi tiết', - -'ai-trading-assistant.startStrategy': 'Bắt ​​đầu chiến lược', - -'ai-trading-assistant.stopStrategy': 'Dừng chiến lược', - -'ai-trading-assistant.editStrategy': 'Chỉnh sửa chiến lược', - -'ai-trading-assistant.deleteStrategy': 'Xóa chiến lược', - -'ai-trading-assistant.status.running': 'Đang chạy', - -'ai-trading-assistant.status.stopped': 'Đã dừng', - -'ai-trading-assistant.status.error': 'Lỗi', - -'ai-trading-assistant.tabs.tradingRecords': 'Hồ sơ giao dịch', - -'ai-trading-assistant.tabs.positions': 'Vị thế', - -'ai-trading-assistant.tabs.aiDecisions': 'Bản ghi quyết định của AI', - -'ai-trading-assistant.tabs.equityCurve': 'Đường cong vốn chủ sở hữu', - -'ai-trading-assistant.form.createTitle': 'Tạo chiến lược giao dịch AI', - -'ai-trading-assistant.form.editTitle': 'Chỉnh sửa chiến lược giao dịch AI', - -'ai-trading-assistant.form.strategyName': 'Tên chiến lược', - -'ai-trading-assistant.form.modelId': 'Mô hình AI', - -'ai-trading-assistant.form.modelIdHint': 'Sử dụng dịch vụ OpenRouter của hệ thống; Không cần cấu hình khóa API', - -'ai-trading-assistant.form.decideInterval': 'Khoảng thời gian quyết định', - -'ai-trading-assistant.form.decideInterval5m': '5 phút', - -'ai-trading-assistant.form.decideInterval10m': '10 phút', - -'ai-trading-assistant.form.decideInterval30m': '30 phút', - -'ai-trading-assistant.form.decideInterval1h': '1 giờ', - -'ai-trading-assistant.form.decideInterval4h': '4 giờ', - -'ai-trading-assistant.form.decideInterval1d': '1 ngày', - -'ai-trading-assistant.form.decideInterval1w': '1 tuần', - -'ai-trading-assistant.form.decideIntervalHint': 'Khoảng thời gian cho AI để đưa ra quyết định', - -'ai-trading-assistant.form.runPeriod': 'Thời gian chạy', - -'ai-trading-assistant.form.runPeriodHint': 'Thời gian bắt đầu và kết thúc của chiến lược', - -'ai-trading-assistant.form.startDate': 'Ngày bắt đầu', - -'ai-trading-assistant.form.endDate': 'Ngày kết thúc', - -'ai-trading-assistant.form.qdtCostTitle': 'Mô tả chi phí QDT', - -'ai-trading-assistant.form.qdtCostHint': 'Mỗi quyết định của AI sẽ có giá {cost} QDT. Vui lòng đảm bảo tài khoản của bạn có đủ số dư QDT. Chi phí sẽ được trừ theo thời gian thực cho mỗi quyết định trong quá trình chạy chiến lược.', - -'ai-trading-assistant.form.apiKey': 'Khóa API', - -'ai-trading-assistant.form.exchange': 'Chọn sàn giao dịch', - -'ai-trading-assistant.form.secretKey': 'Khóa bí mật', - -'ai-trading-assistant.form.passphrase': 'Mật khẩu', - -'ai-trading-assistant.form.testConnection': 'Kiểm tra kết nối', - -'ai-trading-assistant.form.symbol': 'Cặp giao dịch', - -'ai-trading-assistant.form.symbolHint': 'Chọn cặp giao dịch', - -'ai-trading-assistant.form.initialCapital': 'Số vốn đầu tư (Ký quỹ)', - -'ai-trading-assistant.form.leverage': 'Tỷ lệ đòn bẩy', - -'ai-trading-assistant.form.timeframe': 'Khung thời gian', - -'ai-trading-assistant.form.timeframe1m': '1 phút', - -'ai-trading-assistant.form.timeframe5m': '5 phút', - -'ai-trading-assistant.form.timeframe15m': '15 phút', - -'ai-trading-assistant.form.timeframe30m': '30 phút', - -'ai-trading-assistant.form.timeframe1H': '1 giờ', - -'ai-trading-assistant.form.timeframe4H': '4 giờ', - -'ai-trading-assistant.form.timeframe1D': '1 ngày', - -'ai-trading-assistant.form.marketType': 'Loại thị trường', - -'ai-trading-assistant.form.marketTypeFutures': 'Hợp đồng', - -'ai-trading-assistant.form.marketTypeSpot': 'Giao dịch tức thời', - -'ai-trading-assistant.form.totalPnl': 'Tổng lợi nhuận/thua lỗ', - -'ai-trading-assistant.form.customPrompt': 'Lời nhắc tùy chỉnh', - -'ai-trading-assistant.form.customPromptHint': 'Tùy chọn, để tùy chỉnh chiến lược giao dịch và logic quyết định của AI', - -'ai-trading-assistant.form.cancel': 'Hủy', - -'ai-trading-assistant.form.prev': 'Bước trước', - -'ai-trading-assistant.form.next': 'Bước tiếp theo', - -'ai-trading-assistant.form.confirmCreate': 'Xác nhận tạo', - -'ai-trading-assistant.form.confirmEdit': 'Xác nhận chỉnh sửa', - -'ai-trading-assistant.messages.createSuccess': 'Tạo chiến lược thành công', - -'ai-trading-assistant.messages.createFailed': 'Tạo chiến lược thất bại', - -'ai-trading-assistant.messages.updateSuccess': 'Cập nhật chiến lược thành công', - -'ai-trading-assistant.messages.updateFailed': 'Cập nhật chiến lược thất bại', - -'ai-trading-assistant.messages.deleteSuccess': 'Xóa chiến lược thành công', - -'ai-trading-assistant.messages.deleteFailed': 'Xóa chiến lược thất bại', - -'ai-trading-assistant.messages.startSuccess': 'Khởi động chiến lược thành công', - -'ai-trading-assistant.messages.startFailed': 'Không thể khởi động chính sách', - -'ai-trading-assistant.messages.stopSuccess': 'Đã dừng thành công chính sách', - -'ai-trading-assistant.messages.stopFailed': 'Không thể dừng chính sách', - -'ai-trading-assistant.messages.loadFailed': 'Không thể truy xuất danh sách chính sách', - -'ai-trading-assistant.messages.loadDecisionsFailed': 'Không thể truy xuất bản ghi quyết định của AI', - -'ai-trading-assistant.messages.deleteConfirm': 'Bạn có chắc chắn muốn xóa chính sách này không? Thao tác này không thể đảo ngược.', - -'ai-trading-assistant.placeholders.inputStrategyName': 'Vui lòng nhập tên chiến lược', - -'ai-trading-assistant.placeholders.selectModelId': 'Vui lòng chọn mô hình AI', - -'ai-trading-assistant.placeholders.selectDecideInterval': 'Vui lòng chọn khoảng thời gian quyết định', - -'ai-trading-assistant.placeholders.startTime': 'Thời gian bắt đầu', - -'ai-trading-assistant.placeholders.endTime': 'Thời gian kết thúc', - -'ai-trading-assistant.placeholders.inputApiKey': 'Vui lòng nhập khóa API', - -'ai-trading-assistant.placeholders.selectExchange': 'Vui lòng chọn sàn giao dịch', - -'ai-trading-assistant.placeholders.inputSecretKey': 'Vui lòng nhập mã bí mật Key', - -'ai-trading-assistant.placeholders.inputPassphrase': 'Vui lòng nhập mật khẩu của bạn', - -'ai-trading-assistant.placeholders.selectSymbol': 'Vui lòng chọn một cặp giao dịch, ví dụ như BTC/USDT', - -'ai-trading-assistant.placeholders.selectTimeframe': 'Vui lòng chọn khung thời gian', - -'ai-trading-assistant.placeholders.inputCustomPrompt': 'Vui lòng nhập lời nhắc tùy chỉnh (tùy chọn)', - -'ai-trading-assistant.validation.strategyNameRequired': 'Vui lòng nhập tên chiến lược', - -'ai-trading-assistant.validation.modelIdRequired': 'Vui lòng chọn một mô hình AI', - -'ai-trading-assistant.validation.runPeriodRequired': 'Vui lòng chọn khoảng thời gian chạy', - -'ai-trading-assistant.validation.apiKeyRequired': 'Vui lòng nhập API Key', - -'ai-trading-assistant.validation.exchangeRequired': 'Vui lòng chọn sàn giao dịch', - -'ai-trading-assistant.validation.secretKeyRequired': 'Vui lòng nhập Khóa bí mật', - -'ai-trading-assistant.validation.symbolRequired': 'Vui lòng chọn cặp giao dịch', - -'ai-trading-assistant.validation.initialCapitalRequired': 'Vui lòng nhập số vốn đầu tư', - -'ai-trading-assistant.table.time': 'Thời gian', - -'ai-trading-assistant.table.type': 'Loại', - -'ai-trading-assistant.table.price': 'Giá', - -'ai-trading-assistant.table.amount': 'Số lượng', - -'ai-trading-assistant.table.value': 'Giá trị', - -'ai-trading-assistant.table.symbol': 'Cặp giao dịch', - -'ai-trading-assistant.table.side': 'Hướng', - -'ai-trading-assistant.table.size': 'Số lượng vị thế', - -'ai-trading-assistant.table.entryPrice': 'Giá vào lệnh', - -'ai-trading-assistant.table.currentPrice': 'Giá hiện tại', - -'ai-trading-assistant.table.unrealizedPnl': 'Lợi nhuận/Thua lỗ chưa thực hiện', - -'ai-trading-assistant.table.profit': 'Lợi nhuận/Thua lỗ', - -'ai-trading-assistant.table.openLong': 'Mở lệnh mua', - -'ai-trading-assistant.table.closeLong': 'Đóng lệnh Long', - -'ai-trading-assistant.table.openShort': 'Mở lệnh bán', - -'ai-trading-assistant.table.closeShort': 'Đóng lệnh bán', - -'ai-trading-assistant.table.addLong': 'Thêm lệnh mua', - -'ai-trading-assistant.table.addShort': 'Thêm lệnh bán', - -'ai-trading-assistant.table.closeShortProfit': 'Đóng lệnh bán có lãi', - -'ai-trading-assistant.table.closeShortStop': 'Đóng lệnh cắt lỗ lệnh bán', - -'ai-trading-assistant.table.closeLongProfit': 'Đóng lệnh mua có lãi', - -'ai-trading-assistant.table.closeLongStop': 'Đóng lệnh cắt lỗ lệnh mua', - -'ai-trading-assistant.table.buy': 'Mua', - -'ai-trading-assistant.table.sell': '售', - -'ai-trading-assistant.table.long': '开长', - -'ai-trading-assistant.table.short': '开短', - -'ai-trading-assistant.table.hold': '控股', - -'ai-trading-assistant.table.reasoning': '分析理理', - -'ai-trading-assistant.table.decisions': '决定', - -'ai-trading-assistant.table.riskAssessment': '风险考核', - -'ai-trading-assistant.table.trust': '信信度', - -'ai-trading-assistant.table.totalRecords': '{total} Không có bản ghi', -'ai-trading-assistant.table.noPositions': 'Không có vị thế', - -'ai-trading-assistant.detail.title': 'Chi tiết chiến lược', - -'ai-trading-assistant.equity.noData': 'Không có dữ liệu giá trị tài sản ròng', - -'ai-trading-assistant.equity.equity': 'Giá trị tài sản ròng', - -'ai-trading-assistant.exchange.testFailed': 'Kiểm tra kết nối thất bại', - -'ai-trading-assistant.exchange.connectionSuccess': 'Kết nối thành công', - -'ai-trading-assistant.exchange.connectionFailed': 'Kết nối thất bại', - -'ai-trading-assistant.form.advancedSettings': 'Cài đặt nâng cao', - -'ai-trading-assistant.form.orderMode': 'Lệnh Mode', - -'ai-trading-assistant.form.orderModeMaker': 'Lệnh chờ (Người tạo lệnh)', - -'ai-trading-assistant.form.orderModeTaker': 'Lệnh thị trường (Người nhận lệnh)', - -'ai-trading-assistant.form.orderModeHint': 'Chế độ lệnh chờ sử dụng lệnh giới hạn, phí thấp hơn; chế độ lệnh thị trường thực hiện ngay lập tức, phí cao hơn', - -'ai-trading-assistant.form.makerWaitSec': 'Thời gian chờ lệnh (giây)', - -'ai-trading-assistant.form.makerWaitSecHint': 'Thời gian chờ sau khi đặt lệnh;', -'ai-trading-assistant.form.makerRetries': 'Số lần thử lại cho lệnh đang chờ', - -'ai-trading-assistant.form.makerRetriesHint': 'Số lần thử lại tối đa khi lệnh đang chờ không được khớp', - -'ai-trading-assistant.form.fallbackToMarket': 'Hạ cấp lệnh đang chờ thất bại thành lệnh thị trường', - -'ai-trading-assistant.form.fallbackToMarketHint': 'Có nên hạ cấp lệnh đang chờ mở/đóng thành lệnh thị trường để đảm bảo thực hiện khi chúng không được khớp hay không', - -'ai-trading-assistant.form.marginMode': 'Chế độ ký quỹ', - -'ai-trading-assistant.form.marginModeCross': 'Ký quỹ chéo', - -'ai-trading-assistant.form.marginModeIsolated': 'Ký quỹ riêng biệt Margin', - -'ai-analysis.title': 'Hệ thống giao dịch lượng tử', - -'ai-analysis.system.online': 'Trực tuyến', - -'ai-analysis.system.agents': 'Nhân viên', - -'ai-analysis.system.active': 'Hoạt động', - -'ai-analysis.system.stage': 'Giai đoạn', - -'ai-analysis.panel.roster': 'Danh sách nhân viên', - -'ai-analysis.panel.thinking': 'Đang suy nghĩ...', - -'ai-analysis.panel.done': 'Hoàn tất', - -'ai-analysis.panel.standby': 'Chờ', - -'ai-analysis.input.title': 'Hệ thống giao dịch lượng tử', - -'ai-analysis.input.placeholder': 'Chọn tài sản mục tiêu (ví dụ: BTC/USDT)', - -'ai-analysis.input.watchlist': 'Danh sách theo dõi', - -'ai-analysis.input.start': 'Bắt ​​đầu phân tích', - -'ai-analysis.input.recent': 'Các tác vụ gần đây:', - -'ai-analysis.vis.stage': 'Giai đoạn', - -'ai-analysis.vis.processing': 'Đang xử lý', - -'ai-analysis.result.complete': 'Phân tích hoàn tất', - -'ai-analysis.result.signal': 'Tín hiệu cuối cùng', - -'ai-analysis.result.confidence': 'Mức độ tin cậy:', - -'ai-analysis.result.new': 'Phân tích mới', - -'ai-analysis.result.full': 'Xem báo cáo đầy đủ', - -'ai-analysis.logs.title': 'Nhật ký hệ thống', - -'ai-analysis.modal.title': 'Báo cáo bảo mật', - -'ai-analysis.modal.fundamental': 'Phân tích cơ bản', - -'ai-analysis.modal.technical': 'Phân tích kỹ thuật', - -'ai-analysis.modal.sentiment': 'Phân tích tâm lý', - -'ai-analysis.modal.risk': 'Đánh giá rủi ro', - -'ai-analysis.stage.idle': 'Chế độ chờ', - -'ai-analysis.stage.1': 'Giai đoạn 1: Phân tích đa chiều', - -'ai-analysis.stage.2': 'Giai đoạn 2: Thảo luận về xu hướng tăng/giảm', - -'ai-analysis.stage.3': 'Giai đoạn 3: Lập kế hoạch chiến lược', - -'ai-analysis.stage.4': 'Giai đoạn 4: Xem xét kiểm soát rủi ro', - -'ai-analysis.stage.complete': 'Đã hoàn thành', - -'ai-analysis.agent.investment_director': 'Giám đốc đầu tư Giám đốc', - -'ai-analysis.agent.role.investment_director': 'Phân tích toàn diện & Kết luận cuối cùng', - -'ai-analysis.agent.market': 'Nhà phân tích thị trường', - -'ai-analysis.agent.role.market': 'Dữ liệu kỹ thuật & thị trường', - -'ai-analysis.agent.fundamental': 'Nhà phân tích cơ bản', - -'ai-analysis.agent.role.fundamental': 'Tài chính & Định giá', - -'ai-analysis.agent.technical': 'Nhà phân tích kỹ thuật', - -'ai-analysis.agent.role.technical': 'Các chỉ báo & biểu đồ kỹ thuật', - -'ai-analysis.agent.news': 'Nhà phân tích tin tức', - -'ai-analysis.agent.role.news': 'Bộ lọc tin tức toàn cầu', - -'ai-analysis.agent.sentiment': 'Tâm lý thị trường Nhà phân tích', - -'ai-analysis.agent.role.sentiment': 'Phân tích xã hội & cảm xúc', - -'ai-analysis.agent.risk': 'Nhà phân tích rủi ro', - -'ai-analysis.agent.role.risk': 'Kiểm tra rủi ro cơ bản', - -'ai-analysis.agent.bull': 'Nhà phân tích lạc quan', - -'ai-analysis.agent.role.bull': 'Khám phá động lực tăng trưởng', - -'ai-analysis.agent.bear': 'Nhà phân tích bi quan', - -'ai-analysis.agent.role.bear': 'Khám phá rủi ro & điểm yếu', - -'ai-analysis.agent.manager': 'Quản lý nghiên cứu', - -'ai-analysis.agent.role.manager': 'Người điều phối tranh luận', - -'ai-analysis.agent.trader': 'Nhà giao dịch', - -'ai-analysis.agent.role.trader': 'Chiến lược gia điều hành', - -'ai-analysis.agent.risky': 'Nhà phân tích năng động', - -'ai-analysis.agent.role.risky': 'Chiến lược năng động', - -'ai-analysis.agent.neutral': 'Nhà phân tích cân bằng', - -'ai-analysis.agent.role.neutral': 'Chiến lược cân bằng', - -'ai-analysis.agent.safe': 'Nhà phân tích thận trọng', - -'ai-analysis.agent.role.safe': 'Chiến lược thận trọng', - -'ai-analysis.agent.cro': 'Cân nhắc Quản lý rủi ro (CRO)', - -'ai-analysis.agent.role.cro': 'Người có thẩm quyền quyết định cuối cùng', - -'ai-analysis.script.market': 'Đang truy xuất dữ liệu OHLCV từ các sàn giao dịch lớn...', - -'ai-analysis.script.fundamental': 'Đang truy xuất báo cáo tài chính hàng quý...', - -'ai-analysis.script.technical': 'Phân tích các chỉ báo kỹ thuật và mô hình biểu đồ...', - -'ai-analysis.script.news': 'Đang quét tin tức tài chính toàn cầu...', - -'ai-analysis.script.sentiment': 'Phân tích xu hướng mạng xã hội...', - -'ai-analysis.script.risk': 'Đang tính toán biến động lịch sử...', - -'invite.inviteLink': 'Liên kết mời', - -'invite.copy': 'Sao chép liên kết', - -'invite.copySuccess': 'Sao chép thành công!', - -'invite.copyFailed': 'Sao chép thất bại, vui lòng sao chép thủ công', - -'invite.noInviteLink': 'Không tạo được liên kết mời', - -'invite.totalInvites': 'Tổng số lời mời', - -'invite.totalReward': 'Tổng số phần thưởng', - -'invite.rules': 'Quy tắc mời', - -'invite.rule1': 'Bạn sẽ nhận được phần thưởng cho mỗi người bạn mời đăng ký thành công', - -'invite.rule2': 'Bạn sẽ nhận được phần thưởng bổ sung khi người bạn được mời hoàn tất giao dịch đầu tiên', - -'invite.rule3': 'Phần thưởng mời sẽ được cộng trực tiếp vào tài khoản của bạn', - -'invite.inviteList': 'Danh sách người được mời', - -'invite.tasks': 'Trung tâm nhiệm vụ', - -'invite.inviteeName': 'Người được mời', - -'invite.inviteTime': 'Thời gian mời', - -'invite.status': 'Trạng thái', - -'invite.reward': 'Phần thưởng', - -'invite.active': 'Đang hoạt động', - -'invite.inactive': 'Không hoạt động', - -'invite.completed': 'Đã hoàn thành', - -'invite.claimed': 'Đã nhận', - -'invite.pending': 'Đang chờ hoàn thành', - -'invite.goToTask': 'Chuyển đến hoàn thành', - -'invite.claimReward': 'Nhận phần thưởng', - -'invite.verify': 'Xác minh hoàn tất', - -'invite.verifySuccess': 'Xác minh thành công Nhiệm vụ hoàn thành', - -'invite.verifyNotCompleted': 'Nhiệm vụ chưa hoàn thành, vui lòng hoàn thành nhiệm vụ trước', - -'invite.verifyFailed': 'Xác minh thất bại, vui lòng thử lại sau', - -'invite.claimSuccess': 'Đã nhận thành công {reward} QDT!', - -'invite.claimFailed': 'Không thể xác nhận, vui lòng thử lại sau', - -'invite.totalRecords': 'Tổng số {total} bản ghi', - -'invite.task.twitter.title': 'Chia sẻ lại bài đăng trên Twitter của chúng tôi lên X (Twitter)', - -'invite.task.twitter.desc': 'Chia sẻ bài đăng chính thức của chúng tôi lên tài khoản Twitter của bạn (X)', - -'invite.task.youtube.title': 'Đăng ký kênh YouTube của chúng tôi', - -'invite.task.youtube.desc': 'Đăng ký và theo dõi kênh YouTube chính thức của chúng tôi', - -'invite.task.telegram.title': 'Tham gia nhóm Telegram của chúng tôi', - -'invite.task.telegram.desc': 'Tham gia nhóm cộng đồng Telegram chính thức của chúng tôi', - -'invite.task.discord.title': 'Tham gia Discord Máy chủ', - -'invite.task.discord.desc': 'Tham gia máy chủ cộng đồng Discord của chúng tôi', - -'message': '-', - -'layouts.usermenu.dialog.title': 'Thông tin', - -'layouts.usermenu.dialog.content': 'Bạn có chắc chắn muốn đăng xuất không?', - -'layouts.userLayout.title': 'Tìm kiếm sự thật trong sự không chắc chắn', - -// Settings (Memory/Reflection) -'settings.group.agent_memory': 'Bộ nhớ/Phản tư', -'settings.group.reflection_worker': 'Worker xác minh phản tư tự động', -'settings.field.ENABLE_AGENT_MEMORY': 'Bật bộ nhớ tác nhân', -'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'Bật truy vấn vector (cục bộ)', -'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'Kích thước embedding', -'settings.field.AGENT_MEMORY_TOP_K': 'Số lượng Top-K', -'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'Kích thước cửa sổ ứng viên', -'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': 'Chu kỳ bán rã theo thời gian (ngày)', -'settings.field.AGENT_MEMORY_W_SIM': 'Trọng số tương đồng', -'settings.field.AGENT_MEMORY_W_RECENCY': 'Trọng số thời gian', -'settings.field.AGENT_MEMORY_W_RETURNS': 'Trọng số lợi nhuận', -'settings.field.ENABLE_REFLECTION_WORKER': 'Bật xác minh tự động', -'settings.field.REFLECTION_WORKER_INTERVAL_SEC': 'Khoảng thời gian xác minh (giây)' - -} -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/zh-CN.js b/quantdinger_vue/src/locales/lang/zh-CN.js deleted file mode 100644 index fa435e3..0000000 --- a/quantdinger_vue/src/locales/lang/zh-CN.js +++ /dev/null @@ -1,2365 +0,0 @@ -import antd from 'ant-design-vue/es/locale-provider/zh_CN' -import momentCN from 'moment/locale/zh-cn' - -const components = { -antLocale: antd, -momentName: 'zh-cn', -momentLocale: momentCN -} - -const locale = { -// 通用 -'common.confirm': '确定', -'common.cancel': '取消', -'common.save': '保存', -'common.delete': '删除', -'common.edit': '编辑', -'common.add': '添加', -'common.close': '关闭', -'common.ok': '确定', -'submit': '提交', -'save': '保存', -'submit.ok': '提交成功', -'save.ok': '保存成功', -'menu.welcome': '欢迎', -'menu.home': '主页', -'menu.dashboard': '仪表盘', -'menu.dashboard.indicator': '指标分析', -'menu.dashboard.community': '指标社区', -'menu.dashboard.analysis': 'AI 分析', -'menu.dashboard.tradingAssistant': '交易助手', -'menu.dashboard.portfolio': '资产监测', -'menu.settings': '系统设置', -'menu.dashboard.aiTradingAssistant': 'AI交易助手', -'menu.dashboard.signalRobot': '信号机器人', -'menu.dashboard.monitor': '监控页', -'menu.dashboard.workplace': '工作台', -'menu.form': '表单页', -'menu.form.basic-form': '基础表单', -'menu.form.step-form': '分步表单', -'menu.form.step-form.info': '分步表单(填写转账信息)', -'menu.form.step-form.confirm': '分步表单(确认转账信息)', -'menu.form.step-form.result': '分步表单(完成)', -'menu.form.advanced-form': '高级表单', -'menu.list': '列表页', -'menu.list.table-list': '查询表格', -'menu.list.basic-list': '标准列表', -'menu.list.card-list': '卡片列表', -'menu.list.search-list': '搜索列表', -'menu.list.search-list.articles': '搜索列表(文章)', -'menu.list.search-list.projects': '搜索列表(项目)', -'menu.list.search-list.applications': '搜索列表(应用)', -'menu.profile': '详情页', -'menu.profile.basic': '基础详情页', -'menu.profile.advanced': '高级详情页', -'menu.result': '结果页', -'menu.result.success': '成功页', -'menu.result.fail': '失败页', -'menu.exception': '异常页', -'menu.exception.not-permission': '403', -'menu.exception.not-find': '404', -'menu.exception.server-error': '500', -'menu.exception.trigger': '触发错误', -'menu.account': '个人页', -'menu.account.center': '个人中心', -'menu.account.settings': '个人设置', -'menu.account.trigger': '触发报错', -'menu.account.logout': '退出登录', -'menu.wallet': '我的钱包', -'menu.docs': '文档中心', -'menu.docs.detail': '文档详情', -'menu.header.refreshPage': '刷新页面', -'menu.invite.friends': '邀请好友', -'app.setting.pagestyle': '整体风格设置', -'app.setting.pagestyle.light': '亮色菜单风格', -'app.setting.pagestyle.dark': '暗色菜单风格', -'app.setting.pagestyle.realdark': '暗黑模式', -'app.setting.themecolor': '主题色', -'app.setting.navigationmode': '导航模式', -'app.setting.sidemenu.nav': '侧边栏导航', -'app.setting.topmenu.nav': '顶部栏导航', -'app.setting.content-width': '内容区域宽度', -'app.setting.content-width.tooltip': '该设定仅 [顶部栏导航] 时有效', -'app.setting.content-width.fixed': '固定', -'app.setting.content-width.fluid': '流式', -'app.setting.fixedheader': '固定 Header', -'app.setting.fixedheader.tooltip': '固定 Header 时可配置', -'app.setting.autoHideHeader': '下滑时隐藏 Header', -'app.setting.fixedsidebar': '固定侧边菜单', -'app.setting.sidemenu': '侧边菜单布局', -'app.setting.topmenu': '顶部菜单布局', -'app.setting.othersettings': '其他设置', -'app.setting.weakmode': '色弱模式', -'app.setting.multitab': '多页签模式', -'app.setting.copy': '拷贝设置', -'app.setting.loading': '加载主题中', -'app.setting.copyinfo': '拷贝设置成功 src/config/defaultSettings.js', -'app.setting.copy.success': '复制完毕', -'app.setting.copy.fail': '复制失败', -'app.setting.theme.switching': '正在切换主题!', -'app.setting.production.hint': '配置栏只在开发环境用于预览,生产环境不会展现,请拷贝后手动修改配置文件', -'app.setting.themecolor.daybreak': '拂晓蓝(默认)', -'app.setting.themecolor.dust': '薄暮', -'app.setting.themecolor.volcano': '火山', -'app.setting.themecolor.sunset': '日暮', -'app.setting.themecolor.cyan': '明青', -'app.setting.themecolor.green': '极光绿', -'app.setting.themecolor.geekblue': '极客蓝', -'app.setting.themecolor.purple': '酱紫', -'app.setting.tooltip': '页面设置', - -// 通知中心 -'notice.title': '通知中心', -'notice.empty': '暂无通知', -'notice.markAllRead': '全部已读', -'notice.clear': '清空通知', -'notice.close': '关闭', -'notice.justNow': '刚刚', -'notice.minutesAgo': '分钟前', -'notice.hoursAgo': '小时前', -'notice.daysAgo': '天前', -'notice.detailInfo': '详细信息', -'notice.aiDecision': 'AI决策', -'notice.confidence': '置信度', -'notice.reasoning': '分析理由', -'notice.symbol': '标的代码', -'notice.currentPrice': '当前价格', -'notice.triggerPrice': '触发价格', -'notice.action': '操作', -'notice.quantity': '数量', -'notice.viewPortfolio': '查看持仓', -'notice.type.aiMonitor': 'AI监控', -'notice.type.priceAlert': '价格提醒', -'notice.type.signal': '交易信号', -'notice.type.buy': '买入信号', -'notice.type.sell': '卖出信号', -'notice.type.hold': '持有建议', -'notice.type.trade': '交易执行', -'notice.type.notification': '系统通知', - -'user.login.userName': '用户名', -'user.login.password': '密码', -'user.login.username.placeholder': '账户: admin', -'user.login.password.placeholder': '密码: admin or ant.design', -'user.login.message-invalid-credentials': '登录失败,请检查邮箱和验证码', -'user.login.message-invalid-verification-code': '验证码错误', -'user.login.tab-login-credentials': '账户密码登录', -'user.login.tab-login-email': '邮箱登录', -'user.login.tab-login-mobile': '手机号登录', -'user.login.captcha.placeholder': '请输入图形验证码', -'user.login.mobile.placeholder': '手机号', -'user.login.mobile.verification-code.placeholder': '验证码', -'user.login.email.placeholder': '请输入邮箱地址', -'user.login.email.verification-code.placeholder': '请输入验证码', -'user.login.email.sending': '验证码发送中...', -'user.login.email.send-success-title': '提示', -'user.login.email.send-success': '验证码发送成功,请查收邮件', -'user.login.sms.send-success': '验证码发送成功,请查收短信', -'user.login.remember-me': '自动登录', -'user.login.forgot-password': '忘记密码', -'user.login.sign-in-with': '其他登录方式', -'user.login.signup': '注册账户', -'user.login.login': '登录', -'user.register.register': '注册', -'user.register.email.placeholder': '邮箱', -'user.register.password.placeholder': '请至少输入 6 个字符。请不要使用容易被猜到的密码。', -'user.register.password.popover-message': '请至少输入 6 个字符。请不要使用容易被猜到的密码。', -'user.register.confirm-password.placeholder': '确认密码', -'user.register.get-verification-code': '获取验证码', -'user.register.sign-in': '使用已有账户登录', -'user.register-result.msg': '你的账户:{email} 注册成功', -'user.register-result.activation-email': '激活邮件已发送到你的邮箱中,邮件有效期为24小时。请及时登录邮箱,点击邮件中的链接激活账户。', -'user.register-result.back-home': '返回首页', -'user.register-result.view-mailbox': '查看邮箱', -'user.email.required': '请输入邮箱地址!', -'user.email.wrong-format': '邮箱地址格式错误!', -'user.userName.required': '请输入账户名或邮箱地址', -'user.password.required': '请输入密码!', -'user.password.twice.msg': '两次输入的密码不匹配!', -'user.password.strength.msg': '密码强度不够 ', -'user.password.strength.strong': '强度:强', -'user.password.strength.medium': '强度:中', -'user.password.strength.low': '强度:低', -'user.password.strength.short': '强度:太短', -'user.confirm-password.required': '请确认密码!', -'user.phone-number.required': '请输入正确的手机号', -'user.phone-number.wrong-format': '手机号格式错误!', -'user.verification-code.required': '请输入验证码!', -'user.captcha.required': '请输入图形验证码!', -'user.login.infos': 'QuantDinger 是一个 AI 多智能体股票分析辅助工具,不具备证券投资咨询资质。平台中的所有分析结果、评分、参考意见均由 AI 基于历史数据自动生成,仅供学习、研究与技术交流使用,不构成任何投资建议或决策依据。股票投资存在市场风险、流动性风险、政策风险等多种风险,可能导致本金损失。用户应基于自身风险承受能力独立决策,使用本工具产生的任何投资行为及其后果由用户自行承担。市场有风险,投资需谨慎。', -'user.login.tab-login-web3': 'Web3 登录', -'user.login.web3.tip': '使用钱包进行签名登录', -'user.login.web3.connect': '连接钱包并登录', -'user.login.web3.no-wallet': '未检测到钱包', -'user.login.web3.no-address': '未获取到钱包地址', -'user.login.web3.nonce-failed': '获取随机数失败', -'user.login.web3.verify-failed': '签名验证失败', -'user.login.web3.success': '登录成功', -'user.login.web3.failed': '钱包登录失败', -'nav.no_wallet': '未检测到钱包', -'nav.copy': '复制', -'nav.copy_success': '复制成功', -'user.login.oauth.google': '使用 Google 登录', -'user.login.oauth.github': '使用 GitHub 登录', -'user.login.oauth.loading': '正在跳转到授权页面...', -'user.login.oauth.failed': 'OAuth 登录失败', -'user.login.oauth.get-url-failed': '获取授权链接失败', -'user.login.subtitle': '驱动的全球市场量化洞察', -'user.login.legal.title': '法律免责声明', -'user.login.legal.view': '查看法律免责声明', -'user.login.legal.collapse': '收起法律免责声明', -'user.login.legal.agree': '我已阅读并同意法律免责声明', -'user.login.legal.required': '请先阅读并勾选法律免责声明', -'user.login.legal.content': 'QuantDinger 是一个 AI 多智能体股票分析辅助工具,不具备证券投资咨询资质。平台中的所有分析结果、评分、参考意见均由 AI 基于历史数据自动生成,仅供学习、研究与技术交流使用,不构成任何投资建议或决策依据。股票投资存在市场风险、流动性风险、政策风险等多种风险,可能导致本金损失。用户应基于自身风险承受能力独立决策,使用本工具产生的任何投资行为及其后果由用户自行承担。市场有风险,投资需谨慎。', -'user.login.privacy.title': '用户隐私条款', -'user.login.privacy.view': '查看用户隐私条款', -'user.login.privacy.collapse': '收起用户隐私条款', -'user.login.privacy.content': '我们重视您的隐私与数据保护。1) 收集范围:仅收集实现功能所需的信息(如邮箱、手机号、区号、Web3 钱包地址)以及必要的日志与设备信息。2) 使用目的:用于账户登录与安全校验、服务功能提供、问题排查与合规要求。3) 存储与安全:数据加密存储,并采取必要的权限与访问控制措施,尽力防止未经授权的访问、披露或丢失。4) 共享与第三方:除法律法规要求或履行服务所必需外,不会与第三方共享您的个人信息;若涉及第三方服务(如钱包、短信服务商),仅在实现功能所需的最小范围内处理。5) Cookies/本地存储:用于登录态与必要的会话维持(如令牌、PHPSESSID),您可在浏览器中进行清理或限制。6) 个人权利:您可根据法律法规行使查询、更正、删除、撤回同意等权利。7) 变更与通知:本条款更新后将在页面显著位置提示。继续使用本服务即表示您已阅读并同意更新内容。若您不同意本条款或其中任何更新,请停止使用本服务并联系我们。', - -// Login page additions -'user.login.username': '用户名', -'user.login.usernameRequired': '请输入用户名', -'user.login.passwordRequired': '请输入密码', -'user.login.tab': '登录', -'user.login.submit': '登录', -'user.login.register': '注册账户', -'user.login.forgotPassword': '忘记密码?', -'user.login.orLoginWith': '或使用以下方式登录', -'user.login.methodPassword': '密码登录', -'user.login.methodCode': '验证码登录', -'user.login.email': '邮箱', -'user.login.emailRequired': '请输入邮箱', -'user.login.emailInvalid': '邮箱格式不正确', -'user.login.verificationCode': '验证码', -'user.login.codeRequired': '请输入验证码', -'user.login.sendCode': '发送', -'user.login.codeSent': '验证码已发送', -'user.login.codeLoginHint': '新用户将自动注册', -'user.login.welcomeNew': '欢迎!', -'user.login.accountCreated': '您的账户已创建成功', - -// OAuth -'user.oauth.processing': '正在处理登录...', -'user.oauth.error.missing_params': '缺少必要参数', -'user.oauth.error.invalid_state': '无效的状态参数', -'user.oauth.error.user_creation_failed': '创建用户失败', -'user.oauth.error.server_error': '服务器错误', - -// Register page -'user.register.tab': '注册', -'user.register.title': '创建账户', -'user.register.email': '邮箱', -'user.register.emailRequired': '请输入邮箱', -'user.register.emailInvalid': '邮箱格式不正确', -'user.register.verificationCode': '验证码', -'user.register.codeRequired': '请输入验证码', -'user.register.sendCode': '发送验证码', -'user.register.codeSent': '验证码已发送', -'user.register.username': '用户名', -'user.register.usernameRequired': '请输入用户名', -'user.register.usernameLength': '用户名需要3-30个字符', -'user.register.usernamePattern': '以字母开头,只能包含字母、数字和下划线', -'user.register.password': '密码', -'user.register.passwordRequired': '请输入密码', -'user.register.confirmPassword': '确认密码', -'user.register.confirmPasswordRequired': '请确认密码', -'user.register.passwordMismatch': '两次输入的密码不一致', -'user.register.submit': '创建账户', -'user.register.haveAccount': '已有账户?', -'user.register.login': '登录', -'user.register.success': '注册成功', -'user.register.pleaseLogin': '请使用新账户登录', -'user.register.pwdMinLength': '至少8个字符', -'user.register.pwdUppercase': '至少包含一个大写字母', -'user.register.pwdLowercase': '至少包含一个小写字母', -'user.register.pwdNumber': '至少包含一个数字', - -// Reset password page -'user.resetPassword.title': '重置密码', -'user.resetPassword.email': '邮箱', -'user.resetPassword.emailRequired': '请输入邮箱', -'user.resetPassword.emailInvalid': '邮箱格式不正确', -'user.resetPassword.verificationCode': '验证码', -'user.resetPassword.codeRequired': '请输入验证码', -'user.resetPassword.sendCode': '发送验证码', -'user.resetPassword.codeSent': '验证码已发送', -'user.resetPassword.next': '下一步', -'user.resetPassword.backToLogin': '返回登录', -'user.resetPassword.resettingFor': '正在为以下邮箱重置密码', -'user.resetPassword.newPassword': '新密码', -'user.resetPassword.passwordRequired': '请输入新密码', -'user.resetPassword.confirmPassword': '确认新密码', -'user.resetPassword.confirmPasswordRequired': '请确认新密码', -'user.resetPassword.submit': '重置密码', -'user.resetPassword.back': '返回', -'user.resetPassword.successTitle': '密码重置成功', -'user.resetPassword.successSubtitle': '您现在可以使用新密码登录了', -'user.resetPassword.goToLogin': '前往登录', - -// Security -'user.security.retry': '重试', - -// Profile - change password -'profile.passwordHintNew': '为了安全,修改密码需要邮箱验证。密码至少8个字符,包含大小写字母和数字。', -'profile.verificationCode': '验证码', -'profile.codeRequired': '请输入验证码', -'profile.codePlaceholder': '输入验证码', -'profile.sendCode': '发送验证码', -'profile.codeSent': '验证码已发送', -'profile.codeWillSendTo': '验证码将发送至', -'profile.noEmailWarning': '请先在基本信息中设置邮箱', - -'account.basicInfo': '基础信息', -'account.id': '用户ID', -'account.username': '用户名', -'account.nickname': '昵称', -'account.email': '邮箱', -'account.mobile': '手机号', -'account.web3address': '钱包地址', -'account.pid': '推荐人ID', -'account.level': '用户等级', -'account.money': '余额', -'account.qdtBalance': 'QDT 余额', -'account.score': '积分', -'account.createtime': '注册时间', -'account.inviteLink': '邀请链接', -'account.recharge': '充值', -'account.rechargeTip': '请使用微信或支付宝扫描下方二维码进行充值', -'account.qrCodePlaceholder': '二维码占位符(模拟)', -'account.rechargeAmount': '充值金额', -'account.enterAmount': '请输入充值金额', -'account.rechargeHint': '最小充值金额:1 QDT', -'account.confirmRecharge': '确认充值', -'account.enterValidAmount': '请输入有效的充值金额', -'account.rechargeSuccess': '充值成功!已充值 {amount} QDT', -'account.settings.menuMap.basic': '基本设置', -'account.settings.menuMap.security': '安全设置', -'account.settings.menuMap.notification': '新消息通知', -'account.settings.menuMap.moneyLog': '资金明细', -'account.moneyLog.empty': '暂无资金明细', -'account.moneyLog.total': '共 {total} 条记录', -'account.moneyLog.type.purchase': '购买指标', -'account.moneyLog.type.recharge': '充值', -'account.moneyLog.type.refund': '退款', -'account.moneyLog.type.reward': '奖励', -'account.moneyLog.type.income': '指标收入', -'account.moneyLog.type.commission': '平台手续费', -'wallet.balance': 'QDT 余额', -'wallet.recharge': '充值', -'wallet.withdraw': '提现', -'wallet.filter': '筛选', -'wallet.reset': '重置', -'wallet.totalRecharge': '累计充值', -'wallet.totalWithdraw': '累计提现', -'wallet.totalIncome': '累计收入', -'wallet.records': '交易记录与资金明细', -'wallet.tradingRecords': '交易记录', -'wallet.moneyLog': '资金明细', -'wallet.rechargeTip': '请使用微信或支付宝扫描下方二维码进行充值', -'wallet.qrCodePlaceholder': '二维码占位符(模拟)', -'wallet.rechargeAmount': '充值金额', -'wallet.enterAmount': '请输入充值金额', -'wallet.rechargeHint': '最小充值金额:1 QDT', -'wallet.confirmRecharge': '确认充值', -'wallet.enterValidAmount': '请输入有效的充值金额', -'wallet.rechargeSuccess': '充值成功!已充值 {amount} QDT', -'wallet.rechargeFailed': '充值失败', -'wallet.withdrawTip': '请输入提现金额和提现地址', -'wallet.withdrawAmount': '提现金额', -'wallet.enterWithdrawAmount': '请输入提现金额', -'wallet.withdrawHint': '最小提现金额:1 QDT', -'wallet.withdrawAddress': '提现地址(可选)', -'wallet.enterWithdrawAddress': '请输入提现地址', -'wallet.confirmWithdraw': '确认提现', -'wallet.enterValidWithdrawAmount': '请输入有效的提现金额', -'wallet.insufficientBalance': '余额不足', -'wallet.withdrawSuccess': '提现成功!已提现 {amount} QDT', -'wallet.withdrawFailed': '提现失败', -'wallet.noTradingRecords': '暂无交易记录', -'wallet.noMoneyLog': '暂无资金明细', -'wallet.loadTradingRecordsFailed': '加载交易记录失败', -'wallet.loadMoneyLogFailed': '加载资金明细失败', -'wallet.moneyLogTotal': '共 {total} 条记录', -'wallet.moneyLogTypeTitle': '类型', -'wallet.moneyLogType.all': '全部类型', -'wallet.table.time': '时间', -'wallet.table.type': '类型', -'wallet.table.price': '价格', -'wallet.table.amount': '数量', -'wallet.table.money': '金额', -'wallet.table.balance': '余额', -'wallet.table.memo': '备注', -'wallet.table.value': '价值', -'wallet.table.profit': '盈亏', -'wallet.table.commission': '手续费', -'wallet.table.total': '共 {total} 条记录', -'wallet.tradeType.buy': '买入', -'wallet.tradeType.sell': '卖出', -'wallet.tradeType.liquidation': '强平', -'wallet.tradeType.openLong': '开多', -'wallet.tradeType.addLong': '加多', -'wallet.tradeType.closeLong': '平多', -'wallet.tradeType.closeLongStop': '止损平多', -'wallet.tradeType.closeLongProfit': '止盈平多', -'wallet.tradeType.openShort': '开空', -'wallet.tradeType.addShort': '加空', -'wallet.tradeType.closeShort': '平空', -'wallet.tradeType.closeShortStop': '止损平空', -'wallet.tradeType.closeShortProfit': '止盈平空', -'wallet.moneyLogType.purchase': '购买指标', -'wallet.moneyLogType.recharge': '充值', -'wallet.moneyLogType.withdraw': '提现', -'wallet.moneyLogType.refund': '退款', -'wallet.moneyLogType.reward': '奖励', -'wallet.moneyLogType.income': '收入', -'wallet.moneyLogType.commission': '手续费', -'wallet.web3Address.required': '请先填写Web3钱包地址', -'wallet.web3Address.requiredDescription': '充值前需要先绑定您的Web3钱包地址,用于接收充值', -'wallet.web3Address.placeholder': '请输入您的Web3钱包地址(0x开头)', -'wallet.web3Address.save': '保存钱包地址', -'wallet.web3Address.saveSuccess': '钱包地址保存成功', -'wallet.web3Address.saveFailed': '保存钱包地址失败', -'wallet.web3Address.invalidFormat': '请输入有效的Web3钱包地址(以太坊格式:0x开头42位字符,或TRC20格式:T开头34位字符)', -'wallet.selectCoin': '选择币种', -'wallet.selectChain': '选择链', -'wallet.chain.eth': 'ETH(ERC20)', -'wallet.chain.trc20': 'TRC20', -'wallet.chain.bsc': 'BSC', -'wallet.targetQdtAmount': '想要兑换的QDT数量(可选)', -'wallet.targetQdtAmount.placeholder': '请输入想要兑换的QDT数量,当前QDT价格:{price} USDT', -'wallet.targetQdtAmount.requiredUsdt': '需要充值:{amount} USDT', -'wallet.rechargeAddress': '充值地址', -'wallet.copyAddress': '复制', -'wallet.copySuccess': '复制成功!', -'wallet.copyFailed': '复制失败,请手动复制', -'wallet.rechargeAddressHint': '请确保使用{chain}链向此地址充值{coin}', -'wallet.qdtPrice.loading': '加载中...', -'wallet.rechargeTip.new': '请选择币种和链,然后扫描下方二维码进行充值', -'wallet.exchangeRate': '1 QDT ≈ {rate} USDT', -'wallet.withdrawableAmount': '可提现金额', -'wallet.totalBalance': '总余额', -'wallet.insufficientWithdrawable': '可提现金额不足,当前可提现:{amount} QDT', -'wallet.withdrawAddressRequired': '请输入提现地址', -'wallet.withdrawAddressHint': '请确保地址正确,提现后无法撤销', -'wallet.withdrawSubmitSuccess': '提现申请提交成功,请等待审核', -'menu.footer.contactUs': '联系我们', -'menu.footer.getSupport': '获取支持', -'menu.footer.socialAccounts': '社交账户', -'menu.footer.userAgreement': '用户协议', -'menu.footer.privacyPolicy': '隐私条例', -'menu.footer.support': 'Support', -'menu.footer.featureRequest': 'Feature request', -'menu.footer.email': 'Email', -'menu.footer.liveChat': '24/7 live chat', -'dashboard.analysis.title': 'Multi-Dimensional Analysis', -'dashboard.analysis.subtitle': 'AI驱动的综合金融分析平台', -'dashboard.analysis.selectSymbol': '选择或输入标的代码', -'dashboard.analysis.selectModel': '选择模型', -'dashboard.analysis.startAnalysis': '开始分析', -'dashboard.analysis.history': '历史记录', -'dashboard.analysis.tab.overview': '综合分析', -'dashboard.analysis.tab.fundamental': '基本面', -'dashboard.analysis.tab.technical': '技术', -'dashboard.analysis.tab.news': '新闻', -'dashboard.analysis.tab.sentiment': '情绪', -'dashboard.analysis.tab.risk': '风险', -'dashboard.analysis.tab.debate': '多空辩论', -'dashboard.analysis.tab.decision': '最终决策', -'dashboard.analysis.empty.selectSymbol': '选择标的开始分析', -'dashboard.analysis.empty.selectSymbolDesc': '从自选股列表中选择或输入标的代码,获取多维度AI分析报告', -'dashboard.analysis.empty.startAnalysis': '点击"开始分析"按钮进行多维度分析', -'dashboard.analysis.empty.startAnalysisDesc': '我们将从基本面、技术、新闻、情绪和风险等多个维度为您提供全面的分析', -'dashboard.analysis.empty.noData': '暂无{type}分析数据,请先进行综合分析', -'dashboard.analysis.empty.noWatchlist': '暂无自选股', -'dashboard.analysis.empty.noHistory': '暂无历史记录', -'dashboard.analysis.empty.watchlistHint': '暂无自选股,请先', -'dashboard.analysis.empty.noDebateData': '暂无辩论数据', -'dashboard.analysis.empty.noDecisionData': '暂无决策数据', -'dashboard.analysis.empty.selectAgent': '请选择一个 Agent 查看分析结果', -'dashboard.analysis.loading.analyzing': '正在分析中,请稍候...', -'dashboard.analysis.loading.fundamental': '正在分析基本面数据...', -'dashboard.analysis.loading.technical': '正在分析技术指标...', -'dashboard.analysis.loading.news': '正在分析新闻数据...', -'dashboard.analysis.loading.sentiment': '正在分析市场情绪...', -'dashboard.analysis.loading.risk': '正在评估风险...', -'dashboard.analysis.loading.debate': '正在进行多空辩论...', -'dashboard.analysis.loading.decision': '正在生成最终决策...', -'dashboard.analysis.score.overall': '综合评分', -'dashboard.analysis.score.recommendation': '投资建议', -'dashboard.analysis.score.confidence': '置信度', -'dashboard.analysis.dimension.fundamental': '基本面', -'dashboard.analysis.dimension.technical': '技术', -'dashboard.analysis.dimension.news': '新闻', -'dashboard.analysis.dimension.sentiment': '情绪', -'dashboard.analysis.dimension.risk': '风险', -'dashboard.analysis.card.dimensionScores': '各维度评分', -'dashboard.analysis.card.overviewReport': '综合分析报告', -'dashboard.analysis.card.financialMetrics': '财务指标', -'dashboard.analysis.card.fundamentalReport': '基本面分析报告', -'dashboard.analysis.card.technicalIndicators': '技术指标', -'dashboard.analysis.card.technicalReport': '技术分析报告', -'dashboard.analysis.card.newsList': '相关新闻', -'dashboard.analysis.card.newsReport': '新闻分析报告', -'dashboard.analysis.card.sentimentIndicators': '情绪指标', -'dashboard.analysis.card.sentimentReport': '情绪分析报告', -'dashboard.analysis.card.riskMetrics': '风险指标', -'dashboard.analysis.card.riskReport': '风险评估报告', -'dashboard.analysis.card.bullView': '看涨观点 (Bull)', -'dashboard.analysis.card.bearView': '看跌观点 (Bear)', -'dashboard.analysis.card.researchConclusion': '研究员结论', -'dashboard.analysis.card.traderPlan': '交易员计划', -'dashboard.analysis.card.riskDebate': '风险委员会辩论', -'dashboard.analysis.card.finalDecision': '最终决策 (Final Decision)', -'dashboard.analysis.card.tradePlanDetail': '交易计划详情', -'dashboard.analysis.tradingPlan.entry_price': '入场价格', -'dashboard.analysis.tradingPlan.position_size': '仓位大小', -'dashboard.analysis.tradingPlan.stop_loss': '止损', -'dashboard.analysis.tradingPlan.take_profit': '止盈', -'dashboard.analysis.label.confidence': '置信度', -'dashboard.analysis.label.keyPoints': '核心要点', -'dashboard.analysis.label.riskWarning': '风险提示', -'dashboard.analysis.risk.risky': '激进派观点 (Risky)', -'dashboard.analysis.risk.neutral': '中立派观点 (Neutral)', -'dashboard.analysis.risk.safe': '保守派观点 (Safe)', -'dashboard.analysis.risk.conclusion': '结论', -'dashboard.analysis.feature.fundamental': '基本面分析', -'dashboard.analysis.feature.technical': '技术分析', -'dashboard.analysis.feature.news': '新闻分析', -'dashboard.analysis.feature.sentiment': '情绪分析', -'dashboard.analysis.feature.risk': '风险评估', -'dashboard.analysis.watchlist.title': '我的自选股', -'dashboard.analysis.watchlist.add': '添加', -'dashboard.analysis.watchlist.addStock': '添加股票', -'dashboard.analysis.modal.addStock.title': '添加自选股', -'dashboard.analysis.modal.addStock.confirm': '确定', -'dashboard.analysis.modal.addStock.cancel': '取消', -'dashboard.analysis.modal.addStock.market': '市场类型', -'dashboard.analysis.modal.addStock.marketPlaceholder': '请选择市场', -'dashboard.analysis.modal.addStock.marketRequired': '请选择市场类型', -'dashboard.analysis.modal.addStock.symbol': '股票代码', -'dashboard.analysis.modal.addStock.symbolPlaceholder': '例如: AAPL, TSLA, GOOGL, 000001, BTC', -'dashboard.analysis.modal.addStock.symbolRequired': '请输入股票代码', -'dashboard.analysis.modal.addStock.searchPlaceholder': '搜索标的代码或名称', -'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': '搜索或输入标的代码(如:AAPL、BTC/USDT、EUR/USD)', -'dashboard.analysis.modal.addStock.searchOrInputHint': '支持搜索数据库中的标的,或直接输入代码(系统将自动获取名称)', -'dashboard.analysis.modal.addStock.search': '搜索', -'dashboard.analysis.modal.addStock.searchResults': '搜索结果', -'dashboard.analysis.modal.addStock.hotSymbols': '热门标的', -'dashboard.analysis.modal.addStock.noHotSymbols': '暂无热门标的', -'dashboard.analysis.modal.addStock.selectedSymbol': '已选标的', -'dashboard.analysis.modal.addStock.pleaseSelectSymbol': '请先选择一个标的', -'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': '请先选择一个标的或输入标的代码', -'dashboard.analysis.modal.addStock.pleaseEnterSymbol': '请输入标的代码', -'dashboard.analysis.modal.addStock.pleaseSelectMarket': '请先选择市场类型', -'dashboard.analysis.modal.addStock.searchFailed': '搜索失败,请稍后重试', -'dashboard.analysis.modal.addStock.noSearchResults': '未找到匹配的标的', -'dashboard.analysis.modal.addStock.willAutoFetchName': '系统将自动获取名称', -'dashboard.analysis.modal.addStock.addDirectly': '直接添加', -'dashboard.analysis.modal.addStock.nameWillBeFetched': '名称将在添加时自动获取', -'dashboard.analysis.market.AShare': 'A股', -'dashboard.analysis.market.USStock': '美股', -'dashboard.analysis.market.HShare': '港股', -'dashboard.analysis.market.Crypto': '加密货币', -'dashboard.analysis.market.Forex': '外汇', -'dashboard.analysis.market.Futures': '期货', -'dashboard.analysis.modal.history.title': '历史分析记录', -'dashboard.analysis.modal.history.viewResult': '查看结果', -'dashboard.analysis.modal.history.completeTime': '完成时间', -'dashboard.analysis.modal.history.error': '错误', -'dashboard.analysis.status.pending': '待处理', -'dashboard.analysis.status.processing': '处理中', -'dashboard.analysis.status.completed': '已完成', -'dashboard.analysis.status.failed': '失败', -'dashboard.analysis.message.selectSymbol': '请先选择标的', -'dashboard.analysis.message.taskCreated': '分析任务已创建,正在后台执行...', -'dashboard.analysis.message.analysisComplete': '分析完成', -'dashboard.analysis.message.analysisCompleteCache': '分析完成(使用缓存数据)', -'dashboard.analysis.message.analysisFailed': '分析失败,请稍后重试', -'dashboard.analysis.message.addStockSuccess': '添加成功', -'dashboard.analysis.message.addStockFailed': '添加失败', -'dashboard.analysis.message.removeStockSuccess': '移除成功', -'dashboard.analysis.message.removeStockFailed': '移除失败', -'dashboard.analysis.message.resumingAnalysis': '正在恢复分析任务...', -'dashboard.analysis.message.deleteSuccess': '删除成功', -'dashboard.analysis.message.deleteFailed': '删除失败', -'dashboard.analysis.modal.history.delete': '删除', -'dashboard.analysis.modal.history.deleteConfirm': '确定要删除这条分析记录吗?', -'dashboard.analysis.test': '工专路 {no} 号店', -'dashboard.analysis.introduce': '指标说明', -'dashboard.analysis.total-sales': '总销售额', -'dashboard.analysis.day-sales': '日均销售额¥', -'dashboard.analysis.visits': '访问量', -'dashboard.analysis.visits-trend': '访问量趋势', -'dashboard.analysis.visits-ranking': '门店访问量排名', -'dashboard.analysis.day-visits': '日访问量', -'dashboard.analysis.week': '周同比', -'dashboard.analysis.day': '日同比', -'dashboard.analysis.payments': '支付笔数', -'dashboard.analysis.conversion-rate': '转化率', -'dashboard.analysis.operational-effect': '运营活动效果', -'dashboard.analysis.sales-trend': '销售趋势', -'dashboard.analysis.sales-ranking': '门店销售额排名', -'dashboard.analysis.all-year': '全年', -'dashboard.analysis.all-month': '本月', -'dashboard.analysis.all-week': '本周', -'dashboard.analysis.all-day': '今日', -'dashboard.analysis.search-users': '搜索用户数', -'dashboard.analysis.per-capita-search': '人均搜索次数', -'dashboard.analysis.online-top-search': '线上热门搜索', -'dashboard.analysis.the-proportion-of-sales': '销售额类别占比', -'dashboard.analysis.dropdown-option-one': '操作一', -'dashboard.analysis.dropdown-option-two': '操作二', -'dashboard.analysis.channel.all': '全部渠道', -'dashboard.analysis.channel.online': '线上', -'dashboard.analysis.channel.stores': '门店', -'dashboard.analysis.sales': '销售额', -'dashboard.analysis.traffic': '客流量', -'dashboard.analysis.table.rank': '排名', -'dashboard.analysis.table.search-keyword': '搜索关键词', -'dashboard.analysis.table.users': '用户数', -'dashboard.analysis.table.weekly-range': '周涨幅', -'dashboard.indicator.selectSymbol': '选择或输入标的代码', -'dashboard.indicator.emptyWatchlistHint': '暂无自选股,请先添加', -'dashboard.indicator.hint.selectSymbol': '请选择标的开始分析', -'dashboard.indicator.hint.selectSymbolDesc': '在上方搜索框中选择或输入股票代码,查看K线图表和技术指标', -'dashboard.indicator.retry': '重试', -'dashboard.indicator.panel.title': '技术指标', -'dashboard.indicator.panel.realtimeOn': '关闭实时更新', -'dashboard.indicator.panel.realtimeOff': '开启实时更新', -'dashboard.indicator.panel.themeLight': '切换到深色主题', -'dashboard.indicator.panel.themeDark': '切换到浅色主题', -'dashboard.indicator.section.enabled': '已启用', -'dashboard.indicator.section.added': '我添加的指标', -'dashboard.indicator.section.custom': '自己创建的指标', -'dashboard.indicator.section.bought': '我选购的指标', -'dashboard.indicator.section.myCreated': '我创建的指标', -'dashboard.indicator.empty': '暂无指标,请先添加或创建指标', -'dashboard.indicator.buy': '购买指标', -'dashboard.indicator.action.start': '启动', -'dashboard.indicator.action.stop': '关闭', -'dashboard.indicator.action.edit': '编辑', -'dashboard.indicator.action.delete': '删除', -'dashboard.indicator.action.backtest': '回测', -'dashboard.indicator.status.normal': '正常', -'dashboard.indicator.status.normalPermanent': '正常(永久有效)', -'dashboard.indicator.status.expired': '已过期', -'dashboard.indicator.expiry.permanent': '永久有效', -'dashboard.indicator.expiry.noExpiry': '无到期时间', -'dashboard.indicator.expiry.expired': '已过期:{date}', -'dashboard.indicator.expiry.expiresOn': '到期时间:{date}', -'dashboard.indicator.delete.confirmTitle': '确认删除', -'dashboard.indicator.delete.confirmContent': '确定要删除指标"{name}"吗?此操作不可恢复。', -'dashboard.indicator.delete.confirmOk': '删除', -'dashboard.indicator.delete.confirmCancel': '取消', -'dashboard.indicator.delete.success': '删除成功', -'dashboard.indicator.delete.failed': '删除失败', -'dashboard.indicator.save.success': '保存成功', -'dashboard.indicator.save.failed': '保存失败', -'dashboard.indicator.error.loadWatchlistFailed': '加载自选股失败', -'dashboard.indicator.error.chartNotReady': '图表组件未初始化,请先选择标的并等待图表加载完成', -'dashboard.indicator.error.chartMethodNotReady': '图表组件方法未就绪,请稍后重试', -'dashboard.indicator.error.chartExecuteNotReady': '图表组件执行方法未就绪,请稍后重试', -'dashboard.indicator.error.parseFailed': '无法解析Python代码', -'dashboard.indicator.error.parseFailedCheck': '无法解析Python代码,请检查代码格式', -'dashboard.indicator.error.addIndicatorFailed': '添加指标失败', -'dashboard.indicator.error.runIndicatorFailed': '运行指标失败', -'dashboard.indicator.error.pleaseLogin': '请先登录', -'dashboard.indicator.error.loadDataFailed': '数据加载失败', -'dashboard.indicator.error.loadDataFailedDesc': '请检查网络连接', -'dashboard.indicator.error.tiingoSubscription': '外汇1分钟数据需要 Tiingo 付费订阅,请使用其他时间周期或升级订阅', -'dashboard.indicator.error.pythonEngineFailed': 'Python 引擎加载失败,指标功能可能无法使用', -'dashboard.indicator.error.chartInitFailed': '图表初始化失败', -'dashboard.indicator.warning.enterCode': '请先输入指标代码', -'dashboard.indicator.warning.pyodideLoadFailed': 'Python 引擎加载失败', -'dashboard.indicator.warning.pyodideLoadFailedDesc': '您当前所在区域或网络环境无法使用该功能', -'dashboard.indicator.warning.chartNotInitialized': '图表未初始化,无法使用画线工具', -'dashboard.indicator.success.runIndicator': '指标运行成功', -'dashboard.indicator.success.clearDrawings': '已清除所有画线', -'dashboard.indicator.sma': 'SMA (均线组合)', -'dashboard.indicator.ema': 'EMA (指数均线组合)', -'dashboard.indicator.rsi': 'RSI (相对强弱)', -'dashboard.indicator.macd': 'MACD', -'dashboard.indicator.bb': '布林带 (Bollinger Bands)', -'dashboard.indicator.atr': 'ATR (平均真实波幅)', -'dashboard.indicator.cci': 'CCI (商品通道指数)', -'dashboard.indicator.williams': 'Williams %R (威廉指标)', -'dashboard.indicator.mfi': 'MFI (资金流量指标)', -'dashboard.indicator.adx': 'ADX (平均趋向指数)', -'dashboard.indicator.obv': 'OBV (能量潮)', -'dashboard.indicator.adosc': 'ADOSC (积累/派发振荡器)', -'dashboard.indicator.ad': 'AD (积累/派发线)', -'dashboard.indicator.kdj': 'KDJ (随机指标)', -'dashboard.indicator.signal.buy': 'BUY', -'dashboard.indicator.signal.sell': 'SELL', -'dashboard.indicator.signal.supertrendBuy': 'SuperTrend Buy', -'dashboard.indicator.signal.supertrendSell': 'SuperTrend Sell', -'dashboard.indicator.chart.kline': 'K线', -'dashboard.indicator.chart.volume': '成交量', -'dashboard.indicator.chart.uptrend': 'Up Trend', -'dashboard.indicator.chart.downtrend': 'Down Trend', -'dashboard.indicator.tooltip.time': '时间', -'dashboard.indicator.tooltip.open': '开', -'dashboard.indicator.tooltip.close': '收', -'dashboard.indicator.tooltip.high': '高', -'dashboard.indicator.tooltip.low': '低', -'dashboard.indicator.tooltip.volume': '成交量', -'dashboard.indicator.drawing.line': '线段', -'dashboard.indicator.drawing.horizontalLine': '水平线', -'dashboard.indicator.drawing.verticalLine': '垂直线', -'dashboard.indicator.drawing.ray': '射线', -'dashboard.indicator.drawing.straightLine': '直线', -'dashboard.indicator.drawing.parallelLine': '平行线', -'dashboard.indicator.drawing.priceLine': '价格线', -'dashboard.indicator.drawing.priceChannel': '价格通道', -'dashboard.indicator.drawing.fibonacciLine': '斐波那契线', -'dashboard.indicator.drawing.clearAll': '清除所有画线', -'dashboard.indicator.market.AShare': 'A股', -'dashboard.indicator.market.USStock': '美股', -'dashboard.indicator.market.HShare': '港股', -'dashboard.indicator.market.Crypto': '加密货币', -'dashboard.indicator.market.Forex': '外汇', -'dashboard.indicator.market.Futures': '期货', -'dashboard.indicator.create': '创建指标', -'dashboard.indicator.editor.title': '创建/编辑指标', -'dashboard.indicator.editor.name': '指标名称', -'dashboard.indicator.editor.nameRequired': '请输入指标名称', -'dashboard.indicator.editor.namePlaceholder': '请输入指标名称', -'dashboard.indicator.editor.description': '指标描述', -'dashboard.indicator.editor.descriptionPlaceholder': '请输入指标描述(可选)', -'dashboard.indicator.editor.code': '指标脚本(Python)', -'dashboard.indicator.editor.codeRequired': '请输入指标代码', -'dashboard.indicator.editor.codePlaceholder': '请输入Python代码', -'dashboard.indicator.editor.run': '运行', -'dashboard.indicator.editor.runHint': '点击运行按钮可以在K线图上预览指标效果', -'dashboard.indicator.editor.guide': '开发指南', -'dashboard.indicator.editor.guideTitle': 'Python 指标开发指南', -'dashboard.indicator.editor.save': '保存', -'dashboard.indicator.editor.cancel': '取消', -'dashboard.indicator.editor.unnamed': '未命名指标', -'dashboard.indicator.editor.publishToCommunity': '发布到社区', -'dashboard.indicator.editor.publishToCommunityHint': '发布后,其他用户可以在社区中查看和使用您的指标', -'dashboard.indicator.editor.indicatorType': '指标类型', -'dashboard.indicator.editor.indicatorTypeRequired': '请选择指标类型', -'dashboard.indicator.editor.indicatorTypePlaceholder': '请选择指标类型', -'dashboard.indicator.editor.previewImage': '预览图', -'dashboard.indicator.editor.uploadImage': '上传图片', -'dashboard.indicator.editor.previewImageHint': '建议尺寸:800x400,大小不超过2MB', -'dashboard.indicator.editor.pricing': '售价(QDT)', -'dashboard.indicator.editor.pricingType.free': '免费', -'dashboard.indicator.editor.pricingType.permanent': '永久', -'dashboard.indicator.editor.pricingType.monthly': '月付', -'dashboard.indicator.editor.price': '价格', -'dashboard.indicator.editor.priceRequired': '请输入价格', -'dashboard.indicator.editor.pricePlaceholder': '请输入价格', -'dashboard.indicator.editor.pricingHint': '免费指标虽然价格为0,但平台会根据您的指标使用量和好评率给予奖励(QDT)', -'dashboard.indicator.editor.aiGenerate': '智能生成', -'dashboard.indicator.editor.aiPromptPlaceholder': '请描述你的信号逻辑(只输出 buy/sell)与绘图(plots)。仓位/风控/加减仓请在回测配置中设定。', -'dashboard.indicator.editor.aiGenerateBtn': 'AI生成代码', -'dashboard.indicator.editor.aiPromptRequired': '请输入您的想法', -'dashboard.indicator.editor.aiGenerateSuccess': '代码生成成功', -'dashboard.indicator.editor.aiGenerateError': '代码生成失败,请稍后重试', -'dashboard.indicator.editor.verifyCode': '代码检查', -'dashboard.indicator.editor.verifyCodeSuccess': '代码检查通过', -'dashboard.indicator.editor.verifyCodeFailed': '代码检查未通过', -'dashboard.indicator.editor.verifyCodeEmpty': '代码不能为空', -'dashboard.indicator.boundary.message': '提示:指标脚本只负责“计算 + 绘图 + buy/sell 信号”;仓位、风控、加减仓、手续费/滑点属于策略执行配置。', -'dashboard.indicator.boundary.indicatorRule': "指标脚本请只输出 buy/sell(并设定 df['buy']/df['sell'])。不要在脚本内撰写仓位管理、止盈止损、加减仓。", -'dashboard.indicator.boundary.backtestRule': '规则:同一根K线若出现主信号(buy/sell→开/平仓/反手),本K线将跳过所有加仓与减仓。', -'dashboard.indicator.backtest.title': '指标回测', -'dashboard.indicator.backtest.config': '回测参数', -'dashboard.indicator.backtest.startDate': '开始日期', -'dashboard.indicator.backtest.endDate': '结束日期', -'dashboard.indicator.backtest.selectStartDate': '选择开始日期', -'dashboard.indicator.backtest.selectEndDate': '选择结束日期', -'dashboard.indicator.backtest.startDateRequired': '请选择开始日期', -'dashboard.indicator.backtest.endDateRequired': '请选择结束日期', -'dashboard.indicator.backtest.initialCapital': '初始资金', -'dashboard.indicator.backtest.initialCapitalRequired': '请输入初始资金', -'dashboard.indicator.backtest.commission': '手续费率(%)', -'dashboard.indicator.backtest.commissionHint': '按名义价值(含杠杆)收取;每笔成交(开/平仓)都会从余额扣除。', -'dashboard.indicator.backtest.leverage': '杠杆倍率', -'dashboard.indicator.backtest.timeframe': 'K线周期', -'dashboard.indicator.backtest.tradeDirection': '交易方向', -'dashboard.indicator.backtest.longOnly': '做多', -'dashboard.indicator.backtest.shortOnly': '做空', -'dashboard.indicator.backtest.both': '双向', -'dashboard.indicator.backtest.run': '开始回测', -'dashboard.indicator.backtest.rerun': '重新回测', -'dashboard.indicator.backtest.close': '关闭', -'dashboard.indicator.backtest.running': '正在进行指标回测...', -'dashboard.indicator.backtest.loadingTip1': '正在获取历史K线数据...', -'dashboard.indicator.backtest.loadingTip2': '正在执行策略信号计算...', -'dashboard.indicator.backtest.loadingTip3': '正在模拟交易执行...', -'dashboard.indicator.backtest.loadingTip4': '正在计算回测指标...', -'dashboard.indicator.backtest.loadingTip5': '即将完成,请稍候...', -'dashboard.indicator.backtest.results': '回测结果', -'dashboard.indicator.backtest.totalReturn': '总收益率', -'dashboard.indicator.backtest.annualReturn': '年化收益', -'dashboard.indicator.backtest.maxDrawdown': '最大回撤', -'dashboard.indicator.backtest.sharpeRatio': '夏普比率', -'dashboard.indicator.backtest.winRate': '胜率', -'dashboard.indicator.backtest.profitFactor': '盈亏比', -'dashboard.indicator.backtest.totalTrades': '交易次数', -'dashboard.indicator.totalReturn': '总收益率', -'dashboard.indicator.annualReturn': '年化收益率', -'dashboard.indicator.maxDrawdown': '最大回撤', -'dashboard.indicator.sharpeRatio': '夏普比率', -'dashboard.indicator.winRate': '胜率', -'dashboard.indicator.profitFactor': '盈亏比', -'dashboard.indicator.totalTrades': '总交易次数', -'dashboard.indicator.backtest.totalCommission': '总手续费', -'dashboard.indicator.backtest.equityCurve': '收益曲线', -'dashboard.indicator.backtest.strategy': '指标收益', -'dashboard.indicator.backtest.benchmark': '基准收益', -'dashboard.indicator.backtest.tradeHistory': '交易记录', -'dashboard.indicator.backtest.tradeTime': '时间', -'dashboard.indicator.backtest.tradeType': '类型', -'dashboard.indicator.backtest.buy': '买入', -'dashboard.indicator.backtest.sell': '卖出', -'dashboard.indicator.backtest.liquidation': '爆仓', -'dashboard.indicator.backtest.openLong': '开多', -'dashboard.indicator.backtest.closeLong': '平多', -'dashboard.indicator.backtest.closeLongStop': '平多(止损)', -'dashboard.indicator.backtest.closeLongProfit': '平多(止盈)', -'dashboard.indicator.backtest.addLong': '加多仓', -'dashboard.indicator.backtest.openShort': '开空', -'dashboard.indicator.backtest.closeShort': '平空', -'dashboard.indicator.backtest.closeShortStop': '平空(止损)', -'dashboard.indicator.backtest.closeShortProfit': '平空(止盈)', -'dashboard.indicator.backtest.addShort': '加空仓', -'dashboard.indicator.backtest.price': '价格', -'dashboard.indicator.backtest.amount': '数量', -'dashboard.indicator.backtest.balance': '账户余额', -'dashboard.indicator.backtest.profit': '盈亏', -'dashboard.indicator.backtest.success': '回测完成', -'dashboard.indicator.backtest.failed': '回测失败,请稍后重试', -'dashboard.indicator.backtest.quickSelect': '快速选择', -// 多时间框架回测精度提示 -'dashboard.indicator.backtest.precisionMode': '回测精度模式', -'dashboard.indicator.backtest.estimatedCandles': '预计处理约 {count} 根K线', -'dashboard.indicator.backtest.highPrecisionDesc': '使用1分钟级别K线进行高精度回测,止损止盈触发更精确', -'dashboard.indicator.backtest.mediumPrecisionDesc': '回测区间超过30天,使用5分钟级别K线以平衡精度与性能', -'dashboard.indicator.backtest.standardModeWarning': '使用标准回测模式', -'dashboard.indicator.backtest.standardModeDesc': '当前配置不支持高精度回测,将使用策略K线进行回测', -'dashboard.indicator.backtest.onlyCryptoSupported': '高精度回测仅支持加密货币市场', -'dashboard.indicator.backtest.noIndicatorCode': '该指标没有可回测的代码', -'dashboard.indicator.backtest.noSymbol': '请先选择交易标的', -'dashboard.indicator.backtest.dateRangeExceeded': '回测时间范围超出限制:{timeframe}周期最多可回测{maxRange}', -'dashboard.indicator.backtest.dateRangeExceededDays': '回测时间范围超出限制:{timeframe}周期最多可回测{maxRange}({maxDays}天)', -'dashboard.indicator.backtest.metaLine': '标的:{symbol} | 市场:{market} | 周期:{timeframe}', -'dashboard.indicator.backtest.savedRunId': '回测已保存,记录ID:{id}', -'dashboard.indicator.backtest.historyTitle': '回测记录', -'dashboard.indicator.backtest.historyRefresh': '刷新', -'dashboard.indicator.backtest.historyView': '查看', -'dashboard.indicator.backtest.historyNoData': '暂无回测记录', -'dashboard.indicator.backtest.historyUseCurrent': '仅目前币种/周期', -'dashboard.indicator.backtest.historyFilterSymbol': '币种(Symbol)', -'dashboard.indicator.backtest.historyFilterTimeframe': '周期(Timeframe)', -'dashboard.indicator.backtest.historyApply': '应用筛选', -'dashboard.indicator.backtest.historyAIAnalyze': 'AI分析', -'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI 分析建议', -'dashboard.indicator.backtest.historyNoAIResult': '暂无 AI 分析结果', -'dashboard.indicator.backtest.historyRunId': '记录ID', -'dashboard.indicator.backtest.historyCreatedAt': '时间', -'dashboard.indicator.backtest.historyRange': '区间', -'dashboard.indicator.backtest.historyStatus': '状态', -'dashboard.indicator.backtest.historyStatusSuccess': '成功', -'dashboard.indicator.backtest.historyStatusFailed': '失败', -'dashboard.indicator.backtest.historyActions': '操作', -'dashboard.indicator.backtest.prev': '上一步', -'dashboard.indicator.backtest.next': '下一步', -'dashboard.indicator.backtest.steps.strategy.title': '执行配置', -'dashboard.indicator.backtest.steps.strategy.desc': '仓位/风控/加减仓(策略层)', -'dashboard.indicator.backtest.steps.trading.title': '回测环境', -'dashboard.indicator.backtest.steps.trading.desc': '时间/资金/费率/杠杆/滑点', -'dashboard.indicator.backtest.steps.results.title': '结果', -'dashboard.indicator.backtest.steps.results.desc': '统计与交易明细', -'dashboard.indicator.backtest.panel.risk': '执行配置:风控(止损/移动止盈)', -'dashboard.indicator.backtest.panel.scale': '执行配置:加仓(顺势/逆势)', -'dashboard.indicator.backtest.panel.reduce': '执行配置:减仓(顺势/逆势)', -'dashboard.indicator.backtest.panel.position': '执行配置:开仓仓位', -'dashboard.indicator.backtest.field.stopLossPct': '止损(%)', -'dashboard.indicator.backtest.field.takeProfitPct': '止盈(%)', -'dashboard.indicator.backtest.field.trailingEnabled': '移动止盈', -'dashboard.indicator.backtest.field.trailingStopPct': '移动回撤(%)', -'dashboard.indicator.backtest.field.trailingActivationPct': '移动止盈激活(%)', -'dashboard.indicator.backtest.field.slippage': '滑点(%)', -'dashboard.indicator.backtest.field.trendAddEnabled': '顺势加仓', -'dashboard.indicator.backtest.field.dcaAddEnabled': '逆势加仓', -'dashboard.indicator.backtest.field.trendAddStepPct': '加仓触发(%)', -'dashboard.indicator.backtest.field.dcaAddStepPct': '加仓触发(%)', -'dashboard.indicator.backtest.field.trendAddSizePct': '每次加仓资金占比(%)', -'dashboard.indicator.backtest.field.dcaAddSizePct': '每次加仓资金占比(%)', -'dashboard.indicator.backtest.field.trendAddMaxTimes': '最多加仓次数', -'dashboard.indicator.backtest.field.dcaAddMaxTimes': '最多加仓次数', -'dashboard.indicator.backtest.field.trendReduceEnabled': '顺势减仓', -'dashboard.indicator.backtest.field.adverseReduceEnabled': '逆势减仓', -'dashboard.indicator.backtest.field.trendReduceStepPct': '顺势触发(%)', -'dashboard.indicator.backtest.field.adverseReduceStepPct': '逆势触发(%)', -'dashboard.indicator.backtest.field.trendReduceSizePct': '每次减仓比例(%)', -'dashboard.indicator.backtest.field.adverseReduceSizePct': '每次逆势减仓比例(%)', -'dashboard.indicator.backtest.field.trendReduceMaxTimes': '最多顺势减仓次数', -'dashboard.indicator.backtest.field.adverseReduceMaxTimes': '最多逆势减仓次数', -'dashboard.indicator.backtest.field.entryPct': '开仓资金占比(%)', -'dashboard.indicator.backtest.field.minOrderPct': '单次最小资金占比(%)(可选)', -'dashboard.indicator.backtest.hint.entryPctMax': '最大可开仓:{maxPct}%(为后续加仓预留资金)', -'dashboard.indicator.backtest.closeLongTrailing': '平多(移动止损/止盈)', -'dashboard.indicator.backtest.reduceLong': '多头减仓', -'dashboard.indicator.backtest.closeShortTrailing': '平空(移动止损/止盈)', -'dashboard.indicator.backtest.reduceShort': '空头减仓', -'dashboard.docs.title': '文档中心', -'dashboard.docs.search.placeholder': '搜索文档...', -'dashboard.docs.category.all': '全部', -'dashboard.docs.category.guide': '开发指南', -'dashboard.docs.category.api': 'API文档', -'dashboard.docs.category.tutorial': '教程', -'dashboard.docs.category.faq': '常见问题', -'dashboard.docs.featured.title': '推荐文档', -'dashboard.docs.featured.tag': '推荐', -'dashboard.docs.list.views': '浏览', -'dashboard.docs.list.author': '作者', -'dashboard.docs.list.empty': '暂无文档', -'dashboard.docs.list.backToAll': '返回全部文档', -'dashboard.docs.list.total': '共 {count} 篇文档', -'dashboard.docs.detail.back': '返回文档列表', -'dashboard.docs.detail.updatedAt': '更新于', -'dashboard.docs.detail.related': '相关文档', -'dashboard.docs.detail.notFound': '文档不存在', -'dashboard.docs.detail.error': '文档不存在或已被删除', -'dashboard.docs.search.result': '搜索结果', -'dashboard.docs.search.keyword': '关键词', -'community.filter.indicatorType': '指标类型', -'community.filter.all': '全部', -'community.filter.other': '其他选项', -'community.filter.pricing': '定价类型', -'community.filter.allPricing': '全部定价', -'community.filter.sortBy': '排序方式', -'community.filter.search': '搜索', -'community.filter.searchPlaceholder': '搜索指标名称', -'community.indicatorType.trend': '趋势型', -'community.indicatorType.momentum': '动量型', -'community.indicatorType.volatility': '波动率', -'community.indicatorType.volume': '成交量', -'community.indicatorType.custom': '自定义', -'community.pricing.free': '免费', -'community.pricing.paid': '付费', -'community.sort.downloads': '下载量', -'community.sort.rating': '评分', -'community.sort.newest': '最新发布', -'community.pagination.total': '共 {total} 个指标', -'community.noDescription': '暂无描述', -'community.detail.type': '类型', -'community.detail.pricing': '定价', -'community.detail.rating': '评分', -'community.detail.downloads': '下载量', -'community.detail.author': '作者', -'community.detail.description': '简介', -'community.detail.detailContent': '详细说明', -'community.detail.backtestStats': '回测统计', -'community.action.purchase': '购买指标', -'community.action.addToMyIndicators': '添加到我的指标', -'community.action.favorite': '收藏', -'community.action.unfavorite': '取消收藏', -'community.action.buyNow': '立即购买', -'community.action.renew': '续费', -'community.purchase.price': '价格', -'community.purchase.permanent': '永久', -'community.purchase.monthly': '月', -'community.purchase.confirmBuy': '确认购买该指标({price} QDT)?', -'community.purchase.confirmRenew': '确认续费该指标({price} QDT/月)?', -'community.purchase.confirmFree': '确认添加该免费指标?', -'community.purchase.confirmTitle': '确认操作', -'community.purchase.owned': '您已购买该指标(永久有效)', -'community.purchase.ownIndicator': '这是您发布的指标', -'community.purchase.expired': '您的订阅已过期', -'community.purchase.expiresOn': '到期时间:{date}', -'community.tabs.detail': '指标详情', -'community.tabs.backtest': '回测数据', -'community.tabs.ratings': '用户评价', -'community.rating.myRating': '我的评分', -'community.rating.stars': '{count} 星', -'community.rating.commentPlaceholder': '分享您的使用体验...', -'community.rating.submit': '提交评分', -'community.rating.modify': '修改', -'community.rating.saveModify': '保存修改', -'community.rating.cancel': '取消', -'community.rating.selectRating': '请选择评分', -'community.rating.success': '评分成功', -'community.rating.modifySuccess': '修改评价成功', -'community.rating.failed': '评分失败', -'community.rating.noRatings': '暂无评价', -'community.backtest.note': '以上数据为历史回测结果,仅供参考,不代表未来收益', -'community.backtest.noData': '暂无回测数据', -'community.backtest.uploadHint': '作者尚未上传回测数据', -'community.message.loadFailed': '加载指标列表失败', -'community.message.purchaseProcessing': '正在处理购买请求...', -'community.message.downloadSuccess': '指标已添加到我的指标列表', -'community.message.favoriteSuccess': '收藏成功', -'community.message.unfavoriteSuccess': '取消收藏成功', -'community.message.operationSuccess': '操作成功', -'community.message.operationFailed': '操作失败', -'community.banner.readOnly': '仅供浏览', -'community.banner.loginHint': '如需登录注册请点击按钮跳转到独立页面,从而避免CSRF问题', -'community.banner.jumpButton': '跳转到登录/注册', -'dashboard.totalEquity': '总权益', -'dashboard.totalPnL': '总盈亏', -'dashboard.aiStrategies': 'AI 策略', -'dashboard.indicatorStrategies': '指标策略', -'dashboard.running': '运行中', -'dashboard.enabled': '已启用', -'dashboard.pnlHistory': '历史盈亏', -'dashboard.strategyPerformance': '策略盈亏占比', -'dashboard.drawdown': '回撤曲线', -'dashboard.strategyRanking': '策略排行榜', -// New KPI labels -'dashboard.winRate': '胜率', -'dashboard.profitFactor': '盈亏比', -'dashboard.maxDrawdown': '最大回撤', -'dashboard.totalTrades': '总交易', -'dashboard.runningStrategies': '运行中策略', -'dashboard.equityCurve': '权益曲线', -'dashboard.strategyAllocation': '策略分布', -'dashboard.drawdownCurve': '回撤曲线', -'dashboard.hourlyDistribution': '交易时段', -// Chart labels -'dashboard.dailyPnl': '日盈亏', -'dashboard.cumulativePnl': '累计盈亏', -'dashboard.tradeCount': '交易次数', -'dashboard.profit': '盈亏', -'dashboard.noData': '暂无数据', -'dashboard.noStrategyData': '暂无策略数据', -// Ranking labels -'dashboard.ranking.totalProfit': '总收益', -'dashboard.ranking.roi': '收益率', -'dashboard.ranking.trades': '交易数', -// Units and labels -'dashboard.unit.trades': '笔', -'dashboard.unit.strategies': '个', -'dashboard.label.avgDaily': '日均', -'dashboard.label.avgProfit': '平均盈利', -'dashboard.label.win': '胜', -'dashboard.label.lose': '负', -'dashboard.label.trade': '交易', -'dashboard.label.indicator': '指标', -'dashboard.label.totalPnl': '总盈亏', -'dashboard.label.maxDrawdownPoint': '最大回撤', -'dashboard.profitCalendar': '收益日历', -'dashboard.recentTrades': '最近交易', -'dashboard.currentPositions': '当前持仓', -'dashboard.table.time': '时间', -'dashboard.table.strategy': '策略名称', -'dashboard.table.symbol': '标的', -'dashboard.table.type': '类型', -'dashboard.table.side': '方向', -'dashboard.table.size': '持仓量', -'dashboard.table.entryPrice': '开仓均价', -'dashboard.table.price': '价格', -'dashboard.table.amount': '数量', -'dashboard.table.profit': '盈亏', -'dashboard.pendingOrders': '订单执行记录', -'dashboard.totalOrders': '共 {total} 条', -'dashboard.viewError': '查看错误', -'dashboard.filled': '已成交', -'dashboard.orderTable.time': '创建时间', -'dashboard.orderTable.strategy': '策略', -'dashboard.orderTable.symbol': '交易对', -'dashboard.orderTable.signalType': '信号类型', -'dashboard.orderTable.amount': '数量', -'dashboard.orderTable.price': '成交价', -'dashboard.orderTable.status': '状态', -'dashboard.orderTable.timeInfo': '时间', -'dashboard.orderTable.executedAt': '执行时间', -'dashboard.orderTable.exchange': '交易所', -'dashboard.orderTable.notify': '通知方式', -'dashboard.orderTable.actions': '操作', -'dashboard.orderTable.delete': '删除', -'dashboard.orderTable.deleteConfirm': '确认删除这条记录?', -'dashboard.orderTable.deleteSuccess': '删除成功', -'dashboard.orderTable.deleteFailed': '删除失败', -'dashboard.newOrderNotify': '新订单提醒', -'dashboard.newOrderDesc': '有新的订单执行记录', -'dashboard.soundEnabled': '声音提醒已开启', -'dashboard.soundDisabled': '声音提醒已关闭', -'dashboard.clickToMute': '点击关闭声音提醒', -'dashboard.clickToUnmute': '点击开启声音提醒', -'dashboard.signalType.openLong': '开多', -'dashboard.signalType.openShort': '开空', -'dashboard.signalType.closeLong': '平多', -'dashboard.signalType.closeShort': '平空', -'dashboard.signalType.addLong': '加多', -'dashboard.signalType.addShort': '加空', -'dashboard.status.pending': '待处理', -'dashboard.status.processing': '处理中', -'dashboard.status.completed': '已完成', -'dashboard.status.failed': '失败', -'dashboard.status.cancelled': '已取消', -'dashboard.table.pnl': '未实现盈亏', -'form.basic-form.basic.title': '基础表单', -'form.basic-form.basic.description': '表单页用于向用户收集或验证信息,基础表单常见于数据项较少的表单场景。', -'form.basic-form.title.label': '标题', -'form.basic-form.title.placeholder': '给目标起个名字', -'form.basic-form.title.required': '请输入标题', -'form.basic-form.date.label': '起止日期', -'form.basic-form.placeholder.start': '开始日期', -'form.basic-form.placeholder.end': '结束日期', -'form.basic-form.date.required': '请选择起止日期', -'form.basic-form.goal.label': '目标描述', -'form.basic-form.goal.placeholder': '请输入你的阶段性工作目标', -'form.basic-form.goal.required': '请输入目标描述', -'form.basic-form.standard.label': '衡量标准', -'form.basic-form.standard.placeholder': '请输入衡量标准', -'form.basic-form.standard.required': '请输入衡量标准', -'form.basic-form.client.label': '客户', -'form.basic-form.client.required': '请描述你服务的客户', -'form.basic-form.label.tooltip': '目标的服务对象', -'form.basic-form.client.placeholder': '请描述你服务的客户,内部客户直接 @姓名/工号', -'form.basic-form.invites.label': '邀评人', -'form.basic-form.invites.placeholder': '请直接 @姓名/工号,最多可邀请 5 人', -'form.basic-form.weight.label': '权重', -'form.basic-form.weight.placeholder': '请输入', -'form.basic-form.public.label': '目标公开', -'form.basic-form.label.help': '客户、邀评人默认被分享', -'form.basic-form.radio.public': '公开', -'form.basic-form.radio.partially-public': '部分公开', -'form.basic-form.radio.private': '不公开', -'form.basic-form.publicUsers.placeholder': '公开给', -'form.basic-form.option.A': '同事一', -'form.basic-form.option.B': '同事二', -'form.basic-form.option.C': '同事三', -'form.basic-form.email.required': '请输入邮箱地址!', -'form.basic-form.email.wrong-format': '邮箱地址格式错误!', -'form.basic-form.userName.required': '请输入用户名!', -'form.basic-form.password.required': '请输入密码!', -'form.basic-form.password.twice': '两次输入的密码不匹配!', -'form.basic-form.strength.msg': '请至少输入 6 个字符。请不要使用容易被猜到的密码。', -'form.basic-form.strength.strong': '强度:强', -'form.basic-form.strength.medium': '强度:中', -'form.basic-form.strength.short': '强度:太短', -'form.basic-form.confirm-password.required': '请确认密码!', -'form.basic-form.phone-number.required': '请输入手机号!', -'form.basic-form.phone-number.wrong-format': '手机号格式错误!', -'form.basic-form.verification-code.required': '请输入验证码!', -'form.basic-form.form.get-captcha': '获取验证码', -'form.basic-form.captcha.second': '秒', -'form.basic-form.form.optional': '(选填)', -'form.basic-form.form.submit': '提交', -'form.basic-form.form.save': '保存', -'form.basic-form.email.placeholder': '邮箱', -'form.basic-form.password.placeholder': '至少6位密码,区分大小写', -'form.basic-form.confirm-password.placeholder': '确认密码', -'form.basic-form.phone-number.placeholder': '手机号', -'form.basic-form.verification-code.placeholder': '验证码', -'result.success.title': '提交成功', -'result.success.description': '提交结果页用于反馈一系列操作任务的处理结果, 如果仅是简单操作,使用 Message 全局提示反馈即可。 本文字区域可以展示简单的补充说明,如果有类似展示 “单据”的需求,下面这个灰色区域可以呈现比较复杂的内容。', -'result.success.operate-title': '项目名称', -'result.success.operate-id': '项目 ID', -'result.success.principal': '负责人', -'result.success.operate-time': '生效时间', -'result.success.step1-title': '创建项目', -'result.success.step1-operator': '曲丽丽', -'result.success.step2-title': '部门初审', -'result.success.step2-operator': '周毛毛', -'result.success.step2-extra': '催一下', -'result.success.step3-title': '财务复核', -'result.success.step4-title': '完成', -'result.success.btn-return': '返回列表', -'result.success.btn-project': '查看项目', -'result.success.btn-print': '打印', -'result.fail.error.title': '提交失败', -'result.fail.error.description': '请核对并修改以下信息后,再重新提交。', -'result.fail.error.hint-title': '您提交的内容有如下错误:', -'result.fail.error.hint-text1': '您的账户已被冻结', -'result.fail.error.hint-btn1': '立即解冻', -'result.fail.error.hint-text2': '您的账户还不具备申请资格', -'result.fail.error.hint-btn2': '立即升级', -'result.fail.error.btn-text': '返回修改', -'account.settings.menuMap.custom': '个性化', -'account.settings.menuMap.binding': '账号绑定', -'account.settings.basic.avatar': '头像', -'account.settings.basic.change-avatar': '更换头像', -'account.settings.basic.email': '邮箱', -'account.settings.basic.email-message': '请输入您的邮箱!', -'account.settings.basic.nickname': '昵称', -'account.settings.basic.nickname-message': '请输入您的昵称!', -'account.settings.basic.profile': '个人简介', -'account.settings.basic.profile-message': '请输入个人简介!', -'account.settings.basic.profile-placeholder': '个人简介', -'account.settings.basic.country': '国家/地区', -'account.settings.basic.country-message': '请输入您的国家或地区!', -'account.settings.basic.geographic': '所在省市', -'account.settings.basic.geographic-message': '请输入您的所在省市!', -'account.settings.basic.address': '街道地址', -'account.settings.basic.address-message': '请输入您的街道地址!', -'account.settings.basic.phone': '联系电话', -'account.settings.basic.phone-message': '请输入您的联系电话!', -'account.settings.basic.update': '更新基本信息', -'account.settings.basic.update.success': '更新基本信息成功', -'account.settings.security.strong': '强', -'account.settings.security.medium': '中', -'account.settings.security.weak': '弱', -'account.settings.security.password': '账户密码', -'account.settings.security.password-description': '当前密码强度:', -'account.settings.security.phone': '密保手机', -'account.settings.security.phone-description': '已绑定手机:', -'account.settings.security.question': '密保问题', -'account.settings.security.question-description': '未设置密保问题,密保问题可有效保护账户安全', -'account.settings.security.email': '绑定邮箱', -'account.settings.security.email-description': '已绑定邮箱:', -'account.settings.security.mfa': 'MFA 设备', -'account.settings.security.mfa-description': '未绑定 MFA 设备,绑定后,可以进行二次确认', -'account.settings.security.modify': '修改', -'account.settings.security.set': '设置', -'account.settings.security.bind': '绑定', -'account.settings.binding.taobao': '绑定淘宝', -'account.settings.binding.taobao-description': '当前未绑定淘宝账号', -'account.settings.binding.alipay': '绑定支付宝', -'account.settings.binding.alipay-description': '当前未绑定支付宝账号', -'account.settings.binding.dingding': '绑定钉钉', -'account.settings.binding.dingding-description': '当前未绑定钉钉账号', -'account.settings.binding.bind': '绑定', -'account.settings.notification.password': '账户密码', -'account.settings.notification.password-description': '其他用户的消息将以站内信的形式通知', -'account.settings.notification.messages': '系统消息', -'account.settings.notification.messages-description': '系统消息将以站内信的形式通知', -'account.settings.notification.todo': '待办任务', -'account.settings.notification.todo-description': '待办任务将以站内信的形式通知', -'account.settings.settings.open': '开', -'account.settings.settings.close': '关', -'trading-assistant.title': '交易助手', -'trading-assistant.strategyList': '策略列表', -'trading-assistant.createStrategy': '创建策略', -'trading-assistant.noStrategy': '暂无策略', -'trading-assistant.selectStrategy': '请从左侧选择一个策略查看详情', -'trading-assistant.startStrategy': '启动策略', -'trading-assistant.stopStrategy': '停止策略', -'trading-assistant.editStrategy': '编辑策略', -'trading-assistant.deleteStrategy': '删除策略', -'trading-assistant.startAll': '全部启动', -'trading-assistant.stopAll': '全部停止', -'trading-assistant.deleteAll': '全部删除', -'trading-assistant.symbolCount': '个币种', -'trading-assistant.status.running': '运行中', -'trading-assistant.status.stopped': '已停止', -'trading-assistant.status.error': '错误', -'trading-assistant.strategyType.IndicatorStrategy': '技术指标策略', -'trading-assistant.strategyType.PromptBasedStrategy': '提示词策略', -'trading-assistant.strategyType.GridStrategy': '网格策略', -'trading-assistant.tabs.tradingRecords': '交易记录', -'trading-assistant.tabs.positions': '持仓记录', -'trading-assistant.tabs.equityCurve': '净值曲线', -'trading-assistant.form.step1': '选择指标', -'trading-assistant.form.step2': '交易所配置', -'trading-assistant.form.step3': '策略参数', -'trading-assistant.form.step2Params': '策略参数', -'trading-assistant.form.step3Signal': '信号通知', -'trading-assistant.form.indicator': '选择指标', -'trading-assistant.form.indicatorHint': '只能选择您已购买或创建的技术指标', -'trading-assistant.form.qdtCostHints': '使用策略将消耗QDT,请确保账户有足够的QDT余额', -'trading-assistant.form.indicatorDescription': '指标描述', -'trading-assistant.form.noDescription': '暂无描述', -'trading-assistant.form.exchange': '选择交易所', -'trading-assistant.form.apiKey': 'API Key', -'trading-assistant.form.secretKey': 'Secret Key', -'trading-assistant.form.passphrase': 'Passphrase', -'trading-assistant.form.testConnection': '测试连接', -'trading-assistant.form.strategyName': '策略名称', -'trading-assistant.form.symbol': '交易对', -'trading-assistant.form.symbols': '交易对(多选)', -'trading-assistant.form.symbolHint': '目前仅支持加密货币交易对', -'trading-assistant.form.symbolHintCrypto': '加密货币:使用BTC/USDT等交易对格式', -'trading-assistant.form.symbolsHint': '选择多个交易对,将自动创建多个策略', -'trading-assistant.form.initialCapital': '投入金额', -'trading-assistant.form.marketType': '市场类型', -'trading-assistant.form.marketTypeFutures': '合约', -'trading-assistant.form.marketTypeSpot': '现货', -'trading-assistant.form.marketTypeHint': '合约支持双向交易和杠杆,现货仅支持做多且杠杆固定为1倍', -'trading-assistant.form.leverage': '杠杆倍数', -'trading-assistant.form.leverageHint': '合约:1-125倍,现货:固定1倍', -'trading-assistant.form.spotLeverageFixed': '现货交易杠杆固定为1倍', -'trading-assistant.form.spotOnlyLongHint': '现货交易仅支持做多', -'trading-assistant.form.tradeDirection': '交易方向', -'trading-assistant.form.tradeDirectionLong': '仅做多', -'trading-assistant.form.tradeDirectionShort': '仅做空', -'trading-assistant.form.tradeDirectionBoth': '双向交易', -'trading-assistant.form.timeframe': '时间周期', -'trading-assistant.form.klinePeriod': 'K线周期', -'trading-assistant.form.timeframe1m': '1分钟', -'trading-assistant.form.timeframe5m': '5分钟', -'trading-assistant.form.timeframe15m': '15分钟', -'trading-assistant.form.timeframe30m': '30分钟', -'trading-assistant.form.timeframe1H': '1小时', -'trading-assistant.form.timeframe4H': '4小时', -'trading-assistant.form.timeframe1D': '1天', -'trading-assistant.form.selectStrategyType': '选择策略类型', -'trading-assistant.form.indicatorStrategy': '指标策略', -'trading-assistant.form.indicatorStrategyDesc': '基于技术指标的自动化交易策略', -'trading-assistant.form.aiStrategy': 'AI策略', -'trading-assistant.form.aiStrategyDesc': '基于AI智能决策的自动化交易策略', -'trading-assistant.form.enableAiFilter': '启用AI智能决策过滤', -'trading-assistant.form.enableAiFilterHint': '启用后,指标信号将经过AI智能过滤,提高交易质量', -'trading-assistant.form.aiFilterPrompt': '自定义提示词', -'trading-assistant.form.aiFilterPromptHint': '为AI过滤提供自定义指令,留空则使用系统默认', -'trading-assistant.form.executionMode': '执行模式', -'trading-assistant.form.executionModeSignal': '仅信号通知', -'trading-assistant.form.executionModeLive': '实盘自动交易', -'trading-assistant.form.liveTradingCryptoOnlyHint': '实盘交易功能仅支持加密货币市场', -'trading-assistant.form.liveTradingNotSupportedHint': '当前市场不支持实盘交易', -'trading-assistant.form.broker': '券商', -'trading-assistant.form.ibkrConnectionTitle': '盈透证券连接配置', -'trading-assistant.form.ibkrConnectionHint': '请确保 TWS 或 IB Gateway 已启动并启用 API 连接', -'trading-assistant.validation.brokerRequired': '请选择券商', -'trading-assistant.placeholders.selectBroker': '选择券商', -'trading-assistant.brokerNames': { - 'ibkr': '盈透证券 (Interactive Brokers)', - 'mt5': 'MetaTrader 5 (MT5)', - 'mt4': 'MetaTrader 4 (MT4)', - 'futu': '富途证券 (Futu)', - 'tiger': '老虎证券 (Tiger Brokers)', - 'td': 'TD Ameritrade', - 'schwab': 'Charles Schwab' -}, -'trading-assistant.form.ibkrHost': '主机地址', -'trading-assistant.form.ibkrPort': '端口', -'trading-assistant.form.ibkrPortHint': 'TWS实盘:7497, TWS模拟:7496, Gateway实盘:4001, Gateway模拟:4002', -'trading-assistant.form.ibkrClientId': '客户端ID', -'trading-assistant.form.ibkrAccount': '账户号', -'trading-assistant.form.ibkrAccountHint': '留空自动选择第一个账户,多账户用户可指定账户号', -'trading-assistant.placeholders.ibkrAccount': '可选,如 U1234567', -'trading-assistant.exchange.ibkrConnectionSuccess': '盈透证券连接成功', -'trading-assistant.exchange.ibkrConnectionFailed': '盈透证券连接失败,请检查 TWS/Gateway 是否运行', -// MT5/Forex 配置 -'trading-assistant.form.forexBroker': '外汇券商', -'trading-assistant.form.mt5ConnectionTitle': 'MetaTrader 5 连接配置', -'trading-assistant.form.mt5ConnectionHint': '请确保 MT5 终端已启动并登录(仅支持 Windows)', -'trading-assistant.form.mt5Server': '服务器', -'trading-assistant.form.mt5ServerHint': '券商服务器名称(如:ICMarkets-Demo)', -'trading-assistant.form.mt5Login': '账户号', -'trading-assistant.form.mt5Password': '密码', -'trading-assistant.form.mt5TerminalPath': 'MT5 终端路径(可选)', -'trading-assistant.form.mt5TerminalPathHint': '如果 MT5 终端未安装在默认位置,请指定 terminal64.exe 的完整路径(例如:C:\\Program Files\\MetaTrader 5\\terminal64.exe)', -'trading-assistant.placeholders.mt5Server': '例如:ICMarkets-Demo', -'trading-assistant.placeholders.mt5Login': '例如:12345678', -'trading-assistant.placeholders.mt5Password': '您的 MT5 密码', -'trading-assistant.placeholders.mt5TerminalPath': '例如:C:\\Program Files\\MetaTrader 5\\terminal64.exe', -'trading-assistant.validation.mt5ServerRequired': '请输入 MT5 服务器', -'trading-assistant.validation.mt5LoginRequired': '请输入 MT5 账户号', -'trading-assistant.validation.mt5PasswordRequired': '请输入 MT5 密码', -'trading-assistant.exchange.mt5ConnectionSuccess': 'MT5 连接成功', -'trading-assistant.exchange.mt5ConnectionFailed': 'MT5 连接失败,请检查终端是否运行', -'trading-assistant.form.notifyChannels': '通知渠道', -'trading-assistant.form.notifyChannelsHint': '选择信号触发时的通知方式', -'trading-assistant.form.notifyEmail': '邮箱地址', -'trading-assistant.form.notifyPhone': '手机号码', -'trading-assistant.form.notifyTelegram': 'Telegram ID', -'trading-assistant.form.notifyDiscord': 'Discord Webhook', -'trading-assistant.form.notifyWebhook': 'Webhook 地址', -'trading-assistant.form.liveTradingConfigTitle': '实盘交易配置', -'trading-assistant.form.liveTradingConfigHint': '请填写交易所API信息,实盘交易将使用您的API进行真实交易', -'trading-assistant.form.savedCredential': '已保存的凭证', -'trading-assistant.form.savedCredentialHint': '选择已保存的交易所凭证,自动填充API配置', -'trading-assistant.form.saveCredential': '保存此凭证以便下次使用', -'trading-assistant.form.credentialName': '凭证名称', -'trading-assistant.validation.strategyTypeRequired': '请选择策略类型', -'trading-assistant.form.advancedSettings': '高级设置', -'trading-assistant.form.orderMode': '下单模式', -'trading-assistant.form.orderModeMaker': '挂单(Maker)', -'trading-assistant.form.orderModeTaker': '市价(Taker)', -'trading-assistant.form.orderModeHint': '挂单模式使用限价单,手续费更低;市价模式立即成交,手续费较高', -'trading-assistant.form.makerWaitSec': '挂单等待时间(秒)', -'trading-assistant.form.makerWaitSecHint': '挂单后等待成交的时间,超时后取消并重试', -'trading-assistant.form.makerRetries': '挂单重试次数', -'trading-assistant.form.makerRetriesHint': '挂单未成交时的最大重试次数', -'trading-assistant.form.fallbackToMarket': '挂单失败降级市价', -'trading-assistant.form.fallbackToMarketHint': '开/平仓挂单未成交时,是否降级为市价单以确保成交', -'trading-assistant.form.marginMode': '保证金模式', -'trading-assistant.form.marginModeCross': '全仓', -'trading-assistant.form.marginModeIsolated': '逐仓', -'trading-assistant.form.stopLossPct': '止损比例(%)', -'trading-assistant.form.stopLossPctHint': '设置止损百分比,0表示不启用止损', -'trading-assistant.form.takeProfitPct': '止盈比例(%)', -'trading-assistant.form.takeProfitPctHint': '设置止盈百分比,0表示不启用止盈', -'trading-assistant.form.signalMode': '信号模式', -'trading-assistant.form.signalModeConfirmed': '确认模式', -'trading-assistant.form.signalModeAggressive': '激进模式', -'trading-assistant.form.signalModeHint': '确认模式:仅检查已完成的K线;激进模式:也检查正在形成的K线', -'trading-assistant.form.cancel': '取消', -'trading-assistant.form.prev': '上一步', -'trading-assistant.form.next': '下一步', -'trading-assistant.form.confirmCreate': '确认创建', -'trading-assistant.form.confirmEdit': '确认修改', -'trading-assistant.messages.createSuccess': '策略创建成功', -'trading-assistant.messages.createFailed': '创建策略失败', -'trading-assistant.messages.updateSuccess': '策略更新成功', -'trading-assistant.messages.updateFailed': '更新策略失败', -'trading-assistant.messages.deleteSuccess': '策略删除成功', -'trading-assistant.messages.deleteFailed': '删除策略失败', -'trading-assistant.messages.startSuccess': '策略启动成功', -'trading-assistant.messages.startFailed': '启动策略失败', -'trading-assistant.messages.stopSuccess': '策略停止成功', -'trading-assistant.messages.stopFailed': '停止策略失败', -'trading-assistant.messages.loadFailed': '获取策略列表失败', -'trading-assistant.messages.runningWarning': '策略运行中,请先停止策略后再修改', -'trading-assistant.messages.deleteConfirmWithName': '确定要删除策略“{name}”吗?此操作不可恢复。', -'trading-assistant.messages.deleteConfirm': '确定要删除该策略吗?此操作不可恢复。', -'trading-assistant.messages.loadTradesFailed': '获取交易记录失败', -'trading-assistant.messages.loadPositionsFailed': '获取持仓记录失败', -'trading-assistant.messages.loadEquityFailed': '获取净值曲线失败', -'trading-assistant.messages.loadIndicatorsFailed': '加载指标列表失败,请稍后重试', -'trading-assistant.messages.spotLimitations': '现货交易已自动设置为仅做多、1倍杠杆', -'trading-assistant.messages.autoFillApiConfig': '已自动填充该交易所的历史API配置', -'trading-assistant.messages.batchCreateSuccess': '成功创建 {count} 个策略', -'trading-assistant.messages.batchStartSuccess': '成功启动 {count} 个策略', -'trading-assistant.messages.batchStartFailed': '批量启动策略失败', -'trading-assistant.messages.batchStopSuccess': '成功停止 {count} 个策略', -'trading-assistant.messages.batchStopFailed': '批量停止策略失败', -'trading-assistant.messages.batchDeleteSuccess': '成功删除 {count} 个策略', -'trading-assistant.messages.batchDeleteFailed': '批量删除策略失败', -'trading-assistant.messages.batchDeleteConfirm': '确定要删除策略组"{name}"下的 {count} 个策略吗?此操作不可恢复。', -'trading-assistant.notify.browser': '浏览器通知', -'trading-assistant.notify.email': '邮箱', -'trading-assistant.notify.phone': '短信', -'trading-assistant.notify.telegram': 'Telegram', -'trading-assistant.notify.discord': 'Discord', -'trading-assistant.notify.webhook': 'Webhook', -'trading-assistant.placeholders.selectIndicator': '请选择指标', -'trading-assistant.placeholders.selectExchange': '请选择交易所', -'trading-assistant.placeholders.inputApiKey': '请输入API Key', -'trading-assistant.placeholders.inputSecretKey': '请输入Secret Key', -'trading-assistant.placeholders.inputPassphrase': '请输入Passphrase', -'trading-assistant.placeholders.inputStrategyName': '请输入策略名称', -'trading-assistant.placeholders.selectSymbol': '请选择交易对', -'trading-assistant.placeholders.selectSymbols': '请选择交易对(支持多选)', -'trading-assistant.placeholders.selectTimeframe': '请选择时间周期', -'trading-assistant.placeholders.selectKlinePeriod': '请选择K线周期', -'trading-assistant.placeholders.inputAiFilterPrompt': '请输入自定义提示词(可选)', -'trading-assistant.placeholders.selectSavedCredential': '请选择已保存的凭证', -'trading-assistant.placeholders.inputEmail': '请输入邮箱地址', -'trading-assistant.placeholders.inputPhone': '请输入手机号码', -'trading-assistant.placeholders.inputTelegram': '请输入Telegram ID或Chat ID', -'trading-assistant.placeholders.inputDiscord': '请输入Discord Webhook地址', -'trading-assistant.placeholders.inputWebhook': '请输入Webhook地址', -'trading-assistant.placeholders.inputCredentialName': '请输入凭证名称(如:我的OKX账户)', -'trading-assistant.validation.indicatorRequired': '请选择指标', -'trading-assistant.validation.exchangeRequired': '请选择交易所', -'trading-assistant.validation.apiKeyRequired': '请输入API Key', -'trading-assistant.validation.secretKeyRequired': '请输入Secret Key', -'trading-assistant.validation.passphraseRequired': '请输入Passphrase', -'trading-assistant.validation.exchangeConfigIncomplete': '请填写完整的交易所配置信息', -'trading-assistant.validation.testConnectionRequired': '请先点击"测试连接"按钮并确保连接成功', -'trading-assistant.validation.testConnectionFailed': '连接测试失败,请检查配置后重新测试', -'trading-assistant.validation.strategyNameRequired': '请输入策略名称', -'trading-assistant.validation.symbolRequired': '请选择交易对', -'trading-assistant.validation.symbolsRequired': '请至少选择一个交易对', -'trading-assistant.validation.emailInvalid': '请输入有效的邮箱地址', -'trading-assistant.validation.notifyChannelRequired': '请至少选择一个通知渠道', -'trading-assistant.validation.initialCapitalRequired': '请输入投入金额', -'trading-assistant.validation.leverageRequired': '请输入杠杆倍数', -'trading-assistant.table.time': '时间', -'trading-assistant.table.type': '类型', -'trading-assistant.table.price': '价格', -'trading-assistant.table.amount': '数量', -'trading-assistant.table.value': '金额', -'trading-assistant.table.commission': '手续费', -'trading-assistant.table.symbol': '交易对', -'trading-assistant.table.side': '方向', -'trading-assistant.table.size': '持仓数量', -'trading-assistant.table.entryPrice': '开仓价格', -'trading-assistant.table.currentPrice': '当前价格', -'trading-assistant.table.unrealizedPnl': '未实现盈亏', -'trading-assistant.table.pnlPercent': '盈亏比例', -'trading-assistant.table.buy': '买入', -'trading-assistant.table.sell': '卖出', -'trading-assistant.table.long': '做多', -'trading-assistant.table.short': '做空', -'trading-assistant.table.noPositions': '暂无持仓', -'trading-assistant.detail.title': '策略详情', -'trading-assistant.detail.strategyName': '策略名称', -'trading-assistant.detail.strategyType': '策略类型', -'trading-assistant.detail.status': '状态', -'trading-assistant.detail.tradingMode': '交易模式', -'trading-assistant.detail.exchange': '交易所', -'trading-assistant.detail.initialCapital': '初始资金', -'trading-assistant.detail.totalInvestment': '总投入金额', -'trading-assistant.detail.currentEquity': '当前净值', -'trading-assistant.detail.totalPnl': '总盈亏', -'trading-assistant.detail.indicatorName': '指标名称', -'trading-assistant.detail.maxLeverage': '最大杠杆', -'trading-assistant.detail.decideInterval': '决策间隔', -'trading-assistant.detail.symbols': '交易标的', -'trading-assistant.detail.createdAt': '创建时间', -'trading-assistant.detail.updatedAt': '更新时间', -'trading-assistant.detail.llmConfig': 'AI模型配置', -'trading-assistant.detail.exchangeConfig': '交易所配置', -'trading-assistant.detail.provider': '提供商', -'trading-assistant.detail.modelId': '模型ID', -'trading-assistant.detail.close': '关闭', -'trading-assistant.detail.loadFailed': '获取策略详情失败', -'trading-assistant.equity.noData': '暂无净值数据', -'trading-assistant.equity.equity': '净值', -'trading-assistant.exchange.tradingMode': '交易模式', -'trading-assistant.exchange.virtual': '模拟交易', -'trading-assistant.exchange.live': '实盘交易', -'trading-assistant.exchange.selectExchange': '选择交易所', -'trading-assistant.exchange.walletAddress': '钱包地址', -'trading-assistant.exchange.walletAddressPlaceholder': '请输入钱包地址(以0x开头)', -'trading-assistant.exchange.privateKey': '私钥', -'trading-assistant.exchange.privateKeyPlaceholder': '请输入私钥(64字符)', -'trading-assistant.exchange.testConnection': '测试连接', -'trading-assistant.exchange.connectionSuccess': '连接成功', -'trading-assistant.exchange.connectionFailed': '连接失败', -'trading-assistant.exchange.testFailed': '连接测试失败', -'trading-assistant.exchange.fillComplete': '请填写完整的交易所配置信息', -'trading-assistant.exchange.ipWhitelistTip': '请在交易所API设置中将以下IP添加到白名单:', -'trading-assistant.strategyTypeOptions.ai': 'AI驱动策略', -'trading-assistant.strategyTypeOptions.indicator': '技术指标策略', -'trading-assistant.strategyTypeOptions.aiDeveloping': 'AI驱动策略功能开发中,敬请期待', -'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'AI驱动策略功能正在开发中', -'trading-assistant.indicatorType.trend': '趋势', -'trading-assistant.indicatorType.momentum': '动量', -'trading-assistant.indicatorType.volatility': '波动', -'trading-assistant.indicatorType.volume': '成交量', -'trading-assistant.indicatorType.custom': '自定义', -'trading-assistant.exchangeNames': { -'okx': 'OKX', -'binance': '币安', -'hyperliquid': 'Hyperliquid', -'blockchaincom': 'Blockchain.com', -'coinbaseexchange': 'Coinbase', -'gate': 'Gate.io', -'mexc': 'MEXC', -'kraken': 'Kraken', -'bitfinex': 'Bitfinex', -'bybit': 'Bybit', -'kucoin': 'KuCoin', -'huobi': '火币', -'bitget': 'Bitget', -'bitmex': 'BitMEX', -'deribit': 'Deribit', -'phemex': 'Phemex', -'bitmart': 'BitMart', -'bitstamp': 'Bitstamp', -'bittrex': 'Bittrex', -'poloniex': 'Poloniex', -'gemini': 'Gemini', -'cryptocom': 'Crypto.com', -'bitflyer': 'bitFlyer', -'upbit': 'Upbit', -'bithumb': 'Bithumb', -'coinone': 'Coinone', -'zb': 'ZB', -'lbank': 'LBank', -'bibox': 'Bibox', -'bigone': 'BigONE', -'bitrue': 'Bitrue', -'coinex': 'CoinEx', -'digifinex': 'DigiFinex', -'ftx': 'FTX', -'ftxus': 'FTX US', -'binanceus': 'Binance US', -'binancecoinm': 'Binance COIN-M', -'binanceusdm': 'Binance USDⓈ-M', -'ibkr': '盈透证券 (IBKR)' -}, -'ai-trading-assistant.title': 'AI交易助手', -'ai-trading-assistant.strategyList': '策略列表', -'ai-trading-assistant.createStrategy': '创建策略', -'ai-trading-assistant.noStrategy': '暂无策略', -'ai-trading-assistant.selectStrategy': '请从左侧选择一个策略查看详情', -'ai-trading-assistant.startStrategy': '启动策略', -'ai-trading-assistant.stopStrategy': '停止策略', -'ai-trading-assistant.editStrategy': '编辑策略', -'ai-trading-assistant.deleteStrategy': '删除策略', -'ai-trading-assistant.status.running': '运行中', -'ai-trading-assistant.status.stopped': '已停止', -'ai-trading-assistant.status.error': '错误', -'ai-trading-assistant.tabs.tradingRecords': '交易记录', -'ai-trading-assistant.tabs.positions': '持仓记录', -'ai-trading-assistant.tabs.aiDecisions': 'AI决策记录', -'ai-trading-assistant.tabs.equityCurve': '净值曲线', -'ai-trading-assistant.form.createTitle': '创建AI交易策略', -'ai-trading-assistant.form.editTitle': '编辑AI交易策略', -'ai-trading-assistant.form.strategyName': '策略名称', -'ai-trading-assistant.form.modelId': 'AI模型', -'ai-trading-assistant.form.modelIdHint': '使用系统OpenRouter服务,无需配置API Key', -'ai-trading-assistant.form.decideInterval': '决策间隔', -'ai-trading-assistant.form.decideInterval5m': '5分钟', -'ai-trading-assistant.form.decideInterval10m': '10分钟', -'ai-trading-assistant.form.decideInterval30m': '30分钟', -'ai-trading-assistant.form.decideInterval1h': '1小时', -'ai-trading-assistant.form.decideInterval4h': '4小时', -'ai-trading-assistant.form.decideInterval1d': '1天', -'ai-trading-assistant.form.decideInterval1w': '1周', -'ai-trading-assistant.form.decideIntervalHint': 'AI做决策的时间间隔', -'ai-trading-assistant.form.runPeriod': '运行周期', -'ai-trading-assistant.form.runPeriodHint': '策略运行的开始时间和结束时间', -'ai-trading-assistant.form.startDate': '开始日期', -'ai-trading-assistant.form.endDate': '结束日期', -'ai-trading-assistant.form.qdtCostTitle': 'QDT扣费说明', -'ai-trading-assistant.form.qdtCostHint': '每次AI决策将扣费 {cost} 个QDT,请确保账户有足够的QDT余额。策略运行期间,每次决策都会实时扣费。', -'ai-trading-assistant.form.apiKey': 'API Key', -'ai-trading-assistant.form.exchange': '选择交易所', -'ai-trading-assistant.form.secretKey': 'Secret Key', -'ai-trading-assistant.form.passphrase': 'Passphrase', -'ai-trading-assistant.form.testConnection': '测试连接', -'ai-trading-assistant.form.symbol': '交易对', -'ai-trading-assistant.form.symbolHint': '选择要交易的交易对', -'ai-trading-assistant.form.initialCapital': '投入金额(保证金)', -'ai-trading-assistant.form.leverage': '杠杆倍数', -'ai-trading-assistant.form.timeframe': '时间周期', -'ai-trading-assistant.form.timeframe1m': '1分钟', -'ai-trading-assistant.form.timeframe5m': '5分钟', -'ai-trading-assistant.form.timeframe15m': '15分钟', -'ai-trading-assistant.form.timeframe30m': '30分钟', -'ai-trading-assistant.form.timeframe1H': '1小时', -'ai-trading-assistant.form.timeframe4H': '4小时', -'ai-trading-assistant.form.timeframe1D': '1天', -'ai-trading-assistant.form.marketType': '市场类型', -'ai-trading-assistant.form.marketTypeFutures': '合约', -'ai-trading-assistant.form.marketTypeSpot': '现货', -'ai-trading-assistant.form.totalPnl': '总盈亏', -'ai-trading-assistant.form.customPrompt': '自定义提示词', -'ai-trading-assistant.form.customPromptHint': '可选,用于自定义AI的交易策略和决策逻辑', -'ai-trading-assistant.form.cancel': '取消', -'ai-trading-assistant.form.prev': '上一步', -'ai-trading-assistant.form.next': '下一步', -'ai-trading-assistant.form.confirmCreate': '确认创建', -'ai-trading-assistant.form.confirmEdit': '确认修改', -'ai-trading-assistant.messages.createSuccess': '策略创建成功', -'ai-trading-assistant.messages.createFailed': '创建策略失败', -'ai-trading-assistant.messages.updateSuccess': '策略更新成功', -'ai-trading-assistant.messages.updateFailed': '更新策略失败', -'ai-trading-assistant.messages.deleteSuccess': '策略删除成功', -'ai-trading-assistant.messages.deleteFailed': '删除策略失败', -'ai-trading-assistant.messages.startSuccess': '策略启动成功', -'ai-trading-assistant.messages.startFailed': '启动策略失败', -'ai-trading-assistant.messages.stopSuccess': '策略停止成功', -'ai-trading-assistant.messages.stopFailed': '停止策略失败', -'ai-trading-assistant.messages.loadFailed': '获取策略列表失败', -'ai-trading-assistant.messages.loadDecisionsFailed': '获取AI决策记录失败', -'ai-trading-assistant.messages.deleteConfirm': '确定要删除该策略吗?此操作不可恢复。', -'ai-trading-assistant.placeholders.inputStrategyName': '请输入策略名称', -'ai-trading-assistant.placeholders.selectModelId': '请选择AI模型', -'ai-trading-assistant.placeholders.selectDecideInterval': '请选择决策间隔', -'ai-trading-assistant.placeholders.startTime': '开始时间', -'ai-trading-assistant.placeholders.endTime': '结束时间', -'ai-trading-assistant.placeholders.inputApiKey': '请输入API Key', -'ai-trading-assistant.placeholders.selectExchange': '请选择交易所', -'ai-trading-assistant.placeholders.inputSecretKey': '请输入Secret Key', -'ai-trading-assistant.placeholders.inputPassphrase': '请输入Passphrase', -'ai-trading-assistant.placeholders.selectSymbol': '请选择交易对,如:BTC/USDT', -'ai-trading-assistant.placeholders.selectTimeframe': '请选择时间周期', -'ai-trading-assistant.placeholders.inputCustomPrompt': '请输入自定义提示词(可选)', -'ai-trading-assistant.validation.strategyNameRequired': '请输入策略名称', -'ai-trading-assistant.validation.modelIdRequired': '请选择AI模型', -'ai-trading-assistant.validation.runPeriodRequired': '请选择运行周期', -'ai-trading-assistant.validation.apiKeyRequired': '请输入API Key', -'ai-trading-assistant.validation.exchangeRequired': '请选择交易所', -'ai-trading-assistant.validation.secretKeyRequired': '请输入Secret Key', -'ai-trading-assistant.validation.symbolRequired': '请选择交易对', -'ai-trading-assistant.validation.initialCapitalRequired': '请输入投入金额', -'ai-trading-assistant.table.time': '时间', -'ai-trading-assistant.table.type': '类型', -'ai-trading-assistant.table.price': '价格', -'ai-trading-assistant.table.amount': '数量', -'ai-trading-assistant.table.value': '金额', -'ai-trading-assistant.table.symbol': '交易对', -'ai-trading-assistant.table.side': '方向', -'ai-trading-assistant.table.size': '持仓数量', -'ai-trading-assistant.table.entryPrice': '开仓价格', -'ai-trading-assistant.table.currentPrice': '当前价格', -'ai-trading-assistant.table.unrealizedPnl': '未实现盈亏', -'ai-trading-assistant.table.profit': '盈亏', -'ai-trading-assistant.table.openLong': '开多', -'ai-trading-assistant.table.closeLong': '平多', -'ai-trading-assistant.table.openShort': '开空', -'ai-trading-assistant.table.closeShort': '平空', -'ai-trading-assistant.table.addLong': '加多', -'ai-trading-assistant.table.addShort': '加空', -'ai-trading-assistant.table.closeShortProfit': '平空止盈', -'ai-trading-assistant.table.closeShortStop': '平空止损', -'ai-trading-assistant.table.closeLongProfit': '平多止盈', -'ai-trading-assistant.table.closeLongStop': '平多止损', -'ai-trading-assistant.table.buy': '买入', -'ai-trading-assistant.table.sell': '卖出', -'ai-trading-assistant.table.long': '做多', -'ai-trading-assistant.table.short': '做空', -'ai-trading-assistant.table.hold': '持有', -'ai-trading-assistant.table.reasoning': '分析理由', -'ai-trading-assistant.table.decisions': '决策', -'ai-trading-assistant.table.riskAssessment': '风险评估', -'ai-trading-assistant.table.confidence': '置信度', -'ai-trading-assistant.table.totalRecords': '共 {total} 条记录', -'ai-trading-assistant.table.noPositions': '暂无持仓', -'ai-trading-assistant.detail.title': '策略详情', -'ai-trading-assistant.equity.noData': '暂无净值数据', -'ai-trading-assistant.equity.equity': '净值', -'ai-trading-assistant.exchange.testFailed': '连接测试失败', -'ai-trading-assistant.exchange.connectionSuccess': '连接成功', -'ai-trading-assistant.exchange.connectionFailed': '连接失败', -'ai-trading-assistant.form.advancedSettings': '高级设置', -'ai-trading-assistant.form.orderMode': '下单模式', -'ai-trading-assistant.form.orderModeMaker': '挂单(Maker)', -'ai-trading-assistant.form.orderModeTaker': '市价(Taker)', -'ai-trading-assistant.form.orderModeHint': '挂单模式使用限价单,手续费更低;市价模式立即成交,手续费较高', -'ai-trading-assistant.form.makerWaitSec': '挂单等待时间(秒)', -'ai-trading-assistant.form.makerWaitSecHint': '挂单后等待成交的时间,超时后取消并重试', -'ai-trading-assistant.form.makerRetries': '挂单重试次数', -'ai-trading-assistant.form.makerRetriesHint': '挂单未成交时的最大重试次数', -'ai-trading-assistant.form.fallbackToMarket': '挂单失败降级市价', -'ai-trading-assistant.form.fallbackToMarketHint': '开/平仓挂单未成交时,是否降级为市价单以确保成交', -'ai-trading-assistant.form.marginMode': '保证金模式', -'ai-trading-assistant.form.marginModeCross': '全仓', -'ai-trading-assistant.form.marginModeIsolated': '逐仓', -'ai-analysis.title': '量子交易引擎', -'ai-analysis.system.online': '在线', -'ai-analysis.system.agents': '智能体', -'ai-analysis.system.active': '活跃', -'ai-analysis.system.stage': '阶段', -'ai-analysis.panel.roster': '智能体阵容', -'ai-analysis.panel.thinking': '思考中...', -'ai-analysis.panel.done': '完成', -'ai-analysis.panel.standby': '待机', -'ai-analysis.input.title': '量子交易引擎', -'ai-analysis.input.placeholder': '选择目标资产 (如 BTC/USDT)', -'ai-analysis.input.watchlist': '自选股', -'ai-analysis.input.start': '开始分析', -'ai-analysis.input.recent': '最近任务:', -'ai-analysis.vis.stage': '阶段', -'ai-analysis.vis.processing': '处理中', -'ai-analysis.result.complete': '分析完成', -'ai-analysis.result.signal': '最终信号', -'ai-analysis.result.confidence': '置信度:', -'ai-analysis.result.new': '新分析', -'ai-analysis.result.full': '查看完整报告', -'ai-analysis.logs.title': '系统日志', -'ai-analysis.modal.title': '机密报告', -'ai-analysis.modal.fundamental': '基本面分析', -'ai-analysis.modal.technical': '技术面分析', -'ai-analysis.modal.sentiment': '情绪面分析', -'ai-analysis.modal.risk': '风险评估', -'ai-analysis.stage.idle': '待机', -'ai-analysis.stage.1': '第一阶段:多维分析', -'ai-analysis.stage.2': '第二阶段:多空辩论', -'ai-analysis.stage.3': '第三阶段:战略规划', -'ai-analysis.stage.4': '第四阶段:风控审查', -'ai-analysis.stage.complete': '完成', -'ai-analysis.agent.investment_director': '投资总监', -'ai-analysis.agent.role.investment_director': '综合分析 & 最终结论', -'ai-analysis.agent.market': '市场分析师', -'ai-analysis.agent.role.market': '技术 & 市场数据', -'ai-analysis.agent.fundamental': '基本面分析师', -'ai-analysis.agent.role.fundamental': '财务 & 估值', -'ai-analysis.agent.technical': '技术分析师', -'ai-analysis.agent.role.technical': '技术指标 & 图表', -'ai-analysis.agent.news': '新闻分析师', -'ai-analysis.agent.role.news': '全球新闻过滤', -'ai-analysis.agent.sentiment': '情绪分析师', -'ai-analysis.agent.role.sentiment': '社交 & 情绪', -'ai-analysis.agent.risk': '风险分析师', -'ai-analysis.agent.role.risk': '基础风险检查', -'ai-analysis.agent.bull': '看涨研究员', -'ai-analysis.agent.role.bull': '增长催化剂挖掘', -'ai-analysis.agent.bear': '看跌研究员', -'ai-analysis.agent.role.bear': '风险 & 缺陷挖掘', -'ai-analysis.agent.manager': '研究经理', -'ai-analysis.agent.role.manager': '辩论主持人', -'ai-analysis.agent.trader': '交易员', -'ai-analysis.agent.role.trader': '执行策略师', -'ai-analysis.agent.risky': '激进分析师', -'ai-analysis.agent.role.risky': '激进策略', -'ai-analysis.agent.neutral': '平衡分析师', -'ai-analysis.agent.role.neutral': '平衡策略', -'ai-analysis.agent.safe': '保守分析师', -'ai-analysis.agent.role.safe': '保守策略', -'ai-analysis.agent.cro': '风控经理 (CRO)', -'ai-analysis.agent.role.cro': '最终决策权威', -'ai-analysis.script.market': '正在从主要交易所获取 OHLCV 数据...', -'ai-analysis.script.fundamental': '正在检索季度财务报告...', -'ai-analysis.script.technical': '正在分析技术指标和图表形态...', -'ai-analysis.script.news': '正在扫描全球财经新闻...', -'ai-analysis.script.sentiment': '正在分析社交媒体趋势...', -'ai-analysis.script.risk': '正在计算历史波动率...', -'invite.inviteLink': '邀请链接', -'invite.copy': '复制链接', -'invite.copySuccess': '复制成功!', -'invite.copyFailed': '复制失败,请手动复制', -'invite.noInviteLink': '邀请链接未生成', -'invite.totalInvites': '累计邀请', -'invite.totalReward': '累计奖励', -'invite.rules': '邀请规则', -'invite.rule1': '每成功邀请一位好友注册,您将获得奖励', -'invite.rule2': '被邀请的好友完成首次交易,您将获得额外奖励', -'invite.rule3': '邀请奖励将直接发放到您的账户', -'invite.inviteList': '邀请列表', -'invite.tasks': '任务中心', -'invite.inviteeName': '被邀请人', -'invite.inviteTime': '邀请时间', -'invite.status': '状态', -'invite.reward': '奖励', -'invite.active': '活跃', -'invite.inactive': '未激活', -'invite.completed': '已完成', -'invite.claimed': '已领取', -'invite.pending': '待完成', -'invite.goToTask': '去完成', -'invite.claimReward': '领取奖励', -'invite.verify': '验证完成', -'invite.verifySuccess': '验证成功!任务已完成', -'invite.verifyNotCompleted': '任务尚未完成,请先完成任务', -'invite.verifyFailed': '验证失败,请稍后重试', -'invite.claimSuccess': '成功领取 {reward} QDT!', -'invite.claimFailed': '领取失败,请稍后重试', -'invite.totalRecords': '共 {total} 条记录', -'invite.task.twitter.title': '转发推文到 X (Twitter)', -'invite.task.twitter.desc': '分享我们的官方推文到您的 X (Twitter) 账号', -'invite.task.youtube.title': '关注我们的 YouTube 频道', -'invite.task.youtube.desc': '订阅并关注我们的 YouTube 官方频道', -'invite.task.telegram.title': '加入 Telegram 群组', -'invite.task.telegram.desc': '加入我们的官方 Telegram 社区群组', -'invite.task.discord.title': '加入 Discord 服务器', -'invite.task.discord.desc': '加入我们的 Discord 社区服务器', -'message': '-', -'layouts.usermenu.dialog.title': '信息', -'layouts.usermenu.dialog.content': '您确定要注销吗?', -'layouts.userLayout.title': '于不确定中,寻见真理', - -// Settings -'settings.title': '系统设置', -'settings.description': '配置应用设置、API密钥和系统偏好', -'settings.save': '保存设置', -'settings.reset': '重置', -'settings.saveSuccess': '设置保存成功', -'settings.saveFailed': '保存设置失败', -'settings.loadFailed': '加载配置失败', -'settings.openrouterBalance': 'OpenRouter 账户余额', -'settings.queryBalance': '查询余额', -'settings.balanceUsage': '已使用', -'settings.balanceRemaining': '剩余额度', -'settings.balanceLimit': '总限额', -'settings.balanceQuerySuccess': '余额查询成功', -'settings.balanceQueryFailed': '余额查询失败', -'settings.balanceNotQueried': '点击"查询余额"获取账户信息', -'settings.default': '默认', -'settings.pleaseSelect': '请选择', -'settings.inputApiKey': '请输入密钥', -'settings.getApi': '获取API', -// Settings link texts -'settings.link.getApi': '获取API', -'settings.link.getApiKey': '获取API Key', -'settings.link.getToken': '获取Token', -'settings.link.createBot': '创建Bot', -'settings.link.viewModels': '查看模型列表', -'settings.link.freeRegister': '免费注册', -'settings.link.supportedExchanges': '支持的交易所', -'settings.link.applyApi': '申请API', -'settings.link.createSearchEngine': '创建搜索引擎', -'settings.link.getTurnstileKey': '获取Turnstile密钥', -'settings.link.getGoogleCredentials': '获取Google凭据', -'settings.link.getGithubCredentials': '获取GitHub凭据', -'settings.restartRequired': '配置已保存,部分配置需要重启Python服务才能生效', -'settings.copyRestartCmd': '复制重启命令', -'settings.copySuccess': '复制成功', -'settings.copyFailed': '复制失败', -// Settings groups (按后端 order 排序) -'settings.group.server': '服务配置', -'settings.group.auth': '安全认证', -'settings.group.ai': 'AI/LLM配置', -'settings.group.trading': '实盘交易', -'settings.group.strategy': '策略执行', -'settings.group.data_source': '数据源', -'settings.group.notification': '通知推送', -'settings.group.email': '邮件配置', -'settings.group.sms': '短信配置', -'settings.group.agent': 'AI Agent', -'settings.group.network': '网络代理', -'settings.group.search': '搜索配置', -'settings.group.security': '注册与安全', -'settings.group.app': '应用配置', -// Settings fields - Auth -'settings.field.SECRET_KEY': 'Secret Key', -'settings.field.ADMIN_USER': '管理员用户名', -'settings.field.ADMIN_PASSWORD': '管理员密码', -'settings.field.ADMIN_EMAIL': '管理员邮箱', -// Settings fields - Security -'settings.field.ENABLE_REGISTRATION': '允许注册', -'settings.field.TURNSTILE_SITE_KEY': 'Turnstile Site Key', -'settings.field.TURNSTILE_SECRET_KEY': 'Turnstile Secret Key', -'settings.field.FRONTEND_URL': '前端URL', -'settings.field.GOOGLE_CLIENT_ID': 'Google Client ID', -'settings.field.GOOGLE_CLIENT_SECRET': 'Google Client Secret', -'settings.field.GOOGLE_REDIRECT_URI': 'Google回调URL', -'settings.field.GITHUB_CLIENT_ID': 'GitHub Client ID', -'settings.field.GITHUB_CLIENT_SECRET': 'GitHub Client Secret', -'settings.field.GITHUB_REDIRECT_URI': 'GitHub回调URL', -'settings.field.SECURITY_IP_MAX_ATTEMPTS': 'IP最大失败次数', -'settings.field.SECURITY_IP_WINDOW_MINUTES': 'IP统计窗口(分钟)', -'settings.field.SECURITY_IP_BLOCK_MINUTES': 'IP封禁时长(分钟)', -'settings.field.SECURITY_ACCOUNT_MAX_ATTEMPTS': '账户最大失败次数', -'settings.field.SECURITY_ACCOUNT_WINDOW_MINUTES': '账户统计窗口(分钟)', -'settings.field.SECURITY_ACCOUNT_BLOCK_MINUTES': '账户锁定时长(分钟)', -'settings.field.VERIFICATION_CODE_EXPIRE_MINUTES': '验证码有效期(分钟)', -'settings.field.VERIFICATION_CODE_RATE_LIMIT': '验证码发送间隔(秒)', -'settings.field.VERIFICATION_CODE_IP_HOURLY_LIMIT': 'IP每小时验证码上限', -'settings.field.VERIFICATION_CODE_MAX_ATTEMPTS': '验证码最大尝试次数', -'settings.field.VERIFICATION_CODE_LOCK_MINUTES': '验证码锁定时长(分钟)', -// Settings fields - Server -'settings.field.PYTHON_API_HOST': '监听地址', -'settings.field.PYTHON_API_PORT': '端口', -'settings.field.PYTHON_API_DEBUG': '调试模式', -// Settings fields - Worker -'settings.field.ENABLE_PENDING_ORDER_WORKER': '启用订单处理Worker', -'settings.field.PENDING_ORDER_STALE_SEC': '订单超时时间(秒)', -// Settings fields - Trading -'settings.field.ORDER_MODE': '下单模式', -'settings.field.MAKER_WAIT_SEC': '限价单等待时间(秒)', -'settings.field.MAKER_OFFSET_BPS': '限价单价格偏移(基点)', -// Settings fields - Notification -'settings.field.SIGNAL_WEBHOOK_URL': 'Webhook URL', -'settings.field.SIGNAL_WEBHOOK_TOKEN': 'Webhook Token', -'settings.field.SIGNAL_NOTIFY_TIMEOUT_SEC': '通知超时(秒)', -'settings.field.TELEGRAM_BOT_TOKEN': 'Telegram Bot Token', -// Settings fields - SMTP -'settings.field.SMTP_HOST': 'SMTP服务器', -'settings.field.SMTP_PORT': 'SMTP端口', -'settings.field.SMTP_USER': 'SMTP用户名', -'settings.field.SMTP_PASSWORD': 'SMTP密码', -'settings.field.SMTP_FROM': '发件人地址', -'settings.field.SMTP_USE_TLS': '使用TLS', -'settings.field.SMTP_USE_SSL': '使用SSL', -// Settings fields - Twilio -'settings.field.TWILIO_ACCOUNT_SID': 'Account SID', -'settings.field.TWILIO_AUTH_TOKEN': 'Auth Token', -'settings.field.TWILIO_FROM_NUMBER': '发送号码', -// Settings fields - Strategy -'settings.field.DISABLE_RESTORE_RUNNING_STRATEGIES': '禁用自动恢复策略', -'settings.field.STRATEGY_TICK_INTERVAL_SEC': '策略Tick间隔(秒)', -'settings.field.PRICE_CACHE_TTL_SEC': '价格缓存TTL(秒)', -// Settings fields - Proxy -'settings.field.PROXY_PORT': '代理端口', -'settings.field.PROXY_HOST': '代理主机', -'settings.field.PROXY_SCHEME': '代理协议', -'settings.field.PROXY_URL': '完整代理URL', -// Settings fields - App -'settings.field.CORS_ORIGINS': 'CORS来源', -'settings.field.RATE_LIMIT': '速率限制(每分钟)', -'settings.field.ENABLE_CACHE': '启用缓存', -'settings.field.ENABLE_REQUEST_LOG': '启用请求日志', -'settings.field.ENABLE_AI_ANALYSIS': '启用AI分析', -// Settings fields - 记忆/反思 -'settings.field.ENABLE_AGENT_MEMORY': '启用Agent记忆', -'settings.field.AGENT_MEMORY_ENABLE_VECTOR': '启用向量检索(本地)', -'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'Embedding维度', -'settings.field.AGENT_MEMORY_TOP_K': '召回数量TopK', -'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': '候选窗口大小', -'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': '时间衰减半衰期(天)', -'settings.field.AGENT_MEMORY_W_SIM': '相似度权重', -'settings.field.AGENT_MEMORY_W_RECENCY': '时间权重', -'settings.field.AGENT_MEMORY_W_RETURNS': '收益权重', -// Settings fields - 自动反思验证Worker -'settings.field.ENABLE_REFLECTION_WORKER': '启用自动验证', -'settings.field.REFLECTION_WORKER_INTERVAL_SEC': '验证周期间隔(秒)', -// Settings fields - AI -'settings.field.OPENROUTER_API_KEY': 'OpenRouter API Key', -'settings.field.OPENROUTER_API_URL': 'OpenRouter API URL', -'settings.field.OPENROUTER_MODEL': '默认模型', -'settings.field.OPENROUTER_TEMPERATURE': 'Temperature', -'settings.field.OPENROUTER_MAX_TOKENS': 'Max Tokens', -'settings.field.OPENROUTER_TIMEOUT': '超时时间(秒)', -'settings.field.OPENROUTER_CONNECT_TIMEOUT': '连接超时(秒)', -'settings.field.AI_MODELS_JSON': '模型列表(JSON)', -// Settings fields - Market -'settings.field.MARKET_TYPES_JSON': '市场类型(JSON)', -'settings.field.TRADING_SUPPORTED_SYMBOLS_JSON': '支持的交易对(JSON)', -// Settings fields - Data Source -'settings.field.DATA_SOURCE_TIMEOUT': '数据源超时(秒)', -'settings.field.DATA_SOURCE_RETRY': '重试次数', -'settings.field.DATA_SOURCE_RETRY_BACKOFF': '重试退避(秒)', -'settings.field.FINNHUB_API_KEY': 'Finnhub API Key', -'settings.field.FINNHUB_TIMEOUT': 'Finnhub超时(秒)', -'settings.field.FINNHUB_RATE_LIMIT': 'Finnhub速率限制', -'settings.field.CCXT_DEFAULT_EXCHANGE': 'CCXT默认交易所', -'settings.field.CCXT_TIMEOUT': 'CCXT超时(ms)', -'settings.field.CCXT_PROXY': 'CCXT代理', -'settings.field.AKSHARE_TIMEOUT': 'Akshare超时(秒)', -'settings.field.YFINANCE_TIMEOUT': 'YFinance超时(秒)', -'settings.field.TIINGO_API_KEY': 'Tiingo API Key', -'settings.field.TIINGO_TIMEOUT': 'Tiingo超时(秒)', -// Settings fields - Search -'settings.field.SEARCH_PROVIDER': '搜索提供商', -'settings.field.SEARCH_MAX_RESULTS': '最大结果数', -'settings.field.SEARCH_GOOGLE_API_KEY': 'Google API Key', -'settings.field.SEARCH_GOOGLE_CX': 'Google CX', -'settings.field.SEARCH_BING_API_KEY': 'Bing API Key', -'settings.field.INTERNAL_API_KEY': '内部API Key', - -// Settings descriptions (配置项说明) -'settings.desc.PYTHON_API_HOST': '服务监听地址。0.0.0.0 允许外部访问,127.0.0.1 仅本地访问', -'settings.desc.PYTHON_API_PORT': '服务监听端口,默认5000', -'settings.desc.PYTHON_API_DEBUG': '启用调试模式,开发时使用。生产环境请关闭', -'settings.desc.SECRET_KEY': 'JWT签名密钥。生产环境必须修改以确保安全', -'settings.desc.ADMIN_USER': '管理员登录用户名', -'settings.desc.ADMIN_PASSWORD': '管理员登录密码。生产环境必须修改', -'settings.desc.OPENROUTER_API_KEY': 'OpenRouter API密钥,用于访问多种AI模型', -'settings.desc.OPENROUTER_API_URL': 'OpenRouter API端点地址', -'settings.desc.OPENROUTER_MODEL': '默认使用的AI模型,如 openai/gpt-4o, anthropic/claude-3.5-sonnet', -'settings.desc.OPENROUTER_TEMPERATURE': '模型创造性(0-1)。越低越确定性,越高越有创意', -'settings.desc.OPENROUTER_MAX_TOKENS': '每次请求最大输出token数', -'settings.desc.OPENROUTER_TIMEOUT': 'API请求超时时间(秒)', -'settings.desc.OPENROUTER_CONNECT_TIMEOUT': '连接建立超时时间(秒)', -'settings.desc.AI_MODELS_JSON': '自定义模型列表,JSON格式,用于模型选择器', -'settings.desc.ENABLE_PENDING_ORDER_WORKER': '启用后台订单处理Worker,实盘交易必需', -'settings.desc.PENDING_ORDER_STALE_SEC': '等待订单超时时间,超时后标记为过期', -'settings.desc.ORDER_MODE': 'maker: 限价单优先(手续费低),market: 市价单(立即成交)', -'settings.desc.MAKER_WAIT_SEC': '限价单等待成交时间,超时后自动切换为市价单', -'settings.desc.MAKER_OFFSET_BPS': '限价单价格偏移(基点)。买入价=市价*(1-偏移),卖出价=市价*(1+偏移)', -'settings.desc.DISABLE_RESTORE_RUNNING_STRATEGIES': '禁止服务重启时自动恢复运行中的策略', -'settings.desc.STRATEGY_TICK_INTERVAL_SEC': '策略主循环检查间隔(秒)', -'settings.desc.PRICE_CACHE_TTL_SEC': '价格数据缓存有效期(秒)', -'settings.desc.MARKET_TYPES_JSON': '自定义市场类型配置,JSON格式', -'settings.desc.TRADING_SUPPORTED_SYMBOLS_JSON': '支持的交易对列表,JSON格式', -'settings.desc.DATA_SOURCE_TIMEOUT': '数据源请求默认超时时间', -'settings.desc.DATA_SOURCE_RETRY': '数据源请求失败时的重试次数', -'settings.desc.DATA_SOURCE_RETRY_BACKOFF': '重试间隔时间(秒)', -'settings.desc.CCXT_DEFAULT_EXCHANGE': 'CCXT默认交易所(binance, coinbase, okx等)', -'settings.desc.CCXT_TIMEOUT': 'CCXT请求超时时间(毫秒)', -'settings.desc.CCXT_PROXY': 'CCXT请求代理地址(如 socks5h://127.0.0.1:1080)', -'settings.desc.FINNHUB_API_KEY': 'Finnhub API密钥,用于美股数据(有免费额度)', -'settings.desc.FINNHUB_TIMEOUT': 'Finnhub API请求超时时间', -'settings.desc.FINNHUB_RATE_LIMIT': 'Finnhub API速率限制(每分钟请求数)', -'settings.desc.TIINGO_API_KEY': 'Tiingo API密钥,用于外汇/贵金属数据(免费版不支持1分钟数据)', -'settings.desc.TIINGO_TIMEOUT': 'Tiingo API请求超时时间', -'settings.desc.AKSHARE_TIMEOUT': 'Akshare API超时时间,用于A股数据', -'settings.desc.YFINANCE_TIMEOUT': 'Yahoo Finance API超时时间', -'settings.desc.SIGNAL_WEBHOOK_URL': '信号通知Webhook地址(POST JSON)', -'settings.desc.SIGNAL_WEBHOOK_TOKEN': 'Webhook认证令牌,通过请求头发送', -'settings.desc.SIGNAL_NOTIFY_TIMEOUT_SEC': '通知请求超时时间', -'settings.desc.TELEGRAM_BOT_TOKEN': 'Telegram机器人Token,从@BotFather获取', -'settings.desc.SMTP_HOST': 'SMTP邮件服务器地址(如 smtp.gmail.com)', -'settings.desc.SMTP_PORT': 'SMTP端口(TLS用587,SSL用465,明文用25)', -'settings.desc.SMTP_USER': 'SMTP认证用户名(通常是邮箱地址)', -'settings.desc.SMTP_PASSWORD': 'SMTP认证密码或应用专用密码', -'settings.desc.SMTP_FROM': '邮件发件人地址', -'settings.desc.SMTP_USE_TLS': '启用STARTTLS加密(推荐端口587)', -'settings.desc.SMTP_USE_SSL': '启用SSL加密(端口465)', -'settings.desc.TWILIO_ACCOUNT_SID': 'Twilio账户SID,从控制台获取', -'settings.desc.TWILIO_AUTH_TOKEN': 'Twilio认证Token,从控制台获取', -'settings.desc.TWILIO_FROM_NUMBER': 'Twilio发送短信的号码(如 +1234567890)', -'settings.desc.ENABLE_AGENT_MEMORY': '启用AI Agent记忆功能,用于学习历史交易', -'settings.desc.AGENT_MEMORY_ENABLE_VECTOR': '启用本地向量相似度搜索进行记忆检索', -'settings.desc.AGENT_MEMORY_EMBEDDING_DIM': '记忆向量嵌入维度', -'settings.desc.AGENT_MEMORY_TOP_K': '检索时返回的相似记忆数量', -'settings.desc.AGENT_MEMORY_CANDIDATE_LIMIT': '相似度搜索的候选记忆上限', -'settings.desc.AGENT_MEMORY_HALF_LIFE_DAYS': '记忆时间衰减的半衰期(天)', -'settings.desc.AGENT_MEMORY_W_SIM': '记忆排序中相似度分数的权重(0-1)', -'settings.desc.AGENT_MEMORY_W_RECENCY': '记忆排序中时间新近度的权重(0-1)', -'settings.desc.AGENT_MEMORY_W_RETURNS': '记忆排序中收益表现的权重(0-1)', -'settings.desc.ENABLE_REFLECTION_WORKER': '启用后台自动交易反思Worker', -'settings.desc.REFLECTION_WORKER_INTERVAL_SEC': '自动反思运行间隔(默认24小时)', -'settings.desc.PROXY_HOST': '代理服务器主机名或IP', -'settings.desc.PROXY_PORT': '代理服务器端口(留空则禁用代理)', -'settings.desc.PROXY_SCHEME': '代理协议类型。socks5h 表示DNS也走代理', -'settings.desc.PROXY_URL': '完整代理URL(设置后覆盖上面的配置)', -'settings.desc.SEARCH_PROVIDER': '网页搜索提供商,用于AI研究功能', -'settings.desc.SEARCH_MAX_RESULTS': '搜索返回的最大结果数', -'settings.desc.SEARCH_GOOGLE_API_KEY': 'Google自定义搜索API密钥', -'settings.desc.SEARCH_GOOGLE_CX': 'Google可编程搜索引擎ID (CX)', -'settings.desc.SEARCH_BING_API_KEY': 'Microsoft Bing网页搜索API密钥', -'settings.desc.INTERNAL_API_KEY': '内部API认证密钥,用于服务间调用', -'settings.desc.CORS_ORIGINS': '允许的CORS来源(* 表示全部,或逗号分隔的列表)', -'settings.desc.RATE_LIMIT': '每IP每分钟的API请求限制', -'settings.desc.ENABLE_CACHE': '启用响应缓存以提高性能', -'settings.desc.ENABLE_REQUEST_LOG': '记录所有API请求日志,用于调试', -'settings.desc.ENABLE_AI_ANALYSIS': '启用AI驱动的市场分析功能', - -// Portfolio - 资产监测 -'portfolio.summary.totalValue': '总市值', -'portfolio.summary.totalCost': '总成本', -'portfolio.summary.totalPnl': '总盈亏', -'portfolio.summary.positionCount': '持仓数量', -'portfolio.summary.profitLossRatio': '盈利/亏损', -'portfolio.summary.today': '今日', -'portfolio.summary.todayPnl': '今日盈亏', -'portfolio.summary.bestPerformer': '最佳表现', -'portfolio.summary.worstPerformer': '最差表现', -'portfolio.summary.priceSync': '价格同步', -'portfolio.summary.syncInterval': '刷新间隔', -'portfolio.summary.justNow': '刚刚', -'portfolio.summary.ago': '前', -'portfolio.positions.title': '我的持仓', -'portfolio.positions.add': '添加持仓', -'portfolio.positions.addFirst': '添加第一笔持仓', -'portfolio.positions.empty': '暂无持仓记录', -'portfolio.positions.deleteConfirm': '确定删除这笔持仓吗?', -'portfolio.positions.currentPrice': '现价', -'portfolio.positions.entryPrice': '买入价', -'portfolio.positions.quantity': '数量', -'portfolio.positions.side': '方向', -'portfolio.positions.long': '做多', -'portfolio.positions.short': '做空', -'portfolio.positions.marketValue': '市值', -'portfolio.positions.pnl': '盈亏', -'portfolio.positions.items': '个持仓', -'portfolio.monitors.title': 'AI 监控', -'portfolio.monitors.add': '添加监控', -'portfolio.monitors.addFirst': '添加 AI 监控', -'portfolio.monitors.empty': '暂无监控任务', -'portfolio.monitors.deleteConfirm': '确定删除这个监控任务吗?', -'portfolio.monitors.interval': '执行间隔', -'portfolio.monitors.lastRun': '上次执行', -'portfolio.monitors.nextRun': '下次执行', -'portfolio.monitors.channels': '通知渠道', -'portfolio.monitors.runNow': '立即执行', -'portfolio.monitors.analysisResult': 'AI 分析结果', -'portfolio.monitors.runningTitle': 'AI 分析已启动', -'portfolio.monitors.runningDesc': '分析正在后台运行,完成后会通过通知推送结果。分析多个持仓可能需要几分钟时间。', -'portfolio.monitors.timeoutTitle': '请求超时', -'portfolio.monitors.timeoutDesc': '分析可能正在后台运行中,请稍后查看通知获取结果。如果长时间没有收到通知,请重试。', -'portfolio.modal.addPosition': '添加持仓', -'portfolio.modal.editPosition': '编辑持仓', -'portfolio.modal.addMonitor': '添加监控', -'portfolio.modal.editMonitor': '编辑监控', -'portfolio.form.market': '市场', -'portfolio.form.marketRequired': '请选择市场', -'portfolio.form.selectMarket': '选择市场', -'portfolio.form.symbol': '标的代码', -'portfolio.form.symbolRequired': '请输入标的代码', -'portfolio.form.searchSymbol': '搜索或输入标的代码', -'portfolio.form.useAsSymbol': '使用', -'portfolio.form.asSymbolCode': '作为标的代码', -'portfolio.form.symbolHint': '可搜索标的库,或直接输入任意代码', -'portfolio.form.side': '方向', -'portfolio.form.quantity': '数量', -'portfolio.form.quantityRequired': '请输入数量', -'portfolio.form.enterQuantity': '输入持仓数量', -'portfolio.form.entryPrice': '买入价', -'portfolio.form.entryPriceRequired': '请输入买入价', -'portfolio.form.enterEntryPrice': '输入买入价格', -'portfolio.form.notes': '备注', -'portfolio.form.enterNotes': '可选:添加备注', -'portfolio.form.monitorName': '监控名称', -'portfolio.form.monitorNameRequired': '请输入监控名称', -'portfolio.form.enterMonitorName': '例如:每日组合分析', -'portfolio.form.interval': '执行间隔', -'portfolio.form.minutes': '分钟', -'portfolio.form.hour': '小时', -'portfolio.form.hours': '小时', -'portfolio.form.notifyChannels': '通知渠道', -'portfolio.form.browser': '浏览器通知', -'portfolio.form.email': '邮件', -'portfolio.form.telegramChatId': 'Telegram Chat ID', -'portfolio.form.enterTelegramChatId': '输入 Telegram Chat ID', -'portfolio.form.telegramRequired': '请输入 Telegram Chat ID', -'portfolio.form.emailAddress': '邮箱地址', -'portfolio.form.enterEmail': '输入邮箱地址', -'portfolio.form.emailRequired': '请输入邮箱地址', -'portfolio.form.emailInvalid': '请输入有效的邮箱地址', -'portfolio.form.customPrompt': '自定义提示', -'portfolio.form.customPromptPlaceholder': '可选:添加特别关注点,例如"重点关注科技股风险"', -'portfolio.form.monitorScope': '监控范围', -'portfolio.form.allPositions': '全部持仓', -'portfolio.form.selectedPositions': '指定持仓', -'portfolio.form.selectPositions': '选择持仓', -'portfolio.form.selectAll': '全选', -'portfolio.form.deselectAll': '全不选', -'portfolio.form.selectedCount': '已选 {count}/{total}', -'portfolio.form.pleaseSelectPositions': '请至少选择一个持仓进行监控', -'portfolio.message.loadFailed': '加载数据失败', -'portfolio.message.saveSuccess': '保存成功', -'portfolio.message.saveFailed': '保存失败', -'portfolio.message.deleteSuccess': '删除成功', -'portfolio.message.deleteFailed': '删除失败', -'portfolio.message.updateFailed': '更新失败', -'portfolio.message.monitorEnabled': '监控已启用', -'portfolio.message.monitorDisabled': '监控已暂停', -'portfolio.message.monitorRunSuccess': '分析完成', -'portfolio.message.monitorRunFailed': '分析失败', -'portfolio.message.monitorRunning': 'AI 分析已启动,请等待通知', -// Portfolio - 分组 -'portfolio.groups.all': '全部持仓', -'portfolio.groups.ungrouped': '未分组', -'portfolio.form.group': '分组', -'portfolio.form.enterGroup': '输入或选择分组', -// Portfolio - 预警 -'portfolio.alerts.title': '价格/盈亏预警', -'portfolio.alerts.addAlert': '添加预警', -'portfolio.alerts.editAlert': '编辑预警', -'portfolio.alerts.alertType': '预警类型', -'portfolio.alerts.priceAbove': '价格高于', -'portfolio.alerts.priceBelow': '价格低于', -'portfolio.alerts.pnlAbove': '盈利高于 (%)', -'portfolio.alerts.pnlBelow': '亏损低于 (%)', -'portfolio.alerts.threshold': '阈值', -'portfolio.alerts.thresholdRequired': '请输入阈值', -'portfolio.alerts.enterPrice': '输入价格', -'portfolio.alerts.enterPercent': '输入百分比', -'portfolio.alerts.currentPrice': '当前价格', -'portfolio.alerts.currentPriceHint': '当前价格', -'portfolio.alerts.repeatInterval': '重复提醒', -'portfolio.alerts.noRepeat': '不重复 (触发一次)', -'portfolio.alerts.every5min': '每 5 分钟', -'portfolio.alerts.every15min': '每 15 分钟', -'portfolio.alerts.every30min': '每 30 分钟', -'portfolio.alerts.every1hour': '每 1 小时', -'portfolio.alerts.every4hours': '每 4 小时', -'portfolio.alerts.onceDaily': '每天一次', -'portfolio.alerts.enabled': '启用预警', -'portfolio.alerts.enabledDesc': '开启后将自动监测并触发通知', -'portfolio.alerts.delete': '删除', -'portfolio.alerts.deleteConfirm': '确定要删除此预警吗?', -'portfolio.modal.addAlert': '添加预警', -'portfolio.modal.editAlert': '编辑预警', - -// User Management -'menu.userManage': '用户管理', -'menu.myProfile': '个人中心', -'common.actions': '操作', -'common.refresh': '刷新', - -'userManage.title': '用户管理', -'userManage.searchPlaceholder': '搜索用户名/邮箱/昵称', -'userManage.description': '管理系统用户、角色和权限', -'userManage.createUser': '创建用户', -'userManage.editUser': '编辑用户', -'userManage.username': '用户名', -'userManage.password': '密码', -'userManage.nickname': '昵称', -'userManage.email': '邮箱', -'userManage.role': '角色', -'userManage.status': '状态', -'userManage.lastLogin': '最后登录', -'userManage.active': '启用', -'userManage.disabled': '禁用', -'userManage.neverLogin': '从未登录', -'userManage.usernameRequired': '请输入用户名', -'userManage.usernamePlaceholder': '输入用户名', -'userManage.passwordRequired': '请输入密码', -'userManage.passwordPlaceholder': '输入密码(至少6位)', -'userManage.passwordMin': '密码至少6个字符', -'userManage.nicknamePlaceholder': '输入昵称', -'userManage.emailPlaceholder': '输入邮箱', -'userManage.emailInvalid': '邮箱格式不正确', -'userManage.rolePlaceholder': '选择角色', -'userManage.statusPlaceholder': '选择状态', -'userManage.resetPassword': '重置密码', -'userManage.resetPasswordWarning': '此操作将重置用户密码', -'userManage.newPassword': '新密码', -'userManage.newPasswordPlaceholder': '输入新密码', -'userManage.confirmDelete': '确定要删除此用户吗?', -'userManage.roleAdmin': '管理员', -'userManage.roleManager': '经理', -'userManage.roleUser': '普通用户', -'userManage.roleViewer': '访客', - -// Profile -'profile.title': '个人中心', -'profile.description': '管理您的账户设置和偏好', -'profile.basicInfo': '基本信息', -'profile.changePassword': '修改密码', -'profile.username': '用户名', -'profile.nickname': '昵称', -'profile.email': '邮箱', -'profile.lastLogin': '最后登录', -'profile.nicknamePlaceholder': '输入您的昵称', -'profile.emailPlaceholder': '输入您的邮箱', -'profile.emailInvalid': '邮箱格式不正确', -'profile.emailCannotChange': '注册后邮箱不可修改', -'profile.passwordHint': '密码至少需要6个字符', -'profile.oldPassword': '当前密码', -'profile.newPassword': '新密码', -'profile.confirmPassword': '确认密码', -'profile.oldPasswordRequired': '请输入当前密码', -'profile.oldPasswordPlaceholder': '输入当前密码', -'profile.newPasswordRequired': '请输入新密码', -'profile.newPasswordPlaceholder': '输入新密码', -'profile.confirmPasswordRequired': '请确认新密码', -'profile.confirmPasswordPlaceholder': '再次输入新密码', -'profile.passwordMin': '密码至少6个字符', -'profile.passwordMismatch': '两次输入的密码不一致', - -// Profile - Credits -'profile.credits.title': '我的积分', -'profile.credits.unit': '积分', -'profile.credits.recharge': '开通/充值', -'profile.credits.vipExpires': 'VIP有效期至', -'profile.credits.vipExpired': 'VIP已过期', -'profile.credits.noVip': '非VIP用户', -'profile.credits.hint': '使用AI分析等功能会消耗积分,VIP用户免费', - -// Profile - Credits Log (消费记录) -'profile.creditsLog': '消费记录', -'profile.creditsLog.time': '时间', -'profile.creditsLog.action': '类型', -'profile.creditsLog.amount': '变动', -'profile.creditsLog.balance': '余额', -'profile.creditsLog.remark': '备注', -'profile.creditsLog.actionConsume': '消费', -'profile.creditsLog.actionRecharge': '充值', -'profile.creditsLog.actionAdjust': '调整', -'profile.creditsLog.actionRefund': '退款', -'profile.creditsLog.actionVipGrant': 'VIP授予', -'profile.creditsLog.actionVipRevoke': 'VIP取消', -'profile.creditsLog.actionRegisterBonus': '注册奖励', -'profile.creditsLog.actionReferralBonus': '邀请奖励', - -// Profile - Referral (邀请) -'profile.referral.title': '邀请好友', -'profile.referral.listTab': '邀请列表', -'profile.referral.totalInvited': '已邀请', -'profile.referral.bonusPerInvite': '每邀请获得', -'profile.referral.yourLink': '您的邀请链接', -'profile.referral.copyLink': '复制链接', -'profile.referral.linkCopied': '邀请链接已复制', -'profile.referral.newUserBonus': '新用户注册获得', -'profile.referral.user': '用户', -'profile.referral.registerTime': '注册时间', -'profile.referral.noReferrals': '暂无邀请记录', -'profile.referral.shareNow': '立即分享邀请', - -// User Manage - Credits & VIP -'userManage.credits': '积分', -'userManage.adjustCredits': '调整积分', -'userManage.setVip': '设置VIP', -'userManage.currentCredits': '当前积分', -'userManage.newCredits': '新积分', -'userManage.enterCredits': '输入新的积分数量', -'userManage.creditsNonNegative': '积分不能为负数', -'userManage.currentVip': '当前VIP状态', -'userManage.vipActive': '有效', -'userManage.vipExpired': '已过期', -'userManage.vipDays': 'VIP天数', -'userManage.vipExpiresAt': 'VIP过期时间', -'userManage.cancelVip': '取消VIP', -'userManage.days': '天', -'userManage.customDate': '自定义日期', -'userManage.selectDate': '请选择日期', -'userManage.remark': '备注', -'userManage.remarkPlaceholder': '可选备注', - -// Settings - Billing -'settings.group.billing': '计费配置', -'settings.field.BILLING_ENABLED': '启用计费', -'settings.field.BILLING_VIP_BYPASS': 'VIP免费', -'settings.field.BILLING_COST_AI_ANALYSIS': 'AI分析消耗', -'settings.field.BILLING_COST_STRATEGY_RUN': '策略运行消耗', -'settings.field.BILLING_COST_BACKTEST': '回测消耗', -'settings.field.BILLING_COST_PORTFOLIO_MONITOR': 'Portfolio监控消耗', -'settings.field.CREDITS_REGISTER_BONUS': '注册奖励', -'settings.field.CREDITS_REFERRAL_BONUS': '邀请奖励', -'settings.field.RECHARGE_TELEGRAM_URL': '充值Telegram链接', -'settings.desc.BILLING_ENABLED': '启用计费系统。启用后,用户使用某些功能需要消耗积分', -'settings.desc.BILLING_VIP_BYPASS': 'VIP用户在有效期内可免费使用所有付费功能', -'settings.desc.BILLING_COST_AI_ANALYSIS': '每次AI分析消耗的积分数', -'settings.desc.BILLING_COST_STRATEGY_RUN': '启动策略时消耗的积分数', -'settings.desc.BILLING_COST_BACKTEST': '每次回测消耗的积分数', -'settings.desc.BILLING_COST_PORTFOLIO_MONITOR': '每次Portfolio AI监控消耗的积分数', -'settings.desc.CREDITS_REGISTER_BONUS': '新用户注册时获得的积分奖励', -'settings.desc.CREDITS_REFERRAL_BONUS': '用户通过邀请链接成功邀请新用户时,邀请人获得的积分奖励', -'settings.desc.VERIFICATION_CODE_MAX_ATTEMPTS': '验证码验证失败的最大尝试次数,超过后将锁定', -'settings.desc.VERIFICATION_CODE_LOCK_MINUTES': '验证码验证失败次数超过限制后的锁定时长(分钟)', -'settings.desc.RECHARGE_TELEGRAM_URL': '用户点击充值时跳转的Telegram客服链接' -} - -export default { -...components, -...locale -} diff --git a/quantdinger_vue/src/locales/lang/zh-TW.js b/quantdinger_vue/src/locales/lang/zh-TW.js deleted file mode 100644 index df1d9b4..0000000 --- a/quantdinger_vue/src/locales/lang/zh-TW.js +++ /dev/null @@ -1,2218 +0,0 @@ -import antd from 'ant-design-vue/es/locale-provider/zh_TW' -import momentTW from 'moment/locale/zh-tw' - -const components = { - antLocale: antd, - momentName: 'zh-tw', - momentLocale: momentTW -} - -const locale = { - // 通用 - 'common.confirm': '確定', - 'common.cancel': '取消', - 'common.save': '保存', - 'common.delete': '刪除', - 'common.edit': '編輯', - 'common.add': '添加', - 'common.close': '關閉', - 'common.ok': '確定', - 'common.actions': '操作', - 'common.refresh': '刷新', - 'submit': '提交', - 'save': '保存', - 'submit.ok': '提交成功', - 'save.ok': '保存成功', - 'menu.welcome': '歡迎', - 'menu.home': '主頁', - 'menu.dashboard': '儀表盤', - 'menu.dashboard.indicator': '指標分析', - 'menu.dashboard.community': '指標社區', - 'menu.dashboard.analysis': 'AI 分析', - 'menu.dashboard.tradingAssistant': '交易助手', - 'menu.dashboard.portfolio': '資產監測', - 'menu.settings': '系統設置', - 'menu.dashboard.aiTradingAssistant': 'AI交易助手', - 'menu.dashboard.signalRobot': '信號機器人', - 'menu.dashboard.monitor': '監控頁', - 'menu.dashboard.workplace': '工作臺', - 'menu.form': '表單頁', - 'menu.form.basic-form': '基礎表單', - 'menu.form.step-form': '分步表單', - 'menu.form.step-form.info': '分步表單(填寫轉賬信息)', - 'menu.form.step-form.confirm': '分步表單(確認轉賬信息)', - 'menu.form.step-form.result': '分步表單(完成)', - 'menu.form.advanced-form': '高級表單', - 'menu.list': '列表頁', - 'menu.list.table-list': '查詢表格', - 'menu.list.basic-list': '標準列表', - 'menu.list.card-list': '卡片列表', - 'menu.list.search-list': '搜索列表', - 'menu.list.search-list.articles': '搜索列表(文章)', - 'menu.list.search-list.projects': '搜索列表(項目)', - 'menu.list.search-list.applications': '搜索列表(應用)', - 'menu.profile': '詳情頁', - 'menu.profile.basic': '基礎詳情頁', - 'menu.profile.advanced': '高級詳情頁', - 'menu.result': '結果頁', - 'menu.result.success': '成功頁', - 'menu.result.fail': '失敗頁', - 'menu.exception': '異常頁', - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': '觸發錯誤', - 'menu.account': '個人頁', - 'menu.account.center': '個人中心', - 'menu.account.settings': '個人設置', - 'menu.account.trigger': '觸發報錯', - 'menu.account.logout': '退出登錄', - 'menu.wallet': '我的錢包', - 'menu.docs': '文檔中心', - 'menu.docs.detail': '文檔詳情', - 'menu.header.refreshPage': '刷新頁面', - 'menu.invite.friends': '邀請好友', - 'app.setting.pagestyle': '整體風格設置', - 'app.setting.pagestyle.light': '亮色菜單風格', - 'app.setting.pagestyle.dark': '暗色菜單風格', - 'app.setting.pagestyle.realdark': '暗黑模式', - 'app.setting.themecolor': '主題色', - 'app.setting.navigationmode': '導航模式', - 'app.setting.sidemenu.nav': '側邊欄導航', - 'app.setting.topmenu.nav': '頂部欄導航', - 'app.setting.content-width': '內容區域寬度', - 'app.setting.content-width.tooltip': '該設定僅 [頂部欄導航] 時有效', - 'app.setting.content-width.fixed': '固定', - 'app.setting.content-width.fluid': '流式', - 'app.setting.fixedheader': '固定 Header', - 'app.setting.fixedheader.tooltip': '固定 Header 時可配置', - 'app.setting.autoHideHeader': '下滑時隱藏 Header', - 'app.setting.fixedsidebar': '固定側邊菜單', - 'app.setting.sidemenu': '側邊菜單布局', - 'app.setting.topmenu': '頂部菜單布局', - 'app.setting.othersettings': '其他設置', - 'app.setting.weakmode': '色弱模式', - 'app.setting.multitab': '多頁籤模式', - 'app.setting.copy': '拷貝設置', - 'app.setting.loading': '加載主題中', - 'app.setting.copyinfo': '拷貝設置成功 src/config/defaultSettings.js', - 'app.setting.copy.success': '復制完畢', - 'app.setting.copy.fail': '復制失敗', - 'app.setting.theme.switching': '正在切換主題!', - 'app.setting.production.hint': '配置欄只在開發環境用於預覽,生產環境不會展現,請拷貝後手動修改配置文件', - 'app.setting.themecolor.daybreak': '拂曉藍(默認)', - 'app.setting.themecolor.dust': '薄暮', - 'app.setting.themecolor.volcano': '火山', - 'app.setting.themecolor.sunset': '日暮', - 'app.setting.themecolor.cyan': '明青', - 'app.setting.themecolor.green': '極光綠', - 'app.setting.themecolor.geekblue': '極客藍', - 'app.setting.themecolor.purple': '醬紫', - 'app.setting.tooltip': '頁面設置', - - // 通知中心 - 'notice.title': '通知中心', - 'notice.empty': '暫無通知', - 'notice.markAllRead': '全部已讀', - 'notice.clear': '清空通知', - 'notice.close': '關閉', - 'notice.justNow': '剛剛', - 'notice.minutesAgo': '分鐘前', - 'notice.hoursAgo': '小時前', - 'notice.daysAgo': '天前', - 'notice.detailInfo': '詳細信息', - 'notice.aiDecision': 'AI決策', - 'notice.confidence': '置信度', - 'notice.reasoning': '分析理由', - 'notice.symbol': '標的代碼', - 'notice.currentPrice': '當前價格', - 'notice.triggerPrice': '觸發價格', - 'notice.action': '操作', - 'notice.quantity': '數量', - 'notice.viewPortfolio': '查看持倉', - 'notice.type.aiMonitor': 'AI監控', - 'notice.type.priceAlert': '價格提醒', - 'notice.type.signal': '交易信號', - 'notice.type.buy': '買入信號', - 'notice.type.sell': '賣出信號', - 'notice.type.hold': '持有建議', - 'notice.type.trade': '交易執行', - 'notice.type.notification': '系統通知', - - 'user.login.userName': '用戶名', - 'user.login.password': '密碼', - 'user.login.username.placeholder': '賬戶: admin', - 'user.login.password.placeholder': '密碼: admin or ant.design', - 'user.login.message-invalid-credentials': '登錄失敗,請檢查郵箱和驗證碼', - 'user.login.message-invalid-verification-code': '驗證碼錯誤', - 'user.login.tab-login-credentials': '賬戶密碼登錄', - 'user.login.tab-login-email': '郵箱登錄', - 'user.login.tab-login-mobile': '手機號登錄', - 'user.login.captcha.placeholder': '請輸入圖形驗證碼', - 'user.login.mobile.placeholder': '手機號', - 'user.login.mobile.verification-code.placeholder': '驗證碼', - 'user.login.email.placeholder': '請輸入郵箱地址', - 'user.login.email.verification-code.placeholder': '請輸入驗證碼', - 'user.login.email.sending': '驗證碼發送中...', - 'user.login.email.send-success-title': '提示', - 'user.login.email.send-success': '驗證碼發送成功,請查收郵件', - 'user.login.sms.send-success': '驗證碼發送成功,請查收短信', - 'user.login.remember-me': '自動登錄', - 'user.login.forgot-password': '忘記密碼', - 'user.login.sign-in-with': '其他登錄方式', - 'user.login.signup': '注冊賬戶', - 'user.login.login': '登錄', - 'user.register.register': '注冊', - 'user.register.email.placeholder': '郵箱', - 'user.register.password.placeholder': '請至少輸入 6 個字符。請不要使用容易被猜到的密碼。', - 'user.register.password.popover-message': '請至少輸入 6 個字符。請不要使用容易被猜到的密碼。', - 'user.register.confirm-password.placeholder': '確認密碼', - 'user.register.get-verification-code': '獲取驗證碼', - 'user.register.sign-in': '使用已有賬戶登錄', - 'user.register-result.msg': '你的賬戶:{email} 注冊成功', - 'user.register-result.activation-email': '激活郵件已發送到你的郵箱中,郵件有效期爲24小時。請及時登錄郵箱,點擊郵件中的鏈接激活帳戶。', - 'user.register-result.back-home': '返回首頁', - 'user.register-result.view-mailbox': '查看郵箱', - 'user.email.required': '請輸入郵箱地址!', - 'user.email.wrong-format': '郵箱地址格式錯誤!', - 'user.userName.required': '請輸入帳戶名或郵箱地址', - 'user.password.required': '請輸入密碼!', - 'user.password.twice.msg': '兩次輸入的密碼不匹配!', - 'user.password.strength.msg': '密碼強度不夠 ', - 'user.password.strength.strong': '強度:強', - 'user.password.strength.medium': '強度:中', - 'user.password.strength.low': '強度:低', - 'user.password.strength.short': '強度:太短', - 'user.confirm-password.required': '請確認密碼!', - 'user.phone-number.required': '請輸入正確的手機號', - 'user.phone-number.wrong-format': '手機號格式錯誤!', - 'user.verification-code.required': '請輸入驗證碼!', - 'user.captcha.required': '請輸入圖形驗證碼!', - 'user.login.infos': 'QuantDinger 是一個 AI 多智能體股票分析輔助工具,不具備證券投資諮詢資質。平臺中的所有分析結果、評分、參考意見均由 AI 基於歷史數據自動生成,僅供學習、研究與技術交流使用,不構成任何投資建議或決策依據。股票投資存在市場風險、流動性風險、政策風險等多種風險,可能導致本金損失。用戶應基於自身風險承受能力獨立決策,使用本工具產生的任何投資行爲及其後果由用戶自行承擔。市場有風險,投資需謹慎。', - 'user.login.tab-login-web3': 'Web3 登錄', - 'user.login.web3.tip': '使用錢包進行籤名登錄', - 'user.login.web3.connect': '連接錢包並登錄', - 'user.login.web3.no-wallet': '未檢測到錢包', - 'user.login.web3.no-address': '未獲取到錢包地址', - 'user.login.web3.nonce-failed': '獲取隨機數失敗', - 'user.login.web3.verify-failed': '籤名驗證失敗', - 'user.login.web3.success': '登錄成功', - 'user.login.web3.failed': '錢包登錄失敗', - 'nav.no_wallet': '未檢測到錢包', - 'nav.copy': '復制', - 'nav.copy_success': '復制成功', - 'user.login.oauth.google': '使用 Google 登錄', - 'user.login.oauth.github': '使用 GitHub 登錄', - 'user.login.oauth.loading': '正在跳轉到授權頁面...', - 'user.login.oauth.failed': 'OAuth 登錄失敗', - 'user.login.oauth.get-url-failed': '獲取授權鏈接失敗', - 'user.login.subtitle': '驅動的全球市場量化洞察', - 'user.login.legal.title': '法律免責聲明', - 'user.login.legal.view': '查看法律免責聲明', - 'user.login.legal.collapse': '收起法律免責聲明', - 'user.login.legal.agree': '我已閱讀並同意法律免責聲明', - 'user.login.legal.required': '請先閱讀並勾選法律免責聲明', - 'user.login.legal.content': 'QuantDinger 是一個 AI 多智能體股票分析輔助工具,不具備證券投資諮詢資質。平臺中的所有分析結果、評分、參考意見均由 AI 基於歷史數據自動生成,僅供學習、研究與技術交流使用,不構成任何投資建議或決策依據。股票投資存在市場風險、流動性風險、政策風險等多種風險,可能導致本金損失。用戶應基於自身風險承受能力獨立決策,使用本工具產生的任何投資行爲及其後果由用戶自行承擔。市場有風險,投資需謹慎。', - 'user.login.privacy.title': '用戶隱私條款', - 'user.login.privacy.view': '查看用戶隱私條款', - 'user.login.privacy.collapse': '收起用戶隱私條款', - 'user.login.privacy.content': '我們重視您的隱私與數據保護。1) 收集範圍:僅收集實現功能所需的信息(如郵箱、手機號、區號、Web3 錢包地址)以及必要的日志與設備信息。2) 使用目的:用於賬戶登錄與安全校驗、服務功能提供、問題排查與合規要求。3) 存儲與安全:數據加密存儲,並採取必要的權限與訪問控制措施,盡力防止未經授權的訪問、披露或丟失。4) 共享與第三方:除法律法規要求或履行服務所必需外,不會與第三方共享您的個人信息;若涉及第三方服務(如錢包、短信服務商),僅在實現功能所需的最小範圍內處理。5) Cookies/本地存儲:用於登錄態與必要的會話維持(如令牌、PHPSESSID),您可在瀏覽器中進行清理或限制。6) 個人權利:您可根據法律法規行使查詢、更正、刪除、撤回同意等權利。7) 變更與通知:本條款更新後將在頁面顯著位置提示。繼續使用本服務即表示您已閱讀並同意更新內容。若您不同意本條款或其中任何更新,請停止使用本服務並聯系我們。', - 'account.basicInfo': '基礎信息', - 'account.id': '用戶ID', - 'account.username': '用戶名', - 'account.nickname': '暱稱', - 'account.email': '郵箱', - 'account.mobile': '手機號', - 'account.web3address': '錢包地址', - 'account.pid': '推薦人ID', - 'account.level': '用戶等級', - 'account.money': '餘額', - 'account.qdtBalance': 'QDT 餘額', - 'account.score': '積分', - 'account.createtime': '注冊時間', - 'account.inviteLink': '邀請鏈接', - 'account.recharge': '充值', - 'account.rechargeTip': '請使用微信或支付寶掃描下方二維碼進行充值', - 'account.qrCodePlaceholder': '二維碼佔位符(模擬)', - 'account.rechargeAmount': '充值金額', - 'account.enterAmount': '請輸入充值金額', - 'account.rechargeHint': '最小充值金額:1 QDT', - 'account.confirmRecharge': '確認充值', - 'account.enterValidAmount': '請輸入有效的充值金額', - 'account.rechargeSuccess': '充值成功!已充值 {amount} QDT', - 'account.settings.menuMap.basic': '基本設置', - 'account.settings.menuMap.security': '安全設置', - 'account.settings.menuMap.notification': '新消息通知', - 'account.settings.menuMap.moneyLog': '資金明細', - 'account.moneyLog.empty': '暫無資金明細', - 'account.moneyLog.total': '共 {total} 條記錄', - 'account.moneyLog.type.purchase': '購買指標', - 'account.moneyLog.type.recharge': '充值', - 'account.moneyLog.type.refund': '退款', - 'account.moneyLog.type.reward': '獎勵', - 'account.moneyLog.type.income': '指標收入', - 'account.moneyLog.type.commission': '平臺手續費', - 'wallet.balance': 'QDT 餘額', - 'wallet.recharge': '充值', - 'wallet.withdraw': '提現', - 'wallet.filter': '篩選', - 'wallet.reset': '重置', - 'wallet.totalRecharge': '累計充值', - 'wallet.totalWithdraw': '累計提現', - 'wallet.totalIncome': '累計收入', - 'wallet.records': '交易記錄與資金明細', - 'wallet.tradingRecords': '交易記錄', - 'wallet.moneyLog': '資金明細', - 'wallet.rechargeTip': '請使用微信或支付寶掃描下方二維碼進行充值', - 'wallet.qrCodePlaceholder': '二維碼佔位符(模擬)', - 'wallet.rechargeAmount': '充值金額', - 'wallet.enterAmount': '請輸入充值金額', - 'wallet.rechargeHint': '最小充值金額:1 QDT', - 'wallet.confirmRecharge': '確認充值', - 'wallet.enterValidAmount': '請輸入有效的充值金額', - 'wallet.rechargeSuccess': '充值成功!已充值 {amount} QDT', - 'wallet.rechargeFailed': '充值失敗', - 'wallet.withdrawTip': '請輸入提現金額和提現地址', - 'wallet.withdrawAmount': '提現金額', - 'wallet.enterWithdrawAmount': '請輸入提現金額', - 'wallet.withdrawHint': '最小提現金額:1 QDT', - 'wallet.withdrawAddress': '提現地址(可選)', - 'wallet.enterWithdrawAddress': '請輸入提現地址', - 'wallet.confirmWithdraw': '確認提現', - 'wallet.enterValidWithdrawAmount': '請輸入有效的提現金額', - 'wallet.insufficientBalance': '餘額不足', - 'wallet.withdrawSuccess': '提現成功!已提現 {amount} QDT', - 'wallet.withdrawFailed': '提現失敗', - 'wallet.noTradingRecords': '暫無交易記錄', - 'wallet.noMoneyLog': '暫無資金明細', - 'wallet.loadTradingRecordsFailed': '加載交易記錄失敗', - 'wallet.loadMoneyLogFailed': '加載資金明細失敗', - 'wallet.moneyLogTotal': '共 {total} 條記錄', - 'wallet.moneyLogTypeTitle': '類型', - 'wallet.moneyLogType.all': '全部類型', - 'wallet.table.time': '時間', - 'wallet.table.type': '類型', - 'wallet.table.price': '價格', - 'wallet.table.amount': '數量', - 'wallet.table.money': '金額', - 'wallet.table.balance': '餘額', - 'wallet.table.memo': '備注', - 'wallet.table.value': '價值', - 'wallet.table.profit': '盈虧', - 'wallet.table.commission': '手續費', - 'wallet.table.total': '共 {total} 條記錄', - 'wallet.tradeType.buy': '買入', - 'wallet.tradeType.sell': '賣出', - 'wallet.tradeType.liquidation': '強平', - 'wallet.tradeType.openLong': '開多', - 'wallet.tradeType.addLong': '加多', - 'wallet.tradeType.closeLong': '平多', - 'wallet.tradeType.closeLongStop': '止損平多', - 'wallet.tradeType.closeLongProfit': '止盈平多', - 'wallet.tradeType.openShort': '開空', - 'wallet.tradeType.addShort': '加空', - 'wallet.tradeType.closeShort': '平空', - 'wallet.tradeType.closeShortStop': '止損平空', - 'wallet.tradeType.closeShortProfit': '止盈平空', - 'wallet.moneyLogType.purchase': '購買指標', - 'wallet.moneyLogType.recharge': '充值', - 'wallet.moneyLogType.withdraw': '提現', - 'wallet.moneyLogType.refund': '退款', - 'wallet.moneyLogType.reward': '獎勵', - 'wallet.moneyLogType.income': '收入', - 'wallet.moneyLogType.commission': '手續費', - 'wallet.web3Address.required': '請先填寫Web3錢包地址', - 'wallet.web3Address.requiredDescription': '充值前需要先綁定您的Web3錢包地址,用於接收充值', - 'wallet.web3Address.placeholder': '請輸入您的Web3錢包地址(0x開頭)', - 'wallet.web3Address.save': '保存錢包地址', - 'wallet.web3Address.saveSuccess': '錢包地址保存成功', - 'wallet.web3Address.saveFailed': '保存錢包地址失敗', - 'wallet.web3Address.invalidFormat': '請輸入有效的Web3錢包地址(以太坊格式:0x開頭42位字符,或TRC20格式:T開頭34位字符)', - 'wallet.selectCoin': '選擇幣種', - 'wallet.selectChain': '選擇鏈', - 'wallet.chain.eth': 'ETH(ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'BSC', - 'wallet.targetQdtAmount': '想要兌換的QDT數量(可選)', - 'wallet.targetQdtAmount.placeholder': '請輸入想要兌換的QDT數量,當前QDT價格:{price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': '需要充值:{amount} USDT', - 'wallet.rechargeAddress': '充值地址', - 'wallet.copyAddress': '復制', - 'wallet.copySuccess': '復制成功!', - 'wallet.copyFailed': '復制失敗,請手動復制', - 'wallet.rechargeAddressHint': '請確保使用{chain}鏈向此地址充值{coin}', - 'wallet.qdtPrice.loading': '加載中...', - 'wallet.rechargeTip.new': '請選擇幣種和鏈,然後掃描下方二維碼進行充值', - 'wallet.exchangeRate': '1 QDT ≈ {rate} USDT', - 'wallet.withdrawableAmount': '可提現金額', - 'wallet.totalBalance': '總餘額', - 'wallet.insufficientWithdrawable': '可提現金額不足,當前可提現:{amount} QDT', - 'wallet.withdrawAddressRequired': '請輸入提現地址', - 'wallet.withdrawAddressHint': '請確保地址正確,提現後無法撤銷', - 'wallet.withdrawSubmitSuccess': '提現申請提交成功,請等待審核', - 'menu.footer.contactUs': '聯系我們', - 'menu.footer.getSupport': '獲取支持', - 'menu.footer.socialAccounts': '社交賬戶', - 'menu.footer.userAgreement': '用戶協議', - 'menu.footer.privacyPolicy': '隱私條例', - 'menu.footer.support': 'Support', - 'menu.footer.featureRequest': 'Feature request', - 'menu.footer.email': 'Email', - 'menu.footer.liveChat': '24/7 live chat', - 'dashboard.analysis.title': 'Multi-Dimensional Analysis', - 'dashboard.analysis.subtitle': 'AI驅動的綜合金融分析平臺', - 'dashboard.analysis.selectSymbol': '選擇或輸入標的代碼', - 'dashboard.analysis.selectModel': '選擇模型', - 'dashboard.analysis.startAnalysis': '開始分析', - 'dashboard.analysis.history': '歷史記錄', - 'dashboard.analysis.tab.overview': '綜合分析', - 'dashboard.analysis.tab.fundamental': '基本面', - 'dashboard.analysis.tab.technical': '技術', - 'dashboard.analysis.tab.news': '新聞', - 'dashboard.analysis.tab.sentiment': '情緒', - 'dashboard.analysis.tab.risk': '風險', - 'dashboard.analysis.tab.debate': '多空辯論', - 'dashboard.analysis.tab.decision': '最終決策', - 'dashboard.analysis.empty.selectSymbol': '選擇標的開始分析', - 'dashboard.analysis.empty.selectSymbolDesc': '從自選股列表中選擇或輸入標的代碼,獲取多維度AI分析報告', - 'dashboard.analysis.empty.startAnalysis': '點擊"開始分析"按鈕進行多維度分析', - 'dashboard.analysis.empty.startAnalysisDesc': '我們將從基本面、技術、新聞、情緒和風險等多個維度爲您提供全面的分析', - 'dashboard.analysis.empty.noData': '暫無{type}分析數據,請先進行綜合分析', - 'dashboard.analysis.empty.noWatchlist': '暫無自選股', - 'dashboard.analysis.empty.noHistory': '暫無歷史記錄', - 'dashboard.analysis.empty.watchlistHint': '暫無自選股,請先', - 'dashboard.analysis.empty.noDebateData': '暫無辯論數據', - 'dashboard.analysis.empty.noDecisionData': '暫無決策數據', - 'dashboard.analysis.empty.selectAgent': '請選擇一個 Agent 查看分析結果', - 'dashboard.analysis.loading.analyzing': '正在分析中,請稍候...', - 'dashboard.analysis.loading.fundamental': '正在分析基本面數據...', - 'dashboard.analysis.loading.technical': '正在分析技術指標...', - 'dashboard.analysis.loading.news': '正在分析新聞數據...', - 'dashboard.analysis.loading.sentiment': '正在分析市場情緒...', - 'dashboard.analysis.loading.risk': '正在評估風險...', - 'dashboard.analysis.loading.debate': '正在進行多空辯論...', - 'dashboard.analysis.loading.decision': '正在生成最終決策...', - 'dashboard.analysis.score.overall': '綜合評分', - 'dashboard.analysis.score.recommendation': '投資建議', - 'dashboard.analysis.score.confidence': '置信度', - 'dashboard.analysis.dimension.fundamental': '基本面', - 'dashboard.analysis.dimension.technical': '技術', - 'dashboard.analysis.dimension.news': '新聞', - 'dashboard.analysis.dimension.sentiment': '情緒', - 'dashboard.analysis.dimension.risk': '風險', - 'dashboard.analysis.card.dimensionScores': '各維度評分', - 'dashboard.analysis.card.overviewReport': '綜合分析報告', - 'dashboard.analysis.card.financialMetrics': '財務指標', - 'dashboard.analysis.card.fundamentalReport': '基本面分析報告', - 'dashboard.analysis.card.technicalIndicators': '技術指標', - 'dashboard.analysis.card.technicalReport': '技術分析報告', - 'dashboard.analysis.card.newsList': '相關新聞', - 'dashboard.analysis.card.newsReport': '新聞分析報告', - 'dashboard.analysis.card.sentimentIndicators': '情緒指標', - 'dashboard.analysis.card.sentimentReport': '情緒分析報告', - 'dashboard.analysis.card.riskMetrics': '風險指標', - 'dashboard.analysis.card.riskReport': '風險評估報告', - 'dashboard.analysis.card.bullView': '看漲觀點 (Bull)', - 'dashboard.analysis.card.bearView': '看跌觀點 (Bear)', - 'dashboard.analysis.card.researchConclusion': '研究員結論', - 'dashboard.analysis.card.traderPlan': '交易員計劃', - 'dashboard.analysis.card.riskDebate': '風險委員會辯論', - 'dashboard.analysis.card.finalDecision': '最終決策 (Final Decision)', - 'dashboard.analysis.card.tradePlanDetail': '交易計劃詳情', - 'dashboard.analysis.tradingPlan.entry_price': '入場價格', - 'dashboard.analysis.tradingPlan.position_size': '倉位大小', - 'dashboard.analysis.tradingPlan.stop_loss': '止損', - 'dashboard.analysis.tradingPlan.take_profit': '止盈', - 'dashboard.analysis.label.confidence': '置信度', - 'dashboard.analysis.label.keyPoints': '核心要點', - 'dashboard.analysis.label.riskWarning': '風險提示', - 'dashboard.analysis.risk.risky': '激進派觀點 (Risky)', - 'dashboard.analysis.risk.neutral': '中立派觀點 (Neutral)', - 'dashboard.analysis.risk.safe': '保守派觀點 (Safe)', - 'dashboard.analysis.risk.conclusion': '結論', - 'dashboard.analysis.feature.fundamental': '基本面分析', - 'dashboard.analysis.feature.technical': '技術分析', - 'dashboard.analysis.feature.news': '新聞分析', - 'dashboard.analysis.feature.sentiment': '情緒分析', - 'dashboard.analysis.feature.risk': '風險評估', - 'dashboard.analysis.watchlist.title': '我的自選股', - 'dashboard.analysis.watchlist.add': '添加', - 'dashboard.analysis.watchlist.addStock': '添加股票', - 'dashboard.analysis.modal.addStock.title': '添加自選股', - 'dashboard.analysis.modal.addStock.confirm': '確定', - 'dashboard.analysis.modal.addStock.cancel': '取消', - 'dashboard.analysis.modal.addStock.market': '市場類型', - 'dashboard.analysis.modal.addStock.marketPlaceholder': '請選擇市場', - 'dashboard.analysis.modal.addStock.marketRequired': '請選擇市場類型', - 'dashboard.analysis.modal.addStock.symbol': '股票代碼', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': '例如: AAPL, TSLA, GOOGL, 000001, BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': '請輸入股票代碼', - 'dashboard.analysis.modal.addStock.searchPlaceholder': '搜索標的代碼或名稱', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': '搜索或輸入標的代碼(如:AAPL、BTC/USDT、EUR/USD)', - 'dashboard.analysis.modal.addStock.searchOrInputHint': '支持搜索數據庫中的標的,或直接輸入代碼(系統將自動獲取名稱)', - 'dashboard.analysis.modal.addStock.search': '搜索', - 'dashboard.analysis.modal.addStock.searchResults': '搜索結果', - 'dashboard.analysis.modal.addStock.hotSymbols': '熱門標的', - 'dashboard.analysis.modal.addStock.noHotSymbols': '暫無熱門標的', - 'dashboard.analysis.modal.addStock.selectedSymbol': '已選標的', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': '請先選擇一個標的', - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': '請先選擇一個標的或輸入標的代碼', - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': '請輸入標的代碼', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': '請先選擇市場類型', - 'dashboard.analysis.modal.addStock.searchFailed': '搜索失敗,請稍後重試', - 'dashboard.analysis.modal.addStock.noSearchResults': '未找到匹配的標的', - 'dashboard.analysis.modal.addStock.willAutoFetchName': '系統將自動獲取名稱', - 'dashboard.analysis.modal.addStock.addDirectly': '直接添加', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': '名稱將在添加時自動獲取', - 'dashboard.analysis.market.AShare': 'A股', - 'dashboard.analysis.market.USStock': '美股', - 'dashboard.analysis.market.HShare': '港股', - 'dashboard.analysis.market.Crypto': '加密貨幣', - 'dashboard.analysis.market.Forex': '外匯', - 'dashboard.analysis.market.Futures': '期貨', - 'dashboard.analysis.modal.history.title': '歷史分析記錄', - 'dashboard.analysis.modal.history.viewResult': '查看結果', - 'dashboard.analysis.modal.history.completeTime': '完成時間', - 'dashboard.analysis.modal.history.error': '錯誤', - 'dashboard.analysis.status.pending': '待處理', - 'dashboard.analysis.status.processing': '處理中', - 'dashboard.analysis.status.completed': '已完成', - 'dashboard.analysis.status.failed': '失敗', - 'dashboard.analysis.message.selectSymbol': '請先選擇標的', - 'dashboard.analysis.message.taskCreated': '分析任務已創建,正在後臺執行...', - 'dashboard.analysis.message.analysisComplete': '分析完成', - 'dashboard.analysis.message.analysisCompleteCache': '分析完成(使用緩存數據)', - 'dashboard.analysis.message.analysisFailed': '分析失敗,請稍後重試', - 'dashboard.analysis.message.addStockSuccess': '添加成功', - 'dashboard.analysis.message.addStockFailed': '添加失敗', - 'dashboard.analysis.message.removeStockSuccess': '移除成功', - 'dashboard.analysis.message.removeStockFailed': '移除失敗', - 'dashboard.analysis.message.resumingAnalysis': '正在恢復分析任務...', - 'dashboard.analysis.message.deleteSuccess': '刪除成功', - 'dashboard.analysis.message.deleteFailed': '刪除失敗', - 'dashboard.analysis.modal.history.delete': '刪除', - 'dashboard.analysis.modal.history.deleteConfirm': '確定要刪除這條分析記錄嗎?', - 'dashboard.analysis.test': '工專路 {no} 號店', - 'dashboard.analysis.introduce': '指標說明', - 'dashboard.analysis.total-sales': '總銷售額', - 'dashboard.analysis.day-sales': '日均銷售額¥', - 'dashboard.analysis.visits': '訪問量', - 'dashboard.analysis.visits-trend': '訪問量趨勢', - 'dashboard.analysis.visits-ranking': '門店訪問量排名', - 'dashboard.analysis.day-visits': '日訪問量', - 'dashboard.analysis.week': '周同比', - 'dashboard.analysis.day': '日同比', - 'dashboard.analysis.payments': '支付筆數', - 'dashboard.analysis.conversion-rate': '轉化率', - 'dashboard.analysis.operational-effect': '運營活動效果', - 'dashboard.analysis.sales-trend': '銷售趨勢', - 'dashboard.analysis.sales-ranking': '門店銷售額排名', - 'dashboard.analysis.all-year': '全年', - 'dashboard.analysis.all-month': '本月', - 'dashboard.analysis.all-week': '本周', - 'dashboard.analysis.all-day': '今日', - 'dashboard.analysis.search-users': '搜索用戶數', - 'dashboard.analysis.per-capita-search': '人均搜索次數', - 'dashboard.analysis.online-top-search': '線上熱門搜索', - 'dashboard.analysis.the-proportion-of-sales': '銷售額類別佔比', - 'dashboard.analysis.dropdown-option-one': '操作一', - 'dashboard.analysis.dropdown-option-two': '操作二', - 'dashboard.analysis.channel.all': '全部渠道', - 'dashboard.analysis.channel.online': '線上', - 'dashboard.analysis.channel.stores': '門店', - 'dashboard.analysis.sales': '銷售額', - 'dashboard.analysis.traffic': '客流量', - 'dashboard.analysis.table.rank': '排名', - 'dashboard.analysis.table.search-keyword': '搜索關鍵詞', - 'dashboard.analysis.table.users': '用戶數', - 'dashboard.analysis.table.weekly-range': '周漲幅', - 'dashboard.indicator.selectSymbol': '選擇或輸入標的代碼', - 'dashboard.indicator.emptyWatchlistHint': '暫無自選股,請先添加', - 'dashboard.indicator.hint.selectSymbol': '請選擇標的開始分析', - 'dashboard.indicator.hint.selectSymbolDesc': '在上方搜索框中選擇或輸入股票代碼,查看K線圖表和技術指標', - 'dashboard.indicator.retry': '重試', - 'dashboard.indicator.panel.title': '技術指標', - 'dashboard.indicator.panel.realtimeOn': '關閉實時更新', - 'dashboard.indicator.panel.realtimeOff': '開啓實時更新', - 'dashboard.indicator.panel.themeLight': '切換到深色主題', - 'dashboard.indicator.panel.themeDark': '切換到淺色主題', - 'dashboard.indicator.section.enabled': '已啓用', - 'dashboard.indicator.section.added': '我添加的指標', - 'dashboard.indicator.section.custom': '自己創建的指標', - 'dashboard.indicator.section.bought': '我選購的指標', - 'dashboard.indicator.section.myCreated': '我創建的指標', - 'dashboard.indicator.empty': '暫無指標,請先添加或創建指標', - 'dashboard.indicator.buy': '購買指標', - 'dashboard.indicator.action.start': '啓動', - 'dashboard.indicator.action.stop': '關閉', - 'dashboard.indicator.action.edit': '編輯', - 'dashboard.indicator.action.delete': '刪除', - 'dashboard.indicator.action.backtest': '回測', - 'dashboard.indicator.status.normal': '正常', - 'dashboard.indicator.status.normalPermanent': '正常(永久有效)', - 'dashboard.indicator.status.expired': '已過期', - 'dashboard.indicator.expiry.permanent': '永久有效', - 'dashboard.indicator.expiry.noExpiry': '無到期時間', - 'dashboard.indicator.expiry.expired': '已過期:{date}', - 'dashboard.indicator.expiry.expiresOn': '到期時間:{date}', - 'dashboard.indicator.delete.confirmTitle': '確認刪除', - 'dashboard.indicator.delete.confirmContent': '確定要刪除指標"{name}"嗎?此操作不可恢復。', - 'dashboard.indicator.delete.confirmOk': '刪除', - 'dashboard.indicator.delete.confirmCancel': '取消', - 'dashboard.indicator.delete.success': '刪除成功', - 'dashboard.indicator.delete.failed': '刪除失敗', - 'dashboard.indicator.save.success': '保存成功', - 'dashboard.indicator.save.failed': '保存失敗', - 'dashboard.indicator.error.loadWatchlistFailed': '加載自選股失敗', - 'dashboard.indicator.error.chartNotReady': '圖表組件未初始化,請先選擇標的並等待圖表加載完成', - 'dashboard.indicator.error.chartMethodNotReady': '圖表組件方法未就緒,請稍後重試', - 'dashboard.indicator.error.chartExecuteNotReady': '圖表組件執行方法未就緒,請稍後重試', - 'dashboard.indicator.error.parseFailed': '無法解析Python代碼', - 'dashboard.indicator.error.parseFailedCheck': '無法解析Python代碼,請檢查代碼格式', - 'dashboard.indicator.error.addIndicatorFailed': '添加指標失敗', - 'dashboard.indicator.error.runIndicatorFailed': '運行指標失敗', - 'dashboard.indicator.error.pleaseLogin': '請先登錄', - 'dashboard.indicator.error.loadDataFailed': '數據加載失敗', - 'dashboard.indicator.error.loadDataFailedDesc': '請檢查網絡連接', - 'dashboard.indicator.error.tiingoSubscription': '外匯1分鐘數據需要 Tiingo 付費訂閱,請使用其他時間週期或升級訂閱', - 'dashboard.indicator.error.pythonEngineFailed': 'Python 引擎加載失敗,指標功能可能無法使用', - 'dashboard.indicator.error.chartInitFailed': '圖表初始化失敗', - 'dashboard.indicator.warning.enterCode': '請先輸入指標代碼', - 'dashboard.indicator.warning.pyodideLoadFailed': 'Python 引擎加載失敗', - 'dashboard.indicator.warning.pyodideLoadFailedDesc': '您當前所在區域或網絡環境無法使用該功能', - 'dashboard.indicator.warning.chartNotInitialized': '圖表未初始化,無法使用畫線工具', - 'dashboard.indicator.success.runIndicator': '指標運行成功', - 'dashboard.indicator.success.clearDrawings': '已清除所有畫線', - 'dashboard.indicator.sma': 'SMA (均線組合)', - 'dashboard.indicator.ema': 'EMA (指數均線組合)', - 'dashboard.indicator.rsi': 'RSI (相對強弱)', - 'dashboard.indicator.macd': 'MACD', - 'dashboard.indicator.bb': '布林帶 (Bollinger Bands)', - 'dashboard.indicator.atr': 'ATR (平均真實波幅)', - 'dashboard.indicator.cci': 'CCI (商品通道指數)', - 'dashboard.indicator.williams': 'Williams %R (威廉指標)', - 'dashboard.indicator.mfi': 'MFI (資金流量指標)', - 'dashboard.indicator.adx': 'ADX (平均趨向指數)', - 'dashboard.indicator.obv': 'OBV (能量潮)', - 'dashboard.indicator.adosc': 'ADOSC (積累/派發振蕩器)', - 'dashboard.indicator.ad': 'AD (積累/派發線)', - 'dashboard.indicator.kdj': 'KDJ (隨機指標)', - 'dashboard.indicator.signal.buy': 'BUY', - 'dashboard.indicator.signal.sell': 'SELL', - 'dashboard.indicator.signal.supertrendBuy': 'SuperTrend Buy', - 'dashboard.indicator.signal.supertrendSell': 'SuperTrend Sell', - 'dashboard.indicator.chart.kline': 'K線', - 'dashboard.indicator.chart.volume': '成交量', - 'dashboard.indicator.chart.uptrend': 'Up Trend', - 'dashboard.indicator.chart.downtrend': 'Down Trend', - 'dashboard.indicator.tooltip.time': '時間', - 'dashboard.indicator.tooltip.open': '開', - 'dashboard.indicator.tooltip.close': '收', - 'dashboard.indicator.tooltip.high': '高', - 'dashboard.indicator.tooltip.low': '低', - 'dashboard.indicator.tooltip.volume': '成交量', - 'dashboard.indicator.drawing.line': '線段', - 'dashboard.indicator.drawing.horizontalLine': '水平線', - 'dashboard.indicator.drawing.verticalLine': '垂直線', - 'dashboard.indicator.drawing.ray': '射線', - 'dashboard.indicator.drawing.straightLine': '直線', - 'dashboard.indicator.drawing.parallelLine': '平行線', - 'dashboard.indicator.drawing.priceLine': '價格線', - 'dashboard.indicator.drawing.priceChannel': '價格通道', - 'dashboard.indicator.drawing.fibonacciLine': '斐波那契線', - 'dashboard.indicator.drawing.clearAll': '清除所有畫線', - 'dashboard.indicator.market.AShare': 'A股', - 'dashboard.indicator.market.USStock': '美股', - 'dashboard.indicator.market.HShare': '港股', - 'dashboard.indicator.market.Crypto': '加密貨幣', - 'dashboard.indicator.market.Forex': '外匯', - 'dashboard.indicator.market.Futures': '期貨', - 'dashboard.indicator.create': '創建指標', - 'dashboard.indicator.editor.title': '創建/編輯指標', - 'dashboard.indicator.editor.name': '指標名稱', - 'dashboard.indicator.editor.nameRequired': '請輸入指標名稱', - 'dashboard.indicator.editor.namePlaceholder': '請輸入指標名稱', - 'dashboard.indicator.editor.description': '指標描述', - 'dashboard.indicator.editor.descriptionPlaceholder': '請輸入指標描述(可選)', - 'dashboard.indicator.editor.code': '指標腳本(Python)', - 'dashboard.indicator.editor.codeRequired': '請輸入指標代碼', - 'dashboard.indicator.editor.codePlaceholder': '請輸入Python代碼', - 'dashboard.indicator.editor.run': '運行', - 'dashboard.indicator.editor.runHint': '點擊運行按鈕可以在K線圖上預覽指標效果', - 'dashboard.indicator.editor.guide': '開發指南', - 'dashboard.indicator.editor.guideTitle': 'Python 指標開發指南', - 'dashboard.indicator.editor.save': '保存', - 'dashboard.indicator.editor.cancel': '取消', - 'dashboard.indicator.editor.unnamed': '未命名指標', - 'dashboard.indicator.editor.publishToCommunity': '發布到社區', - 'dashboard.indicator.editor.publishToCommunityHint': '發布後,其他用戶可以在社區中查看和使用您的指標', - 'dashboard.indicator.editor.indicatorType': '指標類型', - 'dashboard.indicator.editor.indicatorTypeRequired': '請選擇指標類型', - 'dashboard.indicator.editor.indicatorTypePlaceholder': '請選擇指標類型', - 'dashboard.indicator.editor.previewImage': '預覽圖', - 'dashboard.indicator.editor.uploadImage': '上傳圖片', - 'dashboard.indicator.editor.previewImageHint': '建議尺寸:800x400,大小不超過2MB', - 'dashboard.indicator.editor.pricing': '售價(QDT)', - 'dashboard.indicator.editor.pricingType.free': '免費', - 'dashboard.indicator.editor.pricingType.permanent': '永久', - 'dashboard.indicator.editor.pricingType.monthly': '月付', - 'dashboard.indicator.editor.price': '價格', - 'dashboard.indicator.editor.priceRequired': '請輸入價格', - 'dashboard.indicator.editor.pricePlaceholder': '請輸入價格', - 'dashboard.indicator.editor.pricingHint': '免費指標雖然價格爲0,但平臺會根據您的指標使用量和好評率給予獎勵(QDT)', - 'dashboard.indicator.editor.aiGenerate': '智能生成', - 'dashboard.indicator.editor.aiPromptPlaceholder': '請描述你的信號邏輯(只輸出 buy/sell)與繪圖(plots)。倉位/風控/加減倉請在回測配置中設定。', - 'dashboard.indicator.editor.aiGenerateBtn': 'AI生成代碼', - 'dashboard.indicator.editor.aiPromptRequired': '請輸入您的想法', - 'dashboard.indicator.editor.aiGenerateSuccess': '代碼生成成功', - 'dashboard.indicator.editor.aiGenerateError': '代碼生成失敗,請稍後重試', - 'dashboard.indicator.editor.verifyCode': '代碼檢查', - 'dashboard.indicator.editor.verifyCodeSuccess': '代碼檢查通過', - 'dashboard.indicator.editor.verifyCodeFailed': '代碼檢查未通過', - 'dashboard.indicator.editor.verifyCodeEmpty': '代碼不能為空', - 'dashboard.indicator.boundary.message': '提示:指標腳本只負責「計算 + 繪圖 + buy/sell 信號」;倉位、風控、加減倉、手續費/滑點屬於策略執行配置。', - 'dashboard.indicator.boundary.indicatorRule': "指標腳本請只輸出 buy/sell(並設定 df['buy']/df['sell'])。不要在腳本內撰寫倉位管理、止盈止損、加減倉。", - 'dashboard.indicator.boundary.backtestRule': '規則:同一根K線若出現主信號(buy/sell→開/平倉/反手),本K線將跳過所有加倉與減倉。', - 'dashboard.indicator.backtest.title': '指標回測', - 'dashboard.indicator.backtest.config': '回測參數', - 'dashboard.indicator.backtest.startDate': '開始日期', - 'dashboard.indicator.backtest.endDate': '結束日期', - 'dashboard.indicator.backtest.selectStartDate': '選擇開始日期', - 'dashboard.indicator.backtest.selectEndDate': '選擇結束日期', - 'dashboard.indicator.backtest.startDateRequired': '請選擇開始日期', - 'dashboard.indicator.backtest.endDateRequired': '請選擇結束日期', - 'dashboard.indicator.backtest.initialCapital': '初始資金', - 'dashboard.indicator.backtest.initialCapitalRequired': '請輸入初始資金', - 'dashboard.indicator.backtest.commission': '手續費率(%)', - 'dashboard.indicator.backtest.commissionHint': '按名義價值(含槓桿)收取;每筆成交(開/平倉)都會從餘額扣除。', - 'dashboard.indicator.backtest.leverage': '槓杆倍率', - 'dashboard.indicator.backtest.timeframe': 'K線週期', - 'dashboard.indicator.backtest.tradeDirection': '交易方向', - 'dashboard.indicator.backtest.longOnly': '做多', - 'dashboard.indicator.backtest.shortOnly': '做空', - 'dashboard.indicator.backtest.both': '雙向', - 'dashboard.indicator.backtest.run': '開始回測', - 'dashboard.indicator.backtest.rerun': '重新回測', - 'dashboard.indicator.backtest.close': '關閉', - 'dashboard.indicator.backtest.running': '正在進行指標回測...', - 'dashboard.indicator.backtest.loadingTip1': '正在獲取歷史K線數據...', - 'dashboard.indicator.backtest.loadingTip2': '正在執行策略信號計算...', - 'dashboard.indicator.backtest.loadingTip3': '正在模擬交易執行...', - 'dashboard.indicator.backtest.loadingTip4': '正在計算回測指標...', - 'dashboard.indicator.backtest.loadingTip5': '即將完成,請稍候...', - 'dashboard.indicator.backtest.results': '回測結果', - 'dashboard.indicator.backtest.totalReturn': '總收益率', - 'dashboard.indicator.backtest.annualReturn': '年化收益', - 'dashboard.indicator.backtest.maxDrawdown': '最大回撤', - 'dashboard.indicator.backtest.sharpeRatio': '夏普比率', - 'dashboard.indicator.backtest.winRate': '勝率', - 'dashboard.indicator.backtest.profitFactor': '盈虧比', - 'dashboard.indicator.backtest.totalTrades': '交易次數', - 'dashboard.indicator.totalReturn': '總收益率', - 'dashboard.indicator.annualReturn': '年化收益率', - 'dashboard.indicator.maxDrawdown': '最大回撤', - 'dashboard.indicator.sharpeRatio': '夏普比率', - 'dashboard.indicator.winRate': '勝率', - 'dashboard.indicator.profitFactor': '盈虧比', - 'dashboard.indicator.totalTrades': '總交易次數', - 'dashboard.indicator.backtest.totalCommission': '總手續費', - 'dashboard.indicator.backtest.equityCurve': '收益曲線', - 'dashboard.indicator.backtest.strategy': '指標收益', - 'dashboard.indicator.backtest.benchmark': '基準收益', - 'dashboard.indicator.backtest.tradeHistory': '交易記錄', - 'dashboard.indicator.backtest.tradeTime': '時間', - 'dashboard.indicator.backtest.tradeType': '類型', - 'dashboard.indicator.backtest.buy': '買入', - 'dashboard.indicator.backtest.sell': '賣出', - 'dashboard.indicator.backtest.liquidation': '爆倉', - 'dashboard.indicator.backtest.openLong': '開多', - 'dashboard.indicator.backtest.closeLong': '平多', - 'dashboard.indicator.backtest.closeLongStop': '平多(止損)', - 'dashboard.indicator.backtest.closeLongProfit': '平多(止盈)', - 'dashboard.indicator.backtest.addLong': '加多倉', - 'dashboard.indicator.backtest.openShort': '開空', - 'dashboard.indicator.backtest.closeShort': '平空', - 'dashboard.indicator.backtest.closeShortStop': '平空(止損)', - 'dashboard.indicator.backtest.closeShortProfit': '平空(止盈)', - 'dashboard.indicator.backtest.addShort': '加空倉', - 'dashboard.indicator.backtest.price': '價格', - 'dashboard.indicator.backtest.amount': '數量', - 'dashboard.indicator.backtest.balance': '賬戶餘額', - 'dashboard.indicator.backtest.profit': '盈虧', - 'dashboard.indicator.backtest.success': '回測完成', - 'dashboard.indicator.backtest.failed': '回測失敗,請稍後重試', - 'dashboard.indicator.backtest.quickSelect': '快速選擇', - // 多時間框架回測精度提示 - 'dashboard.indicator.backtest.precisionMode': '回測精度模式', - 'dashboard.indicator.backtest.estimatedCandles': '預計處理約 {count} 根K線', - 'dashboard.indicator.backtest.highPrecisionDesc': '使用1分鐘級別K線進行高精度回測,止損止盈觸發更精確', - 'dashboard.indicator.backtest.mediumPrecisionDesc': '回測區間超過30天,使用5分鐘級別K線以平衡精度與性能', - 'dashboard.indicator.backtest.standardModeWarning': '使用標準回測模式', - 'dashboard.indicator.backtest.standardModeDesc': '當前配置不支持高精度回測,將使用策略K線進行回測', - 'dashboard.indicator.backtest.onlyCryptoSupported': '高精度回測僅支持加密貨幣市場', - 'dashboard.indicator.backtest.noIndicatorCode': '該指標沒有可回測的代碼', - 'dashboard.indicator.backtest.noSymbol': '請先選擇交易標的', - 'dashboard.indicator.backtest.dateRangeExceeded': '回測時間範圍超出限制:{timeframe}周期最多可回測{maxRange}', - 'dashboard.indicator.backtest.dateRangeExceededDays': '回測時間範圍超出限制:{timeframe}周期最多可回測{maxRange}({maxDays}天)', - 'dashboard.indicator.backtest.metaLine': '標的:{symbol} | 市場:{market} | 週期:{timeframe}', - 'dashboard.indicator.backtest.savedRunId': '回測已保存,記錄ID:{id}', - 'dashboard.indicator.backtest.historyTitle': '回測記錄', - 'dashboard.indicator.backtest.historyRefresh': '重新整理', - 'dashboard.indicator.backtest.historyView': '查看', - 'dashboard.indicator.backtest.historyNoData': '暫無回測記錄', - 'dashboard.indicator.backtest.historyUseCurrent': '僅目前幣種/週期', - 'dashboard.indicator.backtest.historyFilterSymbol': '幣種(Symbol)', - 'dashboard.indicator.backtest.historyFilterTimeframe': '週期(Timeframe)', - 'dashboard.indicator.backtest.historyApply': '套用篩選', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AI分析', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI 分析建議', - 'dashboard.indicator.backtest.historyNoAIResult': '暫無 AI 分析結果', - 'dashboard.indicator.backtest.historyRunId': '記錄ID', - 'dashboard.indicator.backtest.historyCreatedAt': '時間', - 'dashboard.indicator.backtest.historyRange': '區間', - 'dashboard.indicator.backtest.historyStatus': '狀態', - 'dashboard.indicator.backtest.historyStatusSuccess': '成功', - 'dashboard.indicator.backtest.historyStatusFailed': '失敗', - 'dashboard.indicator.backtest.historyActions': '操作', - 'dashboard.indicator.backtest.prev': '上一步', - 'dashboard.indicator.backtest.next': '下一步', - 'dashboard.indicator.backtest.steps.strategy.title': '執行配置', - 'dashboard.indicator.backtest.steps.strategy.desc': '倉位/風控/加減倉(策略層)', - 'dashboard.indicator.backtest.steps.trading.title': '回測環境', - 'dashboard.indicator.backtest.steps.trading.desc': '時間/資金/費率/槓桿/滑點', - 'dashboard.indicator.backtest.steps.results.title': '結果', - 'dashboard.indicator.backtest.steps.results.desc': '統計與交易明細', - 'dashboard.indicator.backtest.panel.risk': '執行配置:風控(止損/移動止盈)', - 'dashboard.indicator.backtest.panel.scale': '執行配置:加倉(順勢/逆勢)', - 'dashboard.indicator.backtest.panel.reduce': '執行配置:減倉(順勢/逆勢)', - 'dashboard.indicator.backtest.panel.position': '執行配置:開倉倉位', - 'dashboard.indicator.backtest.field.stopLossPct': '止損(%)', - 'dashboard.indicator.backtest.field.takeProfitPct': '止盈(%)', - 'dashboard.indicator.backtest.field.trailingEnabled': '移動止盈', - 'dashboard.indicator.backtest.field.trailingStopPct': '移動回撤(%)', - 'dashboard.indicator.backtest.field.trailingActivationPct': '移動止盈激活(%)', - 'dashboard.indicator.backtest.field.slippage': '滑點(%)', - 'dashboard.indicator.backtest.field.trendAddEnabled': '順勢加倉', - 'dashboard.indicator.backtest.field.dcaAddEnabled': '逆勢加倉', - 'dashboard.indicator.backtest.field.trendAddStepPct': '加倉觸發(%)', - 'dashboard.indicator.backtest.field.dcaAddStepPct': '加倉觸發(%)', - 'dashboard.indicator.backtest.field.trendAddSizePct': '每次加倉資金占比(%)', - 'dashboard.indicator.backtest.field.dcaAddSizePct': '每次加倉資金占比(%)', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': '最多加倉次數', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': '最多加倉次數', - 'dashboard.indicator.backtest.field.trendReduceEnabled': '順勢減倉', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': '逆勢減倉', - 'dashboard.indicator.backtest.field.trendReduceStepPct': '順勢觸發(%)', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': '逆勢觸發(%)', - 'dashboard.indicator.backtest.field.trendReduceSizePct': '每次減倉比例(%)', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': '每次逆勢減倉比例(%)', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': '最多順勢減倉次數', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': '最多逆勢減倉次數', - 'dashboard.indicator.backtest.field.entryPct': '開倉資金占比(%)', - 'dashboard.indicator.backtest.field.minOrderPct': '單次最小資金占比(%)(可選)', - 'dashboard.indicator.backtest.hint.entryPctMax': '最大可開倉:{maxPct}%(為後續加倉預留資金)', - 'dashboard.indicator.backtest.closeLongTrailing': '平多(移動止損/止盈)', - 'dashboard.indicator.backtest.reduceLong': '多頭減倉', - 'dashboard.indicator.backtest.closeShortTrailing': '平空(移動止損/止盈)', - 'dashboard.indicator.backtest.reduceShort': '空頭減倉', - 'dashboard.docs.title': '文檔中心', - 'dashboard.docs.search.placeholder': '搜索文檔...', - 'dashboard.docs.category.all': '全部', - 'dashboard.docs.category.guide': '開發指南', - 'dashboard.docs.category.api': 'API文檔', - 'dashboard.docs.category.tutorial': '教程', - 'dashboard.docs.category.faq': '常見問題', - 'dashboard.docs.featured.title': '推薦文檔', - 'dashboard.docs.featured.tag': '推薦', - 'dashboard.docs.list.views': '瀏覽', - 'dashboard.docs.list.author': '作者', - 'dashboard.docs.list.empty': '暫無文檔', - 'dashboard.docs.list.backToAll': '返回全部文檔', - 'dashboard.docs.list.total': '共 {count} 篇文檔', - 'dashboard.docs.detail.back': '返回文檔列表', - 'dashboard.docs.detail.updatedAt': '更新於', - 'dashboard.docs.detail.related': '相關文檔', - 'dashboard.docs.detail.notFound': '文檔不存在', - 'dashboard.docs.detail.error': '文檔不存在或已被刪除', - 'dashboard.docs.search.result': '搜索結果', - 'dashboard.docs.search.keyword': '關鍵詞', - 'community.filter.indicatorType': '指標類型', - 'community.filter.all': '全部', - 'community.filter.other': '其他選項', - 'community.filter.pricing': '定價類型', - 'community.filter.allPricing': '全部定價', - 'community.filter.sortBy': '排序方式', - 'community.filter.search': '搜索', - 'community.filter.searchPlaceholder': '搜索指標名稱', - 'community.indicatorType.trend': '趨勢型', - 'community.indicatorType.momentum': '動量型', - 'community.indicatorType.volatility': '波動率', - 'community.indicatorType.volume': '成交量', - 'community.indicatorType.custom': '自定義', - 'community.pricing.free': '免費', - 'community.pricing.paid': '付費', - 'community.sort.downloads': '下載量', - 'community.sort.rating': '評分', - 'community.sort.newest': '最新發布', - 'community.pagination.total': '共 {total} 個指標', - 'community.noDescription': '暫無描述', - 'community.detail.type': '類型', - 'community.detail.pricing': '定價', - 'community.detail.rating': '評分', - 'community.detail.downloads': '下載量', - 'community.detail.author': '作者', - 'community.detail.description': '簡介', - 'community.detail.detailContent': '詳細說明', - 'community.detail.backtestStats': '回測統計', - 'community.action.purchase': '購買指標', - 'community.action.addToMyIndicators': '添加到我的指標', - 'community.action.favorite': '收藏', - 'community.action.unfavorite': '取消收藏', - 'community.action.buyNow': '立即購買', - 'community.action.renew': '續費', - 'community.purchase.price': '價格', - 'community.purchase.permanent': '永久', - 'community.purchase.monthly': '月', - 'community.purchase.confirmBuy': '確認購買該指標({price} QDT)?', - 'community.purchase.confirmRenew': '確認續費該指標({price} QDT/月)?', - 'community.purchase.confirmFree': '確認添加該免費指標?', - 'community.purchase.confirmTitle': '確認操作', - 'community.purchase.owned': '您已購買該指標(永久有效)', - 'community.purchase.ownIndicator': '這是您發布的指標', - 'community.purchase.expired': '您的訂閱已過期', - 'community.purchase.expiresOn': '到期時間:{date}', - 'community.tabs.detail': '指標詳情', - 'community.tabs.backtest': '回測數據', - 'community.tabs.ratings': '用戶評價', - 'community.rating.myRating': '我的評分', - 'community.rating.stars': '{count} 星', - 'community.rating.commentPlaceholder': '分享您的使用體驗...', - 'community.rating.submit': '提交評分', - 'community.rating.modify': '修改', - 'community.rating.saveModify': '保存修改', - 'community.rating.cancel': '取消', - 'community.rating.selectRating': '請選擇評分', - 'community.rating.success': '評分成功', - 'community.rating.modifySuccess': '修改評價成功', - 'community.rating.failed': '評分失敗', - 'community.rating.noRatings': '暫無評價', - 'community.backtest.note': '以上數據爲歷史回測結果,僅供參考,不代表未來收益', - 'community.backtest.noData': '暫無回測數據', - 'community.backtest.uploadHint': '作者尚未上傳回測數據', - 'community.message.loadFailed': '加載指標列表失敗', - 'community.message.purchaseProcessing': '正在處理購買請求...', - 'community.message.downloadSuccess': '指標已添加到我的指標列表', - 'community.message.favoriteSuccess': '收藏成功', - 'community.message.unfavoriteSuccess': '取消收藏成功', - 'community.message.operationSuccess': '操作成功', - 'community.message.operationFailed': '操作失敗', - 'community.banner.readOnly': '僅供瀏覽', - 'community.banner.loginHint': '如需登錄註冊請點擊按鈕跳轉到獨立頁面,從而避免CSRF問題', - 'community.banner.jumpButton': '跳轉到登錄/註冊', - 'dashboard.totalEquity': '總權益', - 'dashboard.totalPnL': '總盈虧', - 'dashboard.aiStrategies': 'AI 策略', - 'dashboard.indicatorStrategies': '指標策略', - 'dashboard.running': '運行中', - 'dashboard.enabled': '已啟用', - 'dashboard.pnlHistory': '歷史盈虧', - 'dashboard.strategyPerformance': '策略盈虧佔比', - 'dashboard.drawdown': '回撤曲線', - 'dashboard.strategyRanking': '策略排行榜', - // New KPI labels - 'dashboard.winRate': '勝率', - 'dashboard.profitFactor': '盈虧比', - 'dashboard.maxDrawdown': '最大回撤', - 'dashboard.totalTrades': '總交易', - 'dashboard.runningStrategies': '運行中策略', - 'dashboard.equityCurve': '權益曲線', - 'dashboard.strategyAllocation': '策略分佈', - 'dashboard.drawdownCurve': '回撤曲線', - 'dashboard.hourlyDistribution': '交易時段', - // Chart labels - 'dashboard.dailyPnl': '日盈虧', - 'dashboard.cumulativePnl': '累計盈虧', - 'dashboard.tradeCount': '交易次數', - 'dashboard.profit': '盈虧', - 'dashboard.noData': '暫無數據', - 'dashboard.noStrategyData': '暫無策略數據', - // Ranking labels - 'dashboard.ranking.totalProfit': '總收益', - 'dashboard.ranking.roi': '收益率', - 'dashboard.ranking.trades': '交易數', - // Units and labels - 'dashboard.unit.trades': '筆', - 'dashboard.unit.strategies': '個', - 'dashboard.label.avgDaily': '日均', - 'dashboard.label.avgProfit': '平均盈利', - 'dashboard.label.win': '勝', - 'dashboard.label.lose': '負', - 'dashboard.label.trade': '交易', - 'dashboard.label.indicator': '指標', - 'dashboard.label.totalPnl': '總盈虧', - 'dashboard.label.maxDrawdownPoint': '最大回撤', - 'dashboard.profitCalendar': '收益日曆', - 'dashboard.recentTrades': '最近交易', - 'dashboard.currentPositions': '當前持倉', - 'dashboard.table.time': '時間', - 'dashboard.table.strategy': '策略名稱', - 'dashboard.table.symbol': '標的', - 'dashboard.table.type': '類型', - 'dashboard.table.side': '方向', - 'dashboard.table.size': '持倉量', - 'dashboard.table.entryPrice': '開倉均價', - 'dashboard.table.price': '價格', - 'dashboard.table.amount': '數量', - 'dashboard.table.profit': '盈虧', - 'dashboard.pendingOrders': '訂單執行記錄', - 'dashboard.totalOrders': '共 {total} 條', - 'dashboard.viewError': '查看錯誤', - 'dashboard.filled': '已成交', - 'dashboard.orderTable.time': '創建時間', - 'dashboard.orderTable.strategy': '策略', - 'dashboard.orderTable.symbol': '交易對', - 'dashboard.orderTable.signalType': '信號類型', - 'dashboard.orderTable.amount': '數量', - 'dashboard.orderTable.price': '成交價', - 'dashboard.orderTable.status': '狀態', - 'dashboard.orderTable.timeInfo': '時間', - 'dashboard.orderTable.executedAt': '執行時間', - 'dashboard.orderTable.exchange': '交易所', - 'dashboard.orderTable.notify': '通知方式', - 'dashboard.orderTable.actions': '操作', - 'dashboard.orderTable.delete': '刪除', - 'dashboard.orderTable.deleteConfirm': '確認刪除這條記錄?', - 'dashboard.orderTable.deleteSuccess': '刪除成功', - 'dashboard.orderTable.deleteFailed': '刪除失敗', - 'dashboard.newOrderNotify': '新訂單提醒', - 'dashboard.newOrderDesc': '有新的訂單執行記錄', - 'dashboard.soundEnabled': '聲音提醒已開啟', - 'dashboard.soundDisabled': '聲音提醒已關閉', - 'dashboard.clickToMute': '點擊關閉聲音提醒', - 'dashboard.clickToUnmute': '點擊開啟聲音提醒', - 'dashboard.signalType.openLong': '開多', - 'dashboard.signalType.openShort': '開空', - 'dashboard.signalType.closeLong': '平多', - 'dashboard.signalType.closeShort': '平空', - 'dashboard.signalType.addLong': '加多', - 'dashboard.signalType.addShort': '加空', - 'dashboard.status.pending': '待處理', - 'dashboard.status.processing': '處理中', - 'dashboard.status.completed': '已完成', - 'dashboard.status.failed': '失敗', - 'dashboard.status.cancelled': '已取消', - 'dashboard.table.pnl': '未實現盈虧', - 'form.basic-form.basic.title': '基礎表單', - 'form.basic-form.basic.description': '表單頁用於向用戶收集或驗證信息,基礎表單常見於數據項較少的表單場景。', - 'form.basic-form.title.label': '標題', - 'form.basic-form.title.placeholder': '給目標起個名字', - 'form.basic-form.title.required': '請輸入標題', - 'form.basic-form.date.label': '起止日期', - 'form.basic-form.placeholder.start': '開始日期', - 'form.basic-form.placeholder.end': '結束日期', - 'form.basic-form.date.required': '請選擇起止日期', - 'form.basic-form.goal.label': '目標描述', - 'form.basic-form.goal.placeholder': '請輸入你的階段性工作目標', - 'form.basic-form.goal.required': '請輸入目標描述', - 'form.basic-form.standard.label': '衡量標準', - 'form.basic-form.standard.placeholder': '請輸入衡量標準', - 'form.basic-form.standard.required': '請輸入衡量標準', - 'form.basic-form.client.label': '客戶', - 'form.basic-form.client.required': '請描述你服務的客戶', - 'form.basic-form.label.tooltip': '目標的服務對象', - 'form.basic-form.client.placeholder': '請描述你服務的客戶,內部客戶直接 @姓名/工號', - 'form.basic-form.invites.label': '邀評人', - 'form.basic-form.invites.placeholder': '請直接 @姓名/工號,最多可邀請 5 人', - 'form.basic-form.weight.label': '權重', - 'form.basic-form.weight.placeholder': '請輸入', - 'form.basic-form.public.label': '目標公開', - 'form.basic-form.label.help': '客戶、邀評人默認被分享', - 'form.basic-form.radio.public': '公開', - 'form.basic-form.radio.partially-public': '部分公開', - 'form.basic-form.radio.private': '不公開', - 'form.basic-form.publicUsers.placeholder': '公開給', - 'form.basic-form.option.A': '同事一', - 'form.basic-form.option.B': '同事二', - 'form.basic-form.option.C': '同事三', - 'form.basic-form.email.required': '請輸入郵箱地址!', - 'form.basic-form.email.wrong-format': '郵箱地址格式錯誤!', - 'form.basic-form.userName.required': '請輸入用戶名!', - 'form.basic-form.password.required': '請輸入密碼!', - 'form.basic-form.password.twice': '兩次輸入的密碼不匹配!', - 'form.basic-form.strength.msg': '請至少輸入 6 個字符。請不要使用容易被猜到的密碼。', - 'form.basic-form.strength.strong': '強度:強', - 'form.basic-form.strength.medium': '強度:中', - 'form.basic-form.strength.short': '強度:太短', - 'form.basic-form.confirm-password.required': '請確認密碼!', - 'form.basic-form.phone-number.required': '請輸入手機號!', - 'form.basic-form.phone-number.wrong-format': '手機號格式錯誤!', - 'form.basic-form.verification-code.required': '請輸入驗證碼!', - 'form.basic-form.form.get-captcha': '獲取驗證碼', - 'form.basic-form.captcha.second': '秒', - 'form.basic-form.form.optional': '(選填)', - 'form.basic-form.form.submit': '提交', - 'form.basic-form.form.save': '保存', - 'form.basic-form.email.placeholder': '郵箱', - 'form.basic-form.password.placeholder': '至少6位密碼,區分大小寫', - 'form.basic-form.confirm-password.placeholder': '確認密碼', - 'form.basic-form.phone-number.placeholder': '手機號', - 'form.basic-form.verification-code.placeholder': '驗證碼', - 'result.success.title': '提交成功', - 'result.success.description': '提交結果頁用於反饋一系列操作任務的處理結果, 如果僅是簡單操作,使用 Message 全局提示反饋即可。 本文字區域可以展示簡單的補充說明,如果有類似展示 “單據”的需求,下面這個灰色區域可以呈現比較復雜的內容。', - 'result.success.operate-title': '項目名稱', - 'result.success.operate-id': '項目 ID', - 'result.success.principal': '負責人', - 'result.success.operate-time': '生效時間', - 'result.success.step1-title': '創建項目', - 'result.success.step1-operator': '曲麗麗', - 'result.success.step2-title': '部門初審', - 'result.success.step2-operator': '周毛毛', - 'result.success.step2-extra': '催一下', - 'result.success.step3-title': '財務復核', - 'result.success.step4-title': '完成', - 'result.success.btn-return': '返回列表', - 'result.success.btn-project': '查看項目', - 'result.success.btn-print': '打印', - 'result.fail.error.title': '提交失敗', - 'result.fail.error.description': '請核對並修改以下信息後,再重新提交。', - 'result.fail.error.hint-title': '您提交的內容有如下錯誤:', - 'result.fail.error.hint-text1': '您的賬戶已被凍結', - 'result.fail.error.hint-btn1': '立即解凍', - 'result.fail.error.hint-text2': '您的賬戶還不具備申請資格', - 'result.fail.error.hint-btn2': '立即升級', - 'result.fail.error.btn-text': '返回修改', - 'account.settings.menuMap.custom': '個性化', - 'account.settings.menuMap.binding': '賬號綁定', - 'account.settings.basic.avatar': '頭像', - 'account.settings.basic.change-avatar': '更換頭像', - 'account.settings.basic.email': '郵箱', - 'account.settings.basic.email-message': '請輸入您的郵箱!', - 'account.settings.basic.nickname': '暱稱', - 'account.settings.basic.nickname-message': '請輸入您的暱稱!', - 'account.settings.basic.profile': '個人簡介', - 'account.settings.basic.profile-message': '請輸入個人簡介!', - 'account.settings.basic.profile-placeholder': '個人簡介', - 'account.settings.basic.country': '國家/地區', - 'account.settings.basic.country-message': '請輸入您的國家或地區!', - 'account.settings.basic.geographic': '所在省市', - 'account.settings.basic.geographic-message': '請輸入您的所在省市!', - 'account.settings.basic.address': '街道地址', - 'account.settings.basic.address-message': '請輸入您的街道地址!', - 'account.settings.basic.phone': '聯系電話', - 'account.settings.basic.phone-message': '請輸入您的聯系電話!', - 'account.settings.basic.update': '更新基本信息', - 'account.settings.basic.update.success': '更新基本信息成功', - 'account.settings.security.strong': '強', - 'account.settings.security.medium': '中', - 'account.settings.security.weak': '弱', - 'account.settings.security.password': '賬戶密碼', - 'account.settings.security.password-description': '當前密碼強度:', - 'account.settings.security.phone': '密保手機', - 'account.settings.security.phone-description': '已綁定手機:', - 'account.settings.security.question': '密保問題', - 'account.settings.security.question-description': '未設置密保問題,密保問題可有效保護賬戶安全', - 'account.settings.security.email': '綁定郵箱', - 'account.settings.security.email-description': '已綁定郵箱:', - 'account.settings.security.mfa': 'MFA 設備', - 'account.settings.security.mfa-description': '未綁定 MFA 設備,綁定後,可以進行二次確認', - 'account.settings.security.modify': '修改', - 'account.settings.security.set': '設置', - 'account.settings.security.bind': '綁定', - 'account.settings.binding.taobao': '綁定淘寶', - 'account.settings.binding.taobao-description': '當前未綁定淘寶賬號', - 'account.settings.binding.alipay': '綁定支付寶', - 'account.settings.binding.alipay-description': '當前未綁定支付寶賬號', - 'account.settings.binding.dingding': '綁定釘釘', - 'account.settings.binding.dingding-description': '當前未綁定釘釘賬號', - 'account.settings.binding.bind': '綁定', - 'account.settings.notification.password': '賬戶密碼', - 'account.settings.notification.password-description': '其他用戶的消息將以站內信的形式通知', - 'account.settings.notification.messages': '系統消息', - 'account.settings.notification.messages-description': '系統消息將以站內信的形式通知', - 'account.settings.notification.todo': '待辦任務', - 'account.settings.notification.todo-description': '待辦任務將以站內信的形式通知', - 'account.settings.settings.open': '開', - 'account.settings.settings.close': '關', - 'trading-assistant.title': '交易助手', - 'trading-assistant.strategyList': '策略列表', - 'trading-assistant.createStrategy': '創建策略', - 'trading-assistant.noStrategy': '暫無策略', - 'trading-assistant.selectStrategy': '請從左側選擇一個策略查看詳情', - 'trading-assistant.startStrategy': '啓動策略', - 'trading-assistant.stopStrategy': '停止策略', - 'trading-assistant.editStrategy': '編輯策略', - 'trading-assistant.deleteStrategy': '刪除策略', - 'trading-assistant.startAll': '全部啟動', - 'trading-assistant.stopAll': '全部停止', - 'trading-assistant.deleteAll': '全部刪除', - 'trading-assistant.symbolCount': '個幣種', - 'trading-assistant.status.running': '運行中', - 'trading-assistant.status.stopped': '已停止', - 'trading-assistant.status.error': '錯誤', - 'trading-assistant.strategyType.IndicatorStrategy': '技術指標策略', - 'trading-assistant.strategyType.PromptBasedStrategy': '提示詞策略', - 'trading-assistant.strategyType.GridStrategy': '網格策略', - 'trading-assistant.tabs.tradingRecords': '交易記錄', - 'trading-assistant.tabs.positions': '持倉記錄', - 'trading-assistant.tabs.equityCurve': '淨值曲線', - 'trading-assistant.form.step1': '選擇指標', - 'trading-assistant.form.step2': '交易所配置', - 'trading-assistant.form.step3': '策略參數', - 'trading-assistant.form.step2Params': '策略參數', - 'trading-assistant.form.step3Signal': '信號通知', - 'trading-assistant.form.indicator': '選擇指標', - 'trading-assistant.form.indicatorHint': '只能選擇您已購買或創建的技術指標', - 'trading-assistant.form.qdtCostHints': '使用策略將消耗QDT,請確保賬戶有足夠的QDT餘額', - 'trading-assistant.form.indicatorDescription': '指標描述', - 'trading-assistant.form.noDescription': '暫無描述', - 'trading-assistant.form.exchange': '選擇交易所', - 'trading-assistant.form.apiKey': 'API Key', - 'trading-assistant.form.secretKey': 'Secret Key', - 'trading-assistant.form.passphrase': 'Passphrase', - 'trading-assistant.form.testConnection': '測試連接', - 'trading-assistant.form.strategyName': '策略名稱', - 'trading-assistant.form.symbol': '交易對', - 'trading-assistant.form.symbols': '交易對(多選)', - 'trading-assistant.form.symbolHint': '目前僅支持加密貨幣交易對', - 'trading-assistant.form.symbolHintCrypto': '加密貨幣:使用BTC/USDT等交易對格式', - 'trading-assistant.form.symbolsHint': '選擇多個交易對,將自動創建多個策略', - 'trading-assistant.form.initialCapital': '投入金額', - 'trading-assistant.form.marketType': '市場類型', - 'trading-assistant.form.marketTypeFutures': '合約', - 'trading-assistant.form.marketTypeSpot': '現貨', - 'trading-assistant.form.marketTypeHint': '合約支持雙向交易和槓杆,現貨僅支持做多且槓杆固定爲1倍', - 'trading-assistant.form.leverage': '槓杆倍數', - 'trading-assistant.form.leverageHint': '合約:1-125倍,現貨:固定1倍', - 'trading-assistant.form.spotLeverageFixed': '現貨交易槓杆固定爲1倍', - 'trading-assistant.form.spotOnlyLongHint': '現貨交易僅支持做多', - 'trading-assistant.form.tradeDirection': '交易方向', - 'trading-assistant.form.tradeDirectionLong': '僅做多', - 'trading-assistant.form.tradeDirectionShort': '僅做空', - 'trading-assistant.form.tradeDirectionBoth': '雙向交易', - 'trading-assistant.form.timeframe': '時間周期', - 'trading-assistant.form.klinePeriod': 'K線周期', - 'trading-assistant.form.timeframe1m': '1分鍾', - 'trading-assistant.form.timeframe5m': '5分鍾', - 'trading-assistant.form.timeframe15m': '15分鍾', - 'trading-assistant.form.timeframe30m': '30分鍾', - 'trading-assistant.form.timeframe1H': '1小時', - 'trading-assistant.form.timeframe4H': '4小時', - 'trading-assistant.form.timeframe1D': '1天', - 'trading-assistant.form.selectStrategyType': '選擇策略類型', - 'trading-assistant.form.indicatorStrategy': '指標策略', - 'trading-assistant.form.indicatorStrategyDesc': '基於技術指標的自動化交易策略', - 'trading-assistant.form.aiStrategy': 'AI策略', - 'trading-assistant.form.aiStrategyDesc': '基於AI智能決策的自動化交易策略', - 'trading-assistant.form.enableAiFilter': '啟用AI智能決策過濾', - 'trading-assistant.form.enableAiFilterHint': '啟用後,指標信號將經過AI智能過濾,提高交易質量', - 'trading-assistant.form.aiFilterPrompt': '自定義提示詞', - 'trading-assistant.form.aiFilterPromptHint': '為AI過濾提供自定義指令,留空則使用系統默認', - 'trading-assistant.form.executionMode': '執行模式', - 'trading-assistant.form.executionModeSignal': '僅信號通知', - 'trading-assistant.form.executionModeLive': '實盤自動交易', - 'trading-assistant.form.liveTradingCryptoOnlyHint': '實盤交易功能僅支持加密貨幣市場', - 'trading-assistant.form.notifyChannels': '通知渠道', - 'trading-assistant.form.notifyChannelsHint': '選擇信號觸發時的通知方式', - 'trading-assistant.form.notifyEmail': '郵箱地址', - 'trading-assistant.form.notifyPhone': '手機號碼', - 'trading-assistant.form.notifyTelegram': 'Telegram ID', - 'trading-assistant.form.notifyDiscord': 'Discord Webhook', - 'trading-assistant.form.notifyWebhook': 'Webhook 地址', - 'trading-assistant.form.liveTradingConfigTitle': '實盤交易配置', - 'trading-assistant.form.liveTradingConfigHint': '請填寫交易所API資訊,實盤交易將使用您的API進行真實交易', - 'trading-assistant.form.savedCredential': '已儲存的憑證', - 'trading-assistant.form.savedCredentialHint': '選擇已儲存的交易所憑證,自動填充API配置', - 'trading-assistant.form.saveCredential': '儲存此憑證以便下次使用', - 'trading-assistant.form.credentialName': '憑證名稱', - 'trading-assistant.validation.strategyTypeRequired': '請選擇策略類型', - 'trading-assistant.form.advancedSettings': '高級設置', - 'trading-assistant.form.orderMode': '下單模式', - 'trading-assistant.form.orderModeMaker': '掛單(Maker)', - 'trading-assistant.form.orderModeTaker': '市價(Taker)', - 'trading-assistant.form.orderModeHint': '掛單模式使用限價單,手續費更低;市價模式立即成交,手續費較高', - 'trading-assistant.form.makerWaitSec': '掛單等待時間(秒)', - 'trading-assistant.form.makerWaitSecHint': '掛單後等待成交的時間,超時後取消並重試', - 'trading-assistant.form.makerRetries': '掛單重試次數', - 'trading-assistant.form.makerRetriesHint': '掛單未成交時的最大重試次數', - 'trading-assistant.form.fallbackToMarket': '掛單失敗降級市價', - 'trading-assistant.form.fallbackToMarketHint': '開/平倉掛單未成交時,是否降級爲市價單以確保成交', - 'trading-assistant.form.marginMode': '保證金模式', - 'trading-assistant.form.marginModeCross': '全倉', - 'trading-assistant.form.marginModeIsolated': '逐倉', - 'trading-assistant.form.stopLossPct': '止損比例(%)', - 'trading-assistant.form.stopLossPctHint': '設置止損百分比,0表示不啓用止損', - 'trading-assistant.form.takeProfitPct': '止盈比例(%)', - 'trading-assistant.form.takeProfitPctHint': '設置止盈百分比,0表示不啓用止盈', - 'trading-assistant.form.signalMode': '信號模式', - 'trading-assistant.form.signalModeConfirmed': '確認模式', - 'trading-assistant.form.signalModeAggressive': '激進模式', - 'trading-assistant.form.signalModeHint': '確認模式:僅檢查已完成的K線;激進模式:也檢查正在形成的K線', - 'trading-assistant.form.cancel': '取消', - 'trading-assistant.form.prev': '上一步', - 'trading-assistant.form.next': '下一步', - 'trading-assistant.form.confirmCreate': '確認創建', - 'trading-assistant.form.confirmEdit': '確認修改', - 'trading-assistant.messages.createSuccess': '策略創建成功', - 'trading-assistant.messages.createFailed': '創建策略失敗', - 'trading-assistant.messages.updateSuccess': '策略更新成功', - 'trading-assistant.messages.updateFailed': '更新策略失敗', - 'trading-assistant.messages.deleteSuccess': '策略刪除成功', - 'trading-assistant.messages.deleteFailed': '刪除策略失敗', - 'trading-assistant.messages.startSuccess': '策略啓動成功', - 'trading-assistant.messages.startFailed': '啓動策略失敗', - 'trading-assistant.messages.stopSuccess': '策略停止成功', - 'trading-assistant.messages.stopFailed': '停止策略失敗', - 'trading-assistant.messages.loadFailed': '獲取策略列表失敗', - 'trading-assistant.messages.runningWarning': '策略運行中,請先停止策略後再修改', - 'trading-assistant.messages.deleteConfirmWithName': '確定要刪除策略“{name}”嗎?此操作不可恢復。', - 'trading-assistant.messages.deleteConfirm': '確定要刪除該策略嗎?此操作不可恢復。', - 'trading-assistant.messages.loadTradesFailed': '獲取交易記錄失敗', - 'trading-assistant.messages.loadPositionsFailed': '獲取持倉記錄失敗', - 'trading-assistant.messages.loadEquityFailed': '獲取淨值曲線失敗', - 'trading-assistant.messages.loadIndicatorsFailed': '加載指標列表失敗,請稍後重試', - 'trading-assistant.messages.spotLimitations': '現貨交易已自動設置爲僅做多、1倍槓杆', - 'trading-assistant.messages.autoFillApiConfig': '已自動填充該交易所的歷史API配置', - 'trading-assistant.messages.batchCreateSuccess': '成功創建 {count} 個策略', - 'trading-assistant.messages.batchStartSuccess': '成功啟動 {count} 個策略', - 'trading-assistant.messages.batchStartFailed': '批量啟動策略失敗', - 'trading-assistant.messages.batchStopSuccess': '成功停止 {count} 個策略', - 'trading-assistant.messages.batchStopFailed': '批量停止策略失敗', - 'trading-assistant.messages.batchDeleteSuccess': '成功刪除 {count} 個策略', - 'trading-assistant.messages.batchDeleteFailed': '批量刪除策略失敗', - 'trading-assistant.messages.batchDeleteConfirm': '確定要刪除策略組"{name}"下的 {count} 個策略嗎?此操作不可恢復。', - 'trading-assistant.notify.browser': '瀏覽器通知', - 'trading-assistant.notify.email': '郵箱', - 'trading-assistant.notify.phone': '簡訊', - 'trading-assistant.notify.telegram': 'Telegram', - 'trading-assistant.notify.discord': 'Discord', - 'trading-assistant.notify.webhook': 'Webhook', - 'trading-assistant.placeholders.selectIndicator': '請選擇指標', - 'trading-assistant.placeholders.selectExchange': '請選擇交易所', - 'trading-assistant.placeholders.inputApiKey': '請輸入API Key', - 'trading-assistant.placeholders.inputSecretKey': '請輸入Secret Key', - 'trading-assistant.placeholders.inputPassphrase': '請輸入Passphrase', - 'trading-assistant.placeholders.inputStrategyName': '請輸入策略名稱', - 'trading-assistant.placeholders.selectSymbol': '請選擇交易對', - 'trading-assistant.placeholders.selectSymbols': '請選擇交易對(支持多選)', - 'trading-assistant.placeholders.selectTimeframe': '請選擇時間周期', - 'trading-assistant.placeholders.selectKlinePeriod': '請選擇K線周期', - 'trading-assistant.placeholders.inputAiFilterPrompt': '請輸入自定義提示詞(可選)', - 'trading-assistant.placeholders.selectSavedCredential': '請選擇已儲存的憑證', - 'trading-assistant.placeholders.inputEmail': '請輸入郵箱地址', - 'trading-assistant.placeholders.inputPhone': '請輸入手機號碼', - 'trading-assistant.placeholders.inputTelegram': '請輸入Telegram ID或Chat ID', - 'trading-assistant.placeholders.inputDiscord': '請輸入Discord Webhook地址', - 'trading-assistant.placeholders.inputWebhook': '請輸入Webhook地址', - 'trading-assistant.placeholders.inputCredentialName': '請輸入憑證名稱(如:我的OKX帳戶)', - 'trading-assistant.validation.indicatorRequired': '請選擇指標', - 'trading-assistant.validation.exchangeRequired': '請選擇交易所', - 'trading-assistant.validation.apiKeyRequired': '請輸入API Key', - 'trading-assistant.validation.secretKeyRequired': '請輸入Secret Key', - 'trading-assistant.validation.passphraseRequired': '請輸入Passphrase', - 'trading-assistant.validation.exchangeConfigIncomplete': '請填寫完整的交易所配置信息', - 'trading-assistant.validation.testConnectionRequired': '請先點擊"測試連接"按鈕並確保連接成功', - 'trading-assistant.validation.testConnectionFailed': '連接測試失敗,請檢查配置後重新測試', - 'trading-assistant.validation.strategyNameRequired': '請輸入策略名稱', - 'trading-assistant.validation.symbolRequired': '請選擇交易對', - 'trading-assistant.validation.symbolsRequired': '請至少選擇一個交易對', - 'trading-assistant.validation.emailInvalid': '請輸入有效的郵箱地址', - 'trading-assistant.validation.notifyChannelRequired': '請至少選擇一個通知渠道', - 'trading-assistant.validation.initialCapitalRequired': '請輸入投入金額', - 'trading-assistant.validation.leverageRequired': '請輸入槓杆倍數', - 'trading-assistant.table.time': '時間', - 'trading-assistant.table.type': '類型', - 'trading-assistant.table.price': '價格', - 'trading-assistant.table.amount': '數量', - 'trading-assistant.table.value': '金額', - 'trading-assistant.table.commission': '手續費', - 'trading-assistant.table.symbol': '交易對', - 'trading-assistant.table.side': '方向', - 'trading-assistant.table.size': '持倉數量', - 'trading-assistant.table.entryPrice': '開倉價格', - 'trading-assistant.table.currentPrice': '當前價格', - 'trading-assistant.table.unrealizedPnl': '未實現盈虧', - 'trading-assistant.table.pnlPercent': '盈虧比例', - 'trading-assistant.table.buy': '買入', - 'trading-assistant.table.sell': '賣出', - 'trading-assistant.table.long': '做多', - 'trading-assistant.table.short': '做空', - 'trading-assistant.table.noPositions': '暫無持倉', - 'trading-assistant.detail.title': '策略詳情', - 'trading-assistant.detail.strategyName': '策略名稱', - 'trading-assistant.detail.strategyType': '策略類型', - 'trading-assistant.detail.status': '狀態', - 'trading-assistant.detail.tradingMode': '交易模式', - 'trading-assistant.detail.exchange': '交易所', - 'trading-assistant.detail.initialCapital': '初始資金', - 'trading-assistant.detail.totalInvestment': '總投入金額', - 'trading-assistant.detail.currentEquity': '當前淨值', - 'trading-assistant.detail.totalPnl': '總盈虧', - 'trading-assistant.detail.indicatorName': '指標名稱', - 'trading-assistant.detail.maxLeverage': '最大槓杆', - 'trading-assistant.detail.decideInterval': '決策間隔', - 'trading-assistant.detail.symbols': '交易標的', - 'trading-assistant.detail.createdAt': '創建時間', - 'trading-assistant.detail.updatedAt': '更新時間', - 'trading-assistant.detail.llmConfig': 'AI模型配置', - 'trading-assistant.detail.exchangeConfig': '交易所配置', - 'trading-assistant.detail.provider': '提供商', - 'trading-assistant.detail.modelId': '模型ID', - 'trading-assistant.detail.close': '關閉', - 'trading-assistant.detail.loadFailed': '獲取策略詳情失敗', - 'trading-assistant.equity.noData': '暫無淨值數據', - 'trading-assistant.equity.equity': '淨值', - 'trading-assistant.exchange.tradingMode': '交易模式', - 'trading-assistant.exchange.virtual': '模擬交易', - 'trading-assistant.exchange.live': '實盤交易', - 'trading-assistant.exchange.selectExchange': '選擇交易所', - 'trading-assistant.exchange.walletAddress': '錢包地址', - 'trading-assistant.exchange.walletAddressPlaceholder': '請輸入錢包地址(以0x開頭)', - 'trading-assistant.exchange.privateKey': '私鑰', - 'trading-assistant.exchange.privateKeyPlaceholder': '請輸入私鑰(64字符)', - 'trading-assistant.exchange.testConnection': '測試連接', - 'trading-assistant.exchange.connectionSuccess': '連接成功', - 'trading-assistant.exchange.connectionFailed': '連接失敗', - 'trading-assistant.exchange.testFailed': '連接測試失敗', - 'trading-assistant.exchange.fillComplete': '請填寫完整的交易所配置信息', - 'trading-assistant.strategyTypeOptions.ai': 'AI驅動策略', - 'trading-assistant.strategyTypeOptions.indicator': '技術指標策略', - 'trading-assistant.strategyTypeOptions.aiDeveloping': 'AI驅動策略功能開發中,敬請期待', - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'AI驅動策略功能正在開發中', - 'trading-assistant.indicatorType.trend': '趨勢', - 'trading-assistant.indicatorType.momentum': '動量', - 'trading-assistant.indicatorType.volatility': '波動', - 'trading-assistant.indicatorType.volume': '成交量', - 'trading-assistant.indicatorType.custom': '自定義', - 'trading-assistant.exchangeNames': { - 'okx': 'OKX', - 'binance': '幣安', - 'hyperliquid': 'Hyperliquid', - 'blockchaincom': 'Blockchain.com', - 'coinbaseexchange': 'Coinbase', - 'gate': 'Gate.io', - 'mexc': 'MEXC', - 'kraken': 'Kraken', - 'bitfinex': 'Bitfinex', - 'bybit': 'Bybit', - 'kucoin': 'KuCoin', - 'huobi': '火幣', - 'bitget': 'Bitget', - 'bitmex': 'BitMEX', - 'deribit': 'Deribit', - 'phemex': 'Phemex', - 'bitmart': 'BitMart', - 'bitstamp': 'Bitstamp', - 'bittrex': 'Bittrex', - 'poloniex': 'Poloniex', - 'gemini': 'Gemini', - 'cryptocom': 'Crypto.com', - 'bitflyer': 'bitFlyer', - 'upbit': 'Upbit', - 'bithumb': 'Bithumb', - 'coinone': 'Coinone', - 'zb': 'ZB', - 'lbank': 'LBank', - 'bibox': 'Bibox', - 'bigone': 'BigONE', - 'bitrue': 'Bitrue', - 'coinex': 'CoinEx', - 'digifinex': 'DigiFinex', - 'ftx': 'FTX', - 'ftxus': 'FTX US', - 'binanceus': 'Binance US', - 'binancecoinm': 'Binance COIN-M', - 'binanceusdm': 'Binance USDⓈ-M' - }, - 'ai-trading-assistant.title': 'AI交易助手', - 'ai-trading-assistant.strategyList': '策略列表', - 'ai-trading-assistant.createStrategy': '創建策略', - 'ai-trading-assistant.noStrategy': '暫無策略', - 'ai-trading-assistant.selectStrategy': '請從左側選擇一個策略查看詳情', - 'ai-trading-assistant.startStrategy': '啓動策略', - 'ai-trading-assistant.stopStrategy': '停止策略', - 'ai-trading-assistant.editStrategy': '編輯策略', - 'ai-trading-assistant.deleteStrategy': '刪除策略', - 'ai-trading-assistant.status.running': '運行中', - 'ai-trading-assistant.status.stopped': '已停止', - 'ai-trading-assistant.status.error': '錯誤', - 'ai-trading-assistant.tabs.tradingRecords': '交易記錄', - 'ai-trading-assistant.tabs.positions': '持倉記錄', - 'ai-trading-assistant.tabs.aiDecisions': 'AI決策記錄', - 'ai-trading-assistant.tabs.equityCurve': '淨值曲線', - 'ai-trading-assistant.form.createTitle': '創建AI交易策略', - 'ai-trading-assistant.form.editTitle': '編輯AI交易策略', - 'ai-trading-assistant.form.strategyName': '策略名稱', - 'ai-trading-assistant.form.modelId': 'AI模型', - 'ai-trading-assistant.form.modelIdHint': '使用系統OpenRouter服務,無需配置API Key', - 'ai-trading-assistant.form.decideInterval': '決策間隔', - 'ai-trading-assistant.form.decideInterval5m': '5分鍾', - 'ai-trading-assistant.form.decideInterval10m': '10分鍾', - 'ai-trading-assistant.form.decideInterval30m': '30分鍾', - 'ai-trading-assistant.form.decideInterval1h': '1小時', - 'ai-trading-assistant.form.decideInterval4h': '4小時', - 'ai-trading-assistant.form.decideInterval1d': '1天', - 'ai-trading-assistant.form.decideInterval1w': '1周', - 'ai-trading-assistant.form.decideIntervalHint': 'AI做決策的時間間隔', - 'ai-trading-assistant.form.runPeriod': '運行周期', - 'ai-trading-assistant.form.runPeriodHint': '策略運行的開始時間和結束時間', - 'ai-trading-assistant.form.startDate': '開始日期', - 'ai-trading-assistant.form.endDate': '結束日期', - 'ai-trading-assistant.form.qdtCostTitle': 'QDT扣費說明', - 'ai-trading-assistant.form.qdtCostHint': '每次AI決策將扣費 {cost} 個QDT,請確保賬戶有足夠的QDT餘額。策略運行期間,每次決策都會實時扣費。', - 'ai-trading-assistant.form.apiKey': 'API Key', - 'ai-trading-assistant.form.exchange': '選擇交易所', - 'ai-trading-assistant.form.secretKey': 'Secret Key', - 'ai-trading-assistant.form.passphrase': 'Passphrase', - 'ai-trading-assistant.form.testConnection': '測試連接', - 'ai-trading-assistant.form.symbol': '交易對', - 'ai-trading-assistant.form.symbolHint': '選擇要交易的交易對', - 'ai-trading-assistant.form.initialCapital': '投入金額(保證金)', - 'ai-trading-assistant.form.leverage': '槓杆倍數', - 'ai-trading-assistant.form.timeframe': '時間周期', - 'ai-trading-assistant.form.timeframe1m': '1分鍾', - 'ai-trading-assistant.form.timeframe5m': '5分鍾', - 'ai-trading-assistant.form.timeframe15m': '15分鍾', - 'ai-trading-assistant.form.timeframe30m': '30分鍾', - 'ai-trading-assistant.form.timeframe1H': '1小時', - 'ai-trading-assistant.form.timeframe4H': '4小時', - 'ai-trading-assistant.form.timeframe1D': '1天', - 'ai-trading-assistant.form.marketType': '市場類型', - 'ai-trading-assistant.form.marketTypeFutures': '合約', - 'ai-trading-assistant.form.marketTypeSpot': '現貨', - 'ai-trading-assistant.form.totalPnl': '總盈虧', - 'ai-trading-assistant.form.customPrompt': '自定義提示詞', - 'ai-trading-assistant.form.customPromptHint': '可選,用於自定義AI的交易策略和決策邏輯', - 'ai-trading-assistant.form.cancel': '取消', - 'ai-trading-assistant.form.prev': '上一步', - 'ai-trading-assistant.form.next': '下一步', - 'ai-trading-assistant.form.confirmCreate': '確認創建', - 'ai-trading-assistant.form.confirmEdit': '確認修改', - 'ai-trading-assistant.messages.createSuccess': '策略創建成功', - 'ai-trading-assistant.messages.createFailed': '創建策略失敗', - 'ai-trading-assistant.messages.updateSuccess': '策略更新成功', - 'ai-trading-assistant.messages.updateFailed': '更新策略失敗', - 'ai-trading-assistant.messages.deleteSuccess': '策略刪除成功', - 'ai-trading-assistant.messages.deleteFailed': '刪除策略失敗', - 'ai-trading-assistant.messages.startSuccess': '策略啓動成功', - 'ai-trading-assistant.messages.startFailed': '啓動策略失敗', - 'ai-trading-assistant.messages.stopSuccess': '策略停止成功', - 'ai-trading-assistant.messages.stopFailed': '停止策略失敗', - 'ai-trading-assistant.messages.loadFailed': '獲取策略列表失敗', - 'ai-trading-assistant.messages.loadDecisionsFailed': '獲取AI決策記錄失敗', - 'ai-trading-assistant.messages.deleteConfirm': '確定要刪除該策略嗎?此操作不可恢復。', - 'ai-trading-assistant.placeholders.inputStrategyName': '請輸入策略名稱', - 'ai-trading-assistant.placeholders.selectModelId': '請選擇AI模型', - 'ai-trading-assistant.placeholders.selectDecideInterval': '請選擇決策間隔', - 'ai-trading-assistant.placeholders.startTime': '開始時間', - 'ai-trading-assistant.placeholders.endTime': '結束時間', - 'ai-trading-assistant.placeholders.inputApiKey': '請輸入API Key', - 'ai-trading-assistant.placeholders.selectExchange': '請選擇交易所', - 'ai-trading-assistant.placeholders.inputSecretKey': '請輸入Secret Key', - 'ai-trading-assistant.placeholders.inputPassphrase': '請輸入Passphrase', - 'ai-trading-assistant.placeholders.selectSymbol': '請選擇交易對,如:BTC/USDT', - 'ai-trading-assistant.placeholders.selectTimeframe': '請選擇時間周期', - 'ai-trading-assistant.placeholders.inputCustomPrompt': '請輸入自定義提示詞(可選)', - 'ai-trading-assistant.validation.strategyNameRequired': '請輸入策略名稱', - 'ai-trading-assistant.validation.modelIdRequired': '請選擇AI模型', - 'ai-trading-assistant.validation.runPeriodRequired': '請選擇運行周期', - 'ai-trading-assistant.validation.apiKeyRequired': '請輸入API Key', - 'ai-trading-assistant.validation.exchangeRequired': '請選擇交易所', - 'ai-trading-assistant.validation.secretKeyRequired': '請輸入Secret Key', - 'ai-trading-assistant.validation.symbolRequired': '請選擇交易對', - 'ai-trading-assistant.validation.initialCapitalRequired': '請輸入投入金額', - 'ai-trading-assistant.table.time': '時間', - 'ai-trading-assistant.table.type': '類型', - 'ai-trading-assistant.table.price': '價格', - 'ai-trading-assistant.table.amount': '數量', - 'ai-trading-assistant.table.value': '金額', - 'ai-trading-assistant.table.symbol': '交易對', - 'ai-trading-assistant.table.side': '方向', - 'ai-trading-assistant.table.size': '持倉數量', - 'ai-trading-assistant.table.entryPrice': '開倉價格', - 'ai-trading-assistant.table.currentPrice': '當前價格', - 'ai-trading-assistant.table.unrealizedPnl': '未實現盈虧', - 'ai-trading-assistant.table.profit': '盈虧', - 'ai-trading-assistant.table.openLong': '開多', - 'ai-trading-assistant.table.closeLong': '平多', - 'ai-trading-assistant.table.openShort': '開空', - 'ai-trading-assistant.table.closeShort': '平空', - 'ai-trading-assistant.table.addLong': '加多', - 'ai-trading-assistant.table.addShort': '加空', - 'ai-trading-assistant.table.closeShortProfit': '平空止盈', - 'ai-trading-assistant.table.closeShortStop': '平空止損', - 'ai-trading-assistant.table.closeLongProfit': '平多止盈', - 'ai-trading-assistant.table.closeLongStop': '平多止損', - 'ai-trading-assistant.table.buy': '買入', - 'ai-trading-assistant.table.sell': '賣出', - 'ai-trading-assistant.table.long': '做多', - 'ai-trading-assistant.table.short': '做空', - 'ai-trading-assistant.table.hold': '持有', - 'ai-trading-assistant.table.reasoning': '分析理由', - 'ai-trading-assistant.table.decisions': '決策', - 'ai-trading-assistant.table.riskAssessment': '風險評估', - 'ai-trading-assistant.table.confidence': '置信度', - 'ai-trading-assistant.table.totalRecords': '共 {total} 條記錄', - 'ai-trading-assistant.table.noPositions': '暫無持倉', - 'ai-trading-assistant.detail.title': '策略詳情', - 'ai-trading-assistant.equity.noData': '暫無淨值數據', - 'ai-trading-assistant.equity.equity': '淨值', - 'ai-trading-assistant.exchange.testFailed': '連接測試失敗', - 'ai-trading-assistant.exchange.connectionSuccess': '連接成功', - 'ai-trading-assistant.exchange.connectionFailed': '連接失敗', - 'ai-trading-assistant.form.advancedSettings': '高級設置', - 'ai-trading-assistant.form.orderMode': '下單模式', - 'ai-trading-assistant.form.orderModeMaker': '掛單(Maker)', - 'ai-trading-assistant.form.orderModeTaker': '市價(Taker)', - 'ai-trading-assistant.form.orderModeHint': '掛單模式使用限價單,手續費更低;市價模式立即成交,手續費較高', - 'ai-trading-assistant.form.makerWaitSec': '掛單等待時間(秒)', - 'ai-trading-assistant.form.makerWaitSecHint': '掛單後等待成交的時間,超時後取消並重試', - 'ai-trading-assistant.form.makerRetries': '掛單重試次數', - 'ai-trading-assistant.form.makerRetriesHint': '掛單未成交時的最大重試次數', - 'ai-trading-assistant.form.fallbackToMarket': '掛單失敗降級市價', - 'ai-trading-assistant.form.fallbackToMarketHint': '開/平倉掛單未成交時,是否降級爲市價單以確保成交', - 'ai-trading-assistant.form.marginMode': '保證金模式', - 'ai-trading-assistant.form.marginModeCross': '全倉', - 'ai-trading-assistant.form.marginModeIsolated': '逐倉', - 'ai-analysis.title': '量子交易引擎', - 'ai-analysis.system.online': '在線', - 'ai-analysis.system.agents': '智能體', - 'ai-analysis.system.active': '活躍', - 'ai-analysis.system.stage': '階段', - 'ai-analysis.panel.roster': '智能體陣容', - 'ai-analysis.panel.thinking': '思考中...', - 'ai-analysis.panel.done': '完成', - 'ai-analysis.panel.standby': '待機', - 'ai-analysis.input.title': '量子交易引擎', - 'ai-analysis.input.placeholder': '選擇目標資產 (如 BTC/USDT)', - 'ai-analysis.input.watchlist': '自選股', - 'ai-analysis.input.start': '開始分析', - 'ai-analysis.input.recent': '最近任務:', - 'ai-analysis.vis.stage': '階段', - 'ai-analysis.vis.processing': '處理中', - 'ai-analysis.result.complete': '分析完成', - 'ai-analysis.result.signal': '最終信號', - 'ai-analysis.result.confidence': '置信度:', - 'ai-analysis.result.new': '新分析', - 'ai-analysis.result.full': '查看完整報告', - 'ai-analysis.logs.title': '系統日志', - 'ai-analysis.modal.title': '機密報告', - 'ai-analysis.modal.fundamental': '基本面分析', - 'ai-analysis.modal.technical': '技術面分析', - 'ai-analysis.modal.sentiment': '情緒面分析', - 'ai-analysis.modal.risk': '風險評估', - 'ai-analysis.stage.idle': '待機', - 'ai-analysis.stage.1': '第一階段:多維分析', - 'ai-analysis.stage.2': '第二階段:多空辯論', - 'ai-analysis.stage.3': '第三階段:戰略規劃', - 'ai-analysis.stage.4': '第四階段:風控審查', - 'ai-analysis.stage.complete': '完成', - 'ai-analysis.agent.investment_director': '投資總監', - 'ai-analysis.agent.role.investment_director': '綜合分析 & 最終結論', - 'ai-analysis.agent.market': '市場分析師', - 'ai-analysis.agent.role.market': '技術 & 市場數據', - 'ai-analysis.agent.fundamental': '基本面分析師', - 'ai-analysis.agent.role.fundamental': '財務 & 估值', - 'ai-analysis.agent.technical': '技術分析師', - 'ai-analysis.agent.role.technical': '技術指標 & 圖表', - 'ai-analysis.agent.news': '新聞分析師', - 'ai-analysis.agent.role.news': '全球新聞過濾', - 'ai-analysis.agent.sentiment': '情緒分析師', - 'ai-analysis.agent.role.sentiment': '社交 & 情緒', - 'ai-analysis.agent.risk': '風險分析師', - 'ai-analysis.agent.role.risk': '基礎風險檢查', - 'ai-analysis.agent.bull': '看漲研究員', - 'ai-analysis.agent.role.bull': '增長催化劑挖掘', - 'ai-analysis.agent.bear': '看跌研究員', - 'ai-analysis.agent.role.bear': '風險 & 缺陷挖掘', - 'ai-analysis.agent.manager': '研究經理', - 'ai-analysis.agent.role.manager': '辯論主持人', - 'ai-analysis.agent.trader': '交易員', - 'ai-analysis.agent.role.trader': '執行策略師', - 'ai-analysis.agent.risky': '激進分析師', - 'ai-analysis.agent.role.risky': '激進策略', - 'ai-analysis.agent.neutral': '平衡分析師', - 'ai-analysis.agent.role.neutral': '平衡策略', - 'ai-analysis.agent.safe': '保守分析師', - 'ai-analysis.agent.role.safe': '保守策略', - 'ai-analysis.agent.cro': '風控經理 (CRO)', - 'ai-analysis.agent.role.cro': '最終決策權威', - 'ai-analysis.script.market': '正在從主要交易所獲取 OHLCV 數據...', - 'ai-analysis.script.fundamental': '正在檢索季度財務報告...', - 'ai-analysis.script.technical': '正在分析技術指標和圖表形態...', - 'ai-analysis.script.news': '正在掃描全球財經新聞...', - 'ai-analysis.script.sentiment': '正在分析社交媒體趨勢...', - 'ai-analysis.script.risk': '正在計算歷史波動率...', - 'invite.inviteLink': '邀請鏈接', - 'invite.copy': '復制鏈接', - 'invite.copySuccess': '復制成功!', - 'invite.copyFailed': '復制失敗,請手動復制', - 'invite.noInviteLink': '邀請鏈接未生成', - 'invite.totalInvites': '累計邀請', - 'invite.totalReward': '累計獎勵', - 'invite.rules': '邀請規則', - 'invite.rule1': '每成功邀請一位好友注冊,您將獲得獎勵', - 'invite.rule2': '被邀請的好友完成首次交易,您將獲得額外獎勵', - 'invite.rule3': '邀請獎勵將直接發放到您的賬戶', - 'invite.inviteList': '邀請列表', - 'invite.tasks': '任務中心', - 'invite.inviteeName': '被邀請人', - 'invite.inviteTime': '邀請時間', - 'invite.status': '狀態', - 'invite.reward': '獎勵', - 'invite.active': '活躍', - 'invite.inactive': '未激活', - 'invite.completed': '已完成', - 'invite.claimed': '已領取', - 'invite.pending': '待完成', - 'invite.goToTask': '去完成', - 'invite.claimReward': '領取獎勵', - 'invite.verify': '驗證完成', - 'invite.verifySuccess': '驗證成功!任務已完成', - 'invite.verifyNotCompleted': '任務尚未完成,請先完成任務', - 'invite.verifyFailed': '驗證失敗,請稍後重試', - 'invite.claimSuccess': '成功領取 {reward} QDT!', - 'invite.claimFailed': '領取失敗,請稍後重試', - 'invite.totalRecords': '共 {total} 條記錄', - 'invite.task.twitter.title': '轉發推文到 X (Twitter)', - 'invite.task.twitter.desc': '分享我們的官方推文到您的 X (Twitter) 賬號', - 'invite.task.youtube.title': '關注我們的 YouTube 頻道', - 'invite.task.youtube.desc': '訂閱並關注我們的 YouTube 官方頻道', - 'invite.task.telegram.title': '加入 Telegram 羣組', - 'invite.task.telegram.desc': '加入我們的官方 Telegram 社區羣組', - 'invite.task.discord.title': '加入 Discord 服務器', - 'invite.task.discord.desc': '加入我們的 Discord 社區服務器', - 'message': '-', - 'layouts.usermenu.dialog.title': '信息', - 'layouts.usermenu.dialog.content': '您確定要注銷嗎?', - 'layouts.userLayout.title': '於不確定中,尋見真理', - - // Settings - 'settings.title': '系統設置', - 'settings.description': '配置應用設置、API密鑰和系統偏好', - 'settings.save': '保存設置', - 'settings.reset': '重置', - 'settings.saveSuccess': '設置保存成功', - 'settings.saveFailed': '保存設置失敗', - 'settings.loadFailed': '加載配置失敗', - 'settings.openrouterBalance': 'OpenRouter 賬戶餘額', - 'settings.queryBalance': '查詢餘額', - 'settings.balanceUsage': '已使用', - 'settings.balanceRemaining': '剩餘額度', - 'settings.balanceLimit': '總限額', - 'settings.balanceQuerySuccess': '餘額查詢成功', - 'settings.balanceQueryFailed': '餘額查詢失敗', - 'settings.balanceNotQueried': '點擊"查詢餘額"獲取賬戶信息', - 'settings.default': '默認', - 'settings.pleaseSelect': '請選擇', - 'settings.inputApiKey': '請輸入密鑰', - 'settings.getApi': '獲取API', - // Settings link texts - 'settings.link.getApi': '獲取API', - 'settings.link.getApiKey': '獲取API Key', - 'settings.link.getToken': '獲取Token', - 'settings.link.createBot': '創建Bot', - 'settings.link.viewModels': '查看模型列表', - 'settings.link.freeRegister': '免費註冊', - 'settings.link.supportedExchanges': '支持的交易所', - 'settings.link.applyApi': '申請API', - 'settings.link.createSearchEngine': '創建搜索引擎', - 'settings.link.getTurnstileKey': '獲取Turnstile密鑰', - 'settings.link.getGoogleCredentials': '獲取Google憑據', - 'settings.link.getGithubCredentials': '獲取GitHub憑據', - 'settings.restartRequired': '配置已保存,部分配置需要重啟Python服務才能生效', - 'settings.copyRestartCmd': '複製重啟命令', - 'settings.copySuccess': '複製成功', - 'settings.copyFailed': '複製失敗', - // Settings groups - // Settings groups (按後端 order 排序) - 'settings.group.server': '服務配置', - 'settings.group.auth': '安全認證', - 'settings.group.ai': 'AI/LLM配置', - 'settings.group.trading': '實盤交易', - 'settings.group.strategy': '策略執行', - 'settings.group.data_source': '數據源', - 'settings.group.notification': '通知推送', - 'settings.group.email': '郵件配置', - 'settings.group.sms': '短信配置', - 'settings.group.agent': 'AI Agent', - 'settings.group.network': '網絡代理', - 'settings.group.search': '搜索配置', - 'settings.group.security': '註冊與安全', - 'settings.group.app': '應用配置', - // Settings fields - Auth - 'settings.field.SECRET_KEY': 'Secret Key', - 'settings.field.ADMIN_USER': '管理員用戶名', - 'settings.field.ADMIN_PASSWORD': '管理員密碼', - 'settings.field.ADMIN_EMAIL': '管理員郵箱', - // Settings fields - Security - 'settings.field.ENABLE_REGISTRATION': '允許註冊', - 'settings.field.TURNSTILE_SITE_KEY': 'Turnstile Site Key', - 'settings.field.TURNSTILE_SECRET_KEY': 'Turnstile Secret Key', - 'settings.field.FRONTEND_URL': '前端URL', - 'settings.field.GOOGLE_CLIENT_ID': 'Google Client ID', - 'settings.field.GOOGLE_CLIENT_SECRET': 'Google Client Secret', - 'settings.field.GOOGLE_REDIRECT_URI': 'Google回調URL', - 'settings.field.GITHUB_CLIENT_ID': 'GitHub Client ID', - 'settings.field.GITHUB_CLIENT_SECRET': 'GitHub Client Secret', - 'settings.field.GITHUB_REDIRECT_URI': 'GitHub回調URL', - 'settings.field.SECURITY_IP_MAX_ATTEMPTS': 'IP最大失敗次數', - 'settings.field.SECURITY_IP_WINDOW_MINUTES': 'IP統計窗口(分鐘)', - 'settings.field.SECURITY_IP_BLOCK_MINUTES': 'IP封禁時長(分鐘)', - 'settings.field.SECURITY_ACCOUNT_MAX_ATTEMPTS': '帳戶最大失敗次數', - 'settings.field.SECURITY_ACCOUNT_WINDOW_MINUTES': '帳戶統計窗口(分鐘)', - 'settings.field.SECURITY_ACCOUNT_BLOCK_MINUTES': '帳戶鎖定時長(分鐘)', - 'settings.field.VERIFICATION_CODE_EXPIRE_MINUTES': '驗證碼有效期(分鐘)', - 'settings.field.VERIFICATION_CODE_RATE_LIMIT': '驗證碼發送間隔(秒)', - 'settings.field.VERIFICATION_CODE_IP_HOURLY_LIMIT': 'IP每小時驗證碼上限', - 'settings.field.VERIFICATION_CODE_MAX_ATTEMPTS': '驗證碼最大嘗試次數', - 'settings.field.VERIFICATION_CODE_LOCK_MINUTES': '驗證碼鎖定時長(分鐘)', - // Settings fields - Server - 'settings.field.PYTHON_API_HOST': '監聽地址', - 'settings.field.PYTHON_API_PORT': '端口', - 'settings.field.PYTHON_API_DEBUG': '調試模式', - // Settings fields - Worker - 'settings.field.ENABLE_PENDING_ORDER_WORKER': '啟用訂單處理Worker', - 'settings.field.PENDING_ORDER_STALE_SEC': '訂單超時時間(秒)', - // Settings fields - Trading - 'settings.field.ORDER_MODE': '下單模式', - 'settings.field.MAKER_WAIT_SEC': '限價單等待時間(秒)', - 'settings.field.MAKER_OFFSET_BPS': '限價單價格偏移(基點)', - // Settings fields - Notification - 'settings.field.SIGNAL_WEBHOOK_URL': 'Webhook URL', - 'settings.field.SIGNAL_WEBHOOK_TOKEN': 'Webhook Token', - 'settings.field.SIGNAL_NOTIFY_TIMEOUT_SEC': '通知超時(秒)', - 'settings.field.TELEGRAM_BOT_TOKEN': 'Telegram Bot Token', - // Settings fields - SMTP - 'settings.field.SMTP_HOST': 'SMTP服務器', - 'settings.field.SMTP_PORT': 'SMTP端口', - 'settings.field.SMTP_USER': 'SMTP用戶名', - 'settings.field.SMTP_PASSWORD': 'SMTP密碼', - 'settings.field.SMTP_FROM': '發件人地址', - 'settings.field.SMTP_USE_TLS': '使用TLS', - 'settings.field.SMTP_USE_SSL': '使用SSL', - // Settings fields - Twilio - 'settings.field.TWILIO_ACCOUNT_SID': 'Account SID', - 'settings.field.TWILIO_AUTH_TOKEN': 'Auth Token', - 'settings.field.TWILIO_FROM_NUMBER': '發送號碼', - // Settings fields - Strategy - 'settings.field.DISABLE_RESTORE_RUNNING_STRATEGIES': '禁用自動恢復策略', - 'settings.field.STRATEGY_TICK_INTERVAL_SEC': '策略Tick間隔(秒)', - 'settings.field.PRICE_CACHE_TTL_SEC': '價格緩存TTL(秒)', - // Settings fields - Proxy - 'settings.field.PROXY_PORT': '代理端口', - 'settings.field.PROXY_HOST': '代理主機', - 'settings.field.PROXY_SCHEME': '代理協議', - 'settings.field.PROXY_URL': '完整代理URL', - // Settings fields - App - 'settings.field.CORS_ORIGINS': 'CORS來源', - 'settings.field.RATE_LIMIT': '速率限制(每分鐘)', - 'settings.field.ENABLE_CACHE': '啟用緩存', - 'settings.field.ENABLE_REQUEST_LOG': '啟用請求日誌', - 'settings.field.ENABLE_AI_ANALYSIS': '啟用AI分析', - // Settings fields - 記憶/反思 - 'settings.field.ENABLE_AGENT_MEMORY': '啟用Agent記憶', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': '啟用向量檢索(本地)', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'Embedding維度', - 'settings.field.AGENT_MEMORY_TOP_K': '召回數量TopK', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': '候選窗口大小', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': '時間衰減半衰期(天)', - 'settings.field.AGENT_MEMORY_W_SIM': '相似度權重', - 'settings.field.AGENT_MEMORY_W_RECENCY': '時間權重', - 'settings.field.AGENT_MEMORY_W_RETURNS': '收益權重', - // Settings fields - 自動反思驗證Worker - 'settings.field.ENABLE_REFLECTION_WORKER': '啟用自動驗證', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': '驗證周期間隔(秒)', - // Settings fields - AI - 'settings.field.OPENROUTER_API_KEY': 'OpenRouter API Key', - 'settings.field.OPENROUTER_API_URL': 'OpenRouter API URL', - 'settings.field.OPENROUTER_MODEL': '默認模型', - 'settings.field.OPENROUTER_TEMPERATURE': 'Temperature', - 'settings.field.OPENROUTER_MAX_TOKENS': 'Max Tokens', - 'settings.field.OPENROUTER_TIMEOUT': '超時時間(秒)', - 'settings.field.OPENROUTER_CONNECT_TIMEOUT': '連接超時(秒)', - 'settings.field.AI_MODELS_JSON': '模型列表(JSON)', - // Settings fields - Market - 'settings.field.MARKET_TYPES_JSON': '市場類型(JSON)', - 'settings.field.TRADING_SUPPORTED_SYMBOLS_JSON': '支持的交易對(JSON)', - // Settings fields - Data Source - 'settings.field.DATA_SOURCE_TIMEOUT': '數據源超時(秒)', - 'settings.field.DATA_SOURCE_RETRY': '重試次數', - 'settings.field.DATA_SOURCE_RETRY_BACKOFF': '重試退避(秒)', - 'settings.field.FINNHUB_API_KEY': 'Finnhub API Key', - 'settings.field.FINNHUB_TIMEOUT': 'Finnhub超時(秒)', - 'settings.field.FINNHUB_RATE_LIMIT': 'Finnhub速率限制', - 'settings.field.CCXT_DEFAULT_EXCHANGE': 'CCXT默認交易所', - 'settings.field.CCXT_TIMEOUT': 'CCXT超時(ms)', - 'settings.field.CCXT_PROXY': 'CCXT代理', - 'settings.field.AKSHARE_TIMEOUT': 'Akshare超時(秒)', - 'settings.field.YFINANCE_TIMEOUT': 'YFinance超時(秒)', - 'settings.field.TIINGO_API_KEY': 'Tiingo API Key', - 'settings.field.TIINGO_TIMEOUT': 'Tiingo超時(秒)', - // Settings fields - Search - 'settings.field.SEARCH_PROVIDER': '搜索提供商', - 'settings.field.SEARCH_MAX_RESULTS': '最大結果數', - 'settings.field.SEARCH_GOOGLE_API_KEY': 'Google API Key', - 'settings.field.SEARCH_GOOGLE_CX': 'Google CX', - 'settings.field.SEARCH_BING_API_KEY': 'Bing API Key', - 'settings.field.INTERNAL_API_KEY': '內部API Key', - - // Settings descriptions (配置項說明) - 'settings.desc.PYTHON_API_HOST': '服務監聽地址。0.0.0.0 允許外部訪問,127.0.0.1 僅本地訪問', - 'settings.desc.PYTHON_API_PORT': '服務監聽端口,默認5000', - 'settings.desc.PYTHON_API_DEBUG': '啟用調試模式,開發時使用。生產環境請關閉', - 'settings.desc.SECRET_KEY': 'JWT簽名密鑰。生產環境必須修改以確保安全', - 'settings.desc.ADMIN_USER': '管理員登錄用戶名', - 'settings.desc.ADMIN_PASSWORD': '管理員登錄密碼。生產環境必須修改', - 'settings.desc.OPENROUTER_API_KEY': 'OpenRouter API密鑰,用於訪問多種AI模型', - 'settings.desc.OPENROUTER_API_URL': 'OpenRouter API端點地址', - 'settings.desc.OPENROUTER_MODEL': '默認使用的AI模型,如 openai/gpt-4o, anthropic/claude-3.5-sonnet', - 'settings.desc.OPENROUTER_TEMPERATURE': '模型創造性(0-1)。越低越確定性,越高越有創意', - 'settings.desc.OPENROUTER_MAX_TOKENS': '每次請求最大輸出token數', - 'settings.desc.OPENROUTER_TIMEOUT': 'API請求超時時間(秒)', - 'settings.desc.OPENROUTER_CONNECT_TIMEOUT': '連接建立超時時間(秒)', - 'settings.desc.AI_MODELS_JSON': '自定義模型列表,JSON格式,用於模型選擇器', - 'settings.desc.ENABLE_PENDING_ORDER_WORKER': '啟用後台訂單處理Worker,實盤交易必需', - 'settings.desc.PENDING_ORDER_STALE_SEC': '等待訂單超時時間,超時後標記為過期', - 'settings.desc.ORDER_MODE': 'maker: 限價單優先(手續費低),market: 市價單(立即成交)', - 'settings.desc.MAKER_WAIT_SEC': '限價單等待成交時間,超時後自動切換為市價單', - 'settings.desc.MAKER_OFFSET_BPS': '限價單價格偏移(基點)。買入價=市價*(1-偏移),賣出價=市價*(1+偏移)', - 'settings.desc.DISABLE_RESTORE_RUNNING_STRATEGIES': '禁止服務重啟時自動恢復運行中的策略', - 'settings.desc.STRATEGY_TICK_INTERVAL_SEC': '策略主循環檢查間隔(秒)', - 'settings.desc.PRICE_CACHE_TTL_SEC': '價格數據緩存有效期(秒)', - 'settings.desc.MARKET_TYPES_JSON': '自定義市場類型配置,JSON格式', - 'settings.desc.TRADING_SUPPORTED_SYMBOLS_JSON': '支持的交易對列表,JSON格式', - 'settings.desc.DATA_SOURCE_TIMEOUT': '數據源請求默認超時時間', - 'settings.desc.DATA_SOURCE_RETRY': '數據源請求失敗時的重試次數', - 'settings.desc.DATA_SOURCE_RETRY_BACKOFF': '重試間隔時間(秒)', - 'settings.desc.CCXT_DEFAULT_EXCHANGE': 'CCXT默認交易所(binance, coinbase, okx等)', - 'settings.desc.CCXT_TIMEOUT': 'CCXT請求超時時間(毫秒)', - 'settings.desc.CCXT_PROXY': 'CCXT請求代理地址(如 socks5h://127.0.0.1:1080)', - 'settings.desc.FINNHUB_API_KEY': 'Finnhub API密鑰,用於美股數據(有免費額度)', - 'settings.desc.FINNHUB_TIMEOUT': 'Finnhub API請求超時時間', - 'settings.desc.FINNHUB_RATE_LIMIT': 'Finnhub API速率限制(每分鐘請求數)', - 'settings.desc.TIINGO_API_KEY': 'Tiingo API密鑰,用於外匯/貴金屬數據(免費版不支持1分鐘數據)', - 'settings.desc.TIINGO_TIMEOUT': 'Tiingo API請求超時時間', - 'settings.desc.AKSHARE_TIMEOUT': 'Akshare API超時時間,用於A股數據', - 'settings.desc.YFINANCE_TIMEOUT': 'Yahoo Finance API超時時間', - 'settings.desc.SIGNAL_WEBHOOK_URL': '信號通知Webhook地址(POST JSON)', - 'settings.desc.SIGNAL_WEBHOOK_TOKEN': 'Webhook認證令牌,通過請求頭發送', - 'settings.desc.SIGNAL_NOTIFY_TIMEOUT_SEC': '通知請求超時時間', - 'settings.desc.TELEGRAM_BOT_TOKEN': 'Telegram機器人Token,從@BotFather獲取', - 'settings.desc.SMTP_HOST': 'SMTP郵件服務器地址(如 smtp.gmail.com)', - 'settings.desc.SMTP_PORT': 'SMTP端口(TLS用587,SSL用465,明文用25)', - 'settings.desc.SMTP_USER': 'SMTP認證用戶名(通常是郵箱地址)', - 'settings.desc.SMTP_PASSWORD': 'SMTP認證密碼或應用專用密碼', - 'settings.desc.SMTP_FROM': '郵件發件人地址', - 'settings.desc.SMTP_USE_TLS': '啟用STARTTLS加密(推薦端口587)', - 'settings.desc.SMTP_USE_SSL': '啟用SSL加密(端口465)', - 'settings.desc.TWILIO_ACCOUNT_SID': 'Twilio賬戶SID,從控制台獲取', - 'settings.desc.TWILIO_AUTH_TOKEN': 'Twilio認證Token,從控制台獲取', - 'settings.desc.TWILIO_FROM_NUMBER': 'Twilio發送短信的號碼(如 +1234567890)', - 'settings.desc.ENABLE_AGENT_MEMORY': '啟用AI Agent記憶功能,用於學習歷史交易', - 'settings.desc.AGENT_MEMORY_ENABLE_VECTOR': '啟用本地向量相似度搜索進行記憶檢索', - 'settings.desc.AGENT_MEMORY_EMBEDDING_DIM': '記憶向量嵌入維度', - 'settings.desc.AGENT_MEMORY_TOP_K': '檢索時返回的相似記憶數量', - 'settings.desc.AGENT_MEMORY_CANDIDATE_LIMIT': '相似度搜索的候選記憶上限', - 'settings.desc.AGENT_MEMORY_HALF_LIFE_DAYS': '記憶時間衰減的半衰期(天)', - 'settings.desc.AGENT_MEMORY_W_SIM': '記憶排序中相似度分數的權重(0-1)', - 'settings.desc.AGENT_MEMORY_W_RECENCY': '記憶排序中時間新近度的權重(0-1)', - 'settings.desc.AGENT_MEMORY_W_RETURNS': '記憶排序中收益表現的權重(0-1)', - 'settings.desc.ENABLE_REFLECTION_WORKER': '啟用後台自動交易反思Worker', - 'settings.desc.REFLECTION_WORKER_INTERVAL_SEC': '自動反思運行間隔(默認24小時)', - 'settings.desc.PROXY_HOST': '代理服務器主機名或IP', - 'settings.desc.PROXY_PORT': '代理服務器端口(留空則禁用代理)', - 'settings.desc.PROXY_SCHEME': '代理協議類型。socks5h 表示DNS也走代理', - 'settings.desc.PROXY_URL': '完整代理URL(設置後覆蓋上面的配置)', - 'settings.desc.SEARCH_PROVIDER': '網頁搜索提供商,用於AI研究功能', - 'settings.desc.SEARCH_MAX_RESULTS': '搜索返回的最大結果數', - 'settings.desc.SEARCH_GOOGLE_API_KEY': 'Google自定義搜索API密鑰', - 'settings.desc.SEARCH_GOOGLE_CX': 'Google可編程搜索引擎ID (CX)', - 'settings.desc.SEARCH_BING_API_KEY': 'Microsoft Bing網頁搜索API密鑰', - 'settings.desc.INTERNAL_API_KEY': '內部API認證密鑰,用於服務間調用', - 'settings.desc.CORS_ORIGINS': '允許的CORS來源(* 表示全部,或逗號分隔的列表)', - 'settings.desc.RATE_LIMIT': '每IP每分鐘的API請求限制', - 'settings.desc.ENABLE_CACHE': '啟用響應緩存以提高性能', - 'settings.desc.ENABLE_REQUEST_LOG': '記錄所有API請求日誌,用於調試', - 'settings.desc.ENABLE_AI_ANALYSIS': '啟用AI驅動的市場分析功能', - - // Portfolio - 資產監測 - 'portfolio.summary.totalValue': '總市值', - 'portfolio.summary.totalCost': '總成本', - 'portfolio.summary.totalPnl': '總盈虧', - 'portfolio.summary.positionCount': '持倉數量', - 'portfolio.summary.profitLossRatio': '盈利/虧損', - 'portfolio.summary.today': '今日', - 'portfolio.summary.todayPnl': '今日盈虧', - 'portfolio.summary.bestPerformer': '最佳表現', - 'portfolio.summary.worstPerformer': '最差表現', - 'portfolio.summary.priceSync': '價格同步', - 'portfolio.summary.syncInterval': '刷新間隔', - 'portfolio.summary.justNow': '剛剛', - 'portfolio.summary.ago': '前', - 'portfolio.positions.title': '我的持倉', - 'portfolio.positions.add': '添加持倉', - 'portfolio.positions.addFirst': '添加第一筆持倉', - 'portfolio.positions.empty': '暫無持倉記錄', - 'portfolio.positions.deleteConfirm': '確定刪除這筆持倉嗎?', - 'portfolio.positions.currentPrice': '現價', - 'portfolio.positions.entryPrice': '買入價', - 'portfolio.positions.quantity': '數量', - 'portfolio.positions.side': '方向', - 'portfolio.positions.long': '做多', - 'portfolio.positions.short': '做空', - 'portfolio.positions.marketValue': '市值', - 'portfolio.positions.pnl': '盈虧', - 'portfolio.positions.items': '個持倉', - 'portfolio.monitors.title': 'AI 監控', - 'portfolio.monitors.add': '添加監控', - 'portfolio.monitors.addFirst': '添加 AI 監控', - 'portfolio.monitors.empty': '暫無監控任務', - 'portfolio.monitors.deleteConfirm': '確定刪除這個監控任務嗎?', - 'portfolio.monitors.interval': '執行間隔', - 'portfolio.monitors.lastRun': '上次執行', - 'portfolio.monitors.nextRun': '下次執行', - 'portfolio.monitors.channels': '通知渠道', - 'portfolio.monitors.runNow': '立即執行', - 'portfolio.monitors.analysisResult': 'AI 分析結果', - 'portfolio.monitors.runningTitle': 'AI 分析已啟動', - 'portfolio.monitors.runningDesc': '分析正在後臺運行,完成後會通過通知推送結果。分析多個持倉可能需要幾分鐘時間。', - 'portfolio.monitors.timeoutTitle': '請求超時', - 'portfolio.monitors.timeoutDesc': '分析可能正在後臺運行中,請稍後查看通知獲取結果。如果長時間沒有收到通知,請重試。', - 'portfolio.modal.addPosition': '添加持倉', - 'portfolio.modal.editPosition': '編輯持倉', - 'portfolio.modal.addMonitor': '添加監控', - 'portfolio.modal.editMonitor': '編輯監控', - 'portfolio.form.market': '市場', - 'portfolio.form.marketRequired': '請選擇市場', - 'portfolio.form.selectMarket': '選擇市場', - 'portfolio.form.symbol': '標的代碼', - 'portfolio.form.symbolRequired': '請輸入標的代碼', - 'portfolio.form.searchSymbol': '搜索或輸入標的代碼', - 'portfolio.form.useAsSymbol': '使用', - 'portfolio.form.asSymbolCode': '作為標的代碼', - 'portfolio.form.symbolHint': '可搜索標的庫,或直接輸入任意代碼', - 'portfolio.form.side': '方向', - 'portfolio.form.quantity': '數量', - 'portfolio.form.quantityRequired': '請輸入數量', - 'portfolio.form.enterQuantity': '輸入持倉數量', - 'portfolio.form.entryPrice': '買入價', - 'portfolio.form.entryPriceRequired': '請輸入買入價', - 'portfolio.form.enterEntryPrice': '輸入買入價格', - 'portfolio.form.notes': '備注', - 'portfolio.form.enterNotes': '可選:添加備注', - 'portfolio.form.monitorName': '監控名稱', - 'portfolio.form.monitorNameRequired': '請輸入監控名稱', - 'portfolio.form.enterMonitorName': '例如:每日組合分析', - 'portfolio.form.interval': '執行間隔', - 'portfolio.form.minutes': '分鐘', - 'portfolio.form.hour': '小時', - 'portfolio.form.hours': '小時', - 'portfolio.form.notifyChannels': '通知渠道', - 'portfolio.form.browser': '瀏覽器通知', - 'portfolio.form.email': '郵件', - 'portfolio.form.telegramChatId': 'Telegram Chat ID', - 'portfolio.form.enterTelegramChatId': '輸入 Telegram Chat ID', - 'portfolio.form.telegramRequired': '請輸入 Telegram Chat ID', - 'portfolio.form.emailAddress': '郵箱地址', - 'portfolio.form.enterEmail': '輸入郵箱地址', - 'portfolio.form.emailRequired': '請輸入郵箱地址', - 'portfolio.form.emailInvalid': '請輸入有效的郵箱地址', - 'portfolio.form.customPrompt': '自定義提示', - 'portfolio.form.customPromptPlaceholder': '可選:添加特別關注點,例如"重點關注科技股風險"', - 'portfolio.form.monitorScope': '監控範圍', - 'portfolio.form.allPositions': '全部持倉', - 'portfolio.form.selectedPositions': '指定持倉', - 'portfolio.form.selectPositions': '選擇持倉', - 'portfolio.form.selectAll': '全選', - 'portfolio.form.deselectAll': '全不選', - 'portfolio.form.selectedCount': '已選 {count}/{total}', - 'portfolio.form.pleaseSelectPositions': '請至少選擇一個持倉進行監控', - 'portfolio.message.loadFailed': '加載數據失敗', - 'portfolio.message.saveSuccess': '保存成功', - 'portfolio.message.saveFailed': '保存失敗', - 'portfolio.message.deleteSuccess': '刪除成功', - 'portfolio.message.deleteFailed': '刪除失敗', - 'portfolio.message.updateFailed': '更新失敗', - 'portfolio.message.monitorEnabled': '監控已啟用', - 'portfolio.message.monitorDisabled': '監控已暫停', - 'portfolio.message.monitorRunSuccess': '分析完成', - 'portfolio.message.monitorRunFailed': '分析失敗', - 'portfolio.message.monitorRunning': 'AI 分析已啟動,請等待通知', - // Portfolio - 分組 - 'portfolio.groups.all': '全部持倉', - 'portfolio.groups.ungrouped': '未分組', - 'portfolio.form.group': '分組', - 'portfolio.form.enterGroup': '輸入或選擇分組', - // Portfolio - 預警 - 'portfolio.alerts.title': '價格/盈虧預警', - 'portfolio.alerts.addAlert': '添加預警', - 'portfolio.alerts.editAlert': '編輯預警', - 'portfolio.alerts.alertType': '預警類型', - 'portfolio.alerts.priceAbove': '價格高於', - 'portfolio.alerts.priceBelow': '價格低於', - 'portfolio.alerts.pnlAbove': '盈利高於 (%)', - 'portfolio.alerts.pnlBelow': '虧損低於 (%)', - 'portfolio.alerts.threshold': '閾值', - 'portfolio.alerts.thresholdRequired': '請輸入閾值', - 'portfolio.alerts.enterPrice': '輸入價格', - 'portfolio.alerts.enterPercent': '輸入百分比', - 'portfolio.alerts.currentPrice': '當前價格', - 'portfolio.alerts.currentPriceHint': '當前價格', - 'portfolio.alerts.repeatInterval': '重複提醒', - 'portfolio.alerts.noRepeat': '不重複 (觸發一次)', - 'portfolio.alerts.every5min': '每 5 分鐘', - 'portfolio.alerts.every15min': '每 15 分鐘', - 'portfolio.alerts.every30min': '每 30 分鐘', - 'portfolio.alerts.every1hour': '每 1 小時', - 'portfolio.alerts.every4hours': '每 4 小時', - 'portfolio.alerts.onceDaily': '每天一次', - 'portfolio.alerts.enabled': '啟用預警', - 'portfolio.alerts.enabledDesc': '開啟後將自動監測並觸發通知', - 'portfolio.alerts.delete': '刪除', - 'portfolio.alerts.deleteConfirm': '確定要刪除此預警嗎?', - 'portfolio.modal.addAlert': '添加預警', - 'portfolio.modal.editAlert': '編輯預警', - - // User Management - 'menu.userManage': '用戶管理', - 'menu.myProfile': '個人中心', - 'userManage.title': '用戶管理', - 'userManage.searchPlaceholder': '搜索用戶名/郵箱/暱稱', - 'userManage.description': '管理系統用戶、角色和權限', - 'userManage.createUser': '創建用戶', - 'userManage.editUser': '編輯用戶', - 'userManage.username': '用戶名', - 'userManage.password': '密碼', - 'userManage.nickname': '暱稱', - 'userManage.email': '郵箱', - 'userManage.role': '角色', - 'userManage.status': '狀態', - 'userManage.lastLogin': '最後登錄', - 'userManage.active': '啟用', - 'userManage.disabled': '禁用', - 'userManage.neverLogin': '從未登錄', - 'userManage.usernameRequired': '請輸入用戶名', - 'userManage.usernamePlaceholder': '輸入用戶名', - 'userManage.passwordRequired': '請輸入密碼', - 'userManage.passwordPlaceholder': '輸入密碼(至少6位)', - 'userManage.passwordMin': '密碼至少6個字符', - 'userManage.nicknamePlaceholder': '輸入暱稱', - 'userManage.emailPlaceholder': '輸入郵箱', - 'userManage.emailInvalid': '郵箱格式不正確', - 'userManage.rolePlaceholder': '選擇角色', - 'userManage.statusPlaceholder': '選擇狀態', - 'userManage.resetPassword': '重置密碼', - 'userManage.resetPasswordWarning': '此操作將重置用戶密碼', - 'userManage.newPassword': '新密碼', - 'userManage.newPasswordPlaceholder': '輸入新密碼', - 'userManage.confirmDelete': '確定要刪除此用戶嗎?', - 'userManage.roleAdmin': '管理員', - 'userManage.roleManager': '經理', - 'userManage.roleUser': '普通用戶', - 'userManage.roleViewer': '訪客', - 'userManage.credits': '積分', - 'userManage.adjustCredits': '調整積分', - 'userManage.setVip': '設置VIP', - 'userManage.currentCredits': '當前積分', - 'userManage.newCredits': '新積分', - 'userManage.enterCredits': '輸入新的積分數量', - 'userManage.creditsNonNegative': '積分不能為負數', - 'userManage.currentVip': '當前VIP狀態', - 'userManage.vipActive': '有效', - 'userManage.vipExpired': '已過期', - 'userManage.vipDays': 'VIP天數', - 'userManage.vipExpiresAt': 'VIP過期時間', - 'userManage.cancelVip': '取消VIP', - 'userManage.days': '天', - 'userManage.customDate': '自定義日期', - 'userManage.selectDate': '請選擇日期', - 'userManage.remark': '備注', - 'userManage.remarkPlaceholder': '可選備注', - - // Profile - 'profile.title': '個人中心', - 'profile.description': '管理您的賬戶設置和偏好', - 'profile.basicInfo': '基本信息', - 'profile.changePassword': '修改密碼', - 'profile.username': '用戶名', - 'profile.nickname': '暱稱', - 'profile.email': '郵箱', - 'profile.lastLogin': '最後登錄', - 'profile.nicknamePlaceholder': '輸入您的暱稱', - 'profile.emailPlaceholder': '輸入您的郵箱', - 'profile.emailInvalid': '郵箱格式不正確', - 'profile.emailCannotChange': '註冊後郵箱不可修改', - 'profile.passwordHint': '密碼至少需要6個字符', - 'profile.oldPassword': '當前密碼', - 'profile.newPassword': '新密碼', - 'profile.confirmPassword': '確認密碼', - 'profile.oldPasswordRequired': '請輸入當前密碼', - 'profile.oldPasswordPlaceholder': '輸入當前密碼', - 'profile.newPasswordRequired': '請輸入新密碼', - 'profile.newPasswordPlaceholder': '輸入新密碼', - 'profile.confirmPasswordRequired': '請確認新密碼', - 'profile.confirmPasswordPlaceholder': '再次輸入新密碼', - 'profile.passwordMin': '密碼至少6個字符', - 'profile.passwordMismatch': '兩次輸入的密碼不一致', - 'profile.credits.title': '我的積分', - 'profile.credits.unit': '積分', - 'profile.credits.recharge': '開通/充值', - 'profile.credits.vipExpires': 'VIP有效期至', - 'profile.credits.vipExpired': 'VIP已過期', - 'profile.credits.noVip': '非VIP用戶', - 'profile.credits.hint': '使用AI分析等功能會消耗積分,VIP用戶免費', - 'profile.creditsLog': '消費記錄', - 'profile.creditsLog.time': '時間', - 'profile.creditsLog.action': '類型', - 'profile.creditsLog.amount': '變動', - 'profile.creditsLog.balance': '餘額', - 'profile.creditsLog.remark': '備注', - 'profile.creditsLog.actionConsume': '消費', - 'profile.creditsLog.actionRecharge': '充值', - 'profile.creditsLog.actionAdjust': '調整', - 'profile.creditsLog.actionRefund': '退款', - 'profile.creditsLog.actionVipGrant': 'VIP授予', - 'profile.creditsLog.actionVipRevoke': 'VIP取消', - 'profile.creditsLog.actionRegisterBonus': '註冊獎勵', - 'profile.creditsLog.actionReferralBonus': '邀請獎勵', - 'profile.referral.title': '邀請好友', - 'profile.referral.listTab': '邀請列表', - 'profile.referral.totalInvited': '已邀請', - 'profile.referral.bonusPerInvite': '每邀請獲得', - 'profile.referral.yourLink': '您的邀請鏈接', - 'profile.referral.copyLink': '複製鏈接', - 'profile.referral.linkCopied': '邀請鏈接已複製', - 'profile.referral.newUserBonus': '新用戶註冊獲得', - 'profile.referral.user': '用戶', - 'profile.referral.registerTime': '註冊時間', - 'profile.referral.noReferrals': '暫無邀請記錄', - 'profile.referral.shareNow': '立即分享邀請', - - // Settings - Billing - 'settings.group.billing': '計費配置', - 'settings.field.BILLING_ENABLED': '啟用計費', - 'settings.field.BILLING_VIP_BYPASS': 'VIP免費', - 'settings.field.BILLING_COST_AI_ANALYSIS': 'AI分析消耗', - 'settings.field.BILLING_COST_STRATEGY_RUN': '策略運行消耗', - 'settings.field.BILLING_COST_BACKTEST': '回測消耗', - 'settings.field.BILLING_COST_PORTFOLIO_MONITOR': 'Portfolio監控消耗', - 'settings.field.CREDITS_REGISTER_BONUS': '註冊獎勵', - 'settings.field.CREDITS_REFERRAL_BONUS': '邀請獎勵', - 'settings.field.RECHARGE_TELEGRAM_URL': '充值Telegram鏈接', - 'settings.desc.BILLING_ENABLED': '啟用計費系統。啟用後,用戶使用某些功能需要消耗積分', - 'settings.desc.BILLING_VIP_BYPASS': 'VIP用戶在有效期內可免費使用所有付費功能', - 'settings.desc.BILLING_COST_AI_ANALYSIS': '每次AI分析消耗的積分數', - 'settings.desc.BILLING_COST_STRATEGY_RUN': '啟動策略時消耗的積分數', - 'settings.desc.BILLING_COST_BACKTEST': '每次回測消耗的積分數', - 'settings.desc.BILLING_COST_PORTFOLIO_MONITOR': '每次Portfolio AI監控消耗的積分數', - 'settings.desc.CREDITS_REGISTER_BONUS': '新用戶註冊時獲得的積分獎勵', - 'settings.desc.CREDITS_REFERRAL_BONUS': '用戶通過邀請鏈接成功邀請新用戶時,邀請人獲得的積分獎勵', - 'settings.desc.VERIFICATION_CODE_MAX_ATTEMPTS': '驗證碼驗證失敗的最大嘗試次數,超過後將鎖定', - 'settings.desc.VERIFICATION_CODE_LOCK_MINUTES': '驗證碼驗證失敗次數超過限制後的鎖定時長(分鐘)', - 'settings.desc.RECHARGE_TELEGRAM_URL': '用戶點擊充值時跳轉的Telegram客服鏈接' - } - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/main.js b/quantdinger_vue/src/main.js deleted file mode 100644 index 608dc04..0000000 --- a/quantdinger_vue/src/main.js +++ /dev/null @@ -1,56 +0,0 @@ -// with polyfills -import 'core-js/stable' -import 'regenerator-runtime/runtime' - -import Vue from 'vue' -import App from './App.vue' -import router from './router' -import store from './store/' -import i18n from './locales' -import { VueAxios } from './utils/request' -import ProLayout, { PageHeaderWrapper } from '@ant-design-vue/pro-layout' -import themePluginConfig from '../config/themePluginConfig' - -// mock -// WARNING: `mockjs` NOT SUPPORT `IE` PLEASE DO NOT USE IN `production` ENV. -import './mock' - -import bootstrap from './core/bootstrap' -import './core/lazy_use' // use lazy load components -import './permission' // permission control -import './utils/filter' // global filter -import './global.less' // global style - -Vue.config.productionTip = false - -// Suppress noisy ResizeObserver loop errors (harmless in most cases on responsive layouts) -if (typeof window !== 'undefined') { - const ignoreResizeObserverError = (e) => { - const msg = (e && (e.reason && e.reason.message || e.message)) || '' - if (msg.includes('ResizeObserver loop') || msg.includes('ResizeObserver loop limit exceeded')) { - e.preventDefault && e.preventDefault() - e.stopImmediatePropagation && e.stopImmediatePropagation() - return false - } - } - window.addEventListener('error', ignoreResizeObserverError) - window.addEventListener('unhandledrejection', ignoreResizeObserverError) -} - -// mount axios to `Vue.$http` and `this.$http` -Vue.use(VueAxios) -// use pro-layout components -Vue.component('pro-layout', ProLayout) -Vue.component('page-container', PageHeaderWrapper) -Vue.component('page-header-wrapper', PageHeaderWrapper) - -window.umi_plugin_ant_themeVar = themePluginConfig.theme - -new Vue({ - router, - store, - i18n, - // init localstorage, vuex, Logo message - created: bootstrap, - render: h => h(App) -}).$mount('#app') diff --git a/quantdinger_vue/src/mock/index.js b/quantdinger_vue/src/mock/index.js deleted file mode 100644 index 70cfb24..0000000 --- a/quantdinger_vue/src/mock/index.js +++ /dev/null @@ -1,24 +0,0 @@ -import { isIE } from '@/utils/util' - -// 本地开发已有完整后端 API,禁用 mock 以避免请求被拦截 -// 如需启用 mock,将下面的 false 改为 true -const ENABLE_MOCK = false - -// 判断环境不是 prod 或者 preview 是 true 时,加载 mock 服务 -if (ENABLE_MOCK && (process.env.NODE_ENV !== 'production' || process.env.VUE_APP_PREVIEW === 'true')) { - if (isIE()) { - } - // 使用同步加载依赖 - // 防止 vuex 中的 GetInfo 早于 mock 运行,导致无法 mock 请求返回结果 - const Mock = require('mockjs2') - require('./services/auth') - require('./services/user') - require('./services/manage') - require('./services/other') - require('./services/tagCloud') - require('./services/article') - - Mock.setup({ - timeout: 800 // setter delay time - }) -} diff --git a/quantdinger_vue/src/mock/services/article.js b/quantdinger_vue/src/mock/services/article.js deleted file mode 100644 index 88e1fa1..0000000 --- a/quantdinger_vue/src/mock/services/article.js +++ /dev/null @@ -1,88 +0,0 @@ -import Mock from 'mockjs2' -import { builder, getQueryParameters } from '../util' - -const titles = [ - 'Alipay', - 'Angular', - 'Ant Design', - 'Ant Design Pro', - 'Bootstrap', - 'React', - 'Vue', - 'Webpack' -] - -const avatar = ['https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', - 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', - 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', - 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', - 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png' -] - -const covers = [ - 'https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png', - 'https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png', - 'https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png', - 'https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png' -] - -const owner = [ - '付小小', - '吴加好', - '周星星', - '林东东', - '曲丽丽' -] - -const content = '段落示意:蚂蚁金服设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。蚂蚁金服设计平台 ant.design,用最小的工作量,无缝接入蚂蚁金服生态,提供跨越设计与开发的体验解决方案。' -const description = '在中台产品的研发过程中,会出现不同的设计规范和实现方式,但其中往往存在很多类似的页面和组件,这些类似的组件会被抽离成一套标准规范。' -const href = 'https://ant.design' - -const article = (options) => { - const queryParameters = getQueryParameters(options) - if (queryParameters && !queryParameters.count) { - queryParameters.count = 5 - } - const data = [] - for (let i = 0; i < queryParameters.count; i++) { - const tmpKey = i + 1 - const num = parseInt(Math.random() * (4 + 1), 10) - data.push({ - id: tmpKey, - avatar: avatar[num], - owner: owner[num], - content: content, - star: Mock.mock('@integer(1, 999)'), - percent: Mock.mock('@integer(1, 999)'), - like: Mock.mock('@integer(1, 999)'), - message: Mock.mock('@integer(1, 999)'), - description: description, - href: href, - title: titles[ i % 8 ], - updatedAt: Mock.mock('@datetime'), - members: [ - { - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png', - name: '曲丽丽', - id: 'member1' - }, - { - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png', - name: '王昭君', - id: 'member2' - }, - { - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png', - name: '董娜娜', - id: 'member3' - } - ], - activeUser: Math.ceil(Math.random() * 100000) + 100000, - newUser: Math.ceil(Math.random() * 1000) + 1000, - cover: parseInt(i / 4, 10) % 2 === 0 ? covers[i % 4] : covers[3 - (i % 4)] - }) - } - return builder(data) -} - -Mock.mock(/\/list\/article/, 'get', article) diff --git a/quantdinger_vue/src/mock/services/auth.js b/quantdinger_vue/src/mock/services/auth.js deleted file mode 100644 index 79fc155..0000000 --- a/quantdinger_vue/src/mock/services/auth.js +++ /dev/null @@ -1,49 +0,0 @@ -import Mock from 'mockjs2' -import { builder, getBody } from '../util' - -const username = ['admin', 'super'] -// 强硬要求 ant.design 相同密码 -// '21232f297a57a5a743894a0e4a801fc3', -const password = ['8914de686ab28dc22f30d3d8e107ff6c', '21232f297a57a5a743894a0e4a801fc3'] // admin, ant.design - -const login = (options) => { - const body = getBody(options) - if (!username.includes(body.username) || !password.includes(body.password)) { - return builder({ isLogin: true }, '账户或密码错误', 401) - } - - return builder({ - 'id': Mock.mock('@guid'), - 'name': Mock.mock('@name'), - 'username': 'admin', - 'password': '', - 'avatar': 'https://gw.alipayobjects.com/zos/rmsportal/jZUIxmJycoymBprLOUbT.png', - 'status': 1, - 'telephone': '', - 'lastLoginIp': '27.154.74.117', - 'lastLoginTime': 1534837621348, - 'creatorId': 'admin', - 'createTime': 1497160610259, - 'deleted': 0, - 'roleId': 'admin', - 'lang': 'zh-CN', - 'token': '4291d7da9005377ec9aec4a71ea837f' - }, '', 200, { 'Custom-Header': Mock.mock('@guid') }) -} - -const logout = () => { - return builder({}, '[测试接口] 注销成功') -} - -const smsCaptcha = () => { - return builder({ captcha: Mock.mock('@integer(10000, 99999)') }) -} - -const twofactor = () => { - return builder({ stepCode: Mock.mock('@integer(0, 1)') }) -} - -Mock.mock(/\/auth\/login/, 'post', login) -Mock.mock(/\/auth\/logout/, 'post', logout) -Mock.mock(/\/account\/sms/, 'post', smsCaptcha) -Mock.mock(/\/auth\/2step-code/, 'post', twofactor) diff --git a/quantdinger_vue/src/mock/services/manage.js b/quantdinger_vue/src/mock/services/manage.js deleted file mode 100644 index 10181ec..0000000 --- a/quantdinger_vue/src/mock/services/manage.js +++ /dev/null @@ -1,252 +0,0 @@ -import Mock from 'mockjs2' -import { builder, getQueryParameters } from '../util' - -const totalCount = 5701 - -const serverList = (options) => { - const parameters = getQueryParameters(options) - - const result = [] - const pageNo = parseInt(parameters.pageNo) - const pageSize = parseInt(parameters.pageSize) - const totalPage = Math.ceil(totalCount / pageSize) - const key = (pageNo - 1) * pageSize - const next = (pageNo >= totalPage ? (totalCount % pageSize) : pageSize) + 1 - - for (let i = 1; i < next; i++) { - const tmpKey = key + i - result.push({ - key: tmpKey, - id: tmpKey, - no: 'No ' + tmpKey, - description: '这是一段描述', - callNo: Mock.mock('@integer(1, 999)'), - status: Mock.mock('@integer(0, 3)'), - updatedAt: Mock.mock('@datetime'), - editable: false - }) - } - - return builder({ - pageSize: pageSize, - pageNo: pageNo, - totalCount: totalCount, - totalPage: totalPage, - data: result - }) -} - -const projects = () => { - return builder({ - 'data': [{ - id: 1, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', - title: 'Alipay', - description: '那是一种内在的东西, 他们到达不了,也无法触及的', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 2, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', - title: 'Angular', - description: '希望是一个好东西,也许是最好的,好东西是不会消亡的', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 3, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', - title: 'Ant Design', - description: '城镇中有那么多的酒馆,她却偏偏走进了我的酒馆', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 4, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', - title: 'Ant Design Pro', - description: '那时候我只会想自己想要什么,从不想自己拥有什么', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 5, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', - title: 'Bootstrap', - description: '凛冬将至', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 6, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png', - title: 'Vue', - description: '生命就像一盒巧克力,结果往往出人意料', - status: 1, - updatedAt: '2018-07-26 00:00:00' - } - ], - 'pageSize': 10, - 'pageNo': 0, - 'totalPage': 6, - 'totalCount': 57 - }) -} - -const activity = () => { - return builder([{ - id: 1, - user: { - nickname: '@name', - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png' - }, - project: { - name: '白鹭酱油开发组', - action: '更新', - event: '番组计划' - }, - time: '2018-08-23 14:47:00' - }, - { - id: 1, - user: { - nickname: '蓝莓酱', - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/jZUIxmJycoymBprLOUbT.png' - }, - project: { - name: '白鹭酱油开发组', - action: '更新', - event: '番组计划' - }, - time: '2018-08-23 09:35:37' - }, - { - id: 1, - user: { - nickname: '@name', - avatar: '@image(64x64)' - }, - project: { - name: '白鹭酱油开发组', - action: '创建', - event: '番组计划' - }, - time: '2017-05-27 00:00:00' - }, - { - id: 1, - user: { - nickname: '曲丽丽', - avatar: '@image(64x64)' - }, - project: { - name: '高逼格设计天团', - action: '更新', - event: '六月迭代' - }, - time: '2018-08-23 14:47:00' - }, - { - id: 1, - user: { - nickname: '@name', - avatar: '@image(64x64)' - }, - project: { - name: '高逼格设计天团', - action: 'created', - event: '六月迭代' - }, - time: '2018-08-23 14:47:00' - }, - { - id: 1, - user: { - nickname: '曲丽丽', - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png' - }, - project: { - name: '高逼格设计天团', - action: 'created', - event: '六月迭代' - }, - time: '2018-08-23 14:47:00' - } - ]) -} - -const teams = () => { - return builder([{ - id: 1, - name: '科学搬砖组', - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png' - }, - { - id: 2, - name: '程序员日常', - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/cnrhVkzwxjPwAaCfPbdc.png' - }, - { - id: 1, - name: '设计天团', - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/gaOngJwsRYRaVAuXXcmB.png' - }, - { - id: 1, - name: '中二少女团', - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ubnKSIfAJTxIgXOKlciN.png' - }, - { - id: 1, - name: '骗你学计算机', - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/WhxKECPNujWoWEFNdnJE.png' - } - ]) -} - -const radar = () => { - return builder([{ - item: '引用', - '个人': 70, - '团队': 30, - '部门': 40 - }, - { - item: '口碑', - '个人': 60, - '团队': 70, - '部门': 40 - }, - { - item: '产量', - '个人': 50, - '团队': 60, - '部门': 40 - }, - { - item: '贡献', - '个人': 40, - '团队': 50, - '部门': 40 - }, - { - item: '热度', - '个人': 60, - '团队': 70, - '部门': 40 - }, - { - item: '引用', - '个人': 70, - '团队': 50, - '部门': 40 - } - ]) -} - -Mock.mock(/\/service/, 'get', serverList) -Mock.mock(/\/list\/search\/projects/, 'get', projects) -Mock.mock(/\/workplace\/activity/, 'get', activity) -Mock.mock(/\/workplace\/teams/, 'get', teams) -Mock.mock(/\/workplace\/radar/, 'get', radar) diff --git a/quantdinger_vue/src/mock/services/other.js b/quantdinger_vue/src/mock/services/other.js deleted file mode 100644 index 56e2dd9..0000000 --- a/quantdinger_vue/src/mock/services/other.js +++ /dev/null @@ -1,973 +0,0 @@ -import Mock from 'mockjs2' -import { builder } from '../util' - -const orgTree = () => { - return builder([{ - 'key': 'key-01', - 'title': '研发中心', - 'icon': 'mail', - 'children': [{ - 'key': 'key-01-01', - 'title': '后端组', - 'icon': null, - 'group': true, - children: [{ - 'key': 'key-01-01-01', - 'title': 'JAVA', - 'icon': null - }, - { - 'key': 'key-01-01-02', - 'title': 'PHP', - 'icon': null - }, - { - 'key': 'key-01-01-03', - 'title': 'Golang', - 'icon': null - } - ] - }, { - 'key': 'key-01-02', - 'title': '前端组', - 'icon': null, - 'group': true, - children: [{ - 'key': 'key-01-02-01', - 'title': 'React', - 'icon': null - }, - { - 'key': 'key-01-02-02', - 'title': 'Vue', - 'icon': null - }, - { - 'key': 'key-01-02-03', - 'title': 'Angular', - 'icon': null - } - ] - }] - }, { - 'key': 'key-02', - 'title': '财务部', - 'icon': 'dollar', - 'children': [{ - 'key': 'key-02-01', - 'title': '会计核算', - 'icon': null - }, { - 'key': 'key-02-02', - 'title': '成本控制', - 'icon': null - }, { - 'key': 'key-02-03', - 'title': '内部控制', - 'icon': null, - 'children': [{ - 'key': 'key-02-03-01', - 'title': '财务制度建设', - 'icon': null - }, - { - 'key': 'key-02-03-02', - 'title': '会计核算', - 'icon': null - } - ] - }] - }]) -} - -const role = () => { - return builder({ - 'data': [{ - 'id': 'admin', - 'name': '管理员', - 'describe': '拥有所有权限', - 'status': 1, - 'creatorId': 'system', - 'createTime': 1497160610259, - 'deleted': 0, - 'permissions': [{ - 'roleId': 'admin', - 'permissionId': 'comment', - 'permissionName': '评论管理', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': '新增', - 'defaultCheck': false - }, - { - 'action': 'query', - 'describe': '查询', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '详情', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': '修改', - 'defaultCheck': false - }, - { - 'action': 'delete', - 'describe': '删除', - 'defaultCheck': false - }], - 'actionList': ['delete', 'edit'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'member', - 'permissionName': '会员管理', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': '新增', - 'defaultCheck': false - }, - { - 'action': 'query', - 'describe': '查询', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '详情', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': '修改', - 'defaultCheck': false - }, - { - 'action': 'delete', - 'describe': '删除', - 'defaultCheck': false - } - ], - 'actionList': ['query', 'get', 'edit', 'delete'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'menu', - 'permissionName': '菜单管理', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"import","defaultCheck":false,"describe":"导入"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"edit","defaultCheck":false,"describe":"修改"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': '新增', - 'defaultCheck': false - }, - { - 'action': 'import', - 'describe': '导入', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '详情', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': '修改', - 'defaultCheck': false - } - ], - 'actionList': ['add', 'import'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'order', - 'permissionName': '订单管理', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': '新增', - 'defaultCheck': false - }, - { - 'action': 'query', - 'describe': '查询', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '详情', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': '修改', - 'defaultCheck': false - }, - { - 'action': 'delete', - 'describe': '删除', - 'defaultCheck': false - } - ], - 'actionList': ['query', 'add', 'get'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'permission', - 'permissionName': '权限管理', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': '新增', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '详情', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': '修改', - 'defaultCheck': false - }, - { - 'action': 'delete', - 'describe': '删除', - 'defaultCheck': false - } - ], - 'actionList': ['add', 'get', 'edit', 'delete'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'role', - 'permissionName': '角色管理', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': '新增', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '详情', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': '修改', - 'defaultCheck': false - }, - { - 'action': 'delete', - 'describe': '删除', - 'defaultCheck': false - } - ], - 'actionList': null, - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'test', - 'permissionName': '测试权限', - 'actions': '[]', - 'actionEntitySet': [], - 'actionList': null, - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'user', - 'permissionName': '用户管理', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"import","defaultCheck":false,"describe":"导入"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"},{"action":"export","defaultCheck":false,"describe":"导出"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': '新增', - 'defaultCheck': false - }, - { - 'action': 'import', - 'describe': '导入', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '详情', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': '修改', - 'defaultCheck': false - }, - { - 'action': 'delete', - 'describe': '删除', - 'defaultCheck': false - }, - { - 'action': 'export', - 'describe': '导出', - 'defaultCheck': false - } - ], - 'actionList': ['add', 'get'], - 'dataAccess': null - } - ] - }, - { - 'id': 'svip', - 'name': 'SVIP', - 'describe': '超级会员', - 'status': 1, - 'creatorId': 'system', - 'createTime': 1532417744846, - 'deleted': 0, - 'permissions': [{ - 'roleId': 'admin', - 'permissionId': 'comment', - 'permissionName': '评论管理', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': '新增', - 'defaultCheck': false - }, - { - 'action': 'query', - 'describe': '查询', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '详情', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': '修改', - 'defaultCheck': false - }, - { - 'action': 'delete', - 'describe': '删除', - 'defaultCheck': false - } - ], - 'actionList': ['add', 'get', 'delete'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'member', - 'permissionName': '会员管理', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': '新增', - 'defaultCheck': false - }, - { - 'action': 'query', - 'describe': '查询', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '详情', - 'defaultCheck': false - } - ], - 'actionList': ['add', 'query', 'get'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'menu', - 'permissionName': '菜单管理', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"import","defaultCheck":false,"describe":"导入"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"edit","defaultCheck":false,"describe":"修改"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': '新增', - 'defaultCheck': false - }, - { - 'action': 'import', - 'describe': '导入', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '详情', - 'defaultCheck': false - } - ], - 'actionList': ['add', 'get'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'order', - 'permissionName': '订单管理', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': '新增', - 'defaultCheck': false - }, - { - 'action': 'query', - 'describe': '查询', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '详情', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': '修改', - 'defaultCheck': false - } - ], - 'actionList': ['add', 'query'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'permission', - 'permissionName': '权限管理', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': '新增', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '详情', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': '修改', - 'defaultCheck': false - } - ], - 'actionList': ['add', 'get', 'edit'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'role', - 'permissionName': '角色管理', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': '新增', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': '修改', - 'defaultCheck': false - }, - { - 'action': 'delete', - 'describe': '删除', - 'defaultCheck': false - } - ], - 'actionList': null, - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'test', - 'permissionName': '测试权限', - 'actions': '[]', - 'actionEntitySet': [], - 'actionList': ['add', 'edit'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'user', - 'permissionName': '用户管理', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"import","defaultCheck":false,"describe":"导入"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"},{"action":"export","defaultCheck":false,"describe":"导出"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': '新增', - 'defaultCheck': false - }, - { - 'action': 'import', - 'describe': '导入', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '详情', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': '修改', - 'defaultCheck': false - } - ], - 'actionList': ['add'], - 'dataAccess': null - } - ] - }, - { - 'id': 'user', - 'name': '普通会员', - 'describe': '普通用户,只能查询', - 'status': 1, - 'creatorId': 'system', - 'createTime': 1497160610259, - 'deleted': 0, - 'permissions': [{ - 'roleId': 'user', - 'permissionId': 'comment', - 'permissionName': '评论管理', - 'actions': '[{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"}]', - 'actionEntitySet': [{ - 'action': 'query', - 'describe': '查询', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '详情', - 'defaultCheck': false - } - ], - 'actionList': ['query'], - 'dataAccess': null - }, - - { - 'roleId': 'user', - 'permissionId': 'marketing', - 'permissionName': '营销管理', - 'actions': '[]', - 'actionEntitySet': [], - 'actionList': null, - 'dataAccess': null - }, - { - 'roleId': 'user', - 'permissionId': 'member', - 'permissionName': '会员管理', - 'actions': '[{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"}]', - 'actionEntitySet': [{ - 'action': 'query', - 'describe': '查询', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '详情', - 'defaultCheck': false - } - ], - 'actionList': null, - 'dataAccess': null - }, - { - 'roleId': 'user', - 'permissionId': 'menu', - 'permissionName': '菜单管理', - 'actions': '[]', - 'actionEntitySet': [], - 'actionList': null, - 'dataAccess': null - }, - - { - 'roleId': 'user', - 'permissionId': 'order', - 'permissionName': '订单管理', - 'actions': '[{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"}]', - 'actionEntitySet': [{ - 'action': 'query', - 'describe': '查询', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '详情', - 'defaultCheck': false - } - ], - 'actionList': null, - 'dataAccess': null - }, - { - 'roleId': 'user', - 'permissionId': 'permission', - 'permissionName': '权限管理', - 'actions': '[]', - 'actionEntitySet': [], - 'actionList': null, - 'dataAccess': null - }, - { - 'roleId': 'user', - 'permissionId': 'role', - 'permissionName': '角色管理', - 'actions': '[]', - 'actionEntitySet': [], - 'actionList': null, - 'dataAccess': null - }, - - { - 'roleId': 'user', - 'permissionId': 'test', - 'permissionName': '测试权限', - 'actions': '[]', - 'actionEntitySet': [], - 'actionList': null, - 'dataAccess': null - }, - { - 'roleId': 'user', - 'permissionId': 'user', - 'permissionName': '用户管理', - 'actions': '[]', - 'actionEntitySet': [], - 'actionList': null, - 'dataAccess': null - } - ] - } - ], - 'pageSize': 10, - 'pageNo': 0, - 'totalPage': 1, - 'totalCount': 5 - }) -} - -const permissionNoPager = () => { - return builder([{ - 'id': 'marketing', - 'name': '营销管理', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'sptDaTypes': null, - 'optionalFields': null, - 'parents': null, - 'type': null, - 'deleted': 0, - 'actions': [ - 'add', - 'query', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'member', - 'name': '会员管理', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'query', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'menu', - 'name': '菜单管理', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"import","defaultCheck":false,"describe":"导入"},{"action":"get","defaultCheck":false,"describe":"查询"},{"action":"edit","defaultCheck":false,"describe":"修改"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'import', - 'get', - 'edit' - ] - }, - { - 'id': 'order', - 'name': '订单管理', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'query', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'permission', - 'name': '权限管理', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"get","defaultCheck":false,"describe":"查询"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'role', - 'name': '角色管理', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"get","defaultCheck":false,"describe":"查询"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'test', - 'name': '测试权限', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"get","defaultCheck":false,"describe":"详情"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'get' - ] - }, - { - 'id': 'user', - 'name': '用户管理', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"},{"action":"import","defaultCheck":false,"describe":"导入"},{"action":"export","defaultCheck":false,"describe":"导出"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'get' - ] - } - ]) -} - -const permissions = () => { - return builder({ - 'data': [{ - 'id': 'marketing', - 'name': '营销管理', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'sptDaTypes': null, - 'optionalFields': null, - 'parents': null, - 'type': null, - 'deleted': 0, - 'actions': [ - 'add', - 'query', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'member', - 'name': '会员管理', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'query', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'menu', - 'name': '菜单管理', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"import","defaultCheck":false,"describe":"导入"},{"action":"get","defaultCheck":false,"describe":"查询"},{"action":"edit","defaultCheck":false,"describe":"修改"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'import', - 'get', - 'edit' - ] - }, - { - 'id': 'order', - 'name': '订单管理', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'query', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'permission', - 'name': '权限管理', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"get","defaultCheck":false,"describe":"查询"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'role', - 'name': '角色管理', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"get","defaultCheck":false,"describe":"查询"},{"action":"edit","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'test', - 'name': '测试权限', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"get","defaultCheck":false,"describe":"详情"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'get' - ] - }, - { - 'id': 'user', - 'name': '用户管理', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","describe":"新增","defaultCheck":false},{"action":"get","describe":"查询","defaultCheck":false}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'get' - ] - } - ], - 'pageSize': 10, - 'pageNo': 0, - 'totalPage': 1, - 'totalCount': 5 - }) -} - -Mock.mock(/\/org\/tree/, 'get', orgTree) -Mock.mock(/\/role/, 'get', role) -Mock.mock(/\/permission\/no-pager/, 'get', permissionNoPager) -Mock.mock(/\/permission/, 'get', permissions) diff --git a/quantdinger_vue/src/mock/services/tagCloud.js b/quantdinger_vue/src/mock/services/tagCloud.js deleted file mode 100644 index 63a2e06..0000000 --- a/quantdinger_vue/src/mock/services/tagCloud.js +++ /dev/null @@ -1,9 +0,0 @@ -import Mock from 'mockjs2' -import { builder } from '../util' - -// -const tagCloudData = () => { - return builder([{ 'value': 9, 'name': 'AntV' }, { 'value': 8, 'name': 'F2' }, { 'value': 8, 'name': 'G2' }, { 'value': 8, 'name': 'G6' }, { 'value': 8, 'name': 'DataSet' }, { 'value': 8, 'name': '墨者学院' }, { 'value': 6, 'name': 'Analysis' }, { 'value': 6, 'name': 'Data Mining' }, { 'value': 6, 'name': 'Data Vis' }, { 'value': 6, 'name': 'Design' }, { 'value': 6, 'name': 'Grammar' }, { 'value': 6, 'name': 'Graphics' }, { 'value': 6, 'name': 'Graph' }, { 'value': 6, 'name': 'Hierarchy' }, { 'value': 6, 'name': 'Labeling' }, { 'value': 6, 'name': 'Layout' }, { 'value': 6, 'name': 'Quantitative' }, { 'value': 6, 'name': 'Relation' }, { 'value': 6, 'name': 'Statistics' }, { 'value': 6, 'name': '可视化' }, { 'value': 6, 'name': '数据' }, { 'value': 6, 'name': '数据可视化' }, { 'value': 4, 'name': 'Arc Diagram' }, { 'value': 4, 'name': 'Bar Chart' }, { 'value': 4, 'name': 'Canvas' }, { 'value': 4, 'name': 'Chart' }, { 'value': 4, 'name': 'DAG' }, { 'value': 4, 'name': 'DG' }, { 'value': 4, 'name': 'Facet' }, { 'value': 4, 'name': 'Geo' }, { 'value': 4, 'name': 'Line' }, { 'value': 4, 'name': 'MindMap' }, { 'value': 4, 'name': 'Pie' }, { 'value': 4, 'name': 'Pizza Chart' }, { 'value': 4, 'name': 'Punch Card' }, { 'value': 4, 'name': 'SVG' }, { 'value': 4, 'name': 'Sunburst' }, { 'value': 4, 'name': 'Tree' }, { 'value': 4, 'name': 'UML' }, { 'value': 3, 'name': 'Chart' }, { 'value': 3, 'name': 'View' }, { 'value': 3, 'name': 'Geom' }, { 'value': 3, 'name': 'Shape' }, { 'value': 3, 'name': 'Scale' }, { 'value': 3, 'name': 'Animate' }, { 'value': 3, 'name': 'Global' }, { 'value': 3, 'name': 'Slider' }, { 'value': 3, 'name': 'Connector' }, { 'value': 3, 'name': 'Transform' }, { 'value': 3, 'name': 'Util' }, { 'value': 3, 'name': 'DomUtil' }, { 'value': 3, 'name': 'MatrixUtil' }, { 'value': 3, 'name': 'PathUtil' }, { 'value': 3, 'name': 'G' }, { 'value': 3, 'name': '2D' }, { 'value': 3, 'name': '3D' }, { 'value': 3, 'name': 'Line' }, { 'value': 3, 'name': 'Area' }, { 'value': 3, 'name': 'Interval' }, { 'value': 3, 'name': 'Schema' }, { 'value': 3, 'name': 'Edge' }, { 'value': 3, 'name': 'Polygon' }, { 'value': 3, 'name': 'Heatmap' }, { 'value': 3, 'name': 'Render' }, { 'value': 3, 'name': 'Tooltip' }, { 'value': 3, 'name': 'Axis' }, { 'value': 3, 'name': 'Guide' }, { 'value': 3, 'name': 'Coord' }, { 'value': 3, 'name': 'Legend' }, { 'value': 3, 'name': 'Path' }, { 'value': 3, 'name': 'Helix' }, { 'value': 3, 'name': 'Theta' }, { 'value': 3, 'name': 'Rect' }, { 'value': 3, 'name': 'Polar' }, { 'value': 3, 'name': 'Dsv' }, { 'value': 3, 'name': 'Csv' }, { 'value': 3, 'name': 'Tsv' }, { 'value': 3, 'name': 'GeoJSON' }, { 'value': 3, 'name': 'TopoJSON' }, { 'value': 3, 'name': 'Filter' }, { 'value': 3, 'name': 'Map' }, { 'value': 3, 'name': 'Pick' }, { 'value': 3, 'name': 'Rename' }, { 'value': 3, 'name': 'Filter' }, { 'value': 3, 'name': 'Map' }, { 'value': 3, 'name': 'Pick' }, { 'value': 3, 'name': 'Rename' }, { 'value': 3, 'name': 'Reverse' }, { 'value': 3, 'name': 'sort' }, { 'value': 3, 'name': 'Subset' }, { 'value': 3, 'name': 'Partition' }, { 'value': 3, 'name': 'Imputation' }, { 'value': 3, 'name': 'Fold' }, { 'value': 3, 'name': 'Aggregate' }, { 'value': 3, 'name': 'Proportion' }, { 'value': 3, 'name': 'Histogram' }, { 'value': 3, 'name': 'Quantile' }, { 'value': 3, 'name': 'Treemap' }, { 'value': 3, 'name': 'Hexagon' }, { 'value': 3, 'name': 'Binning' }, { 'value': 3, 'name': 'kernel' }, { 'value': 3, 'name': 'Regression' }, { 'value': 3, 'name': 'Density' }, { 'value': 3, 'name': 'Sankey' }, { 'value': 3, 'name': 'Voronoi' }, { 'value': 3, 'name': 'Projection' }, { 'value': 3, 'name': 'Centroid' }, { 'value': 3, 'name': 'H5' }, { 'value': 3, 'name': 'Mobile' }, { 'value': 3, 'name': 'K线图' }, { 'value': 3, 'name': '关系图' }, { 'value': 3, 'name': '烛形图' }, { 'value': 3, 'name': '股票图' }, { 'value': 3, 'name': '直方图' }, { 'value': 3, 'name': '金字塔图' }, { 'value': 3, 'name': '分面' }, { 'value': 3, 'name': '南丁格尔玫瑰图' }, { 'value': 3, 'name': '饼图' }, { 'value': 3, 'name': '线图' }, { 'value': 3, 'name': '点图' }, { 'value': 3, 'name': '散点图' }, { 'value': 3, 'name': '子弹图' }, { 'value': 3, 'name': '柱状图' }, { 'value': 3, 'name': '仪表盘' }, { 'value': 3, 'name': '气泡图' }, { 'value': 3, 'name': '漏斗图' }, { 'value': 3, 'name': '热力图' }, { 'value': 3, 'name': '玉玦图' }, { 'value': 3, 'name': '直方图' }, { 'value': 3, 'name': '矩形树图' }, { 'value': 3, 'name': '箱形图' }, { 'value': 3, 'name': '色块图' }, { 'value': 3, 'name': '螺旋图' }, { 'value': 3, 'name': '词云' }, { 'value': 3, 'name': '词云图' }, { 'value': 3, 'name': '雷达图' }, { 'value': 3, 'name': '面积图' }, { 'value': 3, 'name': '马赛克图' }, { 'value': 3, 'name': '盒须图' }, { 'value': 3, 'name': '坐标轴' }, { 'value': 3, 'name': '' }, { 'value': 3, 'name': 'Jacques Bertin' }, { 'value': 3, 'name': 'Leland Wilkinson' }, { 'value': 3, 'name': 'William Playfair' }, { 'value': 3, 'name': '关联' }, { 'value': 3, 'name': '分布' }, { 'value': 3, 'name': '区间' }, { 'value': 3, 'name': '占比' }, { 'value': 3, 'name': '地图' }, { 'value': 3, 'name': '时间' }, { 'value': 3, 'name': '比较' }, { 'value': 3, 'name': '流程' }, { 'value': 3, 'name': '趋势' }, { 'value': 2, 'name': '亦叶' }, { 'value': 2, 'name': '再飞' }, { 'value': 2, 'name': '完白' }, { 'value': 2, 'name': '巴思' }, { 'value': 2, 'name': '张初尘' }, { 'value': 2, 'name': '御术' }, { 'value': 2, 'name': '有田' }, { 'value': 2, 'name': '沉鱼' }, { 'value': 2, 'name': '玉伯' }, { 'value': 2, 'name': '画康' }, { 'value': 2, 'name': '祯逸' }, { 'value': 2, 'name': '绝云' }, { 'value': 2, 'name': '罗宪' }, { 'value': 2, 'name': '萧庆' }, { 'value': 2, 'name': '董珊珊' }, { 'value': 2, 'name': '陆沉' }, { 'value': 2, 'name': '顾倾' }, { 'value': 2, 'name': 'Domo' }, { 'value': 2, 'name': 'GPL' }, { 'value': 2, 'name': 'PAI' }, { 'value': 2, 'name': 'SPSS' }, { 'value': 2, 'name': 'SYSTAT' }, { 'value': 2, 'name': 'Tableau' }, { 'value': 2, 'name': 'D3' }, { 'value': 2, 'name': 'Vega' }, { 'value': 2, 'name': '统计图表' }]) -} - -Mock.mock(/\/data\/antv\/tag-cloud/, 'get', tagCloudData) diff --git a/quantdinger_vue/src/mock/services/user.js b/quantdinger_vue/src/mock/services/user.js deleted file mode 100644 index a104a31..0000000 --- a/quantdinger_vue/src/mock/services/user.js +++ /dev/null @@ -1,577 +0,0 @@ -import Mock from 'mockjs2' -import { builder } from '../util' - -const info = options => { - const userInfo = { - id: '4291d7da9005377ec9aec4a71ea837f', - name: '天野远子', - username: 'admin', - password: '', - avatar: '/avatar2.jpg', - status: 1, - telephone: '', - lastLoginIp: '27.154.74.117', - lastLoginTime: 1534837621348, - creatorId: 'admin', - createTime: 1497160610259, - merchantCode: 'TLif2btpzg079h15bk', - deleted: 0, - roleId: 'admin', - role: {} - } - // role - const roleObj = { - id: 'admin', - name: '管理员', - describe: '拥有所有权限', - status: 1, - creatorId: 'system', - createTime: 1497160610259, - deleted: 0, - permissions: [ - { - roleId: 'admin', - permissionId: 'dashboard', - permissionName: '仪表盘', - actions: - '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"update","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - actionEntitySet: [ - { - action: 'add', - describe: '新增', - defaultCheck: false - }, - { - action: 'query', - describe: '查询', - defaultCheck: false - }, - { - action: 'get', - describe: '详情', - defaultCheck: false - }, - { - action: 'update', - describe: '修改', - defaultCheck: false - }, - { - action: 'delete', - describe: '删除', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'exception', - permissionName: '异常页面权限', - actions: - '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"update","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - actionEntitySet: [ - { - action: 'add', - describe: '新增', - defaultCheck: false - }, - { - action: 'query', - describe: '查询', - defaultCheck: false - }, - { - action: 'get', - describe: '详情', - defaultCheck: false - }, - { - action: 'update', - describe: '修改', - defaultCheck: false - }, - { - action: 'delete', - describe: '删除', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'result', - permissionName: '结果权限', - actions: - '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"update","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - actionEntitySet: [ - { - action: 'add', - describe: '新增', - defaultCheck: false - }, - { - action: 'query', - describe: '查询', - defaultCheck: false - }, - { - action: 'get', - describe: '详情', - defaultCheck: false - }, - { - action: 'update', - describe: '修改', - defaultCheck: false - }, - { - action: 'delete', - describe: '删除', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'profile', - permissionName: '详细页权限', - actions: - '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"update","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - actionEntitySet: [ - { - action: 'add', - describe: '新增', - defaultCheck: false - }, - { - action: 'query', - describe: '查询', - defaultCheck: false - }, - { - action: 'get', - describe: '详情', - defaultCheck: false - }, - { - action: 'update', - describe: '修改', - defaultCheck: false - }, - { - action: 'delete', - describe: '删除', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'table', - permissionName: '表格权限', - actions: - '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"import","defaultCheck":false,"describe":"导入"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"update","defaultCheck":false,"describe":"修改"}]', - actionEntitySet: [ - { - action: 'add', - describe: '新增', - defaultCheck: false - }, - { - action: 'import', - describe: '导入', - defaultCheck: false - }, - { - action: 'get', - describe: '详情', - defaultCheck: false - }, - { - action: 'update', - describe: '修改', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'form', - permissionName: '表单权限', - actions: - '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"update","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - actionEntitySet: [ - { - action: 'add', - describe: '新增', - defaultCheck: false - }, - { - action: 'get', - describe: '详情', - defaultCheck: false - }, - { - action: 'query', - describe: '查询', - defaultCheck: false - }, - { - action: 'update', - describe: '修改', - defaultCheck: false - }, - { - action: 'delete', - describe: '删除', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'order', - permissionName: '订单管理', - actions: - '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"update","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - actionEntitySet: [ - { - action: 'add', - describe: '新增', - defaultCheck: false - }, - { - action: 'query', - describe: '查询', - defaultCheck: false - }, - { - action: 'get', - describe: '详情', - defaultCheck: false - }, - { - action: 'update', - describe: '修改', - defaultCheck: false - }, - { - action: 'delete', - describe: '删除', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'permission', - permissionName: '权限管理', - actions: - '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"update","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - actionEntitySet: [ - { - action: 'add', - describe: '新增', - defaultCheck: false - }, - { - action: 'get', - describe: '详情', - defaultCheck: false - }, - { - action: 'update', - describe: '修改', - defaultCheck: false - }, - { - action: 'delete', - describe: '删除', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'role', - permissionName: '角色管理', - actions: - '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"update","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - actionEntitySet: [ - { - action: 'add', - describe: '新增', - defaultCheck: false - }, - { - action: 'get', - describe: '详情', - defaultCheck: false - }, - { - action: 'update', - describe: '修改', - defaultCheck: false - }, - { - action: 'delete', - describe: '删除', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'table', - permissionName: '桌子管理', - actions: - '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"query","defaultCheck":false,"describe":"查询"},{"action":"update","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"}]', - actionEntitySet: [ - { - action: 'add', - describe: '新增', - defaultCheck: false - }, - { - action: 'get', - describe: '详情', - defaultCheck: false - }, - { - action: 'query', - describe: '查询', - defaultCheck: false - }, - { - action: 'update', - describe: '修改', - defaultCheck: false - }, - { - action: 'delete', - describe: '删除', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'user', - permissionName: '用户管理', - actions: - '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"import","defaultCheck":false,"describe":"导入"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"update","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"},{"action":"export","defaultCheck":false,"describe":"导出"}]', - actionEntitySet: [ - { - action: 'add', - describe: '新增', - defaultCheck: false - }, - { - action: 'import', - describe: '导入', - defaultCheck: false - }, - { - action: 'get', - describe: '详情', - defaultCheck: false - }, - { - action: 'update', - describe: '修改', - defaultCheck: false - }, - { - action: 'delete', - describe: '删除', - defaultCheck: false - }, - { - action: 'export', - describe: '导出', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - } - ] - } - - roleObj.permissions.push({ - roleId: 'admin', - permissionId: 'support', - permissionName: '超级模块', - actions: - '[{"action":"add","defaultCheck":false,"describe":"新增"},{"action":"import","defaultCheck":false,"describe":"导入"},{"action":"get","defaultCheck":false,"describe":"详情"},{"action":"update","defaultCheck":false,"describe":"修改"},{"action":"delete","defaultCheck":false,"describe":"删除"},{"action":"export","defaultCheck":false,"describe":"导出"}]', - actionEntitySet: [ - { - action: 'add', - describe: '新增', - defaultCheck: false - }, - { - action: 'import', - describe: '导入', - defaultCheck: false - }, - { - action: 'get', - describe: '详情', - defaultCheck: false - }, - { - action: 'update', - describe: '修改', - defaultCheck: false - }, - { - action: 'delete', - describe: '删除', - defaultCheck: false - }, - { - action: 'export', - describe: '导出', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }) - - userInfo.role = roleObj - return builder(userInfo) -} - -/** - * 使用 用户登录的 token 获取用户有权限的菜单 - * 返回结构必须按照这个结构体形式处理,或根据 - * /src/router/generator-routers.js 文件的菜单结构处理函数对应即可 - * @param {*} options - * @returns - */ -const userNav = options => { - const nav = [ - // AI 分析 - { - name: 'Analysis', - parentId: 0, - id: 1, - meta: { - title: 'menu.dashboard.analysis', - icon: 'thunderbolt', - show: true - }, - component: 'Analysis', - path: '/ai-analysis' - }, - // 指标分析 - { - name: 'Indicator', - parentId: 0, - id: 2, - meta: { - title: 'menu.dashboard.indicator', - icon: 'line-chart', - show: true - }, - component: 'Indicator', - path: '/indicator-analysis' - }, - // 特殊三级菜单 - { - name: 'settings', - parentId: 10028, - id: 10030, - meta: { - title: 'menu.account.settings', - hideHeader: true, - hideChildren: true, - show: true - }, - redirect: '/account/settings/basic', - component: 'AccountSettings' - }, - { - name: 'BasicSettings', - path: '/account/settings/basic', - parentId: 10030, - id: 10031, - meta: { - title: 'account.settings.menuMap.basic', - show: false - }, - component: 'BasicSetting' - }, - { - name: 'SecuritySettings', - path: '/account/settings/security', - parentId: 10030, - id: 10032, - meta: { - title: 'account.settings.menuMap.security', - show: false - }, - component: 'SecuritySettings' - }, - { - name: 'CustomSettings', - path: '/account/settings/custom', - parentId: 10030, - id: 10033, - meta: { - title: 'account.settings.menuMap.custom', - show: false - }, - component: 'CustomSettings' - }, - { - name: 'BindingSettings', - path: '/account/settings/binding', - parentId: 10030, - id: 10034, - meta: { - title: 'account.settings.menuMap.binding', - show: false - }, - component: 'BindingSettings' - }, - { - name: 'NotificationSettings', - path: '/account/settings/notification', - parentId: 10030, - id: 10034, - meta: { - title: 'account.settings.menuMap.notification', - show: false - }, - component: 'NotificationSettings' - } - ] - const json = builder(nav) - return json -} - -Mock.mock(/\/api\/user\/info/, 'get', info) -Mock.mock(/\/api\/user\/nav/, 'get', userNav) diff --git a/quantdinger_vue/src/mock/util.js b/quantdinger_vue/src/mock/util.js deleted file mode 100644 index a4be036..0000000 --- a/quantdinger_vue/src/mock/util.js +++ /dev/null @@ -1,38 +0,0 @@ -const responseBody = { - message: '', - timestamp: 0, - result: null, - code: 0 -} - -export const builder = (data, message, code = 0, headers = {}) => { - responseBody.result = data - if (message !== undefined && message !== null) { - responseBody.message = message - } - if (code !== undefined && code !== 0) { - responseBody.code = code - responseBody._status = code - } - if (headers !== null && typeof headers === 'object' && Object.keys(headers).length > 0) { - responseBody._headers = headers - } - responseBody.timestamp = new Date().getTime() - return responseBody -} - -export const getQueryParameters = (options) => { - const url = options.url - const search = url.split('?')[1] - if (!search) { - return {} - } - return JSON.parse('{"' + decodeURIComponent(search) - .replace(/"/g, '\\"') - .replace(/&/g, '","') - .replace(/=/g, '":"') + '"}') -} - -export const getBody = (options) => { - return options.body && JSON.parse(options.body) -} diff --git a/quantdinger_vue/src/permission.js b/quantdinger_vue/src/permission.js deleted file mode 100644 index 32a64c3..0000000 --- a/quantdinger_vue/src/permission.js +++ /dev/null @@ -1,128 +0,0 @@ -import router, { - resetRouter -} from './router' -import store from './store' -import storage from 'store' -import NProgress from 'nprogress' // progress bar -import '@/components/NProgress/nprogress.less' // progress bar custom style -import { - setDocumentTitle, - domTitle -} from '@/utils/domUtil' -import { - ACCESS_TOKEN -} from '@/store/mutation-types' -import { - i18nRender -} from '@/locales' - -NProgress.configure({ - showSpinner: false -}) // NProgress Configuration - -const allowList = ['login'] // no redirect allowList -const loginRoutePath = '/user/login' -const defaultRoutePath = '/dashboard' - -router.beforeEach((to, from, next) => { - NProgress.start() // start progress bar - to.meta && typeof to.meta.title !== 'undefined' && setDocumentTitle(`${i18nRender(to.meta.title)} - ${domTitle}`) - - // Check whether we have a token (local-only auth). - // 处理 token 可能是字符串或对象的情况 - let token = storage.get(ACCESS_TOKEN) - if (token && typeof token !== 'string') { - token = token.token || token.value || (typeof token === 'object' ? null : token) - } - token = typeof token === 'string' ? token : null - - if (token) { - // 有 token,允许访问所有页面 - // 如果访问登录页,跳转到默认页面 - if (to.path === loginRoutePath) { - next({ path: defaultRoutePath }) - NProgress.done() - } else { - // 检查用户信息是否已加载 - if (store.getters.roles.length === 0) { - store.dispatch('GetInfo') - .then(res => { - // 拉取用户信息成功 - // const roles = res && res.role - // 生成路由 - store.dispatch('GenerateRoutes', { token }).then(() => { - // 动态添加可访问路由表 - resetRouter() // 重置路由 - store.getters.addRouters.forEach(r => { - router.addRoute(r) - }) - // 请求带有 redirect 重定向时,登录自动重定向到该地址 - const redirect = decodeURIComponent(from.query.redirect || to.path) - if (to.path === redirect) { - // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record - next({ ...to, replace: true }) - } else { - // 跳转到目的路由 - next({ path: redirect }) - } - }) - }) - .catch((err) => { - // If token is invalid/expired, clear local auth and redirect to login. - const status = err && err.response && err.response.status - if (status === 401) { - store.dispatch('Logout').finally(() => { - next({ path: loginRoutePath, query: { redirect: to.fullPath } }) - NProgress.done() - }) - return - } - - // Do NOT hard-logout on transient failures (backend down, proxy issue, etc). - // Instead, degrade gracefully with a default role and continue. - store.commit('SET_ROLES', [{ id: 'default', permissionList: [] }]) - store.dispatch('GenerateRoutes', { token }).then(() => { - resetRouter() - store.getters.addRouters.forEach(r => router.addRoute(r)) - next({ ...to, replace: true }) - }).catch(() => { - next() - }) - }) - } else { - // 检查路由是否已初始化 - const addRouters = store.getters.addRouters - // 如果路由未初始化,先初始化路由 - if (!addRouters || addRouters.length === 0) { - store.dispatch('GenerateRoutes', { token }).then(() => { - // 动态添加可访问路由表 - resetRouter() // 重置路由 防止退出重新登录或者 token 过期后页面未刷新,导致的路由重复添加 - store.getters.addRouters.forEach(r => { - router.addRoute(r) - }) - // 重新进入当前路由,避免首次刷新空白 - next({ ...to, replace: true }) - }).catch(() => { - next() - }) - } else { - next() - } - } - } - } else { - // 没有 token - if (allowList.includes(to.name)) { - // 在免登录名单,直接进入 - next() - } else { - // 跳转到登录页 - next({ path: loginRoutePath, query: { redirect: to.fullPath } }) - NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it - } - } -}) - -router.afterEach(() => { - NProgress.done() // finish progress bar -}) diff --git a/quantdinger_vue/src/router/README.md b/quantdinger_vue/src/router/README.md deleted file mode 100644 index b736444..0000000 --- a/quantdinger_vue/src/router/README.md +++ /dev/null @@ -1,134 +0,0 @@ -路由/菜单说明 -==== - - -格式和说明 ----- - -```ecmascript 6 -const routerObject = { - redirect: noredirect, - name: 'router-name', - hidden: true, - meta: { - title: 'title', - icon: 'a-icon', - target: '_blank|_self|_top|_parent', - keepAlive: true, - hiddenHeaderContent: true, - } -} -``` - - - -`{ Route }` 对象 - -| 参数 | 说明 | 类型 | 默认值 | -| -------- | ----------------------------------------- | ------- | ------ | -| hidden | 控制路由是否显示在 sidebar | boolean | false | -| redirect | 重定向地址, 访问这个路由时,自定进行重定向 | string | - | -| name | 路由名称, 必须设置,且不能重名 | string | - | -| meta | 路由元信息(路由附带扩展信息) | object | {} | -| hideChildrenInMenu | 强制菜单显示为Item而不是SubItem(配合 meta.hidden) | boolean | - | - - -`{ Meta }` 路由元信息对象 - -| 参数 | 说明 | 类型 | 默认值 | -| ------------------- | ------------------------------------------------------------ | ------- | ------ | -| title | 路由标题, 用于显示面包屑, 页面标题 *推荐设置 | string | - | -| icon | 路由在 menu 上显示的图标 | [string,svg] | - | -| keepAlive | 缓存该路由 | boolean | false | -| target | 菜单链接跳转目标(参考 html a 标记) | string | - | -| hidden | 配合`hideChildrenInMenu`使用,用于隐藏菜单时,提供递归到父菜单显示 选中菜单项_(可参考 个人页 配置方式)_ | boolean | false | -| hiddenHeaderContent | *特殊 隐藏 [PageHeader](https://github.com/vueComponent/ant-design-vue-pro/blob/master/src/components/PageHeader/PageHeader.vue#L6) 组件中的页面带的 面包屑和页面标题栏 | boolean | false | -| permission | 与项目提供的权限拦截匹配的权限,如果不匹配,则会被禁止访问该路由页面 | array | [] | - -> 路由自定义 `Icon` 请引入自定义 `svg` Icon 文件,然后传递给路由的 `meta.icon` 参数即可 - -路由构建例子方案1 - -路由例子 ----- - -```ecmascript 6 -const asyncRouterMap = [ - { - path: '/', - name: 'index', - component: BasicLayout, - meta: { title: '首页' }, - redirect: '/ai-analysis', - children: [ - { - path: '/dashboard', - component: RouteView, - name: 'dashboard', - redirect: '/dashboard/workplace', - meta: {title: '仪表盘', icon: 'dashboard', permission: ['dashboard']}, - children: [ - { - path: '/ai-analysis', - name: 'Analysis', - component: () => import('@/views/dashboard/Analysis'), - meta: {title: '分析页', permission: ['dashboard']} - }, - { - path: '/dashboard/monitor', - name: 'Monitor', - hidden: true, - component: () => import('@/views/dashboard/Monitor'), - meta: {title: '监控页', permission: ['dashboard']} - }, - { - path: '/dashboard/workplace', - name: 'Workplace', - component: () => import('@/views/dashboard/Workplace'), - meta: {title: '工作台', permission: ['dashboard']} - } - ] - }, - - // result - { - path: '/result', - name: 'result', - component: PageView, - redirect: '/result/success', - meta: { title: '结果页', icon: 'check-circle-o', permission: [ 'result' ] }, - children: [ - { - path: '/result/success', - name: 'ResultSuccess', - component: () => import(/* webpackChunkName: "result" */ '@/views/result/Success'), - // 该页面隐藏面包屑和页面标题栏 - meta: { title: '成功', hiddenHeaderContent: true, permission: [ 'result' ] } - }, - { - path: '/result/fail', - name: 'ResultFail', - component: () => import(/* webpackChunkName: "result" */ '@/views/result/Error'), - // 该页面隐藏面包屑和页面标题栏 - meta: { title: '失败', hiddenHeaderContent: true, permission: [ 'result' ] } - } - ] - }, - ... - ] - }, -] -``` - -> 1. 请注意 `component: () => import('..') ` 方式引入路由的页面组件为 懒加载模式。具体可以看 [Vue 官方文档](https://router.vuejs.org/zh/guide/advanced/lazy-loading.html) -> 2. 增加新的路由应该增加在 '/' (index) 路由的 `children` 内 -> 3. 子路由的父级路由必须有 `router-view` 才能让子路由渲染出来,请仔细查阅 vue-router 文档 -> 4. `permission` 可以进行自定义修改,只需要对这个模块进行自定义修改即可 [src/store/modules/permission.js#L10](https://github.com/vueComponent/ant-design-vue-pro/blob/master/src/store/modules/permission.js#L10) - - -附权限路由结构: - -![权限结构](https://static-2.loacg.com/open/static/github/permissions.png) - - -第二种前端路由由后端动态生成的设计,可以前往官网文档 https://pro.antdv.com/docs/authority-management 参考 diff --git a/quantdinger_vue/src/router/generator-routers.js b/quantdinger_vue/src/router/generator-routers.js deleted file mode 100644 index f422d25..0000000 --- a/quantdinger_vue/src/router/generator-routers.js +++ /dev/null @@ -1,85 +0,0 @@ -import { asyncRouterMap } from '@/config/router.config' -import storage from 'store' -import { USER_INFO, USER_ROLES } from '@/store/mutation-types' - -/** - * Filter routes based on user permissions. - * Routes with meta.permission containing 'admin' are only visible to admin users. - * - * @param {Array} routes - Route configuration array - * @param {boolean} isAdmin - Whether current user is admin - * @returns {Array} Filtered routes - */ -function filterRoutesByPermission (routes, isAdmin) { - const filtered = [] - - for (const route of routes) { - // Clone route to avoid mutating original - const clonedRoute = { ...route } - - // Check if route requires admin permission - const permissions = clonedRoute.meta?.permission || [] - const requiresAdmin = permissions.includes('admin') - - // If requires admin but user is not admin, skip this route - if (requiresAdmin && !isAdmin) { - continue - } - - // Recursively filter children - if (clonedRoute.children && clonedRoute.children.length > 0) { - clonedRoute.children = filterRoutesByPermission(clonedRoute.children, isAdmin) - } - - filtered.push(clonedRoute) - } - - return filtered -} - -/** - * Check if current user is admin. - * Checks both userInfo.role and stored roles array. - * - * @returns {boolean} True if user is admin - */ -function checkIsAdmin () { - // Check userInfo.role first - const userInfo = storage.get(USER_INFO) || {} - if (userInfo.role) { - const roleId = typeof userInfo.role === 'string' ? userInfo.role : userInfo.role.id - if (roleId === 'admin') { - return true - } - } - - // Check stored roles array - const roles = storage.get(USER_ROLES) || [] - if (Array.isArray(roles)) { - for (const role of roles) { - if (role && (role.id === 'admin' || role === 'admin')) { - return true - } - } - } - - return false -} - -/** - * Generate dynamic routes based on user permissions. - * Filters admin-only routes for non-admin users. - * - * @param {string} token - User token (unused, kept for compatibility) - * @returns {Promise} Promise resolving to filtered routes - */ -export const generatorDynamicRouter = token => { - return new Promise((resolve) => { - const isAdmin = checkIsAdmin() - - // Filter routes based on permissions - const filteredRoutes = filterRoutesByPermission(asyncRouterMap, isAdmin) - - resolve(filteredRoutes) - }) -} diff --git a/quantdinger_vue/src/router/index.js b/quantdinger_vue/src/router/index.js deleted file mode 100644 index 5acaeff..0000000 --- a/quantdinger_vue/src/router/index.js +++ /dev/null @@ -1,28 +0,0 @@ -import Vue from 'vue' -import Router from 'vue-router' -import { constantRouterMap } from '@/config/router.config' - -// hack router push callback -const originalPush = Router.prototype.push -Router.prototype.push = function push (location, onResolve, onReject) { - if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject) - return originalPush.call(this, location).catch(err => err) -} - -Vue.use(Router) - -const createRouter = () => - new Router({ - mode: 'hash', - routes: constantRouterMap - }) - -const router = createRouter() - -// 定义一个resetRouter 方法,在退出登录后或token过期后 需要重新登录时,调用即可 -export function resetRouter () { - const newRouter = createRouter() - router.matcher = newRouter.matcher -} - -export default router diff --git a/quantdinger_vue/src/store/app-mixin.js b/quantdinger_vue/src/store/app-mixin.js deleted file mode 100644 index c910ae9..0000000 --- a/quantdinger_vue/src/store/app-mixin.js +++ /dev/null @@ -1,32 +0,0 @@ -import { mapState } from 'vuex' - -const baseMixin = { - computed: { - ...mapState({ - layout: state => state.app.layout, - navTheme: state => state.app.theme, - primaryColor: state => state.app.color, - colorWeak: state => state.app.weak, - fixedHeader: state => state.app.fixedHeader, - fixedSidebar: state => state.app.fixedSidebar, - contentWidth: state => state.app.contentWidth, - autoHideHeader: state => state.app.autoHideHeader, - - isMobile: state => state.app.isMobile, - sideCollapsed: state => state.app.sideCollapsed, - multiTab: state => state.app.multiTab - }), - isTopMenu () { - return this.layout === 'topmenu' - } - }, - methods: { - isSideMenu () { - return !this.isTopMenu - } - } -} - -export { - baseMixin -} diff --git a/quantdinger_vue/src/store/device-mixin.js b/quantdinger_vue/src/store/device-mixin.js deleted file mode 100644 index 2510707..0000000 --- a/quantdinger_vue/src/store/device-mixin.js +++ /dev/null @@ -1,11 +0,0 @@ -import { mapState } from 'vuex' - -const deviceMixin = { - computed: { - ...mapState({ - isMobile: state => state.app.isMobile - }) - } -} - -export { deviceMixin } diff --git a/quantdinger_vue/src/store/getters.js b/quantdinger_vue/src/store/getters.js deleted file mode 100644 index 5a5ad70..0000000 --- a/quantdinger_vue/src/store/getters.js +++ /dev/null @@ -1,16 +0,0 @@ -const getters = { - isMobile: state => state.app.isMobile, - lang: state => state.app.lang, - theme: state => state.app.theme, - color: state => state.app.color, - token: state => state.user.token, - avatar: state => state.user.avatar, - nickname: state => state.user.name, - welcome: state => state.user.welcome, - roles: state => state.user.roles, - userInfo: state => state.user.info, - addRouters: state => state.permission.addRouters, - multiTab: state => state.app.multiTab -} - -export default getters diff --git a/quantdinger_vue/src/store/i18n-mixin.js b/quantdinger_vue/src/store/i18n-mixin.js deleted file mode 100644 index 715b0c8..0000000 --- a/quantdinger_vue/src/store/i18n-mixin.js +++ /dev/null @@ -1,16 +0,0 @@ -import { mapState } from 'vuex' - -const i18nMixin = { - computed: { - ...mapState({ - currentLang: state => state.app.lang - }) - }, - methods: { - setLang (lang) { - this.$store.dispatch('setLang', lang) - } - } -} - -export default i18nMixin diff --git a/quantdinger_vue/src/store/index.js b/quantdinger_vue/src/store/index.js deleted file mode 100644 index d8f8e9a..0000000 --- a/quantdinger_vue/src/store/index.js +++ /dev/null @@ -1,29 +0,0 @@ -import Vue from 'vue' -import Vuex from 'vuex' - -import app from './modules/app' -import user from './modules/user' - -// dynamic router permission control -// 动态路由模式(支持基于角色的菜单过滤) -import permission from './modules/async-router' - -// static router permission control (NO filtering) -// 静态路由模式(不过滤菜单,已弃用) -// import permission from './modules/static-router' - -import getters from './getters' - -Vue.use(Vuex) - -export default new Vuex.Store({ - modules: { - app, - user, - permission - }, - state: {}, - mutations: {}, - actions: {}, - getters -}) diff --git a/quantdinger_vue/src/store/modules/app.js b/quantdinger_vue/src/store/modules/app.js deleted file mode 100644 index 68f45a2..0000000 --- a/quantdinger_vue/src/store/modules/app.js +++ /dev/null @@ -1,99 +0,0 @@ -import storage from 'store' -import { - SIDEBAR_TYPE, - TOGGLE_MOBILE_TYPE, - TOGGLE_NAV_THEME, - TOGGLE_LAYOUT, - TOGGLE_FIXED_HEADER, - TOGGLE_FIXED_SIDEBAR, - TOGGLE_CONTENT_WIDTH, - TOGGLE_HIDE_HEADER, - TOGGLE_COLOR, - TOGGLE_WEAK, - TOGGLE_MULTI_TAB, - // i18n - APP_LANGUAGE -} from '@/store/mutation-types' -import { loadLanguageAsync } from '@/locales' - -const app = { - state: { - sideCollapsed: false, - isMobile: false, - theme: storage.get(TOGGLE_NAV_THEME, 'light'), // 从 localStorage 读取主题,默认 'light' - layout: '', - contentWidth: '', - fixedHeader: false, - fixedSidebar: false, - autoHideHeader: false, - color: storage.get(TOGGLE_COLOR, '#13C2C2'), // 从 localStorage 读取主题色,默认 '#13C2C2' - weak: false, - multiTab: true, - lang: 'en-US', - _antLocale: {} - }, - mutations: { - [SIDEBAR_TYPE]: (state, type) => { - state.sideCollapsed = type - storage.set(SIDEBAR_TYPE, type) - }, - [TOGGLE_MOBILE_TYPE]: (state, isMobile) => { - state.isMobile = isMobile - }, - [TOGGLE_NAV_THEME]: (state, theme) => { - state.theme = theme - storage.set(TOGGLE_NAV_THEME, theme) - }, - [TOGGLE_LAYOUT]: (state, mode) => { - state.layout = mode - storage.set(TOGGLE_LAYOUT, mode) - }, - [TOGGLE_FIXED_HEADER]: (state, mode) => { - state.fixedHeader = mode - storage.set(TOGGLE_FIXED_HEADER, mode) - }, - [TOGGLE_FIXED_SIDEBAR]: (state, mode) => { - state.fixedSidebar = mode - storage.set(TOGGLE_FIXED_SIDEBAR, mode) - }, - [TOGGLE_CONTENT_WIDTH]: (state, type) => { - state.contentWidth = type - storage.set(TOGGLE_CONTENT_WIDTH, type) - }, - [TOGGLE_HIDE_HEADER]: (state, type) => { - state.autoHideHeader = type - storage.set(TOGGLE_HIDE_HEADER, type) - }, - [TOGGLE_COLOR]: (state, color) => { - state.color = color - storage.set(TOGGLE_COLOR, color) - }, - [TOGGLE_WEAK]: (state, mode) => { - state.weak = mode - storage.set(TOGGLE_WEAK, mode) - }, - [APP_LANGUAGE]: (state, lang, antd = {}) => { - state.lang = lang - state._antLocale = antd - storage.set(APP_LANGUAGE, lang) - }, - [TOGGLE_MULTI_TAB]: (state, bool) => { - storage.set(TOGGLE_MULTI_TAB, bool) - state.multiTab = bool - } - }, - actions: { - setLang ({ commit }, lang) { - return new Promise((resolve, reject) => { - commit(APP_LANGUAGE, lang) - loadLanguageAsync(lang).then(() => { - resolve() - }).catch((e) => { - reject(e) - }) - }) - } - } -} - -export default app diff --git a/quantdinger_vue/src/store/modules/async-router.js b/quantdinger_vue/src/store/modules/async-router.js deleted file mode 100644 index 7eece42..0000000 --- a/quantdinger_vue/src/store/modules/async-router.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * 向后端请求用户的菜单,动态生成路由 - */ -import { constantRouterMap } from '@/config/router.config' -import { generatorDynamicRouter } from '@/router/generator-routers' - -const permission = { - state: { - routers: constantRouterMap, - addRouters: [] - }, - mutations: { - SET_ROUTERS: (state, routers) => { - state.addRouters = routers - state.routers = constantRouterMap.concat(routers) - }, - // Reset routers to force regeneration (used on login/logout) - RESET_ROUTERS: (state) => { - state.addRouters = [] - state.routers = constantRouterMap - } - }, - actions: { - GenerateRoutes ({ commit, rootState }, data) { - return new Promise((resolve, reject) => { - const { token } = data - generatorDynamicRouter(token).then(routers => { - commit('SET_ROUTERS', routers) - resolve() - }).catch(e => { - reject(e) - }) - }) - }, - // Reset routes action - ResetRoutes ({ commit }) { - commit('RESET_ROUTERS') - } - } -} - -export default permission diff --git a/quantdinger_vue/src/store/modules/static-router.js b/quantdinger_vue/src/store/modules/static-router.js deleted file mode 100644 index 874e4fc..0000000 --- a/quantdinger_vue/src/store/modules/static-router.js +++ /dev/null @@ -1,54 +0,0 @@ -import { asyncRouterMap, constantRouterMap } from '@/config/router.config' -import cloneDeep from 'lodash.clonedeep' - -/** - * 单账户多角色时,使用该方法可过滤角色不存在的菜单 - * - * @param roles - * @param route - * @returns {*} - */ -// eslint-disable-next-line -function hasRole(roles, route) { - if (route.meta && route.meta.roles) { - return route.meta.roles.includes(roles.id) - } else { - return true - } -} - -function filterAsyncRouter (routerMap, role) { - // 不进行权限过滤,直接返回所有路由(后端会验证token) - return routerMap.map(route => { - if (route.children && route.children.length) { - route.children = filterAsyncRouter(route.children, role) - } - return route - }) -} - -const permission = { - state: { - routers: constantRouterMap, - addRouters: [] - }, - mutations: { - SET_ROUTERS: (state, routers) => { - state.addRouters = routers - state.routers = constantRouterMap.concat(routers) - } - }, - actions: { - GenerateRoutes ({ commit }, data) { - return new Promise(resolve => { - const routerMap = cloneDeep(asyncRouterMap) - // 不进行权限过滤,直接返回所有路由(后端会验证token) - const accessedRouters = filterAsyncRouter(routerMap, null) - commit('SET_ROUTERS', accessedRouters) - resolve() - }) - } - } -} - -export default permission diff --git a/quantdinger_vue/src/store/modules/user.js b/quantdinger_vue/src/store/modules/user.js deleted file mode 100644 index 533ba81..0000000 --- a/quantdinger_vue/src/store/modules/user.js +++ /dev/null @@ -1,431 +0,0 @@ -import storage from 'store' -import expirePlugin from 'store/plugins/expire' -import { login, emailLogin, mobileLogin, logout, getUserInfo, apiLogout, updateUserInfo, oauthCallback } from '@/api/login' -import { ACCESS_TOKEN, USER_INFO, USER_ROLES } from '@/store/mutation-types' -import { welcome } from '@/utils/util' - -storage.addPlugin(expirePlugin) - -const DEFAULT_ROLE = { id: 'default', permissionList: [] } - -function normalizeRoles (roles) { - if (!roles) return [] - if (Array.isArray(roles)) return roles - return [roles] -} - -function getStoredInfo () { - const info = storage.get(USER_INFO) || {} - return (info && typeof info === 'object') ? info : {} -} - -function getStoredRoles () { - const roles = storage.get(USER_ROLES) || [] - return normalizeRoles(roles) -} - -function getStoredToken () { - const token = storage.get(ACCESS_TOKEN) - return typeof token === 'string' ? token : (token && token.token) ? token.token : token -} - -const initialInfo = getStoredInfo() -// If is_demo is missing (legacy cache), force roles to empty to trigger GetInfo in permission.js -let initialRoles = getStoredRoles() -if (initialInfo && typeof initialInfo.is_demo === 'undefined') { - initialRoles = [] -} -const initialToken = getStoredToken() || '' -const initialName = initialInfo.nickname || initialInfo.username || '' -const initialAvatar = initialInfo.avatar || '' -const initialWelcome = initialName ? welcome() : '' -const user = { - state: { - token: initialToken, - name: initialName, - welcome: initialWelcome, - avatar: initialAvatar, - roles: initialRoles, - info: initialInfo - }, - - mutations: { - SET_TOKEN: (state, token) => { - state.token = token - }, - SET_NAME: (state, { name, welcome }) => { - state.name = name - state.welcome = welcome - }, - SET_AVATAR: (state, avatar) => { - state.avatar = avatar - }, - SET_ROLES: (state, roles) => { - state.roles = roles - }, - SET_INFO: (state, info) => { - state.info = info - } - }, - - actions: { - // 登录 - Login ({ commit, dispatch }, userInfo) { - return new Promise((resolve, reject) => { - login(userInfo).then(response => { - // 适配 Python 后端响应格式 - if (response && response.code === 1 && response.data) { - const result = response.data - const token = result.token - const info = result.userinfo || {} - - const expiresAt = new Date().getTime() + 7 * 24 * 60 * 60 * 1000 - storage.set(ACCESS_TOKEN, token, expiresAt) - commit('SET_TOKEN', token) - commit('SET_INFO', info) - storage.set(USER_INFO, info, expiresAt) - - // 设置基本信息 - const name = info.nickname || info.username || 'User' - commit('SET_NAME', { name: name, welcome: welcome() }) - commit('SET_AVATAR', info.avatar || '/avatar2.jpg') - - // 从服务器返回的角色信息设置角色 - let roles = [DEFAULT_ROLE] - if (info.role) { - // role: { id: 'admin', permissions: [...] } - const roleId = info.role.id || info.role - const permissions = info.role.permissions || [] - roles = [{ - id: roleId, - permissionList: permissions.length > 0 ? permissions : ['dashboard'] - }] - } - commit('SET_ROLES', roles) - storage.set(USER_ROLES, roles, expiresAt) - - // 重置路由,强制重新生成(根据新用户的角色) - dispatch('ResetRoutes') - - resolve(response) - } else { - reject(new Error((response && response.msg) || 'Login failed')) - } - }).catch(error => { - reject(error) - }) - }) - }, - - // 邮箱验证码登录 - EmailLogin ({ commit }, userInfo) { - return new Promise((resolve, reject) => { - emailLogin(userInfo).then(response => { - // 新API响应格式: { code: 1, msg: "登录成功", data: { token, userInfo } } - if (response.code === 1 && response.data) { - const token = response.data.token - storage.set(ACCESS_TOKEN, token, new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - commit('SET_TOKEN', token) - // 保存用户信息(从登录接口返回的 userInfo) - if (response.data.userInfo) { - const userInfoData = response.data.userInfo - commit('SET_INFO', userInfoData) - - // 设置用户名 - if (userInfoData.nickname) { - commit('SET_NAME', { name: userInfoData.nickname, welcome: welcome() }) - } else if (userInfoData.username) { - commit('SET_NAME', { name: userInfoData.username, welcome: welcome() }) - } - - // 设置头像 - if (userInfoData.avatar) { - commit('SET_AVATAR', userInfoData.avatar) - } - - // 设置角色(如果有) - if (userInfoData.role) { - commit('SET_ROLES', userInfoData.role) - } else if (userInfoData.roles) { - commit('SET_ROLES', userInfoData.roles) - } else { - // 如果没有角色信息,设置一个默认角色对象,避免路由守卫卡住 - // 设置一个标记,表示已经初始化过用户信息 - commit('SET_ROLES', [{ id: 'default', permissionList: [] }]) - } - } - resolve(response) - } else { - reject(new Error(response.msg || '登录失败')) - } - }).catch(error => { - reject(error) - }) - }) - }, - - // 手机号验证码登录 - MobileLogin ({ commit }, userInfo) { - return new Promise((resolve, reject) => { - mobileLogin(userInfo).then(response => { - // 新API响应格式: { code: 1, msg: "登录成功", data: { token, userInfo } } - if (response.code === 1 && response.data) { - const token = response.data.token - storage.set(ACCESS_TOKEN, token, new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - commit('SET_TOKEN', token) - // 保存用户信息(从登录接口返回的 userInfo) - if (response.data.userInfo) { - const userInfoData = response.data.userInfo - commit('SET_INFO', userInfoData) - - // 设置用户名 - if (userInfoData.nickname) { - commit('SET_NAME', { name: userInfoData.nickname, welcome: welcome() }) - } else if (userInfoData.username) { - commit('SET_NAME', { name: userInfoData.username, welcome: welcome() }) - } - - // 设置头像 - if (userInfoData.avatar) { - commit('SET_AVATAR', userInfoData.avatar) - } - - // 设置角色(如果有) - if (userInfoData.role) { - commit('SET_ROLES', userInfoData.role) - } else if (userInfoData.roles) { - commit('SET_ROLES', userInfoData.roles) - } else { - // 如果没有角色信息,设置一个默认角色对象,避免路由守卫卡住 - // 设置一个标记,表示已经初始化过用户信息 - commit('SET_ROLES', [{ id: 'default', permissionList: [] }]) - } - } - resolve(response) - } else { - reject(new Error(response.msg || '登录失败')) - } - }).catch(error => { - reject(error) - }) - }) - }, - - // Web3 登录完成后的统一处理 - Web3LoginFinalize ({ commit }, payload) { - return new Promise((resolve, reject) => { - try { - const { token, userInfo } = payload - if (!token || !userInfo) { - reject(new Error('登录数据异常')) - return - } - storage.set(ACCESS_TOKEN, token, new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - commit('SET_TOKEN', token) - commit('SET_INFO', userInfo) - - if (userInfo.nickname) { - commit('SET_NAME', { name: userInfo.nickname, welcome: welcome() }) - } else if (userInfo.username) { - commit('SET_NAME', { name: userInfo.username, welcome: welcome() }) - } - - if (userInfo.avatar) { - commit('SET_AVATAR', userInfo.avatar) - } - - if (userInfo.role) { - commit('SET_ROLES', userInfo.role) - } else if (userInfo.roles) { - commit('SET_ROLES', userInfo.roles) - } else { - commit('SET_ROLES', [{ id: 'default', permissionList: [] }]) - } - - resolve() - } catch (e) { - reject(e) - } - }) - }, - - // 刷新用户信息 - FetchUserInfo ({ commit }) { - return new Promise((resolve, reject) => { - getUserInfo().then(res => { - if (res && res.code === 1 && res.data) { - const info = res.data - commit('SET_INFO', info) - if (info.nickname) { - commit('SET_NAME', { name: info.nickname, welcome: welcome() }) - } else if (info.username) { - commit('SET_NAME', { name: info.username, welcome: welcome() }) - } - if (info.avatar) { - commit('SET_AVATAR', info.avatar) - } - resolve(info) - } else { - reject(new Error((res && res.msg) || '获取用户信息失败')) - } - }).catch(err => reject(err)) - }) - }, - - // 更新用户基本信息 - UpdateUserInfo ({ commit, state }, payload) { - return new Promise((resolve, reject) => { - updateUserInfo(payload).then(res => { - if (res && res.code === 1) { - // 合并本地 store 的 info - const newInfo = { ...state.info, ...payload } - commit('SET_INFO', newInfo) - if (newInfo.nickname) { - commit('SET_NAME', { name: newInfo.nickname, welcome: welcome() }) - } - resolve(res) - } else { - reject(new Error((res && res.msg) || '修改失败')) - } - }).catch(err => reject(err)) - }) - }, - - // 获取用户信息(从 store 中获取,不再请求接口) - GetInfo ({ commit, state }) { - return new Promise((resolve, reject) => { - // 用户信息已经在登录时保存到 store 中,直接返回 - // 增加 check: 必须包含 is_demo 字段,否则视为过期缓存,强制刷新 - if (state.info && Object.keys(state.info).length > 0 && typeof state.info.is_demo !== 'undefined') { - // 补全 Roles - const info = state.info - if (info.role) { - const roles = normalizeRoles(info.role) - commit('SET_ROLES', roles) - storage.set(USER_ROLES, roles, new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - } else if (info.roles) { - const roles = normalizeRoles(info.roles) - commit('SET_ROLES', roles) - storage.set(USER_ROLES, roles, new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - } else { - commit('SET_ROLES', [DEFAULT_ROLE]) - storage.set(USER_ROLES, [DEFAULT_ROLE], new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - } - resolve(state.info) - } else { - // 尝试主动拉取一次 - getUserInfo().then(res => { - if (res && res.code === 1 && res.data) { - const info = res.data - commit('SET_INFO', info) - storage.set(USER_INFO, info, new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - if (info.nickname) { - commit('SET_NAME', { name: info.nickname, welcome: welcome() }) - } else if (info.username) { - commit('SET_NAME', { name: info.username, welcome: welcome() }) - } - if (info.avatar) { - commit('SET_AVATAR', info.avatar) - } - // 关键修复:设置角色,防止路由守卫死循环 - if (info.role) { - const roles = normalizeRoles(info.role) - commit('SET_ROLES', roles) - storage.set(USER_ROLES, roles, new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - } else if (info.roles) { - const roles = normalizeRoles(info.roles) - commit('SET_ROLES', roles) - storage.set(USER_ROLES, roles, new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - } else { - commit('SET_ROLES', [DEFAULT_ROLE]) - storage.set(USER_ROLES, [DEFAULT_ROLE], new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - } - resolve(info) - } else { - reject(new Error((res && res.msg) || '用户信息不存在')) - } - }).catch(err => reject(err)) - } - }) - }, - - // OAuth 登录(Google/GitHub) - OAuthLogin ({ commit }, userInfo) { - return new Promise((resolve, reject) => { - oauthCallback(userInfo).then(response => { - // 新API响应格式: { code: 1, msg: "登录成功", data: { token, userInfo } } - if (response.code === 1 && response.data) { - const token = response.data.token - storage.set(ACCESS_TOKEN, token, new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - commit('SET_TOKEN', token) - // 保存用户信息(从登录接口返回的 userInfo) - if (response.data.userInfo) { - const userInfoData = response.data.userInfo - commit('SET_INFO', userInfoData) - - // 设置用户名 - if (userInfoData.nickname) { - commit('SET_NAME', { name: userInfoData.nickname, welcome: welcome() }) - } else if (userInfoData.username) { - commit('SET_NAME', { name: userInfoData.username, welcome: welcome() }) - } - - // 设置头像 - if (userInfoData.avatar) { - commit('SET_AVATAR', userInfoData.avatar) - } - - // 设置角色(如果有) - if (userInfoData.role) { - commit('SET_ROLES', userInfoData.role) - } else if (userInfoData.roles) { - commit('SET_ROLES', userInfoData.roles) - } else { - // 如果没有角色信息,设置一个默认角色对象,避免路由守卫卡住 - commit('SET_ROLES', [{ id: 'default', permissionList: [] }]) - } - } - resolve(response) - } else { - reject(new Error(response.msg || '登录失败')) - } - }).catch(error => { - reject(error) - }) - }) - }, - - // 登出 - Logout ({ commit, state, dispatch }) { - return new Promise((resolve) => { - // 兼容旧登出与新后端登出 - const req = typeof apiLogout === 'function' ? apiLogout() : logout(state.token) - req.then(() => { - commit('SET_TOKEN', '') - commit('SET_ROLES', []) - commit('SET_INFO', {}) - commit('SET_NAME', { name: '', welcome: '' }) - commit('SET_AVATAR', '') - storage.remove(ACCESS_TOKEN) - storage.remove(USER_INFO) - storage.remove(USER_ROLES) - // 重置路由 - dispatch('ResetRoutes') - resolve() - }).catch(() => { - // 登出失败时也继续执行,确保清理本地状态 - storage.remove(ACCESS_TOKEN) - storage.remove(USER_INFO) - storage.remove(USER_ROLES) - // 重置路由 - dispatch('ResetRoutes') - resolve() - }).finally(() => { - }) - }) - } - - } -} - -export default user diff --git a/quantdinger_vue/src/store/mutation-types.js b/quantdinger_vue/src/store/mutation-types.js deleted file mode 100644 index 2ddfdfc..0000000 --- a/quantdinger_vue/src/store/mutation-types.js +++ /dev/null @@ -1,26 +0,0 @@ -export const ACCESS_TOKEN = 'Access-Token' -export const USER_INFO = 'User-Info' -export const USER_ROLES = 'User-Roles' - -export const SIDEBAR_TYPE = 'sidebar_type' -export const TOGGLE_MOBILE_TYPE = 'is_mobile' -export const TOGGLE_NAV_THEME = 'nav_theme' -export const TOGGLE_LAYOUT = 'layout' -export const TOGGLE_FIXED_HEADER = 'fixed_header' -export const TOGGLE_FIXED_SIDEBAR = 'fixed_sidebar' -export const TOGGLE_CONTENT_WIDTH = 'content_width' -export const TOGGLE_HIDE_HEADER = 'auto_hide_header' -export const TOGGLE_COLOR = 'color' -export const TOGGLE_WEAK = 'weak' -export const TOGGLE_MULTI_TAB = 'multi_tab' -export const APP_LANGUAGE = 'app_language' - -export const CONTENT_WIDTH_TYPE = { - Fluid: 'Fluid', - Fixed: 'Fixed' -} - -export const NAV_THEME = { - LIGHT: 'light', - DARK: 'dark' -} diff --git a/quantdinger_vue/src/utils/axios.js b/quantdinger_vue/src/utils/axios.js deleted file mode 100644 index ecccd85..0000000 --- a/quantdinger_vue/src/utils/axios.js +++ /dev/null @@ -1,34 +0,0 @@ -const VueAxios = { - vm: {}, - // eslint-disable-next-line no-unused-vars - install (Vue, instance) { - if (this.installed) { - return - } - this.installed = true - - if (!instance) { - // eslint-disable-next-line no-console - return - } - - Vue.axios = instance - - Object.defineProperties(Vue.prototype, { - axios: { - get: function get () { - return instance - } - }, - $http: { - get: function get () { - return instance - } - } - }) - } -} - -export { - VueAxios -} diff --git a/quantdinger_vue/src/utils/codeDecrypt.js b/quantdinger_vue/src/utils/codeDecrypt.js deleted file mode 100644 index 2faaab8..0000000 --- a/quantdinger_vue/src/utils/codeDecrypt.js +++ /dev/null @@ -1,138 +0,0 @@ -/** - * 指标代码解密工具 - * 用于解密用户购买的加密指标代码 - */ - -import CryptoJS from 'crypto-js' -import request from '@/utils/request' - -/** - * 解密指标代码 - * - * @param {string} encryptedCode - base64编码的加密代码 - * @param {number} userId - 用户ID - * @param {number} indicatorId - 指标ID - * @param {string} serverSecret - 服务器密钥(需要从后端获取或配置) - * @returns {string} - 解密后的代码 - */ -export function decryptCode (encryptedCode, userId, indicatorId, encryptedKey) { - if (!encryptedCode || !userId || !indicatorId || !encryptedKey) { - return encryptedCode - } - - try { - // 解码base64加密代码 - const combined = CryptoJS.enc.Base64.parse(encryptedCode) - - // 提取IV(前16字节)和加密数据 - const ivWords = CryptoJS.lib.WordArray.create(combined.words.slice(0, 4)) // 前16字节(4个word) - const encryptedWords = CryptoJS.lib.WordArray.create(combined.words.slice(4)) // 剩余部分 - - // 解密密钥(从后端获取的base64编码密钥) - // encryptedKey 是从后端获取的 base64 编码的密钥,直接解码使用 - const key = CryptoJS.enc.Base64.parse(encryptedKey) - - // 解密 - const decrypted = CryptoJS.AES.decrypt( - { ciphertext: encryptedWords }, - key, - { - iv: ivWords, - mode: CryptoJS.mode.CBC, - padding: CryptoJS.pad.Pkcs7 - } - ) - - // 转换为字符串 - const decryptedText = decrypted.toString(CryptoJS.enc.Utf8) - - if (!decryptedText) { - return encryptedCode - } - - return decryptedText - } catch (error) { - // 解密失败,返回原代码(向后兼容) - return encryptedCode - } -} - -/** - * 从后端获取解密密钥(动态密钥) - * - * @param {number} userId - 用户ID - * @param {number} indicatorId - 指标ID - * @returns {Promise} - 解密密钥(base64编码) - */ -export async function getDecryptKey (userId, indicatorId) { - if (!userId || !indicatorId) { - throw new Error('用户ID和指标ID不能为空') - } - - try { - // 动态请求方式:从后端API获取 - const response = await request({ - url: '/api/indicator/getDecryptKey', - method: 'post', - data: { - userid: userId, - indicatorId: indicatorId - } - }) - - if (response.code === 1 && response.data && response.data.key) { - // 返回base64编码的密钥 - return response.data.key - } else { - throw new Error(response.msg || '获取解密密钥失败') - } - } catch (error) { - // 如果后端接口失败,抛出错误,不使用备用密钥(更安全) - throw new Error('无法获取解密密钥,请检查网络连接或联系管理员: ' + (error.message || '未知错误')) - } -} - -/** - * 智能解密代码(自动获取密钥) - * - * @param {string} encryptedCode - 加密的代码 - * @param {number} userId - 用户ID - * @param {number} indicatorId - 指标ID - * @returns {Promise} - 解密后的代码 - */ -export async function decryptCodeAuto (encryptedCode, userId, indicatorId) { - // 从后端动态获取解密密钥(base64编码) - const encryptedKey = await getDecryptKey(userId, indicatorId) - // 使用获取的密钥解密 - return decryptCode(encryptedCode, userId, indicatorId, encryptedKey) -} - -/** - * 检查代码是否需要解密 - * - * @param {string} code - 代码 - * @param {number} isEncrypted - 是否加密标记 - * @returns {boolean} - */ -export function needsDecrypt (code, isEncrypted) { - // 如果明确标记为加密,或者代码长度很长且符合base64格式,可能需要解密 - if (isEncrypted === 1 || isEncrypted === true) { - return true - } - - // 简单检查:加密代码通常较长(base64编码会增大约33%) - if (code && code.length > 100) { - // 尝试base64解码检查 - try { - const decoded = atob(code) - // 如果解码后的长度合理,可能是加密的 - if (decoded.length > 50) { - return true - } - } catch (e) { - // 不是base64,不需要解密 - } - } - - return false -} diff --git a/quantdinger_vue/src/utils/domUtil.js b/quantdinger_vue/src/utils/domUtil.js deleted file mode 100644 index be93027..0000000 --- a/quantdinger_vue/src/utils/domUtil.js +++ /dev/null @@ -1,21 +0,0 @@ -import config from '@/config/defaultSettings' - -export const setDocumentTitle = function (title) { - document.title = title - const ua = navigator.userAgent - // eslint-disable-next-line - const regex = /\bMicroMessenger\/([\d\.]+)/ - if (regex.test(ua) && /ip(hone|od|ad)/i.test(ua)) { - const i = document.createElement('iframe') - i.src = '/favicon.ico' - i.style.display = 'none' - i.onload = function () { - setTimeout(function () { - i.remove() - }, 9) - } - document.body.appendChild(i) - } -} - -export const domTitle = config.title diff --git a/quantdinger_vue/src/utils/filter.js b/quantdinger_vue/src/utils/filter.js deleted file mode 100644 index 45702c6..0000000 --- a/quantdinger_vue/src/utils/filter.js +++ /dev/null @@ -1,20 +0,0 @@ -import Vue from 'vue' -import moment from 'moment' -import 'moment/locale/zh-cn' -moment.locale('zh-cn') - -Vue.filter('NumberFormat', function (value) { - if (!value) { - return '0' - } - const intPartFormat = value.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,') // 将整数部分逢三一断 - return intPartFormat -}) - -Vue.filter('dayjs', function (dataStr, pattern = 'YYYY-MM-DD HH:mm:ss') { - return moment(dataStr).format(pattern) -}) - -Vue.filter('moment', function (dataStr, pattern = 'YYYY-MM-DD HH:mm:ss') { - return moment(dataStr).format(pattern) -}) diff --git a/quantdinger_vue/src/utils/request.js b/quantdinger_vue/src/utils/request.js deleted file mode 100644 index b1d05cd..0000000 --- a/quantdinger_vue/src/utils/request.js +++ /dev/null @@ -1,197 +0,0 @@ -import axios from 'axios' -// import store from '@/store' -import storage from 'store' -import notification from 'ant-design-vue/es/notification' -import { VueAxios } from './axios' -import { ACCESS_TOKEN, USER_INFO, USER_ROLES } from '@/store/mutation-types' - -// PHPSESSID 存储键名 -const PHPSESSID_KEY = 'PHPSESSID' -// Locale storage key used by vue-i18n (see src/locales/index.js) -const LOCALE_KEY = 'lang' - -// Prevent multiple concurrent 401 redirects -let isRedirectingToLogin = false - -/** - * 获取 token,处理 token 可能是字符串或对象的情况 - */ -function getToken () { - let token = storage.get(ACCESS_TOKEN) - if (!token) { - return null - } - if (typeof token !== 'string') { - // 如果是对象,尝试获取 token 属性 - if (token && typeof token === 'object') { - token = token.token || token.value || null - } else { - token = null - } - } - // 确保 token 是字符串且不为空 - return (typeof token === 'string' && token.length > 0) ? token : null -} - -// 创建 axios 实例 -const request = axios.create({ - // API 请求的默认前缀 - // 生产环境应由 Nginx 处理,开发环境由 devServer proxy 处理 - baseURL: '/', - timeout: 30000, // Default request timeout 30s - withCredentials: true // 允许携带 cookies -}) - -// Extended timeout for long-running AI analysis APIs -export const ANALYSIS_TIMEOUT = 180000 // 3 minutes for AI analysis - -// 异常拦截处理器 -const errorHandler = (error) => { - if (error.response) { - const data = error.response.data - if (error.response.status === 403) { - notification.error({ - message: '(Demo Mode)', - description: data.msg || data.message || 'Read-only in demo mode' - }) - } - if (error.response.status === 401 && !(data.result && data.result.isLogin)) { - // Token invalid/expired: MUST clear local auth state, otherwise route guard will - // detect a stale token and immediately bounce user away from login page. - if (!isRedirectingToLogin) { - isRedirectingToLogin = true - try { - storage.remove(ACCESS_TOKEN) - storage.remove(USER_INFO) - storage.remove(USER_ROLES) - storage.remove(PHPSESSID_KEY) - } catch (e) {} - - notification.error({ - message: 'Unauthorized', - description: data.msg || data.message || 'Token invalid or expired, please login again.' - }) - - // 项目使用 hash 模式,需要跳转到 /#/user/login - const curHash = window.location.hash || '' - if (!curHash.includes('/user/login')) { - const redirect = encodeURIComponent(curHash.replace('#', '') || '/') - window.location.assign(`/#/user/login?redirect=${redirect}`) - } - } - } - } - return Promise.reject(error) -} - -// request interceptor -request.interceptors.request.use(config => { - // 使用统一的 token 获取函数 - const token = getToken() - const lang = storage.get(LOCALE_KEY) || 'en-US' - - // Tell backend which UI language user is using, so AI reports can match it. - // We keep both a custom header and the standard Accept-Language for compatibility. - config.headers['X-App-Lang'] = lang - config.headers['Accept-Language'] = lang - - // 如果 token 存在,将 token 添加到请求头 - if (token) { - // 使用 Authorization header,格式为 Bearer {token} - config.headers['Authorization'] = `Bearer ${token}` - // 同时保留原有的 Access-Token header(如果后端需要) - config.headers[ACCESS_TOKEN] = token - // 兼容后端要求的 token 头 - config.headers['token'] = token - } else { - // 调试:如果 token 不存在,记录日志 - if (config.url && config.url.includes('/api/auth/info')) { - const rawToken = storage.get(ACCESS_TOKEN) - console.warn('Token missing for /api/auth/info request') - console.warn('Raw token from storage:', rawToken) - console.warn('Token type:', typeof rawToken) - console.warn('Token value:', rawToken) - } - } - - // 防止缓存导致的 304:为请求添加禁止缓存的头 - config.headers['Cache-Control'] = 'no-cache' - config.headers['Pragma'] = 'no-cache' - config.headers['If-Modified-Since'] = '0' - - // 为 GET 请求添加时间戳参数,避免缓存 - if ((config.method || 'get').toLowerCase() === 'get') { - const ts = Date.now() - config.params = Object.assign({}, config.params || {}, { _t: ts }) - } - - // 手动设置 PHPSESSID cookie,确保每次请求使用相同的 session - // 注意:浏览器不允许手动设置 Cookie 请求头,需要通过 document.cookie 设置 - // 但由于跨域限制,可能无法直接设置 cookie,主要依赖 withCredentials: true - const phpsessid = storage.get(PHPSESSID_KEY) - if (phpsessid && typeof document !== 'undefined') { - // 检查当前 document.cookie 中的 PHPSESSID - const currentCookies = document.cookie - const currentPhpsessidMatch = currentCookies.match(/PHPSESSID=([^;]+)/i) - const currentPhpsessid = currentPhpsessidMatch ? currentPhpsessidMatch[1].trim() : null - - // 如果当前 cookie 中的 PHPSESSID 与保存的不一致,尝试更新 - // 注意:跨域情况下可能无法设置 cookie,这取决于 CORS 配置 - if (!currentPhpsessid || currentPhpsessid !== phpsessid) { - // 尝试设置 cookie(可能因为跨域而失败,但不影响 withCredentials 的工作) - try { - // 尝试设置带 domain 的 cookie(仅当在相同域名下时有效) - if (window.location.hostname.includes('quantdinger.com')) { - document.cookie = `PHPSESSID=${phpsessid}; path=/; domain=.quantdinger.com; SameSite=None; Secure` - } else { - // 跨域情况下,只能依赖 withCredentials: true 和服务器设置 - // 这里尝试设置,但可能不会成功 - document.cookie = `PHPSESSID=${phpsessid}; path=/; SameSite=None; Secure` - } - } catch (e) { - // 设置失败是正常的(跨域限制),主要依赖 withCredentials - } - } - } - - return config -}, errorHandler) - -// response interceptor -request.interceptors.response.use((response) => { - // 从响应中提取 PHPSESSID 并保存 - // 由于浏览器安全限制,无法直接读取 set-cookie 头,需要通过 document.cookie 获取 - try { - if (typeof document !== 'undefined') { - // 从 document.cookie 获取 PHPSESSID(浏览器自动设置的) - const cookies = document.cookie - const phpsessidMatch = cookies.match(/PHPSESSID=([^;]+)/i) - if (phpsessidMatch && phpsessidMatch[1]) { - const phpsessid = phpsessidMatch[1].trim() - // 保存 PHPSESSID 到 storage,有效期 24 小时 - const savedPhpsessid = storage.get(PHPSESSID_KEY) - // 如果 PHPSESSID 发生变化,更新保存的值 - if (!savedPhpsessid || savedPhpsessid !== phpsessid) { - storage.set(PHPSESSID_KEY, phpsessid, new Date().getTime() + 24 * 60 * 60 * 1000) - } - } - } - } catch (e) { - } - - return response.data -}, errorHandler) - -const installer = { - vm: {}, - install (Vue) { - Vue.use(VueAxios, request) - } -} - -export default request - -export { - installer as VueAxios, - request as axios -} diff --git a/quantdinger_vue/src/utils/routeConvert.js b/quantdinger_vue/src/utils/routeConvert.js deleted file mode 100644 index e88b0d6..0000000 --- a/quantdinger_vue/src/utils/routeConvert.js +++ /dev/null @@ -1,30 +0,0 @@ -import cloneDeep from 'lodash.clonedeep' - -export function convertRoutes (nodes) { - if (!nodes) return null - - nodes = cloneDeep(nodes) - - let queue = Array.isArray(nodes) ? nodes.concat() : [nodes] - - while (queue.length) { - const levelSize = queue.length - - for (let i = 0; i < levelSize; i++) { - const node = queue.shift() - - if (!node.children || !node.children.length) continue - - node.children.forEach(child => { - // 转化相对路径 - if (child.path[0] !== '/' && !child.path.startsWith('http')) { - child.path = node.path.replace(/(\w*)[/]*$/, `$1/${child.path}`) - } - }) - - queue = queue.concat(node.children) - } - } - - return nodes -} diff --git a/quantdinger_vue/src/utils/screenLog.js b/quantdinger_vue/src/utils/screenLog.js deleted file mode 100644 index a0386ac..0000000 --- a/quantdinger_vue/src/utils/screenLog.js +++ /dev/null @@ -1,4 +0,0 @@ -/* eslint-disable */ -export const printANSI = () => { - -} diff --git a/quantdinger_vue/src/utils/util.js b/quantdinger_vue/src/utils/util.js deleted file mode 100644 index 2b77158..0000000 --- a/quantdinger_vue/src/utils/util.js +++ /dev/null @@ -1,95 +0,0 @@ -export function timeFix () { - const time = new Date() - const hour = time.getHours() - return hour < 12 ? 'Good morning' : hour < 18 ? 'Good afternoon' : 'Good evening' -} - -export function welcome () { - const arr = ['休息一会儿吧', '准备吃什么呢?', '要不要打一把 DOTA', '我猜你可能累了'] - const index = Math.floor(Math.random() * arr.length) - return arr[index] -} - -/** - * 触发 window.resize - */ -export function triggerWindowResizeEvent () { - const event = document.createEvent('HTMLEvents') - event.initEvent('resize', true, true) - event.eventType = 'message' - window.dispatchEvent(event) -} - -export function handleScrollHeader (callback) { - let timer = 0 - - let beforeScrollTop = window.pageYOffset - callback = callback || function () {} - window.addEventListener( - 'scroll', - event => { - clearTimeout(timer) - timer = setTimeout(() => { - let direction = 'up' - const afterScrollTop = window.pageYOffset - const delta = afterScrollTop - beforeScrollTop - if (delta === 0) { - return false - } - direction = delta > 0 ? 'down' : 'up' - callback(direction) - beforeScrollTop = afterScrollTop - }, 50) - }, - false - ) -} - -export function isIE () { - const bw = window.navigator.userAgent - const compare = (s) => bw.indexOf(s) >= 0 - const ie11 = (() => 'ActiveXObject' in window)() - return compare('MSIE') || ie11 -} - -/** - * Remove loading animate - * @param id parent element id or class - * @param timeout - */ -export function removeLoadingAnimate (id = '', timeout = 1500) { - if (id === '') { - return - } - setTimeout(() => { - document.body.removeChild(document.getElementById(id)) - }, timeout) -} -export function scorePassword (pass) { - let score = 0 - if (!pass) { - return score - } - // award every unique letter until 5 repetitions - const letters = {} - for (let i = 0; i < pass.length; i++) { - letters[pass[i]] = (letters[pass[i]] || 0) + 1 - score += 5.0 / letters[pass[i]] - } - - // bonus points for mixing it up - const variations = { - digits: /\d/.test(pass), - lower: /[a-z]/.test(pass), - upper: /[A-Z]/.test(pass), - nonWords: /\W/.test(pass) - } - - let variationCount = 0 - for (var check in variations) { - variationCount += (variations[check] === true) ? 1 : 0 - } - score += (variationCount - 1) * 10 - - return parseInt(score) -} diff --git a/quantdinger_vue/src/utils/utils.less b/quantdinger_vue/src/utils/utils.less deleted file mode 100644 index 23bc405..0000000 --- a/quantdinger_vue/src/utils/utils.less +++ /dev/null @@ -1,54 +0,0 @@ -.textOverflow() { - overflow: hidden; - text-overflow: ellipsis; - word-break: break-all; - white-space: nowrap; -} - -.textOverflowMulti(@line: 3, @bg: #fff) { - position: relative; - max-height: @line * 1.5em; - padding-right: 1em; - margin-right: -1em; - overflow: hidden; - line-height: 1.5em; - text-align: justify; - - &::before { - position: absolute; - right: 14px; - bottom: 0; - padding: 0 1px; - background: @bg; - content: '...'; - } - - &::after { - position: absolute; - right: 14px; - width: 1em; - height: 1em; - margin-top: .2em; - background: white; - content: ''; - } -} - -// mixins for clearfix -// ------------------------ -.clearfix() { - zoom: 1; - - &::before, - &::after { - display: table; - content: ' '; - } - - &::after { - height: 0; - clear: both; - font-size: 0; - visibility: hidden; - } -} diff --git a/quantdinger_vue/src/views/404.vue b/quantdinger_vue/src/views/404.vue deleted file mode 100644 index 8c1d8a1..0000000 --- a/quantdinger_vue/src/views/404.vue +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/ai-analysis/components/index.vue b/quantdinger_vue/src/views/ai-analysis/components/index.vue deleted file mode 100644 index 62fbddc..0000000 --- a/quantdinger_vue/src/views/ai-analysis/components/index.vue +++ /dev/null @@ -1,3748 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/ai-analysis/index.vue b/quantdinger_vue/src/views/ai-analysis/index.vue deleted file mode 100644 index f0dde67..0000000 --- a/quantdinger_vue/src/views/ai-analysis/index.vue +++ /dev/null @@ -1,2530 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/dashboard/index.vue b/quantdinger_vue/src/views/dashboard/index.vue deleted file mode 100644 index b81f02e..0000000 --- a/quantdinger_vue/src/views/dashboard/index.vue +++ /dev/null @@ -1,2338 +0,0 @@ - - - - - - diff --git a/quantdinger_vue/src/views/exception/403.vue b/quantdinger_vue/src/views/exception/403.vue deleted file mode 100644 index fb1bf36..0000000 --- a/quantdinger_vue/src/views/exception/403.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - diff --git a/quantdinger_vue/src/views/exception/404.vue b/quantdinger_vue/src/views/exception/404.vue deleted file mode 100644 index 3142e7b..0000000 --- a/quantdinger_vue/src/views/exception/404.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - diff --git a/quantdinger_vue/src/views/exception/500.vue b/quantdinger_vue/src/views/exception/500.vue deleted file mode 100644 index 2770b77..0000000 --- a/quantdinger_vue/src/views/exception/500.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - diff --git a/quantdinger_vue/src/views/indicator-analysis/components/BacktestHistoryDrawer.vue b/quantdinger_vue/src/views/indicator-analysis/components/BacktestHistoryDrawer.vue deleted file mode 100644 index f776874..0000000 --- a/quantdinger_vue/src/views/indicator-analysis/components/BacktestHistoryDrawer.vue +++ /dev/null @@ -1,221 +0,0 @@ - - - diff --git a/quantdinger_vue/src/views/indicator-analysis/components/BacktestModal.vue b/quantdinger_vue/src/views/indicator-analysis/components/BacktestModal.vue deleted file mode 100644 index 0bd6c47..0000000 --- a/quantdinger_vue/src/views/indicator-analysis/components/BacktestModal.vue +++ /dev/null @@ -1,1642 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/indicator-analysis/components/BacktestRunViewer.vue b/quantdinger_vue/src/views/indicator-analysis/components/BacktestRunViewer.vue deleted file mode 100644 index be20e4d..0000000 --- a/quantdinger_vue/src/views/indicator-analysis/components/BacktestRunViewer.vue +++ /dev/null @@ -1,283 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/indicator-analysis/components/IndicatorEditor.vue b/quantdinger_vue/src/views/indicator-analysis/components/IndicatorEditor.vue deleted file mode 100644 index 6731204..0000000 --- a/quantdinger_vue/src/views/indicator-analysis/components/IndicatorEditor.vue +++ /dev/null @@ -1,1180 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/indicator-analysis/components/KlineChart.vue b/quantdinger_vue/src/views/indicator-analysis/components/KlineChart.vue deleted file mode 100644 index b6028b1..0000000 --- a/quantdinger_vue/src/views/indicator-analysis/components/KlineChart.vue +++ /dev/null @@ -1,3887 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/indicator-analysis/index.vue b/quantdinger_vue/src/views/indicator-analysis/index.vue deleted file mode 100644 index 409927b..0000000 --- a/quantdinger_vue/src/views/indicator-analysis/index.vue +++ /dev/null @@ -1,2935 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/indicator-community/index.vue b/quantdinger_vue/src/views/indicator-community/index.vue deleted file mode 100644 index 0ab00ce..0000000 --- a/quantdinger_vue/src/views/indicator-community/index.vue +++ /dev/null @@ -1,91 +0,0 @@ -