// Simplified Chinese dictionary. Mirror the shape of src/lang/en.ts — // missing keys fall back to English per createI18n's fallbackLocale. // // ⚠️ 包含 `` 等尖括号的字符串会触发 vue-i18n 的 XSS // 检测,输出 "Detected HTML in '…' message" 警告。此类文案必须 // 改用 **函数形式**。详见 en.ts 的头部注释。 const zhMessages = { common: { downloadZip: "ZIP", downloadFailed: "下载失败", save: "保存", cancel: "取消", loading: "加载中...", close: "关闭", dismiss: "关闭", add: "添加", remove: "移除", yes: "是", no: "否", saving: "保存中...", saved: "已保存", noResultsYet: "暂无结果", noImageYet: "暂无图片", sendChat: "开启新对话", }, sessionTabBar: { newSession: "新建会话", // 中文无单复数之分,但仍保留 `|` 分隔符以对齐 vue-i18n 的 pluralization 约定。 activeSessions: "{count} 个活动会话(代理运行中)", unreadReplies: "{count} 条未读回复", unreadDot: "新回复", origin: { scheduler: "由调度器启动", skill: "由技能启动", bridge: "由桥接启动", }, }, chatInput: { placeholder: "向 Claude 发送消息…", send: "发送", stop: "停止", runningPlaceholder: "运行中… 按 Enter 加入队列", removeBuffered: "移除排队的消息", attachFile: "附加文件", fileTooLarge: "文件过大({sizeMB} MB)。上限为 30 MB。", unsupportedFileType: "不支持的文件类型。支持:图像、PDF、DOCX、XLSX、PPTX、文本文件。", attachImageFailed: "附加图片失败:{error}", stopFailed: "停止处理失败:{error}", dropHint: "拖放文件以附加", tooManyFiles: "一次最多可附加 {max} 个文件。", removeAttachment: "移除 {name}", attachmentFallbackName: "附件", voice: { start: "开始语音输入", stop: "停止语音输入", }, }, cspViolation: { notice: "⚠ 某视图尝试加载 {host},但内容安全策略已将其拦截({directive})。如需允许,请将该主机添加到 config/csp.json(仅在你信任它时)。", dismiss: "关闭", }, sessionHistoryPanel: { filters: { all: "全部", unread: "未读", bookmarked: "已收藏", longRunning: "长期 (24h+)", human: "人工", scheduler: "调度器", skill: "技能", bridge: "桥接", }, failedToRefresh: "⚠ 刷新失败: {error}", showingLastKnown: " — 正在显示上一次成功加载的列表。", noSessions: "暂无会话。", noMatching: "没有匹配的会话。", running: "运行中", noMessages: "(无消息)", openRowAria: "打开会话: {preview}", rowMenuAria: "会话操作", bookmark: "添加收藏", unbookmark: "取消收藏", delete: "删除", deleteConfirm: "确定要删除该会话吗?\n\n{preview}\n\n此操作无法撤销。", }, notificationBell: { notifications: "通知", activeSection: "进行中", historySection: "历史", noActive: "暂无活跃通知", noHistory: "暂无近期记录", clearAll: "全部清除", dismiss: "关闭", cancel: "取消", showMore: "显示更多 ({count})", showLess: "收起", openTarget: "打开", expandDetails: "展开详情", }, pluginDiagnostics: { title: "插件配置问题", hostBody: '插件 "{plugin}" 尝试注册 {label} 键 "{key}",但该键由宿主保留。该插件条目已被丢弃。', intraBody: '插件 "{first}" 和 "{second}" 都注册了 {dimension} "{key}"。"{first}" 先注册,因此 "{second}" 的注册被忽略。', }, shadowedEnv: { title: "Shell 环境变量正在覆盖 .env", body: "以下变量同时设置在 Shell 和 .env 中:{keys}。实际生效的是 Shell 中的值,因此 .env 被忽略。如果你修改了 .env,请更新或取消 Shell 中的值后重启。", }, optionalDeps: { // 通用 `title` 键保留以便兼容已持久化的历史条目;新发布的通知改用 // `titleNotFound` / `titleNotResponding`。 title: "可选依赖不可用", titleNotFound: "未安装 {command}", titleNotResponding: "{command} 未运行", notFound: "未找到 {command} — 相关功能已被禁用。请安装 {command} 后重启 MulmoClaude 以启用。", notResponding: "{command} 已安装但未运行 — 相关功能已被禁用。请启动 {command} 后重启 MulmoClaude 以启用。", }, billingMigration: { title: "开票功能已改为按需设置", body: "内置的 clients、worklog、invoice 和 profile 集合已从仪表盘中移除,但你的数据安全无损。请求设置客户与工时记录,然后设置开票,即可重新创建它们,你现有的记录会重新出现。", }, backendOffline: { title: "无法连接到后端", body: "MulmoClaude 服务器可能未运行。请检查开发服务器后再重试。", retry: "重试", }, pluginErrorBoundary: { title: "插件 {pkg} 已崩溃", subtitle: "插件渲染失败。错误已记录到控制台。", showDetails: "显示详情", hideDetails: "隐藏详情", retry: "重试", }, remoteHostOffline: { title: "远程主机已断开", body: "重新连接之前,手机将无法发送到此设备。", reconnect: "重新连接", }, remoteHost: { title: "远程主机", online: "远程主机在线", offline: "远程主机离线", uid: "uid {uid}", signIn: "使用 Google 登录", connecting: "连接中…", disconnect: "断开连接", disconnecting: "断开中…", noToken: "Google 登录未返回 idToken", connectFailed: "连接失败", disconnectFailed: "断开连接失败", signInFailed: "Google 登录失败", statusFailed: "加载状态失败", description: "远程访问允许移动设备连接到此 MulmoClaude 的收藏与消息流。", howTo: "在手机上打开 {url},用同一个 Google 账号登录。", customViewHint: "如需移动端优化的视图,请让 Claude 创建 {keyword}(而不是普通的 custom view)。", qrHint: "也可以用手机相机扫描此二维码打开。", }, sidebarHeader: { newMessages: "新消息", home: "前往最新对话", toolCallHistory: "工具调用历史", settings: "设置", settingsGeminiMissing: "设置 — 缺少 Gemini API 密钥", todayJournal: "今日总结", todayJournalNotFound: "暂无总结 — 多聊一会儿,journal 会自动生成。", todayJournalLoadFailed: "加载 journal 失败 (status {status}): {error}", copyMarkdown: "将对话复制为 Markdown", copiedMarkdown: "已复制", }, rightSidebar: { permalink: "选中消息的固定链接", copyPermalink: "复制选中消息的固定链接", copiedPermalink: "已复制!", toggleSystemPrompt: "切换系统提示词", systemPrompt: "系统提示词", availableTools: "可用工具", toggleToolDescription: "切换工具说明", toolCallHistory: "工具调用历史", copyHistory: "复制工具调用历史", copiedHistory: "已复制!", noToolCalls: "还没有工具调用", arguments: "参数", error: "错误", result: "结果", running: "运行中...", mcpHint: { title: (ctx: { named: (key: "server") => string }) => `${ctx.named("server")} 配置提示`, requiredKeys: "必填字段", setupGuide: "打开配置指南", }, }, fileTreePane: { sort: "排序:", sortByName: "按名称排序", name: "名称", sortByRecent: "按修改日期排序(最新在前)", recent: "最近", reference: "引用", // "RO" = Read-Only. 保留英文缩写作为紧凑徽章。 readOnlyBadge: "RO", showSystemFiles: "显示系统文件", showSystemFilesTitle: "在用户内容(data/、artifacts/、config/)之外同时显示代理内部的顶层目录(conversations/、feeds/ 等)。", }, fileTree: { dropHint: "将文件拖放到此处以保存到该文件夹", upload: { progress: "正在上传 {done}/{total}…", done: "已保存 {count} 个文件", failed: "{count} 个文件保存失败", }, workspace: "(工作区)", recentlyChanged: "最近修改", newFileMenuItem: "新建文件", newFileInputAria: "新文件名", newFilePlaceholder: { wikiPage: "页面 slug", summary: "摘要名称", document: "文档名称", html: "页面名称", story: "故事名称", }, newFileError: { empty: "文件名不能为空。", unsafe: "文件名包含无效字符。", exists: "此处已存在名为 {filename} 的文件。", saveFailed: "无法创建文件,请重试。", }, }, lockStatusPopup: { sandboxEnabledTooltip: "沙箱已启用 (Docker)", noSandboxTooltip: "未启用沙箱 (未找到 Docker)", sandboxEnabledLabel: "沙箱已启用:", sandboxEnabledBody: "Docker 正在运行。文件系统访问已隔离。", noSandboxLabel: "未启用沙箱:", noSandboxBodyPrefix: "Claude 可以访问你计算机上的所有文件。请安装", noSandboxBodySuffix: "以启用文件系统隔离。", dockerDesktop: "Docker Desktop", hostCredentials: "已附加的宿主凭据:", credsLoading: "加载中…", sshAgent: "SSH 代理:", forwarded: "已转发", notForwarded: "未转发", mountedConfigs: "挂载的配置:", none: "无", testIsolation: "测试沙箱隔离:", }, settingsModal: { title: "设置", version: "MulmoClaude v{version}", tabs: { gemini: "Gemini API 密钥", tools: "允许的工具", mcp: "MCP 服务器", dirs: "目录", refs: "引用目录", map: "地图", photos: "照片", google: "Google", model: "模型", voice: "语音", chatIndex: "聊天索引", journal: "日志", notifications: "Web Push", skills: "技能", roles: "角色", quit: "退出", }, groups: { llm: "LLM", servers: "服务器", workspace: "工作区", notifications: "通知", plugins: "插件", management: "管理", server: "服务器", }, navAriaLabel: "设置分区", googleTab: { description: "关联 Google 账号后,这台机器即可直接调用 Google API(首先是日历)。刷新令牌仅保存在本机,除 Google 外不会发送到任何服务器。", statusLinked: "已关联", statusNotLinked: "未关联", statusPending: "正在等待浏览器中的授权完成…", connect: "关联 Google 账号", unlink: "解除关联", unlinkConfirm: "要解除 Google 账号的关联吗?已保存的令牌将被吊销并从本机删除。", clientSecretAmbiguous: "在 ~/.secrets/ 中找到多个 client_secret_*.json。请只保留一个,以免已保存的令牌与 OAuth 客户端不匹配。", loadError: "获取 Google 关联状态失败。", connectError: "启动 Google 授权流程失败。", unlinkError: "解除 Google 关联失败。", }, mapTab: { description: "设置地图插件使用的 Google Maps API 密钥。密钥仅存储在本地,除发送到 Google Maps 外不会传输到任何地方。", apiKeyLabel: "Google Maps API 密钥", apiKeyPlaceholder: "AIza…", helperText: "在 {consoleLink} 创建或复制密钥。", requiredApis: "需要启用:Maps JavaScript API、Geocoding API、Places API (New)、Directions API。", configured: "已配置", notConfigured: "未配置", clear: "清除", loadError: "加载设置失败", saveError: "保存失败", }, photosTab: { description: "通过聊天或已连接的 bridge 收到的照片的隐私设置。EXIF 位置数据敏感 — 取消勾选可关闭自动捕获。", autoCaptureLabel: "自动捕获照片位置数据", autoCaptureHint: "开启时,所有带 EXIF GPS 的上传图片会在 data/locations/ 生成位置 sidecar。关闭后不再自动捕获,但 LLM 仍可在需要时手动读取 EXIF。", statusOn: "自动捕获已开启", statusOff: "自动捕获已关闭", loadError: "加载设置失败", saveError: "保存失败", }, quitTab: { description: "停止本机上运行的 MulmoClaude 服务器。从图标启动时,即使关闭此标签页服务器仍会继续运行——这里就是无需终端即可停止它的入口。", // Message function form — skips vue-i18n's message compiler so the // literal `@` in `mulmoclaude@latest` is not parsed as a linked-message // reference (the compiler throws, and the whole tab renders as nothing). restartHint: () => "要再次启动,请双击 MulmoClaude 图标(或运行 `npx mulmoclaude@latest`)。", quitLabel: "退出 MulmoClaude", confirmBody: "服务器将停止,此页面将无法继续使用。正在进行的处理会被中断。", confirmLabel: "退出", stopping: "正在停止…", stoppedTitle: "MulmoClaude 已停止", stoppedBody: "可以关闭此标签页。双击图标即可重新启动。", error: "停止服务器失败", }, notificationsTab: { description: "当你在此处发起的任务完成时,向你已注册的设备发送推送通知——当你提出问题后离开、想在答案就绪的那一刻收到提醒时很有用。", enableLabel: "任务完成时发送 Web Push", enableHint: "在你于此处发起的对话完成时触发。定时任务和后台任务不会触发它。", remoteHostNote: "需要 RemoteHost 连接(用于提供登录)以及至少一台已注册的设备。缺少任一项时不会有任何操作。", macosRemindersLabel: "任务完成时创建 macOS 提醒事项", macosRemindersHint: "将已完成的任务添加到默认的提醒事项列表。iCloud 同步会将其镜像到 iPhone,通知由此送达。", macosRemindersForcedOff: "启动时已通过 --disable-macos-reminders 或 DISABLE_MACOS_REMINDER_NOTIFICATIONS 关闭。移除该参数或取消该环境变量后重启,即可在此处控制。", statusOn: "Web Push 已开启", statusOff: "Web Push 已关闭", loadError: "加载设置失败", saveError: "保存失败", }, modelTab: { description: "控制 Claude Code 每个回合使用的推理强度。留空则使用 Claude 的默认值。", effortLabel: "推理强度", effortUnset: "(未设置 — 使用 Claude 的默认值)", helperText: "更高的等级会带来更多思考时间,但也会增加延迟和 token 消耗。", configured: "推理强度:{level}", notConfigured: "未设置", loadError: "加载设置失败", saveError: "保存失败", }, voiceTab: { description: "用语音口述聊天消息。音频在运行 MulmoClaude 的机器上本地转录,不会发送到任何外部服务。", requirements: "仅在 macOS 上可用。需要 whisper.cpp 服务器,请使用 yarn build:whisper 进行构建(参见 README 的 Local Voice Input 部分)。", unsupported: "语音输入需要已安装 whisper.cpp 服务器的 macOS。本机不支持此功能。", enableLabel: "启用语音输入", enableHint: "开启后会一次性下载语音模型(1–3 GB)。随后聊天输入框中会出现麦克风按钮。", modelLabel: "语音模型", downloading: "正在下载模型… {percent}%", ready: "模型已就绪", downloadError: "模型下载失败。", retry: "重试", loadError: "加载设置失败", saveError: "保存失败", }, chatIndexTab: { description: "为聊天历史自动生成 AI 标题/摘要。默认关闭。开启后自动化会话(scheduler / 系统 worker)仍会始终跳过;只有人类会话在每次轮次结束时才会调用一次摘要。", modeLabel: "聊天索引模型", helperText: "Haiku 更便宜;Sonnet 在长且话题多变的会话中标题更精准。", mode: { off: "关闭", haiku: "Haiku", sonnet: "Sonnet", }, status: { off: "索引已关闭", haiku: "使用 Haiku 建立索引中", sonnet: "使用 Sonnet 建立索引中", }, loadError: "加载设置失败", saveError: "保存失败", }, journalTab: { description: "自动化每日日志 — 将近期聊天会话摘要为 journal/*.md,并抽取持久化记忆笔记。默认关闭。自动化会话(scheduler / 系统 worker)无论此设置如何都会始终排除。", modeLabel: "日志模型", helperText: "Haiku 更便宜;Sonnet 生成的每日/主题摘要更丰富。仅在此设置开启时每小时的轮次才会运行。", mode: { off: "关闭", haiku: "Haiku", sonnet: "Sonnet", }, status: { off: "日志已关闭", haiku: "使用 Haiku 运行日志中", sonnet: "使用 Sonnet 运行日志中", }, loadError: "加载设置失败", saveError: "保存失败", }, // `` 插槽 — 命名为 `envKey` / `envFile`,在 SettingsModal.vue // 中作为行内 `` 渲染,因此字面的变量名和文件名保持不翻译。 geminiRequired: "图像生成需要 {envKey}。请将它加入 {envFile} 并重启应用。", geminiAskButton: "询问 Claude", geminiAskMessage: "Gemini API 密钥在这个应用中起什么作用?", toolNamesLabel: "工具名称", invalidToolNamesPrefix: "以下工具名看起来不符合规范(预期前缀", invalidToolNamesSuffix: "):", mcpToolsError: "⚠ 无法获取 MCP 工具状态: {error}。无论是否启用,均显示所有工具。", changesHint: "修改在下一次发送消息时生效,无需重启。", cannotSaveTooltip: "设置加载失败前无法保存", saving: "保存中…", loadingLabel: "加载中…", unsavedMarker: "●", unsavedToolsConfirm: "允许的工具有未保存的更改,仍要关闭吗?", unsavedMcpDraftConfirm: "MCP 服务器草稿尚未完成,仍要关闭吗?", mcpSaveFailed: "保存 MCP 服务器更改失败。", }, canvasViewToggle: { stackViewTooltip: "堆叠视图 · 点击切换到单一视图", singleViewTooltip: "单一视图 · 点击切换到堆叠视图", switchToSingle: "切换到单一视图", switchToStack: "切换到堆叠视图", }, sessionHistoryToggle: { showTooltip: "在左侧显示会话历史面板", hideTooltip: "隐藏会话历史面板", show: "显示会话历史", hide: "隐藏会话历史", }, sessionHistoryExpand: { expandTooltip: "将会话历史面板展开为全宽", collapseTooltip: "收起会话历史面板", expand: "展开会话历史", collapse: "收起会话历史", }, settingsWorkspaceDirs: { explanation: "自定义用于在 {dataDir} 和 {artifactsDir} 下组织文件的目录。Claude 会参照这些来决定文件保存路径。", noEntries: "未配置自定义目录。", addDirTitle: "添加目录", pathPlaceholder: "data/clients 或 artifacts/reports", descPlaceholder: "说明(这个文件夹里放什么)", errPathRequired: "路径不能为空", errMustStartWith: "必须以 data/ 或 artifacts/ 开头", errAlreadyExists: "已存在", }, settingsReferenceDirs: { explanation: "Claude 可读取但不能修改的外部目录。Docker 模式下以只读方式挂载。适合引用 Obsidian 仓库、项目代码或文档文件夹。", noEntries: "未配置引用目录。", addDirTitle: "添加引用目录", pathPlaceholder: "/Users/me/ObsidianVault 或 ~/Documents/notes", labelPlaceholder: "标签(可选 — 默认为文件夹名)", readOnlyBadge: "只读", errPathRequired: "路径不能为空", errMustBeAbsolute: "必须为绝对路径或以 ~/ 开头", errAlreadyExists: "已存在", errLabelConflict: '标签 "{label}" 已存在', }, dashboard: { empty: "暂无收藏的集合。", emptyHint: "将集合固定(★)后会显示在这里。", viewTable: "表格", viewCalendar: "日历", viewKanban: "看板", viewPickerLabel: "选择视图", openFull: "双击打开完整视图", dragHint: "拖动以重新排序", resizeHint: "拖动以调整高度", }, pluginLauncher: { chat: { label: "聊天" }, dashboard: { label: "仪表板" }, automations: { label: "自动化" }, wiki: { label: "百科" }, collections: { label: "集合" }, feeds: { label: "订阅源" }, accounting: { label: "会计" }, files: { label: "文件" }, }, shortcuts: { pin: "固定到启动栏", unpin: "从启动栏取消固定", zoneAriaLabel: "已固定的快捷方式", reorder: { open: "重新排序快捷方式", title: "重新排序", moveUp: "上移", moveDown: "下移", }, }, fileContentHeader: { showRendered: "显示渲染后的 Markdown", showRaw: "显示原始源代码", rendered: "已渲染", raw: "原始", closeFile: "关闭文件", revealInOs: "在文件夹中显示", revealInOsFailed: "无法在文件夹中显示", }, fileContentRenderer: { download: "ZIP", downloadZip: "下载为自包含 zip(含资源)", downloadError: "下载失败", selectFile: "请选择一个文件", htmlPreview: "HTML 预览", pdfPreview: "PDF 预览", parseError: "解析错误", editJson: "编辑 JSON", jsonEditorLabel: "JSON 编辑器", invalidJson: "无效的 JSON", undo: "撤销", redo: "重做", editMarp: "编辑幻灯片源代码", marpEditorLabel: "Marp 幻灯片源代码", openInOs: "在系统中打开", openingInOs: "正在打开…", openInOsFailed: "无法在系统中打开", }, filesView: { chatPlaceholder: "询问关于此文件的问题…", }, systemFiles: { schemaLabel: "架构", showDetails: "显示详情", hideDetails: "隐藏详情", editPolicy: { "agent-managed-but-hand-editable": "代理管理(可手动编辑)", "user-editable": "用户可编辑", "agent-managed": "代理管理", "fragile-format": "脆弱格式", ephemeral: "临时文件", }, mcp: { title: "MCP 服务器", summary: "附加到代理的外部 Model Context Protocol 服务器。添加 HTTP 或 stdio 服务器以扩展代理工具。", }, settings: { title: "应用设置", summary: "用户可编辑的行为偏好 — Gemini API 密钥、允许的工具、沙箱配置等。", }, schedulerTasks: { title: "调度器任务", summary: "按计划触发的定期代理自动化。通过 Automations UI 管理,本文件是磁盘上的权威来源。", }, schedulerOverrides: { title: "调度器覆盖", summary: "在系统调度之上叠加的每任务时间 / 间隔覆盖。当你要求修改某个定期任务的时间时,代理会写入此文件。", }, schedulerItems: { title: "调度器条目队列", summary: "等待触发的预定调用队列。代理管理;除非你清楚每个字段的含义,否则不要手动编辑。", }, wikiIndex: { title: "Wiki 索引", summary: "所有 Wiki 页面的自动生成索引。每次 Wiki 编辑后刷新;请勿手动编辑(更改会被覆盖)。", }, wikiLog: { title: "Wiki 编辑日志", summary: "Wiki 页面创建与编辑的活动日志。代理管理且仅追加;适合作为最近变更动态。", }, wikiSummary: { title: "Wiki 总览", summary: "Wiki 的自动生成概览 — 主题聚类、页面数量、近期活动。由代理刷新。", }, wikiSchema: { title: "Wiki 架构", summary: "代理用于保持 Wiki 页面一致性的格式规范。脆弱 — 代理期望特定结构,建议交由代理编辑。", }, memory: { title: "记忆", summary: "关于你的精炼事实,作为新对话的上下文始终加载。journal 提取器会自动追加,也可手动编辑。", }, summariesIndex: { title: "总结索引", summary: "可浏览的索引,链接 journal 生成的日次与主题总结。代理管理;每次 journal 运行时刷新。", }, rolesJson: { title: "角色定义 (JSON)", summary: "角色配置 — 模型选择、MCP 服务器、允许的插件、查询建议。用户可编辑,无需重启。", }, rolesMd: { title: "角色描述 (Markdown)", summary: "角色的人设与系统提示正文,激活该角色时作为上下文加载。用户可编辑,下一条消息生效。", }, journalDaily: { title: "日次 journal 总结", summary: "由 journal 流程从聊天会话中提炼出的当日活动自动生成回顾。", }, journalTopic: { title: "主题 journal", summary: "围绕某个特定主题的长期笔记,随该主题的持续讨论而累积和修订。代理管理。", }, }, settingsMcpTab: { explanation: "添加外部 MCP 服务器。HTTP 服务器在所有模式下都可用。Stdio 服务器使用沙箱镜像中的 {npx} / {node} / {tsx};启用 Docker 时,路径必须位于工作区内。", localhostRewrite: "Docker 模式下 {localhost} 会被改写为 {hostDockerInternal}。", noServers: "尚未配置 MCP 服务器。", enabled: "已启用", urlLabel: "URL:", commandLabel: "命令:", dockerStdioUnsupported: "⚠ 启用 Docker 沙箱时不会运行。", dockerStdioHostExecActive: "⚠ 在主机上运行 — 此服务器会脱离 Docker 沙箱。", dockerStdioHostExecOptIn: "仍在主机上运行(高级)。此服务器通过本地 HTTP 网关在 Docker 沙箱之外运行,可访问您的计算机。", learnMore: "了解更多", addServerButton: "+ 添加 MCP 服务器", nameLabel: "名称", namePlaceholder: "my-server", typeHttp: "HTTP", typeStdio: "Stdio(命令)", urlFieldLabel: "URL", urlPlaceholder: "https://example.com/mcp", commandFieldLabel: "命令", argsLabel: "参数(每行一个)", // Message function form — 跳过 vue-i18n 的消息编译器, // 避免字面量 `@` 被解析为 linked message 引用。 argsPlaceholder: () => "-y\n@modelcontextprotocol/server-filesystem\n/workspace/path", errNoName: "请填写名称,或输入可用于推断名称的 URL / 参数。", errBadName: "名称必须以小写字母开头,且仅包含 [a-z0-9_-]。", errIdExists: '服务器 id "{id}" 已存在。', errBadHttpUrl: "HTTP URL 必须以 http:// 或 https:// 开头", pendingEntryWarning: "请先完成或取消待处理的 MCP 服务器条目。", customHeading: "自定义服务器", catalog: { heading: "预设 MCP 服务器", audience: { general: "🟢 通用", developer: "🔵 开发者" }, risk: { low: "低", medium: "中", high: "高" }, upstream: "📦 源", setupGuide: "📚 设置", entry: { memory: { displayName: "记忆", description: "让 Claude 在会话之间记住对话内容。", }, sequentialThinking: { displayName: "顺序思考", description: "帮助 Claude 一步一步地解决复杂问题。", }, context7: { displayName: "Context7(库文档)", description: "获取主流库的最新文档 — 超越模型训练截止日期的信息源。", }, deepwiki: { displayName: "DeepWiki(GitHub 仓库 Wiki)", description: "向任意 GitHub 仓库提问,获得 Wiki 风格的结构化答案。", }, notion: { displayName: "Notion", description: "读写 Notion 工作区 — 支持页面、数据库与搜索。", field: { apiKey: { label: "Notion 集成令牌", help: "创建一个 Notion 集成并复制 Internal Integration Secret。点击 🔑 打开集成页面。", }, }, }, slack: { displayName: "Slack", description: "列出频道、发送消息、搜索 Slack 工作区历史。", field: { botToken: { label: "Bot 令牌", help: "Slack 应用 → OAuth & Permissions → Bot User OAuth Token。以 xoxb- 开头。", }, teamId: { label: "团队 / 工作区 ID", help: "运行 team.info 或查看工作区 URL — 形如 T01ABC23DEF。", }, }, }, googleMaps: { displayName: "Google Maps", description: "搜索地点、查询路线、获取位置详情。", field: { apiKey: { label: "Google Maps API 密钥", help: "Google Cloud Console → APIs & Services → Credentials → 创建 API 密钥。启用 Places + Directions。", }, }, }, appleNative: { displayName: "Apple 原生应用(macOS)", description: "通过 AppleScript 读写 提醒事项 / 日历 / 备忘录 / 邮件 / 地图。仅限 macOS — 无需凭证。", }, gmail: { displayName: "Gmail", description: "读取、发送和标记 Gmail 邮件。使用您自己 Google Cloud 项目中创建的 OAuth 客户端(无需应用审核)。", field: { credentials: { label: "credentials.json 路径", help: "Google Cloud Console → APIs & Services → Credentials → OAuth 客户端 ID(Desktop app)。下载 credentials.json 并粘贴其绝对路径。", }, }, }, googleCalendar: { displayName: "Google 日历", description: "读取和创建 Google 日历事件。与 Gmail 相同的 BYO credentials.json 模式。", field: { credentials: { label: "credentials.json 路径", help: "可复用与 Gmail 相同的 Google Cloud OAuth 客户端,或单独创建一个仅供 Calendar 使用的客户端。", }, }, }, googleDrive: { displayName: "Google 云端硬盘", description: "搜索和读取 Google 云端硬盘文件。BYO Google OAuth 凭证 — 令牌缓存在本地凭证文件旁。", field: { credentials: { label: "credentials.json 路径", help: "Google Cloud Console → APIs & Services → Credentials → OAuth 客户端 ID(Desktop app)。在同一项目中启用 Google Drive API。", }, }, }, github: { displayName: "GitHub", description: "通过 Personal Access Token 读取仓库 / Issues / PRs 并执行搜索。请窄化 token 权限 — 写权限(如 `repo`)允许 agent 推送到任何可访问的仓库。", field: { token: { label: "Personal Access Token", help: "GitHub → Settings → Developer settings → Personal access tokens。建议使用 fine-grained token 仅限于希望 agent 操作的仓库。", }, }, }, linear: { displayName: "Linear", description: "通过 Personal API key 读写 Linear 的 Issue / 项目 / 周期。", field: { apiKey: { label: "Linear API 密钥", help: "Linear → Settings → API → Personal API keys。点击 🔑 打开页面并点击 Create key。", }, }, }, weatherOpenMeteo: { displayName: "天气(Open-Meteo)", description: "全球免费天气预报和当前气象 — 无需 API 密钥。", }, spotify: { displayName: "Spotify", description: "搜索曲目、管理播放列表、控制播放。BYO Spotify 开发者应用 — 仅需 Client ID(PKCE 流程,不需要 Client Secret)。", field: { clientId: { label: "Client ID", help: "Spotify Developer Dashboard → Create app,将 Redirect URI 设为 http://127.0.0.1:8888/callback,复制 Client ID。然后在终端运行一次 `SPOTIFY_CLIENT_ID= npx spotify-mcp@latest auth` 登录(刷新令牌缓存在 ~/.spotify-mcp/tokens.json)。", }, }, }, youtubeTranscript: { displayName: "YouTube 字幕", description: "通过 URL 获取任意公开 YouTube 视频的字幕。无需凭证。", }, }, config: { howToGet: "获取方式", install: "安装", errMissingRequired: "缺少必填字段:{fields}", requiredMarker: "*", requiredAria: "必填", }, }, }, pluginScheduler: { previewIcon: "📅", previewAutomations: "{count} 个自动化", previewMore: "+ 还有 {count} 个…", }, pluginSchedulerTasks: { recommendedFrequencies: "推荐频率", tableTaskType: "任务类型", tableSuggestedSchedule: "建议的计划", noTasks: "没有计划任务", runNow: "立即运行", enable: "启用", disable: "停用", delete: "删除", nextRun: "下次: {time}", originSystem: "系统", originUser: "用户", originSkill: "技能", runFailed: "运行失败: {error}", toggleFailed: "切换失败: {error}", deleteFailed: "删除失败: {error}", detailsToggle: "显示详情", promptLabel: "提示词", roleLabel: "角色", confirmDelete: "删除任务「{name}」?此操作无法撤销。", hintNewsRss: "新闻 / RSS 抓取", hintJournal: "每日日志处理", hintWiki: "Wiki 维护", hintMemory: "记忆提取", hintCalendar: "日历 / 联系人同步", }, pluginCanvas: { undo: "撤销", redo: "重做", clear: "清除", styleLabel: "样式:", stylePromptWithPath: "将 `{path}` 处的图像转换为 {style} 风格的图像。", stylePromptNoPath: "将我在画布上的绘图转换为 {style} 风格的图像。", saveFailed: "未保存", }, pluginWiki: { backToIndex: "返回目录", pdf: "PDF", pdfFailed: "⚠ PDF 失败", tabIndex: "目录", tabLog: "日志", tabLint: "Lint", tabGraph: "图谱", graphEmpty: "暂无可绘制的链接。", linkedReferences: "反向链接", empty: "Wiki 为空。请让 Wiki 管理器采集一个数据源。", previewMore: "+ 还有 {count} 项…", chatPlaceholder: "就本页提问…", emptyPage: "页面「{title}」尚不存在。", emptyContent: "页面「{title}」已存在,但没有内容。", createPage: "请求创建此 Wiki 页面", updatePage: "请求更新此 Wiki 页面", tagFilterAll: "全部", noMatches: "没有带 #{tag} 标签的页面", lintChat: "检查 Wiki", taskCountMismatch: "Wiki 源与渲染输出的任务数不一致,为避免文件损坏,已拒绝切换。", metadataCreated: "创建", metadataUpdated: "更新", metadataEditor: "编辑者", pageEditHeader: "Wiki 编辑", snapshotExpired: "快照已过期 — 显示当前页面", snapshotLoadError: "无法加载快照 — 页面可能仍然存在。请尝试刷新。", pageDeleted: "页面已删除", history: { tabContent: "正文", tabHistory: "历史", empty: "暂无历史记录 — 编辑此页面后,第一个版本将记录在此。", loading: "正在加载历史…", backToList: "返回历史列表", restoreButton: "恢复此版本", restoreConfirmTitle: "恢复此版本?", restoreConfirmBody: "将页面恢复为 {editor} 于 {ts} 保存的版本。当前页面将被替换,但现有历史将保留。", restoreConfirmAction: "恢复", restoreConfirmCancel: "取消", restoreSuccessToast: "页面已恢复。", restoreFailureBanner: "恢复失败: {error}", compareCurrent: "与当前页面比较", comparePrevious: "与上一版本比较", diffNoPrevious: "没有可比较的上一版本。", diffNoChanges: "此版本与比较对象之间没有内容差异。", editorBadgeUser: "用户", editorBadgeLLM: "LLM", editorBadgeSystem: "系统", hiddenLines: "已隐藏 {count} 行未变更内容", expandHidden: "显示", }, }, pluginPresentForm: { fallbackTitle: "表单", fieldCount: "{count} 个字段", submitted: "已提交", errorSummary: "请修正以下错误", requiredMarker: "*", selectOption: "请选择", charactersCount: "{current} / {max} 字符", charactersCountNoMax: "{current} 字符", submit: "提交", progress: "已填写 {filled} / {total} 个必填字段", }, pluginPresentSvg: { saveAsPng: "下载为 PNG", png: "PNG", saveAsPdf: "另存为 PDF(打开打印对话框)", pdf: "PDF", untitled: "SVG 矢量图", editSource: "编辑 SVG 源代码", cancel: "取消", applyChanges: "应用更改", saving: "保存中...", saveError: "⚠ 保存失败:{error}", exportError: "⚠ 导出失败:{error}", loadingSource: "正在加载源代码…", sourceError: "加载源代码失败:{error}", }, photoLocations: { title: "照片位置信息", summary: "{total} 张已捕获 · {withGps} 张含 GPS", mapHint: "向 Claude 说「在地图上显示」即可使用 Google Map 插件一并标注。", loading: "加载中…", empty: "尚未捕获任何照片位置。通过聊天或已连接的 bridge 发送带 GPS 标签的照片即可开始累积。", noGps: "无 GPS 数据", }, pluginManageSkills: { deleteProjectSkill: "删除此项目级技能", unstarPresetSkill: "取消收藏此预设 — 将移回目录", heading: "技能", previewCount: "{count} 个技能", previewMore: "+还有 {count} 个", // 使用函数形式绕过 vue-i18n 的消息编译器,否则 `` // 会被当作 HTML 片段,每次挂载都会触发 // "Detected HTML in '…' message" 警告。 subheading: ({ named }: { named: (key: string) => unknown }) => `${named("count")} 个可用 · 点击查看 · "Run" 会以 / 的形式调用`, emptyWithPath: "未找到技能。请在 {path} 下添加技能文件夹。", emptySkillPath: "~/.claude/skills/", selectHint: "在左侧选择一个技能以查看其 SKILL.md。", loading: "加载中…", fieldDescription: "说明", fieldBody: "正文 (Markdown)", emptyBody: "(正文为空)", btnEdit: "编辑", btnDelete: "删除", btnUnstar: "取消收藏", errListFailed: "加载技能列表失败: {error}", errDetailFailed: "加载技能详情失败: {error}", errSaveFailed: "保存失败: {error}", errDeleteFailed: "删除失败", confirmDelete: '要删除技能 "{name}" 吗?将会移除 ~/mulmoclaude/.claude/skills/{name}/SKILL.md。', confirmUnstar: '将 "{name}" 移回目录? 它将不再被载入提示词,但目录中的副本会保留 — 你可以随时重新收藏它。', sectionActive: "活动", sectionCatalog: "目录", sectionLegendActive: "Claude 现在可以使用的技能。在对话过程中 Claude 会自动调用,你也可以输入技能名来调用。{system} 系统(自带 mc-) / {project} 项目(可编辑,仅此工作区) / {user} 用户(~/.claude/skills/ 中的技能)。", sectionLegendCatalog: "目录: 标记 {star} 后会成为活动的技能。从活动中取消 {star} 会回到目录 — Claude 将不再使用 (技能不会被删除)。", catalogEmpty: "没有可用的预设技能。", catalogPresetHeading: "预设", catalogStar: "收藏", catalogStarred: "已收藏", sourceUserTitle: "用户技能 (~/.claude/skills/,所有工作区通用)", sourceSystemTitle: "系统技能 (随附,mc- 前缀 — 只读,启动器启动时覆盖)", sourceProjectTitle: "项目技能 (工作区的 .claude/skills/,仅当前工作区可用)", sourcePresetTitle: "预设目录 — 点击收藏在当前工作区启用", errCatalogListFailed: "加载目录失败: {error}", errCatalogStarFailed: "收藏技能失败: {error}", errCatalogPreviewFailed: "加载技能预览失败: {error}", catalogAddRepo: "添加技能仓库", catalogAddRepoTitle: "添加技能仓库", catalogRepoUrlLabel: "GitHub URL", catalogRepoUrlPlaceholder: "https://github.com/owner/repo", catalogRepoSubpathLabel: "子路径(可选)", catalogRepoSubpathPlaceholder: "skills", catalogAddRepoSubmit: "安装", catalogAddRepoSuggestions: "推荐仓库", catalogUninstallRepo: "卸载仓库", catalogUpdateRepo: "更新仓库(重新获取最新)", catalogRepoOpenLink: "在 GitHub 打开仓库(新标签页)", catalogUninstallConfirm: "卸载此仓库?已加星的技能仍保留在活动列表中。", catalogRepoInstalling: "安装中…", catalogRepoEmpty: "此仓库中未找到技能。", sourceExternalTitle: "外部技能(从 GitHub 仓库安装 — 点击星标以激活)", errCatalogRepoListFailed: "加载已安装仓库失败:{error}", errCatalogRepoInstallFailed: "安装仓库失败:{error}", errCatalogRepoUninstallFailed: "卸载仓库失败:{error}", errCatalogRepoInvalidUrl: "请输入 GitHub 仓库 URL。", }, pluginManageRoles: { heading: "自定义角色", roleCount: "{count} 个角色", addButton: "+ 添加", createPanel: "创建新角色", fieldId: "ID", fieldName: "名称", fieldIcon: "图标", fieldPrompt: "提示词", fieldPlugins: "插件", fieldStarterQueries: "启动提问", onePerLine: "(每行一个)", helpLink: "?", idFormatted: "({id})", missingEnv: "(缺少 {env})", requiresEnv: "需要在 .env 中设置 {env}", collapse: "折叠", expand: "展开", idPlaceholder: "unique-id", creating: "创建中…", create: "创建", updating: "更新中…", update: "更新", cancel: "取消", delete: "删除", emptyHint: '还没有自定义角色。点击 "+ 添加" 或让 Claude 帮你创建一个。', errIdRequired: "ID 不能为空。", errIdInvalid: "ID 只能包含字母、数字、'-' 和 '_'。", errNameRequired: "名称不能为空。", errIdDuplicate: "已存在 ID 为 '{id}' 的角色。", errCreateFailed: "创建失败", errSaveFailed: "保存失败", errDeleteFailed: "删除失败", errNetworkError: "网络错误", errServerError: "服务器错误: {status}", errRefreshFailed: "已保存,但列表刷新失败。", confirmDelete: "删除角色「{name}」?此操作无法撤销。", }, pluginUiImage: { promptLabel: "{label}:", }, markdownMermaid: { loadFailed: "⚠ Mermaid 加载失败: {error}", renderFailed: "⚠ Mermaid 渲染失败: {error}", }, pluginTextResponse: { pdf: "PDF", pdfFailed: "⚠ PDF 失败", editContent: "编辑文本内容", applyChanges: "应用更改", copyLabel: "复制", speakerSystem: "系统", speakerUser: "你", speakerAssistant: "助手", copiedLabel: "已复制!", cancel: "取消", seededByPlugin: "来自 {pkg}", seededByPluginTooltip: "此消息由 {pkg} 插件生成,并非您发送。", truncatedForRender: "该消息异常长(共 {total} 个字符)。为保持标签页响应,仅渲染开头部分 — 隐藏了 {omitted} 个字符。使用复制按钮获取完整原文。", }, pluginSkill: { noDescription: "(无描述)", }, pluginSpreadsheet: { previewUntitled: "电子表格", previewSheets: "{count} 个工作表", untitled: "电子表格", excel: "Excel", valuePlaceholder: "值", valueOrFormulaPlaceholder: "值或公式(例如 100 或 SUM(B2:B11))", formatPlaceholder: "格式(例如 $#,##0.00)", loading: "正在加载电子表格...", noData: "没有可用的电子表格数据", editData: "编辑电子表格数据", applyChanges: "应用更改", dataMustBeArray: "数据必须是工作表数组", loadFailed: "加载电子表格失败: {error}", invalidJsonAlert: "无效的 JSON 格式: {error}", unknownError: "未知错误", update: "更新", stringType: "字符串", formulaType: "公式", }, app: { startConversation: "开始对话", thinking: "思考中…", }, suggestionsPanel: { suggestions: "建议", skills: "技能", tooltip: "建议和技能", emptySuggestions: "没有建议。", emptySkills: "未安装任何技能。", skillsError: "加载技能失败:{error}", sendEditHint: "点击发送 · shift+点击可编辑", }, settingsToolsTab: { // 通过 以命名插槽 `allowedTools` 和 `claudeMcp` 渲染, // 以便保留 `` 标签的样式,同时文本可本地化。 explanation: "要通过 {allowedTools} 传递给 Claude 的额外工具名。每行一个。适用于在 {claudeMcp} 完成授权后,调用 Claude Code 内置的 MCP 服务器(如 Gmail / Google 日历)。", connectorsSectionTitle: "已连接的连接器", connectorsEmpty: "未找到连接器。", connectorConnected: "已连接", connectorDisconnected: "未连接", connectorsGuide: "Slack、Gmail 等连接器让 Claude 可以访问您的账户。请在 Claude Desktop 中添加或移除连接器,也可以在{configLink}进行配置。(将打开 claude.ai)", connectorsConfigLinkText: "此处", }, confirmModal: { defaultTitle: "确认", defaultConfirm: "确定", defaultCancel: "取消", }, }; export default zhMessages;