Files
paseo/packages/app/src/i18n/resources/en.ts
T
Mohamed Boudra 9966e49329 Key workspace status and ownership by ID, not directory
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.
2026-06-16 13:37:58 +07:00

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