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

Sub2API 是一个强大的 AI 服务中转平台,让您轻松管理和分发 AI 服务。

🎯 核心功能:

接下来,我们将用 3 分钟带您完成首次配置 →

', nextBtn: '开始配置 🚀', prevBtn: '跳过' }, groupManage: { title: '📦 第一步:分组管理', description: '

什么是分组?

分组是 Sub2API 的核心概念,它就像一个"服务套餐":

💡 示例:您可以创建"VIP专线"(高倍率)和"免费试用"(低倍率)两个分组

👉 点击左侧的"分组管理"开始

' }, createGroup: { title: '➕ 创建新分组', description: '

现在让我们创建第一个分组。

📝 提示:建议先创建一个测试分组,熟悉流程后再创建正式分组

👉 点击"创建分组"按钮

' }, groupName: { title: '✏️ 1. 分组名称', description: '

为您的分组起一个易于识别的名称。

💡 命名建议:
  • "测试分组" - 用于测试
  • "VIP专线" - 高质量服务
  • "免费试用" - 体验版

填写完成后点击"下一步"继续

', nextBtn: '下一步' }, groupPlatform: { title: '🤖 2. 选择平台', description: '

选择该分组支持的 AI 平台。

📌 平台说明:
  • Anthropic - Claude 系列模型
  • OpenAI - GPT 系列模型
  • Google - Gemini 系列模型

一个分组只能选择一个平台

', nextBtn: '下一步' }, groupMultiplier: { title: '💰 3. 费率倍数', description: '

设置该分组的计费倍率,控制用户的实际扣费。

⚙️ 计费规则:
  • 1.0 - 原价计费(成本价)
  • 1.5 - 用户消耗 $1,扣除 $1.5
  • 2.0 - 用户消耗 $1,扣除 $2
  • 0.8 - 补贴模式(亏本运营)

建议测试分组设置为 1.0

', nextBtn: '下一步' }, groupExclusive: { title: '🔒 4. 专属分组(可选)', description: '

控制分组的可见性和访问权限。

🔐 权限说明:
  • 关闭 - 公开分组,所有用户可见
  • 开启 - 专属分组,仅指定用户可见

💡 使用场景:VIP 用户专属、内部测试、特殊客户等

', nextBtn: '下一步' }, groupSubmit: { title: '✅ 保存分组', description: '

确认信息无误后,点击创建按钮保存分组。

⚠️ 注意:分组创建后,平台类型不可修改,其他信息可以随时编辑

📌 下一步:创建成功后,我们将添加上游账号到这个分组

👉 点击"创建"按钮

' }, accountManage: { title: '🔗 第二步:添加账号', description: '

太棒了!分组已创建成功 🎉

现在需要添加上游 AI 服务商的账号,让分组能够实际提供服务。

🔑 账号的作用:
  • 连接到上游 AI 服务(Claude、GPT 等)
  • 一个分组可以包含多个账号(负载均衡)
  • 支持 OAuth 和 Session Key 两种方式

👉 点击左侧的"账号管理"

' }, createAccount: { title: '➕ 添加新账号', description: '

点击按钮开始添加您的第一个上游账号。

💡 提示:建议使用 OAuth 方式,更安全且无需手动提取密钥

👉 点击"添加账号"按钮

' }, accountName: { title: '✏️ 1. 账号名称', description: '

为账号设置一个便于识别的名称。

💡 命名建议:"Claude主账号"、"GPT备用1"、"测试账号" 等

', nextBtn: '下一步' }, accountPlatform: { title: '🤖 2. 选择平台', description: '

选择该账号对应的服务商平台。

⚠️ 重要:平台必须与刚才创建的分组平台一致

', nextBtn: '下一步' }, accountType: { title: '🔐 3. 授权方式', description: '

选择账号的授权方式。

✅ 推荐:OAuth 方式
  • 无需手动提取密钥
  • 更安全,支持自动刷新
  • 适用于 Claude Code、ChatGPT OAuth
📌 Session Key 方式
  • 需要手动从浏览器提取
  • 可能需要定期更新
  • 适用于不支持 OAuth 的平台
', nextBtn: '下一步' }, accountPriority: { title: '⚖️ 4. 优先级(可选)', description: '

设置账号的调用优先级。

