// SPDX-License-Identifier: AGPL-3.0-only
// Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. See /studio/LICENSE.AGPL-3.0

import type { DeepPartialMessageTree } from "../types";
import type { en } from "./en";

export const zhCN = {
  picker: {
    onDevice: "本机",
    huggingFace: "Hugging Face",
    retry: "重试",
    loadMore: "加载更多",
    offlineTitle: "你当前处于离线状态",
    offlineBody: "切换到“设备”以使用缓存或本地{noun}。",
    offlineSwitchDevice: "设备",
    searchAriaLabel: "搜索{noun}",
    modelSourceAriaLabel: "模型来源",
    hubSectionAriaLabel: "Hub 分区",
    modelDropped: "已不再提供",
    modelDroppedByProvider: "{provider} · 已不再提供",
    modelDisabled: "未启用",
    modelDisabledByProvider: "{provider} · 未启用",
    multipleMatches: "找到多个匹配的{noun}。请从列表中选择一个。",
    rateLimitedTitle: "已达到 Hugging Face 速率限制",
    rateLimitedBody: "请稍候，然后重试搜索{noun}。",
    hfToken: {
      label: "HF token",
      saved: "已保存",
      add: "添加",
      savedAriaLabel: "Hugging Face token 已保存",
      addAriaLabel: "设置 Hugging Face token",
      savedHint: "Token 已保存。使用时会检查访问权限。",
      addHint: "设置 token 以访问私有和受限仓库。",
    },
  },
  common: {
    cancel: "取消",
    close: "关闭",
    delete: "删除",
    done: "完成",
    error: "错误",
    export: "导出",
    help: "帮助",
    loading: "加载中...",
    new: "新增",
    rename: "重命名",
    save: "保存",
    saving: "保存中...",
    search: "搜索",
    shutdown: "关闭服务",
  },
  shell: {
    beta: "BETA",
    brand: "unsloth",
    product: "Unsloth",
    accountMenu: "{name} 账号菜单",
    updateAvailable: "有可用更新",
    resize: {
      collapse: "点击折叠",
      expand: "点击展开",
      drag: "拖动调整大小",
    },
    aria: {
      home: "Unsloth 首页",
      closeSidebar: "关闭侧边栏",
      openSidebar: "打开侧边栏",
      resizeSidebar: "调整或折叠侧边栏",
      resizeRunSettings: "调整或关闭运行设置",
      openRunSettings: "打开运行设置",
      chatOptions: "聊天选项",
      runOptions: "训练选项",
    },
    navigation: {
      newChat: "新聊天",
      returnToChat: "返回聊天",
      returnToChats: "返回 {count} 个聊天",
      chatGenerating: "生成中",
      compare: "对比",
      search: "搜索",
      hub: "模型中心",
      projects: "项目",
      train: "训练",
      recipes: "配方",
      images: "图像",
      video: "视频",
      audio: "音频",
      trainChecking: "正在检查此设备是否支持训练...",
      videoChecking: "正在检查此设备是否支持视频生成...",
      more: "更多",
      customizeSidebar: "自定义侧边栏",
      newBadge: "新",
      export: "导出",
      recents: "最近",
      noChatsYet: "暂无对话",
      settings: "设置",
      api: "API",
      lightMode: "浅色模式",
      darkMode: "深色模式",
      guidedTour: "引导教程",
      help: "帮助",
      logOut: "退出登录",
      shutdown: "关闭服务",
    },
    notFound: {
      title: "页面未找到",
      description: "{path} 不存在。",
      backToChat: "返回聊天",
    },
    dialog: {
      deleteChat: {
        title: "删除聊天",
        description: "确定要删除聊天“{name}”吗？",
      },
      deleteRun: {
        title: "删除训练运行",
        description: "确定要删除运行“{name}”吗？",
      },
      renameChat: {
        title: "重命名聊天",
        placeholder: "聊天标题",
      },
      renameRun: {
        title: "重命名运行",
        placeholder: "运行名称",
      },
    },
    toast: {
      cannotDeleteRunningRun: "不能删除正在运行的训练",
      failedToDeleteChat: "删除聊天失败",
      failedToDeleteRun: "删除运行失败",
      failedToRenameChat: "重命名聊天失败",
      failedToRenameRun: "重命名运行失败",
    },
  },
  settings: {
    title: "设置",
    dialog: {
      title: "设置",
      description: "管理你的 Unsloth 偏好设置。",
      closeAriaLabel: "关闭设置",
      searchPlaceholder: "搜索设置…",
      searchNoResults: "未找到设置。",
    },
    tabs: {
      general: "通用",
      profile: "个人资料",
      appearance: "外观",
      resources: "系统",
      chat: "聊天",
      connections: "连接",
      apiKeys: "API",
      about: "关于",
      voice: "语音",
      data: "数据",
      agents: "智能体",
      debugging: "日志",
    },
    debugging: {
      logSection: "日志文件",
      source: "日志文件",
      sourceHint: "模型运行器会各自写入日志，因此加载或生成失败的原因通常记录在那里，而不是服务器日志中。",
      path: "位置",
      pathCopy: "复制路径",
      refreshSection: "刷新",
      mode: "模式",
      modeLive: "实时",
      modeInterval: "每 3 秒",
      modeManual: "手动",
      refreshNow: "立即刷新",
      privacyNote: "此视图中的凭据已被遮蔽。磁盘上的文件不会被遮蔽。",
      copyVisible: "复制可见日志",
      empty: "目前还没有任何日志。",
      disabled: "文件日志已关闭 (UNSLOTH_STUDIO_NO_FILE_LOG=1)。",
      missing: "未找到日志文件。",
      unreadable: "无法读取日志文件。",
      timeout: "日志请求超时。服务器可能无法访问。",
      droppedNotice: "已跳过部分行：日志的写入速度超过了读取速度。",
      morePending: "仍在读取更多行，它们将在下次刷新时显示。",
      staleSession: "文件日志已关闭，因此这是较早的会话，不会更新。",
      keywords: "调试 日志 错误 崩溃 堆栈 跟踪 诊断 排查 故障 debug log logs error",
    },
    voice: {
      title: "语音",
      description: "麦克风、语音输入、语音转文字和朗读",
      dictation: {
        sectionTitle: "语音输入",
        engineLabel: "语音输入引擎",
        engineBrowser: "浏览器",
        engineBrowserDescription:
          "使用浏览器的语音服务转写音频。若要使用 STT 模型，请选择“本地转写”。",
        engineModel: "本地转写",
        engineModelDescription:
          "在本地运行语音转文字（STT）模型，可离线使用。下载并加载后，闲置一段时间会自动卸载。",
        sttModelLabel: "语音识别模型",
        sttModelDescription: "选择或搜索要在本地运行的 STT 模型。",
        sttModelSearchPlaceholder: "搜索模型",
        sttModelSearching: "正在搜索 Hugging Face…",
        sttModelValidating: "正在检查 Whisper 兼容性…",
        sttModelNoResults: "未找到 Whisper 模型",
        sttModelInvalid: "该仓库无法用于语音输入",
        sttModelFailed: "无法加载 STT 模型",
        sttModelUnsupported: "此浏览器不支持录音",
        sttChecking: "正在检查…",
        sttOnDemand: "已下载",
        sttLoadingModel: "正在加载模型…",
        sttReady: "已加载到 {device}",
        sttLoaded: "已加载",
        sttUnavailable:
          "此服务器上未安装。请运行 `unsloth studio update` 以启用本地语音输入。",
        sttRetry: "重试",
        sttDownloadChecking: "正在检查下载状态…",
        sttNotDownloaded: "未下载",
        sttDownloadStatusFailed: "无法检查下载状态",
        sttDownload: "下载",
        sttDownloadConfirmTitle: "下载 {model}？",
        sttDownloadConfirmBody:
          "本地语音输入完全离线运行，但需要先有 {model} 语音模型。约 {size}，只需一次性下载到你的 Hugging Face 缓存。",
        sttDownloadConfirmBodyUnsized:
          "本地语音输入完全离线运行，但需要先有 {model} 语音模型。它只需一次性下载到你的 Hugging Face 缓存。",
        sttOpenVoiceSettings: "打开语音设置",
        sttDownloadStarted: "正在下载 {model}",
        sttDownloading: "正在下载… {progress}%",
        sttCancelDownload: "取消",
        sttCancellingDownload: "正在取消…",
        sttCancelDownloadFailed: "无法取消下载",
        sttDownloadComplete: "语音识别模型已下载",
        sttModelReady: "{model} 已可用于语音输入",
        sttRecommended: "推荐",
        sttDownloadFailed: "无法下载语音识别模型",
        sttLoad: "加载",
        sttUnload: "卸载",
        sttUnloading: "正在卸载…",
        microphoneLabel: "麦克风",
        microphoneFallbackName: "麦克风 {index}",
        microphoneDescription: "用于语音输入",
        microphoneFallbackHint:
          "用于语音输入。如果浏览器的语音引擎无法使用此设备，将回退到系统默认设备",
        microphoneGrantDescription: "允许访问麦克风后即可显示设备名称",
        allowMicrophone: "允许使用麦克风",
        micAccessBlocked:
          "麦克风访问已被阻止。请在浏览器中允许此 Unsloth 页面使用麦克风，然后重试。",
        micAccessUnsupported: "此浏览器或环境不支持访问麦克风。",
        systemDefault: "系统默认",
        savedMicDisconnected: "已保存的麦克风（未连接）",
        languageLabel: "语音输入语言",
        languageDescription: "要识别的语言",
        languageAuto: "自动（浏览器语言）",
      },
      dictionary: {
        sectionTitle: "语音输入词典",
        sectionDescription: "设置语音输入中特定词语的写法",
        manageLabel: "自定义写法",
        manage: "管理",
        backToVoice: "返回语音",
        addEntry: "添加词条",
        newEntryAria: "新词典词条",
        entryPlaceholder: "张三",
        entryAria: "词典词条 {index}",
        removeEntryAria: "删除词典词条 {index}",
      },
      recents: {
        sectionTitle: "语音输入历史",
        sectionDescription: "每次语音输入都会保存在这里，方便你找回文本",
        manageLabel: "语音输入历史",
        manage: "管理",
        pageDescription:
          "每次语音输入都会保存。你可以查看、复制或删除这些记录，也可以打开相应记录所关联的聊天。",
        searchPlaceholder: "搜索语音输入",
        sortLabel: "语音输入排序方式",
        sortNewest: "最新优先",
        sortOldest: "最早优先",
        sortAlpha: "按字母顺序",
        noMatches: "没有符合搜索条件的语音输入",
        detailTitle: "已保存的语音输入",
        backToVoice: "返回语音",
        backToRecents: "返回语音输入历史",
        view: "查看完整内容",
        empty: "暂无语音输入",
        dictationColumn: "语音输入",
        dateColumn: "创建日期",
        copy: "复制语音输入",
        copied: "已复制到剪贴板",
        copyFailed: "无法复制到剪贴板",
        delete: "删除语音输入",
        deleteTitle: "删除语音输入",
        deleteDescription: "要删除这条已保存的语音输入吗？此操作无法撤销。",
        deleteLinkedDescription:
          "要删除这条已保存的语音输入吗？你也可以一并删除与它关联的聊天。此操作无法撤销。",
        deleteWithChat: "删除聊天和语音输入",
        deleteWithChatFailed: "无法删除该聊天",
        clear: "清除历史",
        clearTitle: "清除语音输入历史",
        clearDescription: "要删除所有已保存的语音输入吗？此操作无法撤销。",
        clearConfirm: "全部清除",
        showMore: "显示更多（{count}）",
        openChat: "打开聊天",
      },
      readAloud: {
        sectionTitle: "朗读",
        buttonLabel: "朗读按钮",
        buttonDescription: "在助手回复上显示",
        engineLabel: "TTS 引擎",
        engineSystemDescription: "设备内置语音",
        engineStudioDescription: "使用已加载的音频模型（例如 Orpheus）",
        engineSystem: "系统语音",
        engineStudio: "加载 TTS 模型",
        modelLabel: "TTS 模型",
        modelDescription: "从模型选择器加载音频模型（例如 Orpheus TTS）",
        voiceLabel: "音色",
        voiceDescription: "此设备上效果最好的音色",
        speedLabel: "语速",
        pitchLabel: "音调",
        volumeLabel: "音量",
        previewLabel: "试听音色",
        previewDescription: "播放一段简短示例",
        previewAction: "试听",
        previewFailed: "TTS 试听失败",
        stopAction: "停止",
        ttsLabel: "文字转语音",
        notSupported: "此浏览器不支持",
      },
    },
    general: {
      title: "通用",
      description: "Unsloth 的全局偏好设置。",
      account: "账号",
      huggingFaceToken: "Hugging Face token",
      huggingFaceTokenDescription: "用于加载受限模型和推送产物。",
      hideToken: "隐藏 token",
      showToken: "显示 token",
      clearToken: "清除",
      checkingToken: "正在检查 token...",
      tokenValidated: "Token 已验证",
      password: "密码",
      passwordDescription: "更改此 Unsloth 账号的密码。",
      passwordDialog: {
        trigger: "更改密码",
        title: "更改密码",
        description: "输入当前密码并选择新密码（至少 {minLength} 个字符）。",
        setTrigger: "设置远程密码",
        setTitle: "设置远程密码",
        setDescription:
          "选择远程浏览器以 unsloth 身份登录时使用的密码（至少 {minLength} 个字符）。Unsloth 桌面应用仍会自动登录。",
        setSubmit: "设置密码",
        setting: "正在设置...",
        setDone: "密码已设置。",
        currentPassword: "当前密码",
        newPassword: "新密码",
        confirmPassword: "确认新密码",
        currentTooShort: "当前密码至少需要 {minLength} 个字符。",
        newTooShort: "新密码至少需要 {minLength} 个字符。",
        mismatch: "两次输入的密码不一致。",
        samePassword: "新密码必须与当前密码不同。",
        update: "更新密码",
        updating: "正在更新...",
        updated: "密码已更新。",
        updateFailed: "密码更新失败。",
        newHasSpaces: "新密码不能包含空格。",
      },
      chatDefaults: "聊天默认设置",
      autoTitleNewChats: "自动为新聊天命名",
      autoTitleNewChatsDescription: "根据第一条消息生成简短标题。",
      helperLlm: {
        sectionTitle: "辅助 LLM",
        preloadOnStartup: "启动时预缓存辅助 LLM",
        preloadOnStartupDescription:
          "启动时在后台下载 AI Assist 辅助模型。默认关闭；AI Assist 仍可按需获取。",
        disabledByEnv:
          "已由后端环境中的 UNSLOTH_HELPER_MODEL_DISABLE 禁用。",
        loadError: "加载辅助 LLM 设置失败。",
        saveError: "保存辅助 LLM 设置失败。",
      },
      modelAutoSwitch: {
        sectionTitle: "模型自动切换（OpenAI API）",
        enable: "按请求切换模型",
        enableDescription:
          "在提供服务前，加载 API 请求中指定的已下载 GGUF。默认关闭。",
        idleUnload: "空闲自动卸载",
        idleUnloadDescription:
          "空闲达到该秒数后释放 VRAM。设为 0 则保持加载，最小值为 60 秒。",
        idleSecondsAriaLabel: "空闲自动卸载秒数",
        mediaIdleUnload: "图像和视频的空闲自动卸载",
        mediaIdleUnloadDescription:
          "空闲达到该秒数后卸载图像和视频模型以释放 VRAM。这是独立的设置：上面那项仅适用于聊天模型。设为 0 则保持加载，最小值为 60 秒。",
        mediaIdleSecondsAriaLabel: "图像和视频空闲自动卸载秒数",
        mediaIdlePaused:
          "当“将模型保留在显存中”或“仅卸载由 API 加载的模型”开启时暂停。",
        idleNeedsEnable: "请先开启“按请求切换模型”。",
        idleActiveViaEnv: "已通过 UNSLOTH_MODEL_IDLE_TTL 启用。",
        loadError: "加载模型自动切换设置失败。",
        saveError: "保存模型自动切换设置失败。",
        idleError: "输入 0 保持模型加载，或输入至少 60 秒。",
        autoDownload: "下载缺失的模型",
        autoDownloadDescription:
          "获取 API 请求中指定但尚未下载的 GGUF。开启后，任何持有 API 密钥的人都可以占用你的磁盘空间和带宽。",
        keepKv: "空闲卸载后保留聊天上下文",
        keepKvDescription:
          "在空闲卸载前保存 KV 缓存，让恢复的聊天无需重新读取历史。最多占用 10 GB 磁盘空间。",
        apiOnly: "仅卸载由 API 加载的模型",
        apiOnlyDescription:
          "空闲卸载会将你在 Studio 中加载的模型保留在内存中，只释放由 API 请求加载的模型。",
      },
      previewSharing: {
        sectionTitle: "预览分享",
        enableLabel: "公开预览链接",
        enableDescription:
          "让任何持有签名链接的人无需登录即可与完成的模型聊天。关闭后将下线公开预览界面；已分享的链接将失效。",
        loadError: "加载预览分享设置失败。",
        saveError: "保存预览分享设置失败。",
        revokeLabel: "撤销所有预览链接",
        revokeDescription:
          "轮换签名密钥，使你分享过的所有链接失效。新复制的链接仍可用。",
        revokeAction: "撤销链接",
        revoking: "撤销中...",
        revokeConfirmTitle: "撤销所有预览链接？",
        revokeConfirmDescription:
          "你分享过的每个预览链接都将立即失效。此操作无法撤销。",
        revokeConfirmAction: "撤销所有链接",
        revoked: "所有预览链接已撤销",
        revokeError: "无法撤销预览链接",
      },
      notifications: {
        sectionTitle: "通知",
        showLlamaUpdates: "llama.cpp 更新通知",
        showLlamaUpdatesDescription:
          "当有可用于运行新模型的新版 llama.cpp 构建时通知你。如果只进行训练，可以关闭此项。",
        showLoadedModels: "已加载模型指示器",
        showLoadedModelsDescription:
          "在右下角显示一张小卡片，列出当前位于内存中的所有模型（聊天、语音、图像、视频），并为每个模型提供卸载按钮。",
      },
      startup: {
        sectionTitle: "启动",
        launchAtLogin: "登录时运行 Unsloth",
        launchAtLoginDescription:
          "登录系统时在后台启动 Unsloth。在你打开它之前，它会一直驻留在菜单栏或系统托盘中。",

        closeToTray: "关闭到系统托盘",
        closeToTrayDescription:
          "关闭主窗口时，让 Unsloth 及其服务器继续在后台运行。",
        closeToTraySaveError: "无法更新关闭到系统托盘设置。",
        loadError: "无法加载登录时启动设置。",
        saveError: "无法更新登录时启动设置。",
      },
      uploads: {
        sectionTitle: "上传",
        maxUploadSize: "训练数据集上传上限",
        maxUploadSizeDescription:
          "默认值为 {defaultSize} MB。",
      },
      rag: {
        sectionTitle: "文档与 RAG",
        embeddingModel: "Embedding 模型",
        embeddingModelDescription:
          "用于为文档建立索引和搜索的 Hugging Face 模型或本地路径。默认值为 {defaultModel}。",
        reindexWarning:
          "仅影响新建立索引的文档。更改模型后请重新上传已有文档。",
        emptyError: "请输入 Hugging Face 模型 ID 或本地路径。",
        loadError: "加载 embedding 模型设置失败。",
        saveError: "保存 embedding 模型失败。",
        saved: "Embedding 模型已保存。",
        saveAnyway: "仍然保存",
        resetAction: "重置为默认值",
      },
      storage: {
        sectionTitle: "存储",
        modelsFolder: "模型文件夹",
        modelsFolderDescription: "已下载模型的存储位置。",
        openAction: "打开",
        copyAction: "复制路径",
        copied: "路径已复制",
        openError: "无法打开文件夹",
        copyError: "无法复制路径",
      },
      resetPreferences: {
        sectionTitle: "危险区域",
        label: "重置所有本地偏好设置",
        description:
          "清除仅保存在本地的偏好设置。聊天、API 访问权限和数据库中的设置不会受到影响。",
        action: "重置偏好设置",
        confirmTitle: "重置所有本地偏好设置？",
        confirmDescription:
          "这会清除仅保存在本地的偏好设置，然后重新加载 Unsloth。聊天、API 访问权限和数据库中的设置不会受到影响。",
        confirmAction: "重置并重新加载",
      },
      permissions: {
        sectionTitle: "权限",
        bypassLabel: "工具权限",
        bypassDescription:
          "设置 Unsloth 执行聊天中的工具调用（终端、python、网页、MCP）前的审批方式。“Full access”会关闭审批和代码沙箱。",
      },
    },
    profile: {
      title: "个人资料",
      description: "你的个人资料在 Unsloth 中的显示方式。",
      changePicture: "更换头像",
      displayName: "显示名称",
      nickname: "Unsloth 应该怎么称呼你？",
      nicknamePlaceholder: "昵称",
      nicknameSaved: "称呼已保存",
      avatarShape: "头像形状",
      avatarShapeCircle: "圆形",
      avatarShapeRounded: "圆角矩形",
      greetingSloth: "问候语中显示树懒",
      greetingSlothDescription: "在对话问候语中显示树懒。",
      chooseSloth: "或选择一只树懒作为头像",
      noPicture: "无头像",
      noneLabel: "无",
      nameSaved: "个人资料名称已保存",
      namePersistErrorTitle: "无法持久保存个人资料名称",
      namePersistErrorDescription:
        "名称已在本次会话中更新，但重新加载后可能不会保留。",
      photoUpdated: "头像已更新",
      photoPersistErrorTitle: "无法持久保存头像",
      photoPersistErrorDescription:
        "头像已在本次会话中更新，但重新加载后可能不会保留。",
      photoUpdateErrorTitle: "无法更新头像",
      imageUseError: "无法使用这张图片。",
      uploadPhoto: "上传照片",
      removePhoto: "移除",
      pictureOptions: "头像选项",
      stats: {
        title: "你的统计",
        subtitle:
          "下面的内容全部根据你自己的历史记录统计。不会收集任何数据，也不会发送给 Unsloth。",
        retry: "重试",
        privacyNote:
          "统计数据由你本地 Unsloth 保存的聊天和训练历史计算得出。不收集任何数据，也不会发送给 Unsloth 或任何第三方。",
        emptyChats: "暂无聊天。开始一段对话后，这里就会显示你的统计数据。",
        lifetimeTokens: "累计 token",
        peakTokens: "单日峰值",
        longestChat: "最长的聊天",
        currentStreak: "当前连续天数",
        longestStreak: "最长连续天数",
        activityTitle: "Token 活跃度",
        activityDescription: "过去{weeks}共{total}",
        mode: {
          daily: "按天",
          weekly: "按周",
          cumulative: "累计",
        },
        cellTooltip: "{date} · {tokens}，{messages}",
        weekTooltip: "{date} 当周 · {tokens}",
        less: "较少",
        more: "较多",
        insightsTitle: "活跃度分析",
        totalChats: "聊天总数",
        totalMessages: "消息总数",
        tokensIn: "发送的 token",
        tokensOut: "生成的 token",
        cachedTokens: "缓存的 token",
        cachedValue: "{tokens}（占输入的 {percent}%）",
        avgTokensPerChat: "每个聊天的平均 token",
        timeInChat: "聊天时长",
        activeDays: "活跃天数",
        toolCalls: "工具调用",
        attachments: "附件数",
        avgSpeed: "平均速度",
        bestSpeed: "最快响应",
        firstToken: "首个 token 的平均耗时",
        tokensPerSecond: "{value} tok/s",
        topModelsTitle: "最常用的模型",
        topModelsDescription: "按收发的 token 数排序",
        modelSummary: "{tokens} · {messages}",
        noModels: "尚未记录任何模型使用情况。",
        trainingTitle: "训练",
        trainingDescription: "此工作区的微调运行记录",
        trainingRuns: "运行次数",
        trainingCompleted: "已完成",
        trainingSteps: "步数",
        trainingTokens: "训练的 token",
        trainingTime: "训练时长",
        bestLoss: "最佳 loss",
        runSteps: "{steps}",
        runLoss: "loss {loss}",
      },
    },
    appearance: {
      title: "外观",
      description: "调整 Unsloth 在此设备上的显示方式。",
      language: {
        title: "语言",
        label: "显示语言",
        description: "选择 Unsloth 使用的语言。",
        autoDetect: "自动检测",
      },
      theme: {
        title: "主题",
        label: "颜色主题",
        description: "选择浅色、深色，或跟随系统。",
        system: "跟随系统",
        light: "浅色",
        dark: "深色",
      },
      palette: {
        label: "调色板",
        description: "Unsloth 全局使用的配色，支持浅色和深色模式。",
        standard: "标准",
        classic: "经典",
        minimal: "极简",
      },
      custom: {
        reset: "重置",
        resetAll: "重置自定义",
        preferencesTitle: "偏好设置",
        colors: {
          lightGroup: "浅色主题",
          darkGroup: "深色主题",
          accent: "强调色",
          background: "背景",
          foreground: "前景",
        },
        fontDefault: "默认",
        fontBundledGroup: "内置",
        fontImportedGroup: "已导入",
        fontDeviceGroup: "此设备",
        fontFolderGroup: "来自文件夹",
        fontDeviceLoading: "正在查找设备字体…",
        fontSearch: "搜索字体…",
        fontNoResults: "未找到字体。",
        colorPicker: {
          hue: "色相",
          hex: "十六进制颜色",
          eyedropper: "从屏幕取色",
        },
        uiFont: {
          label: "界面字体",
        },
        headingFont: {
          label: "标题字体",
        },
        chatFont: {
          label: "聊天字体",
        },
        codeFont: {
          label: "代码字体",
        },
        importFont: {
          upload: "上传",
          scanFolder: "选择文件夹",
          alreadyAvailable: "该字体已可用，将使用现有字体。",
          folderNoFonts: "在该文件夹中未找到字体文件。",
          remove: "移除",
          errorInvalidType:
            "不支持的文件类型。请使用 .woff2、.woff、.ttf 或 .otf。",
          errorTooLarge: "字体文件过大（最大 1.5 MB）。",
          errorLimit: "最多可导入 3 个字体。",
          errorStorageFull: "本地存储空间不足。请先删除一个已导入的字体。",
          errorFailed: "无法加载此字体文件。",
        },
        uiFontSize: {
          label: "界面字号",
          description: "调整 Unsloth 界面的基准字号。",
        },
        codeFontSize: {
          label: "代码字号",
          description: "调整代码的基准字号。",
        },
        fontSmoothing: {
          label: "字体平滑",
          description: "使用平滑的字体抗锯齿。",
        },
        contrast: {
          label: "对比度",
          description: "边框和次要文本的强度。",
        },
        reduceMotion: {
          label: "减少动态效果",
          description: "减少动画，或跟随系统设置。",
          system: "跟随系统",
          on: "开",
          off: "关",
        },
        pointerCursors: {
          label: "使用指针光标",
          description: "悬停在可交互元素上时将光标变为指针。",
        },
      },
      layout: {
        title: "布局",
        compactSidebar: "默认固定侧边栏",
        compactSidebarDescription: "保持侧边栏展开，而不是折叠为图标。",
      },
      sidebarNav: {
        title: "侧边栏导航",
        description:
          "固定并重新排序侧边栏标签。取消固定的标签会收进“更多”菜单；若只有一个取消固定，则直接隐藏，而不是为它单独建一个菜单。新聊天保持固定。",
        dragToReorder: "拖动以重新排序",
        pinToSidebar: "将{name}固定到侧边栏",
        moreHolds: "更多（{count}）",
      },
      sidebarMenu: {
        title: "个人菜单",
        description:
          "选择点击侧边栏底部你的名字时显示哪些快捷项及其顺序。设置、帮助、退出登录和关闭始终显示。",
        darkModeToggle: "深色模式切换",
        dragToReorder: "拖动以重新排序",
      },
    },
    resources: {
      title: "系统",
      description: "监控此 Unsloth 服务器的硬件和存储。",
      liveUpdates: "实时更新",
      floatingWindow: "悬浮窗口",
      disableOverlay: "禁用悬浮层",
      liveMonitor: {
        title: "实时监控",
        apiTitle: "API 监控",
        summary: "实时请求、错误和 token 用量",
        status: "{active} 个进行中 · {recent} 个近期请求 · {model}",
        noModelLoaded: "未加载模型",
        autoOpen: "自动显示浮动监视器",
        autoOpenDescription: "收到 API 流量时打开一个小面板。",
        cpu: "CPU",
        ram: "RAM",
        disk: "磁盘",
        vram: "VRAM",
        cpuCores: "{logical} 逻辑核心 / {physical} 物理核心",
        currentLoad: "当前负载",
        free: "{value} 可用",
        noGpu: "无可见 GPU",
      },
      gpu: {
        title: "GPU 设备",
        ggufInference: "GGUF 推理",
        unavailable: "不可用",
        noGpu: "未检测到可见 GPU。上方仅显示 CPU 资源。",
        unknownDevice: "未知 GPU",
        deviceWithIndex: "GPU {index}",
        vramUtilization: "VRAM",
        used: "已用 {value}",
        free: "{value} 可用",
        total: "共 {value}",
      },
      llamaBackend: {
        title: "GGUF 推理引擎",
        label: "计算后端",
        description: "llama.cpp 运行 GGUF 模型所用的后端。",
        runningOn: "llama.cpp 当前运行在 {backend} 上。",
        hint: "安装该后端的 llama.cpp 构建，并在更新后继续沿用。当自动选择崩溃或显卡驱动不支持时很有用。只列出本机有对应构建的后端；训练不受影响。",
        autoWith: "自动（{backend}）",
        apply: "应用",
        applying: "正在安装…",
        applyHint: "下载新的构建并重启 llama.cpp。已加载的模型会被卸载。",
        applyHintWithSize: "下载 {size} 并重启 llama.cpp。已加载的模型会被卸载。",
        switchedTo: "llama.cpp 现在运行在 {backend} 上。",
        switchFailed: "无法更改 llama.cpp 后端。",
        switchInterrupted: "切换在完成前中断。",
        envLocked: "已由环境变量 UNSLOTH_LLAMA_CPP_BACKEND 固定为 {backend}，其优先级高于此设置。",
        backends: {
          auto: "自动",
          cpu: "CPU",
          cuda: "CUDA",
          rocm: "ROCm",
          vulkan: "Vulkan",
          metal: "Metal",
        },
        unsupported: {
          notInstalled: "未找到受管理的 llama.cpp 安装，因此没有可切换的后端。",
          localLink: "llama.cpp 是你自己链接的本地目录，Unsloth 不会替换它。",
          sourceBuild: "此 llama.cpp 由源码编译，无法在这里切换后端。",
          unresolved: "无法检查可用的后端。请检查网络连接后重试。",
        },
        // 不显示：用于设置搜索的额外词条。
        llamaBackendKeywords:
          "llama.cpp backend gguf 推理 cuda rocm hip vulkan metal cpu gpu 加速器 prebuilt 切换 引擎",
      },
      modelMemory: {
        title: "模型内存",
        keepResident: "将模型保留在显存中",
        keepResidentDescription: "在两次提问之间保持驻留显存。",
        keepResidentHint: "模型保持加载期间，不把权重交还给系统内存。关闭空闲自动卸载；当权重确实位于主机内存中时（统一内存，或部分卸载到 GPU），还会传入 --mlock，使操作系统无法将其换出、并在你下次提问时重新上传。",
        noRamReserve: "不为模型预留系统内存",
        noRamReserveDescription: "不在内存中保留完整副本。",
        noRamReserveHint: "将权重传输到显存，而不在内存中保留完整副本。保持 llama.cpp 的内存映射加载方式，并移除 --no-mmap 和 --mlock。",
        mlockVetoed: "--mlock 保持关闭：锁定模型会为其全部内容预留内存。空闲自动卸载仍处于禁用状态。",
        memlockCapped: "本系统将锁定内存限制为 {limit}。更大的模型无法被完全锁定；请使用 ulimit -l 提高上限。",
        reloadRequired: "重新加载模型以应用新的内存选项。",
        loadError: "加载模型内存设置失败",
        saveError: "保存模型内存设置失败",
        // Not rendered: extra terms the settings search matches these rows on.
        modelMemoryKeywords:
          "mlock memlock ulimit vram gpu 内存 显存 常驻 固定 锁定 保持 已加载 卸载 空闲 mmap no-mmap load-mode 交换 分页",
      },
      storage: {
        title: "存储",
        systemDisk: "系统磁盘",
        diskUsage: "已用 {used} / {total}",
        diskFree: "{free} 可用",
        modelsFolder: "模型文件夹",
        modelsFolderKeywords:
          "模型 文件夹 目录 路径 位置 下载 缓存 存储 磁盘 驱动器 移动 更改 models folder path hugging face",
        modelsFolderDescription: "下载的模型的存放位置。",
        modelsFolderHint: "下载的模型的存放位置。可更改以避免占用系统盘。仅对新的下载生效。已有的模型仍保留在原位置。",
        openAction: "打开",
        copyAction: "复制路径",
        copied: "路径已复制",
        openError: "无法打开文件夹",
        copyError: "无法复制路径",
        futureDownloads: "仅对新下载生效",
        environmentManaged: "由环境变量 {variable} 管理。",
        locationFree: "{free} 可用",
        changeAction: "更改",
        resetAction: "使用默认值",
        chooseTitle: "选择模型下载位置",
        chooseAction: "用于后续下载",
        cacheSaved: "模型下载位置已更新",
        cacheSaveError: "无法更新模型下载位置",
        cachePickerError: "无法打开文件夹选择器",
      },
      environment: {
        title: "环境",
        backend: "后端",
        python: "Python",
        torch: "Torch",
        transformers: "Transformers",
        uptime: "运行时长",
        processMemory: "进程内存",
        notInstalled: "未安装",
        unknown: "未知",
      },
    },
    agents: {
      title: "智能体",
      description:
        "使用 unsloth start 将 Claude Code、Codex 等编程智能体连接到本地模型。",
      intro:
        "可将 Claude Code、Codex、Hermes、OpenClaw、OpenCode 等智能体连接到由 Unsloth 在本地提供服务的模型，全程离线。它会启动一个兼容 OpenAI 的服务器，并且从不改动智能体的配置文件。",
      readDocs: "查看文档",
      copy: "复制",
      copied: "已复制",
      commandBuilder: "命令生成器",
      agent: "编程智能体",
      model: "模型",
      searchModels: "搜索 GGUF 模型...",
      noModels: "没有匹配的 GGUF 模型。",
      showingModels: "已显示 {total} 个匹配项中的 {shown} 个。继续输入可缩小范围。",
      quantization: "量化",
      loadingQuantizations: "正在加载量化版本...",
      noQuantizations: "无单独的量化版本",
      recommended: "推荐",
      downloaded: "已下载",
      quantizationLoadError:
        "无法加载全部量化版本。命令将使用可用的模型值。",
      generatedCommand: "生成的命令",
      docs: "文档",
      agentDocs: "打开 {agent} 的配置文档",
      copyGeneratedCommand: "复制生成的命令",
      modelNote:
        "Codex 需要通过 llama-server 提供服务的 GGUF 模型。其他智能体也可以使用基于 transformers 的模型；去掉 --model 即可使用 Unsloth 中已加载的模型。",
      subagent: {
        title: "将本地模型用作子智能体",
        description:
          "让 {agent} 保持当前模型，并把选定的任务委派给这个本地 Unsloth 模型。",
        setupCommand: "配置命令",
        copySetupCommand: "复制子智能体配置命令",
        usagePrompt: "然后在 {agent} 中输入：",
        copyUsagePrompt: "复制子智能体调用提示词",
        defaultPrompt: "启动一个本地智能体来实现这个函数。",
        opencodePrompt: "@unsloth 找出这个测试失败的原因",
      },
      quickstart: {
        title: "生成命令",
        description:
          "使用 Studio 中当前加载的模型启动智能体。请先加载模型，然后把 claude 换成下面任意一个受支持的智能体。",
        noneDetected: "未在你的 PATH 中找到受支持的智能体命令行工具。",
        installed: "已安装",
      },
      supportedAgents: {
        title: "受支持的智能体",
        description: "每个智能体都用各自的命令启动：",
        requiresGguf: "需要 GGUF 模型",
      },
      models: {
        title: "选择模型",
        description:
          "用 --model 指定模型和量化版本，用 --context-length 设置上下文窗口。可使用量化后缀，或显式的 --gguf-variant 参数。",
        suffixLabel: "使用量化后缀",
        variantLabel: "使用显式的变体参数",
      },
      options: {
        title: "常用选项",
        description:
          "Unsloth 的参数会先被解析；无法识别的参数会原样传给智能体。",
        model:
          "选择模型。不带 --model 时，unsloth start 会使用 Studio 中当前加载的模型；若没有已加载的模型则报错。",
        contextLength: "设置请求的上下文长度（别名：--max-seq-length）。",
        ggufVariant: "选择 GGUF 量化变体。",
        loadIn4bit: "开启或关闭 Hugging Face 模型的 4 位加载。",
        tensorParallel: "开启或关闭多 GPU 张量并行。",
        serve: "启用或禁用自动启动的本地服务器。",
        launch: "启动智能体，或仅打印命令和环境变量。",
        persist: "在多次运行之间保留由 Unsloth 管理的智能体存储。",
        asSubagent:
          "让父智能体保持当前模型，并将 Unsloth 注册为本地子智能体（Claude Code、Codex 和 OpenCode）。",
        apiKey: "提供你的 Unsloth API 密钥（或设置 UNSLOTH_API_KEY）。",
        yolo: "跳过确认提示。请仅在可信环境中使用。",
      },
      remote: {
        title: "连接到远程 Studio",
        description:
          "在启动前设置以下内容，即可让 unsloth start 指向运行在别处的 Studio（也可以直接传入 --api-key）：",
      },
      passthrough: {
        title: "向智能体传递参数",
        description:
          "Unsloth 参数之后的参数会转发给智能体本身，因此 resume 之类的原生命令仍然可用：",
      },
      dryRun: {
        title: "仅预览，不启动",
        description:
          "加上 --no-launch 会打印环境变量和命令，而不启动智能体。如果设置了 --model，模型仍可能被解析并加载。",
      },
    },
    chat: {
      title: "聊天",
      description: "自定义此设备上的聊天行为。",
      modelSelection: {
        title: "模型选择设置",
        expandQuantizations: "展开量化版本",
        expandQuantizationsDescription:
          "开启：“On Device”中的 GGUF 模型会直接显示其量化版本。关闭：点击模型即可查看其量化版本。",
        showAllQuantizations: "显示所有量化版本",
        showAllQuantizationsDescription:
          "开启：列出“On Device”中的所有量化版本，包括尚未下载的版本。关闭：仅显示已下载的量化版本。",
      },
      menu: {
        title: "聊天菜单",
        description:
          "将条目固定到聊天中的“+”侧边菜单，其他条目会移到“更多”中。",
        chatWithFiles: "与文件聊天（RAG）",
        mcp: "MCP",
        savedPrompts: "已保存的提示词",
        compareChat: "对比聊天",
        exportChat: "导出聊天",
      },
      showResponseModel: "显示回复模型",
      showResponseModelDescription: "在助手回复中显示模型元数据。",
      modelDisclaimer: "显示模型免责声明",
      modelDisclaimerDescription:
        "在聊天框下方显示“LLM 可能会出错”。",
      thinking: {
        collapseByDefault: "默认折叠思考过程",
        collapseByDefaultDescription:
          "模型思考时保持折叠，而不是自动展开。需要阅读时展开对应区块。",
      },
      artifacts: {
        title: "Canvas",
        collapseHtmlBlocks: "折叠 HTML 块",
        collapseHtmlBlocksDescription:
          "Canvas 模式会自动折叠完整 HTML。开启此项可在关闭 Canvas 时也折叠代码块中的 HTML 文档。",
        allowNetworkAccess: "允许 Canvas 访问网络",
        allowNetworkAccessDescription:
          "允许 Canvas 预览从 CDN 加载脚本、样式、字体、媒体和网络资源。若需完全离线预览请保持关闭。",
        blockedBanner: "已阻止来自 {hosts} 的 {count} 个外部资源。",
        blockedBannerPlural: "已阻止来自 {hosts} 的 {count} 个外部资源。",
        blockedBannerAction: "允许此 Canvas",
      },
      data: "数据",
      exportHistory: "导出聊天记录",
      exportHistoryDescription: "将所有聊天和消息下载为 JSON 文件。",
      exportAction: "导出",
      exportingAction: "导出中...",
      exportConversations: "导出最近对话与项目",
      exportConversationsDescription:
        "将最近对话（或加上项目内对话）导出为 Raw JSONL、CSV 或 ShareGPT JSONL，可合并为单个文件或每个对话一个文件。",
      exportConversationsAction: "导出",
      exportScopeRecents: "最近对话",
      exportScopeAll: "最近对话 + 项目",
      exportCombinedSuffix: "（合并）",
      exportPerChatSuffix: "（每个对话）",
      importChats: "导入对话",
      importChatsDescription:
        "将 Open WebUI、JSONL、NDJSON 或 CSV 导出文件导入到最近对话。",
      importChatsAction: "导入",
      importNoConversations: "文件中未找到对话。",
      importedOneChat: "已导入 1 个对话到最近对话。",
      importedChatCount: "已导入 {count} 个对话到最近对话。",
      importingChats: "正在导入对话：已完成 {count} 个（{percent}%）...",
      importedChatCountPartial: "已将 {count} 个对话导入到最近对话；{failed} 个未能保存。",
      importFailed: "导入失败。",
      clearHistory: "清除聊天记录",
      clearHistoryDescription: "从此设备删除本地聊天记录。",
      clearAction: "清除",
      clearAllChats: "清除所有聊天",
      clearAllChatsDescription: "永久删除此设备上的每个聊天。",
      noChatsToClear: "没有可清除的聊天。",
      clearOneChatDescription: "永久删除此设备上的唯一一个聊天。",
      clearChatCountDescription: "永久删除此设备上的 {count} 个聊天。",
      clearChatsAction: "清除聊天",
      clearOneChatTitle: "清除 1 个聊天？",
      clearChatsTitle: "清除 {count} 个聊天？",
      clearChatsConfirmDescription:
        "这会永久删除此设备上保存的每个聊天和消息。此操作无法撤销。",
      clearingAction: "清除中...",
      clearOneChatAction: "清除 1 个聊天",
      clearChatCountAction: "清除 {count} 个聊天",
      clearedAllChats: "已清除所有聊天",
      clearedOneChat: "已清除 1 个聊天",
      clearedChatCount: "已清除 {count} 个聊天",
      someChatsCouldNotBeCleared: "部分聊天无法清除",
      chatsClearedRemainOne:
        "已清除 {clearedCount} 个聊天；仍有 1 个聊天保留。请重试。",
      chatsClearedRemain:
        "已清除 {clearedCount} 个聊天；仍有 {remainingCount} 个聊天保留。请重试。",
      oneChatClearedRemain:
        "已清除 1 个聊天；仍有 {remainingCount} 个聊天保留。请重试。",
      oneChatClearedRemainOne: "已清除 1 个聊天；仍有 1 个聊天保留。请重试。",
      storageClearFailedOne:
        "某个存储位置清除失败；可能仍有 1 个聊天保留。请重试。",
      storageClearFailed:
        "某个存储位置清除失败；可能仍有 {count} 个聊天保留。请重试。",
      failedToClearChats: "清除聊天失败",
    },
    data: {
      title: "数据",
      backToData: "返回数据",
      exportFailed: "无法导出聊天",
      description: "管理此设备上保存的聊天记录和上传的文件。",
      archivedChats: "已归档的聊天",
      archivedChatsDescription: "查看和管理你归档的聊天。",
      archivedImages: "已归档的图片",
      archivedImagesDescription: "查看和管理你归档的图片。",
      archivedVideos: "已归档的视频",
      archivedVideosDescription: "查看和管理你归档的视频。",
      manageAction: "管理",
      exportArchivedChats: "导出",
      exportingArchivedChats: "正在导出...",
      exportedOneArchivedChat: "已导出 1 个归档聊天",
      exportedArchivedChatCount: "已导出 {count} 个归档聊天",
      noArchivedChatsToExport: "没有可导出的归档聊天。",
      failedToExportArchivedChats: "导出归档聊天失败",
      archiveAllChats: "归档所有聊天",
      archiveAllChatsDescription: "将最近对话和项目中的所有聊天移入归档。",
      noChatsToArchive: "没有可归档的聊天。",
      archiveAllAction: "全部归档",
      archivingAction: "正在归档...",
      archiveAllChatsTitle: "归档所有聊天？",
      archiveAllChatsConfirmDescription:
        "将此设备上的所有聊天移入归档。归档后的聊天仍然可用，随时可以取消归档。",
      archivedAllChats: "已归档所有聊天",
      archivedOneChat: "已归档 1 个聊天",
      archivedChatCount: "已归档 {count} 个聊天",
      failedToArchiveChats: "归档聊天失败",
      confirmBeforeDeleting: "删除前确认",
      confirmBeforeDeletingDescription:
        "删除聊天前先询问确认。关闭后将立即删除。",
      filesSection: "文件",
      uploadedFiles: "上传的文件",
      uploadedFilesDescription: "查看和管理上传到聊天、项目和知识库的文件。",
      fineTuneExport: "将聊天用作训练数据",
      fineTuneExportDescription:
        "用你的聊天创建用于微调的 JSONL 数据集。可以在“训练”中加载，在“配方”中调整，或直接导出。",
      fineTuneExportAction: "导出 JSONL",
      fineTuneRunAction: "运行",
      fineTuneExportingAction: "正在导出...",
      fineTuneOpenRecipesAction: "在“配方”中打开",
      fineTuneOpeningRecipesAction: "正在打开...",
      fineTuneTrainAction: "加载到“训练”标签页",
      fineTuneTrainingAction: "正在加载...",
      fineTuneExportFailed: "无法导出训练数据",
      fineTuneRecipeFailed: "无法在“配方”中打开聊天",
      fineTuneTrainFailed: "无法将数据集加载到“训练”标签页",
    },
    connections: {
      title: "连接",
      description: "管理提供方和外部服务的连接。",
    },
    apiKeys: {
      title: "API",
      description: "通过兼容 OpenAI 的 API 以编程方式访问 Unsloth。",
      readDocs: "阅读 API 文档",
      noAccess: "还没有 API 访问权限。",
      accessTokens: "访问 token",
      loadError: "无法加载 API 访问权限。",
      createError: "无法创建访问 token。",
      revokeError: "无法撤销访问 token。",
      never: "永不过期",
      tokenNamePlaceholder: "Token 名称（例如 production）",
      newAccessTokenName: "新的访问 token 名称",
      createToken: "创建 token",
      creating: "创建中...",
      newTokenCreated: "新的访问 token 已创建",
      accessTokenCopied: "访问 token 已复制",
      copyAccessToken: "复制访问 token",
      copyNow: "请立即复制，此 token 不会再次显示。",
      usageExamples: "使用示例",
      usageTools: "工具",
      exampleCurlTools: "curl + 工具",
      examplePythonTools: "Python + 工具",
      exampleJavaScriptTools: "JavaScript + 工具",
      exampleCurlAdvanced: "curl + 高级",
      examplePythonAdvanced: "Python + 高级",
      exampleJavaScriptAdvanced: "JavaScript + 高级",
      osUnix: "Linux / macOS / WSL",
      osWindows: "Windows",
      secureHttps: "安全 HTTPS",
      secureHttpsHint:
        "0.0.0.0 端口仍可被全网访问。如需完全安全，请使用 --secure 启动 Unsloth，仅暴露此 HTTPS 链接。",
      copyTunnelUrl: "复制隧道链接",
      copySnippet: "复制代码片段",
      copy: "复制",
      copied: "已复制",
      setupDocs: "配置文档：",
      codingAgents: "编程智能体",
      codingAgentsHint:
        "针对此服务器启动编程智能体。它会使用已加载的模型；本地服务器会自动生成 API 密钥，远程服务器则会将其包含在命令中。",
      codingAgentsSwap: "可将 claude 替换为 codex、openclaw、opencode 或 hermes。",
      codingAgentDetected: "已安装在本机",
      codingAgentsDetectedHint: "本机检测到：{agents}。",
      relativeNever: "从未",
      relativeJustNow: "刚刚",
      expired: "已过期",
      today: "今天",
      created: "创建于 {value}",
      used: "上次使用：{value}",
      expires: "过期时间：{value}",
      actionsFor: "{name} 的操作",
      copyPrefix: "复制前缀",
      revokeToken: "撤销 token",
      revokeTitle: "撤销访问 token“{name}”？",
      revokeDescription:
        "使用此 token 的应用会立即失去访问权限。此操作无法撤销。",
      revokeAction: "撤销“{name}”",
      revoking: "撤销中...",
      usageNoModel:
        "加载或下载一个模型后即可看到可运行的示例。此服务器目前还没有可指定的模型。",
    },
    about: {
      title: "关于",
      description: "文档、发布说明、反馈和 Unsloth 构建信息。",
      studioVersion: "Unsloth 版本",
      packageVersion: "包版本",
      desktopAppVersion: "桌面应用版本",
      desktopAppVersionUnavailable: "不可用",
      llamaCppVersion: "llama.cpp 版本",
      hardware: "硬件",
      gpu: "GPU",
      cuda: "CUDA",
      rocm: "ROCm",
      xpu: "XPU",
      updates: "更新",
      help: "帮助",
      documentation: "文档",
      releaseNotes: "发布说明",
      whatsNew: "最新内容",
      feedback: "反馈",
      reportIssue: "报告问题",
      license: {
        sectionTitle: "许可证",
        studioLabel: "Unsloth",
        studioLicense: "AGPL-3.0",
        studioDescription: "基于 GNU AGPL v3.0 开源。",
        libraryLabel: "Unsloth Core",
        libraryLicense: "Apache-2.0",
        libraryDescription: "采用 Apache 2.0 许可证。",
      },
      dangerZone: "危险区域",
      shutDownStudio: "关闭 Unsloth",
      shutDownStudioDescription: "停止 Unsloth 服务进程并结束你的会话。",
      shutDown: "关闭",
      update: {
        title: "更新 Unsloth",
        commandText: "{label}内容",
        copied: "已复制",
        copyCommand: "复制命令",
        commandCopied: "{label}已复制",
        copyNamedCommand: "复制{label}",
        checkingInstall: "正在检查 Unsloth 的安装方式...",
        installIntro: "安装或更新 Unsloth：",
        localUpdateHeading: "本地更新",
        installCommandUnix: "macOS/Linux 安装命令",
        installCommandWindows: "Windows 安装命令",
        localInstallDetected:
          "检测到本地安装。请从原始代码检出目录更新，以免被 PyPI 版本替换。",
        pullThenUpdate: "拉取最新变更，然后运行本地安装器：",
        gitPullCommand: "git pull 命令",
        localInstallerCommand: "本地安装器命令",
        sourceInstallDetected:
          "这看起来是源码或 VCS 包安装。请从最初使用的本地路径或 Git URL 重新安装。",
        repoCheckoutFallback:
          "如果仍保留仓库的代码检出目录，请在该目录中运行本地安装器：",
        restartAfterUpdate: "更新后请重启 Unsloth。",
        desktopManaged:
          "桌面应用会自动检查新版本。你也可以随时在此检查或更新。",
        desktopReady: "桌面应用更新",
        desktopReadyDescription: "检查是否有更新的桌面应用版本。",
        desktopChecking: "正在检查更新",
        desktopCheckingDescription: "通常只需几秒钟。",
        desktopAvailable: "桌面应用 {version} 已可用",
        desktopAvailableDescription: "立即更新，完成后桌面应用将自动重启。",
        desktopExternalServer:
          "请在启动服务器的终端中运行 `unsloth studio update`。",
        desktopManualInstall: "打开发布页面，安装最新的 Linux 软件包。",
        desktopCheckFailed: "无法检查更新",
        desktopCheckFailedDescription: "请检查网络连接后重试。",
        desktopCurrent: "桌面应用已是最新版本",
        desktopCurrentDescription: "Unsloth 会继续自动检查更新。",
        checkForUpdates: "检查更新",
        checkAgain: "再次检查",
        retryCheck: "重试",
        checking: "正在检查...",
        updateNow: "立即更新",
        openReleasePage: "打开发布页面",
        unknownInstall:
          "Unsloth 无法检测安装方式。如果你使用一键安装器或 PyPI 安装，请使用上面的命令。",
        localCheckout:
          "对于本地代码检出目录安装，请改为在该目录中运行本地安装器：",
        docs: "安装文档：",
        docsInstall: "安装",
        docsUpdating: "更新",
        docsMac: "Mac",
        docsWindows: "Windows",
      },
    },
  },
  studio: {
    imageTraining: "图像训练",
    goToImageTraining: "前往图像训练",
    routeTitle: "训练",
    wizard: {
      modelTitle: "模型",
      modelDescription: "选择模型和训练方法",
      datasetTitle: "数据集",
      datasetDescription: "选择或上传训练数据",
      paramsTitle: "参数",
      paramsDescription: "配置训练参数",
      configTitle: "配置",
      configDescription: "保存和加载配置",
      modelLabel: "模型",
      methodLabel: "方法",
      datasetLabel: "数据集",
      modelTooltip: "要微调的基础模型。",
      methodTooltip: "模型的训练方式。LoRA 和 QLoRA 只更新小型适配器，而不是全部权重。",
      datasetTooltip: "用于微调模型的训练数据。",
      hfTokenDescription: "访问受限或私有模型和数据集时需要。",
      uploadLocalLabel: "或上传本地文件",
      sourceBrowse: "浏览",
      releaseToUpload: "松开以上传",
      loadYaml: "加载 YAML",
      saveYaml: "保存 YAML",
      resetDefaults: "重置为默认值",
      cachedModelGoneTitle: "缓存的模型已不可用",
      cachedModelGoneDescription:
        "模型文件已不在此设备上，训练时会重新下载。",
      cachedDatasetGoneTitle: "缓存的数据集已不可用",
      cachedDatasetGoneDescription:
        "数据集文件已不在此设备上，训练时会重新下载。",
    },
    preview: {
      title: "运行预览",
      ready: "已就绪",
      notReady: "未就绪",
      modelPending: "模型待定",
      datasetPending: "数据集待定",
      method: "方法",
      length: "长度",
      stepZero: "{count} 步",
      step: "{count} 步",
      stepTwo: "{count} 步",
      stepFew: "{count} 步",
      stepMany: "{count} 步",
      steps: "{count} 步",
      epochZero: "{count} 轮",
      epoch: "{count} 轮",
      epochTwo: "{count} 轮",
      epochFew: "{count} 轮",
      epochMany: "{count} 轮",
      epochs: "{count} 轮",
      batch: "批大小",
      context: "上下文",
      lr: "LR",
      hardware: "硬件",
      noGpu: "未检测到 GPU",
      hfToken: "HF token",
      saved: "已保存",
      notSet: "未设置",
      files: "文件",
      model: "模型",
      dataset: "数据集",
      downloadsOnStart: "开始时下载",
      continuesOnStart: "开始时继续下载",
      noticeModelDownload:
        "此模型尚未存储在本设备上。训练时会自动下载。",
      noticeModelPartial: "训练会先继续并完成模型下载，然后再加载模型。",
      noticeDatasetDownload:
        "此数据集尚未存储在本设备上。训练时会自动下载。",
      noticeDatasetPartial:
        "训练会先继续并完成数据集下载，然后再读取数据集。",
      noticeTransformersUpgrade:
        "已安装的 transformers 均不支持该架构。启动运行时会先提示安装 transformers {version}。",
      noticeSixteenBitOnly:
        "该架构以 16 位 LoRA 训练：无法使用 4 位，因此显存需求远高于 QLoRA。",
      noticeInstallSwitchesSixteenBit:
        "安装该版本而非沿用模型自带代码，会将本次运行切换为 16 位 LoRA，显存需求远高于 QLoRA。",
      advancedSettings: "高级设置",
      defaultAdvancedSettings: "默认值",
      nonDefaultAdvancedSettings: "{count} 项非默认设置",
    },
    datasetPicker: {
      noun: "数据集",
      selectDataset: "选择数据集",
      hubPlaceholder: "搜索 Hugging Face 数据集...",
      devicePlaceholder: "搜索本地数据集...",
      useAsHubDataset: "作为 Hugging Face 数据集使用",
      hfCacheLabel: "HF 缓存",
      sourceRecipe: "配方",
      sourceUpload: "上传",
      sourceLocal: "本地",
      scanningLocal: "正在扫描此设备上的数据集…",
      couldntScan: "无法扫描本地数据集",
      someLocationsUnscanned: "无法扫描部分数据集位置。",
      noLocalDatasets:
        "此设备上还没有数据集。请从模型中心下载数据集、在数据配方中创建数据集，或上传文件。",
      openDataRecipes: "打开数据配方",
      searchingHub: "正在搜索 Hugging Face…",
      noDatasetsFound: "未找到数据集。",
      tokenRejectedTitle: "Hugging Face token 被拒绝",
      tokenRejectedBody: "请在“设置”→“常规”中更新 token，然后重试。",
      hubUnreachable: "无法连接 Hugging Face",
      cantUseDataset: "无法使用此数据集",
      reasonInvalidHubId:
        "请输入有效的 Hugging Face 数据集 ID：repo 或 owner/repo。仅可使用字母、数字、.、_ 或 -（每部分最多 96 个字符）。",
    },
    modelPicker: {
      noun: "模型",
      selectModel: "选择模型",
      hubPlaceholder: "搜索或粘贴 Hugging Face ID...",
      devicePlaceholder: "搜索本地模型或粘贴文件夹路径...",
      useAsHubModel: "作为 Hugging Face 模型使用",
      useAsLocalPath: "作为本地路径使用",
      hfCacheLabel: "HF 缓存",
      sourceModelsFolder: "模型文件夹",
      sourceHfCache: "HF 缓存",
      sourceLmStudio: "LM Studio",
      sourceOllama: "Ollama",
      sourceCustomFolder: "自定义文件夹",
      sourceLocalModel: "本地模型",
      scanningLocal: "正在扫描本地模型…",
      couldntScan: "无法扫描本地模型",
      someLocationsUnscanned: "无法扫描部分本地位置。",
      noLocalModels: "未找到本地模型。",
      noLocalModelsHint: "请在上方粘贴文件夹路径，或切换到 Hugging Face。",
      searchingHub: "正在搜索 Hugging Face…",
      noModelsFound: "未找到模型。",
      tokenRejectedTitle: "Hugging Face token 被拒绝",
      tokenRejectedBody: "请在“设置”→“常规”中更新 token，然后重试。",
      hubUnreachable: "无法连接 Hugging Face",
      cantUseModel: "无法使用此模型进行训练",
      reasonTypeMismatch: "此模型与上一步选择的训练类型不匹配。",
      reasonInvalidHubId:
        "请输入有效的 Hugging Face 模型 ID：repo 或 owner/repo。仅可使用字母、数字、.、_ 或 -（每部分最多 96 个字符）。",
      reasonEmptyId: "请输入模型 ID 或本地模型路径。",
      reasonGguf: "GGUF 模型不能用于训练。",
      reasonAdapter: "适配器输出不能作为基础训练模型。",
      reasonNotTrainable: "此设备上的模型无法用于训练。",
      reasonUnsupportedFormat: "训练不支持此模型格式。",
      vramNeeds: "约需 {est}GB VRAM（GPU：{total}GB）",
      vramTight: "约 {est}GB VRAM（在 {total}GB 上偏紧）",
      vramApprox: "约 {est}GB VRAM",
      vramOomBadge: "OOM",
      vramTightBadge: "显存吃紧",
    },
    methods: {
      qlora: {
        label: "QLoRA",
        hint: "4 位量化。VRAM 占用最低，启动最快。",
        note: "4 位",
      },
      lora: {
        label: "LoRA",
        hint: "16 位适配器。在质量和内存之间取得平衡。",
        note: "16 位",
      },
      full: {
        label: "全量微调",
        hint: "训练所有权重。质量最高，需要的 VRAM 也最多。",
        note: "fp16",
      },
      cpt: {
        label: "持续预训练",
        hint: "针对新领域或新语言继续进行预训练。",
        note: "持续",
      },
    },
    subtitles: {
      configure: "配置并开始训练",
      trainingInProgress: "训练进行中",
      viewPastRuns: "查看历史训练",
      viewingPastRun: "正在查看历史训练",
    },
    tabs: {
      configure: "配置",
      currentRun: "当前训练",
      history: "历史",
    },
    loadingRuntime: "正在加载训练运行时...",
    checkingSupport: "正在检查此设备是否支持训练...",
    backToHistory: "返回历史",
    dataset: {
      selectors: {
        subset: "子集",
        subsetTooltip: "选择要使用的数据集子集（配置）。",
        trainSplit: "训练拆分",
        trainSplitTooltip: "选择用于训练的拆分。",
        evaluationSplit: "评估拆分",
        evaluationSplitTooltip:
          "选择用于评估的拆分。“无”表示训练期间不进行评估。",
        selectSubset: "选择子集...",
        selectSplit: "选择拆分...",
        none: "无",
        loading: "正在加载数据集配置和拆分...",
        manualTitle: "手动输入数据集选项",
        manualDescription: "请输入要使用的准确 Hugging Face 配置名称和拆分名称。",
        manualSubsetPlaceholder: "可选配置名称",
        manualRequired: "必须指定训练拆分。",
        manualTooLong: "请使用不超过 128 个字符。",
        manualInvalid: "此值包含不支持的字符。",
      },
      sourceAriaLabel: "数据集来源",
      localDataset: "本地数据集",
      localDatasetRows: " / {count} 行",
      huggingFaceDataset: "Hugging Face 数据集",
      localDatasetMetadata: "本地数据集元数据",
      dataRecipeOutput: "数据配方输出。",
      rows: "行",
      columns: "列",
      batches: "批次",
      updated: "更新时间",
      evalDataset: "评估数据集",
      uploading: "上传中...",
      uploadEvalFile: "上传评估文件",
      fileTooLarge: "文件过大",
      fileTooLargeDescription:
        "{file} 大小为 {size}。训练上传最大支持 {limit}。",
      documentRedirect: {
        title: "此文件需要先转换",
        genericFile: "此文件",
        description:
          "{file} 是源材料，并非可直接用于训练的数据集。请使用 Data Recipes 将文档转换为数据集，然后返回此处进行微调。",
        nextStepTitle: "推荐的下一步",
        nextStepDescription:
          "打开 Learning Recipes，并从基于文档的方案开始，例如 PDF grounded QA。",
        openAction: "打开 Learning Recipes",
      },
      evalDatasetDescription:
        "可选。如果未提供，将从训练数据中切分出一小部分。",
      advanced: "高级",
      targetFormat: "目标格式",
      targetFormatTooltip: "训练数据的格式。自动检测对大多数数据集都有效。",
      streamingInfoAriaLabel: "数据集流式传输信息",
      streaming: {
        label: "启用流式传输",
        description:
          "以流式方式读取 Hugging Face 文本数据集，而不是先将其下载。",
        unavailable: "无法使用流式传输。若要启用：",
        completionsUnavailable: "启用数据集流式传输时不可用。",
        blockers: {
          source:
            "请使用 Hugging Face 数据集（不能是本地上传或 S3 来源）。",
          maxSteps: "将最大步数设为大于 0——流式数据集的长度未知。",
          trainOnCompletions: "关闭“仅助手回复”。",
          evalSplit:
            "请选择单独的评估切分——评估已开启，但未设置不同的评估切分。",
          visionModel: "视觉模型不支持流式传输。",
          audioModel: "音频模型不支持流式传输。",
          embeddingModel:
            "Embedding 模型不支持流式传输（训练需要完整数据集）。",
          imageDataset: "此数据集似乎包含图像，无法进行流式传输。",
          audioDataset: "此数据集似乎包含音频，无法进行流式传输。",
          appleSilicon:
            "Apple Silicon（MLX）暂不支持流式传输。",
        },
        options: {
          trainOnCompletions: "仅助手回复",
          evaluation: "评估（需要单独的评估切分）",
        },
        notifications: {
          disabledForDetectedModality:
            "由于图像或音频数据集需要完整下载，流式传输已关闭。请检查设置，然后重新开始训练。",
          turnedOffMaxSteps:
            "已关闭流式传输：流式传输要求将最大步数固定为大于 0。",
          adjusted:
            "已调整流式传输设置。已禁用不兼容选项：{options}。",
          needsMaxSteps:
            "流式传输需要固定的最大步数（流式数据集的长度未知）。请先将最大步数设为大于 0。",
          enabledAdjusted:
            "已启用流式传输。已禁用不兼容选项：{options}。",
        },
      },
      auto: "自动",
      rawText: "原始文本",
      trainSplitStart: "训练切分起始",
      trainSplitStartTooltip:
        "通过指定起始行索引（含，从 0 开始）仅在训练切分的子集上训练。留空则从第一行开始。",
      trainSplitEnd: "训练切分结束",
      trainSplitEndTooltip:
        "训练切分中包含的最后一行索引（含，从 0 开始）。例如将起始设为 0、结束设为 99，可在前 100 行上训练。留空则使用所有剩余行。",
      endPlaceholder: "结束",
      clear: "清除",
      dropFileOrClick: "拖放 1 个文件到此处，或点击上传",
      uploadDetails: "上传详情",
      uploadDetailsTooltip:
        "每个文件最大 {limit}。PDF、DOCX 和 TXT 不是可直接用于训练的数据集，请先在配方中进行转换。",
      viewDataset: "查看数据集",
      uploadFailed: "上传失败",
      unknownError: "未知错误",
      unsupportedFileType: "不支持的文件类型",
      uploadOneFileType: "上传一个 {types} 文件。",
      datasetUploaded: "数据集已上传",
      evalDatasetUploaded: "评估数据集已上传",
      uploadOneFileAtATime: "一次只能上传一个文件",
      uploadSingleFileDescription: "训练数据集上传只接受单个文件。",
      previewLoadingHuggingFace: "正在从 Hugging Face 获取数据集预览...",
      previewLoading: "正在加载预览...",
      mappingRequirements: {
        audioAndText: "音频和文本",
        imageAndText: "图像和文本",
        instructionAndOutput: "指令和输出",
        humanAndGpt: "human 和 gpt",
        userAndAssistant: "用户和助手",
      },
      mappingStatus: {
        heuristicTitle: "通过启发式方法检测到的映射",
        readyTitle: "映射已就绪",
        requiredTitle: "映射数据集列",
        heuristicDescription:
          "我们已使用启发式方法自动检测下方的列映射。请通过列标题中的下拉菜单检查和调整，或使用 AI 辅助获得更准确的映射。",
        readyDescription: "一切正常。我们将自动转换此数据集。",
        requiredDescription:
          "使用标题中的下拉菜单为列分配角色。至少需要分配 {required}。",
      },
      s3: {
        title: "S3 配置",
        description: "从 Amazon S3 加载 .parquet、.json、.jsonl 或 .csv 数据集",
        bucket: "存储桶名称",
        bucketPlaceholder: "my-training-data-bucket",
        region: "AWS 区域",
        regionPlaceholder: "us-east-1",
        prefix: "路径前缀",
        prefixPlaceholder: "datasets/whisper/",
        accessKeyId: "访问密钥 ID",
        accessKeyIdPlaceholder: "AKIAIOSFODNN7EXAMPLE",
        secretAccessKey: "秘密访问密钥",
        secretAccessKeyPlaceholder: "你的 AWS 秘密访问密钥",
        useIamRole: "使用 IAM 角色",
      },
    },
    params: {
      mode: {
        simple: "简易",
        advanced: "高级",
        ariaLabel: "参数模式",
      },
      projectName: "项目名称",
      optional: "可选",
      projectNameDescription: "用于训练输出文件夹名称、导出默认值和历史记录。",
      loraSettings: "LoRA 设置",
      trainingHyperparameters: "训练超参数",
      maxSteps: "最大步数",
      epochs: "轮数",
      useMaxSteps: "使用最大步数",
      useEpochs: "使用轮数",
      maxStepsTooltip: "覆盖优化器总步数。",
      epochsTooltip: "完整遍历数据集的次数。",
      contextLength: "上下文长度",
      contextLengthTooltip: "每个训练样本的最大 token 数。",
      customContextLength: "输入自定义值",
      learningRate: "学习率",
      learningRateTooltip: "权重更新步长。较低的值训练更慢但更稳定。",
      learningRateDescription:
        "推荐值：LoRA 用 2e-4，CPT 用 5e-5，全量微调用 2e-5",
      embeddingLearningRate: "Embedding 学习率",
      embeddingLearningRateTooltip:
        "仅在 CPT 训练 embed_tokens 时使用。Embedding 比 LoRA 权重更易失稳，通常需要更小的学习率。留空则使用 lr/10；常用区间是比主学习率小 2 至 10 倍。仅在词表或领域 token 适配过慢时才提高。",
      rank: "Rank",
      rankTooltip: "低秩矩阵的维度。越高容量越大。",
      alpha: "Alpha",
      alphaTooltip: "LoRA 更新的缩放因子。通常为 Rank 的 2 倍。",
      dropout: "Dropout",
      dropoutTooltip: "LoRA 层的 dropout 概率，用于减少过拟合。",
      visionLayers: "视觉层",
      languageLayers: "语言层",
      attentionModules: "注意力模块",
      mlpModules: "MLP 模块",
      targetModules: "目标模块",
      enableLora: "启用 LoRA",
      trainWithLora: "使用 LoRA 训练",
      stableRank: "稳定 Rank",
      memoryEfficient: "节省内存",
      weightDecomposed: "权重分解",
      notSupportedAppleSilicon: "Apple 芯片暂不支持",
      optimization: "优化",
      schedule: "计划",
      memory: "内存",
      optimizer: "优化器",
      optimizerTooltip:
        "优化算法。8 位变体可降低内存占用。对视觉模型推荐 Fused。",
      optimizerTooltipMlx:
        "优化算法。AdamW 是默认选项。Lion 占用的内存更少，但通常需要更低的学习率。",
      lrScheduler: "LR 调度器",
      lrSchedulerTooltip:
        "学习率随训练变化的方式。Linear 平稳衰减；Cosine 曲线衰减。",
      optimizerOptions: {
        adamw8bit: "AdamW 8-bit",
        pagedAdamw8bit: "Paged AdamW 8-bit",
        adamwBnb8bit: "AdamW BNB 8-bit",
        pagedAdamw32bit: "Paged AdamW 32-bit",
        adamwTorch: "AdamW（PyTorch）",
        adamwTorchFused: "AdamW（PyTorch Fused）",
      },
      lrSchedulerOptions: {
        linear: "线性",
        cosine: "余弦",
      },
      batchSize: "批大小",
      batchSizeTooltip: "每步处理的样本数。越高占用越多 VRAM。",
      gradAccum: "梯度累积",
      gradAccumTooltip: "在不增加 VRAM 的情况下模拟更大的批大小。",
      weightDecay: "权重衰减",
      weightDecayTooltip: "L2 正则化，用于防止过拟合。",
      warmupSteps: "预热步数",
      warmupStepsTooltip: "在训练开始时逐步提高学习率，提升稳定性。",
      scheduleEpochsTooltip: "完整遍历数据集的次数。设为 0 则按最大步数运行。",
      saveSteps: "保存步数",
      saveStepsTooltip: "每 N 步保存一次检查点。0 表示禁用。",
      evalSteps: "评估步数",
      evalStepsTooltip:
        "评估之间间隔占总训练步数的比例（0-1）。设为 0 则禁用评估。例如 0.01 = 每 1% 步评估一次。",
      seed: "随机种子",
      seedTooltip: "用于复现的随机种子。",
      gradCheckpoint: "梯度检查点",
      gradCheckpointTooltip: "通过重算激活以时间换 VRAM。",
      none: "无",
      standard: "标准",
      enablePacking: "启用 packing",
      assistantCompletionsOnly: "仅助手回复",
      readMore: "了解更多",
    },
    training: {
      startTraining: "开始训练",
      starting: "启动中...",
      loadingModel: "正在加载模型...",
      checkingDataset: "正在检查数据集...",
      startFailed: "启动训练失败",
      startUnconfirmed: "Unsloth 无法确认训练是否已开始。正在后台检查状态。",
      stopFailed: "停止训练失败",
      trainingStillActiveTitle: "训练仍在进行",
      stopBeforeConfig: "请先停止训练，然后返回配置页面。",
      resumeFailed: "恢复训练失败",
      resumeFailedTitle: "无法恢复训练",
      resumeUnavailable:
        "只有已停止或出错且已保存检查点的训练运行才能恢复。",
      chooseModel: "选择模型",
      chooseDataset: "选择数据集",
      chooseModelAndDataset: "选择模型和数据集",
      modelUnverified:
        "无法验证此模型的设置。请检查网络连接或 Hugging Face token，然后重试。",
      legacyDatasetScriptUnsupported:
        "此 Hub 数据集依赖旧版自定义脚本，此训练流程不支持该脚本。",
      hfModelAccessDenied:
        "Hugging Face 拒绝访问此模型。请添加具有仓库访问权限的有效 Hugging Face 令牌，接受任何必需的访问条款，然后重试。",
      hfModelVerificationRateLimited:
        "Hugging Face 模型验证请求受到速率限制。请稍后重试。",
      hfModelVerificationFailed:
        "无法验证 Hugging Face 模型。请检查仓库 ID 和访问令牌。",
      hfModelMetadataUnavailable:
        "Hugging Face 模型元数据暂时不可用。请在开始训练前重试。",
      datasetUnverified:
        "无法验证数据集与此模型是否兼容。请检查网络连接或 Hugging Face token；开始训练时会重试检查。",
      setupChanged: "检查期间，训练设置发生了变化。请确认设置后重新开始训练。",
      validation: {
        s3MultimodalUnsupported: "S3 数据集暂不支持视觉或音频训练。",
        s3BucketRequired: "请先输入 S3 存储桶名称。",
        s3CredentialsRequired: "请提供 S3 访问密钥或启用 IAM 角色。",
        modelRequired: "请先选择基础模型。",
        learningRatePositive: "请输入大于零的学习率。",
        embeddingLearningRateRange:
          "请输入大于 0 且小于 1 的 Embedding 学习率。",
        hfDatasetRequired: "请先选择 Hugging Face 数据集。",
        hfDatasetSplitRequired: "请先选择或输入训练拆分。",
        localDatasetRequired: "请先选择本地数据集。",
        unsupportedDatasetSource: "不支持此数据集来源。",
      },
      uploadConfigTooltip: "加载已保存的 YAML 配置",
      saveConfigTooltip: "将当前配置下载为 YAML",
      resetConfigTooltip: "重置为模型默认值",
      configLoaded: "配置已加载",
      failedToLoadConfig: "加载配置失败",
      invalidYamlFile: "无效的 YAML 文件",
      configTooLarge: "训练配置文件过大（最大 1 MiB）。",
      failedToReadFile: "读取文件失败",
      failedToSaveConfig: "保存配置失败",
      parametersReset: "参数已重置为模型默认值",
      audioIncompatible:
        "该模型不支持音频。请切换到支持音频的模型，或选择非音频数据集。",
      visionIncompatible:
        "文本模型与多模态数据集不兼容。请切换到视觉模型，或选择纯文本数据集。",
      cancelTitle: "取消训练",
      cancelDescription: "要取消当前训练运行吗？",
      continueAction: "继续训练",
      cancelAction: "取消训练",
      stopTitle: "停止训练",
      stopDescription:
        "选择如何停止当前训练运行。“停止并保存”会写入检查点，之后可从该处恢复；不保存直接停止则无法恢复。",
      stopAction: "停止",
      stopping: "停止中...",
      stopAndSave: "停止并保存",
      compareInChat: "在聊天中对比",
      exportModel: "导出模型",
      milestone: "里程碑",
      halfwayDone: "已完成一半。训练进度超过 50%。",
      doneNextStep: "训练完成。下一步：对比基础模型和微调模型的输出。",
    },
    history: {
      title: "历史",
      filesDeleted: "文件已删除",
      deleteArtifactsLabel: "同时删除磁盘上的适配器文件",
      deleteArtifactsDescription:
        "删除此次运行的输出文件夹，包括已保存的适配器和检查点。",
      deleteArtifactsSharedNote:
        "另一次运行共用此输出文件夹。在使用该文件夹的最后一次运行被删除前，文件会予以保留。",
      artifactsKeptShared:
        "运行已删除。由于另一次运行使用同一文件夹，适配器文件已保留。",
      deleteArtifactsActiveError:
        "正在进行的训练运行正在使用这些文件。请先停止训练，再删除文件。",
      deleteArtifactsFailed: "运行已删除，但无法移除其文件。",
      deleteArtifactsRetainedError:
        "无法移除适配器文件，因此训练运行已保留在历史记录中。",
      emptyDescription: "还没有训练运行。请在配置标签页开始第一次训练。",
      loadError: "加载训练运行失败",
      deleteError: "删除训练运行失败。请重试。",
      retry: "重试",
      loadMore: "加载更多",
      loading: "加载中...",
      loadingRun: "正在加载训练运行...",
      runNotFound: "未找到运行",
      deleteTitle: "删除训练运行？",
      deleteDescription: "这会永久删除该训练运行及其所有指标。此操作无法撤销。",
      resumeTraining: "继续训练",
      resuming: "正在恢复训练...",
      deleteRun: "删除运行",
      loss: "Loss",
      steps: "步数",
      lossTrendSparkline: "Loss 趋势迷你图",
      relativeJustNow: "刚刚",
      status: {
        completed: "已完成",
        stopped: "已停止",
        error: "错误",
        running: "运行中",
        continued: "已继续",
      },
      message: {
        completed: "训练已完成",
        stopped: "训练已停止",
        running: "训练进行中",
        errored: "训练出错",
      },
      copyPreviewLink: "复制预览链接",
      previewLinkCopied: "预览链接已复制",
      previewLinkCopyFailed: "无法复制链接",
    },
    charts: {
      settings: "图表设置",
      settingsDescription: "训练运行时调整图表显示。",
      openSettings: "打开图表设置",
      viewWindow: "显示范围",
      viewWindowDescription: "仅显示最近的训练步，或显示完整历史记录。",
      window: "范围",
      all: "全部",
      trainingLoss: "训练损失",
      trainingLossDescription: "控制叠加线和 EMA 平滑。",
      smoothing: "平滑",
      smoothingDescription: "向右移动可增加平滑度。`0` = 原始值。",
      showRawLoss: "显示原始 loss",
      showSmoothedLoss: "显示平滑 loss",
      showAverageLine: "显示平均线",
      scaleAndCleanup: "坐标尺度和异常值处理",
      linear: "线性",
      log: "对数",
      noClip: "不裁剪",
      clipP99: "裁剪 p99",
      clipP95: "裁剪 p95",
      lossAxis: "损失轴",
      gradientNormAxis: "梯度范数轴",
      learningRateAxis: "学习率轴",
      resetDefaults: "恢复默认值",
      loss: "Loss",
      smoothed: "平滑",
      evalLoss: "评估 Loss",
      learningRate: "学习率",
      lr: "LR",
      gradNorm: "梯度范数",
      gradientNorm: "梯度范数",
      step: "步数 {step}",
      averageValue: "平均 {value}",
      waitingForFirstEvaluationStep: "等待首次评估步...",
      evaluationNotConfigured: "未配置评估",
      evalChartWillAppear: "达到 eval_steps 后会显示图表",
      setEvalDatasetAndSteps: "设置评估数据集和 eval_steps 以追踪评估 loss",
    },
    progress: {
      title: "训练进度",
      liveMetrics: "实时训练指标",
      exportGguf: "导出为 GGUF",
      openConfig: "打开训练配置",
      configLabel: "训练配置",
      hyperparams: "超参数",
      epochs: "轮数",
      batchSize: "批大小",
      learningRate: "学习率",
      optimizer: "优化器",
      maxSteps: "最大步数",
      contextLength: "上下文长度",
      warmupSteps: "预热步数",
      rank: "Rank",
      alpha: "Alpha",
      dropout: "Dropout",
      variant: "变体",
      epoch: "Epoch {value}",
      percentComplete: "完成 {percent}%",
      stepProgress: "步数 {current} / {total}",
      loss: "Loss",
      lr: "LR",
      gradNorm: "梯度范数",
      project: "项目",
      model: "模型",
      method: "方法",
      elapsed: "已用时间：{value}",
      eta: "ETA：{value}",
      stepsPerSecond: "{value} 步/秒",
      noStepsPerSecond: "-- 步/秒",
      tokens: "Tokens：{value}",
      gpuMonitor: "GPU 监控",
      live: "实时",
      utilization: "利用率",
      temperature: "温度",
      vram: "VRAM",
      power: "功耗",
      phase: {
        idle: "空闲",
        downloadingModel: "正在下载模型",
        downloadingDataset: "正在下载数据集",
        loadingModel: "正在加载模型",
        loadingDataset: "正在加载数据集",
        configuring: "配置中",
        training: "训练中",
        finalizing: "正在保存模型",
        completed: "已完成",
        error: "错误",
        stopped: "已停止",
      },
    },
    trainingStart: {
      ready: "就绪",
      downloading: "下载中",
      preparing: "准备中",
      left: "剩余 {eta}",
      downloaded: "已下载 {size}",
      terminalStart: "> Unsloth 训练开始...",
      preparingResources: "> 正在准备模型和数据集...",
      gettingReady: "> 正在为本次运行做好准备...",
      waitingForFirstStep: "> {message} | 正在等待首个训练步...（{step}）",
      resumingTraining: "正在继续训练...",
      startingTraining: "正在开始训练...",
      dataset: "数据集",
      datasetStreaming: "数据集：流式传输（无需完整下载）",
      modelWeights: "模型权重",
    },
  },
} satisfies DeepPartialMessageTree<typeof en>;
