From 4214f86da3c623f6553eae56a53d77619c0bd419 Mon Sep 17 00:00:00 2001 From: 07akioni <07akioni2@gmail.com> Date: Thu, 29 Oct 2026 13:40:11 +0800 Subject: [PATCH 1/4] fix(desktop): show DevTools toggle in application menus --- apps/desktop/README.i18n.yaml | 4 ++-- apps/desktop/README.md | 2 +- apps/desktop/README.zh.md | 2 +- apps/desktop/src/main.ts | 13 +++++++------ apps/desktop/tests/expected/devtools-menu.json | 10 ++++++++++ apps/desktop/tests/main-startup.spec.ts | 18 ++++++++---------- 6 files changed, 29 insertions(+), 20 deletions(-) create mode 100644 apps/desktop/tests/expected/devtools-menu.json diff --git a/apps/desktop/README.i18n.yaml b/apps/desktop/README.i18n.yaml index 1c55529b1c..19b112d945 100644 --- a/apps/desktop/README.i18n.yaml +++ b/apps/desktop/README.i18n.yaml @@ -15,8 +15,8 @@ en: 127ea90553cb6af7 zh: 7b1c5aec8558c684 /deepseek-harness-desktop/application-overview: - en: b57525e17b9638ab - zh: 274fe8344f7c2202 + en: 080abb0f4bff64bc + zh: acce70f703b73f1d /deepseek-harness-desktop/terminal-command: en: 5f2d25a1d8472647 zh: 2acb5c5d7d1917e2 diff --git a/apps/desktop/README.md b/apps/desktop/README.md index 89755436cb..41055418ee 100644 --- a/apps/desktop/README.md +++ b/apps/desktop/README.md @@ -53,7 +53,7 @@ A server-expired account credential returns to Welcome when no official API key Desktop microphone access is restricted to audio requests from the primary `dsh-app://app` frame. macOS uses system microphone authorization, a packaged usage description, and `com.apple.security.device.audio-input` in the main application and Helper signatures. -Press F12 (Fn+F12 on media-key keyboards), Command+Option+I on macOS, or Ctrl+Shift+I on Windows to toggle DevTools for the focused application page, including in packaged builds. These native shortcuts use hidden application-menu items. Update overlays and packaged embedded browser guests disable DevTools. +Press F12 (Fn+F12 on media-key keyboards), Command+Option+I on macOS, or Ctrl+Shift+I on Windows to toggle DevTools for the focused application page, including in packaged builds. The application menu also shows a DevTools toggle; F12 remains available as a hidden shortcut alias. Update overlays and packaged embedded browser guests disable DevTools. diff --git a/apps/desktop/README.zh.md b/apps/desktop/README.zh.md index 3df2783476..2b9c354579 100644 --- a/apps/desktop/README.zh.md +++ b/apps/desktop/README.zh.md @@ -53,7 +53,7 @@ Desktop Host 的 Platform API 请求与更新策略请求用相同的 Platform 桌面麦克风访问仅允许主 `dsh-app://app` 页面发起的音频请求。macOS 使用系统麦克风授权、随包用途说明,以及主应用与 Helper 签名中的 `com.apple.security.device.audio-input` 权限。 -按 F12(多媒体功能键键盘上为 Fn+F12)、macOS 的 Command+Option+I 或 Windows 的 Ctrl+Shift+I,可切换当前获得焦点的应用页面的 DevTools,打包版本同样支持。这些原生快捷键通过隐藏的应用菜单项注册。更新遮罩和打包版本的内嵌浏览器禁用 DevTools。 +按 F12(多媒体功能键键盘上为 Fn+F12)、macOS 的 Command+Option+I 或 Windows 的 Ctrl+Shift+I,可切换当前获得焦点的应用页面的 DevTools,打包版本同样支持。应用菜单也显示 DevTools 开关;F12 仍作为隐藏的快捷键别名保留。更新遮罩和打包版本的内嵌浏览器禁用 DevTools。 diff --git a/apps/desktop/src/main.ts b/apps/desktop/src/main.ts index 674221b671..ad141e8ce9 100644 --- a/apps/desktop/src/main.ts +++ b/apps/desktop/src/main.ts @@ -1075,14 +1075,15 @@ async function main(): Promise { : process.platform === 'win32' ? { label: currentDesktopLocale().messages.exitApplication } : {}) }, ] const devToolsItems: MenuItemConstructorOptions[] = [ - { role: 'toggleDevTools', visible: false }, + { role: 'toggleDevTools' }, { role: 'toggleDevTools', visible: false, accelerator: 'F12' }, ] const refreshApplicationMenu = (): void => { - Menu.setApplicationMenu(Menu.buildFromTemplate(process.platform === 'win32' ? devToolsItems : [{ - label: darwin ? app.name : currentDesktopLocale().messages.application, - submenu: [...applicationItems(), ...devToolsItems], - }, ...platformMenus()])) + Menu.setApplicationMenu(Menu.buildFromTemplate(process.platform === 'win32' + ? devToolsItems.map(item => ({ ...item, visible: false })) : [{ + label: darwin ? app.name : currentDesktopLocale().messages.application, + submenu: [...applicationItems(), ...devToolsItems], + }, ...platformMenus()])) tray?.relabel() } refreshApplicationMenu() @@ -1128,7 +1129,7 @@ async function main(): Promise { shortcuts.sendEditingKey(keyCode, modifiers) }, }) - const items: MenuItemConstructorOptions[] = name === 'application' ? applicationItems() : [ + const items: MenuItemConstructorOptions[] = name === 'application' ? [...applicationItems(), ...devToolsItems] : [ editItem(currentDesktopLocale().messages.undo, 'Z', ['control'], 'Ctrl+Z'), editItem(currentDesktopLocale().messages.redo, 'Y', ['control'], 'Ctrl+Y'), { type: 'separator' }, diff --git a/apps/desktop/tests/expected/devtools-menu.json b/apps/desktop/tests/expected/devtools-menu.json new file mode 100644 index 0000000000..d83b18e2a7 --- /dev/null +++ b/apps/desktop/tests/expected/devtools-menu.json @@ -0,0 +1,10 @@ +[ + { + "role": "toggleDevTools" + }, + { + "role": "toggleDevTools", + "visible": false, + "accelerator": "F12" + } +] diff --git a/apps/desktop/tests/main-startup.spec.ts b/apps/desktop/tests/main-startup.spec.ts index 0cb7aa3e96..3438c58e73 100644 --- a/apps/desktop/tests/main-startup.spec.ts +++ b/apps/desktop/tests/main-startup.spec.ts @@ -550,13 +550,11 @@ describe('desktop main startup', () => { expect((await handler(new Request('dsh-app://unknown/update-dialog.html'))).status).toBe(404) }) - it('installs hidden native DevTools shortcuts in the macOS application menu', async () => { - vi.stubGlobal('process', { ...process, platform: 'darwin' }) + it.each(['darwin', 'win32', 'linux'] as const)('shows one DevTools command and retains native shortcuts on %s', async (platform) => { + vi.stubGlobal('process', { ...process, platform }) await readyForUpdate() - expect(applicationMenuItems().slice(-2)).toEqual([ - { role: 'toggleDevTools', visible: false }, - { role: 'toggleDevTools', visible: false, accelerator: 'F12' }, - ]) + await expect(JSON.stringify(applicationMenuItems().slice(-2), null, 2) + '\n') + .toMatchFileSnapshot('./expected/devtools-menu.json') expect(harness.windows[0]!.options).toMatchObject({ webPreferences: { devTools: true } }) }) @@ -1030,8 +1028,8 @@ describe('desktop main startup', () => { expect(() => handler(event, 'arbitrary-command', 48, 34)).toThrow('invalid popup request') expect(() => handler(event, 'application', NaN, 34)).toThrow('invalid popup request') const application = handler(event, 'application', 48, 34) - expect(harness.menu.buildFromTemplate.mock.lastCall![0].map(item => item.label ?? item.type)).toEqual([ - '关于 DeepSeek Harness', 'separator', '检查更新…', '管理 dsh 命令…', 'separator', '退出', + expect(harness.menu.buildFromTemplate.mock.lastCall![0].map(item => item.label ?? item.type ?? item.role)).toEqual([ + '关于 DeepSeek Harness', 'separator', '检查更新…', '管理 dsh 命令…', 'separator', '退出', 'toggleDevTools', 'toggleDevTools', ]) expect(harness.popup.mock.lastCall![0]).toMatchObject({ window, x: 48, y: 34 }) expect(harness.popup.mock.lastCall![0].callback).toBeTypeOf('function') @@ -1068,8 +1066,8 @@ describe('desktop main startup', () => { : ['Application', 'editMenu']) const application = template[0]!.submenu as MenuItemConstructorOptions[] expect(application.filter(item => item.visible !== false).map(describeItem)).toEqual(platform === 'darwin' - ? ['about', 'separator', en.checkUpdatesMenu, en.cliCommandMenu, 'separator', 'hide', 'hideOthers', 'unhide', 'separator', 'quit'] - : ['about', 'separator', en.checkUpdatesMenu, 'separator', 'quit']) + ? ['about', 'separator', en.checkUpdatesMenu, en.cliCommandMenu, 'separator', 'hide', 'hideOthers', 'unhide', 'separator', 'quit', 'toggleDevTools'] + : ['about', 'separator', en.checkUpdatesMenu, 'separator', 'quit', 'toggleDevTools']) expect(harness.menu.setApplicationMenu).toHaveBeenCalledOnce() }) From b5be2c03391823389dea41ccea27cc984acecbc2 Mon Sep 17 00:00:00 2001 From: 07akioni <07akioni2@gmail.com> Date: Thu, 29 Oct 2026 14:03:00 +0800 Subject: [PATCH 2/4] fix(desktop): localize DevTools menu labels --- apps/desktop/README.i18n.yaml | 4 ++-- apps/desktop/README.md | 2 +- apps/desktop/README.zh.md | 2 +- apps/desktop/src/locale.ts | 8 +++++++ apps/desktop/src/main.ts | 12 +++++----- .../tests/expected/devtools-menu-en.json | 12 ++++++++++ .../tests/expected/devtools-menu-zh-CN.json | 12 ++++++++++ .../desktop/tests/expected/devtools-menu.json | 10 -------- apps/desktop/tests/main-startup.spec.ts | 23 +++++++++++++++---- 9 files changed, 60 insertions(+), 25 deletions(-) create mode 100644 apps/desktop/tests/expected/devtools-menu-en.json create mode 100644 apps/desktop/tests/expected/devtools-menu-zh-CN.json delete mode 100644 apps/desktop/tests/expected/devtools-menu.json diff --git a/apps/desktop/README.i18n.yaml b/apps/desktop/README.i18n.yaml index 19b112d945..43dbdfd13a 100644 --- a/apps/desktop/README.i18n.yaml +++ b/apps/desktop/README.i18n.yaml @@ -15,8 +15,8 @@ en: 127ea90553cb6af7 zh: 7b1c5aec8558c684 /deepseek-harness-desktop/application-overview: - en: 080abb0f4bff64bc - zh: acce70f703b73f1d + en: 4f92dcaf5d306d39 + zh: b08f13aec0fae481 /deepseek-harness-desktop/terminal-command: en: 5f2d25a1d8472647 zh: 2acb5c5d7d1917e2 diff --git a/apps/desktop/README.md b/apps/desktop/README.md index 41055418ee..a67e5766cc 100644 --- a/apps/desktop/README.md +++ b/apps/desktop/README.md @@ -53,7 +53,7 @@ A server-expired account credential returns to Welcome when no official API key Desktop microphone access is restricted to audio requests from the primary `dsh-app://app` frame. macOS uses system microphone authorization, a packaged usage description, and `com.apple.security.device.audio-input` in the main application and Helper signatures. -Press F12 (Fn+F12 on media-key keyboards), Command+Option+I on macOS, or Ctrl+Shift+I on Windows to toggle DevTools for the focused application page, including in packaged builds. The application menu also shows a DevTools toggle; F12 remains available as a hidden shortcut alias. Update overlays and packaged embedded browser guests disable DevTools. +Press F12 (Fn+F12 on media-key keyboards), Command+Option+I on macOS, or Ctrl+Shift+I on Windows to toggle DevTools for the focused application page, including in packaged builds. The application menu also shows a DevTools toggle in the selected Desktop language; F12 remains available as a hidden shortcut alias. Update overlays and packaged embedded browser guests disable DevTools. diff --git a/apps/desktop/README.zh.md b/apps/desktop/README.zh.md index 2b9c354579..19b30f4de1 100644 --- a/apps/desktop/README.zh.md +++ b/apps/desktop/README.zh.md @@ -53,7 +53,7 @@ Desktop Host 的 Platform API 请求与更新策略请求用相同的 Platform 桌面麦克风访问仅允许主 `dsh-app://app` 页面发起的音频请求。macOS 使用系统麦克风授权、随包用途说明,以及主应用与 Helper 签名中的 `com.apple.security.device.audio-input` 权限。 -按 F12(多媒体功能键键盘上为 Fn+F12)、macOS 的 Command+Option+I 或 Windows 的 Ctrl+Shift+I,可切换当前获得焦点的应用页面的 DevTools,打包版本同样支持。应用菜单也显示 DevTools 开关;F12 仍作为隐藏的快捷键别名保留。更新遮罩和打包版本的内嵌浏览器禁用 DevTools。 +按 F12(多媒体功能键键盘上为 Fn+F12)、macOS 的 Command+Option+I 或 Windows 的 Ctrl+Shift+I,可切换当前获得焦点的应用页面的 DevTools,打包版本同样支持。应用菜单也以当前桌面端语言显示 DevTools 开关;F12 仍作为隐藏的快捷键别名保留。更新遮罩和打包版本的内嵌浏览器禁用 DevTools。 diff --git a/apps/desktop/src/locale.ts b/apps/desktop/src/locale.ts index 74a1f19941..09f4002894 100644 --- a/apps/desktop/src/locale.ts +++ b/apps/desktop/src/locale.ts @@ -104,6 +104,7 @@ export const en = { welcomeContinueFailed: 'Could not open the workspace. Please try again.', checkUpdatesMenu: 'Check for Updates…', reloadPageMenu: 'Reload Page', + toggleDevToolsMenu: 'Toggle developer tools', restartAppHostMenu: 'Restart App and Host', updateCheckFailedTitle: 'Update Check Failed', updateCheckFailed: 'Could not check for updates. Please try again later.', @@ -283,6 +284,7 @@ export const zh = { welcomeContinueFailed: '无法打开工作区,请重试。', checkUpdatesMenu: '检查更新…', reloadPageMenu: '刷新页面', + toggleDevToolsMenu: '切换开发者工具', restartAppHostMenu: '重启应用与 Host', updateCheckFailedTitle: '更新检查失败', updateCheckFailed: '检查更新失败,请稍后重试。', @@ -460,6 +462,7 @@ export const ja = { welcomeContinueFailed: 'ワークスペースを開けませんでした。もう一度お試しください。', checkUpdatesMenu: 'アップデートを確認…', reloadPageMenu: 'ページを再読み込み', + toggleDevToolsMenu: '開発者ツールを切り替え', restartAppHostMenu: 'アプリとホストを再起動', updateCheckFailedTitle: 'アップデートの確認に失敗しました', updateCheckFailed: 'アップデートを確認できませんでした。後でもう一度お試しください。', @@ -637,6 +640,7 @@ export const es = { welcomeContinueFailed: 'No se pudo abrir el espacio de trabajo. Por favor inténtalo de nuevo.', checkUpdatesMenu: 'Buscar actualizaciones...', reloadPageMenu: 'Recargar página', + toggleDevToolsMenu: 'Alternar herramientas de desarrollo', restartAppHostMenu: 'Reiniciar la aplicación y el host', updateCheckFailedTitle: 'Error en la comprobación de actualización', updateCheckFailed: 'No se pudo buscar actualizaciones. Inténtelo de nuevo más tarde.', @@ -814,6 +818,7 @@ export const fr = { welcomeContinueFailed: "Impossible d'ouvrir l'espace de travail. Veuillez réessayer.", checkUpdatesMenu: 'Vérifiez les mises à jour…', reloadPageMenu: 'Recharger la page', + toggleDevToolsMenu: 'Afficher/masquer les outils de développement', restartAppHostMenu: "Redémarrez l'application et l'hôte", updateCheckFailedTitle: 'Échec de la vérification de la mise à jour', updateCheckFailed: 'Impossible de vérifier les mises à jour. Veuillez réessayer plus tard.', @@ -991,6 +996,7 @@ export const de = { welcomeContinueFailed: 'Der Arbeitsbereich konnte nicht geöffnet werden. Bitte versuchen Sie es erneut.', checkUpdatesMenu: 'Nach Updates suchen…', reloadPageMenu: 'Seite neu laden', + toggleDevToolsMenu: 'Entwicklertools ein-/ausblenden', restartAppHostMenu: 'Anwendung und Host neu starten', updateCheckFailedTitle: 'Update-Überprüfung fehlgeschlagen', updateCheckFailed: 'Es konnte nicht nach Updates gesucht werden. Bitte versuchen Sie es später noch einmal.', @@ -1168,6 +1174,7 @@ export const ru = { welcomeContinueFailed: 'Не удалось открыть рабочую область. Пожалуйста, попробуйте еще раз.', checkUpdatesMenu: 'Проверить наличие обновлений…', reloadPageMenu: 'Обновить страницу', + toggleDevToolsMenu: 'Показать/скрыть инструменты разработчика', restartAppHostMenu: 'Перезапустите приложение и хост.', updateCheckFailedTitle: 'Проверка обновления не удалась', updateCheckFailed: 'Не удалось проверить наличие обновлений. Пожалуйста, повторите попытку позже.', @@ -1345,6 +1352,7 @@ export const pt = { welcomeContinueFailed: 'Não foi possível abrir o espaço de trabalho. Por favor, tente novamente.', checkUpdatesMenu: 'Verifique se há atualizações…', reloadPageMenu: 'Recarregar página', + toggleDevToolsMenu: 'Alternar ferramentas de desenvolvedor', restartAppHostMenu: 'Reinicie o aplicativo e o host', updateCheckFailedTitle: 'Falha na verificação de atualização', updateCheckFailed: 'Não foi possível verificar se há atualizações. Por favor, tente novamente mais tarde.', diff --git a/apps/desktop/src/main.ts b/apps/desktop/src/main.ts index ad141e8ce9..c85f48c13d 100644 --- a/apps/desktop/src/main.ts +++ b/apps/desktop/src/main.ts @@ -1074,15 +1074,15 @@ async function main(): Promise { { role: 'quit', ...(darwin ? { label: currentDesktopLocale().messages.quitApplication } : process.platform === 'win32' ? { label: currentDesktopLocale().messages.exitApplication } : {}) }, ] - const devToolsItems: MenuItemConstructorOptions[] = [ - { role: 'toggleDevTools' }, - { role: 'toggleDevTools', visible: false, accelerator: 'F12' }, + const devToolsItems = (): MenuItemConstructorOptions[] => [ + { role: 'toggleDevTools', label: currentDesktopLocale().messages.toggleDevToolsMenu }, + { role: 'toggleDevTools', label: currentDesktopLocale().messages.toggleDevToolsMenu, visible: false, accelerator: 'F12' }, ] const refreshApplicationMenu = (): void => { Menu.setApplicationMenu(Menu.buildFromTemplate(process.platform === 'win32' - ? devToolsItems.map(item => ({ ...item, visible: false })) : [{ + ? devToolsItems().map(item => ({ ...item, visible: false })) : [{ label: darwin ? app.name : currentDesktopLocale().messages.application, - submenu: [...applicationItems(), ...devToolsItems], + submenu: [...applicationItems(), ...devToolsItems()], }, ...platformMenus()])) tray?.relabel() } @@ -1129,7 +1129,7 @@ async function main(): Promise { shortcuts.sendEditingKey(keyCode, modifiers) }, }) - const items: MenuItemConstructorOptions[] = name === 'application' ? [...applicationItems(), ...devToolsItems] : [ + const items: MenuItemConstructorOptions[] = name === 'application' ? [...applicationItems(), ...devToolsItems()] : [ editItem(currentDesktopLocale().messages.undo, 'Z', ['control'], 'Ctrl+Z'), editItem(currentDesktopLocale().messages.redo, 'Y', ['control'], 'Ctrl+Y'), { type: 'separator' }, diff --git a/apps/desktop/tests/expected/devtools-menu-en.json b/apps/desktop/tests/expected/devtools-menu-en.json new file mode 100644 index 0000000000..520e6f6c7f --- /dev/null +++ b/apps/desktop/tests/expected/devtools-menu-en.json @@ -0,0 +1,12 @@ +[ + { + "role": "toggleDevTools", + "label": "Toggle developer tools" + }, + { + "role": "toggleDevTools", + "label": "Toggle developer tools", + "visible": false, + "accelerator": "F12" + } +] diff --git a/apps/desktop/tests/expected/devtools-menu-zh-CN.json b/apps/desktop/tests/expected/devtools-menu-zh-CN.json new file mode 100644 index 0000000000..189c1a1652 --- /dev/null +++ b/apps/desktop/tests/expected/devtools-menu-zh-CN.json @@ -0,0 +1,12 @@ +[ + { + "role": "toggleDevTools", + "label": "切换开发者工具" + }, + { + "role": "toggleDevTools", + "label": "切换开发者工具", + "visible": false, + "accelerator": "F12" + } +] diff --git a/apps/desktop/tests/expected/devtools-menu.json b/apps/desktop/tests/expected/devtools-menu.json deleted file mode 100644 index d83b18e2a7..0000000000 --- a/apps/desktop/tests/expected/devtools-menu.json +++ /dev/null @@ -1,10 +0,0 @@ -[ - { - "role": "toggleDevTools" - }, - { - "role": "toggleDevTools", - "visible": false, - "accelerator": "F12" - } -] diff --git a/apps/desktop/tests/main-startup.spec.ts b/apps/desktop/tests/main-startup.spec.ts index 3438c58e73..31d2632378 100644 --- a/apps/desktop/tests/main-startup.spec.ts +++ b/apps/desktop/tests/main-startup.spec.ts @@ -550,11 +550,24 @@ describe('desktop main startup', () => { expect((await handler(new Request('dsh-app://unknown/update-dialog.html'))).status).toBe(404) }) - it.each(['darwin', 'win32', 'linux'] as const)('shows one DevTools command and retains native shortcuts on %s', async (platform) => { + it.each([ + ['darwin', 'en'], ['darwin', 'zh-CN'], ['win32', 'en'], ['win32', 'zh-CN'], ['linux', 'en'], ['linux', 'zh-CN'], + ] as const)('localizes one DevTools command and retains native shortcuts on %s (%s)', async (platform, locale) => { vi.stubGlobal('process', { ...process, platform }) + vi.spyOn(harness.app, 'getPreferredSystemLanguages').mockReturnValue([locale]) await readyForUpdate() await expect(JSON.stringify(applicationMenuItems().slice(-2), null, 2) + '\n') - .toMatchFileSnapshot('./expected/devtools-menu.json') + .toMatchFileSnapshot(`./expected/devtools-menu-${locale}.json`) + const sender = harness.windows[0]!.webContents + const nextLocale = locale === 'en' ? 'zh' : 'en' + harness.ipcOn.mock.calls.find(([channel]) => channel === DESKTOP_IPC.localeChanged)![1]( + { sender, senderFrame: sender.mainFrame }, nextLocale, + ) + const refreshed = platform === 'win32' ? applicationMenuItems() + : harness.menu.mock.lastCall![0][0]!.submenu as MenuItemConstructorOptions[] + expect(refreshed.filter(item => item.role === 'toggleDevTools').map(item => item.label)) + .toEqual([nextLocale === 'en' ? en.toggleDevToolsMenu : zh.toggleDevToolsMenu, + nextLocale === 'en' ? en.toggleDevToolsMenu : zh.toggleDevToolsMenu]) expect(harness.windows[0]!.options).toMatchObject({ webPreferences: { devTools: true } }) }) @@ -863,8 +876,8 @@ describe('desktop main startup', () => { expect(window.options).toMatchObject({ titleBarStyle: 'hidden', titleBarOverlay: { height: WINDOWS_TITLEBAR_HEIGHT } }) expect(window.options).not.toHaveProperty('vibrancy') expect(harness.menu.mock.calls[0]![0]).toEqual([ - { role: 'toggleDevTools', visible: false }, - { role: 'toggleDevTools', visible: false, accelerator: 'F12' }, + { role: 'toggleDevTools', label: en.toggleDevToolsMenu, visible: false }, + { role: 'toggleDevTools', label: en.toggleDevToolsMenu, visible: false, accelerator: 'F12' }, ]) } else { expect(window.options).not.toHaveProperty('titleBarStyle') @@ -1029,7 +1042,7 @@ describe('desktop main startup', () => { expect(() => handler(event, 'application', NaN, 34)).toThrow('invalid popup request') const application = handler(event, 'application', 48, 34) expect(harness.menu.buildFromTemplate.mock.lastCall![0].map(item => item.label ?? item.type ?? item.role)).toEqual([ - '关于 DeepSeek Harness', 'separator', '检查更新…', '管理 dsh 命令…', 'separator', '退出', 'toggleDevTools', 'toggleDevTools', + '关于 DeepSeek Harness', 'separator', '检查更新…', '管理 dsh 命令…', 'separator', '退出', zh.toggleDevToolsMenu, zh.toggleDevToolsMenu, ]) expect(harness.popup.mock.lastCall![0]).toMatchObject({ window, x: 48, y: 34 }) expect(harness.popup.mock.lastCall![0].callback).toBeTypeOf('function') From b83f38a44bea252387446367c69fb00214e75fa2 Mon Sep 17 00:00:00 2001 From: 07akioni <07akioni2@gmail.com> Date: Thu, 29 Oct 2026 14:10:47 +0800 Subject: [PATCH 3/4] fix(desktop): group DevTools before quit and isolate shortcuts --- apps/desktop/README.i18n.yaml | 4 +- apps/desktop/README.md | 2 +- apps/desktop/README.zh.md | 2 +- apps/desktop/src/main.ts | 16 +++--- .../expected/application-menu-en-US.json | 20 +++++++ .../expected/application-menu-zh-CN.json | 20 +++++++ .../tests/expected/devtools-menu-en.json | 12 ---- .../tests/expected/devtools-menu-zh-CN.json | 12 ---- apps/desktop/tests/main-startup.spec.ts | 57 +++++++++++++------ 9 files changed, 93 insertions(+), 52 deletions(-) delete mode 100644 apps/desktop/tests/expected/devtools-menu-en.json delete mode 100644 apps/desktop/tests/expected/devtools-menu-zh-CN.json diff --git a/apps/desktop/README.i18n.yaml b/apps/desktop/README.i18n.yaml index 43dbdfd13a..ebba241bcf 100644 --- a/apps/desktop/README.i18n.yaml +++ b/apps/desktop/README.i18n.yaml @@ -15,8 +15,8 @@ en: 127ea90553cb6af7 zh: 7b1c5aec8558c684 /deepseek-harness-desktop/application-overview: - en: 4f92dcaf5d306d39 - zh: b08f13aec0fae481 + en: 0538b12e3cfd357e + zh: 48d35ed422cfdb5c /deepseek-harness-desktop/terminal-command: en: 5f2d25a1d8472647 zh: 2acb5c5d7d1917e2 diff --git a/apps/desktop/README.md b/apps/desktop/README.md index a67e5766cc..de5b09d192 100644 --- a/apps/desktop/README.md +++ b/apps/desktop/README.md @@ -53,7 +53,7 @@ A server-expired account credential returns to Welcome when no official API key Desktop microphone access is restricted to audio requests from the primary `dsh-app://app` frame. macOS uses system microphone authorization, a packaged usage description, and `com.apple.security.device.audio-input` in the main application and Helper signatures. -Press F12 (Fn+F12 on media-key keyboards), Command+Option+I on macOS, or Ctrl+Shift+I on Windows to toggle DevTools for the focused application page, including in packaged builds. The application menu also shows a DevTools toggle in the selected Desktop language; F12 remains available as a hidden shortcut alias. Update overlays and packaged embedded browser guests disable DevTools. +Press F12 (Fn+F12 on media-key keyboards), Command+Option+I on macOS, or Ctrl+Shift+I on Windows to toggle DevTools for the focused application page, including in packaged builds. The application menu shows a localized DevTools toggle in a separate group before Hide and Quit (before Exit on Windows). Windows exposes it in the titlebar application popup; its hidden native application menu registers the shortcuts. macOS and Linux keep a hidden F12 shortcut alias in their application menus. Update overlays and packaged embedded browser guests disable DevTools. diff --git a/apps/desktop/README.zh.md b/apps/desktop/README.zh.md index 19b30f4de1..551c43aa6c 100644 --- a/apps/desktop/README.zh.md +++ b/apps/desktop/README.zh.md @@ -53,7 +53,7 @@ Desktop Host 的 Platform API 请求与更新策略请求用相同的 Platform 桌面麦克风访问仅允许主 `dsh-app://app` 页面发起的音频请求。macOS 使用系统麦克风授权、随包用途说明,以及主应用与 Helper 签名中的 `com.apple.security.device.audio-input` 权限。 -按 F12(多媒体功能键键盘上为 Fn+F12)、macOS 的 Command+Option+I 或 Windows 的 Ctrl+Shift+I,可切换当前获得焦点的应用页面的 DevTools,打包版本同样支持。应用菜单也以当前桌面端语言显示 DevTools 开关;F12 仍作为隐藏的快捷键别名保留。更新遮罩和打包版本的内嵌浏览器禁用 DevTools。 +按 F12(多媒体功能键键盘上为 Fn+F12)、macOS 的 Command+Option+I 或 Windows 的 Ctrl+Shift+I,可切换当前获得焦点的应用页面的 DevTools,打包版本同样支持。应用菜单在隐藏和退出命令之前的独立分组中显示本地化的 DevTools 开关。Windows 在标题栏的应用弹出菜单中显示开关,通过隐藏的原生应用菜单注册快捷键;macOS 和 Linux 的应用菜单保留隐藏的 F12 快捷键别名。更新遮罩和打包版本的内嵌浏览器禁用 DevTools。 diff --git a/apps/desktop/src/main.ts b/apps/desktop/src/main.ts index c85f48c13d..d8d0e30c4c 100644 --- a/apps/desktop/src/main.ts +++ b/apps/desktop/src/main.ts @@ -1060,8 +1060,8 @@ async function main(): Promise { { label: currentDesktopLocale().messages.checkUpdatesMenu, click: () => { void openUpdatePrompt(true) } }, ...process.platform === 'darwin' || process.platform === 'win32' ? [{ label: currentDesktopLocale().messages.cliCommandMenu, click: () => { void commandManager.show() } }] : [], + { type: 'separator' }, ...development ? [ - { type: 'separator' as const }, { label: currentDesktopLocale().messages.reloadPageMenu, role: 'reload' as const }, { label: currentDesktopLocale().messages.restartAppHostMenu, click: () => { if (quitting) return @@ -1069,20 +1069,22 @@ async function main(): Promise { quitWithoutConfirmation() } }, ] : [], + { role: 'toggleDevTools', label: currentDesktopLocale().messages.toggleDevToolsMenu }, { type: 'separator' }, ...hideCommands, { role: 'quit', ...(darwin ? { label: currentDesktopLocale().messages.quitApplication } : process.platform === 'win32' ? { label: currentDesktopLocale().messages.exitApplication } : {}) }, ] - const devToolsItems = (): MenuItemConstructorOptions[] => [ - { role: 'toggleDevTools', label: currentDesktopLocale().messages.toggleDevToolsMenu }, - { role: 'toggleDevTools', label: currentDesktopLocale().messages.toggleDevToolsMenu, visible: false, accelerator: 'F12' }, + const devToolsF12Shortcut: MenuItemConstructorOptions = { role: 'toggleDevTools', visible: false, accelerator: 'F12' } + const windowsDevToolsShortcuts: MenuItemConstructorOptions[] = [ + { role: 'toggleDevTools', visible: false }, + devToolsF12Shortcut, ] const refreshApplicationMenu = (): void => { Menu.setApplicationMenu(Menu.buildFromTemplate(process.platform === 'win32' - ? devToolsItems().map(item => ({ ...item, visible: false })) : [{ + ? windowsDevToolsShortcuts : [{ label: darwin ? app.name : currentDesktopLocale().messages.application, - submenu: [...applicationItems(), ...devToolsItems()], + submenu: [...applicationItems(), devToolsF12Shortcut], }, ...platformMenus()])) tray?.relabel() } @@ -1129,7 +1131,7 @@ async function main(): Promise { shortcuts.sendEditingKey(keyCode, modifiers) }, }) - const items: MenuItemConstructorOptions[] = name === 'application' ? [...applicationItems(), ...devToolsItems()] : [ + const items: MenuItemConstructorOptions[] = name === 'application' ? applicationItems() : [ editItem(currentDesktopLocale().messages.undo, 'Z', ['control'], 'Ctrl+Z'), editItem(currentDesktopLocale().messages.redo, 'Y', ['control'], 'Ctrl+Y'), { type: 'separator' }, diff --git a/apps/desktop/tests/expected/application-menu-en-US.json b/apps/desktop/tests/expected/application-menu-en-US.json index 4e3c981919..93dda0d979 100644 --- a/apps/desktop/tests/expected/application-menu-en-US.json +++ b/apps/desktop/tests/expected/application-menu-en-US.json @@ -1,10 +1,27 @@ [ + { + "label": "About DeepSeek Harness", + "role": "about" + }, + { + "type": "separator" + }, { "label": "Check for Updates…" }, { "label": "Manage dsh Command…" }, + { + "type": "separator" + }, + { + "role": "toggleDevTools", + "label": "Toggle developer tools" + }, + { + "type": "separator" + }, { "role": "hide", "label": "Hide DeepSeek Harness" @@ -17,6 +34,9 @@ "role": "unhide", "label": "Show All" }, + { + "type": "separator" + }, { "role": "quit", "label": "Quit DeepSeek Harness" diff --git a/apps/desktop/tests/expected/application-menu-zh-CN.json b/apps/desktop/tests/expected/application-menu-zh-CN.json index f39b2d88ae..f1699e23ee 100644 --- a/apps/desktop/tests/expected/application-menu-zh-CN.json +++ b/apps/desktop/tests/expected/application-menu-zh-CN.json @@ -1,10 +1,27 @@ [ + { + "label": "关于 DeepSeek Harness", + "role": "about" + }, + { + "type": "separator" + }, { "label": "检查更新…" }, { "label": "管理 dsh 命令…" }, + { + "type": "separator" + }, + { + "role": "toggleDevTools", + "label": "切换开发者工具" + }, + { + "type": "separator" + }, { "role": "hide", "label": "隐藏 DeepSeek Harness" @@ -17,6 +34,9 @@ "role": "unhide", "label": "显示全部" }, + { + "type": "separator" + }, { "role": "quit", "label": "退出 DeepSeek Harness" diff --git a/apps/desktop/tests/expected/devtools-menu-en.json b/apps/desktop/tests/expected/devtools-menu-en.json deleted file mode 100644 index 520e6f6c7f..0000000000 --- a/apps/desktop/tests/expected/devtools-menu-en.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "role": "toggleDevTools", - "label": "Toggle developer tools" - }, - { - "role": "toggleDevTools", - "label": "Toggle developer tools", - "visible": false, - "accelerator": "F12" - } -] diff --git a/apps/desktop/tests/expected/devtools-menu-zh-CN.json b/apps/desktop/tests/expected/devtools-menu-zh-CN.json deleted file mode 100644 index 189c1a1652..0000000000 --- a/apps/desktop/tests/expected/devtools-menu-zh-CN.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "role": "toggleDevTools", - "label": "切换开发者工具" - }, - { - "role": "toggleDevTools", - "label": "切换开发者工具", - "visible": false, - "accelerator": "F12" - } -] diff --git a/apps/desktop/tests/main-startup.spec.ts b/apps/desktop/tests/main-startup.spec.ts index 31d2632378..3b1e63e00c 100644 --- a/apps/desktop/tests/main-startup.spec.ts +++ b/apps/desktop/tests/main-startup.spec.ts @@ -550,14 +550,40 @@ describe('desktop main startup', () => { expect((await handler(new Request('dsh-app://unknown/update-dialog.html'))).status).toBe(404) }) - it.each([ + it.each(([ ['darwin', 'en'], ['darwin', 'zh-CN'], ['win32', 'en'], ['win32', 'zh-CN'], ['linux', 'en'], ['linux', 'zh-CN'], - ] as const)('localizes one DevTools command and retains native shortcuts on %s (%s)', async (platform, locale) => { + ] as const).flatMap(([platform, locale]) => [ + [platform, locale, true] as const, [platform, locale, false] as const, + ]))('groups localized DevTools before quit on %s (%s, packaged=%s)', async (platform, locale, packaged) => { vi.stubGlobal('process', { ...process, platform }) + harness.app.isPackaged = packaged vi.spyOn(harness.app, 'getPreferredSystemLanguages').mockReturnValue([locale]) await readyForUpdate() - await expect(JSON.stringify(applicationMenuItems().slice(-2), null, 2) + '\n') - .toMatchFileSnapshot(`./expected/devtools-menu-${locale}.json`) + const messages = locale === 'en' ? en : zh + const menu = applicationMenuItems() + const visible = menu.filter(item => item.visible !== false) + expect(visible.map(item => item.role === 'quit' ? 'quit' : item.label ?? item.type)).toEqual([ + messages.aboutMenu, 'separator', messages.checkUpdatesMenu, + ...platform === 'linux' ? [] : [messages.cliCommandMenu], + 'separator', ...packaged ? [] : [messages.reloadPageMenu, messages.restartAppHostMenu], + messages.toggleDevToolsMenu, 'separator', + ...platform === 'darwin' ? [messages.hideApplication, messages.hideOtherApplications, messages.showAllApplications, 'separator'] : [], + 'quit', + ]) + expect(visible.filter(item => item.role === 'toggleDevTools')).toEqual([ + { role: 'toggleDevTools', label: messages.toggleDevToolsMenu }, + ]) + if (platform === 'win32') { + expect(harness.menu.mock.calls[0]![0]).toEqual([ + { role: 'toggleDevTools', visible: false }, + { role: 'toggleDevTools', visible: false, accelerator: 'F12' }, + ]) + expect(menu.every(item => item.visible !== false)).toBe(true) + } else { + expect(menu.filter(item => item.visible === false)).toEqual([ + { role: 'toggleDevTools', visible: false, accelerator: 'F12' }, + ]) + } const sender = harness.windows[0]!.webContents const nextLocale = locale === 'en' ? 'zh' : 'en' harness.ipcOn.mock.calls.find(([channel]) => channel === DESKTOP_IPC.localeChanged)![1]( @@ -565,9 +591,9 @@ describe('desktop main startup', () => { ) const refreshed = platform === 'win32' ? applicationMenuItems() : harness.menu.mock.lastCall![0][0]!.submenu as MenuItemConstructorOptions[] - expect(refreshed.filter(item => item.role === 'toggleDevTools').map(item => item.label)) - .toEqual([nextLocale === 'en' ? en.toggleDevToolsMenu : zh.toggleDevToolsMenu, - nextLocale === 'en' ? en.toggleDevToolsMenu : zh.toggleDevToolsMenu]) + expect(refreshed.filter(item => item.role === 'toggleDevTools' && item.visible !== false)).toEqual([ + { role: 'toggleDevTools', label: nextLocale === 'en' ? en.toggleDevToolsMenu : zh.toggleDevToolsMenu }, + ]) expect(harness.windows[0]!.options).toMatchObject({ webPreferences: { devTools: true } }) }) @@ -876,8 +902,8 @@ describe('desktop main startup', () => { expect(window.options).toMatchObject({ titleBarStyle: 'hidden', titleBarOverlay: { height: WINDOWS_TITLEBAR_HEIGHT } }) expect(window.options).not.toHaveProperty('vibrancy') expect(harness.menu.mock.calls[0]![0]).toEqual([ - { role: 'toggleDevTools', label: en.toggleDevToolsMenu, visible: false }, - { role: 'toggleDevTools', label: en.toggleDevToolsMenu, visible: false, accelerator: 'F12' }, + { role: 'toggleDevTools', visible: false }, + { role: 'toggleDevTools', visible: false, accelerator: 'F12' }, ]) } else { expect(window.options).not.toHaveProperty('titleBarStyle') @@ -1041,8 +1067,8 @@ describe('desktop main startup', () => { expect(() => handler(event, 'arbitrary-command', 48, 34)).toThrow('invalid popup request') expect(() => handler(event, 'application', NaN, 34)).toThrow('invalid popup request') const application = handler(event, 'application', 48, 34) - expect(harness.menu.buildFromTemplate.mock.lastCall![0].map(item => item.label ?? item.type ?? item.role)).toEqual([ - '关于 DeepSeek Harness', 'separator', '检查更新…', '管理 dsh 命令…', 'separator', '退出', zh.toggleDevToolsMenu, zh.toggleDevToolsMenu, + expect(harness.menu.buildFromTemplate.mock.lastCall![0].map(item => item.label ?? item.type)).toEqual([ + '关于 DeepSeek Harness', 'separator', '检查更新…', '管理 dsh 命令…', 'separator', zh.toggleDevToolsMenu, 'separator', '退出', ]) expect(harness.popup.mock.lastCall![0]).toMatchObject({ window, x: 48, y: 34 }) expect(harness.popup.mock.lastCall![0].callback).toBeTypeOf('function') @@ -1079,8 +1105,8 @@ describe('desktop main startup', () => { : ['Application', 'editMenu']) const application = template[0]!.submenu as MenuItemConstructorOptions[] expect(application.filter(item => item.visible !== false).map(describeItem)).toEqual(platform === 'darwin' - ? ['about', 'separator', en.checkUpdatesMenu, en.cliCommandMenu, 'separator', 'hide', 'hideOthers', 'unhide', 'separator', 'quit', 'toggleDevTools'] - : ['about', 'separator', en.checkUpdatesMenu, 'separator', 'quit', 'toggleDevTools']) + ? ['about', 'separator', en.checkUpdatesMenu, en.cliCommandMenu, 'separator', 'toggleDevTools', 'separator', 'hide', 'hideOthers', 'unhide', 'separator', 'quit'] + : ['about', 'separator', en.checkUpdatesMenu, 'separator', 'toggleDevTools', 'separator', 'quit']) expect(harness.menu.setApplicationMenu).toHaveBeenCalledOnce() }) @@ -1093,10 +1119,7 @@ describe('desktop main startup', () => { try { await import('../src/main.ts') await harness.preparing.promise - const commands = applicationMenuItems().filter(item => - item.role === 'hide' || item.role === 'hideOthers' || item.role === 'unhide' || item.role === 'quit' - || item.label === en.checkUpdatesMenu || item.label === zh.checkUpdatesMenu - || item.label === en.cliCommandMenu || item.label === zh.cliCommandMenu) + const commands = applicationMenuItems().filter(item => item.visible !== false) await expect(JSON.stringify(commands, null, 2) + '\n') .toMatchFileSnapshot(`./expected/application-menu-${locale}.json`) expect(harness.app.name).toBe('@deepseek-ai/dsh-desktop') From bc705e0ff18a2b3fac900ee37b07808916825486 Mon Sep 17 00:00:00 2001 From: 07akioni <07akioni2@gmail.com> Date: Thu, 29 Oct 2026 14:31:22 +0800 Subject: [PATCH 4/4] fix(desktop): use developer tools as the localized menu name --- apps/desktop/README.i18n.yaml | 4 ++-- apps/desktop/README.md | 2 +- apps/desktop/README.zh.md | 2 +- apps/desktop/src/locale.ts | 16 ++++++++-------- .../tests/expected/application-menu-en-US.json | 2 +- .../tests/expected/application-menu-zh-CN.json | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/apps/desktop/README.i18n.yaml b/apps/desktop/README.i18n.yaml index ebba241bcf..3dfceaccd1 100644 --- a/apps/desktop/README.i18n.yaml +++ b/apps/desktop/README.i18n.yaml @@ -15,8 +15,8 @@ en: 127ea90553cb6af7 zh: 7b1c5aec8558c684 /deepseek-harness-desktop/application-overview: - en: 0538b12e3cfd357e - zh: 48d35ed422cfdb5c + en: 1667e3d6ffddea4a + zh: 4661a42b9ef4f673 /deepseek-harness-desktop/terminal-command: en: 5f2d25a1d8472647 zh: 2acb5c5d7d1917e2 diff --git a/apps/desktop/README.md b/apps/desktop/README.md index de5b09d192..fe24b24568 100644 --- a/apps/desktop/README.md +++ b/apps/desktop/README.md @@ -53,7 +53,7 @@ A server-expired account credential returns to Welcome when no official API key Desktop microphone access is restricted to audio requests from the primary `dsh-app://app` frame. macOS uses system microphone authorization, a packaged usage description, and `com.apple.security.device.audio-input` in the main application and Helper signatures. -Press F12 (Fn+F12 on media-key keyboards), Command+Option+I on macOS, or Ctrl+Shift+I on Windows to toggle DevTools for the focused application page, including in packaged builds. The application menu shows a localized DevTools toggle in a separate group before Hide and Quit (before Exit on Windows). Windows exposes it in the titlebar application popup; its hidden native application menu registers the shortcuts. macOS and Linux keep a hidden F12 shortcut alias in their application menus. Update overlays and packaged embedded browser guests disable DevTools. +Press F12 (Fn+F12 on media-key keyboards), Command+Option+I on macOS, or Ctrl+Shift+I on Windows to toggle DevTools for the focused application page, including in packaged builds. The application menu shows a localized “Developer tools” command in a separate group before Hide and Quit (before Exit on Windows). Windows exposes it in the titlebar application popup; its hidden native application menu registers the shortcuts. macOS and Linux keep a hidden F12 shortcut alias in their application menus. Update overlays and packaged embedded browser guests disable DevTools. diff --git a/apps/desktop/README.zh.md b/apps/desktop/README.zh.md index 551c43aa6c..933e329ce1 100644 --- a/apps/desktop/README.zh.md +++ b/apps/desktop/README.zh.md @@ -53,7 +53,7 @@ Desktop Host 的 Platform API 请求与更新策略请求用相同的 Platform 桌面麦克风访问仅允许主 `dsh-app://app` 页面发起的音频请求。macOS 使用系统麦克风授权、随包用途说明,以及主应用与 Helper 签名中的 `com.apple.security.device.audio-input` 权限。 -按 F12(多媒体功能键键盘上为 Fn+F12)、macOS 的 Command+Option+I 或 Windows 的 Ctrl+Shift+I,可切换当前获得焦点的应用页面的 DevTools,打包版本同样支持。应用菜单在隐藏和退出命令之前的独立分组中显示本地化的 DevTools 开关。Windows 在标题栏的应用弹出菜单中显示开关,通过隐藏的原生应用菜单注册快捷键;macOS 和 Linux 的应用菜单保留隐藏的 F12 快捷键别名。更新遮罩和打包版本的内嵌浏览器禁用 DevTools。 +按 F12(多媒体功能键键盘上为 Fn+F12)、macOS 的 Command+Option+I 或 Windows 的 Ctrl+Shift+I,可切换当前获得焦点的应用页面的 DevTools,打包版本同样支持。应用菜单在隐藏和退出命令之前的独立分组中显示本地化的“开发者工具”命令。Windows 在标题栏的应用弹出菜单中显示开关,通过隐藏的原生应用菜单注册快捷键;macOS 和 Linux 的应用菜单保留隐藏的 F12 快捷键别名。更新遮罩和打包版本的内嵌浏览器禁用 DevTools。 diff --git a/apps/desktop/src/locale.ts b/apps/desktop/src/locale.ts index 09f4002894..f5d30b82ba 100644 --- a/apps/desktop/src/locale.ts +++ b/apps/desktop/src/locale.ts @@ -104,7 +104,7 @@ export const en = { welcomeContinueFailed: 'Could not open the workspace. Please try again.', checkUpdatesMenu: 'Check for Updates…', reloadPageMenu: 'Reload Page', - toggleDevToolsMenu: 'Toggle developer tools', + toggleDevToolsMenu: 'Developer tools', restartAppHostMenu: 'Restart App and Host', updateCheckFailedTitle: 'Update Check Failed', updateCheckFailed: 'Could not check for updates. Please try again later.', @@ -284,7 +284,7 @@ export const zh = { welcomeContinueFailed: '无法打开工作区,请重试。', checkUpdatesMenu: '检查更新…', reloadPageMenu: '刷新页面', - toggleDevToolsMenu: '切换开发者工具', + toggleDevToolsMenu: '开发者工具', restartAppHostMenu: '重启应用与 Host', updateCheckFailedTitle: '更新检查失败', updateCheckFailed: '检查更新失败,请稍后重试。', @@ -462,7 +462,7 @@ export const ja = { welcomeContinueFailed: 'ワークスペースを開けませんでした。もう一度お試しください。', checkUpdatesMenu: 'アップデートを確認…', reloadPageMenu: 'ページを再読み込み', - toggleDevToolsMenu: '開発者ツールを切り替え', + toggleDevToolsMenu: '開発者ツール', restartAppHostMenu: 'アプリとホストを再起動', updateCheckFailedTitle: 'アップデートの確認に失敗しました', updateCheckFailed: 'アップデートを確認できませんでした。後でもう一度お試しください。', @@ -640,7 +640,7 @@ export const es = { welcomeContinueFailed: 'No se pudo abrir el espacio de trabajo. Por favor inténtalo de nuevo.', checkUpdatesMenu: 'Buscar actualizaciones...', reloadPageMenu: 'Recargar página', - toggleDevToolsMenu: 'Alternar herramientas de desarrollo', + toggleDevToolsMenu: 'Herramientas de desarrollo', restartAppHostMenu: 'Reiniciar la aplicación y el host', updateCheckFailedTitle: 'Error en la comprobación de actualización', updateCheckFailed: 'No se pudo buscar actualizaciones. Inténtelo de nuevo más tarde.', @@ -818,7 +818,7 @@ export const fr = { welcomeContinueFailed: "Impossible d'ouvrir l'espace de travail. Veuillez réessayer.", checkUpdatesMenu: 'Vérifiez les mises à jour…', reloadPageMenu: 'Recharger la page', - toggleDevToolsMenu: 'Afficher/masquer les outils de développement', + toggleDevToolsMenu: 'Outils de développement', restartAppHostMenu: "Redémarrez l'application et l'hôte", updateCheckFailedTitle: 'Échec de la vérification de la mise à jour', updateCheckFailed: 'Impossible de vérifier les mises à jour. Veuillez réessayer plus tard.', @@ -996,7 +996,7 @@ export const de = { welcomeContinueFailed: 'Der Arbeitsbereich konnte nicht geöffnet werden. Bitte versuchen Sie es erneut.', checkUpdatesMenu: 'Nach Updates suchen…', reloadPageMenu: 'Seite neu laden', - toggleDevToolsMenu: 'Entwicklertools ein-/ausblenden', + toggleDevToolsMenu: 'Entwicklertools', restartAppHostMenu: 'Anwendung und Host neu starten', updateCheckFailedTitle: 'Update-Überprüfung fehlgeschlagen', updateCheckFailed: 'Es konnte nicht nach Updates gesucht werden. Bitte versuchen Sie es später noch einmal.', @@ -1174,7 +1174,7 @@ export const ru = { welcomeContinueFailed: 'Не удалось открыть рабочую область. Пожалуйста, попробуйте еще раз.', checkUpdatesMenu: 'Проверить наличие обновлений…', reloadPageMenu: 'Обновить страницу', - toggleDevToolsMenu: 'Показать/скрыть инструменты разработчика', + toggleDevToolsMenu: 'Инструменты разработчика', restartAppHostMenu: 'Перезапустите приложение и хост.', updateCheckFailedTitle: 'Проверка обновления не удалась', updateCheckFailed: 'Не удалось проверить наличие обновлений. Пожалуйста, повторите попытку позже.', @@ -1352,7 +1352,7 @@ export const pt = { welcomeContinueFailed: 'Não foi possível abrir o espaço de trabalho. Por favor, tente novamente.', checkUpdatesMenu: 'Verifique se há atualizações…', reloadPageMenu: 'Recarregar página', - toggleDevToolsMenu: 'Alternar ferramentas de desenvolvedor', + toggleDevToolsMenu: 'Ferramentas do desenvolvedor', restartAppHostMenu: 'Reinicie o aplicativo e o host', updateCheckFailedTitle: 'Falha na verificação de atualização', updateCheckFailed: 'Não foi possível verificar se há atualizações. Por favor, tente novamente mais tarde.', diff --git a/apps/desktop/tests/expected/application-menu-en-US.json b/apps/desktop/tests/expected/application-menu-en-US.json index 93dda0d979..71b281c6b2 100644 --- a/apps/desktop/tests/expected/application-menu-en-US.json +++ b/apps/desktop/tests/expected/application-menu-en-US.json @@ -17,7 +17,7 @@ }, { "role": "toggleDevTools", - "label": "Toggle developer tools" + "label": "Developer tools" }, { "type": "separator" diff --git a/apps/desktop/tests/expected/application-menu-zh-CN.json b/apps/desktop/tests/expected/application-menu-zh-CN.json index f1699e23ee..472aa48a8e 100644 --- a/apps/desktop/tests/expected/application-menu-zh-CN.json +++ b/apps/desktop/tests/expected/application-menu-zh-CN.json @@ -17,7 +17,7 @@ }, { "role": "toggleDevTools", - "label": "切换开发者工具" + "label": "开发者工具" }, { "type": "separator"