export default {
  // Navigation
  nav: {
    printers: '打印机',
    archives: '归档',
    queue: '打印队列',
    stats: '统计',
    profiles: '配置文件',
    maintenance: '维护',
    projects: '项目',
    inventory: '耗材',
    files: '文件管理器',
    makerworld: 'MakerWorld',
    notifications: '通知',
    settings: '设置',
    system: '系统',
    collapseSidebar: '收起侧边栏',
    expandSidebar: '展开侧边栏',
    update: '更新',
    updateAvailable: '有可用更新：v{{version}}',
    updateAvailableBanner: '版本 {{version}} 已发布！',
    viewUpdate: '查看更新',
    viewOnGithub: '在 GitHub 上查看',
    keyboardShortcuts: '键盘快捷键 (?)',
    switchToLight: '切换到浅色模式',
    switchToDark: '切换到深色模式',
    smartSwitches: '智能开关',
    logout: '退出登录',
  },

  // Common
  common: {
    save: '保存',
    saving: '保存中...',
    cancel: '取消',
    delete: '删除',
    edit: '编辑',
    add: '添加',
    close: '关闭',
    confirm: '确认',
    loading: '加载中...',
    error: '错误',
    errorLoading: '加载错误',
    retry: '重试',
    success: '成功',
    warning: '警告',
    enabled: '已启用',
    disabled: '已禁用',
    yes: '是',
    no: '否',
    on: '开',
    off: '关',
    all: '全部',
    none: '无',
    search: '搜索',
    filter: '筛选',
    sort: '排序',
    refresh: '刷新',
    download: '下载',
    upload: '上传',
    uploading: '上传中...',
    uploadFailed: '上传失败',
    actions: '操作',
    status: '状态',
    name: '名称',
    description: '描述',
    date: '日期',
    time: '时间',
    hours: '小时',
    minutes: '分钟',
    seconds: '秒',
    days: '天',
    enable: '启用',
    disable: '禁用',
    permissions: '权限',
    noPrinters: '未配置打印机',
    noData: '暂无数据',
    linkNotFound: '未找到链接',
    required: '必填',
    optional: '可选',
    dismiss: '关闭',
    apply: '应用',
    reset: '重置',
    export: '导出',
    import: '导入',
    clear: '清除',
    selectAll: '全选',
    deselectAll: '取消全选',
    noChange: '— 不更改 —',
    unchanged: '未更改',
    unassigned: '未分配',
    unknown: '未知',
    unknownError: '未知错误',
    today: '今天',
    tomorrow: '明天',
    asap: '尽快',
    overdue: '已逾期',
    now: '现在',
    collapse: '收起',
    expand: '展开',
    viewArchive: '查看归档',
    viewInFileManager: '在文件管理器中查看',
    addedBy: '由 {{username}} 添加',
    prints: '次打印',
    more: '还有 {{count}} 个',
    ascending: '升序',
    descending: '降序',
    back: '返回',
    copy: '复制',
    copied: '已复制!',
    printer: '打印机',
    remove: '移除',
    type: '类型',
    print: '打印',
    rename: '重命名',
    move: '移动',
    create: '创建',
    duplicate: '复制',
    left: '左',
    right: '右',
  },

  // Printers page
  printers: {
    title: '打印机',
    addPrinter: '添加打印机',
    editPrinter: '编辑打印机',
    deletePrinter: '删除打印机',
    printerName: '打印机名称',
    serialNumber: '序列号',
    ipAddress: 'IP 地址 / 主机名',
    accessCode: '访问码',
    model: '型号',
    nozzleCount: '喷嘴数量',
    autoArchive: '自动归档',
    status: {
      available: '可用',
      idle: '空闲',
      printing: '打印中',
      paused: '已暂停',
      offline: '离线',
      problem: '故障',
      error: '错误',
      finished: '已完成',
      unknown: '未知',
    },
    temperatures: {
      nozzle: '喷嘴',
      bed: '热床',
      chamber: '腔室',
    },
    progress: '{{percent}}% 完成',
    timeRemaining: '剩余 {{time}}',
    deleteConfirm: '确定要删除"{{name}}"吗？',
    maintenanceOk: '维护正常',
    maintenanceWarning: '{{count}} 个警告',
    maintenanceWarning_plural: '{{count}} 个警告',
    maintenanceDue: '{{count}} 个到期',
    maintenanceDue_plural: '{{count}} 个到期',
    // Sort options
    sort: {
      name: '名称',
      status: '状态',
      model: '型号',
      location: '位置',
      ascending: '升序排列',
      descending: '降序排列',
    },
    // Card size
    cardSize: {
      small: '小卡片',
      medium: '中卡片',
      large: '大卡片',
      extraLarge: '超大卡片',
    },
    // Controls
    hideOffline: '隐藏离线',
    nextAvailable: '下一个可用',
    powerOn: '开机',
    offlinePrintersWithPlugs: '带智能插座的离线打印机',
    noPrintersConfigured: '尚未配置打印机',
    search: '搜索打印机...',
    noSearchResults: '没有打印机符合您的搜索或筛选条件',
    filter: {
      allStatuses: '所有状态',
      allLocations: '所有位置',
    },
    toolbar: {
      filters: '筛选',
      view: '视图',
      actions: '操作',
    },
    // Printer card
    readyToPrint: '准备打印',
    external: '外部',
    extL: '外置左',
    extR: '外置右',
    deleteArchives: '删除打印归档',
    noLabel: '无标签',
    printPreview: '打印预览',
    width: '宽度',
    height: '高度',
    noObjectsFound: '未找到对象',
    objectsLoadedOnPrintStart: '对象在打印开始时加载',
    willBeSkipped: '将被跳过',
    name: '名称',
    serialCannotBeChanged: '序列号无法更改',
    locationHelp: '用于分组打印机和筛选队列任务',
    // WiFi signal strength
    wifiSignal: {
      veryWeak: '非常弱',
      weak: '弱',
      fair: '一般',
      good: '良好',
      excellent: '优秀',
    },
    // Maintenance
    maintenanceUpToDate: '所有维护均已完成 - 点击查看',
    // Chamber light
    chamberLightOn: '打开腔室灯',
    chamberLightOff: '关闭腔室灯',
    // Files
    files: '文件',
    browseFiles: '浏览打印机文件',
    // Smart plug
    autoOffAfterPrint: '打印后自动关机',
    autoOffExecuted: '已执行自动关机 - 开启打印机以重置',
    // HMS errors
    hmsErrors: 'HMS 错误',
    viewHmsErrors: '查看 {{count}} 个 HMS 错误',
    // Actions
    resume: '继续',
    pause: '暂停',
    stop: '停止',
    camera: '摄像头',
    skipObject: '跳过对象',
    reconnect: '重新连接',
    forceRefresh: '强制刷新',
    forceRefreshSuccess: '已请求刷新',
    mqttDebug: 'MQTT 调试',
    printerInformation: '打印机信息',
    copyToClipboard: '复制',
    copied: '已复制！',
    state: '状态',
    wifiSignalLabel: 'WiFi 信号',
    developerMode: '开发者模式',
    enabled: '已启用',
    disabled: '已禁用',
    addedOn: '添加日期',
    sdCard: 'SD 卡',
    inserted: '已插入',
    notInserted: '未插入',
    totalPrintHours: '打印时长',
    activeNozzle: '当前：{{nozzle}} 喷嘴',
    nozzleRack: '喷嘴架',
    nozzleDocked: '已停靠',
    nozzleMounted: '已安装',
    nozzleActive: '使用中',
    nozzleIdle: '空闲',
    nozzleDiameter: '直径',
    nozzleType: '类型',
    nozzleStatus: '状态',
    nozzleFilament: '耗材',
    nozzleWear: '磨损',
    nozzleMaxTemp: '最高温度',
    nozzleSerial: '序列号',
    nozzleHardenedSteel: '硬化钢',
    nozzleStainlessSteel: '不锈钢',
    nozzleTungstenCarbide: '碳化钨',
    nozzleFlow: '流量',
    nozzleHighFlow: '高流量',
    nozzleStandardFlow: '标准',
    // Firmware
    firmwareUpdate: '固件更新',
    firmwareInstructions: '在打印机触摸屏上，前往',
    firmwareNav: '导航到',
    settings: '设置',
    firmware: '固件',
    // Discovery
    discoverPrinters: '发现打印机',
    searching: '搜索中...',
    manualEntry: '手动输入',
    addFromCloud: '从云端添加',
    // Toast messages
    toast: {
      printerDeleted: '打印机已删除',
      missingSpoolAssignment: '已在{{printer}}上开始打印。以下料槽未分配耗材: {{slots}}',
      printerAdded: '打印机已添加',
      printerUpdated: '打印机已更新',
      failedToDelete: '删除打印机失败',
      failedToAdd: '添加打印机失败',
      connectionFailedNotAdded: '无法连接到打印机。请检查 IP 地址、序列号和访问码，并确认已启用仅局域网（LAN-only）模式。该打印机未被添加。',
      failedToUpdate: '更新打印机失败',
      commandSent: '命令已发送',
      failedToSendCommand: '发送命令失败',
      turnedOn: '{{name}} 已开启',
      failedToPowerOn: '开启 {{name}} 失败',
      scriptTriggered: '脚本已触发',
      printStopped: '打印已停止',
      printPaused: '打印已暂停',
      printResumed: '打印已继续',
      referenceDeleted: '参考已删除',
      detectionAreaSaved: '检测区域已保存',
      failedToRunScript: '运行脚本失败',
      failedToStopPrint: '停止打印失败',
      failedToPausePrint: '暂停打印失败',
      failedToResumePrint: '继续打印失败',
      failedToControlChamberLight: '控制腔室灯失败',
      failedToSetSpeed: '设置打印速度失败',
      failedToUpdateSetting: '更新设置失败',
      failedToSkipObjects: '跳过对象失败',
      failedToRereadRfid: '重新读取 RFID 失败',
      failedToCheckPlate: '检查打印板失败',
      failedToUpdateLabel: '更新标签失败',
      failedToDeleteReference: '删除参考失败',
      failedToSaveDetectionArea: '保存检测区域失败',
      plateCheckEnabled: '打印板检查已启用',
      plateCheckDisabled: '打印板检查已禁用',
      calibrationSaved: '校准已保存！',
      calibrationFailed: '校准失败',
      rfidRereadInitiated: '已发起 RFID 重新读取',
      loadInitiated: '加载耗材中…',
      unloadInitiated: '卸载耗材中…',
      failedToLoad: '加载耗材失败',
      failedToUnload: '卸载耗材失败',
    },
    // Connection status
    connection: {
      connected: '已连接',
      offline: '离线',
    },
    plateStatus: {
      markCleared: '将打印板标记为已清理',
      cleared: '打印板已清理',
      notCleared: '打印板未清理',
      inUse: '打印板使用中',
    },
    // Queue info
    queue: {
      inQueue: '队列中有 {{count}} 个打印任务',
      inQueue_plural: '队列中有 {{count}} 个打印任务',
    },
    // Controls section
    controls: '控制',
    // RFID
    rfid: {
      reread: '重新读取 RFID',
    },
    // AMS load/unload (#891)
    ams: {
      load: '加载',
      unload: '卸载',
    },
    bedJog: {
      title: '移动热床',
      bed: '热床',
      step: '步长 (mm)',
      up: '热床上移',
      down: '热床下移',
      disabledWhilePrinting: '打印中已禁用',
      notHomedTitle: '打印机未归零',
      notHomedMessage: '打印机自上次打印以来尚未归零。请先执行自动归零以确保安全定位（先停放喷头，然后归零 X、Y 和 Z），或者直接移动 — 软限位将被绕过。',
      homeZ: '自动归零',
      moveAnyway: '强制移动',
      homingStarted: '打印机自动归零中…',
    },
    // Permissions
    permission: {
      noAdd: '您没有添加打印机的权限',
      noEdit: '您没有编辑打印机的权限',
      noDelete: '您没有删除打印机的权限',
      noControl: '您没有控制打印机的权限',
      noFiles: '您没有访问打印机文件的权限',
      noAmsRfid: '您没有重新读取 AMS RFID 的权限',
      noSmartPlugControl: '您没有控制智能插座的权限',
      noCamera: '您没有查看摄像头的权限',
    },
    // Add/Edit modal
    modal: {
      addTitle: '添加打印机',
      editTitle: '编辑打印机',
      myPrinter: '我的打印机',
      selectModel: '选择型号...',
      locationGroup: '位置 / 分组（可选）',
      locationPlaceholder: '例如：工作室、办公室、地下室',
      autoArchiveLabel: '自动归档已完成的打印',
      fromPrinterSettings: '来自打印机设置',
      modelOptional: '型号（可选）',
      saveChanges: '保存更改',
    },
    // Skip objects
    skipObjects: {
      tooltip: '跳过对象',
      onlyWhilePrinting: '跳过对象（仅在打印时）',
      requiresMultiple: '跳过对象（需要2个以上对象）',
      title: '跳过对象',
      matchIdsInfo: '将 ID 与打印机显示屏上的 ID 进行对照',
      printerShowsIds: '打印机屏幕上显示构建板上对象的 ID',
      skipSelected: '跳过所选',
      skipping: '跳过中...',
      noObjectsSelected: '未选择对象',
      selectObjectsToSkip: '选择要从当前打印中跳过的对象',
      skipped: '已跳过',
      objectsSkipped: '对象已跳过',
      activeCount: '{{count}} 个活跃',
      waitForLayer: '等待第2层以上才能跳过对象（当前第 {{layer}} 层）',
      skip: '跳过',
      confirmTitle: '跳过对象？',
      confirmMessage: '确定要跳过"{{name}}"吗？此操作无法撤销。',
    },
    // Confirm modals
    confirm: {
      deleteTitle: '删除打印机',
      deleteMessage: '确定要删除"{{name}}"吗？这将移除所有连接设置。',
      deleteArchivesNote: '此打印机的所有打印历史将被永久删除。',
      keepArchivesNote: '打印历史将保留，但不再与此打印机关联。',
      stopTitle: '停止打印',
      stopMessage: '确定要停止"{{name}}"上的当前打印吗？这将取消打印任务。',
      stopButton: '停止打印',
      pauseTitle: '暂停打印',
      pauseMessage: '确定要暂停"{{name}}"上的当前打印吗？',
      pauseButton: '暂停打印',
      resumeTitle: '继续打印',
      resumeMessage: '确定要继续"{{name}}"上的打印吗？',
      resumeButton: '继续打印',
      powerOnTitle: '开启打印机',
      powerOnMessage: '确定要打开"{{name}}"的电源吗？',
      powerOnButton: '开机',
      powerOffTitle: '关闭打印机',
      powerOffMessage: '确定要关闭"{{name}}"的电源吗？',
      powerOffWarning: '警告："{{name}}"正在打印中！确定要关闭电源吗？这将中断打印并可能损坏打印机。',
      powerOffButton: '关机',
      haToggleTitle: '切换"{{name}}"',
      haToggleMessage: '切换 Home Assistant 实体 {{entity}}？如果当前为开启状态，可能会关闭电源。',
      haToggleWarning: '警告："{{name}}"正在打印中！切换 {{entity}} 可能会切断电源并中断打印。是否继续？',
      haToggleButton: '切换',
    },
    // Bulk actions
    bulk: {
      select: '选择',
      selectAll: '全选',
      selectByLocation: '按位置选择',
      selected: '已选择{{count}}台',
      actions: {
        stop: '停止',
        pause: '暂停',
        resume: '继续',
        clearPlate: '清除打印床',
        clearHMS: '清除通知',
      },
      confirm: {
        stopTitle: '停止{{count}}个打印任务',
        stopMessage: '这将取消{{count}}台打印机上的活动打印任务。此操作无法撤销。',
        stopButton: '全部停止',
        pauseTitle: '暂停{{count}}个打印任务',
        pauseMessage: '这将暂停{{count}}台打印机上的活动打印任务。',
        pauseButton: '全部暂停',
        clearPlateTitle: '清除{{count}}个打印床',
        clearPlateMessage: '这将清除{{count}}台打印机的打印床，可能会触发队列中的任务。',
        clearPlateButton: '全部清除',
      },
      success: '{{action}}已在{{count}}台打印机上完成',
      partial: '{{succeeded}}成功，{{failed}}失败',
      noneApplicable: '没有选中的打印机处于适合此操作的状态',
      selectByState: '按状态选择',
    },
    // Discovery
    discovery: {
      title: '发现打印机',
      searching: '搜索中...',
      scanning: '扫描中...',
      scanProgress: '扫描中... {{scanned}}/{{total}}',
      foundPrinters: '发现 {{count}} 台打印机',
      noPrintersFound: '未找到打印机',
      noPrintersFoundSubnet: '在指定子网中未找到打印机。',
      noPrintersFoundNetwork: '在网络上未找到打印机。',
      allConfigured: '所有发现的打印机已配置完毕。',
      alreadyAdded: '已添加',
      select: '选择',
      manualEntry: '手动输入',
      addFromCloud: '从云端添加',
      subnetToScan: '要扫描的子网',
      dockerNote: '检测到 Docker 环境。请以 CIDR 格式输入打印机所在子网。需要在 docker-compose.yml 中设置 network_mode: host。',
      scanSubnet: '扫描子网查找打印机',
      discoverNetwork: '在网络上发现打印机',
      scanningSubnet: '正在扫描子网查找拓竹打印机...',
      scanningNetwork: '正在扫描网络...',
      serialRequired: '需要序列号',
      unknown: '未知',
      failedToStart: '启动发现失败',
    },
    // AMS Drying
    drying: {
      start: '开始干燥',
      stop: '停止干燥',
      temperature: '温度',
      duration: '时长',
      hours: '小时',
      timeRemaining: '剩余 {{time}}',
      active: '干燥中',
      notSupported: '不支持干燥',
      powerRequired: '连接AMS电源适配器以启用干燥',
      startingDrying: '正在启动干燥...',
      stoppingDrying: '正在停止干燥...',
      rotateTray: '干燥时旋转料盘',
    },
    // Filaments section
    filaments: '耗材',
    // Camera
    openCameraOverlay: '打开摄像头叠加层',
    openCameraWindow: '在新窗口中打开摄像头',
    // Firmware
    firmwareUpdateAvailable: '固件更新可用：{{current}} → {{latest}}',
    firmwareUpToDate: '固件 {{version}} — 已是最新',
    firmwareUpdateButton: '更新',
    // Plate detection
    plateDetection: {
      noPermission: '您没有更新打印机的权限',
      enabledClick: '打印板检查已启用 - 点击禁用',
      disabledClick: '打印板检查已禁用 - 点击启用',
      manageCalibration: '管理打印板检测校准',
      calibrationRequired: '需要校准',
      calibrationInstructions: '请确保构建板<strong>完全空置</strong>，然后点击校准。',
      calibrationDescription: '校准会拍摄空置打印板的参考图像。后续检查将与此参考进行比较以检测物体。',
      calibrationTip: '<strong>提示：</strong>您最多可以为不同的打印板存储5个校准。系统会在检查时自动使用最佳匹配。',
      plateEmpty: '打印板似乎是空的',
      objectsDetected: '在打印板上检测到物体',
      confidence: '置信度',
      difference: '差异',
      analysisPreview: '分析预览：',
      analysisLegend: '绿色框 = 检测区域，红色覆盖 = 与校准的差异',
      savedReferences: '已保存的参考 ({{count}}/{{max}})',
      deleteReference: '删除参考',
      labelPlaceholder: '标签...',
      clickToEdit: '{{label}} - 点击编辑',
      clickToAddLabel: '点击添加标签',
    },
    // Speed
    speed: {
      title: '打印速度',
      silent: '静音 (50%)',
      standard: '标准 (100%)',
      sport: '运动 (124%)',
      ludicrous: '疯狂 (166%)',
    },
    airduct: {
      title: '风道模式',
      cooling: '制冷',
      heating: '加热',
    },
    noSdCard: '无SD',
    door: {
      open: '开',
      closed: '关',
    },
    // Fans
    fans: {
      partCooling: '零件冷却风扇',
      auxiliary: '辅助风扇',
      chamber: '腔室风扇',
    },
    // HMS errors
    clickToViewHmsErrors: '点击查看 HMS 错误',
    estimatedCompletion: '预计完成时间',
    plateNumber: '板 {{number}}',
    slotOptions: '槽位选项',
    // AMS hover popup
    amsPopup: {
      friendlyName: 'AMS 名称',
      friendlyNamePlaceholder: '例如 AMS 友好名称',
      serialNumber: '序列号',
      firmwareVersion: '固件',
      save: '保存',
      clear: '清除',
      noEditPermission: '您没有重命名 AMS 单元的权限',
    },
    // Firmware modal
    firmwareModal: {
      title: '固件更新',
      titleUpToDate: '固件信息',
      currentVersion: '当前版本：',
      latestVersion: '最新版本：',
      releaseNotes: '发布说明',
      checkingPrereqs: '正在检查前提条件...',
      sdCardReady: 'SD 卡已就绪。点击下方上传固件。',
      uploadedSuccess: '固件已上传到 SD 卡！',
      applyInstructions: '在打印机上应用更新：',
      step1: '在打印机触摸屏上，前往<strong>设置</strong>',
      step2: '导航到<strong>固件</strong>',
      step3: '选择<strong>从 SD 卡更新</strong>',
      step4: '更新将需要 10-20 分钟',
      done: '完成',
      starting: '启动中...',
      uploadFirmware: '上传固件',
      uploadFailed: '上传启动失败：{{error}}',
      uploadedToast: '固件已上传！请在打印机屏幕上触发更新。',
      availableVersions: '可用版本',
      usable: '可用',
      unavailable: '不可用',
      installed: '已安装',
      newerBadge: '较新',
      olderBadge: '较旧',
      currentBadge: '当前',
    },
    accessCodePlaceholder: '留空以保持当前值',
    // ROI editor
    roi: {
      title: '检测区域 (ROI)',
      xStart: 'X 起点',
      yStart: 'Y 起点',
      width: '宽度',
      height: '高度',
      instruction: '调整检测区域以聚焦到构建板。预览中的绿色框显示当前区域。',
    },
    developerModeWarning: '以下打印机未启用开发者局域网模式：{{names}}。某些功能可能无法使用。',
    howToEnable: '如何启用',
    incompatibleFile: '此文件是为 {{slicedFor}} 切片的，但该打印机是 {{printerModel}}',
    dropNotPrintable: '只能打印 .gcode 和 .gcode.3mf 文件',
    dropToPrint: '拖放以打印',
    cannotPrint: '打印机忙碌',
  },

  // Archives page
  archives: {
    title: '打印归档',
    searchPlaceholder: '搜索归档...',
    filterByPrinter: '按打印机筛选',
    filterByStatus: '按状态筛选',
    sortBy: '排序方式',
    sortNewest: '最新优先',
    sortOldest: '最旧优先',
    sortName: '名称',
    sortDuration: '时长',
    sortLargest: '最大优先',
    sortSmallest: '最小优先',
    sortSize: '大小',
    noArchives: '未找到归档',
    noArchivesSearch: '没有匹配搜索的归档',
    originalPrintNotVisible: '原始打印不可见 - 请尝试清除筛选条件',
    noArchivesYet: '暂无归档',
    prints: '条打印',
    pagination: {
      showing: '显示',
      to: '至',
      of: '共',
      show: '每页',
      page: '页',
      all: '全部',
    },
    loadingArchives: '加载归档中...',
    releaseToUpload: '释放以上传',
    showAll: '显示全部',
    showFavoritesOnly: '仅显示收藏',
    gridView: '网格视图',
    listView: '列表视图',
    calendarView: '日历视图',
    logView: '打印日志',
    manageTags: '管理标签',
    showFailedPrints: '显示失败的打印',
    hideFailedPrints: '隐藏失败的打印',
    hideDuplicates: '隐藏重复项',
    viewOriginalPrint: '点击查看原始打印 (#{{id}})',
    printTime: '打印时间',
    filamentUsed: '耗材用量',
    cost: '成本',
    reprint: '重新打印',
    preview: '预览',
    deleteArchive: '删除归档',
    deleteConfirm: '确定要删除此归档吗？',
    favorite: '收藏',
    unfavorite: '取消收藏',
    viewDetails: '查看详情',
    status: {
      completed: '已完成',
      failed: '失败',
      stopped: '已停止',
    },
    toast: {
      source3mfAttached: '源 3MF 已附加：{{filename}}',
      failedUploadSource3mf: '上传源 3MF 失败',
      source3mfRemoved: '源 3MF 已移除',
      failedRemoveSource3mf: '移除源 3MF 失败',
      f3dAttached: 'F3D 已附加：{{filename}}',
      failedUploadF3d: '上传 F3D 失败',
      f3dRemoved: 'F3D 已移除',
      failedRemoveF3d: '移除 F3D 失败',
      timelapseAttached: '延时摄影已附加：{{filename}}',
      timelapseAlreadyAttached: '延时摄影已附加',
      noMatchingTimelapse: '未找到匹配的延时摄影',
      failedScanTimelapse: '扫描延时摄影失败',
      failedAttachTimelapse: '附加延时摄影失败',
      timelapseRemoved: '延时摄影已移除',
      failedRemoveTimelapse: '移除延时摄影失败',
      timelapseUploaded: '延时摄影已上传：{{filename}}',
      failedUploadTimelapse: '上传延时摄影失败',
      archiveDeleted: '归档已删除',
      failedDeleteArchive: '删除归档失败',
      addedToFavorites: '已添加到收藏',
      removedFromFavorites: '已从收藏中移除',
      projectUpdated: '项目已更新',
      failedUpdateProject: '更新项目失败',
      linkCopied: '链接已复制到剪贴板',
      failedCopyLink: '复制链接失败',
      photoDeleted: '照片已删除',
      failedDeletePhoto: '删除照片失败',
      failedDeleteArchives: '删除归档失败',
      failedUpdateFavorites: '更新收藏失败',
      exportDownloaded: '导出已下载',
      exportFailed: '导出失败',
    },
    menu: {
      print: '打印',
      schedule: '排程',
      openInBambuStudio: '在切片软件中打开',
      slice: '切片',
      externalLink: '外部链接',
      viewOnMakerWorld: '在 MakerWorld 上查看',
      preview3d: '3D 预览',
      viewTimelapse: '查看延时摄影',
      scanForTimelapse: '扫描延时摄影',
      uploadTimelapse: '上传延时摄影',
      removeTimelapse: '移除延时摄影',
      downloadSource3mf: '下载源 3MF',
      uploadSource3mf: '上传源 3MF',
      replaceSource3mf: '替换源 3MF',
      removeSource3mf: '移除源 3MF',
      uploadF3d: '上传 F3D',
      replaceF3d: '替换 F3D',
      downloadF3d: '下载 F3D',
      removeF3d: '移除 F3D',
      download: '下载',
      copyDownloadLink: '复制下载链接',
      qrCode: '二维码',
      viewPhotos: '查看照片',
      viewPhotosCount: '查看照片 ({{count}})',
      projectPage: '项目页面',
      addToFavorites: '添加到收藏',
      removeFromFavorites: '从收藏中移除',
      edit: '编辑',
      printLog: '打印记录',
      goToProject: '前往项目：{{name}}',
      addToProject: '添加到项目',
      removeFromProject: '从项目中移除',
      loading: '加载中...',
      noProjectsAvailable: '无可用项目',
      searchProjects: '搜索项目…',
      select: '选择',
      deselect: '取消选择',
      delete: '删除',
    },
    permission: {
      noReprint: '您没有重新打印此归档的权限',
      noAddToQueue: '您没有添加到队列的权限',
      noUpdateArchives: '您没有更新归档的权限',
      noUploadFiles: '您没有上传文件的权限',
      noDownload: '您没有下载归档的权限',
      noCopyLink: '您没有复制下载链接的权限',
      noDelete: '您没有删除此归档的权限',
      noCreate: '您没有创建归档的权限',
    },
    platePicker: {
      title: '选择要预览的打印板',
      hint: '此存档包含多个打印板。选择一个在 GCode 查看器中打开。',
      plateLabel: '打印板 {{index}}',
      objectCount: '{{count}} 个对象',
      objectCount_plural: '{{count}} 个对象',
      noGcode: '此存档没有可预览的已切片 G 代码。请先在 Bambu Studio 中打开并切片。',
    },
    card: {
      previousPlate: '上一个板',
      nextPlate: '下一个板',
      plateNumber: '板 {{index}}',
      moreOptions: '右键查看更多选项',
      addToFavorites: '添加到收藏',
      removeFromFavorites: '从收藏中移除',
      cancelled: '已取消',
      failed: '失败',
      duplicate: '重复',
      duplicateTitle: '此模型之前已打印过',
      openSource3mf: '在 Bambu Studio 中打开源 3MF（右键查看更多选项）',
      downloadF3d: '下载 Fusion 360 设计文件',
      viewTimelapse: '查看延时摄影',
      viewPhoto: '查看 1 张照片',
      viewPhotos: '查看 {{count}} 张照片',
      openFolder: '打开文件夹：{{name}}',
      slicedFile: '已切片文件 - 可以打印',
      sourceFile: '仅源文件 - 无 AMS 映射可用',
      gcode: 'GCODE',
      source: '源文件',
      project: '项目：{{name}}',
      runsBadge: '{{count}} 次打印',
      runsBadgeTitle: '共 {{count}} 次打印 — 成功 {{successful}} 次，失败 {{failed}} 次。点击查看完整打印记录。',
      estimated: '预计：{{time}}',
      actual: '实际：{{time}}',
      accuracy: '准确度：{{percent}}%',
      filament: '{{weight}} 克',
      layer: '{{count}} 层',
      layers: '{{count}} 层',
      object: '{{count}} 个对象',
      objects: '{{count}} 个对象',
      slicedFor: '为 {{model}} 切片',
      uploadedBy: '上传者',
      noPermissionReprint: '您没有重新打印的权限',
      noFileForReprint: '无可用的 3MF 文件 — 打印记录时无法从打印机下载该文件',
      noPermissionEdit: '您没有编辑归档的权限',
      noPermissionDelete: '您没有删除归档的权限',
      reprint: '重新打印',
      schedulePrint: '排程打印',
      schedule: '排程',
      openInBambuStudio: '在切片软件中打开',
      openInBambuStudioToSlice: '在切片软件中打开进行切片',
      slice: '切片',
      externalLink: '外部链接',
      makerWorld: 'MakerWorld：{{designer}}',
      viewProject: '查看项目',
      noExternalLink: '无外部链接',
      preview3d: '3D 预览',
      download: '下载',
      edit: '编辑',
      delete: '删除',
    },
    runLog: {
      title: '打印记录',
      modalTitle: '打印记录 — {{name}}',
      modalTitleFallback: '此归档',
      empty: '此归档尚未记录任何打印事件。',
      col: {
        date: '日期',
        status: '状态',
        duration: '时长',
        filament: '耗材',
        cost: '成本',
      },
      status: {
        completed: '已完成',
        failed: '失败',
        cancelled: '已取消',
        stopped: '已停止',
        skipped: '已跳过',
        printing: '打印中',
      },
    },
    modal: {
      deleteArchive: '删除归档',
      deleteConfirm: '确定要删除"{{name}}"吗？此操作无法撤销。',
      deleteButton: '删除',
      deletePurgeStats: '同时从快速统计中删除此打印（耗材、时间、成本、能耗）',
      removeSource3mf: '移除源 3MF',
      removeSource3mfConfirm: '确定要从"{{name}}"中移除源 3MF 文件吗？这将删除原始切片项目文件。',
      removeButton: '移除',
      removeF3d: '移除 F3D',
      removeF3dConfirm: '确定要从"{{name}}"中移除 Fusion 360 设计文件吗？',
      removeTimelapse: '移除延时摄影',
      removeTimelapseConfirm: '确定要从"{{name}}"中移除延时摄影视频吗？',
      timelapse: '{{name}} - 延时摄影',
      selectTimelapse: '选择延时摄影',
      selectTimelapseDesc: '未找到自动匹配。请选择此打印的延时摄影：',
      deleteArchives: '删除归档',
      deleteArchivesConfirm: '确定要删除 {{count}} 个归档吗？此操作无法撤销。',
      deleteCount: '删除 {{count}} 个',
    },
    page: {
      title: '归档',
      printsCount: '{{filtered}} / {{total}} 次打印',
      dropFilesHere: '将 .3mf 文件拖放到此处',
      releaseToUpload: '释放以上传',
      only3mfSupported: '仅支持 .3mf 文件',
      close: '关闭',
      selected: '已选择 {{count}} 个',
      selectAll: '全选',
      tags: '标签',
      project: '项目',
      favorite: '收藏',
      delete: '删除',
      toggledFavorites: '已切换 {{count}} 个归档的收藏状态',
      failedUpdateFavorites: '更新收藏失败',
      archivesDeleted: '已删除 {{count}} 个归档',
      failedDeleteArchives: '删除归档失败',
      photoDeleted: '照片已删除',
      failedDeletePhoto: '删除照片失败',
    },
    list: {
      name: '名称',
      printer: '打印机',
      date: '日期',
      size: '大小',
      actions: '操作',
      hasTimelapse: '有延时摄影',
    },
    log: {
      date: '日期',
      printName: '打印名称',
      printer: '打印机',
      user: '用户',
      status: '状态',
      duration: '时长',
      filament: '耗材',
      allPrinters: '所有打印机',
      allUsers: '所有用户',
      allStatuses: '所有状态',
      cancelled: '已取消',
      skipped: '已跳过',
      dateFrom: '从',
      dateTo: '到',
      noEntries: '未找到打印日志条目',
      showing: '显示 {{count}} / {{total}} 条',
      rowsPerPage: '行数',
      page: '页',
      prev: '上一页',
      next: '下一页',
      clearLog: '清除日志',
      clearLogTitle: '清除打印日志',
      clearLogConfirm: '所有打印日志条目将被永久删除。归档和队列项目不受影响。此操作无法撤销。确定要继续吗？',
      clearLogButton: '全部清除',
      cleared: '已清除 {{count}} 条日志',
      clearFailed: '清除打印日志失败',
    },
  },

  // Queue page
  queue: {
    title: '打印队列',
    subtitle: '排程和管理您的打印任务',
    addToQueue: '添加到队列',
    // Print modal
    print: '打印',
    reprint: '重新打印',
    schedulePrint: '排程打印',
    editQueueItem: '编辑队列项目',
    printToPrinters: '打印到 {{count}} 台打印机',
    queueToPrinters: '排队到 {{count}} 台打印机',
    queueSelectedPlates: '将 {{count}} 个热床加入队列',
    selectAllPlates: '选择全部 {{count}} 个热床',
    deselectAll: '取消全选',
    printQueued: '已加入打印队列',
    itemsQueued: '{{count}} 个任务已加入队列',
    sending: '发送中...',
    sendingProgress: '发送中 {{current}}/{{total}}...',
    adding: '添加中...',
    addingProgress: '添加中 {{current}}/{{total}}...',
    savingProgress: '保存中 {{current}}/{{total}}...',
    clearQueue: '清空队列',
    clearHistory: '清除历史',
    emptyQueue: '队列为空',
    position: '位置',
    scheduledTime: '排程时间',
    moveUp: '上移',
    moveDown: '下移',
    startNow: '立即开始',
    printingInProgress: '打印进行中...',
    viewArchive: '查看归档',
    viewInFileManager: '在文件管理器中查看',
    itemCount: '{{count}} 个项目',
    itemCount_plural: '{{count}} 个项目',
    dragToReorder: '拖动以重新排序（仅限尽快）',
    reorderHint: '位置仅影响"尽快"项目。排程项目按设定时间运行。',
    sjf: {
      label: 'SJF',
      tooltip: '最短任务优先 — 调度器优先处理较短的打印任务',
    },
    addedBy: '由 {{name}} 添加',
    nextInQueue: '队列中的下一个',
    clearPlateSuccess: '打印板已清理 — 准备进行下一个打印',
    plateNumber: '板 {{index}}',
    // Batch / quantity
    quantity: '数量',
    quantityHint: '创建 {{count}} 个队列项目',
    activeBatches: '活跃批次',
    batchProgress: '已完成 {{completed}}/{{total}}',
    cancelBatch: '取消剩余',
    batchCancelled: '已取消剩余批次项目',
    cancelBatchConfirmTitle: '取消批次',
    cancelBatchConfirmMessage: '取消此批次中所有剩余的待处理项目？',
    batch: '批次',
    // Sections
    sections: {
      currentlyPrinting: '正在打印',
      queued: '排队中',
      history: '历史',
    },
    // Status
    status: {
      pending: '等待中',
      waiting: '等待中',
      printing: '打印中',
      paused: '已暂停',
      completed: '已完成',
      failed: '失败',
      skipped: '已跳过',
      cancelled: '已取消',
    },
    // Summary cards
    summary: {
      printing: '打印中',
      queued: '排队中',
      totalTime: '总队列时间',
      totalWeight: '总队列重量',
      history: '历史',
    },
    // Filters
    filter: {
      allPrinters: '所有打印机',
      unassigned: '未分配',
      allStatus: '所有状态',
      allLocations: '所有位置',
      any: '任意',
    },
    // Sort
    sort: {
      byPosition: '按位置排序',
      byName: '按名称排序',
      byPrinter: '按打印机排序',
      bySchedule: '按排程排序',
      byDate: '按日期排序',
      ascendingOldest: '升序（最旧优先）',
      descendingNewest: '降序（最新优先）',
    },
    // Badges
    badges: {
      staged: '已暂存',
      requiresPrevious: '需要前一个成功',
      autoPowerOff: '自动关机',
      gcodeInjection: 'G-code',
    },
    // Empty state
    empty: {
      title: '没有排程的打印',
      description: '从归档页面使用右键菜单中的"排程"选项来排程打印，或拖放文件开始。',
    },
    // Time
    time: {
      asap: '尽快',
      overdue: '已逾期',
      now: '现在',
      lessThanMinute: '不到一分钟',
      inMinutes: '{{count}} 分钟后',
      inHours: '{{count}} 小时后',
    },
    // Actions
    actions: {
      stopPrint: '停止打印',
      startPrint: '开始打印',
      requeue: '重新排队',
    },
    // Bulk edit
    bulkEdit: {
      title: '编辑 {{count}} 个项目',
      title_plural: '编辑 {{count}} 个项目',
      description: '仅更改的设置将应用于所选项目。',
      printer: '打印机',
      noChange: '— 不更改 —',
      queueOptions: '队列选项',
      staged: '暂存（手动开始）',
      autoPowerOff: '打印后自动关机',
      requirePrevious: '要求前一个成功',
      printOptions: '打印选项',
      bedLevelling: '热床调平',
      flowCalibration: '流量校准',
      vibrationCalibration: '振动校准',
      layerInspection: '首层检查',
      timelapse: '延时摄影',
      useAms: '使用 AMS',
      applyChanges: '应用更改',
      selectAll: '全选',
      deselectAll: '取消全选',
      selected: '已选择 {{count}} 个',
      editSelected: '编辑所选',
      cancelSelected: '取消所选',
    },
    // Confirmations
    confirm: {
      cancelTitle: '取消排程打印',
      cancelMessage: '确定要取消"{{name}}"吗？',
      stopTitle: '停止打印',
      stopMessage: '确定要停止当前打印"{{name}}"吗？这将取消打印机上的打印任务。',
      removeTitle: '从历史中移除',
      removeMessage: '确定要从队列历史中移除"{{name}}"吗？',
      clearHistoryTitle: '清除历史',
      clearHistoryMessage: '确定要从历史中移除所有 {{count}} 个项目吗？',
      cancelButton: '取消打印',
      stopButton: '停止打印',
      thisPrint: '此打印',
      thisItem: '此项目',
    },
    // Toast messages
    toast: {
      cancelled: '队列项目已取消',
      cancelFailed: '取消项目失败',
      removed: '队列项目已移除',
      removeFailed: '移除项目失败',
      stopped: '打印已停止',
      stopFailed: '停止打印失败',
      released: '打印已释放到队列',
      startFailed: '开始打印失败',
      reorderFailed: '重新排序队列失败',
      historyCleared: '已清除 {{count}} 条历史记录',
      clearHistoryFailed: '清除历史失败',
      updateFailed: '更新项目失败',
      bulkCancelled: '已取消 {{count}} 个项目',
      bulkCancelFailed: '批量取消项目失败',
    },
    // Timeline view
    timeline: {
      listView: '列表',
      timelineView: '时间线',
      unassigned: '未分配',
      noData: '当天没有计划的打印任务',
      allDoneBy: '所有打印预计在 {{time}} 前完成',
      staged: '暂存',
      filterAll: '全部显示',
      filterPrinting: '打印中',
      filterQueued: '排队中',
      time: {
        anyMoment: '即将完成',
        minutesLeft: '剩余{{minutes}}分钟',
        hoursLeft: '剩余{{hours}}小时',
        hoursMinutesLeft: '剩余{{hours}}小时{{minutes}}分钟',
      },
      day: {
        previous: '前一天',
        next: '后一天',
        today: '今天',
      },
    },
    // Permissions
    permissions: {
      noStopPrint: '您没有停止打印的权限',
      noStartPrint: '您没有开始打印的权限',
      noEdit: '您没有编辑此队列项目的权限',
      noCancel: '您没有取消此队列项目的权限',
      noRequeue: '您没有重新排队的权限',
      noRemove: '您没有移除此队列项目的权限',
      noClearHistory: '您没有清除所有历史的权限',
      noEditItems: '您没有编辑队列项目的权限',
      noCancelItems: '您没有取消队列项目的权限',
    },
  },

  backgroundDispatch: {
    unknownFile: '未知文件',
    unknownPrinter: '未知打印机',
    startingPrints: '正在开始打印',
    progressSummary: '{{complete}}/{{total}} 完成 • 已分发：{{dispatched}} • 处理中：{{processing}}',
    expandDetails: '展开分发详情',
    collapseDetails: '收起分发详情',
    dismissToast: '关闭分发通知',
    cancelDispatchJob: '取消分发任务',
    cancel: '取消',
    cancelling: '取消中…',
    awaitingPrinter: '等待打印机…',
    status: {
      dispatched: '已分发',
      processing: '处理中',
      completed: '已完成',
      failed: '失败',
      cancelled: '已取消',
    },
    toast: {
      cancellingUpload: '取消上传中...',
      cancelled: '分发已取消',
      cancelFailed: '取消分发失败',
      completeWithFailures: '后台分发完成：{{completed}} 成功，{{failed}} 失败',
      completeSuccess: '后台分发完成：{{completed}} 成功',
      printStartedRemaining: '{{completed}} 个打印已开始，{{remaining}} 个正在发送...',
    },
  },

  // Statistics page
  stats: {
    title: '统计',
    subtitle: '拖动小部件以重新排列。点击眼睛图标隐藏。',
    overview: '概览',
    totalPrints: '总打印次数',
    successRate: '成功率',
    totalPrintTime: '总打印时间',
    printTime: '打印时间',
    totalFilament: '总耗材用量',
    filamentUsed: '耗材用量',
    filamentCost: '耗材成本',
    totalCost: '总成本',
    energyUsed: '能耗',
    energyCost: '能源成本',
    energyWarmingUpTooltip: '能耗追踪正在收集每小时快照。当所选范围之前至少存在一个快照时，时间段合计将变得准确。早期数值可能偏低。',
    averagePrintTime: '平均打印时间',
    printsPerDay: '每日打印次数',
    byPrinter: '按打印机',
    printsByPrinter: '各打印机打印次数',
    byMaterial: '按材料',
    byMonth: '按月份',
    last7Days: '最近 7 天',
    last30Days: '最近 30 天',
    last90Days: '最近 90 天',
    allTime: '全部时间',
    // Widgets
    quickStats: '快速统计',
    printActivity: '打印活动',
    filamentTypes: '耗材类型',
    filamentTrends: '耗材趋势',
    failureAnalysis: '失败分析',
    timeAccuracy: '时间准确度',
    successful: '成功：',
    failed: '失败：',
    perfectEstimate: '100% = 完美估计',
    noTimeAccuracyData: '暂无时间准确度数据',
    noFilamentData: '暂无耗材数据',
    noPrinterData: '暂无打印机数据',
    noPrintData: '暂无打印数据',
    noPrintDataLast30Days: '最近 30 天无打印数据',
    failureReasons: '失败原因',
    topFailureReasons: '主要失败原因',
    failedPrintsCount: '{{failed}} / {{total}} 次打印失败',
    lastWeekRate: '上周：{{rate}}%',
    // Actions
    resetLayout: '重置布局',
    recalculateCosts: '重新计算成本',
    recalculateCostsHint: '使用当前耗材价格重新计算所有归档成本',
    exportStats: '导出统计',
    exportAsCsv: '导出为 CSV',
    exportAsExcel: '导出为 Excel',
    hiddenCount: '{{count}} 个已隐藏',
    // Toast
    exportDownloaded: '导出已下载',
    exportFailed: '导出失败',
    layoutReset: '布局已重置',
    recalculatedCosts: '已为 {{count}} 个归档重新计算成本',
    recalculateFailed: '重新计算成本失败',
    // Loading
    loadingStats: '加载统计数据中...',
    // Permissions
    noPermissionResetLayout: '您没有重置布局的权限',
    noPermissionRecalculate: '您没有重新计算成本的权限',
    noPrintDataInRange: '所选范围内无打印数据',
    periodFilament: '期间耗材',
    periodCost: '期间成本',
    avgPerPrint: '每次打印平均',
    usageOverTime: '随时间的使用量',
    filamentByWeight: '重量',
    printDuration: '打印时长',
    printerUtilization: '打印机利用率',
    filamentSuccess: '按材料成功率',
    printHabits: '打印习惯',
    printTimeOfDay: '打印时段',
    colorDistribution: '颜色分布',
    noColorData: '暂无颜色数据',
    records: '记录',
    longestPrint: '最长打印',
    heaviestPrint: '最重打印',
    mostExpensivePrint: '最贵打印',
    busiestDay: '最忙碌的一天',
    successStreak: '连续成功',
    streakPrint: '连续打印',
    streakPrints: '{{count}} 次连续打印',
    printerStats: '打印机统计',
    hours: '小时',
    avgPrints: '平均打印',
    noArchiveData: '暂无打印数据',
    filamentByTime: '时间',
    avgWeight: '平均重量',
    avgTime: '平均时间',
    filamentByPrints: '打印次数',
    timeframe: {
      today: '今天',
      'this-week': '本周',
      'this-month': '本月',
      'last-7': '最近 7 天',
      'last-30': '最近 30 天',
      'last-90': '最近 90 天',
      'this-year': '今年',
      'all-time': '全部时间',
      custom: '自定义范围',
      from: '从',
      to: '到',
    },
    allUsers: '所有用户',
    noUser: '无用户（系统）',
    filterByUser: '按用户筛选',
  },

  // Maintenance page
  maintenance: {
    title: '维护',
    overview: '概览',
    allOk: '所有维护均已完成',
    dueCount: '{{count}} 项到期',
    dueCount_plural: '{{count}} 项到期',
    warningCount: '{{count}} 个警告',
    warningCount_plural: '{{count}} 个警告',
    totalPrintTime: '总打印时间',
    nextMaintenance: '下次维护',
    nothingDue: '无到期项目',
    tasks: '任务',
    lastPerformed: '上次执行',
    interval: '间隔',
    hoursRemaining: '剩余 {{hours}} 小时',
    hoursOverdue: '逾期 {{hours}} 小时',
    markDone: '标记为完成',
    performMaintenance: '执行维护',
    history: '历史',
    noHistory: '无维护历史',
    editPrintHours: '编辑打印时间',
    currentHours: '当前小时数',
    // Tabs
    statusTab: '状态',
    settingsTab: '设置',
    // Status
    overdueCount: '{{count}} 个逾期',
    dueSoonCount: '{{count}} 个即将到期',
    dueSoon: '即将到期',
    allGood: '一切正常',
    overdueBy: '逾期 {{duration}}',
    dueIn: '{{duration}} 后到期',
    timeLeft: '剩余 {{duration}}',
    // Duration formats
    day: '1 天',
    days: '{{count}} 天',
    week: '1 周',
    weeks: '{{count}} 周',
    month: '1 个月',
    months: '{{count}} 个月',
    year: '1 年',
    // Settings
    maintenanceTypes: '维护类型',
    maintenanceTypesDescription: '系统类型和您的自定义维护任务',
    addCustomType: '添加自定义类型',
    restoreDefaults: '恢复默认任务',
    intervalType: '间隔类型',
    intervalValue: '间隔 ({{type}})',
    icon: '图标',
    documentationLink: '文档链接（可选）',
    assignToPrinters: '分配给打印机',
    selectAtLeastOnePrinter: '至少选择一台打印机',
    addType: '添加类型',
    custom: '自定义',
    printHours: '打印小时数',
    calendarDays: '日历天数',
    exampleName: '例如：更换 HEPA 过滤器',
    viewDocumentation: '查看文档',
    timeBasedInterval: '基于时间的间隔',
    // Interval overrides
    intervalOverrides: '间隔覆盖',
    intervalOverridesDescription: '为特定打印机自定义间隔',
    // Printer assignment
    assignedToPrinters: '已分配给打印机：',
    noPrintersAssigned: '未分配打印机',
    addPrinterShort: '添加：',
    printersAssignedClick: '已分配 {{count}} 台打印机 - 点击管理',
    removeFromPrinter: '从此打印机移除',
    // Types
    types: {
      lubricateCarbonRods: '润滑碳纤维杆',
      lubricateRails: '润滑线性导轨',
      cleanNozzle: '清洁喷嘴/热端',
      checkBelts: '检查皮带张力',
      cleanBuildPlate: '清洁构建板',
      checkExtruder: '检查挤出机齿轮',
      checkCooling: '检查冷却风扇',
      generalInspection: '综合检查',
      cleanCarbonRods: '清洁碳纤维杆',
      lubricateSteelRods: '润滑钢杆',
      cleanSteelRods: '清洁钢杆',
      cleanLinearRails: '清洁线性导轨',
      checkPtfeTube: '检查 PTFE 管',
      replaceHepaFilter: '更换 HEPA 过滤器',
      replaceCarbonFilter: '更换活性炭过滤器',
      lubricateLeftNozzleRail: '润滑左喷嘴导轨',
    },
    // Toast
    maintenanceComplete: '维护已标记为完成',
    typeUpdated: '维护类型已更新',
    typeDeleted: '维护类型已删除',
    defaultsRestored: '已恢复 {{count}} 个默认任务',
    printHoursUpdated: '打印小时数已更新',
    printerAssigned: '打印机已分配',
    printerRemoved: '打印机已移除',
    // Confirmation
    deleteTypeConfirm: '删除"{{name}}"？',
    deleteSystemTypeTitle: '删除默认维护任务？',
    deleteSystemTypeMessage: '确定要删除默认维护任务"{{name}}"吗？',
    // Permissions
    noPermissionUpdate: '您没有更新维护项目的权限',
    noPermissionPerform: '您没有执行维护的权限',
    noPermissionEditTypes: '您没有编辑维护类型的权限',
    noPermissionDeleteTypes: '您没有删除维护类型的权限',
    noPermissionEditHours: '您没有编辑打印时间的权限',
    noPermissionRemovePrinter: '您没有移除打印机分配的权限',
    noPermissionAssignPrinter: '您没有分配打印机的权限',
    noPermissionEditIntervals: '您没有编辑间隔的权限',
    // Configure link
    configureSettings: '配置维护类型和间隔',
  },

  // Settings page
  settings: {
    title: '设置',
    general: '通用',
    // Tab names
    tabs: {
      general: '通用',
      smartPlugs: '智能插座',
      notifications: '通知',
      queue: '工作流',
      filament: '耗材',
      network: '网络',
      apiKeys: 'API 密钥',
      virtualPrinter: '虚拟打印机',
      spoolbuddy: 'SpoolBuddy',
      failureDetection: '故障检测',
      users: '身份验证',
      backup: '备份',
      emailAuth: '邮箱认证',
      ldap: 'LDAP',
      twoFa: '双因素认证',
      oidc: 'SSO / OIDC',
      security: '安全',
    },
    spoolbuddy: {
      infoTitle: 'SpoolBuddy 设备',
      infoBody: 'SpoolBuddy kiosk 通过心跳自动注册。如果设备不再使用，或守护进程崩溃遗留了陈旧的重复项，可在此注销。',
      duplicatesTitle: '已注册 {{count}} 台设备',
      duplicatesBody: 'kiosk 界面只使用最先注册的设备。如果其中有因崩溃遗留的陈旧重复项，请注销它——在线设备会在下次心跳时重新注册自己。',
      empty: '尚未注册任何 SpoolBuddy 设备。',
      online: '在线',
      offline: '离线',
      unregister: '注销',
      unregisterSuccess: '设备已注销',
      unregisterError: '注销设备失败',
      confirmTitle: '注销 SpoolBuddy 设备？',
      confirmBody: '将从数据库中移除 "{{hostname}}" ({{deviceId}})。如果设备在线，会在下次心跳时重新注册自己。',
      ipAddress: 'IP 地址',
      firmware: '固件',
      lastSeen: '上次在线',
      daemonUptime: '守护进程运行时间',
      systemUptime: '系统运行时间',
      never: '从未',
      nfc: 'NFC',
      scale: '秤',
      cpuTemp: 'CPU 温度',
      memory: '内存',
      disk: '磁盘',
      // Device actions
      update: '更新',
      updateConfirmTitle: '更新 SpoolBuddy 守护进程？',
      updateConfirmBody: '对 "{{hostname}}" 触发软件更新？更新完成后守护进程将重启。',
      restartBrowser: '重启浏览器',
      restartBrowserConfirmTitle: '重启 kiosk 浏览器？',
      restartBrowserConfirmBody: '在 "{{hostname}}" 上重启 kiosk 浏览器？显示将短暂黑屏。',
      restartDaemon: '重启守护进程',
      restartDaemonConfirmTitle: '重启 SpoolBuddy 守护进程？',
      restartDaemonConfirmBody: '在 "{{hostname}}" 上重启 SpoolBuddy 守护进程？设备将离线几秒钟。',
      reboot: '重启',
      rebootConfirmTitle: '重启设备？',
      rebootConfirmBody: '重启 "{{hostname}}"？设备将离线约一分钟。',
      shutdown: '关机',
      shutdownConfirmTitle: '关闭设备？',
      shutdownConfirmBody: '关闭 "{{hostname}}"？您需要物理访问才能重新开机。',
      commandConfirm: '确认',
      commandQueued: '命令已加入队列',
      commandError: '发送命令失败',
    },
    ldap: {
      title: 'LDAP 认证',
      enabledDesc: 'LDAP 认证已启用',
      disabledDesc: 'LDAP 认证已禁用',
      disabledHint: '在下方配置并保存 LDAP 设置，然后启用。',
      enabled: 'LDAP 认证已启用',
      disabled: 'LDAP 认证已禁用',
      feature1: '用户可以使用 LDAP 凭据登录',
      feature2: '本地管理员帐户作为后备保留',
      feature3: '登录时 LDAP 组映射到 BamBuddy 组',
      serverConfig: 'LDAP 服务器配置',
      serverUrl: '服务器 URL',
      serverUrlHint: '使用 ldap:// 进行标准连接或 ldaps:// 进行 SSL 连接',
      security: '安全',
      securityHint: 'StartTLS 将普通连接升级为 TLS。LDAPS 从一开始就使用 TLS。',
      bindDn: '绑定 DN（服务帐户）',
      bindPassword: '绑定密码',
      searchBase: '搜索基础 DN',
      userFilter: '用户搜索过滤器',
      userFilterHint: '{username} 替换为登录用户名。OpenLDAP 使用 (uid={username})。',
      advanced: '高级',
      autoProvision: '自动创建用户',
      autoProvisionHint: '首次 LDAP 登录时自动创建 BamBuddy 帐户',
      defaultGroup: '默认组',
      defaultGroupNone: '— 无（无回退）—',
      defaultGroupHint: '当 LDAP 用户通过身份验证但不在任何已映射的 LDAP 组中时分配的回退组。留空以使未映射的用户没有权限。',
      groupMapping: '组映射（JSON）',
      groupMappingHint: '将 LDAP 组 DN 映射到 BamBuddy 组。可用组：',
      testConnection: '测试连接',
      settingsSaved: 'LDAP 设置已保存',
      errors: {
        serverRequired: 'LDAP 服务器 URL 为必填项',
        searchBaseRequired: '搜索基础 DN 为必填项',
        enableAuthFirst: '请先启用认证',
        configureLdapFirst: '请先保存 LDAP 设置',
      },
    },
    // Email settings
    email: {
      smtpSettings: 'SMTP 配置',
      smtpHost: 'SMTP 服务器',
      smtpPort: 'SMTP 端口',
      security: '安全',
      authentication: '认证',
      username: '用户名',
      password: '密码',
      fromEmail: '发件邮箱',
      fromName: '发件人名称',
      testConnection: '测试 SMTP 连接',
      testRecipient: '测试收件邮箱',
      sendTest: '发送测试邮件',
      sending: '发送中...',
      save: '保存设置',
      saving: '保存中...',
      advancedAuth: '高级认证',
      advancedAuthEnabled: '高级认证已启用',
      advancedAuthEnabledDesc: '基于邮箱的用户管理功能已激活。新用户将通过邮件收到自动生成的密码，用户可以通过忘记密码功能重置密码。',
      advancedAuthDisabled: '高级认证已禁用',
      advancedAuthDisabledDesc: '启用高级认证以激活基于邮箱的用户管理功能。',
      enable: '启用',
      disable: '禁用',
      feature1: '密码自动生成并通过邮件发送给新用户',
      feature2: '用户可以使用用户名或邮箱登录',
      feature3: '忘记密码功能可用',
      feature4: '管理员可以通过邮件重置用户密码',
      // Error messages
      errors: {
        requiredFields: '请填写所有必填字段',
        usernameRequired: '启用认证时需要用户名',
        enterTestEmail: '请输入测试邮箱地址',
        smtpServerAndEmail: '测试前请填写 SMTP 服务器和发件邮箱',
        usernamePasswordRequired: '启用认证时需要用户名和密码',
        configureSmtpFirst: '请先配置并测试 SMTP 设置',
        enableAuthFirst: '请先启用身份验证才能使用基于电子邮件的功能。',
      },
      // Success messages
      success: {
        settingsSaved: 'SMTP 设置保存成功',
      },
      // Security options
      securityOptions: {
        starttls: 'STARTTLS（端口 587）',
        ssl: 'SSL/TLS（端口 465）',
        none: '无（端口 25）',
      },
      // Authentication options
      authOptions: {
        enabled: '已启用',
        disabled: '已禁用',
      },
    },
    appearance: '外观',
    notifications: '通知',
    smartPlugs: '智能插座',
    spoolman: 'Spoolman',
    updates: '更新',
    language: '语言',
    languageDescription: '选择您的首选语言',
    theme: '主题',
    themeLight: '浅色',
    themeDark: '深色',
    themeSystem: '跟随系统',
    defaultView: '默认视图',
    defaultViewDescription: '打开应用时显示的页面',
    checkForUpdates: '检查更新',
    autoUpdate: '自动更新',
    currentVersion: '当前版本',
    latestVersion: '最新版本',
    upToDate: '已是最新版本',
    updateAvailable: '有可用更新',
    // Notifications
    notificationLanguage: '通知语言',
    notificationLanguageDescription: '推送通知的语言',
    bedCooledThreshold: '热床冷却阈值',
    bedCooledThresholdDescription: '打印后热床被视为已冷却的温度',
    userNotificationsEnabled: '用户通知',
    userNotificationsEnabledDescription: '启用用户通知菜单和打印任务事件的邮件通知。需要高级身份验证。',
    userNotificationsDisabledHint: '请启用高级身份验证以使用用户通知。',
    notificationProviders: '通知提供商',
    addProvider: '添加提供商',
    editProvider: '编辑提供商',
    providerType: '提供商类型',
    testNotification: '测试通知',
    testSuccess: '测试通知发送成功',
    testFailed: '发送测试通知失败',
    quietHours: '免打扰时间',
    quietHoursDescription: '在此时间段内不发送通知',
    quietHoursStart: '开始',
    quietHoursEnd: '结束',
    events: {
      title: '通知事件',
      printStart: '打印开始',
      printComplete: '打印完成',
      printFailed: '打印失败',
      printStopped: '打印停止',
      printProgress: '进度里程碑',
      printProgressDescription: '在 25%、50%、75% 时通知',
      printerOffline: '打印机离线',
      printerError: '打印机错误',
      filamentLow: '耗材不足',
      maintenanceDue: '维护到期',
      maintenanceDueDescription: '需要维护时通知',
    },
    // Smart Plugs
    smartPlug: {
      title: '智能插座',
      add: '添加智能插座',
      edit: '编辑智能插座',
      name: '名称',
      ipAddress: 'IP 地址',
      linkedPrinter: '关联打印机',
      autoOn: '自动开启',
      autoOnDescription: '打印开始时开启',
      autoOff: '自动关闭',
      autoOffDescription: '打印完成后关闭',
      offDelay: '关闭延迟',
      offDelayMinutes: '打印后分钟数',
      offDelayTemp: '当喷嘴温度低于',
      currentState: '当前状态',
      turnOn: '开启',
      turnOff: '关闭',
    },
    // Filament Tracking Mode
    filamentTracking: '耗材追踪',
    filamentTrackingDesc: '选择如何追踪您的耗材。您可以使用内置库存或连接外部 Spoolman 服务器。',
    filamentChecks: '耗材检查',
    disableFilamentWarnings: '禁用耗材警告',
    disableFilamentWarningsDesc: '在打印或加入队列时不显示耗材不足警告',
    preferLowestFilament: '优先使用剩余最少的耗材',
    preferLowestFilamentDesc: '当多个料盘匹配时，使用剩余耗材最少的那个',
    trackingModeBuiltIn: '内置库存',
    trackingModeBuiltInDesc: '包含 RFID 自动匹配和用量追踪',
    trackingModeSpoolmanDesc: '外部耗材管理服务器',
    builtInFeatureRfid: '自动检测 AMS 中的拓竹 RFID 耗材',
    builtInFeatureUsage: '追踪每次打印的耗材消耗',
    builtInFeatureCatalog: '管理耗材、颜色和 K 值配置文件',
    builtInFeatureThirdParty: '第三方耗材可分配到库存耗材',
    amsSyncButton: '从 AMS 同步重量',
    amsSyncTitle: '从 AMS 同步耗材重量',
    amsSyncMessage: '这将使用已连接打印机的当前 AMS 剩余百分比值覆盖所有库存耗材重量。用于从损坏的重量数据中恢复。打印机必须在线。',
    amsSyncing: '同步中...',
    amsSyncSuccess: '已同步 {{synced}} 个耗材，跳过 {{skipped}} 个',
    amsSyncError: '从 AMS 同步重量失败',
    spoolmanAmsSyncButton: '从 AMS 同步 Spoolman 重量',
    spoolmanAmsSyncTitle: '从 AMS 同步 Spoolman 耗材重量',
    spoolmanAmsSyncMessage: '这将根据已连接打印机的当前 AMS 剩余百分比值更新所有 Spoolman 耗材重量。打印机必须在线。',
    spoolmanAmsSyncing: '同步中...',
    spoolmanAmsSyncSuccess: '已同步 {{synced}} 个 Spoolman 耗材，跳过 {{skipped}} 个',
    spoolmanAmsSyncError: '从 AMS 同步 Spoolman 重量失败',
    spoolmanAmsSyncErrorUnreachable: '同步失败（Spoolman 不可访问）',
    spoolmanAmsSyncErrorNotConfigured: '同步失败（Spoolman 未配置）',
    spoolmanNotConfigured: 'Spoolman 未配置',
    // Spoolman filament catalog section in spool catalog settings
    spoolmanFilamentCatalogTitle: 'Spoolman 耗材目录',
    spoolmanFilamentCatalogDesc: '来自 Spoolman 的耗材名称和皮重。名称和线轴重量可在此处编辑；其他属性请直接在 Spoolman 中管理。',
    // Spoolman settings
    spoolmanUrl: 'Spoolman URL',
    spoolmanUrlHint: 'Spoolman 服务器的 URL（例如 http://localhost:7912）',
    spoolmanConnected: '已连接',
    spoolmanDisconnected: '未连接',
    status: '状态',
    connect: '连接',
    disconnect: '断开',
    howSyncWorks: '同步工作原理',
    syncInfoRfidOnly: '仅同步带有 RFID 的官方拓竹耗材',
    syncInfoAutoCreate: '首次同步时自动在 Spoolman 中创建新耗材',
    syncInfoThirdPartySkipped: '非拓竹耗材（第三方、重新填充的）将被跳过',
    linkingExistingSpools: '链接现有耗材',
    linkingExistingSpoolsDesc: '要将现有的 Spoolman 耗材链接到您的 AMS，请将鼠标悬停在 AMS 槽位上并点击"链接到 Spoolman"。',
    syncMode: '同步模式',
    syncModeAuto: '自动',
    syncModeManual: '仅手动',
    syncModeAutoDesc: '检测到更改时自动同步 AMS 数据',
    syncModeManualDesc: '仅在手动触发时同步',
    syncAmsData: '同步 AMS 数据',
    syncAmsDataDesc: '手动将打印机 AMS 数据同步到 Spoolman',
    allPrinters: '所有打印机',
    // Default printer
    noDefaultPrinter: '无默认（每次询问）',
    // Sidebar
    sidebarOrder: '侧边栏顺序',
    // Camera
    saveThumbnails: '保存缩略图',
    captureFinishPhoto: '拍摄完成照片',
    noPrintersConfigured: '未配置打印机',
    // Archive settings
    archiveMode: {
      always: '始终创建归档条目',
      never: '从不创建归档条目',
      ask: '每次询问',
    },
    // Updates
    checkForUpdatesLabel: '检查更新',
    checkPrinterFirmware: '检查打印机固件',
    includeBetaUpdates: '包含测试版本',
    includeBetaUpdatesDesc: '检查更新时通知测试版和预发布版本',
    // Queue
    enableRetry: '启用重试',
    // Home Assistant
    homeAssistantDescription: '通过 Home Assistant 控制智能插座',
    environmentManagedLabel: '（环境变量管理）',
    autoEnabledViaEnv: '通过环境变量自动启用',
    urlFromEnvReadOnly: '值由 HA_URL 环境变量设置（只读）',
    tokenFromEnvReadOnly: '值由 HA_TOKEN 环境变量设置（只读）',
    // MQTT
    mqttConnectedTo: '已连接到',
    // Prometheus
    prometheusDescription: '以 Prometheus 格式暴露打印机数据',
    // Smart plugs empty state
    noSmartPlugsTitle: '未配置智能插座',
    noSmartPlugsDescription: '添加基于 Tasmota 的智能插座以追踪能耗并自动化电源控制。',
    // Notifications empty state
    noProvidersTitle: '未配置提供商',
    noProvidersDescription: '添加提供商以接收警报。',
    noTemplatesAvailable: '无可用模板。重启后端以加载默认模板。',
    // API permissions
    apiPermissionView: '查看打印机状态和队列',
    apiPermissionEdit: '添加和移除打印队列中的项目',
    // API keys
    apiKeysEmptyTitle: '无 API 密钥',
    apiKeysEmptyDescription: '创建 API 密钥以与外部服务集成。',
    // Users
    noUsersFound: '未找到用户',
    noGroupsFound: '未找到组',
    noGroupsAvailable: '无可用组',
    passwordsDoNotMatch: '密码不匹配',
    systemGroupWarning: '系统组名称不可更改',
    // Auth disabled
    authDisabledTitle: '身份验证已禁用',
    authDisabledFeature1: '需要登录才能访问系统',
    authDisabledFeature2: '创建多个用户并基于组的权限管理',
    authDisabledFeature3: '使用 50+ 个细粒度权限控制访问',
    // User deletion
    userHasCreated: '此用户已创建：',
    userItemsQuestion: '您想如何处理这些项目？',
    deleteUserConfirm: '确定要删除此用户吗？',
    actionCannotBeUndone: '此操作无法撤销。',
    // Smart plugs
    addFirstSmartPlug: '添加您的第一个智能插座',
    // Notifications
    providers: '提供商',
    log: '日志',
    testAll: '全部测试',
    testResults: '测试结果',
    testPassedCount: '{{count}} 个通过',
    testFailedCount: '{{count}} 个失败',
    messageTemplates: '消息模板',
    messageTemplatesDescription: '自定义每个事件的通知消息。',
    // API Keys section
    apiKeys: 'API 密钥',
    apiKeysDescription: '创建 API 密钥用于外部集成和 Webhook。',
    createKey: '创建密钥',
    apiKeyCreated: 'API 密钥创建成功',
    apiKeyCopyWarning: '请立即复制此密钥 - 它不会再次显示！',
    useInApiBrowser: '在 API 浏览器中使用',
    createNewApiKey: '创建新 API 密钥',
    keyName: '密钥名称',
    keyNamePlaceholder: '例如：Home Assistant、OctoPrint',
    readStatus: '读取状态',
    readStatusDescription: '查看打印机状态和队列',
    manageQueue: '管理队列',
    manageQueueDescription: '添加和移除打印队列中的项目',
    controlPrinter: '控制打印机',
    controlPrinterDescription: '暂停、继续和停止打印',
    cloudAccess: '允许云端访问',
    cloudAccessDescription: '代表您读取 Bambu Cloud 预设和耗材。需要登录 Bambu Cloud。',
    cloudBadge: '云端',
    updateEnergyCost: '更新电价',
    updateEnergyCostDescription: '允许此密钥向 /settings/electricity-price POST 新的每千瓦时电价。适用于 Home Assistant 动态电价自动化（Tibber、Octopus 等）。这是唯一可通过 API 密钥写入的设置字段。',
    energyCostBadge: '能耗',
    legacyKey: '传统',
    legacyKeyTooltip: '在按用户所有权之前创建；需重建以使用云端访问',
    unnamedKey: '未命名密钥',
    lastUsed: '上次使用',
    read: '读取',
    control: '控制',
    createFirstKey: '创建您的第一个密钥',
    webhookEndpoints: 'Webhook 端点',
    webhookApiKeyHint: '在 X-API-Key 请求头中使用您的 API 密钥。',
    webhook: {
      getAllStatus: '获取所有打印机状态',
      getSpecificStatus: '获取特定打印机状态',
      addToQueue: '添加到打印队列',
      pausePrint: '暂停打印',
      resumePrint: '继续打印',
      stopPrint: '停止打印',
    },
    apiBrowser: 'API 浏览器',
    apiBrowserDescription: '浏览和测试所有可用的 API 端点。',
    apiKeyForTesting: '测试用 API 密钥',
    apiKeyPlaceholder: '在此粘贴您的 API 密钥以测试需要认证的端点...',
    apiKeyHint: '此密钥将作为 X-API-Key 请求头随请求发送。',
    deleteApiKeyTitle: '删除 API 密钥',
    deleteApiKeyMessage: '确定要删除此 API 密钥吗？使用此密钥的所有集成将停止工作。',
    deleteKey: '删除密钥',
    // Filament tab
    amsDisplayThresholds: 'AMS 显示阈值',
    amsThresholdsDescription: '配置 AMS 湿度和温度指示器的颜色阈值。',
    humidity: '湿度',
    goodGreen: '良好（绿色）',
    fairOrange: '一般（橙色）',
    aboveFairBad: '超过一般阈值显示为红色（差）',
    fairAlsoDryingThreshold: '此阈值也用于触发自动干燥',
    temperature: '温度',
    goodBlue: '良好（蓝色）',
    aboveFairHot: '超过一般阈值显示为红色（热）',
    historyRetention: '历史保留',
    keepSensorHistory: '保留传感器历史',
    historyRetentionDescription: '较旧的湿度和温度数据将被自动删除',
    defaultPrintOptions: '默认打印选项',
    defaultPrintOptionsDescription: '设置新打印的默认选项值。可在打印对话框中逐次覆盖。',
    defaultBedLevelling: '热床调平',
    defaultBedLevellingDesc: '打印前自动调平热床',
    defaultFlowCali: '流量校准',
    defaultFlowCaliDesc: '校准挤出流量',
    defaultVibrationCali: '振动校准',
    defaultVibrationCaliDesc: '减少振纹伪影',
    defaultLayerInspect: '首层检测',
    defaultLayerInspectDesc: 'AI首层检测',
    defaultTimelapse: '延时摄影',
    defaultTimelapseDesc: '录制延时摄影视频',
    staggeredStart: '错峰启动',
    staggeredStartDescription: '错峰启动多台打印机批次时的默认组大小和间隔。可在打印对话框中按批次覆盖。',
    plateClear: '热床清空确认',
    requirePlateClear: '需要热床清空确认',
    requirePlateClearDescription: '启用后，调度器会在已完成打印的打印机上启动排队打印之前，等待每台打印机的热床清空确认。禁用后，也会隐藏打印机卡片上的打印板状态标记和“将打印板标记为已清理”按钮。',
    gcodeInjection: 'G-code注入',
    gcodeInjectionDescription: '为Farmloop、SwapMod、AutoClear和Printflow 3D等自动打印系统配置自定义G-code，在打印开始和/或结束时注入。代码片段按打印机型号配置，在队列项目上启用"注入G-code"时应用。',
    gcodeInjectionNoPrinters: '未找到打印机。添加打印机以配置G-code代码片段。',
    gcodeStartLabel: '开始G-code',
    gcodeEndLabel: '结束G-code',
    gcodeStartPlaceholder: '在打印开始前插入的G-code...',
    gcodeEndPlaceholder: '在打印结束后追加的G-code...',
    staggerGroupSize: '组大小',
    staggerGroupSizeHelp: '每组同时启动的打印机数量',
    staggerInterval: '间隔（分钟）',
    staggerIntervalHelp: '每组启动之间的延迟',
    queueDrying: '自动干燥',
    queueDryingDescription: '在队列打印之间，打印机空闲时自动干燥AMS耗材。使用上方的湿度阈值触发干燥。',
    queueDryingEnabled: '启用自动干燥',
    queueDryingEnabledDescription: '当打印机空闲且湿度超过阈值时，自动启动AMS干燥',
    queueDryingBlock: '等待干燥完成',
    queueDryingBlockDescription: '阻止打印队列直到干燥完成。关闭时，打印优先于干燥。',
    ambientDryingEnabled: '环境干燥',
    ambientDryingEnabledDescription: '当空闲打印机的湿度超过阈值时自动干燥耗材，无需排队打印。',
    dryingPresets: '干燥预设',
    dryingPresetsDescription: '每种耗材类型的温度和时长。AMS 2 Pro使用较低温度，AMS-HT支持较高温度。',
    dryingFilament: '耗材',
    printModal: '打印对话框',
    expandCustomMapping: '默认展开自定义映射',
    expandCustomMappingDescription: '打印到多台打印机时，默认展开显示每台打印机的 AMS 映射',
    // User management
    authentication: '身份验证',
    authEnabledDescription: '您的实例已通过用户身份验证保护',
    authDisabledDescription: '启用以要求登录并管理用户访问',
    authDisabledMessage: '启用身份验证以创建用户账户、管理权限并保护您的 Bambuddy 实例。',
    enableAuthentication: '启用身份验证',
    currentUser: '当前用户',
    changePassword: '修改密码',
    admin: '管理员',
    users: '用户',
    addUser: '添加用户',
    groups: '组',
    addGroup: '添加组',
    system: '系统',
    noDescription: '无描述',
    userCount: '{{count}} 个用户',
    permissionCount: '{{count}} 个权限',
    createUser: '创建用户',
    username: '用户名',
    enterUsername: '输入用户名',
    password: '密码',
    enterPassword: '输入密码',
    passwordRequirements: '至少 8 个字符，包含一个大写、一个小写、一个数字和一个特殊字符。',
    confirmPassword: '确认密码',
    confirmPasswordPlaceholder: '确认密码',
    // Title tooltips
    viewReleaseOnGitHub: '在 GitHub 上查看发布',
    turnAllPlugsOn: '开启所有插座',
    turnAllPlugsOff: '关闭所有插座',
    // Modal: Clear logs
    clearNotificationLogs: '清除通知日志',
    clearLogsMessage: '这将永久删除所有 30 天前的通知日志。此操作无法撤销。',
    clearLogs: '清除日志',
    // Modal: Reset UI
    resetUiPreferences: '重置 UI 偏好',
    resetUiPreferencesMessage: '这将重置所有 UI 偏好为默认值：侧边栏顺序、主题、仪表板布局、视图模式和排序偏好。您的打印机、归档和服务器设置不会受到影响。清除后页面将重新加载。',
    resetPreferences: '重置偏好',
    // Modal: Delete group
    deleteGroupTitle: '删除组',
    deleteGroupMessage: '确定要删除此组吗？此组中的用户将失去这些权限。',
    deleteGroup: '删除组',
    // Modal: Disable auth
    disableAuthenticationTitle: '禁用身份验证',
    disableAuthenticationMessage: '确定要禁用身份验证吗？这将使您的 Bambuddy 实例无需登录即可访问。所有用户将保留在数据库中但身份验证将被禁用。',
    disableAuthentication: '禁用身份验证',
    // Additional settings
    configureBambuddy: '配置 Bambuddy',
    systemDefault: '系统默认',
    archiveSettings: '归档设置',
    newWindow: '新窗口',
    embeddedOverlay: '嵌入式叠加层',
    preferredSlicer: '首选切片软件',
    preferredSlicerDescription: '选择要用于打开文件的切片软件',
    orcaslicerKnownIssuesWarning: 'OrcaSlicer 2.3.2 / 2.4.0-dev 存在已知 CLI 错误，无法切片许多 Bambu 创建的 3MF — 见上游 issue #12426（绘制的多挤出机文件 segfault）和 #13386（参数范围严格验证拒绝）。在上游修复发布之前，推荐使用 Bambu Studio。',
    useSlicerApi: '使用切片器 API',
    useSlicerApiDescription: '开启时，「切片」操作打开应用内切片器模态并调用 slicer-API sidecar。关闭时（默认），通过 URI 方案交给桌面切片器。',
    slicerCard: '切片器',
    orcaslicerApiUrl: 'OrcaSlicer sidecar URL',
    bambuStudioApiUrl: 'Bambu Studio sidecar URL',
    slicerApiUrlDescription: 'slicer-API sidecar 容器的 URL。留空以使用 SLICER_API_URL / BAMBU_STUDIO_API_URL 环境变量默认值。',
    slicerBundles: {
      title: '切片器捆绑包',
      description: '导入从 BambuStudio 导出的 Printer Preset Bundle (.bbscfg)（文件 → 导出 → 导出预设捆绑包 → "Printer preset bundle"）。导入后，切片请求可以按名称从捆绑包中选择预设，无需重新上传 JSON 配置三元组。',
      uploadButton: '上传捆绑包',
      uploading: '上传中…',
      loading: '加载捆绑包中…',
      empty: '尚未导入捆绑包。',
      summary: '{{processCount}} 个工艺 · {{filamentCount}} 个耗材预设',
      delete: '删除',
      uploadSuccess: '已导入 {{name}}',
      uploadError: '上传捆绑包失败：{{message}}',
      deleteSuccess: '捆绑包已移除',
      deleteError: '删除捆绑包失败：{{message}}',
      confirmDeleteTitle: '移除此捆绑包？',
      confirmDeleteMessage: '引用「{{name}}」的切片请求将失败，直到捆绑包重新导入。',
    },
    externalCameras: '外部摄像头',
    costTracking: '成本追踪',
    printsOnly: '仅打印',
    totalConsumption: '总消耗',
    dataManagement: '数据管理',
    storageUsage: '存储使用情况',
    storageUsageDescription: '按类别的数据使用情况明细',
    storageUsageTotal: '总计',
    storageUsageErrors: '错误',
    storageUsageOtherBreakdown: '其他（包括静态资源、脚本和配置文件）',
    storageUsageSystem: '系统',
    storageUsageData: '数据',
    storageUsageUnavailable: '存储使用信息不可用',
    clearNotificationLogsDescription: '删除 30 天前的通知日志',
    resetUiPreferencesDescription: '重置侧边栏顺序、主题、视图模式和布局偏好。打印机、归档和设置不受影响。',
    enableHomeAssistant: '启用 Home Assistant',
    enableMqtt: '启用 MQTT',
    useTls: '使用 TLS',
    enableMetricsEndpoint: '启用指标端点',
    availableMetrics: '可用指标',
    editUser: '编辑用户',
    deleteUserTitle: '删除用户',
    groupName: '组名称',
    // Placeholders
    leaveEmptyForAnonymous: '留空为匿名',
    leaveEmptyForNoAuth: '留空为无认证',
    enterNewPassword: '输入新密码',
    confirmNewPassword: '确认新密码',
    enterGroupName: '输入组名称',
    enterDescriptionOptional: '输入描述（可选）',
    enterCurrentPassword: '输入当前密码',
    enterNewPasswordMin6: '输入新密码（至少 6 个字符）',
    toast: {
      keyCopied: '密钥已复制到剪贴板',
      copyFailed: '复制密钥失败',
      keyAddedToBrowser: '密钥已添加到 API 浏览器',
      clearLogsFailed: '清除日志失败',
      uiPreferencesReset: 'UI 偏好已重置。刷新中...',
      authDisabled: '身份验证已成功禁用',
      authDisableFailed: '禁用身份验证失败',
      apiKeyCreated: 'API 密钥已创建',
      apiKeyDeleted: 'API 密钥已删除',
      userCreated: '用户创建成功',
      userUpdated: '用户更新成功',
      userDeleted: '用户删除成功',
      groupCreated: '组创建成功',
      groupUpdated: '组更新成功',
      groupDeleted: '组删除成功',
      fillRequiredFields: '请填写所有必填字段',
      passwordsDoNotMatch: '密码不匹配',
      passwordTooShort: '密码至少需要 8 个字符',
      passwordNeedsUppercase: '密码必须至少包含一个大写字母',
      passwordNeedsLowercase: '密码必须至少包含一个小写字母',
      passwordNeedsDigit: '密码必须至少包含一个数字',
      passwordNeedsSpecial: '密码必须至少包含一个特殊字符',
      enterGroupName: '请输入组名称',
      settingsSaved: '设置已保存',
      noPermissionUpdate: '您没有权限更改设置',
      cameraSettingsSaved: '摄像头设置已保存',
      enterCameraUrl: '请输入摄像头 URL',
      passwordChanged: '密码修改成功',
      connectionFailed: '连接失败',
      testFailed: '测试失败',
      cameraConnected: '摄像头已连接{{resolution}}',
    },
    testConnection: '测试连接',
    catalog: {
      spoolCatalog: '耗材目录',
      spoolCatalogDescription: '按品牌/类型的空耗材重量。用于添加耗材时的自动重量查找。',
      searchCatalog: '搜索目录...',
      addNewEntry: '添加新条目',
      namePlaceholder: '名称（例如：Bambu Lab - 塑料）',
      weight: '重量',
      type: '类型',
      default: '默认',
      custom: '自定义',
      noMatch: '没有条目匹配您的搜索',
      empty: '目录中没有条目',
      deleteEntry: '删除条目',
      deleteConfirm: '确定要删除"{{name}}"吗？',
      resetCatalog: '重置目录',
      resetConfirm: '重置目录为默认值？这将移除所有自定义条目。',
      loadFailed: '加载耗材目录失败',
      nameWeightRequired: '名称和重量为必填项',
      entryAdded: '条目已添加',
      addFailed: '添加条目失败',
      entryUpdated: '条目已更新',
      updateFailed: '更新条目失败',
      entryDeleted: '条目已删除',
      deleteFailed: '删除条目失败',
      resetSuccess: '目录已重置为默认值',
      resetFailed: '重置目录失败',
      exported: '已导出 {{count}} 条',
      imported: '已导入 {{added}} 条（跳过 {{skipped}} 条）',
      importFailed: '导入失败：无效的 JSON 格式',
      exportTooltip: '导出目录为 JSON',
      importTooltip: '从 JSON 导入目录',
      resetTooltip: '重置为默认值',
      selectedCount: '已选择 {{count}} 项',
      deleteSelected: '删除所选',
      bulkDeleteConfirm: '确定要删除 {{count}} 个条目吗？',
      bulkDeleted: '已删除 {{count}} 个条目',
      bulkDeleteFailed: '删除条目失败',
      material: '材料',
      spoolWeight: '线轴重量',
      color: '颜色',
      updateSpoolWeight: '更新线轴重量',
      filamentUpdated: '耗材已更新',
      filamentUpdateFailed: '更新耗材失败',
      filamentUpdateInvalid: '耗材数据无效',
      keepExistingSpoolWeight: '保留现有线轴的旧重量',
      keepExistingSpoolWeightDesc: '已使用此耗材类型创建的线轴保留旧的皮重。新线轴使用更新后的值。',
      applyToAllSpools: '应用到所有线轴',
      applyToAllSpoolsDesc: '此耗材类型的所有重量计算立即使用新的皮重。',
    },
    colorCatalog: {
      title: '颜色目录',
      description: '按制造商/材料的耗材颜色。用于添加耗材时的自动颜色查找。',
      searchColors: '搜索颜色...',
      allManufacturers: '所有制造商',
      addNewColor: '添加新颜色',
      manufacturer: '制造商',
      colorName: '颜色名称',
      hex: '十六进制',
      materialOptional: '材料（可选）',
      showing: '显示 {{filtered}} / {{total}} 种颜色',
      noMatch: '没有颜色匹配您的搜索',
      empty: '目录中没有颜色',
      deleteColor: '删除颜色',
      deleteConfirm: '确定要删除"{{name}}"吗？',
      resetCatalog: '重置颜色目录',
      resetConfirm: '重置目录为默认值？这将移除所有自定义颜色。',
      sync: '同步',
      starting: '启动中...',
      syncTooltip: '从 FilamentColors.xyz 同步（2000+ 种颜色，可能需要一分钟）',
      loadFailed: '加载颜色目录失败',
      fieldsRequired: '制造商、颜色名称和十六进制颜色为必填项',
      colorAdded: '颜色已添加',
      addFailed: '添加颜色失败',
      colorUpdated: '颜色已更新',
      updateFailed: '更新颜色失败',
      colorDeleted: '颜色已删除',
      deleteFailed: '删除颜色失败',
      resetSuccess: '颜色目录已重置为默认值',
      resetFailed: '重置目录失败',
      syncUpToDate: '已是最新（检查了 {{count}} 种颜色）',
      syncComplete: '添加了 {{added}} 种新颜色（{{skipped}} 种已存在）',
      syncError: '同步错误',
      syncFailed: '从 FilamentColors.xyz 同步失败',
      exported: '已导出 {{count}} 种颜色',
      imported: '已导入 {{added}} 种颜色（跳过 {{skipped}} 种）',
      importFailed: '导入失败：无效的 JSON 格式',
      selectedCount: '已选择 {{count}} 项',
      deleteSelected: '删除所选',
      bulkDeleteConfirm: '确定要删除 {{count}} 种颜色吗？',
      bulkDeleted: '已删除 {{count}} 种颜色',
      bulkDeleteFailed: '删除颜色失败',
    },
    dateFormat: '日期格式',
    dateFormatUs: '美式 (MM/DD/YYYY)',
    dateFormatEu: '欧式 (DD/MM/YYYY)',
    dateFormatIso: 'ISO (YYYY-MM-DD)',
    timeFormat: '时间格式',
    timeFormat12: '12小时制 (3:30 PM)',
    timeFormat24: '24小时制 (15:30)',
    defaultPrinter: '默认打印机',
    defaultPrinterDescription: '为上传、重印和其他操作预选此打印机。',
    slicerBambuStudio: 'Bambu Studio',
    slicerOrcaSlicer: 'OrcaSlicer',
    sidebarOrderDescription: '拖拽侧边栏项目以重新排序。在此处重置为默认顺序。',
    setDefault: '设为默认',
    sidebarOrderSetDefaultHint: '设为默认将当前菜单顺序应用于尚未自定义的用户。',
    sidebarDefaultSet: '已设置默认菜单顺序。',
    sidebarDefaultCleared: '已清除默认菜单顺序。',
    sidebarDefaultFailed: '设置默认菜单顺序失败。',
    reset: '重置',
    darkMode: '深色模式',
    lightMode: '浅色模式',
    active: '(当前)',
    background: '背景',
    accent: '强调色',
    style: '样式',
    bgNeutral: '中性',
    bgWarm: '暖色',
    bgCool: '冷色',
    bgOled: 'OLED 纯黑',
    bgSlate: '石板蓝',
    bgForest: '森林绿',
    accentGreen: '绿色',
    accentTeal: '青色',
    accentBlue: '蓝色',
    accentOrange: '橙色',
    accentPurple: '紫色',
    accentRed: '红色',
    styleClassic: '经典',
    styleGlow: '发光',
    styleVibrant: '鲜艳',
    themeToggleHint: '使用侧边栏中的太阳/月亮图标在深色和浅色模式之间切换。',
    autoArchivePrints: '自动归档打印',
    autoArchiveDescription: '打印完成时自动保存3MF文件',
    saveThumbnailsDescription: '从3MF文件中提取并保存预览图像',
    captureFinishPhotoDescription: '打印完成时从打印机摄像头拍照',
    ffmpegNotInstalled: '未安装ffmpeg',
    ffmpegRequired: '摄像头捕获需要ffmpeg。通过 <brew>brew install ffmpeg</brew>（macOS）或 <apt>apt install ffmpeg</apt>（Linux）安装。',
    camera: '摄像头',
    cameraViewMode: '摄像头查看模式',
    cameraOverlayDescription: '摄像头在主屏幕上以可调大小的覆盖层打开',
    cameraWindowDescription: '摄像头在单独的浏览器窗口中打开',
    externalCamerasDescription: '配置外部摄像头以替换内置打印机摄像头。支持MJPEG流、RTSP、HTTP快照和USB摄像头（V4L2）。启用后，外部摄像头将用于实时查看和完成照片。',
    cameraPlaceholderUsb: '设备路径 (/dev/video0)',
    cameraPlaceholderUrl: '摄像头URL (rtsp://... 或 http://...)',
    cameraTypeMjpeg: 'MJPEG 流',
    cameraTypeRtsp: 'RTSP 流',
    cameraTypeSnapshot: 'HTTP 快照',
    cameraTypeUsb: 'USB 摄像头 (V4L2)',
    cameraSnapshotUrl: '快照 URL（可选）',
    cameraSnapshotUrlPlaceholder: 'http://192.168.1.61:1984/api/frame.jpeg?src=printer',
    cameraSnapshotUrlHelp: '用于通知缩略图、完成照片、层延时摄影帧和打印板检测的单帧 URL。延时摄影和打印板检测各自需要自己的每打印机开关 — 此 URL 只是它们激活时拉取的图像源。留空以从上方实时流捕获。适用于 go2rtc（/api/frame.jpeg）和具有专用快照端点的 IP 摄像头。',
    cameraRotation: '旋转',
    test: '测试',
    connected: '已连接',
    disconnected: '未连接',
    currency: '货币',
    defaultFilamentCost: '默认耗材成本（每公斤）',
    electricityCost: '每千瓦时电费',
    energyDisplayMode: '能源显示模式',
    energyModePrintDescription: '仪表板显示打印期间使用的能源总和',
    energyModeTotalDescription: '仪表板显示智能插座的累计能源',
    fileManager: '文件管理器',
    createArchiveEntry: '打印时创建归档条目',
    createArchiveEntryDescription: '从文件管理器打印时，可选择创建归档条目',
    lowDiskSpaceWarning: '磁盘空间不足警告',
    lowDiskSpaceDescription: '当可用磁盘空间低于此阈值时显示警告',
    printerFirmware: '打印机固件',
    checkFirmwareDescription: '检查Bambu Lab的打印机固件更新',
    bambuddySoftware: 'Bambuddy 软件',
    autoCheckDescription: '启动时自动检查新版本',
    checkNow: '立即检查',
    updateAvailableVersion: '可用更新：v{{version}}',
    releaseNotes: '发布说明',
    updateViaDocker: '通过 Docker Compose 更新：',
    updateViaHomeAssistant: '更新由 Home Assistant Supervisor 管理。请在 Home Assistant 中打开 设置 → 加载项 → Bambuddy 以安装新版本。',
    installUpdate: '安装更新',
    latestVersionRunning: '您正在运行最新版本',
    failedToCheckUpdates: '检查更新失败：{{error}}',
    backupRestore: '备份与恢复',
    backupRestoreDescription: '导出/导入设置并配置GitHub备份',
    goToBackup: '前往备份',
    externalUrl: '外部URL',
    externalUrlDescription: 'Bambuddy可访问的外部URL。用于通知图像和外部集成。',
    bambuddyUrl: 'Bambuddy URL',
    externalUrlHint: '包含协议和端口（例如：http://192.168.1.100:8000）',
    ftpRetry: 'FTP重试',
    ftpRetryDescription: '当打印机WiFi不稳定时重试FTP操作。适用于3MF下载、打印上传、延时摄影下载和固件更新。',
    autoRetryDescription: '自动重试失败的FTP操作',
    retryAttempts: '重试次数',
    retryDelay: '重试延迟',
    connectionTimeout: '连接超时',
    time_one: '{{count}}次',
    time_other: '{{count}}次',
    second_one: '{{count}}秒',
    second_other: '{{count}}秒',
    nSeconds: '{{count}}秒',
    increaseForWeakWifi: '对WiFi信号弱的打印机增加此值',
    homeAssistant: 'Home Assistant',
    homeAssistantFullDescription: '连接到Home Assistant，通过HA REST API控制智能插座。支持switch、light、input_boolean和script实体。',
    homeAssistantUrl: 'Home Assistant URL',
    longLivedAccessToken: '长期访问令牌',
    haTokenHint: '在HA中创建令牌：个人资料 → 长期访问令牌 → 创建令牌',
    connectionSuccessful: '连接成功',
    connectionFailed: '连接失败',
    haConnectionSuccess: '已成功连接到Home Assistant。',
    haConnectionFailed: '连接Home Assistant失败。',
    mqttPublishing: 'MQTT发布',
    mqttDescription: '将BamBuddy事件发布到外部MQTT代理，用于与Node-RED、Home Assistant和其他自动化系统集成。',
    mqttEnableDescription: '向外部MQTT代理发布事件',
    brokerHostname: '代理主机名',
    port: '端口',
    usernameOptional: '用户名（可选）',
    passwordOptional: '密码（可选）',
    topicPrefix: '主题前缀',
    topicPrefixHint: '主题格式：{{prefix}}/printers/<serial>/status 等',
    prometheusMetrics: 'Prometheus 指标',
    prometheusEndpointDescription: '在 <code>/api/v1/metrics</code> 公开打印机指标，用于Prometheus/Grafana监控。',
    bearerTokenOptional: 'Bearer令牌（可选）',
    bearerTokenHint: '设置后，请求必须包含 <code>Authorization: Bearer <token></code>',
    metricsConnectionStatus: '连接状态',
    metricsPrinterState: '打印机状态（空闲/打印中等）',
    metricsPrintProgress: '打印进度 0-100%',
    metricsBedTemp: '热床温度',
    metricsNozzleTemp: '喷嘴温度',
    metricsPrintsTotal: '按结果分类的总打印数',
    metricsMore: '...以及更多（层数、风扇、队列、耗材用量）',
    smartPlugsDescription: '连接智能插座（Tasmota或Home Assistant）以自动化电源控制并跟踪打印机的能源使用情况。',
    allOn: '全部开启',
    allOff: '全部关闭',
    addSmartPlug: '添加智能插座',
    energySummary: '能源概要',
    currentPower: '当前功率',
    plugsOnline: '{{reachable}}/{{total}} 个插座在线',
    today: '今天',
    yesterday: '昨天',
    total: '总计',
    enablePlugsForSummary: '启用插座以查看能源概要',
    addNotificationProvider: '添加',
    systemBadge: '(系统)',
    creating: '创建中...',
    changing: '修改中...',
    deleteUserAndItems: '删除用户及其所有项目',
    deleteUserKeepItems: '删除用户，保留项目（将变为无主项目）',
    ok: '确定',

    // 2FA settings
    twoFa: {
      totpTitle: '身份验证器应用 (TOTP)',
      totpDesc: '使用 Google Authenticator、Aegis 或 Authy 等应用。',
      emailOtpTitle: '邮件 OTP',
      emailOtpDesc: '登录时向 {{email}} 发送一次性验证码。',
      emailOtpNoEmail: '请先为账户添加邮箱地址以启用此方式。',
      addEmailFirst: '您的账户没有邮箱地址，请联系管理员添加。',
      setupTotp: '设置身份验证器应用',
      setupAuthApp: '设置身份验证器应用',
      setupInstructions: '使用身份验证器应用扫描二维码，然后输入验证码确认。',
      manualEntry: '无法扫描？请手动输入此密钥：',
      scannedContinue: '已扫描 — 继续',
      enterCodeToConfirm: '请输入身份验证器应用中的6位验证码以确认设置。',
      activate: '激活',
      disableTotp: '停用身份验证器',
      disableConfirmHint: '请输入有效的 TOTP 码或备用码来停用身份验证器。',
      totpDisabled: '身份验证器应用已停用。',
      emailOtpEnabled: '邮件 OTP 已启用。',
      emailOtpDisabled: '邮件 OTP 已停用。',
      smtpRequired: '请先配置并测试SMTP设置。',
      invalidCode: '无效验证码，请重试。',
      enableEmailOtp: '启用邮件 OTP',
      disableEmailOtp: '停用邮件 OTP',
      emailSetupEnterCode: '验证码已发送至您的邮箱地址。请在下方输入以确认您拥有此邮箱。',
      verifyAndEnable: '验证并启用',
      emailDisablePasswordHint: '请输入您的账户密码以确认停用邮件 OTP。',
      passwordPlaceholder: '输入您的密码',
      backupCodesTitle: '保存备用码',
      backupCodesWarning: '请将这些码保存在安全的地方。每个码只能使用一次，且不会再次显示。',
      backupCodesRemaining: '剩余 {{count}} 个备用码',
      savedCodes: '已保存',
      regenBackup: '重新生成备用码',
      regenBackupHint: '输入当前 TOTP 码以生成 10 个新备用码，所有现有备用码将失效。',
      newBackupCodes: '新备用码',
      linkedAccounts: '已关联的 SSO 账户',
      linkedAccountsDesc: '以下外部身份提供商已与您的账户关联。',
      oidcUnlinked: '账户已解除关联。',
    },

    // OIDC provider settings
    oidc: {
      title: 'SSO / OIDC 提供商',
      desc: '配置 OpenID Connect 提供商以实现单点登录。',
      addProvider: '添加提供商',
      newProvider: '新提供商',
      empty: '尚未配置 OIDC 提供商。',
      created: '提供商已创建。',
      updated: '提供商已更新。',
      deleted: '提供商已删除。',
      refreshIcon: '刷新图标',
      removeIcon: '移除图标',
      iconRefreshed: '图标已刷新。',
      iconRemoved: '图标已移除。',
      iconFetchFailed: '无法从提供商 URL 获取图标。',
      deleteTitle: '删除提供商',
      deleteMessage: '删除"{{name}}"？所有关联账户将断开连接。',
      form: {
        name: '显示名称',
        issuerUrl: '颁发者 URL',
        clientId: '客户端 ID',
        clientSecret: '客户端密钥',
        scopes: '作用域',
        iconUrl: '图标 URL（可选）',
        enabled: '已启用',
        autoCreate: '自动创建用户',
        autoCreateDesc: '首次登录时自动创建本地账户。',
        autoLink: '自动关联已有账户',
        autoLinkDesc: '首次登录时通过邮箱匹配现有本地账户并自动关联。',
        secretHint: '留空以保留当前',
        secretPlaceholder: '新密钥',
        emailClaim: '邮箱声明',
        emailClaimDesc: "用作邮箱身份的 JWT 声明。Azure Entra ID 请使用 'preferred_username' 或 'upn'（不发送 email_verified）。仅使用可信的声明名称。",
        emailClaimPlaceholder: '邮箱',
        emailClaimCustomClaimAutoLinkWarning: '自定义声明仅在值由租户管理时（例如 Azure Entra ID 的 upn / preferred_username）对自动关联安全。如果您的 IdP 允许用户自我声明此声明，请勿启用自动关联。',
        requireEmailVerified: '要求邮箱已验证',
        requireEmailVerifiedDesc: '仅在提供商将邮箱声明标记为已验证时才接受。',
        requireEmailVerifiedWarning: '警告：将在未经验证的情况下接受邮箱。仅对受信任的提供商使用。',
        requireEmailVerifiedAutoLink: '请先禁用自动关联以更改此设置。',
        defaultGroup: '默认组',
        defaultGroupDesc: '自动创建用户时分配的组。未设置时回退到 Viewers。',
        defaultGroupViewersFallback: 'Viewers（默认）',
      },
    },

    // TODO: translate encryption keys
    encryption: {
      title: 'MFA 加密状态',
      enabledFromEnv: '已启用静态加密（密钥来自 MFA_ENCRYPTION_KEY 环境变量）',
      enabledFromFile: '已启用静态加密（密钥从数据目录加载）',
      enabledGenerated: '使用自动生成的密钥启用静态加密',
      notConfigured: '未配置静态加密',
      notConfiguredDesc: 'TOTP 密钥和 OIDC client_secrets 以明文存储。请设置 MFA_ENCRYPTION_KEY 或使用可写数据目录重启 Bambuddy 以自动生成。',
      allEncrypted: '所有 MFA 密钥均已静态加密。',
      legacyRowsLabel: '旧版明文行',
      encryptedRowsLabel: '已加密行',
      legacyRowsWarning: '检测到 {{count}} 个旧版明文行。请重新保存 OIDC 提供商或重新注册用户的身份验证器应用，以迁移到加密存储。',
      backupHint: '自动生成的密钥存储在 DATA_DIR/.mfa_encryption_key 中，并包含在本地备份 ZIP 中。请保护备份安全或显式设置 MFA_ENCRYPTION_KEY。',
      decryptionBrokenTitle: '加密密钥缺失',
      decryptionBrokenError: '无法解密 {{count}} 条加密记录，因为加密密钥不再可用。请恢复以前的 MFA_ENCRYPTION_KEY 或 DATA_DIR/.mfa_encryption_key 以恢复访问。',
      migrationErrorWarning: '{{count}} 行旧数据在启动时未能重新加密。请检查服务器日志并重启 Bambuddy 以重试。',
    },

  },

  // Notifications (for push notifications)
  notification: {
    printStarted: {
      title: '打印已开始',
      body: '{{printer}}：{{filename}} 已开始打印',
    },
    printCompleted: {
      title: '打印已完成',
      body: '{{printer}}：{{filename}} 已成功完成',
    },
    printFailed: {
      title: '打印失败',
      body: '{{printer}}：{{filename}} 打印失败',
    },
    printStopped: {
      title: '打印已停止',
      body: '{{printer}}：{{filename}} 已停止',
    },
    printProgress: {
      title: '打印进度',
      body: '{{printer}}：{{filename}} 已完成 {{percent}}%',
    },
    printerOffline: {
      title: '打印机离线',
      body: '{{printer}} 已离线',
    },
    printerError: {
      title: '打印机错误',
      body: '{{printer}}：{{error}}',
    },
    filamentLow: {
      title: '耗材不足',
      body: '{{printer}}：耗材即将用完',
    },
    maintenanceDue: {
      title: '维护到期',
      body: '{{printer}}：{{items}} 需要关注',
    },
  },

  // Errors
  errors: {
    generic: '出了点问题',
    networkError: '网络错误。请检查您的连接。',
    notFound: '未找到',
    unauthorized: '未授权',
    serverError: '服务器错误',
    validationError: '请检查您的输入',
    printerConnectionFailed: '连接打印机失败',
    saveFailed: '保存更改失败',
    deleteFailed: '删除失败',
    loadFailed: '加载数据失败',
  },

  // HMS Errors modal
  hmsErrors: {
    title: '错误 - {{name}}',
    noErrors: '无错误',
    viewOnWiki: '在拓竹 Wiki 上查看',
    clearInstructions: '在打印机上清除错误以在此处消除它们。',
    clearErrors: '清除错误',
    clearSuccess: 'HMS 错误已清除',
    clearFailed: '清除 HMS 错误失败',
  },

  // MQTT Debug modal
  mqttDebug: {
    title: 'MQTT 调试日志',
    searchPlaceholder: '搜索主题或负载...',
    noMessages: '尚未记录消息',
    startLoggingHint: '点击"开始记录"以开始捕获 MQTT 消息',
    noMessagesMatch: '没有消息匹配您的筛选条件',
    adjustFilterHint: '尝试调整您的搜索或筛选条件',
    incoming: '传入',
    outgoing: '传出',
    loggingStopped: '记录已停止',
    loggingActive: '记录中 - 消息将自动刷新',
    startLogging: '开始记录',
    stopLogging: '停止记录',
    clearLog: '清除日志',
    topic: '主题',
    timestamp: '时间戳',
    direction: '方向',
    all: '全部',
  },

  // Printer File Manager modal (printer internal storage)
  printerFiles: {
    title: '文件管理器',
    storageUsed: '已用：',
    storageFree: '剩余：',
    filterPlaceholder: '筛选文件...',
    deleteButton: '删除',
    deleteFiles: '删除 {{count}} 个文件',
    deleteFileConfirm: '删除"{{name}}"？此操作无法撤销。',
    deleteFilesConfirm: '删除 {{count}} 个选中的文件？此操作无法撤销。',
    noFiles: '打印机上没有文件',
    loadingFiles: '加载文件中...',
    failedToLoad: '加载文件失败',
    toast: {
      filesDeleted: '已删除 {{count}} 个文件',
      deleteFailed: '删除失败：{{error}}',
    },
  },

  // Confirmations
  confirm: {
    delete: '确定要删除吗？',
    unsavedChanges: '您有未保存的更改。确定要离开吗？',
    clearQueue: '确定要清空队列吗？',
  },

  // Login page
  login: {
    title: 'Bambuddy 登录',
    subtitle: '登录您的账户',
    username: '用户名',
    usernamePlaceholder: '输入您的用户名',
    usernameOrEmail: '用户名或邮箱',
    usernameOrEmailPlaceholder: '用户名或 @ 邮箱',
    password: '密码',
    passwordPlaceholder: '输入您的密码',
    signIn: '登录',
    signingIn: '登录中...',
    rememberMe: '记住我',
    forgotPassword: '忘记密码？',
    loginSuccess: '登录成功',
    loginFailed: '登录失败',
    enterCredentials: '请输入用户名和密码',
    enterEmail: '请输入您的电子邮件地址',
    oidcLoginFailed: 'OIDC 登录失败',
    oidcErrors: {
      providerError: '身份提供商返回了一个错误',
      missingParameters: 'OIDC 回调缺少必要参数',
      invalidState: 'OIDC 状态无效或已被使用',
      stateExpired: 'OIDC 登录会话已过期，请重试',
      providerNotFound: '未找到 OIDC 提供商',
      discoveryFailed: '无法获取 OIDC 发现文档',
      invalidDiscovery: 'OIDC 发现文档无效',
      networkError: 'OIDC 令牌交换时出现网络错误',
      badResponse: 'OIDC 令牌交换时收到意外响应',
      noIdToken: 'OIDC 提供商未返回 ID 令牌',
      validationFailed: 'OIDC 令牌验证失败',
      nonceMismatch: 'OIDC nonce 不匹配，可能存在重放攻击',
      missingSubClaim: 'OIDC 令牌缺少 sub 声明',
      noLinkedAccount: '没有与此 OIDC 身份关联的本地帐户',
      accountInactive: '您的帐户已被停用',
      userResolutionFailed: '无法解析您的帐户',
      internalError: 'OIDC 登录过程中发生内部错误',
      tokenExchangeFailed: 'OIDC 令牌交换失败',
    },
    forgotPasswordTitle: '忘记密码',
    forgotPasswordMessage: '如果您忘记了密码，请联系系统管理员进行重置。',
    forgotPasswordEmailMessage: '输入您的邮箱地址，我们将向您发送新密码。',
    emailAddress: '邮箱地址',
    emailPlaceholder: 'your.email@example.com',
    cancel: '取消',
    sending: '发送中...',
    sendResetEmail: '发送重置邮件',
    howToReset: '如何重置密码：',
    resetStep1: '联系您的 Bambuddy 管理员',
    resetStep2: '请他们在用户管理中重置您的密码',
    resetStep3: '他们可以为您设置一个临时密码',
    resetStep4: '使用新密码登录并在设置中修改密码',
    gotIt: '知道了',
    resetPassword: {
      title: '设置新密码',
      subtitle: '请在下方输入并确认您的新密码。',
      newPassword: '新密码',
      newPasswordPlaceholder: '至少 8 个字符',
      confirmPassword: '确认密码',
      confirmPasswordPlaceholder: '重复输入新密码',
      saving: '保存中…',
      submit: '设置新密码',
      backToLogin: '返回登录',
      passwordsDoNotMatch: '密码不匹配',
      passwordTooShort: '密码至少需要 8 个字符',
      resetFailed: '密码重置失败。链接可能已过期。',
    },
    twoFA: {
      title: '两步验证',
      subtitle: '您的账户已启用两步验证。请在下方输入验证码。',
      methodAuthenticator: '身份验证器应用',
      methodEmail: '邮箱验证码',
      methodBackup: '备用恢复码',
      instructionsTotp: '请打开您的身份验证器应用，输入 Bambuddy 的 6 位验证码。',
      instructionsEmail: '6 位验证码已发送至您的邮箱，有效期为 10 分钟。',
      instructionsEmailNotSent: '点击下方按钮，通过邮件获取验证码。',
      instructionsBackup: '请输入您的一个 8 位备用恢复码。每个恢复码只能使用一次。',
      sendCodeButton: '发送邮箱验证码',
      sendingCode: '发送中...',
      resendCode: '重新发送验证码',
      codeLabel: '验证码',
      backupCodeLabel: '备用恢复码',
      codePlaceholder: '000000',
      backupCodePlaceholder: 'XXXXXXXX',
      verifyButton: '验证',
      verifyingButton: '验证中...',
      backToLogin: '← 返回登录页面',
      orContinueWith: '或通过以下方式登录',
      signInWith: '使用 {{provider}} 登录',
      enterCode: '请输入验证码',
      sendCodeFailed: '验证码发送失败',
      invalidCode: '无效验证码，请重试。',
    },

  },

  // Setup page
  setup: {
    title: 'Bambuddy 设置',
    subtitle: '为您的 Bambuddy 实例配置身份验证',
    enableAuth: '启用身份验证',
    adminAccount: '管理员账户',
    adminAccountDesc: '如果管理员用户已存在，将使用现有管理员账户启用身份验证。如需使用现有管理员，请将下方字段留空，或输入新凭据创建新管理员用户。',
    adminUsername: '管理员用户名',
    adminPassword: '管理员密码',
    optionalIfAdminExists: '（如管理员用户已存在则为可选）',
    adminUsernamePlaceholder: '输入管理员用户名（可选）',
    adminPasswordPlaceholder: '输入管理员密码（可选）',
    confirmPassword: '确认密码',
    confirmPasswordPlaceholder: '确认管理员密码',
    settingUp: '设置中...',
    completeSetup: '完成设置',
    toast: {
      authEnabledAdminCreated: '身份验证已启用并创建了管理员用户',
      authEnabledExistingAdmins: '使用现有管理员用户启用了身份验证',
      setupCompleted: '设置完成',
      enterBothCredentials: '请输入管理员用户名和密码，或将两者留空以使用现有管理员用户',
      passwordsDoNotMatch: '密码不匹配',
      passwordTooShort: '密码至少需要 6 个字符',
    },
  },

  // Password change
  changePassword: {
    title: '修改密码',
    currentPassword: '当前密码',
    currentPasswordPlaceholder: '输入当前密码',
    newPassword: '新密码',
    newPasswordPlaceholder: '输入新密码（至少 6 个字符）',
    confirmPassword: '确认新密码',
    confirmPasswordPlaceholder: '确认新密码',
    passwordsDoNotMatch: '密码不匹配',
    passwordTooShort: '密码至少需要 6 个字符',
    changing: '修改中...',
    success: '密码修改成功',
    failed: '密码修改失败',
  },

  // Plate detection alert
  plateAlert: {
    title: '打印已暂停！',
    message: '在构建板上检测到物体。打印已自动暂停。请清理打印板并继续打印。',
    understand: '我知道了',
  },

  // Camera page
  camera: {
    title: '摄像头视图',
    invalidPrinterId: '无效的打印机 ID',
    live: '实时',
    snapshot: '快照',
    restartStream: '重启流',
    refreshSnapshot: '刷新快照',
    fullscreen: '全屏',
    exitFullscreen: '退出全屏',
    connectingToCamera: '连接摄像头中...',
    capturingSnapshot: '拍摄快照中...',
    connectionLost: '连接已断开',
    connectionFailed: '摄像头连接失败',
    reconnecting: '{{countdown}} 秒后重新连接...（第 {{attempt}}/{{max}} 次尝试）',
    reconnectNow: '立即重新连接',
    cameraUnavailable: '摄像头不可用',
    cameraUnavailableDesc: '请确保打印机已通电并已连接。',
    noCamera: '无可用摄像头',
    retry: '重试',
    cameraStream: '摄像头流',
    zoomOut: '缩小',
    zoomIn: '放大',
    resetZoom: '重置缩放',
    recording: '录制中',
    startRecording: '开始录制',
    stopRecording: '停止录制',
    chamberLight: '切换腔室灯',
    unavailable: '摄像头不可用',
    diagnose: {
      button: '诊断',
      modalTitle: '摄像头诊断',
      running: '正在运行诊断...',
      runFailed: '无法运行诊断: {{error}}',
      retry: '重新运行',
      stage: {
        tcp_reachable: '网络可达性',
        first_frame: '画面捕获',
        live_stream_active: '直播流正在进行',
      },
      summary: {
        all_ok: '摄像头工作正常。诊断已成功完成所有阶段。',
        live_stream_active_healthy: '摄像头正在传输最新画面 — 无需测试。',
        printer_unreachable: '无法访问打印机。请检查 IP 地址、网络连接以及打印机是否已开机。',
        camera_port_closed: '打印机可访问，但摄像头端口已关闭。请确保打印机设置中已启用仅 LAN 模式和开发者模式。',
        no_frame: '已连接到摄像头，但未收到画面。请重试或检查打印机设置中摄像头是否已启用。',
        unknown_failure: '摄像头诊断因未知原因失败。请查看支持日志了解详情。',
      },
      meta: {
        protocol: '协议',
        port: '端口',
        profile: '配置',
      },
    },
  },

  // Groups management
  groups: {
    title: '组管理',
    subtitle: '管理访问控制的权限组',
    backToSettings: '返回设置',
    createGroup: '创建组',
    noPermission: '您没有访问此页面的权限。',
    system: '系统',
    noDescription: '无描述',
    usersCount: '{{count}} 个用户',
    permissionsCount: '{{count}} 个权限',
    edit: '编辑',
    delete: '删除',
    toast: {
      created: '组创建成功',
      updated: '组更新成功',
      deleted: '组删除成功',
      enterGroupName: '请输入组名称',
    },
    modal: {
      editGroup: '编辑组',
      createGroup: '创建组',
      cancel: '取消',
      saving: '保存中...',
      creating: '创建中...',
      saveChanges: '保存更改',
    },
    form: {
      groupName: '组名称',
      groupNamePlaceholder: '输入组名称',
      systemGroupWarning: '系统组名称不可更改',
      description: '描述',
      descriptionPlaceholder: '输入描述（可选）',
      permissions: '权限（已选 {{count}} 个）',
    },
    deleteModal: {
      title: '删除组',
      message: '确定要删除此组吗？此组中的用户将失去这些权限。',
      confirm: '删除组',
    },
    editor: {
      title: '编辑组',
      createTitle: '创建组',
      search: '搜索权限...',
      selectAll: '全选',
      clearAll: '清除全部',
      permissionsSelected: '已选 {{count}} 个',
      noResults: '没有权限匹配您的搜索',
    },
  },

  // Users management
  users: {
    title: '用户管理',
    subtitle: '管理用户及其对 Bambuddy 实例的访问',
    backToSettings: '返回设置',
    createUser: '创建用户',
    noPermission: '您没有访问此页面的权限。',
    admin: '管理员',
    noGroups: '无组',
    active: '活跃',
    inactive: '非活跃',
    edit: '编辑',
    delete: '删除',
    system: '系统',
    noGroupsAvailable: '无可用组',
    table: {
      username: '用户名',
      groups: '组',
      status: '状态',
      actions: '操作',
    },
    toast: {
      created: '用户创建成功',
      updated: '用户更新成功',
      deleted: '用户删除成功',
      fillRequired: '请填写所有必填字段',
      passwordsDoNotMatch: '密码不匹配',
      passwordTooShort: '密码至少需要 6 个字符',
      ldapProvisioned: '已创建 LDAP 用户「{{username}}」',
    },
    modal: {
      createUser: '创建用户',
      editUser: '编辑用户',
      cancel: '取消',
      creating: '创建中...',
      saving: '保存中...',
      saveChanges: '保存更改',
      advancedAuthSubtitle: '使用高级认证',
      // Manual LDAP provisioning (#1298) — English fallbacks
      tabsAriaLabel: '用户来源',
      localTab: '本地',
      ldapTab: 'LDAP',
      ldapSearchLabel: '搜索目录',
      ldapSearchPlaceholder: '输入用户名、姓名或电子邮件...',
      ldapMinChars: '输入至少 2 个字符以搜索',
      ldapTypeToSearch: '开始输入以搜索 LDAP 目录',
      ldapSearching: '搜索目录中...',
      ldapNoResults: '目录中没有匹配的用户',
      ldapSearchError: '目录搜索失败。请检查 LDAP 服务器状态。',
      ldapAlreadyProvisioned: '已创建',
      ldapSelectedLabel: '已选',
      ldapProvision: '创建用户',
      ldapProvisioning: '创建中...',
      ldapErrorProvision: '创建失败。请检查 LDAP 服务器状态后重试。',
    },
    form: {
      username: '用户名',
      usernamePlaceholder: '输入用户名',
      email: '邮箱',
      emailPlaceholder: 'user@example.com',
      password: '密码',
      passwordPlaceholder: '输入密码',
      confirmPassword: '确认密码',
      confirmPasswordPlaceholder: '确认密码',
      newPasswordPlaceholder: '输入新密码',
      confirmNewPasswordPlaceholder: '确认新密码',
      leaveBlankToKeep: '留空以保持当前值',
      groups: '组',
      optional: '可选',
      autoGeneratedPassword: '将自动生成安全密码并通过邮件发送给用户。',
      passwordManagedByAdvancedAuth: '密码由高级认证管理。使用"重置密码"通过邮件向用户发送新密码。',
      resetPassword: '重置密码',
      resettingPassword: '重置密码中...',
    },
    deleteModal: {
      title: '删除用户',
      message: '确定要删除此用户吗？此操作无法撤销。',
      confirm: '删除用户',
    },
  },

  // Stream overlay
  streamOverlay: {
    title: '流叠加层',
    invalidPrinterId: '无效的打印机 ID',
    cameraStream: '摄像头流',
    progress: '进度',
    eta: '预计完成时间',
    printerIdle: '打印机空闲',
    printerOffline: '打印机离线',
    status: {
      printing: '打印中',
      paused: '已暂停',
      finished: '已完成',
      failed: '失败',
      idle: '空闲',
      unknown: '未知',
    },
  },

  // Profiles
  profiles: {
    title: '配置文件',
    subtitle: '管理您的切片预设和压力推进校准',
    tabs: {
      cloud: '云端配置文件',
      local: '本地配置文件',
      kprofiles: 'K 值配置',
    },
    localProfiles: {
      title: '本地配置文件',
      subtitle: '从 OrcaSlicer 导入和管理切片预设',
      import: '导入配置文件',
      importDesc: '将 .bbscfg、.bbsflmt、.orca_filament、.zip 或 .json 文件拖放到此处',
      importing: '导入中...',
      search: '搜索本地预设...',
      noPresets: '暂无本地预设',
      badge: '本地',
      edit: '编辑',
      delete: '删除',
      cancel: '取消',
      deleteConfirmTitle: '删除预设',
      deleteConfirm: '确定要删除此预设吗？此操作无法撤销。',
      source: '来源',
      inheritsFrom: '继承自',
      filamentType: '类型',
      vendor: '厂商',
      compatiblePrinters: '兼容打印机',
      nozzleTemp: '喷嘴温度',
      cost: '成本',
      density: '密度',
      pressureAdvance: '压力推进',
      filament: '耗材',
      process: '工艺',
      printer: '打印机',
      toast: {
        importSuccess: '已导入 {{count}} 个预设',
        importSkipped: '跳过 {{count}} 个预设（重复）',
        importError: '导入时出现 {{count}} 个错误',
        deleted: '预设已删除',
        updated: '预设已更新',
      },
    },
    connectedAs: '已连接为',
    logout: '退出登录',
    noLogoutPermission: '您没有退出登录的权限',
    failedToLoad: '加载配置文件失败',
    retry: '重试',
    time: {
      justNow: '刚刚',
      minsAgo: '{{count}} 分钟前',
      hoursAgo: '{{count}} 小时前',
      daysAgo: '{{count}} 天前',
    },
    toast: {
      loggedOut: '已退出登录',
    },
    login: {
      title: '连接到拓竹云',
      subtitle: '跨设备同步您的切片预设',
      email: '邮箱',
      password: '密码',
      region: '地区',
      regionGlobal: '全球',
      regionChina: '中国',
      verificationCode: '验证码',
      totpCode: '验证器代码',
      checkEmail: '检查您的邮箱 ({{email}}) 获取 6 位验证码',
      enterTotpHint: '输入验证器应用中的 6 位代码',
      accessToken: '访问令牌',
      accessTokenHint: '粘贴您的拓竹云访问令牌。中国大陆账号（绑定手机号、无邮箱登录）只能使用此方式登录。可从 MakerWorld 浏览器 Cookie 中获取令牌，详见 Wiki。',
      back: '返回',
      loginButton: '登录',
      verifyButton: '验证',
      setTokenButton: '设置令牌',
      useToken: '改用访问令牌',
      useEmail: '改用邮箱登录',
      toast: {
        loggedIn: '登录成功',
        codeSent: '验证码已发送到您的邮箱',
        enterTotp: '输入验证器应用中的代码',
        tokenSet: '令牌设置成功',
      },
    },
    presets: {
      myPreset: '我的预设（可编辑）',
      duplicate: '复制',
      editable: '可编辑',
      failedToLoadDetails: '加载预设详情失败',
      deleteConfirm: '删除此预设？',
      deleteWarning: '这将从拓竹云中永久删除"{{name}}"。此操作无法撤销。',
      noDuplicatePermission: '您没有复制预设的权限',
      noEditPermission: '您没有编辑预设的权限',
      noDeletePermission: '您没有删除预设的权限',
      types: {
        filament: '耗材预设',
        printer: '打印机预设',
        process: '工艺预设',
      },
      toast: {
        deleted: '预设已删除',
        created: '预设已创建',
        updated: '预设已更新',
        duplicated: '预设已复制',
        fieldAdded: '字段"{{key}}"已添加',
        exported: '预设已导出',
      },
      baseLabel: '基础：{{name}}',
      currentLabel: '当前：{{name}}',
      newPreset: '新建预设',
      editPreset: '编辑预设',
      duplicatePreset: '复制预设',
      createNewPreset: '创建新预设',
      customizeSettings: '自定义新预设的设置',
      compareWithBase: '与基础预设比较',
      compare: '比较',
      // CreatePresetModal - Basic Info
      basePreset: '基础预设',
      selectBasePreset: '选择基础预设...',
      presetName: '预设名称',
      myCustomPreset: '我的自定义预设',
      inheritsFrom: '继承自',
      dropJsonToImport: '拖放 JSON 以导入',
      // CreatePresetModal - Tabs
      tabs: {
        common: '常用',
        allFields: '所有字段',
      },
      // CreatePresetModal - All Fields Tab
      availableFields: '可用字段',
      searchFieldsPlaceholder: '搜索字段...',
      noMatchingFields: '没有匹配的字段',
      allFieldsAdded: '所有字段已添加',
      addCustomField: '添加自定义字段',
      yourOverrides: '您的覆盖值',
      noOverridesYet: '暂无覆盖值',
      clickFieldsToAdd: '点击左侧的字段进行添加',
      saveAsTemplate: '保存为模板',
      jsonTip: '提示：将 .json 文件拖放到此对话框的任意位置以导入设置',
    },
    cloudView: {
      searchPlaceholder: '搜索预设...',
      templates: '模板',
      refresh: '刷新',
      newPreset: '新建预设',
      clearFilters: '清除筛选',
      // Compare mode
      compareMode: '比较模式',
      selectAnotherPreset: '选择另一个 {{type}} 预设',
      clickTwoPresets: '点击两个相同类型的预设进行比较',
      selectFirst: '1. 选择第一个',
      selectSecond: '2. 选择第二个',
      compareNow: '立即比较',
      // Status row
      lastSynced: '上次同步：',
      showingCount: '显示 {{showing}} / {{total}} 个预设',
      noPresetsFound: '未找到预设',
      // Column headers
      columns: {
        filament: '耗材',
        process: '工艺',
        printer: '打印机',
      },
      noFilamentPresets: '无耗材预设',
      noProcessPresets: '无工艺预设',
      noPrinterPresets: '无打印机预设',
      // Filters
      filters: {
        type: '类型',
        owner: '所有者',
        printer: '打印机',
        nozzle: '喷嘴',
        filament: '耗材',
        layer: '层',
        all: '全部',
        myPresets: '我的预设',
        builtIn: '内置',
        process: '工艺',
      },
      // Permissions
      noTemplatesPermission: '您没有管理模板的权限',
      noRefreshPermission: '您没有刷新配置文件的权限',
      noCreatePermission: '您没有创建预设的权限',
    },
    templates: {
      title: '快速模板',
      noTemplates: '暂无模板',
      createFirst: '从预设编辑器创建模板',
      typeFilter: '类型：',
      deleteTitle: '删除模板',
      deleteWarning: '此操作无法撤销',
      deleteConfirm: '确定要删除"{{name}}"吗？',
      namePlaceholder: '模板名称',
      descriptionPlaceholder: '描述',
      settingsJson: '设置 (JSON)',
      fieldsCount: '{{count}} 个字段',
      shownInModals: '在对话框中显示',
      hiddenInModals: '在对话框中隐藏',
      apply: '应用',
      toast: {
        deleted: '模板已删除',
        updated: '模板已更新',
        created: '模板已创建',
        applied: '模板已应用',
      },
    },
  },

  // Support/Debug
  support: {
    debugLoggingActive: '调试日志记录已激活',
    manageLogs: '管理',
    collectItem7: '打印机连接和固件版本',
    collectItem8: '集成状态（Spoolman、MQTT、HA）',
    collectItem9: '网络接口（仅子网）',
    collectItem10: 'Python 包版本',
    collectItem11: '数据库健康检查',
    collectItem12: 'Docker 环境详情',
  },

  // File manager
  fileManager: {
    title: '文件管理器',
    subtitle: '组织和管理您的打印文件',
    uploadFiles: '上传文件',
    newFolder: '新建文件夹',
    folderName: '文件夹名称',
    folderNamePlaceholder: '例如：功能零件',
    renameFile: '重命名文件',
    renameFolder: '重命名文件夹',
    moveFiles: '移动 {{count}} 个文件',
    rootNoFolder: '根目录（无文件夹）',
    current: '当前',
    linkFolder: '链接文件夹',
    linkFolderDescription: '将"{{name}}"链接到项目或归档以便快速访问。',
    project: '项目',
    archive: '归档',
    noProjectsFound: '未找到项目',
    noArchivesFound: '未找到归档',
    unlink: '取消链接',
    link: '链接',
    dragDropFiles: '将文件拖放到此处',
    dropFilesHere: '将文件放在此处',
    orClickToBrowse: '或点击浏览',
    allFileTypesSupported: '支持所有文件类型。ZIP 文件将被解压。',
    zipFilesDetected: '检测到 ZIP 文件',
    zipExtractOptions: 'ZIP 文件将被解压。选择如何处理文件夹结构：',
    preserveZipStructure: '保留 ZIP 中的文件夹结构',
    createFolderFromZip: '从 ZIP 文件名创建文件夹',
    stlThumbnailGeneration: 'STL 缩略图生成',
    zipMayContainStl: 'ZIP 文件可能包含 STL 文件。可以在解压时生成缩略图。',
    thumbnailsCanBeGenerated: '可以为 STL 文件生成缩略图。大型模型可能需要更长时间处理。',
    generateThumbnailsForStl: '为 STL 文件生成缩略图',
    threemfDetected: '检测到 3MF 文件',
    threemfExtractionInfo: '将自动从 3MF 文件中提取打印机型号、材料、颜色和打印设置。',
    willBeExtracted: '将被解压',
    filesExtracted: '已解压 {{count}} 个文件',
    uploadComplete: '上传完成：{{succeeded}} 个成功',
    uploadFailed: '上传失败',
    zipFilesFailed: '{{count}} 个文件失败',
    uploading: '上传中...',
    changeLink: '更改链接...',
    linkTo: '链接到...',
    linkToProjectOrArchive: '链接到项目或归档',
    addToQueue: '添加到队列',
    schedulePrint: '排程',
    generateThumbnail: '生成缩略图',
    generateThumbnails: '生成缩略图',
    generateThumbnailsForMissing: '为缺少缩略图的 STL 文件生成缩略图',
    gridView: '网格视图',
    listView: '列表视图',
    lowDiskSpaceWarning: '磁盘空间不足警告',
    lowDiskSpaceDetails: '仅剩 {{free}}（总共 {{total}}）。阈值设置为 {{threshold}} GB。',
    files: '文件',
    folders: '文件夹',
    size: '大小',
    free: '剩余',
    allFiles: '所有文件',
    wrap: '换行',
    enableTextWrapping: '启用文本换行',
    disableTextWrapping: '禁用文本换行',
    collapse: '折叠',
    collapseFoldersByDefault: '默认折叠文件夹',
    expandFoldersByDefault: '默认展开文件夹',
    dragToResizeTooltip: '拖动调整大小，双击重置',
    searchFiles: '搜索文件...',
    allTypes: '所有类型',
    prints: '打印',
    ascending: '升序',
    descending: '降序',
    resultsCount: '{{showing}} / {{total}} 个文件',
    selectAll: '全选',
    deselectAll: '取消全选',
    selected: '已选择 {{count}} 个',
    adding: '添加中...',
    loadingFiles: '加载文件中...',
    folderIsEmpty: '文件夹为空',
    noFilesYet: '暂无文件',
    folderEmptyDescription: '上传文件或将文件移入此文件夹以开始使用。',
    noFilesDescription: '上传文件以开始组织您的打印相关文件。',
    noMatchingFiles: '没有匹配的文件',
    noMatchingFilesDescription: '没有文件匹配您当前的搜索或筛选条件。',
    clearFilters: '清除筛选',
    printedCount: '已打印 {{count}} 次',
    uploadedBy: '上传者',
    deleteFolder: '删除文件夹',
    deleteFile: '删除文件',
    deleteFilesCount: '删除 {{count}} 个文件',
    deleteFolderConfirm: '确定要删除此文件夹吗？其中的所有文件也将被删除。',
    deleteFileConfirm: '确定要删除此文件吗？',
    deleteFilesConfirm: '确定要删除 {{count}} 个选中的文件吗？此操作无法撤销。',
    deleting: '删除中...',
    noPermissionRenameFolder: '您没有重命名文件夹的权限',
    noPermissionLinkFolder: '您没有链接文件夹的权限',
    noPermissionDeleteFolder: '您没有删除文件夹的权限',
    noPermissionPrint: '您没有打印的权限',
    noPermissionSlice: '您没有切片文件的权限',
    noPermissionAddToQueue: '您没有添加到队列的权限',
    noPermissionDownload: '您没有下载文件的权限',
    noPermissionRenameFile: '您没有重命名此文件的权限',
    noPermissionGenerateThumbnail: '您没有生成缩略图的权限',
    noPermissionDeleteFile: '您没有删除此文件的权限',
    noPermissionCreateFolder: '您没有创建文件夹的权限',
    noPermissionUpload: '您没有上传文件的权限',
    noPermissionMoveFiles: '您没有移动文件的权限',
    noPermissionDeleteFiles: '您没有删除文件的权限',
    // External folder
    linkExternal: '链接外部',
    linkExternalFolder: '链接外部文件夹',
    linkExternalFolderDescription: '将主机目录（NAS、USB、网络共享）挂载到文件管理器中。文件不会被复制——直接从原始路径访问。',
    externalFolderNamePlaceholder: '例如：NAS打印文件',
    externalPath: '主机路径',
    externalPathHelp: 'Docker主机上目录的绝对路径。必须以绑定挂载方式挂载到容器中。',
    readOnly: '只读',
    readOnlyHelp: '防止上传和删除',
    showHiddenFiles: '显示隐藏文件（点文件）',
    externalFolder: '外部文件夹',
    scanFolder: '扫描',
    toast: {
      folderCreated: '文件夹已创建',
      folderDeleted: '文件夹已删除',
      fileDeleted: '文件已删除',
      filesDeleted: '已删除 {{count}} 个文件',
      filesMoved: '文件已移动',
      folderLinked: '文件夹已链接',
      folderUnlinked: '文件夹已取消链接',
      externalFolderLinked: '外部文件夹已链接并扫描',
      folderScanned: '扫描完成：添加 {{added}} 个，移除 {{removed}} 个',
      addedToQueue: '已将 {{count}} 个文件添加到队列',
      addedToQueuePartial: '已添加 {{added}} 个文件，{{failed}} 个失败',
      failedToAddToQueue: '添加文件失败：{{error}}',
      fileRenamed: '文件已重命名',
      folderRenamed: '文件夹已重命名',
      thumbnailsGenerated: '已生成 {{count}} 个缩略图',
      thumbnailsGeneratedPartial: '已生成 {{succeeded}} 个缩略图，{{failed}} 个失败',
      noStlMissingThumbnails: '没有缺少缩略图的 STL 文件',
      failedToGenerateThumbnails: '生成缩略图失败：{{error}}',
      thumbnailGenerated: '缩略图已生成',
      failedToGenerateThumbnail: '生成缩略图失败：{{error}}',
    },
  },

  // Projects
  projects: {
    title: '项目',
    subtitle: '组织和跟踪您的 3D 打印项目',
    newProject: '新建项目',
    editProject: '编辑项目',
    deleteProject: '删除项目',
    projectName: '项目名称',
    description: '描述',
    noProjects: '暂无项目',
    noProjectsFiltered: '没有{{status}}项目',
    noProjectsFilteredHelp: '您没有任何{{status}}项目。当项目状态更改时，它们将出现在这里。',
    createFirst: '创建您的第一个项目以开始组织相关打印、跟踪进度和管理构建。',
    createFirstButton: '创建您的第一个项目',
    create: '创建',
    files: '文件',
    prints: '打印',
    plates: '板',
    parts: '零件',
    lastModified: '最后修改',
    deleteConfirm: '确定要删除此项目吗？归档和队列项目将被取消链接但不会被删除。',
    addFiles: '添加文件',
    removeFile: '移除文件',
    viewDetails: '查看详情',
    // Modal fields
    namePlaceholder: '例如：Voron 2.4 构建',
    descriptionPlaceholder: '可选描述...',
    urlLabel: '网址',
    urlPlaceholder: 'https://makerworld.com/...',
    urlInvalid: '网址必须以 http:// 或 https:// 开头',
    openExternalUrl: '打开项目网址',
    coverImageLabel: '封面图片',
    coverImageAlt: '项目封面图片',
    coverImageUpload: '上传',
    coverImageReplace: '替换',
    coverImageRemove: '移除',
    color: '颜色',
    targetPlates: '目标板数',
    targetPlatesPlaceholder: '例如：25',
    targetPlatesHelp: '打印任务数量',
    targetParts: '目标零件数',
    targetPartsPlaceholder: '例如：150',
    targetPartsHelp: '所需零件总数',
    tagsLabel: '标签（逗号分隔）',
    tagsPlaceholder: '例如：voron、功能件、礼物',
    dueDate: '截止日期',
    priority: '优先级',
    priorityLow: '低',
    priorityNormal: '普通',
    priorityHigh: '高',
    priorityUrgent: '紧急',
    // Status
    statusActive: '进行中',
    statusCompleted: '已完成',
    statusArchived: '已归档',
    done: '完成',
    completed: '已完成',
    failed: '失败',
    inQueue: '队列中',
    noPrintsYet: '暂无打印',
    // Footer stats
    printJobs: '打印任务（板）',
    partsPrinted: '已打印零件',
    failedParts: '失败零件',
    // Actions
    import: '导入',
    export: '导出',
    importProject: '导入项目',
    exportAll: '导出所有项目',
    loading: '加载项目中...',
    // Permissions
    noEditPermission: '您没有编辑项目的权限',
    noDeletePermission: '您没有删除项目的权限',
    noCreatePermission: '您没有创建项目的权限',
    noImportPermission: '您没有导入项目的权限',
    noExportPermission: '您没有导出项目的权限',
    // Toast
    toast: {
      created: '项目已创建',
      updated: '项目已更新',
      deleted: '项目已删除',
      imported: '项目已导入',
      multipleImported: '已导入 {{count}} 个项目',
      importFailed: '导入失败',
      exported: '项目已导出（仅元数据）',
    },
  },

  // Project detail page
  projectDetail: {
    notFound: '未找到项目',
    backToProjects: '返回项目',
    export: '导出',
    exportProject: '导出项目',
    noExportPermission: '您没有导出项目的权限',
    noEditPermission: '您没有编辑项目的权限',
    partOf: '属于：',
    priorityLabel: '优先级：',
    noPrints: '此项目暂无打印',
    status: {
      active: '进行中',
      completed: '已完成',
      archived: '已归档',
    },
    priority: {
      low: '低',
      normal: '普通',
      high: '高',
      urgent: '紧急',
    },
    dueDate: {
      overdue: '已逾期',
      today: '今天到期',
      daysLeft: '还有 {{count}} 天',
    },
    progress: {
      platesProgress: '板进度',
      partsProgress: '零件进度',
      printJobs: '打印任务',
      parts: '零件',
      percentComplete: '{{percent}}% 完成',
      remaining: '剩余 {{count}} 个',
    },
    stats: {
      printJobs: '打印任务',
      total: '总计',
      failed: '{{count}} 个失败',
      partsPrinted: '已打印 {{count}} 个零件',
      printTime: '打印时间',
      filamentUsed: '耗材用量',
    },
    cost: {
      title: '成本追踪',
      filamentCost: '耗材成本',
      energy: '能源',
      totalCost: '总成本',
      total: '总计',
      includesBom: '含物料清单',
      budget: '预算',
      remaining: '剩余',
    },
    subProjects: {
      title: '子项目 ({{count}})',
    },
    notes: {
      title: '备注',
      noEditPermission: '您没有编辑备注的权限',
      placeholder: '添加关于此项目的备注...',
      empty: '暂无备注。点击编辑添加备注。',
    },
    files: {
      title: '文件',
      linkFolders: '从文件管理器链接文件夹',
      forQuickAccess: '到此项目以便快速访问。',
      fileCount: '{{count}} 个文件',
      empty: '未链接文件夹。前往文件管理器将文件夹链接到此项目。',
      noFiles: '此文件夹中没有文件。',
      print: '立即打印',
      addToQueue: '加入队列',
    },
    bom: {
      title: '材料清单',
      acquired: '已获取 {{completed}}/{{total}}',
      showAll: '显示全部',
      hideDone: '隐藏已完成',
      addPart: '添加零件',
      noAddPermission: '您没有添加零件的权限',
      partNamePlaceholder: '零件名称（例如：M3x8 螺丝）',
      partName: '零件名称',
      qty: '数量',
      price: '价格 ({{currency}})',
      sourcingUrlPlaceholder: '采购链接（可选）',
      remarksPlaceholder: '备注（可选）',
      deletePart: '删除零件',
      deleteConfirm: '确定要删除"{{name}}"吗？',
      noUpdatePermission: '您没有更新零件的权限',
      noEditPermission: '您没有编辑零件的权限',
      noDeletePermission: '您没有删除零件的权限',
      totalCost: '总成本：',
      empty: '材料清单中没有零件。添加硬件、电子元件或其他组件以跟踪需要采购的物品。',
    },
    timeline: {
      title: '活动时间线',
      empty: '暂无活动。',
    },
    template: {
      saveAsTemplate: '保存为模板',
      noCreatePermission: '您没有创建模板的权限',
    },
    queue: {
      title: '队列',
      viewAll: '查看全部',
      printing: '{{count}} 个打印中',
      queued: '{{count}} 个排队中',
    },
    prints: {
      title: '打印 ({{count}})',
    },
    toast: {
      projectUpdated: '项目已更新',
      partAdded: '零件已添加',
      partRemoved: '零件已移除',
      exportFailed: '导出失败',
      projectExported: '项目已导出',
      templateCreated: '模板已创建',
    },
  },

  // System info
  system: {
    title: '系统信息',
    version: '版本',
    uptime: '运行时间',
    cpuUsage: 'CPU 使用率',
    memoryUsage: '内存使用率',
    diskUsage: '磁盘使用率',
    networkInfo: '网络信息',
    logs: '日志',
    debugMode: '调试模式',
    enableDebug: '启用调试日志',
    disableDebug: '禁用调试日志',
    downloadLogs: '下载日志',
    clearLogs: '清除日志',
    dockerInfo: 'Docker 信息',
    containerName: '容器名称',
    imageName: '镜像名称',
    platform: '平台',
    architecture: '架构',
  },

  // Library (K Profiles)
  library: {
    title: '耗材库',
    addFilament: '添加耗材',
    editFilament: '编辑耗材',
    deleteFilament: '删除耗材',
    vendor: '厂商',
    material: '材料',
    color: '颜色',
    kFactor: 'K 值',
    temperature: '温度',
    noFilaments: '耗材库中没有耗材',
    deleteConfirm: '确定要删除此耗材吗？',
    importFromPrinter: '从打印机导入',
    exportToFile: '导出到文件',
  },

  // Slice (slicer-API integration via SliceModal)
  slice: {
    title: '切片模型',
    action: '切片',
    slicing: '切片中…',
    printer: '打印机配置',
    process: '工艺配置',
    filament: '耗材配置',
    filamentSlot: '耗材 {{index}}（{{type}}）',
    selectPreset: '— 选择预设 —',
    loadingPresets: '加载预设中…',
    analyzingPlateFilaments: '分析打印板耗材中…',
    analyzingPlateFilamentsHint: '正在运行预览切片以发现此打印板使用的 AMS 插槽。之后会缓存 — 重新打开是即时的。',
    previewToast: '分析 {{name}} — {{elapsed}}',
    previewWithProgress: '分析 {{name}} — {{stage}} ({{percent}}%) — {{elapsed}}',
    notUsedByPlate: '— 此打印板未使用',
    printerMismatch: '此 3MF 是为 {{source}} 切片的，但您选择了 {{target}}。切片器 CLI 无法为不同的打印机重新切片 3MF — 请在 Bambu Studio 中打开源文件，更改打印机并重新导出。',
    noPresetsForSlot: '无可用预设',
    presetsLoadFailed: '加载预设失败。请先打开设置 → 配置文件以导入。',
    allPresetsRequired: '必须选择所有预设',
    enqueuing: '提交切片任务中…',
    queued: '已排队…',
    failed: '切片失败。请检查切片器 sidecar 日志。',
    startedToast: '在后台切片 {{name}}…',
    queuedToast: '已排队：{{name}} — {{elapsed}}',
    runningToast: '切片 {{name}} — {{elapsed}}',
    runningWithProgress: '{{name}} – {{stage}} ({{percent}}%) – {{elapsed}}',
    completedToast: '已切片 {{name}}',
    failedToast: '切片 {{name}} 失败：{{detail}}',
    tier: {
      local: '已导入',
      cloud: '云端',
      standard: '标准',
    },
    cloud: {
      notAuthenticated: '登录 Bambu Cloud（设置 → 配置文件 → 云端）以查看云端预设。',
      expired: 'Bambu Cloud 会话已过期 — 请重新登录以刷新云端预设。',
      unreachable: '目前无法访问 Bambu Cloud。本地和标准预设仍可使用。',
    },
    bedType: {
      label: '打印板',
      auto: '自动（使用工艺预设）',
      coolPlate: '冷板',
      coolPlateSuperTack: 'Cool Plate SuperTack',
      engineering: 'Engineering Plate',
      highTemp: 'High Temp Plate',
      texturedPEI: 'Textured PEI Plate',
      smoothPEI: 'Smooth PEI Plate',
    },
  },

  // Spoolman
  spoolman: {
    title: 'Spoolman 集成',
    enabled: 'Spoolman 已启用',
    url: 'Spoolman URL',
    connected: '已连接',
    disconnected: '未连接',
    testConnection: '测试连接',
    sync: '同步',
    syncing: '同步中...',
    lastSync: '上次同步',
    linkToSpoolman: '链接到 Spoolman',
    openInSpoolman: '在 Spoolman 中打开',
    unlinkSpool: '取消链接耗材',
    unlinkConfirmTitle: '取消分配料盘？',
    unlinkConfirmMessage: '这将从此插槽中移除料盘。料盘本身的数据将保持不变。',
    selectSpool: '选择耗材',
    noUnlinkedSpools: '无未分配的料盘',
    linkSuccess: '料盘分配成功',
    linkFailed: '料盘分配失败',
    unlinkSuccess: '料盘取消分配成功',
    unlinkFailed: '料盘取消分配失败',
    linkedSpool: '已分配料盘',
    spoolId: '耗材 ID',
    fillSourceLabel: '(Spoolman)',
    weight: '重量',
    remaining: '剩余',
    disableWeightSync: '禁用 AMS 估计重量同步',
    disableWeightSyncDesc: '不从 AMS 估计值更新剩余容量。如果您更喜欢 Spoolman 的用量追踪而非 AMS 百分比估计，请使用此选项。新耗材仍将使用 AMS 估计值作为初始重量。',
    reportPartialUsage: '报告失败打印的部分用量',
    reportPartialUsageDesc: '当打印失败或被取消时，根据层进度报告估计的耗材使用量。',
  },

  // Inventory
  inventory: {
    title: '耗材库存',
    subtitle: '管理您的料盘',
    spoolmanMixedContentTitle: 'Spoolman 无法通过 HTTPS 加载 — 浏览器已阻止混合内容',
    spoolmanMixedContentBody: 'Bambuddy 通过您的反向代理以 HTTPS 提供服务，但您的 Spoolman 地址仍为 HTTP。出于安全考虑，浏览器会阻止混合内容，因此嵌入式 Spoolman 界面无法加载。Spoolman 也必须通过 HTTPS 访问。',
    spoolmanMixedContentFixReverseProxy: '请将 Spoolman 置于与 Bambuddy 相同的反向代理（Traefik / Nginx / Caddy）之后并启用 HTTPS，然后在设置中将 Spoolman URL 更新为新的 HTTPS 地址。',
    spoolmanMixedContentFixOpenNewTab: '作为变通方案，可在新标签页中通过 HTTP 打开 Spoolman — 混合内容规则仅适用于嵌入式框架，独立标签页仍可正常使用。',
    spoolmanOpenInNewTab: '在新标签页中打开 Spoolman',
    labels: {
      title: '打印线材标签',
      selectedCount: '已选 {{count}} 项',
      pickSpools: '选择要打印标签的线材：',
      searchPlaceholder: '按名称、品牌或 #ID 搜索',
      filterByMaterial: '材料：',
      allMaterials: '全部',
      selectVisible: '选择所有可见 ({{count}})',
      deselectVisible: '取消选择可见',
      clearAll: '全部清除',
      noSpoolsToShow: '没有要显示的线材。请调整筛选条件后重试。',
      noMatches: '没有线材符合当前搜索或筛选。',
      printOne: '打印此线材的标签',
      printLabels: '打印标签…',
      bulkTitle: '从当前显示的 {{count}} 个线材中选择要打印标签的',
      noSpoolsTitle: '没有要打标签的线材',
      error: '无法生成标签：{{msg}}',
      sortBy: {
        label: '排序：',
        id: '按 ID',
        color: '按颜色',
      },
      templates: {
        ams: {
          label: 'AMS holder (30 × 15 mm)',
          hint: '每页一个标签；适用于流行的 AMS 耗材标签托架。',
        },
        box40x30: {
          label: '盒标签 (40 × 30 mm)',
          hint: '每页一张；常见的 DK/Brother 卷尺寸，适合给耗材袋和储物盒贴标签。',
        },
        box: {
          label: 'Box label (62 × 29 mm)',
          hint: '每页一个标签；适配 Brother PT/QL 和 Dymo 小标签。',
        },
        averyL7160: {
          label: 'Avery L7160 — A4 sheet (38.1 × 63.5 mm × 21)',
          hint: '欧洲规格纸张；每张 A4 页 21 个标签。',
        },
        avery5160: {
          label: 'Avery 5160 — US Letter sheet (25.4 × 66.7 mm × 30)',
          hint: '美国规格纸张；每张 Letter 页 30 个标签。',
        },
      },
    },
    addSpool: '添加耗材',
    editSpool: '编辑耗材',
    copySpool: '复制耗材',
    material: '材料',
    selectMaterial: '选择材料...',
    subtype: '子类型',
    brand: '品牌',
    searchBrand: '搜索品牌...',
    useCustomBrand: '使用"{{brand}}"',
    useCustomMaterial: '使用自定义材料：{{material}}',
    colorName: '颜色名称',
    colorNamePlaceholder: '翡翠白、烈焰红...',
    color: '颜色',
    hexColor: '十六进制颜色',
    pickColor: '选择自定义颜色',
    labelWeight: '标签重量',
    coreWeight: '空盘重量',
    searchSpoolWeight: '搜索耗材重量...',
    weightUsed: '已使用',
    currentWeight: '剩余重量',
    measuredWeight: '称量重量',
    spoolName: '线轴',
    costPerKg: '每公斤成本',
    storageLocation: '存放位置',
    storageLocationPlaceholder: '例如：货架A，抽屉1',
    openInInventory: '在库存中查看',
    measuredWeightError: '称量重量必须在 {{min}}g 到 {{max}}g 之间。',
    slicerFilament: '切片耗材',
    slicerFilamentName: '切片预设名称',
    slicerPreset: '切片预设',
    searchPresets: '搜索耗材预设...',
    selectedPreset: '已选择',
    noPresetsFound: '未找到预设',
    tempOverrides: '温度覆盖',
    note: '备注',
    notePlaceholder: '关于此耗材的任何备注...',
    // Per-spool category + low-stock threshold override (#729)
    category: '类别',
    categoryPlaceholder: '例如：生产、原型、客户A',
    categoryNone: '未分类',
    storageLocationNone: '未设置位置',
    lowStockThresholdOverride: '低库存阈值（此料盘）',
    lowStockThresholdOverrideHelp: '留空以使用全局阈值（{{global}}%）。',
    clearRfid: '清除 RFID 标签',
    rfidCleared: 'RFID 标签已清除',
    archive: '归档',
    restore: '恢复',
    noSpools: '暂无耗材。添加您的第一个耗材开始使用。',
    noAvailableSpools: '没有可用的耗材。请先向库存中添加耗材，或从其他槽位取消分配一个耗材。',
    kProfiles: 'K 值配置',
    addKProfile: '添加 K 值配置',
    assignSpool: '分配耗材',
    unassignSpool: '取消分配',
    assignSuccess: '耗材已分配，AMS 槽位已配置',
    assignFailed: '分配耗材失败',
    assignMismatchTitle: '材料不匹配',
    assignMismatchMessage: '所选线轴材料 "{{spoolMaterial}}" 与 {{location}} 的料槽材料 "{{trayMaterial}}" 不匹配。仍要分配吗？',
    assignMismatchConfirm: '仍然分配',
    assignPartialMismatchMessage: '线轴材料 "{{spoolMaterial}}" 与 {{location}} 的 "{{trayMaterial}}" 相近但不完全一致。是否继续？',
    assignProfileMismatchMessage: '线轴配置 "{{spoolProfile}}" 与 {{location}} 的料槽配置 "{{trayProfile}}" 不一致。是否继续？',
    selectSpool: '选择要分配到此槽位的耗材',
    assigned: '已分配',
    assigning: '分配中...',
    searchSpools: '搜索耗材...',
    showAllSpools: '显示所有耗材',
    spoolmanSpools: 'Spoolman 线轴',
    allMaterials: '所有材料',
    filterByBrand: '按品牌筛选...',
    showArchived: '显示已归档',
    quickAdd: '快速添加（库存）',
    quantity: '数量',
    stock: '库存',
    configured: '已配置',
    spoolsCreated: '已创建 {{count}} 个耗材',
    spoolsPartiallyCreated: '已创建 {{created}} / {{total}} 个耗材（部分失败）',
    spoolCreated: '耗材已创建',
    spoolUpdated: '耗材已更新',
    spoolDeleted: '耗材已删除',
    deepLinkSpoolNotFound: '未找到耗材',
    deepLinkFetchFailed: '无法加载耗材 — 请重试',
    spoolArchived: '耗材已归档',
    spoolRestored: '耗材已恢复',
    kProfileSaveFailed: 'K值配置文件设置无法保存',
    syncWeightSpoolNotFound: '未找到耗材 — 可能已被删除',
    syncWeightSpoolmanUnreachable: 'Spoolman 无法访问 — 请稍后再试',
    syncWeightFailed: '重量同步失败',
    spoolmanUnreachable: 'Spoolman 无法访问 — 请稍后再试',
    deleteSpoolNotFound: '未找到耗材 — 可能已被删除',
    deleteFailed: '删除耗材失败',
    archiveSpoolNotFound: '未找到耗材 — 可能已被删除',
    archiveFailed: '归档耗材失败',
    restoreSpoolNotFound: '未找到耗材 — 可能已被删除',
    restoreFailed: '恢复耗材失败',
    saveFailed: '保存更改失败',
    tagClearFailed: '清除标签失败',
    deleteConfirm: '确定要删除此耗材吗？此操作无法撤销。',
    archiveConfirm: '确定要归档此耗材吗？',
    advancedSettings: '高级设置',
    // Tabs
    filamentInfoTab: '耗材信息',
    paProfileTab: 'PA 配置',
    filamentInfo: '耗材',
    additional: '附加',
    // Cloud
    loadingPresets: '加载云端预设中...',
    cloudConnected: '云端已连接',
    cloudNotConnected: '云端未连接（使用默认值）',
    // Colors
    recentColors: '最近',
    searchColors: '搜索颜色...',
    searchResults: '搜索结果',
    allColors: '所有颜色',
    commonColors: '常用颜色',
    showLess: '显示更少',
    showAll: '显示全部',
    noColorsFound: '没有颜色匹配您的搜索',
    noResults: '未找到匹配项',
    // 多色渐变 + 视觉效果 (#1154)
    extraColorsLabel: '附加颜色',
    extraColorsPlaceholder: 'EC984C,#6CD4BC,A66EB9,D87694',
    extraColorsHint: '粘贴 2 到 8 个十六进制色值,以逗号分隔。将渲染为渐变。',
    extraColorsInvalid: '已忽略无效的十六进制值:{{tokens}}',
    colorEffectLabel: '效果',
    colorEffect: {
      none: '无',
      sparkle: '闪光',
      wood: '木纹',
      marble: '大理石',
      glow: '夜光',
      matte: '哑光',
      silk: '丝光',
      galaxy: '星空',
      rainbow: '彩虹',
      metal: '金属',
      translucent: '半透明',
      gradient: '渐变',
      dualColor: '双色',
      triColor: '三色',
      multicolor: '多色',
    },
    // PA Profiles
    selectMaterialFirst: '请先在耗材信息选项卡中选择材料。',
    noPrintersConfigured: '未配置打印机。添加打印机以使用 PA 配置。',
    matchingFilter: '匹配',
    anyBrand: '任何品牌',
    anyVariant: '任何变体',
    autoSelect: '自动选择',
    matches: '匹配',
    match: '匹配',
    noMatches: '无匹配',
    connected: '已连接',
    offline: '离线',
    printerOffline: '打印机离线。连接后查看校准配置。',
    noKProfilesMatch: '没有 K 值配置匹配所选耗材。',
    leftNozzle: '左喷嘴',
    rightNozzle: '右喷嘴',
    profilesSelected: '个校准配置已选择',
    // Stats & enhanced table
    totalInventory: '总库存',
    totalConsumed: '总消耗',
    byMaterial: '按材料',
    inPrinter: '在打印机中',
    lowStock: '库存不足',
    sinceTracking: '自开始追踪',
    resetUsage: '将用量重置为 0',
    resetUsageTooltip: '将此料盘的已消耗克数计数器清零',
    resetUsageConfirm: '将此料盘的已消耗克数计数器重置为 0？后续打印将从零开始计数。料盘本身、剩余重量计算和您的设置不会改变。',
    resetAllUsage: '重置所有料盘的用量',
    resetAllUsageTooltip: '将每个活动料盘的已消耗克数计数器清零',
    resetAllUsageConfirm: '将全部 {{count}} 个活动料盘的已消耗克数计数器重置为 0？这将清空"累计消耗"统计值，后续打印从零开始计数。料盘和剩余重量不会改变。',
    usageReset: '料盘用量已重置为 0',
    allUsageReset: '已重置 {{count}} 个料盘',
    resetUsageFailed: '重置料盘用量失败',
    loadedInAms: '已装载到 AMS/外置',
    remaining: '剩余',
    weightCheck: '重量检查',
    lastWeighed: '上次称量',
    neverWeighed: '从未称量',
    search: '搜索耗材...',
    showing: '显示',
    to: '到',
    of: '共',
    show: '显示',
    spools: '个耗材',
    spool: '个耗材',
    page: '页',
    noSpoolsMatch: '未找到结果',
    noSpoolsMatchDesc: '尝试调整您的搜索或筛选条件。',
    active: '活跃',
    archived: '已归档',
    all: '全部',
    used: '已使用',
    new: '新的',
    clearFilters: '清除筛选',
    table: '表格',
    cards: '卡片',
    net: '净重',
    // Grouping
    groupSimilar: '分组',
    groupedSpools: '{{count}} 个相同耗材',
    groupedRows: '行',
    // Column config
    columns: '列',
    configureColumns: '配置列',
    configureColumnsDesc: '拖动以重新排序列或使用箭头。使用眼睛图标切换可见性。',
    visible: '可见',
    reset: '重置',
    cancel: '取消',
    applyChanges: '应用更改',
    moveUp: '上移',
    moveDown: '下移',
    hideColumn: '隐藏列',
    showColumn: '显示列',
    // Tag linking
    linkToSpool: '链接到耗材',
    tagLinked: '标签已链接到耗材',
    tagLinkFailed: '链接标签失败',
    tagAlreadyLinked: '标签已链接到其他耗材',
    unknownTag: '检测到未知 RFID 标签',
    // Usage history
    usageHistory: '使用历史',
    noUsageHistory: '暂无使用记录',
    printName: '打印名称',
    weightConsumed: '消耗重量',
    clearHistory: '清除',
    historyCleared: '使用历史已清除',
    fillSourceLabel: '(库存)',
    lowStockThresholdError: '阈值必须在 0.1 到 99.9 之间',
    // Spoolman filament catalog picker
    spoolmanFilamentCatalog: 'Spoolman 耗材目录',
    pickFromSpoolmanCatalog: '从 Spoolman 目录选择…',
    spoolmanFilamentSelected: '已从 Spoolman 目录选择耗材',
    spoolmanFilamentUnlinked: '已解除耗材目录关联',
    noSpoolmanFilaments: 'Spoolman 目录中未找到耗材',
    spoolmanFilamentColorSwatch: '耗材颜色',
    spoolWeightManagedBySpoolman: '空线轴重量在 Spoolman 中按耗材类型管理',
    spoolmanCatalogLoadFailed: '无法加载 Spoolman 耗材目录',
  },

  // Timelapse
  timelapse: {
    title: '延时摄影',
    create: '创建延时摄影',
    download: '下载',
    delete: '删除',
    preview: '预览',
    frameRate: '帧率',
    quality: '质量',
    processing: '处理中...',
    noTimelapses: '无可用延时摄影',
  },

  // AMS
  ams: {
    title: 'AMS',
    slot: '槽位',
    empty: '空',
    emptySlot: '空槽位',
    unknown: '未知',
    humidity: '湿度',
    temperature: '温度',
    filamentType: '耗材类型',
    filamentColor: '颜色',
    remaining: '剩余',
    history: 'AMS 历史',
    noHistory: '无可用历史',
    configureSlot: '配置槽位',
    externalSpool: '外置耗材',
    profile: '配置',
    kFactor: 'K 值',
    fill: '填充',
    configure: '配置',
    used: '已使用',
    remainingUnit: '剩余',
  },

  // Print modal
  printModal: {
    title: '开始打印',
    selectPrinter: '选择打印机',
    selectPlate: '选择板',
    filamentMapping: '耗材映射',
    totalCost: '总成本：',
    slotRemainingShort: ' - 剩余 {{grams}}g',
    printSettings: '打印设置',
    bedLeveling: '热床调平',
    flowCalibration: '流量校准',
    vibrationCalibration: '振动校准',
    layerInspection: '首层检查',
    timelapse: '延时摄影',
    startPrint: '开始打印',
    addToQueue: '添加到队列',
    cancel: '取消',
    noPrintersAvailable: '无可用打印机',
    printerBusy: '打印机忙碌',
    printerOffline: '打印机离线',
    sameTypeDifferentColor: '相同类型，不同颜色',
    filamentTypeNotLoaded: '耗材类型未装载',
    openCalendar: '打开日历',
    leftNozzle: '左',
    rightNozzle: '右',
    leftNozzleTooltip: '左喷嘴',
    rightNozzleTooltip: '右喷嘴',
    filamentOverride: '耗材覆盖',
    filamentOverrideHint: '可选覆盖用于基于模型的耗材分配。调度器将使用您选择的耗材而不是原始 3MF 值进行匹配。',
    originalFilament: '原始',
    overrideWith: '覆盖为',
    resetToOriginal: '恢复为原始',
    insufficientFilamentTitle: '耗材不足',
    insufficientFilamentMessage: '部分已分配线轴的剩余耗材少于本次打印所需：',
    insufficientFilamentLine: '{{printer}} - {{slot}}：需要 {{required}}g，剩余 {{remaining}}g',
    printAnyway: '仍然打印',
    forceColorMatch: '强制颜色匹配',
    staggerPrinterStarts: '错峰启动打印机',
    staggerGroupSize: '组大小',
    staggerInterval: '间隔（分钟）',
    staggerPreview: '{{printers}} 台打印机 → {{groups}} 个 {{size}} 台的组，每 {{interval}} 分钟启动一次',
    staggerLastGroup: '最后一组：{{count}}',
    staggerTotal: '共 {{minutes}} 分钟',
    staggerToPrinters: '分批发送到 {{count}} 台打印机',
    gcodeInjection: '注入自动打印G-code',
  },

  // Backup
  backup: {
    includesEncryptionKey: '本地备份包含 MFA 加密密钥文件（DATA_DIR/.mfa_encryption_key），因此备份 ZIP 是自包含的。请将 ZIP 视为敏感文件 — 任何拥有该文件的人都可以解密内部存储的 OIDC 客户端密钥和 TOTP 密钥。',
    title: '备份与恢复',
    createBackup: '创建备份',
    restoreBackup: '恢复备份',
    restoreDescription: '从备份文件替换所有数据',
    downloadBackup: '下载备份',
    uploadBackup: '上传备份',
    lastBackup: '上次备份',
    autoBackup: '自动备份',
    backupNow: '立即备份',
    restoreWarning: '警告：恢复备份将覆盖所有当前数据。',
    includeArchives: '包含归档',
    includeSettings: '包含设置',
    includeProfiles: '包含配置文件',
    backupSuccess: '备份创建成功',
    restoreSuccess: '备份恢复成功',
    backupFailed: '备份失败',
    restoreFailed: '恢复失败',
    restoreNote: '恢复期间虚拟打印机将停止',

    // GitHub Backup
    githubBackup: 'GitHub 备份',
    enabled: '已启用',
    cloudLoginRequired: '需要登录 Bambu Cloud。请在 配置文件 → 云配置文件 中登录以启用 GitHub 备份。',
    cloudLoginRequiredShort: '需要Cloud登录',
    githubDescription: '自动将您的配置文件同步到私有 GitHub 仓库以进行备份和版本历史记录。',
    repoIsPrivate: '仓库为私有 — 可以安全备份。',
    repoIsPublicWarning: '仓库为公开（PUBLIC）。Bambuddy 备份包含 MQTT 凭据、Home Assistant 令牌、Prometheus 令牌、您的 Bambu Cloud 邮箱以及通过 K-profile 暴露的打印机访问代码。在您于提供商设置中将仓库改为私有之前，保存将被阻止。',
    repoVisibilityUnknown: '无法确定仓库的可见性。Bambuddy 拒绝向任何未确认为私有的目标进行备份；保存将被阻止。',
    repositoryUrl: '仓库 URL',
    repoUrlPlaceholderGitHub: 'https://github.com/username/repo-name',
	repoUrlPlaceholderGitea: 'https://gitea.example.com/username/repo-name',
    repoUrlPlaceholderForgejo: 'https://forgejo.example.com/username/repo-name',
    repoUrlPlaceholderGitLab: 'https://gitlab.com/username/repo-name',
    allowInsecureHttp: '允许不安全的 HTTP',
    allowInsecureHttpHint: '为无 TLS 的私有网络自托管实例启用',
    personalAccessToken: '个人访问令牌',
    tokenSaved: '（已保存）',
    enterNewToken: '输入新令牌以更新',
    tokenHint: '具有内容读写权限的细粒度令牌',
    branch: '分支',
    provider: 'Git 提供商',
    providerGitHub: 'GitHub',
    providerGitLab: 'GitLab',
	providerGitea: 'Gitea',
    providerForgejo: 'Forgejo',
    manualOnly: '仅手动',
    hourly: '每小时',
    daily: '每天',
    weekly: '每周',
    includeInBackup: '包含在备份中',
    kProfiles: 'K 配置文件',
    kProfilesDescription: '来自已连接打印机的压力推进校准',
    noPrintersConnected: '没有打印机连接',
    printersConnected: '{{connected}}/{{total}} 已连接',
    cloudProfiles: '云配置文件',
    cloudProfilesDescription: '来自 Bambu Cloud 的耗材、打印机和工艺预设',
    appSettings: '应用设置',
    appSettingsDescription: 'Bambuddy 配置（完整数据库）',
    spoolInventory: '耗材库存',
    spoolInventoryDescription: '耗材卷轴、使用记录和成本追踪',
    printArchives: '打印档案',
    printArchivesDescription: '打印历史元数据（不含 gcode/3MF 文件）',
    lastBackupAt: '上次备份：',
    noBackupsYet: '尚无备份',
    next: '下次：',
    startingBackup: '正在启动备份...',
    test: '测试',
    enableBackup: '启用备份',
    testConnection: '测试连接',
    enterRepoUrl: '请输入仓库 URL',
    enterRepoAndToken: '请输入仓库 URL 和访问令牌',
    repoRequired: '仓库 URL 为必填项',
    tokenRequired: '访问令牌为必填项',
    githubBackupEnabled: 'GitHub 备份已启用',
    tokenUpdated: '令牌已更新',
    settingsSaved: '设置已保存',
    failedToSave: '保存失败：{{message}}',
    backupCompleteFiles: '备份完成 - {{count}} 个文件已更新',
    backupSkippedNoChanges: '备份已跳过 - 无更改',
    backupFailed2: '备份失败：{{message}}',
    clearedLogs: '已清除 {{count}} 条日志',
    failedToClearLogs: '清除日志失败：{{message}}',

    // History
    history: '历史记录',
    clear: '清除',
    date: '日期',
    status: '状态',
    commit: '提交',

    // Local Backup
    localBackup: '本地备份',
    localBackupDescription: '创建 Bambuddy 数据的完整备份，包括数据库、档案、上传和所有文件。',
    downloadBackupLabel: '下载备份',
    completeBackupZip: '完整备份：数据库 + 所有文件（ZIP）',
    download: '下载',
    preparingBackup: '正在准备备份...',
    creatingArchive: '正在创建备份归档...对于大型归档可能需要一些时间。',
    downloadingFile: '正在下载备份文件...',
    backupDownloaded: '备份下载成功',
    failedToCreateBackup: '创建备份失败：{{message}}',
    restore: '恢复',
    restoreReplacesAll: '恢复将替换所有数据。',
    restoreReplacesAllDetail: '您当前的数据库和文件将被完全替换。恢复后需要重启。',
    restoreConfirmTitle: '恢复备份',
    restoreConfirmMessage: '您确定要从"{{filename}}"恢复吗？这将完全替换您当前的数据库和所有文件。恢复后需要重启应用程序。',
    restoreConfirmButton: '恢复备份',
    uploadingFile: '正在上传备份文件...',
    backupRestoredRestart: '备份已恢复。请重启 Bambuddy。',
    failedToRestore: '恢复备份失败。请检查文件格式。',
    reloadNow: '立即重新加载',
    creatingBackup: '正在创建备份',
    restoringBackup: '正在恢复备份',
    preparing: '准备中...',
    processing: '处理中...',
    doNotClosePage: '请不要关闭此页面或导航离开。对于大型备份，此操作可能需要几分钟。',

    // RestoreModal
    restoring: '恢复中...',
    restoreComplete: '恢复完成',
    restoreFailed2: '恢复失败',
    importSettings: '从备份文件导入设置',
    pleaseWaitRestoring: '请等待数据恢复中',
    selectBackupFile: '点击选择备份文件（.json 或 .zip）',
    duplicateHandling: '重复项处理方式：',
    matchPrinters: '打印机',
    matchPrintersBy: '按序列号匹配',
    matchSmartPlugs: '智能插座',
    matchSmartPlugsBy: '按 IP 地址匹配',
    matchNotificationProviders: '通知提供者',
    matchNotificationProvidersBy: '按名称匹配',
    matchFilaments: '耗材',
    matchFilamentsBy: '按名称 + 类型 + 品牌匹配',
    matchArchives: '档案',
    matchArchivesBy: '按内容哈希匹配（始终跳过）',
    matchPendingUploads: '待上传',
    matchPendingUploadsBy: '按文件名匹配',
    matchSettingsTemplates: '设置和模板',
    matchSettingsTemplatesBy: '始终覆盖',
    replaceExisting: '替换现有数据',
    keepExisting: '保留现有数据',
    overwriteDescription: '用备份数据覆盖已存在的项目',
    keepDescription: '仅恢复尚不存在的项目',
    overwriteCaution: '注意：',
    overwriteWarning: '覆盖将用备份数据替换您当前的配置。出于安全考虑，打印机访问代码永远不会被覆盖。',
    cancel: '取消',
    processingBackup: '正在处理备份文件...',
    itemsRestored: '已恢复项目',
    itemsSkipped: '已跳过项目',
    restored: '已恢复',
    skippedAlreadyExist: '已跳过（已存在）',
    filesCategory: '文件（3MF、缩略图等）',
    andMore: '...还有 {{count}} 项',
    newApiKeysGenerated: '已生成新的 API 密钥',
    keysShownOnce: '这些密钥仅显示一次。请立即复制！',
    copy: '复制',
    noDataFound: '在备份文件中未找到可恢复的数据。',
    close: '关闭',

    // Scheduled local backups (#884)
    scheduledBackup: '定时备份',
    scheduledBackupDescription: '按计划自动创建备份快照。输出目录可以挂载到 NAS 或外部存储。',
    frequency: '频率',
    backupTime: '时间',
    retention: '保留',
    retentionDescription: '保留备份数量',
    outputPath: '输出路径',
    outputPathPlaceholder: '默认：{{path}}',
    outputPathDescription: '留空以使用默认位置',
    runNow: '立即运行',
    backupFiles: '备份文件',
    noScheduledBackups: '暂无备份',
    deleteBackup: '删除',
    deleteBackupConfirm: '删除此备份文件？',
    backupRunning: '备份中...',
    scheduledBackupComplete: '备份成功完成',
    scheduledBackupFailed: '备份失败',
    nextBackup: '下次备份',
    backupSize: '大小',
    utc: 'UTC',
    defaultPathLabel: '默认：',

    // Category labels
    categories: {
      settings: '设置',
      notification_providers: '通知提供者',
      notification_templates: '通知模板',
      smart_plugs: '智能插座',
      printers: '打印机',
      filaments: '耗材',
      maintenance_types: '维护类型',
      archives: '档案',
      projects: '项目',
      pending_uploads: '待上传',
      external_links: '外部链接',
      api_keys: 'API 密钥',
    },
  },

  // Tags
  tags: {
    title: '标签',
    addTag: '添加标签',
    editTag: '编辑标签',
    deleteTag: '删除标签',
    tagName: '标签名称',
    tagColor: '标签颜色',
    noTags: '无标签',
    deleteConfirm: '确定要删除此标签吗？',
    manageTags: '管理标签',
  },

  // Upload modal (archives)
  uploadModal: {
    title: '上传 3MF 文件',
    dragDrop: '将 .3mf 文件拖放到此处',
    or: '或',
    browseFiles: '浏览文件',
    extractionInfo: '将从 3MF 文件元数据中自动提取打印机型号。',
    uploaded: '已上传',
    failed: '失败',
    uploading: '上传中...',
    upload: '上传',
    uploadFailed: '上传失败',
  },

  // Edit archive modal
  // Edit Archive Modal
  editArchive: {
    title: '编辑归档',
    name: '名称',
    namePlaceholder: '打印名称',
    printer: '打印机',
    noPrinter: '无打印机',
    project: '项目',
    noProject: '无项目',
    itemsPrinted: '打印数量',
    itemsPrintedHelp: '此打印任务中生产的物品数量',
    notes: '备注',
    notesPlaceholder: '添加关于此打印的备注...',
    externalLink: '外部链接',
    externalLinkPlaceholder: 'https://printables.com/model/...',
    externalLinkHelp: '链接到 Printables、Thingiverse 或其他来源',
    tags: '标签',
    tagsPlaceholder: '添加标签...',
    addMoreTags: '添加更多标签...',
    matchingTags: '匹配"{{query}}"',
    existingTags: '现有标签',
    clickToAdd: '（点击添加）',
    status: '状态',
    failureReason: '失败原因',
    selectReason: '选择原因...',
    photos: '打印成品照片',
    photosHelp: '点击 + 添加打印成品照片',
    printResult: '打印成品',
    saving: '保存中...',
    // Failure reasons
    failureReasons: {
      adhesionFailure: '附着力失败',
      spaghettiDetached: '拉丝 / 脱落',
      layerShift: '层偏移',
      cloggedNozzle: '喷嘴堵塞',
      filamentRunout: '耗材用完',
      warping: '翘曲',
      stringing: '拉丝',
      underExtrusion: '挤出不足',
      powerFailure: '断电',
      userCancelled: '用户取消',
      other: '其他',
    },
    // Archive statuses
    statuses: {
      completed: '已完成',
      failed: '失败',
      aborted: '已取消',
      printing: '打印中',
    },
  },

  // K-Profiles
  kProfiles: {
    title: 'K 值配置',
    noPrintersConfigured: '未配置打印机',
    addPrinterInSettings: '在设置中添加打印机以管理 K 值配置',
    noActivePrinters: '无活跃打印机',
    enablePrinterConnection: '启用打印机连接以查看其 K 值配置',
    loadingProfiles: '加载 K 值配置中...',
    printerOffline: '打印机离线',
    printerOfflineDesc: '所选打印机未连接。开启电源以查看 K 值配置。',
    noMatchingProfiles: '无匹配的配置',
    noMatchingProfilesDesc: '没有配置匹配您的搜索条件',
    noKProfiles: '无 K 值配置',
    noKProfilesDesc: '未找到 {{diameter}}mm 喷嘴的压力推进配置',
    createFirstProfile: '创建第一个配置',
    // Controls
    printer: '打印机',
    nozzle: '喷嘴',
    refresh: '刷新',
    addProfile: '添加配置',
    export: '导出',
    import: '导入',
    select: '选择',
    selectAll: '全选',
    delete: '删除',
    // Filters
    searchPlaceholder: '按名称或耗材搜索...',
    allExtruders: '所有挤出机',
    leftOnly: '仅左侧',
    rightOnly: '仅右侧',
    allFlow: '所有流量',
    hfOnly: '仅高流量',
    sOnly: '仅标准',
    sortName: '排序：名称',
    sortKValue: '排序：K 值',
    sortFilament: '排序：耗材',
    // Dual extruder labels
    leftExtruder: '左挤出机',
    rightExtruder: '右挤出机',
    // Modal
    modal: {
      addTitle: '添加 K 值配置',
      editTitle: '编辑 K 值配置',
      profileName: '配置名称',
      profileNamePlaceholder: '我的 PLA 配置',
      kValue: 'K 值',
      kValuePlaceholder: '0.020',
      kValueHelp: '典型范围：PLA 0.01 - 0.06，PETG 0.02 - 0.10',
      filament: '耗材',
      selectFilament: '选择耗材...',
      noFilamentsHelp: '未找到耗材。请先在 Bambu Studio 中创建 K 值配置。',
      flowType: '流量类型',
      highFlow: '高流量',
      standard: '标准',
      nozzleSize: '喷嘴尺寸',
      extruder: '挤出机',
      extruders: '挤出机',
      left: '左',
      right: '右',
      notes: '备注（本地存储）',
      notesPlaceholder: '添加关于此配置的备注...',
      notesHelp: '备注保存在 Bambuddy 中，不在打印机上',
      syncing: '与打印机同步中...',
      savingExtruder: '保存到挤出机 {{current}}/{{total}}...',
      pleaseWait: '请稍候',
    },
    // Delete confirmation
    deleteConfirm: {
      title: '删除配置',
      cannotUndo: '此操作无法撤销',
      message: '确定要从打印机删除"{{name}}"吗？',
    },
    // Bulk delete
    bulkDelete: {
      title: '删除配置',
      cannotUndo: '此操作无法撤销',
      message: '确定要从打印机删除 {{count}} 个选中的配置吗？',
    },
    // Toast
    toast: {
      profileSaved: 'K 值配置已保存',
      profilesSaved: 'K 值配置已保存到 {{count}} 个挤出机',
      selectAtLeastOneExtruder: '请至少选择一个挤出机',
      profileDeleted: 'K 值配置已删除',
      profilesDeleted: '已删除 {{count}} 个配置',
      exportedProfiles: '已导出 {{count}} 个配置',
      importedProfiles: '已导入 {{count}} / {{total}} 个配置',
      noProfilesToExport: '无可导出的配置',
      invalidFileFormat: '无效的文件格式',
      failedToParseImport: '解析导入文件失败',
      failedToSaveBatch: '批量保存 K 值配置失败',
      noteSaved: '备注已保存',
      failedToSaveNote: '保存备注失败',
    },
    // Permissions
    permission: {
      noRead: '您没有刷新配置的权限',
      noCreate: '您没有添加配置的权限',
      noUpdate: '您没有更新 K 值配置的权限',
      noDelete: '您没有删除 K 值配置的权限',
      noExport: '您没有导出配置的权限',
      noImport: '您没有导入配置的权限',
    },
  },

  // Virtual Printer
  virtualPrinter: {
    title: '虚拟打印机',
    running: '运行中',
    stopped: '已停止',
    description: {
      default: '启用虚拟打印机，使其在 Bambu Studio 和 OrcaSlicer 中可见。发送到此打印机的文件将直接归档而不打印。',
      proxy: '启用代理，将切片软件流量中继到真实打印机，允许在任何网络上远程打印。',
    },
    enable: {
      title: '启用虚拟打印机',
      visibleInSlicer: '在切片软件发现中显示为"Bambuddy"',
      proxyingTo: '代理到 {{name}}',
      notActive: '未激活',
    },
    model: {
      title: '打印机型号',
      description: '选择要模拟的打印机型号。',
      restartWarning: '更改型号将重启虚拟打印机',
    },
    accessCode: {
      title: '访问码',
      isSet: '访问码已设置',
      notSet: '未设置访问码 - 需要设置才能启用',
      placeholder: '输入 8 位字符代码',
      placeholderChange: '输入新代码以更改',
      hint: '必须恰好 8 个字符。切片软件使用此代码进行认证。',
      charCount: '({{count}}/8)',
    },
    targetPrinter: {
      title: '目标打印机',
      configured: '代理目标已配置',
      notConfigured: '未选择目标打印机 - 代理模式需要设置',
      placeholder: '选择打印机...',
      hint: '选择要将切片软件流量代理到的打印机。打印机必须处于局域网模式。',
      noPrinters: '未配置打印机。请先添加打印机以使用代理模式。',
    },
    remoteInterface: {
      title: '网络接口覆盖',
      configured: '接口覆盖已激活',
      optional: '可选 - 当自动检测的 IP 不正确时使用（例如多网卡、Docker、VPN）',
      placeholder: '自动检测（默认）...',
      hint: '覆盖通过 SSDP 广播并在 TLS 证书中使用的 IP 地址。在 Bambuddy 有多个网络接口时很有用。',
    },
    mode: {
      title: '模式',
      archive: '归档',
      archiveDesc: '立即归档文件',
      review: '审核',
      reviewDesc: '归档前审核',
      queue: '队列',
      queueDesc: '归档并添加到队列',
      proxy: '代理',
      proxyDesc: '中继到真实打印机',
    },
    autoDispatch: {
      title: '自动派发',
      description: '添加到队列时自动开始打印。关闭后，打印任务等待手动派发。',
    },
    queueForceColorMatch: {
      title: '强制颜色匹配',
      description: '拒绝派发到没有完全相同耗材类型和颜色的打印机。默认关闭 — 不启用时，队列仅按型号匹配，可能选到颜色错误的打印机。',
    },
    tailscaleDisabled: {
      title: 'Tailscale 集成',
      description: '启用以将此 VP 标记为通过 Tailscale 公开。显示主机的 Tailscale 地址，以便您知道要粘贴到切片器中的 IP。CA 导入步骤保持不变 — 此开关对证书无影响。',
    },
    setupRequired: {
      title: '需要设置',
      description: '虚拟打印机功能需要额外的系统配置才能工作。包括端口转发、防火墙规则和平台特定设置。',
      readGuide: '启用前请阅读设置指南',
    },
    archiveNameSource: {
      title: '存档名称来源',
      description: '选择通过虚拟打印机接收文件时新存档的命名方式。"元数据"使用 3MF 中嵌入的切片标题（默认）。"文件名"使用 Bambu Studio 通过 FTP 发送的文件名 — 当您在"发送到打印机"对话框中重命名作业时非常有用。',
      metadata: '元数据',
      filename: '文件名',
    },
    howItWorks: {
      title: '工作原理',
      step1: '在同一局域网中，虚拟打印机会通过发现机制自动出现在您的切片软件（Bambu Studio / OrcaSlicer）中。从其他网络，通过 IP 地址和访问码手动添加。',
      step2: '在归档、审核和队列模式下，使用切片软件中的"发送"按钮将 3MF 文件上传到 Bambuddy。切片软件会显示"打印成功"— 文件已存储，未打印。',
      step3: '在代理模式下，虚拟打印机将所有流量中继到真实打印机 — 打印会立即开始，就像直接连接一样。',
    },
    status: {
      title: '状态详情',
      printerName: '打印机名称',
      model: '型号',
      serialNumber: '序列号',
      mode: '模式',
      pendingFiles: '待处理文件',
      targetPrinter: '目标打印机',
      ftpPort: 'FTP 端口',
      mqttPort: 'MQTT 端口',
      ftpConnections: 'FTP 连接',
      mqttConnections: 'MQTT 连接',
    },
    toast: {
      updated: '虚拟打印机设置已更新',
      failedToUpdate: '更新设置失败',
      copyFailed: '复制失败 — 请手动选中文本',
      accessCodeRequired: '请先设置访问码',
      targetPrinterRequired: '请先选择目标打印机',
      bindIpRequired: '请先设置绑定 IP',
      accessCodeEmpty: '访问码不能为空',
      accessCodeLength: '访问码必须恰好 8 个字符',
      created: '虚拟打印机已创建',
      failedToCreate: '创建虚拟打印机失败',
      deleted: '虚拟打印机已删除',
      failedToDelete: '删除虚拟打印机失败',
    },
    list: {
      title: '虚拟打印机',
      add: '添加',
      addFirst: '添加虚拟打印机',
      empty: '未配置虚拟打印机。添加一个以开始使用。',
    },
    bindIp: {
      title: '绑定接口',
      placeholder: '选择接口...',
      hint: '此虚拟打印机绑定的网络接口。每台打印机必须唯一。',
    },
    proxy: {
      accessCodeHint: '在代理模式下，在切片软件中使用目标打印机的访问码。连接会透明转发到真实打印机。',
    },
    addDialog: {
      title: '添加虚拟打印机',
      name: '名称',
      hint: '创建后可以配置访问码、目标打印机和其他设置。',
      create: '创建',
    },
    deleteConfirm: {
      title: '删除虚拟打印机',
      message: '确定要删除"{{name}}"吗？这将停止此打印机的所有服务。',
    },
  },

  // Model Viewer
  modelViewer: {
    openInSlicer: '在切片软件中打开',
    tabs: {
      model: '3D 模型',
      gcode: 'G-code 预览',
    },
    notAvailable: '不可用',
    notSliced: '未切片',
    plates: '板',
    allPlates: '所有板',
    plateNumber: '板 {{number}}',
    plateCount: '{{count}} 个板',
    plateCount_other: '{{count}} 个板',
    objectCount: '{{count}} 个对象',
    objectCount_other: '{{count}} 个对象',
    filamentCount: '{{count}} 种耗材',
    filamentCount_other: '{{count}} 种耗材',
    eta: '预计 {{minutes}} 分钟',
    noPreview: '此文件无可用预览',
    pagination: {
      pageOf: '第 {{current}} / {{total}} 页',
      prev: '上一页',
      next: '下一页',
    },
    errors: {
      failedToLoad: '加载文件失败',
      noMeshes: '3MF 文件中未找到网格',
      unsupportedFormat: '不支持的文件格式',
    },
  },

  // Maintenance type descriptions (built-in)
  maintenanceDescriptions: {
    lubricateCarbonRods: '在碳纤维杆上涂抹润滑剂以确保顺畅运动',
    lubricateRails: '在线性导轨上涂抹润滑剂以确保顺畅运动',
    cleanNozzle: '清洁热端和喷嘴以防止堵塞',
    checkBelts: '检查皮带张力以确保打印精度',
    cleanBuildPlate: '清洁构建板以获得更好的附着力',
    checkExtruder: '检查挤出机齿轮磨损情况',
    checkCooling: '确保冷却风扇正常工作',
    generalInspection: '打印机综合检查',
    cleanCarbonRods: '清洁碳纤维杆以减少摩擦',
    lubricateSteelRods: '在钢杆上涂抹润滑剂以确保顺畅运动',
    cleanSteelRods: '清洁钢杆以减少摩擦',
    cleanLinearRails: '擦拭线性导轨以清除灰尘和碎屑',
    checkPtfeTube: '检查 PTFE 管的磨损或损坏',
    replaceHepaFilter: '更换 HEPA 过滤器以保证空气质量',
    replaceCarbonFilter: '更换活性炭过滤器',
    lubricateLeftNozzleRail: '润滑左喷嘴导轨（H2 系列）',
  },

  // Smart Plugs
  smartPlugs: {
    offline: '离线',
    admin: '管理',
    openPlugAdminPage: '打开插座管理页面',
    deleteSmartPlug: '删除智能插座',
    turnOnSmartPlug: '开启智能插座',
    turnOffSmartPlug: '关闭智能插座',
    turnOn: '开启',
    turnOff: '关闭',
    addSmartPlug: {
      scanningNetwork: '扫描网络中...',
      chooseEntity: '选择实体...',
      connectionFailed: '连接失败',
      searchEntities: '搜索实体...',
      searchPowerSensors: '搜索功率传感器...',
      searchEnergySensors: '搜索能量传感器...',
      placeholders: {
        plugName: '客厅插座',
        mqttStateOnValue: 'ON、true、1',
        mqttSameAsPower: '与功率主题相同，或不同',
      },
    },
    // SmartPlugCard
    linkedTo: '关联到：',
    monitorOnly: '仅监控',
    alerts: '警报',
    scheduleOn: '开启 {{time}}',
    scheduleOff: '关闭 {{time}}',
    on: '开启',
    off: '关闭',
    power: '功率',
    kwhToday: '今日kWh',
    settings: '设置',
    automationSettings: '自动化设置',
    showInSwitchbar: '在开关栏显示',
    quickAccessSidebar: '从侧边栏快速访问',
    enabled: '已启用',
    enableAutomation: '为此插座启用自动化',
    autoOn: '自动开启',
    autoOnDescription: '打印开始时开启',
    autoOff: '自动关闭',
    autoOffDescription: '打印完成时关闭（一次性）',
    autoOffPersistent: '保持启用',
    autoOffPersistentDescription: '在打印之间保持启用而非一次性',
    autoOffAfterDrying: '干燥完成后自动关闭',
    autoOffAfterDryingDescription: 'AMS 干燥完成后关闭',
    delayAfterDryingMinutes: '干燥后延迟（分钟）',
    turnOffDelayMode: '关闭延迟模式',
    time: '时间',
    temp: '温度',
    delayMinutes: '延迟（分钟）',
    tempThreshold: '温度阈值（°C）',
    tempThresholdDescription: '当喷嘴冷却到此温度以下时关闭',
    edit: '编辑',
    deleteConfirm: '确定要删除"{{name}}"吗？此操作无法撤销。',
    turnOnConfirm: '确定要开启"{{name}}"吗？',
    turnOffConfirm: '确定要关闭"{{name}}"吗？这将切断连接设备的电源。',
    failedToTurn: '无法{{action}}"{{name}}"',
    unknown: '未知',
    // AddSmartPlugModal
    addTitle: '添加智能插座',
    editTitle: '编辑智能插座',
    stopScanning: '停止扫描',
    discoverTasmota: '发现Tasmota设备',
    foundDevices: '找到{{count}}个设备 - 点击选择：',
    noDevicesFound: '未在您的网络中找到Tasmota设备',
    haNotConfigured: 'Home Assistant未配置。请在以下位置设置',
    haSettingsPath: '设置 → 网络 → Home Assistant',
    selectEntity: '选择实体 *',
    ipAddress: 'IP地址 *',
    nameLabel: '名称 *',
    username: '用户名',
    password: '密码',
    authHint: '如果您的Tasmota设备不需要认证，请留空',
    linkToPrinter: '关联打印机',
    noPrinter: '无打印机（仅手动控制）',
    linkingDescription: '关联后可在打印开始/完成时自动开关',
    powerAlerts: '功率警报',
    alertAbove: '高于时警报（W）',
    alertBelow: '低于时警报（W）',
    alertDescription: '当电力消耗超过这些阈值时收到通知。留空以禁用该方向。',
    dailySchedule: '每日计划',
    turnOnAt: '开启时间',
    turnOffAt: '关闭时间',
    scheduleDescription: '每天在这些时间自动开关插座。留空以跳过该操作。',
    showOnPrinterCard: '在打印机卡片上显示',
    displayOnPrinterCard: '在打印机卡片上显示按钮',
    connectedResult: '已连接！',
    deviceLabel: '设备：{{name}} - ',
    stateLabel: '状态：{{state}}',
    test: '测试',
    delete: '删除',
    save: '保存',
    add: '添加',
    cancel: '取消',
    failedToStartScan: '无法开始扫描',
    nameRequired: '名称为必填项',
    entityRequired: 'Home Assistant插座需要实体',
    mqttTopicRequired: '必须为功率、能源或状态监控配置至少一个MQTT主题',
    loadingEntities: '正在加载实体...',
    loading: '加载中...',
    failedToLoadEntities: '加载实体失败：{{error}}',
    noEntitiesMatching: '未找到匹配"{{search}}"的实体',
    noEntitiesAvailable: '无可用实体',
    searchingEntities: '搜索所有实体（找到{{count}}个）',
    showingEntities: '显示 switch、light、input_boolean（{{count}}个可用）',
    energyMonitoringOptional: '能源监控（可选）',
    energyMonitoringHint: '搜索并选择提供功率/能源数据的传感器。',
    powerSensorW: '功率传感器（W）',
    energyTodayKwh: '今日能源（kWh）',
    totalEnergyKwh: '总能源（kWh）',
    noMatchingSensors: '无匹配的传感器',
    none: '无',
    mqttNotConfigured: 'MQTT代理未配置。请在以下位置设置代理地址',
    mqttSettingsPath: '设置 → 网络 → MQTT发布',
    mqttNotConfiguredSuffix: '（您不需要启用发布，只需填写代理详细信息）。',
    mqttMonitorOnlyDescription: 'MQTT插座通过MQTT订阅接收功率/能源数据。开关控制不可用 - 请使用您的MQTT代理或家庭自动化系统。',
    powerMonitoring: '功率监控',
    energyMonitoring: '能源监控',
    stateMonitoring: '状态监控',
    optional: '可选',
    topic: '主题',
    jsonPath: 'JSON路径',
    multiplier: '乘数',
    onValue: 'ON值',
    mqttPowerHint: 'JSON路径从JSON负载中提取值（例如"power_l1"）。如果主题发布原始数值，请留空。\n乘数：mW→W使用0.001，kW→W使用1000。',
    mqttEnergyHint: 'JSON路径从JSON负载中提取值。原始值请留空。\n乘数：Wh→kWh使用0.001，MWh→kWh使用1000。',
    mqttStateHint: 'JSON路径从JSON负载中提取值。原始值请留空。\nON值：表示"ON"的确切字符串。留空以自动检测（ON、true、1）。',
    // REST smart plug
    restControl: '控制',
    restOnUrl: '开启 URL',
    restOffUrl: '关闭 URL',
    restOnBody: '开启请求体',
    restOffBody: '关闭请求体',
    restMethod: 'HTTP 方法',
    restHeaders: 'Custom Headers (JSON)',
    restStatusUrl: '状态 URL',
    restStatusPath: '状态 JSON 路径',
    restStatusOnValue: '开启值',
    restPowerUrl: '功率URL',
    restPowerPath: '功率 JSON 路径',
    restPowerMultiplier: '功率乘数',
    restEnergyUrl: '能耗URL',
    restEnergyPath: '能耗 JSON 路径',
    restEnergyMultiplier: '能耗乘数',
    restUrlRequired: 'REST 插座至少需要一个 URL（ON 或 OFF）',
    restHeadersHint: '例如 {"Authorization": "Bearer your-token"}',
    restBodyHint: '例如 ON, {"state": "on"}',
    restStatusHint: '轮询当前状态的 URL',
    restPathHint: '例如 state 或 data.power.status',
    restPowerUrlHint: '功率数据的独立URL（留空则使用状态URL）',
    restEnergyUrlHint: '能耗数据的独立URL（留空则使用状态URL）',
    restEnergyHint: '每个值可以使用独立的URL，或回退到状态URL。使用乘数进行单位转换（例如：0.001 将 Wh 转换为 kWh）。',
    testConnection: '测试连接',
    connectionSuccess: '连接成功',
    noSwitchesInSwitchbar: '开关栏中没有开关',
    enableSwitchbarHint: '在设置 > 智能插座中启用"在开关栏显示"',
  },

  // Notifications
  notifications: {
    // Provider types
    providerTypes: {
      callmebot: 'CallMeBot/WhatsApp',
      ntfy: 'ntfy',
      pushover: 'Pushover',
      telegram: 'Telegram',
      email: '电子邮件',
      discord: 'Discord',
      webhook: 'Webhook',
      homeassistant: 'Home Assistant',
    },
    // Provider descriptions
    providerDescriptions: {
      email: 'SMTP 电子邮件通知',
      telegram: '通过 Telegram 机器人发送通知',
      discord: '通过 Webhook 发送到 Discord 频道',
      ntfy: '免费、可自托管的推送通知',
      pushover: '简单、可靠的推送通知',
      callmebot: '通过 CallMeBot 免费发送 WhatsApp 通知',
      webhook: '通用 HTTP POST 到任意 URL',
      homeassistant: 'Home Assistant 仪表板中的持久通知',
    },
    // NotificationProviderCard
    lastSuccess: '上次：{{date}}',
    error: '错误',
    printer: '打印机：',
    allPrinters: '所有打印机',
    sendTestNotification: '发送测试通知',
    eventSettings: '事件设置',
    enabled: '已启用',
    sendFromProvider: '从此提供商发送通知',
    // Event categories
    printEvents: '打印事件',
    printerStatus: '打印机状态',
    amsAlarms: 'AMS 警报',
    amsHtAlarms: 'AMS-HT 警报',
    printQueue: '打印队列',
    // Event tags (badges)
    start: '开始',
    plateCheck: '热床检测',
    complete: '完成',
    failed: '失败',
    stopped: '已停止',
    progress: '进度',
    offline: '离线',
    lowFilament: '耗材不足',
    maintenance: '维护',
    amsHumidity: 'AMS 湿度',
    amsTemp: 'AMS 温度',
    amsHtHumidity: 'AMS-HT 湿度',
    amsHtTemp: 'AMS-HT 温度',
    bedCooled: '热床已冷却',
    firstLayer: '首层完成',
    quiet: '免打扰',
    digest: '摘要 {{time}}',
    // Event labels (expanded settings)
    printStarted: '打印已开始',
    plateNotEmpty: '热床非空',
    plateNotEmptyDescription: '打印前检测到物体',
    printCompleted: '打印已完成',
    bedCooledLabel: '热床已冷却',
    bedCooledDescription: '打印后热床温度降至阈值以下',
    firstLayerCompleteLabel: '首层打印完成',
    firstLayerCompleteDescription: '首层完成时发送带照片的通知',
    missingSpoolAssignmentLabel: '缺少料卷分配',
    missingSpoolAssignmentDescription: '当打印开始且所需料盘没有分配料卷时发送通知',
    printFailed: '打印失败',
    printStopped: '打印已停止',
    progressMilestones: '进度里程碑',
    progressMilestonesDescription: '在 25%、50%、75% 时通知',
    printerOffline: '打印机离线',
    printerError: '打印机错误',
    lowFilamentLabel: '耗材不足',
    maintenanceDue: '需要维护',
    maintenanceDueDescription: '需要维护时通知',
    amsHumidityHigh: 'AMS 湿度过高',
    amsHumidityHighDescription: '普通 AMS 湿度超过阈值',
    amsTemperatureHigh: 'AMS 温度过高',
    amsTemperatureHighDescription: '普通 AMS 温度超过阈值',
    amsHtHumidityHigh: 'AMS-HT 湿度过高',
    amsHtHumidityHighDescription: 'AMS-HT 湿度超过阈值',
    amsHtTemperatureHigh: 'AMS-HT 温度过高',
    amsHtTemperatureHighDescription: 'AMS-HT 温度超过阈值',
    // Inventory stock alert events
    inventoryAlerts: '库存警报',
    stockReorderAlert: '补货警报',
    stockReorderAlertDescription: 'SKU 已达到补货点',
    stockBreakAlert: '断货警报',
    stockBreakAlertDescription: '库存将在补货到达前耗尽',
    // Queue events
    jobAdded: '任务已添加',
    jobAddedDescription: '任务已添加到队列',
    jobAssigned: '任务已分配',
    jobAssignedDescription: '基于模型的任务已分配给打印机',
    jobStarted: '任务已开始',
    jobStartedDescription: '队列任务已开始打印',
    jobWaiting: '任务等待中',
    jobWaitingDescription: '任务正在等待耗材或打印机',
    jobSkipped: '任务已跳过',
    jobSkippedDescription: '任务已跳过（上一个失败）',
    jobFailed: '任务失败',
    jobFailedDescription: '任务启动失败',
    queueComplete: '队列已完成',
    queueCompleteDescription: '所有队列任务已完成',
    // Quiet hours
    quietHours: '免打扰时段',
    noNotificationsDuring: '在此时段内不发送通知',
    editProviderToChangeQuietHours: '编辑提供商以更改免打扰时段',
    // Daily digest
    dailyDigest: '每日摘要',
    batchNotifications: '将通知汇总为每日摘要',
    sendAt: '发送于 {{time}}',
    editProviderToChangeDigestTime: '编辑提供商以更改摘要时间',
    // Actions
    edit: '编辑',
    deleteProvider: '删除通知提供商',
    deleteConfirm: '确定要删除"{{name}}"吗？此操作无法撤销。',
    delete: '删除',
    // AddNotificationModal
    addTitle: '添加通知提供商',
    editTitle: '编辑通知提供商',
    nameLabel: '名称 *',
    namePlaceholder: '我的通知',
    providerTypeLabel: '提供商类型 *',
    configuration: '配置',
    testConfiguration: '测试配置',
    printerFilter: '打印机筛选',
    onlyFromPrinter: '仅发送来自此打印机的事件通知',
    quietHoursDnd: '免打扰时段',
    quietStart: '开始',
    quietEnd: '结束',
    dailyDigestLabel: '每日摘要',
    sendDigestAt: '发送摘要于',
    digestCollected: '事件将被收集并在此时间作为单条摘要发送',
    notificationEvents: '通知事件',
    progressPercent: '（25%、50%、75%）',
    bedCooledAfterPrint: '（打印完成后）',
    // Per-event ntfy priority (#990)
    eventPriority: {
      sectionTitle: 'ntfy 优先级',
      helpNtfy: '为每个已启用的事件选择优先级。ntfy 使用它来升级提醒（声音、可见性、推送行为）。此处未设置的级别将使用 ntfy 服务器默认值。',
      min: '最低',
      low: '低',
      default: '默认',
      high: '高',
      urgent: '紧急',
    },
    cancel: '取消',
    save: '保存',
    add: '添加',
    nameRequired: '名称为必填项',
    fieldRequired: '{{field}}为必填项',
    // Config field labels
    phoneNumber: '电话号码',
    apiKey: 'API 密钥',
    serverUrl: '服务器 URL',
    topic: '主题',
    authToken: '认证令牌',
    userKey: '用户密钥',
    appToken: '应用令牌',
    priority: '优先级',
    botToken: '机器人令牌',
    chatId: '聊天 ID',
    smtpServer: 'SMTP 服务器',
    smtpPort: 'SMTP 端口',
    security: '安全',
    authentication: '认证',
    username: '用户名',
    password: '密码',
    fromEmail: '发件人邮箱',
    toEmail: '收件人邮箱',
    webhookUrl: 'Webhook URL',
    payloadFormat: '负载格式',
    authorization: '授权',
    titleFieldName: '标题字段名',
    messageFieldName: '消息字段名',
    // NotificationTemplateEditor
    editTemplate: '编辑模板：{{name}}',
    titleLabel: '标题',
    bodyLabel: '正文',
    titlePlaceholder: '通知标题...',
    bodyPlaceholder: '通知正文...',
    availableVariables: '可用变量',
    clickToInsert: '点击插入到正文光标位置',
    livePreview: '实时预览',
    hide: '隐藏',
    show: '显示',
    loadingPreview: '加载预览中...',
    enterTemplateContent: '输入模板内容以查看预览',
    titlePreview: '标题：',
    bodyPreview: '正文：',
    resetToDefault: '恢复默认',
    titleRequired: '标题为必填项',
    bodyRequired: '正文为必填项',
    // NotificationLogViewer
    notificationLog: '通知日志',
    showFailedOnly: '仅显示失败',
    last24Hours: '最近 24 小时',
    last7Days: '最近 7 天',
    last30Days: '最近 30 天',
    last90Days: '最近 90 天',
    justNow: '刚刚',
    noFailedNotifications: '没有失败的通知',
    noNotificationsLogged: '没有通知记录',
    unknownProvider: '未知提供商',
    logTitle: '标题',
    logMessage: '消息',
    logError: '错误',
    logProvider: '提供商：{{type}}',
    logTime: '时间：{{time}}',
    refresh: '刷新',
    clearOld: '清除旧记录',
    statsSummary: '最近 {{days}} 天：',
    statsNotifications: '条通知',
    statsSent: '{{count}} 条已发送',
    statsFailed: '{{count}} 条失败',
    // Event type labels (for log viewer)
    eventTypes: {
      print_start: '打印已开始',
      print_complete: '打印完成',
      print_failed: '打印失败',
      print_stopped: '打印已停止',
      print_progress: '进度',
      printer_offline: '打印机离线',
      printer_error: '打印机错误',
      filament_low: '耗材不足',
      maintenance_due: '需要维护',
      test: '测试',
    },
    userEmail: {
      title: '通知',
      emailNotifications: '邮件通知',
      emailNotificationsDesc: '接收您自己打印任务的邮件通知。邮件将通过高级身份验证中配置的 SMTP 设置发送。',
      sendingTo: '通知将发送至',
      noEmailWarning: '您的账户没有邮件地址。请联系管理员添加。',
      printJobNotifications: '打印任务通知',
      printJobNotificationsDesc: '选择哪些事件会触发您提交的打印任务的邮件通知。',
      printJobStarts: '打印任务开始',
      printJobStartsDesc: '当您的打印任务开始时收到通知。',
      printJobFinishes: '打印任务完成',
      printJobFinishesDesc: '当您的打印任务成功完成时收到通知。',
      printErrors: '打印错误',
      printErrorsDesc: '当您的打印任务失败或遇到错误时收到通知。',
      printJobStops: '打印任务停止',
      printJobStopsDesc: '当您的打印任务被取消或停止时收到通知。',
      saveSuccess: '通知偏好设置已保存。',
      saveError: '保存通知偏好设置失败。',
    },
  },

  // Rich Text Editor
  richTextEditor: {
    bold: '粗体',
    italic: '斜体',
    underline: '下划线',
    bulletList: '无序列表',
    numberedList: '有序列表',
    alignLeft: '左对齐',
    alignCenter: '居中对齐',
    alignRight: '右对齐',
    addLink: '添加链接',
    removeLink: '移除链接',
  },

  // External Links
  externalLinks: {
    noLinksConfigured: '未配置外部链接',
    deleteLink: '删除链接',
    removeCustomIcon: '移除自定义图标',
    openInNewTab: '在新标签页中打开',
    placeholders: {
      linkName: '我的链接',
    },
  },

  // Keyboard Shortcuts Modal
  keyboardShortcuts: {
    title: '键盘快捷键',
    navigation: '导航',
    archivesSection: '归档',
    kProfilesSection: 'K 值配置',
    generalSection: '通用',
    shortcuts: {
      goToPrinters: '前往打印机',
      goToArchives: '前往归档',
      goToQueue: '前往队列',
      goToStats: '前往统计',
      goToProfiles: '前往云端配置',
      goToSettings: '前往设置',
      focusSearch: '聚焦搜索',
      openUploadModal: '打开上传对话框',
      clearSelection: '清除选择 / 取消焦点',
      contextMenu: '卡片右键菜单',
      refreshProfiles: '刷新配置',
      newProfile: '新建配置',
      exitSelectionMode: '退出选择模式',
      showHelp: '显示此帮助',
    },
    footer: '按 Esc 或点击外部关闭',
  },

  // Notification Log
  notificationLog: {
    title: '通知日志',
    events: {
      printStarted: '打印开始',
      printComplete: '打印完成',
      printFailed: '打印失败',
      printStopped: '打印停止',
      progress: '进度',
      printerOffline: '打印机离线',
      printerError: '打印机错误',
      lowFilament: '耗材不足',
      maintenanceDue: '维护到期',
      test: '测试',
    },
    timeAgo: {
      justNow: '刚刚',
      minutesAgo: '{{minutes}} 分钟前',
      hoursAgo: '{{hours}} 小时前',
    },
  },

  // Restore/Backup Modal
  restoreBackup: {
    title: '恢复备份',
    restoring: '恢复中...',
    restoreComplete: '恢复完成',
    restoreFailed: '恢复失败',
    importSettings: '从备份文件导入设置',
    pleaseWait: '请稍候，正在恢复您的数据',
    clickToSelect: '点击选择备份文件（.json 或 .zip）',
    howDuplicateHandling: '重复处理方式：',
    categories: {
      printers: '打印机',
      smartPlugs: '智能插座',
      notificationProviders: '通知提供商',
      filaments: '耗材',
      archives: '归档',
      pendingUploads: '待处理上传',
      settingsTemplates: '设置和模板',
    },
    matchingInfo: {
      printers: '按序列号匹配',
      smartPlugs: '按 IP 地址匹配',
      notificationProviders: '按名称匹配',
      filaments: '按名称 + 类型 + 品牌匹配',
      archives: '按内容哈希匹配',
      pendingUploads: '按文件名匹配',
      settingsTemplates: '始终覆盖',
    },
    replaceExisting: '替换现有数据',
    keepExisting: '保留现有数据',
    replaceDescription: '用备份数据覆盖已存在的项目',
    keepDescription: '仅恢复不存在的项目',
    caution: '注意：',
    cautionText: '覆盖将用备份数据替换您当前的配置。出于安全考虑，打印机访问码永远不会被覆盖。',
    itemsRestored: '已恢复项目',
    itemsSkipped: '已跳过项目',
    restored: '已恢复',
    skipped: '已跳过（已存在）',
    filesLabel: '文件（3MF、缩略图等）',
    newApiKeysGenerated: '已生成新 API 密钥',
    newApiKeysWarning: '这些密钥仅显示一次。请立即复制！',
    processingBackup: '处理备份文件中...',
    noDataFound: '备份文件中未找到可恢复的数据。',
    failedToRestore: '恢复备份失败。请检查文件格式。',
  },

  // Backup Export Modal
  backupExport: {
    title: '导出备份',
    selectData: '选择要包含的数据',
    selectAll: '全选',
    selectNone: '全不选',
    categoryDescriptions: {
      settings: '语言、主题、更新偏好',
      notifications: 'ntfy、Pushover、Discord 等',
      templates: '自定义消息模板',
      smartPlugs: 'Tasmota 插座配置',
      externalLinks: '侧边栏外部服务链接',
      printers: '打印机信息（不含访问码）',
      plateDetection: '空打印板参考图像',
      filaments: '耗材类型和成本',
      maintenance: '自定义维护计划',
      archives: '所有打印数据 + 文件（3MF、缩略图、照片）',
      projects: '项目、材料清单和附件',
      pendingUploads: '虚拟打印机待审核的上传',
      apiKeys: 'Webhook API 密钥（导入时生成新密钥）',
    },
    requiresPrinters: '需要选择打印机',
    zipFileWarning: '将创建 ZIP 文件。',
    zipFileDescription: '包括所有 3MF 文件、缩略图、延时摄影和照片。这可能需要一些时间并生成较大的文件。',
    includeAccessCodes: '包含访问码',
    includeAccessCodesDescription: '用于转移到另一台机器',
    includeAccessCodesWarning: '访问码将以明文形式包含。请妥善保管此备份文件！',
    categoriesSelected: '已选择 {{selectedCount}} 个类别',
  },

  // Pending Uploads Panel
  pendingUploads: {
    placeholders: {
      notes: '添加关于此打印的备注...',
    },
    discardUpload: '丢弃上传',
    archiveAllUploads: '归档所有上传',
    discardAllUploads: '丢弃所有上传',
    archive: '归档',
    timeAgo: {
      justNow: '刚刚',
      minutesAgo: '{{minutes}} 分钟前',
      hoursAgo: '{{hours}} 小时前',
      daysAgo: '{{days}} 天前',
    },
  },

  // API Browser
  apiBrowser: {
    placeholders: {
      requestBody: 'JSON 请求体...',
      searchEndpoints: '搜索端点...',
    },
  },

  // Configure AMS Slot Modal
  configureAmsSlot: {
    title: '配置 AMS 槽位',
    slotConfigured: '槽位已配置！',
    configuringSlot: '正在配置槽位：',
    slotLabel: '{{ams}} 槽位 {{slot}}',
    searchPresets: '搜索预设...',
    colorPlaceholder: '颜色名称或十六进制（例如：棕色、FF8800）',
    clearCustomColor: '清除自定义颜色',
    noCloudPresets: '无云端预设。登录拓竹云以同步。',
    noPresetsAvailable: '无可用预设。登录拓竹云或导入本地配置。',
    noMatchingPresets: '未找到匹配的预设。',
    custom: '自定义',
    builtin: '内置',
    settingsSentToPrinter: '设置已发送到打印机',
    filamentProfile: '耗材配置',
    kProfileLabel: 'K 值配置（压力推进）',
    filteringFor: '筛选：{{material}}',
    noKProfile: '无 K 值配置（使用默认值 0.020）',
    noMatchingKProfiles: '未找到匹配的 K 值配置。将使用默认 K=0.020。',
    selectFilamentFirst: '请先选择耗材配置',
    kFromCalibration: 'K={{value}}（来自打印机校准）',
    customColorLabel: '自定义颜色（可选）',
    presetColors: '{{name}} 颜色：',
    showLessColors: '显示更少颜色',
    showMoreColors: '显示更多颜色',
    clear: '清除',
    hexLabel: '十六进制：#{{hex}}',
    resetting: '重置中...',
    resetSlot: '重置槽位',
    cancel: '取消',
    configuring: '配置中...',
    configureSlot: '配置槽位',
  },

  // Git Backup Settings
  githubBackup: {
    title: 'Git 备份',
    history: '历史',
    downloadBackup: '下载备份',
    restoreBackup: '恢复备份',
    noBackupsYet: '暂无备份',
  },

  // Email Settings
  emailSettings: {
    placeholders: {
      fromName: 'Bambuddy',
    },
  },

  // Tag Management Modal
  tagManagement: {
    searchTags: '搜索标签...',
    renameTag: '重命名标签',
    deleteTag: '删除标签',
  },

  // Notification Template Editor
  notificationTemplates: {
    placeholders: {
      title: '通知标题...',
      body: '通知正文...',
    },
  },

  // Batch Tag Modal
  batchTag: {
    placeholders: {
      newTag: '输入新标签...',
    },
  },

  // Photo Gallery Modal
  photoGallery: {
    deletePhoto: '删除照片',
  },

  // Filament Hover Card
  filamentHoverCard: {
    copySpoolUuid: '复制耗材 UUID',
  },

  // K Profiles View
  kProfilesView: {
    hasNote: '有备注',
    copyProfile: '复制配置',
  },

  // Layout/Navigation
  layout: {
    openMenu: '打开菜单',
    noPermissionSystemInfo: '您没有查看系统信息的权限',
  },

  // Dashboard
  dashboard: {
    dragToReorder: '拖动以重新排列',
    hideWidget: '隐藏小部件',
  },

  // Notification Provider Card
  notificationProviderCard: {
    deleteNotificationProvider: '删除通知提供商',
  },

  // File Manager Modal
  fileManagerModal: {
    closeFileManager: '关闭文件管理器',
    sortFiles: '排序文件',
    goToParentFolder: '返回上级文件夹',
    threeView: '3D 视图',
  },

  // Embedded Camera Viewer
  embeddedCameraViewer: {
    refreshStream: '刷新流',
    close: '关闭',
    zoomOut: '缩小',
    resetZoom: '重置缩放',
    zoomIn: '放大',
    dragToResize: '拖动调整大小',
  },

  // Timelapse Viewer
  timelapseViewer: {
    skipBack5s: '后退 5 秒',
    skipForward5s: '前进 5 秒',
  },

  // Notification Providers
  notificationProviders: {
    descriptions: {
      email: 'SMTP 邮件通知',
      telegram: '通过 Telegram 机器人通知',
      discord: '通过 Webhook 发送到 Discord 频道',
      ntfy: '免费、可自托管的推送通知',
      pushover: '简单、可靠的推送通知',
      callmebot: '通过 CallMeBot 的免费 WhatsApp 通知',
      webhook: '通用 HTTP POST 到任意 URL',
    },
  },

  // Log Viewer
  logViewer: {
    searchPlaceholder: '搜索消息或日志名称...',
    noLogEntries: '未找到日志条目',
  },

  // Switchbar Popover
  switchbarPopover: {
    noSwitchesInSwitchbar: '切换栏中没有开关',
  },

  // Project Page Modal
  projectPageModal: {
    placeholders: {
      title: '标题',
      designer: '设计师',
      license: '许可证',
      description: '输入描述...',
      profileTitle: '配置标题',
      profileDescription: '配置描述...',
    },
  },

  // Spoolman Settings
  spoolmanSettings: {},

  // Time
  time: {
    unknown: '-',
    waiting: '等待中',
    justNow: '刚刚',
    now: '现在',
    minsAgo: '{{count}} 分钟前',
    inMins: '{{count}} 分钟后',
    hoursAgo: '{{count}} 小时前',
    inHours: '{{count}} 小时后',
    daysAgo: '{{count}} 天前',
    inDays: '{{count}} 天后',
  },

  // SpoolBuddy Kiosk
  spoolbuddy: {
    nav: {
      dashboard: '仪表板',
      ams: 'AMS',
      inventory: '库存',
      writeTag: '写入',
      settings: '设置',
    },
    status: {
      nfcReady: 'NFC 就绪',
      nfcOff: 'NFC 关闭',
      offline: '离线',
      online: '在线',
      noPrinters: '无打印机',
      deviceOffline: '设备离线',
      waitingConnection: '等待设备连接...',
      systemReady: '系统就绪',
      status: '状态',
    },
    dashboard: {
      readyToScan: '准备扫描',
      idleMessage: '将耗材放在秤上以识别',
      nfcHint: 'NFC 标签将自动读取',
      device: '设备',
      syncWeight: '同步重量',
      weightSynced: '已同步！',
      unknownTag: '未知标签',
      newTag: '检测到新标签',
      onScale: '在秤上',
      linkSpool: '链接到耗材',
      linkTagTitle: '将标签链接到耗材',
      linkTag: '链接标签',
      selectSpool: '选择要链接此标签的耗材：',
      noUntagged: '未找到没有标签的耗材',
      tagDetected: '检测到标签',
      noTag: '无标签',
      tagId: '标签',
      grossWeight: '毛重',
      spoolSize: '耗材盘尺寸',
      close: '关闭',
      currentSpool: '当前耗材',
      plateReady: '热床就绪: {{name}}',
      plateReadyLabel: '待清理的热床',
      plateClearAction: '清理',
      plateClearedToast: '已将热床标记为已清理',
      plateClearFailed: '无法将热床标记为已清理',
    },
    modal: {
      spoolDetected: '检测到耗材',
      assignToAms: '分配到 AMS',
      syncWeight: '同步重量',
      weightSynced: '已同步！',
      syncing: '同步中...',
      newTagDetected: '检测到新标签',
      addToInventory: '添加到库存',
      assignToAmsTitle: '分配到 AMS',
      selectSlot: '选择槽位',
      assign: '分配',
      assigning: '分配中...',
      assignSuccess: '已分配！',
      assignPendingInsert: '已分配。插入耗材后将配置槽位。',
      assignError: '分配耗材失败。请重试。',
      noPrinterSelected: '选择打印机...',
      noAmsDetected: '此打印机未检测到 AMS',
      slot: '槽位',
    },
    weight: {
      noReading: '无读数',
      stable: '稳定',
      measuring: '测量中...',
      tare: '去皮',
      calibrate: '校准',
    },
    spool: {
      remaining: '剩余',
      material: '材料',
      brand: '品牌',
      color: '颜色',
      coreWeight: '空盘',
      labelWeight: '标签',
      scaleWeight: '秤重',
      netWeight: '净重',
      lastUsed: '上次使用',
    },
    ams: {
      noData: '未检测到 AMS',
      connectAms: '连接 AMS 以查看耗材槽位',
      noPrinter: '未选择打印机',
      selectPrinter: '从顶部栏选择打印机',
      printerDisconnected: '打印机已断开',
      humidity: '湿度',
      level: '余量',
      active: '活跃',
      slot: '槽位',
      empty: '空',
    },
    inventory: {
      search: '搜索耗材...',
      empty: '库存中没有耗材',
      noResults: '没有匹配的耗材',
      spools: '个耗材',
      addSpool: '添加耗材',
    },
    settings: {
      // Tabs
      tabDevice: '设备',
      tabDisplay: '显示',
      tabScale: '秤',
      tabUpdates: '更新',
      // Device tab
      nfcReader: 'NFC 读卡器',
      type: '类型',
      connection: '连接',
      notConnected: '不适用',
      deviceInfo: '设备信息',
      hostname: '主机',
      uptime: '运行时间',
      systemConfig: '后端与认证',
      backendUrl: 'Bambuddy 后端 URL',
      apiToken: 'API 令牌',
      apiTokenPlaceholder: '输入 API 令牌',
      saveConfig: '保存配置',
      systemQueued: '配置已加入队列。',
      nfcDiagnostic: 'NFC 诊断',
      scaleDiagnostic: '秤诊断',
      readTagDiagnostic: '读取标签诊断',
      testNfc: '测试读卡器',
      testScale: '测试精度',
      testReadTag: '读取标签',
      systemFieldsRequired: '后端 URL 为必填项。',
      // Display tab
      brightness: '亮度',
      saved: '已保存',
      noBacklight: '未检测到 DSI 背光。亮度控制需要 DSI 显示屏。',
      screenBlank: '屏幕熄灭超时',
      screenBlankDesc: '不活动后屏幕关闭。触摸唤醒。',
      displayNote: '亮度作为软件滤镜应用。',
      // Scale tab
      scaleCalibration: '秤校准',
      currentWeight: '当前重量',
      tareOffset: '去皮',
      calFactor: '系数',
      knownWeight: '已知重量',
      calStep1: '移除秤上所有物品并按设置零点。',
      calStep2: '将已知重量放在秤上。',
      setZero: '设置零点',
      calibrateNow: '校准',
      calibrated: '已校准',
      tareSet: '去皮命令已发送。等待设备响应...',
      tareFailed: '发送去皮命令失败',
      zeroSet: '零点已设置。将已知重量放在秤上。',
      calibrationDone: '校准完成！',
      calibrationFailed: '校准失败',
      lastCalibrated: '上次校准',
      stable: '稳定',
      settling: '稳定中...',
      firmware: '固件',
      scale: '秤',
      noDevice: '未找到 SpoolBuddy 设备',
      // Updates tab
      daemonVersion: '守护进程版本',
      currentVersion: '当前',
      versionPending: '等待守护进程...',
      checking: '检查中...',
      checkUpdates: '检查更新',
      updateAvailable: '有可用更新',
      updateInstructions: '通过 SSH 更新：运行 SpoolBuddy 安装脚本进行升级。',
      upToDate: '已是最新',
      includeBeta: '包含测试版本',
    },
    writeTag: {
      tabExisting: '现有耗材',
      tabNew: '新耗材',
      tabReplace: '替换标签',
      searchPlaceholder: '按材料、颜色、品牌搜索...',
      noUntaggedSpools: '没有无标签的耗材',
      noTaggedSpools: '没有有标签的耗材',
      selectSpool: '选择一个耗材，然后将空白 NTAG 放在读卡器上',
      placeTag: '将 NTAG 放在读卡器上',
      tagReady: '检测到标签 — 准备写入',
      writeTag: '写入标签',
      replaceTag: '替换标签',
      writing: '写入标签中...',
      waiting: '等待 SpoolBuddy...',
      writeSuccess: '标签写入成功！',
      writeFailed: '写入失败',
      queueFailed: '排队写入命令失败',
      tryAgain: '重试',
      cancel: '取消',
      replaceWarning: '旧标签将被取消链接。新标签将替换它。',
      deviceOffline: 'SpoolBuddy 离线',
      material: '材料',
      colorName: '颜色名称',
      color: '颜色',
      brand: '品牌',
      weight: '重量 (g)',
      createSpool: '创建耗材',
      creating: '创建中...',
      spoolCreated: '耗材已创建！准备写入。',
      createFailed: '创建耗材失败',
      incompleteDataWarning: '已使用不完整的Spoolman数据写入标签',
    },
    quickMenu: {
      printerPower: '打印机电源',
      systemControls: '系统',
      restartDaemon: '重启守护进程',
      restartBrowser: '重启浏览器',
      reboot: '重启',
      shutdown: '关机',
      swipeToClose: '向下滑动关闭',
      confirmTitle: '确认',
      confirmShutdown: '确定要关闭SpoolBuddy吗？您需要物理访问才能重新开启。',
      confirmReboot: '确定要重启SpoolBuddy吗？',
      confirmRestartDaemon: '重启SpoolBuddy守护进程？NFC和秤将暂时不可用。',
      confirmRestartBrowser: '重启kiosk浏览器？屏幕将短暂变黑。',
      confirm: '确认',
      confirmPlugOn: '开启 {{name}}？',
      confirmPlugOff: '关闭 {{name}}？',
      turnOn: '开启',
      turnOff: '关闭',
    },
  },

  bugReport: {
    title: '报告错误',
    description: '描述',
    descriptionPlaceholder: '出了什么问题？请描述问题...',
    email: '邮箱（可选）',
    emailPlaceholder: 'your@email.com',
    emailPrivacy: '如果提供，您的邮箱将包含在GitHub Issue的折叠部分中，以便维护者后续跟进。',
    screenshot: '截图',
    uploadOrPaste: '上传、粘贴或拖拽图片',
    dataCollectedSummary: '报告中包含哪些数据？',
    dataIncluded: '包含：',
    dataIncludedList: '应用版本、操作系统、架构、Python版本、数据库统计（仅计数）、打印机型号、喷嘴数量、固件版本、连接状态、集成状态（Spoolman、MQTT、HA）、非敏感设置、网络接口数量、Docker详情、依赖版本。',
    dataNeverIncluded: '绝不包含：',
    dataNeverIncludedList: '打印机名称、序列号、访问代码、密码、IP地址、邮箱地址、API密钥、令牌、Webhook URL、主机名或用户名。',
    submit: '提交',
    startLogging: '开始调试日志',
    stepEnableLogging: '调试日志已启用',
    stepReproduce: '请现在重现问题',
    stepStopLogging: '停止并提交报告',
    stopAndSubmit: '停止并提交',
    maxDuration: '{{minutes}}分钟后自动停止',
    stoppingLogs: '正在收集日志并提交...',
    submitting: '正在提交错误报告...',
    submitSuccess: '错误报告提交成功！',
    submitFailed: '提交错误报告失败',
    thankYou: '谢谢！',
    submitted: '您的错误报告已提交。',
    viewIssue: '查看Issue',
    unexpectedError: '发生了意外错误',
  },
  failureDetection: {
    title: 'AI 故障检测',
    description: '通过自托管的 Obico ML API 监控打印,并对检测到的故障自动采取行动。',
    mlUrl: 'Obico ML API 地址',
    mlUrlHint: '您自托管的 Obico ml_api 容器的基础 URL(例如 http://192.168.1.10:3333)。',
    test: '测试',
    testSuccess: 'ML API 可访问且正常。',
    testFailed: '无法访问 ML API。',
    sensitivity: '灵敏度',
    sensitivityLow: '低(减少误报)',
    sensitivityMedium: '中(平衡)',
    sensitivityHigh: '高(更早检测,更多误报)',
    sensitivityHint: '调整触发警告和故障的置信度阈值。',
    action: '检测到故障时的操作',
    actionNotify: '仅通知',
    actionPause: '暂停打印',
    actionPauseOff: '暂停并切断电源',
    pollInterval: '检查间隔(秒)',
    pollIntervalHint: '打印过程中每台打印机的检查频率。最小 5 秒,最大 120 秒。',
    externalUrlMissing: '未设置外部 URL。',
    externalUrlHint: 'ML API 通过 URL 获取摄像头快照。请在通用设置中设置外部 URL，以便 ML API 容器可以访问 Bambuddy。',
    perPrinterTitle: '监控的打印机',
    perPrinterHint: '选择检测服务要监视哪些打印机。',
    monitorAll: '监控所有已连接的打印机',
    statusTitle: '状态',
    serviceRunning: '服务运行中',
    thresholds: '低 / 高阈值',
    activePrinters: '活动打印',
    noActivePrints: '当前没有正在进行的打印。',
    historyTitle: '最近检测',
    noHistory: '暂无检测记录。',
  },
  makerworld: {
    title: 'MakerWorld',
    description: '粘贴 MakerWorld 模型链接，即可直接在 Bambuddy 中导入并打印 —— 无需切换到 Bambu Handy 应用。',
    pasteUrlHeader: '从 MakerWorld 导入',
    pasteUrlPlaceholder: 'https://makerworld.com/en/models/… 或粘贴任意 MakerWorld 链接',
    resolveButton: '解析',
    signInRequiredTitle: '下载需要登录 Bambu Cloud',
    signInRequiredBody: '您可以匿名浏览模型详情，但下载 3MF 文件需要 Bambu Cloud 账户。',
    openCloudSettings: '打开云设置',
    untitledModel: '无标题模型',
    byCreator: '作者: {{name}}',
    downloadsCount: '{{count}} 次下载',
    licensePrefix: '许可协议',
    alreadyImported: '已在资料库中',
    openOnMakerworld: '在 MakerWorld 中打开',
    alreadyInLibrary: '此模型已在您的资料库中 —— 可在文件管理器 → MakerWorld 中找到',
    importSuccess: '已导入 {{filename}} —— 已保存到文件管理器 → MakerWorld',
    platesHeader: '打印板 ({{count}})',
    plateDefaultName: '打印板 {{n}}',
    materialCount: '{{count}} 种耗材',
    amsRequired: '需要 AMS',
    slicedFor: '为 {{printer}} 切片',
    alsoCompatible: '还标记为兼容：{{printers}}',
    importToLibrary: '保存',
    sliceIn: '保存并在 {{slicer}} 中切片',
    disclaimer: 'MakerWorld 集成使用由社区记录的 API 接口。Bambuddy 与 MakerWorld 或 Bambu Lab 没有从属或认可关系。',
    lastImportSuccess: '已导入到您的资料库',
    lastImportAlreadyInLibrary: '已存在于您的资料库中',
    viewInLibrary: '在文件管理器中查看',
    openInBambuStudio: '在 Bambu Studio 中打开',
    openInOrcaSlicer: '在 OrcaSlicer 中打开',
    importTo: '导入到文件管理器',
    recentImportsHeader: '最近导入',
    phaseResolving: '解析中',
    phaseDownloading: '下载中',
    folderAuto: 'MakerWorld (默认)',
    importAll: '全部导入',
    importAllProgress: '正在导入 {{current}}/{{total}}',
    openGallery: '打开图片库',
    galleryPrev: '上一张',
    galleryNext: '下一张',
    deleteImport: '从资料库中移除',
    importDeleting: '正在移除…',
    importDeleted: '已从资料库中移除',
    confirmDelete: '从资料库中移除 {{filename}}？本地文件将被删除，但可以从 MakerWorld 重新导入。',
    errors: {
      resolveFailed: '无法解析该 MakerWorld 链接。',
      downloadFailed: '下载失败。请重试。',
      deleteFailed: '无法从资料库中移除文件。',
    },
  },
  gcodeViewer: {
    back: '返回',
    backToArchives: '返回打印归档',
    backToFiles: '返回文件管理器',
  },
  libraryTrash: {
    title: '回收站',
    headerButton: '回收站',
    headerTooltip: '查看已移至回收站的文件',
    backToFiles: '返回文件管理器',
    subtitleAdmin: '已删除的文件会在回收站保留 {{days}} 天，之后自动删除。此视图显示所有用户的回收站。',
    subtitleUser: '已删除的文件会在回收站保留 {{days}} 天，之后自动删除。',
    loading: '正在加载回收站…',
    loadError: '无法加载回收站。',
    empty: '回收站为空。',
    summary: '{{count}} 个文件 · {{size}}',
    emptyTrash: '清空回收站',
    restore: '还原',
    purgeNow: '立即删除',
    autoPurgeIn: '将于 {{when}} 自动删除',
    days: '天',
    retentionLabel: '自动删除时间',
    selectAll: '全选',
    selectOne: '选择 {{filename}}',
    selectionCount: '已选择 {{count}} 项',
    bulkRestore: '还原所选',
    bulkPurge: '删除所选',
    col: {
      filename: '文件',
      folder: '文件夹',
      size: '大小',
      deleted: '移入回收站',
      autoPurge: '自动删除',
      owner: '所有者',
      actions: '操作',
    },
    confirm: {
      purgeTitle: '永久删除？',
      purgeBody: '{{filename}} 将从磁盘中删除，无法恢复。',
      emptyTitle: '清空回收站？',
      emptyBody: '全部 {{count}} 个文件将从磁盘中删除。此操作无法撤消。',
      bulkPurgeTitle: '永久删除所选文件？',
      bulkPurgeBody: '所选的 {{count}} 个文件将从磁盘中删除，无法恢复。',
      cta: '永久删除',
    },
    toast: {
      restored: '文件已还原。',
      restoreFailed: '无法还原文件。',
      purged: '文件已永久删除。',
      purgeFailed: '无法删除文件。',
      emptied: '已从回收站删除 {{count}} 个文件。',
      emptyFailed: '无法清空回收站。',
      retentionSaved: '自动删除已设置为 {{days}} 天。',
      retentionFailed: '无法保存保留设置。',
      bulkRestored: '已还原 {{count}} 个文件。',
      bulkPurged: '已删除 {{count}} 个文件。',
    },
  },
  libraryPurge: {
    title: '清理旧文件',
    headerButton: '清理旧文件',
    headerTooltip: '批量将旧文件移至回收站',
    description: '早于所选阈值的文件将被移至回收站。外部文件夹会被跳过。在自动删除之前，您可以从回收站还原文件。',
    ageLabel: '移动早于以下天数的文件',
    days: '天',
    includeNeverPrinted: '包括从未打印过的文件',
    effectsTitle: '点击清除时会发生什么',
    effect1: '匹配的文件移至回收站 — 尚未从磁盘删除。',
    effect2: '在保留期到期之前，您可以随时从回收站恢复。',
    effect3: '保留期满后，回收站清理器将它们从磁盘永久删除。',
    effect4: '外部（链接）文件夹中的文件将被跳过 — Bambuddy 从不删除不属于自己的字节。',    previewLoading: '正在检查匹配的文件数量…',
    previewFailed: '无法预览清理结果。',
    previewSummary: '{{count}} 个文件 · {{size}} 将被移至回收站',
    andMore: '…还有 {{count}} 个',
    warning: '文件将被软删除——在保留期结束前，您可以从回收站还原它们。',
    confirmCta: '将 {{count}} 个移至回收站',
    purging: '正在移至回收站…',
    toast: {
      success: '已将 {{count}} 个文件移至回收站。',
      failed: '无法清理文件。',
    },
  },
  libraryAutoPurge: {
    enableLabel: '自动清理旧文件',
    enableDescription: '每天执行一次管理员清理。文件会先进入回收站——不会立即删除。',
    ageLabel: '自动清理早于以下天数的文件',
    ageDescription: '最少 7 天，最多 10 年。使用与手动「清理旧文件」按钮相同的时间规则。',
    days: '天',
    includeNeverPrinted: '包括从未打印过的文件',
    saveFailed: '无法保存自动清理设置。',
  },
  archivePurge: {
    headerButton: '清除旧条目',
    headerTooltip: '批量删除旧归档',
    title: '清除旧归档',
    description: '清除旧的打印历史。每个归档按其最近一次打印完成时间老化 — 重新打印归档会刷新其年龄，因此活跃工作永远不会被清除。',
    ageLabel: '删除最近未打印的归档：',
    days: '天',
    effectsTitle: '点击清除时会发生什么',
    effect1: '每个匹配的归档将从列表中隐藏，其磁盘文件（3MF、缩略图、延时摄影、源 3MF、F3D、照片）也将被删除。',
    effect2: '数据库中的归档记录将被保留，因此 Quick Stats 仍可计入耗材、时间、成本和能耗的贡献 — 与单条删除的默认行为一致。',
    effect3: '勾选下方"同时从统计中移除"可一并清除 Quick Stats 中的贡献（与单条删除选项等同）。该操作不可撤销。',
    effect4: '重新打印归档会刷新其使用计时器，因此仍在使用的归档不会被清除。',
    purgeStatsLabel: '同时从统计中移除',
    purgeStatsHint: '从 Quick Stats（耗材、时间、成本、能耗）中移除匹配的归档。不勾选时，Quick Stats 保留所有贡献，仅文件从磁盘删除。',
    previewLoading: '检查匹配的归档数量…',
    previewFailed: '无法预览清除。',
    previewSummary: '将移除 {{count}} 个归档 · {{size}}',
    andMore: '…还有 {{count}} 个',
    warning: '文件将从磁盘删除且无法恢复。继续前请下载或收藏您想保留的内容。',
    confirmCta: '移除 {{count}} 个归档',
    purging: '移除中…',
    toast: {
      success: '已移除 {{count}} 个归档。',
      failed: '无法清除归档。',
    },
  },
  archiveAutoPurge: {
    enableLabel: '自动清除旧归档',
    enableDescription: '每天一次，将阈值内未打印的归档从列表中隐藏，并从磁盘中删除其文件。重新打印会重置计时器。',
    ageLabel: '自动删除最近未打印的归档：',
    ageDescription: '最少 7 天，最多 10 年。基于最近一次打印完成 — 重新打印会刷新年龄。删除 3MF、缩略图、延时摄影、源 3MF、F3D 和照片。',
    days: '天',
    purgeStatsLabel: '同时从统计中移除',
    purgeStatsDescription: '启用后，每日清理任务还会将每个被清除的归档从 Quick Stats（耗材、时间、成本、能耗）中移除。默认关闭 — Quick Stats 保留贡献，仅文件从磁盘删除。',
    runNow: '立即清除归档',
    saveFailed: '无法保存自动清除设置。',
  },
  cameraTokens: {
    title: '摄像头 API 令牌',
    navTitle: '摄像头 API 令牌',
    description:
      '长期令牌，用于将摄像头流嵌入 Home Assistant、Frigate、信息亭或其他需要稳定 URL 的工具。每个令牌仅限摄像头流，可随时撤销。',
    loading: '加载中…',
    confirmRevoke: {
      title: '撤销此令牌？',
      body: '使用「{{name}}」的任何设备将立即失去访问权限。此操作无法撤销。',
      cancel: '取消',
      confirm: '撤销',
    },
    create: {
      title: '创建新令牌',
      nameLabel: '令牌名称',
      namePlaceholder: '例如 Home Assistant',
      daysLabel: '过期天数',
      submit: '创建',
      hint:
        '最大有效期 365 天。令牌值仅在创建时显示一次 — 请立即复制。',
    },
    created: {
      title: '令牌已创建 — 立即复制',
      warning:
        '这是此令牌唯一一次可见。关闭此对话框后您将无法再次查看。',
      copy: '复制',
      dismiss: '我已保存',
    },
    list: {
      myTitle: '我的令牌',
      allTitle: '所有用户（管理员视图）',
      empty: '暂无令牌。',
      name: '名称',
      owner: '所有者',
      prefix: '前缀',
      created: '创建时间',
      expires: '过期时间',
      lastUsed: '最近使用',
      revoke: '撤销',
      expired: '已过期',
    },
    toast: {
      created: '令牌已创建',
      createFailed: '创建令牌失败',
      revoked: '令牌已撤销',
      revokeFailed: '撤销令牌失败',
      loadFailed: '加载令牌失败',
      copied: '已复制到剪贴板',
      copyFailed: '复制失败 — 手动选择并复制',
    },
  },

  // Forecast & Inventory Intelligence
  forecast: {
    title: '库存预测',
    noSpools: '未找到活跃的料卷。请将料卷添加到库存中以查看预测数据。',
    noUsageData: '无可用使用数据 — 无法预测库存时间线。',
    sku: 'SKU',
    // Table headers
    material: '材料',
    stock: '库存',
    dailyRate: '消耗率',
    daysLeft: '剩余天数',
    emptyBy: '耗尽日期',
    reorderBy: '补货截止日',
    actions: '操作',
    // Rate tier badges
    trend: '趋势',
    estimated: '估算',
    noData: '无数据',
    // Timeframe
    timeframe: '时间范围',
    // Chart
    chartTitle: '库存预测 — 前5种材料',
    dashedLinesROP: '虚线 = 再订货点',
    stockLevel: '库存量',
    reorderPoint: '再订购点',
    safetyMargin: '安全余量',
    trendLegend: '趋势（基于历史，95%服务水平）',
    estimatedLegend: '估算（重量差值）',
    noDataLegend: '无数据',
    ropLabel: '再订货点',
    ssLabel: '安全库存',
    safetyStockLegend: '安全库存',
    stockArrivalLegend: '到货',
    stockoutLegend: '断货',
    // Alerts toolbar
    alertCount_one: '{{count}}条警告',
    alertCount_other: '{{count}}条警告',
    order: '订购',
    // Settings
    globalLeadTime: '全局交货期',
    globalLeadTimeHint: '全局交货期下限 — 用于所有 SKU 的再订购点计算',
    save: '保存',
    cancel: '取消',
    settingsSaved: '设置已保存',
    failedSaveSettings: '保存设置失败',
    globalLeadTimeSaved: '全局提前期已保存',
    skuLeadTimeOverride: 'SKU 交货期覆盖',
    skuLeadTimeHint: '0 = 使用全局交货期。设置 >0 以覆盖此 SKU。',
    safetyMarginLabel: '安全余量',
    effectiveLeadTime: '有效交货期',
    effectiveLeadTimeHint: 'max(全局 {{global}}天, SKU {{sku}}天)',
    reorderPointHint: 'd̄ × LT + safety margin — 当库存降至此水平时下单',
    safetyMarginHint: '统计安全库存 (z=1.65 × σ × √LT) + 用户自定义缓冲',
    safetyMarginHintDays: '在统计安全库存基础上额外增加的缓冲。{{approx}}',
    safetyMarginHintDaysApprox: ' ≈ 按当前速率 {{g}}g。',
    safetyMarginHintG: '在统计安全库存基础上增加的固定重量缓冲。{{approx}}',
    safetyMarginHintGApprox: ' ≈ 按当前速率 {{days}}天。',
    individualSpools: '单个料卷',
    labelWeight: '标注重量',
    spoolCount_one: '{{count}}个线轴',
    spoolCount_other: '{{count}}个线轴',
    // Alerts
    stockBreakRisk: '断货风险',
    stockBreakBefore: '补货前库存断档',
    stockBreakDetail: '剩余 {{days}} 天，交货期 {{lt}} 天。',
    reorderNow: '立即补货',
    reorderTriggerPassed: '触发日期 {{date}} 已过。',
    // Shopping list
    shoppingList: '购物清单',
    shoppingListItems_one: '（{{count}}项）',
    shoppingListItems_other: '（{{count}}项）',
    shoppingListEmpty: '购物清单为空。点击任意行的购物车图标以添加商品。',
    addToCart: '添加到购物清单',
    alertsSnoozed: '静音此SKU的提醒',
    alertsEnabled: '启用此SKU的提醒',
    addedToCart: '已添加到购物清单',
    failedAddItem: '添加项目失败',
    listView: '列表',
    logisticsView: '物流',
    qty: '数量',
    weight: '重量',
    leadTime: '交货期',
    expectedRestock: '预计补货日期',
    status: '状态',
    note: '备注',
    pending: '待处理',
    purchased: '已购买',
    received: '已收货',
    markPurchased: '标记为已购买',
    markReceived: '标记为已收货 — 将料卷添加到库存',
    resetToPending: '重置为待处理',
    remove: '移除',
    clearAll: '清空',
    downloadCsv: 'CSV',
    // Add to cart modal
    addToCartTitle: '添加到购物清单',
    byQuantity: '按数量',
    byDuration: '按时长',
    numberOfSpools: '线轴数量',
    lastHowManyDays: '需要持续多少天？',
    noUsageQty: '无使用数据 — 数量已设为1。',
    noteOptional: '备注（可选）',
    notePlaceholder: '例如：用于项目X，紧急…',
    addNSpools_one: '添加{{count}}个线轴',
    addNSpools_other: '添加{{count}}个线轴',
    // Cart logistics
    onArrival: '到货时',
    stockBreakIn: '{{days}} 天后断货。',
    stockRunsOutBefore: '库存在 {{lt}} 天交货期结束前耗尽。',
    atRate: '按 {{rate}}g/天的速度，您需要',
    moreSpools_one: '再{{count}}个线轴',
    moreSpools_other: '再{{count}}个线轴',
    bridgeGap: '来弥补缺口。',
    // Permissions
    noReadAccess: '您没有查看库存预测的权限。',
    noWriteAccess: '您没有修改预测设置的权限。',
  },
};
