chore(desktop): i18n strings for tabs, zones, and session menus

This commit is contained in:
Brooklyn Nicholson 2026-07-13 17:28:32 -04:00
parent 369d0eeeff
commit aff205dcc2
5 changed files with 320 additions and 6 deletions

View file

@ -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',

View file

@ -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: 'セッションを読み込み中',

View file

@ -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

View file

@ -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: '正在載入工作階段',

View file

@ -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: '正在加载会话',