diff --git a/src/lib/i18n/i18n.svelte.ts b/src/lib/i18n/i18n.svelte.ts index 3fac7d3..0a10db0 100644 --- a/src/lib/i18n/i18n.svelte.ts +++ b/src/lib/i18n/i18n.svelte.ts @@ -1,15 +1,18 @@ import { en } from './locales/en'; import { zhTW } from './locales/zh-TW'; +import { zhCN } from './locales/zh-CN'; import type { Locale, LocaleInfo, TranslationKey, Translations } from './types'; const locales: Record = { en, - 'zh-TW': zhTW + 'zh-TW': zhTW, + 'zh-CN': zhCN }; const localeInfos: LocaleInfo[] = [ { code: 'en', label: 'EN' }, - { code: 'zh-TW', label: '中文' } + { code: 'zh-CN', label: '简' }, + { code: 'zh-TW', label: '繁' } ]; function detectLocale(): Locale { diff --git a/src/lib/i18n/locales/zh-CN.ts b/src/lib/i18n/locales/zh-CN.ts new file mode 100644 index 0000000..d43bf34 --- /dev/null +++ b/src/lib/i18n/locales/zh-CN.ts @@ -0,0 +1,728 @@ +import type { Translations } from '../types'; + +// Simplified Chinese (zh-CN) translations. +// Initial translation by mechanical conversion from zh-TW with TW→CN vocabulary +// adjustments (项目 vs 專案, 设置 vs 設定, 文件 vs 檔案, 加载 vs 載入, 刷新 vs +// 重新整理, 默认 vs 預設, 软件 vs 軟體, 视频 vs 影片, etc.). Native zh-CN +// speakers are encouraged to open PRs for any awkward phrasing. +export const zhCN: Translations = { + // ── 侧边栏 ────────────────────────────────────────── + 'nav.core': '核心', + 'nav.tools': '工具', + 'nav.configure': '配置', + 'nav.insights': '洞察', + 'nav.dashboard': '仪表板', + 'nav.projects': '项目', + 'nav.mcps': 'MCPs', + 'nav.agents': '代理', + 'nav.teams': '团队', + 'nav.skills': '技能', + 'nav.commands': '命令', + 'nav.hooks': '钩子', + 'nav.profiles': '配置文件', + 'nav.statusLine': '状态栏', + 'nav.permissions': '权限', + 'nav.memory': '记忆', + 'nav.marketplace': '市场', + 'nav.analytics': '分析', + 'nav.sessions': '会话', + 'nav.comparison': '对比', + 'nav.settings': '设置', + + // ── 应用品牌 ───────────────────────────────────── + 'app.name': 'Claude Code', + 'app.tagline': '工具管理器', + + // ── 顶部栏 ─────────────────────────────────────────── + 'header.refresh': '刷新数据', + 'header.toggleTheme': '切换主题', + 'header.switchLanguage': '切换语言', + + // ── 常用操作 ─────────────────────────────────────── + 'common.confirm': '确认', + 'common.cancel': '取消', + 'common.save': '保存', + 'common.delete': '删除', + 'common.edit': '编辑', + 'common.add': '添加', + 'common.close': '关闭', + 'common.search': '搜索', + 'common.enabled': '已启用', + 'common.disabled': '已禁用', + 'common.remove': '移除', + 'common.duplicate': '复制', + 'common.enable': '启用', + 'common.disable': '禁用', + 'common.refresh': '刷新', + 'common.refreshing': '刷新中…', + 'common.loading': '加载中...', + 'common.test': '测试', + 'common.import': '导入', + 'common.export': '导出', + 'common.preview': '预览', + 'common.discard': '放弃', + 'common.viewAll': '查看全部', + 'common.name': '名称', + 'common.description': '描述', + 'common.tags': '标签', + 'common.file': '文件', + 'common.paste': '粘贴', + 'common.auto': '自动', + 'common.system': '系统', + 'common.default': '默认', + 'common.noProject': '无项目', + + // ── 页面标题与副标题 ────────────────────────────────── + 'page.dashboard.title': '仪表板', + 'page.dashboard.subtitle': 'Claude Code 配置总览', + 'page.projects.title': '项目', + 'page.projects.subtitle': '管理项目的 MCP 分配', + 'page.library.title': 'MCP 库', + 'page.library.subtitle': '所有 MCP 服务器集中管理 — 拖拽至项目或全局配置', + 'page.subagents.title': '子代理库', + 'page.subagents.subtitle': '自定义子代理 — 拖拽至项目或全局配置', + 'page.skills.title': '技能', + 'page.skills.subtitle': 'Claude 根据上下文自动调用的代理技能', + 'page.commands.title': '命令', + 'page.commands.subtitle': '使用 /name 调用的斜杠命令', + 'page.hooks.title': '钩子库', + 'page.hooks.subtitle': '事件驱动自动化 — 在 Claude Code 事件上执行命令或注入提示', + 'page.profiles.title': '配置文件', + 'page.profiles.subtitle': '保存和切换不同的全局工具组合', + 'page.statusline.title': '状态栏', + 'page.statusline.subtitle': '自定义 Claude Code 终端底部的实时信息栏', + 'page.permissions.title': '权限', + 'page.permissions.subtitle': '管理 Claude Code 权限规则 — 控制 Claude 可以使用的工具', + 'page.memory.title': '记忆文件', + 'page.memory.subtitle': '管理 CLAUDE.md 记忆文件 — 启动时加载的持久指令', + 'page.marketplace.title': '市场', + 'page.marketplace.subtitle': '浏览并导入公开仓库中的技能与代理', + 'page.analytics.title': '使用分析', + 'page.analytics.subtitle': '可视化你的 Claude Code 使用模式', + 'page.insights.title': '洞察', + 'page.insights.subtitle': '会话质量、摩擦分析与 Claude 的洞察报告', + 'page.sessions.title': '会话浏览器', + 'page.sessions.subtitle': '按项目浏览单个 Claude Code 会话', + 'page.comparison.title': '跨项目对比', + 'page.comparison.subtitle': '并排对比各项目的使用指标', + 'page.settings.title': '设置', + 'page.settings.subtitle': '配置 Claude Code', + + // ── 仪表板 ──────────────────────────────────────── + 'dashboard.overview': '总览', + 'dashboard.quickActions': '快捷操作', + 'dashboard.globalConfig': '全局配置', + 'dashboard.global': '全局', + 'dashboard.projects': '项目', + 'dashboard.mcps': 'MCPs', + 'dashboard.subagents': '子代理', + 'dashboard.commands': '命令', + 'dashboard.skills': '技能', + 'dashboard.hooks': '钩子', + 'dashboard.profiles': '配置文件', + 'dashboard.statusLine': '状态栏', + 'dashboard.activeProfile': '使用中:{name}', + 'dashboard.noneActive': '未启用', + 'dashboard.addMcp': '添加 MCP', + 'dashboard.addMcpDesc': '添加 MCP 服务器到库', + 'dashboard.manageProjects': '管理项目', + 'dashboard.manageProjectsDesc': '配置项目的 MCPs', + 'dashboard.browseMarketplace': '浏览市场', + 'dashboard.browseMarketplaceDesc': '探索社区 MCPs 和工具', + 'dashboard.settings': '设置', + 'dashboard.settingsDesc': '配置应用程序', + 'dashboard.globalMcps': '全局 MCPs', + 'dashboard.mcpServers': 'MCP 服务器', + 'dashboard.globalSubagents': '全局子代理', + 'dashboard.customAgents': '自定义代理', + 'dashboard.globalCommands': '全局命令', + 'dashboard.slashCommands': '斜杠命令', + 'dashboard.globalHooks': '全局钩子', + 'dashboard.eventHooks': '事件钩子', + + // ── MCP 库 ────────────────────────────────────── + 'mcp.addMcp': '添加 MCP', + 'mcp.addNew': '添加 MCP', + 'mcp.editMcp': '编辑 MCP', + 'mcp.deleteMcp': '删除 MCP', + 'mcp.deleteConfirm': '确定要删除「{name}」吗?这将从所有项目中移除。', + 'mcp.created': 'MCP 创建成功', + 'mcp.createFailed': '无法创建 MCP', + 'mcp.updated': 'MCP 更新成功', + 'mcp.updateFailed': '无法更新 MCP', + 'mcp.deleted': 'MCP 已删除', + 'mcp.deleteFailed': '无法删除 MCP', + 'mcp.duplicated': 'MCP 已复制', + 'mcp.duplicateFailed': '无法复制 MCP', + 'mcp.addedToGateway': '已将「{name}」添加至 Gateway', + 'mcp.removedFromGateway': '已将「{name}」从 Gateway 移除', + 'mcp.addToGatewayFailed': '无法添加至 Gateway', + 'mcp.removeFromGatewayFailed': '无法从 Gateway 移除', + 'mcp.gateway': 'Gateway', + 'mcp.inGateway': '已在 Gateway', + 'mcp.addToGateway': '添加至 Gateway', + 'mcp.removeFromGateway': '从 Gateway 移除', + + // ── MCP 卡片 ───────────────────────────────────────── + 'mcp.addToFavorites': '加入收藏', + 'mcp.removeFromFavorites': '取消收藏', + + // ── 项目 ───────────────────────────────────────── + 'project.removeProject': '移除项目', + 'project.removeConfirm': '确定要移除「{name}」吗?这不会删除任何文件。', + 'project.added': '项目已添加', + 'project.addFailed': '无法添加项目', + 'project.removed': '项目已移除', + 'project.removeFailed': '无法移除项目', + 'project.notFound': '找不到项目', + 'project.backToProjects': '返回项目列表', + + // ── 子代理 ─────────────────────────────────────── + 'subagent.addAgent': '添加子代理', + 'subagent.addNew': '添加子代理', + 'subagent.editAgent': '编辑子代理', + 'subagent.deleteAgent': '删除子代理', + 'subagent.deleteConfirm': '确定要删除「{name}」吗?这将从所有项目中移除。', + 'subagent.created': '子代理创建成功', + 'subagent.createFailed': '无法创建子代理', + 'subagent.updated': '子代理更新成功', + 'subagent.updateFailed': '无法更新子代理', + 'subagent.deleted': '子代理已删除', + 'subagent.deleteFailed': '无法删除子代理', + + // ── 技能 ─────────────────────────────────────────── + 'skill.addSkill': '添加技能', + 'skill.addNew': '添加技能', + 'skill.editSkill': '编辑技能', + 'skill.deleteSkill': '删除技能', + 'skill.deleteConfirm': '确定要删除「{name}」吗?这将从所有项目中移除。', + 'skill.created': '技能创建成功', + 'skill.createFailed': '无法创建技能', + 'skill.updated': '技能更新成功', + 'skill.updateFailed': '无法更新技能', + 'skill.deleted': '技能已删除', + 'skill.deleteFailed': '无法删除技能', + 'skill.details': '详细信息', + 'skill.files': '文件', + 'skill.manualOnly': '仅手动', + + // ── 命令 ───────────────────────────────────────── + 'command.addCommand': '添加命令', + 'command.addNew': '添加命令', + 'command.editCommand': '编辑命令', + 'command.deleteCommand': '删除命令', + 'command.deleteConfirm': '确定要删除「/{name}」吗?这将从所有项目中移除。', + 'command.created': '命令创建成功', + 'command.createFailed': '无法创建命令', + 'command.updated': '命令更新成功', + 'command.updateFailed': '无法更新命令', + 'command.deleted': '命令已删除', + 'command.deleteFailed': '无法删除命令', + + // ── 钩子 ──────────────────────────────────────── + 'hook.addHook': '添加钩子', + 'hook.addNew': '添加钩子', + 'hook.editHook': '编辑钩子', + 'hook.deleteHook': '删除钩子', + 'hook.deleteConfirm': '确定要删除「{name}」吗?这将从所有项目和全局配置中移除。', + 'hook.created': '钩子创建成功', + 'hook.createFailed': '无法创建钩子', + 'hook.updated': '钩子更新成功', + 'hook.updateFailed': '无法更新钩子', + 'hook.deleted': '钩子已删除', + 'hook.deleteFailed': '无法删除钩子', + 'hook.duplicated': '钩子已复制', + 'hook.duplicateFailed': '无法复制钩子', + 'hook.soundNotifications': '声音通知', + 'hook.manageSounds': '管理声音', + 'hook.command': '命令', + 'hook.prompt': '提示', + 'hook.template': '模板', + + // ── 钩子事件 ────────────────────────────────────── + 'hook.event.sessionStart': '会话开始', + 'hook.event.userPromptSubmit': '用户提示提交', + 'hook.event.preToolUse': '工具使用前', + 'hook.event.postToolUse': '工具使用后', + 'hook.event.notification': '通知', + 'hook.event.stop': '停止', + 'hook.event.subagentStop': '子代理停止', + 'hook.event.sessionEnd': '会话结束', + 'hook.event.allEvents': '所有事件', + 'hook.event.all': '全部', + 'hook.event.byScope': '按范围', + + // ── 钩子库 ───────────────────────────────────── + 'hook.searchPlaceholder': '搜索钩子...', + 'hook.noMatching': '没有匹配的钩子', + 'hook.tryAdjusting': '请调整筛选条件', + 'hook.noHooks': '库中没有钩子', + 'hook.addFirst': '添加第一个钩子来自动化 Claude Code 操作', + 'hook.noAssigned': '没有已分配的钩子', + 'hook.createAndAssign': '创建钩子并分配至全局或项目范围', + 'hook.globalHooks': '全局钩子', + 'hook.projectHooks': '项目钩子', + 'hook.unassigned': '未分配', + + // ── 钩子表单 ──────────────────────────────────────── + 'hookForm.importTitle': '从 JSON 或模板导入', + 'hookForm.importDesc': '粘贴 settings.json 或选择模板', + 'hookForm.templates': '模板...', + 'hookForm.descPlaceholder': '此钩子的功能', + 'hookForm.eventType': '事件类型', + 'hookForm.matcherPattern': '匹配模式', + 'hookForm.matcherPlaceholder': '可选的匹配模式', + 'hookForm.matcherHelp': '可选的正则表达式模式,用于筛选钩子执行时机', + 'hookForm.matcherHelpAlt': '使用 `|` 分隔多个选项。', + 'hookForm.hookType': '钩子类型', + 'hookForm.commandLabel': '命令', + 'hookForm.commandDesc': '执行 shell 命令', + 'hookForm.promptLabel': '提示', + 'hookForm.promptDesc': '将文本注入对话', + 'hookForm.commandPlaceholder': 'npx prettier --write "$CLAUDE_FILE_PATHS"', + 'hookForm.timeout': '超时(秒)', + 'hookForm.timeoutHelp': '命令执行的最长时间', + 'hookForm.promptTextLabel': '提示文本', + 'hookForm.promptPlaceholder': '要注入的额外说明或指令...', + 'hookForm.promptHelp': '当钩子触发时注入对话的文本', + 'hookForm.tagsPlaceholder': '格式化、安全、日志', + 'hookForm.tagsHelp': '以逗号分隔的标签', + 'hookForm.updateHook': '更新钩子', + 'hookForm.createHook': '创建钩子', + 'hookForm.commandRequired': '命令类型钩子需要指定命令', + 'hookForm.promptRequired': '提示类型钩子需要指定提示', + 'hookForm.timeoutPositive': '超时必须是正数', + 'hookForm.appliedTemplate': '已应用模板「{name}」', + 'hookForm.importedJson': '已从 JSON 导入', + 'hookForm.parseError': '无法解析为钩子 JSON', + 'hookForm.clipboardError': '无法访问剪贴板', + 'hookForm.importedFile': '已从文件导入', + 'hookForm.fileParseError': '无法将文件解析为钩子 JSON', + 'hookForm.fileReadError': '无法读取文件', + + // ── 命令表单 ───────────────────────────────────── + 'commandForm.importTitle': '从 Markdown 导入', + 'commandForm.importDesc': '粘贴或导入含 YAML 前置数据的 `.md` 文件', + 'commandForm.namePlaceholder': 'my-command', + 'commandForm.nameHelp': '仅限小写字母、数字和连字符(最多 {max} 字符)', + 'commandForm.namePreview': '这将创建命令 `/{name}`', + 'commandForm.descPlaceholder': '简述此命令的功能', + 'commandForm.descHelp': '显示在命令提示中(最多 {max} 字符)', + 'commandForm.allowedTools': '允许的工具', + 'commandForm.allowedToolsPlaceholder': 'Read, Edit, Bash(git:*), Glob, Grep', + 'commandForm.allowedToolsHelp': '以逗号分隔的工具列表。使用 `*` 表示所有工具。支持如 `Bash(git:*)` 的模式', + 'commandForm.argumentHint': '参数提示', + 'commandForm.argumentHintPlaceholder': '[file] [--verbose] [--dry-run]', + 'commandForm.argumentHintHelp': '显示预期的参数格式。在内容中使用 `$ARGUMENTS` 接收参数。', + 'commandForm.modelOverride': '模型覆盖', + 'commandForm.modelDefault': '默认(继承会话设置)', + 'commandForm.modelOpus': 'Opus(最强大)', + 'commandForm.modelSonnet': 'Sonnet(均衡)', + 'commandForm.modelHaiku': 'Haiku(快速高效)', + 'commandForm.modelHelp': '可选择强制使用特定模型执行此命令', + 'commandForm.commandPrompt': '命令提示', + 'commandForm.commandPromptHelp': '使用 `$ARGUMENTS` 包含用户提供的参数', + 'commandForm.tagsPlaceholder': '工具、git、部署', + 'commandForm.tagsHelp': '以逗号分隔的标签', + 'commandForm.updateCommand': '更新命令', + 'commandForm.createCommand': '创建命令', + 'commandForm.nameRequired': '名称为必填', + 'commandForm.nameTooLong': '名称不得超过 {max} 字符', + 'commandForm.nameInvalid': '名称仅允许小写字母、数字和连字符', + 'commandForm.nameNoXml': '名称不得包含 XML 标签(< 或 >)', + 'commandForm.nameReserved': '名称不得包含保留字', + 'commandForm.contentRequired': '内容为必填', + 'commandForm.descTooLong': '描述不得超过 {max} 字符', + 'commandForm.descNoXml': '描述不得包含 XML 标签(< 或 >)', + 'commandForm.contentWarning': '内容有 {lines} 行,超过建议的 {max} 行。', + 'commandForm.imported': '已导入「{name}」', + 'commandForm.contentImported': '已导入内容', + 'commandForm.clipboardParseError': '无法解析剪贴板内容', + 'commandForm.clipboardError': '无法访问剪贴板', + 'commandForm.fileParseError': '无法解析文件', + 'commandForm.fileReadError': '无法读取文件', + + // ── 命令库 ────────────────────────────────────── + 'commandLib.searchPlaceholder': '搜索命令...', + 'commandLib.noMatching': '没有匹配的命令', + 'commandLib.tryAdjusting': '请调整搜索条件', + 'commandLib.noCommands': '库中没有命令', + 'commandLib.addFirst': '添加第一个斜杠命令来开始', + + // ── 技能表单 ─────────────────────────────────────── + 'skillForm.importTitle': '从 Markdown 导入', + 'skillForm.importDesc': '粘贴或导入含 YAML 前置数据的 `.md` 文件', + 'skillForm.namePlaceholder': 'my-skill', + 'skillForm.nameHelp': '仅限小写字母、数字和连字符', + 'skillForm.namePreview': '将保存至 `.claude/skills/{name}/SKILL.md`', + 'skillForm.descPlaceholder': 'Claude 应在何时调用此技能', + 'skillForm.descHelp': 'Claude 根据此描述决定何时调用技能(最多 {max} 字符)', + 'skillForm.disableInvocation': '禁用模型调用', + 'skillForm.disableInvocationHelp': '防止 Claude 自动调用此技能。适用于仅应由其他技能调用的技能。', + 'skillForm.skillInstructions': '技能指令', + 'skillForm.tagsPlaceholder': '代码审查、测试、文档', + 'skillForm.updateSkill': '更新技能', + 'skillForm.createSkill': '创建技能', + + // ── 技能库 ──────────────────────────────────── + 'skillLib.searchPlaceholder': '搜索技能...', + 'skillLib.noMatching': '没有匹配的技能', + 'skillLib.tryAdjusting': '请调整搜索条件', + 'skillLib.noSkills': '库中没有技能', + 'skillLib.addFirst': '添加第一个代理技能来开始', + + // ── 配置文件 ───────────────────────────────────────── + 'profile.createProfile': '创建配置文件', + 'profile.editProfile': '编辑配置文件', + 'profile.deleteProfile': '删除配置文件', + 'profile.deleteConfirm': '确定要删除「{name}」吗?此操作无法撤销。', + 'profile.created': '配置文件已创建', + 'profile.createFailed': '无法创建配置文件', + 'profile.updated': '配置文件已更新', + 'profile.updateFailed': '无法更新配置文件', + 'profile.deleted': '配置文件已删除', + 'profile.deleteFailed': '无法删除配置文件', + 'profile.activated': '已启用配置文件「{name}」', + 'profile.activateFailed': '无法启用配置文件', + 'profile.deactivated': '配置文件已停用', + 'profile.deactivateFailed': '无法停用配置文件', + 'profile.captured': '已将当前配置捕获至「{name}」', + 'profile.captureFailed': '无法捕获配置', + + // ── 状态栏 ────────────────────────────────────── + 'statusline.myStatusLines': '我的状态栏', + 'statusline.builder': '构建器', + 'statusline.gallery': '示例库', + 'statusline.addRawCommand': '添加原始命令', + 'statusline.addRaw': '添加原始状态栏', + 'statusline.editStatusLine': '编辑状态栏', + 'statusline.deleteStatusLine': '删除状态栏', + 'statusline.deleteConfirm': '确定要删除「{name}」吗?此操作无法撤销。', + 'statusline.activated': '已启用状态栏「{name}」', + 'statusline.activateFailed': '无法启用状态栏', + 'statusline.deactivated': '状态栏已停用', + 'statusline.deactivateFailed': '无法停用状态栏', + 'statusline.deleted': '状态栏已删除', + 'statusline.deleteFailed': '无法删除状态栏', + 'statusline.saved': '状态栏已保存', + 'statusline.created': '状态栏已创建', + 'statusline.createFailed': '无法创建状态栏', + 'statusline.updated': '状态栏已更新', + 'statusline.updateFailed': '无法更新状态栏', + 'statusline.savedAndActivated': '状态栏「{name}」已保存并启用', + 'statusline.saveActivateFailed': '无法保存并启用状态栏', + 'statusline.saveFailed': '无法保存状态栏', + 'statusline.addedToLibrary': '「{name}」已添加至库', + 'statusline.installFailed': '无法安装状态栏', + + // ── 权限 ────────────────────────────────────── + 'permissions.templates': '模板', + 'permissions.mergedView': '合并视图', + 'permissions.refreshTitle': '从配置文件刷新', + 'permissions.filterPlaceholder': '筛选规则...', + 'permissions.selectScope': '选择范围以查看权限', + 'permissions.ruleAdded': '规则已添加至 {category}', + 'permissions.addFailed': '无法添加规则', + 'permissions.ruleRemoved': '规则已移除', + 'permissions.removeFailed': '无法移除规则', + 'permissions.reorderFailed': '无法重新排序规则', + 'permissions.templateApplied': '已应用模板:{name}', + 'permissions.templateFailed': '无法应用模板', + 'permissions.modeUpdated': '默认模式已更新', + 'permissions.modeFailed': '无法更新默认模式', + 'permissions.dirsUpdated': '附加目录已更新', + 'permissions.dirsFailed': '无法更新目录', + 'permissions.refreshed': '权限已刷新', + + // ── 记忆 ─────────────────────────────────────────── + 'memory.refreshTitle': '从磁盘刷新', + 'memory.hidePreview': '隐藏预览', + 'memory.showPreview': '显示预览', + 'memory.unsavedChanges': '未保存的更改', + 'memory.deleteFile': '删除文件', + 'memory.selectScope': '选择范围以查看记忆文件', + 'memory.noFile': '找不到记忆文件', + 'memory.createGlobal': '创建全局 CLAUDE.md 文件,包含适用于所有项目的指令。', + 'memory.createProject': '创建项目 CLAUDE.md 文件,包含与团队共享的指令。', + 'memory.createLocal': '创建本地 CLAUDE.local.md 文件,用于个人覆盖(不提交至 git)。', + 'memory.createFile': '创建文件', + 'memory.saved': '记忆文件已保存', + 'memory.saveFailed': '无法保存记忆文件', + 'memory.created': '记忆文件已创建', + 'memory.createFailed': '无法创建记忆文件', + 'memory.deleted': '记忆文件已删除', + 'memory.deleteFailed': '无法删除记忆文件', + 'memory.discarded': '更改已放弃', + 'memory.refreshed': '记忆文件已刷新', + 'memory.deleteConfirmTitle': '删除记忆文件', + 'memory.deleteConfirm': '确定要删除此记忆文件吗?此操作无法撤销。', + 'memory.unsavedTitle': '未保存的更改', + 'memory.unsavedConfirm': '你有未保存的更改。切换范围将放弃这些更改。是否继续?', + 'memory.discardSwitch': '放弃并切换', + + // ── 市场 ────────────────────────────────────── + 'marketplace.syncing': '同步中...', + 'marketplace.syncAll': '全部同步', + 'marketplace.authenticated': '已验证', + 'marketplace.unauthenticated': '未验证', + 'marketplace.apiRateInfo': 'GitHub API:剩余 {remaining} / {limit} 次请求', + 'marketplace.resetsAt': '重置于 {time}', + 'marketplace.addToken': '添加令牌以获得 5,000 次/小时', + 'marketplace.searchPlaceholder': '搜索 MCP 服务器(例如 filesystem、github、slack...)', + 'marketplace.recentlyUpdated': '最近更新', + 'marketplace.nameAZ': '名称(A-Z)', + 'marketplace.searching': '搜索中...', + 'marketplace.loadingMcps': '从注册表加载 MCPs...', + 'marketplace.noMcpsFound': '找不到 MCPs', + 'marketplace.noMcpsHint': '尝试搜索 MCP 服务器或等待注册表加载', + 'marketplace.clickToPreview': '点击预览', + 'marketplace.loadMore': '加载更多', + 'marketplace.resetDefaults': '重置为默认', + 'marketplace.addRepository': '添加仓库', + 'marketplace.noRepos': '未配置仓库', + 'marketplace.addRepoHint': '添加仓库开始浏览', + 'marketplace.files': '文件', + 'marketplace.readme': 'README', + 'marketplace.lastSynced': '上次同步:{date}', + 'marketplace.syncRepo': '同步仓库', + 'marketplace.openInGithub': '在 GitHub 中打开', + 'marketplace.removeRepo': '移除仓库', + 'marketplace.noItemsFound': '找不到{type}', + 'marketplace.syncToDiscover': '同步仓库以探索项目', + 'marketplace.imported': '已导入', + 'marketplace.repos': '仓库', + + // ── 市场弹出窗口 ─────────────────────────────── + 'marketplace.githubUrl': 'GitHub 网址', + 'marketplace.urlPlaceholder': 'https://github.com/owner/repo', + 'marketplace.repoType': '仓库类型', + 'marketplace.readmeBased': '基于 README(解析 README 中的链接)', + 'marketplace.fileBased': '基于文件(扫描 .md 文件)', + 'marketplace.contentType': '内容类型', + 'marketplace.mixed': '混合(技能与代理)', + 'marketplace.skillsOnly': '仅技能', + 'marketplace.agentsOnly': '仅代理', + 'marketplace.contentPreview': '内容预览', + 'marketplace.metadata': '元数据', + 'marketplace.filePath': '文件路径', + 'marketplace.source': '来源', + 'marketplace.alreadyImported': '已导入', + 'marketplace.configuration': '配置', + 'marketplace.commandLabel': '命令:', + 'marketplace.arguments': '参数:', + 'marketplace.urlLabel': '网址:', + 'marketplace.envVars': '环境变量', + 'marketplace.envVarsHint': '(导入后需要进行配置)', + 'marketplace.required': '必填', + 'marketplace.sourceRepo': '源仓库', + 'marketplace.importing': '导入中...', + 'marketplace.importToLibrary': '导入至库', + + // ── 市场通知 ──────────────────────────────── + 'marketplace.repoAdded': '仓库已添加', + 'marketplace.repoRemoved': '仓库已移除', + 'marketplace.toggleFailed': '无法切换仓库', + 'marketplace.itemImported': '已导入 {name}', + 'marketplace.alreadyImportedMsg': '已导入', + 'marketplace.importFailed': '无法导入项目', + 'marketplace.resetDone': '仓库已重置为默认', + 'marketplace.resetFailed': '无法重置仓库', + 'marketplace.mcpImported': '已将 {name} 导入至 MCP 库', + 'marketplace.syncResult': '添加 {added}、更新 {updated} 个项目', + 'marketplace.syncErrors': '同步完成,有 {count} 个错误', + 'marketplace.syncFailed': '无法同步仓库', + 'marketplace.syncRepoFailed': '无法同步仓库', + + // ── 分析报表 ──────────────────────────────────────── + 'analytics.noData': '找不到使用数据', + 'analytics.storedIn': 'Claude Code 将分析数据存储在', + 'analytics.useClaudeCode': '使用 Claude Code 产生使用数据,然后刷新此页面。', + 'analytics.refreshTitle': '刷新分析', + + // ── 洞察 ───────────────────────────────────── + 'insights.noReport': '找不到洞察报告', + 'insights.runCommand': '执行', + 'insights.inClaudeCode': '在 Claude Code 中生成报告。', + 'insights.noSessionData': '找不到会话质量数据', + 'insights.facetsStoredIn': '会话面向存储在', + 'insights.useClaudeCode': '使用 Claude Code 产生会话数据,然后刷新此页面。', + + // ── 会话 ───────────────────────────────────────── + 'sessions.noData': '找不到会话数据', + 'sessions.storedIn': 'Claude Code 将会话存储在', + 'sessions.useClaudeCode': '使用 Claude Code 创建会话,然后刷新此页面。', + 'sessions.noSessions': '此项目中找不到会话', + 'sessions.selectProject': '选择项目以查看工具使用情况', + 'sessions.refreshTitle': '刷新会话', + + // ── 对比 ─────────────────────────────────────── + 'comparison.noProjects': '找不到项目', + 'comparison.useClaudeCode': '使用 Claude Code 产生会话数据,然后刷新此页面。', + 'comparison.selectProjects': '请选择至少 2 个项目进行对比', + 'comparison.selectHint': '选择 2-5 个项目以查看并排指标', + + // ── 设置 ───────────────────────────────────────── + 'settings.configuration': '配置', + 'settings.other': '其他', + 'settings.tab.models': '配置模型默认值、输出行为和 git 署名', + 'settings.tab.security': '配置 bash 命令隔离、网络访问和安全设置', + 'settings.tab.plugins': '管理已启用的插件和自定义市场来源', + 'settings.tab.env': '配置 Claude Code 运行环境变量', + 'settings.tab.preferences': '控制 Claude Code 的视觉和交互偏好', + 'settings.tab.mentions': '配置自定义 @ 文件自动补全建议', + 'settings.tab.advanced': '配置会话清理、更新、队友模式和计划', + 'settings.tab.credentials': '配置提供验证凭证和 API 密钥的脚本', + 'settings.tab.approvedMcps': '控制哪些项目级 MCP 服务器自动核准', + 'settings.tab.keybindings': '自定义 Claude Code 的快捷键', + 'settings.tab.spinnerVerbs': '自定义 Claude Code 加载动画中显示的动作词', + 'settings.tab.managed': '查看 IT 管理员部署的企业管理设置', + 'settings.tab.system': '配置编辑器、服务器、令牌、路径和备份', + + // ── 全局配置组件 ──────────────────────────── + 'global.title': '全局配置', + 'global.subtitle': '所有项目都可使用', + 'global.addMcp': '添加 MCP', + 'global.addCommand': '添加命令', + 'global.addSkill': '添加技能', + 'global.addAgent': '添加代理', + 'global.sync': '同步', + 'global.tabMcps': 'MCPs', + 'global.tabCommands': '命令', + 'global.tabSkills': '技能', + 'global.tabAgents': '代理', + 'global.noMcps': '没有全局 MCPs', + 'global.noCommands': '没有全局命令', + 'global.noSkills': '没有全局技能', + 'global.noAgents': '没有全局代理', + 'global.addMcpsHint': '添加 MCPs 使其在所有项目中可用', + 'global.addCommandsHint': '添加命令使其在所有项目中可用', + 'global.addSkillsHint': '添加技能使其在所有项目中可用', + 'global.addAgentsHint': '添加代理使其在所有项目中可用', + 'global.allMcpsAdded': '所有 MCPs 已在全局配置中', + 'global.allCommandsAdded': '所有命令已在全局配置中', + 'global.allSkillsAdded': '所有技能已在全局配置中', + 'global.allAgentsAdded': '所有代理已在全局配置中', + 'global.addedMcp': '已将 {name} 添加至全局配置', + 'global.addMcpFailed': '无法添加 MCP', + 'global.removedMcp': '已从全局配置移除 {name}', + 'global.removeMcpFailed': '无法移除 MCP', + 'global.toggleMcpFailed': '无法切换 MCP', + 'global.addedCommand': '已将 {name} 添加至全局配置', + 'global.addCommandFailed': '无法添加命令', + 'global.removedCommand': '已从全局配置移除 {name}', + 'global.removeCommandFailed': '无法移除命令', + 'global.toggleCommandFailed': '无法切换命令', + 'global.addedSkill': '已将 {name} 添加至全局配置', + 'global.addSkillFailed': '无法添加技能', + 'global.removedSkill': '已从全局配置移除 {name}', + 'global.removeSkillFailed': '无法移除技能', + 'global.toggleSkillFailed': '无法切换技能', + 'global.addedAgent': '已将 {name} 添加至全局配置', + 'global.addAgentFailed': '无法添加代理', + 'global.removedAgent': '已从全局配置移除 {name}', + 'global.removeAgentFailed': '无法移除代理', + 'global.toggleAgentFailed': '无法切换代理', + 'global.synced': '全局配置已同步', + 'global.syncFailed': '无法同步配置', + 'global.debugMode': '调试模式', + 'global.debugDesc': '启用日志以协助排除问题', + 'global.logLocation': '日志文件位置:', + 'global.noLogFile': '无使用中的日志文件', + 'global.openFolder': '打开文件夹', + 'global.debugActive': '调试模式已启用。日志正在写入上述文件。报告问题时请分享此文件。', + 'global.enableDebug': '启用调试模式', + 'global.disableDebug': '禁用调试模式', + + // ── Claude JSON 视图 ───────────────────────────────── + 'claudeJson.title': 'Claude.json 配置', + 'claudeJson.subtitle': '直接在 ~/.claude.json 中配置的 MCPs', + 'claudeJson.globalMcps': '全局 MCPs', + 'claudeJson.projectMcps': '项目 MCPs', + 'claudeJson.noMcps': 'claude.json 中没有 MCPs', + 'claudeJson.noMcpsHint': '通过 Claude Code 配置的 MCPs 将在此显示', + 'claudeJson.toggled': '{name} {state}', + 'claudeJson.toggleFailed': '无法切换 MCP', + 'claudeJson.removed': '已移除 {name}', + 'claudeJson.removeFailed': '无法移除 MCP', + + // ── 共享组件 ──────────────────────────────── + 'update.available': '有可用更新', + 'update.readyToDownload': '版本 {version} 已可下载。', + 'update.download': '下载', + 'update.later': '稍后', + 'update.downloading': '正在下载更新...', + 'update.ready': '更新就绪', + 'update.restartMsg': '重新启动应用程序以应用更新。', + 'update.restartNow': '立即重启', + 'update.error': '更新错误', + 'update.dismiss': '关闭', + + 'whatsNew.title': '最新动态', + 'whatsNew.version': '版本 {version}', + 'whatsNew.released': '发布于 {date}', + 'whatsNew.noNotes': '没有可用的版本说明。', + 'whatsNew.viewOnGithub': '在 GitHub 上查看', + 'whatsNew.gotIt': '了解', + + 'envEditor.variableName': '变量名', + 'envEditor.value': '值', + 'envEditor.addVariable': '添加变量', + + 'search.placeholder': '搜索...', + + // ── JSON Schema 表单 ───────────────────────────────── + 'jsonSchema.select': '选择...', + 'jsonSchema.noParams': '此工具不需要参数', + 'jsonSchema.argsJson': '参数(JSON)', + + // ── 使用量小组件 ───────────────────────────────────── + 'usage.title': '使用量', + 'usage.projects': '项目', + 'usage.sessions': '会话', + 'usage.cost': '费用', + 'usage.tokensAcross': '所有项目的 tokens', + + // ── 全局调试通知 ─────────────────────── + 'global.debugDisabled': '调试模式已禁用', + 'global.debugEnabled': '调试模式已启用', + 'global.debugToggleFailed': '无法切换调试模式', + 'global.openFolderFailed': '无法打开日志文件夹', + + // ── 子代理表单 ─────────────────────────────────── + 'subagentForm.importTitle': '从 Markdown 导入', + 'subagentForm.importDesc': '粘贴或导入含 YAML 前置数据的 `.md` 文件', + 'subagentForm.namePlaceholder': 'my-sub-agent', + 'subagentForm.nameHelp': '这将是子代理的标识符', + 'subagentForm.descPlaceholder': '此子代理的功能及使用时机', + 'subagentForm.descHelp': 'Claude 根据此描述决定何时委派给此子代理', + 'subagentForm.model': '模型', + 'subagentForm.modelHelp': '可选的子代理模型覆盖', + 'subagentForm.modelDefault': '默认(继承父级)', + 'subagentForm.modelSonnet': 'Sonnet', + 'subagentForm.modelOpus': 'Opus', + 'subagentForm.modelHaiku': 'Haiku', + 'subagentForm.modelInherit': '继承(使用主对话模型)', + 'subagentForm.permissionMode': '权限模式', + 'subagentForm.permissionHelp': '控制子代理如何处理权限请求', + 'subagentForm.permDefault': '默认(标准权限提示)', + 'subagentForm.permDefaultShort': '默认', + 'subagentForm.permAcceptEdits': '接受编辑(自动接受文件编辑)', + 'subagentForm.permDontAsk': '不询问(跳过权限提示)', + 'subagentForm.permBypass': '跳过权限(请谨慎使用)', + 'subagentForm.permPlan': '计划(只读探索)', + 'subagentForm.permIgnore': '忽略(跳过此权限模式)', + 'subagentForm.allowedToolsPlaceholder': 'Read, Edit, Bash, Glob, Grep', + 'subagentForm.allowedToolsHelp': '以逗号分隔的工具列表。留空则继承父级所有工具。', + 'subagentForm.autoLoadSkills': '自动加载技能', + 'subagentForm.autoLoadPlaceholder': 'commit, review-pr, deploy', + 'subagentForm.autoLoadHelp': '子代理启动时自动加载的技能列表(以逗号分隔)', + 'subagentForm.prompt': '子代理提示', + 'subagentForm.promptHelp': '定义此子代理行为的系统提示', + 'subagentForm.tagsPlaceholder': '代码审查、测试、文档', + 'subagentForm.updateAgent': '更新子代理', + 'subagentForm.createAgent': '创建子代理', + 'subagentForm.nameRequired': '名称为必填', + 'subagentForm.nameInvalid': '名称必须以小写字母开头,且仅包含小写字母、数字和连字符', + 'subagentForm.descRequired': '描述为必填', + 'subagentForm.contentRequired': '内容为必填' +}; diff --git a/src/lib/i18n/types.ts b/src/lib/i18n/types.ts index 162eb65..5b8d16f 100644 --- a/src/lib/i18n/types.ts +++ b/src/lib/i18n/types.ts @@ -2,7 +2,7 @@ import type { en } from './locales/en'; export type TranslationKey = keyof typeof en; export type Translations = Record; -export type Locale = 'en' | 'zh-TW'; +export type Locale = 'en' | 'zh-TW' | 'zh-CN'; export interface LocaleInfo { code: Locale;