Files
codecraft/web/src/i18n/en.ts
T
Richard ZinkandClaude Opus 5.5 fca1c41087 Add worktrees, per-hunk review, effort per message, regenerate, voice input
- Isolated git worktree per session (create, status, merge, discard)
- Permission card: accept file-edit hunks individually; agent learns what was rejected
- Reasoning effort per message; regenerate the last answer with another model/effort
- Voice input via the Web Speech API
- Folder-up button in the file browser; ssh, rsync and mc in the image

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 22:29:58 +01:00

697 lines
32 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Reference language. Every other language must define the same keys.
export const en = {
"common.loading": "Loading…",
"common.save": "Save",
"common.add": "Add",
"common.edit": "Edit",
"common.delete": "Delete",
"common.remove": "Remove",
"common.close": "Close",
"common.collapse": "Collapse",
"nav.menu": "Menu",
"nav.settings": "Settings",
"nav.stats": "Statistics",
"nav.images": "Images",
"images.disabled": "Image generation is not set up: an admin enables it under Settings → General (fal.ai key in FAL_KEY).",
"images.promptPlaceholder": "Describe the image: subject, style, composition, colours, lighting… (Ctrl+Enter)",
"images.model": "Model",
"images.size": "Format",
"images.count": "Number",
"images.countN": "{n}×",
"images.folder": "Folder",
"images.generate": "Generate",
"images.generating": "Generating…",
"images.empty": "No images yet.",
"images.reuse": "Reuse prompt",
"images.copyPath": "Copy file path",
"images.deleteConfirm": "Delete this image (including the file)?",
"images.size.square_hd": "Square HD",
"images.size.square": "Square",
"images.size.landscape_4_3": "Landscape 4:3",
"images.size.landscape_16_9": "Landscape 16:9",
"images.size.portrait_4_3": "Portrait 3:4",
"images.size.portrait_16_9": "Portrait 9:16",
"settings.images": "Image generation (fal.ai)",
"settings.imagesEnabled": "Enabled",
"settings.imagesKey": "API key",
"settings.imagesDefault": "Default model",
"settings.imagesDir": "Folder in the project",
"settings.imagesHint": "Models and prices per image are edited in the config file ([images]).",
"budget.title": "Budgets this month",
"budget.spent": "Spent",
"budget.budget": "Budget",
"budget.remaining": "Remaining",
"budget.provider": "According to provider",
"budget.balance": "Balance {v}",
"budget.providerSpent": "Billed {v}",
"budget.orgWide": "Organisation-wide cost report of the provider",
"budget.remoteError": "not available",
"budget.hint": "Spent = costs recorded by CodeCraft with your configured prices. Provider values come from their APIs (OpenRouter, Anthropic with admin key, fal.ai with admin key).",
"budget.chip": "Budget {name}: {p}",
"budget.chipHint": "A monthly budget is nearly used up – see Statistics.",
"settings.monthlyBudget": "Monthly budget",
"settings.monthlyBudgetTotal": "Monthly budget (total)",
"settings.monthlyBudgetHint": "In the configured currency; 0 = none. Warnings appear in the chat header.",
"settings.budgetWarning": "Warn at",
"settings.adminKey": "Admin key (optional)",
"settings.adminKeyHint": "Anthropic Admin API key (sk-ant-admin01-…) to show the real, organisation-wide monthly cost.",
"settings.fetchPrices": "Fetch prices",
"settings.pricesFetched": "Prices updated for {n} models – save to keep them.",
"stats.perMillion": "per 1M tok",
"stats.perMillionHint": "Effective cost per million tokens (input incl. cache + output)",
"queue.pending": "{n} message(s) waiting – delivered at the agent's next step",
"queue.stopped": "{n} message(s) waiting",
"queue.sendNow": "Send now",
"queue.remove": "Remove from queue",
"queue.backgroundResult": "Result of a background task",
"permissionMode.auto": "Automatic (asks once, safe steps run)",
"nav.files": "Files",
"files.search": "Search files…",
"files.newFile": "New file",
"files.newFolder": "New folder",
"files.upload": "Upload",
"files.showHidden": "Show hidden files",
"files.newFileName": "File name:",
"files.newFolderName": "Folder name:",
"files.renameTo": "New name:",
"files.copyTo": "Name of the copy:",
"files.rename": "Rename",
"files.duplicate": "Duplicate",
"files.download": "Download",
"files.actions": "Actions",
"files.deleteConfirm": "Delete \"{name}\"?",
"files.deleteFolderConfirm": "Delete the folder \"{name}\" with everything in it?",
"files.noHits": "No matches",
"files.emptyFolder": "Empty folder",
"files.dropHint": "Drop files here to upload",
"files.selectFile": "Select a file",
"files.edit": "Edit",
"files.preview": "Preview",
"files.binary": "Binary file – download it to open.",
"files.tooLarge": "File too large for the editor – download it.",
"files.discardChanges": "Discard unsaved changes?",
"files.conflict": "The file was changed on disk (e.g. by an agent) since you opened it. Overwrite it anyway?",
"files.tabFiles": "Files",
"git.init": "Initialise git repository",
"git.clone": "Clone repository",
"git.cloneUrl": "Repository URL (https://… or git@…):",
"git.cloneFolder": "Folder name:",
"git.branch": "Branch",
"git.newBranch": "New branch",
"git.newBranchName": "Name of the new branch:",
"git.fetch": "Fetch",
"git.pull": "Pull",
"git.push": "Push",
"git.done": "Done.",
"git.changes": "Changes",
"git.history": "History",
"git.staged": "Staged",
"git.unstaged": "Changes",
"git.stage": "Stage",
"git.unstage": "Unstage",
"git.stageAll": "Stage all",
"git.unstageAll": "Unstage all",
"git.discard": "Discard changes",
"git.discardConfirm": "Discard all changes to {file}?",
"git.openFile": "Open file",
"git.clean": "No changes.",
"git.message": "Commit message",
"git.amend": "Amend last commit",
"git.commit": "Commit",
"git.noCommits": "No commits yet.",
"git.noDiff": "No differences.",
"composer.folder": "folder",
"composer.attachedFiles": "Attached files (in the project, read them with your tools):",
"composer.uploading": "Uploading {n}…",
"usage.title": "Models and usage in this session",
"usage.period": "Period",
"usage.current": "current",
"usage.model": "Model",
"usage.prices": "Prices per 1M tokens",
"usage.usage": "Usage",
"usage.speed": "Speed",
"usage.cacheWrite": "Cache write",
"usage.contextNow": "Context now",
"usage.totalTime": "Total time",
"usage.inSession": "In this session",
"usage.providerMonth": "Provider this month",
"usage.byAgent": "By agent and model",
"preview.page": "Page {n} / {total}",
"preview.openBrowser": "Open in browser",
"preview.moreRows": "{n} more rows not shown",
"preview.moduleHint": "Tracker module – rendered to audio on the server (first playback may take a moment).",
"activity.phrases": "Pondering|Tinkering|Noodling|Brewing|Conjuring|Mulling|Crafting|Percolating|Ruminating|Whittling|Forging|Musing|Scheming|Untangling|Cogitating|Simmering|Wrangling|Hatching|Spelunking|Finagling|Concocting|Calibrating|Divining|Marinating",
"activity.prefill": "prefill",
"activity.generated": "generated",
"activity.prefilling": "reading prompt…",
"mcp.users": "Allowed users",
"mcp.usersPlaceholder": "admins only",
"mcp.usersHint": "Usernames separated by commas, or * for everybody. Admins always have access.",
"settings.budgetAction": "When a budget is used up",
"settings.budgetWarn": "Warn only",
"settings.budgetBlock": "Block new requests",
"settings.sandbox": "Shell sandbox",
"settings.sandboxAuto": "Users (not admins)",
"settings.sandboxAlways": "Everybody",
"settings.sandboxOff": "Off",
"settings.sandboxHint": "Shell commands and git run in a bubblewrap sandbox with only the user's folders writable.",
"users.quota": "Monthly quota",
"users.quotaHint": "Monthly cost limit (empty = unlimited)",
"users.quotaPrompt": "Monthly cost limit for {name} (empty = unlimited):",
"settings.tab.audit": "Audit",
"audit.title": "Audit log",
"audit.all": "All actions",
"audit.time": "Time",
"audit.action": "Action",
"audit.detail": "Details",
"audit.backup": "Backup",
"audit.backupHint": "ZIP with the configuration and a consistent copy of the database (sessions, users, statistics). Secrets referenced as ${VAR} are not included.",
"audit.download": "Download backup",
"craft.mode": "Craft mode",
"craft.modeHint": "Clean room: only what a user sees. Deep: also page sources and programs (Ghidra) – for re-creating, not copying.",
"craft.cleanRoom": "Clean room",
"craft.deep": "Deep",
"settings.tab.tools": "Tools",
"tools.installed": "installed",
"tools.install": "Install Ghidra",
"tools.reinstall": "Check / repair installation",
"tools.installing": "Installing (download ~800 MB, on ARM the decompiler is compiled – this takes several minutes)…",
"tools.ghidraHint": "Ghidra lets agents in craft Deep mode decompile programs (Windows .exe/.dll, Linux, DOS, …) to study how they work. Installed into the data volume together with its own JDK.",
"rewind.intro": "The conversation is reset to before this message; you can edit and resend it.",
"rewind.noFiles": "The agent did not change files since then.",
"rewind.restore": "Also restore the {n} file(s) the agent changed",
"rewind.willDelete": "will be deleted (new)",
"rewind.bashNote": "Changes made by shell commands (e.g. installed packages) are not restored.",
"rewind.confirm": "Rewind",
"files.discard": "Discard",
"files.overwrite": "Overwrite",
"shells.title": "Background shells",
"shells.chip": "{n}/{total} shells",
"shells.running": "running",
"shells.exited": "exited ({code})",
"shells.stop": "Stop",
"shells.noOutput": "(no output yet)",
"login.prompt": "Sign in to continue.",
"login.invalid": "Invalid token.",
"login.submit": "Sign in",
"sidebar.newSession": "New session",
"sidebar.noSessions": "No sessions yet",
"sidebar.today": "Today",
"sidebar.yesterday": "Yesterday",
"sidebar.week": "Last 7 days",
"sidebar.older": "Older",
"sidebar.connected": "Connected",
"sidebar.disconnected": "Disconnected – reconnecting…",
"sidebar.needsInput": "Waiting for your input",
"session.untitled": "New session",
"wizard.title": "What do you want to do?",
"wizard.subtitle": "Pick a task, say what you want, then press Start.",
"wizard.whatToDo": "What do you want to do?",
"wizard.task.craft": "Craft something",
"wizard.task.craftDesc": "Recreate a website, app, game or old program – or build something new",
"wizard.task.build": "Work on code",
"wizard.task.buildDesc": "Implement, fix and run things in a project",
"wizard.task.plan": "Plan",
"wizard.task.planDesc": "Read-only: analyse and propose a plan",
"wizard.whatToRecreate": "What do you want to recreate?",
"wizard.target.website": "A website",
"wizard.target.app": "An app",
"wizard.target.game": "A game",
"wizard.target.software": "Old software",
"wizard.target.fresh": "Nothing – start fresh",
"wizard.cleanDesc": "Only from what you can see: screenshots, visible text, behaviour",
"wizard.deepDesc": "Also study sources and binaries (Ghidra) – re-create, never copy",
"wizard.softwareNeedsDeep": "Analysing a program needs Deep mode (decompiling). In clean room mode only screenshots and your description are used.",
"wizard.sayWhat": "Say what you want",
"wizard.placeholder.website": "Anything special? e.g. only the start page, in React, dark theme …",
"wizard.placeholder.app": "Describe the app, attach screenshots …",
"wizard.placeholder.game": "Describe the game, attach screenshots or a video description …",
"wizard.placeholder.software": "What is the program? What should the new version run on? Attach the program, an archive or installer.",
"wizard.placeholder.fresh": "For example: a website for my bakery",
"wizard.placeholder.task": "What should be done?",
"wizard.enterHint": "Enter to start · Shift+Enter for a new line · drop or paste files",
"wizard.softwareHint": "Attach the program with its libraries, a zip/tar.gz or an installer – it goes to original/",
"wizard.attach": "Attach files",
"wizard.ideas": "Ideas:",
"wizard.idea.siteLanding": "Only the start page, as plain HTML/CSS",
"wizard.idea.siteShop": "All pages, in React with Tailwind",
"wizard.idea.appTodo": "A to-do app like in my screenshots",
"wizard.idea.appNotes": "A notes app with the same layout",
"wizard.idea.gameSnake": "A simple snake game in the browser",
"wizard.idea.gameBreakout": "A breakout clone with original graphics",
"wizard.idea.swDos": "An old DOS game – the new version should run in the browser",
"wizard.idea.swTool": "An old Windows tool – rebuild it as a cross-platform app",
"wizard.idea.freshBakery": "A website for my bakery",
"wizard.idea.freshSnake": "A simple snake game",
"wizard.idea.planFeature": "Plan a new feature for this project",
"wizard.idea.planRefactor": "Find the biggest weaknesses and propose a refactoring",
"wizard.idea.buildTests": "Add tests for the core module and fix what fails",
"wizard.idea.buildBug": "Find and fix the bug: ",
"wizard.builtBy": "Built by",
"wizard.newFolderIn": "Saved in a new folder in",
"wizard.existingFolder": "Works in",
"wizard.chooseFolder": "Choose a folder…",
"wizard.useNewFolder": "Use a new folder",
"wizard.start": "Start",
"wizard.creatingFolder": "Creating folder…",
"wizard.uploading": "Uploading files…",
"wizard.starting": "Starting…",
"phase.study": "Study",
"phase.specify": "Specify",
"phase.build": "Build",
"phase.check": "Check",
"phase.ready": "Ready",
"wizard.cloning": "Cloning repository…",
"wizard.originalTitle": "Upload the original software",
"wizard.originalHint": "Program folder as zip, tar.gz, 7z, an installer or single files – up to 500 MB each. Click or drop here.",
"wizard.whereLabel": "Where should it be built?",
"wizard.whereNew": "New folder",
"wizard.whereExisting": "Existing folder",
"wizard.whereGit": "Git repository",
"wizard.cloneInto": "Cloned into",
"rename.title": "Rename session",
"rename.generateWith": "Suggest a name with",
"rename.generate": "Generate",
"nav.terminal": "Terminal",
"terminal.new": "New terminal",
"terminal.close": "Close terminal",
"terminal.here": "Open a terminal in this folder",
"terminal.connecting": "Connecting…",
"terminal.reconnecting": "Connection lost – reconnecting…",
"terminal.keys": "Extra keys",
"gitcred.title": "Git",
"gitcred.hint": "Used by your agents, the terminal and the git client to pull and push (e.g. Gitea/GitHub/GitLab access tokens). Stored in your home folder as git credential store – only your sessions can use them.",
"gitcred.name": "Commit name",
"gitcred.email": "Commit email",
"gitcred.credentials": "Credentials",
"gitcred.none": "No credentials yet.",
"gitcred.host": "Host",
"gitcred.user": "Username",
"gitcred.token": "Password or token",
"gitcred.add": "Add host",
"gitcred.saved": "Git settings saved",
"wizard.task.cad": "3D model for printing",
"wizard.task.cadDesc": "From a description or a hand-drawn sketch – OpenSCAD, STL/3MF",
"wizard.placeholder.cad": "Describe the part and its dimensions – or attach a photo of your sketch (with measurements).",
"wizard.idea.cadBox": "A box with a snap-on lid, inner size 80 × 50 × 30 mm",
"wizard.idea.cadBracket": "A wall bracket for a 25 mm pipe with two M4 screw holes",
"activity.reviewing": "Reviewing the result (round {round})…",
"chat.reviewRound": "Review {round}: changes requested",
"agents.refine": "Review loop",
"agents.refineRounds": "Review rounds per task",
"agents.refineOff": "0 = off",
"agents.refineModel": "Reviewer model",
"agents.refineCriteria": "Review criteria",
"agents.refineCriteriaHint": "Empty = default criteria of this mode. After each finished task a reviewer checks the result against your request; with findings the agent continues, up to the number of rounds.",
"agents.refineShort": "Review ×{n}",
"agents.deleteFile": "Delete agent file {path}?",
"nav.jobs": "Automations",
"jobs.intro": "Agents that start on a schedule. Each automation is a Markdown file (prompt + schedule in the frontmatter) – ask an agent in any chat to create one (tool “schedule”) or register a file below. Every run appears as a normal chat; if it needs permission you get a push notification.",
"jobs.none": "No automations yet.",
"jobs.schedule": "Schedule",
"jobs.next": "Next run",
"jobs.last": "Last run",
"jobs.mode": "Runs as",
"jobs.on": "On",
"jobs.off": "Off",
"jobs.enable": "Enable",
"jobs.disable": "Disable",
"jobs.runNow": "Run now",
"jobs.editFile": "Edit file",
"jobs.remove": "Remove",
"jobs.deleteConfirm": "Remove the automation “{name}”? The job file stays.",
"jobs.openRun": "Open run",
"jobs.prompt": "Instructions",
"jobs.register": "Register a job file",
"jobs.registerHint": "Path to a Markdown file with a schedule in its frontmatter:",
"jobs.registerBtn": "Register",
"jobs.status.running": "running",
"jobs.status.done": "done",
"jobs.status.timeout": "timed out",
"jobs.status.error": "error",
"chat.more": "More",
"worktree.title": "Isolated git worktree",
"worktree.hint": "The agent works on its own branch; your working copy on “{base}” stays untouched until you merge.",
"worktree.dirty": "{n} uncommitted files",
"worktree.commits": "{n} commits",
"worktree.merge": "Merge into {base}",
"worktree.remove": "Discard",
"worktree.mergeConfirm": "Commit open changes and merge {branch} into {base}?",
"worktree.removeConfirm": "Discard the worktree and branch {branch}? Unmerged changes are lost.",
"worktree.merged": "Merged into {base}",
"worktree.removed": "Worktree discarded",
"worktree.created": "The session now works in its own worktree",
"worktree.create": "Isolated worktree",
"worktree.busy": "Wait until the agent is done.",
"worktree.isolate": "Work in an isolated git worktree",
"worktree.isolateHint": "own branch, merge when done",
"worktree.creating": "Creating worktree…",
"files.up": "One folder up",
"permission.hunksHint": "{n} changes – untick the ones you don't want.",
"permission.applySelected": "Apply selected ({k}/{n})",
"effort.title": "Thinking effort for this message",
"effort.auto": "Effort: model default",
"effort.autoShort": "Effort: auto",
"effort.low": "Effort: low",
"effort.medium": "Effort: medium",
"effort.high": "Effort: high",
"effort.max": "Effort: max",
"regen.button": "Regenerate",
"regen.title": "Redo this answer",
"regen.hint": "Removes this answer (and restores files it changed), then runs your last message again – with the model and effort chosen here.",
"regen.go": "Regenerate",
"voice.start": "Dictate (speech recognition of your browser)",
"voice.stop": "Stop dictation",
"voice.denied": "Microphone access was denied – allow it in the browser settings.",
"voice.error": "Speech recognition failed",
"new.title": "New session",
"new.directory": "Project directory",
"new.up": "Up",
"new.noSubdirs": "No subdirectories",
"new.model": "Model",
"new.mode": "Mode",
"new.firstPrompt": "What should be done? (optional)",
"new.start": "Start in {dir}",
"activity.thinking": "Thinking…",
"activity.writing": "Writing…",
"activity.tool": "Running {tool}…",
"activity.subagent": "Subagent working: {name}",
"activity.waitingForYou": "Paused – waiting for your answer",
"activity.working": "Working",
"activity.titleBusy": "{n} working",
"activity.titleInput": "Input needed",
"chat.reasoningLive": "Thinking…",
"chat.reasoningDone": "Thought · {n} words",
"settings.reasoningDisplay": "Model reasoning",
"settings.reasoningCollapsed": "Collapsed (click to open)",
"settings.reasoningExpanded": "Always expanded",
"settings.reasoningHidden": "Off",
"settings.reasoningHint": "Thinking of the model (if the model and provider return it).",
"settings.reasoningLive": "Open while thinking, then collapse",
"chat.jumpLatest": "Jump to the latest message",
"sidebar.search": "Search chats…",
"sidebar.searchResults": "Results ({n})",
"sidebar.noResults": "Nothing found",
"chat.fork": "Fork: continue in a copy of this chat",
"chat.forked": "Forked – you are now in the copy",
"chat.export": "Export",
"chat.exportMd": "Markdown (.md)",
"chat.exportJson": "JSON (.json)",
"chat.empty": "Send a message to start.",
"chat.compacted": "Conversation compacted – summary",
"chat.context": "Context",
"chat.contextHint": "{tokens} tokens in the last request",
"chat.statsHint": "Tokens and cost of this session (click for details)",
"chat.renameHint": "Double-click to rename",
"chat.rewind": "Edit and resend from here",
"chat.delete": "Delete session",
"chat.deleteConfirm": "Delete this session including its subagents? Statistics are kept.",
"composer.placeholder": "Message… (/ for commands, @ for files, attach or paste files)",
"composer.placeholderBusy": "Message is queued and sent at the next step…",
"composer.send": "Send",
"composer.queue": "Queue",
"composer.stop": "Stop",
"composer.mode": "Mode",
"composer.model": "Model",
"composer.permissionMode": "Permission mode",
"composer.attach": "Attach files",
"command.compact": "Summarize the conversation to free up context",
"command.new": "Start a new session",
"permissionMode.default": "Ask (except read-only commands)",
"permissionMode.accept_edits": "Auto-accept edits",
"permissionMode.bypass": "Allow everything",
"plan.implement": "Switch to build and implement the plan",
"plan.implementPrompt": "Implement the plan.",
"tool.input": "Input",
"tool.output": "Output",
"tool.todosUpdated": "Tasks updated ({done}/{total} done)",
"tool.todos": "Tasks",
"tool.openSubagent": "Open subagent session",
"interaction.fromSubagent": "From subagent:",
"permission.title": "Permission required",
"permission.allowOnce": "Allow once",
"permission.alwaysTool": "Always allow {tool} in this session",
"permission.alwaysCommand": "Always allow \"{prefix}\" in this session",
"permission.reject": "Reject",
"permission.rejectWithFeedback": "Reject with feedback",
"permission.feedback": "Optional: tell the agent what to do instead",
"question.title": "Question for you",
"question.fromAgent": "The agent needs a decision",
"question.fromMcp": "MCP server \"{server}\" asks",
"question.other": "Other (free text)",
"question.answer": "Your answer",
"question.submit": "Answer",
"question.dismiss": "Dismiss",
"settings.tab.general": "General",
"settings.tab.providers": "Providers & models",
"settings.tab.mcp": "MCP",
"settings.tab.permissions": "Permissions",
"settings.tab.agents": "Agents & commands",
"settings.tab.raw": "Config file",
"settings.saved": "Saved – changes are active.",
"settings.interface": "Interface (this device)",
"settings.language": "Language",
"settings.theme": "Theme",
"settings.themeMode": "Mode",
"settings.themeAuto": "Auto",
"settings.themeLight": "Light",
"settings.themeDark": "Dark",
"settings.themeSource": "Colours: {source} ({license})",
"settings.themeToggle": "Switch light/dark/auto",
"settings.notifications": "Notifications",
"settings.notificationsEnable": "Enable",
"settings.notificationsOn": "Enabled",
"settings.pushTest": "Send test",
"settings.pushTestSent": "Test notification sent",
"settings.pushTestNone": "No device subscribed",
"settings.pushDisable": "Turn off",
"settings.pushUnsupported": "This browser does not support push notifications. On iPhone/iPad: add CodeCraft to the home screen first.",
"settings.pushDenied": "Notifications are blocked for this site – allow them in the browser settings.",
"settings.notificationsHint": "Push notifications on this device when an agent asks for permission, asks a question or finishes a longer task – only while CodeCraft is not open.",
"settings.server": "Server",
"settings.workspace": "Workspace",
"settings.defaultModel": "Default model",
"settings.smallModel": "Small model",
"settings.smallModelHint": "Used for session titles. Compaction uses the session model.",
"settings.currency": "Currency",
"settings.autoCompact": "Auto-compact at",
"settings.autoCompactHint": "Fraction of the context window (0 = off).",
"settings.craft": "Craft mode",
"settings.cleanRoom": "Clean room",
"settings.cleanRoomHint": "Only use what a visitor sees. Off = deep mode (page source and scripts may be read).",
"settings.chromium": "Chromium binary",
"settings.widths": "Screen widths (px)",
"settings.kind": "Type",
"settings.baseUrl": "Base URL",
"settings.apiKey": "API key",
"settings.apiKeyStored": "Stored – leave empty to keep",
"settings.apiKeyHint": "Prefer ${ENV_VAR} references; literal keys are stored in plain text in the config file.",
"settings.authPrefix": "Auth prefix",
"settings.enabled": "Enabled",
"settings.modelCount": "{n} models",
"settings.models": "Models & prices",
"settings.addModel": "Model",
"settings.addDiscovered": "Add {n} discovered",
"settings.pricesHint": "Prices per 1M tokens in the configured currency. Cache prices default to the input price.",
"settings.modelsEmptyHint": "No models listed: they are discovered automatically from the provider.",
"settings.context": "Context",
"settings.maxOutput": "Max output",
"settings.reasoning": "Reasoning",
"settings.vision": "Vision",
"settings.effort": "Effort",
"settings.priceIn": "Input",
"settings.priceOut": "Output",
"settings.priceCacheRead": "Cache read",
"settings.priceCacheWrite": "Cache write",
"settings.addProvider": "Add provider",
"settings.providerName": "Name (optional)",
"settings.reloadProviders": "Reload providers & models",
"settings.deleteProviderConfirm": "Delete provider \"{name}\"?",
"settings.invalidName": "Names may only contain letters, digits, - and _.",
"settings.name": "Name",
"settings.addMcp": "Add MCP server",
"settings.deleteMcpConfirm": "Delete MCP server \"{name}\"?",
"settings.rawHint": "The complete configuration file including comments. It is validated before saving.",
"settings.revert": "Revert",
"mcp.load": "Tools for the model",
"mcp.loadAuto": "Automatic (on demand when many tools)",
"mcp.loadAlways": "Always send all tools",
"mcp.loadOnDemand": "On demand (mcp_search / mcp_call)",
"mcp.loadHint": "Every tool sent directly costs context on every request. Large servers are better loaded on demand.",
"mcp.reconnect": "Reconnect all",
"mcp.none": "No MCP servers configured.",
"mcp.tools": "{n} tools",
"mcp.command": "Command",
"mcp.args": "Arguments (one per line)",
"mcp.env": "Environment (KEY=value)",
"mcp.headers": "Headers (Name: value)",
"mcp.state.disabled": "disabled",
"mcp.state.connecting": "connecting…",
"mcp.state.connected": "connected",
"mcp.state.failed": "failed",
"mcp.state.unknown": "not started",
"permissions.intro": "Rules for tool use. \"Ask\" shows an approval card. MCP tools: mcp__<server>__<tool>, wildcards allowed (mcp__*).",
"permissions.tools": "Tools",
"permissions.bash": "Shell commands",
"permissions.bashHint": "Glob patterns on the full command. Compound commands (&&, ;, |) are only allowed if every part is.",
"permissions.tool": "Tool",
"permissions.pattern": "Pattern",
"permissions.rule": "Rule",
"permissions.allow": "Allow",
"permissions.ask": "Ask",
"permissions.deny": "Deny",
"agents.title": "Agents",
"agents.readOnly": "read-only",
"agents.commands": "Slash commands",
"agents.skills": "Skills",
"stats.range7": "7 days",
"stats.range30": "30 days",
"stats.range90": "90 days",
"stats.range365": "1 year",
"stats.rangeAll": "All",
"stats.tableView": "Table view",
"stats.chartView": "Chart view",
"stats.cost": "Cost",
"stats.perRequest": "{v} per request",
"stats.requests": "Requests",
"stats.errors": "{n} failed",
"stats.input": "Input",
"stats.output": "Output",
"stats.cacheRead": "Cache read",
"stats.cacheHit": "Cache hit rate",
"stats.tokens": "Tokens",
"stats.ttft": "Time to first token",
"stats.ttftHint": "Average prefill wait",
"stats.outputSpeed": "Output speed",
"stats.prefillSpeed": "Prefill speed",
"stats.costPerDay": "Cost per day by model",
"stats.tokensPerDay": "Tokens per day",
"stats.heatEmpty": "no activity",
"stats.heatmap": "Activity by weekday and hour",
"stats.byModel": "By model",
"stats.byProvider": "By provider",
"stats.byAgent": "By mode",
"stats.topSessions": "Most expensive sessions",
"stats.perDay": "Per day",
"stats.day": "Day",
"stats.model": "Model",
"stats.provider": "Provider",
"stats.agent": "Mode",
"stats.session": "Session",
"stats.total": "Total",
"stats.other": "Other",
"stats.noData": "No requests in this period.",
"common.ok": "OK",
"common.cancel": "Cancel",
"nav.logout": "Sign out",
"login.username": "Username",
"login.password": "Password",
"login.passwordRepeat": "Repeat password",
"login.setupPrompt": "No users yet. Enter the setup code from the server log and create the first admin.",
"login.setupCode": "Setup code",
"login.createAdmin": "Create admin",
"login.invalidCode": "Invalid setup code.",
"login.mismatch": "The passwords do not match.",
"login.or": "or",
"sidebar.shared": "Shared with you",
"chat.readOnly": "read-only",
"chat.readOnlyHint": "This session was shared with you – you can follow it, but not write.",
"chat.backgroundDone": "Background task finished",
"chat.waitingModel": "Waiting for a free slot on {model}…",
"chat.waitingSubagent": "Waiting for a free subagent slot ({agent})…",
"chat.anySubagent": "limit for all subagents",
"tool.background": "background",
"share.title": "Share session",
"share.hint": "Selected users can follow this session read-only.",
"share.noUsers": "No other users.",
"settings.tab.users": "Users",
"settings.tab.folders": "Shared folders",
"settings.tab.account": "Account",
"settings.maxParallelSubagents": "Parallel subagents",
"settings.maxParallelSubagentsHint": "Max. subagents running at the same time across all sessions (0 = unlimited).",
"settings.maxConcurrency": "Parallel requests",
"settings.maxConcurrencyHint": "Max. simultaneous requests to this host/model; more wait in a queue. 1 for servers that process one request at a time.",
"settings.slots": "Slots",
"account.title": "Account",
"account.current": "Current password",
"account.new": "New password",
"account.change": "Change password",
"account.changed": "Password changed. Other devices were signed out.",
"account.hint": "At least 8 characters.",
"users.intro": "Users work in their own folder <workspace>/<username> plus the folders shared with them. Admins can use the whole workspace and manage the server.",
"users.username": "Username",
"users.usernameHint": "Letters, digits, - _ . – also the name of the user's folder.",
"users.displayName": "Display name",
"users.role": "Role",
"users.roleUser": "User",
"users.roleAdmin": "Admin",
"users.login": "Sign-in",
"users.password": "Password",
"users.passwordHint": "Leave empty for single sign-on only.",
"users.created": "Created",
"users.you": "you",
"users.setPassword": "Set password",
"users.newPasswordFor": "New password for {name} (min. 8 characters):",
"users.enable": "Enable",
"users.disable": "Disable",
"users.deleteConfirm": "Delete user \"{name}\"? Their sessions stay visible to admins.",
"users.add": "Add user",
"folders.intro": "Folders inside the workspace that selected users may work in, in addition to their own folder.",
"folders.none": "No shared folders yet.",
"folders.noUsers": "No users without admin role.",
"folders.add": "Share a folder",
"folders.addHint": "The folder is created if it does not exist. Existing project folders can be shared too.",
"folders.remove": "Stop sharing",
"folders.removeConfirm": "Stop sharing this folder? The files are kept.",
"agents.intro": "Modes and subagents with their model. A subagent can run on another model or host – e.g. a small model that writes docs or translations in the background.",
"agents.primaryTitle": "Modes",
"agents.subagentTitle": "Subagents",
"agents.modePrimary": "mode",
"agents.modeSubagent": "subagent",
"agents.source.builtin": "built-in",
"agents.source.config": "config",
"agents.source.file": "file",
"agents.model": "Model",
"agents.sessionModel": "Session model",
"agents.modelHint": "Fixed model for this agent; empty = the model selected in the chat.",
"agents.maxParallel": "Max. parallel",
"agents.maxParallelShort": "max. {n} parallel",
"agents.description": "Description",
"agents.descriptionHint": "The main agent decides by this description when to delegate.",
"agents.mode": "Type",
"agents.tools": "Tools",
"agents.toolsAll": "all tools (e.g. read, glob, grep)",
"agents.prompt": "Instructions",
"agents.reset": "Reset",
"agents.resetConfirm": "Reset \"{name}\" to the built-in defaults?",
"agents.deleteConfirm": "Delete agent \"{name}\"?",
"agents.add": "Add agent",
"agents.addWriter": "Writer (docs, summaries, translations)",
"agents.addBlank": "Empty agent",
"stats.user": "User",
"stats.allUsers": "All users",
"stats.byUser": "By user",
};
export type Messages = Record<keyof typeof en, string>;