3543 lines
159 KiB
TypeScript
3543 lines
159 KiB
TypeScript
export default {
|
||
// Home Page
|
||
home: {
|
||
viewOnGithub: '在 GitHub 上查看',
|
||
viewDocs: '查看文档',
|
||
docs: '文档',
|
||
switchToLight: '切换到浅色模式',
|
||
switchToDark: '切换到深色模式',
|
||
dashboard: '控制台',
|
||
login: '登录',
|
||
getStarted: '开始使用',
|
||
goToDashboard: '进入控制台',
|
||
tags: {
|
||
subscriptionToApi: '订阅转 API',
|
||
stickySession: '粘性会话',
|
||
realtimeBilling: '实时计费'
|
||
},
|
||
features: {
|
||
unifiedGateway: '统一 API 网关',
|
||
unifiedGatewayDesc: '将 Claude 订阅转换为 API 接口,通过标准 /v1/messages 接口访问 AI 能力。',
|
||
multiAccount: '多账号池',
|
||
multiAccountDesc: '智能负载均衡管理多个上游账号,支持 OAuth 和 API Key 认证。',
|
||
balanceQuota: '余额与配额',
|
||
balanceQuotaDesc: '基于 Token 的精确计费和用量追踪,支持配额管理和兑换码充值。'
|
||
},
|
||
providers: {
|
||
title: '支持的服务商',
|
||
description: 'AI 服务的统一 API 接口',
|
||
supported: '已支持',
|
||
soon: '即将推出',
|
||
claude: 'Claude',
|
||
gemini: 'Gemini',
|
||
antigravity: 'Antigravity',
|
||
more: '更多'
|
||
},
|
||
footer: {
|
||
allRightsReserved: '保留所有权利。'
|
||
}
|
||
},
|
||
|
||
// Setup Wizard
|
||
setup: {
|
||
title: 'Sub2API 安装向导',
|
||
description: '配置您的 Sub2API 实例',
|
||
database: {
|
||
title: '数据库配置',
|
||
description: '连接到您的 PostgreSQL 数据库',
|
||
host: '主机',
|
||
port: '端口',
|
||
username: '用户名',
|
||
password: '密码',
|
||
databaseName: '数据库名称',
|
||
sslMode: 'SSL 模式',
|
||
passwordPlaceholder: '密码',
|
||
ssl: {
|
||
disable: '禁用',
|
||
require: '要求',
|
||
verifyCa: '验证 CA',
|
||
verifyFull: '完全验证'
|
||
}
|
||
},
|
||
redis: {
|
||
title: 'Redis 配置',
|
||
description: '连接到您的 Redis 服务器',
|
||
host: '主机',
|
||
port: '端口',
|
||
password: '密码(可选)',
|
||
database: '数据库',
|
||
passwordPlaceholder: '密码',
|
||
enableTls: '启用 TLS',
|
||
enableTlsHint: '连接 Redis 时使用 TLS(公共 CA 证书)'
|
||
},
|
||
admin: {
|
||
title: '管理员账户',
|
||
description: '创建您的管理员账户',
|
||
email: '邮箱',
|
||
password: '密码',
|
||
confirmPassword: '确认密码',
|
||
passwordPlaceholder: '至少 6 个字符',
|
||
confirmPasswordPlaceholder: '确认密码',
|
||
passwordMismatch: '密码不匹配'
|
||
},
|
||
ready: {
|
||
title: '准备安装',
|
||
description: '检查您的配置并完成安装',
|
||
database: '数据库',
|
||
redis: 'Redis',
|
||
adminEmail: '管理员邮箱'
|
||
},
|
||
status: {
|
||
testing: '测试中...',
|
||
success: '连接成功',
|
||
testConnection: '测试连接',
|
||
installing: '安装中...',
|
||
completeInstallation: '完成安装',
|
||
completed: '安装完成!',
|
||
redirecting: '正在跳转到登录页面...',
|
||
restarting: '服务正在重启,请稍候...',
|
||
timeout: '服务重启时间超出预期,请手动刷新页面。'
|
||
}
|
||
},
|
||
|
||
// 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: '暂无数据',
|
||
expand: '展开',
|
||
collapse: '收起',
|
||
success: '成功',
|
||
error: '错误',
|
||
critical: '严重',
|
||
warning: '警告',
|
||
info: '提示',
|
||
active: '启用',
|
||
inactive: '禁用',
|
||
more: '更多',
|
||
close: '关闭',
|
||
enabled: '已启用',
|
||
disabled: '已禁用',
|
||
total: '总计',
|
||
balance: '余额',
|
||
available: '可用',
|
||
copiedToClipboard: '已复制到剪贴板',
|
||
copied: '已复制',
|
||
copyFailed: '复制失败',
|
||
verifying: '验证中...',
|
||
processing: '处理中...',
|
||
contactSupport: '联系客服',
|
||
add: '添加',
|
||
invalidEmail: '请输入有效的邮箱地址',
|
||
optional: '可选',
|
||
selectOption: '请选择',
|
||
searchPlaceholder: '搜索...',
|
||
noOptionsFound: '无匹配选项',
|
||
noGroupsAvailable: '无可用分组',
|
||
unknownError: '发生未知错误',
|
||
saving: '保存中...',
|
||
selectedCount: '(已选 {count} 个)',
|
||
refresh: '刷新',
|
||
settings: '设置',
|
||
notAvailable: '不可用',
|
||
now: '现在',
|
||
unknown: '未知',
|
||
minutes: '分钟',
|
||
time: {
|
||
never: '从未',
|
||
justNow: '刚刚',
|
||
minutesAgo: '{n}分钟前',
|
||
hoursAgo: '{n}小时前',
|
||
daysAgo: '{n}天前',
|
||
countdown: {
|
||
daysHours: '{d}d {h}h',
|
||
hoursMinutes: '{h}h {m}m',
|
||
minutes: '{m}m',
|
||
withSuffix: '{time} 后解除'
|
||
}
|
||
}
|
||
},
|
||
|
||
// Navigation
|
||
nav: {
|
||
dashboard: '仪表盘',
|
||
announcements: '公告',
|
||
apiKeys: 'API 密钥',
|
||
usage: '使用记录',
|
||
redeem: '兑换',
|
||
profile: '个人资料',
|
||
users: '用户管理',
|
||
groups: '分组管理',
|
||
subscriptions: '订阅管理',
|
||
accounts: '账号管理',
|
||
proxies: 'IP管理',
|
||
redeemCodes: '兑换码',
|
||
ops: '运维监控',
|
||
promoCodes: '优惠码',
|
||
settings: '系统设置',
|
||
myAccount: '我的账户',
|
||
lightMode: '浅色模式',
|
||
darkMode: '深色模式',
|
||
collapse: '收起',
|
||
expand: '展开',
|
||
logout: '退出登录',
|
||
github: 'GitHub',
|
||
mySubscriptions: '我的订阅',
|
||
buySubscription: '购买订阅',
|
||
docs: '文档'
|
||
},
|
||
|
||
// 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}。',
|
||
reloginRequired: '会话已过期,请重新登录。',
|
||
turnstileExpired: '验证已过期,请重试',
|
||
turnstileFailed: '验证失败,请重试',
|
||
completeVerification: '请完成验证',
|
||
verifyYourEmail: '验证您的邮箱',
|
||
sessionExpired: '会话已过期',
|
||
sessionExpiredDesc: '请返回注册页面重新开始。',
|
||
verificationCode: '验证码',
|
||
verificationCodeHint: '请输入发送到您邮箱的6位验证码',
|
||
sendingCode: '发送中...',
|
||
clickToResend: '点击重新发送验证码',
|
||
resendCode: '重新发送验证码',
|
||
promoCodeLabel: '优惠码',
|
||
promoCodePlaceholder: '输入优惠码(可选)',
|
||
promoCodeValid: '有效!注册后将获得 ${amount} 赠送余额',
|
||
promoCodeInvalid: '无效的优惠码',
|
||
promoCodeNotFound: '优惠码不存在',
|
||
promoCodeExpired: '此优惠码已过期',
|
||
promoCodeDisabled: '此优惠码已被禁用',
|
||
promoCodeMaxUsed: '此优惠码已达到使用上限',
|
||
promoCodeAlreadyUsed: '您已使用过此优惠码',
|
||
promoCodeValidating: '优惠码正在验证中,请稍候',
|
||
promoCodeInvalidCannotRegister: '优惠码无效,请检查后重试或清空优惠码',
|
||
invitationCodeLabel: '邀请码',
|
||
invitationCodePlaceholder: '请输入邀请码',
|
||
invitationCodeRequired: '请输入邀请码',
|
||
invitationCodeValid: '邀请码有效',
|
||
invitationCodeInvalid: '邀请码无效或已被使用',
|
||
invitationCodeValidating: '正在验证邀请码...',
|
||
invitationCodeInvalidCannotRegister: '邀请码无效,请检查后重试',
|
||
linuxdo: {
|
||
signIn: '使用 Linux.do 登录',
|
||
orContinue: '或使用邮箱密码继续',
|
||
callbackTitle: '正在完成登录',
|
||
callbackProcessing: '正在验证登录信息,请稍候...',
|
||
callbackHint: '如果页面未自动跳转,请返回登录页重试。',
|
||
callbackMissingToken: '登录信息缺失,请返回重试。',
|
||
backToLogin: '返回登录'
|
||
},
|
||
oauth: {
|
||
code: '授权码',
|
||
state: '状态',
|
||
fullUrl: '完整URL'
|
||
},
|
||
// 忘记密码
|
||
forgotPassword: '忘记密码?',
|
||
forgotPasswordTitle: '重置密码',
|
||
forgotPasswordHint: '输入您的邮箱地址,我们将向您发送密码重置链接。',
|
||
sendResetLink: '发送重置链接',
|
||
sendingResetLink: '发送中...',
|
||
sendResetLinkFailed: '发送重置链接失败,请重试。',
|
||
resetEmailSent: '重置链接已发送',
|
||
resetEmailSentHint: '如果该邮箱已注册,您将很快收到密码重置链接。请检查您的收件箱和垃圾邮件文件夹。',
|
||
backToLogin: '返回登录',
|
||
rememberedPassword: '想起密码了?',
|
||
// 重置密码
|
||
resetPasswordTitle: '设置新密码',
|
||
resetPasswordHint: '请在下方输入您的新密码。',
|
||
newPassword: '新密码',
|
||
newPasswordPlaceholder: '输入新密码',
|
||
confirmPassword: '确认密码',
|
||
confirmPasswordPlaceholder: '再次输入新密码',
|
||
confirmPasswordRequired: '请确认您的密码',
|
||
passwordsDoNotMatch: '两次输入的密码不一致',
|
||
resetPassword: '重置密码',
|
||
resettingPassword: '重置中...',
|
||
resetPasswordFailed: '重置密码失败,请重试。',
|
||
passwordResetSuccess: '密码重置成功',
|
||
passwordResetSuccessHint: '您的密码已重置。现在可以使用新密码登录。',
|
||
invalidResetLink: '无效的重置链接',
|
||
invalidResetLinkHint: '此密码重置链接无效或已过期。请重新请求一个新链接。',
|
||
requestNewResetLink: '请求新的重置链接',
|
||
invalidOrExpiredToken: '密码重置链接无效或已过期。请重新请求一个新链接。'
|
||
},
|
||
|
||
// Dashboard
|
||
dashboard: {
|
||
title: '仪表盘',
|
||
welcomeMessage: '欢迎回来!这是您账户的概览。',
|
||
balance: '余额',
|
||
apiKeys: 'API 密钥',
|
||
todayRequests: '今日请求',
|
||
todayCost: '今日消费',
|
||
todayTokens: '今日 Token',
|
||
totalTokens: '累计 Token',
|
||
cacheToday: '今日缓存',
|
||
performance: '性能指标',
|
||
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: '兑换码',
|
||
addBalanceWithCode: '使用兑换码充值'
|
||
},
|
||
|
||
// Groups (shared)
|
||
groups: {
|
||
subscription: '订阅'
|
||
},
|
||
|
||
// API Keys
|
||
keys: {
|
||
title: 'API 密钥',
|
||
description: '管理您的 API 密钥和访问令牌',
|
||
createKey: '创建密钥',
|
||
editKey: '编辑密钥',
|
||
deleteKey: '删除密钥',
|
||
deleteConfirmMessage: "确定要删除 '{name}' 吗?此操作无法撤销。",
|
||
apiKey: 'API 密钥',
|
||
group: '分组',
|
||
noGroup: '无分组',
|
||
created: '创建时间',
|
||
copyToClipboard: '复制到剪贴板',
|
||
copied: '已复制!',
|
||
importToCcSwitch: '导入到 CCS',
|
||
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 或相应的配置文件中。',
|
||
noGroupTitle: '请先分配分组',
|
||
noGroupDescription: '此 API 密钥尚未分配分组,请先在密钥列表中点击分组列进行分配,然后才能查看使用配置。',
|
||
openai: {
|
||
description: '将以下配置文件添加到 Codex CLI 配置目录中。',
|
||
configTomlHint: '请确保以下内容位于 config.toml 文件的开头部分',
|
||
note: '请确保配置目录存在。macOS/Linux 用户可运行 mkdir -p ~/.codex 创建目录。',
|
||
noteWindows: '按 Win+R,输入 %userprofile%\\.codex 打开配置目录。如目录不存在,请先手动创建。',
|
||
},
|
||
cliTabs: {
|
||
claudeCode: 'Claude Code',
|
||
geminiCli: 'Gemini CLI',
|
||
codexCli: 'Codex CLI',
|
||
opencode: 'OpenCode',
|
||
},
|
||
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 或相应的配置文件中。',
|
||
},
|
||
opencode: {
|
||
title: 'OpenCode 配置示例',
|
||
subtitle: 'opencode.json',
|
||
hint: '配置文件路径:~/.config/opencode/opencode.json(或 opencode.jsonc),不存在需手动创建。可使用默认 provider(openai/anthropic/google)或自定义 provider_id。API Key 支持直接配置或通过客户端 /connect 命令配置。示例仅供参考,模型与选项可按需调整。',
|
||
},
|
||
},
|
||
customKeyLabel: '自定义密钥',
|
||
customKeyPlaceholder: '输入自定义密钥(至少16个字符)',
|
||
customKeyHint: '仅允许字母、数字、下划线和连字符,最少16个字符。',
|
||
customKeyTooShort: '自定义密钥至少需要16个字符',
|
||
customKeyInvalidChars: '自定义密钥只能包含字母、数字、下划线和连字符',
|
||
customKeyRequired: '请输入自定义密钥',
|
||
ipRestriction: 'IP 限制',
|
||
ipWhitelist: 'IP 白名单',
|
||
ipWhitelistPlaceholder: '192.168.1.100\n10.0.0.0/8',
|
||
ipWhitelistHint: '每行一个 IP 或 CIDR,设置后仅允许这些 IP 使用此密钥',
|
||
ipBlacklist: 'IP 黑名单',
|
||
ipBlacklistPlaceholder: '1.2.3.4\n5.6.0.0/16',
|
||
ipBlacklistHint: '每行一个 IP 或 CIDR,这些 IP 将被禁止使用此密钥',
|
||
ipRestrictionEnabled: '已配置 IP 限制',
|
||
ccSwitchNotInstalled: 'CC-Switch 未安装或协议处理程序未注册。请先安装 CC-Switch 或手动复制 API 密钥。',
|
||
ccsClientSelect: {
|
||
title: '选择客户端',
|
||
description: '请选择您要导入到 CC-Switch 的客户端类型:',
|
||
claudeCode: 'Claude Code',
|
||
claudeCodeDesc: '导入为 Claude Code 配置',
|
||
geminiCli: 'Gemini CLI',
|
||
geminiCliDesc: '导入为 Gemini CLI 配置',
|
||
},
|
||
},
|
||
|
||
// Usage
|
||
usage: {
|
||
title: '使用记录',
|
||
description: '查看和分析您的 API 使用历史',
|
||
costDetails: '成本明细',
|
||
tokenDetails: 'Token 明细',
|
||
totalRequests: '总请求数',
|
||
totalTokens: '总 Token',
|
||
totalCost: '总消费',
|
||
standardCost: '标准',
|
||
actualCost: '实际',
|
||
userBilled: '用户扣费',
|
||
accountBilled: '账号计费',
|
||
accountMultiplier: '账号倍率',
|
||
avgDuration: '平均耗时',
|
||
inSelectedRange: '所选范围内',
|
||
perRequest: '每次请求',
|
||
apiKeyFilter: 'API 密钥',
|
||
allApiKeys: '全部密钥',
|
||
timeRange: '时间范围',
|
||
exportCsv: '导出 CSV',
|
||
exportExcel: '导出 Excel',
|
||
exportingProgress: '正在导出数据...',
|
||
exportedCount: '已导出 {current}/{total} 条',
|
||
estimatedTime: '预计剩余时间:{time}',
|
||
cancelExport: '取消导出',
|
||
exportCancelled: '导出已取消',
|
||
exporting: '导出中...',
|
||
preparingExport: '正在准备导出...',
|
||
model: '模型',
|
||
reasoningEffort: '推理强度',
|
||
type: '类型',
|
||
tokens: 'Token',
|
||
cost: '费用',
|
||
firstToken: '首 Token',
|
||
duration: '耗时',
|
||
time: '时间',
|
||
stream: '流式',
|
||
sync: '同步',
|
||
in: '输入',
|
||
out: '输出',
|
||
cacheRead: '读取',
|
||
cacheWrite: '写入',
|
||
rate: '倍率',
|
||
original: '原始',
|
||
billed: '计费',
|
||
noRecords: '未找到使用记录,请尝试调整筛选条件。',
|
||
failedToLoad: '加载使用记录失败',
|
||
noDataToExport: '没有可导出的数据',
|
||
exportSuccess: '使用数据导出成功',
|
||
exportFailed: '使用数据导出失败',
|
||
exportExcelSuccess: '使用数据导出成功(Excel格式)',
|
||
exportExcelFailed: '使用数据导出失败',
|
||
imageUnit: '张',
|
||
userAgent: 'User-Agent'
|
||
},
|
||
|
||
// 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: '兑换成功!',
|
||
failedToRedeem: '兑换失败,请检查兑换码后重试。',
|
||
subscriptionRefreshFailed: '兑换成功,但订阅状态刷新失败。',
|
||
pleaseEnterCode: '请输入兑换码'
|
||
},
|
||
|
||
// Profile
|
||
profile: {
|
||
title: '个人设置',
|
||
description: '管理您的账户信息和设置',
|
||
accountBalance: '账户余额',
|
||
concurrencyLimit: '并发限制',
|
||
memberSince: '注册时间',
|
||
administrator: '管理员',
|
||
user: '用户',
|
||
username: '用户名',
|
||
enterUsername: '输入用户名',
|
||
editProfile: '编辑个人资料',
|
||
updateProfile: '更新资料',
|
||
updating: '更新中...',
|
||
updateSuccess: '资料更新成功',
|
||
updateFailed: '资料更新失败',
|
||
usernameRequired: '用户名不能为空',
|
||
changePassword: '修改密码',
|
||
currentPassword: '当前密码',
|
||
newPassword: '新密码',
|
||
confirmNewPassword: '确认新密码',
|
||
passwordHint: '密码至少需要 8 个字符',
|
||
changingPassword: '修改中...',
|
||
changePasswordButton: '修改密码',
|
||
passwordsNotMatch: '两次输入的密码不一致',
|
||
passwordTooShort: '密码至少需要 8 个字符',
|
||
passwordChangeSuccess: '密码修改成功',
|
||
passwordChangeFailed: '密码修改失败',
|
||
// TOTP 2FA
|
||
totp: {
|
||
title: '双因素认证 (2FA)',
|
||
description: '使用 Google Authenticator 等应用增强账户安全',
|
||
enabled: '已启用',
|
||
enabledAt: '启用时间',
|
||
notEnabled: '未启用',
|
||
notEnabledHint: '启用双因素认证可以增强账户安全性',
|
||
enable: '启用',
|
||
disable: '禁用',
|
||
featureDisabled: '功能未开放',
|
||
featureDisabledHint: '管理员尚未开放双因素认证功能',
|
||
setupTitle: '设置双因素认证',
|
||
setupStep1: '使用认证器应用扫描下方二维码',
|
||
setupStep2: '输入应用显示的 6 位验证码',
|
||
manualEntry: '无法扫码?手动输入密钥:',
|
||
enterCode: '输入 6 位验证码',
|
||
verify: '验证',
|
||
setupFailed: '获取设置信息失败',
|
||
verifyFailed: '验证码错误,请重试',
|
||
enableSuccess: '双因素认证已启用',
|
||
disableTitle: '禁用双因素认证',
|
||
disableWarning: '禁用后,登录时将不再需要验证码。这可能会降低您的账户安全性。',
|
||
enterPassword: '请输入当前密码确认',
|
||
confirmDisable: '确认禁用',
|
||
disableSuccess: '双因素认证已禁用',
|
||
disableFailed: '禁用失败,请检查密码是否正确',
|
||
loginTitle: '双因素认证',
|
||
loginHint: '请输入您认证器应用显示的 6 位验证码',
|
||
loginFailed: '验证失败,请重试',
|
||
// New translations for email verification
|
||
verifyEmailFirst: '请先验证您的邮箱',
|
||
verifyPasswordFirst: '请先验证您的身份',
|
||
emailCode: '邮箱验证码',
|
||
enterEmailCode: '请输入 6 位验证码',
|
||
sendCode: '发送验证码',
|
||
codeSent: '验证码已发送到您的邮箱',
|
||
sendCodeFailed: '发送验证码失败'
|
||
}
|
||
},
|
||
|
||
// Empty States
|
||
empty: {
|
||
noData: '暂无数据'
|
||
},
|
||
|
||
// Table
|
||
table: {
|
||
expandActions: '展开更多操作',
|
||
collapseActions: '收起操作'
|
||
},
|
||
|
||
// Pagination
|
||
pagination: {
|
||
showing: '显示',
|
||
to: '至',
|
||
of: '共',
|
||
results: '条结果',
|
||
page: '页',
|
||
pageOf: '第 {page} / {total} 页',
|
||
previous: '上一页',
|
||
next: '下一页',
|
||
perPage: '每页',
|
||
goToPage: '跳转到第 {page} 页',
|
||
jumpTo: '跳转页',
|
||
jumpPlaceholder: '页码',
|
||
jumpAction: '跳转'
|
||
},
|
||
|
||
// Errors
|
||
errors: {
|
||
somethingWentWrong: '出错了',
|
||
pageNotFound: '页面未找到',
|
||
unauthorized: '未授权',
|
||
forbidden: '禁止访问',
|
||
serverError: '服务器错误',
|
||
networkError: '网络错误',
|
||
timeout: '请求超时',
|
||
tryAgain: '请重试'
|
||
},
|
||
|
||
// Dates
|
||
dates: {
|
||
today: '今天',
|
||
yesterday: '昨天',
|
||
thisWeek: '本周',
|
||
lastWeek: '上周',
|
||
thisMonth: '本月',
|
||
lastMonth: '上月',
|
||
last7Days: '近 7 天',
|
||
last14Days: '近 14 天',
|
||
last30Days: '近 30 天',
|
||
custom: '自定义',
|
||
startDate: '开始日期',
|
||
endDate: '结束日期',
|
||
apply: '应用',
|
||
selectDateRange: '选择日期范围'
|
||
},
|
||
|
||
// 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: '今日缓存',
|
||
performance: '性能指标',
|
||
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: '配置系统设置',
|
||
failedToLoad: '加载仪表盘数据失败'
|
||
},
|
||
|
||
// Users Management
|
||
users: {
|
||
title: '用户管理',
|
||
description: '管理用户账户和权限',
|
||
createUser: '创建用户',
|
||
editUser: '编辑用户',
|
||
deleteUser: '删除用户',
|
||
deleteConfirmMessage: "确定要删除用户 '{email}' 吗?此操作无法撤销。",
|
||
searchPlaceholder: '搜索用户...',
|
||
searchUsers: '搜索用户...',
|
||
roleFilter: '角色筛选',
|
||
allRoles: '全部角色',
|
||
allStatus: '全部状态',
|
||
statusFilter: '状态筛选',
|
||
allStatuses: '全部状态',
|
||
admin: '管理员',
|
||
user: '用户',
|
||
disabled: '禁用',
|
||
email: '邮箱',
|
||
password: '密码',
|
||
username: '用户名',
|
||
notes: '备注',
|
||
enterEmail: '请输入邮箱',
|
||
enterPassword: '请输入密码',
|
||
enterUsername: '请输入用户名(选填)',
|
||
enterNotes: '请输入备注(仅管理员可见)',
|
||
notesHint: '此备注仅对管理员可见',
|
||
enterNewPassword: '请输入新密码(选填)',
|
||
leaveEmptyToKeep: '留空则保持原密码不变',
|
||
generatePassword: '生成随机密码',
|
||
copyPassword: '复制密码',
|
||
creating: '创建中...',
|
||
updating: '更新中...',
|
||
columns: {
|
||
user: '用户',
|
||
email: '邮箱',
|
||
username: '用户名',
|
||
notes: '备注',
|
||
role: '角色',
|
||
subscriptions: '订阅分组',
|
||
balance: '余额',
|
||
usage: '用量',
|
||
concurrency: '并发数',
|
||
status: '状态',
|
||
created: '创建时间',
|
||
actions: '操作'
|
||
},
|
||
today: '今日',
|
||
total: '累计',
|
||
noSubscription: '暂无订阅',
|
||
daysRemaining: '{days}天',
|
||
expired: '已过期',
|
||
disable: '禁用',
|
||
enable: '启用',
|
||
disableUser: '禁用用户',
|
||
enableUser: '启用用户',
|
||
viewApiKeys: '查看 API 密钥',
|
||
groups: '分组',
|
||
apiKeys: 'API密钥',
|
||
userApiKeys: '用户 API 密钥',
|
||
noApiKeys: '此用户暂无 API 密钥',
|
||
group: '分组',
|
||
none: '无',
|
||
noUsersYet: '暂无用户',
|
||
createFirstUser: '创建您的第一个用户以开始使用系统',
|
||
userCreated: '用户创建成功',
|
||
userUpdated: '用户更新成功',
|
||
userDeleted: '用户删除成功',
|
||
userEnabled: '用户已启用',
|
||
userDisabled: '用户已禁用',
|
||
failedToLoad: '加载用户列表失败',
|
||
failedToCreate: '创建用户失败',
|
||
failedToUpdate: '更新用户失败',
|
||
failedToDelete: '删除用户失败',
|
||
failedToToggle: '更新用户状态失败',
|
||
failedToLoadApiKeys: '加载用户 API 密钥失败',
|
||
deleteConfirm: "确定要删除用户 '{email}' 吗?此操作无法撤销。",
|
||
roles: {
|
||
admin: '管理员',
|
||
user: '用户'
|
||
},
|
||
form: {
|
||
emailLabel: '邮箱',
|
||
emailPlaceholder: '请输入邮箱',
|
||
usernameLabel: '用户名',
|
||
usernamePlaceholder: '请输入用户名(选填)',
|
||
notesLabel: '备注',
|
||
notesPlaceholder: '请输入备注(仅管理员可见)',
|
||
notesHint: '此备注仅对管理员可见',
|
||
passwordLabel: '密码',
|
||
passwordPlaceholder: '请输入密码(留空则不修改)',
|
||
roleLabel: '角色',
|
||
selectRole: '选择角色',
|
||
balanceLabel: '余额',
|
||
concurrencyLabel: '并发数',
|
||
statusLabel: '状态',
|
||
selectStatus: '选择状态'
|
||
},
|
||
adjustBalance: '调整余额',
|
||
adjustConcurrency: '调整并发数',
|
||
adjustmentAmount: '调整金额',
|
||
adjustmentAmountHint: '正数增加,负数减少',
|
||
currentBalance: '当前余额',
|
||
currentConcurrency: '当前并发数',
|
||
saving: '保存中...',
|
||
noUsers: '暂无用户',
|
||
noUsersDescription: '创建您的第一个用户以开始使用系统。',
|
||
userCreatedSuccess: '用户创建成功',
|
||
userUpdatedSuccess: '用户更新成功',
|
||
userDeletedSuccess: '用户删除成功',
|
||
balanceAdjustedSuccess: '余额调整成功',
|
||
concurrencyAdjustedSuccess: '并发数调整成功',
|
||
failedToSave: '保存用户失败',
|
||
failedToAdjust: '调整失败',
|
||
emailRequired: '请输入邮箱',
|
||
concurrencyMin: '并发数不能小于1',
|
||
amountRequired: '请输入有效金额',
|
||
insufficientBalance: '余额不足',
|
||
setAllowedGroups: '设置允许分组',
|
||
allowedGroupsHint: '选择此用户可以使用的标准分组。订阅类型分组请在订阅管理中配置。',
|
||
noStandardGroups: '暂无标准分组',
|
||
allowAllGroups: '允许全部分组',
|
||
allowAllGroupsHint: '用户可以使用任何非专属分组',
|
||
allowedGroupsUpdated: '允许分组更新成功',
|
||
failedToLoadGroups: '加载分组列表失败',
|
||
failedToUpdateAllowedGroups: '更新允许分组失败',
|
||
deposit: '充值',
|
||
withdraw: '退款',
|
||
depositAmount: '充值金额',
|
||
withdrawAmount: '退款金额',
|
||
withdrawAll: '全部',
|
||
depositNotesPlaceholder: '例如:新用户注册奖励、活动充值、补偿充值等',
|
||
withdrawNotesPlaceholder: '例如:服务问题退款、错误充值退回、账户注销退款等',
|
||
notesOptional: '备注为可选项,有助于未来查账',
|
||
amountHint: '请输入正数金额',
|
||
newBalance: '操作后余额',
|
||
depositing: '充值中...',
|
||
withdrawing: '退款中...',
|
||
confirmDeposit: '确认充值',
|
||
confirmWithdraw: '确认退款',
|
||
depositSuccess: '充值成功',
|
||
withdrawSuccess: '退款成功',
|
||
failedToDeposit: '充值失败',
|
||
failedToWithdraw: '退款失败',
|
||
useDepositWithdrawButtons: '请使用充值/退款按钮调整余额',
|
||
// 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: '更新属性失败',
|
||
keyRequired: '请输入属性键',
|
||
nameRequired: '请输入显示名称',
|
||
optionsRequired: '请至少添加一个选项',
|
||
failedToDelete: '删除属性失败',
|
||
failedToReorder: '更新排序失败',
|
||
keyExists: '属性键已存在',
|
||
dragToReorder: '拖拽排序'
|
||
}
|
||
},
|
||
|
||
// Groups Management
|
||
groups: {
|
||
title: '分组管理',
|
||
description: '管理 API 密钥分组和费率配置',
|
||
searchGroups: '搜索分组...',
|
||
createGroup: '创建分组',
|
||
editGroup: '编辑分组',
|
||
deleteGroup: '删除分组',
|
||
deleteConfirm: "确定要删除分组 '{name}' 吗?所有关联的 API 密钥将不再属于任何分组。",
|
||
deleteConfirmSubscription:
|
||
"确定要删除订阅分组 '{name}' 吗?此操作会让所有绑定此订阅的用户的 API Key 失效,并删除所有相关的订阅记录。此操作无法撤销。",
|
||
columns: {
|
||
name: '名称',
|
||
platform: '平台',
|
||
rateMultiplier: '费率倍数',
|
||
exclusive: '独占',
|
||
type: '类型',
|
||
priority: '优先级',
|
||
apiKeys: 'API 密钥数',
|
||
accounts: '账号数',
|
||
status: '状态',
|
||
actions: '操作',
|
||
billingType: '计费类型'
|
||
},
|
||
form: {
|
||
name: '名称',
|
||
description: '描述',
|
||
platform: '平台',
|
||
rateMultiplier: '费率倍数',
|
||
status: '状态',
|
||
exclusive: '专属分组',
|
||
nameLabel: '分组名称',
|
||
namePlaceholder: '请输入分组名称',
|
||
descriptionLabel: '描述',
|
||
descriptionPlaceholder: '请输入描述(可选)',
|
||
rateMultiplierLabel: '费率倍数',
|
||
rateMultiplierHint: '1.0 = 标准费率,0.5 = 半价,2.0 = 双倍',
|
||
exclusiveLabel: '专属分组',
|
||
exclusiveHint: '专属分组,可以手动指定给用户',
|
||
platformLabel: '平台限制',
|
||
platformPlaceholder: '选择平台(留空则不限制)',
|
||
accountsLabel: '指定账号',
|
||
accountsPlaceholder: '选择账号(留空则不限制)',
|
||
priorityLabel: '优先级',
|
||
priorityHint: '数值越小优先级越高,用于账号调度',
|
||
statusLabel: '状态'
|
||
},
|
||
exclusiveObj: {
|
||
yes: '是',
|
||
no: '否'
|
||
},
|
||
exclusive: '专属',
|
||
exclusiveHint: '专属分组,可以手动指定给特定用户',
|
||
exclusiveTooltip: {
|
||
title: '什么是专属分组?',
|
||
description: '开启后,用户在创建 API Key 时将无法看到此分组。只有管理员手动将用户分配到此分组后,用户才能使用。',
|
||
example: '使用场景:',
|
||
exampleContent: '公开分组费率 0.8,您可以创建一个费率 0.7 的专属分组,手动分配给 VIP 用户,让他们享受更优惠的价格。'
|
||
},
|
||
rateMultiplierHint: '1.0 = 标准费率,0.5 = 半价,2.0 = 双倍',
|
||
platforms: {
|
||
all: '全部平台',
|
||
anthropic: 'Anthropic',
|
||
openai: 'OpenAI',
|
||
gemini: 'Gemini',
|
||
antigravity: 'Antigravity'
|
||
},
|
||
saving: '保存中...',
|
||
noGroups: '暂无分组',
|
||
noGroupsDescription: '创建分组以更好地管理 API 密钥和费率。',
|
||
groupCreatedSuccess: '分组创建成功',
|
||
groupUpdatedSuccess: '分组更新成功',
|
||
groupDeletedSuccess: '分组删除成功',
|
||
failedToLoad: '加载分组列表失败',
|
||
failedToSave: '保存分组失败',
|
||
failedToDelete: '删除分组失败',
|
||
allPlatforms: '全部平台',
|
||
allStatus: '全部状态',
|
||
allGroups: '全部分组',
|
||
exclusiveFilter: '专属',
|
||
nonExclusive: '公开',
|
||
public: '公开',
|
||
rateAndAccounts: '{rate}x 费率 · {count} 个账号',
|
||
accountsCount: '{count} 个账号',
|
||
enterGroupName: '请输入分组名称',
|
||
optionalDescription: '可选描述',
|
||
platformHint: '选择此分组关联的平台',
|
||
platformNotEditable: '创建后不可更改平台',
|
||
noGroupsYet: '暂无分组',
|
||
createFirstGroup: '创建您的第一个分组来组织 API 密钥。',
|
||
creating: '创建中...',
|
||
updating: '更新中...',
|
||
limitDay: '日',
|
||
limitWeek: '周',
|
||
limitMonth: '月',
|
||
groupCreated: '分组创建成功',
|
||
groupUpdated: '分组更新成功',
|
||
groupDeleted: '分组删除成功',
|
||
failedToCreate: '创建分组失败',
|
||
failedToUpdate: '更新分组失败',
|
||
nameRequired: '请输入分组名称',
|
||
subscription: {
|
||
title: '订阅设置',
|
||
type: '计费类型',
|
||
typeHint: '标准计费从用户余额扣除。订阅模式使用配额限制。',
|
||
typeNotEditable: '分组创建后无法修改计费类型。',
|
||
standard: '标准(余额)',
|
||
subscription: '订阅(配额)',
|
||
dailyLimit: '每日限额(USD)',
|
||
weeklyLimit: '每周限额(USD)',
|
||
monthlyLimit: '每月限额(USD)',
|
||
defaultValidityDays: '默认有效期(天)',
|
||
validityHint: '分配给用户时订阅的有效天数',
|
||
noLimit: '无限制'
|
||
},
|
||
imagePricing: {
|
||
title: '图片生成计费',
|
||
description: '配置 gemini-3-pro-image 模型的图片生成价格,留空则使用默认价格'
|
||
},
|
||
claudeCode: {
|
||
title: 'Claude Code 客户端限制',
|
||
tooltip: '启用后,此分组仅允许 Claude Code 官方客户端访问。非 Claude Code 请求将被拒绝或降级到指定分组。',
|
||
enabled: '仅限 Claude Code',
|
||
disabled: '允许所有客户端',
|
||
fallbackGroup: '降级分组',
|
||
fallbackHint: '非 Claude Code 请求将使用此分组,留空则直接拒绝',
|
||
noFallback: '不降级(直接拒绝)'
|
||
},
|
||
invalidRequestFallback: {
|
||
title: '无效请求兜底分组',
|
||
hint: '仅当上游明确返回 prompt too long 时才会触发,留空表示不兜底',
|
||
noFallback: '不兜底'
|
||
},
|
||
copyAccounts: {
|
||
title: '从分组复制账号',
|
||
tooltip: '选择一个或多个相同平台的分组,创建后会自动将这些分组的所有账号绑定到新分组(去重)。',
|
||
tooltipEdit: '选择一个或多个相同平台的分组,保存后当前分组的账号会被替换为这些分组的账号(去重)。',
|
||
selectPlaceholder: '选择分组以复制其账号...',
|
||
hint: '可选多个分组,账号会自动去重',
|
||
hintEdit: '⚠️ 注意:这会替换当前分组的所有账号绑定'
|
||
},
|
||
modelRouting: {
|
||
title: '模型路由配置',
|
||
tooltip: '配置特定模型请求优先路由到指定账号。支持通配符匹配,如 claude-opus-* 匹配所有 opus 模型。',
|
||
enabled: '已启用',
|
||
disabled: '已禁用',
|
||
disabledHint: '启用后,配置的路由规则才会生效',
|
||
addRule: '添加路由规则',
|
||
modelPattern: '模型模式',
|
||
modelPatternPlaceholder: 'claude-opus-*',
|
||
modelPatternHint: '支持 * 通配符,如 claude-opus-* 匹配所有 opus 模型',
|
||
accounts: '优先账号',
|
||
selectAccounts: '选择账号',
|
||
noAccounts: '此分组暂无账号',
|
||
loadingAccounts: '加载账号中...',
|
||
removeRule: '删除规则',
|
||
noRules: '暂无路由规则',
|
||
noRulesHint: '添加路由规则以将特定模型请求优先路由到指定账号',
|
||
searchAccountPlaceholder: '搜索账号...',
|
||
accountsHint: '选择此模型模式优先使用的账号'
|
||
},
|
||
mcpXml: {
|
||
title: 'MCP XML 协议注入',
|
||
tooltip: '启用后,当请求包含 MCP 工具时,会在 system prompt 中注入 XML 格式调用协议提示词。关闭此选项可避免对某些客户端造成干扰。',
|
||
enabled: '已启用',
|
||
disabled: '已禁用'
|
||
},
|
||
supportedScopes: {
|
||
title: '支持的模型系列',
|
||
tooltip: '选择此分组支持的模型系列。未勾选的系列将不会被路由到此分组。',
|
||
claude: 'Claude',
|
||
geminiText: 'Gemini Text',
|
||
geminiImage: 'Gemini Image',
|
||
hint: '至少选择一个模型系列'
|
||
}
|
||
},
|
||
|
||
// Subscriptions Management
|
||
subscriptions: {
|
||
title: '订阅管理',
|
||
description: '管理用户订阅和配额限制',
|
||
assignSubscription: '分配订阅',
|
||
adjustSubscription: '调整订阅',
|
||
revokeSubscription: '撤销订阅',
|
||
allStatus: '全部状态',
|
||
allGroups: '全部分组',
|
||
daily: '每日',
|
||
weekly: '每周',
|
||
monthly: '每月',
|
||
noLimits: '未配置限额',
|
||
unlimited: '无限制',
|
||
resetNow: '即将重置',
|
||
windowNotActive: '窗口未激活',
|
||
resetInMinutes: '{minutes} 分钟后重置',
|
||
resetInHoursMinutes: '{hours} 小时 {minutes} 分钟后重置',
|
||
resetInDaysHours: '{days} 天 {hours} 小时后重置',
|
||
daysRemaining: '天剩余',
|
||
remainingDays: '剩余天数',
|
||
noExpiration: '无过期时间',
|
||
status: {
|
||
active: '生效中',
|
||
expired: '已过期',
|
||
revoked: '已撤销'
|
||
},
|
||
columns: {
|
||
user: '用户',
|
||
group: '分组',
|
||
usage: '用量',
|
||
expires: '到期时间',
|
||
status: '状态',
|
||
actions: '操作'
|
||
},
|
||
form: {
|
||
user: '用户',
|
||
group: '订阅分组',
|
||
validityDays: '有效期(天)',
|
||
adjustDays: '调整天数'
|
||
},
|
||
selectUser: '选择用户',
|
||
selectGroup: '选择订阅分组',
|
||
groupHint: '仅显示订阅计费类型的分组',
|
||
validityHint: '订阅的有效天数',
|
||
adjustingFor: '为以下用户调整订阅',
|
||
currentExpiration: '当前到期时间',
|
||
adjustDaysPlaceholder: '正数延长,负数缩短',
|
||
adjustHint: '输入正数延长订阅,负数缩短订阅(缩短后剩余天数需大于0)',
|
||
assign: '分配',
|
||
assigning: '分配中...',
|
||
adjust: '调整',
|
||
adjusting: '调整中...',
|
||
revoke: '撤销',
|
||
noSubscriptionsYet: '暂无订阅',
|
||
assignFirstSubscription: '分配一个订阅以开始使用。',
|
||
subscriptionAssigned: '订阅分配成功',
|
||
subscriptionAdjusted: '订阅调整成功',
|
||
subscriptionRevoked: '订阅撤销成功',
|
||
failedToLoad: '加载订阅列表失败',
|
||
failedToAssign: '分配订阅失败',
|
||
failedToAdjust: '调整订阅失败',
|
||
failedToRevoke: '撤销订阅失败',
|
||
adjustWouldExpire: '调整后剩余天数必须大于0',
|
||
adjustOutOfRange: '调整天数必须在 -36500 到 36500 之间',
|
||
pleaseSelectUser: '请选择用户',
|
||
pleaseSelectGroup: '请选择分组',
|
||
validityDaysRequired: '请输入有效的天数(至少1天)',
|
||
revokeConfirm: "确定要撤销 '{user}' 的订阅吗?此操作无法撤销。"
|
||
},
|
||
|
||
// Accounts Management
|
||
accounts: {
|
||
title: '账号管理',
|
||
description: '管理 AI 平台账号和 Cookie',
|
||
createAccount: '添加账号',
|
||
autoRefresh: '自动刷新',
|
||
enableAutoRefresh: '启用自动刷新',
|
||
refreshInterval5s: '5 秒',
|
||
refreshInterval10s: '10 秒',
|
||
refreshInterval15s: '15 秒',
|
||
refreshInterval30s: '30 秒',
|
||
autoRefreshCountdown: '自动刷新:{seconds}s',
|
||
syncFromCrs: '从 CRS 同步',
|
||
syncFromCrsTitle: '从 CRS 同步账号',
|
||
syncFromCrsDesc:
|
||
'将 claude-relay-service(CRS)中的账号同步到当前系统(不会在浏览器侧直接请求 CRS)。',
|
||
crsVersionRequirement: '⚠️ 注意:CRS 版本必须 ≥ v1.1.240 才支持此功能',
|
||
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: '同步失败',
|
||
editAccount: '编辑账号',
|
||
deleteAccount: '删除账号',
|
||
deleteConfirmMessage: "确定要删除账号 '{name}' 吗?",
|
||
refreshCookie: '刷新 Cookie',
|
||
testAccount: '测试账号',
|
||
searchAccounts: '搜索账号...',
|
||
notes: '备注',
|
||
notesPlaceholder: '请输入备注',
|
||
notesHint: '备注可选',
|
||
// Filter options
|
||
allPlatforms: '全部平台',
|
||
allTypes: '全部类型',
|
||
allStatus: '全部状态',
|
||
oauthType: 'OAuth',
|
||
// Schedulable toggle
|
||
schedulable: '参与调度',
|
||
schedulableHint: '开启后账号参与API请求调度',
|
||
schedulableEnabled: '调度已开启',
|
||
schedulableDisabled: '调度已关闭',
|
||
failedToToggleSchedulable: '切换调度状态失败',
|
||
allGroups: '共 {count} 个分组',
|
||
columns: {
|
||
name: '名称',
|
||
platformType: '平台/类型',
|
||
platform: '平台',
|
||
type: '类型',
|
||
capacity: '容量',
|
||
notes: '备注',
|
||
priority: '优先级',
|
||
billingRateMultiplier: '账号倍率',
|
||
weight: '权重',
|
||
status: '状态',
|
||
schedulable: '调度',
|
||
todayStats: '今日统计',
|
||
groups: '分组',
|
||
usageWindows: '用量窗口',
|
||
proxy: '代理',
|
||
lastUsed: '最近使用',
|
||
expiresAt: '过期时间',
|
||
actions: '操作'
|
||
},
|
||
// 容量状态提示
|
||
capacity: {
|
||
windowCost: {
|
||
blocked: '5h窗口费用超限,账号暂停调度',
|
||
stickyOnly: '5h窗口费用达阈值,仅允许粘性会话',
|
||
normal: '5h窗口费用正常'
|
||
},
|
||
sessions: {
|
||
full: '活跃会话已满,新会话需等待(空闲超时:{idle}分钟)',
|
||
normal: '活跃会话正常(空闲超时:{idle}分钟)'
|
||
}
|
||
},
|
||
clearRateLimit: '清除速率限制',
|
||
testConnection: '测试连接',
|
||
reAuthorize: '重新授权',
|
||
refreshToken: '刷新令牌',
|
||
noAccountsYet: '暂无账号',
|
||
createFirstAccount: '添加 AI 平台账号以开始使用 API 网关。',
|
||
tokenRefreshed: 'Token 刷新成功',
|
||
accountDeleted: '账号删除成功',
|
||
rateLimitCleared: '速率限制已清除',
|
||
setupToken: 'Setup Token',
|
||
apiKey: 'API Key',
|
||
deleteConfirm: "确定要删除账号 '{name}' 吗?此操作无法撤销。",
|
||
failedToClearRateLimit: '清除速率限制失败',
|
||
platforms: {
|
||
claude: 'Claude',
|
||
openai: 'OpenAI',
|
||
anthropic: 'Anthropic',
|
||
gemini: 'Gemini',
|
||
antigravity: 'Antigravity'
|
||
},
|
||
types: {
|
||
oauth: 'OAuth',
|
||
chatgptOauth: 'ChatGPT OAuth',
|
||
responsesApi: 'Responses API',
|
||
googleOauth: 'Google OAuth',
|
||
codeAssist: 'Code Assist',
|
||
antigravityOauth: 'Antigravity OAuth',
|
||
upstream: '对接上游',
|
||
upstreamDesc: '通过 Base URL + API Key 连接上游',
|
||
api_key: 'API Key',
|
||
cookie: 'Cookie'
|
||
},
|
||
status: {
|
||
active: '正常',
|
||
inactive: '停用',
|
||
error: '错误',
|
||
cooldown: '冷却中',
|
||
paused: '暂停',
|
||
limited: '限流',
|
||
rateLimited: '限流中',
|
||
overloaded: '过载中',
|
||
tempUnschedulable: '临时不可调度',
|
||
rateLimitedUntil: '限流中,重置时间:{time}',
|
||
scopeRateLimitedUntil: '{scope} 限流中,重置时间:{time}',
|
||
overloadedUntil: '负载过重,重置时间:{time}',
|
||
viewTempUnschedDetails: '查看临时不可调度详情'
|
||
},
|
||
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 分钟'
|
||
}
|
||
},
|
||
usageWindow: {
|
||
statsTitle: '5小时窗口用量统计',
|
||
statsTitleDaily: '每日用量统计',
|
||
geminiProDaily: 'Pro',
|
||
geminiFlashDaily: 'Flash',
|
||
gemini3Pro: 'G3P',
|
||
gemini3Flash: 'G3F',
|
||
gemini3Image: 'G3I',
|
||
claude45: 'C4.5'
|
||
},
|
||
tier: {
|
||
free: 'Free',
|
||
pro: 'Pro',
|
||
ultra: 'Ultra',
|
||
aiPremium: 'AI Premium',
|
||
standard: '标准版',
|
||
basic: '基础版',
|
||
personal: '个人版',
|
||
unlimited: '无限制'
|
||
},
|
||
ineligibleWarning:
|
||
'该账号无 Antigravity 使用权限,但仍能进行 API 转发。继续使用请自行承担风险。',
|
||
form: {
|
||
nameLabel: '账号名称',
|
||
namePlaceholder: '请输入账号名称',
|
||
platformLabel: '平台',
|
||
selectPlatform: '选择平台',
|
||
typeLabel: '类型',
|
||
selectType: '选择类型',
|
||
credentialsLabel: '凭证',
|
||
credentialsPlaceholder: '请输入 Cookie 或 API Key',
|
||
priorityLabel: '优先级',
|
||
priorityHint: '数值越小优先级越高',
|
||
weightLabel: '权重',
|
||
weightHint: '用于负载均衡的权重值',
|
||
statusLabel: '状态'
|
||
},
|
||
filters: {
|
||
platform: '平台',
|
||
allPlatforms: '全部平台',
|
||
type: '类型',
|
||
allTypes: '全部类型',
|
||
status: '状态',
|
||
allStatuses: '全部状态'
|
||
},
|
||
saving: '保存中...',
|
||
refreshing: '刷新中...',
|
||
testing: '测试中...',
|
||
noAccounts: '暂无账号',
|
||
noAccountsDescription: '添加 AI 平台账号以开始使用 API 网关。',
|
||
accountCreatedSuccess: '账号添加成功',
|
||
accountUpdatedSuccess: '账号更新成功',
|
||
accountDeletedSuccess: '账号删除成功',
|
||
bulkSchedulableEnabled: '成功启用 {count} 个账号的调度',
|
||
bulkSchedulableDisabled: '成功停止 {count} 个账号的调度',
|
||
bulkSchedulablePartial: '部分调度更新成功:成功 {success} 个,失败 {failed} 个',
|
||
bulkSchedulableResultUnknown: '批量调度结果不完整,请稍后重试或刷新列表',
|
||
bulkActions: {
|
||
selected: '已选择 {count} 个账号',
|
||
selectCurrentPage: '本页全选',
|
||
clear: '清除选择',
|
||
edit: '批量编辑账号',
|
||
delete: '批量删除',
|
||
enableScheduling: '批量启用调度',
|
||
disableScheduling: '批量停止调度'
|
||
},
|
||
bulkEdit: {
|
||
title: '批量编辑账号',
|
||
selectionInfo: '已选择 {count} 个账号。只更新您勾选或填写的字段,未勾选的字段保持不变。',
|
||
baseUrlPlaceholder: 'https://api.anthropic.com 或 https://api.openai.com',
|
||
baseUrlNotice: '仅适用于 API Key 账号,留空则不修改',
|
||
submit: '批量更新',
|
||
updating: '更新中...',
|
||
success: '成功更新 {count} 个账号',
|
||
partialSuccess: '部分更新成功:成功 {success} 个,失败 {failed} 个',
|
||
failed: '批量更新失败',
|
||
noSelection: '请选择要编辑的账号',
|
||
noFieldsSelected: '请至少选择一个要更新的字段'
|
||
},
|
||
bulkDeleteTitle: '批量删除账号',
|
||
bulkDeleteConfirm: '确定要删除选中的 {count} 个账号吗?此操作无法撤销。',
|
||
bulkDeleteSuccess: '成功删除 {count} 个账号',
|
||
bulkDeletePartial: '部分删除成功:成功 {success} 个,失败 {failed} 个',
|
||
bulkDeleteFailed: '批量删除失败',
|
||
resetStatus: '重置状态',
|
||
statusReset: '账号状态已重置',
|
||
failedToResetStatus: '重置账号状态失败',
|
||
cookieRefreshedSuccess: 'Cookie 刷新成功',
|
||
testSuccess: '账号测试通过',
|
||
testFailed: '账号测试失败',
|
||
failedToLoad: '加载账号列表失败',
|
||
failedToSave: '保存账号失败',
|
||
failedToDelete: '删除账号失败',
|
||
failedToRefresh: '刷新 Cookie 失败',
|
||
// Create/Edit Account Modal
|
||
platform: '平台',
|
||
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',
|
||
// OpenAI specific hints
|
||
openai: {
|
||
baseUrlHint: '留空使用官方 OpenAI API',
|
||
apiKeyHint: '您的 OpenAI API Key'
|
||
},
|
||
modelRestriction: '模型限制(可选)',
|
||
modelWhitelist: '模型白名单',
|
||
modelMapping: '模型映射',
|
||
selectAllowedModels: '选择允许的模型。留空则支持所有模型。',
|
||
mapRequestModels: '将请求模型映射到实际模型。左边是请求的模型,右边是发送到 API 的实际模型。',
|
||
selectedModels: '已选择 {count} 个模型',
|
||
supportsAllModels: '(支持所有模型)',
|
||
requestModel: '请求模型',
|
||
actualModel: '实际模型',
|
||
addMapping: '添加映射',
|
||
mappingExists: '模型 {model} 的映射已存在',
|
||
searchModels: '搜索模型...',
|
||
noMatchingModels: '没有匹配的模型',
|
||
fillRelatedModels: '填入相关模型',
|
||
clearAllModels: '清除所有模型',
|
||
customModelName: '自定义模型名称',
|
||
enterCustomModelName: '输入自定义模型名称',
|
||
addModel: '填入',
|
||
modelExists: '该模型已存在',
|
||
modelCount: '{count} 个模型',
|
||
customErrorCodes: '自定义错误码',
|
||
customErrorCodesHint: '仅对选中的错误码停止调度',
|
||
customErrorCodesWarning: '仅选中的错误码会停止调度,其他错误将返回 500。',
|
||
customErrorCodes429Warning:
|
||
'429 已有内置的限流处理机制。添加到自定义错误码后,将直接停止调度而非临时限流。确定要添加吗?',
|
||
customErrorCodes529Warning:
|
||
'529 已有内置的过载处理机制。添加到自定义错误码后,将直接停止调度而非临时标记过载。确定要添加吗?',
|
||
selectedErrorCodes: '已选择',
|
||
noneSelectedUsesDefault: '未选择(使用默认策略)',
|
||
enterErrorCode: '输入错误码 (100-599)',
|
||
invalidErrorCode: '请输入有效的 HTTP 错误码 (100-599)',
|
||
errorCodeExists: '该错误码已被选中',
|
||
interceptWarmupRequests: '拦截预热请求',
|
||
interceptWarmupRequestsDesc: '启用后,标题生成等预热请求将返回 mock 响应,不消耗上游 token',
|
||
autoPauseOnExpired: '过期自动暂停调度',
|
||
autoPauseOnExpiredDesc: '启用后,账号过期将自动暂停调度',
|
||
// Quota control (Anthropic OAuth/SetupToken only)
|
||
quotaControl: {
|
||
title: '配额控制',
|
||
hint: '仅适用于 Anthropic OAuth/Setup Token 账号',
|
||
windowCost: {
|
||
label: '5h窗口费用控制',
|
||
hint: '限制账号在5小时窗口内的费用使用',
|
||
limit: '费用阈值',
|
||
limitPlaceholder: '50',
|
||
limitHint: '达到阈值后不参与新请求调度',
|
||
stickyReserve: '粘性预留额度',
|
||
stickyReservePlaceholder: '10',
|
||
stickyReserveHint: '为粘性会话预留的额外额度'
|
||
},
|
||
sessionLimit: {
|
||
label: '会话数量控制',
|
||
hint: '限制同时活跃的会话数量',
|
||
maxSessions: '最大会话数',
|
||
maxSessionsPlaceholder: '3',
|
||
maxSessionsHint: '同时活跃的最大会话数量',
|
||
idleTimeout: '空闲超时',
|
||
idleTimeoutPlaceholder: '5',
|
||
idleTimeoutHint: '会话空闲超时后自动释放'
|
||
},
|
||
tlsFingerprint: {
|
||
label: 'TLS 指纹模拟',
|
||
hint: '模拟 Node.js/Claude Code 客户端的 TLS 指纹'
|
||
},
|
||
sessionIdMasking: {
|
||
label: '会话 ID 伪装',
|
||
hint: '启用后将在 15 分钟内固定 metadata.user_id 中的 session ID,使上游认为请求来自同一会话'
|
||
}
|
||
},
|
||
expired: '已过期',
|
||
proxy: '代理',
|
||
noProxy: '无代理',
|
||
concurrency: '并发数',
|
||
priority: '优先级',
|
||
priorityHint: '优先级越小的账号优先使用',
|
||
billingRateMultiplier: '账号计费倍率',
|
||
billingRateMultiplierHint: '>=0,0 表示该账号计费为 0;仅影响账号计费口径',
|
||
expiresAt: '过期时间',
|
||
expiresAtHint: '留空表示不过期',
|
||
higherPriorityFirst: '数值越小优先级越高',
|
||
mixedScheduling: '在 /v1/messages 中使用',
|
||
mixedSchedulingHint: '启用后可参与 Anthropic/Gemini 分组的调度',
|
||
mixedSchedulingTooltip:
|
||
'!!注意!! Antigravity Claude 和 Anthropic Claude 无法在同个上下文中使用,如果你同时有 Anthropic 账号和 Antigravity 账号,开启此选项会导致经常 400 报错。开启后,请用分组功能做好 Antigravity 账号和 Anthropic 账号的隔离。一定要弄明白再开启!!',
|
||
creating: '创建中...',
|
||
updating: '更新中...',
|
||
accountCreated: '账号创建成功',
|
||
accountUpdated: '账号更新成功',
|
||
failedToCreate: '创建账号失败',
|
||
failedToUpdate: '更新账号失败',
|
||
mixedChannelWarningTitle: '混合渠道警告',
|
||
mixedChannelWarning: '警告:分组 "{groupName}" 中同时包含 {currentPlatform} 和 {otherPlatform} 账号。混合使用不同渠道可能导致 thinking block 签名验证问题,会自动回退到非 thinking 模式。确定要继续吗?',
|
||
pleaseEnterAccountName: '请输入账号名称',
|
||
pleaseEnterApiKey: '请输入 API Key',
|
||
apiKeyIsRequired: 'API Key 是必需的',
|
||
leaveEmptyToKeep: '留空以保持当前密钥',
|
||
// Upstream type
|
||
upstream: {
|
||
baseUrl: '上游 Base URL',
|
||
baseUrlHint: '上游 Antigravity 服务的地址,例如:https://upstream.example.com',
|
||
apiKey: '上游 API Key',
|
||
apiKeyHint: '上游服务的 API Key',
|
||
pleaseEnterBaseUrl: '请输入上游 Base URL',
|
||
pleaseEnterApiKey: '请输入上游 API Key'
|
||
},
|
||
// OAuth flow
|
||
oauth: {
|
||
title: 'Claude 账号授权',
|
||
authMethod: '授权方式',
|
||
manualAuth: '手动授权',
|
||
cookieAutoAuth: 'Cookie 自动授权',
|
||
cookieAutoAuthDesc: '使用 claude.ai sessionKey 自动完成 OAuth 授权,无需手动打开浏览器。',
|
||
sessionKey: 'sessionKey',
|
||
keysCount: '{count} 个密钥',
|
||
batchCreateAccounts: '将批量创建 {count} 个账号',
|
||
sessionKeyPlaceholder:
|
||
'每行一个 sessionKey,例如:\nsk-ant-sid01-xxxxx...\nsk-ant-sid01-yyyyy...',
|
||
sessionKeyPlaceholderSingle: 'sk-ant-sid01-xxxxx...',
|
||
howToGetSessionKey: '如何获取 sessionKey',
|
||
step1: '在浏览器中登录 claude.ai',
|
||
step2: '按 F12 打开开发者工具',
|
||
step3: '切换到 Application 标签',
|
||
step4: '找到 Cookies → https://claude.ai',
|
||
step5: '找到 sessionKey 所在行',
|
||
step6: '复制 Value 列的值',
|
||
sessionKeyFormat: 'sessionKey 通常以 sk-ant-sid01- 开头',
|
||
startAutoAuth: '开始自动授权',
|
||
authorizing: '授权中...',
|
||
followSteps: '按照以下步骤授权您的 Claude 账号:',
|
||
step1GenerateUrl: '点击下方按钮生成授权 URL',
|
||
generateAuthUrl: '生成授权 URL',
|
||
generating: '生成中...',
|
||
regenerate: '重新生成',
|
||
step2OpenUrl: '在浏览器中打开 URL 并完成授权',
|
||
openUrlDesc: '在新标签页中打开授权 URL,登录您的 Claude 账号并授权。',
|
||
proxyWarning:
|
||
'注意:如果您配置了代理,请确保浏览器使用相同的代理访问授权页面。',
|
||
step3EnterCode: '输入授权码',
|
||
authCodeDesc: '授权完成后,页面会显示一个授权码。复制并粘贴到下方:',
|
||
authCode: '授权码',
|
||
authCodePlaceholder: '粘贴 Claude 页面的授权码...',
|
||
authCodeHint: '粘贴从 Claude 页面复制的授权码',
|
||
completeAuth: '完成授权',
|
||
verifying: '验证中...',
|
||
pleaseEnterSessionKey: '请输入至少一个有效的 sessionKey',
|
||
authFailed: '授权失败',
|
||
cookieAuthFailed: 'Cookie 授权失败',
|
||
keyAuthFailed: '密钥 {index}: {error}',
|
||
successCreated: '成功创建 {count} 个账号',
|
||
// OpenAI specific
|
||
openai: {
|
||
title: 'OpenAI 账户授权',
|
||
followSteps: '请按照以下步骤完成 OpenAI 账户的授权:',
|
||
step1GenerateUrl: '点击下方按钮生成授权链接',
|
||
generateAuthUrl: '生成授权链接',
|
||
step2OpenUrl: '在浏览器中打开链接并完成授权',
|
||
openUrlDesc: '请在新标签页中打开授权链接,登录您的 OpenAI 账户并授权。',
|
||
importantNotice:
|
||
'重要提示:授权后页面可能会加载较长时间,请耐心等待。当浏览器地址栏变为 http://localhost... 开头时,表示授权已完成。',
|
||
step3EnterCode: '输入授权链接或 Code',
|
||
authCodeDesc:
|
||
'授权完成后,当页面地址变为 http://localhost:xxx/auth/callback?code=... 时:',
|
||
authCode: '授权链接或 Code',
|
||
authCodePlaceholder:
|
||
'方式1:复制完整的链接\n(http://localhost:xxx/auth/callback?code=...)\n方式2:仅复制 code 参数的值',
|
||
authCodeHint: '您可以直接复制整个链接或仅复制 code 参数值,系统会自动识别'
|
||
},
|
||
// Gemini specific
|
||
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,粘贴到下方即可。',
|
||
authCode: '回调链接或 Code',
|
||
authCodePlaceholder: '方式1(推荐):粘贴回调链接\n方式2:仅粘贴 code 参数的值',
|
||
authCodeHint: '系统会自动从链接中解析 code/state。',
|
||
redirectUri: 'Redirect URI',
|
||
redirectUriHint: '需要在 Google OAuth Client 中配置,且必须与此处完全一致。',
|
||
confirmRedirectUri: '我已在 Google OAuth Client 中配置了该 Redirect URI(必须完全一致)',
|
||
invalidRedirectUri: 'Redirect URI 必须是合法的 http(s) URL',
|
||
redirectUriNotConfirmed: '请确认 Redirect URI 已在 Google OAuth Client 中正确配置',
|
||
missingRedirectUri: '缺少 Redirect URI',
|
||
failedToGenerateUrl: '生成 Gemini 授权链接失败',
|
||
missingExchangeParams: '缺少 code / session_id / state',
|
||
failedToExchangeCode: 'Gemini 授权码兑换失败',
|
||
missingProjectId: 'GCP Project ID 获取失败:您的 Google 账号未关联有效的 GCP 项目。请前往 Google Cloud Console 激活 GCP 并绑定信用卡,或在授权时手动填写 Project ID。',
|
||
modelPassthrough: 'Gemini 直接转发模型',
|
||
modelPassthroughDesc: '所有模型请求将直接转发至 Gemini API,不进行模型限制或映射。',
|
||
stateWarningTitle: '提示',
|
||
stateWarningDesc: '建议粘贴完整回调链接(包含 code 和 state)。',
|
||
oauthTypeLabel: 'OAuth 类型',
|
||
needsProjectId: '内置授权(Code Assist)',
|
||
needsProjectIdDesc: '需要 GCP 项目与 Project ID',
|
||
noProjectIdNeeded: '自定义授权(AI Studio)',
|
||
noProjectIdNeededDesc: '需管理员配置 OAuth Client',
|
||
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'
|
||
},
|
||
// Antigravity specific
|
||
antigravity: {
|
||
title: 'Antigravity 账户授权',
|
||
followSteps: '请按照以下步骤完成 Antigravity 账户的授权:',
|
||
step1GenerateUrl: '生成授权链接',
|
||
generateAuthUrl: '生成授权链接',
|
||
step2OpenUrl: '在浏览器中打开链接并完成授权',
|
||
openUrlDesc: '请在新标签页中打开授权链接,登录您的 Google 账户并授权。',
|
||
importantNotice:
|
||
'重要提示:授权后页面可能会加载较长时间,请耐心等待。当浏览器地址栏变为 http://localhost... 开头时,表示授权已完成。',
|
||
step3EnterCode: '输入授权链接或 Code',
|
||
authCodeDesc:
|
||
'授权完成后,当页面地址变为 http://localhost:xxx/auth/callback?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 授权码兑换失败'
|
||
}
|
||
},
|
||
// Gemini specific (platform-wide)
|
||
gemini: {
|
||
helpButton: '使用帮助',
|
||
helpDialog: {
|
||
title: 'Gemini 使用指南',
|
||
apiKeySection: 'API Key 相关链接'
|
||
},
|
||
modelPassthrough: 'Gemini 直接转发模型',
|
||
modelPassthroughDesc: '所有模型请求将直接转发至 Gemini API,不进行模型限制或映射。',
|
||
baseUrlHint: '留空使用官方 Gemini API',
|
||
apiKeyHint: '您的 Gemini API Key(以 AIza 开头)',
|
||
tier: {
|
||
label: '账号等级',
|
||
hint: '提示:系统会优先尝试自动识别账号等级;若自动识别不可用或失败,则使用你选择的等级作为回退(本地模拟配额)。',
|
||
aiStudioHint: 'AI Studio 的配额是按模型分别限流(Pro/Flash 独立)。若已绑卡(按量付费),请选 Pay-as-you-go。',
|
||
googleOne: {
|
||
free: 'Google One Free',
|
||
pro: 'Google One Pro',
|
||
ultra: 'Google One Ultra'
|
||
},
|
||
gcp: {
|
||
standard: 'GCP Standard',
|
||
enterprise: 'GCP Enterprise'
|
||
},
|
||
aiStudio: {
|
||
free: 'Google AI Free',
|
||
paid: 'Google AI Pay-as-you-go'
|
||
}
|
||
},
|
||
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: {
|
||
googleOne: {
|
||
channel: 'Google One OAuth(个人版 / Code Assist for Individuals)',
|
||
limitsFree: '共享池:1000 RPD / 60 RPM(不分模型)',
|
||
limitsPro: '共享池:1500 RPD / 120 RPM(不分模型)',
|
||
limitsUltra: '共享池:2000 RPD / 120 RPM(不分模型)'
|
||
},
|
||
gcp: {
|
||
channel: 'GCP Code Assist OAuth(企业版)',
|
||
limitsStandard: '共享池:1500 RPD / 120 RPM(不分模型)',
|
||
limitsEnterprise: '共享池:2000 RPD / 120 RPM(不分模型)'
|
||
},
|
||
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(Pro)/ 2000(Flash)(按模型配额)'
|
||
},
|
||
customOAuth: {
|
||
channel: 'Custom OAuth Client(GCP)',
|
||
free: '项目未绑卡',
|
||
paid: '项目已绑卡',
|
||
limitsFree: 'RPD 50;RPM 2(项目配额)',
|
||
limitsPaid: 'RPD 不限;RPM 1000+(项目配额)'
|
||
}
|
||
}
|
||
},
|
||
rateLimit: {
|
||
ok: '未限流',
|
||
unlimited: '无限流',
|
||
limited: '限流 {time}',
|
||
now: '现在'
|
||
}
|
||
},
|
||
// Re-Auth Modal
|
||
reAuthorizeAccount: '重新授权账号',
|
||
claudeCodeAccount: 'Claude Code 账号',
|
||
openaiAccount: 'OpenAI 账号',
|
||
geminiAccount: 'Gemini 账号',
|
||
antigravityAccount: 'Antigravity 账号',
|
||
inputMethod: '输入方式',
|
||
reAuthorizedSuccess: '账号重新授权成功',
|
||
// Test Modal
|
||
testAccountConnection: '测试账号连接',
|
||
account: '账号',
|
||
readyToTest: '准备测试。点击"开始测试"按钮开始...',
|
||
connectingToApi: '连接 API 中...',
|
||
testCompleted: '测试完成!',
|
||
connectedToApi: '已连接到 API',
|
||
usingModel: '使用模型:{model}',
|
||
sendingTestMessage: '发送测试消息:"hi"',
|
||
response: '响应:',
|
||
startTest: '开始测试',
|
||
retry: '重试',
|
||
copyOutput: '复制输出',
|
||
outputCopied: '输出已复制',
|
||
startingTestForAccount: '开始测试账号:{name}',
|
||
testAccountTypeLabel: '账号类型:{type}',
|
||
selectTestModel: '选择测试模型',
|
||
testModel: '测试模型',
|
||
testPrompt: '提示词:"hi"',
|
||
// Stats Modal
|
||
viewStats: '查看统计',
|
||
usageStatistics: '使用统计',
|
||
last30DaysUsage: '近30天使用统计(日均基于实际使用天数)',
|
||
stats: {
|
||
totalCost: '30天总费用',
|
||
accumulatedCost: '累计成本',
|
||
standardCost: '标准计费',
|
||
totalRequests: '30天总请求',
|
||
totalCalls: '累计调用次数',
|
||
avgDailyCost: '日均费用',
|
||
basedOnActualDays: '基于 {days} 天实际使用',
|
||
avgDailyRequests: '日均请求',
|
||
avgDailyUsage: '平均每日调用',
|
||
todayOverview: '今日概览',
|
||
cost: '费用',
|
||
requests: '请求',
|
||
tokens: 'Token',
|
||
highestCostDay: '最高费用日',
|
||
highestRequestDay: '最高请求日',
|
||
date: '日期',
|
||
accumulatedTokens: '累计 Token',
|
||
totalTokens: '30天总计',
|
||
dailyAvgTokens: '日均 Token',
|
||
performance: '性能',
|
||
avgResponseTime: '平均响应',
|
||
daysActive: '活跃天数',
|
||
recentActivity: '最近统计',
|
||
todayRequests: '今日请求',
|
||
todayTokens: '今日 Token',
|
||
todayCost: '今日费用',
|
||
usageTrend: '30天费用与请求趋势',
|
||
noData: '该账号暂无使用数据'
|
||
}
|
||
},
|
||
|
||
// Proxies Management
|
||
proxies: {
|
||
title: 'IP管理',
|
||
description: '管理代理服务器配置',
|
||
createProxy: '添加代理',
|
||
editProxy: '编辑代理',
|
||
deleteProxy: '删除代理',
|
||
deleteConfirmMessage: "确定要删除代理 '{name}' 吗?",
|
||
testProxy: '测试代理',
|
||
columns: {
|
||
name: '名称',
|
||
protocol: '协议',
|
||
address: '地址',
|
||
location: '地理位置',
|
||
status: '状态',
|
||
accounts: '账号数',
|
||
latency: '延迟',
|
||
actions: '操作',
|
||
nameLabel: '名称',
|
||
namePlaceholder: '请输入代理名称',
|
||
protocolLabel: '协议',
|
||
selectProtocol: '选择协议',
|
||
hostLabel: '主机',
|
||
hostPlaceholder: '请输入主机地址',
|
||
portLabel: '端口',
|
||
portPlaceholder: '请输入端口',
|
||
usernameLabel: '用户名(可选)',
|
||
usernamePlaceholder: '请输入用户名',
|
||
passwordLabel: '密码(可选)',
|
||
passwordPlaceholder: '请输入密码',
|
||
priorityLabel: '优先级',
|
||
statusLabel: '状态'
|
||
},
|
||
filters: {
|
||
protocol: '协议',
|
||
allProtocols: '全部协议',
|
||
status: '状态',
|
||
allStatuses: '全部状态'
|
||
},
|
||
// Additional keys used in ProxiesView
|
||
allProtocols: '全部协议',
|
||
allStatus: '全部状态',
|
||
searchProxies: '搜索代理...',
|
||
name: '名称',
|
||
protocol: '协议',
|
||
host: '主机',
|
||
port: '端口',
|
||
username: '用户名(可选)',
|
||
password: '密码(可选)',
|
||
status: '状态',
|
||
enterProxyName: '请输入代理名称',
|
||
optionalAuth: '可选认证信息',
|
||
leaveEmptyToKeep: '留空保持不变',
|
||
form: {
|
||
hostPlaceholder: '请输入主机地址',
|
||
portPlaceholder: '请输入端口'
|
||
},
|
||
noProxiesYet: '暂无代理',
|
||
createFirstProxy: '添加您的第一个代理以开始使用。',
|
||
testConnection: '测试连接',
|
||
batchTest: '批量测试',
|
||
testFailed: '失败',
|
||
latencyFailed: '链接失败',
|
||
batchTestEmpty: '暂无可测试的代理',
|
||
batchTestDone: '批量测试完成,共测试 {count} 个代理',
|
||
batchTestFailed: '批量测试失败',
|
||
batchDeleteAction: '删除',
|
||
batchDelete: '批量删除',
|
||
batchDeleteConfirm: '确定删除选中的 {count} 个代理吗?已被账号使用的将自动跳过。',
|
||
batchDeleteDone: '已删除 {deleted} 个代理,跳过 {skipped} 个',
|
||
batchDeleteSkipped: '已跳过 {skipped} 个代理',
|
||
batchDeleteFailed: '批量删除失败',
|
||
deleteBlockedInUse: '该代理已有账号使用,无法删除',
|
||
accountsTitle: '使用该IP的账号',
|
||
accountsEmpty: '暂无账号使用此代理',
|
||
accountsFailed: '获取账号列表失败',
|
||
accountName: '账号名称',
|
||
accountPlatform: '所属平台',
|
||
accountNotes: '备注',
|
||
// Batch import
|
||
standardAdd: '标准添加',
|
||
batchAdd: '快捷添加',
|
||
batchInput: '代理列表',
|
||
batchInputPlaceholder:
|
||
"每行输入一个代理,支持以下格式:\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 协议,格式:协议://[用户名:密码{'@'}]主机:端口",
|
||
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: '测试代理失败',
|
||
nameRequired: '请输入代理名称',
|
||
hostRequired: '请输入主机地址',
|
||
portInvalid: '端口必须在 1-65535 之间',
|
||
deleteConfirm: "确定要删除代理 '{name}' 吗?使用此代理的账号将被移除代理设置。"
|
||
},
|
||
|
||
// Redeem Codes Management
|
||
redeem: {
|
||
title: '兑换码管理',
|
||
description: '生成和管理兑换码',
|
||
generateCodes: '生成兑换码',
|
||
columns: {
|
||
code: '兑换码',
|
||
type: '类型',
|
||
value: '面值',
|
||
status: '状态',
|
||
usedBy: '使用者',
|
||
usedAt: '使用时间',
|
||
createdAt: '创建时间',
|
||
actions: '操作'
|
||
},
|
||
types: {
|
||
balance: '余额',
|
||
concurrency: '并发数',
|
||
subscription: '订阅',
|
||
invitation: '邀请码',
|
||
// 管理员在用户管理页面调整余额/并发时产生的记录
|
||
admin_balance: '余额(管理员)',
|
||
admin_concurrency: '并发数(管理员)'
|
||
},
|
||
// 用于选择器和筛选器的直接键
|
||
balance: '余额',
|
||
concurrency: '并发数',
|
||
subscription: '订阅',
|
||
invitation: '邀请码',
|
||
invitationHint: '邀请码用于限制用户注册,使用后自动标记为已使用。',
|
||
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: '天',
|
||
status: {
|
||
unused: '未使用',
|
||
used: '已使用',
|
||
expired: '已过期',
|
||
disabled: '已禁用'
|
||
},
|
||
form: {
|
||
typeLabel: '类型',
|
||
selectType: '选择类型',
|
||
valueLabel: '面值',
|
||
valuePlaceholder: '请输入面值',
|
||
balanceHint: '余额金额(美元)',
|
||
concurrencyHint: '并发数增量',
|
||
countLabel: '数量',
|
||
countPlaceholder: '请输入数量',
|
||
countHint: '要生成的兑换码数量',
|
||
prefixLabel: '前缀(可选)',
|
||
prefixPlaceholder: '例如:GIFT',
|
||
expiresLabel: '过期时间(可选)'
|
||
},
|
||
filters: {
|
||
type: '类型',
|
||
allTypes: '全部类型',
|
||
status: '状态',
|
||
allStatuses: '全部状态',
|
||
search: '搜索兑换码'
|
||
},
|
||
generating: '生成中...',
|
||
copyCode: '复制',
|
||
copied: '已复制!',
|
||
disableCode: '禁用',
|
||
enableCode: '启用',
|
||
deleteCode: '删除',
|
||
deleteConfirmMessage: '确定要删除此兑换码吗?',
|
||
noCodes: '暂无兑换码',
|
||
noCodesDescription: '生成兑换码以向用户分发余额或并发数。',
|
||
codesGeneratedSuccess: '兑换码生成成功,共 {count} 个',
|
||
codeDisabledSuccess: '兑换码已禁用',
|
||
codeEnabledSuccess: '兑换码已启用',
|
||
codeDeletedSuccess: '兑换码删除成功',
|
||
failedToLoad: '加载兑换码列表失败',
|
||
failedToGenerate: '生成兑换码失败',
|
||
failedToUpdate: '更新兑换码失败',
|
||
failedToDelete: '删除兑换码失败'
|
||
},
|
||
|
||
// Announcements
|
||
announcements: {
|
||
title: '公告管理',
|
||
description: '创建公告并按条件投放',
|
||
createAnnouncement: '创建公告',
|
||
editAnnouncement: '编辑公告',
|
||
deleteAnnouncement: '删除公告',
|
||
searchAnnouncements: '搜索公告...',
|
||
status: '状态',
|
||
allStatus: '全部状态',
|
||
columns: {
|
||
title: '标题',
|
||
status: '状态',
|
||
targeting: '展示条件',
|
||
timeRange: '有效期',
|
||
createdAt: '创建时间',
|
||
actions: '操作'
|
||
},
|
||
statusLabels: {
|
||
draft: '草稿',
|
||
active: '展示中',
|
||
archived: '已归档'
|
||
},
|
||
form: {
|
||
title: '标题',
|
||
content: '内容(支持 Markdown)',
|
||
status: '状态',
|
||
startsAt: '开始时间',
|
||
endsAt: '结束时间',
|
||
startsAtHint: '留空表示立即生效',
|
||
endsAtHint: '留空表示永久生效',
|
||
targetingMode: '展示条件',
|
||
targetingAll: '所有用户',
|
||
targetingCustom: '按条件',
|
||
addOrGroup: '添加 OR 条件组',
|
||
addAndCondition: '添加 AND 条件',
|
||
conditionType: '条件类型',
|
||
conditionSubscription: '订阅套餐',
|
||
conditionBalance: '余额',
|
||
operator: '运算符',
|
||
balanceValue: '余额阈值',
|
||
selectPackages: '选择套餐'
|
||
},
|
||
operators: {
|
||
gt: '>',
|
||
gte: '≥',
|
||
lt: '<',
|
||
lte: '≤',
|
||
eq: '='
|
||
},
|
||
targetingSummaryAll: '全部用户',
|
||
targetingSummaryCustom: '自定义({groups} 组)',
|
||
timeImmediate: '立即',
|
||
timeNever: '永久',
|
||
readStatus: '已读情况',
|
||
eligible: '符合条件',
|
||
readAt: '已读时间',
|
||
unread: '未读',
|
||
searchUsers: '搜索用户...',
|
||
failedToLoad: '加载公告失败',
|
||
failedToCreate: '创建公告失败',
|
||
failedToUpdate: '更新公告失败',
|
||
failedToDelete: '删除公告失败',
|
||
failedToLoadReadStatus: '加载已读情况失败',
|
||
deleteConfirm: '确定要删除该公告吗?此操作无法撤销。'
|
||
},
|
||
|
||
// Promo Codes
|
||
promo: {
|
||
title: '优惠码管理',
|
||
description: '创建和管理注册优惠码',
|
||
createCode: '创建优惠码',
|
||
editCode: '编辑优惠码',
|
||
deleteCode: '删除优惠码',
|
||
searchCodes: '搜索优惠码...',
|
||
allStatus: '全部状态',
|
||
columns: {
|
||
code: '优惠码',
|
||
bonusAmount: '赠送金额',
|
||
maxUses: '最大使用次数',
|
||
usedCount: '已使用',
|
||
usage: '使用量',
|
||
status: '状态',
|
||
expiresAt: '过期时间',
|
||
createdAt: '创建时间',
|
||
actions: '操作'
|
||
},
|
||
// 表单标签(扁平结构便于模板使用)
|
||
code: '优惠码',
|
||
autoGenerate: '留空自动生成',
|
||
codePlaceholder: '输入优惠码或留空',
|
||
bonusAmount: '赠送金额 ($)',
|
||
maxUses: '最大使用次数',
|
||
zeroUnlimited: '0 = 无限制',
|
||
expiresAt: '过期时间',
|
||
notes: '备注',
|
||
notesPlaceholder: '可选备注信息',
|
||
status: '状态',
|
||
neverExpires: '永不过期',
|
||
// 状态标签
|
||
statusActive: '启用',
|
||
statusDisabled: '禁用',
|
||
statusExpired: '已过期',
|
||
statusMaxUsed: '已用完',
|
||
// 使用记录
|
||
usageRecords: '使用记录',
|
||
viewUsages: '查看使用记录',
|
||
noUsages: '暂无使用记录',
|
||
userPrefix: '用户 #{id}',
|
||
copied: '已复制!',
|
||
// 消息
|
||
noCodesYet: '暂无优惠码',
|
||
createFirstCode: '创建您的第一个优惠码,为新用户提供注册奖励。',
|
||
codeCreated: '优惠码创建成功',
|
||
codeUpdated: '优惠码更新成功',
|
||
codeDeleted: '优惠码删除成功',
|
||
deleteCodeConfirm: '确定要删除此优惠码吗?此操作无法撤销。',
|
||
copyRegisterLink: '复制注册链接',
|
||
registerLinkCopied: '注册链接已复制到剪贴板',
|
||
failedToLoad: '加载优惠码失败',
|
||
failedToCreate: '创建优惠码失败',
|
||
failedToUpdate: '更新优惠码失败',
|
||
failedToDelete: '删除优惠码失败',
|
||
failedToLoadUsages: '加载使用记录失败'
|
||
},
|
||
|
||
// Usage Records
|
||
usage: {
|
||
title: '使用记录',
|
||
description: '查看和管理所有用户的使用记录',
|
||
userFilter: '用户',
|
||
searchUserPlaceholder: '按邮箱搜索用户...',
|
||
searchApiKeyPlaceholder: '按名称搜索 API 密钥...',
|
||
searchAccountPlaceholder: '按名称搜索账号...',
|
||
selectedUser: '已选择',
|
||
user: '用户',
|
||
account: '账户',
|
||
group: '分组',
|
||
requestId: '请求ID',
|
||
requestIdCopied: '请求ID已复制',
|
||
allModels: '全部模型',
|
||
allAccounts: '全部账户',
|
||
allGroups: '全部分组',
|
||
allTypes: '全部类型',
|
||
inputCost: '输入成本',
|
||
outputCost: '输出成本',
|
||
cacheCreationCost: '缓存创建成本',
|
||
cacheReadCost: '缓存读取成本',
|
||
inputTokens: '输入 Token',
|
||
outputTokens: '输出 Token',
|
||
cacheCreationTokens: '缓存创建 Token',
|
||
cacheReadTokens: '缓存读取 Token',
|
||
failedToLoad: '加载使用记录失败',
|
||
billingType: '计费类型',
|
||
allBillingTypes: '全部计费类型',
|
||
billingTypeBalance: '钱包余额',
|
||
billingTypeSubscription: '订阅套餐',
|
||
ipAddress: 'IP',
|
||
cleanup: {
|
||
button: '清理',
|
||
title: '清理使用记录',
|
||
warning: '清理不可恢复,且会影响历史统计回看。',
|
||
submit: '提交清理',
|
||
submitting: '提交中...',
|
||
confirmTitle: '确认清理',
|
||
confirmMessage: '确定要提交清理任务吗?清理不可恢复。',
|
||
confirmSubmit: '确认清理',
|
||
cancel: '取消任务',
|
||
cancelConfirmTitle: '确认取消',
|
||
cancelConfirmMessage: '确定要取消该清理任务吗?',
|
||
cancelConfirm: '确认取消',
|
||
cancelSuccess: '清理任务已取消',
|
||
cancelFailed: '取消清理任务失败',
|
||
recentTasks: '最近清理任务',
|
||
loadingTasks: '正在加载任务...',
|
||
noTasks: '暂无清理任务',
|
||
range: '时间范围',
|
||
deletedRows: '删除数量',
|
||
missingRange: '请选择时间范围',
|
||
submitSuccess: '清理任务已创建',
|
||
submitFailed: '创建清理任务失败',
|
||
loadFailed: '加载清理任务失败',
|
||
status: {
|
||
pending: '待执行',
|
||
running: '执行中',
|
||
succeeded: '已完成',
|
||
failed: '失败',
|
||
canceled: '已取消'
|
||
}
|
||
}
|
||
},
|
||
|
||
// Ops Monitoring
|
||
ops: {
|
||
title: '运维监控',
|
||
description: '运维监控与排障',
|
||
// Dashboard
|
||
systemHealth: '系统健康',
|
||
overview: '概览',
|
||
noSystemMetrics: '尚未收集系统指标。',
|
||
collectedAt: '采集时间:',
|
||
window: '窗口',
|
||
memory: '内存',
|
||
db: '数据库',
|
||
goroutines: '协程',
|
||
jobs: '后台任务',
|
||
jobsHelp: '点击“明细”查看任务心跳与报错信息',
|
||
active: '活跃',
|
||
idle: '空闲',
|
||
waiting: '等待',
|
||
conns: '连接',
|
||
queue: '队列',
|
||
accountSwitches: '账号切换',
|
||
ok: '正常',
|
||
lastRun: '最近运行',
|
||
lastSuccess: '最近成功',
|
||
lastError: '最近错误',
|
||
result: '结果',
|
||
noData: '暂无数据',
|
||
loadingText: '加载中...',
|
||
ready: '就绪',
|
||
requestsTotal: '请求(总计)',
|
||
slaScope: 'SLA 范围:',
|
||
tokens: 'Token数',
|
||
tps: 'TPS',
|
||
current: '当前',
|
||
peak: '峰值',
|
||
average: '平均',
|
||
totalRequests: '总请求',
|
||
avgQps: '平均 QPS',
|
||
avgTps: '平均 TPS',
|
||
avgLatency: '平均请求时长',
|
||
avgTtft: '平均首 Token 延迟',
|
||
exceptions: '异常数',
|
||
requestErrors: '请求错误',
|
||
errorCount: '错误数',
|
||
upstreamErrors: '上游错误',
|
||
errorCountExcl429529: '错误数(排除429/529)',
|
||
sla: 'SLA(排除业务限制)',
|
||
businessLimited: '业务限制:',
|
||
errors: '错误',
|
||
errorRate: '错误率:',
|
||
upstreamRate: '上游错误率:',
|
||
latencyDuration: '请求时长',
|
||
ttftLabel: '首 Token 延迟(毫秒)',
|
||
p50: 'p50',
|
||
p90: 'p90',
|
||
p95: 'p95',
|
||
p99: 'p99',
|
||
avg: 'avg',
|
||
max: 'max',
|
||
requests: '请求数',
|
||
requestsTitle: '请求',
|
||
upstream: '上游',
|
||
client: '客户端',
|
||
system: '系统',
|
||
other: '其他',
|
||
errorsSla: '错误(SLA范围)',
|
||
upstreamExcl429529: '上游(排除429/529)',
|
||
failedToLoadData: '加载运维数据失败',
|
||
failedToLoadOverview: '加载概览数据失败',
|
||
failedToLoadThroughputTrend: '加载吞吐趋势失败',
|
||
failedToLoadSwitchTrend: '加载平均账号切换趋势失败',
|
||
failedToLoadLatencyHistogram: '加载请求时长分布失败',
|
||
failedToLoadErrorTrend: '加载错误趋势失败',
|
||
failedToLoadErrorDistribution: '加载错误分布失败',
|
||
failedToLoadErrorDetail: '加载错误详情失败',
|
||
retryFailed: '重试失败',
|
||
tpsK: 'TPS(千)',
|
||
top: '最高:',
|
||
throughputTrend: '吞吐趋势',
|
||
switchRateTrend: '平均账号切换趋势',
|
||
latencyHistogram: '请求时长分布',
|
||
errorTrend: '错误趋势',
|
||
errorDistribution: '错误分布',
|
||
switchRate: '平均账号切换',
|
||
// Health Score & Diagnosis
|
||
health: '健康',
|
||
healthCondition: '健康状况',
|
||
healthHelp: '基于 SLA、错误率和资源使用情况的系统整体健康评分',
|
||
healthyStatus: '健康',
|
||
riskyStatus: '风险',
|
||
idleStatus: '待机',
|
||
timeRange: {
|
||
'5m': '近5分钟',
|
||
'30m': '近30分钟',
|
||
'1h': '近1小时',
|
||
'6h': '近6小时',
|
||
'24h': '近24小时',
|
||
'7d': '近7天',
|
||
'30d': '近30天',
|
||
custom: '自定义'
|
||
},
|
||
customTimeRange: {
|
||
startTime: '开始时间',
|
||
endTime: '结束时间'
|
||
},
|
||
fullscreen: {
|
||
enter: '进入全屏'
|
||
},
|
||
diagnosis: {
|
||
title: '智能诊断',
|
||
footer: '基于当前指标的自动诊断建议',
|
||
idle: '系统当前处于待机状态',
|
||
idleImpact: '无活跃流量',
|
||
// Resource diagnostics
|
||
dbDown: '数据库连接失败',
|
||
dbDownImpact: '所有数据库操作将失败',
|
||
dbDownAction: '检查数据库服务状态、网络连接和连接配置',
|
||
redisDown: 'Redis连接失败',
|
||
redisDownImpact: '缓存功能降级,性能可能下降',
|
||
redisDownAction: '检查Redis服务状态和网络连接',
|
||
cpuCritical: 'CPU使用率严重过高 ({usage}%)',
|
||
cpuCriticalImpact: '系统响应变慢,可能影响所有请求',
|
||
cpuCriticalAction: '检查CPU密集型任务,考虑扩容或优化代码',
|
||
cpuHigh: 'CPU使用率偏高 ({usage}%)',
|
||
cpuHighImpact: '系统负载较高,需要关注',
|
||
cpuHighAction: '监控CPU趋势,准备扩容方案',
|
||
memoryCritical: '内存使用率严重过高 ({usage}%)',
|
||
memoryCriticalImpact: '可能触发OOM,系统稳定性受威胁',
|
||
memoryCriticalAction: '检查内存泄漏,考虑增加内存或优化内存使用',
|
||
memoryHigh: '内存使用率偏高 ({usage}%)',
|
||
memoryHighImpact: '内存压力较大,需要关注',
|
||
memoryHighAction: '监控内存趋势,检查是否有内存泄漏',
|
||
ttftHigh: '首 Token 时间偏高 ({ttft}ms)',
|
||
ttftHighImpact: '用户感知时长增加',
|
||
ttftHighAction: '优化请求处理流程,减少前置逻辑耗时',
|
||
// Error rate diagnostics
|
||
upstreamCritical: '上游错误率严重偏高 ({rate}%)',
|
||
upstreamCriticalImpact: '可能影响大量用户请求',
|
||
upstreamCriticalAction: '检查上游服务健康状态,启用降级策略',
|
||
upstreamHigh: '上游错误率偏高 ({rate}%)',
|
||
upstreamHighImpact: '建议检查上游服务状态',
|
||
upstreamHighAction: '联系上游服务团队,准备降级方案',
|
||
errorHigh: '错误率过高 ({rate}%)',
|
||
errorHighImpact: '大量请求失败',
|
||
errorHighAction: '查看错误日志,定位错误根因,紧急修复',
|
||
errorElevated: '错误率偏高 ({rate}%)',
|
||
errorElevatedImpact: '建议检查错误日志',
|
||
errorElevatedAction: '分析错误类型和分布,制定修复计划',
|
||
// SLA diagnostics
|
||
slaCritical: 'SLA 严重低于目标 ({sla}%)',
|
||
slaCriticalImpact: '用户体验严重受损',
|
||
slaCriticalAction: '紧急排查错误原因,必要时采取限流保护',
|
||
slaLow: 'SLA 低于目标 ({sla}%)',
|
||
slaLowImpact: '需要关注服务质量',
|
||
slaLowAction: '分析SLA下降原因,优化系统性能',
|
||
// Health score diagnostics
|
||
healthCritical: '综合健康评分过低 ({score})',
|
||
healthCriticalImpact: '多个指标可能同时异常,建议优先排查错误与资源使用情况',
|
||
healthCriticalAction: '全面检查系统状态,优先处理critical级别问题',
|
||
healthLow: '综合健康评分偏低 ({score})',
|
||
healthLowImpact: '可能存在轻度波动,建议关注 SLA 与错误率',
|
||
healthLowAction: '监控指标趋势,预防问题恶化',
|
||
healthy: '所有系统指标正常',
|
||
healthyImpact: '服务运行稳定'
|
||
},
|
||
// Error Log
|
||
errorLog: {
|
||
timeId: '时间 / ID',
|
||
commonErrors: {
|
||
contextDeadlineExceeded: '请求超时',
|
||
connectionRefused: '连接被拒绝',
|
||
rateLimit: '触发限流'
|
||
},
|
||
time: '时间',
|
||
type: '类型',
|
||
context: '上下文',
|
||
platform: '平台',
|
||
model: '模型',
|
||
group: '分组',
|
||
user: '用户',
|
||
userId: '用户 ID',
|
||
account: '账号',
|
||
accountId: '账号 ID',
|
||
status: '状态码',
|
||
message: '响应内容',
|
||
latency: '请求时长',
|
||
action: '操作',
|
||
noErrors: '该窗口内暂无错误。',
|
||
grp: 'GRP:',
|
||
acc: 'ACC:',
|
||
details: '详情',
|
||
phase: '阶段',
|
||
id: 'ID:',
|
||
typeUpstream: '上游',
|
||
typeRequest: '请求',
|
||
typeAuth: '认证',
|
||
typeRouting: '路由',
|
||
typeInternal: '内部'
|
||
},
|
||
// Error Details Modal
|
||
errorDetails: {
|
||
upstreamErrors: '上游错误',
|
||
requestErrors: '请求错误',
|
||
unresolved: '未解决',
|
||
resolved: '已解决',
|
||
viewErrors: '错误',
|
||
viewExcluded: '排除项',
|
||
statusCodeOther: '其他',
|
||
owner: {
|
||
provider: '服务商',
|
||
client: '客户端',
|
||
platform: '平台'
|
||
},
|
||
phase: {
|
||
request: '请求',
|
||
auth: '认证',
|
||
routing: '路由',
|
||
upstream: '上游',
|
||
network: '网络',
|
||
internal: '内部'
|
||
},
|
||
total: '总计:',
|
||
searchPlaceholder: '搜索 request_id / client_request_id / message',
|
||
},
|
||
// Error Detail Modal
|
||
errorDetail: {
|
||
title: '错误详情',
|
||
titleWithId: '错误 #{id}',
|
||
noErrorSelected: '未选择错误。',
|
||
resolution: '已解决:',
|
||
pinnedToOriginalAccountId: '固定到原 account_id',
|
||
missingUpstreamRequestBody: '缺少上游请求体',
|
||
failedToLoadRetryHistory: '加载重试历史失败',
|
||
failedToUpdateResolvedStatus: '更新解决状态失败',
|
||
unsupportedRetryMode: '不支持的重试模式',
|
||
classificationKeys: {
|
||
phase: '阶段',
|
||
owner: '归属方',
|
||
source: '来源',
|
||
retryable: '可重试',
|
||
resolvedAt: '解决时间',
|
||
resolvedBy: '解决人',
|
||
resolvedRetryId: '解决重试ID',
|
||
retryCount: '重试次数'
|
||
},
|
||
source: {
|
||
upstream_http: '上游 HTTP'
|
||
},
|
||
upstreamKeys: {
|
||
status: '状态码',
|
||
message: '消息',
|
||
detail: '详情',
|
||
upstreamErrors: '上游错误列表'
|
||
},
|
||
upstreamEvent: {
|
||
account: '账号',
|
||
status: '状态码',
|
||
requestId: '请求ID'
|
||
},
|
||
responsePreview: {
|
||
expand: '响应内容(点击展开)',
|
||
collapse: '响应内容(点击收起)'
|
||
},
|
||
retryMeta: {
|
||
used: '使用账号',
|
||
success: '成功',
|
||
pinned: '固定账号'
|
||
},
|
||
loading: '加载中…',
|
||
requestId: '请求 ID',
|
||
time: '时间',
|
||
phase: '阶段',
|
||
status: '状态码',
|
||
message: '消息',
|
||
basicInfo: '基本信息',
|
||
platform: '平台',
|
||
model: '模型',
|
||
group: '分组',
|
||
user: '用户',
|
||
account: '账号',
|
||
latency: '请求时长',
|
||
businessLimited: '业务限制',
|
||
requestPath: '请求路径',
|
||
timings: '时序信息',
|
||
auth: '认证',
|
||
routing: '路由',
|
||
upstream: '上游',
|
||
response: '响应',
|
||
classification: '错误分类',
|
||
notRetryable: '此错误不建议重试',
|
||
retry: '重试',
|
||
retryClient: '重试(客户端)',
|
||
retryUpstream: '重试(上游固定)',
|
||
pinnedAccountId: '固定 account_id',
|
||
retryNotes: '重试说明',
|
||
requestBody: '请求体',
|
||
errorBody: '错误体',
|
||
trimmed: '已截断',
|
||
confirmRetry: '确认重试',
|
||
retrySuccess: '重试成功',
|
||
retryFailed: '重试失败',
|
||
retryHint: '重试将使用相同的请求参数重新发送请求',
|
||
retryClientHint: '使用客户端重试(不固定账号)',
|
||
retryUpstreamHint: '使用上游固定重试(固定到错误的账号)',
|
||
pinnedAccountIdHint: '(自动从错误日志获取)',
|
||
retryNote1: '重试会使用相同的请求体和参数',
|
||
retryNote2: '如果原请求失败是因为账号问题,固定重试可能仍会失败',
|
||
retryNote3: '客户端重试会重新选择账号',
|
||
retryNote4: '对不可重试的错误可以强制重试,但不推荐',
|
||
confirmRetryMessage: '确认要重试该请求吗?',
|
||
confirmRetryHint: '将使用相同的请求参数重新发送',
|
||
forceRetry: '我已确认并理解强制重试风险',
|
||
forceRetryHint: '此错误类型通常不可通过重试解决;如仍需重试请勾选确认',
|
||
forceRetryNeedAck: '请先勾选确认再强制重试',
|
||
markResolved: '标记已解决',
|
||
markUnresolved: '标记未解决',
|
||
viewRetries: '重试历史',
|
||
retryHistory: '重试历史',
|
||
tabOverview: '概览',
|
||
tabRetries: '重试历史',
|
||
tabRequest: '请求详情',
|
||
tabResponse: '响应详情',
|
||
responseBody: '响应详情',
|
||
compareA: '对比 A',
|
||
compareB: '对比 B',
|
||
retrySummary: '重试摘要',
|
||
responseHintSucceeded: '展示重试成功的 response_preview(#{id})',
|
||
responseHintFallback: '没有成功的重试结果,展示存储的 error_body',
|
||
suggestion: '处理建议',
|
||
suggestUpstreamResolved: '✓ 上游错误已通过重试解决,无需人工介入',
|
||
suggestUpstream: '⚠️ 上游服务不稳定,建议:检查上游账号状态 / 考虑切换账号 / 再次重试',
|
||
suggestRequest: '⚠️ 客户端请求错误,建议:联系客户修正请求参数 / 手动标记已解决',
|
||
suggestAuth: '⚠️ 认证失败,建议:检查 API Key 是否有效 / 联系客户更新凭证',
|
||
suggestPlatform: '🚨 平台错误,建议立即排查修复',
|
||
suggestGeneric: '查看详情了解更多信息'
|
||
},
|
||
requestDetails: {
|
||
title: '请求明细',
|
||
details: '明细',
|
||
rangeLabel: '窗口:{range}',
|
||
rangeMinutes: '{n} 分钟',
|
||
rangeHours: '{n} 小时',
|
||
empty: '该窗口内暂无请求。',
|
||
emptyHint: '可尝试调整时间范围或取消部分筛选。',
|
||
failedToLoad: '加载请求明细失败',
|
||
requestIdCopied: '请求ID已复制',
|
||
copyFailed: '复制失败',
|
||
copy: '复制',
|
||
viewError: '查看错误',
|
||
kind: {
|
||
success: '成功',
|
||
error: '失败'
|
||
},
|
||
table: {
|
||
time: '时间',
|
||
kind: '类型',
|
||
platform: '平台',
|
||
model: '模型',
|
||
duration: '耗时',
|
||
status: '状态码',
|
||
requestId: '请求ID',
|
||
actions: '操作'
|
||
}
|
||
},
|
||
alertEvents: {
|
||
title: '告警事件',
|
||
description: '最近的告警触发/恢复记录(仅邮件通知)',
|
||
loading: '加载中...',
|
||
empty: '暂无告警事件',
|
||
loadFailed: '加载告警事件失败',
|
||
status: {
|
||
firing: '告警中',
|
||
resolved: '已恢复',
|
||
manualResolved: '手动已解决'
|
||
},
|
||
detail: {
|
||
title: '告警详情',
|
||
loading: '加载详情中...',
|
||
empty: '暂无详情',
|
||
loadFailed: '加载告警详情失败',
|
||
manualResolve: '标记为已解决',
|
||
manualResolvedSuccess: '已标记为手动解决',
|
||
manualResolvedFailed: '标记为手动解决失败',
|
||
silence: '忽略此告警',
|
||
silenceSuccess: '已静默该告警',
|
||
silenceFailed: '静默失败',
|
||
viewRule: '查看规则',
|
||
viewLogs: '查看相关日志',
|
||
firedAt: '触发时间',
|
||
resolvedAt: '解决时间',
|
||
ruleId: '规则 ID',
|
||
dimensions: '维度信息',
|
||
historyTitle: '历史记录',
|
||
historyHint: '同一规则 + 相同维度的最近事件',
|
||
historyLoading: '加载历史中...',
|
||
historyEmpty: '暂无历史记录'
|
||
},
|
||
table: {
|
||
time: '时间',
|
||
status: '状态',
|
||
severity: '级别',
|
||
platform: '平台',
|
||
ruleId: '规则ID',
|
||
title: '标题',
|
||
duration: '持续时间',
|
||
metric: '指标 / 阈值',
|
||
dimensions: '维度',
|
||
email: '邮件已发送',
|
||
emailSent: '已发送',
|
||
emailIgnored: '已忽略'
|
||
}
|
||
},
|
||
alertRules: {
|
||
title: '告警规则',
|
||
description: '创建与管理系统阈值告警(仅邮件通知)',
|
||
loading: '加载中...',
|
||
empty: '暂无告警规则',
|
||
loadFailed: '加载告警规则失败',
|
||
saveSuccess: '警报规则保存成功',
|
||
saveFailed: '保存告警规则失败',
|
||
deleteSuccess: '警报规则删除成功',
|
||
deleteFailed: '删除告警规则失败',
|
||
create: '新建规则',
|
||
createTitle: '新建告警规则',
|
||
editTitle: '编辑告警规则',
|
||
deleteConfirmTitle: '确认删除该规则?',
|
||
deleteConfirmMessage: '将删除该规则及其关联的告警事件,是否继续?',
|
||
manage: '预警规则',
|
||
metricGroups: {
|
||
system: '系统指标',
|
||
group: '分组级别指标(需 group_id)',
|
||
account: '账号级别指标'
|
||
},
|
||
metrics: {
|
||
successRate: '成功率 (%)',
|
||
errorRate: '错误率 (%)',
|
||
upstreamErrorRate: '上游错误率 (%)',
|
||
p95: 'P95 请求时长 (ms)',
|
||
p99: 'P99 请求时长 (ms)',
|
||
cpu: 'CPU 使用率 (%)',
|
||
memory: '内存使用率 (%)',
|
||
queueDepth: '并发排队深度',
|
||
groupAvailableAccounts: '分组可用账号数',
|
||
groupAvailableRatio: '分组可用比例 (%)',
|
||
groupRateLimitRatio: '分组限流比例 (%)',
|
||
accountRateLimitedCount: '限流账号数',
|
||
accountErrorCount: '错误账号数(不含临时不可调度)',
|
||
accountErrorRatio: '错误账号比例 (%)',
|
||
overloadAccountCount: '过载账号数'
|
||
},
|
||
metricDescriptions: {
|
||
successRate: '统计窗口内成功请求占比(0~100)。',
|
||
errorRate: '统计窗口内失败请求占比(0~100)。',
|
||
upstreamErrorRate: '统计窗口内上游错误占比(0~100)。',
|
||
p95: '统计窗口内 P95 请求耗时(毫秒)。',
|
||
p99: '统计窗口内 P99 请求耗时(毫秒)。',
|
||
cpu: '当前实例 CPU 使用率(0~100)。',
|
||
memory: '当前实例内存使用率(0~100)。',
|
||
queueDepth: '统计窗口内并发队列排队深度(等待中的请求数)。',
|
||
groupAvailableAccounts: '指定分组中当前可用账号数量(需要 group_id 过滤)。',
|
||
groupAvailableRatio: '指定分组中可用账号占比(0~100,需要 group_id 过滤)。',
|
||
groupRateLimitRatio: '指定分组中账号被限流的比例(0~100,需要 group_id 过滤)。',
|
||
accountRateLimitedCount: '统计窗口内被限流的账号数量。',
|
||
accountErrorCount: '统计窗口内产生错误的账号数量(不含临时不可调度)。',
|
||
accountErrorRatio: '统计窗口内错误账号占比(0~100)。',
|
||
overloadAccountCount: '统计窗口内过载账号数量。'
|
||
},
|
||
hints: {
|
||
recommended: '推荐:运算符 {operator},阈值 {threshold}{unit}',
|
||
groupRequired: '该指标为分组级别指标,必须选择分组(group_id)。',
|
||
groupOptional: '可选:通过 group_id 将规则限定到某个分组。'
|
||
},
|
||
table: {
|
||
name: '名称',
|
||
metric: '指标',
|
||
severity: '级别',
|
||
enabled: '启用',
|
||
actions: '操作'
|
||
},
|
||
form: {
|
||
name: '名称',
|
||
description: '描述',
|
||
metric: '指标',
|
||
operator: '运算符',
|
||
groupId: '分组(group_id)',
|
||
groupPlaceholder: '请选择分组',
|
||
allGroups: '全部分组',
|
||
threshold: '阈值',
|
||
severity: '级别',
|
||
window: '统计窗口(分钟)',
|
||
sustained: '连续样本数(每分钟)',
|
||
cooldown: '冷却期(分钟)',
|
||
enabled: '启用',
|
||
notifyEmail: '发送邮件通知'
|
||
},
|
||
validation: {
|
||
title: '请先修正以下问题',
|
||
invalid: '规则不合法',
|
||
nameRequired: '名称不能为空',
|
||
metricRequired: '指标不能为空',
|
||
groupIdRequired: '分组级别指标必须指定 group_id',
|
||
operatorRequired: '运算符不能为空',
|
||
thresholdRequired: '阈值必须为数字',
|
||
windowRange: '统计窗口必须为 1 / 5 / 60 分钟之一',
|
||
sustainedRange: '连续样本数必须在 1 到 1440 之间',
|
||
cooldownRange: '冷却期必须在 0 到 1440 分钟之间'
|
||
}
|
||
},
|
||
runtime: {
|
||
title: '运维监控运行设置',
|
||
description: '配置存储在数据库中,无需修改 config 文件即可生效。',
|
||
loading: '加载中...',
|
||
noData: '暂无运行设置',
|
||
loadFailed: '加载运行设置失败',
|
||
saveSuccess: '运行设置已保存',
|
||
saveFailed: '保存运行设置失败',
|
||
alertTitle: '告警评估器',
|
||
groupAvailabilityTitle: '分组可用性监控',
|
||
evalIntervalSeconds: '评估间隔(秒)',
|
||
silencing: {
|
||
title: '告警静默(维护模式)',
|
||
enabled: '启用静默',
|
||
globalUntil: '静默截止时间(RFC3339)',
|
||
untilHint: '建议填写截止时间,避免忘记关闭静默。',
|
||
reason: '原因',
|
||
reasonPlaceholder: '例如:计划维护',
|
||
entries: {
|
||
title: '高级:定向静默',
|
||
hint: '可选:仅静默特定规则或特定级别。字段留空表示匹配全部。',
|
||
add: '新增条目',
|
||
empty: '暂无定向静默条目',
|
||
entryTitle: '条目 #{n}',
|
||
ruleId: '规则ID(可选)',
|
||
ruleIdPlaceholder: '例如:1',
|
||
severities: '级别(可选)',
|
||
severitiesPlaceholder: '例如:P0,P1(留空=全部)',
|
||
until: '截止时间(RFC3339)',
|
||
reason: '原因',
|
||
validation: {
|
||
untilRequired: '条目截止时间不能为空',
|
||
untilFormat: '条目截止时间必须为合法的 RFC3339 时间戳',
|
||
ruleIdPositive: '条目 rule_id 必须为正整数',
|
||
severitiesFormat: '条目级别必须为 P0..P3 的逗号分隔列表'
|
||
}
|
||
},
|
||
validation: {
|
||
timeFormat: '静默时间必须为合法的 RFC3339 时间戳'
|
||
}
|
||
},
|
||
lockEnabled: '启用分布式锁',
|
||
lockKey: '分布式锁 Key',
|
||
lockTTLSeconds: '分布式锁 TTL(秒)',
|
||
showAdvancedDeveloperSettings: '显示高级开发者设置 (Distributed Lock)',
|
||
advancedSettingsSummary: '高级设置 (分布式锁)',
|
||
evalIntervalHint: '检测任务的执行频率,建议保持默认。',
|
||
validation: {
|
||
title: '请先修正以下问题',
|
||
invalid: '设置不合法',
|
||
evalIntervalRange: '评估间隔必须在 1 到 86400 秒之间',
|
||
lockKeyRequired: '启用分布式锁时必须填写 Lock Key',
|
||
lockKeyPrefix: '分布式锁 Key 必须以「{prefix}」开头',
|
||
lockKeyHint: '建议以「{prefix}」开头以避免冲突',
|
||
lockTtlRange: '分布式锁 TTL 必须在 1 到 86400 秒之间',
|
||
slaMinPercentRange: 'SLA 最低值必须在 0-100 之间',
|
||
ttftP99MaxRange: 'TTFT P99 最大值必须大于或等于 0',
|
||
requestErrorRateMaxRange: '请求错误率最大值必须在 0-100 之间',
|
||
upstreamErrorRateMaxRange: '上游错误率最大值必须在 0-100 之间'
|
||
}
|
||
},
|
||
email: {
|
||
title: '邮件通知配置',
|
||
description: '配置告警/报告邮件通知(存储在数据库中)。',
|
||
loading: '加载中...',
|
||
noData: '暂无邮件通知配置',
|
||
loadFailed: '加载邮件通知配置失败',
|
||
saveSuccess: '邮件通知配置已保存',
|
||
saveFailed: '保存邮件通知配置失败',
|
||
alertTitle: '告警邮件',
|
||
reportTitle: '报告邮件',
|
||
recipients: '收件人',
|
||
recipientsHint: '若为空,系统可能会回退使用第一个管理员邮箱。',
|
||
minSeverity: '最低级别',
|
||
minSeverityAll: '全部级别',
|
||
rateLimitPerHour: '每小时限额',
|
||
batchWindowSeconds: '合并窗口(秒)',
|
||
includeResolved: '包含恢复通知',
|
||
dailySummary: '每日摘要',
|
||
weeklySummary: '每周摘要',
|
||
errorDigest: '错误摘要',
|
||
errorDigestMinCount: '错误摘要最小数量',
|
||
accountHealth: '账号健康报告',
|
||
accountHealthThreshold: '错误率阈值(%)',
|
||
cronPlaceholder: 'Cron 表达式',
|
||
reportHint: '发送时间使用 Cron 语法;留空将使用默认值。',
|
||
validation: {
|
||
title: '请先修正以下问题',
|
||
invalid: '邮件通知配置不合法',
|
||
alertRecipientsRequired: '已启用告警邮件,但未配置任何收件人',
|
||
reportRecipientsRequired: '已启用报告邮件,但未配置任何收件人',
|
||
invalidRecipients: '存在不合法的收件人邮箱',
|
||
rateLimitRange: '每小时限额必须为 ≥ 0 的数字',
|
||
batchWindowRange: '合并窗口必须在 0 到 86400 秒之间',
|
||
cronRequired: '启用定时任务时必须填写 Cron 表达式',
|
||
cronFormat: 'Cron 表达式格式可能不正确(至少应包含 5 段)',
|
||
digestMinCountRange: '错误摘要最小数量必须为 ≥ 0 的数字',
|
||
accountHealthThresholdRange: '账号健康错误率阈值必须在 0 到 100 之间'
|
||
}
|
||
},
|
||
settings: {
|
||
title: '运维监控设置',
|
||
loadFailed: '加载设置失败',
|
||
saveSuccess: '运维监控设置保存成功',
|
||
saveFailed: '保存设置失败',
|
||
dataCollection: '数据采集',
|
||
evaluationInterval: '评估间隔(秒)',
|
||
evaluationIntervalHint: '检测任务的执行频率,建议保持默认',
|
||
alertConfig: '预警配置',
|
||
enableAlert: '开启预警',
|
||
alertRecipients: '预警接收邮箱',
|
||
emailPlaceholder: '输入邮箱地址',
|
||
recipientsHint: '若为空,系统将使用第一个管理员邮箱作为默认收件人',
|
||
minSeverity: '最低级别',
|
||
reportConfig: '评估报告配置',
|
||
enableReport: '开启评估报告',
|
||
reportRecipients: '评估报告接收邮箱',
|
||
dailySummary: '每日摘要',
|
||
weeklySummary: '每周摘要',
|
||
metricThresholds: '指标阈值配置',
|
||
metricThresholdsHint: '配置各项指标的告警阈值,超出阈值时将以红色显示',
|
||
slaMinPercent: 'SLA最低百分比',
|
||
slaMinPercentHint: 'SLA低于此值时显示为红色(默认:99.5%)',
|
||
ttftP99MaxMs: 'TTFT P99最大值(毫秒)',
|
||
ttftP99MaxMsHint: 'TTFT P99高于此值时显示为红色(默认:500ms)',
|
||
requestErrorRateMaxPercent: '请求错误率最大值(%)',
|
||
requestErrorRateMaxPercentHint: '请求错误率高于此值时显示为红色(默认:5%)',
|
||
upstreamErrorRateMaxPercent: '上游错误率最大值(%)',
|
||
upstreamErrorRateMaxPercentHint: '上游错误率高于此值时显示为红色(默认:5%)',
|
||
advancedSettings: '高级设置',
|
||
dataRetention: '数据保留策略',
|
||
enableCleanup: '启用数据清理',
|
||
cleanupSchedule: '清理计划(Cron)',
|
||
cleanupScheduleHint: '例如:0 2 * * * 表示每天凌晨2点',
|
||
errorLogRetentionDays: '错误日志保留天数',
|
||
minuteMetricsRetentionDays: '分钟指标保留天数',
|
||
hourlyMetricsRetentionDays: '小时指标保留天数',
|
||
retentionDaysHint: '建议保留7-90天,过长会占用存储空间',
|
||
aggregation: '预聚合任务',
|
||
enableAggregation: '启用预聚合任务',
|
||
aggregationHint: '预聚合可提升长时间窗口查询性能',
|
||
errorFiltering: '错误过滤',
|
||
ignoreCountTokensErrors: '忽略 count_tokens 错误',
|
||
ignoreCountTokensErrorsHint: '启用后,count_tokens 请求的错误将不会写入错误日志。',
|
||
ignoreContextCanceled: '忽略客户端断连错误',
|
||
ignoreContextCanceledHint: '启用后,客户端主动断开连接(context canceled)的错误将不会写入错误日志。',
|
||
ignoreNoAvailableAccounts: '忽略无可用账号错误',
|
||
ignoreNoAvailableAccountsHint: '启用后,"No available accounts" 错误将不会写入错误日志(不推荐,这通常是配置问题)。',
|
||
ignoreInvalidApiKeyErrors: '忽略无效 API Key 错误',
|
||
ignoreInvalidApiKeyErrorsHint: '启用后,无效或缺失 API Key 的错误(INVALID_API_KEY、API_KEY_REQUIRED)将不会写入错误日志。',
|
||
autoRefresh: '自动刷新',
|
||
enableAutoRefresh: '启用自动刷新',
|
||
enableAutoRefreshHint: '自动刷新仪表板数据,启用后会定期拉取最新数据。',
|
||
refreshInterval: '刷新间隔',
|
||
refreshInterval15s: '15 秒',
|
||
refreshInterval30s: '30 秒',
|
||
refreshInterval60s: '60 秒',
|
||
autoRefreshCountdown: '自动刷新:{seconds}s',
|
||
validation: {
|
||
title: '请先修正以下问题',
|
||
retentionDaysRange: '保留天数必须在1-365天之间',
|
||
slaMinPercentRange: 'SLA最低百分比必须在0-100之间',
|
||
ttftP99MaxRange: 'TTFT P99最大值必须大于等于0',
|
||
requestErrorRateMaxRange: '请求错误率最大值必须在0-100之间',
|
||
upstreamErrorRateMaxRange: '上游错误率最大值必须在0-100之间'
|
||
}
|
||
},
|
||
concurrency: {
|
||
title: '并发 / 排队',
|
||
byPlatform: '按平台',
|
||
byGroup: '按分组',
|
||
byAccount: '按账号',
|
||
totalRows: '共 {count} 项',
|
||
disabledHint: '已在设置中关闭实时监控。',
|
||
empty: '暂无数据',
|
||
queued: '队列 {count}',
|
||
rateLimited: '限流 {count}',
|
||
scopeRateLimitedTooltip: '{scope} 限流中 ({count} 个账号)',
|
||
errorAccounts: '异常 {count}',
|
||
loadFailed: '加载并发数据失败'
|
||
},
|
||
realtime: {
|
||
title: '实时信息',
|
||
connected: '实时已连接',
|
||
connecting: '实时连接中',
|
||
reconnecting: '实时重连中',
|
||
offline: '实时离线',
|
||
closed: '实时已关闭',
|
||
reconnectIn: '重连 {seconds}s'
|
||
},
|
||
queryMode: {
|
||
auto: 'Auto(自动)',
|
||
raw: 'Raw(不聚合)',
|
||
preagg: 'Preagg(聚合)'
|
||
},
|
||
accountAvailability: {
|
||
available: '可用',
|
||
unavailable: '不可用',
|
||
accountError: '异常'
|
||
},
|
||
tooltips: {
|
||
totalRequests: '当前时间窗口内的总请求数和Token消耗量。',
|
||
throughputTrend: '当前窗口内的请求/QPS 与 token/TPS 趋势。',
|
||
switchRateTrend: '近5小时内账号切换次数 / 请求总数的趋势(平均切换次数)。',
|
||
latencyHistogram: '成功请求的请求时长分布(毫秒)。',
|
||
errorTrend: '错误趋势(SLA 口径排除业务限制;上游错误率排除 429/529)。',
|
||
errorDistribution: '按状态码统计的错误分布。',
|
||
upstreamErrors: '上游服务返回的错误,包括API提供商的错误响应(排除429/529限流错误)。',
|
||
goroutines:
|
||
'Go 运行时的协程数量(轻量级线程)。没有绝对"安全值",建议以历史基线为准。经验参考:<2000 常见;2000-8000 需关注;>8000 且伴随队列上升时,优先排查阻塞/泄漏。',
|
||
cpu: 'CPU 使用率,显示系统处理器的负载情况。',
|
||
memory: '内存使用率,包括已使用和总可用内存。',
|
||
db: '数据库连接池状态,包括活跃连接、空闲连接和等待连接数。',
|
||
redis: 'Redis 连接池状态,显示活跃和空闲的连接数。',
|
||
jobs: '后台任务执行状态,包括最近运行时间、成功时间和错误信息。',
|
||
qps: '每秒查询数(QPS)和每秒Token数(TPS),实时显示系统吞吐量。',
|
||
tokens: '当前时间窗口内处理的总Token数量。',
|
||
sla: '服务等级协议达成率,排除业务限制(如余额不足、配额超限)的成功请求占比。',
|
||
errors: '错误统计,包括总错误数、错误率和上游错误率。',
|
||
latency: '请求时长统计,包括 p50、p90、p95、p99 等百分位数。',
|
||
ttft: '首 Token 延迟(Time To First Token),衡量流式响应的首 Token 返回速度。',
|
||
health: '系统健康评分(0-100),综合考虑 SLA、错误率和资源使用情况。'
|
||
},
|
||
charts: {
|
||
emptyRequest: '该时间窗口内暂无请求。',
|
||
emptyError: '该时间窗口内暂无错误。',
|
||
resetZoom: '重置',
|
||
resetZoomHint: '重置缩放(若启用)',
|
||
downloadChart: '下载',
|
||
downloadChartHint: '下载图表图片'
|
||
}
|
||
},
|
||
|
||
// Settings
|
||
settings: {
|
||
title: '系统设置',
|
||
description: '管理注册、邮箱验证、默认值和 SMTP 设置',
|
||
registration: {
|
||
title: '注册设置',
|
||
description: '控制用户注册和验证',
|
||
enableRegistration: '开放注册',
|
||
enableRegistrationHint: '允许新用户注册',
|
||
emailVerification: '邮箱验证',
|
||
emailVerificationHint: '新用户注册时需要验证邮箱',
|
||
promoCode: '优惠码',
|
||
promoCodeHint: '允许用户在注册时使用优惠码',
|
||
invitationCode: '邀请码注册',
|
||
invitationCodeHint: '开启后,用户注册时需要填写有效的邀请码',
|
||
passwordReset: '忘记密码',
|
||
passwordResetHint: '允许用户通过邮箱重置密码',
|
||
totp: '双因素认证 (2FA)',
|
||
totpHint: '允许用户使用 Google Authenticator 等应用进行二次验证',
|
||
totpKeyNotConfigured:
|
||
'请先在环境变量中配置 TOTP_ENCRYPTION_KEY。使用命令 openssl rand -hex 32 生成密钥。'
|
||
},
|
||
turnstile: {
|
||
title: 'Cloudflare Turnstile',
|
||
description: '登录和注册的机器人防护',
|
||
enableTurnstile: '启用 Turnstile',
|
||
enableTurnstileHint: '需要 Cloudflare Turnstile 验证',
|
||
siteKey: '站点密钥',
|
||
secretKey: '私密密钥',
|
||
siteKeyHint: '从 Cloudflare Dashboard 获取',
|
||
cloudflareDashboard: 'Cloudflare Dashboard',
|
||
secretKeyHint: '服务端验证密钥(请保密)',
|
||
secretKeyConfiguredHint: '密钥已配置,留空以保留当前值。' },
|
||
linuxdo: {
|
||
title: 'LinuxDo Connect 登录',
|
||
description: '配置 LinuxDo Connect OAuth,用于 Sub2API 用户登录',
|
||
enable: '启用 LinuxDo 登录',
|
||
enableHint: '在登录/注册页面显示 LinuxDo 登录入口',
|
||
clientId: 'Client ID',
|
||
clientIdPlaceholder: '例如:hprJ5pC3...',
|
||
clientIdHint: '从 Connect.Linux.Do 后台获取',
|
||
clientSecret: 'Client Secret',
|
||
clientSecretPlaceholder: '********',
|
||
clientSecretHint: '用于后端交换 token(请保密)',
|
||
clientSecretConfiguredPlaceholder: '********',
|
||
clientSecretConfiguredHint: '密钥已配置,留空以保留当前值。',
|
||
redirectUrl: '回调地址(Redirect URL)',
|
||
redirectUrlPlaceholder: 'https://your-domain.com/api/v1/auth/oauth/linuxdo/callback',
|
||
redirectUrlHint: '需与 Connect.Linux.Do 中配置的回调地址一致(必须是 http(s) 完整 URL)',
|
||
quickSetCopy: '使用当前站点生成并复制',
|
||
redirectUrlSetAndCopied: '已使用当前站点生成回调地址并复制到剪贴板'
|
||
},
|
||
defaults: {
|
||
title: '用户默认设置',
|
||
description: '新用户的默认值',
|
||
defaultBalance: '默认余额',
|
||
defaultBalanceHint: '新用户的初始余额',
|
||
defaultConcurrency: '默认并发数',
|
||
defaultConcurrencyHint: '新用户的最大并发请求数'
|
||
},
|
||
site: {
|
||
title: '站点设置',
|
||
description: '自定义站点品牌',
|
||
siteName: '站点名称',
|
||
siteNameHint: '显示在邮件和页面标题中',
|
||
siteNamePlaceholder: 'Sub2API',
|
||
siteSubtitle: '站点副标题',
|
||
siteSubtitleHint: '显示在登录和注册页面',
|
||
siteSubtitlePlaceholder: '订阅转 API 转换平台',
|
||
apiBaseUrl: 'API 端点地址',
|
||
apiBaseUrlHint: '用于"使用密钥"和"导入到 CC Switch"功能,留空则使用当前站点地址',
|
||
apiBaseUrlPlaceholder: 'https://api.example.com',
|
||
contactInfo: '客服联系方式',
|
||
contactInfoPlaceholder: '例如:QQ: 123456789',
|
||
contactInfoHint: '填写客服联系方式,将展示在兑换页面、个人资料等位置',
|
||
docUrl: '文档链接',
|
||
docUrlHint: '文档网站的链接。留空则隐藏文档链接。',
|
||
docUrlPlaceholder: 'https://docs.example.com',
|
||
siteLogo: '站点Logo',
|
||
uploadImage: '上传图片',
|
||
remove: '移除',
|
||
logoHint: 'PNG、JPG 或 SVG 格式,最大 300KB。建议:80x80px 正方形图片。',
|
||
logoSizeError: '图片大小超过 300KB 限制({size}KB)',
|
||
logoTypeError: '请选择图片文件',
|
||
logoReadError: '读取图片文件失败',
|
||
homeContent: '首页内容',
|
||
homeContentPlaceholder: '在此输入首页内容,支持 Markdown & HTML 代码。如果输入的是一个链接,则会使用该链接作为 iframe 的 src 属性。',
|
||
homeContentHint: '自定义首页内容,支持 Markdown/HTML。如果输入的是链接(以 http:// 或 https:// 开头),则会使用该链接作为 iframe 的 src 属性,这允许你设置任意网页作为首页。设置后首页的状态信息将不再显示。',
|
||
homeContentIframeWarning: '⚠️ iframe 模式提示:部分网站设置了 X-Frame-Options 或 CSP 安全策略,禁止被嵌入到 iframe 中。如果页面显示空白或报错,请确认目标网站允许被嵌入,或考虑使用 HTML 模式自行构建页面内容。',
|
||
hideCcsImportButton: '隐藏 CCS 导入按钮',
|
||
hideCcsImportButtonHint: '启用后将在 API Keys 页面隐藏"导入 CCS"按钮'
|
||
},
|
||
purchase: {
|
||
title: '购买订阅页面',
|
||
description: '在侧边栏展示“购买订阅”入口,并在页面内通过 iframe 打开指定链接',
|
||
enabled: '显示购买订阅入口',
|
||
enabledHint: '仅在标准模式(非简单模式)下展示',
|
||
url: '购买页面 URL',
|
||
urlPlaceholder: 'https://example.com/purchase',
|
||
urlHint: '必须是完整的 http(s) 链接',
|
||
iframeWarning:
|
||
'⚠️ iframe 提示:部分网站会通过 X-Frame-Options 或 CSP(frame-ancestors)禁止被 iframe 嵌入,出现空白时可引导用户使用“新窗口打开”。'
|
||
},
|
||
smtp: {
|
||
title: 'SMTP 设置',
|
||
description: '配置用于发送验证码的邮件服务',
|
||
testConnection: '测试连接',
|
||
testing: '测试中...',
|
||
host: 'SMTP 主机',
|
||
hostPlaceholder: 'smtp.gmail.com',
|
||
port: 'SMTP 端口',
|
||
portPlaceholder: '587',
|
||
username: 'SMTP 用户名',
|
||
usernamePlaceholder: "your-email{'@'}gmail.com",
|
||
password: 'SMTP 密码',
|
||
passwordPlaceholder: '********',
|
||
passwordHint: '留空以保留现有密码',
|
||
passwordConfiguredPlaceholder: '********',
|
||
passwordConfiguredHint: '密码已配置,留空以保留当前值。',
|
||
fromEmail: '发件人邮箱',
|
||
fromEmailPlaceholder: "noreply{'@'}example.com",
|
||
fromName: '发件人名称',
|
||
fromNamePlaceholder: 'Sub2API',
|
||
useTls: '使用 TLS',
|
||
useTlsHint: '为 SMTP 连接启用 TLS 加密'
|
||
},
|
||
testEmail: {
|
||
title: '发送测试邮件',
|
||
description: '发送测试邮件以验证 SMTP 配置',
|
||
recipientEmail: '收件人邮箱',
|
||
recipientEmailPlaceholder: "test{'@'}example.com",
|
||
sendTestEmail: '发送测试邮件',
|
||
sending: '发送中...',
|
||
enterRecipientHint: '请输入收件人邮箱地址'
|
||
},
|
||
opsMonitoring: {
|
||
title: '运维监控',
|
||
description: '启用运维监控模块,用于排障与健康可视化',
|
||
disabled: '运维监控已关闭',
|
||
enabled: '启用运维监控',
|
||
enabledHint: '启用运维监控模块(仅管理员可见)',
|
||
realtimeEnabled: '启用实时监控',
|
||
realtimeEnabledHint: '启用实时请求速率和指标推送(WebSocket)',
|
||
queryMode: '默认查询模式',
|
||
queryModeHint: '运维监控默认查询模式(自动/原始/预聚合)',
|
||
queryModeAuto: '自动(推荐)',
|
||
queryModeRaw: '原始(最准确,但较慢)',
|
||
queryModePreagg: '预聚合(最快,需预聚合)',
|
||
metricsInterval: '采集频率(秒)',
|
||
metricsIntervalHint: '系统/请求指标采集频率(60-3600 秒)'
|
||
},
|
||
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: '警告:此密钥拥有完整的管理员权限,请妥善保管。',
|
||
usage: '使用方法:在请求头中添加 x-api-key: <your-admin-api-key>'
|
||
},
|
||
streamTimeout: {
|
||
title: '流超时处理',
|
||
description: '配置上游响应超时时的账户处理策略,避免问题账户持续被选中',
|
||
enabled: '启用流超时处理',
|
||
enabledHint: '当上游响应超时时,自动处理问题账户',
|
||
timeoutSeconds: '超时阈值(秒)',
|
||
timeoutSecondsHint: '流数据间隔超过此时间视为超时(30-300秒)',
|
||
action: '处理方式',
|
||
actionTempUnsched: '临时不可调度',
|
||
actionError: '标记为错误状态',
|
||
actionNone: '不处理',
|
||
actionHint: '超时后对账户执行的操作',
|
||
tempUnschedMinutes: '暂停时长(分钟)',
|
||
tempUnschedMinutesHint: '临时不可调度的持续时间(1-60分钟)',
|
||
thresholdCount: '触发阈值(次数)',
|
||
thresholdCountHint: '累计超时多少次后触发处理(1-10次)',
|
||
thresholdWindowMinutes: '阈值窗口(分钟)',
|
||
thresholdWindowMinutesHint: '超时计数的时间窗口(1-60分钟)',
|
||
saved: '流超时设置保存成功',
|
||
saveFailed: '保存流超时设置失败'
|
||
},
|
||
saveSettings: '保存设置',
|
||
saving: '保存中...',
|
||
settingsSaved: '设置保存成功',
|
||
smtpConnectionSuccess: 'SMTP 连接成功',
|
||
testEmailSent: '测试邮件发送成功',
|
||
failedToLoad: '加载设置失败',
|
||
failedToSave: '保存设置失败',
|
||
failedToTestSmtp: 'SMTP 连接测试失败',
|
||
failedToSendTestEmail: '发送测试邮件失败'
|
||
}
|
||
},
|
||
|
||
// Subscription Progress (Header component)
|
||
subscriptionProgress: {
|
||
title: '我的订阅',
|
||
viewDetails: '查看订阅详情',
|
||
activeCount: '{count} 个有效订阅',
|
||
daily: '每日',
|
||
weekly: '每周',
|
||
monthly: '每月',
|
||
daysRemaining: '剩余 {days} 天',
|
||
expired: '已过期',
|
||
expiresToday: '今天到期',
|
||
expiresTomorrow: '明天到期',
|
||
viewAll: '查看全部订阅',
|
||
noSubscriptions: '暂无有效订阅',
|
||
unlimited: '无限制'
|
||
},
|
||
|
||
// Version Badge
|
||
version: {
|
||
currentVersion: '当前版本',
|
||
latestVersion: '最新版本',
|
||
upToDate: '已是最新版本',
|
||
updateAvailable: '有新版本可用!',
|
||
releaseNotes: '更新日志',
|
||
noReleaseNotes: '暂无更新日志',
|
||
viewUpdate: '查看更新',
|
||
viewRelease: '查看发布',
|
||
viewChangelog: '查看更新日志',
|
||
refresh: '刷新',
|
||
sourceMode: '源码构建',
|
||
sourceModeHint: '源码构建请使用 git pull 更新',
|
||
updateNow: '立即更新',
|
||
updating: '正在更新...',
|
||
updateComplete: '更新完成',
|
||
updateFailed: '更新失败',
|
||
restartRequired: '请重启服务以应用更新',
|
||
restartNow: '立即重启',
|
||
restarting: '正在重启...',
|
||
retry: '重试'
|
||
},
|
||
|
||
// Purchase Subscription Page
|
||
purchase: {
|
||
title: '购买订阅',
|
||
description: '通过内嵌页面完成订阅购买',
|
||
openInNewTab: '新窗口打开',
|
||
notEnabledTitle: '该功能未开启',
|
||
notEnabledDesc: '管理员暂未开启购买订阅入口,请联系管理员。',
|
||
notConfiguredTitle: '购买链接未配置',
|
||
notConfiguredDesc: '管理员已开启入口,但尚未配置购买订阅链接,请联系管理员。'
|
||
},
|
||
|
||
// Announcements Page
|
||
announcements: {
|
||
title: '公告',
|
||
description: '查看系统公告',
|
||
unreadOnly: '仅显示未读',
|
||
markRead: '标记已读',
|
||
markAllRead: '全部已读',
|
||
viewAll: '查看全部公告',
|
||
markedAsRead: '已标记为已读',
|
||
allMarkedAsRead: '所有公告已标记为已读',
|
||
newCount: '有 {count} 条新公告',
|
||
readAt: '已读时间',
|
||
read: '已读',
|
||
unread: '未读',
|
||
startsAt: '开始时间',
|
||
endsAt: '结束时间',
|
||
empty: '暂无公告',
|
||
emptyUnread: '暂无未读公告',
|
||
total: '条公告',
|
||
emptyDescription: '暂时没有任何系统公告',
|
||
readStatus: '您已阅读此公告',
|
||
markReadHint: '点击"已读"标记此公告'
|
||
},
|
||
|
||
// User Subscriptions Page
|
||
userSubscriptions: {
|
||
title: '我的订阅',
|
||
description: '查看您的订阅计划和用量',
|
||
noActiveSubscriptions: '暂无有效订阅',
|
||
noActiveSubscriptionsDesc: '您没有任何有效订阅。请联系管理员获取订阅。',
|
||
failedToLoad: '加载订阅失败',
|
||
status: {
|
||
active: '有效',
|
||
expired: '已过期',
|
||
revoked: '已撤销'
|
||
},
|
||
usage: '用量',
|
||
expires: '到期时间',
|
||
noExpiration: '无到期时间',
|
||
unlimited: '无限制',
|
||
unlimitedDesc: '该订阅无用量限制',
|
||
daily: '每日',
|
||
weekly: '每周',
|
||
monthly: '每月',
|
||
daysRemaining: '剩余 {days} 天',
|
||
expiresOn: '{date} 到期',
|
||
resetIn: '{time} 后重置',
|
||
windowNotActive: '等待首次使用',
|
||
usageOf: '已用 {used} / {limit}'
|
||
},
|
||
|
||
// 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>'
|
||
}
|
||
}
|
||
}
|
||
}
|