From a391523bccc35af2bdee558734600a496da02420 Mon Sep 17 00:00:00 2001 From: Brooklyn Nicholson Date: Thu, 25 Jun 2026 16:40:27 -0500 Subject: [PATCH] i18n(desktop): add project and worktree strings --- apps/desktop/src/i18n/en.ts | 140 ++++++++++++++++++++++++++++++- apps/desktop/src/i18n/ja.ts | 136 +++++++++++++++++++++++++++++- apps/desktop/src/i18n/types.ts | 132 ++++++++++++++++++++++++++++- apps/desktop/src/i18n/zh-hant.ts | 133 ++++++++++++++++++++++++++++- apps/desktop/src/i18n/zh.ts | 138 +++++++++++++++++++++++++++++- 5 files changed, 661 insertions(+), 18 deletions(-) diff --git a/apps/desktop/src/i18n/en.ts b/apps/desktop/src/i18n/en.ts index 851792f8163..06c8db7a445 100644 --- a/apps/desktop/src/i18n/en.ts +++ b/apps/desktop/src/i18n/en.ts @@ -42,6 +42,22 @@ export const en: Translations = { off: 'Off' }, + fileMenu: { + revealFinder: 'Reveal in Finder', + revealExplorer: 'Reveal in File Explorer', + revealFileManager: 'Open Containing Folder', + revealInSidebar: 'Reveal in filetree', + copyPath: 'Copy Path', + copyRelativePath: 'Copy Relative Path', + rename: 'Rename…', + delete: 'Delete', + renameTitle: 'Rename', + renameLabel: 'New name', + deleteTitle: name => `Delete ${name}?`, + deleteBody: 'It will be moved to the Trash — you can restore it from there.', + pathCopied: 'Path copied' + }, + boot: { ready: 'Hermes Desktop is ready', desktopBootFailedWithMessage: message => `Desktop boot failed: ${message}`, @@ -210,11 +226,13 @@ export const en: Translations = { 'session.slot.9': 'Switch to recent session 9', 'session.focusSearch': 'Search sessions', 'session.togglePin': 'Pin / unpin current session', + 'workspace.newWorktree': 'New worktree', 'composer.focus': 'Focus composer', 'composer.modelPicker': 'Open model picker', 'composer.voice': 'Start / stop voice conversation', 'view.toggleSidebar': 'Toggle sessions sidebar', 'view.toggleRightSidebar': 'Toggle file browser', + 'view.toggleReview': 'Toggle review pane', 'view.showFiles': 'Show file browser', 'view.showTerminal': 'Show terminal', 'view.terminalSelection': 'Send terminal selection to composer', @@ -759,6 +777,8 @@ export const en: Translations = { searchPlaceholder: 'Search sessions, views, and actions', goTo: 'Go to', goToSession: 'Go to session', + branches: 'Branches', + startInBranch: branch => `New conversation in ${branch}`, commandCenter: 'Command Center', appearance: 'Appearance', settings: 'Settings', @@ -1254,13 +1274,73 @@ export const en: Translations = { cronJobs: 'Cron jobs', groupAriaGrouped: 'Show sessions as a single list', groupAriaUngrouped: 'Group sessions by workspace', + showProjects: 'Show projects', + showSessions: 'Show sessions', groupTitleGrouped: 'Ungroup sessions', groupTitleUngrouped: 'Group by workspace', allPinned: 'Everything here is pinned. Unpin a chat to show it in recents.', shiftClickHint: 'Shift-click a chat to pin', noWorkspace: 'No workspace', + noProject: 'No project', + projectEmpty: 'No sessions yet', + noSessions: 'No sessions yet', + projects: { + sectionLabel: 'Projects', + newButton: 'New project', + createTitle: 'New project', + createDesc: 'Name a workspace and add one or more folders.', + renameTitle: 'Rename project', + addFolderTitle: 'Add folder', + namePlaceholder: 'e.g. Skunkworks', + foldersLabel: 'Folders', + ideaLabel: 'Idea', + ideaPlaceholder: "What's this project about? (saved to IDEA.md)", + ideaGenerate: 'Generate idea', + ideaGenerating: 'Generating…', + ideaShuffle: 'Shuffle templates', + noFolders: 'No folders added yet.', + addFolder: 'Add folder', + primaryBadge: 'primary', + removeFolder: 'Remove', + create: 'Create', + menu: 'Project actions', + menuRename: 'Rename', + menuAppearance: 'Appearance', + noColor: 'No color', + menuAddFolder: 'Add folder', + menuSetActive: 'Set active', + menuDelete: 'Delete', + reveal: 'Reveal in folder', + copyPath: 'Copy path', + removeFromSidebar: 'Hide from sidebar', + createFailed: 'Could not create project', + deleteConfirm: 'This removes the saved project from Hermes. Files, git repos, and worktrees stay untouched.', + startWork: 'New worktree', + newWorktreeTitle: 'New worktree', + newWorktreeDesc: 'Name the branch for this worktree.', + branchPlaceholder: 'e.g. my-feature', + startWorkFailed: 'Could not create worktree', + convertBranch: 'Convert a branch…', + convertBranchTitle: 'Convert a branch', + convertBranchDesc: 'Check an existing branch out into a new worktree.', + convertBranchPlaceholder: 'Search branches…', + convertBranchInstead: 'Convert an existing branch', + branchCheckedOut: 'checked out', + branchesLoading: 'Loading branches…', + noBranches: 'No branches found', + removeWorktree: 'Remove worktree', + removeWorktreeFailed: 'Could not remove worktree (uncommitted changes?)', + removeWorktreeConfirm: + 'Remove it from git (deletes the worktree directory; the branch stays), or just hide the lane from the sidebar and leave the worktree on disk.', + removeWorktreeDirty: + 'This worktree has uncommitted changes. Force-remove it (discards those changes), or just hide the lane and keep it on disk.', + forceRemove: 'Force remove', + enter: label => `Open ${label}`, + reorder: label => `Reorder ${label}`, + toggle: label => `Toggle ${label} sessions`, + back: 'All projects' + }, newSessionIn: label => `New session in ${label}`, - reorderWorkspace: label => `Reorder workspace ${label}`, showMoreIn: (count, label) => `Show ${count} more in ${label}`, loading: 'Loading…', loadMore: 'Load more', @@ -1270,6 +1350,7 @@ export const en: Translations = { unpin: 'Unpin', copyId: 'Copy ID', export: 'Export', + branchFrom: 'Branch', rename: 'Rename', archive: 'Archive', newWindow: 'New window', @@ -1429,7 +1510,51 @@ export const en: Translations = { running: 'Running', stop: 'Stop', dismiss: 'Dismiss', - exit: code => `exit ${code}` + exit: code => `exit ${code}`, + coding: { + title: 'Working tree', + noBranch: 'No branch', + detached: 'detached', + clean: 'Clean', + changed: count => `${count} changed`, + ahead: count => `${count} ahead`, + behind: count => `${count} behind`, + review: 'Review', + close: 'Close', + openChanges: 'Open Changes', + openFile: 'Open File', + stage: 'Stage', + unstage: 'Unstage', + stageAll: 'Stage all', + viewAsTree: 'View as tree', + viewAsList: 'View as list', + revert: 'Revert', + revertAll: 'Revert all', + revertConfirm: 'Discard changes to this file and restore it to the committed state? This cannot be undone.', + revertAllConfirm: 'Discard every change and restore files to the committed state? This cannot be undone.', + staged: 'Staged', + noChanges: 'No changes', + notRepo: 'Not a git repository', + noDiff: 'No diff to show', + scopeUncommitted: 'Uncommitted', + scopeBranch: 'Branch', + scopeLastTurn: 'Last turn', + commit: 'Commit', + commitAndPush: 'Commit & Push', + commitPlaceholder: 'Message (⌘↵ to commit)', + generateCommitMessage: 'Generate commit message', + stopGenerating: 'Stop generating', + createPr: 'Create PR', + openPr: 'Open PR', + ghMissing: 'Install the GitHub CLI (gh) and sign in to open PRs', + agentShip: 'Ask Hermes to open PR', + agentShipPrompt: 'Review the current changes, commit them with a clear conventional-commit message, push the branch, and open a pull request.', + newBranch: 'New branch', + branchOffFrom: base => `New branch from ${base}`, + switchTo: branch => `Switch to ${branch}`, + switchFailed: branch => `Could not switch to ${branch}`, + worktrees: 'Worktrees' + } }, updates: { @@ -1732,7 +1857,9 @@ export const en: Translations = { previewUnavailable: 'Preview unavailable', couldNotPreview: path => `Could not preview ${path}`, noProjectTitle: 'No project', - noProjectBody: 'Set a working directory from the status bar to browse files.', + noProjectBody: 'Open a project to browse its files and review changes.', + noProjectOpen: 'No project open', + noDiffs: 'No diffs', unreadableTitle: 'Unreadable', unreadableBody: error => `Could not read this folder (${error}).`, emptyTitle: 'Empty', @@ -1749,6 +1876,9 @@ export const en: Translations = { preview: { tab: 'Preview', closeTab: label => `Close ${label}`, + closeOthers: 'Close others', + closeToRight: 'Close to the right', + closeAll: 'Close all', closePane: 'Close preview pane', loading: 'Loading preview', unavailable: 'Preview unavailable', @@ -1756,9 +1886,11 @@ export const en: Translations = { hide: 'Hide', openPreview: 'Open preview', openInBrowser: 'Open in browser', + linkHint: '⌘/Ctrl-click for preview pane', sourceLineTitle: 'Click to select · shift-click to extend · drag to composer', source: 'SOURCE', renderedPreview: 'PREVIEW', + diff: 'DIFF', unknownSize: 'unknown size', binaryTitle: 'This looks like a binary file', binaryBody: label => `Previewing ${label} may show unreadable text.`, @@ -2018,7 +2150,7 @@ export const en: Translations = { sessionBusy: 'Session busy', branchStopCurrent: 'Stop the current turn before branching this chat.', branchNoText: 'This message has no text to branch from.', - branchTitle: 'Branch', + branchTitle: n => `Draft: Branch #${n}`, branchFailed: 'Branch failed', deleteFailed: 'Delete failed', archived: 'Archived', diff --git a/apps/desktop/src/i18n/ja.ts b/apps/desktop/src/i18n/ja.ts index c58cc6be1f0..7d59019f010 100644 --- a/apps/desktop/src/i18n/ja.ts +++ b/apps/desktop/src/i18n/ja.ts @@ -42,6 +42,22 @@ export const ja = defineLocale({ off: 'オフ' }, + fileMenu: { + revealFinder: 'Finder で表示', + revealExplorer: 'エクスプローラーで表示', + revealFileManager: '格納フォルダーを開く', + revealInSidebar: 'ファイルツリーで表示', + copyPath: 'パスをコピー', + copyRelativePath: '相対パスをコピー', + rename: '名前を変更…', + delete: '削除', + renameTitle: '名前を変更', + renameLabel: '新しい名前', + deleteTitle: name => `${name} を削除しますか?`, + deleteBody: 'ゴミ箱に移動します。そこから復元できます。', + pathCopied: 'パスをコピーしました' + }, + boot: { ready: 'Hermes Desktop の準備ができました', desktopBootFailedWithMessage: message => `デスクトップの起動に失敗しました: ${message}`, @@ -877,6 +893,8 @@ export const ja = defineLocale({ searchPlaceholder: 'セッション、ビュー、アクションを検索', goTo: '移動', goToSession: 'セッションへ移動', + branches: 'ブランチ', + startInBranch: branch => `${branch} で新しい会話`, commandCenter: 'コマンドセンター', appearance: '外観', settings: '設定', @@ -1380,13 +1398,70 @@ export const ja = defineLocale({ cronJobs: 'Cronジョブ', groupAriaGrouped: 'セッションを単一リストとして表示', groupAriaUngrouped: 'ワークスペースごとにセッションをグループ化', + showProjects: 'プロジェクトを表示', + showSessions: 'セッションを表示', groupTitleGrouped: 'セッションのグループ化を解除', groupTitleUngrouped: 'ワークスペースでグループ化', allPinned: 'ここにあるものはすべてピン留めされています。チャットのピン留めを解除すると最近のものに表示されます。', shiftClickHint: 'Shift クリックでピン留め · ドラッグで並べ替え', noWorkspace: 'ワークスペースなし', + noProject: 'プロジェクトなし', + projectEmpty: 'セッションはまだありません', + noSessions: 'セッションはまだありません', + projects: { + sectionLabel: 'プロジェクト', + newButton: '新規プロジェクト', + createTitle: '新規プロジェクト', + createDesc: 'ワークスペースに名前を付け、1つ以上のフォルダを追加します。', + renameTitle: 'プロジェクト名を変更', + addFolderTitle: 'フォルダを追加', + namePlaceholder: '例: Skunkworks', + foldersLabel: 'フォルダ', + ideaLabel: 'アイデア', + ideaPlaceholder: 'このプロジェクトは何ですか?(IDEA.md に保存)', + ideaGenerate: 'アイデアを生成', + ideaGenerating: '生成中…', + ideaShuffle: 'テンプレートをシャッフル', + noFolders: 'まだフォルダがありません。', + addFolder: 'フォルダを追加', + primaryBadge: 'メイン', + removeFolder: '削除', + create: '作成', + menu: 'プロジェクト操作', + menuRename: '名前を変更', + menuAppearance: '外観', + noColor: '色なし', + menuAddFolder: 'フォルダを追加', + menuSetActive: 'アクティブに設定', + menuDelete: '削除', + reveal: 'フォルダで表示', + copyPath: 'パスをコピー', + removeFromSidebar: 'サイドバーから削除', + createFailed: 'プロジェクトを作成できませんでした', + deleteConfirm: 'Hermes から保存済みプロジェクトを削除します。ファイル・git リポジトリ・ワークツリーはそのまま残ります。', + startWork: '新しいワークツリー', + newWorktreeTitle: '新しいワークツリー', + newWorktreeDesc: 'このワークツリーのブランチ名を入力してください。', + branchPlaceholder: '例: my-feature', + startWorkFailed: 'ワークツリーを作成できませんでした', + convertBranch: 'ブランチを変換…', + convertBranchTitle: 'ブランチを変換', + convertBranchDesc: '既存のブランチを新しいワークツリーにチェックアウトします。', + convertBranchPlaceholder: 'ブランチを検索…', + convertBranchInstead: '既存のブランチを変換', + branchCheckedOut: 'チェックアウト済み', + branchesLoading: 'ブランチを読み込み中…', + noBranches: 'ブランチが見つかりません', + removeWorktree: 'ワークツリーを削除', + removeWorktreeFailed: 'ワークツリーを削除できませんでした(コミットされていない変更?)', + removeWorktreeConfirm: + 'git から削除(ワークツリーのディレクトリを削除しますが、ブランチは残ります)するか、サイドバーからレーンを隠してワークツリーをディスク上に残します。', + removeWorktreeDirty: + 'このワークツリーにはコミットされていない変更があります。強制削除(変更を破棄)するか、レーンを隠してディスク上に残します。', + forceRemove: '強制削除', + enter: label => `${label} を開く` + }, newSessionIn: label => `${label} で新しいセッション`, - reorderWorkspace: label => `ワークスペース ${label} を並べ替え`, showMoreIn: (count, label) => `${label} でさらに ${count} 件を表示`, loading: '読み込み中…', loadMore: 'さらに読み込む', @@ -1396,6 +1471,7 @@ export const ja = defineLocale({ unpin: 'ピン留めを解除', copyId: 'ID をコピー', export: 'エクスポート', + branchFrom: '分岐', rename: '名前を変更', archive: 'アーカイブ', newWindow: '新しいウィンドウ', @@ -1555,7 +1631,52 @@ export const ja = defineLocale({ running: '実行中', stop: '停止', dismiss: '閉じる', - exit: code => `終了コード ${code}` + exit: code => `終了コード ${code}`, + coding: { + title: 'ワークツリー', + noBranch: 'ブランチなし', + detached: 'デタッチ', + clean: 'クリーン', + changed: count => `${count} 件変更`, + ahead: count => `${count} 先行`, + behind: count => `${count} 遅延`, + review: 'レビュー', + close: '閉じる', + openChanges: '変更を開く', + openFile: 'ファイルを開く', + stage: 'ステージ', + unstage: 'ステージ解除', + stageAll: 'すべてステージ', + viewAsTree: 'ツリー表示', + viewAsList: 'リスト表示', + revert: '取り消し', + revertAll: 'すべて取り消し', + revertConfirm: 'このファイルの変更を破棄してコミット済みの状態に戻しますか?この操作は元に戻せません。', + revertAllConfirm: 'すべての変更を破棄してコミット済みの状態に戻しますか?この操作は元に戻せません。', + staged: 'ステージ済み', + noChanges: '変更なし', + notRepo: 'Git リポジトリではありません', + noDiff: '表示する差分がありません', + scopeUncommitted: '未コミット', + scopeBranch: 'ブランチ', + scopeLastTurn: '前のターン', + commit: 'コミット', + commitAndPush: 'コミットしてプッシュ', + commitPlaceholder: 'メッセージ(⌘↵ でコミット)', + generateCommitMessage: 'コミットメッセージを生成', + stopGenerating: '生成を停止', + createPr: 'PR を作成', + openPr: 'PR を開く', + ghMissing: 'PR を開くには GitHub CLI (gh) をインストールしてサインインしてください', + agentShip: 'Hermes にコミットと PR を任せる', + agentShipPrompt: + '現在の変更を確認し、分かりやすい Conventional Commits 形式でコミットし、ブランチをプッシュして、プルリクエストを作成してください。', + newBranch: '新しいブランチ', + branchOffFrom: base => `${base} から新しいブランチ`, + switchTo: branch => `${branch} に切り替え`, + switchFailed: branch => `${branch} に切り替えできませんでした`, + worktrees: 'ワークツリー' + } }, updates: { @@ -1860,7 +1981,9 @@ export const ja = defineLocale({ previewUnavailable: 'プレビューは利用できません', couldNotPreview: path => `${path} をプレビューできませんでした`, noProjectTitle: 'プロジェクトなし', - noProjectBody: 'ステータスバーから作業ディレクトリを設定してファイルを閲覧してください。', + noProjectBody: 'プロジェクトを開くと、ファイルの閲覧と変更の確認ができます。', + noProjectOpen: 'プロジェクト未選択', + noDiffs: '差分なし', unreadableTitle: '読み取り不可', unreadableBody: error => `このフォルダーを読み取れませんでした (${error})。`, emptyTitle: '空', @@ -1877,6 +2000,9 @@ export const ja = defineLocale({ preview: { tab: 'プレビュー', closeTab: label => `${label} を閉じる`, + closeOthers: '他を閉じる', + closeToRight: '右側を閉じる', + closeAll: 'すべて閉じる', closePane: 'プレビューペインを閉じる', loading: 'プレビューを読み込み中', unavailable: 'プレビューは利用できません', @@ -1884,9 +2010,11 @@ export const ja = defineLocale({ hide: '非表示', openPreview: 'プレビューを開く', openInBrowser: 'ブラウザで開く', + linkHint: '⌘/Ctrl+クリックでプレビューペイン', sourceLineTitle: 'クリックして選択 · Shift クリックで拡張 · コンポーザーにドラッグ', source: 'ソース', renderedPreview: 'プレビュー', + diff: '差分', unknownSize: 'サイズ不明', binaryTitle: 'これはバイナリファイルのようです', binaryBody: label => `${label} をプレビューすると読み取り不能なテキストが表示される場合があります。`, @@ -2162,7 +2290,7 @@ export const ja = defineLocale({ sessionBusy: 'セッションが使用中', branchStopCurrent: 'このチャットをブランチする前に現在のターンを停止してください。', branchNoText: 'このメッセージにはブランチするテキストがありません。', - branchTitle: 'ブランチ', + branchTitle: n => `下書き: ブランチ #${n}`, branchFailed: 'ブランチに失敗しました', deleteFailed: '削除に失敗しました', archived: 'アーカイブしました', diff --git a/apps/desktop/src/i18n/types.ts b/apps/desktop/src/i18n/types.ts index 4986030231c..221ec8a65ac 100644 --- a/apps/desktop/src/i18n/types.ts +++ b/apps/desktop/src/i18n/types.ts @@ -87,6 +87,22 @@ export interface Translations { off: string } + fileMenu: { + revealFinder: string + revealExplorer: string + revealFileManager: string + revealInSidebar: string + copyPath: string + copyRelativePath: string + rename: string + delete: string + renameTitle: string + renameLabel: string + deleteTitle: (name: string) => string + deleteBody: string + pathCopied: string + } + boot: { ready: string desktopBootFailedWithMessage: (message: string) => string @@ -663,6 +679,8 @@ export interface Translations { searchPlaceholder: string goTo: string goToSession: string + branches: string + startInBranch: (branch: string) => string commandCenter: string appearance: string settings: string @@ -1007,13 +1025,71 @@ export interface Translations { cronJobs: string groupAriaGrouped: string groupAriaUngrouped: string + showProjects: string + showSessions: string groupTitleGrouped: string groupTitleUngrouped: string allPinned: string shiftClickHint: string noWorkspace: string + noProject: string + projectEmpty: string + noSessions: string + projects: { + sectionLabel: string + newButton: string + createTitle: string + createDesc: string + renameTitle: string + addFolderTitle: string + namePlaceholder: string + foldersLabel: string + ideaLabel: string + ideaPlaceholder: string + ideaGenerate: string + ideaGenerating: string + ideaShuffle: string + noFolders: string + addFolder: string + primaryBadge: string + removeFolder: string + create: string + menu: string + menuRename: string + menuAppearance: string + noColor: string + menuAddFolder: string + menuSetActive: string + menuDelete: string + reveal: string + copyPath: string + removeFromSidebar: string + createFailed: string + deleteConfirm: string + startWork: string + newWorktreeTitle: string + newWorktreeDesc: string + branchPlaceholder: string + startWorkFailed: string + convertBranch: string + convertBranchTitle: string + convertBranchDesc: string + convertBranchPlaceholder: string + convertBranchInstead: string + branchCheckedOut: string + branchesLoading: string + noBranches: string + removeWorktree: string + removeWorktreeFailed: string + removeWorktreeConfirm: string + removeWorktreeDirty: string + forceRemove: string + enter: (label: string) => string + reorder: (label: string) => string + toggle: (label: string) => string + back: string + } newSessionIn: (label: string) => string - reorderWorkspace: (label: string) => string showMoreIn: (count: number, label: string) => string loading: string loadMore: string @@ -1023,6 +1099,7 @@ export interface Translations { unpin: string copyId: string export: string + branchFrom: string rename: string archive: string newWindow: string @@ -1135,6 +1212,50 @@ export interface Translations { stop: string dismiss: string exit: (code: number) => string + coding: { + title: string + noBranch: string + detached: string + clean: string + changed: (count: number) => string + ahead: (count: number) => string + behind: (count: number) => string + review: string + close: string + openChanges: string + openFile: string + stage: string + unstage: string + stageAll: string + viewAsTree: string + viewAsList: string + revert: string + revertAll: string + revertConfirm: string + revertAllConfirm: string + staged: string + noChanges: string + notRepo: string + noDiff: string + scopeUncommitted: string + scopeBranch: string + scopeLastTurn: string + commit: string + commitAndPush: string + commitPlaceholder: string + generateCommitMessage: string + stopGenerating: string + createPr: string + openPr: string + ghMissing: string + agentShip: string + agentShipPrompt: string + newBranch: string + branchOffFrom: (base: string) => string + switchTo: (branch: string) => string + switchFailed: (branch: string) => string + worktrees: string + } } updates: { @@ -1396,6 +1517,8 @@ export interface Translations { couldNotPreview: (path: string) => string noProjectTitle: string noProjectBody: string + noProjectOpen: string + noDiffs: string unreadableTitle: string unreadableBody: (error: string) => string emptyTitle: string @@ -1412,6 +1535,9 @@ export interface Translations { preview: { tab: string closeTab: (label: string) => string + closeOthers: string + closeToRight: string + closeAll: string closePane: string loading: string unavailable: string @@ -1419,9 +1545,11 @@ export interface Translations { hide: string openPreview: string openInBrowser: string + linkHint: string sourceLineTitle: string source: string renderedPreview: string + diff: string unknownSize: string binaryTitle: string binaryBody: (label: string) => string @@ -1640,7 +1768,7 @@ export interface Translations { sessionBusy: string branchStopCurrent: string branchNoText: string - branchTitle: string + branchTitle: (n: number) => string branchFailed: string deleteFailed: string archived: string diff --git a/apps/desktop/src/i18n/zh-hant.ts b/apps/desktop/src/i18n/zh-hant.ts index 7bd0473625b..c29bd5e1a24 100644 --- a/apps/desktop/src/i18n/zh-hant.ts +++ b/apps/desktop/src/i18n/zh-hant.ts @@ -42,6 +42,22 @@ export const zhHant = defineLocale({ off: '關閉' }, + fileMenu: { + revealFinder: '在 Finder 中顯示', + revealExplorer: '在檔案總管中顯示', + revealFileManager: '開啟所在資料夾', + revealInSidebar: '在檔案樹中顯示', + copyPath: '複製路徑', + copyRelativePath: '複製相對路徑', + rename: '重新命名…', + delete: '刪除', + renameTitle: '重新命名', + renameLabel: '新名稱', + deleteTitle: name => `刪除 ${name}?`, + deleteBody: '將移至垃圾桶,你可以從那裡還原。', + pathCopied: '已複製路徑' + }, + boot: { ready: 'Hermes Desktop 已就緒', desktopBootFailedWithMessage: message => `桌面啟動失敗:${message}`, @@ -849,6 +865,8 @@ export const zhHant = defineLocale({ searchPlaceholder: '搜尋工作階段、檢視和動作', goTo: '前往', goToSession: '前往工作階段', + branches: '分支', + startInBranch: branch => `在 ${branch} 中開始新對話`, commandCenter: '命令中心', appearance: '外觀', settings: '設定', @@ -1333,13 +1351,68 @@ export const zhHant = defineLocale({ cronJobs: '排程任務', groupAriaGrouped: '以單一清單顯示工作階段', groupAriaUngrouped: '依工作區分組工作階段', + showProjects: '顯示專案', + showSessions: '顯示工作階段', groupTitleGrouped: '取消分組', groupTitleUngrouped: '依工作區分組', allPinned: '這裡的全部已釘選。取消釘選某個聊天即可在最近中顯示。', shiftClickHint: 'Shift + 點擊聊天以釘選 · 拖曳以重新排序', noWorkspace: '無工作區', + noProject: '無專案', + projectEmpty: '尚無工作階段', + noSessions: '尚無工作階段', + projects: { + sectionLabel: '專案', + newButton: '新增專案', + createTitle: '新增專案', + createDesc: '為工作區命名並新增一個或多個資料夾。', + renameTitle: '重新命名專案', + addFolderTitle: '新增資料夾', + namePlaceholder: '例如 Skunkworks', + foldersLabel: '資料夾', + ideaLabel: '想法', + ideaPlaceholder: '這個專案是關於什麼的?(儲存到 IDEA.md)', + ideaGenerate: '產生想法', + ideaGenerating: '產生中…', + ideaShuffle: '隨機範本', + noFolders: '尚未新增資料夾。', + addFolder: '新增資料夾', + primaryBadge: '主要', + removeFolder: '移除', + create: '建立', + menu: '專案操作', + menuRename: '重新命名', + menuAppearance: '外觀', + noColor: '無顏色', + menuAddFolder: '新增資料夾', + menuSetActive: '設為使用中', + menuDelete: '刪除', + reveal: '在資料夾中顯示', + copyPath: '複製路徑', + removeFromSidebar: '從側邊欄移除', + createFailed: '無法建立專案', + deleteConfirm: '這會從 Hermes 中移除已儲存的專案。檔案、git 儲存庫和工作樹維持不變。', + startWork: '新增工作樹', + newWorktreeTitle: '新增工作樹', + newWorktreeDesc: '為這個工作樹命名分支。', + branchPlaceholder: '例如 my-feature', + startWorkFailed: '無法建立工作樹', + convertBranch: '轉換分支…', + convertBranchTitle: '轉換分支', + convertBranchDesc: '將現有分支簽出到新的工作樹。', + convertBranchPlaceholder: '搜尋分支…', + convertBranchInstead: '轉換現有分支', + branchCheckedOut: '已簽出', + branchesLoading: '正在載入分支…', + noBranches: '找不到分支', + removeWorktree: '移除工作樹', + removeWorktreeFailed: '無法移除工作樹(有未提交的變更?)', + removeWorktreeConfirm: '從 git 中移除(刪除工作樹目錄,但保留分支),或僅從側邊欄隱藏該軌道並將工作樹保留在磁碟上。', + removeWorktreeDirty: '此工作樹有未提交的變更。強制移除(捨棄這些變更),或僅隱藏軌道並保留在磁碟上。', + forceRemove: '強制移除', + enter: label => `開啟 ${label}` + }, newSessionIn: label => `在 ${label} 中新建工作階段`, - reorderWorkspace: label => `重新排序工作區 ${label}`, showMoreIn: (count, label) => `在 ${label} 中再顯示 ${count} 個`, loading: '載入中…', loadMore: '載入更多', @@ -1349,6 +1422,7 @@ export const zhHant = defineLocale({ unpin: '取消釘選', copyId: '複製 ID', export: '匯出', + branchFrom: '分支', rename: '重新命名', archive: '封存', newWindow: '新視窗', @@ -1507,7 +1581,51 @@ export const zhHant = defineLocale({ running: '執行中', stop: '停止', dismiss: '關閉', - exit: code => `結束碼 ${code}` + exit: code => `結束碼 ${code}`, + coding: { + title: '工作區', + noBranch: '無分支', + detached: '分離 HEAD', + clean: '乾淨', + changed: count => `${count} 處變更`, + ahead: count => `領先 ${count}`, + behind: count => `落後 ${count}`, + review: '審查', + close: '關閉', + openChanges: '開啟變更', + openFile: '開啟檔案', + stage: '暫存', + unstage: '取消暫存', + stageAll: '全部暫存', + viewAsTree: '樹狀檢視', + viewAsList: '清單檢視', + revert: '還原', + revertAll: '全部還原', + revertConfirm: '捨棄對此檔案的變更並將其還原至已提交狀態?此操作無法復原。', + revertAllConfirm: '捨棄所有變更並將檔案還原至已提交狀態?此操作無法復原。', + staged: '已暫存', + noChanges: '沒有變更', + notRepo: '不是 Git 儲存庫', + noDiff: '沒有可顯示的差異', + scopeUncommitted: '未提交', + scopeBranch: '分支', + scopeLastTurn: '上一輪', + commit: '提交', + commitAndPush: '提交並推送', + commitPlaceholder: '訊息(⌘↵ 提交)', + generateCommitMessage: '產生提交訊息', + stopGenerating: '停止產生', + createPr: '建立 PR', + openPr: '開啟 PR', + ghMissing: '安裝 GitHub CLI (gh) 並登入後可開啟 PR', + agentShip: '讓 Hermes 提交並開 PR', + agentShipPrompt: '檢查目前的變更,使用清晰的約定式提交訊息提交,推送分支,並開啟一個拉取請求。', + newBranch: '新增分支', + branchOffFrom: base => `從 ${base} 建立新分支`, + switchTo: branch => `切換到 ${branch}`, + switchFailed: branch => `無法切換到 ${branch}`, + worktrees: '工作樹' + } }, updates: { @@ -1802,7 +1920,9 @@ export const zhHant = defineLocale({ previewUnavailable: '預覽不可用', couldNotPreview: path => `無法預覽 ${path}`, noProjectTitle: '沒有專案', - noProjectBody: '從狀態列設定工作目錄後即可瀏覽檔案。', + noProjectBody: '開啟一個專案以瀏覽檔案並檢視變更。', + noProjectOpen: '未開啟專案', + noDiffs: '無差異', unreadableTitle: '無法讀取', unreadableBody: error => `無法讀取此資料夾 (${error})。`, emptyTitle: '空資料夾', @@ -1819,6 +1939,9 @@ export const zhHant = defineLocale({ preview: { tab: '預覽', closeTab: label => `關閉 ${label}`, + closeOthers: '關閉其他', + closeToRight: '關閉右側', + closeAll: '全部關閉', closePane: '關閉預覽窗格', loading: '正在載入預覽', unavailable: '預覽不可用', @@ -1826,9 +1949,11 @@ export const zhHant = defineLocale({ hide: '隱藏', openPreview: '開啟預覽', openInBrowser: '在瀏覽器中開啟', + linkHint: '⌘/Ctrl+點擊在預覽窗格開啟', sourceLineTitle: '點擊選取 · shift 點擊擴展 · 拖曳至輸入框', source: '原始碼', renderedPreview: '預覽', + diff: '差異', unknownSize: '大小未知', binaryTitle: '這看起來像二進位檔案', binaryBody: label => `預覽 ${label} 可能會顯示無法讀取的文字。`, @@ -2075,7 +2200,7 @@ export const zhHant = defineLocale({ sessionBusy: '工作階段忙碌中', branchStopCurrent: '分支此聊天前請先停止目前回合。', branchNoText: '此訊息沒有可用於分支的文字。', - branchTitle: '分支', + branchTitle: n => `草稿:分支 #${n}`, branchFailed: '分支失敗', deleteFailed: '刪除失敗', archived: '已封存', diff --git a/apps/desktop/src/i18n/zh.ts b/apps/desktop/src/i18n/zh.ts index 502d5954323..d3ff74c64e7 100644 --- a/apps/desktop/src/i18n/zh.ts +++ b/apps/desktop/src/i18n/zh.ts @@ -42,6 +42,22 @@ export const zh: Translations = { off: '关' }, + fileMenu: { + revealFinder: '在访达中显示', + revealExplorer: '在文件资源管理器中显示', + revealFileManager: '打开所在文件夹', + revealInSidebar: '在文件树中显示', + copyPath: '复制路径', + copyRelativePath: '复制相对路径', + rename: '重命名…', + delete: '删除', + renameTitle: '重命名', + renameLabel: '新名称', + deleteTitle: name => `删除 ${name}?`, + deleteBody: '将移至废纸篓,你可以从那里恢复。', + pathCopied: '已复制路径' + }, + boot: { ready: 'Hermes 桌面版已就绪', desktopBootFailedWithMessage: message => `桌面启动失败:${message}`, @@ -205,11 +221,13 @@ export const zh: Translations = { 'session.slot.9': '切换到最近会话 9', 'session.focusSearch': '搜索会话', 'session.togglePin': '固定/取消固定当前会话', + 'workspace.newWorktree': '新建工作树', 'composer.focus': '聚焦输入框', 'composer.modelPicker': '打开模型选择器', 'composer.voice': '开始 / 停止语音对话', 'view.toggleSidebar': '切换会话侧边栏', 'view.toggleRightSidebar': '切换文件浏览器', + 'view.toggleReview': '切换审查面板', 'view.showFiles': '显示文件浏览器', 'view.showTerminal': '显示终端', 'view.terminalSelection': '将终端选区发送到输入框', @@ -947,6 +965,8 @@ export const zh: Translations = { searchPlaceholder: '搜索会话、视图与操作', goTo: '前往', goToSession: '前往会话', + branches: '分支', + startInBranch: branch => `在 ${branch} 中开始新对话`, commandCenter: '命令中心', appearance: '外观', settings: '设置', @@ -1438,13 +1458,71 @@ export const zh: Translations = { cronJobs: '定时任务', groupAriaGrouped: '以单一列表显示会话', groupAriaUngrouped: '按工作区分组会话', + showProjects: '显示项目', + showSessions: '显示会话', groupTitleGrouped: '取消分组', groupTitleUngrouped: '按工作区分组', allPinned: '这里的全部已置顶。取消置顶某个对话即可在最近中显示。', shiftClickHint: 'Shift+ 单击对话以置顶 · 拖动以重新排序', noWorkspace: '无工作区', + noProject: '无项目', + projectEmpty: '暂无会话', + noSessions: '暂无会话', + projects: { + sectionLabel: '项目', + newButton: '新建项目', + createTitle: '新建项目', + createDesc: '为工作区命名并添加一个或多个文件夹。', + renameTitle: '重命名项目', + addFolderTitle: '添加文件夹', + namePlaceholder: '例如 Skunkworks', + foldersLabel: '文件夹', + ideaLabel: '想法', + ideaPlaceholder: '这个项目是关于什么的?(保存到 IDEA.md)', + ideaGenerate: '生成想法', + ideaGenerating: '生成中…', + ideaShuffle: '随机模板', + noFolders: '尚未添加文件夹。', + addFolder: '添加文件夹', + primaryBadge: '主', + removeFolder: '移除', + create: '创建', + menu: '项目操作', + menuRename: '重命名', + menuAppearance: '外观', + noColor: '无颜色', + menuAddFolder: '添加文件夹', + menuSetActive: '设为活动', + menuDelete: '删除', + reveal: '在文件夹中显示', + copyPath: '复制路径', + removeFromSidebar: '从侧边栏移除', + createFailed: '无法创建项目', + deleteConfirm: '这会从 Hermes 中移除已保存的项目。文件、git 仓库和工作树保持不变。', + startWork: '新建工作树', + newWorktreeTitle: '新建工作树', + newWorktreeDesc: '为这个工作树命名分支。', + branchPlaceholder: '例如 my-feature', + startWorkFailed: '无法创建工作树', + convertBranch: '转换分支…', + convertBranchTitle: '转换分支', + convertBranchDesc: '将现有分支检出到新的工作树。', + convertBranchPlaceholder: '搜索分支…', + convertBranchInstead: '转换现有分支', + branchCheckedOut: '已检出', + branchesLoading: '正在加载分支…', + noBranches: '未找到分支', + removeWorktree: '移除工作树', + removeWorktreeFailed: '无法移除工作树(存在未提交更改?)', + removeWorktreeConfirm: '从 git 中移除(删除工作树目录,但保留分支),或仅从侧边栏隐藏该泳道并将工作树保留在磁盘上。', + removeWorktreeDirty: '此工作树有未提交的更改。强制移除(丢弃这些更改),或仅隐藏泳道并保留在磁盘上。', + forceRemove: '强制移除', + enter: label => `打开 ${label}`, + reorder: label => `重新排序 ${label}`, + toggle: label => `展开/收起 ${label} 会话`, + back: '全部项目' + }, newSessionIn: label => `在 ${label} 中新建会话`, - reorderWorkspace: label => `重新排序工作区 ${label}`, showMoreIn: (count, label) => `在 ${label} 中再显示 ${count} 个`, loading: '加载中…', loadMore: '加载更多', @@ -1454,6 +1532,7 @@ export const zh: Translations = { unpin: '取消置顶', copyId: '复制 ID', export: '导出', + branchFrom: '分支', rename: '重命名', archive: '归档', newWindow: '新窗口', @@ -1613,7 +1692,51 @@ export const zh: Translations = { running: '运行中', stop: '停止', dismiss: '关闭', - exit: code => `退出码 ${code}` + exit: code => `退出码 ${code}`, + coding: { + title: '工作区', + noBranch: '无分支', + detached: '分离头指针', + clean: '干净', + changed: count => `${count} 处更改`, + ahead: count => `领先 ${count}`, + behind: count => `落后 ${count}`, + review: '审查', + close: '关闭', + openChanges: '打开更改', + openFile: '打开文件', + stage: '暂存', + unstage: '取消暂存', + stageAll: '全部暂存', + viewAsTree: '树状视图', + viewAsList: '列表视图', + revert: '还原', + revertAll: '全部还原', + revertConfirm: '放弃对此文件的更改并将其恢复到已提交状态?此操作无法撤销。', + revertAllConfirm: '放弃所有更改并将文件恢复到已提交状态?此操作无法撤销。', + staged: '已暂存', + noChanges: '没有更改', + notRepo: '不是 Git 仓库', + noDiff: '没有可显示的差异', + scopeUncommitted: '未提交', + scopeBranch: '分支', + scopeLastTurn: '上一轮', + commit: '提交', + commitAndPush: '提交并推送', + commitPlaceholder: '信息(⌘↵ 提交)', + generateCommitMessage: '生成提交信息', + stopGenerating: '停止生成', + createPr: '创建 PR', + openPr: '打开 PR', + ghMissing: '安装 GitHub CLI (gh) 并登录后可打开 PR', + agentShip: '让 Hermes 提交并开 PR', + agentShipPrompt: '检查当前更改,使用清晰的约定式提交信息提交,推送分支,并开启一个拉取请求。', + newBranch: '新建分支', + branchOffFrom: base => `从 ${base} 新建分支`, + switchTo: branch => `切换到 ${branch}`, + switchFailed: branch => `无法切换到 ${branch}`, + worktrees: '工作树' + } }, updates: { @@ -1909,7 +2032,9 @@ export const zh: Translations = { previewUnavailable: '预览不可用', couldNotPreview: path => `无法预览 ${path}`, noProjectTitle: '没有项目', - noProjectBody: '从状态栏设置工作目录后即可浏览文件。', + noProjectBody: '打开一个项目以浏览文件并查看更改。', + noProjectOpen: '未打开项目', + noDiffs: '无差异', unreadableTitle: '无法读取', unreadableBody: error => `无法读取此文件夹 (${error})。`, emptyTitle: '空文件夹', @@ -1926,6 +2051,9 @@ export const zh: Translations = { preview: { tab: '预览', closeTab: label => `关闭 ${label}`, + closeOthers: '关闭其他', + closeToRight: '关闭右侧', + closeAll: '全部关闭', closePane: '关闭预览面板', loading: '正在加载预览', unavailable: '预览不可用', @@ -1933,9 +2061,11 @@ export const zh: Translations = { hide: '隐藏', openPreview: '打开预览', openInBrowser: '在浏览器中打开', + linkHint: '⌘/Ctrl+点击在预览面板打开', sourceLineTitle: '点击选择 · shift 点击扩展 · 拖到输入框', source: '源码', renderedPreview: '预览', + diff: '差异', unknownSize: '大小未知', binaryTitle: '这看起来像二进制文件', binaryBody: label => `预览 ${label} 可能会显示不可读文本。`, @@ -2179,7 +2309,7 @@ export const zh: Translations = { sessionBusy: '会话忙碌中', branchStopCurrent: '分支此对话前请先停止当前回合。', branchNoText: '此消息没有可用于分支的文本。', - branchTitle: '分支', + branchTitle: n => `草稿:分支 #${n}`, branchFailed: '分支失败', deleteFailed: '删除失败', archived: '已归档',