export default {
    availableChannels: {
      title: '可用渠道',
      description: '按渠道聚合查看关联分组与支持模型（已展开通配符）',
      searchPlaceholder: '搜索渠道或模型...',
      columns: {
        name: '渠道名',
        status: '状态',
        billingSource: '计费模型来源',
        groups: '关联分组',
        supportedModels: '支持模型'
      },
      empty: '暂无数据',
      noGroups: '未关联分组',
      noModels: '未配置模型映射',
      noPricing: '未配置定价',
      statusActive: '启用',
      statusDisabled: '停用',
      billingSource: {
        requested: '请求模型',
        upstream: '上游模型',
        channel_mapped: '映射后模型'
      },
      pricing: {
        billingMode: '计费模式',
        billingModeToken: '按 Token',
        billingModePerRequest: '按次',
        billingModeImage: '按图片',
        billingModeVideo: '按视频',
        inputPrice: '输入',
        outputPrice: '输出',
        cacheWritePrice: '缓存写入',
        cacheReadPrice: '缓存读取',
        imageOutputPrice: '图片输出',
        perRequestPrice: '每次请求',
        intervals: '阶梯定价',
        unitPerMillion: '/ 1M token',
        unitPerRequest: '/ 次'
      }
    },

    // Channel Management
    channels: {
      title: '渠道管理',
      description: '管理渠道和自定义模型定价',
      searchChannels: '搜索渠道...',
      createChannel: '创建渠道',
      editChannel: '编辑渠道',
      deleteChannel: '删除渠道',
      statusActive: '启用',
      statusDisabled: '停用',
      allStatus: '全部状态',
      groupsUnit: '个分组',
      pricingUnit: '条定价',
      noChannelsYet: '暂无渠道',
      createFirstChannel: '创建第一个渠道来管理模型定价',
      loadError: '加载渠道列表失败',
      createSuccess: '渠道创建成功',
      updateSuccess: '渠道更新成功',
      deleteSuccess: '渠道删除成功',
      createError: '创建渠道失败',
      updateError: '更新渠道失败',
      deleteError: '删除渠道失败',
      nameRequired: '请输入渠道名称',
      duplicateModels: '模型「{0}」在多个定价条目中重复',
      modelConflict: "模型模式 '{model1}' 和 '{model2}' 冲突：匹配范围重叠。模型名称按大小写不敏感匹配，已有条目已覆盖其所有大小写变体，无需重复添加。",
      mappingConflict: "模型映射源 '{model1}' 和 '{model2}' 冲突：匹配范围重叠。源模式按大小写不敏感匹配，已有条目已覆盖其所有大小写变体。",
      intervalValidation: {
        negativeMin: '区间 #{index}：最小 token 数（{value}）不能为负数',
        maxPositive: '区间 #{index}：最大 token 数（{value}）必须大于 0',
        maxGreaterThanMin: '区间 #{index}：最大 token 数（{max}）必须大于最小 token 数（{min}）',
        negativePrice: '区间 #{index}：{field}不能为负数',
        multiplierPositive: '区间 #{index}：{field}必须大于 0',
        unboundedLast: '区间 #{index}：无上限区间（最大 token 数为空）必须放在最后',
        overlap: '区间 #{previousIndex} 和 #{currentIndex} 重叠：前一个上界（{previousMax}）大于当前下界（{currentMin}）',
        price: {
          inputPrice: '输入价格',
          outputPrice: '输出价格',
          cacheWritePrice: '缓存写入价格',
          cacheReadPrice: '缓存读取价格',
          perRequestPrice: '单次价格'
        }
      },
      timePricingValidation: {
        timezone: '请选择有效的 IANA 时区',
        format: '开始时间和结束时间必须使用 HH:mm:ss 格式',
        range: '开始时间必须早于结束时间；跨午夜请拆分为两个时间段',
        overlap: '时间段不能重叠',
        multiplier: '倍率必须大于 0，且最多保留两位小数'
      },
      deleteConfirm: '确定要删除渠道「{name}」吗？此操作不可撤销。',
      columns: {
        name: '名称',
        description: '描述',
        status: '状态',
        groups: '分组',
        pricing: '定价',
        createdAt: '创建时间',
        actions: '操作'
      },
      billingMode: {
        token: 'Token',
        perRequest: '按次',
        image: '图片（按次）',
        video: '视频（按秒）'
      },
      form: {
        name: '名称',
        namePlaceholder: '输入渠道名称',
        description: '描述',
        descriptionPlaceholder: '可选描述',
        status: '状态',
        groups: '关联分组',
        noGroupsAvailable: '暂无可用分组',
        inOtherChannel: '已属于「{name}」',
        modelPricing: '模型定价',
        models: '模型列表',
        modelsPlaceholder: '输入完整模型名后按回车添加',
        modelInputHint: '按回车添加，支持粘贴批量导入',
        billingMode: '计费模式',
        defaultPrices: '默认价格（未命中区间时使用）',
        inputPrice: '输入',
        outputPrice: '输出',
        cacheWritePrice: '缓存写入',
        cacheReadPrice: '缓存读取',
        cacheWritePriceShort: '缓存写',
        cacheReadPriceShort: '缓存读',
        imageInputPrice: '图片输入',
        imageTokenPrice: '图片输出',
        imageOutputPrice: '图片输出价格',
        pricePlaceholder: '默认',
        fastMultiplier: 'Fast 倍率',
        flexMultiplier: 'Flex 倍率',
        multiplierPlaceholder: '未配置',
        multiplierPositive: 'Fast/Flex 倍率必须大于 0',
        inputMultiplier: '输入倍率',
        outputMultiplier: '输出倍率',
        cacheWriteMultiplier: '缓存写倍率',
        cacheReadMultiplier: '缓存读倍率',
        intervals: '上下文区间定价（可选）',
        timePricing: '时间段定价（可选）',
        timezone: '时区',
        addTimePeriod: '添加时间段',
        startTime: '开始时间',
        endTime: '结束时间',
        multiplier: '倍率',
        removeTimePeriod: '删除时间段',
        minTokens: '最小',
        maxTokens: '最大',
        inclusive: '（含）',
        addInterval: '添加区间',
        requestTiers: '按次计费层级',
        imageTiers: '图片计费层级（按次）',
        videoTiers: '视频分辨率层级（按秒）',
        addTier: '添加层级',
        noTiersYet: '暂无层级，点击添加配置按次计费价格',
        noPricingRules: '暂无定价规则，点击"添加"创建',
        perRequestPrice: '单次价格',
        perRequestPriceRequired: '按次/图片计费模式必须设置默认价格或至少一个计费层级',
        tierLabel: '层级',
        resolution: '分辨率',
        modelMapping: '模型映射',
        modelMappingHint: '将请求中的模型名映射为实际模型名。在账号级别映射之前执行。',
        noMappingRules: '暂无映射规则，点击"添加"创建',
        mappingSource: '源模型',
        mappingTarget: '目标模型',
        billingModelSource: '计费基准',
        billingModelSourceChannelMapped: '以渠道映射后的模型计费',
        billingModelSourceRequested: '以请求模型计费',
        billingModelSourceUpstream: '以最终模型计费',
        billingModelSourceResponse: '按上游响应模型计费',
        billingModelSourceHint: '控制使用哪个模型名称进行定价查找',
        selectedCount: '已选 {count} 个',
        searchGroups: '搜索分组...',
        noGroupsMatch: '没有匹配的分组',
        restrictModels: '限制模型',
        restrictModelsHint: '开启后，仅允许模型定价列表中的模型。不在列表中的模型请求将被拒绝。',
        defaultPerRequestPrice: '默认单次价格（未命中层级时使用）',
        defaultImagePrice: '默认图片价格（未命中层级时使用）',
        defaultVideoPrice: '默认视频每秒价格（未命中层级时使用）',
        platformConfig: '平台配置',
        webSearchEmulation: 'Web Search 模拟',
        webSearchEmulationHint: '⚠️ 开启后该渠道下所有 Anthropic 分组的账号将自动拦截 web_search 请求，请谨慎操作',
        webSearchEmulationGlobalDisabled: '请先在系统设置 → 网关 → Web Search 模拟中启用全局开关',
        codexImageGenerationBridge: 'Codex 图片生成桥接',
        codexImageGenerationBridgeHint: '开启后，OpenAI 分组仅会为非 Responses Lite 的 Codex /responses 文本请求自动注入 hosted image_generation 工具。桥接不会为 Responses Lite 注入工具；本地 image_gen 的处理由客户端和账号策略决定。仅在路由账号支持图片生成时开启。',
        bedrockCCCompat: 'Bedrock CC 兼容',
        bedrockCCCompatHint: '⚠️ 开启后，该渠道下 Bedrock 账号的请求将进行 Claude Code 兼容处理（thinking 类型转换、tool_use ID 清理）',
        basicSettings: '基础设置',
        addPlatform: '添加平台',
        noPlatforms: '点击"添加平台"开始配置渠道',
        mappingCount: '条映射',
        pricingEntry: '定价配置',
        noModels: '未添加模型',
        applyPricingToAccountStats: '应用模型定价到账号统计',
        applyPricingToAccountStatsDesc: '启用后，未被自定义规则匹配的请求将使用模型定价文件中的标准价格计算账号统计费用',
        accountStatsPricingRules: '自定义账号统计定价规则',
        addRule: '添加规则',
        noRulesConfigured: '未配置自定义规则，将使用上方的模型定价。',
        ruleName: '规则名称（可选）',
        ruleGroups: '分组',
        ruleAccounts: '账号',
        searchAccountPlaceholder: '搜索账号...',
        ruleAccountsHint: '留空表示匹配所有账号',
        ruleModelPricing: '模型定价',
        noGroupsInChannel: '上方平台标签页中未选择分组',
        unnamed: '未命名',
        syncLatestModels: '同步最新模型',
        syncingModels: '同步中...',
        syncModelsSuccess: '已同步 {count} 个新模型',
        syncModelsAlreadyUpToDate: '模型列表已是最新',
        syncModelsError: '同步模型失败'
      }
    },

    riskControl: {
      title: '风控中心',
      description: '配置内容审计策略并查看审核记录',
      loadFailed: '加载风控中心失败',
      saveFailed: '保存内容审计配置失败',
      logsFailed: '加载审核记录失败',
      saved: '内容审计配置已保存',
      refresh: '刷新',
      config: '内容审计配置',
      configHint: '调用 OpenAI Moderations 进行请求内容评分，命中阈值后按模式处理。',
      openSettings: '内容审计设置',
      settingsTitle: '内容审计设置',
      refreshStatus: '刷新状态',
      records: '审核记录',
      recordsHint: '展示命中、拦截、异常和已采样记录。',
      saveConfig: '保存内容审计配置',
      statusFailed: '加载运行状态失败',
      enabled: '开启内容审计',
      enabledHint: '关闭后即使风控中心菜单启用，也不会审核网关请求。',
      mode: '全局模式',
      modePreBlock: '前置拦截',
      modePreBlockDesc: '每次请求先同步审核最新用户输入，命中后立即拒绝请求。',
      modeObserve: '仅观察',
      modeObserveDesc: '请求直接放行，最新用户输入进入异步审核队列；命中后只记录、通知和按规则累计。',
      modeOff: '关闭',
      modeOffDesc: '不执行内容审计，也不会写入审核记录。',
      baseUrl: 'OpenAI Base URL',
      model: '模型名',
      apiKey: 'OpenAI API Key',
      apiKeys: 'OpenAI API Keys',
      apiKeyCount: '{count} 个 Key',
      apiKeyPlaceholder: '请输入 API Key',
      apiKeysPlaceholder: '新增 API Key，每行一个；保存后会追加到已保存 Key',
      apiKeysPlaceholderReplace: '覆盖保存 API Key，每行一个；保存后会替换全部已保存 Key',
      apiKeysPlaceholderKeep: '新增 API Key，每行一个；保存后会追加到已保存 Key',
      apiKeysHint: '当前已保存 {count} 个 Key；输入区只用于新增，保存时会增量追加并自动去重。',
      apiKeysWriteMode: '写入方式',
      apiKeysModeAppend: '增量添加',
      apiKeysModeReplace: '覆盖保存',
      apiKeysModeAppendHint: '默认模式：保存时追加输入区 Key，并保留已保存 Key。',
      apiKeysModeReplaceHint: '覆盖模式：保存时用输入区 Key 替换全部已保存 Key。',
      apiKeysReplaceWarning: '覆盖模式',
      apiKeysReplaceNoInput: '覆盖保存至少需要输入 1 个 API Key',
      apiKeyPlaceholderKeep: '留空保持不变',
      apiKeyWillClear: '保存后清除已配置 Key',
      apiKeyConfigured: '已配置',
      apiKeyTemporary: '待保存',
      apiKeyPendingDelete: '待删除',
      apiKeyPendingDeleteCount: '待删除 {count} 个 Key',
      deleteApiKey: '删除这个 Key',
      undoDeleteApiKey: '撤销删除',
      inputApiKeyCount: '输入区 {count} 个 Key',
      storedApiKeyCount: '已保存 {count} 个 Key',
      testInputApiKeys: '测试输入区 Key',
      testStoredApiKeys: '测试已保存 Key',
      testContentWithStoredApiKey: '用已保存 Key 试跑内容',
      testingApiKeys: '测试中',
      apiKeyTestNoInput: '请先输入需要测试的 OpenAI API Key',
      apiKeyTestDone: 'Key 测试完成，共 {count} 个',
      apiKeyTestFailed: '测试 OpenAI API Key 失败',
      apiKeyHealth: 'Key 可用状态',
      apiKeyFreezeRule: '400 不冻结；401/403 冻结 10 分钟；429/529 冻结 1 分钟；其他 HTTP 错误冻结 10 秒。',
      apiKeyRows: '{count} 个 Key',
      apiKeyRowsCollapsed: '已隐藏 {count} 个 Key',
      apiKeyRowsExpanded: '正在显示全部 {count} 个 Key',
      expandApiKeyRows: '展开',
      collapseApiKeyRows: '收起',
      apiKeyHealthEmpty: '暂无 Key 状态',
      apiKeyHealthEmptyHint: '保存 Key 或测试输入区 Key 后会显示可用性。',
      apiKeyStatusOk: '可用',
      apiKeyStatusError: '异常',
      apiKeyStatusFrozen: '冻结',
      apiKeyStatusUnknown: '未测试',
      apiKeyFailureCount: '失败 {count} 次',
      apiKeyLatency: '{ms} ms',
      apiKeyHTTPStatus: 'HTTP {status}',
      apiKeyFrozenUntil: '冻结至 {time}',
      apiKeyLastChecked: '检查于 {time}',
      apiKeyNotTested: '尚未测试',
      auditTestInput: '审计试跑输入',
      auditTestInputHint: '可填写提示词并上传或粘贴图片；图片以 base64 发送，不会保存文件。',
      auditTestPromptPlaceholder: '输入要测试的用户提示词；留空时仅测试 Key 可用性。',
      auditTestImages: '测试图片',
      auditTestImagesHint: '支持上传、拖拽或粘贴图片，最多 1 张，每张不超过 8MB。',
      addAuditTestImage: '添加图片',
      clearAuditTest: '清空试跑',
      auditTestImageLimit: '最多只能添加 {count} 张测试图片',
      auditTestImageTooLarge: '单张测试图片不能超过 8MB',
      auditTestImageReadFailed: '读取测试图片失败',
      auditTestResult: '审计试跑结果',
      auditTestHighest: '最高分类 {category}，分数 {score}',
      auditTestComposite: '综合评分',
      auditTestFlagged: '命中阈值',
      auditTestPassed: '未命中',
      notConfigured: '未配置',
      clearApiKey: '清除已保存 Key',
      keepApiKey: '保留已保存 Key',
      timeoutMs: 'HTTP 超时 (ms)',
      retryCount: '失败重试次数',
      sampleRate: '采样率',
      proxy: '代理服务器',
      proxyHint: '审计请求经指定代理（IP管理-代理服务器）发出，适用于出口 IP 不受 OpenAI 支持的部署；默认直连。',
      recordNonHits: '记录未命中输入',
      recordNonHitsHint: '开启后会记录抽样但未命中的请求摘要，摘要会先脱敏再入库。',
      preHashCheck: '启用前置哈希比对',
      preHashCheckHint: '异步审核命中过的输入哈希会被前置拦截；该拦截不发送邮件，也不累计封禁次数。',
      flaggedHashCount: '当前哈希集合数量：{count} 个',
      flaggedHashHint: '哈希永久保存在 Redis 集合中；可粘贴完整 64 位哈希删除误拦截项，或一键清空全部风险哈希。',
      flaggedHashPlaceholder: '粘贴完整 64 位输入哈希',
      deleteFlaggedHash: '删除指定哈希',
      clearFlaggedHashes: '一键清空',
      clearFlaggedHashesConfirm: '确定要清空全部风险输入哈希吗？此操作不会删除审核记录，但会取消所有历史哈希拦截。',
      flaggedHashDeleted: '风险哈希已删除',
      flaggedHashNotFound: '该风险哈希不存在',
      flaggedHashDeleteFailed: '删除风险哈希失败',
      flaggedHashesCleared: '已清空 {count} 个风险哈希',
      flaggedHashesClearFailed: '清空风险哈希失败',
      workerCount: 'Worker 数',
      queueSize: '异步队列大小',
      blockStatus: '拦截 HTTP 状态码',
      blockMessage: '自定义拦截提示',
      defaultBlockMessage: '内容审计命中风险规则，请调整输入后重试',
      emailOnHit: '命中后发送邮件',
      emailOnHitHint: '开启后每次达到阈值都会向用户发送风控提醒邮件；自动封禁通知始终发送。',
      autoBan: '自动封禁用户',
      autoBanHint: '命中次数达到阈值后将禁用用户账号、刷新认证缓存并发送封禁通知邮件。',
      cyberPolicyExcludeBan: 'cyber_policy 不计入封号次数',
      cyberPolicyExcludeBanHint: '开启后，cyber_policy 拦截不再计入自动封号的违规次数：当次不判定封号，历史累计亦排除。风控日志与通知邮件照常。',
      violationNotCounted: '未计入封号',
      banThreshold: '封禁触发次数',
      violationWindowHours: '累计窗口（小时）',
      hitRetentionDays: '命中记录保留（天）',
      nonHitRetentionDays: '未命中记录保留（天，最多 3 天）',
      violationCount: '{count} 次',
      emailSent: '已发邮件',
      emailNotSent: '未发邮件',
      autoBanned: '已封禁',
      unbanUser: '解封',
      unbanSuccess: '用户已解封',
      unbanFailed: '解封用户失败',
      inputDetailTitle: '输入摘要详情',
      inputDetailContent: '完整内容',
      matchedKeyword: '命中关键词',
      queueDelay: '排队 {ms} ms',
      allGroups: '全部分组',
      allGroupsHint: '当前审计全部分组',
      selectedGroupsHint: '当前审计指定分组',
      groupScope: '审计分组',
      groupScopeHint: '开启右侧开关表示全部分组，关闭后选择指定分组。',
      selectedGroups: '指定分组',
      searchGroups: '搜索分组名称或平台',
      noGroups: '暂无可用分组',
      modelFilter: '模型范围',
      modelFilterHint: '按客户端请求的模型名决定是否执行内容审计，模型映射后仍以请求模型判断。',
      modelFilterAll: '所有模型',
      modelFilterAllDesc: '所有模型请求都会进入内容审计。',
      modelFilterInclude: '仅指定模型',
      modelFilterIncludeDesc: '只有列表中的模型会执行内容审计。',
      modelFilterExclude: '排除指定模型',
      modelFilterExcludeDesc: '列表中的模型跳过内容审计，其余模型执行审计。',
      modelFilterModels: '模型列表',
      modelFilterModelCount: '已配置 {count} 个模型',
      modelFilterModelsRequired: '当前模型范围至少需要配置 1 个模型',
      modelFilterAllSummary: '全部模型生效',
      modelFilterIncludeSummary: '仅 {count} 个模型生效',
      modelFilterExcludeSummary: '排除 {count} 个模型',
      emptyLogs: '暂无审核记录',
      preBlockSyncStatus: '前置拦截同步状态',
      preBlockSyncHint: '同步审核链路的实时计数，不包含异步写记录任务。',
      preBlockActive: '同步处理中',
      preBlockActiveHint: '当前正在审核',
      preBlockChecked: '已检查',
      preBlockCheckedHint: '进入前置拦截链路',
      preBlockAllowed: '已放行',
      preBlockAllowedHint: '未触发拦截',
      preBlockBlocked: '已拦截',
      preBlockBlockedHint: '命中后拒绝请求',
      preBlockErrors: '审核异常',
      preBlockErrorsHint: '失败或无可用 Key',
      preBlockAvgLatency: '平均耗时',
      preBlockAvgLatencyHint: '同步链路平均值',
      preBlockAPIKeyLoad: '审核 Key 负载',
      preBlockAPIKeyLoadHint: '同步前置拦截直接轮询可用审核 Key。',
      preBlockAPIKeyLoadSummary: '同步并发 {active} / 可用 Key {available}，累计 {total} 次，worker：{workerActive} / {workerTotal}',
      preBlockAPIKeyTotals: '累计 {total}，成功 {success}，异常 {errors}',
      preBlockAPIKeyLoadEmpty: '暂无审核 Key 负载数据',
      preBlockKeyActiveShort: '并发',
      preBlockKeyTotalShort: '累计',
      preBlockKeyAvgShort: '平均',
      preBlockKeyLastShort: '最近',
      workerStatus: 'Worker 运行状态',
      workerStatusHint: '异步审计任务和前置拦截记录任务的队列与 Worker 池状态，不包含同步前置拦截审核请求。',
      workerPool: 'Worker 池',
      workerPoolMeta: '{active} 个处理中，{idle} 个空闲可用，共 {total} 个',
      queueUsage: '队列占用',
      activeWorkers: '处理中',
      idleWorkers: '空闲可用',
      workerActive: '正在处理异步审计或记录任务',
      workerIdle: '已启动，当前空闲可用',
      workerDisabled: '风控或内容审计未启用',
      processed: '已处理',
      droppedErrors: '丢弃/异常',
      autoRefresh: '每 15 秒自动刷新',
      lastCleanup: '上次清理：{time}',
      cleanupStats: '上次清理删除命中 {hit} 条，未命中 {nonHit} 条',
      riskSwitchOff: '系统开关关闭',
      riskThresholds: '风险阈值',
      riskThresholdsHint: '按 OpenAI Moderations 分类调整命中阈值，分数达到或超过阈值即视为命中。',
      riskThresholdDefault: '默认 {value}',
      riskThresholdReset: '恢复默认阈值',
      riskThresholdPercent: '阈值百分比',
      tabs: {
        basic: '基础',
        scope: '审计范围',
        runtime: '运行队列',
        response: '命中通知',
        riskThresholds: '风险阈值',
        keywords: '关键词拦截',
        retention: '日志保留',
      },
      blockedKeywords: '拦截关键词',
      blockedKeywordsPlaceholder: '每行输入一个关键词，例如：\n敏感词1\n敏感词2',
      blockedKeywordsDescription: '匹配忽略大小写；命中后会按下方策略决定是否调用上游审计接口。',
      blockedKeywordsPreBlockHint: '关键词拦截仅在「前置拦截」模式下生效。',
      blockedKeywordsModeWarning: '当前为「{mode}」模式，关键词拦截不会生效；请切换到「前置拦截」模式后再保存关键词。',
      blockedKeywordCount: '已配置 {count} 个关键词',
      blockedKeywordsLimit: '最多保存 {max} 个关键词，单个长度不超过 200 个字符；重复项会自动去重。',
      keywordBlockingMode: '审计策略',
      keywordModeKeywordAndApi: '关键词 + API',
      keywordModeKeywordAndApiDesc: '命中关键词直接拦截；未命中时再调用上游审计接口。',
      keywordModeKeywordOnly: '仅关键词',
      keywordModeKeywordOnlyDesc: '只用关键词判断，未命中即放行，不调用上游审计接口，可显著降低 API 用量。',
      keywordModeKeywordOnlyNotice: '当前为「仅关键词」策略：未命中关键词的请求将直接放行，不调用上游审计接口。',
      keywordModeApiOnly: '仅 API',
      keywordModeApiOnlyDesc: '只调用上游审计接口判断，本页的关键词列表将不会生效。',
      keywordModeApiOnlyNotice: '当前为「仅 API」策略：关键词列表不会生效，请求会全部交给上游审计接口判断。',
      overview: {
        status: '运行状态',
        enabled: '已启用',
        disabled: '未启用',
        apiKey: 'API Key',
        groupScope: '审计范围',
        logs: '审核记录',
        currentFilter: '当前筛选结果',
      },
      filters: {
        search: '按用户/Key/摘要搜索',
        from: '开始时间',
        to: '结束时间',
        allGroups: '全部分组',
        allEndpoints: '全部端点',
      },
      table: {
        time: '时间',
        group: '分组',
        user: '用户',
        apiKey: 'API Key',
        endpoint: '端点',
        result: '结果',
        highest: '最高分',
        actionMeta: '处置',
        latency: '上游耗时',
        input: '输入摘要',
      },
      result: {
        all: '全部结果',
        hit: '命中',
        blocked: '已拦截',
        pass: '未命中',
        error: '异常',
      },
      action: {
        block: '拦截',
        keywordBlock: '关键词拦截',
        cyberPolicy: '网络安全策略',
        error: '异常',
      },
    },

    // Channel Monitor
    channelMonitor: {
      title: '渠道监控',
      description: '监测各渠道的可用性、延迟和状态',
      searchPlaceholder: '搜索监控名称...',
      allProviders: '全部供应商',
      allStatus: '全部状态',
      enabledFilter: '启用状态',
      onlyEnabled: '仅启用',
      onlyDisabled: '仅禁用',
      createButton: '新增监控',
      createTitle: '新增渠道监控',
      editTitle: '编辑渠道监控',
      runNow: '立即检测',
      runSuccess: '检测完成',
      runFailed: '检测失败',
      duplicate: '复制',
      duplicating: '复制中',
      duplicateSuccess: '监控已复制为「{name}」，已默认停用，请确认配置后再启用',
      duplicateFailed: '复制监控失败',
      duplicateKeyUnavailable: 'API Key 无法解密，请先编辑并重新填写 Key 后再复制',
      apiKeyDecryptFailed: 'API Key 解密失败，请重新编辑该监控并填入新的 Key',
      createSuccess: '监控创建成功',
      updateSuccess: '监控更新成功',
      deleteSuccess: '监控删除成功',
      loadError: '加载监控列表失败',
      deleteConfirm: '确定要删除监控「{name}」吗？此操作不可撤销。',
      nameRequired: '请输入监控名称',
      primaryModelRequired: '请输入主模型',
      linkedAccountRequired: '请选择关联账号',
      columns: {
        name: '名称',
        provider: '供应商',
        primaryModel: '主模型',
        availability7d: '7 天可用率',
        latency: '延迟 (ms)',
        enabled: '启用',
        actions: '操作'
      },
      form: {
        name: '名称',
        namePlaceholder: '输入监控名称',
        provider: '平台',
        checkMode: '检查方式',
        checkModeProbe: '探活',
        checkModeProbeHint: '向上游发送轻量 LLM 请求，检测可用性与延迟',
        checkModeQuota: '配额',
        checkModeQuotaHint: '只查询关联账号的用量滚动窗口/余额，不发送探活请求',
        checkModeQuotaProbe: '探活 + 配额',
        checkModeQuotaProbeHint: '探活的同时查询配额，用量快照附加在主模型结果上',
        linkedAccount: '关联账号',
        linkedAccountPlaceholder: '选择账号',
        linkedAccountHint: '配额数据来自所选账号（复用账号管理侧的用量/余额查询）',
        linkedAccountEmpty: '当前平台暂无账号，请先在账号管理中添加',
        linkedAccountMissing: '关联账号已不存在或不可访问，请重新选择账号',
        openAIQuotaProbeHint: '注意：OpenAI 平台的用量查询可能触发 Codex 探测请求，会消耗账号自身的额度（每 10 分钟最多触发一次）',
        apiMode: 'OpenAI 协议',
        apiModeChatCompletions: 'OpenAI Compatible',
        apiModeChatCompletionsHint: '使用 /v1/chat/completions，发送 messages；适合大多数兼容站。',
        apiModeResponses: 'Responses API',
        apiModeResponsesHint: '使用 /v1/responses，默认带 instructions + input；适合本站自检/Codex。',
        endpoint: '上游地址',
        endpointPlaceholder: 'https://api.example.com',
        useCurrentDomain: '使用当前服务',
        apiKey: 'API Key',
        apiKeyPlaceholder: '请输入 API Key',
        apiKeyEditPlaceholder: '留空表示不修改',
        useMyKey: '使用我的 Key',
        selectKeyTitle: '选择我的 API Key',
        selectKeyHint: '仅显示当前账号下处于「启用」状态且未过期的 Key。',
        noActiveKey: '没有可用的启用状态 Key',
        primaryModel: '主模型',
        primaryModelPlaceholder: 'gpt-4o-mini',
        extraModels: '附加模型',
        extraModelsPlaceholder: '回车添加附加模型',
        groupName: '分组名称',
        groupNamePlaceholder: '可选，用于在用户视图中聚合显示',
        intervalSeconds: '检测间隔 (秒)',
        intervalSecondsHint: '范围：15 - 3600 秒',
        jitterSeconds: '随机抖动 (± 秒)',
        jitterSecondsHint: '每次检测在间隔基础上正负随机偏移该秒数，0 表示固定间隔；需满足 间隔 - 抖动 ≥ 15 秒',
        enabled: '启用监控',
        kindRequired: '请选择供应商'
      },
      runResultTitle: '检测结果',
      noMonitorsYet: '暂无监控',
      createFirstMonitor: '创建第一个监控来跟踪渠道可用性',
      advanced: {
        section: '高级（可选）',
        sectionHint: '自定义请求头和请求体，用于突破上游的客户端识别限制（如仅允许 Claude Code 客户端）。',
        headers: '自定义请求头',
        headersPlaceholder: 'User-Agent: claude-cli/1.0.83 (external, cli)\nx-app: cli\nanthropic-beta: claude-code-20250219',
        headerNamePlaceholder: 'Header 名',
        headerValuePlaceholder: 'Value',
        headerAddRow: '添加 Header',
        headerNameInvalid: 'Header 名不能包含空格或冒号：{name}',
        headersHint: '与默认请求头合并，用户值优先。hop-by-hop 类 header（Host/Content-Length/...）会被忽略。',
        headersParseError: '无法解析这一行：{line}',
        bodyMode: '请求体处理',
        bodyModeOff: '默认',
        bodyModeMerge: '合并',
        bodyModeReplace: '覆盖',
        bodyModeHintOff: '使用 adapter 默认请求体（带 challenge 数学题校验）。',
        bodyModeHintMerge: '与默认请求体浅合并，用户字段优先；但 model / messages / contents 会被保护不允许覆盖（动这些字段请用「覆盖」模式）。',
        bodyModeHintReplace: '完全用下方 JSON 作为请求体。注意：此模式下跳过 challenge 校验，改为 HTTP 2xx + 响应文本非空即视为可用。',
        bodyJson: 'Body JSON',
        bodyJsonFormat: '格式化',
        bodyJsonHint: '失焦时自动解析校验。留空等价于没有覆盖。',
        bodyJsonError: 'JSON 解析失败',
        bodyJsonObjectError: '请求体必须是一个 JSON 对象（不能是数组或基本类型）'
      },
      templateField: {
        label: '请求模板',
        none: '不使用模板',
        placeholder: '选择一个模板（按当前平台过滤）',
        applyHint: '选中模板后，会把模板的请求头和请求体拷贝到此监控（快照）。后续模板变动不自动同步。'
      },
      template: {
        manageButton: '模板管理',
        managerTitle: '请求模板管理',
        createButton: '新建模板',
        emptyState: '当前平台下还没有请求模板',
        missingName: '请输入模板名称',
        createSuccess: '模板创建成功',
        updateSuccess: '模板更新成功',
        deleteSuccess: '模板删除成功',
        applyButton: '应用到关联监控',
        applyTooltip: '把当前模板配置覆盖到所有关联的监控上',
        applyTitle: '应用模板',
        applyConfirm: '确认应用',
        applyConfirmMessage: '将把模板「{name}」的当前配置覆盖到 {n} 个关联监控。监控本地已编辑的自定义修改会被丢弃，是否继续？',
        applySuccess: '已应用到 {n} 个监控',
        applyPickerTitle: '应用模板「{name}」',
        applyPickerHint: '勾选要覆盖请求头/请求体的监控（默认全选）。监控本地已编辑的自定义修改会被丢弃。',
        applyPickerEmpty: '当前模板没有关联监控',
        applyPickerConfirm: '应用到 {n} 个监控',
        selectNone: '全不选',
        selectedCount: '已选 {n} / {total}',
        deleteConfirm: '确定要删除模板「{name}」吗？{n} 个关联监控会解除关联但保留自己的快照继续工作。',
        associatedCount: '{n} 个关联监控',
        headersSummary: '{n} 个自定义请求头',
        form: {
          name: '模板名称',
          namePlaceholder: '例：Claude Code 伪装',
          description: '说明',
          descriptionPlaceholder: '可选：说明这个模板的用途和来源（抓包日期等）'
        }
      }
    },

    // Subscriptions Management
    subscriptions: {
      title: '订阅管理',
      description: '管理用户订阅和配额限制',
      assignSubscription: '分配订阅',
      adjustSubscription: '调整订阅',
      revokeSubscription: '撤销订阅',
      restoreSubscription: '恢复订阅',
      allStatus: '全部状态',
      allGroups: '全部分组',
      allPlatforms: '全部平台',
      daily: '每日',
      weekly: '每周',
      monthly: '每月',
      noLimits: '未配置限额',
      unlimited: '无限制',
      resetNow: '即将重置',
      windowNotActive: '窗口未激活',
      resetInMinutes: '{minutes} 分钟后重置',
      resetInHoursMinutes: '{hours} 小时 {minutes} 分钟后重置',
      resetInDaysHours: '{days} 天 {hours} 小时后重置',
      quotaEndsInMinutes: '额度将在 {minutes} 分钟后结束',
      quotaEndsInHoursMinutes: '额度将在 {hours} 小时 {minutes} 分钟后结束',
      quotaEndsInDaysHours: '额度将在 {days} 天 {hours} 小时后结束',
      daysRemaining: '剩余 {days} 天',
      hoursMinutesRemaining: '剩余 {hours} 小时 {minutes} 分钟',
      minutesRemaining: '剩余 {minutes} 分钟',
      remainingDays: '剩余天数',
      noExpiration: '无过期时间',
      status: {
        active: '生效中',
        expired: '已过期',
        revoked: '已撤销',
        suspended: '已暂停'
      },
      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: '撤销',
      restore: '恢复',
      resetQuota: '重置配额',
      resetQuotaTitle: '重置用量配额',
      resetQuotaConfirm: "确定要重置 '{user}' 的每日、每周和每月用量配额吗？用量将归零并从今天开始重新计算。",
      quotaResetSuccess: '配额重置成功',
      failedToResetQuota: '重置配额失败',
      noSubscriptionsYet: '暂无订阅',
      assignFirstSubscription: '分配一个订阅以开始使用。',
      subscriptionAssigned: '订阅分配成功',
      subscriptionAdjusted: '订阅调整成功',
      subscriptionRevoked: '订阅撤销成功',
      subscriptionRestored: '订阅已恢复',
      failedToLoad: '加载订阅列表失败',
      failedToAssign: '分配订阅失败',
      failedToAdjust: '调整订阅失败',
      failedToRevoke: '撤销订阅失败',
      failedToRestore: '恢复订阅失败',
      adjustWouldExpire: '调整后剩余天数必须大于0',
      adjustOutOfRange: '调整天数必须在 -36500 到 36500 之间',
      pleaseSelectUser: '请选择用户',
      pleaseSelectGroup: '请选择分组',
      validityDaysRequired: '请输入有效的天数（至少1天）',
      revokeConfirm: "确定要撤销 '{user}' 的订阅吗？可稍后在已撤销列表中恢复。",
      restoreConfirm: "确定要恢复 '{user}' 的订阅吗？如果原订阅已过期，恢复后将显示为已过期。",
      guide: {
        title: '订阅管理教程',
        subtitle: '订阅模式允许你按时间周期为用户分配使用额度，支持日/周/月配额限制。按照以下步骤即可完成配置。',
        showGuide: '使用指南',
        step1: {
          title: '创建订阅分组',
          line1: '前往「分组管理」页面，点击「创建分组」',
          line2: '将计费类型设为「订阅」，配置日/周/月额度限制',
          line3: '保存分组，确保状态为「正常」',
          link: '前往分组管理'
        },
        step2: {
          title: '分配订阅给用户',
          line1: '点击本页右上角「分配订阅」按钮',
          line2: '在弹窗中搜索用户邮箱并选择目标用户',
          line3: '选择订阅分组、设置有效期天数，点击「分配」'
        },
        step3: {
          title: '管理已有订阅'
        },
        actions: {
          adjust: '调整',
          adjustDesc: '延长或缩短订阅有效期',
          resetQuota: '重置配额',
          resetQuotaDesc: '将日/周/月用量归零，重新开始计算',
          revoke: '撤销',
          revokeDesc: '立即终止该用户的订阅，可在已撤销列表中恢复'
        },
        tip: '提示：订阅分组下拉列表中只会显示计费类型为「订阅」且状态为「正常」的分组。如果没有可选项，请先到分组管理中创建。'
      }
    },

    // Accounts Management
}
