From aff205dcc26ba23ae11a48b7bb40800b14096ab0 Mon Sep 17 00:00:00 2001 From: Brooklyn Nicholson Date: Mon, 13 Jul 2026 17:28:32 -0400 Subject: [PATCH] chore(desktop): i18n strings for tabs, zones, and session menus --- apps/desktop/src/i18n/en.ts | 80 ++++++++++++++++++++++++++++++-- apps/desktop/src/i18n/ja.ts | 48 +++++++++++++++++++ apps/desktop/src/i18n/types.ts | 71 ++++++++++++++++++++++++++++ apps/desktop/src/i18n/zh-hant.ts | 48 +++++++++++++++++++ apps/desktop/src/i18n/zh.ts | 79 +++++++++++++++++++++++++++++-- 5 files changed, 320 insertions(+), 6 deletions(-) diff --git a/apps/desktop/src/i18n/en.ts b/apps/desktop/src/i18n/en.ts index 456f9cf388a4..2a5733233c0d 100644 --- a/apps/desktop/src/i18n/en.ts +++ b/apps/desktop/src/i18n/en.ts @@ -190,7 +190,9 @@ export const en: Translations = { unmuteHaptics: 'Unmute haptics', openSettings: 'Open settings', openStarmap: 'Open memory graph', - openKeybinds: 'Keyboard shortcuts' + openKeybinds: 'Keyboard shortcuts', + layoutEditor: 'Layout editor', + layoutEditorTitle: 'Layout editor — ⌘-click resets the layout' }, keybinds: { @@ -221,6 +223,7 @@ export const en: Translations = { 'nav.cron': 'Open scheduled jobs', 'nav.agents': 'Open agents', 'session.new': 'New session', + 'session.newTab': 'New session tab', 'session.newWindow': 'New session in window', 'session.next': 'Next session', 'session.prev': 'Previous session', @@ -249,7 +252,8 @@ export const en: Translations = { 'view.prevTerminal': 'Previous terminal', 'view.closeTerminal': 'Close terminal', 'view.terminalSelection': 'Send terminal selection to composer', - 'view.closePreviewTab': 'Close preview tab', + 'view.closeTab': 'Close tab', + 'view.reopenTab': 'Reopen closed tab', 'view.flipPanes': 'Swap sidebar sides', 'appearance.toggleMode': 'Toggle light / dark', 'profile.default': 'Switch to default profile', @@ -316,7 +320,22 @@ export const en: Translations = { mcp: 'MCP', archivedChats: 'Archived Chats', about: 'About', - notifications: 'Notifications' + notifications: 'Notifications', + plugins: 'Plugins' + }, + plugins: { + title: 'Desktop plugins', + blurb: + 'UI extensions loaded into this app — bundled with the build, or dropped into the desktop-plugins folder (including ones Hermes writes). Disabling unloads a plugin live and survives restarts.', + count: n => `${n} installed`, + openFolder: 'Open plugins folder', + rescan: 'Rescan', + reveal: 'Reveal in file manager', + enable: 'Enable', + disable: 'Disable', + failed: 'failed', + empty: 'No desktop plugins installed yet.', + kinds: { bundled: 'bundled', disk: 'on disk', runtime: 'runtime' } }, notifications: { title: 'Notifications', @@ -985,6 +1004,7 @@ export const en: Translations = { goTo: 'Go to', goToSession: 'Go to session', branches: 'Branches', + commands: 'Commands', startInBranch: branch => `New conversation in ${branch}`, commandCenter: 'Command Center', appearance: 'Appearance', @@ -1625,6 +1645,9 @@ export const en: Translations = { rename: 'Rename', archive: 'Archive', newWindow: 'New window', + hideTabBar: 'Hide tab bar', + openInNewTab: 'Open in new tab', + openInSplit: 'Open in split', copyIdFailed: 'Could not copy session ID', actionsFor: title => `Actions for ${title}`, sessionActions: 'Session actions', @@ -2280,6 +2303,57 @@ export const en: Translations = { } }, + zones: { + showHeader: 'Show header', + hideHeader: 'Hide header', + minimize: 'Minimize', + restore: 'Restore', + closeRunningTitle: 'Close running tab?', + closeRunningBody: 'This chat is still working (or waiting on your input). Closing the tab hides it — the session keeps its progress and can be reopened from the sidebar.', + closeRunningConfirm: 'Close tab', + closeOthers: 'Close others', + closeToRight: 'Close to the right', + closeAll: 'Close all', + split: dir => `Split ${dir}`, + move: dir => `Move ${dir}`, + dirUp: 'up', + dirDown: 'down', + dirLeft: 'left', + dirRight: 'right', + stackHere: 'Stack here', + moveHere: 'Move here', + splitHere: 'Split here', + openHere: 'Open here', + spanHere: 'Span here', + staysHere: 'Stays here', + pluginDisabled: pluginId => `Plugin "${pluginId}" disabled`, + pluginDisabledBody: 'Re-enable it in Settings → Plugins to bring the pane back.', + missingPane: paneId => `missing pane: ${paneId}`, + editTitle: 'Layouts', + editHint: 'Pick a layout, or drag panes between zones. Right-click a zone to split.', + reset: 'Reset', + templates: 'Templates', + custom: 'Custom', + newGridLayout: 'New grid layout', + saveCurrentAs: 'Save current arrangement as a template', + nameLayoutPlaceholder: 'Name this layout…', + deletePreset: name => `Delete ${name}`, + zoneEditorTitle: 'Zone editor', + editorHintPre: 'click to split · ', + editorHintPost: ' flips the line · drag across zones to merge · drag shared edges to resize', + templateColumns: 'Columns', + templateRows: 'Rows', + templateGrid: 'Grid', + templatePriority: 'Priority', + zoneTag: index => `zone ${index}`, + mergeZones: count => `Merge ${count} zones`, + customZoneName: count => `Custom ${count}-zone`, + layoutNamePlaceholder: fallback => `Layout name (${fallback})`, + saveApply: 'Save & apply', + notExpressible: 'this arrangement interlocks (pinwheel) — not expressible as nested splits yet', + zoneCount: count => `${count} zones` + }, + assistant: { thread: { loadingSession: 'Loading session', diff --git a/apps/desktop/src/i18n/ja.ts b/apps/desktop/src/i18n/ja.ts index 2ff315235655..1ed2b7a2a70b 100644 --- a/apps/desktop/src/i18n/ja.ts +++ b/apps/desktop/src/i18n/ja.ts @@ -2222,6 +2222,54 @@ export const ja = defineLocale({ } }, + zones: { + showHeader: 'ヘッダーを表示', + hideHeader: 'ヘッダーを隠す', + minimize: '最小化', + restore: '復元', + closeOthers: '他を閉じる', + closeToRight: '右側を閉じる', + closeAll: 'すべて閉じる', + split: dir => `${dir}に分割`, + move: dir => `${dir}へ移動`, + dirUp: '上', + dirDown: '下', + dirLeft: '左', + dirRight: '右', + stackHere: 'ここに重ねる', + moveHere: 'ここに移動', + splitHere: 'ここに分割', + openHere: 'ここに開く', + spanHere: 'ここにまたがる', + staysHere: 'ここにとどまる', + pluginDisabled: pluginId => `プラグイン「${pluginId}」を無効化しました`, + pluginDisabledBody: '設定 → プラグイン で再有効化するとペインが戻ります。', + missingPane: paneId => `ペインが見つかりません: ${paneId}`, + editTitle: 'レイアウト', + editHint: 'レイアウトを選ぶか、ペインをゾーン間へドラッグ。ゾーンを右クリックで分割。', + reset: 'リセット', + templates: 'テンプレート', + custom: 'カスタム', + newGridLayout: '新しいグリッドレイアウト', + saveCurrentAs: '現在の配置をテンプレートとして保存', + nameLayoutPlaceholder: 'レイアウト名を入力…', + deletePreset: name => `${name} を削除`, + zoneEditorTitle: 'ゾーンエディター', + editorHintPre: 'クリックで分割 · ', + editorHintPost: ' で線の向きを反転 · ゾーンをまたいでドラッグで結合 · 共有辺をドラッグでリサイズ', + templateColumns: '列', + templateRows: '行', + templateGrid: 'グリッド', + templatePriority: '優先', + zoneTag: index => `ゾーン ${index}`, + mergeZones: count => `${count} 個のゾーンを結合`, + customZoneName: count => `カスタム ${count} ゾーン`, + layoutNamePlaceholder: fallback => `レイアウト名(${fallback})`, + saveApply: '保存して適用', + notExpressible: 'この配置は互いに噛み合っています(風車型)— 入れ子の分割では表現できません', + zoneCount: count => `${count} ゾーン` + }, + assistant: { thread: { loadingSession: 'セッションを読み込み中', diff --git a/apps/desktop/src/i18n/types.ts b/apps/desktop/src/i18n/types.ts index 66709b4fae35..b1601f1e678f 100644 --- a/apps/desktop/src/i18n/types.ts +++ b/apps/desktop/src/i18n/types.ts @@ -232,6 +232,8 @@ export interface Translations { openSettings: string openStarmap: string openKeybinds: string + layoutEditor: string + layoutEditorTitle: string } keybinds: { @@ -277,6 +279,20 @@ export interface Translations { archivedChats: string about: string notifications: string + plugins: string + } + plugins: { + title: string + blurb: string + count: (n: number) => string + openFolder: string + rescan: string + reveal: string + enable: string + disable: string + failed: string + empty: string + kinds: { bundled: string; disk: string; runtime: string } } notifications: { title: string @@ -865,6 +881,7 @@ export interface Translations { goTo: string goToSession: string branches: string + commands: string startInBranch: (branch: string) => string commandCenter: string appearance: string @@ -1350,6 +1367,9 @@ export interface Translations { rename: string archive: string newWindow: string + hideTabBar: string + openInNewTab: string + openInSplit: string copyIdFailed: string actionsFor: (title: string) => string sessionActions: string @@ -1908,6 +1928,57 @@ export interface Translations { } } + zones: { + showHeader: string + hideHeader: string + minimize: string + restore: string + closeRunningTitle: string + closeRunningBody: string + closeRunningConfirm: string + closeOthers: string + closeToRight: string + closeAll: string + split: (dir: string) => string + move: (dir: string) => string + dirUp: string + dirDown: string + dirLeft: string + dirRight: string + stackHere: string + moveHere: string + splitHere: string + openHere: string + spanHere: string + staysHere: string + pluginDisabled: (pluginId: string) => string + pluginDisabledBody: string + missingPane: (paneId: string) => string + editTitle: string + editHint: string + reset: string + templates: string + custom: string + newGridLayout: string + saveCurrentAs: string + nameLayoutPlaceholder: string + deletePreset: (name: string) => string + zoneEditorTitle: string + editorHintPre: string + editorHintPost: string + templateColumns: string + templateRows: string + templateGrid: string + templatePriority: string + zoneTag: (index: number) => string + mergeZones: (count: number) => string + customZoneName: (count: number) => string + layoutNamePlaceholder: (fallback: string) => string + saveApply: string + notExpressible: string + zoneCount: (count: number) => string + } + assistant: { thread: { loadingSession: string diff --git a/apps/desktop/src/i18n/zh-hant.ts b/apps/desktop/src/i18n/zh-hant.ts index d5a04e34f487..6779b4548f99 100644 --- a/apps/desktop/src/i18n/zh-hant.ts +++ b/apps/desktop/src/i18n/zh-hant.ts @@ -2155,6 +2155,54 @@ export const zhHant = defineLocale({ } }, + zones: { + showHeader: '顯示標題列', + hideHeader: '隱藏標題列', + minimize: '最小化', + restore: '還原', + closeOthers: '關閉其他', + closeToRight: '關閉右側', + closeAll: '全部關閉', + split: dir => `向${dir}分割`, + move: dir => `向${dir}移動`, + dirUp: '上', + dirDown: '下', + dirLeft: '左', + dirRight: '右', + stackHere: '堆疊到此處', + moveHere: '移動到此處', + splitHere: '在此分割', + openHere: '在此開啟', + spanHere: '跨越到此處', + staysHere: '留在此處', + pluginDisabled: pluginId => `外掛「${pluginId}」已停用`, + pluginDisabledBody: '在 設定 → 外掛 中重新啟用即可恢復面板。', + missingPane: paneId => `缺少面板:${paneId}`, + editTitle: '版面配置', + editHint: '選擇一個版面配置,或在區域之間拖曳面板。右鍵點擊區域可分割。', + reset: '重設', + templates: '範本', + custom: '自訂', + newGridLayout: '新增網格版面', + saveCurrentAs: '將目前排列儲存為範本', + nameLayoutPlaceholder: '為版面命名…', + deletePreset: name => `刪除 ${name}`, + zoneEditorTitle: '區域編輯器', + editorHintPre: '點擊分割 · ', + editorHintPost: ' 翻轉分割線 · 拖曳跨越多個區域可合併 · 拖曳共用邊可調整大小', + templateColumns: '欄', + templateRows: '列', + templateGrid: '網格', + templatePriority: '優先', + zoneTag: index => `區域 ${index}`, + mergeZones: count => `合併 ${count} 個區域`, + customZoneName: count => `自訂 ${count} 區`, + layoutNamePlaceholder: fallback => `版面名稱(${fallback})`, + saveApply: '儲存並套用', + notExpressible: '此排列互相咬合(風車形)——暫時無法表示為巢狀分割', + zoneCount: count => `${count} 個區域` + }, + assistant: { thread: { loadingSession: '正在載入工作階段', diff --git a/apps/desktop/src/i18n/zh.ts b/apps/desktop/src/i18n/zh.ts index 83000e9e91c6..7f84ebb03280 100644 --- a/apps/desktop/src/i18n/zh.ts +++ b/apps/desktop/src/i18n/zh.ts @@ -185,7 +185,9 @@ export const zh: Translations = { unmuteHaptics: '开启触感反馈', openSettings: '打开设置', openStarmap: '打开记忆图谱', - openKeybinds: '键盘快捷键' + openKeybinds: '键盘快捷键', + layoutEditor: '布局编辑器', + layoutEditorTitle: '布局编辑器 — ⌘ 点击重置布局' }, keybinds: { @@ -216,6 +218,7 @@ export const zh: Translations = { 'nav.cron': '打开定时任务', 'nav.agents': '打开智能体', 'session.new': '新建会话', + 'session.newTab': '新建会话标签', 'session.newWindow': '在新窗口中新建会话', 'session.next': '下一个会话', 'session.prev': '上一个会话', @@ -240,7 +243,8 @@ export const zh: Translations = { 'view.showFiles': '显示文件浏览器', 'view.showTerminal': '显示终端', 'view.terminalSelection': '将终端选区发送到输入框', - 'view.closePreviewTab': '关闭预览标签', + 'view.closeTab': '关闭标签', + 'view.reopenTab': '重新打开已关闭的标签', 'view.flipPanes': '交换侧边栏位置', 'appearance.toggleMode': '切换浅色/深色', 'profile.default': '切换到默认配置', @@ -307,7 +311,21 @@ export const zh: Translations = { mcp: 'MCP', archivedChats: '已归档对话', about: '关于', - notifications: '通知' + notifications: '通知', + plugins: '插件' + }, + plugins: { + title: '桌面插件', + blurb: '加载到此应用中的界面扩展——随构建捆绑,或放入 desktop-plugins 文件夹(包括 Hermes 编写的插件)。禁用会即时卸载插件并在重启后保持。', + count: n => `已安装 ${n} 个`, + openFolder: '打开插件文件夹', + rescan: '重新扫描', + reveal: '在文件管理器中显示', + enable: '启用', + disable: '禁用', + failed: '失败', + empty: '尚未安装桌面插件。', + kinds: { bundled: '内置', disk: '磁盘', runtime: '运行时' } }, notifications: { title: '通知', @@ -1166,6 +1184,7 @@ export const zh: Translations = { goTo: '前往', goToSession: '前往会话', branches: '分支', + commands: '命令', startInBranch: branch => `在 ${branch} 中开始新对话`, commandCenter: '命令中心', appearance: '外观', @@ -1800,6 +1819,9 @@ export const zh: Translations = { rename: '重命名', archive: '归档', newWindow: '新窗口', + hideTabBar: '隐藏标签栏', + openInNewTab: '在新标签页中打开', + openInSplit: '在分屏中打开', copyIdFailed: '无法复制会话 ID', actionsFor: title => `${title} 的操作`, sessionActions: '会话操作', @@ -2442,6 +2464,57 @@ export const zh: Translations = { } }, + zones: { + showHeader: '显示标题栏', + hideHeader: '隐藏标题栏', + minimize: '最小化', + restore: '还原', + closeRunningTitle: '关闭正在运行的标签?', + closeRunningBody: '此对话仍在运行(或正在等待你的输入)。关闭标签只会隐藏它——会话将保留进度,可从侧边栏重新打开。', + closeRunningConfirm: '关闭标签', + closeOthers: '关闭其他', + closeToRight: '关闭右侧', + closeAll: '全部关闭', + split: dir => `向${dir}拆分`, + move: dir => `向${dir}移动`, + dirUp: '上', + dirDown: '下', + dirLeft: '左', + dirRight: '右', + stackHere: '堆叠到此处', + moveHere: '移动到此处', + splitHere: '在此拆分', + openHere: '在此打开', + spanHere: '跨越到此处', + staysHere: '留在此处', + pluginDisabled: pluginId => `插件“${pluginId}”已禁用`, + pluginDisabledBody: '在 设置 → 插件 中重新启用即可恢复面板。', + missingPane: paneId => `缺少面板:${paneId}`, + editTitle: '布局', + editHint: '选择一个布局,或在区域之间拖动面板。右键点击区域可拆分。', + reset: '重置', + templates: '模板', + custom: '自定义', + newGridLayout: '新建网格布局', + saveCurrentAs: '将当前排列保存为模板', + nameLayoutPlaceholder: '为布局命名…', + deletePreset: name => `删除 ${name}`, + zoneEditorTitle: '区域编辑器', + editorHintPre: '点击拆分 · ', + editorHintPost: ' 翻转分割线 · 拖过多个区域可合并 · 拖动共享边可调整大小', + templateColumns: '列', + templateRows: '行', + templateGrid: '网格', + templatePriority: '优先', + zoneTag: index => `区域 ${index}`, + mergeZones: count => `合并 ${count} 个区域`, + customZoneName: count => `自定义 ${count} 区`, + layoutNamePlaceholder: fallback => `布局名称(${fallback})`, + saveApply: '保存并应用', + notExpressible: '此排列互相咬合(风车形)——暂无法表示为嵌套拆分', + zoneCount: count => `${count} 个区域` + }, + assistant: { thread: { loadingSession: '正在加载会话',