diff --git a/web/scripts/i18n-en-overrides.mjs b/web/scripts/i18n-en-overrides.mjs index 4dbe5b9d..42ca5793 100644 --- a/web/scripts/i18n-en-overrides.mjs +++ b/web/scripts/i18n-en-overrides.mjs @@ -918,4 +918,11 @@ export const ENGLISH_SOURCE_OVERRIDES = Object.freeze({ 'Markdown 所见即所得编辑器': 'Markdown WYSIWYG editor', '从添加项目、开始新对话到模型设置': 'From adding a project to starting a new session to model setup', + '打开文件夹': 'Open folder', + '已打开文件夹': 'Folder opened', + '复制ID': 'Copy ID', + '复制标题': 'Copy title', + '导出': 'Export', + '归档': 'Archive', + '重命名': 'Rename', }); diff --git a/web/src/components/DesktopContextMenu.jsx b/web/src/components/DesktopContextMenu.jsx index 343d63e5..e69f7c3c 100644 --- a/web/src/components/DesktopContextMenu.jsx +++ b/web/src/components/DesktopContextMenu.jsx @@ -29,16 +29,16 @@ const MENU_ROW_HEIGHT = 30; const MENU_PADDING = 8; const ACTION_LABELS = { - [DESKTOP_CONTEXT_ACTIONS.OPEN_IN_EXPLORER]: '在资源管理器中打开', + [DESKTOP_CONTEXT_ACTIONS.OPEN_IN_EXPLORER]: '打开文件夹', [DESKTOP_CONTEXT_ACTIONS.LOCATE_FILE]: '在资源管理器中显示', [DESKTOP_CONTEXT_ACTIONS.PIN_SESSION]: '置顶', [DESKTOP_CONTEXT_ACTIONS.UNPIN_SESSION]: '取消置顶', [DESKTOP_CONTEXT_ACTIONS.OPEN_SESSION]: '打开会话', - [DESKTOP_CONTEXT_ACTIONS.RENAME_SESSION]: '重命名会话', - [DESKTOP_CONTEXT_ACTIONS.COPY_SESSION_TITLE]: '复制会话标题', - [DESKTOP_CONTEXT_ACTIONS.COPY_SESSION_ID]: '复制会话 ID', - [DESKTOP_CONTEXT_ACTIONS.EXPORT_SESSION]: '导出会话', - [DESKTOP_CONTEXT_ACTIONS.ARCHIVE_SESSION]: '归档会话', + [DESKTOP_CONTEXT_ACTIONS.RENAME_SESSION]: '重命名', + [DESKTOP_CONTEXT_ACTIONS.COPY_SESSION_TITLE]: '复制标题', + [DESKTOP_CONTEXT_ACTIONS.COPY_SESSION_ID]: '复制ID', + [DESKTOP_CONTEXT_ACTIONS.EXPORT_SESSION]: '导出', + [DESKTOP_CONTEXT_ACTIONS.ARCHIVE_SESSION]: '归档', [DESKTOP_CONTEXT_ACTIONS.ACTIVATE_WORKSPACE]: '切换到项目', [DESKTOP_CONTEXT_ACTIONS.EXPAND_WORKSPACE]: '展开项目', [DESKTOP_CONTEXT_ACTIONS.COLLAPSE_WORKSPACE]: '折叠项目', @@ -226,7 +226,7 @@ async function openTargetInExplorer(openTarget) { toast({ kind: 'err', text: '打开失败:' + (result?.error || '') }); return; } - toast({ kind: 'ok', text: '已在资源管理器中打开' }); + toast({ kind: 'ok', text: '已打开文件夹' }); } catch (e) { const detail = e?.body?.error || e?.message || ''; toast({ kind: 'err', text: '打开失败:' + detail }); diff --git a/web/src/i18n/sourceCatalog.generated.js b/web/src/i18n/sourceCatalog.generated.js index 57914127..f977d7e4 100644 --- a/web/src/i18n/sourceCatalog.generated.js +++ b/web/src/i18n/sourceCatalog.generated.js @@ -4,6 +4,7 @@ export const sourceCatalogs = { "zh-CN": { "s_0006d696d8e1ec28": "新增", "s_006c2a1d1f2455cc": "暂无会话内容", + "s_006df11eb7a802c9": "复制ID", "s_0080bd7968c8f2ba": "从模板入手", "s_0087143bff352d9e": "调整左侧栏宽度", "s_00a0c533e38411ac": "旁路提问", @@ -63,7 +64,6 @@ export const sourceCatalogs = { "s_09d0deda381bc15c": "复制绝对路径", "s_09e3cdff62f6175b": "{{p0}} 号批注位置,共 {{p1}} 条批注", "s_09ef00b21231b322": "让代理调用 spawn_subagent 即可在这里看到。", - "s_0a388587455a5969": "归档会话", "s_0a6f82252d9788fb": "返回宫格", "s_0a880a169f51924d": "置顶排序失败:", "s_0a9a4724ab124b4b": "双列", @@ -92,6 +92,7 @@ export const sourceCatalogs = { "s_0cc2ca1cf8347d79": "任务完成通知已关闭", "s_0cc2efa505eb4f3c": "每日用量趋势", "s_0cf8b14f4651f4de": "上周", + "s_0d0cbac2eee54113": "重命名", "s_0d47abe618ebfdc0": "正在检查更新", "s_0d94ad38844747ce": "切换失败:", "s_0de50760cb250e32": "移除模型 {{p0}}", @@ -312,9 +313,9 @@ export const sourceCatalogs = { "s_2f73f608b745c275": "诊断 ACECode 工作空间", "s_2f9daa828907b93f": "删除", "s_2fbee191632d47c5": "本地服务", - "s_2fd39ace06ea5668": "导出会话", "s_3003318e729a860b": "查找", "s_3055a035f0eb7a8b": "更新", + "s_307253e3d1f704a5": "已打开文件夹", "s_30ad71bc6b05e076": "Agent 浏览器工具由 Windows Desktop 原生提供,模型需要浏览器时会自动打开并操作同一个可见页面。", "s_30c731f953a5122d": "高级开发工程师", "s_30fad5a0b5d98e24": "例如:这个项目使用 React 18 + Vite,组件库选 Tailwind 风格,提交信息用中文...", @@ -624,7 +625,6 @@ export const sourceCatalogs = { "s_5efd57456cbc23c5": "或运行", "s_5f5a4c5fb8ab71d6": "输入框当前不可用", "s_5f5b6195dfd24aa1": "等待交互内容同步", - "s_5f64610f9fec9451": "重命名会话", "s_5fc100961482f924": "请输入循环名称", "s_5fcad9600a50f834": "关闭右侧标签页", "s_5fe110aa6d1dca31": "预设名称", @@ -709,6 +709,7 @@ export const sourceCatalogs = { "s_6cc930e12ea9ce92": "无法连接 xAI 授权服务", "s_6ce5b90be906a6cc": "保存专家团", "s_6cf2531ab1119b67": "授权", + "s_6d0b032bc4d31ea2": "复制标题", "s_6d330244eecae355": "连接 daemon 失败:", "s_6d3d916f1807a4d2": "继续添加 Tag", "s_6d5503cc0bd22117": "选择探测到的模型", @@ -770,6 +771,7 @@ export const sourceCatalogs = { "s_75dfaf262f476b6c": "取消中", "s_760f9739d4cbcc55": "打开任务完成通知", "s_7626053cb6469500": "等待 xAI 授权", + "s_76420433f22d1c80": "导出", "s_769041a8349d61ea": "Word 文件预览失败", "s_769d47bf6c76ef9a": "当前模型配置已是最新", "s_76c56b86f3a7c78d": "请先在运行中的会话里使用 /turn", @@ -825,7 +827,6 @@ export const sourceCatalogs = { "s_7da86ad74c228542": "向量", "s_7db94c4227e53af0": "重排", "s_7df5c456c765e4c3": "禁用", - "s_7df96a6bb1dd160b": "复制会话 ID", "s_7e1df49bc3432fb2": "找不到该预设对应的 Provider 描述", "s_7e8586f653066a9c": "删除模型预设", "s_7ecf1cde648680d2": "已选", @@ -1368,7 +1369,6 @@ export const sourceCatalogs = { "s_d059018d896d6cde": "删除 {{p0}} 行", "s_d0f680208ed8796c": "git 超时,点击重试", "s_d0fb5bbca8184bdd": "跳转到当前问题:{{p0}}", - "s_d10ec81b90243e62": "在资源管理器中打开", "s_d1900c3b84a2557d": "已开启蜂群模式", "s_d1cd931be84cce03": "信任", "s_d1d044826a45ef65": "加载失败", @@ -1429,7 +1429,6 @@ export const sourceCatalogs = { "s_d89e5eba2a978356": "缺少保存文件所需的读取版本", "s_d8a384351a6c044e": "”吗?以前的对话仍会保留。", "s_d8b82d5765fa2fb4": "每", - "s_d8baf236e12382b4": "复制会话标题", "s_d8e0a082697905fe": "当前没有可插话的运行中回合", "s_d93373f81363e3cc": "支持", "s_d94f9bafff59c06b": "已启用钩子", @@ -1455,7 +1454,6 @@ export const sourceCatalogs = { "s_db658bd2e4597c10": "移除工作区失败:", "s_db8630211fe3934a": "原生设置不可用", "s_dbaa6ba5056580a7": "不在当前可选专家范围内", - "s_dbe1ef02c3533a63": "已在资源管理器中打开", "s_dc47f62bd3f882f0": "组建专家团", "s_dc8abbff6b975a53": "已归档会话", "s_dc9591e56d502b43": "进行中", @@ -1678,6 +1676,7 @@ export const sourceCatalogs = { "s_fc9cb8bc5414d5b3": "网站关闭了当前连接,请重新加载页面。", "s_fcac6c9df3a773c4": "Copilot 登录已开始,验证码已复制", "s_fcea4baf388f169a": "运行核心测试,定位并修复可可靠复现的问题。", + "s_fcf8b4bff0df782d": "打开文件夹", "s_fd4b9e3b6c685bae": "继续编辑", "s_fd6d4b5099959168": "插话", "s_fdd200f5dbdb26fc": "选择 Agent 显示多少技术细节", @@ -1698,6 +1697,7 @@ export const sourceCatalogs = { "en-US": { "s_0006d696d8e1ec28": "New", "s_006c2a1d1f2455cc": "No conversation content yet", + "s_006df11eb7a802c9": "Copy ID", "s_0080bd7968c8f2ba": "Start with a template", "s_0087143bff352d9e": "Adjust left column width", "s_00a0c533e38411ac": "Side question", @@ -1757,7 +1757,6 @@ export const sourceCatalogs = { "s_09d0deda381bc15c": "copy absolute path", "s_09e3cdff62f6175b": "Annotation marker {{p0}}, {{p1}} annotations", "s_09ef00b21231b322": "Having the agent call spawn_subagent can be seen here.", - "s_0a388587455a5969": "Archive session", "s_0a6f82252d9788fb": "Return to Gongge", "s_0a880a169f51924d": "Top sorting failed:", "s_0a9a4724ab124b4b": "Side by side", @@ -1786,6 +1785,7 @@ export const sourceCatalogs = { "s_0cc2ca1cf8347d79": "Task completion notifications disabled", "s_0cc2efa505eb4f3c": "Daily usage trends", "s_0cf8b14f4651f4de": "last week", + "s_0d0cbac2eee54113": "Rename", "s_0d47abe618ebfdc0": "Checking for updates", "s_0d94ad38844747ce": "Switch failed:", "s_0de50760cb250e32": "Remove model {{p0}}", @@ -2006,9 +2006,9 @@ export const sourceCatalogs = { "s_2f73f608b745c275": "Diagnosing the ACECode workspace", "s_2f9daa828907b93f": "delete", "s_2fbee191632d47c5": "Local services", - "s_2fd39ace06ea5668": "Export session", "s_3003318e729a860b": "Find", "s_3055a035f0eb7a8b": "renew", + "s_307253e3d1f704a5": "Folder opened", "s_30ad71bc6b05e076": "Agent Browser tools are built into Desktop for Windows. When the model needs a browser, it opens and operates the same visible page.", "s_30c731f953a5122d": "Senior Development Engineer", "s_30fad5a0b5d98e24": "For example: This project uses React 18 + Vite, the component library chooses Tailwind style, and the submission information is in Chinese...", @@ -2318,7 +2318,6 @@ export const sourceCatalogs = { "s_5efd57456cbc23c5": "or run", "s_5f5a4c5fb8ab71d6": "The input box is currently unavailable", "s_5f5b6195dfd24aa1": "Waiting for interactive content to be synchronized", - "s_5f64610f9fec9451": "Rename session", "s_5fc100961482f924": "Please enter a loop name", "s_5fcad9600a50f834": "Close the tab on the right", "s_5fe110aa6d1dca31": "Profile name", @@ -2403,6 +2402,7 @@ export const sourceCatalogs = { "s_6cc930e12ea9ce92": "Could not reach the xAI authorization service", "s_6ce5b90be906a6cc": "Save expert team", "s_6cf2531ab1119b67": "Authorize", + "s_6d0b032bc4d31ea2": "Copy title", "s_6d330244eecae355": "Failed to connect to daemon:", "s_6d3d916f1807a4d2": "Continue to add tags", "s_6d5503cc0bd22117": "Select detected model", @@ -2464,6 +2464,7 @@ export const sourceCatalogs = { "s_75dfaf262f476b6c": "Unarchiving…", "s_760f9739d4cbcc55": "Enable task completion notifications", "s_7626053cb6469500": "Waiting for xAI authorization", + "s_76420433f22d1c80": "Export", "s_769041a8349d61ea": "Word file preview failed", "s_769d47bf6c76ef9a": "The current model configuration is already up to date", "s_76c56b86f3a7c78d": "Please use /turn in a running session first", @@ -2519,7 +2520,6 @@ export const sourceCatalogs = { "s_7da86ad74c228542": "vector", "s_7db94c4227e53af0": "rearrange", "s_7df5c456c765e4c3": "Disable", - "s_7df96a6bb1dd160b": "Copy session ID", "s_7e1df49bc3432fb2": "The provider definition for this profile was not found", "s_7e8586f653066a9c": "Delete model profile", "s_7ecf1cde648680d2": "Selected", @@ -3062,7 +3062,6 @@ export const sourceCatalogs = { "s_d059018d896d6cde": "Delete the {{p0}} line", "s_d0f680208ed8796c": "git times out, click to try again", "s_d0fb5bbca8184bdd": "Jump to current question:{{p0}}", - "s_d10ec81b90243e62": "Open in explorer", "s_d1900c3b84a2557d": "Swarm mode enabled", "s_d1cd931be84cce03": "trust", "s_d1d044826a45ef65": "Loading failed", @@ -3123,7 +3122,6 @@ export const sourceCatalogs = { "s_d89e5eba2a978356": "Missing read version required to save file", "s_d8a384351a6c044e": "”? Previous conversations will remain.", "s_d8b82d5765fa2fb4": "Every", - "s_d8baf236e12382b4": "Copy session title", "s_d8e0a082697905fe": "There is no running turn to interject into", "s_d93373f81363e3cc": "Support", "s_d94f9bafff59c06b": "Hooks enabled", @@ -3149,7 +3147,6 @@ export const sourceCatalogs = { "s_db658bd2e4597c10": "Removing workspace failed:", "s_db8630211fe3934a": "Native settings are not available", "s_dbaa6ba5056580a7": "Outside the currently selectable expert set", - "s_dbe1ef02c3533a63": "Opened in Explorer", "s_dc47f62bd3f882f0": "Build expert team", "s_dc8abbff6b975a53": "Archived sessions", "s_dc9591e56d502b43": "in progress", @@ -3372,6 +3369,7 @@ export const sourceCatalogs = { "s_fc9cb8bc5414d5b3": "The site closed the connection. Reload the page.", "s_fcac6c9df3a773c4": "Copilot sign-in started and the verification code was copied", "s_fcea4baf388f169a": "Run core tests to locate and fix reliably reproducible issues.", + "s_fcf8b4bff0df782d": "Open folder", "s_fd4b9e3b6c685bae": "Continue editing", "s_fd6d4b5099959168": "Interject", "s_fdd200f5dbdb26fc": "Choose how much technical detail Agent shows", diff --git a/web/src/lib/desktopContextMenu.js b/web/src/lib/desktopContextMenu.js index 33b47847..66fc5939 100644 --- a/web/src/lib/desktopContextMenu.js +++ b/web/src/lib/desktopContextMenu.js @@ -262,7 +262,7 @@ export function buildDesktopContextMenuItems({ if (!editable) { if (sessionTarget) { - addAction(items, DESKTOP_CONTEXT_ACTIONS.OPEN_SESSION, sessionTarget); + addAction(items, sessionTarget.pinned ? DESKTOP_CONTEXT_ACTIONS.UNPIN_SESSION : DESKTOP_CONTEXT_ACTIONS.PIN_SESSION, sessionTarget); addAction(items, DESKTOP_CONTEXT_ACTIONS.RENAME_SESSION, sessionTarget); addAction(items, DESKTOP_CONTEXT_ACTIONS.COPY_SESSION_TITLE, sessionTarget, { enabled: !!sessionTarget.title }); addAction(items, DESKTOP_CONTEXT_ACTIONS.COPY_SESSION_ID, sessionTarget); @@ -273,7 +273,6 @@ export function buildDesktopContextMenuItems({ { path: sessionTarget.sessionPath, kind: 'file' }, { enabled: !!sessionTarget.sessionPath }, ); - addAction(items, sessionTarget.pinned ? DESKTOP_CONTEXT_ACTIONS.UNPIN_SESSION : DESKTOP_CONTEXT_ACTIONS.PIN_SESSION, sessionTarget); if (sessionTarget.canArchive) { addAction(items, DESKTOP_CONTEXT_ACTIONS.ARCHIVE_SESSION, sessionTarget, { group: GROUPS.DANGER, @@ -429,7 +428,9 @@ export function buildDesktopContextMenuItems({ } } - addAction(items, DESKTOP_CONTEXT_ACTIONS.SELECT_ALL, null, { group: GROUPS.GENERIC }); + if (!sessionTarget && !sessionPinTarget) { + addAction(items, DESKTOP_CONTEXT_ACTIONS.SELECT_ALL, null, { group: GROUPS.GENERIC }); + } if (hasSelection) addAction(items, DESKTOP_CONTEXT_ACTIONS.COPY, null, { group: GROUPS.GENERIC }); if (editable) { addAction(items, DESKTOP_CONTEXT_ACTIONS.PASTE, null, { group: GROUPS.GENERIC }); diff --git a/web/src/lib/desktopContextMenu.test.js b/web/src/lib/desktopContextMenu.test.js index bbbeac95..5322e016 100644 --- a/web/src/lib/desktopContextMenu.test.js +++ b/web/src/lib/desktopContextMenu.test.js @@ -213,15 +213,13 @@ test('未置顶会话目标显示会话动作', () => { }, }); assert.deepEqual(ids(items), [ - DESKTOP_CONTEXT_ACTIONS.OPEN_SESSION, + DESKTOP_CONTEXT_ACTIONS.PIN_SESSION, DESKTOP_CONTEXT_ACTIONS.RENAME_SESSION, DESKTOP_CONTEXT_ACTIONS.COPY_SESSION_TITLE, DESKTOP_CONTEXT_ACTIONS.COPY_SESSION_ID, DESKTOP_CONTEXT_ACTIONS.EXPORT_SESSION, DESKTOP_CONTEXT_ACTIONS.OPEN_IN_EXPLORER, - DESKTOP_CONTEXT_ACTIONS.PIN_SESSION, DESKTOP_CONTEXT_ACTIONS.ARCHIVE_SESSION, - DESKTOP_CONTEXT_ACTIONS.SELECT_ALL, ]); assert.deepEqual( items.find((item) => item.id === DESKTOP_CONTEXT_ACTIONS.OPEN_IN_EXPLORER).target, @@ -273,7 +271,6 @@ test('descriptor metadata includes label keys, disabled states, and scoped confi test('已置顶会话目标显示取消置顶菜单项', () => { assert.deepEqual(ids(buildDesktopContextMenuItems({ sessionPinTarget: { pinned: true } })), [ DESKTOP_CONTEXT_ACTIONS.UNPIN_SESSION, - DESKTOP_CONTEXT_ACTIONS.SELECT_ALL, ]); }); @@ -635,12 +632,10 @@ test('普通 Web 会话菜单过滤原生目录选择导出并保留 Web 会话 pinned: false, }, })), [ - DESKTOP_CONTEXT_ACTIONS.OPEN_SESSION, + DESKTOP_CONTEXT_ACTIONS.PIN_SESSION, DESKTOP_CONTEXT_ACTIONS.RENAME_SESSION, DESKTOP_CONTEXT_ACTIONS.COPY_SESSION_TITLE, DESKTOP_CONTEXT_ACTIONS.COPY_SESSION_ID, - DESKTOP_CONTEXT_ACTIONS.PIN_SESSION, - DESKTOP_CONTEXT_ACTIONS.SELECT_ALL, ]); });