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

    // Scheduled Tests
}
