// 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 = {
  common: {
    cancel: "取消",
    close: "关闭",
    delete: "删除",
    done: "完成",
    error: "错误",
    export: "导出",
    help: "帮助",
    loading: "加载中...",
    new: "新增",
    rename: "重命名",
    save: "保存",
    saving: "保存中...",
    search: "搜索",
    shutdown: "关闭服务",
  },
  shell: {
    accountMenu: "{name} 账号菜单",
    updateAvailable: "有可用更新",
    aria: {
      home: "Unsloth 首页",
      closeSidebar: "关闭侧边栏",
      openSidebar: "打开侧边栏",
      chatOptions: "聊天选项",
      runOptions: "训练选项",
    },
    navigation: {
      newChat: "新聊天",
      returnToChat: "返回聊天",
      compare: "对比",
      search: "搜索",
      hub: "Hub",
      train: "训练",
      recipes: "配方",
      export: "导出",
      recents: "最近",
      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 Studio 偏好设置。",
      closeAriaLabel: "关闭设置",
    },
    tabs: {
      general: "通用",
      profile: "个人资料",
      appearance: "外观",
      chat: "聊天",
      connections: "连接",
      apiKeys: "API",
      about: "关于",
    },
    general: {
      title: "通用",
      description: "Unsloth Studio 的全局偏好设置。",
      account: "账号",
      huggingFaceToken: "Hugging Face token",
      huggingFaceTokenDescription: "用于加载受限模型和推送产物。",
      hideToken: "隐藏 token",
      showToken: "显示 token",
      tokenSaved: "Token 已保存",
      password: "密码",
      passwordDescription: "更改此 Studio 账号的密码。",
      passwordDialog: {
        trigger: "更改密码",
        title: "更改密码",
        description: "输入当前密码并选择新密码（至少 {minLength} 个字符）。",
        currentPassword: "当前密码",
        newPassword: "新密码",
        confirmPassword: "确认新密码",
        currentTooShort: "当前密码至少需要 {minLength} 个字符。",
        newTooShort: "新密码至少需要 {minLength} 个字符。",
        mismatch: "两次输入的密码不一致。",
        samePassword: "新密码必须与当前密码不同。",
        update: "更新密码",
        updating: "正在更新...",
        updated: "密码已更新。",
        updateFailed: "密码更新失败。",
      },
      chatDefaults: "聊天默认设置",
      autoTitleNewChats: "自动为新聊天命名",
      autoTitleNewChatsDescription: "根据第一条消息生成简短标题。",
      notifications: {
        sectionTitle: "通知",
        showLlamaUpdates: "llama.cpp 更新通知",
        showLlamaUpdatesDescription:
          "有新的 llama.cpp 构建时提醒。如果只用于训练可以关闭。",
      },
      gettingStarted: "入门",
      startOnboarding: "开始引导",
      startOnboardingDescription: "重新打开设置向导，不会更改你的账号。",
      startOnboardingAction: "开始引导",
      uploads: {
        sectionTitle: "上传",
        maxUploadSize: "训练数据集上传上限",
        maxUploadSizeDescription:
          "适用于训练数据集上传。默认值为 {defaultSize} MB。",
      },
      resetPreferences: {
        sectionTitle: "危险区域",
        label: "重置所有本地偏好设置",
        description:
          "清除仅保存在本地的偏好设置。聊天、API 访问权限和数据库中的设置不会受到影响。",
        action: "重置偏好设置",
        confirmTitle: "重置所有本地偏好设置？",
        confirmDescription:
          "这会清除仅保存在本地的偏好设置，然后重新加载 Unsloth。聊天、API 访问权限和数据库中的设置不会受到影响。",
        confirmAction: "重置并重新加载",
      },
    },
    profile: {
      title: "个人资料",
      description: "更新你在 Unsloth 中显示的个人资料。",
      changePicture: "更换头像",
      displayName: "显示名称",
      nickname: "Unsloth 应该怎么称呼你？",
      nicknamePlaceholder: "昵称",
      nicknameSaved: "称呼名称已保存",
      avatarShape: "头像形状",
      avatarShapeCircle: "圆形",
      avatarShapeRounded: "圆角矩形",
      chooseSloth: "或选择一只树懒",
      nameSaved: "个人资料名称已保存",
      namePersistErrorTitle: "无法持久保存个人资料名称",
      namePersistErrorDescription:
        "名称已在本次会话中更新，但重新加载后可能不会保留。",
      photoUpdated: "头像已更新",
      photoPersistErrorTitle: "无法持久保存头像",
      photoPersistErrorDescription:
        "头像已在本次会话中更新，但重新加载后可能不会保留。",
      photoUpdateErrorTitle: "无法更新头像",
      imageUseError: "无法使用这张图片。",
    },
    appearance: {
      title: "外观",
      description: "调整 Unsloth Studio 在此设备上的显示方式。",
      language: {
        title: "语言",
        label: "显示语言",
        description: "选择 Unsloth 使用的语言。",
      },
      theme: {
        title: "主题",
        label: "颜色主题",
        description: "选择浅色、深色，或跟随系统。",
        system: "跟随系统",
        light: "浅色",
        dark: "深色",
      },
      layout: {
        title: "布局",
        compactSidebar: "默认固定侧边栏",
        compactSidebarDescription: "保持侧边栏展开，而不是折叠为图标。",
      },
    },
    chat: {
      title: "聊天",
      description: "管理此设备上保存的聊天记录。",
      data: "数据",
      exportHistory: "导出聊天记录",
      exportHistoryDescription: "将所有聊天和消息下载为 JSON 文件。",
      exportAction: "导出",
      exportingAction: "导出中...",
      exportConversations: "导出最近对话与项目",
      exportConversationsDescription:
        "将最近对话（或加上项目内对话）导出为 Raw JSONL、CSV 或 ShareGPT JSONL，可合并为单个文件或每个对话一个文件。",
      exportConversationsAction: "导出",
      exportScopeRecents: "最近对话",
      exportScopeAll: "最近对话 + 项目",
      exportCombinedSuffix: "（合并）",
      exportPerChatSuffix: "（每个对话）",
      importChats: "导入对话",
      importChatsDescription:
        "从 JSONL、NDJSON 或 CSV 导出文件将对话导入到最近对话。",
      importChatsAction: "导入",
      importNoConversations: "文件中未找到对话。",
      importedOneChat: "已导入 1 个对话到最近对话。",
      importedChatCount: "已导入 {count} 个对话到最近对话。",
      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: "清除聊天失败",
    },
    connections: {
      title: "连接",
      description: "管理提供方和外部服务的连接。",
    },
    apiKeys: {
      title: "API",
      description: "通过兼容 OpenAI 的 API 以编程方式访问 Unsloth。",
      readDocs: "阅读 API 文档",
      noAccess: "还没有 API 访问权限。",
      newBadge: "新",
      accessTokens: "访问 token",
      loadError: "无法加载 API 访问权限。",
      createError: "无法创建访问 token。",
      revokeError: "无法撤销访问 token。",
      never: "永不过期",
      tokenNamePlaceholder: "Token 名称（例如 production）",
      newAccessTokenName: "新的访问 token 名称",
      createToken: "创建 token",
      creating: "创建中...",
      newTokenCreated: "新的访问 token 已创建",
      accessTokenCopied: "访问 token 已复制",
      copyAccessToken: "复制访问 token",
      copyNow: "现在复制 - 之后不会再次显示。",
      usageExamples: "使用示例",
      usageTools: "工具",
      exampleCurlTools: "curl + 工具",
      examplePythonTools: "Python + 工具",
      exampleCurlAdvanced: "curl + 高级",
      examplePythonAdvanced: "Python + 高级",
      osUnix: "Linux / macOS / WSL",
      osWindows: "Windows",
      secureHttps: "安全 HTTPS",
      secureHttpsHint:
        "0.0.0.0 端口仍可被全网访问。如需完全安全，请使用 --secure 启动 Unsloth Studio，仅暴露此 HTTPS 链接。",
      copyTunnelUrl: "复制隧道链接",
      copySnippet: "复制代码片段",
      copy: "复制",
      copied: "已复制",
      setupDocs: "设置文档：",
      relativeNever: "从未",
      relativeJustNow: "刚刚",
      relativeHoursAgo: "{count} 小时前",
      relativeDaysAgo: "{count} 天前",
      relativeMonthsAgo: "{count} 个月前",
      relativeYearsAgo: "{count} 年前",
      expired: "已过期",
      today: "今天",
      inDays: "{count} 天后",
      created: "创建于 {value}",
      used: "使用于 {value}",
      expires: "过期时间 {value}",
      actionsFor: "{name} 的操作",
      copyPrefix: "复制前缀",
      revokeToken: "撤销 token",
      revokeTitle: '撤销访问 token "{name}"？',
      revokeDescription:
        "使用此 token 的应用会立即失去访问权限。此操作无法撤销。",
      revokeAction: '撤销 "{name}"',
      revoking: "撤销中...",
    },
    about: {
      title: "关于",
      description: "文档、发布说明、反馈和 Unsloth 构建信息。",
      studioVersion: "Unsloth 版本",
      packageVersion: "包版本",
      llamaCppVersion: "llama.cpp 版本",
      hardware: "硬件",
      gpu: "GPU",
      cuda: "CUDA",
      rocm: "ROCm",
      updates: "更新",
      help: "帮助",
      documentation: "文档",
      releaseNotes: "发布说明",
      whatsNew: "最新内容",
      feedback: "反馈",
      reportIssue: "报告问题",
      license: {
        sectionTitle: "许可证",
        studioLabel: "Unsloth Studio",
        studioLicense: "AGPL-3.0",
        studioDescription: "基于 GNU AGPL v3.0 开源。",
        libraryLabel: "Unsloth Core",
        libraryLicense: "Apache-2.0",
        libraryDescription: "基于 Apache License 2.0 许可。",
      },
      dangerZone: "危险区域",
      shutDownStudio: "关闭 Unsloth Studio",
      shutDownStudioDescription: "停止 Unsloth 服务进程并结束你的会话。",
      shutDown: "关闭",
      update: {
        title: "更新 Unsloth Studio",
        commandText: "{label} 文本",
        copied: "已复制",
        copyCommand: "复制命令",
        commandCopied: "{label} 已复制",
        copyNamedCommand: "复制 {label}",
        checkingInstall: "正在检查 Unsloth 的安装方式...",
        installIntro: "安装或更新 Unsloth：",
        localUpdateHeading: "本地更新",
        installCommandUnix: "macOS/Linux 安装命令",
        installCommandWindows: "Windows 安装命令",
        localInstallDetected:
          "检测到本地安装。请从最初的 checkout 更新，以免被 PyPI 版本替换。",
        pullThenUpdate: "拉取最新变更，然后运行本地安装器：",
        gitPullCommand: "git pull 命令",
        localInstallerCommand: "本地安装器命令",
        sourceInstallDetected:
          "这看起来是源码或 VCS 包安装。请从最初使用的本地路径或 Git URL 重新安装。",
        repoCheckoutFallback:
          "如果你仍保留 Unsloth 仓库 checkout，请从该 checkout 运行本地安装器：",
        restartAfterUpdate: "更新后请重启 Unsloth。",
        desktopManaged:
          "桌面应用会自动更新其内置后端，有新版本时会提示。",
        unknownInstall:
          "Unsloth 无法检测安装方式。如果你使用一键安装器或 PyPI 安装，请使用上面的命令。",
        localCheckout:
          "对于本地 checkout 安装，请改为从该 checkout 运行本地安装器：",
        docs: "安装文档：",
        docsInstall: "安装",
        docsUpdating: "更新",
        docsMac: "Mac",
        docsWindows: "Windows",
      },
    },
  },
  studio: {
    routeTitle: "训练",
    title: "微调工作台",
    subtitles: {
      configure: "配置并开始训练",
      trainingInProgress: "训练进行中",
      viewPastRuns: "查看历史训练",
      viewingPastRun: "正在查看历史训练",
    },
    tabs: {
      configure: "配置",
      currentRun: "当前训练",
      history: "历史",
    },
    loadingRuntime: "正在加载训练运行时...",
    backToHistory: "返回历史",
    sections: {
      model: "模型",
      dataset: "数据集",
      params: "参数",
      training: "训练",
      charts: "图表",
      progress: "训练进度",
    },
    configure: {
      title: "配置",
      description: "选择模型、数据集和训练设置。",
      startTraining: "开始训练",
      starting: "启动中...",
      loadingModel: "正在加载模型...",
      checkingDataset: "正在检查数据集...",
      trainingConfig: "训练配置",
    },
    model: {
      title: "模型",
      description: "选择基础模型和训练方法",
      fasterTrainingBadge: "训练速度提升 2 倍",
      baseModel: "基础模型",
      localModel: "本地模型",
      localModelTooltip: "本地已下载模型的路径，或自定义 HF 仓库。",
      scanningLocalAndCachedModels: "正在扫描本地和缓存模型...",
      scanning: "正在扫描...",
      scanningLocalModels: "正在扫描本地模型...",
      noLocalModelsFound: "未找到本地模型",
      noLocalModelsFoundManual: "未找到本地模型。请手动输入路径。",
      failedToLoadLocalModels: "加载本地模型失败",
      hfCache: "HF 缓存",
      customFolders: "自定义文件夹",
      localDir: "本地目录",
      huggingFaceModel: "Hugging Face 模型",
      huggingFaceModelTooltip: "搜索 Hugging Face 模型，或从推荐列表中选择。",
      searchModels: "搜索模型...",
      searching: "搜索中...",
      noModelsFound: "未找到模型",
      needsVram: "约需 {vram}GB 显存（GPU：{gpu}GB）",
      tightVram: "约 {vram}GB 显存（在 {gpu}GB 上偏紧）",
      vramEstimate: "约 {vram}GB 显存",
      method: "方法",
      methodTooltip:
        "QLoRA 使用 4 位量化以最大限度降低显存。LoRA 使用 16 位。Full 会更新所有权重。CPT（持续预训练）在原始文本上训练，使模型适配新领域，不使用聊天格式。",
      readMore: "了解更多",
      fullFineTune: "全量微调",
      checkingToken: "正在检查 token...",
      getOrUpdateToken: "获取或更新 token",
      huggingFaceTokenOptional: "Hugging Face Token（可选）",
      continuedPretraining: "持续预训练",
      localModels: "本地模型",
      localModelsFound: "找到 {count} 个本地/缓存模型",
      loadingLocalModels: "正在加载本地模型...",
    },
    dataset: {
      title: "数据集",
      description: "选择或上传训练数据",
      source: "数据集来源",
      chooseDataset: "选择数据集",
      chooseDatasetTooltip:
        "通过弹出标签切换 Hugging Face 与本地数据配方输出。",
      localTab: "本地",
      searchHuggingFaceDatasets: "搜索 Hugging Face 数据集...",
      searchLocalDatasets: "搜索本地数据集...",
      searching: "搜索中...",
      noDatasetsFound: "未找到数据集",
      loadingLocalDatasets: "正在加载本地数据集...",
      failedToLoadLocalDatasets: "加载本地数据集失败。",
      noLocalDatasetsYet: "还没有本地数据集。",
      noLocalDatasetsMatchSearch: "没有本地数据集匹配搜索。",
      openDataRecipes: "打开数据配方",
      browsingSource: "正在浏览 {browsing}。当前选择仍保持为 {current}。",
      localDatasets: "本地数据集",
      localDataset: "本地数据集",
      localDatasetRows: " / {count} 行",
      huggingFaceDataset: "Hugging Face 数据集",
      localDatasetMetadata: "本地数据集元数据",
      dataRecipeOutput: "数据配方输出。",
      rows: "行",
      columns: "列",
      batches: "批次",
      updated: "更新时间",
      evalDataset: "评估数据集",
      uploading: "上传中...",
      upload: "上传",
      uploadEvalFile: "上传评估文件",
      evalDatasetDescription:
        "可选。如果未提供，将从训练数据中切分出一小部分。",
      advanced: "高级",
      targetFormat: "目标格式",
      targetFormatTooltip: "训练数据的格式。自动检测对大多数数据集都有效。",
      auto: "自动",
      rawText: "原始文本",
      trainSplitStart: "训练切分起始",
      trainSplitStartTooltip:
        "通过指定起始行索引（含，从 0 开始）仅在训练切分的子集上训练。留空则从第一行开始。",
      trainSplitEnd: "训练切分结束",
      trainSplitEndTooltip:
        "训练切分中包含的最后一行索引（含，从 0 开始）。例如将起始设为 0、结束设为 99，可在前 100 行上训练。留空则使用所有剩余行。",
      endPlaceholder: "结束",
      clear: "清除",
      dropFileOrClick: "拖放 1 个文件到此处，或点击上传",
      viewDataset: "查看数据集",
      uploadFailed: "上传失败",
      unknownError: "未知错误",
      unsupportedFileType: "不支持的文件类型",
      uploadOneFileType: "上传一个 {types} 文件。",
      datasetUploaded: "数据集已上传",
      evalDatasetUploaded: "评估数据集已上传",
      uploadOneFileAtATime: "一次只能上传一个文件",
      uploadSingleFileDescription: "训练数据集上传只接受单个文件。",
      checkingToken: "正在检查 token...",
      getOrUpdateToken: "获取或更新 token",
      preview: "预览数据集",
      split: "切分",
      subset: "子集",
      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/",
        prefixTooltip: "存储桶中数据集文件的可选路径",
        accessKeyId: "访问密钥 ID",
        accessKeyIdPlaceholder: "AKIAIOSFODNN7EXAMPLE",
        secretAccessKey: "秘密访问密钥",
        secretAccessKeyPlaceholder: "您的 AWS 秘密访问密钥",
        useIamRole: "使用 IAM 角色",
        useIamRoleTooltip: "使用 IAM 角色凭证而非访问密钥（推荐用于 EC2/SageMaker）",
        testConnection: "测试连接",
        connectionSuccess: "成功连接到 S3 存储桶",
        connectionFailed: "无法连接到 S3 存储桶",
        comingSoon: "S3 集成即将推出",
        comingSoonDescription: "S3 数据集加载需要 boto3。此功能正在开发中。",
      },
    },
    params: {
      title: "参数",
      description: "配置训练超参数",
      loraSettings: "LoRA 设置",
      trainingHyperparameters: "训练超参数",
      maxSteps: "最大步数",
      epochs: "轮数",
      useMaxSteps: "使用最大步数",
      useEpochs: "使用轮数",
      maxStepsTooltip: "覆盖优化器总步数。",
      epochsTooltip: "完整遍历数据集的次数。",
      epochsDescription: "每个 epoch 是对数据集的一次完整遍历。",
      maxStepsDescription: "将训练限制为固定数量的优化器步数。",
      contextLength: "上下文长度",
      contextLengthTooltip: "每个训练样本的最大 token 数。",
      customContextLength: "输入自定义值",
      contextLengthDescription: "训练样本的最大序列长度",
      learningRate: "学习率",
      learningRateTooltip: "权重更新步长。较低的值训练更慢但更稳定。",
      learningRateDescription:
        "推荐值：LoRA 用 2e-4，CPT 用 5e-5，全量微调用 2e-5",
      embeddingLearningRate: "Embedding 学习率",
      embeddingLearningRateTooltip:
        "仅在 CPT 训练 embed_tokens 时使用。Embedding 比 LoRA 权重更易失稳，通常需要更小的学习率。留空则使用 lr/10；常用区间是比主学习率小 2 至 10 倍。仅在词表或领域 token 适配过慢时才提高。",
      embeddingLearningRateDescription:
        "留空使用 lr/10（推荐）。常用区间是比主学习率小 2 至 10 倍。",
      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: "节省内存",
      optimization: "优化",
      schedule: "计划",
      memory: "内存",
      optimizer: "优化器",
      optimizerTooltip:
        "优化算法。8 位变体可降低内存占用。对视觉模型推荐 Fused。",
      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: "每步处理的样本数。越高占用越多显存。",
      gradAccum: "梯度累积",
      gradAccumTooltip: "在不增加显存的情况下模拟更大的批大小。",
      weightDecay: "权重衰减",
      weightDecayTooltip: "L2 正则化，用于防止过拟合。",
      warmupSteps: "预热步数",
      warmupStepsTooltip: "在训练开始时逐步提高学习率，提升稳定性。",
      scheduleEpochsTooltip: "完整遍历数据集的次数。设为 0 则按最大步数运行。",
      saveSteps: "保存步数",
      saveStepsTooltip: "每 N 步保存一次检查点。0 表示禁用。",
      evalSteps: "评估步数",
      evalStepsTooltip:
        "评估之间间隔占总训练步数的比例（0-1）。设为 0 则禁用评估。例如 0.01 = 每 1% 步评估一次。",
      seed: "随机种子",
      seedTooltip: "用于复现的随机种子。",
      gradCheckpoint: "梯度检查点",
      gradCheckpointTooltip: "通过重算激活以时间换显存。",
      none: "无",
      standard: "标准",
      enablePacking: "启用 packing",
      assistantCompletionsOnly: "仅助手回复",
      readMore: "了解更多",
    },
    training: {
      title: "训练",
      description: "监控和控制训练",
      chartNoDataTitle: "暂无训练数据",
      chartNoDataDescription: "开始训练后可查看 loss 进度",
      startTraining: "开始训练",
      starting: "启动中...",
      loadingModel: "正在加载模型...",
      checkingDataset: "正在检查数据集...",
      configLabel: "训练配置",
      upload: "上传",
      uploadConfigTooltip: "加载已保存的 YAML 配置",
      save: "保存",
      saveConfigTooltip: "将当前配置下载为 YAML",
      reset: "重置",
      resetConfigTooltip: "重置为模型默认值",
      configLoaded: "配置已加载",
      failedToLoadConfig: "加载配置失败",
      invalidYamlFile: "无效的 YAML 文件",
      failedToReadFile: "读取文件失败",
      parametersReset: "参数已重置为模型默认值",
      audioIncompatible:
        "该模型不支持音频。请切换到支持音频的模型，或选择非音频数据集。",
      visionIncompatible:
        "文本模型与多模态数据集不兼容。请切换到视觉模型，或选择纯文本数据集。",
      cancelTitle: "取消训练",
      cancelDescription: "要取消当前训练运行吗？",
      continueAction: "继续训练",
      cancelAction: "取消训练",
      stopTitle: "停止训练",
      stopDescription: "选择如何停止当前训练运行。",
      stopAction: "停止",
      stopping: "停止中...",
      stopAndSave: "停止并保存",
      compareInChat: "在聊天中对比",
      exportModel: "导出模型",
      milestone: "里程碑",
      halfwayDone: "已完成一半。训练进度超过 50%。",
      doneNextStep: "训练完成。下一步：对比基础模型和微调模型的输出。",
    },
    history: {
      title: "历史",
      emptyTitle: "还没有训练运行",
      emptyDescription: "还没有训练运行。请在配置标签页开始第一次训练。",
      loadError: "加载训练运行失败",
      deleteError: "删除训练运行失败。请重试。",
      retry: "重试",
      loadMore: "加载更多",
      loading: "加载中...",
      loadingRun: "正在加载训练运行...",
      runNotFound: "未找到运行",
      deleteTitle: "删除训练运行？",
      deleteDescription: "这会永久删除该训练运行及其所有指标。此操作无法撤销。",
      runCount: "{count} 次运行",
      oneRun: "1 次运行",
      resume: "继续",
      resumeTraining: "继续训练",
      resuming: "继续中...",
      deleteRun: "删除运行",
      loss: "Loss",
      steps: "步数",
      lossTrendSparkline: "Loss 趋势迷你图",
      relativeJustNow: "刚刚",
      relativeMinutesAgo: "{count} 分钟前",
      relativeHoursAgo: "{count} 小时前",
      relativeDaysAgo: "{count} 天前",
      status: {
        completed: "已完成",
        stopped: "已停止",
        error: "错误",
        running: "运行中",
        continued: "已继续",
      },
      message: {
        completed: "训练已完成",
        stopped: "训练已停止",
        running: "训练进行中",
        errored: "训练出错",
      },
    },
    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: "实时训练指标",
      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: "梯度范数",
      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: "训练中",
        completed: "已完成",
        error: "错误",
        stopped: "已停止",
      },
    },
    trainingStart: {
      ready: "就绪",
      downloading: "下载中",
      preparing: "准备中",
      left: "剩余 {eta}",
      downloaded: "已下载 {size}",
      terminalStart: "> Unsloth 训练开始...",
      preparingResources: "> 正在准备模型和数据集...",
      gettingReady: "> 正在为本次运行做好准备...",
      waitingForFirstStep: "> {message} | 等待第一步...（{step}）",
      resumingTraining: "正在继续训练...",
      startingTraining: "正在开始训练...",
      dataset: "数据集",
      modelWeights: "模型权重",
    },
    tour: {
      guidedTour: "引导教程",
    },
  },
} satisfies DeepPartialMessageTree<typeof en>;
