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: '加载中...',
    submitting: '提交中...',
    justNow: '刚刚',
    save: '保存',
    saved: '保存成功',
    deleted: '删除成功',
    cancel: '取消',
    delete: '删除',
    edit: '编辑',
    create: '创建',
    update: '更新',
    confirm: '确认',
    reset: '重置',
    search: '搜索',
    filter: '筛选',
    export: '导出',
    import: '导入',
    actions: '操作',
    status: '状态',
    name: '名称',
    email: '邮箱',
    password: '密码',
    submit: '提交',
    back: '返回',
    next: '下一步',
    yes: '是',
    no: '否',
    all: '全部',
    none: '无',
    selectAll: '全选',
    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: '刷新',
    view: '查看',
    settings: '设置',
    chooseFile: '选择文件',
    copy: '复制',
    notAvailable: '不可用',
    now: '现在',
    today: '今天',
    tomorrow: '明天',
    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: '分组管理',
    channels: '渠道管理',
    availableChannels: '可用渠道',
    subscriptions: '订阅管理',
    accounts: '账号管理',
    proxies: 'IP管理',
    redeemCodes: '兑换码',
    ops: '运维监控',
    promoCodes: '优惠码',
    settings: '系统设置',
    myAccount: '我的账户',
    lightMode: '浅色模式',
    darkMode: '深色模式',
    collapse: '收起',
    expand: '展开',
    logout: '退出登录',
    github: 'GitHub',
    mySubscriptions: '我的订阅',
    buySubscription: '充值/订阅',
    docs: '文档',
    myOrders: '我的订单',
    orderManagement: '订单管理',
    paymentDashboard: '支付概览',
    paymentConfig: '支付配置',
    paymentPlans: '订阅套餐',
    channelManagement: '渠道管理',
    channelPricing: '渠道定价',
    channelMonitor: '渠道监控',
    channelStatus: '渠道状态',
  },

  // 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: '发送中...',
    sendCode: '发送验证码',
    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: '邀请码无效，请检查后重试',
    oauthOrContinue: '或使用邮箱密码继续',
    linuxdo: {
      signIn: '使用 Linux.do 登录',
      orContinue: '或使用邮箱密码继续',
      callbackTitle: '正在完成登录',
      callbackProcessing: '正在验证登录信息，请稍候...',
      callbackHint: '如果页面未自动跳转，请返回登录页重试。',
      callbackMissingToken: '登录信息缺失，请返回重试。',
      backToLogin: '返回登录',
      invitationRequired: '该 Linux.do 账号尚未注册，站点已开启邀请码注册，请输入邀请码以完成注册。',
      invalidPendingToken: '注册凭证已失效，请重新使用 Linux.do 登录。',
      completeRegistration: '完成注册',
      completing: '正在完成注册...',
      completeRegistrationFailed: '注册失败，请检查邀请码后重试。'
    },
    oidc: {
      signIn: '使用 {providerName} 登录',
      callbackTitle: '正在完成 {providerName} 登录',
      callbackProcessing: '正在验证 {providerName} 登录信息，请稍候...',
      callbackHint: '如果页面未自动跳转，请返回登录页重试。',
      callbackMissingToken: '登录信息缺失，请返回重试。',
      backToLogin: '返回登录',
      invitationRequired: '该 {providerName} 账号尚未注册，站点已开启邀请码注册，请输入邀请码以完成注册。',
      invalidPendingToken: '注册凭证已失效，请重新登录。',
      completeRegistration: '完成注册',
      completing: '正在完成注册...',
      completeRegistrationFailed: '注册失败，请检查邀请码后重试。'
    },
    oauthFlow: {
      profileDetailsTitle: '使用 {providerName} 资料',
      profileDetailsDescription: '选择是否将 {providerName} 的昵称或头像应用到当前账户。',
      useDisplayName: '使用昵称',
      useAvatar: '使用头像',
      avatarAlt: '{providerName} 头像',
      reviewProfileBeforeContinue: '请先确认 {providerName} 资料后再继续。',
      chooseHowToContinue: '选择后续操作',
      chooseAccountActionHint: '请选择绑定已有账户，或创建一个新账户。',
      suggestedEmail: '建议邮箱：{email}',
      bindExistingAccount: '绑定已有账户',
      createNewAccount: '创建新账户',
      createAccountHint: '请输入邮箱地址以创建账户并继续。',
      bindLoginHint: '登录一个已有账户以绑定此次 {providerName} 登录。',
      signInThenBindDescription: '请先登录已有账户，再将此次 {providerName} 登录绑定到该账户。',
      bindSignInToExistingAccount: '将此次 {providerName} 登录绑定到已有账户。',
      bindCurrentAccountTitle: '绑定当前账户',
      bindCurrentAccountDescription: '将此次 {providerName} 登录绑定到当前浏览器已登录的账户。',
      bindCurrentAccount: '绑定当前账户',
      logInAndBind: '登录并绑定',
      useDifferentEmail: '使用其他邮箱',
      backToOptions: '返回选项',
      yourAccount: '当前账户',
      totpHint: '请输入 {account} 的 6 位验证码，以完成此次 {providerName} 登录绑定。',
      verifyAndContinue: '验证并继续',
      wechatAvailabilityUnknown: '暂时无法确认微信登录可用性，请刷新后重试。',
      wechatSystemBrowserOnly: '当前微信登录流程仅支持在系统浏览器中继续。',
      wechatBrowserOnly: '当前微信登录流程仅支持在微信内置浏览器中继续。',
      wechatNotConfigured: '微信登录尚未配置。'
    },
    linuxdoCallbackPageTitle: 'LinuxDo 登录回调',
    oidcCallbackPageTitle: 'OIDC 登录回调',
    oauthCallbackPageTitle: 'OAuth 回调',
    wechatProviderName: '微信',
    wechatCallbackPageTitle: '微信登录回调',
    wechatPaymentCallbackPageTitle: '微信支付回调',
    wechatPayment: {
      callbackTitle: '正在恢复微信支付',
      callbackProcessing: '正在恢复微信支付...',
      backToPayment: '返回支付页',
      callbackMissingResumeToken: '微信支付回调缺少恢复令牌。'
    },
    oauth: {
      callbackTitle: 'OAuth 回调',
      callbackHint: '按需将授权码和状态值复制回后台授权流程。',
      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...',
    endpoints: {
      title: 'API 端点',
      default: '默认',
      copied: '已复制',
      copiedHint: '已复制到剪贴板',
      clickToCopy: '点击可复制此端点',
      speedTest: '测速',
    },
    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: '实际',
    accountCost: '成本',
    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',
    unitPrice: '单次价格',
    imageUnitPrice: '单张价格',
    cacheRead: '读取',
    cacheWrite: '写入',
    serviceTier: '服务档位',
    serviceTierPriority: 'Fast',
    serviceTierFlex: 'Flex',
    serviceTierStandard: 'Standard',
    rate: '倍率',
    original: '原始',
    billed: '计费',
    noRecords: '未找到使用记录，请尝试调整筛选条件。',
    failedToLoad: '加载使用记录失败',
    noDataToExport: '没有可导出的数据',
    exportSuccess: '使用数据导出成功',
    exportFailed: '使用数据导出失败',
    exportExcelSuccess: '使用数据导出成功（Excel格式）',
    exportExcelFailed: '使用数据导出失败',
    imageUnit: '张',
    userAgent: 'User-Agent'
  },

  // Shared keys for channel monitor (admin + user views)
  monitorCommon: {
    status: {
      operational: '正常',
      degraded: '降级',
      failed: '失败',
      error: '错误',
      unknown: '-'
    },
    providers: {
      openai: 'OpenAI',
      anthropic: 'Anthropic',
      gemini: 'Gemini'
    },
    extraModelsHeader: '附加模型',
    extraModelsEmpty: '无附加模型',
    latencyEmpty: '-',
    availabilityPrefix: '可用性',
    dialogLatency: '对话延迟',
    endpointPing: '端点 PING',
    history60pts: '近 {n} 次记录',
    nextUpdateIn: '{n}s 后刷新',
    past: 'PAST',
    now: 'NOW',
    maintenancePaused: '维护中 · 已暂停时间线采集',
    extraModelsCount: '+ {n} 模型',
    pollEvery: '{n}s 轮询',
    updatedAt: '更新于 {time}',
    relativeSecondsAgo: '{n} 秒前',
    relativeMinutesAgo: '{n} 分钟前',
    relativeHoursAgo: '{n} 小时前',
    relativeDaysAgo: '{n} 天前'
  },

  // Channel Status (user-facing read-only view)
  channelStatus: {
    title: '渠道状态',
    description: '查看渠道可用性、延迟和近期状态',
    searchPlaceholder: '搜索渠道...',
    allProviders: '全部供应商',
    loadError: '加载渠道状态失败',
    detailLoadError: '加载渠道详情失败',
    detailTitle: '渠道详情',
    closeDetail: '关闭',
    windowTab: {
      '7d': '7 天',
      '15d': '15 天',
      '30d': '30 天'
    },
    overall: {
      operational: 'OPERATIONAL',
      degraded: 'DEGRADED',
      unavailable: 'UNAVAILABLE'
    },
    columns: {
      name: '名称',
      provider: '供应商',
      groupName: '分组',
      primaryModel: '主模型',
      availability7d: '7 天可用率',
      latency: '延迟 (ms)'
    },
    detailColumns: {
      model: '模型',
      latestStatus: '最新状态',
      latestLatency: '最新延迟 (ms)',
      availability7d: '7 天可用率',
      availability15d: '15 天可用率',
      availability30d: '30 天可用率',
      avgLatency7d: '7 天平均延迟 (ms)'
    },
    empty: {
      title: '暂无可显示的渠道',
      description: '管理员尚未配置可监控的渠道。'
    }
  },

  // Available Channels (user-facing)
  availableChannels: {
    title: '可用渠道',
    description: '查看您可访问的渠道与其支持的模型、定价',
    searchPlaceholder: '搜索渠道或模型...',
    empty: '暂无可用渠道',
    noModels: '未配置模型',
    noPricing: '未配置定价',
    exclusive: '专属',
    public: '公开',
    exclusiveTooltip: '管理员授权给你的专属分组',
    publicTooltip: '对所有用户公开的分组',
    columns: {
      name: '渠道名',
      description: '描述',
      platform: '平台',
      groups: '我可访问的分组',
      supportedModels: '支持模型'
    },
    pricing: {
      billingMode: '计费模式',
      billingModeToken: '按 Token',
      billingModePerRequest: '按次',
      billingModeImage: '按图片',
      inputPrice: '输入',
      outputPrice: '输出',
      cacheWritePrice: '缓存写入',
      cacheReadPrice: '缓存读取',
      imageOutputPrice: '图片输出',
      perRequestPrice: '每次请求',
      intervals: '阶梯定价',
      unitPerMillion: '/ 1M token',
      unitPerRequest: '/ 次'
    }
  },

  // 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: '并发限制',
    rpmLimit: 'RPM 限制',
    rpmUnlimited: '不限制',
    memberSince: '注册时间',
    overviewTitle: '账户总览',
    overviewDescription: '快速查看账号状态、资料来源与常用设置。',
    basicsTitle: '资料与头像',
    basicsDescription: '维护公开展示信息，并保持头像与昵称风格一致。',
    linkedProfileSources: '资料来源',
    linkedProfileSourcesDescription: '部分头像和昵称可能同步自第三方登录方式。',
    securityTitle: '安全设置',
    securityDescription: '密码、双因素认证和通知提醒集中放在右侧。',
    administrator: '管理员',
    user: '用户',
    username: '用户名',
    email: '邮箱',
    status: '状态',
    role: '角色',
    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: '发送验证码失败'
    },
    balanceNotify: {
      title: '余额不足提醒',
      description: '当账户余额低于阈值时发送邮件提醒',
      enabled: '启用余额不足提醒',
      threshold: '自定义提醒阈值',
      thresholdHint: '留空使用系统默认值',
      thresholdPlaceholder: '输入金额',
      systemDefault: '系统默认值',
      extraEmails: '通知邮箱',
      extraEmailsHint: '必须添加并验证邮箱后，余额不足时才能收到提醒邮件',
      primaryEmail: '主邮箱',
      noExtraEmails: '暂无额外通知邮箱',
      enterEmail: '输入邮箱地址',
      addEmail: '添加邮箱',
      emailPlaceholder: '输入邮箱地址',
      sendCode: '发送验证码',
      resend: '重发',
      codeSent: '验证码已发送',
      codeSentTo: '验证码已发送到 {email}',
      enterCode: '输入验证码',
      codePlaceholder: '6位验证码',
      verify: '验证',
      emailAdded: '邮箱已添加',
      emailRemoved: '邮箱已移除',
      verifySuccess: '邮箱添加成功',
      removeEmail: '移除',
      removeSuccess: '邮箱已移除',
      emailDuplicate: '该邮箱已存在',
      maxEmailsReached: '已达到通知邮箱数量上限',
      unverified: '未验证',
      verified: '已验证',
    },
    avatar: {
      title: '资料头像',
      description: '仅支持上传头像图片；静态图片会自动压缩到 20KB 以内后再保存。',
      uploadAction: '上传图片',
      uploadHint: '上传图片时会自动压缩静态图片到 20KB 以内，GIF 需自行控制在 20KB 以内',
      uploadRequired: '请先上传头像图片',
      saveSuccess: '头像已更新',
      deleteSuccess: '头像已删除',
      invalidType: '请选择图片文件',
      gifTooLarge: 'GIF 头像必须在 20KB 以内',
      compressTooLarge: '无法将图片压缩到 20KB 以内，请换一张更小的图片',
      compressFailed: '压缩所选图片失败',
      readFailed: '读取所选图片失败',
      emptyDeleteHint: '当前没有可删除的头像',
    },
    authBindings: {
      title: '登录方式绑定',
      description: '查看当前绑定状态，并将更多第三方登录方式关联到这个账号。',
      bindAction: '绑定 {providerName}',
      bindSuccess: '账号绑定成功',
      emailPlaceholder: '输入邮箱地址',
      codePlaceholder: '输入验证码',
      passwordPlaceholder: '设置登录密码',
      replaceEmailPasswordPlaceholder: '输入当前密码',
      sendCodeAction: '发送验证码',
      manageEmailAction: '管理邮箱',
      hideEmailFormAction: '收起邮箱表单',
      confirmEmailBindAction: '绑定邮箱',
      confirmEmailReplaceAction: '更换主邮箱',
      codeSentTo: '验证码已发送到 {email}',
      replaceSuccess: '主邮箱已更新',
      unbindAction: '解绑',
      unbindSuccess: '{providerName} 已解绑',
      boundCount: '已关联 {count} 条记录',
      status: {
        bound: '已绑定',
        notBound: '未绑定',
      },
      providers: {
        email: '邮箱',
        linuxdo: 'LinuxDo',
        oidc: '{providerName}',
        wechat: '微信',
      },
      notes: {
        emailManagedFromProfile: '主邮箱在资料表单中管理',
        canUnbind: '你可以解绑这个登录方式。',
        bindAnotherBeforeUnbind: '请先绑定其他登录方式，再解除当前绑定。',
      },
      source: {
        avatar: '头像当前来自 {providerName}',
        username: '昵称当前来自 {providerName}',
      },
    }
  },

  // 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: '标准',
      accountCost: '成本',
      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: '用户',
        id: 'ID',
        email: '邮箱',
        username: '用户名',
        notes: '备注',
        role: '角色',
        groups: '分组',
        subscriptions: '订阅分组',
        balance: '余额',
        usage: '用量',
        concurrency: '并发数',
        status: '状态',
        lastActive: '最后活跃时间',
        lastUsed: '最后使用时间',
        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: '选择状态',
        rpmLimit: '每分钟请求数 (RPM)',
        rpmLimitPlaceholder: '0 表示不限制',
        rpmLimitHint: '该用户每分钟最大请求数，0 = 不限制；仅在所用分组未设置 rpm_limit 时作为兜底生效'
      },
      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: '费率倍数',
        rpmOverride: 'RPM 覆盖',
        rpmOverrideHint: '该用户在此分组的 RPM 上限；留空 = 使用分组默认；0 = 不限制',
        rateDefault: '默认',
        rpmDefault: '默认',
        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 = 双倍',
        rpmLimit: '每分钟请求数 (RPM)',
        rpmLimitPlaceholder: '0 表示不限制',
        rpmLimitHint: '每用户在本分组每分钟最大请求数，0 = 不限制；一旦设置即接管该用户的限流（覆盖用户级 rpm_limit）',
        exclusiveLabel: '专属分组',
        exclusiveHint: '专属分组，可以手动指定给用户',
        platformLabel: '平台限制',
        platformPlaceholder: '选择平台（留空则不限制）',
        accountsLabel: '指定账号',
        accountsPlaceholder: '选择账号（留空则不限制）',
        priorityLabel: '优先级',
        priorityHint: '数值越小优先级越高，用于账号调度',
        statusLabel: '状态'
      },
      exclusiveObj: {
        yes: '是',
        no: '否'
      },
      exclusive: '专属',
      exclusiveHint: '专属分组，可以手动指定给特定用户',
      exclusiveTooltip: {
        title: '什么是专属分组？',
        description:
          '开启后，用户在创建 API Key 时将无法看到此分组。只有管理员手动将用户分配到此分组后，用户才能使用。',
        example: '使用场景：',
        exampleContent:
          '公开分组费率 0.8，您可以创建一个费率 0.7 的专属分组，手动分配给 VIP 用户，让他们享受更优惠的价格。'
      },
      rateMultiplierHint: '1.0 = 标准费率，0.5 = 半价，2.0 = 双倍',
      platforms: {
        all: '全部平台',
        anthropic: 'Anthropic',
        openai: 'OpenAI',
        gemini: 'Gemini',
        antigravity: 'Antigravity',
      },
      saving: '保存中...',
      noGroups: '暂无分组',
      noGroupsDescription: '创建分组以更好地管理 API 密钥和费率。',
      groupCreatedSuccess: '分组创建成功',
      groupUpdatedSuccess: '分组更新成功',
      groupDeletedSuccess: '分组删除成功',
      failedToLoad: '加载分组列表失败',
      failedToSave: '保存分组失败',
      failedToDelete: '删除分组失败',
      allPlatforms: '全部平台',
      allStatus: '全部状态',
      allGroups: '全部分组',
      exclusiveFilter: '专属',
      nonExclusive: '公开',
      public: '公开',
      rateAndAccounts: '{rate}x 费率 · {count} 个账号',
      accountsCount: '{count} 个账号',
      enterGroupName: '请输入分组名称',
      optionalDescription: '可选描述',
      platformHint: '选择此分组关联的平台',
      platformNotEditable: '创建后不可更改平台',
      noGroupsYet: '暂无分组',
      createFirstGroup: '创建您的第一个分组来组织 API 密钥。',
      creating: '创建中...',
      updating: '更新中...',
      limitDay: '日',
      limitWeek: '周',
      limitMonth: '月',
      groupCreated: '分组创建成功',
      groupUpdated: '分组更新成功',
      groupDeleted: '分组删除成功',
      failedToCreate: '创建分组失败',
      failedToUpdate: '更新分组失败',
      nameRequired: '请输入分组名称',
      rateMultipliers: '专属倍率',
      rateMultipliersTitle: '分组专属倍率管理',
      addUserRate: '添加用户专属倍率',
      rpmOverrides: '专属 RPM',
      rpmOverridesTitle: '分组专属 RPM 管理',
      addUserRpm: '添加用户专属 RPM',
      noRpmOverrides: '暂无用户设置了专属 RPM',
      rpmSaved: '专属 RPM 已保存',
      groupRpmDefault: '分组默认 RPM',
      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: '配置图片生成模型的图片生成价格，留空则使用默认价格'
      },
      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 端点调度请求',
        familyMappingTitle: '系列默认映射',
        familyMappingHint: '当请求命中 Opus、Sonnet、Haiku 系列时，会优先使用这里配置的目标模型。',
        opusModel: 'Opus 映射模型',
        opusModelPlaceholder: '例如: gpt-5.4',
        sonnetModel: 'Sonnet 映射模型',
        sonnetModelPlaceholder: '例如: gpt-5.3-codex',
        haikuModel: 'Haiku 映射模型',
        haikuModelPlaceholder: '例如: gpt-5.4-mini',
        exactMappingTitle: '精确模型覆盖',
        exactMappingHint: '精确 Claude 模型覆盖优先级高于系列默认映射，可将某个具体 Claude 模型单独映射到不同的目标模型。',
        noExactMappings: '暂无精确模型覆盖规则',
        addExactMapping: '添加精确映射',
        claudeModel: 'Claude 模型',
        claudeModelPlaceholder: '例如: claude-sonnet-4-5-20250929',
        targetModel: '目标模型',
        targetModelPlaceholder: '例如: gpt-5.4',
        removeExactMapping: '删除精确映射'
      },
      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: '至少选择一个模型系列'
      }
    },

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

    // Channel Management
    channels: {
      title: '渠道管理',
      description: '管理渠道和自定义模型定价',
      searchChannels: '搜索渠道...',
      createChannel: '创建渠道',
      editChannel: '编辑渠道',
      deleteChannel: '删除渠道',
      statusActive: '启用',
      statusDisabled: '停用',
      allStatus: '全部状态',
      groupsUnit: '个分组',
      pricingUnit: '条定价',
      noChannelsYet: '暂无渠道',
      createFirstChannel: '创建第一个渠道来管理模型定价',
      loadError: '加载渠道列表失败',
      createSuccess: '渠道创建成功',
      updateSuccess: '渠道更新成功',
      deleteSuccess: '渠道删除成功',
      createError: '创建渠道失败',
      updateError: '更新渠道失败',
      deleteError: '删除渠道失败',
      nameRequired: '请输入渠道名称',
      duplicateModels: '模型「{0}」在多个定价条目中重复',
      modelConflict: "模型模式 '{model1}' 和 '{model2}' 冲突：匹配范围重叠",
      mappingConflict: "模型映射源 '{model1}' 和 '{model2}' 冲突：匹配范围重叠",
      deleteConfirm: '确定要删除渠道「{name}」吗？此操作不可撤销。',
      columns: {
        name: '名称',
        description: '描述',
        status: '状态',
        groups: '分组',
        pricing: '定价',
        createdAt: '创建时间',
        actions: '操作'
      },
      billingMode: {
        token: 'Token',
        perRequest: '按次',
        image: '图片（按次）'
      },
      form: {
        name: '名称',
        namePlaceholder: '输入渠道名称',
        description: '描述',
        descriptionPlaceholder: '可选描述',
        status: '状态',
        groups: '关联分组',
        noGroupsAvailable: '暂无可用分组',
        inOtherChannel: '已属于「{name}」',
        modelPricing: '模型定价',
        models: '模型列表',
        modelsPlaceholder: '输入完整模型名后按回车添加',
        modelInputHint: '按回车添加，支持粘贴批量导入',
        billingMode: '计费模式',
        defaultPrices: '默认价格（未命中区间时使用）',
        inputPrice: '输入',
        outputPrice: '输出',
        cacheWritePrice: '缓存写入',
        cacheReadPrice: '缓存读取',
        imageTokenPrice: '图片输出',
        imageOutputPrice: '图片输出价格',
        pricePlaceholder: '默认',
        intervals: '上下文区间定价（可选）',
        addInterval: '添加区间',
        requestTiers: '按次计费层级',
        imageTiers: '图片计费层级（按次）',
        addTier: '添加层级',
        noTiersYet: '暂无层级，点击添加配置按次计费价格',
        noPricingRules: '暂无定价规则，点击"添加"创建',
        perRequestPrice: '单次价格',
        perRequestPriceRequired: '按次/图片计费模式必须设置默认价格或至少一个计费层级',
        tierLabel: '层级',
        resolution: '分辨率',
        modelMapping: '模型映射',
        modelMappingHint: '将请求中的模型名映射为实际模型名。在账号级别映射之前执行。',
        noMappingRules: '暂无映射规则，点击"添加"创建',
        mappingSource: '源模型',
        mappingTarget: '目标模型',
        billingModelSource: '计费基准',
        billingModelSourceChannelMapped: '以渠道映射后的模型计费',
        billingModelSourceRequested: '以请求模型计费',
        billingModelSourceUpstream: '以最终模型计费',
        billingModelSourceHint: '控制使用哪个模型名称进行定价查找',
        selectedCount: '已选 {count} 个',
        searchGroups: '搜索分组...',
        noGroupsMatch: '没有匹配的分组',
        restrictModels: '限制模型',
        restrictModelsHint: '开启后，仅允许模型定价列表中的模型。不在列表中的模型请求将被拒绝。',
        defaultPerRequestPrice: '默认单次价格（未命中层级时使用）',
        defaultImagePrice: '默认图片价格（未命中层级时使用）',
        platformConfig: '平台配置',
        webSearchEmulation: 'Web Search 模拟',
        webSearchEmulationHint: '⚠️ 开启后该渠道下所有 Anthropic 分组的账号将自动拦截 web_search 请求，请谨慎操作',
        webSearchEmulationGlobalDisabled: '请先在系统设置 → 网关 → Web Search 模拟中启用全局开关',
        basicSettings: '基础设置',
        addPlatform: '添加平台',
        noPlatforms: '点击"添加平台"开始配置渠道',
        mappingCount: '条映射',
        pricingEntry: '定价配置',
        noModels: '未添加模型',
        applyPricingToAccountStats: '应用模型定价到账号统计',
        applyPricingToAccountStatsDesc: '启用后，未被自定义规则匹配的请求将使用模型定价文件中的标准价格计算账号统计费用',
        accountStatsPricingRules: '自定义账号统计定价规则',
        addRule: '添加规则',
        noRulesConfigured: '未配置自定义规则，将使用上方的模型定价。',
        ruleName: '规则名称（可选）',
        ruleGroups: '分组',
        ruleAccounts: '账号',
        searchAccountPlaceholder: '搜索账号...',
        ruleAccountsHint: '留空表示匹配所有账号',
        ruleModelPricing: '模型定价',
        noGroupsInChannel: '上方平台标签页中未选择分组',
        unnamed: '未命名'
      }
    },

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

    // Subscriptions Management
    subscriptions: {
      title: '订阅管理',
      description: '管理用户订阅和配额限制',
      assignSubscription: '分配订阅',
      adjustSubscription: '调整订阅',
      revokeSubscription: '撤销订阅',
      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: '操作'
      },
      allPrivacyModes: '全部Privacy状态',
      privacyUnset: '未设置',
      privacyTrainingOff: '已关闭训练数据共享',
      privacyCfBlocked: '被 Cloudflare 拦截，训练可能仍开启',
      privacyFailed: '关闭训练数据共享失败',
      privacyAntigravitySet: '已关闭遥测和营销邮件',
      privacyAntigravityFailed: '隐私设置失败',
      setPrivacy: '设置隐私',
      subscriptionAbnormal: '异常',
      subscriptionExpires: '到期',
      // 容量状态提示
      capacity: {
        windowCost: {
          blocked: '5h窗口费用超限，账号暂停调度',
          stickyOnly: '5h窗口费用达阈值，仅允许粘性会话',
          normal: '5h窗口费用正常'
        },
        sessions: {
          full: '活跃会话已满，新会话需等待（空闲超时：{idle}分钟）',
          normal: '活跃会话正常（空闲超时：{idle}分钟）'
        },
        rpm: {
          full: '已达 RPM 上限',
          warning: 'RPM 接近上限',
          normal: 'RPM 正常',
          tieredNormal: 'RPM 限制 (三区模型) - 正常',
          tieredWarning: 'RPM 限制 (三区模型) - 接近阈值',
          tieredStickyOnly: 'RPM 限制 (三区模型) - 仅粘性会话 | 缓冲区: {buffer}',
          tieredBlocked: 'RPM 限制 (三区模型) - 已阻塞 | 缓冲区: {buffer}',
          stickyExemptNormal: 'RPM 限制 (粘性豁免) - 正常',
          stickyExemptWarning: 'RPM 限制 (粘性豁免) - 接近阈值',
          stickyExemptOver: 'RPM 限制 (粘性豁免) - 超限，仅粘性会话'
        },
        quota: {
          exceeded: '配额已用完，账号暂停调度',
          normal: '配额正常'
        },
      },
      clearRateLimit: '清除速率限制',
      resetQuota: '重置配额',
      quotaLimit: '配额限制',
      quotaLimitPlaceholder: '0 表示不限制',
      quotaLimitHint: '设置日/周/总使用额度（美元），任一维度达到限额后账号暂停调度。Anthropic API Key 账号还可配置客户端亲和。修改限额不会重置已用额度。',
      quotaLimitToggle: '启用配额限制',
      quotaLimitToggleHint: '开启后，当账号用量达到设定额度时自动暂停调度',
      quotaDailyLimit: '日限额',
      quotaDailyLimitHint: '从首次使用起每 24 小时自动重置。',
      quotaWeeklyLimit: '周限额',
      quotaWeeklyLimitHint: '从首次使用起每 7 天自动重置。',
      quotaTotalLimit: '总限额',
      quotaTotalLimitHint: '累计消费上限，不会自动重置 — 使用「重置配额」手动清零。',
      quotaResetMode: '重置方式',
      quotaResetModeRolling: '滚动窗口',
      quotaResetModeFixed: '固定时间',
      quotaResetHour: '重置时间',
      quotaWeeklyResetDay: '重置日',
      quotaResetTimezone: '重置时区',
      quotaDailyLimitHintFixed: '每天 {hour}:00（{timezone}）重置。',
      quotaWeeklyLimitHintFixed: '每{day} {hour}:00（{timezone}）重置。',
      dayOfWeek: {
        monday: '周一',
        tuesday: '周二',
        wednesday: '周三',
        thursday: '周四',
        friday: '周五',
        saturday: '周六',
        sunday: '周日',
      },
      quotaLimitAmount: '总限额',
      quotaLimitAmountHint: '累计消费上限，不会自动重置。',
      quotaNotify: {
        alert: '提醒阈值',
        enabled: '启用告警',
        threshold: '告警金额',
        thresholdPlaceholder: '输入百分比',
      },
      testConnection: '测试连接',
      reAuthorize: '重新授权',
      refreshToken: '刷新令牌',
      noAccountsYet: '暂无账号',
      createFirstAccount: '添加 AI 平台账号以开始使用 API 网关。',
      tokenRefreshed: 'Token 刷新成功',
      accountDeleted: '账号删除成功',
      rateLimitCleared: '速率限制已清除',
      setupToken: 'Setup Token',
      apiKey: 'API Key',
      deleteConfirm: "确定要删除账号 '{name}' 吗？此操作无法撤销。",
      failedToClearRateLimit: '清除速率限制失败',
      platforms: {
        claude: 'Claude',
        openai: 'OpenAI',
        anthropic: 'Anthropic',
        gemini: 'Gemini',
        antigravity: 'Antigravity',
      },
      types: {
        oauth: 'OAuth',
        chatgptOauth: 'ChatGPT OAuth',
        responsesApi: 'Responses API',
        googleOauth: 'Google OAuth',
        codeAssist: 'Code Assist',
        antigravityOauth: 'Antigravity OAuth',
        antigravityApikey: '通过 Base URL + API Key 连接',
        upstream: '对接上游',
        upstreamDesc: '通过 Base URL + API Key 连接上游',
        api_key: 'API Key',
        cookie: 'Cookie'
      },
      status: {
        active: '正常',
        inactive: '停用',
        error: '错误',
        cooldown: '冷却中',
        paused: '暂停',
        limited: '限流',
        rateLimited: '限流中',
        overloaded: '过载中',
        tempUnschedulable: '临时不可调度',
        quotaExceeded: '配额超限',
        unschedulable: '不可调度',
        rateLimitedUntil: '限流中，当前不参与调度，预计 {time} 自动恢复',
        rateLimitedAutoResume: '{time} 自动恢复',
        modelRateLimitedUntil: '{model} 限流至 {time}',
        modelCreditOveragesUntil: '{model} 正在使用 AI Credits，至 {time}',
        creditsExhausted: '积分已用尽',
        creditsExhaustedUntil: 'AI Credits 已用尽，预计 {time} 恢复',
        overloadedUntil: '负载过重，重置时间：{time}',
        viewTempUnschedDetails: '查看临时不可调度详情'
      },
      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: '已开启自动透传：模型白名单/映射不会生效。',
      },
      anthropic: {
        apiKeyPassthrough: '自动透传（仅替换认证）',
        apiKeyPassthroughDesc:
          '仅对 Anthropic API Key 生效。开启后，messages/count_tokens 请求将透传上游并仅替换认证，保留计费/并发/审计及必要安全过滤；关闭即可回滚到现有兼容链路。',
        webSearchEmulation: 'Web Search 模拟',
        webSearchEmulationDesc:
          '为该 API Key 账号启用 web search 模拟。客户端发送纯 web_search 请求时，由网关调用第三方搜索 API 并构造响应返回。默认跟随渠道配置。',
        webSearchDefault: '默认',
        webSearchEnabled: '开启',
        webSearchDisabled: '关闭',
      },
      modelRestriction: '模型限制（可选）',
      modelWhitelist: '模型白名单',
      modelMapping: '模型映射',
      selectAllowedModels: '选择允许的模型。留空则支持所有模型。',
      mapRequestModels: '将请求模型映射到实际模型。左边是请求的模型，右边是发送到 API 的实际模型。',
      selectedModels: '已选择 {count} 个模型',
      supportsAllModels: '（支持所有模型）',
      requestModel: '请求模型',
      actualModel: '实际模型',
      addMapping: '添加映射',
      mappingExists: '模型 {model} 的映射已存在',
      wildcardOnlyAtEnd: '通配符 * 只能放在末尾',
      targetNoWildcard: '目标模型不能包含通配符 *',
      searchModels: '搜索模型...',
      noMatchingModels: '没有匹配的模型',
      fillRelatedModels: '填入相关模型',
      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 指纹',
          defaultProfile: '内置默认',
          randomProfile: '随机'
        },
        sessionIdMasking: {
          label: '会话 ID 伪装',
          hint: '启用后将在 15 分钟内固定 metadata.user_id 中的 session ID，使上游认为请求来自同一会话'
        },
        cacheTTLOverride: {
          label: '缓存 TTL 强制替换',
          hint: '将所有缓存创建 token 强制按指定的 TTL 类型（5分钟或1小时）计费',
          target: '目标 TTL',
          targetHint: '选择计费使用的 TTL 类型'
        },
        customBaseUrl: {
          label: '自定义转发地址',
          hint: '启用后将请求转发到自定义中继服务，代理地址将作为 URL 参数传递给中继服务',
          urlHint: '中继服务地址（如 https://relay.example.com）',
        },
        clientAffinity: {
          label: '客户端亲和调度',
          hint: '启用后，新会话会优先调度到该客户端之前使用过的账号，避免频繁切换账号'
        }
      },
      affinityNoClients: '无亲和客户端',
      affinityClients: '{count} 个亲和客户端：',
      affinitySection: '客户端亲和',
      affinitySectionHint: '控制客户端在账号间的分布。通过配置区域阈值来平衡负载。',
      affinityToggle: '启用客户端亲和',
      affinityToggleHint: '新会话优先调度到该客户端之前使用过的账号',
      affinityBase: '基础限额（绿区）',
      affinityBasePlaceholder: '留空表示不限制',
      affinityBaseHint: '绿区最大客户端数量（完整优先级调度）',
      affinityBaseOffHint: '未开启绿区限制，所有客户端均享受完整优先级调度',
      affinityBuffer: '缓冲区（黄区）',
      affinityBufferPlaceholder: '例如 3',
      affinityBufferHint: '黄区允许的额外客户端数量（降级优先级调度）',
      affinityBufferInfinite: '不限制',
      expired: '已过期',
      proxy: '代理',
      noProxy: '无代理',
      concurrency: '并发数',
      loadFactor: '负载因子',
      loadFactorHint: '提高负载因子可以提高对账号的调度频率',
      priority: '优先级',
      priorityHint: '优先级越小的账号优先使用',
      billingRateMultiplier: '账号计费倍率',
      billingRateMultiplierHint: '0 表示不计费，仅影响账号计费',
      expiresAt: '过期时间',
      expiresAtHint: '留空表示不过期',
      higherPriorityFirst: '数值越小优先级越高',
      mixedScheduling: '在 /v1/messages 中使用',
      mixedSchedulingHint: '启用后可参与 Anthropic/Gemini 分组的调度',
      mixedSchedulingTooltip:
        '！！注意！！ Antigravity Claude 和 Anthropic Claude 无法在同个上下文中使用，如果你同时有 Anthropic 账号和 Antigravity 账号，开启此选项会导致经常 400 报错。开启后，请用分组功能做好 Antigravity 账号和 Anthropic 账号的隔离。一定要弄明白再开启！！',
      aiCreditsBalance: 'AI Credits',
      allowOverages: '允许超量请求 (AI Credits)',
      allowOveragesTooltip:
        '仅在免费配额被明确判定为耗尽后才会使用 AI Credits。普通并发 429 限流不会切换到超量请求。',
      creating: '创建中...',
      updating: '更新中...',
      accountCreated: '账号创建成功',
      accountUpdated: '账号更新成功',
      failedToCreate: '创建账号失败',
      failedToUpdate: '更新账号失败',
      pleaseSelectStatus: '请选择有效的账号状态',
      mixedChannelWarningTitle: '混合渠道警告',
      mixedChannelWarning: '警告：分组 "{groupName}" 中同时包含 {currentPlatform} 和 {otherPlatform} 账号。混合使用不同渠道可能导致 thinking block 签名验证问题，会自动回退到非 thinking 模式。确定要继续吗？',
      pleaseEnterAccountName: '请输入账号名称',
      pleaseEnterApiKey: '请输入 API Key',
      bedrockAccessKeyId: 'AWS Access Key ID',
      bedrockSecretAccessKey: 'AWS Secret Access Key',
      bedrockSessionToken: 'AWS Session Token',
      bedrockRegion: 'AWS Region',
      bedrockRegionHint: '例如 us-east-1, us-west-2, eu-west-1',
      bedrockForceGlobal: '强制使用 Global 跨区域推理',
      bedrockForceGlobalHint: '启用后模型 ID 使用 global. 前缀（如 global.anthropic.claude-...），请求可路由到全球任意支持的区域，获得更高可用性',
      bedrockAccessKeyIdRequired: '请输入 AWS Access Key ID',
      bedrockSecretAccessKeyRequired: '请输入 AWS Secret Access Key',
      bedrockRegionRequired: '请选择 AWS Region',
      bedrockSessionTokenHint: '可选，用于临时凭证',
      bedrockSecretKeyLeaveEmpty: '留空以保持当前密钥',
      bedrockAuthMode: '认证方式',
      bedrockAuthModeSigv4: 'SigV4 签名',
      bedrockAuthModeApikey: 'Bedrock API Key',
      bedrockApiKeyLabel: 'Bedrock API Key',
      bedrockApiKeyDesc: 'Bearer Token 认证',
      bedrockApiKeyInput: 'API Key',
      bedrockApiKeyRequired: '请输入 Bedrock API Key',
      bedrockApiKeyLeaveEmpty: '留空以保持当前密钥',
      apiKeyIsRequired: 'API Key 是必需的',
      leaveEmptyToKeep: '留空以保持当前密钥',
      // Upstream type
      upstream: {
        baseUrl: '上游 Base URL',
        baseUrlHint: '上游 Antigravity 服务的地址，例如：https://cloudcode-pa.googleapis.com',
        apiKey: '上游 API Key',
        apiKeyHint: '上游服务的 API Key',
        pleaseEnterBaseUrl: '请输入上游 Base URL',
        pleaseEnterApiKey: '请输入上游 API Key'
      },
      // OAuth flow
      oauth: {
        title: 'Claude 账号授权',
        authMethod: '授权方式',
        manualAuth: '手动授权',
        cookieAutoAuth: 'Cookie 自动授权',
        cookieAutoAuthDesc: '使用 claude.ai sessionKey 自动完成 OAuth 授权，无需手动打开浏览器。',
        sessionKey: 'sessionKey',
        keysCount: '{count} 个密钥',
        batchCreateAccounts: '将批量创建 {count} 个账号',
        sessionKeyPlaceholder:
          '每行一个 sessionKey，例如：\nsk-ant-sid01-xxxxx...\nsk-ant-sid01-yyyyy...',
        sessionKeyPlaceholderSingle: 'sk-ant-sid01-xxxxx...',
        howToGetSessionKey: '如何获取 sessionKey',
        step1: '在浏览器中登录 claude.ai',
        step2: '按 F12 打开开发者工具',
        step3: '切换到 Application 标签',
        step4: '找到 Cookies → https://claude.ai',
        step5: '找到 sessionKey 所在行',
        step6: '复制 Value 列的值',
        sessionKeyFormat: 'sessionKey 通常以 sk-ant-sid01- 开头',
        startAutoAuth: '开始自动授权',
        authorizing: '授权中...',
        followSteps: '按照以下步骤授权您的 Claude 账号：',
        step1GenerateUrl: '点击下方按钮生成授权 URL',
        generateAuthUrl: '生成授权 URL',
        generating: '生成中...',
        regenerate: '重新生成',
        step2OpenUrl: '在浏览器中打开 URL 并完成授权',
        openUrlDesc: '在新标签页中打开授权 URL，登录您的 Claude 账号并授权。',
        proxyWarning: '注意：如果您配置了代理，请确保浏览器使用相同的代理访问授权页面。',
        step3EnterCode: '输入授权码',
        authCodeDesc: '授权完成后，页面会显示一个授权码。复制并粘贴到下方：',
        authCode: '授权码',
        authCodePlaceholder: '粘贴 Claude 页面的授权码...',
        authCodeHint: '粘贴从 Claude 页面复制的授权码',
        completeAuth: '完成授权',
        verifying: '验证中...',
        pleaseEnterSessionKey: '请输入至少一个有效的 sessionKey',
        authFailed: '授权失败',
        cookieAuthFailed: 'Cookie 授权失败',
        keyAuthFailed: '密钥 {index}: {error}',
        successCreated: '成功创建 {count} 个账号',
        batchSuccess: '成功创建 {count} 个账号',
        batchPartialSuccess: '部分成功：{success} 个成功，{failed} 个失败',
        batchFailed: '批量创建失败',
        // OpenAI specific
        openai: {
          title: 'OpenAI 账户授权',
          followSteps: '请按照以下步骤完成 OpenAI 账户的授权：',
          step1GenerateUrl: '点击下方按钮生成授权链接',
          generateAuthUrl: '生成授权链接',
          step2OpenUrl: '在浏览器中打开链接并完成授权',
          openUrlDesc: '请在新标签页中打开授权链接，登录您的 OpenAI 账户并授权。',
          importantNotice:
            '重要提示：授权后页面可能会加载较长时间，请耐心等待。当浏览器地址栏变为 http://localhost... 开头时，表示授权已完成。',
          step3EnterCode: '输入授权链接或 Code',
          authCodeDesc:
            '授权完成后，当页面地址变为 http://localhost:xxx/auth/callback?code=... 时：',
          authCode: '授权链接或 Code',
          authCodePlaceholder:
            '方式1：复制完整的链接\n(http://localhost:xxx/auth/callback?code=...)\n方式2：仅复制 code 参数的值',
          authCodeHint: '您可以直接复制整个链接或仅复制 code 参数值，系统会自动识别',
          failedToGenerateUrl: '生成 OpenAI 授权链接失败',
          failedToExchangeCode: 'OpenAI 授权码兑换失败',
          failedToValidateRT: '验证 Refresh Token 失败',
          errors: {
            OPENAI_OAUTH_PROXY_REQUIRED:
              '未设置代理，当前服务器无法直连 OpenAI，导致 OpenAI OAuth 请求失败。请先选择可访问 OpenAI 的代理后重试；如果授权码已失效，请重新生成授权链接。'
          },
          // Refresh Token auth
          refreshTokenAuth: '手动输入 RT',
          refreshTokenDesc: '输入您已有的 OpenAI Refresh Token，支持批量输入（每行一个），系统将自动验证并创建账号。',
          refreshTokenPlaceholder: '粘贴您的 OpenAI Refresh Token...\n支持多个，每行一个',
          sessionTokenAuth: '手动输入 ST',
          sessionTokenDesc: '输入您已有的 Session Token，支持批量输入（每行一个），系统将自动验证并创建账号。',
          sessionTokenPlaceholder: '粘贴您的 Session Token...\n支持多个，每行一个',
          sessionTokenRawLabel: '原始字符串',
          sessionTokenRawPlaceholder: '粘贴 /api/auth/session 原始数据或 Session Token...',
          sessionTokenRawHint: '支持粘贴完整 JSON，系统会自动解析 ST 和 AT。',
          openSessionUrl: '打开获取链接',
          copySessionUrl: '复制链接',
          sessionUrlHint: '该链接通常可获取 AT。若返回中无 sessionToken，请从浏览器 Cookie 复制 __Secure-next-auth.session-token 作为 ST。',
          parsedSessionTokensLabel: '解析出的 ST',
          parsedSessionTokensEmpty: '未解析到 ST，请检查输入内容',
          parsedAccessTokensLabel: '解析出的 AT',
          validating: '验证中...',
          validateAndCreate: '验证并创建账号',
          pleaseEnterRefreshToken: '请输入 Refresh Token',
          pleaseEnterSessionToken: '请输入 Session Token'
        },
        // 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 账号',
      geminiAccount: 'Gemini 账号',
      antigravityAccount: 'Antigravity 账号',
      inputMethod: '输入方式',
      reAuthorizedSuccess: '账号重新授权成功',
      // Test Modal
      testAccountConnection: '测试账号连接',
      account: '账号',
      readyToTest: '准备测试。点击"开始测试"按钮开始...',
      connectingToApi: '连接 API 中...',
      testCompleted: '测试完成！',
      connectedToApi: '已连接到 API',
      usingModel: '使用模型：{model}',
      sendingTestMessage: '发送测试消息："hi"',
      sendingImageRequest: '发送生图测试请求...',
      response: '响应：',
      startTest: '开始测试',
      retry: '重试',
      copyOutput: '复制输出',
      outputCopied: '输出已复制',
      startingTestForAccount: '开始测试账号：{name}',
      testAccountTypeLabel: '账号类型：{type}',
      selectTestModel: '选择测试模型',
      testModel: '测试模型',
      testPrompt: '提示词："hi"',
      imagePromptLabel: '生图提示词',
      imagePromptPlaceholder: '例如：生成一只戴宇航员头盔的橘猫，像素插画风格，纯色背景。',
      imagePromptDefault: 'Generate a cute orange cat astronaut sticker on a clean pastel background.',
      imageTestHint: '选择图片模型后，这里会直接发起生图测试，并在下方展示返回图片。',
      imageTestMode: '模式：生图测试',
      imagePreview: '生成结果：',
      imageReceived: '已收到第 {count} 张测试图片',
      // Stats Modal
      viewStats: '查看统计',
      usageStatistics: '使用统计',
      last30DaysUsage: '近30天使用统计（日均基于实际使用天数）',
      stats: {
        totalCost: '30天总费用',
        accumulatedCost: '累计成本',
        standardCost: '标准计费',
        totalRequests: '30天总请求',
        totalCalls: '累计调用次数',
        avgDailyCost: '日均费用',
        basedOnActualDays: '基于 {days} 天实际使用',
        avgDailyRequests: '日均请求',
        avgDailyUsage: '平均每日调用',
        todayOverview: '今日概览',
        cost: '费用',
        requests: '请求',
        tokens: 'Token',
        highestCostDay: '最高费用日',
        highestRequestDay: '最高请求日',
        date: '日期',
        accumulatedTokens: '累计 Token',
        totalTokens: '30天总计',
        dailyAvgTokens: '日均 Token',
        performance: '性能',
        avgResponseTime: '平均响应',
        daysActive: '活跃天数',
        recentActivity: '最近统计',
        todayRequests: '今日请求',
        todayTokens: '今日 Token',
        todayCost: '今日费用',
        usageTrend: '30天费用与请求趋势',
        noData: '该账号暂无使用数据'
      }
    },

    // Scheduled Tests
    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: '订阅套餐',
      billingMode: '计费模式',
      billingModeToken: '按量',
      billingModePerRequest: '按次',
      billingModeImage: '按次(图片)',
      allBillingModes: '全部计费模式',
      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: '内部',
        endpoint: '端点',
        requestType: '类型',
        requestTypeSync: '同步',
        requestTypeStream: '流式',
        requestTypeWs: 'WS'
      },
      // 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: '请求路径',
        inboundEndpoint: '入站端点',
        upstreamEndpoint: '上游端点',
        requestedModel: '请求模型',
        upstreamModel: '上游模型',
        requestType: '请求类型',
        requestTypeUnknown: '未知',
        requestTypeSync: '同步',
        requestTypeStream: '流式',
        requestTypeWs: 'WebSocket',
        modelMapping: '模型映射',
        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: '通用设置',
        features: '功能开关',
        security: '安全与认证',
        users: '用户默认值',
        gateway: '网关服务',
        email: '邮件设置',
        backup: '数据备份',
        payment: '支付设置',
      },
      features: {
        channelMonitor: {
          title: '渠道监控',
          description: '定期对配置的渠道发起健康检查，向用户展示可用性与延迟。关闭后调度器停止扫描，用户端列表为空。',
          configureLink: '前往 渠道管理 > 渠道监控 配置监控项',
          enabled: '启用渠道监控',
          enabledHint: '关闭后后台不再执行定时检测，已有数据保留。',
          defaultInterval: '默认检测间隔（秒）',
          defaultIntervalHint: '新建渠道监控时表单的默认值，可被单个渠道覆盖。范围 15 – 3600 秒。',
        },
        availableChannels: {
          title: '可用渠道',
          description: '向已登录用户展示他们能访问的渠道、模型和定价聚合视图。默认关闭。',
          configureLink: '前往 渠道管理 > 渠道定价 配置模型价格',
          enabled: '启用可用渠道',
          enabledHint: '关闭后用户端侧边栏入口隐藏，接口返回空数组。',
        },
      },
      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: '已使用当前站点生成回调地址并复制到剪贴板'
      },
      oidc: {
        title: 'OIDC 登录',
        description: '配置标准 OIDC Provider（例如 Keycloak）',
        enable: '启用 OIDC 登录',
        enableHint: '在登录/注册页面显示 OIDC 登录入口',
        providerName: 'Provider 名称',
        providerNamePlaceholder: '例如 Keycloak',
        clientId: 'Client ID',
        clientIdPlaceholder: 'OIDC client id',
        clientSecret: 'Client Secret',
        clientSecretPlaceholder: '********',
        clientSecretHint: '用于后端交换 token（请保密）',
        clientSecretConfiguredPlaceholder: '********',
        clientSecretConfiguredHint: '密钥已配置，留空以保留当前值。',
        issuerUrl: 'Issuer URL',
        issuerUrlPlaceholder: 'https://id.example.com/realms/main',
        discoveryUrl: 'Discovery URL',
        discoveryUrlPlaceholder: '可选，留空将基于 issuer 自动推导',
        authorizeUrl: 'Authorize URL',
        authorizeUrlPlaceholder: '可选，可通过 discovery 自动获取',
        tokenUrl: 'Token URL',
        tokenUrlPlaceholder: '可选，可通过 discovery 自动获取',
        userinfoUrl: 'UserInfo URL',
        userinfoUrlPlaceholder: '可选，可通过 discovery 自动获取',
        jwksUrl: 'JWKS URL',
        jwksUrlPlaceholder: '可选；启用严格 ID Token 校验时必填',
        scopes: 'Scopes',
        scopesPlaceholder: 'openid email profile',
        scopesHint: '必须包含 openid',
        redirectUrl: '后端回调地址（Redirect URL）',
        redirectUrlPlaceholder: 'https://your-domain.com/api/v1/auth/oauth/oidc/callback',
        redirectUrlHint: '必须与 OIDC Provider 中配置的回调地址一致',
        quickSetCopy: '使用当前站点生成并复制',
        redirectUrlSetAndCopied: '已使用当前站点生成回调地址并复制到剪贴板',
        frontendRedirectUrl: '前端回调路径',
        frontendRedirectUrlPlaceholder: '/auth/oidc/callback',
        frontendRedirectUrlHint: '后端回调完成后重定向到此前端路径',
        tokenAuthMethod: 'Token 鉴权方式',
        clockSkewSeconds: '时钟偏移（秒）',
        allowedSigningAlgs: '允许的签名算法',
        allowedSigningAlgsPlaceholder: 'RS256,ES256,PS256',
        usePkce: '启用 PKCE',
        validateIdToken: '校验 ID Token',
        requireEmailVerified: '要求邮箱已验证',
        userinfoEmailPath: 'UserInfo 邮箱字段路径',
        userinfoEmailPathPlaceholder: '例如 data.email',
        userinfoIdPath: 'UserInfo ID 字段路径',
        userinfoIdPathPlaceholder: '例如 data.id',
        userinfoUsernamePath: 'UserInfo 用户名字段路径',
        userinfoUsernamePathPlaceholder: '例如 data.username'
      },
      defaults: {
        title: '用户默认设置',
        description: '新用户的默认值',
        defaultBalance: '默认余额',
        defaultBalanceHint: '新用户的初始余额',
        defaultConcurrency: '默认并发数',
        defaultConcurrencyHint: '新用户的最大并发请求数',
        defaultUserRpmLimit: '默认用户 RPM 限制',
        defaultUserRpmLimitHint: '新用户默认每分钟最大请求数，0 = 不限制；仅作用于新用户创建时初始化',
        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 都归属明确的分组。'
      },
      gatewayForwarding: {
        title: '请求转发行为',
        description: '控制请求转发到上游 OAuth 账号时的行为',
        fingerprintUnification: '指纹统一化',
        fingerprintUnificationHint: '统一共享同一 OAuth 账号的用户的 X-Stainless-* 请求头。关闭后透传客户端原始请求头。',
        metadataPassthrough: 'Metadata 透传',
        metadataPassthroughHint: '透传客户端原始 metadata.user_id，不进行重写。可能提高上游缓存命中率。',
        cchSigning: 'CCH 签名',
        cchSigningHint: '对转发请求的 billing header 进行 CCH 哈希签名。关闭时保留原始占位符。',
      },
      webSearchEmulation: {
        title: 'Web Search 模拟',
        description: '为不原生支持搜索的 Anthropic API Key 账号注入 web search 能力',
        enabled: '启用 Web Search 模拟',
        enabledHint: '全局开关。关闭后所有渠道和账号的 web search 模拟均不生效。',
        providers: '搜索服务商',
        addProvider: '添加服务商',
        providerType: '服务商类型',
        apiKey: 'API Key',
        apiKeyPlaceholder: '输入 API Key',
        apiKeyConfigured: '已配置',
        showApiKey: '显示',
        hideApiKey: '隐藏',
        copyApiKey: '复制',
        copied: '已复制',
        quotaLimit: '配额上限',
        quotaLimitHint: '留空表示无限制；填写时必须大于 0',
        quotaLimitMustBePositive: '配额上限必须大于 0',
        subscribedAt: '订阅时间',
        subscribedAtHint: '配额从此日期起每月自动重置；留空则不自动重置',
        quotaUsage: '用量',
        resetUsage: '重置',
        resetUsageConfirm: '确定要重置此服务商的用量计数吗？',
        resetUsageSuccess: '用量已重置',
        proxy: '代理',
        removeProvider: '删除',
        noProviders: '未配置搜索服务商',
        test: '测试',
        testDefaultQuery: '搜索今年世界大事件',
        testing: '搜索中...',
        testResultTitle: '搜索结果',
        testResultProvider: '服务商',
        testNoResults: '无搜索结果',
      },
      site: {
        title: '站点设置',
        description: '自定义站点品牌',
        backendMode: 'Backend 模式',
        backendModeDescription:
          '禁用用户注册、公开页面和自助服务功能。仅管理员可以登录和管理平台。',
        siteName: '站点名称',
        siteNameHint: '显示在邮件和页面标题中',
        siteNamePlaceholder: 'Sub2API',
        siteSubtitle: '站点副标题',
        siteSubtitleHint: '显示在登录和注册页面',
        siteSubtitlePlaceholder: '订阅转 API 转换平台',
        apiBaseUrl: 'API 端点地址',
        apiBaseUrlHint: '用于"使用密钥"和"导入到 CC Switch"功能，留空则使用当前站点地址',
        apiBaseUrlPlaceholder: 'https://api.example.com',
        tablePreferencesTitle: '通用表格设置',
        tablePreferencesDescription: '设置后台与用户侧表格组件的默认分页行为',
        tableDefaultPageSize: '默认每页条数',
        tableDefaultPageSizeHint: '必须为 5-1000 之间的整数',
        tablePageSizeOptions: '可选每页条数列表',
        tablePageSizeOptionsPlaceholder: '10, 20, 50, 100',
        tablePageSizeOptionsHint: '使用英文逗号分隔，取值范围 5-1000，保存时会自动去重并排序',
        tableDefaultPageSizeRangeError: '默认每页条数必须在 {min}-{max} 之间',
        tablePageSizeOptionsFormatError: '可选每页条数格式无效，请输入 {min}-{max} 之间的整数并用英文逗号分隔',
        customEndpoints: {
          title: '自定义端点',
          description: '添加额外的 API 端点地址，用户可在「API Keys」页面快速复制',
          itemLabel: '端点 #{n}',
          name: '名称',
          namePlaceholder: '如：OpenAI Compatible',
          endpointUrl: '端点地址',
          endpointUrlPlaceholder: 'https://api2.example.com',
          descriptionLabel: '介绍',
          descriptionPlaceholder: '如：支持 OpenAI 格式请求',
          add: '添加端点',
        },
        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: '下移',
      },
      payment: {
        title: '支付设置',
        description: '配置支付系统选项',
        configGuide: '支付配置指南',
        enabled: '启用支付',
        enabledHint: '启用或禁用支付系统',
        enabledPaymentTypes: '启用的服务商',
        enabledPaymentTypesHint: '禁用服务商将同时禁用对应的实例。',
        findProvider: '正在寻找合适的易支付服务商？',
        minAmount: '最低金额',
        maxAmount: '最高金额',
        dailyLimit: '每日限额',
        balanceRechargeMultiplier: '余额充值倍率',
        balanceRechargeMultiplierHint: '用户每支付 1 CNY 可获得多少 USD 余额',
        balanceRechargePreview: '预览：1 CNY = {usd} USD',
        rechargeFeeRate: '充值手续费率',
        rechargeFeeRateHint: '用户充值时额外收取的手续费百分比，0 表示不收取手续费',
        rechargeFeePreview: '预览：充值 100 元，手续费 {fee} 元',
        orderTimeout: '订单超时时间',
        orderTimeoutHint: '单位：分钟，至少 1 分钟',
        maxPendingOrders: '最大待支付订单数',
        cancelRateLimit: '限制取消频率',
        cancelRateLimitHint: '启用后，用户在时间窗口内取消订单次数超限将无法创建新订单',
        cancelRateLimitEvery: '每',
        cancelRateLimitAllowMax: '最多',
        cancelRateLimitTimes: '次',
        cancelRateLimitWindow: '时间窗口',
        cancelRateLimitUnit: '周期',
        cancelRateLimitMax: '最大取消次数',
        cancelRateLimitUnitMinute: '分钟',
        cancelRateLimitUnitHour: '小时',
        cancelRateLimitUnitDay: '天',
        cancelRateLimitWindowMode: '窗口模式',
        cancelRateLimitWindowModeRolling: '滚动',
        cancelRateLimitWindowModeFixed: '固定',
        helpText: '帮助文本',
        helpImageUrl: '帮助图片链接',
        manageProviders: '管理服务商',
        balancePaymentDisabled: '禁用余额充值',
        noLimit: '留空表示不限制',
        helpImage: '帮助图片',
        helpImagePlaceholder: '上传或输入图片链接',
        helpTextPlaceholder: '输入帮助说明文本...',
        providerEasypay: '易支付',
        providerAlipay: '支付宝官方',
        providerWxpay: '微信官方',
        providerStripe: 'Stripe',
        typeDisabled: '类型已禁用',
        enableTypesFirst: '请先在上方启用至少一种服务商',
        easypayRedirect: '跳转',
        paymentMode: '支付模式',
        modeRedirect: '跳转',
        modeQRCode: '二维码',
        modePopup: '弹窗',
        validationNameRequired: '服务商名称不能为空',
        validationTypesRequired: '请至少选择一种支持的支付方式',
        validationFieldRequired: '{field} 不能为空',
        field_apiBase: 'API 基础地址',
        field_notifyUrl: '异步通知地址',
        field_returnUrl: '同步跳转地址',
        callbackBaseUrl: '回调基础地址',
        field_privateKey: '私钥',
        field_publicKey: '公钥',
        field_mpAppId: '公众号 App ID',
        field_mchId: '商户号',
        field_apiV3Key: 'API v3 密钥',
        field_publicKeyId: '公钥 ID',
        field_certSerial: '证书序列号',
        field_h5AppName: 'H5 应用名称',
        field_h5AppUrl: 'H5 应用地址',
        wxpayConfigHint: '微信支付通常只需要填写 App ID。公众号 App ID、H5 应用名称、H5 应用地址仅在公众号支付或 H5 场景有特殊要求时再填写。',
        wxpayAdvancedOptions: '微信支付高级可选项',
        field_secretKey: '密钥',
        field_publishableKey: '公开密钥',
        field_webhookSecret: 'Webhook 密钥',
        field_cid: '支付渠道 ID',
        field_cidAlipay: '支付宝渠道 ID',
        field_cidWxpay: '微信渠道 ID',
        stripeWebhookHint: '请在 Stripe Dashboard 中将以下地址配置为 Webhook 端点：',
        limitsTitle: '限额配置',
        limitSingleMin: '单笔最低',
        limitSingleMax: '单笔最高',
        limitDaily: '每日限额',
        limitsHint: '全部留空使用全局配置，部分填写时留空项表示不限制',
        limitsUseGlobal: '使用全局配置',
        limitsNoLimit: '不限制',
        productNamePrefix: '商品名前缀',
        productNameSuffix: '商品名后缀',
        preview: '预览',
        loadBalanceStrategy: '负载均衡策略',
        strategyRoundRobin: '轮询',
        strategyLeastAmount: '最少金额',
        providerManagement: '服务商管理',
        providerManagementDesc: '管理支付服务商实例',
        createProvider: '添加服务商',
        editProvider: '编辑服务商',
        deleteProvider: '删除服务商',
        deleteProviderConfirm: '确定要删除此服务商吗？',
        providerName: '服务商名称',
        providerKey: '服务商类型',
        selectProviderKey: '选择服务商类型',
        providerConfig: '凭证配置',
        paymentGuideTrigger: '查看支付方式说明',
        guideOpenLabel: '开通：',
        guideCallLabel: '调用：',
        guideFallbackLabel: '降级：',
        alipayGuideSummary: '桌面优先扫码单，失败再走收银台；移动优先手机网站支付。',
        alipayGuideFaceToFaceTitle: '当面付 / 扫码支付',
        alipayGuideFaceToFaceOpen: '需开通当面付或扫码支付能力。',
        alipayGuideFaceToFaceCall: '桌面端下单时优先调用 alipay.trade.precreate，前台直接渲染二维码。',
        alipayGuideFaceToFaceFallback: '接口不可用或返回失败时，自动降级到电脑网站支付。',
        alipayGuidePagePayTitle: '电脑网站支付',
        alipayGuidePagePayOpen: '需开通电脑网站支付。',
        alipayGuidePagePayCall: '桌面端当面付不可用时调用 alipay.trade.page.pay，并继续把返回链接渲染成二维码。',
        alipayGuidePagePayFallback: '同时保留打开收银台入口，用户可手动重新拉起支付页。',
        alipayGuideWapTitle: '手机网站支付',
        alipayGuideWapOpen: '需开通手机网站支付。',
        alipayGuideWapCall: '移动端优先调用 alipay.trade.wap.pay，跳转支付宝收银台。',
        alipayGuideWapFallback: '未开通或返回异常时，前端自动改走扫码支付并提示未开通移动支付。',
        wxpayGuideSummary: '桌面优先 Native 扫码，移动端按浏览器环境走 JSAPI 或 H5。',
        wxpayGuideNote: '当前表单默认共用一个 App ID，适合同主体下统一配置网页、移动和公众号场景。',
        wxpayGuideNativeTitle: 'Native / 扫码支付',
        wxpayGuideNativeOpen: '需开通 Native 或扫码支付能力。',
        wxpayGuideNativeCall: '桌面端默认调用 Native，下发二维码内容给前台渲染。',
        wxpayGuideNativeFallback: '移动端无法走 JSAPI 或 H5 时，也会自动回退到这里。',
        wxpayGuideJsapiTitle: 'JSAPI / 公众号支付',
        wxpayGuideJsapiOpen: '需开通公众号支付，并保证当前浏览器在微信内且能拿到 OpenID。',
        wxpayGuideJsapiCall: '微信内浏览器完成授权后调用 JSAPI，直接拉起微信支付。',
        wxpayGuideJsapiFallback: '未配置、Bridge 不可用或拉起失败时，自动改走扫码支付。',
        wxpayGuideH5Title: 'H5 支付',
        wxpayGuideH5Open: '需开通 H5 支付。',
        wxpayGuideH5Call: '移动端非微信浏览器且有客户端 IP 时调用 H5 支付，跳转微信收银台。',
        wxpayGuideH5Fallback: '未开通 H5 或下单失败时，自动改走扫码支付。',
        noProviders: '暂无服务商实例',
        supportedTypes: '支持的支付方式',
        supportedTypesHint: '逗号分隔，如 alipay,wxpay',
        refundEnabled: '允许退款',
        allowUserRefund: '允许用户退款',
        enableConflict: '{method} 已有启用中的服务商实例：{provider}。请先停用现有实例后再启用或切换。',
      },
      balanceNotify: {
        title: '余额不足提醒',
        description: '当用户余额低于阈值时发送邮件提醒',
        enabled: '启用余额不足提醒',
        threshold: '默认提醒阈值',
        thresholdHint: '用户未自定义时使用此值',
        thresholdPlaceholder: '输入金额',
        rechargeUrl: '充值页面 URL',
        rechargeUrlPlaceholder: 'https://example.com/payment',
        rechargeUrlHint: '设置后邮件中将包含充值链接按钮',
      },
      quotaNotify: {
        title: '账号限额通知',
        description: '当账号配额用量达到告警阈值时通知管理员',
        enabled: '启用账号限额通知',
        emails: '通知邮箱',
        emailsHint: '留空则不发送通知',
        addEmail: '添加邮箱',
        emailPlaceholder: '输入邮箱地址',
      },
      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: '端点',
          bucket: '存储桶',
          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 并重试',
        apikeySignature: 'API Key 签名整流',
        apikeySignatureHint:
          '当 API Key 账号的上游返回签名相关错误时，自动去除签名并重试（内置规则始终生效）',
        apikeyPatterns: '自定义匹配关键词',
        apikeyPatternsHint:
          '额外的关键词，匹配响应体中的内容（不区分大小写）。内置规则始终生效，此处用于补充额外匹配。',
        apikeyPatternPlaceholder: '例如：thinking_error 或 签名无效',
        addPattern: '添加关键词',
        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 策略设置失败',
        modelWhitelist: '模型白名单',
        modelWhitelistHint: '留空则对所有模型生效。支持精确匹配和通配符前缀（如 claude-opus-*）',
        modelPatternPlaceholder: '例如: claude-opus-* 或 claude-opus-4-6',
        addModelPattern: '添加模型规则',
        removePattern: '移除',
        fallbackAction: '未匹配模型处理方式',
        fallbackActionHint: '当请求模型不在白名单中时的处理方式',
        fallbackErrorMessagePlaceholder: '未匹配模型被拦截时返回的自定义错误消息',
        quickPresets: '快捷预设',
        presetOpusOnly: '仅 Opus 允许 1M',
        presetOpusOnlyDesc: 'Opus 透传，其他模型过滤',
        commonPatterns: '常用模式'
      },
      wechatConnect: {
        title: '微信登录',
        description: '用于微信开放平台或公众号/小程序的第三方登录配置。',
        enabledLabel: '启用微信登录',
        enabledHint: '开启后可使用微信第三方登录回调与授权配置。',
        appIdLabel: 'AppID',
        appIdPlaceholder: '微信开放平台 AppID',
        appSecretLabel: 'AppSecret',
        appSecretConfiguredPlaceholder: '密钥已配置，留空以保留当前值。',
        appSecretPlaceholder: '微信开放平台 AppSecret',
        appSecretConfiguredHint: '密钥已配置，留空以保留当前值。',
        appSecretHint: '填写后会覆盖当前微信密钥。',
        modeLabel: '模式',
        openModeLabel: '非微信环境使用开放平台',
        openModeHint: '浏览器不在微信内时，自动走开放平台扫码授权。',
        mpModeLabel: '微信环境使用公众号',
        mpModeHint: '浏览器在微信内时，自动走公众号授权。',
        redirectUrlLabel: '回调地址',
        redirectUrlPlaceholder: 'https://your-site.com/api/v1/auth/oauth/wechat/callback',
        generateAndCopy: '使用当前站点生成并复制',
        redirectUrlSetAndCopied: '已使用当前站点生成回调地址并复制到剪贴板',
        frontendRedirectUrlLabel: '前端回调地址',
        frontendRedirectUrlPlaceholder: '/auth/wechat/callback',
        frontendRedirectUrlHint: '通常用于前端路由回调地址，需与后端配置保持一致。'
      },
      authSourceDefaults: {
        title: '认证来源默认值',
        description: '按注册来源配置新用户默认余额、并发、订阅与授权策略。',
        requireEmailLabel: '第三方注册强制补充邮箱',
        requireEmailHint: '启用后，Linux DO、OIDC、微信注册缺少邮箱时必须先补充邮箱地址。',
        enabledHint: '以下默认值会在该来源注册新用户时发放；首次绑定时授权仅作用于已有账号绑定该来源。',
        sources: {
          email: {
            title: '邮箱注册',
            description: '适用于邮箱密码注册的新用户默认配额。'
          },
          linuxdo: {
            title: 'Linux DO 登录',
            description: '适用于 Linux DO 第三方注册的新用户默认配额。'
          },
          oidc: {
            title: 'OIDC 登录',
            description: '适用于 OIDC 第三方注册的新用户默认配额。'
          },
          wechat: {
            title: '微信登录',
            description: '适用于微信第三方注册的新用户默认配额。'
          }
        },
        grantOnFirstBindLabel: '首次绑定时授权',
        grantOnFirstBindHint: '已有账号首次绑定该来源时发放默认权益。',
        defaultSubscriptionsLabel: '默认订阅',
        defaultSubscriptionsHint: '仅对当前认证来源生效，未配置时不追加来源专属订阅。',
        noSourceSubscriptions: '当前来源未配置专属默认订阅。'
      },
      paymentVisibleMethods: {
        methodLabel: '{title} 可见方式',
        methodHint: '控制前台结算页是否展示该方式，以及展示时使用的来源键。',
        sourceLabel: '支付来源',
        sourceHint: '启用后必须明确选择一个来源；未配置状态不会对外展示该支付方式。',
        sourceRequiredError: '{title} 已启用，请先选择支付来源。'
      },
      openaiExperimentalScheduler: {
        title: 'OpenAI 实验调度策略',
        description: '默认关闭。开启后仅影响本网关在 OpenAI 账号间的实验性调度选择逻辑，不代表上游 OpenAI 官方能力。'
      },
      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: '切换状态失败'
    },

    // TLS 指纹模板
    tlsFingerprintProfiles: {
      title: 'TLS 指纹模板',
      description: '管理 TLS 指纹模板，用于模拟特定客户端的 TLS 握手特征',
      createProfile: '创建模板',
      editProfile: '编辑模板',
      deleteProfile: '删除模板',
      noProfiles: '暂无模板',
      createFirstProfile: '创建你的第一个 TLS 指纹模板',

      columns: {
        name: '名称',
        description: '描述',
        grease: 'GREASE',
        alpn: 'ALPN',
        actions: '操作'
      },

      form: {
        pasteYaml: '粘贴 YAML 配置',
        pasteYamlPlaceholder: '将 TLS 指纹采集器复制的 YAML 粘贴到这里...',
        pasteYamlHint: '粘贴从 TLS 指纹采集器复制的 YAML 配置，自动填充所有字段。',
        openCollector: '打开采集器',
        parseYaml: '解析 YAML',
        yamlParsed: 'YAML 解析成功，字段已自动填充',
        yamlParseFailed: 'YAML 解析失败：未找到 name 字段',
        name: '模板名称',
        namePlaceholder: '例如 macOS Node.js v24',
        description: '描述',
        descriptionPlaceholder: '可选的模板描述',
        enableGrease: '启用 GREASE',
        enableGreaseHint: '在 TLS ClientHello 扩展中插入 GREASE 值',
        cipherSuites: '密码套件',
        cipherSuitesHint: '逗号分隔的十六进制值，例如 0x1301, 0x1302, 0xc02c',
        curves: '椭圆曲线',
        curvesHint: '逗号分隔的曲线 ID',
        pointFormats: '点格式',
        signatureAlgorithms: '签名算法',
        alpnProtocols: 'ALPN 协议',
        alpnProtocolsHint: '逗号分隔，例如 h2, http/1.1',
        supportedVersions: '支持的 TLS 版本',
        keyShareGroups: '密钥共享组',
        pskModes: 'PSK 模式',
        extensions: '扩展'
      },

      deleteConfirm: '删除模板',
      deleteConfirmMessage: '确定要删除模板 "{name}" 吗？使用此模板的账号将回退到内置默认值。',
      createSuccess: '模板创建成功',
      updateSuccess: '模板更新成功',
      deleteSuccess: '模板删除成功',
      loadFailed: '加载模板失败',
      saveFailed: '保存模板失败',
      deleteFailed: '删除模板失败'
    }
  },

  // 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>'
      }
    }
  },

  // Payment System
  payment: {
    title: '充值/订阅',
    amountLabel: '充值金额',
    paymentAmount: '支付金额',
    creditedBalance: '到账余额',
    quickAmounts: '快捷金额',
    customAmount: '自定义金额',
    enterAmount: '输入金额',
    paymentMethod: '支付方式',
    fee: '手续费',
    actualPay: '实付金额',
    createOrder: '确认支付',
    methods: {
      easypay: '易支付',
      alipay: '支付宝',
      wxpay: '微信支付',
      stripe: 'Stripe',
      card: '银行卡',
      link: 'Link',
      alipay_direct: '支付宝（直连）',
      wxpay_direct: '微信支付（直连）',
    },
    status: {
      pending: '待支付',
      paid: '已支付',
      recharging: '充值中',
      completed: '已完成',
      expired: '已过期',
      cancelled: '已取消',
      failed: '失败',
      refund_requested: '退款申请中',
      refunding: '退款中',
      refunded: '已退款',
      partially_refunded: '部分退款',
      refund_failed: '退款失败',
    },
    qr: {
      scanToPay: '请扫码支付',
      scanAlipay: '支付宝扫码支付',
      scanWxpay: '微信扫码支付',
      scanAlipayHint: '请使用手机打开支付宝，扫描二维码完成支付',
      scanWxpayHint: '请使用手机打开微信，扫描二维码完成支付',
      payInNewWindow: '请在新窗口中完成支付',
      payInNewWindowHint: '支付页面已在新窗口打开，请在新窗口中完成支付后返回此页面',
      openPayWindow: '重新打开支付页面',
      expiresIn: '剩余支付时间',
      expired: '订单已过期',
      expiredDesc: '订单已超时，请重新创建订单',
      cancelled: '订单已取消',
      cancelledDesc: '您已取消本次支付',
      waitingPayment: '等待支付...',
      cancelOrder: '取消订单',
    },
    orders: {
      title: '我的订单',
      empty: '暂无订单',
      orderId: '订单 ID',
      orderNo: '订单编号',
      amount: '金额',
      payAmount: '实付',
      creditedAmount: '到账金额',
      fee: '手续费',
      baseAmount: '充值金额',
      includedInPayAmount: '已含在实付金额中',
      status: '状态',
      paymentMethod: '支付方式',
      createdAt: '创建时间',
      cancel: '取消订单',
      userId: '用户 ID',
      orderType: '订单类型',
      actions: '操作',
      requestRefund: '申请退款',
    },
    result: {
      success: '支付成功',
      subscriptionSuccess: '订阅成功',
      processing: '支付处理中',
      processingHint: '支付结果仍在确认中，页面会自动刷新。',
      failed: '支付失败',
      backToRecharge: '返回充值',
      viewOrders: '查看订单',
    },
    currentBalance: '当前余额',
    groupFallback: '分组 #{id}',
    rechargeAccount: '充值账户',
    activeSubscription: '当前订阅',
    noActiveSubscription: '暂无有效订阅',
    tabTopUp: '充值',
    tabSubscribe: '订阅',
    noPlans: '暂无可用订阅套餐',
    notAvailable: '充值功能暂未开放',
    confirmSubscription: '确认订阅',
    confirmCancel: '确定要取消此订单吗？',
    amountTooLow: '最低金额为 {min}',
    amountTooHigh: '最高金额为 {max}',
    amountNoMethod: '该金额没有可用的支付方式',
    rechargeRatePreview: '当前倍率：1 CNY = {usd} USD',
    refundReason: '退款原因',
    refundReasonPlaceholder: '请描述您的退款原因',
    stripeLoadFailed: '支付组件加载失败，请刷新页面重试',
    stripeMissingParams: '缺少订单ID或支付密钥',
    stripeNotConfigured: 'Stripe 未配置',
    errors: {
      tooManyPending: '待支付订单过多（最多 {max} 个），请先完成或取消现有订单',
      cancelRateLimited: '取消订单过于频繁，请稍后再试',
      wechatH5NotAuthorized: '当前商户未开通微信 H5 支付，请在微信中打开当前页面继续支付。',
      wechatPaymentMpNotConfigured: '当前站点未完成公众号/JSAPI 支付配置，暂时无法在微信内直接拉起支付。',
      wechatJsapiUnavailable: '当前环境未能拉起微信支付，请确认正在微信内打开本页后重试。',
      wechatJsapiFailed: '微信支付未完成，请重新拉起支付或改用扫码支付。',
      wechatUnavailable: '当前微信支付暂不可用，请稍后重试。',
      wechatOpenInWeChatHint: '请复制当前页面链接到微信内打开，或直接改用电脑端微信扫码支付。',
      wechatScanOnDesktopHint: '电脑端请直接使用微信扫一扫完成支付；移动端请在微信内打开当前页面。',
      wechatSwitchBrowserHint: '请改用电脑端微信扫码，或在外部浏览器重新打开本页后再试。',
      mobilePaymentFallbackToQr: '当前商户未开通移动支付，已自动切换为扫码支付。',
      alipayDesktopUnavailable: '当前支付宝桌面支付未成功生成二维码。',
      alipayDesktopQrHint: '电脑端支付宝应展示扫码单，请刷新后重试，或确认浏览器未拦截当前支付页。',
      alipayMobileUnavailable: '当前页面未成功跳转到支付宝。',
      alipayMobileOpenHint: '请允许当前页面打开支付宝 App，或改用系统浏览器重新发起支付。',
      // Structured error codes (reason strings from backend ApplicationError)
      PAYMENT_DISABLED: '支付系统已关闭',
      USER_INACTIVE: '账号已被禁用',
      BALANCE_PAYMENT_DISABLED: '余额充值功能已关闭',
      INVALID_AMOUNT: '金额无效',
      INVALID_INPUT: '参数有误',
      PLAN_NOT_AVAILABLE: '套餐不存在或已下架',
      GROUP_NOT_FOUND: '订阅分组不可用',
      GROUP_TYPE_MISMATCH: '分组类型不是订阅类型',
      TOO_MANY_PENDING: '待支付订单过多（最多 {max} 个），请先完成或取消现有订单',
      DAILY_LIMIT_EXCEEDED: '今日充值已达上限，剩余额度 {remaining}',
      PAYMENT_GATEWAY_ERROR: '支付方式不可用',
      NO_AVAILABLE_INSTANCE: '暂无可用的支付通道',
      PAYMENT_PROVIDER_MISCONFIGURED: '支付通道配置错误，请联系管理员',
      WXPAY_CONFIG_MISSING_KEY: '微信支付配置缺少必填项：{key}',
      WXPAY_CONFIG_INVALID_KEY_LENGTH: '微信支付 {key} 长度错误，应为 {expected} 字节（实际 {actual}）',
      WXPAY_CONFIG_INVALID_KEY: '微信支付 {key} 格式错误，请确认复制了完整的 PEM 内容',
      PENDING_ORDERS: '该服务商有未完成的订单，请等待订单完成后再操作',
      PAYMENT_PROVIDER_CONFLICT: '该支付方式已有其他启用中的服务商实例，请先停用后再继续。',
      CANCEL_RATE_LIMITED: '取消订单过于频繁，请稍后再试',
      NOT_FOUND: '订单不存在',
      FORBIDDEN: '无权限操作此订单',
      CONFLICT: '订单状态已变更，请刷新',
      INVALID_ORDER_TYPE: '仅余额订单可申请退款',
      INVALID_STATUS: '当前订单状态不允许此操作',
      BALANCE_NOT_ENOUGH: '退款金额超过余额',
      REFUND_AMOUNT_EXCEEDED: '退款金额超过充值金额',
      REFUND_FAILED: '退款失败',
    },
    stripePay: '立即支付',
    stripeSuccessProcessing: '支付成功，正在处理订单...',
    stripePopup: {
      redirecting: '正在跳转到支付页面...',
      loadingQr: '正在获取微信支付二维码...',
      timeout: '等待支付凭证超时，请重试',
      qrFailed: '未能获取微信支付二维码',
    },
    subscribeNow: '立即开通',
    renewNow: '续费',
    selectPlan: '选择套餐',
    planFeatures: '功能特性',
    planCard: {
      rate: '倍率',
      dailyLimit: '日限额',
      weeklyLimit: '周限额',
      monthlyLimit: '月限额',
      quota: '配额',
      unlimited: '无限制',
      models: '模型',
    },
    days: '天',
    months: '个月',
    years: '年',
    oneMonth: '1 个月',
    oneYear: '1 年',
    perMonth: '月',
    perYear: '年',
    admin: {
      tabs: {
        overview: '概览',
        orders: '订单管理',
        channels: '支付渠道',
        plans: '订阅套餐',
      },
      todayRevenue: '今日收入',
      totalRevenue: '总收入',
      todayOrders: '今日订单',
      orderCount: '订单数',
      avgAmount: '平均金额',
      revenue: '收入',
      dailyRevenue: '每日收入',
      paymentDistribution: '支付方式分布',
      colUser: '用户',
      topUsers: '消费排行',
      noData: '暂无数据',
      days: '天',
      weeks: '周',
      months: '月',
      searchOrders: '搜索订单...',
      allStatuses: '全部状态',
      allPaymentTypes: '全部支付方式',
      allOrderTypes: '全部订单类型',
      orderDetail: '订单详情',
      orderType: '订单类型',
      orders: '订单',
      balanceOrder: '余额充值',
      subscriptionOrder: '订阅',
      paidAt: '支付时间',
      completedAt: '完成时间',
      expiresAt: '过期时间',
      feeRate: '手续费率',
      refund: '退款',
      refundOrder: '退款订单',
      refundAmount: '退款金额',
      maxRefundable: '最大可退金额',
      refundReason: '退款原因',
      refundReasonPlaceholder: '请输入退款原因',
      confirmRefund: '确认退款',
      refundSuccess: '退款成功',
      refundInfo: '退款信息',
      refundEnabled: '允许退款',
      alreadyRefunded: '已退款',
      deductBalance: '扣除余额',
      deductBalanceHint: '从用户余额中扣回充值金额',
      userBalance: '用户余额',
      orderAmount: '订单金额',
      insufficientBalance: '余额不足，将扣至 $0',
      noDeduction: '将不扣除用户余额',
      forceRefund: '强制退款（忽略余额检查）',
      orderCancelled: '订单已取消',
      retry: '重试',
      retrySuccess: '重试成功',
      approveRefund: '批准退款',
      retryRefund: '重试退款',
      refundRequestInfo: '退款申请信息',
      refundRequestedAt: '申请时间',
      refundRequestedBy: '申请人',
      refundRequestReason: '申请原因',
      auditLogs: '操作日志',
      operator: '操作人',
      channelName: '渠道名称',
      channelDescription: '渠道描述',
      createChannel: '创建渠道',
      editChannel: '编辑渠道',
      deleteChannel: '删除渠道',
      deleteChannelConfirm: '确定要删除此渠道吗？',
      planName: '套餐名称',
      planDescription: '套餐描述',
      createPlan: '创建套餐',
      editPlan: '编辑套餐',
      deletePlan: '删除套餐',
      deletePlanConfirm: '确定要删除此套餐吗？',
      originalPrice: '原价',
      price: '价格',
      validityDays: '有效期（天）',
      validityUnit: '有效期单位',
      sortOrder: '排序',
      forSale: '上架状态',
      onSale: '上架',
      offSale: '下架',
      group: '分组',
      groupId: '分组 ID',
      features: '功能特性',
      featuresHint: '每行一个特性',
      featuresPlaceholder: '输入套餐特性...',
      providerManagement: '服务商管理',
      providerManagementDesc: '管理支付服务商实例',
      createProvider: '创建服务商',
      editProvider: '编辑服务商',
      deleteProvider: '删除服务商',
      deleteProviderConfirm: '确定要删除此服务商吗？',
      providerName: '服务商名称',
      providerKey: '服务商标识',
      selectProviderKey: '选择服务商标识',
      providerConfig: '服务商配置',
      noProviders: '暂无服务商',
      noProvidersHint: '创建一个服务商实例以开始接受支付',
      supportedTypes: '支持的支付方式',
      supportedTypesHint: '选择此服务商支持的支付方式',
      rateMultiplier: '费率倍数',
      dashboardTitle: '支付概览',
      dashboardDesc: '充值订单统计与分析',
      daySuffix: '天',
      paymentConfigTitle: '支付配置',
      paymentConfigDesc: '管理支付服务商与相关设置',
      plansPageTitle: '订阅套餐管理',
      plansPageDesc: '管理订阅套餐配置',
      tabPlanConfig: '套餐配置',
      tabUserSubs: '用户订阅',
      selectGroup: '请选择分组',
      groupRequired: '请选择订阅分组',
      priceRequired: '价格必须大于 0',
      validityDaysRequired: '有效期天数必须大于 0',
      groupMissing: '缺失',
      groupInfo: '分组信息',
      platform: '平台',
      rateMultiplierLabel: '倍率',
      dailyLimit: '日限额',
      weeklyLimit: '周限额',
      monthlyLimit: '月限额',
      unlimited: '无限制',
      searchUserSubs: '搜索用户订阅...',
      daily: '日',
      weekly: '周',
      monthly: '月',
      subsStatus: {
        active: '生效中',
        expired: '已过期',
        revoked: '已撤销',
      },
    },
  },

}
