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 }