- 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>
520 lines
23 KiB
TypeScript
520 lines
23 KiB
TypeScript
// 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>;
|