import type { zhTW } from "./zh-TW"; /** English UI copy. Keys must stay in lockstep with zh-TW. */ export const en: { [K in keyof typeof zhTW]: string } = { liveCompleted: "Completed", liveFailed: "Task incomplete: an error occurred", liveCancelled: "Stopped: cancelled or interrupted", liveInput: "Your reply is needed to continue", liveTakeover: "Waiting for you; resumes after handoff", liveRunning: "Working", liveLoading: "Loading run status…", liveDisconnected: "Status unavailable; reconnecting. This does not mean the AI has stopped.", liveSlow: "This step has not returned yet. Timeouts, retries and any stop reason will be reported.", liveHistory: "Actions, errors and timings", search: "Search", sharedComputer: "Shared computer", privateComputer: "Private computer", stopped: "Stopped", booting: "Starting", running: "Running", suspended: "Sleeping", error: "Error", openComputer: "Start computer", stopTask: "Stop task", takeControl: "Take control", takeOverNow: "Take over", releaseControl: "Release control", done: "Done", skip: "Skip", localWorkspace: "Local workspace", pinned: "Pinned", agentGroup: "Agent", operationFailed: "That didn’t work", loadFailed: "Couldn’t load", settingsFailed: "Couldn’t save settings", loginFailed: "Couldn’t sign in", rememberFailed: "Couldn’t remember that message", clipboardWriteBlocked: "The browser blocked clipboard access.", newConversation: "New chat", workTools: "Work tools", computer: "Computer", memory: "Memory", plugins: "Plugins", pluginShort: "Plugin", botSettings: "Bot settings", add: "Add", addBot: "New bot", addGroup: "New group", groups: "Groups", unreadMessages: "{count} unread", members: "{count} members", hideHiddenItems: "Hide hidden items", showHiddenItems: "Show hidden items", mcpConnected: "{count} MCP connected", connectMcpServer: "Connect an MCP server", openOnPhone: "Open on phone", settings: "Settings", about: "About", helpCenter: "Help", sendFeedback: "Send feedback", logout: "Sign out", workspaceMenu: "Workspace menu", chooseBot: "Choose a bot", startRoomDiscussion: "Start a discussion with {name}", startBotWork: "Start working with {name}", roomWillReply: "{names} will all reply.", botWelcome: "Send a message and it will get it done on its own computer.", remembered: "Remembered", remember: "Remember", working: "{name} is working…", copyCode: "Copy code", copiedCode: "Copied", copyMessage: "Copy", copiedMessage: "Copied", anotherConversationQueued: "Another chat is running, so this one is queued.", workingStep: "{name} is working… {step}", queuedMessages: "{count} more messages queued", pausedUserControl: "You’re controlling the screen, so {name} is paused. Press “Release control” when you’re done and it will continue from here (queued messages too).", pausedNeedsUser: "{name} needs you on the screen (sign-in or verification). Press “Take over”, then “Release control” when you’re done.", releaseAndContinue: "Release and continue", attachFile: "Attach file", attachFileHint: "Images go to the model on this message. Other files land in the computer inbox and are deleted after two hours.", attachTooMany: "Up to 4 attachments at a time", attachTooLarge: "Each file must be 10 MB or smaller", attachType: "That file type can’t be attached", attachRemove: "Remove {name}", attachedFile: "Attached {name}", attachDrop: "Drop to attach", teachTask: "Teach a task", teachTaskHint: "You demonstrate once; it turns that into a skill", teachNeedsBot: "Choose a bot first", taughtSkills: "Taught skills", goalCommandHint: "Keep planning and executing until it’s verified or it needs you", searchSkills: "Search skills", noMatchingSkills: "No matching skills", teachDialogLead: "You’ll drive the screen while {name} watches: which controls you click, what you type, which pages you visit. It becomes a skill about intent and flow, not replayed coordinates.", teachGoalLabel: "What are you demonstrating? (one sentence)", teachGoalPlaceholder: "For example: open the STAR training system, finish the assigned videos, and complete the quiz", teachTip1: "Work at a normal pace. Extra clicks are ignored.", teachTip2: "Values that change (search terms, names, dates) can become parameters — use a real example while you demonstrate.", teachTip3: "Password fields are not recorded. Sign in before you start if you need to.", startDemo: "Start demo", finishDemo: "Finish demo", teachingBadge: "Recording", teachingComposerHint: "Recording: finish the demo before sending a message", teachingLive: "Learning: {goal}", teachingHint: "The screen is yours — work on the right (or enlarge it). Press “Finish demo” when you’re done.", teachingCaptured: "{count} actions captured", distilling: "Turning the “{goal}” demo into a skill…", skillDraftTitle: "New skill draft", skillDraftFrom: "From {count} actions", skillName: "Skill name", skillNamePlaceholder: "For example: Complete STAR training course", skillInputs: "Inputs", skillSteps: "Steps (intent, editable)", moreSteps: "…and {count} more", editSteps: "Edit steps", skillCheck: "How to know it’s done", skillDistillFailed: "The model couldn’t tidy this up. This list is from the raw actions — edit before saving.", discard: "Discard", testRun: "Try it", saveSkill: "Save skill", messageTo: "Message {name}", chooseConversationFirst: "Choose a chat first", stopConversation: "Stop", editSkill: "Edit skill", editSkillFull: "Full edit", runSkillNamed: "Run “{name}”", skillEditLead: "Write this for the bot: intent and on-screen wording, not coordinates. One item per line.", skillIntent: "Intent (what this skill should achieve)", skillWhenToUse: "When to use it", skillInputsLabel: "Inputs (one per line: name: description | e.g. example)", skillInputsPlaceholder: "courseName: course title | e.g. Workplace Bullying Prevention (2026)", skillPreconditions: "Preconditions", skillStepsLabel: "Steps (one per line; use → for what you should see)", skillStepsPlaceholder: "Click “Next” → page number increases; if Next is locked, wait until it enables", skillHowToCheck: "How to know it’s done", skillWhatToReturn: "What to report when finished", skillCautions: "Cautions (one per line)", deleteSkill: "Delete skill", deleteSkillConfirm: "Delete skill “{name}”? The bot won’t recognize it after that.", skillSaved: "Saved", exportSkill: "Export", exportSkillHint: "Download as JSON to import on another bot", importSkill: "Import skill", importSkillHint: "Add a skill from a previously exported JSON file", skillImportInvalid: "That isn’t a valid skill file. Choose a JSON export from LazyBoy.", collapseSidebar: "Collapse sidebar", botComputer: "{name}’s computer", dedicatedScreen: "This screen", enlarge: "Enlarge", userControlling: "You’re in control", aiReadOnly: "AI is working (view only)", readOnly: "View only", pasteClipboard: "Paste clipboard", copyDesktopClipboard: "Copy desktop clipboard", moreActions: "More", unpin: "Unpin", pin: "Pin", markUnread: "Mark unread", enterGroupName: "Enter a group name", changeGroup: "Change group", createOrMoveGroup: "Create / move to group", removeFromGroup: "Remove from group", unhide: "Unhide", hide: "Hide", delete: "Delete", chooseConversation: "Choose a chat", deleteConversation: "Delete chat", clearConversation: "Clear this chat", clearConversationTitle: "Clear this chat?", clearConversationDescription: "Messages will be deleted. This agent’s long-term memory stays.", cancel: "Cancel", clearMessages: "Clear messages", deleteConversationTitle: "Delete this chat?", deleteConversationDescription: "It will leave the list. This agent’s long-term memory stays.", avatarAppearance: "Avatar", avatarAppearanceHint: "Color, shape, expression, and background. Eyes follow the cursor.", color: "Color", chooseColor: "Choose {value}", customColor: "Custom color", shape: "Shape", expression: "Expression", background: "Background", bgNone: "None", bgCircle: "Circle", bgSquircle: "Squircle", bgSquare: "Square", exprIdle: "Idle", exprHappy: "Happy", exprSad: "Sad", exprMad: "Mad", exprSurprised: "Surprised", exprWink: "Wink", exprSleepy: "Sleepy", exprSmug: "Smug", exprUnsure: "Unsure", exprScared: "Scared", exprLove: "Love", exprShy: "Shy", exprSick: "Sick", exprThinking: "Thinking", name: "Name", tags: "Tags", tagsPlaceholder: "research, design, support (comma-separated)", tagsLimit: "Up to 6 tags", shortTitle: "Short title", shortTitlePlaceholder: "For example: product research assistant", description: "Description", descriptionPlaceholder: "What this bot is for", saving: "Saving…", saveSettings: "Save settings", deleteBot: "Delete bot", memoryHelp: "Clearing a chat doesn’t delete these. Store clear preferences or facts — never passwords.", enableLongTermMemory: "Long-term memory", addMemory: "Add memory", memoryPlaceholder: "Clear preferences or facts only. Passwords and tokens are rejected.", memorySearch: "Search", filterMemory: "Filter memory", noMemory: "No long-term memory yet. Ask the agent to remember something from chat, or add it here.", noMatchingMemory: "No matching memories.", save: "Save", edit: "Edit", clearAllMemoryConfirm: "Clear all memory?", clearMemoryConfirm: "Clear", clearAll: "Clear all", mcpHelp: "Press “Choose MCP” to connect from the catalog. If a key is required, fill it in first. Local stdio servers start inside the API container.", mcpNamePlaceholder: "For example: github", mcpConnectFailed: "Couldn’t connect. Check the key and try again.", command: "Command", commandPlaceholder: "npx, uvx, or a full path", arguments: "Arguments", environmentVariables: "Environment KEY=value", headers: "Headers KEY=value", connecting: "Connecting…", connectMcp: "Connect MCP", chooseMcp: "Choose MCP", mcpPickerTitle: "Choose MCP", mcpPickerLead: "Pick a featured or registry server. Every agent can use its tools.", searchMcp: "Search MCP", mcpRemote: "Remote", mcpLocal: "Local", mcpAdded: "Connected", mcpNeedsKey: "Needs a key", mcpNoResults: "No matching MCP. Try another search, or connect a custom server.", mcpCustom: "Custom", mcpBackToList: "Back to list", mcpConnectNamed: "Connect {name}", mcpKeyHint: "This MCP needs credentials.", noMcp: "No MCP yet. Press “Choose MCP” above to connect one from the catalog.", toolsCount: "{count} tools", disabled: "Off", disconnected: "Disconnected", noTools: "No tools", reconnect: "Reconnect", disable: "Disable", enable: "Enable", preparingDesktop: "Preparing this agent’s desktop…", computerPreviewHint: "Start the computer and the screen will show up here.", bootingProgress: "Starting…", restartComputer: "Restart", shutDownComputer: "Shut down", computerPower: "Computer menu", sharedPowerHint: "This is a shared computer. The action affects every agent using it.", stopAndTakeOver: "Stop and take over", hudBooting: "Computer starting…", hudWaking: "Waking…", hudConnecting: "Connecting…", hudHandoff: "Handing off…", pasteToRemoteComputer: "Paste to remote computer", pasteRemoteHelp: "Paste text here, then send it into VNC. This works over plain HTTP on the LAN.", pasteTextPlaceholder: "Paste text here…", pasteIntoVnc: "Paste into VNC", botNamePlaceholder: "For example: research assistant", sharedComputerHint: "Shares the environment with other bots", privateComputerHint: "A fresh dedicated Docker desktop", create: "Create", groupDescription: "A group opens one chat where every selected agent speaks.", groupName: "Group name", groupNamePlaceholder: "For example: product research", chooseBots: "Choose bots (at least two)", creating: "Creating…", createGroup: "Create group", deleteGroup: "Delete group", deleteNamed: "Delete {name}?", deleteGroupDescription: "The group chat will be deleted. The bots and their own chats and memory stay.", deleteDedicatedBotDescription: "The chat, private computer, and files on it will be permanently deleted.", deleteSharedBotDescription: "The chat will be deleted. The shared computer and its files stay.", phoneAccessDescription: "On the same LAN, open this URL in a phone browser and sign in with the same access token.", localAddressWarning: "This is a loopback address — a phone can’t open it. Use this computer’s LAN IP, for example http://192.168.x.x:3101.", close: "Close", copied: "Copied", copyUrl: "Copy URL", workspaceName: "Workspace name", showHiddenBots: "Show hidden bots", collapseRightSidebar: "Collapse right sidebar", workspaceSettingsHint: "Avatar, memory, and MCP live in the right-hand tabs. This only changes how this workspace is shown.", modelSettings: "Models", modelSettingsHint: "This provider and model apply to bots that don’t have their own.", modelProvider: "Model provider", providerXai: "xAI", providerOpencodeGo: "OpenCode Go", providerOpenaiCompatible: "OpenAI-compatible", providerXaiHint: "Grok. Get a key from console.x.ai.", providerOpencodeGoHint: "OpenCode Go subscription. Get a key from opencode.ai/auth.", providerOpenaiCompatibleHint: "Self-hosted vLLM, Ollama, LiteLLM, or another OpenAI-compatible endpoint.", apiKey: "API key", apiKeyPlaceholder: "sk-…", apiKeyStored: "A key is saved. Leave blank to keep it.", usingEnvKey: "Using environment variable {name}.", clearApiKey: "Clear saved key", modelId: "Model", modelIdPlaceholder: "For example: qwen2.5 or llama3.1", reloadModels: "Reload models", baseUrl: "Base URL", baseUrlPlaceholder: "http://127.0.0.1:11434/v1", baseUrlHint: "If the API runs in Docker, use host.docker.internal instead of localhost for services on this machine.", workspaceModelHint: "Pick a provider, then the key and model. OpenAI-compatible needs your own endpoint.", aboutDescription: "A local multi-agent workspace. Each bot has its own Linux computer. You can put them in a group chat and connect MCP tools.", apiStatus: "API status: {status}", statusNormal: "OK", statusUnavailable: "Unreachable", statusChecking: "Checking…", helpBotsTitle: "Bots", helpBots: "Use + at the top left to add a bot. Click the list to chat. Right-click to pin, hide, or delete.", helpGroupsTitle: "Groups", helpGroups: "+ → New group, pick at least two. One message, every agent in the group replies.", helpComputerTitle: "Computer", helpComputer: "The Computer tab on the right is this agent’s desktop. Start it, take over mouse and keyboard, or let it drive.", helpMemoryTitle: "Memory", helpMemory: "Clearing a chat doesn’t wipe long-term memory. Ask the agent to remember, or add it in Memory on the right.", helpMcpTitle: "MCP plugins", helpMcp: "Plugins in the lower left connect MCP servers. Their tools show up on screen and the agent can use them in chat.", helpSkillsTitle: "Skills", helpSkills: "+ → Teach a task, demonstrate once, and it becomes a skill. Export JSON after, or import someone else’s file onto another bot.", helpAttachTitle: "Attachments", helpAttach: "+ → Attach a file. Images go to the model on that message and aren’t stored in chat history. If the computer needs the original, it sits in inbox/ for two hours, then is deleted.", helpShortcutsTitle: "Shortcuts", helpShortcuts: "Enter sends, Shift+Enter makes a new line. While it’s replying, the send button becomes Stop. On a call, Space interrupts and Esc hangs up.", helpVoiceTitle: "Voice calls", helpVoice: "The phone in a 1:1 header calls the bot. Speak a task and it uses its computer. It answers immediately whether it can, and you can interrupt to change course.", call: "Call", hangUp: "Hang up", interrupt: "Interrupt", listening: "Listening…", speaking: "Speaking…", callConnecting: "Connecting…", workingOnComputer: "Working on the computer…", callPrompt: "Just say what you need. A short pause sends it.", callShortcuts: "Space interrupts · Esc hangs up", callFailed: "The call dropped.", micDenied: "Microphone permission is required for calls.", micFailed: "Couldn’t open the microphone.", callAudioFailed: "Call audio stopped working. Hang up and call again.", takeOverToContinue: "You need to take over the screen.", setUpVoiceToCall: "Set up voice before calling", voiceEnabled: "Enable voice calls", voiceEnabledHint: "Off by default. Turn on and save to use the call button.", voiceDisabledHint: "Voice calls are off. Turn them on in Settings → Voice.", voiceSettings: "Voice", voiceSettingsHint: "Voice is separate from the text model. If you already have an xAI chat key, you usually don’t need another. Billed per minute.", voiceProvider: "Voice provider", voiceModel: "Voice model", voiceName: "Voice", providerOpenai: "OpenAI", providerXaiVoiceHint: "Grok Voice. Live calls with barge-in; computer work is handed to the text model.", providerOpenaiVoiceHint: "OpenAI Realtime. Same call UI; you can switch later.", voiceReusesTextKey: "Reusing the xAI key saved for the text model.", feedbackDescription: "Write a problem, idea, or request. This is a local workspace, so the text is copied to the clipboard for you to paste into an issue or message.", feedbackPlaceholder: "For example: in group chats I want to pick who speaks first…", copyContent: "Copy", loginTitle: "Sign in to LazyBoy", loginDescription: "Enter the shared access token configured on the server.", accessToken: "Access token", verifying: "Checking…", login: "Sign in", agentComputer: "Agent computer", url: "URL", stdio: "stdio", http: "HTTP", sse: "SSE", argumentsPlaceholder: "-y @modelcontextprotocol/server-github", environmentVariablesPlaceholder: "GITHUB_TOKEN=…", urlPlaceholder: "https://mcp.example.com/mcp", headersPlaceholder: "Authorization=Bearer …", back: "Back", accounts: "Accounts", accountsHelp: "Stored in this bot’s vault. Passwords are entered only here — never in chat, never shown to the model. Schedules fill the form at a login wall.", accountSite: "Site", accountSitePlaceholder: "For example: Gmail", accountHost: "URL or domain", accountHostPlaceholder: "mail.google.com", accountUsername: "Username", accountPassword: "Password", accountPasswordKeep: "Leave blank to keep the current password", accountNotes: "Notes", accountNotesPlaceholder: "Optional, for example: work inbox", addAccount: "Add account", noAccounts: "No saved accounts yet. Add one here if a schedule should sign in by itself.", loginNeedsYou: "Needs you to sign in on the keyboard", loginOpenScreen: "Open its screen", loginWhy: "After sign-in: {why}", scheduleChip: "Scheduled", scheduleRunChip: "Schedule run", schedules: "Schedules", schedule: "Schedule", schedCreate: "New schedule", schedEmpty: "No schedules yet. Say “every day at 9…” in chat, or press +.", schedPaused: "Paused", schedRunNow: "Run now", schedRunning: "Running…", schedActive: "On", schedNamePlaceholder: "For example: morning digest", schedInstruction: "What to do each time", schedInstructionPlaceholder: "For example: open mail and write an unread summary back to chat.", schedWhen: "When", schedEveryHour: "Every hour", schedEveryDay: "Every day", schedWeekdays: "Weekdays", schedEveryWeek: "Every Monday", schedEveryMonth: "Monthly", schedInterval: "Interval", schedAdvanced: "Advanced cron", schedMinutes: "minutes", schedHours: "hours", schedDays: "days", computerLoginHint: "Sign in inside this bot’s own browser. The session stays on its computer — don’t type passwords in chat.", language: "Interface language", languageZh: "繁體中文", languageEn: "English", languageHint: "Interface language. Chat history and agent replies are not translated.", helpLanguageTitle: "Language", helpLanguage: "Switch between Traditional Chinese and English in Settings, accessible from the workspace menu.", clipboardSynced: "Clipboard synced", clipboardSyncBlocked: "The browser blocked sync. Use the copy button.", clipboardPasted: "Pasted", clipboardPasteFailed: "Paste failed. Take over the computer and try again.", clipboardCopiedSelection: "Copied selection", clipboardCopyFailed: "Copy didn’t sync. Use the copy button, or Ctrl+Shift+C on the desktop.", slashMode: "Mode", slashFileSkill: "Skill", slashList: "Commands and skills", schedIntervalHint: "Elapsed time, not the clock. A day is 24 hours and doesn’t reset at month-end or DST.", schedInvalidInterval: "Interval must be a whole number from 1 to 365", schedHumanDaily: "Daily at {time}", schedHumanWeekdays: "Weekdays at {time}", schedHumanWeekly: "Mondays at {time}", schedHumanMonthly: "Monthly at {time}", schedHumanInterval: "Every {n} {unit}", stepThinking: "Thinking", stepWatchingScreen: "Looking at the screen", stepUsingSkill: "Using skill {name}", stepFillingLogin: "Filling a saved login", stepListingAccounts: "Listing saved accounts", stepScheduling: "Scheduling {name}", stepListingSchedules: "Listing schedules", stepCancelingSchedule: "Canceling a schedule", stepRecheckingScreen: "Checking the screen again", schedEveryMinute: "Every minute", schedHumanEveryMinutes: "Every {n} minutes", schedHumanEveryHours: "Every {n} hours", schedHumanMonthlyDay: "Monthly on the 1st at {time}", schedHumanElapsed: "Every {n} minutes (elapsed)", schedCalendar: "Calendar schedule: {expr}", teachInProgress: "A demo is in progress. Finish or cancel it before sending a message.", aiTimeout: "The model timed out (150 seconds).", resumeMidTask: "Stopped halfway — your call", resumeBudget: "Turn budget spent, result unverified", resumeProgress: "{turns}/{limit} turns", resumeContinue: "Keep going", resumeStop: "Stop here", resumeSent: "Keep going and finish it.", monitorTitle: "Live log", monitorQueued: "Queued", monitorTurnOf: "turn {turn}/{limit}", monitorTurn: "turn {turn}", monitorElapsed: "up {time}", monitorNow: "Now: {step}", monitorEmpty: "Nothing yet — the trail fills in as I work.", monitorLoadFailed: "Couldn’t load the log", monitorCopy: "Copy log", monitorCopied: "Copied", monitorPinHint: "Folds away when the mouse leaves", monitorPinned: "Pinned — press Esc to close", monitorClose: "Close", monitorKindModel: "Model", monitorKindTool: "Action", monitorKindRetry: "Retry", monitorKindNotice: "Note", monitorKindRun: "Status", monitorRunStarted: "Started: {task}", monitorRunCompleted: "Done in {turns} turns", monitorRunFailed: "Failed", monitorRunWaiting: "Waiting for you: {reason}", monitorRunPaused: "Paused: {reason}", monitorRunRetry: "Re-queued", monitorModelTurn: "turn {turn}, thought for {time}", monitorRetryAttempt: "attempt {attempt} failed, retrying", monitorGaveUp: "gave up", monitorStatusOk: "ok", monitorStatusError: "failed", monitorStatusTimedOut: "timed out", monitorStatusPaused: "needs you", errorTitleInterrupted: "Interrupted", errorTitleToolTimeout: "Action timed out", errorTitleModelKey: "Model API key rejected", errorTitleModelQuota: "Rate limited or out of quota", errorTitleModelUnknown: "Model not found", errorTitleModelTimeout: "Model took too long", errorTitleNetwork: "Can’t reach the model", errorTitleComputerGone: "Computer is gone", errorTitleLeaseLost: "Work picked up elsewhere", errorTitleUnknown: "Something broke", errorChip: "Task failed", errorRetry: "Retry", errorRetryHint: "Continue where it stopped", errorOpenSettings: "Model settings", errorDetails: "Show the log", errorRetried: "Back in the queue", errorRetryFailed: "Can’t re-queue right now — another run may still be busy.", };