Files
codecraft/web/src/i18n/en.ts
T
Richard ZinkandClaude Opus 5.5 5b569b6835 Add security hardening, Ghidra, recreate skill, checkpoints, shells, web search and themes
- Sandbox (bubblewrap) for non-admin shell/git, MCP per-user rights, hard budgets and quotas,
  login rate limiting, audit log and backups
- Ghidra headless decompilation (ARM64 natives built from source), binary_info tool,
  clean room / deep workflow per session
- Recreate skill and commands for analysing and re-building old software
- File checkpoints with rewind/restore, background shells (bash_output, kill_shell)
- web_search tool (DuckDuckGo, SearXNG, Brave, Tavily)
- In-app dialogs and toasts instead of browser dialogs
- 15 base themes (trilium-themes palettes plus Nord, VS Code, GitHub, Catppuccin, One,
  Dracula, Rose Pine, Everforest, Kanagawa) with light/dark/auto switcher and license notes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 19:12:30 +01:00

520 lines
23 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.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",
"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.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, 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.notificationsHint": "Notify when an agent asks a question while the app is in the background.",
"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.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>;