1518 lines
86 KiB
TypeScript
1518 lines
86 KiB
TypeScript
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-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},跳过 {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_choice;image-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 token;API 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: '实时语音 Realtime(WS /realtime)',
|
|||
|
|
textTestMode: '模式:文本(Responses)',
|
|||
|
|
searchTestMode: '模式:网页搜索(/web_search)',
|
|||
|
|
ttsTestMode: '模式:TTS(/tts)',
|
|||
|
|
sttTestMode: '模式:STT(/stt)',
|
|||
|
|
realtimeTestMode: '模式:Realtime(WS /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/tts(language=en);成功时显示音频字节数。',
|
|||
|
|
sttTestHint: '独立调用 /v1/stt,使用合成静音 WAV;成功表示接口可达。',
|
|||
|
|
realtimeTestHint:
|
|||
|
|
'独立 WebSocket 拨号 /v1/realtime(model=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 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 授权码兑换失败',
|
|||
|
|
// 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 ~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 账号',
|
|||
|
|
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
|
|||
|
|
}
|