2025-12-18 13:50:39 +08:00
|
|
|
|
export default {
|
|
|
|
|
|
// Home Page
|
|
|
|
|
|
home: {
|
|
|
|
|
|
viewOnGithub: '在 GitHub 上查看',
|
2025-12-24 21:30:19 +08:00
|
|
|
|
viewDocs: '查看文档',
|
|
|
|
|
|
docs: '文档',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
switchToLight: '切换到浅色模式',
|
|
|
|
|
|
switchToDark: '切换到深色模式',
|
|
|
|
|
|
dashboard: '控制台',
|
|
|
|
|
|
login: '登录',
|
|
|
|
|
|
getStarted: '开始使用',
|
|
|
|
|
|
goToDashboard: '进入控制台',
|
|
|
|
|
|
tags: {
|
|
|
|
|
|
subscriptionToApi: '订阅转 API',
|
|
|
|
|
|
stickySession: '粘性会话',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
realtimeBilling: '实时计费'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
features: {
|
|
|
|
|
|
unifiedGateway: '统一 API 网关',
|
|
|
|
|
|
unifiedGatewayDesc: '将 Claude 订阅转换为 API 接口,通过标准 /v1/messages 接口访问 AI 能力。',
|
|
|
|
|
|
multiAccount: '多账号池',
|
|
|
|
|
|
multiAccountDesc: '智能负载均衡管理多个上游账号,支持 OAuth 和 API Key 认证。',
|
|
|
|
|
|
balanceQuota: '余额与配额',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
balanceQuotaDesc: '基于 Token 的精确计费和用量追踪,支持配额管理和兑换码充值。'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
providers: {
|
|
|
|
|
|
title: '支持的服务商',
|
|
|
|
|
|
description: 'AI 服务的统一 API 接口',
|
|
|
|
|
|
supported: '已支持',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
soon: '即将推出',
|
|
|
|
|
|
claude: 'Claude',
|
|
|
|
|
|
gemini: 'Gemini',
|
2025-12-29 17:09:48 +08:00
|
|
|
|
antigravity: 'Antigravity',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
more: '更多'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
footer: {
|
2025-12-25 08:40:35 -08:00
|
|
|
|
allRightsReserved: '保留所有权利。'
|
|
|
|
|
|
}
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
2025-12-27 10:50:25 +08:00
|
|
|
|
// Setup Wizard
|
|
|
|
|
|
setup: {
|
|
|
|
|
|
title: 'Sub2API 安装向导',
|
|
|
|
|
|
description: '配置您的 Sub2API 实例',
|
|
|
|
|
|
database: {
|
|
|
|
|
|
title: '数据库配置',
|
|
|
|
|
|
host: '主机',
|
|
|
|
|
|
port: '端口',
|
|
|
|
|
|
username: '用户名',
|
|
|
|
|
|
password: '密码',
|
|
|
|
|
|
databaseName: '数据库名称',
|
|
|
|
|
|
sslMode: 'SSL 模式',
|
2025-12-27 16:04:35 +08:00
|
|
|
|
passwordPlaceholder: '密码',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
ssl: {
|
|
|
|
|
|
disable: '禁用',
|
|
|
|
|
|
require: '要求',
|
|
|
|
|
|
verifyCa: '验证 CA',
|
|
|
|
|
|
verifyFull: '完全验证'
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
redis: {
|
|
|
|
|
|
title: 'Redis 配置',
|
|
|
|
|
|
host: '主机',
|
|
|
|
|
|
port: '端口',
|
|
|
|
|
|
password: '密码(可选)',
|
2025-12-27 16:04:35 +08:00
|
|
|
|
database: '数据库',
|
|
|
|
|
|
passwordPlaceholder: '密码'
|
2025-12-27 10:50:25 +08:00
|
|
|
|
},
|
|
|
|
|
|
admin: {
|
|
|
|
|
|
title: '管理员账户',
|
|
|
|
|
|
email: '邮箱',
|
|
|
|
|
|
password: '密码',
|
2025-12-27 16:04:35 +08:00
|
|
|
|
confirmPassword: '确认密码',
|
|
|
|
|
|
passwordPlaceholder: '至少 6 个字符',
|
|
|
|
|
|
confirmPasswordPlaceholder: '确认密码',
|
|
|
|
|
|
passwordMismatch: '密码不匹配'
|
2025-12-27 10:50:25 +08:00
|
|
|
|
},
|
|
|
|
|
|
ready: {
|
|
|
|
|
|
title: '准备安装',
|
|
|
|
|
|
database: '数据库',
|
|
|
|
|
|
redis: 'Redis',
|
|
|
|
|
|
adminEmail: '管理员邮箱'
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2025-12-18 13:50:39 +08:00
|
|
|
|
// Common
|
|
|
|
|
|
common: {
|
|
|
|
|
|
loading: '加载中...',
|
|
|
|
|
|
save: '保存',
|
|
|
|
|
|
cancel: '取消',
|
|
|
|
|
|
delete: '删除',
|
|
|
|
|
|
edit: '编辑',
|
|
|
|
|
|
create: '创建',
|
|
|
|
|
|
update: '更新',
|
|
|
|
|
|
confirm: '确认',
|
|
|
|
|
|
reset: '重置',
|
|
|
|
|
|
search: '搜索',
|
|
|
|
|
|
filter: '筛选',
|
|
|
|
|
|
export: '导出',
|
|
|
|
|
|
import: '导入',
|
|
|
|
|
|
actions: '操作',
|
|
|
|
|
|
status: '状态',
|
|
|
|
|
|
name: '名称',
|
|
|
|
|
|
email: '邮箱',
|
|
|
|
|
|
password: '密码',
|
|
|
|
|
|
submit: '提交',
|
|
|
|
|
|
back: '返回',
|
|
|
|
|
|
next: '下一步',
|
|
|
|
|
|
yes: '是',
|
|
|
|
|
|
no: '否',
|
|
|
|
|
|
all: '全部',
|
|
|
|
|
|
none: '无',
|
|
|
|
|
|
noData: '暂无数据',
|
|
|
|
|
|
success: '成功',
|
|
|
|
|
|
error: '错误',
|
|
|
|
|
|
warning: '警告',
|
|
|
|
|
|
info: '提示',
|
|
|
|
|
|
active: '启用',
|
|
|
|
|
|
inactive: '禁用',
|
2025-12-28 01:00:06 +08:00
|
|
|
|
more: '更多',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
close: '关闭',
|
|
|
|
|
|
enabled: '已启用',
|
|
|
|
|
|
disabled: '已禁用',
|
|
|
|
|
|
total: '总计',
|
|
|
|
|
|
balance: '余额',
|
|
|
|
|
|
available: '可用',
|
|
|
|
|
|
copiedToClipboard: '已复制到剪贴板',
|
|
|
|
|
|
copyFailed: '复制失败',
|
|
|
|
|
|
contactSupport: '联系客服',
|
|
|
|
|
|
selectOption: '请选择',
|
|
|
|
|
|
searchPlaceholder: '搜索...',
|
|
|
|
|
|
noOptionsFound: '无匹配选项',
|
|
|
|
|
|
saving: '保存中...',
|
2025-12-27 16:04:35 +08:00
|
|
|
|
refresh: '刷新',
|
2026-01-03 06:35:50 -08:00
|
|
|
|
notAvailable: '不可用',
|
|
|
|
|
|
now: '现在',
|
|
|
|
|
|
unknown: '未知',
|
2025-12-27 16:04:35 +08:00
|
|
|
|
time: {
|
|
|
|
|
|
never: '从未',
|
|
|
|
|
|
justNow: '刚刚',
|
|
|
|
|
|
minutesAgo: '{n}分钟前',
|
|
|
|
|
|
hoursAgo: '{n}小时前',
|
|
|
|
|
|
daysAgo: '{n}天前'
|
|
|
|
|
|
}
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Navigation
|
|
|
|
|
|
nav: {
|
|
|
|
|
|
dashboard: '仪表盘',
|
|
|
|
|
|
apiKeys: 'API 密钥',
|
|
|
|
|
|
usage: '使用记录',
|
|
|
|
|
|
redeem: '兑换',
|
|
|
|
|
|
profile: '个人资料',
|
|
|
|
|
|
users: '用户管理',
|
|
|
|
|
|
groups: '分组管理',
|
|
|
|
|
|
subscriptions: '订阅管理',
|
|
|
|
|
|
accounts: '账号管理',
|
2025-12-23 15:46:10 +08:00
|
|
|
|
proxies: 'IP管理',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
redeemCodes: '兑换码',
|
|
|
|
|
|
settings: '系统设置',
|
|
|
|
|
|
myAccount: '我的账户',
|
|
|
|
|
|
lightMode: '浅色模式',
|
|
|
|
|
|
darkMode: '深色模式',
|
|
|
|
|
|
collapse: '收起',
|
|
|
|
|
|
expand: '展开',
|
|
|
|
|
|
logout: '退出登录',
|
|
|
|
|
|
github: 'GitHub',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
mySubscriptions: '我的订阅'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Auth
|
|
|
|
|
|
auth: {
|
|
|
|
|
|
welcomeBack: '欢迎回来',
|
|
|
|
|
|
signInToAccount: '登录您的账户以继续',
|
|
|
|
|
|
signIn: '登录',
|
|
|
|
|
|
signingIn: '登录中...',
|
|
|
|
|
|
createAccount: '创建账户',
|
|
|
|
|
|
signUpToStart: '注册以开始使用 {siteName}',
|
|
|
|
|
|
signUp: '注册',
|
|
|
|
|
|
processing: '处理中...',
|
|
|
|
|
|
continue: '继续',
|
|
|
|
|
|
rememberMe: '记住我',
|
|
|
|
|
|
dontHaveAccount: '还没有账户?',
|
|
|
|
|
|
alreadyHaveAccount: '已有账户?',
|
|
|
|
|
|
registrationDisabled: '注册功能暂时关闭,请联系管理员。',
|
|
|
|
|
|
emailLabel: '邮箱',
|
|
|
|
|
|
emailPlaceholder: '请输入邮箱',
|
|
|
|
|
|
passwordLabel: '密码',
|
|
|
|
|
|
passwordPlaceholder: '请输入密码',
|
|
|
|
|
|
createPasswordPlaceholder: '创建一个安全的密码',
|
|
|
|
|
|
passwordHint: '至少 6 个字符',
|
|
|
|
|
|
emailRequired: '请输入邮箱',
|
|
|
|
|
|
invalidEmail: '请输入有效的邮箱地址',
|
|
|
|
|
|
passwordRequired: '请输入密码',
|
|
|
|
|
|
passwordMinLength: '密码至少需要 6 个字符',
|
|
|
|
|
|
loginFailed: '登录失败,请检查您的凭据后重试。',
|
|
|
|
|
|
registrationFailed: '注册失败,请重试。',
|
|
|
|
|
|
loginSuccess: '登录成功!欢迎回来。',
|
|
|
|
|
|
accountCreatedSuccess: '账户创建成功!欢迎使用 {siteName}。',
|
|
|
|
|
|
turnstileExpired: '验证已过期,请重试',
|
|
|
|
|
|
turnstileFailed: '验证失败,请重试',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
completeVerification: '请完成验证',
|
|
|
|
|
|
verifyYourEmail: '验证您的邮箱',
|
|
|
|
|
|
sessionExpired: '会话已过期',
|
|
|
|
|
|
sessionExpiredDesc: '请返回注册页面重新开始。',
|
|
|
|
|
|
verificationCode: '验证码',
|
|
|
|
|
|
verificationCodeHint: '请输入发送到您邮箱的6位验证码',
|
|
|
|
|
|
sendingCode: '发送中...',
|
|
|
|
|
|
clickToResend: '点击重新发送验证码',
|
|
|
|
|
|
resendCode: '重新发送验证码',
|
|
|
|
|
|
oauth: {
|
|
|
|
|
|
code: '授权码',
|
|
|
|
|
|
state: '状态',
|
|
|
|
|
|
fullUrl: '完整URL'
|
|
|
|
|
|
}
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Dashboard
|
|
|
|
|
|
dashboard: {
|
|
|
|
|
|
title: '仪表盘',
|
|
|
|
|
|
welcomeMessage: '欢迎回来!这是您账户的概览。',
|
|
|
|
|
|
balance: '余额',
|
|
|
|
|
|
apiKeys: 'API 密钥',
|
|
|
|
|
|
todayRequests: '今日请求',
|
|
|
|
|
|
todayCost: '今日消费',
|
|
|
|
|
|
todayTokens: '今日 Token',
|
|
|
|
|
|
totalTokens: '累计 Token',
|
|
|
|
|
|
cacheToday: '今日缓存',
|
2025-12-24 10:24:02 +08:00
|
|
|
|
performance: '性能指标',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
avgResponse: '平均响应',
|
|
|
|
|
|
averageTime: '平均时间',
|
|
|
|
|
|
timeRange: '时间范围',
|
|
|
|
|
|
granularity: '粒度',
|
|
|
|
|
|
day: '按天',
|
|
|
|
|
|
hour: '按小时',
|
|
|
|
|
|
modelDistribution: '模型分布',
|
|
|
|
|
|
tokenUsageTrend: 'Token 使用趋势',
|
|
|
|
|
|
noDataAvailable: '暂无数据',
|
|
|
|
|
|
model: '模型',
|
|
|
|
|
|
requests: '请求',
|
|
|
|
|
|
tokens: 'Token',
|
|
|
|
|
|
actual: '实际',
|
|
|
|
|
|
standard: '标准',
|
|
|
|
|
|
input: '输入',
|
|
|
|
|
|
output: '输出',
|
|
|
|
|
|
cache: '缓存',
|
|
|
|
|
|
recentUsage: '最近使用',
|
|
|
|
|
|
last7Days: '近 7 天',
|
|
|
|
|
|
noUsageRecords: '暂无使用记录',
|
|
|
|
|
|
startUsingApi: '开始使用 API 后,您的使用历史将显示在这里。',
|
|
|
|
|
|
viewAllUsage: '查看全部',
|
|
|
|
|
|
quickActions: '快捷操作',
|
|
|
|
|
|
createApiKey: '创建 API 密钥',
|
|
|
|
|
|
generateNewKey: '生成新的 API 密钥',
|
|
|
|
|
|
viewUsage: '查看使用记录',
|
|
|
|
|
|
checkDetailedLogs: '查看详细的使用日志',
|
|
|
|
|
|
redeemCode: '兑换码',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
addBalanceWithCode: '使用兑换码充值'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
2025-12-23 10:01:58 +08:00
|
|
|
|
// Groups (shared)
|
|
|
|
|
|
groups: {
|
2025-12-25 08:40:35 -08:00
|
|
|
|
subscription: '订阅'
|
2025-12-23 10:01:58 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
2025-12-18 13:50:39 +08:00
|
|
|
|
// API Keys
|
|
|
|
|
|
keys: {
|
|
|
|
|
|
title: 'API 密钥',
|
|
|
|
|
|
description: '管理您的 API 密钥和访问令牌',
|
|
|
|
|
|
createKey: '创建密钥',
|
|
|
|
|
|
editKey: '编辑密钥',
|
|
|
|
|
|
deleteKey: '删除密钥',
|
|
|
|
|
|
deleteConfirmMessage: "确定要删除 '{name}' 吗?此操作无法撤销。",
|
|
|
|
|
|
apiKey: 'API 密钥',
|
|
|
|
|
|
group: '分组',
|
|
|
|
|
|
noGroup: '无分组',
|
|
|
|
|
|
created: '创建时间',
|
|
|
|
|
|
copyToClipboard: '复制到剪贴板',
|
|
|
|
|
|
copied: '已复制!',
|
2025-12-27 16:04:35 +08:00
|
|
|
|
importToCcSwitch: '导入到 CCS',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
enable: '启用',
|
|
|
|
|
|
disable: '禁用',
|
|
|
|
|
|
nameLabel: '名称',
|
|
|
|
|
|
namePlaceholder: '我的 API 密钥',
|
|
|
|
|
|
groupLabel: '分组',
|
|
|
|
|
|
selectGroup: '选择分组',
|
|
|
|
|
|
statusLabel: '状态',
|
|
|
|
|
|
selectStatus: '选择状态',
|
|
|
|
|
|
saving: '保存中...',
|
|
|
|
|
|
noKeysYet: '暂无 API 密钥',
|
|
|
|
|
|
createFirstKey: '创建您的第一个 API 密钥以开始使用 API。',
|
|
|
|
|
|
keyCreatedSuccess: 'API 密钥创建成功',
|
|
|
|
|
|
keyUpdatedSuccess: 'API 密钥更新成功',
|
|
|
|
|
|
keyDeletedSuccess: 'API 密钥删除成功',
|
|
|
|
|
|
keyEnabledSuccess: 'API 密钥已启用',
|
|
|
|
|
|
keyDisabledSuccess: 'API 密钥已禁用',
|
|
|
|
|
|
failedToLoad: '加载 API 密钥失败',
|
|
|
|
|
|
failedToSave: '保存 API 密钥失败',
|
|
|
|
|
|
failedToDelete: '删除 API 密钥失败',
|
|
|
|
|
|
failedToUpdateStatus: '更新 API 密钥状态失败',
|
|
|
|
|
|
clickToChangeGroup: '点击更换分组',
|
|
|
|
|
|
groupChangedSuccess: '分组更换成功',
|
|
|
|
|
|
failedToChangeGroup: '更换分组失败',
|
|
|
|
|
|
groupRequired: '请选择分组',
|
|
|
|
|
|
usage: '用量',
|
|
|
|
|
|
today: '今日',
|
|
|
|
|
|
total: '累计',
|
|
|
|
|
|
useKey: '使用密钥',
|
|
|
|
|
|
useKeyModal: {
|
|
|
|
|
|
title: '使用 API 密钥',
|
|
|
|
|
|
description: '将以下环境变量添加到您的终端配置文件或直接在终端中运行。',
|
|
|
|
|
|
copy: '复制',
|
|
|
|
|
|
copied: '已复制',
|
|
|
|
|
|
note: '这些环境变量将在当前终端会话中生效。如需永久配置,请将其添加到 ~/.bashrc、~/.zshrc 或相应的配置文件中。',
|
2025-12-26 13:46:40 +08:00
|
|
|
|
noGroupTitle: '请先分配分组',
|
|
|
|
|
|
noGroupDescription: '此 API 密钥尚未分配分组,请先在密钥列表中点击分组列进行分配,然后才能查看使用配置。',
|
|
|
|
|
|
openai: {
|
|
|
|
|
|
description: '将以下配置文件添加到 Codex CLI 配置目录中。',
|
|
|
|
|
|
configTomlHint: '请确保以下内容位于 config.toml 文件的开头部分',
|
|
|
|
|
|
note: '请确保配置目录存在。macOS/Linux 用户可运行 mkdir -p ~/.codex 创建目录。',
|
|
|
|
|
|
noteWindows: '按 Win+R,输入 %userprofile%\\.codex 打开配置目录。如目录不存在,请先手动创建。',
|
|
|
|
|
|
},
|
2026-01-03 06:35:50 -08:00
|
|
|
|
antigravity: {
|
|
|
|
|
|
description: '为 Antigravity 分组配置 API 访问。请根据您使用的客户端选择对应的配置方式。',
|
|
|
|
|
|
claudeCode: 'Claude Code',
|
|
|
|
|
|
geminiCli: 'Gemini CLI',
|
|
|
|
|
|
claudeNote: '这些环境变量将在当前终端会话中生效。如需永久配置,请将其添加到 ~/.bashrc、~/.zshrc 或相应的配置文件中。',
|
|
|
|
|
|
geminiNote: '这些环境变量将在当前终端会话中生效。如需永久配置,请将其添加到 ~/.bashrc、~/.zshrc 或相应的配置文件中。',
|
|
|
|
|
|
},
|
|
|
|
|
|
gemini: {
|
|
|
|
|
|
description: '将以下环境变量添加到您的终端配置文件或直接在终端中运行,以配置 Gemini CLI 访问。',
|
|
|
|
|
|
modelComment: '如果你有 Gemini 3 权限可以填:gemini-3-pro-preview',
|
|
|
|
|
|
note: '这些环境变量将在当前终端会话中生效。如需永久配置,请将其添加到 ~/.bashrc、~/.zshrc 或相应的配置文件中。',
|
|
|
|
|
|
},
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
customKeyLabel: '自定义密钥',
|
|
|
|
|
|
customKeyPlaceholder: '输入自定义密钥(至少16个字符)',
|
|
|
|
|
|
customKeyHint: '仅允许字母、数字、下划线和连字符,最少16个字符。',
|
|
|
|
|
|
customKeyTooShort: '自定义密钥至少需要16个字符',
|
|
|
|
|
|
customKeyInvalidChars: '自定义密钥只能包含字母、数字、下划线和连字符',
|
2025-12-29 16:13:09 +08:00
|
|
|
|
customKeyRequired: '请输入自定义密钥',
|
2026-01-03 06:35:50 -08:00
|
|
|
|
ccSwitchNotInstalled: 'CC-Switch 未安装或协议处理程序未注册。请先安装 CC-Switch 或手动复制 API 密钥。',
|
|
|
|
|
|
ccsClientSelect: {
|
|
|
|
|
|
title: '选择客户端',
|
|
|
|
|
|
description: '请选择您要导入到 CC-Switch 的客户端类型:',
|
|
|
|
|
|
claudeCode: 'Claude Code',
|
|
|
|
|
|
claudeCodeDesc: '导入为 Claude Code 配置',
|
|
|
|
|
|
geminiCli: 'Gemini CLI',
|
|
|
|
|
|
geminiCliDesc: '导入为 Gemini CLI 配置',
|
|
|
|
|
|
},
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Usage
|
|
|
|
|
|
usage: {
|
|
|
|
|
|
title: '使用记录',
|
|
|
|
|
|
description: '查看和分析您的 API 使用历史',
|
|
|
|
|
|
totalRequests: '总请求数',
|
|
|
|
|
|
totalTokens: '总 Token',
|
|
|
|
|
|
totalCost: '总消费',
|
|
|
|
|
|
standardCost: '标准',
|
|
|
|
|
|
actualCost: '实际',
|
|
|
|
|
|
avgDuration: '平均耗时',
|
|
|
|
|
|
inSelectedRange: '所选范围内',
|
|
|
|
|
|
perRequest: '每次请求',
|
|
|
|
|
|
apiKeyFilter: 'API 密钥',
|
|
|
|
|
|
allApiKeys: '全部密钥',
|
|
|
|
|
|
timeRange: '时间范围',
|
|
|
|
|
|
exportCsv: '导出 CSV',
|
2025-12-29 16:13:09 +08:00
|
|
|
|
exportExcel: '导出 Excel',
|
|
|
|
|
|
exportingProgress: '正在导出数据...',
|
|
|
|
|
|
exportedCount: '已导出 {current}/{total} 条',
|
|
|
|
|
|
estimatedTime: '预计剩余时间:{time}',
|
|
|
|
|
|
cancelExport: '取消导出',
|
|
|
|
|
|
exportCancelled: '导出已取消',
|
2025-12-28 01:00:06 +08:00
|
|
|
|
exporting: '导出中...',
|
|
|
|
|
|
preparingExport: '正在准备导出...',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
model: '模型',
|
|
|
|
|
|
type: '类型',
|
|
|
|
|
|
tokens: 'Token',
|
|
|
|
|
|
cost: '费用',
|
|
|
|
|
|
firstToken: '首 Token',
|
|
|
|
|
|
duration: '耗时',
|
|
|
|
|
|
time: '时间',
|
|
|
|
|
|
stream: '流式',
|
|
|
|
|
|
sync: '同步',
|
|
|
|
|
|
in: '输入',
|
|
|
|
|
|
out: '输出',
|
2025-12-19 16:57:31 +08:00
|
|
|
|
cacheRead: '读取',
|
|
|
|
|
|
cacheWrite: '写入',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
rate: '倍率',
|
|
|
|
|
|
original: '原始',
|
|
|
|
|
|
billed: '计费',
|
|
|
|
|
|
noRecords: '未找到使用记录,请尝试调整筛选条件。',
|
|
|
|
|
|
failedToLoad: '加载使用记录失败',
|
|
|
|
|
|
noDataToExport: '没有可导出的数据',
|
|
|
|
|
|
exportSuccess: '使用数据导出成功',
|
2025-12-28 01:00:06 +08:00
|
|
|
|
exportFailed: '使用数据导出失败',
|
2025-12-29 16:13:09 +08:00
|
|
|
|
exportExcelSuccess: '使用数据导出成功(Excel格式)',
|
|
|
|
|
|
exportExcelFailed: '使用数据导出失败',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
billingType: '消费类型',
|
|
|
|
|
|
balance: '余额',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
subscription: '订阅'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Redeem
|
|
|
|
|
|
redeem: {
|
|
|
|
|
|
title: '兑换码',
|
|
|
|
|
|
description: '输入兑换码以充值余额或增加并发数',
|
|
|
|
|
|
currentBalance: '当前余额',
|
|
|
|
|
|
concurrency: '并发数',
|
|
|
|
|
|
requests: '请求',
|
|
|
|
|
|
redeemCodeLabel: '兑换码',
|
|
|
|
|
|
redeemCodePlaceholder: '请输入兑换码',
|
|
|
|
|
|
redeemCodeHint: '兑换码区分大小写',
|
|
|
|
|
|
redeeming: '兑换中...',
|
|
|
|
|
|
redeemButton: '兑换',
|
|
|
|
|
|
redeemSuccess: '兑换成功!',
|
|
|
|
|
|
redeemFailed: '兑换失败',
|
|
|
|
|
|
added: '已添加',
|
|
|
|
|
|
concurrentRequests: '并发请求',
|
|
|
|
|
|
newBalance: '新余额',
|
|
|
|
|
|
newConcurrency: '新并发数',
|
|
|
|
|
|
aboutCodes: '关于兑换码',
|
|
|
|
|
|
codeRule1: '每个兑换码只能使用一次',
|
|
|
|
|
|
codeRule2: '兑换码可以增加余额、并发数或试用权限',
|
|
|
|
|
|
codeRule3: '如有兑换问题,请联系客服',
|
|
|
|
|
|
codeRule4: '余额和并发数即时更新',
|
|
|
|
|
|
recentActivity: '最近活动',
|
|
|
|
|
|
historyWillAppear: '您的兑换历史将显示在这里',
|
|
|
|
|
|
balanceAddedRedeem: '余额充值(兑换)',
|
|
|
|
|
|
balanceAddedAdmin: '余额充值(管理员)',
|
|
|
|
|
|
balanceDeductedAdmin: '余额扣除(管理员)',
|
|
|
|
|
|
concurrencyAddedRedeem: '并发增加(兑换)',
|
|
|
|
|
|
concurrencyAddedAdmin: '并发增加(管理员)',
|
|
|
|
|
|
concurrencyReducedAdmin: '并发减少(管理员)',
|
|
|
|
|
|
adminAdjustment: '管理员调整',
|
|
|
|
|
|
subscriptionAssigned: '订阅已分配',
|
|
|
|
|
|
subscriptionAssignedDesc: '您已获得 {groupName} 的访问权限',
|
|
|
|
|
|
subscriptionDays: '{days} 天',
|
|
|
|
|
|
days: '天',
|
|
|
|
|
|
codeRedeemSuccess: '兑换成功!',
|
2025-12-28 13:20:30 +08:00
|
|
|
|
failedToRedeem: '兑换失败,请检查兑换码后重试。',
|
|
|
|
|
|
subscriptionRefreshFailed: '兑换成功,但订阅状态刷新失败。'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Profile
|
|
|
|
|
|
profile: {
|
|
|
|
|
|
title: '个人设置',
|
|
|
|
|
|
description: '管理您的账户信息和设置',
|
|
|
|
|
|
accountBalance: '账户余额',
|
|
|
|
|
|
concurrencyLimit: '并发限制',
|
|
|
|
|
|
memberSince: '注册时间',
|
|
|
|
|
|
administrator: '管理员',
|
|
|
|
|
|
user: '用户',
|
2025-12-23 11:26:22 +08:00
|
|
|
|
username: '用户名',
|
|
|
|
|
|
enterUsername: '输入用户名',
|
|
|
|
|
|
editProfile: '编辑个人资料',
|
|
|
|
|
|
updateProfile: '更新资料',
|
|
|
|
|
|
updating: '更新中...',
|
|
|
|
|
|
updateSuccess: '资料更新成功',
|
|
|
|
|
|
updateFailed: '资料更新失败',
|
2025-12-28 01:00:06 +08:00
|
|
|
|
usernameRequired: '用户名不能为空',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
changePassword: '修改密码',
|
|
|
|
|
|
currentPassword: '当前密码',
|
|
|
|
|
|
newPassword: '新密码',
|
|
|
|
|
|
confirmNewPassword: '确认新密码',
|
|
|
|
|
|
passwordHint: '密码至少需要 8 个字符',
|
|
|
|
|
|
changingPassword: '修改中...',
|
|
|
|
|
|
changePasswordButton: '修改密码',
|
|
|
|
|
|
passwordsNotMatch: '两次输入的密码不一致',
|
|
|
|
|
|
passwordTooShort: '密码至少需要 8 个字符',
|
|
|
|
|
|
passwordChangeSuccess: '密码修改成功',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
passwordChangeFailed: '密码修改失败'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Empty States
|
|
|
|
|
|
empty: {
|
2025-12-25 08:40:35 -08:00
|
|
|
|
noData: '暂无数据'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
2025-12-27 10:50:25 +08:00
|
|
|
|
// Table
|
|
|
|
|
|
table: {
|
|
|
|
|
|
expandActions: '展开更多操作',
|
|
|
|
|
|
collapseActions: '收起操作'
|
|
|
|
|
|
},
|
|
|
|
|
|
|
2025-12-18 13:50:39 +08:00
|
|
|
|
// Pagination
|
|
|
|
|
|
pagination: {
|
|
|
|
|
|
showing: '显示',
|
|
|
|
|
|
to: '至',
|
|
|
|
|
|
of: '共',
|
|
|
|
|
|
results: '条结果',
|
|
|
|
|
|
page: '页',
|
|
|
|
|
|
pageOf: '第 {page} / {total} 页',
|
|
|
|
|
|
previous: '上一页',
|
|
|
|
|
|
next: '下一页',
|
|
|
|
|
|
perPage: '每页',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
goToPage: '跳转到第 {page} 页'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Errors
|
|
|
|
|
|
errors: {
|
|
|
|
|
|
somethingWentWrong: '出错了',
|
|
|
|
|
|
pageNotFound: '页面未找到',
|
|
|
|
|
|
unauthorized: '未授权',
|
|
|
|
|
|
forbidden: '禁止访问',
|
|
|
|
|
|
serverError: '服务器错误',
|
|
|
|
|
|
networkError: '网络错误',
|
|
|
|
|
|
timeout: '请求超时',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
tryAgain: '请重试'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Dates
|
|
|
|
|
|
dates: {
|
|
|
|
|
|
today: '今天',
|
|
|
|
|
|
yesterday: '昨天',
|
|
|
|
|
|
thisWeek: '本周',
|
|
|
|
|
|
lastWeek: '上周',
|
|
|
|
|
|
thisMonth: '本月',
|
|
|
|
|
|
lastMonth: '上月',
|
|
|
|
|
|
last7Days: '近 7 天',
|
|
|
|
|
|
last14Days: '近 14 天',
|
|
|
|
|
|
last30Days: '近 30 天',
|
|
|
|
|
|
custom: '自定义',
|
|
|
|
|
|
startDate: '开始日期',
|
|
|
|
|
|
endDate: '结束日期',
|
|
|
|
|
|
apply: '应用',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
selectDateRange: '选择日期范围'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Admin
|
|
|
|
|
|
admin: {
|
|
|
|
|
|
// Dashboard
|
|
|
|
|
|
dashboard: {
|
|
|
|
|
|
title: '管理控制台',
|
|
|
|
|
|
description: '系统概览与统计数据',
|
|
|
|
|
|
apiKeys: 'API 密钥',
|
|
|
|
|
|
totalApiKeys: 'API 密钥总数',
|
|
|
|
|
|
activeApiKeys: '活跃密钥',
|
|
|
|
|
|
users: '用户',
|
|
|
|
|
|
totalUsers: '用户总数',
|
|
|
|
|
|
activeUsers: '活跃用户',
|
|
|
|
|
|
accounts: '账号',
|
|
|
|
|
|
totalAccounts: '账号总数',
|
|
|
|
|
|
activeAccounts: '活跃账号',
|
|
|
|
|
|
todayRequests: '今日请求',
|
|
|
|
|
|
totalRequests: '总请求数',
|
|
|
|
|
|
todayCost: '今日消费',
|
|
|
|
|
|
totalCost: '总消费',
|
|
|
|
|
|
actual: '实际',
|
|
|
|
|
|
standard: '标准',
|
|
|
|
|
|
todayTokens: '今日 Token',
|
|
|
|
|
|
totalTokens: '总 Token',
|
|
|
|
|
|
input: '输入',
|
|
|
|
|
|
output: '输出',
|
|
|
|
|
|
cacheToday: '今日缓存',
|
2025-12-24 10:24:02 +08:00
|
|
|
|
performance: '性能指标',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
avgResponse: '平均响应',
|
|
|
|
|
|
averageTime: '平均时间',
|
|
|
|
|
|
timeRange: '时间范围',
|
|
|
|
|
|
granularity: '粒度',
|
|
|
|
|
|
day: '按天',
|
|
|
|
|
|
hour: '按小时',
|
|
|
|
|
|
modelDistribution: '模型分布',
|
|
|
|
|
|
tokenUsageTrend: 'Token 使用趋势',
|
|
|
|
|
|
noDataAvailable: '暂无数据',
|
|
|
|
|
|
model: '模型',
|
|
|
|
|
|
requests: '请求',
|
|
|
|
|
|
tokens: 'Token',
|
|
|
|
|
|
cache: '缓存',
|
|
|
|
|
|
recentUsage: '最近使用',
|
|
|
|
|
|
last7Days: '近 7 天',
|
|
|
|
|
|
noUsageRecords: '暂无使用记录',
|
|
|
|
|
|
startUsingApi: '开始使用 API 后,使用历史将显示在这里。',
|
|
|
|
|
|
viewAllUsage: '查看全部',
|
|
|
|
|
|
quickActions: '快捷操作',
|
|
|
|
|
|
manageUsers: '管理用户',
|
|
|
|
|
|
viewUserAccounts: '查看和管理用户账户',
|
|
|
|
|
|
manageAccounts: '管理账号',
|
|
|
|
|
|
configureAiAccounts: '配置 AI 平台账号',
|
|
|
|
|
|
systemSettings: '系统设置',
|
|
|
|
|
|
configureSystem: '配置系统设置',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
failedToLoad: '加载仪表盘数据失败'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Users Management
|
|
|
|
|
|
users: {
|
|
|
|
|
|
title: '用户管理',
|
|
|
|
|
|
description: '管理用户账户和权限',
|
|
|
|
|
|
createUser: '创建用户',
|
|
|
|
|
|
editUser: '编辑用户',
|
|
|
|
|
|
deleteUser: '删除用户',
|
|
|
|
|
|
deleteConfirmMessage: "确定要删除用户 '{email}' 吗?此操作无法撤销。",
|
|
|
|
|
|
searchPlaceholder: '搜索用户...',
|
2025-12-23 11:26:22 +08:00
|
|
|
|
searchUsers: '搜索用户...',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
roleFilter: '角色筛选',
|
|
|
|
|
|
allRoles: '全部角色',
|
2025-12-23 11:26:22 +08:00
|
|
|
|
allStatus: '全部状态',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
statusFilter: '状态筛选',
|
|
|
|
|
|
allStatuses: '全部状态',
|
2025-12-23 11:26:22 +08:00
|
|
|
|
admin: '管理员',
|
|
|
|
|
|
user: '用户',
|
|
|
|
|
|
disabled: '禁用',
|
|
|
|
|
|
email: '邮箱',
|
|
|
|
|
|
password: '密码',
|
|
|
|
|
|
username: '用户名',
|
|
|
|
|
|
notes: '备注',
|
|
|
|
|
|
enterEmail: '请输入邮箱',
|
|
|
|
|
|
enterPassword: '请输入密码',
|
|
|
|
|
|
enterUsername: '请输入用户名(选填)',
|
|
|
|
|
|
enterNotes: '请输入备注(仅管理员可见)',
|
|
|
|
|
|
notesHint: '此备注仅对管理员可见',
|
|
|
|
|
|
enterNewPassword: '请输入新密码(选填)',
|
|
|
|
|
|
leaveEmptyToKeep: '留空则保持原密码不变',
|
|
|
|
|
|
generatePassword: '生成随机密码',
|
|
|
|
|
|
copyPassword: '复制密码',
|
|
|
|
|
|
creating: '创建中...',
|
|
|
|
|
|
updating: '更新中...',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
columns: {
|
2025-12-23 11:26:22 +08:00
|
|
|
|
user: '用户',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
email: '邮箱',
|
2025-12-23 11:26:22 +08:00
|
|
|
|
username: '用户名',
|
|
|
|
|
|
notes: '备注',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
role: '角色',
|
2025-12-23 11:03:10 +08:00
|
|
|
|
subscriptions: '订阅分组',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
balance: '余额',
|
|
|
|
|
|
usage: '用量',
|
|
|
|
|
|
concurrency: '并发数',
|
|
|
|
|
|
status: '状态',
|
|
|
|
|
|
created: '创建时间',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
actions: '操作'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
today: '今日',
|
|
|
|
|
|
total: '累计',
|
2025-12-23 11:03:10 +08:00
|
|
|
|
noSubscription: '暂无订阅',
|
|
|
|
|
|
daysRemaining: '{days}天',
|
|
|
|
|
|
expired: '已过期',
|
2025-12-27 16:04:35 +08:00
|
|
|
|
disable: '禁用',
|
|
|
|
|
|
enable: '启用',
|
2025-12-23 11:26:22 +08:00
|
|
|
|
disableUser: '禁用用户',
|
|
|
|
|
|
enableUser: '启用用户',
|
|
|
|
|
|
viewApiKeys: '查看 API 密钥',
|
2025-12-27 16:04:35 +08:00
|
|
|
|
groups: '分组',
|
|
|
|
|
|
apiKeys: 'API密钥',
|
2025-12-23 11:26:22 +08:00
|
|
|
|
userApiKeys: '用户 API 密钥',
|
|
|
|
|
|
noApiKeys: '此用户暂无 API 密钥',
|
|
|
|
|
|
group: '分组',
|
|
|
|
|
|
none: '无',
|
|
|
|
|
|
noUsersYet: '暂无用户',
|
|
|
|
|
|
createFirstUser: '创建您的第一个用户以开始使用系统',
|
|
|
|
|
|
userCreated: '用户创建成功',
|
|
|
|
|
|
userUpdated: '用户更新成功',
|
|
|
|
|
|
userDeleted: '用户删除成功',
|
|
|
|
|
|
userEnabled: '用户已启用',
|
|
|
|
|
|
userDisabled: '用户已禁用',
|
|
|
|
|
|
failedToLoad: '加载用户列表失败',
|
|
|
|
|
|
failedToCreate: '创建用户失败',
|
|
|
|
|
|
failedToUpdate: '更新用户失败',
|
|
|
|
|
|
failedToDelete: '删除用户失败',
|
|
|
|
|
|
failedToToggle: '更新用户状态失败',
|
|
|
|
|
|
failedToLoadApiKeys: '加载用户 API 密钥失败',
|
|
|
|
|
|
deleteConfirm: "确定要删除用户 '{email}' 吗?此操作无法撤销。",
|
2025-12-18 13:50:39 +08:00
|
|
|
|
roles: {
|
|
|
|
|
|
admin: '管理员',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
user: '用户'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
statuses: {
|
|
|
|
|
|
active: '正常',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
banned: '禁用'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
form: {
|
|
|
|
|
|
emailLabel: '邮箱',
|
|
|
|
|
|
emailPlaceholder: '请输入邮箱',
|
2025-12-23 11:26:22 +08:00
|
|
|
|
usernameLabel: '用户名',
|
|
|
|
|
|
usernamePlaceholder: '请输入用户名(选填)',
|
|
|
|
|
|
notesLabel: '备注',
|
|
|
|
|
|
notesPlaceholder: '请输入备注(仅管理员可见)',
|
|
|
|
|
|
notesHint: '此备注仅对管理员可见',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
passwordLabel: '密码',
|
|
|
|
|
|
passwordPlaceholder: '请输入密码(留空则不修改)',
|
|
|
|
|
|
roleLabel: '角色',
|
|
|
|
|
|
selectRole: '选择角色',
|
|
|
|
|
|
balanceLabel: '余额',
|
|
|
|
|
|
concurrencyLabel: '并发数',
|
|
|
|
|
|
statusLabel: '状态',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
selectStatus: '选择状态'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
adjustBalance: '调整余额',
|
|
|
|
|
|
adjustConcurrency: '调整并发数',
|
|
|
|
|
|
adjustmentAmount: '调整金额',
|
|
|
|
|
|
adjustmentAmountHint: '正数增加,负数减少',
|
|
|
|
|
|
currentBalance: '当前余额',
|
|
|
|
|
|
currentConcurrency: '当前并发数',
|
|
|
|
|
|
saving: '保存中...',
|
|
|
|
|
|
noUsers: '暂无用户',
|
|
|
|
|
|
noUsersDescription: '创建您的第一个用户以开始使用系统。',
|
|
|
|
|
|
userCreatedSuccess: '用户创建成功',
|
|
|
|
|
|
userUpdatedSuccess: '用户更新成功',
|
|
|
|
|
|
userDeletedSuccess: '用户删除成功',
|
|
|
|
|
|
balanceAdjustedSuccess: '余额调整成功',
|
|
|
|
|
|
concurrencyAdjustedSuccess: '并发数调整成功',
|
|
|
|
|
|
failedToSave: '保存用户失败',
|
|
|
|
|
|
failedToAdjust: '调整失败',
|
|
|
|
|
|
setAllowedGroups: '设置允许分组',
|
|
|
|
|
|
allowedGroupsHint: '选择此用户可以使用的标准分组。订阅类型分组请在订阅管理中配置。',
|
|
|
|
|
|
noStandardGroups: '暂无标准分组',
|
|
|
|
|
|
allowAllGroups: '允许全部分组',
|
|
|
|
|
|
allowAllGroupsHint: '用户可以使用任何非专属分组',
|
|
|
|
|
|
allowedGroupsUpdated: '允许分组更新成功',
|
|
|
|
|
|
failedToLoadGroups: '加载分组列表失败',
|
|
|
|
|
|
failedToUpdateAllowedGroups: '更新允许分组失败',
|
2025-12-23 16:29:57 +08:00
|
|
|
|
deposit: '充值',
|
|
|
|
|
|
withdraw: '退款',
|
|
|
|
|
|
depositAmount: '充值金额',
|
|
|
|
|
|
withdrawAmount: '退款金额',
|
|
|
|
|
|
depositNotesPlaceholder: '例如:新用户注册奖励、活动充值、补偿充值等',
|
|
|
|
|
|
withdrawNotesPlaceholder: '例如:服务问题退款、错误充值退回、账户注销退款等',
|
|
|
|
|
|
notesOptional: '备注为可选项,有助于未来查账',
|
|
|
|
|
|
amountHint: '请输入正数金额',
|
|
|
|
|
|
newBalance: '操作后余额',
|
|
|
|
|
|
depositing: '充值中...',
|
|
|
|
|
|
withdrawing: '退款中...',
|
|
|
|
|
|
confirmDeposit: '确认充值',
|
|
|
|
|
|
confirmWithdraw: '确认退款',
|
|
|
|
|
|
depositSuccess: '充值成功',
|
|
|
|
|
|
withdrawSuccess: '退款成功',
|
|
|
|
|
|
failedToDeposit: '充值失败',
|
|
|
|
|
|
failedToWithdraw: '退款失败',
|
|
|
|
|
|
useDepositWithdrawButtons: '请使用充值/退款按钮调整余额',
|
2026-01-01 18:59:38 +08:00
|
|
|
|
insufficientBalance: '余额不足,退款后余额不能为负数',
|
|
|
|
|
|
// Settings Dropdowns
|
|
|
|
|
|
filterSettings: '筛选设置',
|
|
|
|
|
|
columnSettings: '列设置',
|
|
|
|
|
|
filterValue: '输入值',
|
|
|
|
|
|
// User Attributes
|
|
|
|
|
|
attributes: {
|
|
|
|
|
|
title: '用户属性配置',
|
|
|
|
|
|
description: '配置用户的自定义属性字段',
|
|
|
|
|
|
configButton: '属性配置',
|
|
|
|
|
|
addAttribute: '添加属性',
|
|
|
|
|
|
editAttribute: '编辑属性',
|
|
|
|
|
|
deleteAttribute: '删除属性',
|
|
|
|
|
|
deleteConfirm: "确定要删除属性 '{name}' 吗?所有用户的该属性值将被删除。",
|
|
|
|
|
|
noAttributes: '暂无自定义属性',
|
|
|
|
|
|
noAttributesHint: '点击上方按钮添加自定义属性',
|
|
|
|
|
|
key: '属性键',
|
|
|
|
|
|
keyHint: '用于程序引用,只能包含字母、数字和下划线',
|
|
|
|
|
|
name: '显示名称',
|
|
|
|
|
|
nameHint: '在表单中显示的名称',
|
|
|
|
|
|
type: '属性类型',
|
|
|
|
|
|
fieldDescription: '描述',
|
|
|
|
|
|
fieldDescriptionHint: '属性的说明文字',
|
|
|
|
|
|
placeholder: '占位符',
|
|
|
|
|
|
placeholderHint: '输入框的提示文字',
|
|
|
|
|
|
required: '必填',
|
|
|
|
|
|
enabled: '启用',
|
|
|
|
|
|
options: '选项配置',
|
|
|
|
|
|
optionsHint: '用于单选/多选类型',
|
|
|
|
|
|
addOption: '添加选项',
|
|
|
|
|
|
optionValue: '选项值',
|
|
|
|
|
|
optionLabel: '显示文本',
|
|
|
|
|
|
validation: '验证规则',
|
|
|
|
|
|
minLength: '最小长度',
|
|
|
|
|
|
maxLength: '最大长度',
|
|
|
|
|
|
min: '最小值',
|
|
|
|
|
|
max: '最大值',
|
|
|
|
|
|
pattern: '正则表达式',
|
|
|
|
|
|
patternMessage: '验证失败提示',
|
|
|
|
|
|
types: {
|
|
|
|
|
|
text: '单行文本',
|
|
|
|
|
|
textarea: '多行文本',
|
|
|
|
|
|
number: '数字',
|
|
|
|
|
|
email: '邮箱',
|
|
|
|
|
|
url: '链接',
|
|
|
|
|
|
date: '日期',
|
|
|
|
|
|
select: '单选',
|
|
|
|
|
|
multi_select: '多选'
|
|
|
|
|
|
},
|
|
|
|
|
|
created: '属性创建成功',
|
|
|
|
|
|
updated: '属性更新成功',
|
|
|
|
|
|
deleted: '属性删除成功',
|
|
|
|
|
|
reordered: '属性排序更新成功',
|
|
|
|
|
|
failedToLoad: '加载属性列表失败',
|
|
|
|
|
|
failedToCreate: '创建属性失败',
|
|
|
|
|
|
failedToUpdate: '更新属性失败',
|
|
|
|
|
|
failedToDelete: '删除属性失败',
|
|
|
|
|
|
failedToReorder: '更新排序失败',
|
|
|
|
|
|
keyExists: '属性键已存在',
|
|
|
|
|
|
dragToReorder: '拖拽排序'
|
|
|
|
|
|
}
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Groups Management
|
|
|
|
|
|
groups: {
|
|
|
|
|
|
title: '分组管理',
|
|
|
|
|
|
description: '管理 API 密钥分组和费率配置',
|
|
|
|
|
|
createGroup: '创建分组',
|
|
|
|
|
|
editGroup: '编辑分组',
|
|
|
|
|
|
deleteGroup: '删除分组',
|
|
|
|
|
|
deleteConfirm: "确定要删除分组 '{name}' 吗?所有关联的 API 密钥将不再属于任何分组。",
|
2025-12-24 18:07:58 -08:00
|
|
|
|
deleteConfirmSubscription:
|
|
|
|
|
|
"确定要删除订阅分组 '{name}' 吗?此操作会让所有绑定此订阅的用户的 API Key 失效,并删除所有相关的订阅记录。此操作无法撤销。",
|
2025-12-18 13:50:39 +08:00
|
|
|
|
columns: {
|
|
|
|
|
|
name: '名称',
|
2025-12-23 10:01:58 +08:00
|
|
|
|
platform: '平台',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
rateMultiplier: '费率倍数',
|
|
|
|
|
|
exclusive: '独占',
|
2025-12-23 10:01:58 +08:00
|
|
|
|
type: '类型',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
priority: '优先级',
|
|
|
|
|
|
apiKeys: 'API 密钥数',
|
2025-12-23 10:01:58 +08:00
|
|
|
|
accounts: '账号数',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
status: '状态',
|
|
|
|
|
|
actions: '操作',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
billingType: '计费类型'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
form: {
|
|
|
|
|
|
name: '名称',
|
|
|
|
|
|
description: '描述',
|
|
|
|
|
|
platform: '平台',
|
|
|
|
|
|
rateMultiplier: '费率倍数',
|
|
|
|
|
|
status: '状态',
|
2025-12-28 22:19:18 +08:00
|
|
|
|
exclusive: '专属分组',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
nameLabel: '分组名称',
|
|
|
|
|
|
namePlaceholder: '请输入分组名称',
|
|
|
|
|
|
descriptionLabel: '描述',
|
|
|
|
|
|
descriptionPlaceholder: '请输入描述(可选)',
|
|
|
|
|
|
rateMultiplierLabel: '费率倍数',
|
|
|
|
|
|
rateMultiplierHint: '1.0 = 标准费率,0.5 = 半价,2.0 = 双倍',
|
2025-12-28 22:19:18 +08:00
|
|
|
|
exclusiveLabel: '专属分组',
|
|
|
|
|
|
exclusiveHint: '专属分组,可以手动指定给用户',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
platformLabel: '平台限制',
|
|
|
|
|
|
platformPlaceholder: '选择平台(留空则不限制)',
|
|
|
|
|
|
accountsLabel: '指定账号',
|
|
|
|
|
|
accountsPlaceholder: '选择账号(留空则不限制)',
|
|
|
|
|
|
priorityLabel: '优先级',
|
|
|
|
|
|
priorityHint: '数值越高优先级越高,用于账号调度',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
statusLabel: '状态'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
2025-12-27 16:04:35 +08:00
|
|
|
|
exclusiveObj: {
|
2025-12-18 13:50:39 +08:00
|
|
|
|
yes: '是',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
no: '否'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
2025-12-28 22:19:18 +08:00
|
|
|
|
exclusive: '专属',
|
|
|
|
|
|
exclusiveHint: '专属分组,可以手动指定给特定用户',
|
|
|
|
|
|
exclusiveTooltip: {
|
|
|
|
|
|
title: '什么是专属分组?',
|
|
|
|
|
|
description: '开启后,用户在创建 API Key 时将无法看到此分组。只有管理员手动将用户分配到此分组后,用户才能使用。',
|
|
|
|
|
|
example: '使用场景:',
|
|
|
|
|
|
exampleContent: '公开分组费率 0.8,您可以创建一个费率 0.7 的专属分组,手动分配给 VIP 用户,让他们享受更优惠的价格。'
|
|
|
|
|
|
},
|
2025-12-27 16:04:35 +08:00
|
|
|
|
rateMultiplierHint: '1.0 = 标准费率,0.5 = 半价,2.0 = 双倍',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
platforms: {
|
|
|
|
|
|
all: '全部平台',
|
|
|
|
|
|
claude: 'Claude',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
openai: 'OpenAI'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
saving: '保存中...',
|
|
|
|
|
|
noGroups: '暂无分组',
|
|
|
|
|
|
noGroupsDescription: '创建分组以更好地管理 API 密钥和费率。',
|
|
|
|
|
|
groupCreatedSuccess: '分组创建成功',
|
|
|
|
|
|
groupUpdatedSuccess: '分组更新成功',
|
|
|
|
|
|
groupDeletedSuccess: '分组删除成功',
|
|
|
|
|
|
failedToLoad: '加载分组列表失败',
|
|
|
|
|
|
failedToSave: '保存分组失败',
|
|
|
|
|
|
failedToDelete: '删除分组失败',
|
|
|
|
|
|
allPlatforms: '全部平台',
|
|
|
|
|
|
allStatus: '全部状态',
|
|
|
|
|
|
allGroups: '全部分组',
|
2025-12-28 22:19:18 +08:00
|
|
|
|
exclusiveFilter: '专属',
|
|
|
|
|
|
nonExclusive: '公开',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
public: '公开',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
rateAndAccounts: '{rate}x 费率 · {count} 个账号',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
accountsCount: '{count} 个账号',
|
|
|
|
|
|
enterGroupName: '请输入分组名称',
|
|
|
|
|
|
optionalDescription: '可选描述',
|
|
|
|
|
|
platformHint: '选择此分组关联的平台',
|
2025-12-23 10:01:58 +08:00
|
|
|
|
platformNotEditable: '创建后不可更改平台',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
noGroupsYet: '暂无分组',
|
|
|
|
|
|
createFirstGroup: '创建您的第一个分组来组织 API 密钥。',
|
|
|
|
|
|
creating: '创建中...',
|
|
|
|
|
|
updating: '更新中...',
|
2025-12-23 10:01:58 +08:00
|
|
|
|
limitDay: '日',
|
|
|
|
|
|
limitWeek: '周',
|
|
|
|
|
|
limitMonth: '月',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
groupCreated: '分组创建成功',
|
|
|
|
|
|
groupUpdated: '分组更新成功',
|
|
|
|
|
|
groupDeleted: '分组删除成功',
|
|
|
|
|
|
failedToCreate: '创建分组失败',
|
|
|
|
|
|
failedToUpdate: '更新分组失败',
|
|
|
|
|
|
subscription: {
|
|
|
|
|
|
title: '订阅设置',
|
|
|
|
|
|
type: '计费类型',
|
|
|
|
|
|
typeHint: '标准计费从用户余额扣除。订阅模式使用配额限制。',
|
2025-12-19 08:41:30 +08:00
|
|
|
|
typeNotEditable: '分组创建后无法修改计费类型。',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
standard: '标准(余额)',
|
|
|
|
|
|
subscription: '订阅(配额)',
|
|
|
|
|
|
dailyLimit: '每日限额(USD)',
|
|
|
|
|
|
weeklyLimit: '每周限额(USD)',
|
|
|
|
|
|
monthlyLimit: '每月限额(USD)',
|
|
|
|
|
|
defaultValidityDays: '默认有效期(天)',
|
|
|
|
|
|
validityHint: '分配给用户时订阅的有效天数',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
noLimit: '无限制'
|
|
|
|
|
|
}
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Subscriptions Management
|
|
|
|
|
|
subscriptions: {
|
|
|
|
|
|
title: '订阅管理',
|
|
|
|
|
|
description: '管理用户订阅和配额限制',
|
|
|
|
|
|
assignSubscription: '分配订阅',
|
|
|
|
|
|
extendSubscription: '延长订阅',
|
|
|
|
|
|
revokeSubscription: '撤销订阅',
|
|
|
|
|
|
allStatus: '全部状态',
|
|
|
|
|
|
allGroups: '全部分组',
|
|
|
|
|
|
daily: '每日',
|
|
|
|
|
|
weekly: '每周',
|
|
|
|
|
|
monthly: '每月',
|
|
|
|
|
|
noLimits: '未配置限额',
|
2025-12-31 20:46:54 +08:00
|
|
|
|
unlimited: '无限制',
|
2025-12-23 10:14:41 +08:00
|
|
|
|
resetNow: '即将重置',
|
2025-12-23 10:38:15 +08:00
|
|
|
|
windowNotActive: '窗口未激活',
|
2025-12-23 10:14:41 +08:00
|
|
|
|
resetInMinutes: '{minutes} 分钟后重置',
|
|
|
|
|
|
resetInHoursMinutes: '{hours} 小时 {minutes} 分钟后重置',
|
|
|
|
|
|
resetInDaysHours: '{days} 天 {hours} 小时后重置',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
daysRemaining: '天剩余',
|
|
|
|
|
|
noExpiration: '无过期时间',
|
|
|
|
|
|
status: {
|
|
|
|
|
|
active: '生效中',
|
|
|
|
|
|
expired: '已过期',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
revoked: '已撤销'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
columns: {
|
|
|
|
|
|
user: '用户',
|
|
|
|
|
|
group: '分组',
|
|
|
|
|
|
usage: '用量',
|
|
|
|
|
|
expires: '到期时间',
|
|
|
|
|
|
status: '状态',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
actions: '操作'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
form: {
|
|
|
|
|
|
user: '用户',
|
|
|
|
|
|
group: '订阅分组',
|
|
|
|
|
|
validityDays: '有效期(天)',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
extendDays: '延长天数'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
selectUser: '选择用户',
|
|
|
|
|
|
selectGroup: '选择订阅分组',
|
|
|
|
|
|
groupHint: '仅显示订阅计费类型的分组',
|
|
|
|
|
|
validityHint: '订阅的有效天数',
|
|
|
|
|
|
extendingFor: '为以下用户延长订阅',
|
|
|
|
|
|
currentExpiration: '当前到期时间',
|
|
|
|
|
|
assign: '分配',
|
|
|
|
|
|
assigning: '分配中...',
|
|
|
|
|
|
extend: '延长',
|
|
|
|
|
|
extending: '延长中...',
|
|
|
|
|
|
revoke: '撤销',
|
|
|
|
|
|
noSubscriptionsYet: '暂无订阅',
|
|
|
|
|
|
assignFirstSubscription: '分配一个订阅以开始使用。',
|
|
|
|
|
|
subscriptionAssigned: '订阅分配成功',
|
|
|
|
|
|
subscriptionExtended: '订阅延长成功',
|
|
|
|
|
|
subscriptionRevoked: '订阅撤销成功',
|
|
|
|
|
|
failedToLoad: '加载订阅列表失败',
|
|
|
|
|
|
failedToAssign: '分配订阅失败',
|
|
|
|
|
|
failedToExtend: '延长订阅失败',
|
|
|
|
|
|
failedToRevoke: '撤销订阅失败',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
revokeConfirm: "确定要撤销 '{user}' 的订阅吗?此操作无法撤销。"
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Accounts Management
|
|
|
|
|
|
accounts: {
|
|
|
|
|
|
title: '账号管理',
|
|
|
|
|
|
description: '管理 AI 平台账号和 Cookie',
|
|
|
|
|
|
createAccount: '添加账号',
|
2025-12-24 08:48:58 -08:00
|
|
|
|
syncFromCrs: '从 CRS 同步',
|
|
|
|
|
|
syncFromCrsTitle: '从 CRS 同步账号',
|
2025-12-24 18:07:58 -08:00
|
|
|
|
syncFromCrsDesc:
|
|
|
|
|
|
'将 claude-relay-service(CRS)中的账号同步到当前系统(不会在浏览器侧直接请求 CRS)。',
|
2025-12-25 10:57:04 +08:00
|
|
|
|
crsVersionRequirement: '⚠️ 注意:CRS 版本必须 ≥ v1.1.240 才支持此功能',
|
2025-12-24 08:48:58 -08:00
|
|
|
|
crsBaseUrl: 'CRS 服务地址',
|
|
|
|
|
|
crsBaseUrlPlaceholder: '例如:http://127.0.0.1:3000',
|
|
|
|
|
|
crsUsername: '用户名',
|
|
|
|
|
|
crsPassword: '密码',
|
|
|
|
|
|
syncProxies: '同时同步代理(按 host/port/账号匹配或自动创建)',
|
|
|
|
|
|
syncNow: '开始同步',
|
|
|
|
|
|
syncing: '同步中...',
|
|
|
|
|
|
syncMissingFields: '请填写服务地址、用户名和密码',
|
|
|
|
|
|
syncResult: '同步结果',
|
|
|
|
|
|
syncResultSummary: '创建 {created},更新 {updated},跳过 {skipped},失败 {failed}',
|
|
|
|
|
|
syncErrors: '错误/跳过详情',
|
|
|
|
|
|
syncCompleted: '同步完成:创建 {created},更新 {updated}',
|
|
|
|
|
|
syncCompletedWithErrors: '同步完成但有错误:失败 {failed}(创建 {created},更新 {updated})',
|
|
|
|
|
|
syncFailed: '同步失败',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
editAccount: '编辑账号',
|
|
|
|
|
|
deleteAccount: '删除账号',
|
|
|
|
|
|
deleteConfirmMessage: "确定要删除账号 '{name}' 吗?",
|
|
|
|
|
|
refreshCookie: '刷新 Cookie',
|
|
|
|
|
|
testAccount: '测试账号',
|
2025-12-27 16:04:35 +08:00
|
|
|
|
searchAccounts: '搜索账号...',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
// Filter options
|
|
|
|
|
|
allPlatforms: '全部平台',
|
|
|
|
|
|
allTypes: '全部类型',
|
|
|
|
|
|
allStatus: '全部状态',
|
|
|
|
|
|
oauthType: 'OAuth',
|
|
|
|
|
|
// Schedulable toggle
|
|
|
|
|
|
schedulable: '参与调度',
|
|
|
|
|
|
schedulableHint: '开启后账号参与API请求调度',
|
|
|
|
|
|
schedulableEnabled: '调度已开启',
|
|
|
|
|
|
schedulableDisabled: '调度已关闭',
|
|
|
|
|
|
failedToToggleSchedulable: '切换调度状态失败',
|
|
|
|
|
|
columns: {
|
|
|
|
|
|
name: '名称',
|
2025-12-24 15:44:45 +08:00
|
|
|
|
platformType: '平台/类型',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
platform: '平台',
|
|
|
|
|
|
type: '类型',
|
2025-12-24 15:44:45 +08:00
|
|
|
|
concurrencyStatus: '并发',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
priority: '优先级',
|
|
|
|
|
|
weight: '权重',
|
|
|
|
|
|
status: '状态',
|
|
|
|
|
|
schedulable: '调度',
|
2025-12-23 11:20:02 +08:00
|
|
|
|
todayStats: '今日统计',
|
|
|
|
|
|
groups: '分组',
|
|
|
|
|
|
usageWindows: '用量窗口',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
lastUsed: '最近使用',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
actions: '操作'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
2025-12-27 16:04:35 +08:00
|
|
|
|
clearRateLimit: '清除速率限制',
|
|
|
|
|
|
testConnection: '测试连接',
|
|
|
|
|
|
reAuthorize: '重新授权',
|
|
|
|
|
|
refreshToken: '刷新令牌',
|
|
|
|
|
|
noAccountsYet: '暂无账号',
|
|
|
|
|
|
createFirstAccount: '添加 AI 平台账号以开始使用 API 网关。',
|
|
|
|
|
|
tokenRefreshed: 'Token 刷新成功',
|
|
|
|
|
|
accountDeleted: '账号删除成功',
|
|
|
|
|
|
rateLimitCleared: '速率限制已清除',
|
|
|
|
|
|
setupToken: 'Setup Token',
|
|
|
|
|
|
apiKey: 'API Key',
|
|
|
|
|
|
deleteConfirm: "确定要删除账号 '{name}' 吗?此操作无法撤销。",
|
|
|
|
|
|
failedToClearRateLimit: '清除速率限制失败',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
platforms: {
|
|
|
|
|
|
claude: 'Claude',
|
|
|
|
|
|
openai: 'OpenAI',
|
|
|
|
|
|
anthropic: 'Anthropic',
|
2025-12-28 15:54:42 +08:00
|
|
|
|
gemini: 'Gemini',
|
|
|
|
|
|
antigravity: 'Antigravity'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
types: {
|
|
|
|
|
|
oauth: 'OAuth',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
chatgptOauth: 'ChatGPT OAuth',
|
|
|
|
|
|
responsesApi: 'Responses API',
|
|
|
|
|
|
googleOauth: 'Google OAuth',
|
|
|
|
|
|
codeAssist: 'Code Assist',
|
2025-12-28 15:54:42 +08:00
|
|
|
|
antigravityOauth: 'Antigravity OAuth',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
api_key: 'API Key',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
cookie: 'Cookie'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
statuses: {
|
|
|
|
|
|
active: '正常',
|
|
|
|
|
|
inactive: '停用',
|
|
|
|
|
|
error: '错误',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
cooldown: '冷却中'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
2026-01-03 06:35:50 -08:00
|
|
|
|
status: {
|
|
|
|
|
|
paused: '已暂停',
|
|
|
|
|
|
limited: '受限',
|
|
|
|
|
|
tempUnschedulable: '临时不可调度'
|
|
|
|
|
|
},
|
|
|
|
|
|
tempUnschedulable: {
|
|
|
|
|
|
title: '临时不可调度',
|
|
|
|
|
|
statusTitle: '临时不可调度状态',
|
|
|
|
|
|
hint: '当错误码与关键词同时匹配时,账号会在指定时间内被临时禁用。',
|
|
|
|
|
|
notice: '规则按顺序匹配,需同时满足错误码与关键词。',
|
|
|
|
|
|
addRule: '添加规则',
|
|
|
|
|
|
ruleOrder: '规则序号',
|
|
|
|
|
|
ruleIndex: '规则 #{index}',
|
|
|
|
|
|
errorCode: '错误码',
|
|
|
|
|
|
errorCodePlaceholder: '例如 429',
|
|
|
|
|
|
durationMinutes: '持续时间(分钟)',
|
|
|
|
|
|
durationPlaceholder: '例如 30',
|
|
|
|
|
|
keywords: '关键词',
|
|
|
|
|
|
keywordsPlaceholder: '例如 overloaded, too many requests',
|
|
|
|
|
|
keywordsHint: '多个关键词用逗号分隔,匹配时必须命中其中之一。',
|
|
|
|
|
|
description: '描述',
|
|
|
|
|
|
descriptionPlaceholder: '可选,便于记忆规则用途',
|
|
|
|
|
|
rulesInvalid: '请至少填写一条包含错误码、关键词和时长的规则。',
|
|
|
|
|
|
viewDetails: '查看临时不可调度详情',
|
|
|
|
|
|
accountName: '账号',
|
|
|
|
|
|
triggeredAt: '触发时间',
|
|
|
|
|
|
until: '解除时间',
|
|
|
|
|
|
remaining: '剩余时间',
|
|
|
|
|
|
matchedKeyword: '匹配关键词',
|
|
|
|
|
|
errorMessage: '错误详情',
|
|
|
|
|
|
reset: '重置状态',
|
|
|
|
|
|
resetSuccess: '临时不可调度已重置',
|
|
|
|
|
|
resetFailed: '重置临时不可调度失败',
|
|
|
|
|
|
failedToLoad: '加载临时不可调度状态失败',
|
|
|
|
|
|
notActive: '当前账号未处于临时不可调度状态。',
|
|
|
|
|
|
expired: '已到期',
|
|
|
|
|
|
remainingMinutes: '约 {minutes} 分钟',
|
|
|
|
|
|
remainingHours: '约 {hours} 小时',
|
|
|
|
|
|
remainingHoursMinutes: '约 {hours} 小时 {minutes} 分钟',
|
|
|
|
|
|
presets: {
|
|
|
|
|
|
overloadLabel: '529 过载',
|
|
|
|
|
|
overloadDesc: '服务过载 - 暂停 60 分钟',
|
|
|
|
|
|
rateLimitLabel: '429 限流',
|
|
|
|
|
|
rateLimitDesc: '触发限流 - 暂停 10 分钟',
|
|
|
|
|
|
unavailableLabel: '503 维护',
|
|
|
|
|
|
unavailableDesc: '服务不可用 - 暂停 30 分钟'
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
2025-12-27 10:50:25 +08:00
|
|
|
|
usageWindow: {
|
2025-12-28 22:29:01 +08:00
|
|
|
|
statsTitle: '5小时窗口用量统计',
|
2026-01-01 04:22:50 +08:00
|
|
|
|
statsTitleDaily: '每日用量统计',
|
2026-01-01 08:29:57 +08:00
|
|
|
|
geminiProDaily: 'Pro',
|
|
|
|
|
|
geminiFlashDaily: 'Flash',
|
2025-12-28 22:29:01 +08:00
|
|
|
|
gemini3Pro: 'G3P',
|
|
|
|
|
|
gemini3Flash: 'G3F',
|
|
|
|
|
|
gemini3Image: 'G3I',
|
|
|
|
|
|
claude45: 'C4.5'
|
2025-12-27 10:50:25 +08:00
|
|
|
|
},
|
2025-12-29 01:25:09 +08:00
|
|
|
|
tier: {
|
|
|
|
|
|
free: 'Free',
|
|
|
|
|
|
pro: 'Pro',
|
feat(gemini): 添加 Google One 存储空间推断 Tier 功能
## 功能概述
通过 Google Drive API 获取存储空间配额来推断 Google One 订阅等级,并优化统一的配额显示系统。
## 后端改动
- 新增 Drive API 客户端 (drive_client.go)
- 支持代理和指数退避重试
- 处理 403/429 错误
- 添加 Tier 推断逻辑 (inferGoogleOneTier)
- 支持 6 种 tier 类型:AI_PREMIUM, GOOGLE_ONE_STANDARD, GOOGLE_ONE_BASIC, FREE, GOOGLE_ONE_UNKNOWN, GOOGLE_ONE_UNLIMITED
- 集成到 OAuth 流程
- ExchangeCode: 授权时自动获取 tier
- RefreshAccountToken: Token 刷新时更新 tier (24小时缓存)
- 新增管理 API 端点
- POST /api/v1/admin/accounts/:id/refresh-tier (单个账号刷新)
- POST /api/v1/admin/accounts/batch-refresh-tier (批量刷新)
## 前端改动
- 更新 AccountQuotaInfo.vue
- 添加 Google One tier 标签映射
- 添加 tier 颜色样式 (紫色/蓝色/绿色/灰色/琥珀色)
- 更新 AccountUsageCell.vue
- 添加 Google One tier 显示逻辑
- 根据 oauth_type 区分显示方式
- 添加国际化翻译 (en.ts, zh.ts)
- aiPremium, standard, basic, free, personal, unlimited
## Tier 推断规则
- >= 2TB: AI Premium
- >= 200GB: Google One Standard
- >= 100GB: Google One Basic
- >= 15GB: Free
- > 100TB: Unlimited (G Suite legacy)
- 其他/失败: Unknown (显示为 Personal)
## 优雅降级
- Drive API 失败时使用 GOOGLE_ONE_UNKNOWN
- 不阻断 OAuth 流程
- 24小时缓存避免频繁调用
## 测试
- ✅ 后端编译成功
- ✅ 前端构建成功
- ✅ 所有代码符合现有规范
2025-12-31 21:45:24 -08:00
|
|
|
|
ultra: 'Ultra',
|
|
|
|
|
|
aiPremium: 'AI Premium',
|
|
|
|
|
|
standard: '标准版',
|
|
|
|
|
|
basic: '基础版',
|
|
|
|
|
|
personal: '个人版',
|
|
|
|
|
|
unlimited: '无限制'
|
2025-12-27 10:50:25 +08:00
|
|
|
|
},
|
2025-12-31 00:34:24 +08:00
|
|
|
|
ineligibleWarning:
|
|
|
|
|
|
'该账号无 Antigravity 使用权限,但仍能进行 API 转发。继续使用请自行承担风险。',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
form: {
|
|
|
|
|
|
nameLabel: '账号名称',
|
|
|
|
|
|
namePlaceholder: '请输入账号名称',
|
|
|
|
|
|
platformLabel: '平台',
|
|
|
|
|
|
selectPlatform: '选择平台',
|
|
|
|
|
|
typeLabel: '类型',
|
|
|
|
|
|
selectType: '选择类型',
|
|
|
|
|
|
credentialsLabel: '凭证',
|
|
|
|
|
|
credentialsPlaceholder: '请输入 Cookie 或 API Key',
|
|
|
|
|
|
priorityLabel: '优先级',
|
|
|
|
|
|
priorityHint: '数值越高优先级越高',
|
|
|
|
|
|
weightLabel: '权重',
|
|
|
|
|
|
weightHint: '用于负载均衡的权重值',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
statusLabel: '状态'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
filters: {
|
|
|
|
|
|
platform: '平台',
|
|
|
|
|
|
allPlatforms: '全部平台',
|
|
|
|
|
|
type: '类型',
|
|
|
|
|
|
allTypes: '全部类型',
|
|
|
|
|
|
status: '状态',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
allStatuses: '全部状态'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
saving: '保存中...',
|
|
|
|
|
|
refreshing: '刷新中...',
|
|
|
|
|
|
testing: '测试中...',
|
|
|
|
|
|
noAccounts: '暂无账号',
|
|
|
|
|
|
noAccountsDescription: '添加 AI 平台账号以开始使用 API 网关。',
|
|
|
|
|
|
accountCreatedSuccess: '账号添加成功',
|
|
|
|
|
|
accountUpdatedSuccess: '账号更新成功',
|
|
|
|
|
|
accountDeletedSuccess: '账号删除成功',
|
2025-12-24 16:56:48 -08:00
|
|
|
|
bulkActions: {
|
|
|
|
|
|
selected: '已选择 {count} 个账号',
|
|
|
|
|
|
selectCurrentPage: '本页全选',
|
|
|
|
|
|
clear: '清除选择',
|
|
|
|
|
|
edit: '批量编辑账号',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
delete: '批量删除'
|
2025-12-24 16:56:48 -08:00
|
|
|
|
},
|
|
|
|
|
|
bulkEdit: {
|
|
|
|
|
|
title: '批量编辑账号',
|
|
|
|
|
|
selectionInfo: '已选择 {count} 个账号。只更新您勾选或填写的字段,未勾选的字段保持不变。',
|
|
|
|
|
|
baseUrlPlaceholder: 'https://api.anthropic.com 或 https://api.openai.com',
|
2025-12-24 17:16:19 -08:00
|
|
|
|
baseUrlNotice: '仅适用于 API Key 账号,留空则不修改',
|
2025-12-24 16:56:48 -08:00
|
|
|
|
submit: '批量更新',
|
|
|
|
|
|
updating: '更新中...',
|
|
|
|
|
|
success: '成功更新 {count} 个账号',
|
|
|
|
|
|
partialSuccess: '部分更新成功:成功 {success} 个,失败 {failed} 个',
|
|
|
|
|
|
failed: '批量更新失败',
|
|
|
|
|
|
noSelection: '请选择要编辑的账号',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
noFieldsSelected: '请至少选择一个要更新的字段'
|
2025-12-24 16:56:48 -08:00
|
|
|
|
},
|
|
|
|
|
|
bulkDeleteTitle: '批量删除账号',
|
|
|
|
|
|
bulkDeleteConfirm: '确定要删除选中的 {count} 个账号吗?此操作无法撤销。',
|
|
|
|
|
|
bulkDeleteSuccess: '成功删除 {count} 个账号',
|
|
|
|
|
|
bulkDeletePartial: '部分删除成功:成功 {success} 个,失败 {failed} 个',
|
|
|
|
|
|
bulkDeleteFailed: '批量删除失败',
|
2025-12-23 10:01:58 +08:00
|
|
|
|
resetStatus: '重置状态',
|
|
|
|
|
|
statusReset: '账号状态已重置',
|
|
|
|
|
|
failedToResetStatus: '重置账号状态失败',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
cookieRefreshedSuccess: 'Cookie 刷新成功',
|
|
|
|
|
|
testSuccess: '账号测试通过',
|
|
|
|
|
|
testFailed: '账号测试失败',
|
|
|
|
|
|
failedToLoad: '加载账号列表失败',
|
|
|
|
|
|
failedToSave: '保存账号失败',
|
|
|
|
|
|
failedToDelete: '删除账号失败',
|
|
|
|
|
|
failedToRefresh: '刷新 Cookie 失败',
|
|
|
|
|
|
// Create/Edit Account Modal
|
2025-12-22 22:58:31 +08:00
|
|
|
|
platform: '平台',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
accountName: '账号名称',
|
|
|
|
|
|
enterAccountName: '请输入账号名称',
|
|
|
|
|
|
accountType: '账号类型',
|
|
|
|
|
|
claudeCode: 'Claude Code',
|
|
|
|
|
|
claudeConsole: 'Claude Console',
|
|
|
|
|
|
oauthSetupToken: 'OAuth / Setup Token',
|
|
|
|
|
|
addMethod: '添加方式',
|
|
|
|
|
|
setupTokenLongLived: 'Setup Token(长期有效)',
|
|
|
|
|
|
baseUrl: 'Base URL',
|
|
|
|
|
|
baseUrlHint: '留空使用官方 Anthropic API',
|
|
|
|
|
|
apiKeyRequired: 'API Key *',
|
|
|
|
|
|
apiKeyPlaceholder: 'sk-ant-api03-...',
|
|
|
|
|
|
apiKeyHint: '您的 Claude Console API Key',
|
2025-12-28 23:24:46 +08:00
|
|
|
|
// OpenAI specific hints
|
|
|
|
|
|
openai: {
|
|
|
|
|
|
baseUrlHint: '留空使用官方 OpenAI API',
|
|
|
|
|
|
apiKeyHint: '您的 OpenAI API Key'
|
|
|
|
|
|
},
|
2025-12-18 13:50:39 +08:00
|
|
|
|
modelRestriction: '模型限制(可选)',
|
|
|
|
|
|
modelWhitelist: '模型白名单',
|
|
|
|
|
|
modelMapping: '模型映射',
|
|
|
|
|
|
selectAllowedModels: '选择允许的模型。留空则支持所有模型。',
|
|
|
|
|
|
mapRequestModels: '将请求模型映射到实际模型。左边是请求的模型,右边是发送到 API 的实际模型。',
|
|
|
|
|
|
selectedModels: '已选择 {count} 个模型',
|
|
|
|
|
|
supportsAllModels: '(支持所有模型)',
|
|
|
|
|
|
requestModel: '请求模型',
|
|
|
|
|
|
actualModel: '实际模型',
|
|
|
|
|
|
addMapping: '添加映射',
|
|
|
|
|
|
mappingExists: '模型 {model} 的映射已存在',
|
2026-01-01 16:03:48 +08:00
|
|
|
|
searchModels: '搜索模型...',
|
|
|
|
|
|
noMatchingModels: '没有匹配的模型',
|
|
|
|
|
|
fillRelatedModels: '填入相关模型',
|
|
|
|
|
|
clearAllModels: '清除所有模型',
|
|
|
|
|
|
customModelName: '自定义模型名称',
|
|
|
|
|
|
enterCustomModelName: '输入自定义模型名称',
|
|
|
|
|
|
addModel: '填入',
|
|
|
|
|
|
modelExists: '该模型已存在',
|
|
|
|
|
|
modelCount: '{count} 个模型',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
customErrorCodes: '自定义错误码',
|
|
|
|
|
|
customErrorCodesHint: '仅对选中的错误码停止调度',
|
|
|
|
|
|
customErrorCodesWarning: '仅选中的错误码会停止调度,其他错误将返回 500。',
|
|
|
|
|
|
selectedErrorCodes: '已选择',
|
|
|
|
|
|
noneSelectedUsesDefault: '未选择(使用默认策略)',
|
|
|
|
|
|
enterErrorCode: '输入错误码 (100-599)',
|
|
|
|
|
|
invalidErrorCode: '请输入有效的 HTTP 错误码 (100-599)',
|
|
|
|
|
|
errorCodeExists: '该错误码已被选中',
|
2025-12-19 16:39:25 +08:00
|
|
|
|
interceptWarmupRequests: '拦截预热请求',
|
|
|
|
|
|
interceptWarmupRequestsDesc: '启用后,标题生成等预热请求将返回 mock 响应,不消耗上游 token',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
proxy: '代理',
|
|
|
|
|
|
noProxy: '无代理',
|
|
|
|
|
|
concurrency: '并发数',
|
|
|
|
|
|
priority: '优先级',
|
|
|
|
|
|
priorityHint: '优先级越高的账号优先使用',
|
|
|
|
|
|
higherPriorityFirst: '数值越高优先级越高',
|
2026-01-03 06:35:50 -08:00
|
|
|
|
mixedScheduling: '在 /v1/messages 中使用',
|
2025-12-29 09:44:39 +08:00
|
|
|
|
mixedSchedulingHint: '启用后可参与 Anthropic/Gemini 分组的调度',
|
|
|
|
|
|
mixedSchedulingTooltip:
|
2026-01-03 06:35:50 -08:00
|
|
|
|
'!!注意!! Antigravity Claude 和 Anthropic Claude 无法在同个上下文中使用,如果你同时有 Anthropic 账号和 Antigravity 账号,开启此选项会导致经常 400 报错。开启后,请用分组功能做好 Antigravity 账号和 Anthropic 账号的隔离。一定要弄明白再开启!!',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
creating: '创建中...',
|
|
|
|
|
|
updating: '更新中...',
|
|
|
|
|
|
accountCreated: '账号创建成功',
|
|
|
|
|
|
accountUpdated: '账号更新成功',
|
|
|
|
|
|
failedToCreate: '创建账号失败',
|
|
|
|
|
|
failedToUpdate: '更新账号失败',
|
|
|
|
|
|
pleaseEnterAccountName: '请输入账号名称',
|
|
|
|
|
|
pleaseEnterApiKey: '请输入 API Key',
|
|
|
|
|
|
apiKeyIsRequired: 'API Key 是必需的',
|
|
|
|
|
|
leaveEmptyToKeep: '留空以保持当前密钥',
|
|
|
|
|
|
// OAuth flow
|
|
|
|
|
|
oauth: {
|
|
|
|
|
|
title: 'Claude 账号授权',
|
|
|
|
|
|
authMethod: '授权方式',
|
|
|
|
|
|
manualAuth: '手动授权',
|
|
|
|
|
|
cookieAutoAuth: 'Cookie 自动授权',
|
|
|
|
|
|
cookieAutoAuthDesc: '使用 claude.ai sessionKey 自动完成 OAuth 授权,无需手动打开浏览器。',
|
|
|
|
|
|
sessionKey: 'sessionKey',
|
|
|
|
|
|
keysCount: '{count} 个密钥',
|
|
|
|
|
|
batchCreateAccounts: '将批量创建 {count} 个账号',
|
2025-12-24 18:07:58 -08:00
|
|
|
|
sessionKeyPlaceholder:
|
|
|
|
|
|
'每行一个 sessionKey,例如:\nsk-ant-sid01-xxxxx...\nsk-ant-sid01-yyyyy...',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
sessionKeyPlaceholderSingle: 'sk-ant-sid01-xxxxx...',
|
|
|
|
|
|
howToGetSessionKey: '如何获取 sessionKey',
|
|
|
|
|
|
step1: '在浏览器中登录 <strong>claude.ai</strong>',
|
|
|
|
|
|
step2: '按 <kbd>F12</kbd> 打开开发者工具',
|
|
|
|
|
|
step3: '切换到 <strong>Application</strong> 标签',
|
|
|
|
|
|
step4: '找到 <strong>Cookies</strong> → <strong>https://claude.ai</strong>',
|
|
|
|
|
|
step5: '找到 <strong>sessionKey</strong> 所在行',
|
|
|
|
|
|
step6: '复制 <strong>Value</strong> 列的值',
|
|
|
|
|
|
sessionKeyFormat: 'sessionKey 通常以 <code>sk-ant-sid01-</code> 开头',
|
|
|
|
|
|
startAutoAuth: '开始自动授权',
|
|
|
|
|
|
authorizing: '授权中...',
|
|
|
|
|
|
followSteps: '按照以下步骤授权您的 Claude 账号:',
|
|
|
|
|
|
step1GenerateUrl: '点击下方按钮生成授权 URL',
|
|
|
|
|
|
generateAuthUrl: '生成授权 URL',
|
|
|
|
|
|
generating: '生成中...',
|
|
|
|
|
|
regenerate: '重新生成',
|
|
|
|
|
|
step2OpenUrl: '在浏览器中打开 URL 并完成授权',
|
|
|
|
|
|
openUrlDesc: '在新标签页中打开授权 URL,登录您的 Claude 账号并授权。',
|
2025-12-24 18:07:58 -08:00
|
|
|
|
proxyWarning:
|
|
|
|
|
|
'<strong>注意:</strong>如果您配置了代理,请确保浏览器使用相同的代理访问授权页面。',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
step3EnterCode: '输入授权码',
|
|
|
|
|
|
authCodeDesc: '授权完成后,页面会显示一个 <strong>授权码</strong>。复制并粘贴到下方:',
|
|
|
|
|
|
authCode: '授权码',
|
|
|
|
|
|
authCodePlaceholder: '粘贴 Claude 页面的授权码...',
|
|
|
|
|
|
authCodeHint: '粘贴从 Claude 页面复制的授权码',
|
|
|
|
|
|
completeAuth: '完成授权',
|
|
|
|
|
|
verifying: '验证中...',
|
|
|
|
|
|
pleaseEnterSessionKey: '请输入至少一个有效的 sessionKey',
|
|
|
|
|
|
authFailed: '授权失败',
|
|
|
|
|
|
cookieAuthFailed: 'Cookie 授权失败',
|
|
|
|
|
|
keyAuthFailed: '密钥 {index}: {error}',
|
|
|
|
|
|
successCreated: '成功创建 {count} 个账号',
|
2025-12-22 22:58:31 +08:00
|
|
|
|
// OpenAI specific
|
|
|
|
|
|
openai: {
|
|
|
|
|
|
title: 'OpenAI 账户授权',
|
|
|
|
|
|
followSteps: '请按照以下步骤完成 OpenAI 账户的授权:',
|
|
|
|
|
|
step1GenerateUrl: '点击下方按钮生成授权链接',
|
|
|
|
|
|
generateAuthUrl: '生成授权链接',
|
|
|
|
|
|
step2OpenUrl: '在浏览器中打开链接并完成授权',
|
|
|
|
|
|
openUrlDesc: '请在新标签页中打开授权链接,登录您的 OpenAI 账户并授权。',
|
2025-12-24 18:07:58 -08:00
|
|
|
|
importantNotice:
|
|
|
|
|
|
'<strong>重要提示:</strong>授权后页面可能会加载较长时间,请耐心等待。当浏览器地址栏变为 <code>http://localhost...</code> 开头时,表示授权已完成。',
|
2025-12-22 22:58:31 +08:00
|
|
|
|
step3EnterCode: '输入授权链接或 Code',
|
2025-12-24 18:07:58 -08:00
|
|
|
|
authCodeDesc:
|
|
|
|
|
|
'授权完成后,当页面地址变为 <code>http://localhost:xxx/auth/callback?code=...</code> 时:',
|
2025-12-22 22:58:31 +08:00
|
|
|
|
authCode: '授权链接或 Code',
|
2025-12-24 18:07:58 -08:00
|
|
|
|
authCodePlaceholder:
|
|
|
|
|
|
'方式1:复制完整的链接\n(http://localhost:xxx/auth/callback?code=...)\n方式2:仅复制 code 参数的值',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
authCodeHint: '您可以直接复制整个链接或仅复制 code 参数值,系统会自动识别'
|
2025-12-22 22:58:31 +08:00
|
|
|
|
},
|
2025-12-25 08:40:35 -08:00
|
|
|
|
// Gemini specific
|
2025-12-25 21:25:08 -08:00
|
|
|
|
gemini: {
|
|
|
|
|
|
title: 'Gemini 账户授权',
|
|
|
|
|
|
followSteps: '请按照以下步骤完成 Gemini 账户的授权:',
|
|
|
|
|
|
step1GenerateUrl: '生成授权链接',
|
|
|
|
|
|
generateAuthUrl: '生成授权链接',
|
|
|
|
|
|
projectIdLabel: 'Project ID(可选)',
|
|
|
|
|
|
projectIdPlaceholder: '例如:my-gcp-project 或 cloud-ai-companion-xxxxx',
|
|
|
|
|
|
projectIdHint: '留空则在兑换授权码后自动探测;若自动探测失败,可填写后重新生成授权链接再授权。',
|
|
|
|
|
|
howToGetProjectId: '如何获取',
|
|
|
|
|
|
step2OpenUrl: '在浏览器中打开链接并完成授权',
|
|
|
|
|
|
openUrlDesc: '请在新标签页中打开授权链接,登录您的 Google 账户并授权。',
|
|
|
|
|
|
step3EnterCode: '输入回调链接或 Code',
|
|
|
|
|
|
authCodeDesc: '授权完成后,复制浏览器跳转后的回调链接(推荐)或仅复制 <code>code</code>,粘贴到下方即可。',
|
|
|
|
|
|
authCode: '回调链接或 Code',
|
|
|
|
|
|
authCodePlaceholder: '方式1(推荐):粘贴回调链接\n方式2:仅粘贴 code 参数的值',
|
|
|
|
|
|
authCodeHint: '系统会自动从链接中解析 code/state。',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
redirectUri: 'Redirect URI',
|
|
|
|
|
|
redirectUriHint: '需要在 Google OAuth Client 中配置,且必须与此处完全一致。',
|
|
|
|
|
|
confirmRedirectUri: '我已在 Google OAuth Client 中配置了该 Redirect URI(必须完全一致)',
|
|
|
|
|
|
invalidRedirectUri: 'Redirect URI 必须是合法的 http(s) URL',
|
2025-12-25 21:25:08 -08:00
|
|
|
|
redirectUriNotConfirmed: '请确认 Redirect URI 已在 Google OAuth Client 中正确配置',
|
|
|
|
|
|
missingRedirectUri: '缺少 Redirect URI',
|
|
|
|
|
|
failedToGenerateUrl: '生成 Gemini 授权链接失败',
|
|
|
|
|
|
missingExchangeParams: '缺少 code / session_id / state',
|
|
|
|
|
|
failedToExchangeCode: 'Gemini 授权码兑换失败',
|
feat(gemini): 添加 Google One 存储空间推断 Tier 功能
## 功能概述
通过 Google Drive API 获取存储空间配额来推断 Google One 订阅等级,并优化统一的配额显示系统。
## 后端改动
- 新增 Drive API 客户端 (drive_client.go)
- 支持代理和指数退避重试
- 处理 403/429 错误
- 添加 Tier 推断逻辑 (inferGoogleOneTier)
- 支持 6 种 tier 类型:AI_PREMIUM, GOOGLE_ONE_STANDARD, GOOGLE_ONE_BASIC, FREE, GOOGLE_ONE_UNKNOWN, GOOGLE_ONE_UNLIMITED
- 集成到 OAuth 流程
- ExchangeCode: 授权时自动获取 tier
- RefreshAccountToken: Token 刷新时更新 tier (24小时缓存)
- 新增管理 API 端点
- POST /api/v1/admin/accounts/:id/refresh-tier (单个账号刷新)
- POST /api/v1/admin/accounts/batch-refresh-tier (批量刷新)
## 前端改动
- 更新 AccountQuotaInfo.vue
- 添加 Google One tier 标签映射
- 添加 tier 颜色样式 (紫色/蓝色/绿色/灰色/琥珀色)
- 更新 AccountUsageCell.vue
- 添加 Google One tier 显示逻辑
- 根据 oauth_type 区分显示方式
- 添加国际化翻译 (en.ts, zh.ts)
- aiPremium, standard, basic, free, personal, unlimited
## Tier 推断规则
- >= 2TB: AI Premium
- >= 200GB: Google One Standard
- >= 100GB: Google One Basic
- >= 15GB: Free
- > 100TB: Unlimited (G Suite legacy)
- 其他/失败: Unknown (显示为 Personal)
## 优雅降级
- Drive API 失败时使用 GOOGLE_ONE_UNKNOWN
- 不阻断 OAuth 流程
- 24小时缓存避免频繁调用
## 测试
- ✅ 后端编译成功
- ✅ 前端构建成功
- ✅ 所有代码符合现有规范
2025-12-31 21:45:24 -08:00
|
|
|
|
missingProjectId: 'GCP Project ID 获取失败:您的 Google 账号未关联有效的 GCP 项目。请前往 Google Cloud Console 激活 GCP 并绑定信用卡,或在授权时手动填写 Project ID。',
|
2025-12-25 21:25:08 -08:00
|
|
|
|
modelPassthrough: 'Gemini 直接转发模型',
|
|
|
|
|
|
modelPassthroughDesc: '所有模型请求将直接转发至 Gemini API,不进行模型限制或映射。',
|
|
|
|
|
|
stateWarningTitle: '提示',
|
|
|
|
|
|
stateWarningDesc: '建议粘贴完整回调链接(包含 code 和 state)。',
|
|
|
|
|
|
oauthTypeLabel: 'OAuth 类型',
|
2026-01-01 04:22:50 +08:00
|
|
|
|
needsProjectId: '内置授权(Code Assist)',
|
|
|
|
|
|
needsProjectIdDesc: '需要 GCP 项目与 Project ID',
|
|
|
|
|
|
noProjectIdNeeded: '自定义授权(AI Studio)',
|
|
|
|
|
|
noProjectIdNeededDesc: '需管理员配置 OAuth Client',
|
2025-12-25 23:53:22 -08:00
|
|
|
|
aiStudioNotConfiguredShort: '未配置',
|
|
|
|
|
|
aiStudioNotConfiguredTip: 'AI Studio OAuth 未配置:请先设置 GEMINI_OAUTH_CLIENT_ID / GEMINI_OAUTH_CLIENT_SECRET,并在 Google OAuth Client 添加 Redirect URI:http://localhost:1455/auth/callback(Consent Screen scopes 需包含 https://www.googleapis.com/auth/generative-language.retriever)',
|
|
|
|
|
|
aiStudioNotConfigured: 'AI Studio OAuth 未配置:请先设置 GEMINI_OAUTH_CLIENT_ID / GEMINI_OAUTH_CLIENT_SECRET,并在 Google OAuth Client 添加 Redirect URI:http://localhost:1455/auth/callback'
|
2025-12-28 15:54:42 +08:00
|
|
|
|
},
|
|
|
|
|
|
// Antigravity specific
|
|
|
|
|
|
antigravity: {
|
|
|
|
|
|
title: 'Antigravity 账户授权',
|
|
|
|
|
|
followSteps: '请按照以下步骤完成 Antigravity 账户的授权:',
|
|
|
|
|
|
step1GenerateUrl: '生成授权链接',
|
|
|
|
|
|
generateAuthUrl: '生成授权链接',
|
|
|
|
|
|
step2OpenUrl: '在浏览器中打开链接并完成授权',
|
|
|
|
|
|
openUrlDesc: '请在新标签页中打开授权链接,登录您的 Google 账户并授权。',
|
|
|
|
|
|
importantNotice:
|
|
|
|
|
|
'<strong>重要提示:</strong>授权后页面可能会加载较长时间,请耐心等待。当浏览器地址栏变为 <code>http://localhost...</code> 开头时,表示授权已完成。',
|
|
|
|
|
|
step3EnterCode: '输入授权链接或 Code',
|
|
|
|
|
|
authCodeDesc:
|
|
|
|
|
|
'授权完成后,当页面地址变为 <code>http://localhost:xxx/auth/callback?code=...</code> 时:',
|
|
|
|
|
|
authCode: '授权链接或 Code',
|
|
|
|
|
|
authCodePlaceholder:
|
|
|
|
|
|
'方式1:复制完整的链接\n(http://localhost:xxx/auth/callback?code=...)\n方式2:仅复制 code 参数的值',
|
|
|
|
|
|
authCodeHint: '您可以直接复制整个链接或仅复制 code 参数值,系统会自动识别',
|
|
|
|
|
|
failedToGenerateUrl: '生成 Antigravity 授权链接失败',
|
|
|
|
|
|
missingExchangeParams: '缺少 code / session_id / state',
|
|
|
|
|
|
failedToExchangeCode: 'Antigravity 授权码兑换失败'
|
|
|
|
|
|
}
|
2025-12-25 21:25:08 -08:00
|
|
|
|
},
|
|
|
|
|
|
// Gemini specific (platform-wide)
|
|
|
|
|
|
gemini: {
|
|
|
|
|
|
modelPassthrough: 'Gemini 直接转发模型',
|
|
|
|
|
|
modelPassthroughDesc: '所有模型请求将直接转发至 Gemini API,不进行模型限制或映射。',
|
2025-12-28 23:24:46 +08:00
|
|
|
|
baseUrlHint: '留空使用官方 Gemini API',
|
2026-01-01 04:22:50 +08:00
|
|
|
|
apiKeyHint: '您的 Gemini API Key(以 AIza 开头)',
|
|
|
|
|
|
accountType: {
|
|
|
|
|
|
oauthTitle: 'OAuth 授权(Gemini)',
|
|
|
|
|
|
oauthDesc: '使用 Google 账号授权,并选择 OAuth 子类型。',
|
|
|
|
|
|
apiKeyTitle: 'API 密钥(AI Studio)',
|
|
|
|
|
|
apiKeyDesc: '最快接入方式,使用 AIza API Key。',
|
|
|
|
|
|
apiKeyNote: '适合轻量测试。免费层限流严格,数据可能用于训练。',
|
|
|
|
|
|
apiKeyLink: '获取 API Key',
|
|
|
|
|
|
quotaLink: '配额说明'
|
|
|
|
|
|
},
|
|
|
|
|
|
oauthType: {
|
|
|
|
|
|
builtInTitle: '内置授权(Gemini CLI / Code Assist)',
|
|
|
|
|
|
builtInDesc: '使用 Google 内置客户端 ID,无需管理员配置。',
|
|
|
|
|
|
builtInRequirement: '需要 GCP 项目并填写 Project ID。',
|
|
|
|
|
|
gcpProjectLink: '创建项目',
|
|
|
|
|
|
customTitle: '自定义授权(AI Studio OAuth)',
|
|
|
|
|
|
customDesc: '使用管理员预设的 OAuth 客户端,适合组织管理。',
|
|
|
|
|
|
customRequirement: '需管理员配置 Client ID 并加入测试用户白名单。',
|
|
|
|
|
|
badges: {
|
|
|
|
|
|
recommended: '推荐',
|
|
|
|
|
|
highConcurrency: '高并发',
|
|
|
|
|
|
noAdmin: '无需管理员配置',
|
|
|
|
|
|
orgManaged: '组织管理',
|
|
|
|
|
|
adminRequired: '需要管理员'
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
setupGuide: {
|
|
|
|
|
|
title: 'Gemini 使用准备',
|
|
|
|
|
|
checklistTitle: '准备工作',
|
|
|
|
|
|
checklistItems: {
|
|
|
|
|
|
usIp: '使用美国 IP,并确保账号归属地为美国。',
|
|
|
|
|
|
age: '账号需满 18 岁。'
|
|
|
|
|
|
},
|
|
|
|
|
|
activationTitle: '服务激活',
|
|
|
|
|
|
activationItems: {
|
|
|
|
|
|
geminiWeb: '激活 Gemini Web,避免 User not initialized。',
|
|
|
|
|
|
gcpProject: '激活 GCP 项目,获取 Code Assist 所需 Project ID。'
|
|
|
|
|
|
},
|
|
|
|
|
|
links: {
|
|
|
|
|
|
countryCheck: '检查归属地',
|
|
|
|
|
|
geminiWebActivation: '激活 Gemini Web',
|
|
|
|
|
|
gcpProject: '打开 GCP 控制台'
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
quotaPolicy: {
|
|
|
|
|
|
title: 'Gemini 配额与限流政策(参考)',
|
|
|
|
|
|
note: '注意:Gemini 官方未提供用量查询接口。此处显示的“每日配额”是由系统根据账号等级模拟计算的估算值,仅供调度参考,请以 Google 官方实际报错为准。',
|
|
|
|
|
|
columns: {
|
|
|
|
|
|
channel: '授权通道',
|
|
|
|
|
|
account: '账号状态',
|
|
|
|
|
|
limits: '限流政策',
|
|
|
|
|
|
docs: '官方文档'
|
|
|
|
|
|
},
|
|
|
|
|
|
docs: {
|
|
|
|
|
|
codeAssist: 'Code Assist 配额',
|
|
|
|
|
|
aiStudio: 'AI Studio 定价',
|
|
|
|
|
|
vertex: 'Vertex AI 配额'
|
|
|
|
|
|
},
|
|
|
|
|
|
simulatedNote: '本地模拟配额,仅供参考',
|
|
|
|
|
|
rows: {
|
|
|
|
|
|
cli: {
|
|
|
|
|
|
channel: 'Gemini CLI(官方 Google 登录 / Code Assist)',
|
|
|
|
|
|
free: '免费 Google 账号',
|
|
|
|
|
|
premium: 'Google One AI Premium',
|
|
|
|
|
|
limitsFree: 'RPD ~1000;RPM ~60(软限制)',
|
|
|
|
|
|
limitsPremium: 'RPD ~1500+;RPM ~60+(优先队列)'
|
|
|
|
|
|
},
|
|
|
|
|
|
gcloud: {
|
|
|
|
|
|
channel: 'GCP Code Assist(gcloud 登录)',
|
|
|
|
|
|
account: '未购买 Code Assist 订阅',
|
|
|
|
|
|
limits: 'RPD ~1000;RPM ~60(预览期)'
|
|
|
|
|
|
},
|
|
|
|
|
|
aiStudio: {
|
|
|
|
|
|
channel: 'AI Studio API Key / OAuth',
|
|
|
|
|
|
free: '未绑卡(免费层)',
|
|
|
|
|
|
paid: '已绑卡(按量付费)',
|
|
|
|
|
|
limitsFree: 'RPD 50;RPM 2(Pro)/ 15(Flash)',
|
|
|
|
|
|
limitsPaid: 'RPD 不限;RPM 1000+(按模型配额)'
|
|
|
|
|
|
},
|
|
|
|
|
|
customOAuth: {
|
|
|
|
|
|
channel: 'Custom OAuth Client(GCP)',
|
|
|
|
|
|
free: '项目未绑卡',
|
|
|
|
|
|
paid: '项目已绑卡',
|
|
|
|
|
|
limitsFree: 'RPD 50;RPM 2(项目配额)',
|
|
|
|
|
|
limitsPaid: 'RPD 不限;RPM 1000+(项目配额)'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-01-01 08:29:57 +08:00
|
|
|
|
},
|
|
|
|
|
|
rateLimit: {
|
|
|
|
|
|
ok: '未限流',
|
|
|
|
|
|
limited: '限流 {time}',
|
|
|
|
|
|
now: '现在'
|
2026-01-01 04:22:50 +08:00
|
|
|
|
}
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
// Re-Auth Modal
|
|
|
|
|
|
reAuthorizeAccount: '重新授权账号',
|
|
|
|
|
|
claudeCodeAccount: 'Claude Code 账号',
|
2025-12-22 22:58:31 +08:00
|
|
|
|
openaiAccount: 'OpenAI 账号',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
geminiAccount: 'Gemini 账号',
|
2025-12-28 15:54:42 +08:00
|
|
|
|
antigravityAccount: 'Antigravity 账号',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
inputMethod: '输入方式',
|
|
|
|
|
|
reAuthorizedSuccess: '账号重新授权成功',
|
|
|
|
|
|
// Test Modal
|
|
|
|
|
|
testAccountConnection: '测试账号连接',
|
|
|
|
|
|
account: '账号',
|
|
|
|
|
|
readyToTest: '准备测试。点击"开始测试"按钮开始...',
|
|
|
|
|
|
connectingToApi: '连接 API 中...',
|
|
|
|
|
|
testCompleted: '测试完成!',
|
|
|
|
|
|
connectedToApi: '已连接到 API',
|
|
|
|
|
|
usingModel: '使用模型:{model}',
|
|
|
|
|
|
sendingTestMessage: '发送测试消息:"hi"',
|
|
|
|
|
|
response: '响应:',
|
|
|
|
|
|
startTest: '开始测试',
|
|
|
|
|
|
retry: '重试',
|
|
|
|
|
|
copyOutput: '复制输出',
|
|
|
|
|
|
startingTestForAccount: '开始测试账号:{name}',
|
|
|
|
|
|
testAccountTypeLabel: '账号类型:{type}',
|
2025-12-25 21:25:08 -08:00
|
|
|
|
selectTestModel: '选择测试模型',
|
|
|
|
|
|
testModel: '测试模型',
|
|
|
|
|
|
testPrompt: '提示词:"hi"',
|
2025-12-23 13:42:33 +08:00
|
|
|
|
// Stats Modal
|
|
|
|
|
|
viewStats: '查看统计',
|
|
|
|
|
|
usageStatistics: '使用统计',
|
|
|
|
|
|
last30DaysUsage: '近30天使用统计(日均基于实际使用天数)',
|
|
|
|
|
|
stats: {
|
|
|
|
|
|
totalCost: '30天总费用',
|
|
|
|
|
|
accumulatedCost: '累计成本',
|
|
|
|
|
|
standardCost: '标准计费',
|
|
|
|
|
|
totalRequests: '30天总请求',
|
|
|
|
|
|
totalCalls: '累计调用次数',
|
|
|
|
|
|
avgDailyCost: '日均费用',
|
|
|
|
|
|
basedOnActualDays: '基于 {days} 天实际使用',
|
|
|
|
|
|
avgDailyRequests: '日均请求',
|
|
|
|
|
|
avgDailyUsage: '平均每日调用',
|
|
|
|
|
|
todayOverview: '今日概览',
|
|
|
|
|
|
cost: '费用',
|
|
|
|
|
|
requests: '请求',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
tokens: 'Token',
|
2025-12-23 13:42:33 +08:00
|
|
|
|
highestCostDay: '最高费用日',
|
|
|
|
|
|
highestRequestDay: '最高请求日',
|
|
|
|
|
|
date: '日期',
|
|
|
|
|
|
accumulatedTokens: '累计 Token',
|
|
|
|
|
|
totalTokens: '30天总计',
|
|
|
|
|
|
dailyAvgTokens: '日均 Token',
|
|
|
|
|
|
performance: '性能',
|
|
|
|
|
|
avgResponseTime: '平均响应',
|
|
|
|
|
|
daysActive: '活跃天数',
|
|
|
|
|
|
recentActivity: '最近统计',
|
|
|
|
|
|
todayRequests: '今日请求',
|
|
|
|
|
|
todayTokens: '今日 Token',
|
|
|
|
|
|
todayCost: '今日费用',
|
|
|
|
|
|
usageTrend: '30天费用与请求趋势',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
noData: '该账号暂无使用数据'
|
|
|
|
|
|
}
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Proxies Management
|
|
|
|
|
|
proxies: {
|
2025-12-23 15:46:10 +08:00
|
|
|
|
title: 'IP管理',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
description: '管理代理服务器配置',
|
|
|
|
|
|
createProxy: '添加代理',
|
|
|
|
|
|
editProxy: '编辑代理',
|
|
|
|
|
|
deleteProxy: '删除代理',
|
|
|
|
|
|
deleteConfirmMessage: "确定要删除代理 '{name}' 吗?",
|
|
|
|
|
|
testProxy: '测试代理',
|
|
|
|
|
|
columns: {
|
|
|
|
|
|
name: '名称',
|
|
|
|
|
|
protocol: '协议',
|
|
|
|
|
|
address: '地址',
|
|
|
|
|
|
priority: '优先级',
|
|
|
|
|
|
status: '状态',
|
|
|
|
|
|
lastCheck: '最近检测',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
actions: '操作'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
protocols: {
|
|
|
|
|
|
http: 'HTTP',
|
|
|
|
|
|
https: 'HTTPS',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
socks5: 'SOCKS5'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
statuses: {
|
|
|
|
|
|
active: '正常',
|
|
|
|
|
|
inactive: '停用',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
error: '错误'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
form: {
|
|
|
|
|
|
nameLabel: '名称',
|
|
|
|
|
|
namePlaceholder: '请输入代理名称',
|
|
|
|
|
|
protocolLabel: '协议',
|
|
|
|
|
|
selectProtocol: '选择协议',
|
|
|
|
|
|
hostLabel: '主机',
|
|
|
|
|
|
hostPlaceholder: '请输入主机地址',
|
|
|
|
|
|
portLabel: '端口',
|
|
|
|
|
|
portPlaceholder: '请输入端口',
|
|
|
|
|
|
usernameLabel: '用户名(可选)',
|
|
|
|
|
|
usernamePlaceholder: '请输入用户名',
|
|
|
|
|
|
passwordLabel: '密码(可选)',
|
|
|
|
|
|
passwordPlaceholder: '请输入密码',
|
|
|
|
|
|
priorityLabel: '优先级',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
statusLabel: '状态'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
filters: {
|
|
|
|
|
|
protocol: '协议',
|
|
|
|
|
|
allProtocols: '全部协议',
|
|
|
|
|
|
status: '状态',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
allStatuses: '全部状态'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
// Additional keys used in ProxiesView
|
|
|
|
|
|
allProtocols: '全部协议',
|
|
|
|
|
|
allStatus: '全部状态',
|
|
|
|
|
|
searchProxies: '搜索代理...',
|
|
|
|
|
|
name: '名称',
|
|
|
|
|
|
protocol: '协议',
|
|
|
|
|
|
host: '主机',
|
|
|
|
|
|
port: '端口',
|
|
|
|
|
|
username: '用户名(可选)',
|
|
|
|
|
|
password: '密码(可选)',
|
|
|
|
|
|
status: '状态',
|
|
|
|
|
|
enterProxyName: '请输入代理名称',
|
|
|
|
|
|
optionalAuth: '可选认证信息',
|
|
|
|
|
|
leaveEmptyToKeep: '留空保持不变',
|
|
|
|
|
|
noProxiesYet: '暂无代理',
|
|
|
|
|
|
createFirstProxy: '添加您的第一个代理以开始使用。',
|
|
|
|
|
|
testConnection: '测试连接',
|
|
|
|
|
|
batchTest: '批量测试',
|
|
|
|
|
|
testFailed: '失败',
|
|
|
|
|
|
// Batch import
|
|
|
|
|
|
standardAdd: '标准添加',
|
|
|
|
|
|
batchAdd: '快捷添加',
|
|
|
|
|
|
batchInput: '代理列表',
|
2025-12-24 18:07:58 -08:00
|
|
|
|
batchInputPlaceholder:
|
2025-12-29 09:30:32 +08:00
|
|
|
|
"每行输入一个代理,支持以下格式:\nsocks5://user:pass{'@'}192.168.1.1:1080\nhttp://192.168.1.1:8080\nhttps://user:pass{'@'}proxy.example.com:443",
|
|
|
|
|
|
batchInputHint: "支持 http、https、socks5 协议,格式:协议://[用户名:密码{'@'}]主机:端口",
|
2025-12-18 13:50:39 +08:00
|
|
|
|
parsedCount: '有效 {count} 个',
|
|
|
|
|
|
invalidCount: '无效 {count} 个',
|
|
|
|
|
|
duplicateCount: '重复 {count} 个',
|
|
|
|
|
|
importing: '导入中...',
|
|
|
|
|
|
importProxies: '导入 {count} 个代理',
|
|
|
|
|
|
batchImportSuccess: '成功导入 {created} 个代理,跳过 {skipped} 个重复',
|
|
|
|
|
|
batchImportAllSkipped: '全部 {skipped} 个代理已存在,跳过导入',
|
|
|
|
|
|
failedToImport: '批量导入失败',
|
|
|
|
|
|
// Other messages
|
|
|
|
|
|
saving: '保存中...',
|
|
|
|
|
|
testing: '测试中...',
|
|
|
|
|
|
creating: '创建中...',
|
|
|
|
|
|
updating: '更新中...',
|
|
|
|
|
|
noProxies: '暂无代理',
|
|
|
|
|
|
noProxiesDescription: '添加代理服务器以增强 API 访问稳定性。',
|
|
|
|
|
|
proxyCreated: '代理添加成功',
|
|
|
|
|
|
proxyUpdated: '代理更新成功',
|
|
|
|
|
|
proxyDeleted: '代理删除成功',
|
|
|
|
|
|
proxyWorking: '代理连接正常',
|
|
|
|
|
|
proxyWorkingWithLatency: '代理连接正常,延迟 {latency}ms',
|
|
|
|
|
|
proxyTestFailed: '代理测试失败',
|
|
|
|
|
|
proxyCreatedSuccess: '代理添加成功',
|
|
|
|
|
|
proxyUpdatedSuccess: '代理更新成功',
|
|
|
|
|
|
proxyDeletedSuccess: '代理删除成功',
|
|
|
|
|
|
testSuccess: '代理测试通过',
|
|
|
|
|
|
failedToLoad: '加载代理列表失败',
|
|
|
|
|
|
failedToSave: '保存代理失败',
|
|
|
|
|
|
failedToDelete: '删除代理失败',
|
|
|
|
|
|
failedToCreate: '创建代理失败',
|
|
|
|
|
|
failedToUpdate: '更新代理失败',
|
|
|
|
|
|
failedToTest: '测试代理失败',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
deleteConfirm: "确定要删除代理 '{name}' 吗?使用此代理的账号将被移除代理设置。"
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Redeem Codes Management
|
|
|
|
|
|
redeem: {
|
|
|
|
|
|
title: '兑换码管理',
|
|
|
|
|
|
description: '生成和管理兑换码',
|
|
|
|
|
|
generateCodes: '生成兑换码',
|
|
|
|
|
|
columns: {
|
|
|
|
|
|
code: '兑换码',
|
|
|
|
|
|
type: '类型',
|
|
|
|
|
|
value: '面值',
|
|
|
|
|
|
status: '状态',
|
|
|
|
|
|
usedBy: '使用者',
|
|
|
|
|
|
usedAt: '使用时间',
|
|
|
|
|
|
createdAt: '创建时间',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
actions: '操作'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
types: {
|
|
|
|
|
|
balance: '余额',
|
|
|
|
|
|
concurrency: '并发数',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
subscription: '订阅'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
// 用于选择器和筛选器的直接键
|
|
|
|
|
|
balance: '余额',
|
|
|
|
|
|
concurrency: '并发数',
|
|
|
|
|
|
subscription: '订阅',
|
|
|
|
|
|
allTypes: '全部类型',
|
|
|
|
|
|
allStatus: '全部状态',
|
|
|
|
|
|
unused: '未使用',
|
|
|
|
|
|
used: '已使用',
|
|
|
|
|
|
searchCodes: '搜索兑换码...',
|
|
|
|
|
|
exportCsv: '导出 CSV',
|
|
|
|
|
|
deleteAllUnused: '删除全部未使用',
|
|
|
|
|
|
deleteCodeConfirm: '确定要删除此兑换码吗?此操作无法撤销。',
|
|
|
|
|
|
deleteAllUnusedConfirm: '确定要删除全部未使用的兑换码吗?此操作无法撤销。',
|
|
|
|
|
|
deleteAll: '全部删除',
|
|
|
|
|
|
generateCodesTitle: '生成兑换码',
|
|
|
|
|
|
generatedSuccessfully: '生成成功',
|
|
|
|
|
|
codesCreated: '已创建 {count} 个兑换码',
|
|
|
|
|
|
codeType: '类型',
|
|
|
|
|
|
amount: '金额 ($)',
|
|
|
|
|
|
value: '面值',
|
|
|
|
|
|
count: '数量',
|
|
|
|
|
|
generate: '生成',
|
|
|
|
|
|
copyAll: '全部复制',
|
|
|
|
|
|
download: '下载',
|
|
|
|
|
|
codesExported: '兑换码导出成功',
|
|
|
|
|
|
codeDeleted: '兑换码删除成功',
|
|
|
|
|
|
codesDeleted: '成功删除 {count} 个未使用的兑换码',
|
|
|
|
|
|
noUnusedCodes: '没有未使用的兑换码可删除',
|
|
|
|
|
|
userPrefix: '用户 #{id}',
|
|
|
|
|
|
failedToExport: '导出兑换码失败',
|
|
|
|
|
|
failedToDeleteUnused: '删除未使用的兑换码失败',
|
|
|
|
|
|
failedToCopy: '复制失败',
|
|
|
|
|
|
selectGroup: '选择分组',
|
|
|
|
|
|
selectGroupPlaceholder: '选择订阅分组',
|
|
|
|
|
|
validityDays: '有效天数',
|
|
|
|
|
|
groupRequired: '请选择订阅分组',
|
|
|
|
|
|
days: '天',
|
|
|
|
|
|
statuses: {
|
|
|
|
|
|
unused: '未使用',
|
|
|
|
|
|
used: '已使用',
|
|
|
|
|
|
expired: '已过期',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
disabled: '已禁用'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
form: {
|
|
|
|
|
|
typeLabel: '类型',
|
|
|
|
|
|
selectType: '选择类型',
|
|
|
|
|
|
valueLabel: '面值',
|
|
|
|
|
|
valuePlaceholder: '请输入面值',
|
|
|
|
|
|
balanceHint: '余额金额(美元)',
|
|
|
|
|
|
concurrencyHint: '并发数增量',
|
|
|
|
|
|
countLabel: '数量',
|
|
|
|
|
|
countPlaceholder: '请输入数量',
|
|
|
|
|
|
countHint: '要生成的兑换码数量',
|
|
|
|
|
|
prefixLabel: '前缀(可选)',
|
|
|
|
|
|
prefixPlaceholder: '例如:GIFT',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
expiresLabel: '过期时间(可选)'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
filters: {
|
|
|
|
|
|
type: '类型',
|
|
|
|
|
|
allTypes: '全部类型',
|
|
|
|
|
|
status: '状态',
|
|
|
|
|
|
allStatuses: '全部状态',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
search: '搜索兑换码'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
generating: '生成中...',
|
|
|
|
|
|
copyCode: '复制',
|
|
|
|
|
|
copied: '已复制!',
|
|
|
|
|
|
disableCode: '禁用',
|
|
|
|
|
|
enableCode: '启用',
|
|
|
|
|
|
deleteCode: '删除',
|
|
|
|
|
|
deleteConfirmMessage: '确定要删除此兑换码吗?',
|
|
|
|
|
|
noCodes: '暂无兑换码',
|
|
|
|
|
|
noCodesDescription: '生成兑换码以向用户分发余额或并发数。',
|
|
|
|
|
|
codesGeneratedSuccess: '兑换码生成成功,共 {count} 个',
|
|
|
|
|
|
codeDisabledSuccess: '兑换码已禁用',
|
|
|
|
|
|
codeEnabledSuccess: '兑换码已启用',
|
|
|
|
|
|
codeDeletedSuccess: '兑换码删除成功',
|
|
|
|
|
|
failedToLoad: '加载兑换码列表失败',
|
|
|
|
|
|
failedToGenerate: '生成兑换码失败',
|
|
|
|
|
|
failedToUpdate: '更新兑换码失败',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
failedToDelete: '删除兑换码失败'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Usage Records
|
|
|
|
|
|
usage: {
|
|
|
|
|
|
title: '使用记录',
|
|
|
|
|
|
description: '查看和管理所有用户的使用记录',
|
|
|
|
|
|
userFilter: '用户',
|
|
|
|
|
|
searchUserPlaceholder: '按邮箱搜索用户...',
|
|
|
|
|
|
selectedUser: '已选择',
|
|
|
|
|
|
user: '用户',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
account: '账户',
|
|
|
|
|
|
group: '分组',
|
|
|
|
|
|
requestId: '请求ID',
|
2025-12-29 16:13:09 +08:00
|
|
|
|
requestIdCopied: '请求ID已复制',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
allModels: '全部模型',
|
|
|
|
|
|
allAccounts: '全部账户',
|
|
|
|
|
|
allGroups: '全部分组',
|
|
|
|
|
|
allTypes: '全部类型',
|
|
|
|
|
|
allBillingTypes: '全部计费',
|
|
|
|
|
|
inputCost: '输入成本',
|
|
|
|
|
|
outputCost: '输出成本',
|
|
|
|
|
|
cacheCreationCost: '缓存创建成本',
|
|
|
|
|
|
cacheReadCost: '缓存读取成本',
|
2025-12-29 16:13:09 +08:00
|
|
|
|
inputTokens: '输入 Token',
|
|
|
|
|
|
outputTokens: '输出 Token',
|
|
|
|
|
|
cacheCreationTokens: '缓存创建 Token',
|
|
|
|
|
|
cacheReadTokens: '缓存读取 Token',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
failedToLoad: '加载使用记录失败'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Settings
|
|
|
|
|
|
settings: {
|
|
|
|
|
|
title: '系统设置',
|
|
|
|
|
|
description: '管理注册、邮箱验证、默认值和 SMTP 设置',
|
|
|
|
|
|
registration: {
|
|
|
|
|
|
title: '注册设置',
|
|
|
|
|
|
description: '控制用户注册和验证',
|
|
|
|
|
|
enableRegistration: '开放注册',
|
|
|
|
|
|
enableRegistrationHint: '允许新用户注册',
|
|
|
|
|
|
emailVerification: '邮箱验证',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
emailVerificationHint: '新用户注册时需要验证邮箱'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
turnstile: {
|
|
|
|
|
|
title: 'Cloudflare Turnstile',
|
|
|
|
|
|
description: '登录和注册的机器人防护',
|
|
|
|
|
|
enableTurnstile: '启用 Turnstile',
|
|
|
|
|
|
enableTurnstileHint: '需要 Cloudflare Turnstile 验证',
|
|
|
|
|
|
siteKey: '站点密钥',
|
|
|
|
|
|
secretKey: '私密密钥',
|
|
|
|
|
|
siteKeyHint: '从 Cloudflare Dashboard 获取',
|
2026-01-03 06:35:50 -08:00
|
|
|
|
cloudflareDashboard: 'Cloudflare Dashboard',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
secretKeyHint: '服务端验证密钥(请保密)'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
defaults: {
|
|
|
|
|
|
title: '用户默认设置',
|
|
|
|
|
|
description: '新用户的默认值',
|
|
|
|
|
|
defaultBalance: '默认余额',
|
|
|
|
|
|
defaultBalanceHint: '新用户的初始余额',
|
|
|
|
|
|
defaultConcurrency: '默认并发数',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
defaultConcurrencyHint: '新用户的最大并发请求数'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
site: {
|
|
|
|
|
|
title: '站点设置',
|
|
|
|
|
|
description: '自定义站点品牌',
|
|
|
|
|
|
siteName: '站点名称',
|
|
|
|
|
|
siteNameHint: '显示在邮件和页面标题中',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
siteNamePlaceholder: 'Sub2API',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
siteSubtitle: '站点副标题',
|
|
|
|
|
|
siteSubtitleHint: '显示在登录和注册页面',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
siteSubtitlePlaceholder: '订阅转 API 转换平台',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
apiBaseUrl: 'API 端点地址',
|
|
|
|
|
|
apiBaseUrlHint: '用于"使用密钥"和"导入到 CC Switch"功能,留空则使用当前站点地址',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
apiBaseUrlPlaceholder: 'https://api.example.com',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
contactInfo: '客服联系方式',
|
|
|
|
|
|
contactInfoPlaceholder: '例如:QQ: 123456789',
|
|
|
|
|
|
contactInfoHint: '填写客服联系方式,将展示在兑换页面、个人资料等位置',
|
2025-12-24 21:30:19 +08:00
|
|
|
|
docUrl: '文档链接',
|
|
|
|
|
|
docUrlHint: '文档网站的链接。留空则隐藏文档链接。',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
docUrlPlaceholder: 'https://docs.example.com',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
siteLogo: '站点Logo',
|
|
|
|
|
|
uploadImage: '上传图片',
|
|
|
|
|
|
remove: '移除',
|
|
|
|
|
|
logoHint: 'PNG、JPG 或 SVG 格式,最大 300KB。建议:80x80px 正方形图片。',
|
|
|
|
|
|
logoSizeError: '图片大小超过 300KB 限制({size}KB)',
|
|
|
|
|
|
logoTypeError: '请选择图片文件',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
logoReadError: '读取图片文件失败'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
smtp: {
|
|
|
|
|
|
title: 'SMTP 设置',
|
|
|
|
|
|
description: '配置用于发送验证码的邮件服务',
|
|
|
|
|
|
testConnection: '测试连接',
|
|
|
|
|
|
testing: '测试中...',
|
|
|
|
|
|
host: 'SMTP 主机',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
hostPlaceholder: 'smtp.gmail.com',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
port: 'SMTP 端口',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
portPlaceholder: '587',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
username: 'SMTP 用户名',
|
2025-12-27 21:00:26 +08:00
|
|
|
|
usernamePlaceholder: "your-email{'@'}gmail.com",
|
2025-12-18 13:50:39 +08:00
|
|
|
|
password: 'SMTP 密码',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
passwordPlaceholder: '********',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
passwordHint: '留空以保留现有密码',
|
|
|
|
|
|
fromEmail: '发件人邮箱',
|
2025-12-27 21:00:26 +08:00
|
|
|
|
fromEmailPlaceholder: "noreply{'@'}example.com",
|
2025-12-18 13:50:39 +08:00
|
|
|
|
fromName: '发件人名称',
|
2025-12-27 10:50:25 +08:00
|
|
|
|
fromNamePlaceholder: 'Sub2API',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
useTls: '使用 TLS',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
useTlsHint: '为 SMTP 连接启用 TLS 加密'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
testEmail: {
|
|
|
|
|
|
title: '发送测试邮件',
|
|
|
|
|
|
description: '发送测试邮件以验证 SMTP 配置',
|
|
|
|
|
|
recipientEmail: '收件人邮箱',
|
2025-12-27 21:00:26 +08:00
|
|
|
|
recipientEmailPlaceholder: "test{'@'}example.com",
|
2025-12-18 13:50:39 +08:00
|
|
|
|
sendTestEmail: '发送测试邮件',
|
|
|
|
|
|
sending: '发送中...',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
enterRecipientHint: '请输入收件人邮箱地址'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
2025-12-20 15:11:43 +08:00
|
|
|
|
adminApiKey: {
|
|
|
|
|
|
title: '管理员 API Key',
|
|
|
|
|
|
description: '用于外部系统集成的全局 API Key,拥有完整的管理员权限',
|
|
|
|
|
|
notConfigured: '尚未配置管理员 API Key',
|
|
|
|
|
|
configured: '管理员 API Key 已启用',
|
|
|
|
|
|
currentKey: '当前密钥',
|
|
|
|
|
|
regenerate: '重新生成',
|
|
|
|
|
|
regenerating: '生成中...',
|
|
|
|
|
|
delete: '删除',
|
|
|
|
|
|
deleting: '删除中...',
|
|
|
|
|
|
create: '创建密钥',
|
|
|
|
|
|
creating: '创建中...',
|
|
|
|
|
|
regenerateConfirm: '确定要重新生成吗?当前密钥将立即失效。',
|
|
|
|
|
|
deleteConfirm: '确定要删除管理员 API Key 吗?外部集成将停止工作。',
|
|
|
|
|
|
keyGenerated: '新的管理员 API Key 已生成',
|
|
|
|
|
|
keyDeleted: '管理员 API Key 已删除',
|
|
|
|
|
|
copyKey: '复制密钥',
|
|
|
|
|
|
keyCopied: '密钥已复制到剪贴板',
|
|
|
|
|
|
keyWarning: '此密钥仅显示一次,请立即复制保存。',
|
|
|
|
|
|
securityWarning: '警告:此密钥拥有完整的管理员权限,请妥善保管。',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
usage: '使用方法:在请求头中添加 x-api-key: <your-admin-api-key>'
|
2025-12-20 15:11:43 +08:00
|
|
|
|
},
|
2025-12-18 13:50:39 +08:00
|
|
|
|
saveSettings: '保存设置',
|
|
|
|
|
|
saving: '保存中...',
|
|
|
|
|
|
settingsSaved: '设置保存成功',
|
|
|
|
|
|
smtpConnectionSuccess: 'SMTP 连接成功',
|
|
|
|
|
|
testEmailSent: '测试邮件发送成功',
|
|
|
|
|
|
failedToLoad: '加载设置失败',
|
|
|
|
|
|
failedToSave: '保存设置失败',
|
|
|
|
|
|
failedToTestSmtp: 'SMTP 连接测试失败',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
failedToSendTestEmail: '发送测试邮件失败'
|
|
|
|
|
|
}
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Subscription Progress (Header component)
|
|
|
|
|
|
subscriptionProgress: {
|
|
|
|
|
|
title: '我的订阅',
|
|
|
|
|
|
viewDetails: '查看订阅详情',
|
|
|
|
|
|
activeCount: '{count} 个有效订阅',
|
|
|
|
|
|
daily: '每日',
|
|
|
|
|
|
weekly: '每周',
|
|
|
|
|
|
monthly: '每月',
|
|
|
|
|
|
daysRemaining: '剩余 {days} 天',
|
|
|
|
|
|
expired: '已过期',
|
|
|
|
|
|
expiresToday: '今天到期',
|
|
|
|
|
|
expiresTomorrow: '明天到期',
|
|
|
|
|
|
viewAll: '查看全部订阅',
|
2025-12-31 20:46:54 +08:00
|
|
|
|
noSubscriptions: '暂无有效订阅',
|
|
|
|
|
|
unlimited: '无限制'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Version Badge
|
|
|
|
|
|
version: {
|
|
|
|
|
|
currentVersion: '当前版本',
|
|
|
|
|
|
latestVersion: '最新版本',
|
|
|
|
|
|
upToDate: '已是最新版本',
|
|
|
|
|
|
updateAvailable: '有新版本可用!',
|
|
|
|
|
|
releaseNotes: '更新日志',
|
|
|
|
|
|
noReleaseNotes: '暂无更新日志',
|
|
|
|
|
|
viewUpdate: '查看更新',
|
|
|
|
|
|
viewRelease: '查看发布',
|
2025-12-18 21:15:10 +08:00
|
|
|
|
viewChangelog: '查看更新日志',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
refresh: '刷新',
|
|
|
|
|
|
sourceMode: '源码构建',
|
2025-12-18 21:15:10 +08:00
|
|
|
|
sourceModeHint: '源码构建请使用 git pull 更新',
|
|
|
|
|
|
updateNow: '立即更新',
|
|
|
|
|
|
updating: '正在更新...',
|
|
|
|
|
|
updateComplete: '更新完成',
|
|
|
|
|
|
updateFailed: '更新失败',
|
|
|
|
|
|
restartRequired: '请重启服务以应用更新',
|
|
|
|
|
|
restartNow: '立即重启',
|
|
|
|
|
|
restarting: '正在重启...',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
retry: '重试'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// User Subscriptions Page
|
|
|
|
|
|
userSubscriptions: {
|
|
|
|
|
|
title: '我的订阅',
|
|
|
|
|
|
description: '查看您的订阅计划和用量',
|
|
|
|
|
|
noActiveSubscriptions: '暂无有效订阅',
|
|
|
|
|
|
noActiveSubscriptionsDesc: '您没有任何有效订阅。请联系管理员获取订阅。',
|
2026-01-03 06:35:50 -08:00
|
|
|
|
failedToLoad: '加载订阅失败',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
status: {
|
|
|
|
|
|
active: '有效',
|
|
|
|
|
|
expired: '已过期',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
revoked: '已撤销'
|
2025-12-18 13:50:39 +08:00
|
|
|
|
},
|
|
|
|
|
|
usage: '用量',
|
|
|
|
|
|
expires: '到期时间',
|
|
|
|
|
|
noExpiration: '无到期时间',
|
|
|
|
|
|
unlimited: '无限制',
|
2025-12-31 20:46:54 +08:00
|
|
|
|
unlimitedDesc: '该订阅无用量限制',
|
2025-12-18 13:50:39 +08:00
|
|
|
|
daily: '每日',
|
|
|
|
|
|
weekly: '每周',
|
|
|
|
|
|
monthly: '每月',
|
|
|
|
|
|
daysRemaining: '剩余 {days} 天',
|
|
|
|
|
|
expiresOn: '{date} 到期',
|
|
|
|
|
|
resetIn: '{time} 后重置',
|
2025-12-23 10:38:15 +08:00
|
|
|
|
windowNotActive: '等待首次使用',
|
2025-12-25 08:40:35 -08:00
|
|
|
|
usageOf: '已用 {used} / {limit}'
|
2025-12-29 15:21:05 +08:00
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
// Onboarding Tour
|
|
|
|
|
|
onboarding: {
|
|
|
|
|
|
restartTour: '重新查看新手引导',
|
|
|
|
|
|
dontShowAgain: '不再提示',
|
|
|
|
|
|
dontShowAgainTitle: '永久关闭新手引导',
|
|
|
|
|
|
confirmDontShow: '确定不再显示新手引导吗?\n\n您可以随时在右上角头像菜单中重新开启。',
|
|
|
|
|
|
confirmExit: '确定要退出新手引导吗?您可以随时在右上角菜单重新开始。',
|
|
|
|
|
|
interactiveHint: '按 Enter 或点击继续',
|
|
|
|
|
|
navigation: {
|
|
|
|
|
|
flipPage: '翻页',
|
|
|
|
|
|
exit: '退出'
|
|
|
|
|
|
},
|
|
|
|
|
|
// Admin tour steps
|
|
|
|
|
|
admin: {
|
|
|
|
|
|
welcome: {
|
|
|
|
|
|
title: '👋 欢迎使用 Sub2API',
|
|
|
|
|
|
description: '<div style="line-height: 1.8;"><p style="margin-bottom: 16px;">Sub2API 是一个强大的 AI 服务中转平台,让您轻松管理和分发 AI 服务。</p><p style="margin-bottom: 12px;"><b>🎯 核心功能:</b></p><ul style="margin-left: 20px; margin-bottom: 16px;"><li>📦 <b>分组管理</b> - 创建不同的服务套餐(VIP、免费试用等)</li><li>🔗 <b>账号池</b> - 连接多个上游 AI 服务商账号</li><li>🔑 <b>密钥分发</b> - 为用户生成独立的 API Key</li><li>💰 <b>计费管理</b> - 灵活的费率和配额控制</li></ul><p style="color: #10b981; font-weight: 600;">接下来,我们将用 3 分钟带您完成首次配置 →</p></div>',
|
|
|
|
|
|
nextBtn: '开始配置 🚀',
|
|
|
|
|
|
prevBtn: '跳过'
|
|
|
|
|
|
},
|
|
|
|
|
|
groupManage: {
|
|
|
|
|
|
title: '📦 第一步:分组管理',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;"><b>什么是分组?</b></p><p style="margin-bottom: 12px;">分组是 Sub2API 的核心概念,它就像一个"服务套餐":</p><ul style="margin-left: 20px; margin-bottom: 12px; font-size: 13px;"><li>🎯 每个分组可以包含多个上游账号</li><li>💰 每个分组有独立的计费倍率</li><li>👥 可以设置为公开或专属分组</li></ul><p style="margin-top: 12px; padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 示例:</b>您可以创建"VIP专线"(高倍率)和"免费试用"(低倍率)两个分组</p><p style="margin-top: 16px; color: #10b981; font-weight: 600;">👉 点击左侧的"分组管理"开始</p></div>'
|
|
|
|
|
|
},
|
|
|
|
|
|
createGroup: {
|
|
|
|
|
|
title: '➕ 创建新分组',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">现在让我们创建第一个分组。</p><p style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>📝 提示:</b>建议先创建一个测试分组,熟悉流程后再创建正式分组</p><p style="color: #10b981; font-weight: 600;">👉 点击"创建分组"按钮</p></div>'
|
|
|
|
|
|
},
|
|
|
|
|
|
groupName: {
|
|
|
|
|
|
title: '✏️ 1. 分组名称',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">为您的分组起一个易于识别的名称。</p><div style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>💡 命名建议:</b><ul style="margin: 8px 0 0 16px;"><li>"测试分组" - 用于测试</li><li>"VIP专线" - 高质量服务</li><li>"免费试用" - 体验版</li></ul></div><p style="font-size: 13px; color: #6b7280;">填写完成后点击"下一步"继续</p></div>',
|
|
|
|
|
|
nextBtn: '下一步'
|
|
|
|
|
|
},
|
|
|
|
|
|
groupPlatform: {
|
|
|
|
|
|
title: '🤖 2. 选择平台',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">选择该分组支持的 AI 平台。</p><div style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>📌 平台说明:</b><ul style="margin: 8px 0 0 16px;"><li><b>Anthropic</b> - Claude 系列模型</li><li><b>OpenAI</b> - GPT 系列模型</li><li><b>Google</b> - Gemini 系列模型</li></ul></div><p style="font-size: 13px; color: #6b7280;">一个分组只能选择一个平台</p></div>',
|
|
|
|
|
|
nextBtn: '下一步'
|
|
|
|
|
|
},
|
|
|
|
|
|
groupMultiplier: {
|
|
|
|
|
|
title: '💰 3. 费率倍数',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">设置该分组的计费倍率,控制用户的实际扣费。</p><div style="padding: 8px 12px; background: #fef3c7; border-left: 3px solid #f59e0b; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>⚙️ 计费规则:</b><ul style="margin: 8px 0 0 16px;"><li><b>1.0</b> - 原价计费(成本价)</li><li><b>1.5</b> - 用户消耗 $1,扣除 $1.5</li><li><b>2.0</b> - 用户消耗 $1,扣除 $2</li><li><b>0.8</b> - 补贴模式(亏本运营)</li></ul></div><p style="font-size: 13px; color: #6b7280;">建议测试分组设置为 1.0</p></div>',
|
|
|
|
|
|
nextBtn: '下一步'
|
|
|
|
|
|
},
|
|
|
|
|
|
groupExclusive: {
|
|
|
|
|
|
title: '🔒 4. 专属分组(可选)',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">控制分组的可见性和访问权限。</p><div style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>🔐 权限说明:</b><ul style="margin: 8px 0 0 16px;"><li><b>关闭</b> - 公开分组,所有用户可见</li><li><b>开启</b> - 专属分组,仅指定用户可见</li></ul></div><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 使用场景:</b>VIP 用户专属、内部测试、特殊客户等</p></div>',
|
|
|
|
|
|
nextBtn: '下一步'
|
|
|
|
|
|
},
|
|
|
|
|
|
groupSubmit: {
|
|
|
|
|
|
title: '✅ 保存分组',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">确认信息无误后,点击创建按钮保存分组。</p><p style="padding: 8px 12px; background: #fef3c7; border-left: 3px solid #f59e0b; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>⚠️ 注意:</b>分组创建后,平台类型不可修改,其他信息可以随时编辑</p><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>📌 下一步:</b>创建成功后,我们将添加上游账号到这个分组</p><p style="margin-top: 12px; color: #10b981; font-weight: 600;">👉 点击"创建"按钮</p></div>'
|
|
|
|
|
|
},
|
|
|
|
|
|
accountManage: {
|
|
|
|
|
|
title: '🔗 第二步:添加账号',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;"><b>太棒了!分组已创建成功 🎉</b></p><p style="margin-bottom: 12px;">现在需要添加上游 AI 服务商的账号,让分组能够实际提供服务。</p><div style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>🔑 账号的作用:</b><ul style="margin: 8px 0 0 16px;"><li>连接到上游 AI 服务(Claude、GPT 等)</li><li>一个分组可以包含多个账号(负载均衡)</li><li>支持 OAuth 和 Session Key 两种方式</li></ul></div><p style="margin-top: 16px; color: #10b981; font-weight: 600;">👉 点击左侧的"账号管理"</p></div>'
|
|
|
|
|
|
},
|
|
|
|
|
|
createAccount: {
|
|
|
|
|
|
title: '➕ 添加新账号',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">点击按钮开始添加您的第一个上游账号。</p><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 提示:</b>建议使用 OAuth 方式,更安全且无需手动提取密钥</p><p style="margin-top: 12px; color: #10b981; font-weight: 600;">👉 点击"添加账号"按钮</p></div>'
|
|
|
|
|
|
},
|
|
|
|
|
|
accountName: {
|
|
|
|
|
|
title: '✏️ 1. 账号名称',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">为账号设置一个便于识别的名称。</p><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 命名建议:</b>"Claude主账号"、"GPT备用1"、"测试账号" 等</p></div>',
|
|
|
|
|
|
nextBtn: '下一步'
|
|
|
|
|
|
},
|
|
|
|
|
|
accountPlatform: {
|
|
|
|
|
|
title: '🤖 2. 选择平台',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">选择该账号对应的服务商平台。</p><p style="padding: 8px 12px; background: #fef3c7; border-left: 3px solid #f59e0b; border-radius: 4px; font-size: 13px;"><b>⚠️ 重要:</b>平台必须与刚才创建的分组平台一致</p></div>',
|
|
|
|
|
|
nextBtn: '下一步'
|
|
|
|
|
|
},
|
|
|
|
|
|
accountType: {
|
|
|
|
|
|
title: '🔐 3. 授权方式',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">选择账号的授权方式。</p><div style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>✅ 推荐:OAuth 方式</b><ul style="margin: 8px 0 0 16px;"><li>无需手动提取密钥</li><li>更安全,支持自动刷新</li><li>适用于 Claude Code、ChatGPT OAuth</li></ul></div><div style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px;"><b>📌 Session Key 方式</b><ul style="margin: 8px 0 0 16px;"><li>需要手动从浏览器提取</li><li>可能需要定期更新</li><li>适用于不支持 OAuth 的平台</li></ul></div></div>',
|
|
|
|
|
|
nextBtn: '下一步'
|
|
|
|
|
|
},
|
|
|
|
|
|
accountPriority: {
|
|
|
|
|
|
title: '⚖️ 4. 优先级(可选)',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">设置账号的调用优先级。</p><div style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>📊 优先级规则:</b><ul style="margin: 8px 0 0 16px;"><li>数字越大,优先级越高</li><li>系统优先使用高优先级账号</li><li>相同优先级则随机选择</li></ul></div><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 使用场景:</b>主账号设置高优先级,备用账号设置低优先级</p></div>',
|
|
|
|
|
|
nextBtn: '下一步'
|
|
|
|
|
|
},
|
|
|
|
|
|
accountGroups: {
|
|
|
|
|
|
title: '🎯 5. 分配分组',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;"><b>关键步骤!</b>将账号分配到刚才创建的分组。</p><div style="padding: 8px 12px; background: #fee2e2; border-left: 3px solid #ef4444; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>⚠️ 重要提醒:</b><ul style="margin: 8px 0 0 16px;"><li>必须勾选至少一个分组</li><li>未分配分组的账号无法使用</li><li>一个账号可以分配给多个分组</li></ul></div><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 提示:</b>请勾选刚才创建的测试分组</p></div>',
|
|
|
|
|
|
nextBtn: '下一步'
|
|
|
|
|
|
},
|
|
|
|
|
|
accountSubmit: {
|
|
|
|
|
|
title: '✅ 保存账号',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">确认信息无误后,点击保存按钮。</p><div style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>📌 OAuth 授权流程:</b><ul style="margin: 8px 0 0 16px;"><li>点击保存后会跳转到服务商页面</li><li>在服务商页面完成登录授权</li><li>授权成功后自动返回</li></ul></div><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>📌 下一步:</b>账号添加成功后,我们将创建 API 密钥</p><p style="margin-top: 12px; color: #10b981; font-weight: 600;">👉 点击"保存"按钮</p></div>'
|
|
|
|
|
|
},
|
|
|
|
|
|
keyManage: {
|
|
|
|
|
|
title: '🔑 第三步:生成密钥',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;"><b>恭喜!账号配置完成 🎉</b></p><p style="margin-bottom: 12px;">最后一步,生成 API Key 来测试服务是否正常工作。</p><div style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>🔑 API Key 的作用:</b><ul style="margin: 8px 0 0 16px;"><li>用于调用 AI 服务的凭证</li><li>每个 Key 绑定一个分组</li><li>可以设置配额和有效期</li><li>支持独立的使用统计</li></ul></div><p style="margin-top: 16px; color: #10b981; font-weight: 600;">👉 点击左侧的"API 密钥"</p></div>'
|
|
|
|
|
|
},
|
|
|
|
|
|
createKey: {
|
|
|
|
|
|
title: '➕ 创建密钥',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">点击按钮创建您的第一个 API Key。</p><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 提示:</b>创建后请立即复制保存,密钥只显示一次</p><p style="margin-top: 12px; color: #10b981; font-weight: 600;">👉 点击"创建密钥"按钮</p></div>'
|
|
|
|
|
|
},
|
|
|
|
|
|
keyName: {
|
|
|
|
|
|
title: '✏️ 1. 密钥名称',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">为密钥设置一个便于管理的名称。</p><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 命名建议:</b>"测试密钥"、"生产环境"、"移动端" 等</p></div>',
|
|
|
|
|
|
nextBtn: '下一步'
|
|
|
|
|
|
},
|
|
|
|
|
|
keyGroup: {
|
|
|
|
|
|
title: '🎯 2. 选择分组',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">选择刚才配置好的分组。</p><div style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>📌 分组决定:</b><ul style="margin: 8px 0 0 16px;"><li>该密钥可以使用哪些账号</li><li>计费倍率是多少</li><li>是否为专属密钥</li></ul></div><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 提示:</b>选择刚才创建的测试分组</p></div>',
|
|
|
|
|
|
nextBtn: '下一步'
|
|
|
|
|
|
},
|
|
|
|
|
|
keySubmit: {
|
|
|
|
|
|
title: '🎉 生成并复制',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">点击创建后,系统会生成完整的 API Key。</p><div style="padding: 8px 12px; background: #fee2e2; border-left: 3px solid #ef4444; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>⚠️ 重要提醒:</b><ul style="margin: 8px 0 0 16px;"><li>密钥只显示一次,请立即复制</li><li>丢失后需要重新生成</li><li>妥善保管,不要泄露给他人</li></ul></div><div style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>🚀 下一步:</b><ul style="margin: 8px 0 0 16px;"><li>复制生成的 sk-xxx 密钥</li><li>在支持 OpenAI 接口的客户端中使用</li><li>开始体验 AI 服务!</li></ul></div><p style="margin-top: 12px; color: #10b981; font-weight: 600;">👉 点击"创建"按钮</p></div>'
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
// User tour steps
|
|
|
|
|
|
user: {
|
|
|
|
|
|
welcome: {
|
|
|
|
|
|
title: '👋 欢迎使用 Sub2API',
|
|
|
|
|
|
description: '<div style="line-height: 1.8;"><p style="margin-bottom: 16px;">您好!欢迎来到 Sub2API AI 服务平台。</p><p style="margin-bottom: 12px;"><b>🎯 快速开始:</b></p><ul style="margin-left: 20px; margin-bottom: 16px;"><li>🔑 创建 API 密钥</li><li>📋 复制密钥到您的应用</li><li>🚀 开始使用 AI 服务</li></ul><p style="color: #10b981; font-weight: 600;">只需 1 分钟,让我们开始吧 →</p></div>',
|
|
|
|
|
|
nextBtn: '开始 🚀',
|
|
|
|
|
|
prevBtn: '跳过'
|
|
|
|
|
|
},
|
|
|
|
|
|
keyManage: {
|
|
|
|
|
|
title: '🔑 API 密钥管理',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">在这里管理您的所有 API 访问密钥。</p><p style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px;"><b>📌 什么是 API 密钥?</b><br/>API 密钥是您访问 AI 服务的凭证,就像一把钥匙,让您的应用能够调用 AI 能力。</p><p style="margin-top: 12px; color: #10b981; font-weight: 600;">👉 点击进入密钥页面</p></div>'
|
|
|
|
|
|
},
|
|
|
|
|
|
createKey: {
|
|
|
|
|
|
title: '➕ 创建新密钥',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">点击按钮创建您的第一个 API 密钥。</p><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 提示:</b>创建后密钥只显示一次,请务必复制保存</p><p style="margin-top: 12px; color: #10b981; font-weight: 600;">👉 点击"创建密钥"</p></div>'
|
|
|
|
|
|
},
|
|
|
|
|
|
keyName: {
|
|
|
|
|
|
title: '✏️ 密钥名称',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">为密钥起一个便于识别的名称。</p><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 示例:</b>"我的第一个密钥"、"测试用" 等</p></div>',
|
|
|
|
|
|
nextBtn: '下一步'
|
|
|
|
|
|
},
|
|
|
|
|
|
keyGroup: {
|
|
|
|
|
|
title: '🎯 选择分组',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">选择管理员为您分配的服务分组。</p><p style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px;"><b>📌 分组说明:</b><br/>不同分组可能有不同的服务质量和计费标准,请根据需要选择。</p></div>',
|
|
|
|
|
|
nextBtn: '下一步'
|
|
|
|
|
|
},
|
|
|
|
|
|
keySubmit: {
|
|
|
|
|
|
title: '🎉 完成创建',
|
|
|
|
|
|
description: '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">点击确认创建您的 API 密钥。</p><div style="padding: 8px 12px; background: #fee2e2; border-left: 3px solid #ef4444; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>⚠️ 重要:</b><ul style="margin: 8px 0 0 16px;"><li>创建后请立即复制密钥(sk-xxx)</li><li>密钥只显示一次,丢失需重新生成</li></ul></div><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>🚀 如何使用:</b><br/>将密钥配置到支持 OpenAI 接口的任何客户端(如 ChatBox、OpenCat 等),即可开始使用!</p><p style="margin-top: 12px; color: #10b981; font-weight: 600;">👉 点击"创建"按钮</p></div>'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-12-25 08:40:35 -08:00
|
|
|
|
}
|
2025-12-18 13:50:39 +08:00
|
|
|
|
}
|