cd427d218b
- Server tests on Windows no longer reach the user's real psmux: psmux
ignores TMUX_TMPDIR (and 3.3.x PSMUX_DATA_DIR), so quit.test.js's Quit and
the runner's kill-server ended every live lane pane — the pre-commit hook
included. scripts/test-server.js now takes tmux off the suites' PATH there.
- Wheel scrolling on Windows: psmux never turns mouse tracking on for its
client, so xterm.js never reported the wheel and a pane could not scroll.
A Windows attach is told {type:"wheel"} and the browser sends the SGR wheel
report itself; psmux scrolls or forwards it to the pane's app.
- tmux.upgradeAdvice(): the oldest tmux AgentHub asks for and how each
platform upgrades (psmux 3.4.0 -> winget upgrade marlocarlo.psmux; tmux 3.7
-> brew upgrade tmux / build the release on Linux). Used by the doctor,
GET /api/run/tmux ({available, version, upgrade}), `agenthub doctor`, and a
sticky toast on the Workspace page. Advice only: nothing installs tmux.
Committed with --no-verify (user's call): the pre-commit hook runs the full
backend suite, which has ~378 pre-existing failures on Windows (S3/Linux-only
tests: sudo, /proc, systemd, members). Every test touching this change passes:
pty-attach, tmux, run, plugin-doctor-tmux, TerminalView, Workspace, and the
client tests related to the changed files; tsc and the header audit are clean.
623 lines
34 KiB
JSON
623 lines
34 KiB
JSON
{
|
|
"action.reset": "reset worktree",
|
|
"actionError": "Workspace action failed: {{message}}",
|
|
"actionErrorUnknown": "Unknown error",
|
|
"add": "Add workspace",
|
|
"addLane": "Create a workspace from a working directory",
|
|
"addLaneBaseLabel": "Branch to fork from",
|
|
"addLaneBranchBusy": "{{branch}} — already checked out at {{path}}",
|
|
"addLaneBranchExistingHint": "The worktree checks this branch out as it is — no new branch, no base.",
|
|
"addLaneBranchExistingLabel": "Branch to check out",
|
|
"addLaneBranchHintAuto": "Leave empty to let the server name the branch from the title.",
|
|
"addLaneBranchLabel": "New branch name",
|
|
"addLaneBranchModeCurrent": "Current branch",
|
|
"addLaneBranchModeCurrentHint": "Work straight on this repo's checked-out branch (main) — no worktree, no fork. Switches to Repo mode.",
|
|
"addLaneBranchModeExisting": "Existing branch",
|
|
"addLaneBranchModeNew": "New branch",
|
|
"addLaneBranchPlaceholder": "Automatic — named from the title",
|
|
"addLaneNoBranches": "This repo has no commits yet, so a worktree has nothing to branch from. Add it as a Repo workspace: commit first, then publish it from the Changes panel.",
|
|
"addLaneNoBranchesUseRepo": "Use as a Repo workspace",
|
|
"addLaneNoFreeBranches": "Every branch in this repo is already checked out in a worktree. Create a new branch instead.",
|
|
"addLaneExists": "This folder already has a workspace: #{{id}} {{title}}. It is selected; pick another folder to add a new one.",
|
|
"addLaneNotARepo": "Not a git repository (or no read access) yet.",
|
|
"addLaneProvisionFailed": "Worktree provisioning failed or timed out — the workspace exists but auto-setup was skipped. Check the workspace's git facts, then run agents/mcp setup manually.",
|
|
"addLaneRepoHint": "An existing git repo. The dashboard creates a new worktree for the workspace, not a folder you pick.",
|
|
"addLaneRepoHintAdopt": "An existing directory. The dashboard tracks it as-is — no worktree, no new branch.",
|
|
"addLaneRepoLabel": "Source repository",
|
|
"addLaneRepoLabelAdopt": "Directory",
|
|
"addLaneSetupClose": "Close",
|
|
"addLaneSetupMcp": "MCP servers",
|
|
"addLaneSetupProfile": "Profile",
|
|
"addLaneSetupTitle": "Setup",
|
|
"addLaneTitleLabel": "Title",
|
|
"addLaneTitlePlaceholder": "Optional",
|
|
"addLaneNoTools": "No AI tool is installed and enabled.",
|
|
"addLaneNoToolsLink": "Open Settings → AI Tools",
|
|
"addLaneWorktreeDetached": "(detached)",
|
|
"addLaneWorktreesMore": "+{{count}} more",
|
|
"addLaneWorktreesTitle": "Worktrees of this repo ({{count}})",
|
|
"browse.button": "Browse",
|
|
"browse.empty": "This folder is empty.",
|
|
"browse.fileTitle": "Browse for a file",
|
|
"browse.select": "Select this folder",
|
|
"browse.back": "Back (Alt+←)",
|
|
"browse.create": "Create",
|
|
"browse.editPath": "Type a path (Ctrl+L)",
|
|
"browse.filter": "Filter…",
|
|
"browse.forward": "Forward (Alt+→)",
|
|
"browse.hint": "Double-click or Enter opens · Backspace goes up · type to jump",
|
|
"browse.home": "Home",
|
|
"browse.modified": "Modified",
|
|
"browse.name": "Name",
|
|
"browse.newFolder": "New folder",
|
|
"browse.newFolderName": "Folder name",
|
|
"browse.noMatch": "Nothing matches the filter.",
|
|
"browse.places": "Places",
|
|
"browse.recent": "Recent",
|
|
"browse.selectFile": "Select file",
|
|
"browse.showHidden": "Show hidden",
|
|
"browse.hostFolder": "Server folder",
|
|
"browse.hostFolderHint": "Browse the server account's own folder ({{path}}). A workspace there runs as the shared server account, which every admin uses — not as your own.",
|
|
"browse.up": "Up one level (Backspace)",
|
|
"browse.workspaces": "Workspaces",
|
|
"browse.title": "Browse for a folder",
|
|
"changes.back": "All files",
|
|
"changes.bin": "bin",
|
|
"changes.binary": "Binary file — not shown.",
|
|
"changes.collapse": "Collapse the changes panel",
|
|
"changes.closeRepo": "Close repository",
|
|
"changes.closeOtherRepos": "Close other repositories",
|
|
"changes.collapseAll": "Collapse every file",
|
|
"changes.collapseAllFolders": "Collapse all folders",
|
|
"changes.collapseContext": "Show fewer surrounding lines",
|
|
"changes.collapseFile": "Collapse {{path}}",
|
|
"changes.commitPlaceholder": "Commit message",
|
|
"changes.suggestMessage": "Suggest a commit message with AI (Claude, ticked files)",
|
|
"changes.conflicted": "conflict",
|
|
"changes.discard": "Discard this file's changes",
|
|
"changes.discardConfirm": "Click again to discard — this cannot be undone",
|
|
"changes.empty.branch": "This branch matches its base.",
|
|
"changes.empty.commit": "This commit changed no files.",
|
|
"changes.empty.work": "Nothing uncommitted.",
|
|
"changes.expand": "Show the changes panel",
|
|
"changes.expandAll": "Expand every file",
|
|
"changes.expandAllFolders": "Expand all folders",
|
|
"changes.download": "Download",
|
|
"changes.upload": "Upload files to the workspace root",
|
|
"changes.uploadHere": "Upload files here…",
|
|
"changes.uploaded_one": "Uploaded {{count}} file to {{dir}}",
|
|
"changes.uploaded_other": "Uploaded {{count}} files to {{dir}}",
|
|
"changes.uploadFailed": "Could not upload {{name}}: {{message}}",
|
|
"changes.expandContext": "Show more surrounding lines",
|
|
"changes.expandFile": "Expand {{path}}",
|
|
"changes.fileGone": "That file no longer has changes in this range.",
|
|
"changes.fileTruncated": "Diff cut short — open the file in an editor for the rest.",
|
|
"changes.commentLine": "Comment on line {{n}} — pasted into this workspace's pane",
|
|
"changes.commentOn": "Comment on {{at}} — pasted into the pane you used last; nothing is sent until you press Enter there",
|
|
"changes.commentSend": "Paste into pane",
|
|
"changes.addToChat": "Add to Chat",
|
|
"changes.commentCancel": "Cancel",
|
|
"changes.commentNoPane": "No terminal of this workspace is on screen — open its session (or narrow the Changes panel) first",
|
|
"changes.layout.split": "Side-by-side",
|
|
"changes.layout.unified": "Unified",
|
|
"changes.loading": "Reading the working copy…",
|
|
"changes.mode.browse": "Files",
|
|
"changes.mode.history": "History",
|
|
"changes.mode.overview": "Changes",
|
|
"changes.mode.review": "Review",
|
|
"changes.noCommits": "No commits yet.",
|
|
"changes.noHunks": "No textual change.",
|
|
"changes.noMatches": "No tracked file matches.",
|
|
"changes.openFile": "Open {{path}}",
|
|
"changes.quickOpen": "Find a file by path…",
|
|
"changes.range.branch": "Compared to {{base}}",
|
|
"changes.range.baseBranch": "base branch",
|
|
"changes.range.branchHint": "{{base}}...HEAD — everything this branch adds on top of {{base}}",
|
|
"changes.range.work": "Uncommitted",
|
|
"changes.range.workHint": "Working tree vs HEAD — what has been touched and not committed",
|
|
"changes.refresh": "Refresh",
|
|
"changes.size.full": "Full screen",
|
|
"changes.restore": "Restore size",
|
|
"changes.fileCount_one": "{{count}} file",
|
|
"changes.fileCount_other": "{{count}} files",
|
|
"changes.dropEdits": "Discard your unsaved edits to this file?",
|
|
"changes.stage": "Stage this file",
|
|
"changes.title": "Changes",
|
|
"changes.truncated": "Some changes were left out to keep this panel responsive.",
|
|
"changes.unavailable": "This workspace's directory is not a readable git repository.",
|
|
"changes.unavailableFolder": "This folder is not a readable git repository.",
|
|
"changes.unstage": "Unstage this file",
|
|
"changes.changesView": "Changes",
|
|
"changes.wholeFile": "Whole file",
|
|
"destructive.blocked.adopted": "This is an adopted directory and cannot be changed by a worktree action.",
|
|
"destructive.blocked.missing": "The workspace directory is missing, so this action cannot continue.",
|
|
"destructive.blocked.unreadable": "The workspace directory cannot be read as a Git worktree, so this action cannot continue.",
|
|
"destructive.cancel": "Cancel",
|
|
"destructive.count.bytesEstimate": "Estimated space freed",
|
|
"destructive.count.dirty": "Modified files",
|
|
"destructive.count.events": "Events",
|
|
"destructive.count.head": "HEAD",
|
|
"destructive.count.sessions": "Sessions",
|
|
"destructive.count.tokenRows": "Token rows",
|
|
"destructive.count.unpushed": "Unpushed commits",
|
|
"destructive.count.untracked": "Untracked files",
|
|
"destructive.force": "I understand these unpushed commits will be discarded.",
|
|
"destructive.loading": "Loading current facts…",
|
|
"destructive.notice.activeSessionSkipped": "One or more sessions in this workspace are still active and will be kept, not purged.",
|
|
"destructive.notice.adopted": "This workspace points at a directory you own. Only the dashboard's record of it is dropped — the directory and its files are left untouched.",
|
|
"destructive.notice.missing": "The workspace directory is already gone. Deleting the workspace drops the dashboard's record only; nothing on disk and no Git record is touched.",
|
|
"destructive.notice.unreadable": "The workspace directory cannot be read as a Git worktree. That changes nothing here: only the dashboard's record is deleted, the directory is never touched.",
|
|
"destructive.purge.confirm": "Purge history",
|
|
"destructive.purge.message": "Approve the current counts before deleting stored session history.",
|
|
"destructive.purge.title": "Purge workspace history?",
|
|
"destructive.remove.confirm": "Delete workspace record",
|
|
"destructive.remove.message": "Only the dashboard's record of this workspace is deleted. Its working tree, its branch and its database are left exactly as they are — delete them yourself if you want them gone.",
|
|
"destructive.remove.title": "Delete workspace record?",
|
|
"destructive.reset.confirm": "Reset worktree",
|
|
"destructive.reset.message": "Approve the current counts before resetting this worktree.",
|
|
"destructive.reset.survives": "Gitignored files such as node_modules and .env are kept; untracked files are deleted.",
|
|
"destructive.reset.title": "Reset managed worktree?",
|
|
"destructive.warning.no-remote": "No Git remote is configured, so nothing here is backed up remotely. You can still proceed.",
|
|
"features.archived": "archived",
|
|
"features.live": "Live",
|
|
"features.viewingArchived": "Viewing archived feature \"{{slug}}\" — the workspace keeps running; this is a read-only snapshot.",
|
|
"git.filesHeading_one": "{{count}} file changed",
|
|
"git.filesHeading_other": "{{count}} files changed",
|
|
"git.filesMore_one": "… and {{count}} more file",
|
|
"git.filesMore_other": "… and {{count}} more files",
|
|
"git.noDelta": "new",
|
|
"git.uncommitted": "{{dirty}} modified · {{untracked}} untracked",
|
|
"gitBar.branchCreate": "Create",
|
|
"gitBar.branchCreateHint": "Create this branch without switching to it",
|
|
"gitBar.branchDelete": "Delete",
|
|
"gitBar.branchDeleteHint": "Delete the selected branch (refused if it has unmerged commits)",
|
|
"gitBar.branchNewPlaceholder": "New branch name…",
|
|
"gitBar.fetch": "Fetch",
|
|
"gitBar.fetchHint": "git fetch --all --prune",
|
|
"gitBar.errNoRemote": "No remote to push to or pull from. Add one, or set this branch's upstream, in a terminal.",
|
|
"gitBar.inSync": "in sync",
|
|
"gitBar.newLane": "New workspace here",
|
|
"gitBar.newLaneHeld": "Already checked out at {{path}} — git allows one worktree per branch",
|
|
"gitBar.newLaneHint": "Open Add workspace for a sibling worktree on the selected branch",
|
|
"gitBar.noCommits": "no commits yet",
|
|
"gitBar.noUpstream": "not pushed",
|
|
"gitBar.publish": "Publish…",
|
|
"gitBar.publishApply": "Publish",
|
|
"gitBar.publishBranch": "Publish branch",
|
|
"gitBar.publishBranchHint": "git push -u origin HEAD — this branch has no upstream yet",
|
|
"gitBar.publishHint": "Add a remote named origin and push this branch to it (git remote add origin + git push -u origin HEAD)",
|
|
"gitBar.publishUrl": "Remote URL: https://host/owner/repo.git or git@host:owner/repo.git",
|
|
"gitBar.pull": "Pull",
|
|
"gitBar.pullHint": "git pull --ff-only — refuses instead of merging when the branch has diverged",
|
|
"gitBar.push": "Push",
|
|
"gitBar.nothingToPush": "Nothing to push — {{upstream}} already has every commit.",
|
|
"gitBar.pushHint": "git push -u origin HEAD",
|
|
"gitBar.switch": "Branch",
|
|
"gitBar.switchApply": "Switch branch",
|
|
"gitBar.switchCurrent": "current",
|
|
"gitBar.switchDirty": "Commit or discard the uncommitted changes first",
|
|
"gitBar.switchHint": "Switch this worktree to another local branch",
|
|
"gitBar.switchLabel": "Switch branch…",
|
|
"gitBar.unbornHint": "Commit first, then publish this repo to a remote.",
|
|
"locks.held_one": "{{count}} lock held",
|
|
"locks.held_other": "{{count}} locks held",
|
|
"mode.repo": "Repo",
|
|
"mode.repoHint": "Adopt this directory as a workspace, as-is — no worktree, no new branch.",
|
|
"mode.worktree": "Worktree",
|
|
"mode.worktreeHint": "Provision a new git worktree + branch from a source repo.",
|
|
"mode.clone": "Clone",
|
|
"mode.cloneHint": "Clone a repository over HTTPS or SSH into one of your folders, as a new workspace.",
|
|
"clone.urlLabel": "Repository URL",
|
|
"clone.urlHint": "https://host/owner/repo.git, git@host:owner/repo.git or ssh://… — SSH uses your own key (Settings → Git).",
|
|
"clone.parentLabel": "Clone into folder",
|
|
"clone.parentHint": "The repository is cloned to {{path}}",
|
|
"clone.nameLabel": "Folder name",
|
|
"clone.cloning": "Cloning…",
|
|
"clone.loginNeeded": "{{host}} needs a login: your username and a password or access token.",
|
|
"clone.loginRejected": "{{host}} rejected that username or token.",
|
|
"clone.username": "Username",
|
|
"clone.token": "Password or access token",
|
|
"clone.remember": "Remember this login for my account",
|
|
"clone.sshRefused": "{{host}} refused the SSH login. Add your public key to that host, or make one in Settings → Git.",
|
|
"clone.sshSettings": "Open Settings → Git",
|
|
"moreActions": "More actions",
|
|
"pipelinePicker.label": "Pipeline template",
|
|
"pipelinePicker.stageMismatch": "Stage \"{{stage}}\" matches no node in \"{{pipeline}}\" — declare one of: {{nodes}}",
|
|
"preflightError": "Could not load the current workspace facts.",
|
|
"preflightErrorWithMessage": "Could not load the current workspace facts: {{message}}",
|
|
"proof.ticketReport": "Task report",
|
|
"renameLabel": "Rename this workspace",
|
|
"proxy.native": "Native ({{tool}})",
|
|
"proxy.label": "AI Proxy",
|
|
"runtime.down": "down",
|
|
"runtime.healthy": "healthy",
|
|
"runtime.partial": "partial",
|
|
"runtime.slot": "slot {{slot}}",
|
|
"runtime.steppedAsideTitle": "Stepped aside from {{expected}}, which was already in use",
|
|
"status.failed": "failed",
|
|
"status.idle": "idle",
|
|
"status.provisioning": "provisioning",
|
|
"status.running": "running",
|
|
"title": "Workspaces",
|
|
"worktrees.heading_one": "{{count}} worktree",
|
|
"worktrees.heading_other": "{{count}} worktrees",
|
|
"changes.undoHunk": "Undo this hunk",
|
|
"changes.undoHunkConfirm": "Click again to undo this hunk — this cannot be undone",
|
|
"changes.undoHunkShort": "Undo",
|
|
"changes.undoHunkShortConfirm": "Confirm undo",
|
|
"changes.edit": "Edit",
|
|
"changes.save": "Save",
|
|
"changes.revertBlock": "Revert",
|
|
"changes.blockNotInDiff": "That change is no longer in git's diff; refresh and retry",
|
|
"changes.cancelEdit": "Cancel",
|
|
"changes.preview": "Preview",
|
|
"changes.raw": "Raw",
|
|
"changes.editorLabel": "Edit {{path}}",
|
|
"changes.prevHunk": "Previous change",
|
|
"changes.nextHunk": "Next change",
|
|
"changes.hunkOf": "{{n}} of {{total}}",
|
|
"changes.noEditBinary": "Binary file — not editable here",
|
|
"changes.imageFailed": "Could not show this image (deleted, or larger than 20 MB).",
|
|
"changes.noEditTooBig": "Too large to edit here (over 1 MB)",
|
|
"changes.noEdit": "Not editable here",
|
|
"gitBar.loginTitle": "Git needs a login for {{host}}",
|
|
"gitBar.loginRejected": "The server rejected that username or token.",
|
|
"gitBar.loginUser": "Username",
|
|
"gitBar.loginPassword": "Password or access token",
|
|
"gitBar.loginRemember": "Remember for everyone using this AgentHub",
|
|
"gitBar.loginTokenHint": "On Gitea: Settings → Applications → Generate token, with repository read/write.",
|
|
"gitBar.loginInsecure": "This dashboard is on plain http — the token crosses the network unencrypted.",
|
|
"gitBar.loginSubmit": "Log in and retry",
|
|
"gitBar.loginCancel": "Cancel",
|
|
"gitBar.merge": "Merge into current",
|
|
"gitBar.mergeHint": "Merge the selected branch into the branch this workspace is on",
|
|
"gitBar.mergeUpstream": "Merge {{upstream}}",
|
|
"gitBar.mergeUpstreamHint": "The branch has diverged from its upstream: merge it in (conflicts are resolved in the Changes panel)",
|
|
"gitBar.mergeConfirm": "Merge {{branch}} into {{current}}? Files in this workspace change now — if an agent is working in this workspace, let it finish first.",
|
|
"gitBar.pushConfirm": "Push {{count}} commit(s) from {{branch}} to {{upstream}}? Anyone with access to the remote will see them, and a push cannot be taken back from here.",
|
|
"gitBar.publishBranchConfirm": "Publish branch {{branch}} to the remote? Anyone with access to the remote will see it.",
|
|
"gitBar.publishConfirm": "Add {{url}} as this repo's remote and push {{branch}} to it? Anyone with access to that remote will see the code.",
|
|
"gitBar.branchDeleteConfirm": "Delete the local branch {{branch}}? Git refuses if it holds commits merged nowhere else.",
|
|
"gitBar.mergeConflicts": "Merge stopped on {{count}} conflicted file(s) — resolve them in the list below.",
|
|
"gitBar.merging": "A {{op}} is in progress: finish or abort it first",
|
|
"changes.conflictsGroup": "Merge conflicts",
|
|
"changes.mergeBanner": "A {{op}} is in progress — {{count}} file(s) still conflicted",
|
|
"changes.mergeReady": "A {{op}} is in progress — every conflict is resolved",
|
|
"changes.mergeCommit": "Complete {{op}}",
|
|
"changes.mergeAbort": "Abort {{op}}",
|
|
"changes.mergeAbortConfirm": "Click again to abort the {{op}}",
|
|
"changes.discardShortConfirm": "Discard?",
|
|
"changes.amend": "Amend",
|
|
"changes.amendPushed": "The last commit is already pushed; amending it would rewrite shared history. Revert it from History instead.",
|
|
"changes.amendHint": "Fold the ticked files into the last commit (only before it is pushed). Nothing ticked rewords it; leave the message empty to keep the old one.",
|
|
"changes.amendPlaceholder": "New message (empty = keep the old one)",
|
|
"changes.historyOf": "History of branch",
|
|
"changes.cherryPick": "Cherry-pick onto {{branch}}",
|
|
"changes.revertCommit": "Revert this commit",
|
|
"changes.undoCommit": "Undo commit (keep changes)",
|
|
"changes.undoCommitTitle": "Undo the last commit?",
|
|
"changes.undoCommitBody": "{{short}} \"{{subject}}\" is removed from the branch. Its changes stay staged, so you can edit them and commit again.",
|
|
"changes.undoCommitConfirm": "Undo commit",
|
|
"changes.revertConfirm": "Add a commit on {{branch}} that undoes {{short}} \"{{subject}}\"? Files in this workspace change now.",
|
|
"changes.cherryPickConfirm": "Apply {{short}} \"{{subject}}\" from {{from}} onto {{branch}} as a new commit? Files in this workspace change now.",
|
|
"changes.amendTitle": "Amend the last commit?",
|
|
"changes.amendConfirm": "\"{{subject}}\" is replaced by a new commit with the staged changes folded in. The server refuses if it is already pushed.",
|
|
"changes.opConflicts": "The {{op}} stopped on {{count}} conflict(s) — resolve them in Changes",
|
|
"changes.opDone": "{{op}} done",
|
|
"changes.takeOurs": "Keep mine",
|
|
"changes.takeTheirs": "Take theirs",
|
|
"changes.markResolved": "Mark resolved (after editing out the markers)",
|
|
"conflict.left": "{{left}} of {{total}} conflicts left",
|
|
"conflict.prev": "Previous conflict",
|
|
"conflict.next": "Next conflict",
|
|
"conflict.allOurs": "Keep all mine",
|
|
"conflict.allTheirs": "Take all theirs",
|
|
"conflict.editByHand": "Edit by hand",
|
|
"conflict.unbalanced": "The conflict markers do not line up (edited by hand?) — use Edit by hand.",
|
|
"conflict.unusable": "This file cannot be shown here (binary or too large) — use Keep all mine / Take all theirs, or a terminal.",
|
|
"conflict.keepOurs": "Keep mine",
|
|
"conflict.takeTheirs": "Take theirs",
|
|
"conflict.keepBoth": "Keep both",
|
|
"conflict.chose.ours": "Kept mine",
|
|
"conflict.chose.theirs": "Took theirs",
|
|
"conflict.chose.both": "Kept both",
|
|
"conflict.undo": "Undo",
|
|
"conflict.ours": "Mine ({{label}})",
|
|
"conflict.theirs": "Theirs ({{label}})",
|
|
"conflict.reset": "Cancel",
|
|
"conflict.save": "Save and mark resolved",
|
|
"changes.takeOursHint": "Keep your version of the whole file",
|
|
"changes.takeTheirsHint": "Take the incoming version of the whole file",
|
|
"row.actions": "Workspace actions",
|
|
"row.hint": "Double-click to rename · drag or Alt+↑/↓ to reorder · right-click for actions",
|
|
"menu.rename": "Rename",
|
|
"menu.newHere": "New workspace here…",
|
|
"menu.copyPath": "Copy path",
|
|
"menu.reset": "Reset worktree…",
|
|
"menu.remove": "Delete workspace…",
|
|
"panel.changes": "Changes",
|
|
"panel.analyst": "Analyst",
|
|
"replay.placeholder": "Message to continue this session…",
|
|
"replay.hint": "Sending resumes the session in a free pane.",
|
|
"replay.send": "Send",
|
|
"sessions.resume": "Resume",
|
|
"resume.openPane": "Open pane",
|
|
"resume.hint": "Resume this session in a workspace pane — re-reads its whole transcript into context",
|
|
"resume.title": "Resume this session?",
|
|
"resume.body": "Resuming re-reads the session's whole transcript into the model's context, so its next turns pay for all of it again. It opens in the first free pane of {{workspace}}. To only read it, stay on this page.",
|
|
"resume.confirm": "Resume session",
|
|
"resume.fork": "Fork",
|
|
"resume.forkHint": "Continue from here as a NEW session — the original stays as it is",
|
|
"resume.forkTitle": "Fork this session?",
|
|
"resume.forkBody": "A fork re-reads the session's whole transcript into a NEW session (its own id), so its turns pay for all of it again; the original is left untouched. It opens in the first free pane of {{workspace}}.",
|
|
"resume.forkConfirm": "Fork session",
|
|
"tree.title": "Workspaces",
|
|
"tree.search": "Search workspaces and sessions",
|
|
"tree.toolFilter": "Filter by tool",
|
|
"tree.allTools": "All tools",
|
|
"tree.ownerYou": "{{name}} (you)",
|
|
"tree.noOwner": "No owner",
|
|
"tree.ownerToggle": "Show or hide {{name}}'s workspaces",
|
|
"tree.readOnly": "{{name}}'s workspace — read only. A session opens its analysis page.",
|
|
"tree.newSession": "New session",
|
|
"tree.noSessions": "No sessions yet",
|
|
"tree.transcriptHint": "No live pane — opens its conversation; a message you send resumes it",
|
|
"tree.splitHint": "Live pane — Ctrl/Cmd+click opens it in a split beside the focused pane",
|
|
"tree.renameSession": "Rename session",
|
|
"tree.archiveSession": "Archive — hide from this workspace (deletes nothing)",
|
|
"tree.pinSession": "Pin to the top of this workspace",
|
|
"tree.unpinSession": "Unpin",
|
|
"tree.pinned": "Pinned",
|
|
"tree.worktreeSession": "In its own worktree: .claude/worktrees/{{name}}",
|
|
"tree.archiveWorktreeTitle": "Archive and remove its worktree?",
|
|
"tree.archiveWorktreeBody": "Like Claude Desktop, archiving removes the session's worktree .claude/worktrees/{{name}} and its branch. Git refuses if it holds uncommitted changes, and a branch with commits merged nowhere is kept — nothing unsaved is lost.",
|
|
"tree.archiveWorktreeConfirm": "Archive and remove",
|
|
"tree.archived_one": "{{count}} archived session",
|
|
"tree.archived_other": "{{count}} archived sessions",
|
|
"tree.unarchive": "Unarchive",
|
|
"home.breadcrumb": "Workspaces",
|
|
"home.ai": "AI",
|
|
"home.openTerminal": "Open terminal",
|
|
"home.repoRoot": "Repository root",
|
|
"home.mainBranch": "Main worktree's branch",
|
|
"home.worktreeCount_one": "{{count}} worktree",
|
|
"home.worktreeCount_other": "{{count}} worktrees",
|
|
"home.placeholder": "How can I help you today?",
|
|
"home.start": "Start",
|
|
"home.permissionAuto": "Auto",
|
|
"home.permissionAcceptEdits": "Accept edits",
|
|
"home.permissionDefault": "Ask first",
|
|
"home.permissionPlan": "Plan",
|
|
"home.permissionBypass": "Bypass permissions",
|
|
"home.local": "Local",
|
|
"home.localHint": "Work in the workspace folder itself",
|
|
"home.worktree": "New worktree",
|
|
"home.worktreeHint": "Run this session in its own git worktree — <repo>/.claude/worktrees/, a branch of its own, made and cleaned up by Claude Code",
|
|
"home.allBusy": "All 10 sessions of this workspace are in use — stop one before starting another.",
|
|
"home.recents": "Recents",
|
|
"home.noRecents": "No sessions yet — start one above.",
|
|
"home.instructions": "Instructions",
|
|
"home.instructionsEmpty": "Add instructions to tailor how the agent works in this workspace. They are appended to every new session's system prompt.",
|
|
"home.edit": "Edit instructions",
|
|
"home.save": "Save",
|
|
"home.cancel": "Cancel",
|
|
"home.memory": "Memory",
|
|
"home.viewMemory": "View memory",
|
|
"home.memoryCount_one": "{{count}} file the agent reads",
|
|
"home.memoryCount_other": "{{count}} files the agent reads",
|
|
"home.memoryEmpty": "Memory shows here once the folder has a CLAUDE.md or AGENTS.md, or Claude saves memory for it.",
|
|
"home.context": "Context",
|
|
"home.contextEmpty": "Add PDFs, documents, or other text to reference in this workspace.",
|
|
"home.contextSnapshot": "Each file is copied when you add it — later edits to the original are not seen. Remove and add it again, or add its folder under Folder to always read the latest.",
|
|
"home.addFile": "Add files",
|
|
"home.folder": "Folder",
|
|
"home.ownFolder": "Workspace folder",
|
|
"home.addFolder": "Add folder",
|
|
"home.folderPath": "Absolute folder path",
|
|
"home.add": "Add",
|
|
"home.cloneFolders": "Or clone repositories",
|
|
"home.cloneHint": "One URL per line — each is cloned into {{path}} with your own git login (Settings → Git) and added here.",
|
|
"home.clonePlaceholder": "https://host/owner/repo.git\ngit@host:owner/other.git",
|
|
"home.cloneRun": "Clone",
|
|
"home.cloneRetry": "Retry the failed ones",
|
|
"home.cloneDone": "Added",
|
|
"home.suggested": "Untracked worktrees",
|
|
"home.remove": "Remove",
|
|
"home.missing": "missing",
|
|
"home.unsupported": "{{tool}} cannot take instructions, context files or extra folders: they are kept, but its sessions start without them.",
|
|
"home.close": "Close",
|
|
"tabs.label": "Session tabs",
|
|
"tabs.new": "New tab",
|
|
"tabs.newTerminal": "New terminal",
|
|
"tabs.terminal": "Terminal",
|
|
"tabs.close": "Close tab (stops its session)",
|
|
"tabs.full": "All 10 sessions are in use — stop one first",
|
|
"tabs.agentSettings": "Agent settings…",
|
|
"tabs.settings": "Settings",
|
|
"tabs.closeSettings": "Close Settings",
|
|
"tabs.splitHint": "Ctrl/Cmd+click: open in a split · drag onto a pane to place it",
|
|
"panes.drag": "Drag to move this pane — onto another pane's edge to split there, onto its middle to swap; hold it over another tab to open that tab",
|
|
"panes.drop.left": "Place on the left",
|
|
"panes.drop.right": "Place on the right",
|
|
"panes.drop.top": "Place on top",
|
|
"panes.drop.bottom": "Place below",
|
|
"panes.drop.swap": "Swap places",
|
|
"panes.drop.replace": "Show here — this pane moves to its own tab",
|
|
"panes.pick": "Show another session in this pane",
|
|
"panes.empty": "No session",
|
|
"panes.split.right": "Split right",
|
|
"panes.split.bottom": "Split down",
|
|
"panes.full": "A tab holds at most 4 panes",
|
|
"panes.newTerminal": "New terminal",
|
|
"panes.showChat": "Show as chat",
|
|
"panes.showTerminal": "Show the terminal",
|
|
"panes.close": "Move to its own tab (the session keeps running)",
|
|
"panes.resize": "Resize panes",
|
|
"tabs.home": "Workspace home",
|
|
"sessionMenu.open": "Open",
|
|
"sessionMenu.openSplit": "Open in split",
|
|
"sessionMenu.details": "Session details",
|
|
"sessionMenu.copyId": "Copy session ID",
|
|
"sessionMenu.archive": "Archive",
|
|
"sessionMenu.pin": "Pin",
|
|
"sessionMenu.unpin": "Unpin",
|
|
"panes.show": "Show {{name}} here",
|
|
"panes.splitNew.right": "Split right with a new terminal",
|
|
"panes.splitNew.bottom": "Split down with a new terminal",
|
|
"panes.closeShort": "Move to own tab",
|
|
"panes.stop": "Stop session",
|
|
"changes.copyPath": "Copy relative path",
|
|
"changes.viewCommit": "View commit",
|
|
"changes.copySha": "Copy commit SHA",
|
|
"changes.copySubject": "Copy commit message",
|
|
"replay.live": "This session is open in a tab — continue it there.",
|
|
"replay.noResume": "{{tool}} cannot resume a session by id, so this conversation is read-only here.",
|
|
"replay.newSession": "Start a new session",
|
|
"tabs.state.awaiting": "Waiting for you",
|
|
"tabs.state.error": "Error",
|
|
"tabs.state.running": "Running",
|
|
"tabs.renameHint": "Double-click to rename",
|
|
"tabs.stopTitle": "Stop “{{name}}”?",
|
|
"tabs.stopGroupTitle": "Stop the {{count}} sessions in this tab?",
|
|
"tabs.stopBody": "Closing the tab stops its session, even mid-turn. It can be resumed later from Recents.",
|
|
"tabs.stopConfirm": "Stop session",
|
|
"changes.loadMore": "Load more commits",
|
|
"changes.commentPasted": "Pasted into tab {{tab}} — press Enter there to send it",
|
|
"changes.splitter": "Resize the changes panel",
|
|
"tree.archiveLiveTitle": "Archive a live session?",
|
|
"tree.archiveLiveBody": "Its tab keeps running; archiving only hides it from this list. Unarchive it from the archived fold.",
|
|
"tree.state.awaiting": "waiting for you",
|
|
"tree.state.error": "error",
|
|
"tree.state.live": "live",
|
|
"tree.state.idle": "ended",
|
|
"tree.showMore_one": "Show {{count}} more",
|
|
"tree.showMore_other": "Show {{count}} more",
|
|
"tree.seeAll": "See all ({{count}} more)",
|
|
"tree.showLess": "Show less",
|
|
"home.contextPanel": "Workspace context",
|
|
"row.state.needsYou": "needs you",
|
|
"row.state.error": "error",
|
|
"row.state.running": "running",
|
|
"row.state.active": "active",
|
|
"row.state.idle": "idle",
|
|
"gitBar.done.fetch": "Fetched",
|
|
"gitBar.done.pull": "Pulled",
|
|
"gitBar.done.push": "Pushed",
|
|
"gitBar.done.publish": "Published",
|
|
"runtime.listening": "listening",
|
|
"runtime.notListening": "not listening",
|
|
"replay.pasted": "That session was already open in a tab — your message is pasted there; press Enter to send it.",
|
|
"replay.notPasted": "That session is open in a tab, but your message could not be pasted there: {{text}}",
|
|
"changes.changesGroup": "Changes",
|
|
"changes.unversionedGroup": "Unversioned Files",
|
|
"changes.commitTicked": "Commit ({{count}})",
|
|
"changes.commitAndPush": "Commit and Push",
|
|
"changes.amendAndPush": "Amend and Push",
|
|
"changes.pushFailed": "Committed, but the push failed: {{error}}",
|
|
"changes.tickFile": "Include {{path}} in the commit",
|
|
"changes.tickFolder": "Tick every file in {{path}}",
|
|
"changes.commitFile": "Commit File…",
|
|
"changes.jumpToSource": "Jump to Source",
|
|
"changes.copyPatch": "Copy as Patch to Clipboard",
|
|
"changes.noPatch": "This file has no text diff to copy",
|
|
"changes.addToVcs": "Add to VCS",
|
|
"changes.addToGitignore": "Add to .gitignore",
|
|
"changes.includeBlock": "Include this change in the commit",
|
|
"changes.prevDiff": "Previous difference (Shift+F7)",
|
|
"changes.nextDiff": "Next difference (F7)",
|
|
"changes.prevFile": "Previous file",
|
|
"changes.nextFile": "Next file",
|
|
"changes.showHistory": "Show History",
|
|
"changes.historyOfFile": "History of {{path}}",
|
|
"changes.historyWholeBranch": "Whole branch",
|
|
"changes.annotate": "Annotate",
|
|
"changes.noBlame": "Nothing to annotate: this file has no committed history yet",
|
|
"changes.notCommitted": "Not committed yet",
|
|
"fx.title": "Files",
|
|
"fx.workspace": "Workspace",
|
|
"fx.files": "Files",
|
|
"fx.trash": "Trash",
|
|
"fx.close": "Close",
|
|
"fx.up": "Parent folder",
|
|
"fx.refresh": "Refresh",
|
|
"fx.newFolder": "New folder",
|
|
"fx.newFile": "New file",
|
|
"fx.uploadFiles": "Upload files",
|
|
"fx.uploadFolder": "Upload a folder",
|
|
"fx.download": "Download",
|
|
"fx.downloadZip": "Download as zip",
|
|
"fx.rename": "Rename",
|
|
"fx.copy": "Copy",
|
|
"fx.cut": "Cut",
|
|
"fx.paste": "Paste",
|
|
"fx.pasteInto": "Paste into this folder",
|
|
"fx.pasteFrom": "Paste {{count}} item(s) from {{workspace}}",
|
|
"fx.delete": "Move to Trash",
|
|
"fx.open": "Open",
|
|
"fx.location": "Location",
|
|
"fx.name": "Name",
|
|
"fx.size": "Size",
|
|
"fx.modified": "Modified",
|
|
"fx.empty": "This folder is empty — drop files here to upload.",
|
|
"fx.itemsCount": "{{count}} item(s)",
|
|
"fx.selectedCount": "{{count}} selected",
|
|
"fx.dropHint": "Drag files or folders here to upload · drag onto a folder to move (Ctrl: copy)",
|
|
"fx.uploading": "Uploading {{done}}/{{total}}…",
|
|
"fx.uploaded": "Uploaded {{count}} file(s).",
|
|
"fx.uploadFailed": "Could not upload {{name}}: {{message}}",
|
|
"fx.tooBig": "{{size}} is more than one upload may carry ({{max}}). Upload fewer files at a time.",
|
|
"fx.trashed": "Moved {{count}} item(s) to the Trash.",
|
|
"fx.copiedDone": "Copied {{count}} item(s) — open a folder (or another workspace) and Paste.",
|
|
"fx.cutDone": "Cut {{count}} item(s) — open a folder (or another workspace) and Paste.",
|
|
"fx.pasted": "Pasted.",
|
|
"fx.crossOnlyWorkspace": "These items can only be pasted where they came from (a session worktree, an extra folder, or between two homes).",
|
|
"fx.needsUpgrade": "This needs the updated server helper — ask an admin to run `sudo agenthub server install-system` once.",
|
|
"fx.conflictTitle": "Already there",
|
|
"fx.conflictBody": "This name is taken in the destination: {{names}}",
|
|
"fx.conflictAll": "Do this for every remaining file",
|
|
"fx.cancel": "Cancel",
|
|
"fx.skip": "Skip",
|
|
"fx.keepBoth": "Keep both",
|
|
"fx.replace": "Replace",
|
|
"fx.trashHint": "Deleted files and folders, restorable for 7 days.",
|
|
"fx.emptyTrash": "Empty Trash",
|
|
"fx.restore": "Restore",
|
|
"fx.purge": "Delete forever",
|
|
"fx.restored": "Restored.",
|
|
"fx.trashEmpty": "The Trash is empty.",
|
|
"changes.openExplorer": "Open File Explorer — manage, upload and download files",
|
|
"changes.openInExplorer": "Open in File Explorer",
|
|
"fx.places": "Workspaces",
|
|
"fx.back": "Back",
|
|
"fx.forward": "Forward",
|
|
"fx.search": "Search (Ctrl+F)",
|
|
"fx.searchHere": "Search this folder…",
|
|
"fx.viewAs": "View as",
|
|
"fx.gridView": "Icons",
|
|
"fx.listView": "List",
|
|
"fx.new": "New",
|
|
"fx.upload": "Upload",
|
|
"fx.more": "More",
|
|
"fx.selectAll": "Select all",
|
|
"fx.showHidden": "Show hidden files (Ctrl+H)",
|
|
"fx.untitledFolder": "New folder",
|
|
"fx.untitledFile": "untitled.txt",
|
|
"fx.copyPath": "Copy path",
|
|
"fx.clearSelection": "Clear selection",
|
|
"fx.noMatch": "Nothing here matches.",
|
|
"fx.loading": "Loading…",
|
|
"fx.dropHere": "Drop to upload into {{folder}}",
|
|
"fx.nameField": "Name",
|
|
"fx.from": "From",
|
|
"fx.deletedAt": "Deleted",
|
|
"fx.unavailable": "The file manager is not available on this dashboard yet — it needs a restart after the update.",
|
|
"fx.noWorkspace": "There is no workspace yet. Add one first, then its files show here.",
|
|
"fx.myHome": "Home",
|
|
"fx.userHomes": "Users' homes",
|
|
"fx.readOnlyHome": "Another user's home — view and download only",
|
|
"fx.readOnly": "Read-only",
|
|
"fx.readOnlyHint": "This is another user's home: you can view, copy and download, not change it.",
|
|
"fx.homeEmpty": "Nothing in your home yet — its hidden files (.bashrc, .claude…) are not shown here. Your workspaces are on the left.",
|
|
"tmuxUpgrade": "Upgrade tmux: {{advice}}"
|
|
}
|