Files
paseo/packages/app/src/i18n/resources/en.ts
T
f8dd0fc2e0 Switch projects from New Workspace with ⌘P/Ctrl+P (#2110)
* feat(app): add ⌘P shortcut to switch project on New Workspace screen

Opens the existing project picker with its search focused so the project
can be switched from the keyboard (type + Enter) instead of clicking the
badge and then the project.

Wires a new "workspace.project.pick" action through the standard keyboard
pipeline (binding -> route passthrough -> dispatcher), handled by a
screen-scoped handler on the New Workspace screen that is only registered
while the screen is mounted and there are projects to pick. Because
preventDefault only fires when a handler handles the key, ⌘P/Ctrl+P still
triggers native print everywhere else. Adds a Settings -> Shortcuts help
row (rebindable) and the "Switch project" label across all locales.

* test(app): cover project picker shortcut

---------

Co-authored-by: Mohamed Boudra <boudra.moha@gmail.com>
2026-07-28 00:32:41 +02:00

2201 lines
76 KiB
TypeScript

export const en = {
common: {
back: "Back",
loading: "Loading...",
actions: {
back: "Back",
cancel: "Cancel",
close: "Close",
copy: "Copy",
dismiss: "Dismiss",
retry: "Retry",
search: "Search",
select: "Select",
},
placeholders: {
search: "Search...",
},
empty: {
noResults: "No results found",
noOptionsMatchSearch: "No options match your search.",
},
states: {
loading: "Loading...",
starting: "Starting...",
copied: "Copied",
copiedLabel: "Copied {{label}}",
downloadComplete: "Download complete",
downloadFailed: "Download failed",
},
errors: {
error: "Error",
unableToSave: "Unable to save",
nameRequired: "Name is required",
daemonUnavailable: "Daemon unavailable",
daemonClientUnavailable: "Daemon client unavailable",
daemonClientDisconnected: "Daemon client is disconnected",
noFileFound: "No file found for {{token}}",
unexpectedDictationError: "An unexpected error occurred while handling dictation.",
},
connectionStatus: {
online: "Online",
connecting: "Connecting",
offline: "Offline",
error: "Error",
idle: "Idle",
},
},
shell: {
menu: {
toggleSidebar: "Toggle sidebar",
open: "Open menu",
close: "Close menu",
},
commandCenter: {
placeholder: "Search commands, workspaces, and agents...",
noMatches: "No matches",
actions: "Actions",
workspaces: "Workspaces",
agents: "Agents",
newAgent: "New agent",
addProject: "Add project",
home: "Home",
modelGroupLabel: "Model",
modelSearchKeywords: "switch model change model set model select model",
},
},
composer: {
placeholders: {
desktop: "Message the agent, tag @files, or use /commands and /skills",
mobile: "Message, @files, /commands",
fallback: "Message...",
},
input: {
accessibilityLabel: "Message agent...",
focusHint: "{{shortcut}} to focus",
addAttachment: "Add attachment",
interruptAgent: "Interrupt agent",
queueMessage: "Queue message",
sendAndInterrupt: "Send and interrupt",
sendMessage: "Send message",
queue: "Queue",
send: "Send",
},
cancel: {
cancelingAgent: "Canceling agent",
stopAgent: "Stop agent",
interrupt: "Interrupt",
},
voice: {
enableVoiceMode: "Enable Voice mode",
voiceMode: "Voice mode",
unmuteVoiceMode: "Unmute Voice mode",
muteVoiceMode: "Mute Voice mode",
stopDictation: "Stop dictation",
startDictation: "Start dictation",
unmuteVoice: "Unmute voice",
muteVoice: "Mute voice",
dictation: "Dictation",
interruptBeforeVoice: "Interrupt the agent before starting voice mode",
},
attachments: {
addImage: "Add image",
addFile: "Upload file",
addIssueOrPr: "Add issue or PR",
addIssueOrPr_mr: "Add issue or MR",
dropImagesHere: "Drop images here",
dropFilesHere: "Drop files here",
editQueuedMessage: "Edit queued message",
sendQueuedMessageNow: "Send queued message now",
openImage: "Open image attachment",
removeImage: "Remove image attachment",
removeFile: "Remove file attachment",
openGithub: "Open {{kind}} {{number}}",
removeGithub: "Remove {{kind}} {{number}}",
element: "Element",
openBrowserElement: "Open browser element attachment",
removeBrowserElement: "Remove browser element attachment",
openReview: "Open review attachment",
removeReview: "Remove review attachment",
},
errors: {
failedToSend: "Failed to send message",
failedToCreateAgent: "Failed to create agent",
noHostSelected: "No host selected",
initialPromptRequired: "Initial prompt is required",
alreadyLoading: "Already loading",
uploadFailed: "Failed to upload file",
fileTooLarge: "{{fileName}} is too large (max {{size}})",
},
clientCommands: {
archiveAgent: "Archive the current agent",
freshDraft: "Archive this agent and start a fresh draft",
},
github: {
searching: "Searching...",
noResults: "No results found.",
searchPlaceholder: "Search issues and PRs...",
searchPlaceholder_mr: "Search issues and MRs...",
title: "Attach issue or PR",
title_mr: "Attach issue or MR",
},
},
agentControls: {
provider: {
fallback: "Provider",
select: "Select agent provider",
},
thinking: {
title: "Thinking",
unknown: "Unknown",
extraHigh: "Extra high",
select: "Select thinking option",
selectWithValue: "Select thinking option ({{value}})",
},
model: {
unknown: "Unknown model",
},
features: {
title: "Features",
open: "Open agent features",
on: "On",
off: "Off",
},
mode: {
title: "Mode",
searchPlaceholder: "Search modes...",
selectWithValue: "Select agent mode ({{value}})",
},
hints: {
thinking: "Thinking mode",
model: "Change model",
mode: "Change mode",
},
},
agentStream: {
empty: "Start chatting with this agent...",
scrollToBottom: "Scroll to bottom",
permission: {
plan: "Plan",
required: "Permission Required",
deny: "Deny",
accept: "Accept",
implement: "Implement",
question: "How would you like to proceed?",
proposedPlan: "Proposed plan",
},
},
agentPanel: {
states: {
notFound: "Agent not found",
failedToLoad: "Failed to load agent",
reconnecting: "Reconnecting...",
timelineSyncFailed: "Couldn't refresh agent history. Retrying…",
archivingTitle: "Archiving agent...",
archivingSubtitle: "Please wait while we archive this agent.",
},
unavailable: {
selectedHost: "Selected host",
unknownHost:
"Cannot open this agent because {{serverLabel}} is not configured on this device.",
addHost: "Add the host in Settings or open an agent on a configured server to continue.",
preparingSession: "Preparing {{serverLabel}} session...",
connecting: "Connecting to {{serverLabel}}...",
showSoon: "We will show this agent in a moment.",
showWhenOnline: "We will show this agent once the host is online.",
reconnectingTo: "Reconnecting to {{serverLabel}}...",
showAgainWhenReachable: "We will show this agent again as soon as the host is reachable.",
},
archived: {
callout: "This agent is archived",
unarchive: "Unarchive",
},
},
sessions: {
title: "History",
empty: "No sessions yet",
actions: {
loadMore: "Load more",
},
},
agentList: {
fallbackTitle: "New session",
dateSections: {
recent: "Recent",
today: "Today",
yesterday: "Yesterday",
thisWeek: "This week",
thisMonth: "This month",
older: "Older",
},
status: {
initializing: "Starting",
idle: "Idle",
running: "Running",
error: "Error",
closed: "Closed",
},
badges: {
archived: "Archived",
pending: "{{count}} pending",
attention: "Attention",
},
archiveSheet: {
hostOffline: "Host offline",
runningAgent: "This agent is still running. Archiving it will stop the agent.",
archive: "Archive",
},
},
message: {
actions: {
copyCode: "Copy code",
copyTurn: "Copy turn",
copyMessage: "Copy message",
forkMenu: "Fork chat",
forkInNewTab: "Fork in a new tab",
forkInNewWorkspace: "Fork in a new workspace",
forkUnavailable: "Update the host to use this.",
forkMissingWorkspace: "This agent is not in a workspace.",
forkFailed: "Failed to fork chat",
openFile: "Open file",
copied: "Copied",
},
attachments: {
dismissImage: "Dismiss image",
closeImage: "Close image",
imageLoadFailed: "Couldn't load image",
imageUnavailable: "Image unavailable",
imagePreviewUnavailable: "Image preview unavailable.",
imagePreviewLoadFailed: "Unable to load image preview.",
review: "Review",
commentsOne: "1 comment",
commentsMany: "{{count}} comments",
textAttachment: "Text attachment",
text: "Text",
file: "File",
},
speak: {
header: "Spoke",
},
activity: {
details: "Details",
},
dictation: {
start: "Start voice dictation",
cancel: "Cancel dictation",
retry: "Retry dictation",
insert: "Insert transcription",
insertAndSend: "Insert transcription and send",
failed: "Dictation failed: {{error}}",
failedRetry: "Dictation failed. Tap retry.",
},
question: {
submit: "Submit",
next: "Next",
answerPlaceholder: "Type your answer...",
otherPlaceholder: "Other...",
},
todo: {
title: "Tasks",
empty: "No tasks yet.",
},
compaction: {
loading: "Compacting...",
auto: "Context automatically compacted",
manual: "Context manually compacted",
withTokens: "Context compacted ({{tokens}}K tokens)",
completed: "Context compacted",
},
},
importSession: {
title: "Import session",
filters: {
all: "All",
},
status: {
connectHost: "Connect to a host to import sessions",
updateHost: "Update the host to import sessions.",
noProviders: "No importable providers are enabled.",
loading: "Loading recent sessions...",
failedAll: "Could not load recent sessions.",
failedProviders: "Could not load sessions for {{providers}}.",
failedImport: "Could not import selected session.",
},
actions: {
refresh: "Refresh sessions",
},
preview: {
untitledSession: "Untitled session",
noPrompt: "No prompt preview",
},
empty: {
noRecent: "No recent sessions to import.",
alreadyImported: "All recent sessions are already imported.",
noProviderSessions: "No {{provider}} sessions found.",
},
row: {
importing: "Importing...",
},
},
workspace: {
route: {
loading: "Loading workspace",
connecting: "Connecting",
hostOffline: "{{hostName}} is offline",
cannotReachHost: "Cannot reach {{hostName}}",
hostStatus: "Host status: {{status}}",
needsHostUpgrade: "Update your host to restore this workspace",
manageHost: "Manage host",
recovery: {
archivedTitle: "Workspace archived",
restoreDescription:
"{{workspaceName}} was archived and its worktree was removed. Restore branch {{branch}} to open it again.",
unarchiveDescription: "{{workspaceName}} is archived. Unarchive it to open it again.",
restoreAction: "Restore",
unarchiveAction: "Unarchive",
restoringTitle: "Restoring workspace",
restoringAction: "Restoring...",
unavailableTitle: "Workspace unavailable",
checkFailedTitle: "Couldn't check workspace",
},
},
hoverCard: {
scriptsAccessibility: "Workspace scripts",
copyPath: "Copy path",
copyBranchName: "Copy branch name",
copied: "Copied",
},
fileActions: {
openFile: "Open file",
copyPath: "Copy path",
download: "Download",
addToChat: "Add to chat…",
moreActions: "More actions",
},
fileExplorer: {
sort: {
name: "Name",
modified: "Modified",
size: "Size",
},
context: {
size: "Size",
modified: "Modified",
},
actions: {
back: "Back",
retry: "Retry",
refresh: "Refresh files",
refreshing: "Refreshing files",
hideHiddenFiles: "Hide hidden files",
showHiddenFiles: "Show hidden files",
},
empty: {
noFiles: "No files",
noVisibleFiles: "No visible files",
},
states: {
unavailable: "Workspace is unavailable",
loading: "Loading files...",
},
errors: {
failedToListDirectory: "Failed to list directory",
},
},
setup: {
descriptor: {
label: "Setup",
completed: "Setup completed",
failed: "Setup failed",
workspace: "Workspace setup",
},
status: {
running: "Running",
completed: "Completed",
failed: "Failed",
waiting: "Waiting for setup output",
},
waiting: "Setting up workspace...",
empty: {
noCommands: "No setup commands ran for this workspace.",
},
accessibility: {
noCommands: "No setup commands ran for this workspace",
log: "Workspace setup log",
},
log: {
noOutput: "No output",
},
},
browser: {
unavailable: {
title: "Browser is desktop-only",
subtitle: "Open this workspace in Electron to use the built-in browser.",
},
session: "Browser session {{browserId}}",
controls: {
back: "Back",
forward: "Forward",
stopLoading: "Stop loading",
refresh: "Refresh",
browserUrl: "Browser URL",
enterUrl: "Enter URL",
openDevTools: "Open browser dev tools",
cancelSelector: "Cancel element selector",
annotateElement: "Annotate element",
screenshotElement: "Screenshot element",
screenshotCopied: "Copied screenshot to clipboard",
elementCopied: "Copied element to clipboard",
screenshotFailed: "Couldn't copy screenshot",
},
annotate: {
title: "Annotate element",
placeholder: "Message to the agent about this element…",
submit: "Attach",
cancel: "Cancel",
},
devices: {
label: "Device size",
responsive: "Responsive",
},
errors: {
failedToLoad: "Failed to load page",
invalidUrl: "Invalid browser URL",
unsupportedProtocol: "Blocked unsupported browser URL: {{protocol}}",
},
},
terminal: {
hostDisconnected: "Host is not connected",
unableToSubscribe: "Unable to subscribe to terminal",
},
tabs: {
loading: "Loading...",
modified: "Unsaved changes",
loadingAgentTitle: "Loading agent title",
emptyPane: "No tabs in this pane.",
fallback: {
newAgent: "New agent",
setup: "Setup",
workspaceSetup: "Workspace setup",
terminal: "Terminal",
browser: "Browser",
agent: "Agent",
workspace: "Workspace",
},
switcher: {
trigger: "Switch tabs ({{count}} open)",
title: "Switch tab",
searchPlaceholder: "Search tabs",
},
menu: {
openFor: "Open menu for {{label}}",
copyResumeCommand: "Copy resume command",
copyAgentId: "Copy agent id",
copyTerminalId: "Copy terminal id",
copyFilePath: "Copy file path",
rename: "Rename",
closeAbove: "Close tabs above",
closeBelow: "Close tabs below",
closeLeft: "Close to the left",
closeRight: "Close to the right",
closeOthers: "Close other tabs",
reloadAgent: "Reload agent",
reloadAgentTooltip: "Reload agent to update skills, MCPs or login status.",
close: "Close",
renameTerminal: "Rename terminal",
renameAgent: "Rename agent",
},
actions: {
newAgent: "New agent",
newTerminal: "New terminal",
preparingTerminal: "Preparing terminal tab",
preparingTerminalTooltip: "Preparing terminal...",
newBrowser: "New browser",
exitFocusMode: "Exit focus mode",
splitRight: "Split pane right",
splitDown: "Split pane down",
terminalProfilesMenu: "Terminal profiles",
editTerminalProfiles: "Edit profiles…",
pinTarget: "Pin",
unpinTarget: "Unpin",
},
explorer: {
open: "Open explorer",
close: "Close explorer",
toggle: "Toggle explorer",
changes: "Changes",
files: "Files",
},
toasts: {
copyFailed: "Copy failed",
agentIdCopiedLabel: "Agent ID",
terminalIdCopiedLabel: "Terminal ID",
resumeCommandCopiedLabel: "resume command",
filePathCopiedLabel: "File path",
resumeIdUnavailable: "Resume ID not available",
resumeCommandUnavailable: "Resume command not available",
reloadingAgent: "Reloading agent...",
reloadedAgent: "Reloaded agent",
failedToReloadAgent: "Failed to reload agent",
},
confirmations: {
close: "Close",
cancel: "Cancel",
archive: "Archive",
unsavedTitle: "Unsaved changes",
unsavedMessage:
"This tab has changes that have not been saved. Closing it will discard the draft.",
closeWithoutSaving: "Close without saving",
closePaneTitle: "Close pane?",
bulkUnsaved: "{{count}} tab(s) have unsaved changes. Closing will discard those drafts.",
closeTerminalTitle: "Close terminal?",
closeTerminalMessage: "Any running process in this terminal will be stopped immediately.",
archiveRunningAgentTitle: "Archive running agent?",
archiveRunningAgentMessage:
"This agent is still running. Archiving it will stop the agent and close the tab.",
closeTabsLeftTitle: "Close tabs to the left?",
closeTabsRightTitle: "Close tabs to the right?",
closeOtherTabsTitle: "Close other tabs?",
bulk: {
all: "This will archive {{agents}} agent(s), close {{terminals}} terminal(s), and close {{tabs}} tab(s). Any running process in a closed terminal will be stopped immediately.",
agentsAndTerminals:
"This will archive {{agents}} agent(s) and close {{terminals}} terminal(s). Any running process in a closed terminal will be stopped immediately.",
terminalsAndTabs:
"This will close {{terminals}} terminal(s) and close {{tabs}} tab(s). Any running process in a closed terminal will be stopped immediately.",
agentsAndTabs: "This will archive {{agents}} agent(s) and close {{tabs}} tab(s).",
terminals:
"This will close {{terminals}} terminal(s). Any running process in a closed terminal will be stopped immediately.",
tabs: "This will close {{tabs}} tab(s).",
agents: "This will archive {{agents}} agent(s).",
},
},
},
header: {
actions: {
workspaceActions: "Workspace actions",
newAgent: "New agent",
newTerminal: "New terminal",
newBrowser: "New browser tab",
importSession: "Import session",
copyPath: "Copy workspace path",
copyBranchName: "Copy branch name",
showSetup: "Show setup",
},
toasts: {
workspacePathUnavailable: "Workspace path is not available yet",
branchNameUnavailable: "Branch name not available",
terminalQueued: "Preparing workspace, opening terminal when ready...",
workspacePathCopiedLabel: "Workspace path",
branchNameCopiedLabel: "Branch name",
},
},
scripts: {
title: "Scripts",
actions: {
chooseUrl: "Choose URL",
copyUrl: "Copy URL",
openService: "View service",
restart: "Restart",
run: "Run",
stop: "Stop",
view: "View terminal",
},
accessibility: {
trigger: "Workspace scripts",
openService: "View {{scriptName}} service",
viewTerminal: "View {{scriptName}} terminal",
runScript: "Run {{scriptName}} script",
stopScript: "Stop {{scriptName}}",
restartScript: "Restart {{scriptName}}",
copyUrl: "Copy {{scriptName}} URL",
chooseUrl: "Choose URL for {{scriptName}}",
script: "{{scriptName}} script",
},
routes: {
public: "Reverse proxy",
paseo: "Memorable",
direct: "Direct",
},
states: {
exitCode: "exit {{code}}",
startFailed: "Failed to start {{scriptName}}",
stopFailed: "Failed to stop {{scriptName}}",
},
},
git: {
actions: {
moreOptions: "More options",
moreActions: "More actions",
commit: {
label: "Commit",
pending: "Committing...",
success: "Committed",
},
pull: {
label: "Pull",
pending: "Pulling...",
success: "Pulled",
},
push: {
label: "Push",
pending: "Pushing...",
success: "Pushed",
},
pullAndPush: {
label: "Pull and push",
pending: "Pulling and pushing...",
success: "Pulled and pushed",
},
viewPr: "View PR",
viewPr_mr: "View MR",
createPr: {
label: "Create PR",
pending: "Creating PR...",
success: "PR Created",
label_mr: "Create MR",
pending_mr: "Creating MR...",
success_mr: "MR Created",
},
mergeBranch: {
label: "Merge locally",
pending: "Merging...",
success: "Merged",
},
mergeFromBase: {
label: "Update from {{baseRef}}",
pending: "Updating...",
success: "Updated",
},
archive: {
label: "Archive workspace",
pending: "Archiving...",
success: "Archived",
},
mergePr: {
squash: "Merge PR (squash)",
merge: "Merge PR (merge)",
rebase: "Merge PR (rebase)",
pending: "Merging PR...",
success: "PR merged",
squash_mr: "Merge MR (squash)",
merge_mr: "Merge MR (merge)",
rebase_mr: "Merge MR (rebase)",
pending_mr: "Merging MR...",
success_mr: "MR merged",
},
autoMerge: {
enableSquash: "Auto merge (squash)",
enableMerge: "Auto merge (merge)",
enableRebase: "Auto merge (rebase)",
enabled: "Auto-merge enabled",
enabling: "Enabling auto-merge...",
disabling: "Disabling auto-merge...",
disabled: "Auto-merge disabled",
},
unavailable: {
viewPrNoForge:
"View {{noun}} isn't available right now because {{brand}} isn't connected",
pullNoRemote:
"Pull isn't available here because this branch is not connected to a remote yet",
pullDirty:
"Pull isn't available while you have local changes so commit or stash them first",
pullUpToDate: "Pull isn't available because this branch is already up to date",
pushNoRemote:
"Push isn't available here because this branch is not connected to a remote yet",
pushBehind: "Push isn't available yet because there are newer changes to bring in first",
pushNothing: "Push isn't available because there is nothing new to send",
pullAndPushNoRemote:
"Pull and push isn't available here because this branch is not connected to a remote yet",
pullAndPushDirty:
"Pull and push isn't available while you have local changes so commit or stash them first",
pullAndPushNoIncoming:
"Pull and push isn't available because there are no incoming changes to pull first",
pullAndPushInSync: "Pull and push isn't available because this branch is already in sync",
pullAndPushNothingToPush:
"Pull and push isn't available because there is nothing new to send after pulling",
createPrNoForge:
"Create {{noun}} isn't available right now because {{brand}} isn't connected",
createPrNoCommits:
"Create PR isn't available because this branch doesn't have any new commits yet",
mergeNoBase: "Merge isn't available because we couldn't determine the base branch",
mergeDirty:
"Merge isn't available while you have local changes so commit or stash them first",
mergeNothing:
"Merge isn't available because this branch doesn't have anything new to merge yet",
updateNoBase: "Update isn't available because we couldn't determine the base branch",
updateDirty:
"Update isn't available while you have local changes so commit or stash them first",
updateCurrent:
"Update isn't available because this branch is already up to date with {{baseRef}}",
mergePrNoGithub: "Merge PR isn't available right now because GitHub isn't connected",
archiveNotWorktree:
"Archive isn't available here because this workspace was not created as a Paseo worktree",
mergePrNoForge:
"Merge {{noun}} isn't available right now because {{brand}} isn't connected",
mergePrMissing: "Merge PR isn't available because there isn't a pull request yet",
mergePrDraft: "Merge PR isn't available because the pull request is still a draft",
mergePrMerged: "Merge PR isn't available because the pull request is already merged",
mergePrClosed: "Merge PR isn't available because the pull request is closed",
mergePrConflicts: "Merge PR isn't available because the pull request has conflicts",
mergePrQueue: "Merge PR isn't available here because this repository uses a merge queue",
mergePrNotReady:
"Merge {{noun}} isn't available until {{brand}} reports the {{noun}} is ready to merge",
autoMergeCannotDisable: "Auto-merge is enabled, but this account can't disable it",
},
toasts: {
failedCommit: "Failed to commit",
failedPull: "Failed to pull",
failedPush: "Failed to push",
failedPullAndPush: "Failed to pull and push",
failedCreatePr: "Failed to create PR",
failedMergePr: "Failed to merge PR",
failedEnableAutoMerge: "Failed to enable auto-merge",
failedDisableAutoMerge: "Failed to disable auto-merge",
baseRefUnavailable: "Base ref unavailable",
failedMerge: "Failed to merge",
failedMergeFromBase: "Failed to merge from base",
},
archiveWarning: {
title: 'Archive "{{workspaceName}}"?',
confirm: "Archive",
cancel: "Cancel",
uncommittedChanges: "Uncommitted changes",
uncommittedChangesWithDiff: "Uncommitted changes ({{diffStat}})",
addedLine: "{{count}} added line",
addedLines: "{{count}} added lines",
deletedLine: "{{count}} deleted line",
deletedLines: "{{count}} deleted lines",
unpushedCommit: "{{count}} unpushed commit",
unpushedCommits: "{{count}} unpushed commits",
},
},
diff: {
openChangesTab: "Open Changes tab",
closeChangesTab: "Close Changes tab",
binaryFile: "Binary file",
tooLarge: "Diff too large to display",
unified: "Unified diff",
split: "Side-by-side diff",
switchToUnified: "Switch to unified diff",
switchToSplit: "Switch to side-by-side diff",
showTreeView: "Show folder tree",
showFlatView: "Show flat file list",
options: "Diff options",
hideWhitespace: "Hide whitespace",
showWhitespace: "Show whitespace",
scrollLongLines: "Scroll long lines",
wrapLongLines: "Wrap long lines",
collapseAll: "Collapse all files",
expandAll: "Expand all files",
collapseAllFolders: "Collapse all folders",
expandAllFolders: "Expand all folders",
refreshing: "Refreshing",
refresh: "Refresh",
refreshState: "Refresh git and {{brand}} state",
failedRefresh: "Failed to refresh git state.",
emptyHiddenWhitespace: "No visible changes after hiding whitespace",
emptyUncommitted: "No uncommitted changes",
emptyAgainstBase: "No changes vs {{baseRef}}",
checkingRepository: "Checking repository...",
notRepository: "Not a git repository",
diffMode: "Diff mode",
uncommitted: "Uncommitted",
committed: "Committed",
branchUnknown: "Unknown",
base: "base",
newFile: "New",
deletedFile: "Deleted",
commits: {
title: "Commits",
countLabel: "{{count}} workspace commits",
noneAhead: "No commits ahead of {{baseRef}} yet",
fileDiffEmpty: "No changes to display",
fileDiffError: "Failed to load file diff",
loading: "Loading commits…",
loadError: "Failed to load commits",
empty: "No commits yet",
},
},
openInEditor: {
open: "Open",
chooseEditor: "Choose editor",
openIn: "Open workspace in {{target}}",
openFileIn: "Open {{fileName}} in {{target}}",
failedOpen: "Failed to open workspace",
},
pr: {
actions: {
viewPullRequest: "View",
openOn: "Open on {{brand}}",
},
sections: {
checks: "Checks",
pipeline: "Pipeline",
reviews: "Reviews",
},
empty: {
noJobs: "No jobs",
loadingPipeline: "Loading pipeline…",
pipelineJobsLoadFailed: "Could not load pipeline jobs",
allowedToFail: "allowed to fail",
},
approvals: "{{given}} of {{required}} approvals",
accessibility: {
pullRequest: "Pull request #{{number}}",
pullRequest_mr: "Merge request !{{number}}",
},
states: {
draft: "Draft",
merged: "Merged",
closed: "Closed",
open: "Open",
},
activity: {
commented: "Commented",
approved: "Approved",
requestedChanges: "Requested changes",
reviewed: "Reviewed",
},
time: {
justNow: "just now",
},
thread: {
discussion: "Discussion thread",
},
errors: {
statusLoadFailed: "Unable to load pull request status",
activityLoadFailed: "Unable to load pull request activity",
},
},
forgeSetup: {
installCli: "Install the {{cli}} CLI to use {{brand}} features.",
signIn: "Run {{command}} to use {{brand}} features.",
generic: "Set up {{brand}} on this host to use its features.",
},
},
},
sidebar: {
pinned: {
title: "Pinned",
},
host: {
noHost: "No host",
switchTitle: "Switch host",
searchPlaceholder: "Search hosts...",
},
actions: {
addProject: "Add project",
newWorkspace: "New workspace",
hosts: "Hosts",
home: "Home",
settings: "Settings",
closeSidebar: "Close sidebar",
},
help: {
trigger: "Help and support",
sectionHelp: "Help",
diagnostics: "Run diagnostics",
shortcuts: "Keyboard shortcuts",
reportIssue: "Report an issue",
discord: "Discord",
github: "Create GitHub issue",
whatsNew: "What's new",
version: "Paseo {{version}}",
},
sections: {
sessions: "History",
schedules: "Schedules",
},
worktreeSetup: {
title: "Set up worktree scripts",
description:
"Add setup commands so new worktrees can install dependencies and prepare themselves automatically.",
openProjectSettings: "Open project settings",
},
project: {
actions: {
menu: "Project actions",
openSettings: "Open project settings",
openNewWindow: "Open in new window",
openNewWindowFailed: "Couldn't open a new window",
remove: "Remove project",
removing: "Removing...",
},
confirmations: {
removeTitle: "Remove project?",
removeMessage:
'Remove "{{projectName}}" from the sidebar?\n\nFiles on disk will not be changed.',
removeConfirm: "Remove",
cancel: "Cancel",
},
toasts: {
hostDisconnected: "Host is not connected",
removeFailed: "Failed to remove some workspaces",
updateHostToRemove: "Update the host to remove projects.",
},
empty: {
title: "No projects yet",
description: "Add a project to get started",
},
},
workspace: {
status: {
scriptsAvailable: "Scripts available",
creating: "Creating...",
},
actions: {
menu: "Workspace actions",
newWorkspace: "New workspace",
showMore: "Show more",
showLess: "Show less",
createWorkspaceFor: "Create a new workspace for {{projectName}}",
copyPath: "Copy path",
copyBranchName: "Copy branch name",
rename: "Rename workspace",
pin: "Pin to top",
unpin: "Unpin",
archive: "Archive",
archiveWorkspace: "Archive workspace",
hideFromSidebar: "Hide from sidebar",
archiving: "Archiving...",
hiding: "Hiding...",
},
confirmations: {
hideTitle: "Hide workspace?",
hideMessage:
'Hide "{{workspaceName}}" from the sidebar?\n\nFiles on disk will not be changed.',
hideConfirm: "Hide",
cancel: "Cancel",
},
rename: {
title: "Rename workspace",
submit: "Rename",
invalidBranchName: "Invalid branch name",
},
toasts: {
workspacePathUnavailable: "Workspace path not available",
pathCopied: "Path copied",
branchNameCopied: "Branch name copied",
hostDisconnected: "Host is not connected",
hideFailed: "Failed to hide workspace",
archiveFailed: "Failed to archive workspace",
},
},
},
newWorkspace: {
title: "New workspace",
create: "Create",
isolation: {
local: "Local",
worktree: "New worktree",
label: "Isolation",
},
fields: {
project: "Project",
base: "Base",
baseNotApplicable: "Not applicable",
},
titlePlaceholder: "Title (optional)",
errors: {
hostDisconnected: "Host is not connected",
createWorktreeFailed: "Failed to create worktree",
composerStateRequired: "Composer state is required",
selectModel: "Select a model",
},
refPicker: {
startingRef: "Starting ref",
chooseStart: "Choose where to start from",
intoBase: "into {{baseRef}}",
searching: "Searching...",
noMatchingRefs: "No matching refs.",
searchPlaceholder: "Search branches and PRs",
title: "Start from",
},
},
desktop: {
quitting: {
title: "Quitting Paseo...",
detail: "Stopping the local daemon.",
},
daemon: {
title: "Daemon",
status: {
title: "Status",
builtInOnly: "Only the built-in desktop daemon is shown here",
running: "running",
notRunning: "not running",
pid: "PID {{pid}}",
},
management: {
title: "Manage built-in daemon",
hint: "Let Paseo start and stop the built-in daemon",
pauseTitle: "Pause built-in daemon",
pauseMessage:
"This will stop the built-in daemon immediately. Running agents and terminals connected to the built-in daemon will be stopped.",
pauseAndStop: "Pause and stop",
registrationFailed:
"Built-in daemon started, but Paseo could not save the localhost connection. Toggle daemon management off and on again, or add localhost manually.",
pausedStopFailed:
"Built-in daemon management was paused, but Paseo could not stop the daemon.",
updateFailed: "Unable to update built-in daemon management.",
},
keepRunning: {
title: "Keep daemon running after quit",
hint: "Daemon keeps running when you quit Paseo",
},
logs: {
title: "Log file",
modalTitle: "Daemon logs",
unavailable: "Log path unavailable",
empty: "(log file is empty)",
copied: "Log path copied.",
copyFailed: "Unable to copy log path.",
open: "Open logs",
copyPath: "Copy path",
},
fullStatus: {
title: "Full status",
modalTitle: "Daemon status",
hint: "Runs `paseo daemon status` and shows the output",
view: "View status",
copied: "Status copied to clipboard.",
fetchFailed: "Failed to fetch daemon status: {{message}}",
},
advancedSettings: "Advanced settings",
openAdvancedSettings: "Open advanced daemon settings",
versionMismatch:
"App and daemon versions don't match. Update both to the same version for the best experience.",
loadFailed: "Unable to load desktop daemon status.",
},
updates: {
status: {
checking: "Checking for app updates...",
installing: "Installing app update...",
upToDate: "App is up to date.",
upToDateWithLastChecked: "Up to date. Last checked at {{time}}.",
pending: "We'll let you know when the update is ready.",
pendingWithLastChecked:
"We'll let you know when the update is ready. Last checked at {{time}}.",
pendingWithVersion: "Update found: {{version}}. Downloading...",
pendingWithVersionAndLastChecked:
"Update found: {{version}}. Downloading... Last checked at {{time}}.",
availableWithVersion: "Update ready: {{version}}",
availableWithVersionAndLastChecked: "Update ready: {{version}}. Last checked at {{time}}.",
available: "An app update is ready to install.",
availableWithLastChecked: "An app update is ready to install. Last checked at {{time}}.",
installed: "App update installed. Restart required.",
failed: "Failed to update app.",
idle: "Update status has not been checked yet.",
},
installError: "Unable to install the desktop app update.",
callout: {
installingTitle: "Installing update",
failedTitle: "Update failed",
availableTitle: "Update available",
genericError: "Something went wrong.",
whatsNew: "What's new",
installingAction: "Installing...",
installAndRestart: "Install & restart",
installingDescription: "Installing and restarting...",
versionReady: "{{version}} is ready to install.",
newVersionReady: "A new version is ready to install.",
restartWarning: "Upgrading the app will stop running agents and close terminal sessions.",
},
},
settings: {
loadFailed: "Unable to load desktop settings.",
saveFailed: "Unable to save desktop settings.",
},
rosetta: {
title: "Download the Apple Silicon build",
runningIntel: "You're running the Intel build of Paseo under Rosetta on Apple Silicon.",
highCpu: "This causes high CPU usage. Download the Apple Silicon build to fix it.",
download: "Download",
},
permissions: {
notifications: {
allowed: "Notifications are allowed by the OS.",
denied: "Notifications are denied in system settings.",
notGranted: "Notifications have not been granted yet.",
webOnly: "Desktop notification status is only available on web runtime.",
supported: "Desktop notifications are supported.",
unsupported: "Desktop notifications are not supported on this platform.",
apiUnavailable: "Web Notification API is unavailable in this environment.",
requestsWebOnly: "Desktop notification requests are only available on web runtime.",
requestUnavailable: "Web Notification API requestPermission() is unavailable.",
requestFailed: "Failed to request notification permission: {{message}}",
unexpectedState: "Unexpected notification permission state: {{state}}",
},
microphone: {
webOnly: "Desktop microphone status is only available on web runtime.",
navigatorUnavailable: "Navigator is unavailable in this environment.",
granted: "Microphone access is granted.",
denied: "Microphone access is denied in system settings.",
notGranted: "Microphone permission has not been granted yet.",
unexpectedState: "Unexpected microphone permission state: {{state}}",
statusApiUnavailable:
"Microphone status API is unavailable in this runtime. Use Request to check access.",
queryFailed: "Failed to query microphone status: {{message}}",
captureUnavailable: "Microphone capture is unavailable in this environment.",
permissionApiUnavailable:
"Permission status API is unavailable. Use Request to check access.",
requestsWebOnly: "Desktop microphone requests are only available on web runtime.",
captureApiUnavailable: "Microphone capture API is unavailable in this environment.",
requestDenied: "Microphone permission was denied by the user or system.",
noDevice: "No microphone device was found.",
requestFailed: "Failed to request microphone permission: {{message}}",
},
empty: {
notifications: "Notification status has not been checked yet.",
microphone: "Microphone status has not been checked yet.",
},
testNotification: {
title: "Paseo notification test",
body: "If you can see this, desktop notifications work.",
notDelivered: "Notification was not delivered. Check System Settings > Notifications.",
failed: "Failed to send notification.",
},
},
integrations: {
cli: {
statusFailed: "Unable to check CLI install status.",
installFailed: "Unable to install the Paseo CLI.",
},
skills: {
statusFailed: "Unable to check orchestration skills status.",
installFailed: "Unable to install orchestration skills.",
updateFailed: "Unable to update orchestration skills.",
uninstallFailed: "Unable to uninstall orchestration skills.",
},
},
},
rootError: {
kicker: "Something went wrong",
title: "Paseo ran into a problem.",
body: "Try again to reload the app. If this keeps happening, include the details below when you report it.",
details: "Details",
},
startup: {
errorTitle: "Something went wrong",
errorDescription:
"The local server failed to start. If this keeps happening, please report the issue on GitHub and include the logs below.",
logs: {
loading: "Loading daemon logs...",
unavailable: "No daemon logs available.",
loadFailed: "Unable to load daemon logs: {{message}}",
},
},
openProject: {
tiles: {
addProject: {
title: "Add a project",
description: "Open a folder on your machine",
},
importSession: {
title: "Import session",
description: "Bring in recent external CLI sessions",
},
setupProviders: {
title: "Setup providers",
description: "Configure Claude Code, Codex, and more",
},
pairDevice: {
title: "Pair device",
description: "Connect your phone to this daemon",
},
},
},
projectPicker: {
placeholder: "Type to search...",
browse: "Browse…",
opening: "Opening project...",
searching: "Searching...",
empty: "Start typing a path",
errors: {
directory_not_found: "Directory not found.",
open_failed: "Could not open project.",
},
openPath: "Open path",
},
branchSwitcher: {
currentBranch: "Current branch: {{branchName}}. Press to switch branch.",
placeholder: "Switch branch...",
searchPlaceholder: "Filter branches...",
empty: "No branches found.",
title: "Switch branch",
uncommittedTitle: "Uncommitted changes",
uncommittedMessage: "You have uncommitted changes. Stash them before switching branches?",
stashAndSwitch: "Stash & Switch",
failedToStash: "Failed to stash changes",
failedToSwitch: "Failed to switch branch",
restoreStashTitle: "Restore stashed changes?",
restoreStashMessage:
"This branch has stashed changes from a previous session. Would you like to restore them?",
restore: "Restore",
later: "Later",
stashRestored: "Stashed changes restored",
},
agentAutocomplete: {
searchingWorkspace: "Searching workspace...",
loadingCommands: "Loading commands...",
noFiles: "No files or directories found",
noCommands: "No commands found",
failedToLoad: "Failed to load",
},
loadOlderHistory: {
failed: "Couldn't load older history",
},
imageAttachmentPicker: {
permissionTitle: "Permission required",
permissionMessage: "Please allow access to your photo library to attach images.",
errorTitle: "Error",
failedToSelect: "Failed to select image",
dialogTitle: "Attach images",
dialogFilterName: "Images",
},
workspaceSetup: {
title: "Create workspace",
errors: {
failedCreateWorktree: "Failed to create worktree",
failedOpenProject: "Failed to open project",
selectModel: "Select a model",
hostDisconnected: "Host is not connected",
pendingRequired: "No workspace setup is pending",
composerStateRequired: "Workspace setup composer state is required",
},
},
onboarding: {
title: "Welcome to Paseo",
subtitle: "Connect your computer to get started",
actions: {
settings: "Settings",
},
},
modelSelector: {
title: "Select provider",
selectModel: "Select model",
selectedModel: "Select model ({{model}})",
loading: "Loading...",
loadingShort: "Loading",
loadingSelector: "Loading model selector...",
error: "Error",
defaultModel: "Default",
favorites: "Favorites",
favoriteModel: "Favorite model",
unfavoriteModel: "Unfavorite model",
modelCount: "{{count}} model",
modelCountPlural: "{{count}} models",
retry: "Retry",
retrying: "Retrying...",
noMatches: "No models match your search",
searchPlaceholder: "Search models...",
openProviderSettings: "Open {{provider}} settings",
},
providerCatalog: {
title: "Add provider",
search: "Search providers",
noProviders: "No providers found",
actions: {
add: "Add",
adding: "Adding",
installed: "Installed",
cancel: "Cancel",
installInstructions: "Install instructions",
installInstructionsFor: "{{provider}} install instructions",
},
errors: {
unableToInstall: "Unable to install provider",
},
},
providerSelection: {
defaultModel: "Default",
selectModel: "Select model",
loading: "Loading...",
error: "Error",
unavailable: "Unavailable",
unknownError: "Unknown error",
readiness: {
initialPromptRequired: "Initial prompt is required",
noProviders: "No available providers on the selected host",
modelDefaultsLoading: "Model defaults are still loading",
noModelAvailable: "No model is available for the selected provider",
workspaceDirectoryNotFound: "Workspace directory not found",
hostDisconnected: "Host is not connected",
},
},
pairing: {
connectionMethods: {
title: "Add connection",
direct: {
title: "Direct connection",
description: "Local network or VPN.",
},
scanQr: {
title: "Scan QR code",
description: "Encrypted relay connection.",
},
pasteLink: {
title: "Paste pairing link",
description: "Encrypted relay connection.",
},
},
direct: {
title: "Direct connection",
helper: "Enter the address of a Paseo server.",
fields: {
host: "Host",
port: "Port",
password: "Password",
optional: "Optional",
useSsl: "Use SSL",
connectionUri: "Connection URI",
},
advanced: {
label: "Advanced",
show: "Show advanced",
hide: "Hide advanced",
},
passwordVisibility: {
show: "Show password",
hide: "Hide password",
},
actions: {
cancel: "Cancel",
connect: "Connect",
connecting: "Connecting...",
},
errors: {
hostRequired: "Host is required",
invalidPort: "Port must be between 1 and 65535",
invalidConnection: "Invalid connection",
failedTitle: "Connection failed",
failedToConnect: "We failed to connect to {{endpoint}}.",
noAdditionalDetails: "{{detail}} (no additional details provided)",
timedOut: "Connection timed out. Check the host/port and your network.",
refused: "Connection refused. Is the server running at this address?",
hostNotFound: "Host not found. Check the hostname and try again.",
hostUnreachable: "Host is unreachable. Check your network and firewall.",
tlsError:
"TLS error. Direct connections use SSL only when a TLS terminator is in front of the daemon.",
unableToConnect: "Unable to connect. Check the host/port and that the daemon is reachable.",
details: "Details: {{detail}}",
},
},
link: {
title: "Paste pairing link",
helper: "Paste the pairing link from your server.",
label: "Pairing link",
errors: {
required: "Paste a pairing link (.../#offer=...)",
missingOffer: "Link must include #offer=...",
emptyOffer: "Offer payload is empty",
invalid: "Invalid pairing link",
unableToPair: "Unable to pair host",
},
alert: {
failedTitle: "Pairing failed",
},
actions: {
cancel: "Cancel",
pair: "Pair",
pairing: "Pairing...",
},
},
scan: {
title: "Scan QR",
webUnavailableTitle: "Not available on web",
webUnavailableBody:
'QR scanning is not supported in the web build. Use "Paste link" instead.',
backToSettings: "Back to Settings",
cameraPermissionTitle: "Camera permission",
cameraPermissionBody: "Allow camera access to scan the pairing QR code from your daemon.",
grantPermission: "Grant permission",
pairing: "Pairing...",
unableToPair: "Unable to pair host",
errorTitle: "Error",
},
device: {
loadingOffer: "Loading pairing offer...",
failedToLoadOffer: "Failed to load pairing offer.",
relayDisabled: "Relay is not enabled. Enable relay to pair a device.",
unavailable: "Pairing offer unavailable.",
hint: "Scan this QR code with Paseo on your phone, or copy the link below.",
qrUnavailable: "QR code unavailable.",
retry: "Retry",
copy: "Copy",
copied: "Copied",
},
},
realtimeVoice: {
actions: {
mute: "Mute realtime voice",
unmute: "Unmute realtime voice",
stop: "Stop realtime voice and interrupt turn",
},
},
rewind: {
tooltip: "Rewind to this message",
warning: "This action cannot be undone",
actions: {
conversation: "Rewind conversation",
files: "Rewind files",
both: "Rewind conversation and files",
},
errors: {
failed: "Failed to rewind agent",
},
},
diffViewer: {
empty: "No changes to display",
},
serviceUrl: {
title: "Open service URL",
message: "Open {{url}}?",
inPaseo: "In Paseo",
externalBrowser: "External browser",
dontAskAgain: "Don't ask again",
},
downloads: {
requestTokenFailed: "Failed to request download token.",
hostUnavailable: "Download host is unavailable.",
cancelled: "Download was cancelled.",
failed: "Failed to download file.",
shareFile: "Share file",
shareFileNamed: "Share {{fileName}}",
},
menu: {
backdrop: "Menu backdrop",
},
subagents: {
detachAction: "Detach {{label}}",
detachTooltip: "Detach subagent",
archiveAction: "Archive {{label}}",
archiveTooltip: "Archive subagent",
archiveFinishedAction: "Archive finished subagents",
archiveFinishedTooltip: "Archive finished",
},
panels: {
draft: {
newAgent: "New Agent",
creatingAgent: "Creating agent",
},
file: {
directoryMissing: "Workspace directory not found.",
loading: "Loading file...",
noPreview: "No preview available",
binaryPreviewUnavailable: "Binary preview unavailable",
failedToLoad: "Failed to load file",
failedToLoadPreview: "Failed to load file preview",
editor: {
fileSize: "File size {{size}}",
lines: "{{count}} lines",
editorStatus: "Editor status {{status}}",
unsavedChanges: "Unsaved changes",
saving: "Saving...",
saveFailed: "Save failed",
changedOnDisk: "Changed on disk",
vimMode: "Vim mode {{mode}}",
cursor: "Line {{line}}, column {{column}}",
preview: "Preview",
source: "Source",
unavailableTitle: "File unavailable on disk",
conflictDescription: "The local buffer was preserved. Choose which version to keep.",
overwrite: "Overwrite",
reload: "Reload",
reloadTitle: "Reload from disk?",
reloadMessage: "Your local changes will be lost.",
},
},
diff: {
changesLabel: "Changes",
changesSubtitle: "Working tree diff",
commitSubtitle: "Commit diff",
uncommittedSubtitle: "Uncommitted changes",
baseSubtitle: "Compared with {{baseRef}}",
directoryMissing: "Workspace directory not found.",
empty: "No changes",
loadError: "Failed to load diff",
capabilityMissing: "Update the host to view commit diffs.",
},
},
toolCallDetails: {
error: "Error",
empty: "No additional details available",
subAgentActivity: "Sub-agent activity",
input: "Input",
output: "Output",
},
toolCallGroup: {
editedFiles: {
one: "edited {{count}} file",
other: "edited {{count}} files",
},
commands: {
one: "ran {{count}} command",
other: "ran {{count}} commands",
},
readFiles: {
one: "read {{count}} file",
other: "read {{count}} files",
},
searches: {
one: "searched {{count}} time",
other: "searched {{count}} times",
},
otherTools: {
one: "used {{count}} other tool",
other: "used {{count}} other tools",
},
paseoCalls: {
one: "called Paseo {{count}} time",
other: "called Paseo {{count}} times",
},
and: "and",
},
renameModal: {
rename: "Rename",
saving: "Saving...",
},
sidebarCallout: {
dismiss: "Dismiss",
},
contextWindow: {
title: "Context window",
used: "{{percentage}}% used",
tokens: "{{used}} / {{max}} tokens",
sessionCost: "Session cost {{cost}}",
accessibility: "Context window {{percentage}}% used",
},
review: {
comment: {
add: "Add review comment",
edit: "Edit review comment",
delete: "Delete review comment",
label: "Review comment",
placeholder: "Leave a comment",
cancel: "Cancel",
cancelAccessibility: "Cancel review comment",
save: "Comment",
saveAccessibility: "Save review comment",
},
},
settings: {
title: "Settings",
loading: "Loading settings...",
groups: {
app: "App",
host: "Host",
},
hostPicker: {
switchHost: "Switch host",
local: "Local",
},
backToWorkspace: "Back",
addHost: "Add host",
enableBuiltInDaemon: "Enable built-in daemon",
projects: "Projects",
projectList: {
hostLoadFailed: "Couldn't load projects from host {{hostName}}: {{message}}",
editProject: "Edit {{projectName}}",
},
groupInfo: "About {{title}}",
sections: {
general: "General",
appearance: "Appearance",
editor: "Editor",
shortcuts: "Shortcuts",
integrations: "Integrations",
permissions: "Permissions",
diagnostics: "Diagnostics",
about: "About",
},
editor: {
title: "Editor",
vimKeybindings: "Vim keybindings",
vimHint: "Applies to source files on web and desktop.",
},
hostSections: {
connections: "Connections",
agents: "Agents",
workspaces: "Workspaces",
providers: "Providers",
usage: "Usage",
terminals: "Terminals",
host: "Overview",
},
general: {
title: "General",
browserData: {
title: "Browser data",
siteData: "Cookies and site data",
description: "Browser tabs share sign-ins and site data across Paseo.",
clear: "Clear browser data",
clearing: "Clearing...",
confirmTitle: "Clear browser data?",
confirmMessage: "Sites will be signed out and open browser tabs will reload.",
success: "Browser data cleared.",
error: "Couldn't clear browser data.",
},
defaultSend: {
label: "Default send",
descriptions: {
interrupt: "When the agent is running, Enter interrupts. Command/Ctrl+Enter queues.",
queue: "When the agent is running, Enter queues. Command/Ctrl+Enter submits.",
},
options: {
interrupt: "Interrupt",
queue: "Queue",
},
},
serviceUrls: {
label: "Service URLs",
description: "Where to open URLs from running scripts",
options: {
ask: "Ask",
inApp: "In Paseo",
external: "External browser",
},
},
terminalScrollback: {
label: "Terminal scrollback",
description: "Lines kept in the built-in terminal buffer",
accessibilityLabel: "Terminal scrollback lines",
},
autoExpandReasoning: {
label: "Always expand reasoning",
description: "Show agent thinking and chain-of-thought blocks fully expanded by default",
},
toolCallDetail: {
label: "Tool call display",
description: "How tool calls appear in the timeline",
accessibilityLabel: "Select tool call display ({{value}})",
options: {
overview: "Summary",
detailed: "Full detail",
},
},
language: {
label: "Language",
description: "App language",
options: {
system: "System",
ar: "Arabic",
en: "English",
es: "Spanish",
fr: "French",
ja: "Japanese",
ptBR: "Brazilian Portuguese",
ru: "Russian",
zhCN: "Simplified Chinese",
},
},
},
diagnostics: {
title: "Diagnostics",
testAudio: "Test audio",
playTest: "Play test",
playing: "Playing...",
playbackFailed: "Playback failed: {{message}}",
app: {
title: "App diagnostic",
rowTitle: "App diagnostic",
rowHint: "Collect connection, daemon, provider, desktop, and log details",
run: "Run",
running: "Running diagnostic...",
copyLabel: "diagnostic",
copyAccessibility: "Copy diagnostic",
copyFailed: "Failed to copy diagnostic",
refreshAccessibility: "Refresh diagnostic",
refreshingAccessibility: "Refreshing diagnostic",
progress: {
client: "Client",
desktop: "Desktop",
},
},
},
about: {
title: "About",
appVersion: "App version",
thisDevice: "This device",
connectedHosts: "Connected hosts",
offline: "Offline",
versionDiffers: "Version differs from this device",
releaseChannel: {
label: "Release channel",
description: "Switch to Beta to get updates sooner and help shape them",
stable: "Stable",
beta: "Beta",
},
updates: {
label: "App updates",
readyToInstall: "Ready to install: {{version}}",
installTitle: "Install desktop update",
installMessage: "This updates Paseo on this computer",
installConfirm: "Install update",
update: "Update",
updateTo: "Update to {{version}}",
installing: "Installing...",
check: "Check",
checking: "Checking...",
alertTitle: "Error",
alertMessage: "Unable to open the update confirmation dialog.",
},
},
appearance: {
theme: {
title: "Theme",
accessibilityLabel: "Theme: {{value}}",
options: {
light: "Light",
dark: "Dark",
zinc: "Zinc",
midnight: "Midnight",
claude: "Claude",
ghostty: "Ghostty",
auto: "System",
},
},
detailLevel: {
title: "Detail level",
},
fonts: {
title: "Fonts",
systemDefault: "System default",
interfaceFont: "Interface font",
interfaceFontHint: "Used across the app. Leave empty for the system default",
interfaceFontAccessibility: "Interface font family",
interfaceSize: "Interface size",
interfaceSizeAccessibility: "Interface font size",
codeFont: "Code font",
codeFontHint:
"Used in code, diffs, and the terminal output. Leave empty for the system default",
codeFontAccessibility: "Code font family",
codeSize: "Code size",
codeSizeAccessibility: "Code font size",
},
syntax: {
title: "Syntax",
highlightTheme: "Highlight theme",
highlightThemeHint: "Colors for code, independent of the app theme",
highlightThemeAccessibility: "Highlight theme: {{value}}",
previewAccessibility: "Live preview of the syntax theme and code font",
},
},
shortcuts: {
dialogTitle: "Shortcuts",
searchPlaceholder: "Search shortcuts",
unavailableOnMobile: "Keyboard shortcuts are only available on desktop",
capturePrompt: "Press shortcut...",
actions: {
done: "Done",
cancel: "Cancel",
rebind: "Rebind",
reset: "Reset",
resetAll: "Reset all",
},
sections: {
navigation: "Navigation",
tabsPanes: "Tabs & Panes",
projects: "Projects",
panels: "Panels",
agentInput: "Agent Input",
},
help: {
openProject: "Open project",
newWorkspace: "New workspace",
newWorktree: "New worktree",
archiveWorkspace: "Archive workspace",
newTab: "New tab",
closeCurrentTab: "Close current tab",
jumpToWorkspace: "Jump to workspace",
jumpToTab: "Jump to tab",
previousWorkspace: "Previous workspace",
nextWorkspace: "Next workspace",
previousTab: "Previous tab",
nextTab: "Next tab",
splitPaneRight: "Split pane right",
splitPaneDown: "Split pane down",
focusPaneLeft: "Focus pane left",
focusPaneRight: "Focus pane right",
focusPaneUp: "Focus pane up",
focusPaneDown: "Focus pane down",
moveTabLeft: "Move tab left",
moveTabRight: "Move tab right",
moveTabUp: "Move tab up",
moveTabDown: "Move tab down",
closePane: "Close pane",
newTerminal: "New terminal",
toggleCommandCenter: "Toggle command center",
showKeyboardShortcuts: "Show keyboard shortcuts",
toggleLeftSidebar: "Toggle left sidebar",
toggleRightSidebar: "Toggle right sidebar",
toggleBothSidebars: "Toggle both sidebars",
toggleSettings: "Toggle settings",
toggleFocusMode: "Toggle focus mode",
cycleTheme: "Cycle theme",
focusMessageInput: "Focus message input",
cycleAgentMode: "Cycle agent mode",
toggleVoiceMode: "Toggle voice mode",
startStopDictation: "Start/stop dictation",
interruptAgent: "Interrupt agent",
sendMessage: "Send message",
queueMessage: "Queue message",
muteUnmuteVoiceMode: "Mute/unmute voice mode",
switchProject: "Switch project",
},
helpNotes: {
showKeyboardShortcuts: "Available when focus is not in a text field or terminal.",
},
},
integrations: {
title: "Integrations",
docs: {
cli: "CLI docs",
skills: "Skills docs",
openCli: "Open CLI documentation",
openSkills: "Open skills documentation",
},
commandLine: {
title: "Command line",
description: "Control and script agents from your terminal",
},
skills: {
title: "Orchestration skills",
description: "Teach your agents to orchestrate through the CLI",
updateAvailable: "Update available",
updateTitle: "Update Paseo skills?",
updateFallback: "Sync bundled skills to your machine.",
uninstallTitle: "Uninstall Paseo skills?",
uninstallMessage:
"Removes all Paseo orchestration skills from ~/.agents, ~/.claude, ~/.codex.",
},
actions: {
install: "Install",
installing: "Installing...",
installed: "Installed",
update: "Update",
working: "Working...",
uninstall: "Uninstall",
},
operations: {
add: "Add skill",
update: "Update skill",
delete: "Delete skill",
},
},
permissions: {
title: "Permissions",
notifications: "Notifications",
microphone: "Microphone",
refresh: "Refresh",
refreshing: "Refreshing...",
refreshAccessibility: "Refresh desktop permissions",
test: "Test",
actions: {
granted: "Granted",
request: "Request",
requesting: "Requesting...",
busySuffix: "{{label}}...",
},
},
host: {
notFound: "Host not found",
badges: {
relay: "Relay",
local: "Local",
},
connections: {
title: "Connections",
removeTitle: "Remove connection",
removeMessage: "Remove {{name}}? This cannot be undone.",
removeAction: "Remove",
removeErrorTitle: "Error",
removeErrorMessage: "Unable to remove connection",
timeout: "Timeout",
},
pairDevices: {
title: "Pair devices",
rowTitle: "Pair a device",
rowHint: "Scan a QR code or copy a link to connect your phone to this host",
},
orchestration: {
title: "Orchestration",
unavailable: "Connect to this host to manage orchestration",
enableTools: {
title: "Enable Paseo tools",
hint: "Agents will be able to manage worktrees, agents and schedules",
accessibilityLabel: "Inject Paseo tools",
},
systemPrompt: {
title: "System prompt",
hint: "Adds a system prompt to all agents",
sheetTitle: "Append system prompt",
accessibilityLabel: "Append system prompt",
placeholder: "Always keep replies concise.",
edit: "Edit",
reset: "Reset",
save: "Save",
saving: "Saving...",
},
},
agents: {
unavailable: "Connect to this host to manage agents",
},
workspaces: {
unavailable: "Connect to this host to manage workspaces",
},
terminalProfiles: {
unavailable: "Connect to this host to manage terminal profiles",
sectionTitle: "Terminal profiles",
editProfile: "Edit profile",
addProfileTitle: "Add terminal profile",
editProfileTitle: "Edit terminal profile",
namePlaceholder: "Claude Code",
commandPlaceholder: "claude",
argsPlaceholder: "--dangerously-skip-permissions",
nameLabel: "Name",
commandLabel: "Command",
argsLabel: "Arguments",
nameRequired: "Name is required",
commandRequired: "Command is required",
argsHint: "Space-separated arguments passed to the command",
saving: "Saving...",
remove: "Remove",
removeConfirmTitle: "Remove profile?",
removeConfirmMessage: 'Remove "{{name}}"?',
moveUp: "Move up",
moveDown: "Move down",
save: "Save",
emptyState: "No profiles yet. Add one to launch terminals with a specific command.",
},
daemon: {
rename: {
editLabel: "Edit label",
title: "Rename host",
placeholder: "My Host",
submit: "Rename",
},
restart: {
title: "Restart daemon",
hint: "Restarts the daemon process. The app will reconnect automatically",
confirm: "Restart",
confirmTitle: "Restart {{name}}",
confirmMessage:
"This will restart the daemon. Agents running on it will keep going; the app will reconnect automatically.",
restarting: "Restarting...",
unableToReconnectTitle: "Unable to reconnect",
unableToReconnectMessage:
"{{name}} did not come back online. Please verify it restarted.",
unavailableTitle: "Host unavailable",
unavailableMessage:
"This host is not connected. Wait for it to come online before restarting.",
offlineTitle: "Host offline",
offlineMessage:
"This host is offline. Paseo reconnects automatically-wait until it's back online before restarting.",
requestFailedTitle: "Error",
requestFailedMessage:
"Failed to send the restart request. Paseo reconnects automatically-try again once the host shows as online.",
dialogFailedMessage: "Unable to open the restart confirmation dialog.",
},
update: {
desktopManagedHint:
"This daemon is managed by Paseo Desktop. Update Paseo Desktop on the host.",
title: "Update daemon",
hint: "Update the daemon to the latest version and restart it",
confirm: "Update",
confirmTitle: "Update {{name}}",
confirmMessage:
"This will update the daemon to the latest version and restart it. Running agents will be briefly interrupted.",
updating: "Updating...",
phaseStarting: "Preparing update...",
phaseDownloading: "Downloading packages...",
phaseInstalling: "Installing...",
phaseComplete: "Update complete, restarting...",
unableToReconnectTitle: "Unable to reconnect",
unableToReconnectMessage:
"{{name}} did not come back online after updating. Please verify the daemon restarted.",
unavailableTitle: "Host unavailable",
unavailableMessage:
"This host is not connected. Wait for it to come online before updating.",
offlineTitle: "Host offline",
offlineMessage: "This host is offline. Wait until it is back online before updating.",
requestFailedTitle: "Update failed",
requestFailedMessage: "Failed to update the daemon: {{error}}",
dialogFailedMessage: "Unable to open the update confirmation dialog.",
},
dangerZone: "Danger zone",
remove: {
title: "Remove host",
localTitle: "Remove localhost connection",
hint: "Removes this host and its saved connections from this device",
localHint: "Removes localhost from this device and stops the built-in daemon",
localConfirmTitle: "Remove localhost connection and stop daemon?",
confirmMessage: "Remove {{name}}? This will delete its saved connections.",
localConfirmMessage:
"This will remove the localhost connection, turn off built-in daemon management, and stop the managed daemon. Remote hosts remain connected.",
errorTitle: "Error",
errorMessage: "Unable to remove host",
localErrorMessage: "Unable to remove localhost connection",
},
},
},
providers: {
title: "Providers",
addProvider: "Add provider",
providerDetails: "{{name}} provider details",
enableProvider: "Enable {{name}}",
unavailable: "Connect to this host to see providers",
loading: "Loading...",
addErrorTitle: "Unable to add provider",
updateErrorTitle: "Unable to update provider",
actions: {
menu: "{{name}} actions",
remove: "Remove provider",
removing: "Removing...",
},
remove: {
confirmTitle: "Remove {{name}}?",
confirmMessage: "This deletes the provider entry from config.json. It cannot be undone.",
confirm: "Remove",
errorTitle: "Unable to remove provider",
},
statuses: {
disabled: "Disabled",
loading: "Loading",
error: "Error",
available: "Available",
notInstalled: "Not installed",
},
models: {
one: "1 model",
many: "{{count}} models",
addModel: "Add model",
addCustomTitle: "Add custom model",
modelId: "Model ID",
modelIdPlaceholder: "e.g. openai/gpt-5",
add: "Add",
adding: "Adding...",
failedToSave: "Failed to save model",
removeModel: "Remove {{id}}",
searchPlaceholder: "Search models",
loading: "Loading models...",
retry: "Retry",
retrying: "Retrying...",
noSearchMatches: "No models match your search",
noneDetected: "No models detected",
discovered: "Discovered",
custom: "Custom models",
updated: "Updated {{time}}",
},
diagnostic: {
title: "Diagnostic",
button: "Diagnostic",
refresh: "Refresh",
refreshing: "Refreshing...",
copyLabel: "diagnostic",
copyAccessibility: "Copy diagnostic",
copyFailed: "Failed to copy diagnostic",
refreshAccessibility: "Refresh diagnostic",
refreshingAccessibility: "Refreshing diagnostic",
running: "Running diagnostic...",
none: "No diagnostic available",
failedToFetch: "Failed to fetch diagnostic",
unknownError: "Unknown error",
},
},
project: {
noEditableTarget: "We don't have an editable copy of this project on any connected host.",
backToProjects: "Back to projects",
switchHost: "Switch host",
rename: {
renamedToast: "Project renamed",
errorFallback: "Couldn't rename project",
renameLabel: "Rename project",
resetLabel: "Reset project name to default",
projectNameLabel: "Project name",
saveLabel: "Save project name",
cancelLabel: "Cancel renaming",
reset: "Reset",
},
readFailures: {
invalidTitle: "paseo.json couldn't be parsed",
invalidDescription: "Fix the file on disk, then reload.",
missingTitle: "This host doesn't have this project",
missingWithHosts: "Switch to another host above, or reload.",
missingSingleHost: "The selected host has no record of this project.",
transportTitle: "Couldn't load paseo.json",
transportFallback: "The host didn't respond.",
failedTitle: "Couldn't load paseo.json",
failedDescription: "Reload to try again.",
},
worktree: {
title: "Worktree lifecycle hooks",
info: "Commands that run when a worktree is created or torn down for this project",
docs: "Docs",
docsTooltip:
"See docs for more details and the environment variables available to these commands",
setup: "Setup",
setupAccessibility: "Worktree setup commands",
teardown: "Teardown",
teardownAccessibility: "Worktree teardown commands",
},
scripts: {
title: "Scripts",
info: "Long-running services and one-off commands you can launch from any agent in this project",
empty: "No scripts yet.",
untitled: "Untitled script",
port: "port {{port}}",
menuAccessibility: "Open script menu",
removeTitle: "Remove script?",
removeMessage: "Remove {{name}}?",
removeFallbackName: "this script",
name: "Name",
command: "Command",
nameAccessibility: "Script name",
commandAccessibility: "Script command",
nameRequired: "Name is required",
commandRequired: "Command is required",
newScript: "New script",
editScript: "Edit {{name}}",
runAsService: "Run as a service",
serviceHint: "Paseo supervises the process and assigns a port via $PASEO_PORT",
actions: {
add: "Add script",
edit: "Edit",
remove: "Remove",
},
},
metadata: {
title: "Metadata generation",
info: "Project-specific instructions injected into the AI prompts Paseo uses to generate metadata - use them to enforce your team's conventions like branch naming, commit style, or PR format",
branchName: "Branch names",
branchNamePlaceholder: "Prefix branches with feat/ or fix/, mb/ for personal branches",
commitMessage: "Commit messages",
commitMessagePlaceholder: "Use Conventional Commits with a scope",
pullRequest: "Pull requests",
pullRequestPlaceholder: "Lead with a one-paragraph summary, include a Test plan section",
},
writeFailures: {
staleTitle: "Config changed on disk",
staleDescription: "Reload to fetch the latest paseo.json before saving.",
failedTitle: "Couldn't save paseo.json",
failedDescription: "Try again, or reload the latest version from disk.",
},
actions: {
reload: "Reload",
tryAgain: "Try again",
save: "Save",
saved: "Project saved",
saving: "Saving...",
cancel: "Cancel",
},
},
},
} as const;
type WidenStringLeaves<T> = {
[K in keyof T]: T[K] extends string ? string : WidenStringLeaves<T[K]>;
};
export type TranslationResources = WidenStringLeaves<typeof en>;