Files
sub2api/frontend/src/i18n/locales/zh/admin/accounts.ts
T
李建琦 6d655c9903
Release / update-version (push) Has been cancelled
Release / build-frontend (push) Has been cancelled
Release / release (push) Has been cancelled
Release / sync-version-file (push) Has been cancelled
CI / shell (push) Canceled after 0s
CI / test (push) Canceled after 0s
CI / frontend (push) Canceled after 0s
CI / golangci-lint (push) Canceled after 0s
Security Scan / backend-security (push) Canceled after 0s
Security Scan / frontend-security (push) Canceled after 0s
Sub2API v1.0 - AI API 网关(二开初始版本,基于上游 Wei-Shaw/sub2api)
2026-08-21 18:30:13 +08:00

1518 lines
86 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export default {
accounts: {
title: '账号管理',
description: '管理 AI 平台账号和 Cookie',
createAccount: '添加账号',
autoRefresh: '自动刷新',
enableAutoRefresh: '启用自动刷新',
refreshInterval5s: '5 秒',
refreshInterval10s: '10 秒',
refreshInterval15s: '15 秒',
refreshInterval30s: '30 秒',
autoRefreshCountdown: '自动刷新:{seconds}s',
listPendingSyncHint: '列表存在待同步变更,点击同步可补齐最新数据。',
listPendingSyncAction: '立即同步',
syncFromCrs: '从 CRS 同步',
dataExport: '导出',
dataExportSelected: '导出选中',
dataExportIncludeProxies: '导出代理(导出账号关联的代理)',
dataImport: '导入',
moreActions: '更多操作',
dataActions: '数据操作',
toolActions: '工具',
viewColumns: '列显示',
selectedCount: '已选 {count}',
dataExportConfirmMessage: '导出的数据包含账号与代理的敏感信息,请妥善保存。',
dataExportConfirm: '确认导出',
dataExported: '数据导出成功',
dataExportedSkippedShadows: '数据已导出。已跳过 {count} 个 spark 影子账号:其调度配置不在备份内,还原后需在重建的影子上重新调优。',
dataExportFailed: '数据导出失败',
dataImportTitle: '导入数据',
dataImportHint: '上传导出的 JSON 文件以批量导入账号与代理。',
dataImportWarning: '导入将创建新账号与代理,分组需手工绑定;请确认已有数据不会冲突。',
dataImportFile: '数据文件',
dataImportButton: '开始导入',
dataImporting: '导入中...',
dataImportSelectFile: '请选择数据文件',
dataImportParseFailed: '数据解析失败',
dataImportParseFailedFile: '文件 {name} 解析失败',
dataImportInvalidFile: '文件 {name} 不是受支持的导出数据文件',
dataImportIgnoredFiles: '已忽略 {count} 个非 JSON 文件',
dataImportFailed: '数据导入失败',
dataImportResult: '导入结果',
dataImportResultSummary: '代理创建 {proxy_created},复用 {proxy_reused},失败 {proxy_failed};账号创建 {account_created},失败 {account_failed}',
dataImportErrors: '失败详情',
dataImportSuccess: '导入完成:账号 {account_created},失败 {account_failed}',
dataImportCompletedWithErrors: '导入完成但有错误:账号失败 {account_failed},代理失败 {proxy_failed}',
syncFromCrsTitle: '从 CRS 同步账号',
syncFromCrsDesc:
'将 claude-relay-serviceCRS)中的账号同步到当前系统(不会在浏览器侧直接请求 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},跳过 {skipped}',
syncCompletedWithErrors: '同步完成但有错误:失败 {failed}(创建 {created},更新 {updated},跳过 {skipped}',
syncFailed: '同步失败',
crsPreview: '预览',
crsPreviewing: '预览中...',
crsPreviewFailed: '预览失败',
crsExistingAccounts: '将自动更新的已有账号',
crsNewAccounts: '新账号(可选择)',
crsSelectAll: '全选',
crsSelectNone: '全不选',
crsNoNewAccounts: '所有 CRS 账号均已同步。',
crsWillUpdate: '将更新 {count} 个已有账号。',
crsSelectedCount: '已选择 {count} 个新账号',
crsUpdateBehaviorNote:
'已有账号仅同步 CRS 返回的字段,缺失字段保持原值;凭据按键合并,不会清空未下发的键;未勾选"同步代理"时保留原有代理。',
crsBack: '返回',
editAccount: '编辑账号',
deleteAccount: '删除账号',
searchAccounts: '搜索账号...',
notes: '备注',
notesPlaceholder: '请输入备注',
notesHint: '备注可选',
// Filter options
allPlatforms: '全部平台',
allTypes: '全部类型',
allStatus: '全部状态',
allGroups: '全部分组',
ungroupedGroup: '未分配分组',
oauthType: 'OAuth',
// Schedulable toggle
schedulable: '参与调度',
schedulableHint: '开启后账号参与API请求调度',
schedulableEnabled: '调度已开启',
schedulableDisabled: '调度已关闭',
failedToToggleSchedulable: '切换调度状态失败',
groupCountTotal: '共 {count} 个分组',
columns: {
name: '名称',
id: '账号ID',
platformType: '平台/类型',
platform: '平台',
type: '类型',
capacity: '容量',
notes: '备注',
priority: '优先级',
billingRateMultiplier: '账号倍率',
upstreamBillingRate: '上游声明倍率',
weight: '权重',
schedulerScore: '调度权值',
status: '状态',
schedulable: '调度',
todayStats: '今日统计',
groups: '分组',
usageWindows: '用量窗口',
proxy: '代理',
lastUsed: '最近使用',
createdAt: '创建时间',
expiresAt: '过期时间',
actions: '操作'
},
schedulerScore: {
baseShort: '普通',
stickyShort: '粘性',
ungrouped: '未分组',
hint: '显示格式为“分组名 / 基础分 / 粘性加分”。基础分按当前筛选条件限定的候选账号计算,包含优先级、负载、排队、错误率、首包延迟、重置窗口、额度余量、计费倍率等因子;粘性加分只在开启粘性加权时用于 previous_response_id 或 session_hash。分数越大越优先。'
},
usageWindowsHint: '“5h / 7d”是上游账号(如 OpenAI ChatGPT、Claude)官方的滚动用量窗口限制,由上游对账号设定,并非 sub2api 配置,也与你映射的模型无关。窗口滚动到期后用量会自动重置,无法在 sub2api 端解除该限制。',
ollamaCloud: {
title: 'Ollama Cloud 用量',
sessionSecurityHint: '浏览器会话会加密落库,且只发送到固定的 Ollama 官方设置页。',
configured: '已配置',
notConfigured: '未配置',
notRefreshed: '尚未刷新',
encryptionKeyRequired: '请先配置持久 TOTP_ENCRYPTION_KEY,再保存浏览器会话。',
sessionLabel: 'Ollama 浏览器 Cookie',
sessionPlaceholder: 'wos-session=...; __Secure-authjs.session-token.0=...',
writeOnlyHint: '仅写入。已保存内容不可查看,留空不会覆盖。',
deleteSession: '删除会话',
deleteConfirm: '确定删除已保存的 Ollama 浏览器会话及其用量快照?',
refreshNow: '刷新用量',
autoRefresh: '自动刷新用量',
autoRefreshHint: '只有账号开关和全局开关同时启用时才会定时刷新。',
plan: '套餐',
fiveHour: '5 小时',
fiveHourShort: '5h',
sevenDay: '7 天',
sevenDayShort: '7d',
balance: '余额',
models: '模型',
status: '状态',
updatedAt: '更新时间',
ok: '正常',
unauthorized: '会话已过期',
failed: '刷新失败',
windowWithReset: '已用 {percent}{reset} 重置',
loadFailed: '加载 Ollama Cloud 用量设置失败',
sessionSaved: 'Ollama 浏览器会话已保存',
sessionSaveFailed: '保存 Ollama 浏览器会话失败',
sessionDeleted: 'Ollama 浏览器会话已删除',
sessionDeleteFailed: '删除 Ollama 浏览器会话失败',
autoRefreshFailed: '更新自动刷新设置失败',
refreshSuccess: 'Ollama Cloud 用量已刷新',
refreshFailed: '刷新 Ollama Cloud 用量失败',
errors: {
request_failed: '请求失败',
empty_response: '响应为空',
response_host_mismatch: '响应主机不符合安全边界',
redirect_blocked: '官方设置页发生重定向',
unauthorized: '浏览器会话已过期',
http_error: '官方设置页返回错误',
response_read_failed: '读取响应失败',
response_too_large: '设置页超过响应大小限制',
invalid_html: '无法识别设置页格式',
OLLAMA_CLOUD_USAGE_REFRESH_RATE_LIMITED: '刷新过于频繁,请在 {retry_after_seconds} 秒后重试。'
}
},
upstreamBilling: {
trustWarning: '此倍率由上游站点针对当前 API Key 自行声明。Sub2API 无法验证该值是否与实际扣费一致;上游站点或中间代理可能返回伪造、过期或被篡改的数据。请结合账单、余额变化和实际用量自行核验。',
autoProbe: '自动探测上游声明倍率',
autoProbeHint: '启用后按全局周期刷新上游声明倍率;此开关本身不会修改账号倍率。',
syncRate: '同步上游声明倍率',
syncRateHint: '成功探测后自动更新账号倍率,同步的是不含高峰的基准倍率;探测失败或声明超出允许范围时保持不变。开启本项会同时打开“自动探测上游声明倍率”。',
syncRateManagedHint: '当前倍率由上游声明的基准倍率(不含高峰)自动维护。',
syncedRateTooltip: '该账号倍率由上游声明的基准倍率(不含高峰)自动同步',
manualProbe: '立即探测上游倍率',
stale: '已过期',
unsupported: '不支持',
failed: '失败',
notProbed: '未探测',
groupRate: '分组默认:{value}x',
userRate: '用户专属倍率:{value}x',
peakRate: '高峰:{start}-{end}{value}x{timezone}',
noPeakRate: '高峰倍率:未启用',
effectiveRate: '当前倍率:{value}x',
updatedAt: '更新时间:{value}',
nextProbeAt: '下一次探测:{value}',
lastDetectedRate: '上次探测倍率:{value}x',
lastDetectedAt: '上次探测时间:{value}',
elapsedSince: '已过去:{value}',
justNow: '不足 1 分钟',
minutesAgo: '{count} 分钟',
hoursAgo: '{count} 小时',
daysAgo: '{count} 天',
accountProbeState: '当前账号自动检测:',
globalProbeState: '全局探测开关:',
enabled: '打开',
disabled: '关闭',
probeFailed: '探测上游倍率失败',
noEligibleAccounts: '请选择 API Key 账号',
batchLimit: '每次最多探测 20 个账号',
batchCompleted: '已完成 {count} 个账号的倍率探测',
batchPartial: '倍率探测部分完成:成功 {success} 个,失败 {failed} 个'
},
allPrivacyModes: '全部Privacy状态',
privacyUnset: '未设置',
privacyTrainingOff: '已关闭训练数据共享',
privacyCfBlocked: '被 Cloudflare 拦截,训练可能仍开启',
privacyFailed: '关闭训练数据共享失败',
privacyAntigravitySet: '已关闭遥测和营销邮件',
privacyAntigravityFailed: '隐私设置失败',
setPrivacy: '设置隐私',
subscriptionAbnormal: '异常',
subscriptionExpires: '到期',
// 容量状态提示
capacity: {
windowCost: {
blocked: '5h窗口费用超限,账号暂停调度',
stickyOnly: '5h窗口费用达阈值,仅允许粘性会话',
normal: '5h窗口费用正常'
},
sessions: {
full: '活跃会话已满,新会话需等待(空闲超时:{idle}分钟)',
normal: '活跃会话正常(空闲超时:{idle}分钟)'
},
rpm: {
full: '已达 RPM 上限',
warning: 'RPM 接近上限',
normal: 'RPM 正常',
tieredNormal: 'RPM 限制 (三区模型) - 正常',
tieredWarning: 'RPM 限制 (三区模型) - 接近阈值',
tieredStickyOnly: 'RPM 限制 (三区模型) - 仅粘性会话 | 缓冲区: {buffer}',
tieredBlocked: 'RPM 限制 (三区模型) - 已阻塞 | 缓冲区: {buffer}',
stickyExemptNormal: 'RPM 限制 (粘性豁免) - 正常',
stickyExemptWarning: 'RPM 限制 (粘性豁免) - 接近阈值',
stickyExemptOver: 'RPM 限制 (粘性豁免) - 超限,仅粘性会话'
},
quota: {
exceeded: '配额已用完,账号暂停调度',
normal: '配额正常'
},
},
clearRateLimit: '清除速率限制',
resetQuota: '重置配额',
quotaLimit: '配额限制',
quotaLimitPlaceholder: '0 表示不限制',
quotaLimitHint: '设置日/周/总使用额度(美元),任一维度达到限额后账号暂停调度。Anthropic API Key 账号还可配置客户端亲和。修改限额不会重置已用额度。',
quotaLimitToggle: '启用配额限制',
quotaLimitToggleHint: '开启后,当账号用量达到设定额度时自动暂停调度',
quotaDailyLimit: '日限额',
quotaDailyLimitHint: '从首次使用起每 24 小时自动重置。',
quotaWeeklyLimit: '周限额',
quotaWeeklyLimitHint: '从首次使用起每 7 天自动重置。',
quotaTotalLimit: '总限额',
quotaTotalLimitHint: '累计消费上限,不会自动重置 — 使用「重置配额」手动清零。',
quotaResetMode: '重置方式',
quotaResetModeRolling: '滚动窗口',
quotaResetModeFixed: '固定时间',
quotaResetHour: '重置时间',
quotaWeeklyResetDay: '重置日',
quotaResetTimezone: '重置时区',
quotaDailyLimitHintFixed: '每天 {hour}:00{timezone})重置。',
quotaWeeklyLimitHintFixed: '每{day} {hour}:00{timezone})重置。',
dayOfWeek: {
monday: '周一',
tuesday: '周二',
wednesday: '周三',
thursday: '周四',
friday: '周五',
saturday: '周六',
sunday: '周日',
},
quotaLimitAmount: '总限额',
quotaLimitAmountHint: '累计消费上限,不会自动重置。',
quotaNotify: {
alert: '提醒阈值',
enabled: '启用告警',
threshold: '告警金额',
thresholdPlaceholder: '输入百分比',
},
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',
grok: 'Grok',
kimi: 'Kimi',
zhipu: 'Zhipu GLM',
deepseek: 'DeepSeek',
},
cnProviders: {
accountMode: {
title: '账号类型',
payg: '按量付费',
paygDesc: '消耗账户余额,按 Token 计费。余额不足自动冷却,充值后恢复。',
coding: 'Coding Plan',
codingDesc: '订阅制编程套餐,按 5 小时 / 每周滚动用量窗口限流。',
},
apiProtocol: {
title: 'API 协议',
adaptive: '自适应',
adaptiveDesc: '按入站协议优先使用供应商原生端点,仅在没有对应端点时转换。',
endpoints: '协议端点',
responsesFallbackDesc: '该供应商没有原生 Responses 端点,Responses 请求将转换为 Chat Completions。',
chatCompletions: 'Chat Completions',
chatCompletionsDesc: '标准 OpenAI 兼容端点,其他格式请求将被转换。',
anthropic: 'Anthropic',
anthropicDesc: '直通供应商原生 Anthropic 端点,零转换,适配 Claude Code。',
responses: 'Responses',
responsesDesc: '供应商原生 Responses 端点,适配 Codex。',
},
balance: '余额 --',
window5h: '5 小时窗口',
windowWeekly: '每周窗口',
probeTooltip: '请求供应商额度端点,查询 5 小时 / 每周滚动窗口用量',
balanceLow: '余额不足',
noBalanceEndpoint: '该平台暂无余额查询接口',
resetSoon: '即将重置',
},
types: {
oauth: 'OAuth',
chatgptOauth: 'ChatGPT OAuth',
responsesApi: 'Responses API',
googleOauth: 'Google OAuth',
codeAssist: 'Code Assist',
antigravityOauth: 'Antigravity OAuth',
grokOauth: 'Grok OAuth',
antigravityApikey: '通过 Base URL + API Key 连接',
upstream: '对接上游',
upstreamDesc: '通过 Base URL + API Key 连接上游'
},
antigravityProjectIdLabel: 'GCP Project ID(可选)',
antigravityProjectIdPlaceholder: 'your-gcp-project-id',
antigravityProjectIdHint:
'standard-tier 且未自动返回 project_id 的 Antigravity 账号需要填写用户自带 GCP project。',
accountSchedulingThresholdOverride: '账号自动停调阈值覆盖',
accountSchedulingThresholdOverrideHint:
'仅对当前账号覆盖平台级自动停调阈值;关闭后使用平台设置。',
accountSchedulingThresholdOverrideValue: '账号阈值百分比',
accountSchedulingThresholdOverrideDisabledHint:
'1-100,达到该用量百分比后临时不可调度;100 表示禁用当前账号自动停调。',
status: {
active: '正常',
inactive: '停用',
expired: '已过期',
error: '错误',
cooldown: '冷却中',
paused: '暂停',
limited: '限流',
rateLimited: '限流中',
overloaded: '过载中',
tempUnschedulable: '临时不可调度',
quotaExceeded: '配额超限',
unschedulable: '不可调度',
rateLimitedUntil: '限流中,当前不参与调度,预计 {time} 自动恢复',
rateLimitedAutoResume: '{time} 自动恢复',
modelRateLimitedUntil: '{model} 限流至 {time}',
modelCreditOveragesUntil: '{model} 正在使用 AI Credits,至 {time}',
creditsExhausted: '积分已用尽',
creditsExhaustedUntil: 'AI Credits 已用尽,预计 {time} 恢复',
overloadedUntil: '负载过重,重置时间:{time}',
viewTempUnschedDetails: '查看临时不可调度详情',
tempUnschedulableUntil: '预计 {time} 恢复'
},
tempUnschedulable: {
title: '临时不可调度',
statusTitle: '临时不可调度状态',
hint: '当错误码与关键词同时匹配时,账号会在指定时间内被临时禁用。',
notice: '规则按顺序匹配,需同时满足错误码与关键词。',
addRule: '添加规则',
ruleOrder: '规则序号',
multipleErrorTrigger: '{minutes} 分钟内累计 {count} 次匹配错误,达到触发阈值({threshold})。',
multipleErrorTriggerNoWindow: '累计 {count} 次匹配错误,达到触发阈值({threshold})。',
multipleErrorCountInWindow: '{minutes} 分钟内累计发生 {count} 次匹配错误。',
multipleErrorCount: '本次不可调度由累计 {count} 次匹配错误触发。',
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: 'G31FI',
claude: 'Claude',
grokRequests: '请求',
grokTokens: 'Token',
grokFreeQuota24hHint: '按 sub2api 近 24 小时本地 Token 用量估算(上限 {limit}',
grokWeeklyUsage: '周额度已用 {percent}%',
grokUsed: '已用 $',
grokBalance: '余额 $',
grokPrepaid: '预付余额',
grokMonthlyLimit: '月度已用/上限(USD',
grokOverage: '超额 onDemandUsed/onDemandCap',
grokOverageShort: '超额 $',
grokUnknown: 'Grok 配额需等待首次上游响应返回 xAI rate-limit 头后显示。',
grokRetryAfter: '{time} 后重试',
grokProbe: '探测',
grokProbeTooltip: '发送最小 xAI Responses 探测请求并读取配额响应头',
grokResetUnsupported: '不支持重置',
grokResetUnsupportedTooltip: 'xAI 未向 Grok OAuth 账号开放重置额度接口',
grokNoHeaders: '未观察到配额响应头',
grokLastStatus: '状态 {status}',
grokLastProbe: '探测 {time}',
grokLastHeadersSeen: '响应头 {time}',
passiveSampled: '被动采样',
activeQuery: '查询'
},
openaiQuotaReset: {
count: '次数',
reset: '重置',
countTooltipLoad: '点击查询剩余重置次数',
countTooltipRefresh: '点击刷新剩余重置次数',
resetTooltipReady: '消耗 1 次重置次数以立即恢复当前窗口',
resetTooltipNeedQuery: '先点击「次数」加载剩余重置次数',
resetTooltipNoCredits: '没有可用的重置次数',
resetTooltipShadow: 'Spark 影子账号不能重置次数;请在母账号上重置',
expiresAt: '到期 {time}',
expiresAtFull: '重置次数到期时间: {time}',
expandExpirations: '展开其余 {count} 张重置次数到期时间',
collapseExpirations: '收起重置次数到期时间',
expirationDetails: '重置次数到期明细',
noCreditsAvailable: '没有可用的重置次数',
resetSuccess: '已重置 {windows} 个窗口,次数和账号状态已更新',
resetCacheRefreshFailed: '窗口已重置、账号状态已恢复,但重置次数未能回读,请重新查询次数。',
resetAccountRecoveryFailed: '窗口已重置,但账号状态恢复失败,请手动恢复账号状态。',
resetAccountRefreshFailed: '窗口、账号状态和重置次数缓存已更新,但无法加载最新账号显示。',
refreshCachePersistFailed: '已显示实时次数,但到期明细获取失败,仍保留原有缓存明细。',
confirmTitle: '确认重置周限',
confirmMessage: '将消耗 1 次重置次数立即恢复当前窗口,剩余 {count} 次。此操作不可撤销,确定继续吗?'
},
tier: {
free: 'Free',
pro: 'Pro',
ultra: 'Ultra',
aiPremium: 'AI Premium',
standard: '标准版',
basic: '基础版',
personal: '个人版',
unlimited: '无限制'
},
ineligibleWarning:
'该账号无 Antigravity 使用权限,但仍能进行 API 转发。继续使用请自行承担风险。',
forbidden: '已封禁',
forbiddenValidation: '需要验证',
forbiddenViolation: '违规封禁',
openVerification: '打开验证链接',
copyLink: '复制链接',
linkCopied: '链接已复制',
needsReauth: '需要重新授权',
rateLimited: '限流中',
usageError: '获取失败',
testing: '测试中...',
bulkSchedulableEnabled: '成功启用 {count} 个账号的调度',
bulkSchedulableDisabled: '成功停止 {count} 个账号的调度',
bulkSchedulablePartial: '部分调度更新成功:成功 {success} 个,失败 {failed} 个',
bulkSchedulableResultUnknown: '批量调度结果不完整,请稍后重试或刷新列表',
bulkActions: {
selected: '已选择 {count} 个账号',
selectedAll: '已选择全部 {count} 个账号',
selectCurrentPage: '本页全选',
selectAllResults: '全选所有结果({count}',
selectingAll: '正在选择全部结果...',
selectAllFailed: '获取全部账号失败,原有选择未改变',
clear: '清除选择',
edit: '批量编辑账号',
delete: '批量删除',
confirmDelete: '确认删除选中的 {count} 个账号吗?此操作不可恢复。',
deleteSuccess: '已成功删除 {count} 个账号',
enableScheduling: '批量启用调度',
disableScheduling: '批量停止调度',
resetStatus: '批量重置状态',
refreshToken: '批量刷新令牌',
probeUpstreamBilling: '探测上游倍率',
resetStatusSuccess: '已成功重置 {count} 个账号状态',
refreshTokenSuccess: '已成功刷新 {count} 个账号令牌',
partialSuccess: '操作部分完成:{success} 成功,{failed} 失败'
},
bulkEdit: {
title: '批量编辑账号',
selectionInfo: '已选择 {count} 个账号。只更新您勾选或填写的字段,未勾选的字段保持不变。',
baseUrlPlaceholder: 'https://api.anthropic.com 或 https://api.openai.com',
baseUrlNotice: '适用于 API Key 账号及 Grok OAuth 账号的转发端点,留空则不修改',
submit: '批量更新',
updating: '更新中...',
success: '成功更新 {count} 个账号',
successWithInherited: '成功更新 {count} 个账号;其中 {inherited} 个影子账号仍跟随母账号。',
partialSuccess: '部分更新成功:成功 {success} 个,失败 {failed} 个',
partialSuccessWithInherited: '部分更新成功:成功 {success} 个,失败 {failed} 个;其中 {inherited} 个影子账号仍跟随母账号。',
failed: '批量更新失败',
noSelection: '请选择要编辑的账号',
noFieldsSelected: '请至少选择一个要更新的字段',
rateSyncWarning: '已开启上游倍率同步的账号不能批量手工修改倍率,请先在账号编辑页关闭同步。',
rateSyncConflict: '无法修改账号倍率:{count} 个目标账号已开启上游倍率同步。',
longContextShadowHint: '长上下文计费归母账号所有。选中的影子账号仍跟随母账号,筛选全量目标时同样如此。',
longContextParentRequired: '选中的账号全部是影子账号,请选择母账号修改长上下文计费。',
mixedPlatformWarning: '所选账号跨越多个平台({platforms})。显示的模型映射预设为合并结果——请确保映射对每个平台都适用。'
},
bulkDeleteTitle: '批量删除账号',
bulkDeleteConfirm: '确定要删除选中的 {count} 个账号吗?此操作无法撤销。',
bulkDeleteSuccess: '成功删除 {count} 个账号',
bulkDeletePartial: '部分删除成功:成功 {success} 个,失败 {failed} 个',
bulkDeleteFailed: '批量删除失败',
recoverState: '恢复状态',
recoverStateHint: '用于恢复错误、限流和临时不可调度等可恢复状态。',
recoverStateSuccess: '账号状态已恢复',
recoverStateFailed: '恢复账号状态失败',
fallbackActive: '已回退',
fallbackActiveTip: '原代理 {origin} 已到期,当前使用备用代理',
revertProxy: '切回原代理',
revertProxySuccess: '已成功切回原代理',
revertProxyFailed: '切回原代理失败',
createSparkShadow: '创建 Spark 影子账号',
createSparkShadowConfirm: '为「{name}」创建链接型 Spark 影子账号?影子共享母账号凭据、仅服务 spark 模型。',
createSparkShadowSuccess: 'Spark 影子账号已创建',
createSparkShadowFailed: '创建 Spark 影子账号失败',
duplicateAccount: '复制账号',
duplicateSuccess: '账号已复制为「{name}」,已暂停调度,请确认凭据后再启用',
duplicateFailed: '复制账号失败',
resetStatus: '重置状态',
statusReset: '账号状态已重置',
failedToResetStatus: '重置账号状态失败',
testFailed: '账号测试失败',
failedToLoad: '加载账号列表失败',
failedToDelete: '删除账号失败',
failedToRefresh: '刷新 Cookie 失败',
// Create/Edit Account Modal
platform: '平台',
accountName: '账号名称',
enterAccountName: '请输入账号名称',
accountType: '账号类型',
claudeCode: 'Claude Code',
claudeConsole: 'Claude Console',
bedrockLabel: 'AWS Bedrock',
bedrockDesc: 'SigV4 / API Key',
vertexLabel: 'Vertex',
vertexDesc: 'Service Account',
vertexAnthropicHint: '使用 Google Cloud Service Account JSON 通过 Vertex AI 调用 Anthropic Claude。建议配置模型映射,将客户端 Claude 模型名映射到 Vertex 模型 ID。',
vertexGeminiHint: '使用 Google Cloud Service Account JSON 访问 Vertex AI Gemini。建议将 Vertex 账号放入独立分组,避免和 AI Studio/Gemini OAuth 同模型混调。',
vertexSaJsonLabel: 'Service Account JSON',
vertexSaJsonLoaded: '已读取 Service Account JSON',
vertexSaJsonDrop: '拖入 Service Account JSON',
vertexSaJsonKeyHidden: '密钥内容不会在表单中显示。',
vertexSaJsonDropHint: '把 .json 文件拖到这里,或点击按钮选择文件。',
vertexSaJsonSelectBtn: '选择 JSON',
vertexSaJsonUploadHint: '上传或拖入 JSON 后会自动读取 project_id,密钥内容仅用于创建账号提交。',
vertexSaJsonEditHint: 'Service Account JSON 不在编辑页显示;需要更换 JSON 时请删除账号后重新创建。',
vertexProjectIdPlaceholder: '从 JSON 自动读取',
vertexLocationHint: '不同 Vertex 模型可用 location 可能不同,这里选择账号默认 endpoint location。',
vertexLocationRequired: '请填写 Vertex location',
vertexSaJsonMissingFields: 'Service Account JSON 缺少 project_id、client_email 或 private_key',
vertexSaJsonMissingProjectId: 'Service Account JSON 缺少 project_id',
vertexSaJsonMissingClientEmail: 'Service Account JSON 缺少 client_email',
vertexSaJsonInvalid: 'Service Account JSON 格式无效',
vertexSaJsonRequired: '请上传 Service Account JSON',
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',
oauthPassthrough: '自动透传(仅替换认证)',
oauthPassthroughDesc:
'开启后,该 OpenAI 账号将自动透传请求与响应,仅替换认证并保留计费/并发/审计及必要安全过滤;如遇兼容性问题可随时关闭回滚。',
flattenNamespaces: '摊平 Codex namespace 工具(兼容)',
flattenNamespacesDesc:
'默认关闭:/responses 上的 namespace 工具声明原样转发,这正是 ChatGPT Codex 后端期望的形态。仅当该 OAuth 账号指向不认识 namespace 的兼容上游时才开启——摊平会把工具改名为 namespace__tool,使按 functions.<命名空间>.<工具> 寻址的模型(如 gpt-5.6 多智能体)无法调用。压缩(compact)请求不受该开关影响,始终摊平。',
longContextBilling: 'API 长上下文计费',
longContextBillingDesc: '默认关闭。仅当该账号的上游会按模型阈值收取 OpenAI API 长上下文费率时开启。',
responsesWebsocketsV2: 'Responses WebSocket v2',
responsesWebsocketsV2Desc:
'默认关闭。开启后可启用 responses_websockets_v2 协议能力(受网关全局开关与账号类型开关约束)。',
wsMode: 'WS mode',
wsModeDesc:
'仅对当前 OpenAI 账号类型生效;包括 http_bridge 在内的账号 WS mode 仅在全局 gateway.openai_ws.mode_router_v2_enabled=true 时生效。',
wsModeOff: '关闭(off',
wsModeCtxPool: '上下文池(ctx_pool',
wsModePassthrough: '透传(passthrough',
wsModeHttpBridge: 'HTTP 桥接(http_bridge',
wsModeShared: '共享(shared',
wsModeDedicated: '独享(dedicated',
wsModeConcurrencyHint: '启用 WS mode 后,该账号并发数将作为该账号 WS 连接池上限。',
wsModePassthroughHint: 'passthrough 模式不使用 WS 连接池。',
oauthResponsesWebsocketsV2: 'OAuth WebSocket Mode',
oauthResponsesWebsocketsV2Desc:
'仅对 OpenAI OAuth 生效。开启后该账号才允许使用 OpenAI WebSocket Mode 协议。',
apiKeyResponsesWebsocketsV2: 'API Key WebSocket Mode',
apiKeyResponsesWebsocketsV2Desc:
'仅对 OpenAI API Key 生效。开启后该账号才允许使用 OpenAI WebSocket Mode 协议。',
responsesWebsocketsV2PassthroughHint: '当前已开启自动透传:仅影响 HTTP 透传链路,不影响 WS mode。',
responsesMode: 'Responses API 支持',
responsesModeDesc:
'仅对 OpenAI API Key 的文本转发链路生效。自动跟随探测结果,强制模式会覆盖自动探测。',
responsesModeAuto: '自动',
responsesModeForceResponses: '强制 Responses',
responsesModeForceChatCompletions: '强制 Chat Completions',
responsesModeTextDisabledHint: '未启用 Responses / Chat Completions 端点时,此设置不适用。',
endpointCapabilities: '端点能力',
endpointCapabilitiesDesc:
'用于调度筛选。文本端点会跟随上方 Responses API 支持显示为 Responses、Chat Completions 或自动模式;Embeddings 独立控制 /v1/embeddings。',
capabilityResponses: 'Responses',
capabilityTextAuto: 'Responses / Chat Completions(自动)',
capabilityResponsesAuto: 'Responses(自动探测)',
capabilityChatCompletions: 'Chat Completions',
capabilityChatCompletionsAuto: 'Chat Completions(自动探测)',
capabilityEmbeddings: 'Embeddings',
responsesStatusAutoSupported: '自动探测:Responses',
responsesStatusAutoUnsupported: '自动探测:Chat Completions',
responsesStatusAutoUnknown: '自动探测:未探测',
responsesStatusForcedResponses: '已强制 Responses',
responsesStatusForcedChatCompletions: '已强制 Chat Completions',
planType: '订阅档位(手动覆盖)',
planTypeDesc: '手动纠正本账号的 ChatGPT 订阅档位(Plus / Pro / Free)。注意:令牌临期刷新或命中 429 限流时,会用真实档位自动覆盖此处设置。',
planTypeClear: '清空(自动识别)',
codexCLIOnly: '仅允许 Codex 官方客户端',
codexCLIOnlyDesc: '仅对 OpenAI OAuth 生效。开启后仅允许 Codex 官方客户端家族访问;关闭后完全绕过并保持原逻辑。',
codexCLIOnlyAppServer: '允许 Codex app-server 客户端',
codexCLIOnlyAppServerDesc: '仅在上方开关开启时生效。开启后本账号额外放行内嵌 Codex 引擎、经 app-server 协议接入的第三方客户端(如 Claude Code 的 codex 插件),仍需通过全局引擎指纹门;与全局 app-server 开关取 OR(任一开即放行)。',
codexFingerprintMode: 'Codex 指纹收敛',
codexFingerprintModeDesc: '多人共享同一 OAuth 账号时,将各用户的设备/会话标识收敛为账号级恒定值,减少上游可见的设备数和会话数。默认关闭(原样透传客户端标识),需要时再显式开启;部分账号开启收敛后出现过额度缩水,请按自己的实测结果选择。',
codexFingerprintOff: '关闭(透传,默认)',
codexFingerprintDevice: '仅设备',
codexFingerprintSession: '设备+会话',
codexFingerprintFull: '完全收敛',
codexImageTool: 'Codex 图片桥接策略',
codexImageToolDesc:
'统一控制 Codex /responses 文本请求的 hosted image_generation 桥接和客户端图片工具声明。hosted 工具自动注入仅适用于非 Responses Lite 请求;账号级策略优先于渠道和全局配置,不影响独立图片生成接口。',
codexImageToolInherit: '跟随渠道',
codexImageToolInheritDesc: '不写入账号覆盖;非 Lite 请求是否注入 hosted 工具由渠道或全局策略决定,客户端显式携带的 hosted 工具和本地 image_gen 声明照常放行。',
codexImageToolEnabled: '启用 Hosted 桥接',
codexImageToolEnabledDesc: '仅为非 Responses Lite 请求注入 hosted image_generation 工具;客户端显式携带的图片工具仍会放行。',
codexImageToolDisabled: '不注入 Hosted 工具',
codexImageToolDisabledDesc: '不注入 hosted 工具;客户端显式携带的 hosted 工具和本地 image_gen 声明仍会放行。',
codexImageToolBlock: '移除客户端图片工具',
codexImageToolBlockDesc: '不通过桥接自动注入 hosted 工具,并移除客户端显式携带的 hosted image_generation 工具、本地 image_gen 声明及相关 tool_choiceimage-only 模型路由不受影响。',
codexImageToolBadgeInherit: '渠道策略',
codexImageToolBadgeEnabled: 'Hosted 桥接已开启',
codexImageToolBadgeDisabled: '不注入 Hosted 工具',
codexImageToolBadgeBlock: '客户端图片工具已移除',
compactMode: 'Compact 模式',
compactModeDesc:
'控制本账号在 /responses/compact 调度中的参与方式。Auto 跟随探测结果,Force On 强制允许,Force Off 强制排除。',
compactModeAuto: '自动',
compactModeForceOn: '强制开启',
compactModeForceOff: '强制关闭',
compactModelMapping: 'Compact 专属模型映射',
compactModelMappingDesc:
'仅在 /responses/compact 请求中生效。当上游 compact 端点需要特殊 compact 模型时使用。',
compactSupported: '支持 Compact',
compactUnsupported: '不支持 Compact',
compactAuto: 'Compact Auto',
compactUnknown: 'Compact Auto',
compactLastChecked: '最近探测',
testMode: '测试模式',
testModeDefault: '常规请求',
testModeCompact: 'Compact 探测',
modelRestrictionDisabledByPassthrough: '已开启自动透传:模型白名单/映射不会生效。',
},
grok: {
baseUrlHint: 'Grok OAuth 账号会转发到官方 xAI API Base URL。',
apiKeyHint: 'Grok 订阅支持使用 OAuth refresh tokenAPI Key 账号不在本次范围内。',
// 账号连通性测试弹窗
testMode: '测试模式',
testModeHint:
'文本 / 图片 / 视频使用所选模型。网页搜索、TTS、STT、Realtime 走独立接口探测(不是对话里的 tools)。',
testModeText: '文本(Responses',
testModeImage: '图片(/images/generations',
testModeVideo: '视频(/videos/generations',
testModeSearch: '网页搜索(/web_search',
testModeTTS: '语音合成 TTS/tts',
testModeSTT: '语音识别 STT/stt',
testModeRealtime: '实时语音 RealtimeWS /realtime',
textTestMode: '模式:文本(Responses',
searchTestMode: '模式:网页搜索(/web_search',
ttsTestMode: '模式:TTS/tts',
sttTestMode: '模式:STT/stt',
realtimeTestMode: '模式:RealtimeWS /realtime',
searchQueryLabel: '搜索关键词',
searchQueryPlaceholder: '例如:xAI Grok',
searchQueryDefault: 'xAI Grok',
searchTestHint:
'独立网页搜索探测(与网关 /v1/web_search 语义一致),不是带 tools 的自由对话。',
ttsTextLabel: 'TTS 文本',
ttsTextPlaceholder: '例如:Hello from Sub2API connectivity test.',
ttsTextDefault: 'Hello from Sub2API account connectivity test.',
ttsTestHint: '独立调用 /v1/ttslanguage=en);成功时显示音频字节数。',
sttTestHint: '独立调用 /v1/stt,使用合成静音 WAV;成功表示接口可达。',
realtimeTestHint:
'独立 WebSocket 拨号 /v1/realtimemodel=grok-voice-latest)。握手成功即连通;若有首包服务端事件会一并显示。',
sendingSearchRequest: '正在发送独立 web_search 请求...',
sendingTTSRequest: '正在发送独立 /tts 请求...',
sendingSTTRequest: '正在发送独立 /stt 请求...',
sendingRealtimeRequest: '正在拨号独立 /realtime WebSocket...',
selectedTestMode: '测试模式:{mode}',
imageUploadLabel: '源图片(可选,图生图/编辑)',
videoFirstFrameLabel: '首帧 / 参考图(可选)',
imageUploadHint:
'建议 PNG/JPEG,宽高均 ≥ 8 像素,编辑建议小于约 4MB。上传源图会走 /images/edits(图生图);不上传则走 /images/generations 文生图。',
videoFirstFrameHint:
'可选首帧/参考图用于图生视频。建议 PNG/JPEG,宽高均 ≥ 8 像素。',
audioUploadLabel: '音频文件(STT 可选)',
audioUploadHint: '上传真实音频做转写;不上传则用静音 WAV 仅测连通。',
mediaTooLarge: '文件过大(管理端测试上传上限约 6MB)。',
chooseImageFile: '选择图片',
chooseAudioFile: '选择音频',
uploadPreviewAlt: '上传预览',
fileReadFailed: '读取所选文件失败',
noResponseBody: '服务器未返回响应体'
},
anthropic: {
apiKeyPassthrough: '自动透传(仅替换认证)',
apiKeyPassthroughDesc:
'仅对 Anthropic API Key 生效。开启后,messages/count_tokens 请求将透传上游并仅替换认证,保留计费/并发/审计及必要安全过滤;关闭即可回滚到现有兼容链路。',
apiKeyAuthScheme: '上游认证方式',
apiKeyAuthSchemeDesc: '选择转发到 Anthropic-compatible 上游时使用的 API Key 认证头。Ollama Cloud 使用 Authorization: Bearer。',
apiKeyAuthSchemeXApiKey: 'x-api-key',
apiKeyAuthSchemeBearer: 'Authorization: Bearer',
webSearchEmulation: 'Web Search 模拟',
webSearchEmulationDesc:
'为该 API Key 账号启用 web search 模拟。客户端发送纯 web_search 请求时,由网关调用第三方搜索 API 并构造响应返回。默认跟随渠道配置。',
webSearchDefault: '默认',
webSearchEnabled: '开启',
webSearchDisabled: '关闭',
},
modelRestriction: '模型限制(可选)',
modelWhitelist: '模型白名单',
modelMapping: '模型映射',
selectAllowedModels: '选择允许的模型。留空则支持所有模型。',
mapRequestModels: '将请求模型映射到实际模型。左边是请求的模型,右边是发送到 API 的实际模型。',
selectedModels: '已选择 {count} 个模型',
supportsAllModels: '(支持所有模型)',
requestModel: '请求模型',
actualModel: '实际模型',
addMapping: '添加映射',
mappingExists: '模型 {model} 的映射已存在',
wildcardOnlyAtEnd: '通配符 * 只能放在末尾',
targetNoWildcard: '目标模型不能包含通配符 *',
searchModels: '搜索模型...',
noMatchingModels: '没有匹配的模型',
fillRelatedModels: '同步最新支持模型',
syncUpstreamModels: '同步上游支持的模型',
syncUpstreamModelsLoading: '同步上游中...',
syncUpstreamModelsSuccess: '已从上游同步 {count} 个新模型(上游共 {total} 个)',
syncUpstreamModelsNoChanges: '上游 {count} 个模型均已在白名单中',
syncUpstreamModelsEmpty: '上游没有返回可同步的模型',
syncUpstreamModelsFailed: '同步上游模型失败',
syncUpstreamModelsError: '同步上游模型失败:{message}',
clearAllModels: '清除所有模型',
customModelName: '自定义模型名称',
enterCustomModelName: '输入自定义模型名称',
addModel: '填入',
modelExists: '该模型已存在',
modelCount: '{count} 个模型',
poolMode: '池模式',
poolModeHint: '上游为账号池时启用,错误不标记本地账号状态',
poolModeInfo:
'启用后,上游 429/403/401 错误将自动重试而不标记账号限流或错误,适用于上游指向另一个 sub2api 实例的场景。',
poolModeRetryCount: '同账号重试次数',
poolModeRetryCountHint: '仅在池模式下生效。0 表示不原地重试;默认 {default},最大 {max}。',
poolModeRetryStatusCodes: '同账号重试状态码',
poolModeRetryStatusCodesHint: '仅在池模式下生效。以英文逗号分隔的 HTTP 状态码(100-599),命中时触发同账号重试。留空使用默认值({default})。',
customErrorCodes: '自定义错误码',
customErrorCodesHint: '仅对选中的错误码停止调度',
customErrorCodesWarning: '仅选中的错误码会停止调度,其他错误将返回 500。',
customErrorCodes429Warning:
'429 已有内置的限流处理机制。添加到自定义错误码后,将直接停止调度而非临时限流。确定要添加吗?',
customErrorCodes529Warning:
'529 已有内置的过载处理机制。添加到自定义错误码后,将直接停止调度而非临时标记过载。确定要添加吗?',
selectedErrorCodes: '已选择',
noneSelectedUsesDefault: '未选择(使用默认策略)',
enterErrorCode: '输入错误码 (100-599)',
invalidErrorCode: '请输入有效的 HTTP 错误码 (100-599)',
errorCodeExists: '该错误码已被选中',
interceptWarmupRequests: '拦截预热请求',
interceptWarmupRequestsDesc: '启用后,标题生成等预热请求将返回 mock 响应,不消耗上游 token',
headerOverride: {
title: '请求头覆写',
hint: '转发时用配置值覆盖同名请求头(不区分大小写)',
info: '仅对本账号的出站请求生效:配置的请求头会在转发前覆盖客户端/网关生成的同名头。认证头(authorization、x-api-key)与连接控制头不允许覆写。',
namePlaceholder: '请求头名称(如 user-agent',
valuePlaceholder: '覆写值(留空表示不覆写)',
addRow: '添加请求头',
importJson: 'JSON 导入',
importJsonApply: '解析并填入',
importJsonCancel: '取消',
importJsonHint: '粘贴扁平 JSON 对象(请求头名 → 值),解析后将整体替换当前列表。',
importJsonInvalid: 'JSON 格式不正确:需要"请求头名 → 字符串值"的扁平对象',
copyJson: '复制为 JSON',
emptyValueHint: '值留空的行不会参与覆盖,仅作为待填写的占位。',
bulkDisableHint: '保存后将关闭所选账号的请求头覆写并清空已有配置。',
bulkReplaceHint: '保存后将用下方配置整体替换所选账号已有的请求头覆写配置。',
bulkEmptyRows: '请至少添加一行请求头再保存;如需清空已有配置,请关闭上方开关。',
invalidName: '请求头名称格式不正确(仅允许字母、数字和 !#$%&\'*+-.^_`|~ 字符)',
blockedName: '该请求头不允许覆写(认证头与连接控制头由系统管理)',
duplicateName: '存在重复的请求头名称(匹配不区分大小写)',
invalidValue: '请求头值不合法(不允许控制字符,长度不超过 8192)',
tooManyEntries: '请求头覆写条目过多(最多 64 条)'
},
grokCustomBaseUrl: {
title: '自定义上游地址',
hint: '开启后账号流量(对话/媒体/探测)改发指定地址;OAuth 授权与令牌刷新不受影响,仍走官方端点。',
placeholder: 'https://relay.example.com/v1',
required: '开启自定义上游地址后必须填写地址',
invalid: '上游地址格式不正确(需为 http(s):// 开头的完整地址)',
presets: {
cli: 'Grok Build CLI',
official: '官方 API'
}
},
grokClientToolCache: {
title: '客户端工具缓存(可能改变自动工具选择)',
hint: '仅对已识别为 Free 的 Grok OAuth 账号生效,默认会为 Codex、Trae 等客户端函数工具请求启用上游提示缓存;如不接受自动工具选择行为,可关闭此开关退出。'
},
autoPauseOnExpired: '过期自动暂停调度',
autoPauseOnExpiredDesc: '启用后,账号过期将自动暂停调度',
autoPause5hThreshold: '5h 用量阈值(%)',
autoPause7dThreshold: '7d 用量阈值(%)',
autoPauseThresholdHint: '留空或填 0 表示使用全局默认阈值(在运维设置中配置);填具体值则覆盖全局默认。达到阈值后仅在调度时跳过账号,不修改 schedulable。',
autoPause5hDisabled: '禁用 5h 自动暂停',
autoPause7dDisabled: '禁用 7d 自动暂停',
autoPauseDisabledHint: '开启后该账号永不进入自动暂停(即使全局默认阈值已配置)。',
// Quota control (Anthropic OAuth/SetupToken only)
quotaControl: {
title: '配额控制',
hint: '配置费用窗口、会话限制、客户端亲和等调度控制。',
windowCost: {
label: '5h窗口费用控制',
hint: '限制账号在5小时窗口内的费用使用',
limit: '费用阈值',
limitPlaceholder: '50',
limitHint: '达到阈值后不参与新请求调度',
stickyReserve: '粘性预留额度',
stickyReservePlaceholder: '10',
stickyReserveHint: '为粘性会话预留的额外额度'
},
sessionLimit: {
label: '会话数量控制',
hint: '限制同时活跃的会话数量',
maxSessions: '最大会话数',
maxSessionsPlaceholder: '3',
maxSessionsHint: '同时活跃的最大会话数量',
idleTimeout: '空闲超时',
idleTimeoutPlaceholder: '5',
idleTimeoutHint: '会话空闲超时后自动释放'
},
rpmLimit: {
label: 'RPM 限制',
hint: '限制每分钟请求数量,保护上游账号',
baseRpm: '基础 RPM',
baseRpmPlaceholder: '15',
baseRpmHint: '每分钟最大请求数,0 或留空表示不限制',
strategy: 'RPM 策略',
strategyTiered: '三区模型',
strategyStickyExempt: '粘性豁免',
strategyTieredHint: '绿区→黄区→仅粘性→阻塞,逐步限流',
strategyStickyExemptHint: '超限后仅允许粘性会话',
strategyHint: '三区模型: 超限后逐步限制; 粘性豁免: 已有会话不受限',
stickyBuffer: '粘性缓冲区',
stickyBufferPlaceholder: '默认: base RPM 的 20%',
stickyBufferHint: '超过 base RPM 后,粘性会话额外允许的请求数。为空则使用默认值(base RPM 的 20%,最小为 1',
userMsgQueue: '用户消息限速',
userMsgQueueHint: '对用户消息施加发送限制,避免触发上游 RPM 限制',
umqModeOff: '关闭',
umqModeThrottle: '软性限速',
umqModeSerialize: '串行队列',
},
tlsFingerprint: {
label: 'TLS 指纹模拟',
hint: '模拟 Node.js/Claude Code 客户端的 TLS 指纹',
defaultProfile: '内置默认',
randomProfile: '随机'
},
sessionIdMasking: {
label: '会话 ID 伪装',
hint: '启用后将在 15 分钟内固定 metadata.user_id 中的 session ID,使上游认为请求来自同一会话'
},
cacheTTLOverride: {
label: '缓存 TTL 强制替换',
hint: '将所有缓存创建 token 强制按指定的 TTL 类型(5分钟或1小时)计费',
target: '目标 TTL',
targetHint: '选择计费使用的 TTL 类型'
},
customBaseUrl: {
label: '自定义转发地址',
hint: '启用后将请求转发到自定义中继服务,代理地址将作为 URL 参数传递给中继服务',
urlHint: '中继服务地址(如 https://relay.example.com',
},
clientAffinity: {
label: '客户端亲和调度',
hint: '启用后,新会话会优先调度到该客户端之前使用过的账号,避免频繁切换账号'
}
},
affinityNoClients: '无亲和客户端',
affinityClients: '{count} 个亲和客户端:',
affinitySection: '客户端亲和',
affinitySectionHint: '控制客户端在账号间的分布。通过配置区域阈值来平衡负载。',
affinityToggle: '启用客户端亲和',
affinityToggleHint: '新会话优先调度到该客户端之前使用过的账号',
affinityBase: '基础限额(绿区)',
affinityBasePlaceholder: '留空表示不限制',
affinityBaseHint: '绿区最大客户端数量(完整优先级调度)',
affinityBaseOffHint: '未开启绿区限制,所有客户端均享受完整优先级调度',
affinityBuffer: '缓冲区(黄区)',
affinityBufferPlaceholder: '例如 3',
affinityBufferHint: '黄区允许的额外客户端数量(降级优先级调度)',
affinityBufferInfinite: '不限制',
expired: '已过期',
proxy: '代理',
noProxy: '无代理',
concurrency: '并发数',
loadFactor: '负载因子',
loadFactorHint: '提高负载因子可以提高对账号的调度频率',
priority: '优先级',
priorityHint: '优先级越小的账号优先使用',
billingRateMultiplier: '账号计费倍率',
billingRateMultiplierHint: '0 表示不计费,仅影响账号计费',
expiresAt: '过期时间',
expiresAtHint: '留空表示不过期',
higherPriorityFirst: '数值越小优先级越高',
mixedScheduling: '在 /v1/messages 中使用',
mixedSchedulingHint: '启用后可参与 Anthropic/Gemini 分组的调度',
mixedSchedulingTooltip:
'!!注意!! Antigravity Claude 和 Anthropic Claude 无法在同个上下文中使用,如果你同时有 Anthropic 账号和 Antigravity 账号,开启此选项会导致经常 400 报错。开启后,请用分组功能做好 Antigravity 账号和 Anthropic 账号的隔离。一定要弄明白再开启!!',
aiCreditsBalance: 'AI Credits',
allowOverages: '允许超量请求 (AI Credits)',
allowOveragesTooltip:
'仅在免费配额被明确判定为耗尽后才会使用 AI Credits。普通并发 429 限流不会切换到超量请求。',
creating: '创建中...',
updating: '更新中...',
accountCreated: '账号创建成功',
accountUpdated: '账号更新成功',
failedToCreate: '创建账号失败',
failedToUpdate: '更新账号失败',
pleaseSelectStatus: '请选择有效的账号状态',
mixedChannelWarningTitle: '混合渠道警告',
mixedChannelWarning: '警告:分组 "{groupName}" 中同时包含 {currentPlatform} 和 {otherPlatform} 账号。混合使用不同渠道可能导致 thinking block 签名验证问题,会自动回退到非 thinking 模式。确定要继续吗?',
pleaseEnterAccountName: '请输入账号名称',
pleaseEnterApiKey: '请输入 API Key',
bedrockAccessKeyId: 'AWS Access Key ID',
bedrockSecretAccessKey: 'AWS Secret Access Key',
bedrockSessionToken: 'AWS Session Token',
bedrockRegion: 'AWS Region',
bedrockRegionHint: '例如 us-east-1, us-west-2, eu-west-1',
bedrockForceGlobal: '强制使用 Global 跨区域推理',
bedrockForceGlobalHint: '启用后模型 ID 使用 global. 前缀(如 global.anthropic.claude-...),请求可路由到全球任意支持的区域,获得更高可用性',
bedrockAccessKeyIdRequired: '请输入 AWS Access Key ID',
bedrockSecretAccessKeyRequired: '请输入 AWS Secret Access Key',
bedrockRegionRequired: '请选择 AWS Region',
bedrockSessionTokenHint: '可选,用于临时凭证',
bedrockSecretKeyLeaveEmpty: '留空以保持当前密钥',
bedrockAuthMode: '认证方式',
bedrockAuthModeSigv4: 'SigV4 签名',
bedrockAuthModeApikey: 'Bedrock API Key',
bedrockApiKeyLabel: 'Bedrock API Key',
bedrockApiKeyDesc: 'Bearer Token 认证',
bedrockApiKeyInput: 'API Key',
bedrockApiKeyRequired: '请输入 Bedrock API Key',
bedrockApiKeyLeaveEmpty: '留空以保持当前密钥',
apiKeyIsRequired: 'API Key 是必需的',
leaveEmptyToKeep: '留空以保持当前密钥',
// Upstream type
upstream: {
baseUrl: '上游 Base URL',
baseUrlHint: '上游 Antigravity 服务的地址,例如:https://cloudcode-pa.googleapis.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} 个账号',
batchSuccess: '成功创建 {count} 个账号',
batchPartialSuccess: '部分成功:{success} 个成功,{failed} 个失败',
batchFailed: '批量创建失败',
// 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 参数值,系统会自动识别',
failedToGenerateUrl: '生成 OpenAI 授权链接失败',
failedToExchangeCode: 'OpenAI 授权码兑换失败',
failedToValidateRT: '验证 Refresh Token 失败',
errors: {
OPENAI_OAUTH_PROXY_REQUIRED:
'未设置代理,当前服务器无法直连 OpenAI,导致 OpenAI OAuth 请求失败。请先选择可访问 OpenAI 的代理后重试;如果授权码已失效,请重新生成授权链接。'
},
// Refresh Token auth
refreshTokenAuth: '手动输入 RT',
refreshTokenDesc: '输入您已有的 OpenAI Refresh Token,支持批量输入(每行一个),系统将自动验证并创建账号。',
refreshTokenPlaceholder: '粘贴您的 OpenAI Refresh Token...\n支持多个,每行一个',
mobileRefreshTokenAuth: '手动输入 Mobile RT',
accessTokenAuth: '手动输入 AT',
codexSessionAuth: 'Codex OAuth auth.json / AT 导入',
codexSessionDesc: '粘贴 Codex OAuth auth.json 或 accessToken,按第一步配置创建账号。',
codexSessionInputLabel: 'Codex OAuth auth.json 或 accessToken',
codexSessionPlaceholder: '支持多行,每行一个 token 或 auth.json 对象',
codexSessionHint: 'OAuth session/accessToken 导入继续沿用原有过期规则。',
codexSessionImportAndCreate: '导入并创建账号',
codexSessionEmpty: '请输入 Codex auth.json 或 accessToken',
codexSessionImportFailed: 'Codex 账号导入失败',
codexSessionImportSuccess: '导入完成:新增 {created},更新 {updated},跳过 {skipped}',
codexSessionImportPartial: '部分成功:新增 {created},更新 {updated},跳过 {skipped},失败 {failed}',
agentIdentityAuth: 'Agent Identity auth.json',
agentIdentityDesc: '导入 Codex Agent Identity auth.json,不保存 OAuth access token 或 refresh token。',
agentIdentityInputLabel: 'Agent Identity auth.json',
agentIdentityPlaceholder: '粘贴一个 Agent Identity auth.json 对象',
agentIdentityHint: '文件必须使用 auth_mode=agentIdentity;每次上游请求都会动态签名。',
agentIdentityInvalid: '请选择 auth_mode=agentIdentity 的 Codex auth.json。',
codexPatAuth: 'Codex Personal Access Token',
codexPatDesc: '输入 Codex at- Personal Access Token,系统会先调用 OpenAI whoami 校验后再创建账号。',
codexPatInputLabel: 'Codex PAT',
codexPatPlaceholder: 'at-...',
codexPatHint: '这是独立认证模式,不保存 refresh_token,也不会写入 OAuth access_token 过期时间。',
codexPatImportAndCreate: '校验并创建 Codex PAT 账号',
codexPatEmpty: '请输入 Codex Personal Access Token',
codexPatImportFailed: 'Codex PAT 账号创建失败',
sessionTokenAuth: '手动输入 ST',
sessionTokenDesc: '输入您已有的 Session Token,支持批量输入(每行一个),系统将自动验证并创建账号。',
sessionTokenPlaceholder: '粘贴您的 Session Token...\n支持多个,每行一个',
sessionTokenRawLabel: '原始字符串',
sessionTokenRawPlaceholder: '粘贴 /api/auth/session 原始数据或 Session Token...',
sessionTokenRawHint: '支持粘贴完整 JSON,系统会自动解析 ST 和 AT。',
openSessionUrl: '打开获取链接',
copySessionUrl: '复制链接',
sessionUrlHint: '该链接通常可获取 AT。若返回中无 sessionToken,请从浏览器 Cookie 复制 __Secure-next-auth.session-token 作为 ST。',
parsedSessionTokensLabel: '解析出的 ST',
parsedSessionTokensEmpty: '未解析到 ST,请检查输入内容',
parsedAccessTokensLabel: '解析出的 AT',
validating: '验证中...',
validateAndCreate: '验证并创建账号',
pleaseEnterRefreshToken: '请输入 Refresh Token',
pleaseEnterSessionToken: '请输入 Session Token'
},
grok: {
title: 'Grok 账号授权',
followSteps: '请按照以下步骤授权您的 xAI/Grok 账号:',
step1GenerateUrl: '生成 xAI 授权链接',
generateAuthUrl: '生成授权链接',
step2OpenUrl: '在浏览器中打开链接并完成授权',
openUrlDesc: '在新标签页中打开授权链接,登录 xAI 并授权 API 访问。',
importantNotice: '当浏览器跳转到本地 callback URL 后,请复制完整 URL 或 code 参数回填到这里。',
step3EnterCode: '输入授权链接或 Code',
authCodeDesc: '授权完成后,粘贴 callback URL、查询字符串或授权码:',
authCode: '授权链接或 Code',
authCodePlaceholder: '粘贴完整 callback URL、?code=... 查询字符串或 code 值',
authCodeHint: '支持完整 callback URL、查询字符串或裸 code。',
refreshTokenAuth: '手动输入 RT',
refreshTokenDesc: '输入已有的 xAI refresh token,支持批量输入(每行一个)。',
refreshTokenPlaceholder: '粘贴您的 xAI refresh token...\n支持多个,每行一个',
ssoCookieAuth: 'SSO Cookie 导入',
ssoCookieDesc: '每行粘贴一个 Grok Web SSO key,系统会自动走 xAI Device Flow 并转换为 Grok Build OAuth 凭据。',
ssoCookieLabel: 'Grok Web SSO Key',
ssoCookiePlaceholder: '每行一个 SSO key\n支持多个,每行一个',
ssoCookieHint: '每行一个 SSO key;多个 key 会 3 路并发导入,耗时约 90 秒 × 批次数,建议使用对应地区代理。',
emailPasswordAuth: '邮箱密码登录',
emailPasswordDesc:
'使用 Grok 网页邮箱与密码登录。服务端仅用密码换取临时 SSO 再转 Build OAuth;密码与 raw SSO 均不会写入账号凭据。',
emailPasswordInputLabel: '邮箱----密码',
emailPasswordPlaceholder: "user{'@'}example.com----your-password\n支持多个,每行一组",
emailPasswordHint: '格式:email----password(密码可含 -)。需要配置 YesCaptcha 密钥;建议搭配代理。',
pleaseEnterPassword: '请输入 email----password(每行一组)',
pleaseEnterSSOToken: '请输入 SSO Token',
failedToValidateSSO: '校验 Grok SSO 失败',
failedToAuthorizePassword: 'Grok 密码授权失败',
convertingSSO: '转换中...',
convertSSOAndCreate: '转换并创建账号',
validating: '验证中...',
validateAndCreate: '验证并创建账号',
pleaseEnterRefreshToken: '请输入 Refresh Token',
failedToGenerateUrl: '生成 Grok 授权链接失败',
missingExchangeParams: '缺少授权码、state 或 OAuth 会话',
failedToExchangeCode: 'Grok 授权码兑换失败',
failedToValidateRT: '验证 Grok refresh token 失败',
failedToConvertSSO: 'Grok SSO 转换失败',
errors: {
GROK_OAUTH_SESSION_NOT_FOUND:
'Grok OAuth 会话不存在或已过期。请重新生成授权链接,并粘贴最新的回调链接。',
GROK_OAUTH_INVALID_STATE:
'Grok OAuth state 与当前会话不匹配。请粘贴同一次生成的授权链接返回的回调 URL。',
GROK_OAUTH_STATE_REQUIRED:
'回调链接缺少 OAuth state。请粘贴完整 callback URL,不要只粘贴 code。',
GROK_OAUTH_CODE_REQUIRED:
'缺少 Grok 授权码。请粘贴完整 callback URL、查询字符串或 code 值。',
GROK_OAUTH_NO_REFRESH_TOKEN:
'Grok 响应未返回 refresh token。请重新生成授权链接,并再次确认 offline access 授权。',
GROK_OAUTH_PROXY_NOT_AVAILABLE:
'无法查询 Grok OAuth 代理配置。请检查选择的代理后重试。',
GROK_OAUTH_PROXY_NOT_FOUND:
'找不到所选代理。请选择可用代理后重试。'
},
oauthOnlyHint: '首版 Grok 支持仅包含 OAuth 订阅的 Responses API 文本/推理转发。'
},
// 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 URIhttp://localhost:1455/auth/callbackConsent 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 URIhttp://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 授权码兑换失败',
// Refresh Token auth
refreshTokenAuth: '手动输入 RT',
refreshTokenDesc: '输入您已有的 Antigravity Refresh Token,支持批量输入(每行一个),系统将自动验证并创建账号。',
refreshTokenPlaceholder: '粘贴您的 Antigravity Refresh Token...\n支持多个,每行一个',
validating: '验证中...',
validateAndCreate: '验证并创建账号',
pleaseEnterRefreshToken: '请输入 Refresh Token',
failedToValidateRT: '验证 Refresh Token 失败'
}
},
// 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。',
googleOneDesc: '个人账号,享受 Google One 订阅配额',
codeAssistDesc: '企业级,需要 GCP 项目',
codeAssistRequirement: '需要激活 GCP 项目并绑定信用卡',
showAdvanced: '显示高级选项(自建 OAuth Client',
hideAdvanced: '隐藏高级选项(自建 OAuth Client',
gcpProjectLink: '创建项目',
customTitle: '自定义授权(AI Studio OAuth',
customDesc: '使用管理员预设的 OAuth 客户端,适合组织管理。',
customRequirement: '需管理员配置 Client ID 并加入测试用户白名单。',
badges: {
recommended: '推荐',
highConcurrency: '高并发',
individuals: '推荐个人用户',
noGcp: '无需 GCP',
enterprise: '企业用户',
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: '检查归属地',
countryChange: '修改归属地',
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 ~1000RPM ~60(软限制)',
limitsPremium: 'RPD ~1500+RPM ~60+(优先队列)'
},
gcloud: {
channel: 'GCP Code Assistgcloud 登录)',
account: '未购买 Code Assist 订阅',
limits: 'RPD ~1000RPM ~60(预览期)'
},
aiStudio: {
channel: 'AI Studio API Key / OAuth',
free: '未绑卡(免费层)',
paid: '已绑卡(按量付费)',
limitsFree: 'RPD 50RPM 2Pro/ 15Flash',
limitsPaid: 'RPD 不限;RPM 1000Pro/ 2000Flash)(按模型配额)'
},
customOAuth: {
channel: 'Custom OAuth ClientGCP',
free: '项目未绑卡',
paid: '项目已绑卡',
limitsFree: 'RPD 50RPM 2(项目配额)',
limitsPaid: 'RPD 不限;RPM 1000+(项目配额)'
}
}
},
rateLimit: {
ok: '未限流',
unlimited: '无限流',
limited: '限流 {time}',
now: '现在'
}
},
// Re-Auth Modal
reAuthorizeAccount: '重新授权账号',
claudeCodeAccount: 'Claude Code 账号',
openaiAccount: 'OpenAI 账号',
geminiAccount: 'Gemini 账号',
antigravityAccount: 'Antigravity 账号',
grokAccount: 'Grok 账号',
inputMethod: '输入方式',
reAuthorizedSuccess: '账号重新授权成功',
// Test Modal
testAccountConnection: '测试账号连接',
errorPrefix: '错误:{message}',
imagePreviewAlt: '测试图片 {index}',
imageLightboxAlt: '图片预览',
account: '账号',
readyToTest: '准备测试。点击"开始测试"按钮开始...',
connectingToApi: '连接 API 中...',
testCompleted: '测试完成!',
connectedToApi: '已连接到 API',
usingModel: '使用模型:{model}',
sendingTestMessage: '发送测试消息:"hi"',
sendingImageRequest: '发送生图测试请求...',
response: '响应:',
startTest: '开始测试',
retry: '重试',
copyOutput: '复制输出',
outputCopied: '输出已复制',
startingTestForAccount: '开始测试账号:{name}',
testAccountTypeLabel: '账号类型:{type}',
selectTestModel: '选择测试模型',
testModel: '测试模型',
testPrompt: '提示词:"hi"',
imagePromptLabel: '生图提示词',
imagePromptPlaceholder: '例如:生成一只戴宇航员头盔的橘猫,像素插画风格,纯色背景。',
imagePromptDefault: 'Generate a cute orange cat astronaut sticker on a clean pastel background.',
imageTestHint:
'调用独立 /v1/images/generations 生图,并在下方预览返回图片。',
imageTestMode: '模式:生图测试',
videoPromptLabel: '视频提示词',
videoPromptPlaceholder: '例如:一只红球在白地板上弹跳一次,动作简短。',
videoPromptDefault: 'A red ball bouncing once on a white floor, short simple motion.',
videoTestHint:
'调用独立 /v1/videos/generations,轮询至完成后下载成品视频并在页面上预览。',
videoTestMode: '模式:视频生成测试',
sendingVideoRequest: '正在发送视频生成测试请求...',
imagePreview: '生成结果:',
imageReceived: '已收到第 {count} 张测试图片',
audioPreview: '生成音频:',
audioReceived: '已收到第 {count} 段测试音频',
videoPreview: '生成视频:',
videoReceived: '已收到第 {count} 段测试视频',
// 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: '该账号暂无使用数据'
}
},
// Scheduled Tests
}