Multiple workspaces can share one checkout directory. Agent and terminal status, sidebar tabs, and ownership now attribute strictly by workspace ID, so a running or blocked agent in one workspace no longer shows up on its same-directory siblings. A one-time startup migration backfills workspace IDs onto legacy agents, and every agent and terminal is created with one thereafter. Directory lookups remain only for genuinely folder-derived git facts (branch, diff) and the archive-by-path adapter.
1891 lines
64 KiB
TypeScript
1891 lines
64 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: "Type a command or search agents...",
|
|
noMatches: "No matches",
|
|
actions: "Actions",
|
|
agents: "Agents",
|
|
newAgent: "New agent",
|
|
openProject: "Open project",
|
|
home: "Home",
|
|
},
|
|
},
|
|
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",
|
|
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...",
|
|
title: "Attach issue or PR",
|
|
},
|
|
},
|
|
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 permission 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...",
|
|
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: "Agent 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",
|
|
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}}",
|
|
missing: "Workspace not found",
|
|
manageHost: "Manage host",
|
|
},
|
|
hoverCard: {
|
|
scriptsAccessibility: "Workspace scripts",
|
|
},
|
|
fileExplorer: {
|
|
sort: {
|
|
name: "Name",
|
|
modified: "Modified",
|
|
size: "Size",
|
|
},
|
|
context: {
|
|
size: "Size",
|
|
modified: "Modified",
|
|
copyPath: "Copy path",
|
|
download: "Download",
|
|
},
|
|
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",
|
|
selectElement: "Select element",
|
|
},
|
|
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...",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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: {
|
|
run: "Run",
|
|
view: "View",
|
|
},
|
|
accessibility: {
|
|
trigger: "Workspace scripts",
|
|
openAt: "Open {{scriptName}} at {{label}}",
|
|
viewTerminal: "View {{scriptName}} terminal",
|
|
runScript: "Run {{scriptName}} script",
|
|
script: "{{scriptName}} script",
|
|
},
|
|
states: {
|
|
exitCode: "exit {{code}}",
|
|
startFailed: "Failed to start {{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",
|
|
createPr: {
|
|
label: "Create PR",
|
|
pending: "Creating PR...",
|
|
success: "PR Created",
|
|
},
|
|
mergeBranch: {
|
|
label: "Merge locally",
|
|
pending: "Merging...",
|
|
success: "Merged",
|
|
},
|
|
mergeFromBase: {
|
|
label: "Update from {{baseRef}}",
|
|
pending: "Updating...",
|
|
success: "Updated",
|
|
},
|
|
archive: {
|
|
label: "Archive worktree",
|
|
pending: "Archiving...",
|
|
success: "Archived",
|
|
},
|
|
mergePr: {
|
|
squash: "Merge",
|
|
merge: "Merge",
|
|
rebase: "Merge",
|
|
pending: "Merging PR...",
|
|
success: "PR merged",
|
|
},
|
|
autoMerge: {
|
|
enableSquash: "Auto merge",
|
|
enableMerge: "Auto merge",
|
|
enableRebase: "Auto merge",
|
|
enabled: "Auto-merge enabled",
|
|
enabling: "Enabling auto-merge...",
|
|
disabling: "Disabling auto-merge...",
|
|
disabled: "Auto-merge disabled",
|
|
},
|
|
unavailable: {
|
|
viewPrNoGithub: "View PR isn't available right now because GitHub 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",
|
|
pullAndPushInSync: "Pull and push isn't available because this branch is already in sync",
|
|
createPrNoGithub: "Create PR isn't available right now because GitHub 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}}",
|
|
archiveNotWorktree:
|
|
"Archive isn't available here because this workspace was not created as a Paseo worktree",
|
|
mergePrNoGithub: "Merge PR isn't available right now because GitHub 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 PR isn't available until GitHub reports the pull request 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",
|
|
worktreePathUnavailable: "Worktree path unavailable",
|
|
failedArchive: "Failed to archive worktree",
|
|
},
|
|
archiveWarning: {
|
|
title: 'Archive "{{worktreeName}}"?',
|
|
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: {
|
|
binaryFile: "Binary file",
|
|
tooLarge: "Diff too large to display",
|
|
unified: "Unified diff",
|
|
split: "Side-by-side diff",
|
|
hideWhitespace: "Hide whitespace",
|
|
scrollLongLines: "Scroll long lines",
|
|
wrapLongLines: "Wrap long lines",
|
|
collapseAll: "Collapse all files",
|
|
expandAll: "Expand all files",
|
|
refreshing: "Refreshing",
|
|
refresh: "Refresh",
|
|
refreshState: "Refresh git and GitHub 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",
|
|
},
|
|
openInEditor: {
|
|
open: "Open",
|
|
chooseEditor: "Choose editor",
|
|
openIn: "Open workspace in {{target}}",
|
|
openFileIn: "Open {{fileName}} in {{target}}",
|
|
failedOpen: "Failed to open workspace",
|
|
},
|
|
pr: {
|
|
sections: {
|
|
checks: "Checks",
|
|
reviews: "Reviews",
|
|
},
|
|
accessibility: {
|
|
pullRequest: "Pull 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",
|
|
},
|
|
errors: {
|
|
statusLoadFailed: "Unable to load pull request status",
|
|
activityLoadFailed: "Unable to load pull request activity",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
sidebar: {
|
|
host: {
|
|
noHost: "No host",
|
|
switchTitle: "Switch host",
|
|
searchPlaceholder: "Search hosts...",
|
|
},
|
|
actions: {
|
|
addProject: "Add project",
|
|
newWorkspace: "New workspace",
|
|
home: "Home",
|
|
settings: "Settings",
|
|
closeSidebar: "Close sidebar",
|
|
},
|
|
sections: {
|
|
sessions: "History",
|
|
},
|
|
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",
|
|
},
|
|
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",
|
|
createWorkspaceFor: "Create a new workspace for {{projectName}}",
|
|
copyPath: "Copy path",
|
|
copyBranchName: "Copy branch name",
|
|
rename: "Rename workspace",
|
|
archive: "Archive",
|
|
archiveWorktree: "Archive worktree",
|
|
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",
|
|
deleteWorktreePrompt: {
|
|
title: "Archive workspace",
|
|
message: "Also remove the worktree from disk?",
|
|
keep: "Keep on disk",
|
|
delete: "Delete",
|
|
},
|
|
},
|
|
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 worktree",
|
|
},
|
|
},
|
|
},
|
|
newWorkspace: {
|
|
title: "New workspace",
|
|
create: "Create",
|
|
backing: {
|
|
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",
|
|
checkoutHint: "Check out PR #{{number}}?",
|
|
checkoutPr: "Check out PR #{{number}}",
|
|
dismissCheckoutHint: "Dismiss PR #{{number}} checkout hint",
|
|
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.",
|
|
availableWithVersion: "Update ready: {{version}}",
|
|
available: "An app update is ready to install.",
|
|
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.",
|
|
},
|
|
},
|
|
},
|
|
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 a directory path...",
|
|
opening: "Opening project...",
|
|
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: {
|
|
archiveAction: "Archive {{label}}",
|
|
archiveTooltip: "Archive subagent",
|
|
},
|
|
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",
|
|
},
|
|
},
|
|
toolCallDetails: {
|
|
error: "Error",
|
|
empty: "No additional details available",
|
|
subAgentActivity: "Sub-agent activity",
|
|
input: "Input",
|
|
output: "Output",
|
|
},
|
|
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",
|
|
projects: "Projects",
|
|
projectList: {
|
|
hostLoadFailed: "Couldn't load projects from host {{hostName}}: {{message}}",
|
|
editProject: "Edit {{projectName}}",
|
|
},
|
|
groupInfo: "About {{title}}",
|
|
sections: {
|
|
general: "General",
|
|
daemon: "Daemon",
|
|
appearance: "Appearance",
|
|
shortcuts: "Shortcuts",
|
|
integrations: "Integrations",
|
|
permissions: "Permissions",
|
|
diagnostics: "Diagnostics",
|
|
about: "About",
|
|
},
|
|
hostSections: {
|
|
connections: "Connections",
|
|
agents: "Agents",
|
|
workspaces: "Workspaces",
|
|
providers: "Providers",
|
|
terminals: "Terminals",
|
|
host: "Host",
|
|
},
|
|
general: {
|
|
title: "General",
|
|
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",
|
|
},
|
|
language: {
|
|
label: "Language",
|
|
description: "App language",
|
|
options: {
|
|
system: "System",
|
|
ar: "Arabic",
|
|
en: "English",
|
|
es: "Spanish",
|
|
fr: "French",
|
|
ru: "Russian",
|
|
zhCN: "Simplified Chinese",
|
|
},
|
|
},
|
|
},
|
|
diagnostics: {
|
|
title: "Diagnostics",
|
|
testAudio: "Test audio",
|
|
playTest: "Play test",
|
|
playing: "Playing...",
|
|
playbackFailed: "Playback failed: {{message}}",
|
|
},
|
|
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",
|
|
},
|
|
},
|
|
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",
|
|
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",
|
|
newWorktree: "New worktree",
|
|
archiveWorktree: "Archive worktree",
|
|
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",
|
|
toggleVoiceMode: "Toggle voice mode",
|
|
startStopDictation: "Start/stop dictation",
|
|
interruptAgent: "Interrupt agent",
|
|
sendMessage: "Send message",
|
|
queueMessage: "Queue message",
|
|
muteUnmuteVoiceMode: "Mute/unmute voice mode",
|
|
},
|
|
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.",
|
|
},
|
|
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",
|
|
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...",
|
|
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",
|
|
agentTitle: "Agent titles",
|
|
agentTitlePlaceholder: "Keep titles imperative and under 40 characters",
|
|
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>;
|