📊 优先级规则:
  • 数字越小,优先级越高
  • 系统优先使用低数值账号
  • 相同优先级则随机选择

💡 使用场景:主账号设置低数值,备用账号设置高数值

', nextBtn: '下一步' }, accountGroups: { title: '🎯 5. 分配分组', description: '

关键步骤!将账号分配到刚才创建的分组。

⚠️ 重要提醒:
  • 必须勾选至少一个分组
  • 未分配分组的账号无法使用
  • 一个账号可以分配给多个分组

💡 提示:请勾选刚才创建的测试分组

', nextBtn: '下一步' }, accountSubmit: { title: '✅ 保存账号', description: '

确认信息无误后,点击保存按钮。

📌 OAuth 授权流程:
  • 点击保存后会跳转到服务商页面
  • 在服务商页面完成登录授权
  • 授权成功后自动返回

📌 下一步:账号添加成功后,我们将创建 API 密钥

👉 点击"保存"按钮

' }, keyManage: { title: '🔑 第三步:生成密钥', description: '

恭喜!账号配置完成 🎉

最后一步,生成 API Key 来测试服务是否正常工作。

🔑 API Key 的作用:
  • 用于调用 AI 服务的凭证
  • 每个 Key 绑定一个分组
  • 可以设置配额和有效期
  • 支持独立的使用统计

👉 点击左侧的"API 密钥"

' }, createKey: { title: '➕ 创建密钥', description: '

点击按钮创建您的第一个 API Key。

💡 提示:创建后请立即复制保存,密钥只显示一次

👉 点击"创建密钥"按钮

' }, keyName: { title: '✏️ 1. 密钥名称', description: '

为密钥设置一个便于管理的名称。

💡 命名建议:"测试密钥"、"生产环境"、"移动端" 等

', nextBtn: '下一步' }, keyGroup: { title: '🎯 2. 选择分组', description: '

选择刚才配置好的分组。

📌 分组决定:
  • 该密钥可以使用哪些账号
  • 计费倍率是多少
  • 是否为专属密钥

💡 提示:选择刚才创建的测试分组

', nextBtn: '下一步' }, keySubmit: { title: '🎉 生成并复制', description: '

点击创建后,系统会生成完整的 API Key。

⚠️ 重要提醒:
  • 密钥只显示一次,请立即复制
  • 丢失后需要重新生成
  • 妥善保管,不要泄露给他人
🚀 下一步:
  • 复制生成的 sk-xxx 密钥
  • 在支持 OpenAI 接口的客户端中使用
  • 开始体验 AI 服务!

👉 点击"创建"按钮

' } }, // User tour steps user: { welcome: { title: '👋 欢迎使用 Sub2API', description: '

您好!欢迎来到 Sub2API AI 服务平台。

🎯 快速开始:

只需 1 分钟,让我们开始吧 →

', nextBtn: '开始 🚀', prevBtn: '跳过' }, keyManage: { title: '🔑 API 密钥管理', description: '

在这里管理您的所有 API 访问密钥。

📌 什么是 API 密钥?
API 密钥是您访问 AI 服务的凭证,就像一把钥匙,让您的应用能够调用 AI 能力。

👉 点击进入密钥页面

' }, createKey: { title: '➕ 创建新密钥', description: '

点击按钮创建您的第一个 API 密钥。

💡 提示:创建后密钥只显示一次,请务必复制保存

👉 点击"创建密钥"

' }, keyName: { title: '✏️ 密钥名称', description: '

为密钥起一个便于识别的名称。

💡 示例:"我的第一个密钥"、"测试用" 等

', nextBtn: '下一步' }, keyGroup: { title: '🎯 选择分组', description: '

选择管理员为您分配的服务分组。

📌 分组说明:
不同分组可能有不同的服务质量和计费标准,请根据需要选择。

', nextBtn: '下一步' }, keySubmit: { title: '🎉 完成创建', description: '

点击确认创建您的 API 密钥。

⚠️ 重要:
  • 创建后请立即复制密钥(sk-xxx)
  • 密钥只显示一次,丢失需重新生成

🚀 如何使用:
将密钥配置到支持 OpenAI 接口的任何客户端(如 ChatBox、OpenCat 等),即可开始使用!

👉 点击"创建"按钮

' } } } }