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: '保留所有权利。'
    }
  },

  // Key Usage Query Page
  keyUsage: {
    title: 'API Key 用量查询',
    subtitle: '输入您的 API Key 以查看实时消费金额与使用状态',
    placeholder: 'sk-ant-mirror-xxxxxxxxxxxx',
    query: '查询',
    querying: '查询中...',
    privacyNote: '您的 Key 仅在浏览器本地处理，不会被存储',
    dateRange: '统计范围:',
    dateRangeToday: '今日',
    dateRange7d: '7 天',
    dateRange30d: '30 天',
    dateRangeCustom: '自定义',
    apply: '应用',
    used: '已使用',
    detailInfo: '详细信息',
    tokenStats: 'Token 统计',
    modelStats: '模型用量统计',
    // Table headers
    model: '模型',
    requests: '请求数',
    inputTokens: '输入 Tokens',
    outputTokens: '输出 Tokens',
    cacheCreationTokens: '缓存创建',
    cacheReadTokens: '缓存读取',
    totalTokens: '总 Tokens',
    cost: '费用',
    // Status
    quotaMode: 'Key 限额模式',
    walletBalance: '钱包余额',
    // Ring card titles
    totalQuota: '总额度',
    limit5h: '5 小时限额',
    limitDaily: '日限额',
    limit7d: '7 天限额',
    limitWeekly: '周限额',
    limitMonthly: '月限额',
    // Detail rows
    remainingQuota: '剩余额度',
    expiresAt: '过期时间',
    todayExpires: '(今日到期)',
    daysLeft: '({days} 天)',
    usedQuota: '已用额度',
    resetNow: '即将重置',
    subscriptionType: '订阅类型',
    subscriptionExpires: '订阅到期',
    // Usage stat cells
    todayRequests: '今日请求',
    todayInputTokens: '今日输入',
    todayOutputTokens: '今日输出',
    todayTokens: '今日 Tokens',
    todayCacheCreation: '今日缓存创建',
    todayCacheRead: '今日缓存读取',
    todayCost: '今日费用',
    rpmTpm: 'RPM / TPM',
    totalRequests: '累计请求',
    totalInputTokens: '累计输入',
    totalOutputTokens: '累计输出',
    totalTokensLabel: '累计 Tokens',
    totalCacheCreation: '累计缓存创建',
    totalCacheRead: '累计缓存读取',
    totalCost: '累计费用',
    avgDuration: '平均耗时',
    // Messages
    enterApiKey: '请输入 API Key',
    querySuccess: '查询成功',
    queryFailed: '查询失败',
    queryFailedRetry: '查询失败，请稍后重试',
  },

  // 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: '至少 8 个字符',
      confirmPasswordPlaceholder: '确认密码',
      passwordMismatch: '密码不匹配'
    },
    ready: {
      title: '准备安装',
      description: '检查您的配置并完成安装',
      database: '数据库',
      redis: 'Redis',
      adminEmail: '管理员邮箱'
    },
    status: {
      testing: '测试中...',
      success: '连接成功',
      testConnection: '测试连接',
      installing: '安装中...',
      completeInstallation: '完成安装',
      completed: '安装完成！',
      redirecting: '正在跳转到登录页面...',
      restarting: '服务正在重启，请稍候...',
      timeout: '服务重启时间超出预期，请手动刷新页面。'
    }
  },

  // Common
  common: {
    loading: '加载中...',
    justNow: '刚刚',
    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: '文档',
    sora: 'Sora 创作'
  },

  // 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: '注册失败，请重试。',
    emailSuffixNotAllowed: '该邮箱域名不在允许注册范围内。',
    emailSuffixNotAllowedWithAllowed: '该邮箱域名不被允许。可用域名：{suffixes}',
    loginSuccess: '登录成功！欢迎回来。',
    accountCreatedSuccess: '账户创建成功！欢迎使用 {siteName}。',
    reloginRequired: '会话已过期，请重新登录。',
    turnstileExpired: '验证已过期，请重试',
    turnstileFailed: '验证失败，请重试',
    completeVerification: '请完成验证',
    verifyYourEmail: '验证您的邮箱',
    sessionExpired: '会话已过期',
    sessionExpiredDesc: '请返回注册页面重新开始。',
    verificationCode: '验证码',
    verificationCodeHint: '请输入发送到您邮箱的6位验证码',
    sendingCode: '发送中...',
    clickToResend: '点击重新发送验证码',
    resendCode: '重新发送验证码',
    sendCodeDesc: '我们将发送验证码到',
    codeSentSuccess: '验证码已发送！请查收您的邮箱。',
    verifying: '验证中...',
    verifyAndCreate: '验证并创建账户',
    resendCountdown: '{countdown}秒后可重新发送',
    backToRegistration: '返回注册',
    sendCodeFailed: '发送验证码失败，请重试。',
    verifyFailed: '验证失败，请重试。',
    codeRequired: '请输入验证码',
    invalidCode: '请输入有效的6位验证码',
    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: '返回登录',
      invitationRequired: '该 Linux.do 账号尚未注册，站点已开启邀请码注册，请输入邀请码以完成注册。',
      invalidPendingToken: '注册凭证已失效，请重新使用 Linux.do 登录。',
      completeRegistration: '完成注册',
      completing: '正在完成注册...',
      completeRegistrationFailed: '注册失败，请检查邀请码后重试。'
    },
    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: '模型分布',
    groupDistribution: '分组使用分布',
    tokenUsageTrend: 'Token 使用趋势',
    noDataAvailable: '暂无数据',
    model: '模型',
    group: '分组',
    noGroup: '无分组',
    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 密钥和访问令牌',
    searchPlaceholder: '搜索名称或Key...',
    allGroups: '全部分组',
    allStatus: '全部状态',
    createKey: '创建密钥',
    editKey: '编辑密钥',
    deleteKey: '删除密钥',
    deleteConfirmMessage: "确定要删除 '{name}' 吗？此操作无法撤销。",
    apiKey: 'API 密钥',
    group: '分组',
    noGroup: '无分组',
    searchGroup: '搜索分组...',
    noGroupFound: '未找到匹配的分组',
    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: '近30天',
    quota: '额度',
    lastUsedAt: '上次使用时间',
    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',
        codexCliWs: 'Codex CLI (WebSocket)',
        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: '重置额度失败',
    rateLimitColumn: '速率限制',
    rateLimitSection: '速率限制',
    resetUsage: '重置',
    rateLimit5h: '5小时限额 (USD)',
    rateLimit1d: '日限额 (USD)',
    rateLimit7d: '7天限额 (USD)',
    rateLimitHint: '设置此密钥在指定时间窗口内的最大消费额。0 = 无限制。',
    rateLimitUsage: '速率限制用量',
    resetRateLimitUsage: '重置速率限制用量',
    resetRateLimitTitle: '确认重置速率限制',
    resetRateLimitConfirmMessage: '确定要重置密钥 "{name}" 的速率限制用量吗？所有时间窗口的已用额度将归零。此操作不可撤销。',
    rateLimitResetSuccess: '速率限制已重置',
    failedToResetRateLimit: '重置速率限制失败',
    resetNow: '即将重置',
    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 明细',
    cacheTtlOverriddenHint: '缓存 TTL Override 已启用',
    cacheTtlOverriddenLabel: 'TTL 替换',
    cacheTtlOverridden5m: '按 5m 计费',
    cacheTtlOverridden1h: '按 1h 计费',
    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: '模型',
    requestedModel: '请求',
    upstreamModel: '上游',
    reasoningEffort: '推理强度',
    endpoint: '端点',
    endpointDistribution: '端点分布',
    inbound: '入站',
    upstream: '上游',
    mapping: '映射',
    path: '路径',
    inboundEndpoint: '入站端点',
    upstreamEndpoint: '上游端点',
    type: '类型',
    tokens: 'Token',
    cost: '费用',
    firstToken: '首 Token',
    duration: '耗时',
    time: '时间',
    ws: 'WS',
    stream: '流式',
    sync: '同步',
    unknown: '未知',
    in: '输入',
    out: '输出',
    inputTokenPrice: '输入单价',
    outputTokenPrice: '输出单价',
    perMillionTokens: '/ 1M Token',
    cacheRead: '读取',
    cacheWrite: '写入',
    serviceTier: '服务档位',
    serviceTierPriority: 'Fast',
    serviceTierFlex: 'Flex',
    serviceTierStandard: 'Standard',
    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: '上月',
    last24Hours: '近24小时',
    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: '模型分布',
      groupDistribution: '分组使用分布',
      metricTokens: '按 Token',
      metricActualCost: '按实际消费',
      tokenUsageTrend: 'Token 使用趋势',
      noDataAvailable: '暂无数据',
      model: '模型',
      group: '分组',
      noGroup: '无分组',
      requests: '请求',
      tokens: 'Token',
      cache: '缓存',
      recentUsage: '最近使用',
      viewModelDistribution: '模型分布',
      viewSpendingRanking: '用户消费榜',
      spendingRankingTitle: '用户消费榜',
      spendingRankingUser: '用户',
      spendingRankingRequests: '请求',
      spendingRankingTokens: 'Token',
      spendingRankingSpend: '消费',
      spendingRankingOther: '其他',
      spendingRankingUsage: '用量',
      spendShort: '消费',
      requestsShort: '请求',
      tokensShort: 'Token',
      last7Days: '近 7 天',
      noUsageRecords: '暂无使用记录',
      startUsingApi: '开始使用 API 后，使用历史将显示在这里。',
      viewAllUsage: '查看全部',
      quickActions: '快捷操作',
      manageUsers: '管理用户',
      viewUserAccounts: '查看和管理用户账户',
      manageAccounts: '管理账号',
      configureAiAccounts: '配置 AI 平台账号',
      systemSettings: '系统设置',
      configureSystem: '配置系统设置',
      failedToLoad: '加载仪表盘数据失败'
    },

    backup: {
      title: '数据库备份',
      description: '全量数据库备份到 S3 兼容存储，支持定时备份与恢复',
      s3: {
        title: 'S3 存储配置',
        description: '配置 S3 兼容存储（支持 Cloudflare R2）',
        descriptionPrefix: '配置 S3 兼容存储（支持',
        descriptionSuffix: '）',
        enabled: '启用 S3 存储',
        endpoint: '端点地址',
        region: '区域',
        bucket: '存储桶',
        prefix: 'Key 前缀',
        accessKeyId: 'Access Key ID',
        secretAccessKey: 'Secret Access Key',
        secretConfigured: '已配置，留空保持不变',
        forcePathStyle: '强制路径风格',
        testConnection: '测试连接',
        testSuccess: 'S3 连接测试成功',
        testFailed: 'S3 连接测试失败',
        saved: 'S3 配置已保存'
      },
      schedule: {
        title: '定时备份',
        description: '配置自动定时备份',
        enabled: '启用定时备份',
        cronExpr: 'Cron 表达式',
        cronHint: '例如 "0 2 * * *" 表示每天凌晨 2 点',
        retainDays: '备份过期天数',
        retainDaysHint: '备份文件超过此天数后自动删除，0 = 永不过期',
        retainCount: '最大保留份数',
        retainCountHint: '最多保留的备份数量，0 = 不限制',
        saved: '定时备份配置已保存'
      },
      operations: {
        title: '备份记录',
        description: '创建手动备份和管理已有备份记录',
        createBackup: '创建备份',
        backing: '备份中...',
        backupCreated: '备份创建成功',
        expireDays: '过期天数',
        alreadyInProgress: '已有备份正在进行中',
        backupRunning: '备份进行中...',
        backupFailed: '备份失败',
        restoreRunning: '恢复进行中...',
        restoreFailed: '恢复失败',
      },
      columns: {
        status: '状态',
        fileName: '文件名',
        size: '大小',
        expiresAt: '过期时间',
        triggeredBy: '触发方式',
        startedAt: '开始时间',
        actions: '操作'
      },
      status: {
        pending: '等待中',
        running: '执行中',
        completed: '已完成',
        failed: '失败'
      },
      progress: {
        pending: '准备中',
        dumping: '导出数据库',
        uploading: '上传中',
      },
      trigger: {
        manual: '手动',
        scheduled: '定时'
      },
      neverExpire: '永不过期',
      empty: '暂无备份记录',
      actions: {
        download: '下载',
        restore: '恢复',
        restoreConfirm: '确定要从此备份恢复吗？这将覆盖当前数据库！',
        restorePasswordPrompt: '请输入管理员密码以确认恢复操作',
        restoreSuccess: '数据库恢复成功',
        deleteConfirm: '确定要删除此备份吗？',
        deleted: '备份已删除'
      },
      r2Guide: {
        title: 'Cloudflare R2 配置教程',
        intro: 'Cloudflare R2 提供 S3 兼容的对象存储，免费额度为 10GB 存储 + 每月 100 万次 A 类请求，非常适合数据库备份。',
        step1: {
          title: '创建 R2 存储桶',
          line1: '登录 Cloudflare Dashboard (dash.cloudflare.com)，左侧菜单选择「R2 对象存储」',
          line2: '点击「创建存储桶」，输入名称（如 sub2api-backups），选择区域',
          line3: '点击创建完成'
        },
        step2: {
          title: '创建 API 令牌',
          line1: '在 R2 页面，点击右上角「管理 R2 API 令牌」',
          line2: '点击「创建 API 令牌」，权限选择「对象读和写」',
          line3: '建议指定存储桶范围（仅允许访问备份桶，更安全）',
          line4: '创建后会显示 Access Key ID 和 Secret Access Key',
          warning: 'Secret Access Key 只会显示一次，请立即复制保存！'
        },
        step3: {
          title: '获取 S3 端点地址',
          desc: '在 R2 概览页面找到你的账户 ID（在 URL 或右侧面板中），端点格式为：',
          accountId: '你的账户 ID'
        },
        step4: {
          title: '填写以下配置',
          checkEnabled: '勾选',
          bucketValue: '你创建的存储桶名称',
          fromStep2: '第 2 步获取的值',
          unchecked: '不勾选'
        },
        freeTier: 'R2 免费额度：10GB 存储 + 每月 100 万次 A 类请求 + 1000 万次 B 类请求，对数据库备份完全够用。'
      }
    },

    dataManagement: {
      title: '数据管理',
      description: '统一管理数据管理代理状态、对象存储配置和备份任务',
      agent: {
        title: '数据管理代理状态',
        description: '系统会自动探测固定 Unix Socket，仅在可连通时启用数据管理功能。',
        enabled: '数据管理代理已就绪，可继续进行数据管理操作。',
        disabled: '数据管理代理不可用，当前仅可查看诊断信息。',
        socketPath: 'Socket 路径',
        version: '版本',
        status: '状态',
        uptime: '运行时长',
        reasonLabel: '不可用原因',
        reason: {
          DATA_MANAGEMENT_AGENT_SOCKET_MISSING: '未检测到数据管理 Socket 文件',
          DATA_MANAGEMENT_AGENT_UNAVAILABLE: '数据管理代理不可连通',
          BACKUP_AGENT_SOCKET_MISSING: '未检测到备份 Socket 文件',
          BACKUP_AGENT_UNAVAILABLE: '备份代理不可连通',
          UNKNOWN: '未知原因'
        }
      },
      sections: {
        config: {
          title: '备份配置',
          description: '配置备份源、保留策略与 S3 存储参数。'
        },
        s3: {
          title: 'S3 对象存储',
          description: '配置并测试备份产物上传到标准 S3 对象存储。'
        },
        backup: {
          title: '备份操作',
          description: '触发 PostgreSQL、Redis 与全量备份任务。'
        },
        history: {
          title: '备份历史',
          description: '查看备份任务执行状态、错误与产物信息。'
        }
      },
      form: {
        sourceMode: '源模式',
        backupRoot: '备份根目录',
        activePostgresProfile: '当前激活 PostgreSQL 配置',
        activeRedisProfile: '当前激活 Redis 配置',
        activeS3Profile: '当前激活 S3 账号',
        retentionDays: '保留天数',
        keepLast: '至少保留最近任务数',
        uploadToS3: '上传到 S3',
        useActivePostgresProfile: '使用当前激活 PostgreSQL 配置',
        useActiveRedisProfile: '使用当前激活 Redis 配置',
        useActiveS3Profile: '使用当前激活账号',
        idempotencyKey: '幂等键（可选）',
        secretConfigured: '已配置，留空不变',
        source: {
          profileID: '配置 ID（唯一）',
          profileName: '配置名称',
          setActive: '创建后立即设为激活配置'
        },
        postgres: {
          title: 'PostgreSQL',
          host: '主机',
          port: '端口',
          user: '用户名',
          password: '密码',
          database: '数据库',
          sslMode: 'SSL 模式',
          containerName: '容器名（docker_exec 模式）'
        },
        redis: {
          title: 'Redis',
          addr: '地址（host:port）',
          username: '用户名',
          password: '密码',
          db: '数据库编号',
          containerName: '容器名（docker_exec 模式）'
        },
        s3: {
          enabled: '启用 S3 上传',
          profileID: '账号 ID（唯一）',
          profileName: '账号名称',
          endpoint: 'Endpoint（可选）',
          region: 'Region',
          bucket: 'Bucket',
          accessKeyID: 'Access Key ID',
          secretAccessKey: 'Secret Access Key',
          prefix: '对象前缀',
          forcePathStyle: '强制 path-style',
          useSSL: '使用 SSL',
          setActive: '创建后立即设为激活账号'
        }
      },
      sourceProfiles: {
        createTitle: '创建数据源配置',
        editTitle: '编辑数据源配置',
        empty: '暂无配置，请先创建',
        deleteConfirm: '确定删除配置 {profileID} 吗？',
        columns: {
          profile: '配置',
          active: '激活状态',
          connection: '连接信息',
          database: '数据库',
          updatedAt: '更新时间',
          actions: '操作'
        }
      },
      s3Profiles: {
        createTitle: '创建 S3 账号',
        editTitle: '编辑 S3 账号',
        empty: '暂无 S3 账号，请先创建',
        editHint: '点击“编辑”将在右侧抽屉中修改账号信息。',
        deleteConfirm: '确定删除 S3 账号 {profileID} 吗？',
        columns: {
          profile: '账号',
          active: '激活状态',
          storage: '存储配置',
          updatedAt: '更新时间',
          actions: '操作'
        }
      },
      history: {
        total: '共 {count} 条',
        empty: '暂无备份任务',
        columns: {
          jobID: '任务 ID',
          type: '类型',
          status: '状态',
          triggeredBy: '触发人',
          pgProfile: 'PostgreSQL 配置',
          redisProfile: 'Redis 配置',
          s3Profile: 'S3 账号',
          finishedAt: '完成时间',
          artifact: '产物',
          error: '错误'
        },
        status: {
          queued: '排队中',
          running: '执行中',
          succeeded: '成功',
          failed: '失败',
          partial_succeeded: '部分成功'
        }
      },
      actions: {
        refresh: '刷新状态',
        disabledHint: '请先启动 datamanagementd 并确认 Socket 可连通。',
        reloadConfig: '加载配置',
        reloadSourceProfiles: '刷新数据源配置',
        reloadProfiles: '刷新账号列表',
        newSourceProfile: '新建数据源配置',
        saveConfig: '保存配置',
        configSaved: '配置保存成功',
        testS3: '测试 S3 连接',
        s3TestOK: 'S3 连接测试成功',
        s3TestFailed: 'S3 连接测试失败',
        newProfile: '新建账号',
        saveProfile: '保存账号',
        activateProfile: '设为激活',
        profileIDRequired: '请输入账号 ID',
        profileNameRequired: '请输入账号名称',
        profileSelectRequired: '请先选择要编辑的账号',
        profileCreated: 'S3 账号创建成功',
        profileSaved: 'S3 账号保存成功',
        profileActivated: 'S3 账号已切换为激活',
        profileDeleted: 'S3 账号删除成功',
        sourceProfileCreated: '数据源配置创建成功',
        sourceProfileSaved: '数据源配置保存成功',
        sourceProfileActivated: '数据源配置已切换为激活',
        sourceProfileDeleted: '数据源配置删除成功',
        createBackup: '创建备份任务',
        jobCreated: '备份任务已创建：{jobID}（{status}）',
        refreshJobs: '刷新任务',
        loadMore: '加载更多'
      }
    },

    // Users Management
    users: {
      title: '用户管理',
      description: '管理用户账户和权限',
      createUser: '创建用户',
      editUser: '编辑用户',
      deleteUser: '删除用户',
      deleteConfirmMessage: "确定要删除用户 '{email}' 吗？此操作无法撤销。",
      searchPlaceholder: '邮箱/用户名/备注/API Key 模糊搜索...',
      searchUsers: '邮箱/用户名/备注/API Key 模糊搜索',
      roleFilter: '角色筛选',
      allRoles: '全部角色',
      allStatus: '全部状态',
      allGroups: '全部分组',
      searchGroups: '搜索分组...',
      fuzzySearch: '模糊搜索',
      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: '角色',
        groups: '分组',
        subscriptions: '订阅分组',
        balance: '余额',
        usage: '用量',
        concurrency: '并发数',
        status: '状态',
        created: '创建时间',
        actions: '操作'
      },
      today: '今日',
      total: '近30天',
      noSubscription: '暂无订阅',
      publicGroupCount: '+{count} 公开',
      exclusiveLabel: '专属',
      publicLabel: '公开',
      daysRemaining: '{days}天',
      expired: '已过期',
      disable: '禁用',
      enable: '启用',
      disableUser: '禁用用户',
      enableUser: '启用用户',
      viewApiKeys: '查看 API 密钥',
      groups: '分组',
      apiKeys: 'API密钥',
      userApiKeys: '用户 API 密钥',
      noApiKeys: '此用户暂无 API 密钥',
      group: '分组',
      none: '无',
      groupChangedSuccess: '分组修改成功',
      groupChangedWithGrant: '分组修改成功，已自动为用户添加「{group}」分组权限',
      groupChangeFailed: '分组修改失败',
      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',
      soraStorageQuota: 'Sora 存储配额',
      soraStorageQuotaHint: '单位 GB，0 表示使用分组或系统默认配额',
      amountRequired: '请输入有效金额',
      insufficientBalance: '余额不足',
      setAllowedGroups: '设置允许分组',
      allowedGroupsHint: '选择此用户可以使用的标准分组。订阅类型分组请在订阅管理中配置。',
      noStandardGroups: '暂无标准分组',
      allowAllGroups: '允许全部分组',
      allowAllGroupsHint: '用户可以使用任何非专属分组',
      allowedGroupsUpdated: '允许分组更新成功',
      failedToLoadGroups: '加载分组列表失败',
      failedToUpdateAllowedGroups: '更新允许分组失败',
      // 用户分组配置
      groupConfig: '用户分组配置',
      groupConfigHint: '为用户 {email} 配置专属分组倍率（覆盖分组默认倍率）',
      exclusiveGroups: '专属分组',
      publicGroups: '公开分组（默认可用）',
      defaultRate: '默认倍率',
      customRate: '专属倍率',
      useDefaultRate: '使用默认',
      customRatePlaceholder: '留空使用默认',
      groupConfigUpdated: '分组配置更新成功',
      replaceGroup: '替换分组',
      clickToReplace: '点击替换分组',
      replaceGroupTitle: '替换专属分组',
      replaceGroupHint: '选择新分组替换「{old}」，将自动迁移绑定的 Key 并更新分组权限',
      replaceGroupConfirm: '确认替换',
      replaceGroupSuccess: '分组替换成功，已迁移 {count} 个 Key',
      selectNewGroup: '请选择目标分组',
      noOtherGroups: '没有其他可用的专属分组',
      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: '删除分组',
      sortOrder: '排序',
      sortOrderHint: '拖拽分组调整显示顺序，排在前面的分组会优先显示',
      sortOrderUpdated: '排序已更新',
      failedToUpdateSortOrder: '更新排序失败',
      deleteConfirm: "确定要删除分组 '{name}' 吗？所有关联的 API 密钥将不再属于任何分组。",
      deleteConfirmSubscription:
        "确定要删除订阅分组 '{name}' 吗？此操作会让所有绑定此订阅的用户的 API Key 失效，并删除所有相关的订阅记录。此操作无法撤销。",
      columns: {
        name: '名称',
        platform: '平台',
        rateMultiplier: '费率倍数',
        exclusive: '独占',
        type: '类型',
        priority: '优先级',
        apiKeys: 'API 密钥数',
        accounts: '账号数',
        capacity: '容量',
        usage: '用量',
        status: '状态',
        actions: '操作',
        billingType: '计费类型',
        userName: '用户名',
        userEmail: '邮箱',
        userNotes: '备注',
        userStatus: '状态'
      },
      usageToday: '今日',
      usageTotal: '累计',
      accountsAvailable: '可用:',
      accountsRateLimited: '限流:',
      accountsTotal: '总量:',
      accountsUnit: '个账号',
      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',
        sora: 'Sora'
      },
      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: '请输入分组名称',
      rateMultipliers: '专属倍率',
      rateMultipliersTitle: '分组专属倍率管理',
      addUserRate: '添加用户专属倍率',
      searchUserPlaceholder: '搜索用户邮箱...',
      noRateMultipliers: '暂无用户设置了专属倍率',
      rateUpdated: '专属倍率已更新',
      rateDeleted: '专属倍率已删除',
      rateAdded: '专属倍率已添加',
      clearAll: '全部清空',
      confirmClearAll: '确定要清空该分组所有用户的专属倍率设置吗？此操作不可撤销。',
      rateCleared: '已清空所有专属倍率',
      batchAdjust: '批量调整倍率',
      multiplierFactor: '乘数',
      applyMultiplier: '应用',
      rateAdjusted: '倍率已批量调整',
      rateSaved: '专属倍率已保存',
      finalRate: '最终倍率',
      unsavedChanges: '有未保存的修改',
      revertChanges: '撤销修改',
      userInfo: '用户信息',
      subscription: {
        title: '订阅设置',
        type: '计费类型',
        typeHint: '标准计费从用户余额扣除。订阅模式使用配额限制。',
        typeNotEditable: '分组创建后无法修改计费类型。',
        standard: '标准（余额）',
        subscription: '订阅（配额）',
        dailyLimit: '每日限额（USD）',
        weeklyLimit: '每周限额（USD）',
        monthlyLimit: '每月限额（USD）',
        defaultValidityDays: '默认有效期（天）',
        validityHint: '分配给用户时订阅的有效天数',
        noLimit: '无限制'
      },
      imagePricing: {
        title: '图片生成计费',
        description: '配置图片生成模型的图片生成价格，留空则使用默认价格'
      },
      soraPricing: {
        title: 'Sora 按次计费',
        description: '配置 Sora 图片/视频按次收费价格，留空则默认不计费',
        image360: '图片 360px ($)',
        image540: '图片 540px ($)',
        video: '视频（标准）($)',
        videoHd: '视频（Pro-HD）($)',
        storageQuota: '存储配额',
        storageQuotaHint: '单位 GB，设置该分组用户的 Sora 存储配额上限，0 表示使用系统默认'
      },
      claudeCode: {
        title: 'Claude Code 客户端限制',
        tooltip:
          '启用后，此分组仅允许 Claude Code 官方客户端访问。非 Claude Code 请求将被拒绝或降级到指定分组。',
        enabled: '仅限 Claude Code',
        disabled: '允许所有客户端',
        fallbackGroup: '降级分组',
        fallbackHint: '非 Claude Code 请求将使用此分组，留空则直接拒绝',
        noFallback: '不降级（直接拒绝）'
      },
      openaiMessages: {
        title: 'OpenAI Messages 调度配置',
        allowDispatch: '允许 /v1/messages 调度',
        allowDispatchHint: '启用后，此 OpenAI 分组的 API Key 可以通过 /v1/messages 端点调度请求',
        defaultModel: '默认映射模型',
        defaultModelPlaceholder: '例如: gpt-4.1',
        defaultModelHint: '当账号未配置模型映射时，所有请求模型将映射到此模型'
      },
      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: '全部分组',
      allPlatforms: '全部平台',
      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: '撤销',
      resetQuota: '重置配额',
      resetQuotaTitle: '重置用量配额',
      resetQuotaConfirm: "确定要重置 '{user}' 的每日、每周和每月用量配额吗？用量将归零并从今天开始重新计算。",
      quotaResetSuccess: '配额重置成功',
      failedToResetQuota: '重置配额失败',
      noSubscriptionsYet: '暂无订阅',
      assignFirstSubscription: '分配一个订阅以开始使用。',
      subscriptionAssigned: '订阅分配成功',
      subscriptionAdjusted: '订阅调整成功',
      subscriptionRevoked: '订阅撤销成功',
      failedToLoad: '加载订阅列表失败',
      failedToAssign: '分配订阅失败',
      failedToAdjust: '调整订阅失败',
      failedToRevoke: '撤销订阅失败',
      adjustWouldExpire: '调整后剩余天数必须大于0',
      adjustOutOfRange: '调整天数必须在 -36500 到 36500 之间',
      pleaseSelectUser: '请选择用户',
      pleaseSelectGroup: '请选择分组',
      validityDaysRequired: '请输入有效的天数（至少1天）',
      revokeConfirm: "确定要撤销 '{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
    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: '导入',
      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}，跳过 {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: '删除账号',
      deleteConfirmMessage: "确定要删除账号 '{name}' 吗？",
      refreshCookie: '刷新 Cookie',
      testAccount: '测试账号',
      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: '名称',
        platformType: '平台/类型',
        platform: '平台',
        type: '类型',
        capacity: '容量',
        notes: '备注',
        priority: '优先级',
        billingRateMultiplier: '账号倍率',
        weight: '权重',
        status: '状态',
        schedulable: '调度',
        todayStats: '今日统计',
        groups: '分组',
        usageWindows: '用量窗口',
        proxy: '代理',
        lastUsed: '最近使用',
        expiresAt: '过期时间',
        actions: '操作'
      },
      privacyTrainingOff: '已关闭训练数据共享',
      privacyCfBlocked: '被 Cloudflare 拦截，训练可能仍开启',
      privacyFailed: '关闭训练数据共享失败',
      // 容量状态提示
      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: '累计消费上限，不会自动重置。',
      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',
        sora: 'Sora'
      },
      types: {
        oauth: 'OAuth',
        chatgptOauth: 'ChatGPT OAuth',
        responsesApi: 'Responses API',
        googleOauth: 'Google OAuth',
        codeAssist: 'Code Assist',
        antigravityOauth: 'Antigravity OAuth',
        antigravityApikey: '通过 Base URL + API Key 连接',
        soraApiKey: 'API Key / 上游透传',
        soraApiKeyHint: '连接另一个 Sub2API 或兼容 API',
        soraBaseUrlRequired: 'Sora apikey 账号必须设置上游地址（Base URL）',
        soraBaseUrlInvalidScheme: 'Base URL 必须以 http:// 或 https:// 开头',
        upstream: '对接上游',
        upstreamDesc: '通过 Base URL + API Key 连接上游',
        api_key: 'API Key',
        cookie: 'Cookie'
      },
      status: {
        active: '正常',
        inactive: '停用',
        error: '错误',
        cooldown: '冷却中',
        paused: '暂停',
        limited: '限流',
        rateLimited: '限流中',
        overloaded: '过载中',
        tempUnschedulable: '临时不可调度',
        rateLimitedUntil: '限流中，当前不参与调度，预计 {time} 自动恢复',
        rateLimitedAutoResume: '{time} 自动恢复',
        modelRateLimitedUntil: '{model} 限流至 {time}',
        modelCreditOveragesUntil: '{model} 正在使用 AI Credits，至 {time}',
        creditsExhausted: '积分已用尽',
        creditsExhaustedUntil: 'AI Credits 已用尽，预计 {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: 'G31FI',
        claude: 'Claude',
        passiveSampled: '被动采样',
        activeQuery: '查询'
      },
      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: '获取失败',
      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: '批量停止调度',
        resetStatus: '批量重置状态',
        refreshToken: '批量刷新令牌',
        resetStatusSuccess: '已成功重置 {count} 个账号状态',
        refreshTokenSuccess: '已成功刷新 {count} 个账号令牌',
        partialSuccess: '操作部分完成：{success} 成功，{failed} 失败'
      },
      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: '请至少选择一个要更新的字段',
        mixedPlatformWarning: '所选账号跨越多个平台（{platforms}）。显示的模型映射预设为合并结果——请确保映射对每个平台都适用。'
      },
      bulkDeleteTitle: '批量删除账号',
      bulkDeleteConfirm: '确定要删除选中的 {count} 个账号吗？此操作无法撤销。',
      bulkDeleteSuccess: '成功删除 {count} 个账号',
      bulkDeletePartial: '部分删除成功：成功 {success} 个，失败 {failed} 个',
      bulkDeleteFailed: '批量删除失败',
      recoverState: '恢复状态',
      recoverStateHint: '用于恢复错误、限流和临时不可调度等可恢复状态。',
      recoverStateSuccess: '账号状态已恢复',
      recoverStateFailed: '恢复账号状态失败',
      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',
      bedrockLabel: 'AWS Bedrock',
      bedrockDesc: 'SigV4 / API Key',
      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 账号将自动透传请求与响应，仅替换认证并保留计费/并发/审计及必要安全过滤；如遇兼容性问题可随时关闭回滚。',
        responsesWebsocketsV2: 'Responses WebSocket v2',
        responsesWebsocketsV2Desc:
          '默认关闭。开启后可启用 responses_websockets_v2 协议能力（受网关全局开关与账号类型开关约束）。',
        wsMode: 'WS mode',
        wsModeDesc: '仅对当前 OpenAI 账号类型生效。',
        wsModeOff: '关闭（off）',
        wsModeCtxPool: '上下文池（ctx_pool）',
        wsModePassthrough: '透传（passthrough）',
        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。',
        codexCLIOnly: '仅允许 Codex 官方客户端',
        codexCLIOnlyDesc: '仅对 OpenAI OAuth 生效。开启后仅允许 Codex 官方客户端家族访问；关闭后完全绕过并保持原逻辑。',
        modelRestrictionDisabledByPassthrough: '已开启自动透传：模型白名单/映射不会生效。',
        enableSora: '同时启用 Sora',
        enableSoraHint: 'Sora 使用相同的 OpenAI 账号，开启后将同时创建 Sora 平台账号'
      },
      anthropic: {
        apiKeyPassthrough: '自动透传（仅替换认证）',
        apiKeyPassthroughDesc:
          '仅对 Anthropic API Key 生效。开启后，messages/count_tokens 请求将透传上游并仅替换认证，保留计费/并发/审计及必要安全过滤；关闭即可回滚到现有兼容链路。'
      },
      modelRestriction: '模型限制（可选）',
      modelWhitelist: '模型白名单',
      modelMapping: '模型映射',
      selectAllowedModels: '选择允许的模型。留空则支持所有模型。',
      mapRequestModels: '将请求模型映射到实际模型。左边是请求的模型，右边是发送到 API 的实际模型。',
      selectedModels: '已选择 {count} 个模型',
      supportsAllModels: '（支持所有模型）',
      soraModelsLoadFailed: '加载 Sora 模型列表失败，已回退到默认列表',
      soraModelsLoading: '正在加载 Sora 模型...',
      soraModelsRetry: '加载失败，点击重试',
      requestModel: '请求模型',
      actualModel: '实际模型',
      addMapping: '添加映射',
      mappingExists: '模型 {model} 的映射已存在',
      wildcardOnlyAtEnd: '通配符 * 只能放在末尾',
      targetNoWildcard: '目标模型不能包含通配符 *',
      searchModels: '搜索模型...',
      noMatchingModels: '没有匹配的模型',
      fillRelatedModels: '填入相关模型',
      clearAllModels: '清除所有模型',
      customModelName: '自定义模型名称',
      enterCustomModelName: '输入自定义模型名称',
      addModel: '填入',
      modelExists: '该模型已存在',
      modelCount: '{count} 个模型',
      poolMode: '池模式',
      poolModeHint: '上游为账号池时启用，错误不标记本地账号状态',
      poolModeInfo:
        '启用后，上游 429/403/401 错误将自动重试而不标记账号限流或错误，适用于上游指向另一个 sub2api 实例的场景。',
      poolModeRetryCount: '同账号重试次数',
      poolModeRetryCountHint: '仅在池模式下生效。0 表示不原地重试；默认 {default}，最大 {max}。',
      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: '配置费用窗口、会话限制、客户端亲和等调度控制。',
        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 指纹'
        },
        sessionIdMasking: {
          label: '会话 ID 伪装',
          hint: '启用后将在 15 分钟内固定 metadata.user_id 中的 session ID，使上游认为请求来自同一会话'
        },
        cacheTTLOverride: {
          label: '缓存 TTL 强制替换',
          hint: '将所有缓存创建 token 强制按指定的 TTL 类型（5分钟或1小时）计费',
          target: '目标 TTL',
          targetHint: '选择计费使用的 TTL 类型'
        },
        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: '账号创建成功',
      soraAccountCreated: 'Sora 账号已同时创建',
      soraAccountFailed: 'Sora 账号创建失败，请稍后手动添加',
      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 参数值，系统会自动识别',
          // Refresh Token auth
          refreshTokenAuth: '手动输入 RT',
          refreshTokenDesc: '输入您已有的 OpenAI Refresh Token，支持批量输入（每行一个），系统将自动验证并创建账号。',
          refreshTokenPlaceholder: '粘贴您的 OpenAI Refresh Token...\n支持多个，每行一个',
          sessionTokenAuth: '手动输入 ST',
          sessionTokenDesc: '输入您已有的 Sora Session Token，支持批量输入（每行一个），系统将自动验证并创建账号。',
          sessionTokenPlaceholder: '粘贴您的 Sora 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'
        },
        // 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。',
          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 账号',
      soraAccount: 'Sora 账号',
      geminiAccount: 'Gemini 账号',
      antigravityAccount: 'Antigravity 账号',
      inputMethod: '输入方式',
      reAuthorizedSuccess: '账号重新授权成功',
      // Test Modal
      testAccountConnection: '测试账号连接',
      account: '账号',
      readyToTest: '准备测试。点击"开始测试"按钮开始...',
      connectingToApi: '连接 API 中...',
      testCompleted: '测试完成！',
      connectedToApi: '已连接到 API',
      usingModel: '使用模型：{model}',
      sendingTestMessage: '发送测试消息："hi"',
      sendingGeminiImageRequest: '发送 Gemini 生图测试请求...',
      response: '响应：',
      startTest: '开始测试',
      retry: '重试',
      copyOutput: '复制输出',
      outputCopied: '输出已复制',
      startingTestForAccount: '开始测试账号：{name}',
      testAccountTypeLabel: '账号类型：{type}',
      selectTestModel: '选择测试模型',
      testModel: '测试模型',
      testPrompt: '提示词："hi"',
      geminiImagePromptLabel: '生图提示词',
      geminiImagePromptPlaceholder: '例如：生成一只戴宇航员头盔的橘猫，像素插画风格，纯色背景。',
      geminiImagePromptDefault: 'Generate a cute orange cat astronaut sticker on a clean pastel background.',
      geminiImageTestHint: '选择 Gemini 图片模型后，这里会直接发起生图测试，并在下方展示返回图片。',
      geminiImageTestMode: '模式：Gemini 生图测试',
      geminiImagePreview: '生成结果：',
      geminiImageReceived: '已收到第 {count} 张测试图片',
      soraUpstreamBaseUrlHint: '上游 Sora 服务地址（另一个 Sub2API 实例或兼容 API）',
      soraTestHint: 'Sora 测试将执行连通性与能力检测（/backend/me、订阅信息、Sora2 邀请码与剩余额度）。',
      soraTestTarget: '检测目标：Sora 账号能力',
      soraTestMode: '模式：连通性 + 能力探测',
      soraTestingFlow: '执行 Sora 连通性与能力检测...',
      // 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
    scheduledTests: {
      title: '定时测试',
      addPlan: '添加计划',
      editPlan: '编辑计划',
      deletePlan: '删除计划',
      model: '模型',
      cronExpression: 'Cron 表达式',
      enabled: '启用',
      lastRun: '上次运行',
      nextRun: '下次运行',
      maxResults: '最大结果数',
      noPlans: '暂无定时测试计划',
      confirmDelete: '确定要删除此计划吗？',
      createSuccess: '计划创建成功',
      updateSuccess: '计划更新成功',
      deleteSuccess: '计划删除成功',
      results: '测试结果',
      noResults: '暂无测试结果',
      responseText: '响应',
      errorMessage: '错误',
      success: '成功',
      failed: '失败',
      running: '运行中',
      schedule: '定时测试',
      cronHelp: '标准 5 字段 cron 表达式（例如 */30 * * * *）',
      cronTooltipTitle: 'Cron 表达式示例：',
      cronTooltipMeaning: '用于定义自动执行测试的时间规则，格式依次为：分钟 小时 日 月 星期。',
      cronTooltipExampleEvery30Min: '*/30 * * * *：每 30 分钟运行一次',
      cronTooltipExampleHourly: '0 * * * *：每小时整点运行一次',
      cronTooltipExampleDaily: '0 9 * * *：每天 09:00 运行一次',
      cronTooltipExampleWeekly: '0 9 * * 1：每周一 09:00 运行一次',
      cronTooltipRange: '推荐填写范围：使用标准 5 字段 cron；如果只是健康检查，建议从每 30 分钟、每 1 小时或每天固定时间开始，不建议一开始就设置过高频率。',
      maxResultsTooltipTitle: '最大结果数说明：',
      maxResultsTooltipMeaning: '用于限制单个计划最多保留多少条历史测试结果，避免结果列表无限增长。',
      maxResultsTooltipBody: '系统只会保留最近的测试结果；当保存数量超过这个值时，更早的历史记录会自动清理，避免列表过长和存储持续增长。',
      maxResultsTooltipExample: '例如填写 100，表示最多保存最近 100 次测试结果；第 101 次结果写入后，最早的一条会被清理。',
      maxResultsTooltipRange: '推荐填写范围：一般可填 20 到 200。只关注近期可用性时可填 20-50；需要回看较长时间的波动趋势时可填 100-200。',
      autoRecover: '自动恢复',
      autoRecoverHelp: '测试成功后自动恢复异常状态的账号'
    },

    // 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: '地址',
        auth: '认证',
        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
      copyProxyUrl: '复制代理 URL',
      urlCopied: '代理 URL 已复制',
      allProtocols: '全部协议',
      allStatus: '全部状态',
      searchProxies: '搜索代理...',
      protocols: {
        http: 'HTTP',
        https: 'HTTPS',
        socks5: 'SOCKS5',
        socks5h: 'SOCKS5H (远程 DNS)',
      },
      name: '名称',
      protocol: '协议',
      host: '主机',
      port: '端口',
      username: '用户名（可选）',
      password: '密码（可选）',
      status: '状态',
      enterProxyName: '请输入代理名称',
      optionalAuth: '可选认证信息',
      leaveEmptyToKeep: '留空保持不变',
      form: {
        hostPlaceholder: '请输入主机地址',
        portPlaceholder: '请输入端口'
      },
      noProxiesYet: '暂无代理',
      createFirstProxy: '添加您的第一个代理以开始使用。',
      testConnection: '测试连接',
      qualityCheck: '质量检测',
      batchQualityCheck: '批量质量检测',
      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: '代理测试失败',
      qualityCheckDone: '质量检测完成：评分 {score}（{grade}）',
      qualityCheckFailed: '代理质量检测失败',
      batchQualityDone: '批量质量检测完成，共检测 {count} 个；优质 {healthy} 个，告警 {warn} 个，挑战 {challenge} 个，异常 {failed} 个',
      batchQualityFailed: '批量质量检测失败',
      batchQualityEmpty: '暂无可检测质量的代理',
      qualityReportTitle: '代理质量检测报告',
      qualityGrade: '等级 {grade}',
      qualityExitIP: '出口 IP',
      qualityCountry: '出口地区',
      qualityBaseLatency: '基础延迟',
      qualityCheckedAt: '检测时间',
      qualityTableTarget: '检测项',
      qualityTableStatus: '状态',
      qualityTableLatency: '延迟',
      qualityTableMessage: '说明',
      qualityInline: '质量 {grade}/{score}',
      qualityStatusHealthy: '优质',
      qualityStatusPass: '通过',
      qualityStatusWarn: '告警',
      qualityStatusFail: '失败',
      qualityStatusChallenge: '挑战',
      qualityTargetBase: '基础连通性',
      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: '状态',
        notifyMode: '通知方式',
        targeting: '展示条件',
        timeRange: '有效期',
        createdAt: '创建时间',
        actions: '操作'
      },
      statusLabels: {
        draft: '草稿',
        active: '展示中',
        archived: '已归档'
      },
      notifyModeLabels: {
        silent: '静默',
        popup: '弹窗'
      },
      form: {
        title: '标题',
        content: '内容（支持 Markdown）',
        status: '状态',
        notifyMode: '通知方式',
        notifyModeHint: '弹窗模式会自动弹出通知给用户',
        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',
      cacheCreation5mTokens: '缓存创建',
      cacheCreation1hTokens: '缓存创建',
      cacheReadTokens: '缓存读取 Token',
      failedToLoad: '加载使用记录失败',
      billingType: '计费类型',
      allBillingTypes: '全部计费类型',
      billingTypeBalance: '钱包余额',
      billingTypeSubscription: '订阅套餐',
      ipAddress: 'IP',
      clickToViewBalance: '点击查看充值记录',
      failedToLoadUser: '加载用户信息失败',
      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小时',
        '1d': '近1天',
        '15d': '近15天',
        '6h': '近6小时',
        '24h': '近24小时',
        '7d': '近7天',
        '30d': '近30天',
        custom: '自定义'
      },
      openaiTokenStats: {
        title: 'OpenAI Token 请求统计',
        viewModeTopN: 'TopN',
        viewModePagination: '分页',
        prevPage: '上一页',
        nextPage: '下一页',
        pageInfo: '第 {page}/{total} 页',
        totalModels: '模型总数：{total}',
        failedToLoad: '加载 OpenAI Token 统计失败',
        empty: '当前筛选条件下暂无 OpenAI Token 请求统计数据',
        table: {
          model: '模型',
          requestCount: '请求数',
          avgTokensPerSec: '平均 Tokens/秒',
          avgFirstTokenMs: '平均首 Token 延迟(ms)',
          totalOutputTokens: '输出 Token 总数',
          avgDurationMs: '平均时长(ms)',
          requestsWithFirstToken: '首 Token 样本数'
        }
      },
      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）将不会写入错误日志。',
        ignoreInsufficientBalanceErrors: '忽略余额不足错误',
        ignoreInsufficientBalanceErrorsHint: '启用后，账号余额不足（Insufficient balance）的错误将不会写入错误日志。',
        autoRefresh: '自动刷新',
        enableAutoRefresh: '启用自动刷新',
        enableAutoRefreshHint: '自动刷新仪表板数据，启用后会定期拉取最新数据。',
        refreshInterval: '刷新间隔',
        refreshInterval15s: '15 秒',
        refreshInterval30s: '30 秒',
        refreshInterval60s: '60 秒',
        dashboardCards: '仪表盘卡片',
        displayAlertEvents: '展示告警事件',
        displayAlertEventsHint: '控制运维监控仪表盘中告警事件卡片是否显示，默认开启。',
        displayOpenAITokenStats: '展示 OpenAI Token 请求统计',
        displayOpenAITokenStatsHint: '控制运维监控仪表盘中 OpenAI Token 请求统计卡片是否显示，默认关闭。',
        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}',
        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 设置',
      tabs: {
        general: '通用设置',
        security: '安全与认证',
        users: '用户默认值',
        gateway: '网关服务',
        email: '邮件设置',
        backup: '数据备份',
        data: 'Sora 存储',
      },
      emailTabDisabledTitle: '邮箱验证未启用',
      emailTabDisabledHint: '请在「安全与认证」选项卡中启用邮箱验证后，再配置 SMTP 设置。',
      registration: {
        title: '注册设置',
        description: '控制用户注册和验证',
        enableRegistration: '开放注册',
        enableRegistrationHint: '允许新用户注册',
        emailVerification: '邮箱验证',
        emailVerificationHint: '新用户注册时需要验证邮箱',
        emailSuffixWhitelist: '邮箱域名白名单',
        emailSuffixWhitelistHint:
          "仅允许使用指定域名的邮箱注册账号（例如 {'@'}qq.com, {'@'}gmail.com）",
        emailSuffixWhitelistPlaceholder: 'example.com',
        emailSuffixWhitelistInputHint: '留空则不限制',
        promoCode: '优惠码',
        promoCodeHint: '允许用户在注册时使用优惠码',
        invitationCode: '邀请码注册',
        invitationCodeHint: '开启后，用户注册时需要填写有效的邀请码',
        passwordReset: '忘记密码',
        passwordResetHint: '允许用户通过邮箱重置密码',
        frontendUrl: '前端地址',
        frontendUrlPlaceholder: 'https://example.com',
        frontendUrlHint: '用于生成邮件中的密码重置链接，例如 https://example.com',
        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: '新用户的最大并发请求数',
        defaultSubscriptions: '默认订阅列表',
        defaultSubscriptionsHint: '新用户创建或注册时自动分配这些订阅',
        addDefaultSubscription: '添加默认订阅',
        defaultSubscriptionsEmpty: '未配置默认订阅。新用户不会自动获得订阅套餐。',
        defaultSubscriptionsDuplicate: '默认订阅存在重复分组：{groupId}。每个分组只能出现一次。',
        subscriptionGroup: '订阅分组',
        subscriptionValidityDays: '有效期（天）'
      },
      claudeCode: {
        title: 'Claude Code 设置',
        description: '控制 Claude Code 客户端访问要求',
        minVersion: '最低版本号',
        minVersionPlaceholder: '例如 2.1.63',
        minVersionHint: '拒绝低于此版本的 Claude Code 客户端请求（semver 格式）。留空则不检查版本。',
        maxVersion: '最高版本号',
        maxVersionPlaceholder: '例如 2.5.0',
        maxVersionHint: '拒绝高于此版本的 Claude Code 客户端请求（semver 格式）。留空则不限制最高版本。'
      },
      scheduling: {
        title: '网关调度设置',
        description: '控制 API Key 的调度行为',
        allowUngroupedKey: '允许未分组 Key 调度',
        allowUngroupedKeyHint: '关闭后，未分配到任何分组的 API Key 将无法发起请求（返回 403）。建议保持关闭以确保所有 Key 都归属明确的分组。'
      },
      site: {
        title: '站点设置',
        description: '自定义站点品牌',
        backendMode: 'Backend 模式',
        backendModeDescription:
          '禁用用户注册、公开页面和自助服务功能。仅管理员可以登录和管理平台。',
        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 嵌入，出现空白时可引导用户使用”新窗口打开”。',
        integrationDoc: '支付集成文档',
        integrationDocHint: '包含接口说明、幂等语义及示例代码'
      },
      soraClient: {
        title: 'Sora 客户端',
        description: '控制是否在侧边栏展示 Sora 客户端入口',
        enabled: '启用 Sora 客户端',
        enabledHint: '开启后，侧边栏将显示 Sora 入口，用户可访问 Sora 功能'
      },
      customMenu: {
        title: '自定义菜单页面',
        description: '添加自定义 iframe 页面到侧边栏导航。每个页面可以设置为普通用户或管理员可见。',
        itemLabel: '菜单项 #{n}',
        name: '菜单名称',
        namePlaceholder: '如：帮助中心',
        url: '页面 URL',
        urlPlaceholder: 'https://example.com/page',
        iconSvg: 'SVG 图标',
        iconSvgPlaceholder: '<svg>...</svg>',
        iconPreview: '图标预览',
        uploadSvg: '上传 SVG',
        removeSvg: '清除',
        visibility: '可见角色',
        visibilityUser: '普通用户',
        visibilityAdmin: '管理员',
        add: '添加菜单项',
        remove: '删除',
        moveUp: '上移',
        moveDown: '下移',
      },
      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: <your-admin-api-key>'
      },
      soraS3: {
        title: 'Sora 存储配置',
        description: '以多配置列表管理 Sora 媒体存储，支持 S3 和 Google Drive',
        newProfile: '新建配置',
        reloadProfiles: '刷新列表',
        empty: '暂无存储配置，请先创建',
        createTitle: '新建存储配置',
        editTitle: '编辑存储配置',
        selectProvider: '选择存储类型',
        providerS3Desc: 'S3 兼容对象存储',
        providerGDriveDesc: 'Google Drive 云盘',
        profileID: '配置 ID',
        profileName: '配置名称',
        setActive: '创建后设为生效',
        saveProfile: '保存配置',
        activateProfile: '设为生效',
        profileCreated: '存储配置创建成功',
        profileSaved: '存储配置保存成功',
        profileDeleted: '存储配置删除成功',
        profileActivated: '生效配置已切换',
        profileIDRequired: '请填写配置 ID',
        profileNameRequired: '请填写配置名称',
        profileSelectRequired: '请先选择配置',
        endpointRequired: '启用时必须填写 S3 端点',
        bucketRequired: '启用时必须填写存储桶',
        accessKeyRequired: '启用时必须填写 Access Key ID',
        deleteConfirm: '确定删除存储配置 {profileID} 吗？',
        columns: {
          profile: '配置',
          profileId: 'Profile ID',
          name: '名称',
          provider: '存储类型',
          active: '生效状态',
          endpoint: '端点',
          storagePath: '存储路径',
          capacityUsage: '容量 / 已用',
          capacityUnlimited: '无限制',
          videoCount: '视频数',
          videoCompleted: '完成',
          videoInProgress: '进行中',
          quota: '默认配额',
          updatedAt: '更新时间',
          actions: '操作',
          rootFolder: '根目录',
          testInTable: '测试',
          testingInTable: '测试中...',
          testTimeout: '测试超时（15秒）'
        },
        enabled: '启用存储',
        enabledHint: '启用后，Sora 生成的媒体文件将自动上传到存储',
        endpoint: 'S3 端点',
        region: '区域',
        bucket: '存储桶',
        prefix: '对象前缀',
        accessKeyId: 'Access Key ID',
        secretAccessKey: 'Secret Access Key',
        secretConfigured: '(已配置，留空保持不变)',
        cdnUrl: 'CDN URL',
        cdnUrlHint: '可选，配置后使用 CDN URL 访问文件',
        forcePathStyle: '强制路径风格（Path Style）',
        defaultQuota: '默认存储配额',
        defaultQuotaHint: '未在用户或分组级别指定配额时的默认值，0 表示无限制',
        testConnection: '测试连接',
        testing: '测试中...',
        testSuccess: '连接测试成功',
        testFailed: '连接测试失败',
        saved: '存储设置保存成功',
        saveFailed: '保存存储设置失败',
        gdrive: {
          authType: '认证方式',
          serviceAccount: '服务账号',
          clientId: 'Client ID',
          clientSecret: 'Client Secret',
          clientSecretConfigured: '(已配置，留空保持不变)',
          refreshToken: 'Refresh Token',
          refreshTokenConfigured: '(已配置，留空保持不变)',
          serviceAccountJson: '服务账号 JSON',
          serviceAccountConfigured: '(已配置，留空保持不变)',
          folderId: 'Folder ID（可选）',
          authorize: '授权 Google Drive',
          authorizeHint: '通过 OAuth2 获取 Refresh Token',
          oauthFieldsRequired: '请先填写 Client ID 和 Client Secret',
          oauthSuccess: 'Google Drive 授权成功',
          oauthFailed: 'Google Drive 授权失败',
          closeWindow: '此窗口将自动关闭',
          processing: '正在处理授权...',
          testStorage: '测试存储',
          testSuccess: 'Google Drive 存储测试成功（上传、访问、删除均正常）',
          testFailed: 'Google Drive 存储测试失败'
        }
      },
      overloadCooldown: {
        title: '529 过载冷却',
        description: '配置上游返回 529（过载）时的账号调度暂停策略',
        enabled: '启用过载冷却',
        enabledHint: '收到 529 错误时暂停该账号的调度，冷却后自动恢复',
        cooldownMinutes: '冷却时长（分钟）',
        cooldownMinutesHint: '账号暂停调度的持续时间（1-120 分钟）',
        saved: '过载冷却设置保存成功',
        saveFailed: '保存过载冷却设置失败'
      },
      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: '保存流超时设置失败'
      },
      rectifier: {
        title: '请求整流器',
        description: '当上游返回特定错误时，自动修正请求参数并重试，提高请求成功率',
        enabled: '启用请求整流器',
        enabledHint: '总开关，关闭后所有整流功能均不生效',
        thinkingSignature: 'Thinking 签名整流',
        thinkingSignatureHint: '当上游返回 thinking block 签名校验错误时，自动去除签名并重试',
        thinkingBudget: 'Thinking Budget 整流',
        thinkingBudgetHint: '当上游返回 budget_tokens 约束错误（≥1024）时，自动将 budget 设为 32000 并重试',
        saved: '整流器设置保存成功',
        saveFailed: '保存整流器设置失败'
      },
      betaPolicy: {
        title: 'Beta 策略',
        description: '配置转发 Anthropic API 请求时如何处理 Beta 特性。仅适用于 /v1/messages 接口。',
        action: '处理方式',
        actionPass: '透传（不处理）',
        actionFilter: '过滤（移除）',
        actionBlock: '拦截（拒绝请求）',
        scope: '生效范围',
        scopeAll: '全部账号',
        scopeOAuth: '仅 OAuth 账号',
        scopeAPIKey: '仅 API Key 账号',
        scopeBedrock: '仅 Bedrock 账号',
        errorMessage: '错误消息',
        errorMessagePlaceholder: '拦截时返回的自定义错误消息',
        errorMessageHint: '留空则使用默认错误消息',
        saved: 'Beta 策略设置保存成功',
        saveFailed: '保存 Beta 策略设置失败'
      },
      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: '消息体',
      skipMonitoring: '跳过监控',

      // 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: '返回给客户端的错误信息...',
        skipMonitoring: '跳过运维监控记录',
        skipMonitoringHint: '开启后，匹配此规则的错误不会被记录到运维监控中',
        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: '重试'
  },

  // Recharge / Subscription Page
  purchase: {
    title: '充值/订阅',
    description: '通过内嵌页面完成充值/订阅',
    openInNewTab: '新窗口打开',
    notEnabledTitle: '该功能未开启',
    notEnabledDesc: '管理员暂未开启充值/订阅入口，请联系管理员。',
    notConfiguredTitle: '充值/订阅链接未配置',
    notConfiguredDesc: '管理员已开启入口，但尚未配置充值/订阅链接，请联系管理员。'
  },

  // Custom Page (iframe embed)
  customPage: {
    title: '自定义页面',
    openInNewTab: '新窗口打开',
    notFoundTitle: '页面不存在',
    notFoundDesc: '该自定义页面不存在或已被删除。',
    notConfiguredTitle: '页面链接未配置',
    notConfiguredDesc: '该自定义页面的 URL 未正确配置。',
  },

  // 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:
          '<div style="line-height: 1.8;"><p style="margin-bottom: 16px;">Sub2API 是一个强大的 AI 服务中转平台，让您轻松管理和分发 AI 服务。</p><p style="margin-bottom: 12px;"><b>🎯 核心功能：</b></p><ul style="margin-left: 20px; margin-bottom: 16px;"><li>📦 <b>分组管理</b> - 创建不同的服务套餐（VIP、免费试用等）</li><li>🔗 <b>账号池</b> - 连接多个上游 AI 服务商账号</li><li>🔑 <b>密钥分发</b> - 为用户生成独立的 API Key</li><li>💰 <b>计费管理</b> - 灵活的费率和配额控制</li></ul><p style="color: #10b981; font-weight: 600;">接下来，我们将用 3 分钟带您完成首次配置 →</p></div>',
        nextBtn: '开始配置 🚀',
        prevBtn: '跳过'
      },
      groupManage: {
        title: '📦 第一步：分组管理',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;"><b>什么是分组？</b></p><p style="margin-bottom: 12px;">分组是 Sub2API 的核心概念，它就像一个"服务套餐"：</p><ul style="margin-left: 20px; margin-bottom: 12px; font-size: 13px;"><li>🎯 每个分组可以包含多个上游账号</li><li>💰 每个分组有独立的计费倍率</li><li>👥 可以设置为公开或专属分组</li></ul><p style="margin-top: 12px; padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 示例：</b>您可以创建"VIP专线"（高倍率）和"免费试用"（低倍率）两个分组</p><p style="margin-top: 16px; color: #10b981; font-weight: 600;">👉 点击左侧的"分组管理"开始</p></div>'
      },
      createGroup: {
        title: '➕ 创建新分组',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">现在让我们创建第一个分组。</p><p style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>📝 提示：</b>建议先创建一个测试分组，熟悉流程后再创建正式分组</p><p style="color: #10b981; font-weight: 600;">👉 点击"创建分组"按钮</p></div>'
      },
      groupName: {
        title: '✏️ 1. 分组名称',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">为您的分组起一个易于识别的名称。</p><div style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>💡 命名建议：</b><ul style="margin: 8px 0 0 16px;"><li>"测试分组" - 用于测试</li><li>"VIP专线" - 高质量服务</li><li>"免费试用" - 体验版</li></ul></div><p style="font-size: 13px; color: #6b7280;">填写完成后点击"下一步"继续</p></div>',
        nextBtn: '下一步'
      },
      groupPlatform: {
        title: '🤖 2. 选择平台',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">选择该分组支持的 AI 平台。</p><div style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>📌 平台说明：</b><ul style="margin: 8px 0 0 16px;"><li><b>Anthropic</b> - Claude 系列模型</li><li><b>OpenAI</b> - GPT 系列模型</li><li><b>Google</b> - Gemini 系列模型</li></ul></div><p style="font-size: 13px; color: #6b7280;">一个分组只能选择一个平台</p></div>',
        nextBtn: '下一步'
      },
      groupMultiplier: {
        title: '💰 3. 费率倍数',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">设置该分组的计费倍率，控制用户的实际扣费。</p><div style="padding: 8px 12px; background: #fef3c7; border-left: 3px solid #f59e0b; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>⚙️ 计费规则：</b><ul style="margin: 8px 0 0 16px;"><li><b>1.0</b> - 原价计费（成本价）</li><li><b>1.5</b> - 用户消耗 $1，扣除 $1.5</li><li><b>2.0</b> - 用户消耗 $1，扣除 $2</li><li><b>0.8</b> - 补贴模式（亏本运营）</li></ul></div><p style="font-size: 13px; color: #6b7280;">建议测试分组设置为 1.0</p></div>',
        nextBtn: '下一步'
      },
      groupExclusive: {
        title: '🔒 4. 专属分组（可选）',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">控制分组的可见性和访问权限。</p><div style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>🔐 权限说明：</b><ul style="margin: 8px 0 0 16px;"><li><b>关闭</b> - 公开分组，所有用户可见</li><li><b>开启</b> - 专属分组，仅指定用户可见</li></ul></div><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 使用场景：</b>VIP 用户专属、内部测试、特殊客户等</p></div>',
        nextBtn: '下一步'
      },
      groupSubmit: {
        title: '✅ 保存分组',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">确认信息无误后，点击创建按钮保存分组。</p><p style="padding: 8px 12px; background: #fef3c7; border-left: 3px solid #f59e0b; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>⚠️ 注意：</b>分组创建后，平台类型不可修改，其他信息可以随时编辑</p><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>📌 下一步：</b>创建成功后，我们将添加上游账号到这个分组</p><p style="margin-top: 12px; color: #10b981; font-weight: 600;">👉 点击"创建"按钮</p></div>'
      },
      accountManage: {
        title: '🔗 第二步：添加账号',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;"><b>太棒了！分组已创建成功 🎉</b></p><p style="margin-bottom: 12px;">现在需要添加上游 AI 服务商的账号，让分组能够实际提供服务。</p><div style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>🔑 账号的作用：</b><ul style="margin: 8px 0 0 16px;"><li>连接到上游 AI 服务（Claude、GPT 等）</li><li>一个分组可以包含多个账号（负载均衡）</li><li>支持 OAuth 和 Session Key 两种方式</li></ul></div><p style="margin-top: 16px; color: #10b981; font-weight: 600;">👉 点击左侧的"账号管理"</p></div>'
      },
      createAccount: {
        title: '➕ 添加新账号',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">点击按钮开始添加您的第一个上游账号。</p><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 提示：</b>建议使用 OAuth 方式，更安全且无需手动提取密钥</p><p style="margin-top: 12px; color: #10b981; font-weight: 600;">👉 点击"添加账号"按钮</p></div>'
      },
      accountName: {
        title: '✏️ 1. 账号名称',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">为账号设置一个便于识别的名称。</p><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 命名建议：</b>"Claude主账号"、"GPT备用1"、"测试账号" 等</p></div>',
        nextBtn: '下一步'
      },
      accountPlatform: {
        title: '🤖 2. 选择平台',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">选择该账号对应的服务商平台。</p><p style="padding: 8px 12px; background: #fef3c7; border-left: 3px solid #f59e0b; border-radius: 4px; font-size: 13px;"><b>⚠️ 重要：</b>平台必须与刚才创建的分组平台一致</p></div>',
        nextBtn: '下一步'
      },
      accountType: {
        title: '🔐 3. 授权方式',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">选择账号的授权方式。</p><div style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>✅ 推荐：OAuth 方式</b><ul style="margin: 8px 0 0 16px;"><li>无需手动提取密钥</li><li>更安全，支持自动刷新</li><li>适用于 Claude Code、ChatGPT OAuth</li></ul></div><div style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px;"><b>📌 Session Key 方式</b><ul style="margin: 8px 0 0 16px;"><li>需要手动从浏览器提取</li><li>可能需要定期更新</li><li>适用于不支持 OAuth 的平台</li></ul></div></div>',
        nextBtn: '下一步'
      },
      accountPriority: {
        title: '⚖️ 4. 优先级（可选）',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">设置账号的调用优先级。</p><div style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>📊 优先级规则：</b><ul style="margin: 8px 0 0 16px;"><li>数字越小，优先级越高</li><li>系统优先使用低数值账号</li><li>相同优先级则随机选择</li></ul></div><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 使用场景：</b>主账号设置低数值，备用账号设置高数值</p></div>',
        nextBtn: '下一步'
      },
      accountGroups: {
        title: '🎯 5. 分配分组',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;"><b>关键步骤！</b>将账号分配到刚才创建的分组。</p><div style="padding: 8px 12px; background: #fee2e2; border-left: 3px solid #ef4444; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>⚠️ 重要提醒：</b><ul style="margin: 8px 0 0 16px;"><li>必须勾选至少一个分组</li><li>未分配分组的账号无法使用</li><li>一个账号可以分配给多个分组</li></ul></div><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 提示：</b>请勾选刚才创建的测试分组</p></div>',
        nextBtn: '下一步'
      },
      accountSubmit: {
        title: '✅ 保存账号',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">确认信息无误后，点击保存按钮。</p><div style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>📌 OAuth 授权流程：</b><ul style="margin: 8px 0 0 16px;"><li>点击保存后会跳转到服务商页面</li><li>在服务商页面完成登录授权</li><li>授权成功后自动返回</li></ul></div><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>📌 下一步：</b>账号添加成功后，我们将创建 API 密钥</p><p style="margin-top: 12px; color: #10b981; font-weight: 600;">👉 点击"保存"按钮</p></div>'
      },
      keyManage: {
        title: '🔑 第三步：生成密钥',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;"><b>恭喜！账号配置完成 🎉</b></p><p style="margin-bottom: 12px;">最后一步，生成 API Key 来测试服务是否正常工作。</p><div style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>🔑 API Key 的作用：</b><ul style="margin: 8px 0 0 16px;"><li>用于调用 AI 服务的凭证</li><li>每个 Key 绑定一个分组</li><li>可以设置配额和有效期</li><li>支持独立的使用统计</li></ul></div><p style="margin-top: 16px; color: #10b981; font-weight: 600;">👉 点击左侧的"API 密钥"</p></div>'
      },
      createKey: {
        title: '➕ 创建密钥',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">点击按钮创建您的第一个 API Key。</p><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 提示：</b>创建后请立即复制保存，密钥只显示一次</p><p style="margin-top: 12px; color: #10b981; font-weight: 600;">👉 点击"创建密钥"按钮</p></div>'
      },
      keyName: {
        title: '✏️ 1. 密钥名称',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">为密钥设置一个便于管理的名称。</p><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 命名建议：</b>"测试密钥"、"生产环境"、"移动端" 等</p></div>',
        nextBtn: '下一步'
      },
      keyGroup: {
        title: '🎯 2. 选择分组',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">选择刚才配置好的分组。</p><div style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>📌 分组决定：</b><ul style="margin: 8px 0 0 16px;"><li>该密钥可以使用哪些账号</li><li>计费倍率是多少</li><li>是否为专属密钥</li></ul></div><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 提示：</b>选择刚才创建的测试分组</p></div>',
        nextBtn: '下一步'
      },
      keySubmit: {
        title: '🎉 生成并复制',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">点击创建后，系统会生成完整的 API Key。</p><div style="padding: 8px 12px; background: #fee2e2; border-left: 3px solid #ef4444; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>⚠️ 重要提醒：</b><ul style="margin: 8px 0 0 16px;"><li>密钥只显示一次，请立即复制</li><li>丢失后需要重新生成</li><li>妥善保管，不要泄露给他人</li></ul></div><div style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>🚀 下一步：</b><ul style="margin: 8px 0 0 16px;"><li>复制生成的 sk-xxx 密钥</li><li>在支持 OpenAI 接口的客户端中使用</li><li>开始体验 AI 服务！</li></ul></div><p style="margin-top: 12px; color: #10b981; font-weight: 600;">👉 点击"创建"按钮</p></div>'
      }
    },
    // User tour steps
    user: {
      welcome: {
        title: '👋 欢迎使用 Sub2API',
        description:
          '<div style="line-height: 1.8;"><p style="margin-bottom: 16px;">您好！欢迎来到 Sub2API AI 服务平台。</p><p style="margin-bottom: 12px;"><b>🎯 快速开始：</b></p><ul style="margin-left: 20px; margin-bottom: 16px;"><li>🔑 创建 API 密钥</li><li>📋 复制密钥到您的应用</li><li>🚀 开始使用 AI 服务</li></ul><p style="color: #10b981; font-weight: 600;">只需 1 分钟，让我们开始吧 →</p></div>',
        nextBtn: '开始 🚀',
        prevBtn: '跳过'
      },
      keyManage: {
        title: '🔑 API 密钥管理',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">在这里管理您的所有 API 访问密钥。</p><p style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px;"><b>📌 什么是 API 密钥？</b><br/>API 密钥是您访问 AI 服务的凭证，就像一把钥匙，让您的应用能够调用 AI 能力。</p><p style="margin-top: 12px; color: #10b981; font-weight: 600;">👉 点击进入密钥页面</p></div>'
      },
      createKey: {
        title: '➕ 创建新密钥',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">点击按钮创建您的第一个 API 密钥。</p><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 提示：</b>创建后密钥只显示一次，请务必复制保存</p><p style="margin-top: 12px; color: #10b981; font-weight: 600;">👉 点击"创建密钥"</p></div>'
      },
      keyName: {
        title: '✏️ 密钥名称',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">为密钥起一个便于识别的名称。</p><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>💡 示例：</b>"我的第一个密钥"、"测试用" 等</p></div>',
        nextBtn: '下一步'
      },
      keyGroup: {
        title: '🎯 选择分组',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">选择管理员为您分配的服务分组。</p><p style="padding: 8px 12px; background: #eff6ff; border-left: 3px solid #3b82f6; border-radius: 4px; font-size: 13px;"><b>📌 分组说明：</b><br/>不同分组可能有不同的服务质量和计费标准，请根据需要选择。</p></div>',
        nextBtn: '下一步'
      },
      keySubmit: {
        title: '🎉 完成创建',
        description:
          '<div style="line-height: 1.7;"><p style="margin-bottom: 12px;">点击确认创建您的 API 密钥。</p><div style="padding: 8px 12px; background: #fee2e2; border-left: 3px solid #ef4444; border-radius: 4px; font-size: 13px; margin-bottom: 12px;"><b>⚠️ 重要：</b><ul style="margin: 8px 0 0 16px;"><li>创建后请立即复制密钥（sk-xxx）</li><li>密钥只显示一次，丢失需重新生成</li></ul></div><p style="padding: 8px 12px; background: #f0fdf4; border-left: 3px solid #10b981; border-radius: 4px; font-size: 13px;"><b>🚀 如何使用：</b><br/>将密钥配置到支持 OpenAI 接口的任何客户端（如 ChatBox、OpenCat 等），即可开始使用！</p><p style="margin-top: 12px; color: #10b981; font-weight: 600;">👉 点击"创建"按钮</p></div>'
      }
    }
  },

  // Sora 创作
  sora: {
    title: 'Sora 创作',
    description: '使用 Sora AI 生成视频与图片',
    notEnabled: '功能未开放',
    notEnabledDesc: '管理员尚未启用 Sora 创作功能，请联系管理员开通。',
    tabGenerate: '生成',
    tabLibrary: '作品库',
    noActiveGenerations: '暂无生成任务',
    startGenerating: '在下方输入提示词，开始创作',
    storage: '存储',
    promptPlaceholder: '描述你想创作的内容...',
    generate: '生成',
    generating: '生成中...',
    selectModel: '选择模型',
    statusPending: '等待中',
    statusGenerating: '生成中',
    statusCompleted: '已完成',
    statusFailed: '失败',
    statusCancelled: '已取消',
    cancel: '取消',
    delete: '删除',
    save: '保存到云端',
    saved: '已保存',
    retry: '重试',
    download: '下载',
    justNow: '刚刚',
    minutesAgo: '{n} 分钟前',
    hoursAgo: '{n} 小时前',
    noSavedWorks: '暂无保存的作品',
    saveWorksHint: '生成完成后，将作品保存到作品库',
    filterAll: '全部',
    filterVideo: '视频',
    filterImage: '图片',
    confirmDelete: '确定删除此作品？',
    loading: '加载中...',
    loadMore: '加载更多',
    noStorageWarningTitle: '未配置存储',
    noStorageWarningDesc: '生成的内容仅通过上游临时链接提供，约 15 分钟后过期。建议管理员配置 S3 存储。',
    mediaTypeVideo: '视频',
    mediaTypeImage: '图片',
    notificationCompleted: '生成完成',
    notificationFailed: '生成失败',
    notificationCompletedBody: '您的 {model} 任务已完成',
    notificationFailedBody: '您的 {model} 任务失败了',
    upstreamExpiresSoon: '即将过期',
    upstreamExpired: '链接已过期',
    upstreamCountdown: '剩余 {time}',
    previewTitle: '作品预览',
    closePreview: '关闭',
    beforeUnloadWarning: '您有未保存的生成内容，确定要离开吗？',
    downloadTitle: '下载生成内容',
    downloadExpirationWarning: '此链接约 15 分钟后过期，请尽快下载保存。',
    downloadNow: '立即下载',
    referenceImage: '参考图',
    removeImage: '移除',
    imageTooLarge: '图片大小不能超过 20MB',
    // Sora 暗色主题新增
    welcomeTitle: '将你的想象力变成视频',
    welcomeSubtitle: '输入一段描述，Sora 将为你创作逼真的视频或图片。尝试以下示例开始创作。',
    queueTasks: '个任务',
    queueWaiting: '队列中等待',
    waiting: '等待中',
    waited: '已等待',
    errorCategory: '内容策略限制',
    savedToCloud: '已保存到云端',
    downloadLocal: '本地下载',
    canDownload: '可下载',
    regenrate: '重新生成',
    regenerate: '重新生成',
    creatorPlaceholder: '描述你想要生成的视频或图片...',
    videoModels: '视频模型',
    imageModels: '图片模型',
    noStorageConfigured: '存储未配置',
    selectCredential: '选择凭证',
    apiKeys: 'API 密钥',
    subscriptions: '订阅',
    subscription: '订阅',
    noCredentialHint: '请先创建 API Key 或联系管理员分配订阅',
    uploadReference: '上传参考图片',
    generatingCount: '正在生成 {current}/{max}',
    noStorageToastMessage: '管理员未开通云存储，生成完成后请使用"本地下载"保存文件，否则将会丢失。',
    galleryCount: '共 {count} 个作品',
    galleryEmptyTitle: '还没有任何作品',
    galleryEmptyDesc: '你的创作成果将会展示在这里。前往生成页，开始你的第一次创作吧。',
    startCreating: '开始创作',
    yesterday: '昨天',
    landscape: '横屏',
    portrait: '竖屏',
    square: '方形',
    examplePrompt1: '一只金色的柴犬在东京涩谷街头散步，镜头跟随，电影感画面，4K 高清',
    examplePrompt2: '无人机航拍视角，冰岛极光下的冰川湖面反射绿色光芒，慢速推进',
    examplePrompt3: '赛博朋克风格的未来城市，霓虹灯倒映在雨后积水中，夜景，电影级色彩',
    examplePrompt4: '水墨画风格，一叶扁舟在山水间漂泊，薄雾缭绕，中国古典意境'
  }
}
