export const dict = {
  "files.title": "Files",
  "files.up": "Up",
  "files.askAiFolder": "Ask AI about this folder",
  "files.askAiFile": "Ask AI about this file",
  "files.loading": "Loading…",
  "files.cantRead": "Can't read this location",
  "files.empty": "Empty folder",
  "files.selectHint": "Select a file to preview",
  "files.binary": "This file can't be previewed:",
  "files.truncated": "truncated",
  "files.delete": "Delete (to Trash)",
  "files.trash": "Trash",
  "files.showHidden": "Hidden files",
  "files.trashHint": "You can restore it for about 2 days",
  "files.trashEmpty": "Trash is empty.",
  "files.restore": "Restore",
  "files.drives": "Drives",
  "files.trashFailed": "Couldn’t move to Trash",
  "files.restoreFailed": "Couldn’t restore",
  "notes.title": "Notes",
  "notes.hint": "Shared with your agents — any chat can read them or add to them.",
  "notes.new": "New note",
  "notes.namePlaceholder": "note name…",
  "notes.placeholder": "Write anything — phone numbers, sites, birthdays…",
  "notes.loading": "Loading…",
  "notes.empty": "No notes yet",
  "notes.saving": "Saving…",
  "notes.saved": "Saved",
  "notes.saveFailed": "Couldn’t save",
  "trash.title": "Trash",
  "trash.hint": "Safe-deleted files — restorable for ~2 days, from any folder.",
  "trash.refresh": "Refresh",
  "trash.loading": "Loading…",
  "trash.empty": "Trash is empty.",
  "trash.restore": "Restore",
  "trash.restoreFailed": "Couldn’t restore",
  "trash.expiresIn": "expires in",
  "trash.expiresUnderHour": "expires within the hour",
  "trash.expiringNow": "expiring now",

  // Processes — the friendly "what your agents are doing" activity view (uix.md §6.4 / SP1).
  "nav.chats": "Chats",
  "processes.title": "Activity",
  "processes.running": "{{count}} running",
  "processes.empty": "Nothing running right now",
  "processes.untitled": "Untitled chat",
  "processes.tokens": "{{count}} tokens",
  "processes.status.working": "Working…",
  "processes.status.waiting": "Waiting",
  "processes.status.done": "Done",
  "processes.status.ready": "Ready",
  "processes.status.paused": "Paused",

  // Expertise levels — progressive disclosure with consent (uix.md §6).
  "settings.expertise.title": "Experience level",
  "settings.expertise.description": "Choose how much of NovaClaw you want to see. You can change this anytime.",
  "settings.expertise.change": "Change…",
  "settings.expertise.current": "Current",
  "settings.expertise.cancel": "Cancel",
  "settings.expertise.level.normal.name": "Normal",
  "settings.expertise.level.normal.blurb":
    "The essentials — chat with your agents, keep notes and files, connect models. The recommended way to use NovaClaw.",
  "settings.expertise.level.advanced.name": "Advanced",
  "settings.expertise.level.advanced.blurb":
    "More controls — the agent's instructions, its step-by-step reasoning, permission tuning, and custom tools.",
  "settings.expertise.level.developer.name": "Developer",
  "settings.expertise.level.developer.blurb":
    "Everything, including internals — raw model IDs, engine tuning, the shell, and unsafe permission modes.",
  "settings.expertise.action.unlock": "Unlock {{level}}",
  "settings.expertise.action.switch": "Switch to {{level}}",
  "settings.expertise.confirm.advanced":
    "Advanced mode shows more controls — you can change the agent's instructions, see its step-by-step reasoning, tune permissions, and define custom tools. Nothing changes until you change it, and you can switch back anytime — your settings are kept.",
  "settings.expertise.confirm.developer":
    "Developer mode exposes internals — raw model IDs, engine tuning, the shell, and unsafe permission modes like running commands without asking. Only turn this on if you know what these do.",
  "settings.expertise.confirm.downgrade": "Your advanced settings stay saved and active — unlock again to see them.",
  "settings.expertise.confirm.typePrompt": "Type {{word}} to confirm",
  "settings.expertise.confirm.cta": "Confirm",
  "settings.expertise.activeHidden.title": "An advanced setting is active",
  "settings.expertise.activeHidden.description":
    "A permission mode you set earlier is still in effect but hidden at this level. Unlock it to review.",
  "settings.expertise.discover.advanced.title": "Looking for more?",
  "settings.expertise.discover.advanced.description":
    "Unlock Advanced features — the agent's instructions, reasoning, and custom tools.",
  "settings.expertise.discover.developer.title": "Need the internals?",
  "settings.expertise.discover.developer.description":
    "Unlock Developer features — raw model IDs, engine tuning, and the shell.",
  "settings.expertise.discover.action": "Unlock…",

  // Confirm dialogs on destructive/whole-config actions (uix.md §3.4 / P1).
  "settings.tools.confirm.title": "Delete this tool?",
  "settings.tools.confirm.description": "This permanently removes the “{{name}}” tool recipe. This can’t be undone.",
  "settings.providers.disconnect.confirm.title": "Disconnect {{provider}}?",
  "settings.providers.disconnect.confirm.description":
    "This removes it and any saved credentials from this device. You can reconnect later.",
  "settings.providers.export.action": "Export",
  "settings.providers.import.action": "Import",
  "home.sessions.new": "New Session",
  "home.sessions.select": "Select",
  "home.sessions.selectAll": "Select all",
  "home.sessions.selectedCount": "{{count}} selected",
  "home.sessions.bulk.delete.title": "Delete the selected chats ({{count}})?",
  "home.sessions.bulk.archive.title": "Archive the selected chats ({{count}})?",
  "home.sessions.bulk.archive.description":
    "Archived chats leave this list. Their transcripts are kept on the instance.",
  "settings.general.row.configIO.title": "Configuration file",
  "settings.general.row.configIO.description":
    "Export this instance's full configuration as a file, or import one. Model API keys ride along — treat exports as secrets.",
  "settings.models.io.export": "Export models",
  "settings.models.io.import": "Import models",
  "settings.config.io.export": "Export config",
  "settings.config.io.import": "Import config",
  "settings.providers.export.dialogTitle": "Export settings file (novaclaw.jsonc)",
  "settings.providers.import.dialogTitle": "Import settings file (novaclaw.jsonc)",
  "settings.providers.export.toast": "Configuration exported",
  "settings.providers.import.toast": "Configuration imported",
  "settings.providers.import.invalid.title": "This file isn't a valid config file",
  "settings.providers.import.invalid.description": "Could not parse the config file.",
  "settings.providers.import.failed": "Import failed",
  "settings.providers.import.confirm.title": "Import configuration?",
  "settings.providers.import.confirm.description":
    "This merges the selected file into your current settings, overwriting any matching providers and models. Settings not present in the file are kept.",
  "settings.providers.import.confirm.action": "Import",
  "command.category.suggested": "Suggested",
  "command.category.view": "View",
  "command.category.project": "Project",
  "command.category.provider": "Provider",
  "command.category.server": "Server",
  "command.category.session": "Chat",
  "command.chats.jump": "Go to the chat that needs you",
  "command.category.theme": "Theme",
  "command.category.language": "Language",
  "command.category.file": "File",
  "command.category.context": "Context",
  "command.category.terminal": "Terminal",
  "command.category.model": "Model",
  "command.category.mcp": "MCP",
  "command.category.permissions": "Permissions",
  "command.category.workspace": "Workspace",
  "command.category.settings": "Settings",

  "theme.scheme.system": "System",
  "theme.scheme.light": "Light",
  "theme.scheme.dark": "Dark",

  "command.sidebar.toggle": "Toggle sidebar",
  "command.project.open": "Open project",
  "command.project.previous": "Previous project",
  "command.project.next": "Next project",
  "command.project.index": "Switch to project {{index}}",
  "command.provider.connect": "Connect provider",
  "command.server.switch": "Switch server",
  "command.settings.open": "Open settings",
  "command.session.previous": "Previous chat",
  "command.session.next": "Next chat",
  "command.session.previous.unseen": "Previous unread chat",
  "command.session.next.unseen": "Next unread chat",
  "command.session.archive": "Archive chat",

  "command.palette": "Command palette",

  "command.theme.cycle": "Cycle theme",
  "command.theme.set": "Use theme: {{theme}}",
  "command.theme.scheme.cycle": "Cycle color scheme",
  "command.theme.scheme.set": "Use color scheme: {{scheme}}",

  "command.language.cycle": "Cycle language",
  "command.language.set": "Use language: {{language}}",

  "command.session.new": "New Agent",
  "command.file.open": "Open file",
  "command.tab.close": "Close tab",
  "command.context.addSelection": "Add selection to context",
  "command.context.addSelection.description": "Add selected lines from the current file",
  "command.input.focus": "Focus input",
  "command.terminal.toggle": "Toggle terminal",
  "command.fileTree.toggle": "Toggle file tree",
  "command.review.toggle": "Toggle review",
  "command.terminal.new": "New terminal",
  "command.terminal.new.description": "Create a new terminal tab",
  "command.steps.toggle": "Toggle steps",
  "command.steps.toggle.description": "Show or hide steps for the current message",
  "command.message.previous": "Previous message",
  "command.message.previous.description": "Go to the previous user message",
  "command.message.next": "Next message",
  "command.message.next.description": "Go to the next user message",
  "command.model.choose": "Choose model",
  "command.model.choose.description": "Select a different model",
  "command.mcp.toggle": "Toggle MCPs",
  "command.mcp.toggle.description": "Toggle MCPs",
  "command.model.variant.cycle": "Cycle thinking effort",
  "command.model.variant.cycle.description": "Switch to the next effort level",
  "command.prompt.mode.shell": "Shell",
  "command.prompt.mode.normal": "Chat",
  "command.permissions.autoaccept.enable": "Auto-accept permissions",
  "command.permissions.autoaccept.disable": "Stop auto-accepting permissions",
  "command.workspace.toggle": "Toggle workspaces",
  "command.workspace.toggle.description": "Enable or disable multiple workspaces in the sidebar",
  "command.session.undo": "Undo",
  "command.session.undo.description": "Undo the last message",
  "command.session.redo": "Redo",
  "command.session.redo.description": "Redo the last undone message",
  "command.session.compact": "Compact session",
  "command.session.compact.description": "Summarize the session to reduce context size",
  "command.session.fork": "Fork from message",
  "command.session.fork.description": "Create a new chat from a previous message",
  "command.session.share": "Share chat",
  "command.session.share.description": "Share this chat and copy the link to your clipboard",
  "command.session.unshare": "Unshare chat",
  "command.session.unshare.description": "Stop sharing this chat",

  "palette.search.placeholder": "Search files, commands, and chats",
  "palette.empty": "No results found",
  "palette.group.commands": "Commands",
  "palette.group.files": "Files",

  "dialog.provider.search.placeholder": "Search providers",
  "dialog.provider.empty": "No providers found",
  "dialog.provider.group.popular": "Popular",
  "dialog.provider.group.other": "Other",
  "dialog.provider.tag.recommended": "Recommended",

  "dialog.model.select.title": "Select model",
  "dialog.model.search.placeholder": "Search models",
  "dialog.model.empty": "No model results",
  "dialog.model.manage": "Manage models",
  "dialog.model.manage.description": "Customize which models appear in the model selector.",
  "dialog.model.manage.provider.toggle": "Toggle all {{provider}} models",

  "dialog.model.unpaid.freeModels.title": "Free models",
  "dialog.model.unpaid.addMore.title": "Add more models from popular providers",

  "dialog.provider.viewAll": "Show more providers",

  "provider.connect.title": "Connect {{provider}}",
  "provider.connect.title.anthropicProMax": "Login with Claude Pro/Max",
  "provider.connect.selectMethod": "Select login method for {{provider}}.",
  "provider.connect.method.apiKey": "API key",
  "provider.connect.status.inProgress": "Connecting…",
  "provider.connect.status.waiting": "Waiting to connect…",
  "provider.connect.status.failed": "Authorization failed: {{error}}",
  "provider.connect.apiKey.description":
    "Enter your {{provider}} API key to connect your account and use {{provider}} models in NovaClaw.",
  "provider.connect.apiKey.label": "{{provider}} API key",
  "provider.connect.apiKey.placeholder": "API key",
  "provider.connect.apiKey.required": "API key is required",
  "provider.connect.oauth.code.visit.prefix": "Visit ",
  "provider.connect.oauth.code.visit.link": "this link",
  "provider.connect.oauth.code.visit.suffix":
    " to collect your authorization code to connect your account and use {{provider}} models in NovaClaw.",
  "provider.connect.oauth.code.label": "{{method}} authorization code",
  "provider.connect.oauth.code.placeholder": "Authorization code",
  "provider.connect.oauth.code.required": "Authorization code is required",
  "provider.connect.oauth.code.invalid": "Invalid authorization code",
  "provider.connect.oauth.auto.visit.prefix": "Visit ",
  "provider.connect.oauth.auto.visit.link": "this link",
  "provider.connect.oauth.auto.visit.suffix":
    " and enter the code below to connect your account and use {{provider}} models in NovaClaw.",
  "provider.connect.oauth.auto.confirmationCode": "Confirmation code",
  "provider.connect.toast.connected.title": "{{provider}} connected",
  "provider.connect.toast.connected.description": "{{provider}} models are now available to use.",

  "provider.custom.title": "Custom provider",
  "provider.custom.description.prefix":
    "Connect any AI service that speaks the OpenAI API format (many local and third-party servers do). See the ",
  "provider.custom.description.link": "provider config docs",
  "provider.custom.description.suffix": ".",
  "provider.custom.field.providerID.label": "Provider ID",
  "provider.custom.field.providerID.placeholder": "myprovider",
  "provider.custom.field.providerID.description": "Lowercase letters, numbers, hyphens, or underscores",
  "provider.custom.field.name.label": "Display name",
  "provider.custom.field.name.placeholder": "My AI Provider",
  "provider.custom.field.baseURL.label": "Base URL",
  "provider.custom.field.baseURL.placeholder": "https://api.myprovider.com/v1",
  "provider.custom.field.apiKey.label": "API key",
  "provider.custom.field.apiKey.placeholder": "API key",
  "provider.custom.field.apiKey.description":
    "Optional. Leave empty if you pass credentials through custom headers instead.",
  "provider.custom.models.label": "Models",
  "provider.custom.models.id.label": "ID",
  "provider.custom.models.id.placeholder": "model-id",
  "provider.custom.models.name.label": "Name",
  "provider.custom.models.name.placeholder": "Display Name",
  "provider.custom.models.remove": "Remove model",
  "provider.custom.models.add": "Add model",
  "provider.custom.headers.label": "Headers (optional)",
  "provider.custom.headers.key.label": "Header",
  "provider.custom.headers.key.placeholder": "Header-Name",
  "provider.custom.headers.value.label": "Value",
  "provider.custom.headers.value.placeholder": "value",
  "provider.custom.headers.remove": "Remove header",
  "provider.custom.headers.add": "Add header",
  "provider.custom.error.providerID.required": "Provider ID is required",
  "provider.custom.error.providerID.format": "Use lowercase letters, numbers, hyphens, or underscores",
  "provider.custom.error.providerID.exists": "That provider ID already exists",
  "provider.custom.error.name.required": "Display name is required",
  "provider.custom.error.baseURL.required": "Base URL is required",
  "provider.custom.error.baseURL.format": "Must start with http:// or https://",
  "provider.custom.error.required": "Required",
  "provider.custom.error.duplicate": "Duplicate",

  "provider.disconnect.toast.disconnected.title": "{{provider}} disconnected",
  "provider.disconnect.toast.disconnected.description": "{{provider}} models are no longer available.",

  "model.tag.free": "Free",
  "model.tag.latest": "Latest",
  "model.provider.anthropic": "Anthropic",
  "model.provider.openai": "OpenAI",
  "model.provider.google": "Google",
  "model.provider.xai": "xAI",
  "model.provider.meta": "Meta",
  "model.input.text": "text",
  "model.input.image": "image",
  "model.input.audio": "audio",
  "model.input.video": "video",
  "model.input.pdf": "pdf",
  "model.tooltip.allows": "Allows: {{inputs}}",
  "model.tooltip.reasoning.allowed": "Allows reasoning",
  "model.tooltip.reasoning.none": "No reasoning",
  "model.tooltip.context": "Context limit {{limit}}",

  "common.search.placeholder": "Search",
  "common.goBack": "Navigate back",
  "common.goForward": "Navigate forward",
  "common.loading": "Loading",
  "common.loading.ellipsis": "...",
  "common.cancel": "Cancel",
  "common.confirm": "Confirm",
  "common.clear": "Clear",
  "common.open": "Open",
  "common.connect": "Connect",
  "common.disconnect": "Disconnect",
  "common.continue": "Continue",
  "common.submit": "Submit",
  "common.save": "Save",
  "common.saving": "Saving...",
  "common.default": "Default",
  "common.attachment": "attachment",

  "prompt.placeholder.shell": "Enter shell command... {{example}}",
  "prompt.placeholder.normal": 'Ask anything... "{{example}}"',
  "prompt.placeholder.simple": "Ask anything...",
  "prompt.placeholder.summarizeComments": "Summarize comments…",
  "prompt.placeholder.summarizeComment": "Summarize comment…",
  "prompt.mode.shell": "Shell",
  "prompt.mode.normal": "Chat",
  "prompt.mode.shell.exit": "esc to exit",
  "session.child.promptDisabled":
    "This is a helper the main chat started. You can't message it directly — go back to the main chat to continue.",
  "session.child.backToParent": "Back to the main chat.",

  "prompt.example.1": "Fix a TODO in the codebase",
  "prompt.example.2": "What is the tech stack of this project?",
  "prompt.example.3": "Fix broken tests",
  "prompt.example.4": "Explain how authentication works",
  "prompt.example.5": "Find and fix security vulnerabilities",
  "prompt.example.6": "Add unit tests for the user service",
  "prompt.example.7": "Refactor this function to be more readable",
  "prompt.example.8": "What does this error mean?",
  "prompt.example.9": "Help me debug this issue",
  "prompt.example.10": "Generate API documentation",
  "prompt.example.11": "Optimize database queries",
  "prompt.example.12": "Add input validation",
  "prompt.example.13": "Create a new component for...",
  "prompt.example.14": "How do I deploy this project?",
  "prompt.example.15": "Review my code for best practices",
  "prompt.example.16": "Add error handling to this function",
  "prompt.example.17": "Explain this regex pattern",
  "prompt.example.18": "Convert this to TypeScript",
  "prompt.example.19": "Add logging throughout the codebase",
  "prompt.example.20": "What dependencies are outdated?",
  "prompt.example.21": "Help me write a migration script",
  "prompt.example.22": "Implement caching for this endpoint",
  "prompt.example.23": "Add pagination to this list",
  "prompt.example.24": "Create a CLI command for...",
  "prompt.example.25": "How do environment variables work here?",

  "prompt.popover.emptyResults": "No matching results",
  "prompt.popover.emptyCommands": "No matching commands",
  "prompt.dropzone.label": "Drop images, PDFs, or text files here",
  "prompt.dropzone.file.label": "Drop to @mention file",
  "prompt.slash.badge.custom": "custom",
  "prompt.slash.badge.skill": "skill",
  "prompt.slash.badge.mcp": "mcp",
  "prompt.context.active": "active",
  "prompt.context.includeActiveFile": "Include active file",
  "prompt.context.removeActiveFile": "Remove active file from context",
  "prompt.context.removeFile": "Remove file from context",
  "prompt.action.attachFile": "Add files",
  "prompt.attachment.remove": "Remove attachment",
  "prompt.action.send": "Send",
  "prompt.action.stop": "Stop",

  "prompt.permissionMode.title": "Permission mode",
  // One word each — these render inside a narrow listbox (and on a phone). The explanations live in
  // `.hint` below, shown by the control's tooltip and the Settings row, not in the option label.
  // NOTE the display names do not match the internal values: Analyze=plan, Build=bypass. Renaming the
  // values would touch the schema, protocol, generated clients and every stored session row, for no
  // user-visible gain — so the mapping is here, and here only. `ask` and `surgical` are no longer
  // offered: surgical became a Tuning switch, and "ask about everything" is what Analyze/Build bracket.
  "prompt.permissionMode.plan": "Analyze",
  "prompt.permissionMode.ask": "Ask",
  "prompt.permissionMode.surgical": "Surgical",
  "prompt.permissionMode.bypass": "Build",
  "prompt.permissionMode.yolo": "YOLO",
  "prompt.permissionMode.plan.hint": "Read only — but it can still write a report into a temp folder.",
  "prompt.permissionMode.ask.hint": "Asks before every change. Superseded by Analyze and Build.",
  "prompt.permissionMode.surgical.hint": "Now a Tuning switch — “Edits instead of overwriting”.",
  "prompt.permissionMode.bypass.hint": "Write access to this project's folder.",
  "prompt.permissionMode.yolo.hint": "Write access to the ENTIRE computer, not just this project.",

  "prompt.strict.tooltip":
    "Strict mode: the harness plans, verifies every step, and recovers — built for small local models",
  "prompt.strict.off": "Strict",
  "prompt.strict.on": "Strict: on",
  "prompt.strict.popover.title": "Run this chat in Strict mode",
  "prompt.strict.popover.description":
    "The harness breaks your task into small steps, verifies each one by compiling or running it, and recovers from mistakes. Best for weak or local models on real coding tasks.",
  "prompt.strict.popover.attempts": "Agents racing (1–8)",
  "prompt.strict.popover.wallMinutes": "Time budget (minutes)",
  "prompt.strict.popover.bypassNote":
    "Strict mode works autonomously, so this chat's permission mode switches to Bypass (changes stay inside the project).",
  "prompt.strict.popover.enable": "Enable Strict",

  "prompt.features.tooltip": "Tune this chat — how it works, how careful it is, and when it asks",
  "prompt.features.label": "Tune",
  "prompt.features.popover.title": "Tune this chat",
  "prompt.features.popover.description":
    "These switches apply to this chat only (chats spawned from it inherit them). Everything else about each helper is configured in Settings.",
  "prompt.features.introspection.title": "Stuck detector",
  "prompt.features.introspection.description":
    "A judge model periodically checks whether the agent is stuck and nudges it to change approach.",
  "prompt.features.quality.title": "Quality gates",
  "prompt.features.quality.description":
    "Compiles and tests after the agent edits code, and steers it to fix failures before finishing.",
  "prompt.features.affective.title": "Mood sampling",
  "prompt.features.affective.description":
    "Adapts the model's sampling to its appraised mood — steadier when frustrated, freer when exploring.",

  "prompt.features.askBeforeChanges.title": "Ask before every change",
  "prompt.features.askBeforeChanges.description":
    "Stop and ask you before the agent edits, creates or deletes anything, and before it runs a shell command. Off by default — the permission mode already decides where it may work.",
  "prompt.features.surgicalEdits.title": "Edits instead of overwriting",
  "prompt.features.surgicalEdits.description":
    "Refuse to replace a whole file. The agent must make the smallest change that works, which keeps diffs readable and avoids losing parts of a file it did not mean to touch.",
  "prompt.features.thinkingBudget.title": "Thinking budget",
  "prompt.features.thinkingBudget.description":
    "Caps how long the model reasons before it must answer, and stops it looping. Turn off to let it think as long as it wants — useful for comparing the two on the same task.",

  "prompt.mode.title": "Mode",
  "prompt.mode.description": "How this chat runs — with you, or working alone.",
  "prompt.mode.interactive.title": "Interactive",
  "prompt.mode.interactive.description": "You drive: the agent answers and waits for you.",
  "prompt.mode.auto-prompting.title": "Auto-prompting",
  "prompt.mode.auto-prompting.description":
    "Unattended: the agent keeps prompting itself until the task is done. Permission asks are auto-approved and shell commands run sandboxed.",
  "prompt.mode.goal-oriented.title": "Goal-oriented",
  "prompt.mode.goal-oriented.description":
    "Unattended: the agent loops toward the goal you set until it's reached. Same guardrails as auto-prompting.",
  "prompt.mode.short.auto-prompting": "Auto",
  "prompt.mode.short.goal-oriented": "Goal",

  "prompt.remote.title": "Remote chat",
  "prompt.remote.draft": "Start the chat first — then you can link it to a messenger here.",
  "prompt.remote.none": "No messenger accounts yet — add one in Settings",
  "prompt.remote.link": "Link this chat to a messenger…",
  "prompt.remote.pickAccount": "Which messenger?",
  "prompt.remote.pickChat": "Which conversation?",
  "prompt.remote.loading": "Loading conversations…",
  "prompt.remote.chatsEmpty":
    "No conversations known yet. Send the account a message once and it appears here.",
  "prompt.remote.manual": "Or type a chat id / handle",
  "prompt.remote.manualUse": "Use",
  "prompt.remote.trust.title": "Who is on the other side?",
  "prompt.remote.trust.operator.title": "Me or my family",
  "prompt.remote.trust.operator.description": "Full control of NovaClaw through this chat.",
  "prompt.remote.trust.client.title": "A client",
  "prompt.remote.trust.client.description":
    "The agent works for them — their messages are requests to consider, never commands.",
  "prompt.remote.trust.audience.title": "The public",
  "prompt.remote.trust.audience.description":
    "The agent only watches and moderates; it speaks in the chat only on purpose.",
  "prompt.remote.conflict": "That conversation already drives another chat.",
  "prompt.remote.conflict.steal": "Move it here instead",
  "prompt.remote.connected": "via {{driver}} · {{chat}}",
  "prompt.remote.disconnect": "Disconnect",
  "prompt.remote.back": "Back",
  "prompt.remote.toast.failed": "Messenger link failed",

  "prompt.folder.tooltip": "This chat's working folder — click to move the chat somewhere else",
  "prompt.folder.tooltip.working": "The agent is working — you can move the chat once it's idle",
  "prompt.folder.pick.title": "Move this chat to a folder",
  "prompt.folder.moveFailed": "Moving the chat failed",

  "prompt.toast.pasteUnsupported.title": "Unsupported attachment",
  "prompt.toast.pasteUnsupported.description": "Only images, PDFs, or text files can be attached here.",
  "prompt.toast.modelAgentRequired.title": "Select an agent and model",
  "prompt.toast.modelAgentRequired.description": "Choose an agent and model before sending a prompt.",
  "prompt.toast.worktreeCreateFailed.title": "Couldn't create workspace",
  "prompt.toast.sessionCreateFailed.title": "Couldn't start the chat",
  "prompt.toast.shellSendFailed.title": "Failed to send shell command",
  "prompt.toast.commandSendFailed.title": "Failed to send command",
  "prompt.toast.promptSendFailed.title": "Failed to send prompt",
  "prompt.toast.promptSendFailed.description": "Couldn't find this chat. Try reopening it.",

  "dialog.mcp.title": "Connections",
  "dialog.mcp.description": "{{enabled}} of {{total}} enabled",
  "dialog.mcp.empty": "No connections yet. Connect an external tool or service to let your agents use it.",

  "dialog.plugins.empty": "Add-ons that extend NovaClaw. None are installed yet — ask an agent to set one up for you.",

  "mcp.status.connected": "connected",
  "mcp.status.failed": "failed",
  "mcp.status.needs_auth": "needs auth",
  "mcp.status.disabled": "disabled",
  "mcp.auth.clickToAuthenticate": "Click to authenticate",

  "dialog.fork.empty": "No messages to fork from",

  "dialog.directory.search.placeholder": "Search folders",
  "dialog.directory.empty": "No folders found",
  "dialog.directory.action.selectFile": "Select file",
  "dialog.directory.action.selectFolder": "Select folder",
  "dialog.directory.root": "Root",
  "dialog.directory.parent": "Parent",
  "dialog.directory.filename": "Save as",
  "dialog.directory.readError": "Can't open this folder — you may not have permission.",
  "dialog.directory.bookmarks": "Bookmarks",
  "dialog.directory.places": "Places",
  "dialog.directory.homePlace": "Home",
  "dialog.directory.pin": "Bookmark this folder",
  "dialog.directory.unpin": "Remove bookmark",
  "dialog.directory.pinShort": "Bookmark",
  "dialog.directory.pinnedShort": "Bookmarked",

  "app.server.unreachable": "Could not reach {{server}}",
  "app.server.retrying": "Retrying automatically...",
  "app.server.otherServers": "Other servers",
  "app.server.none": "No instance connected",
  "app.server.noneHint":
    "NovaClaw's instance isn't running yet. It usually starts by itself — this screen will clear as soon as it comes up.",
  "app.connection.reconnecting": "Connection lost — reconnecting…",
  "app.connection.stillTrying": "Still trying. Your work is safe; this clears by itself once the instance is back.",
  "app.connection.restored": "Reconnected",

  "dialog.server.title": "Servers",
  "dialog.server.description": "Switch which NovaClaw server this app connects to.",
  "dialog.server.search.placeholder": "Search servers",
  "dialog.server.empty": "No servers yet",
  "dialog.server.add.title": "Add server",
  "dialog.server.add.url": "Server address",
  "dialog.server.add.placeholder": "http://localhost:4096",
  "dialog.server.add.error": "Could not connect to server",
  "dialog.server.add.error.auth": "Wrong username or password",
  "dialog.server.add.checking": "Checking...",
  "dialog.server.add.button": "Add server",
  "dialog.server.add.name": "Server name (optional)",
  "dialog.server.add.namePlaceholder": "Localhost",
  "dialog.server.add.username": "Username (optional)",
  "dialog.server.add.usernamePlaceholder": "username",
  "dialog.server.add.password": "Password (optional)",
  "dialog.server.add.passwordPlaceholder": "password",
  "dialog.server.edit.title": "Edit server",
  "dialog.server.default.title": "Default server",
  "dialog.server.default.description":
    "Connect to this server on app launch instead of starting a local server. Requires restart.",
  "dialog.server.default.none": "No server selected",
  "dialog.server.default.set": "Set current server as default",
  "dialog.server.default.clear": "Clear",
  "dialog.server.action.remove": "Remove server",

  "dialog.server.menu.edit": "Edit",
  "dialog.server.menu.default": "Set as default",
  "dialog.server.menu.defaultRemove": "Remove default",
  "dialog.server.menu.delete": "Delete",
  "dialog.server.current": "Current Server",
  "dialog.server.status.default": "Default",
  "wsl.server.add": "Add WSL server",
  "wsl.server.addShort": "Add WSL",
  "wsl.server.label": "WSL",
  "wsl.server.menu.label": "WSL server",
  "wsl.server.retryStart": "Retry start",
  "wsl.server.updating": "Updating...",
  "wsl.onboarding.step.distro": "Choose distro",
  "wsl.onboarding.step.novaclaw": "NovaClaw",
  "wsl.onboarding.checkingRuntime": "Checking WSL...",
  "wsl.onboarding.restartRequired": "Windows needs a restart to finish installing WSL.",
  "wsl.onboarding.ready": "WSL is ready.",
  "wsl.onboarding.required": "WSL is required to continue.",
  "wsl.onboarding.checkingDistros": "Checking distros...",
  "wsl.onboarding.installingDistro": "Installing {{distro}}...",
  "wsl.onboarding.checkingDistro": "Checking {{distro}}...",
  "wsl.onboarding.listingDistros": "Listing distros...",
  "wsl.onboarding.distroReady": "{{distro}} is ready.",
  "wsl.onboarding.distroNotInstalled": "{{distro}} is not installed yet.",
  "wsl.onboarding.openDistroOnce": "Open {{distro}} once to finish setup.",
  "wsl.onboarding.finishingDistro": "Finishing setup for {{distro}}.",
  "wsl.onboarding.pickDistro": "Pick a distro or install one below.",
  "wsl.onboarding.checkingNovaclaw": "Checking NovaClaw...",
  "wsl.onboarding.checkingNovaclawIn": "Checking NovaClaw in {{distro}}...",
  "wsl.onboarding.updatingNovaclaw": "Updating NovaClaw...",
  "wsl.onboarding.updatingNovaclawIn": "Updating NovaClaw in {{distro}}...",
  "wsl.onboarding.updateNovaclawIn": "Update NovaClaw in {{distro}}.",
  "wsl.onboarding.updateNovaclaw": "Update NovaClaw",
  "wsl.onboarding.novaclawReadyIn": "NovaClaw is ready in {{distro}}.",
  "wsl.onboarding.novaclawReady": "NovaClaw is ready.",
  "wsl.onboarding.installNovaclawIn": "Install NovaClaw in {{distro}}.",
  "wsl.onboarding.installNovaclaw": "Install NovaClaw",
  "wsl.onboarding.chooseDistroFirst": "Choose a distro first.",
  "wsl.onboarding.loadFailed": "Failed to load WSL state.",
  "wsl.onboarding.loading": "Loading...",
  "wsl.onboarding.installWsl": "Install WSL",
  "wsl.onboarding.windowsRestartRequired": "Restart Windows to finish installing WSL, then reopen NovaClaw.",
  "wsl.onboarding.next": "Next",
  "wsl.onboarding.refresh": "Refresh",
  "wsl.onboarding.allDistrosAdded": "All installed distros are already added.",
  "wsl.onboarding.noDistros": "No distros detected yet.",
  "wsl.onboarding.install": "Install",
  "wsl.onboarding.installing": "Installing...",
  "wsl.onboarding.installDistro": "Install distro",
  "wsl.onboarding.wsl2Required":
    "This needs WSL 2, a newer version of Windows' Linux support. NovaClaw can help you upgrade it.",
  "wsl.onboarding.toolsRequired":
    "This Linux system is missing some tools NovaClaw needs. Open it once (button below) to finish setup.",
  "wsl.onboarding.openTerminal": "Open terminal",
  "wsl.onboarding.path": "Path: {{path}}",
  "wsl.onboarding.notFound": "not found",
  "wsl.onboarding.version": "Version: {{version}}",
  "wsl.onboarding.unknown": "unknown",
  "wsl.onboarding.desktopVersion": "desktop {{version}}",
  "wsl.onboarding.versionMismatch":
    "The NovaClaw installed in Linux is a different version than this app. Update it below to match.",
  "wsl.onboarding.adding": "Adding...",
  "server.row.noUsername": "no username",
  "server.row.devBuild": "dev build",

  "dialog.project.edit.title": "Edit project",
  "dialog.project.edit.name": "Name",
  "dialog.project.edit.icon": "Icon",
  "dialog.project.edit.icon.alt": "Project icon",
  "dialog.project.edit.icon.hint": "Click or drag an image",
  "dialog.project.edit.icon.recommended": "Recommended: 128x128px",
  "dialog.project.edit.color": "Color",
  "dialog.project.edit.color.select": "Select {{color}} color",
  "dialog.project.edit.worktree.startup": "Workspace startup script",
  "dialog.project.edit.worktree.startup.description": "Runs each time you create a new workspace.",
  "dialog.project.edit.worktree.startup.placeholder": "e.g. bun install",

  "dialog.releaseNotes.action.getStarted": "Get started",
  "dialog.releaseNotes.action.next": "Next",
  "dialog.releaseNotes.action.hideFuture": "Don't show these in the future",
  "dialog.releaseNotes.media.alt": "Release preview",

  "context.breakdown.title": "Context Breakdown",
  "context.breakdown.note":
    "Rough split of what's taking up the model's context. \"Other\" covers tool definitions and system overhead.",
  "context.breakdown.system": "System",
  "context.breakdown.user": "User",
  "context.breakdown.assistant": "Assistant",
  "context.breakdown.tool": "Tool Calls",
  "context.breakdown.other": "Other",

  "context.systemPrompt.title": "System Prompt",
  "context.rawMessages.title": "Raw messages",

  "context.stats.session": "Session",
  "context.stats.messages": "Messages",
  "context.stats.provider": "Provider",
  "context.stats.model": "Model",
  "context.stats.limit": "Context Limit",
  "context.stats.totalTokens": "Total Tokens",
  "context.stats.usage": "Usage",
  "context.stats.inputTokens": "Input Tokens",
  "context.stats.outputTokens": "Output Tokens",
  "context.stats.reasoningTokens": "Reasoning Tokens",
  "context.stats.cacheTokens": "Cache Tokens (read/write)",
  "context.stats.userMessages": "User Messages",
  "context.stats.assistantMessages": "Assistant Messages",
  "context.stats.totalCost": "Total Cost",
  "context.stats.sessionCreated": "Session Created",
  "context.stats.lastActivity": "Last Activity",

  "context.usage.tokens": "Tokens",
  "context.usage.usage": "Usage",
  "context.usage.cost": "Cost",
  "context.usage.window": "Context window",
  "context.usage.clickToView": "Click to view context",
  "context.usage.view": "View context usage",

  "language.en": "English",
  "language.zh": "简体中文",
  "language.zht": "繁體中文",
  "language.ko": "한국어",
  "language.de": "Deutsch",
  "language.es": "Español",
  "language.fr": "Français",
  "language.da": "Dansk",
  "language.ja": "日本語",
  "language.pl": "Polski",
  "language.ru": "Русский",
  "language.ar": "العربية",
  "language.no": "Norsk",
  "language.br": "Português (Brasil)",
  "language.bs": "Bosanski",
  "language.uk": "Українська",
  "language.th": "ไทย",
  "language.tr": "Türkçe",

  "toast.language.title": "Language",
  "toast.language.description": "Switched to {{language}}",

  "toast.theme.title": "Theme switched",
  "toast.scheme.title": "Color scheme",

  "toast.workspace.enabled.title": "Workspaces enabled",
  "toast.workspace.enabled.description": "Multiple worktrees are now shown in the sidebar",
  "toast.workspace.disabled.title": "Workspaces disabled",
  "toast.workspace.disabled.description": "Only the main worktree is shown in the sidebar",

  "toast.permissions.autoaccept.on.title": "Auto-accepting permissions",
  "toast.permissions.autoaccept.on.description": "Permission requests will be automatically approved",
  "toast.permissions.autoaccept.off.title": "Stopped auto-accepting permissions",
  "toast.permissions.autoaccept.off.description": "Permission requests will require approval",

  "toast.model.none.title": "No model selected",
  "toast.model.none.description": "Connect an AI service to summarize this chat",

  "toast.file.loadFailed.title": "Failed to load file",
  "toast.file.listFailed.title": "Failed to list files",

  "toast.context.noLineSelection.title": "No line selection",
  "toast.context.noLineSelection.description": "Select a line range in a file tab first.",

  "toast.session.share.copyFailed.title": "Failed to copy URL to clipboard",
  "toast.session.share.success.title": "Chat shared",
  "toast.session.share.success.description": "Share URL copied to clipboard!",
  "toast.session.share.failed.title": "Couldn't share chat",
  "toast.session.share.failed.description": "Something went wrong while sharing. Please try again.",

  "toast.session.unshare.success.title": "Chat unshared",
  "toast.session.unshare.success.description": "This chat is no longer shared.",
  "toast.session.unshare.failed.title": "Couldn't unshare chat",
  "toast.session.unshare.failed.description": "Something went wrong while unsharing. Please try again.",

  "toast.session.listFailed.title": "Couldn't load chats for {{project}}",
  "toast.project.reloadFailed.title": "Failed to reload {{project}}",

  "toast.update.title": "Update available",
  "toast.update.description": "A new version of NovaClaw ({{version}}) is now available to install.",
  "toast.update.action.installRestart": "Install and restart",
  "toast.update.action.notYet": "Not yet",

  "error.page.title": "Something went wrong",
  "error.page.description": "An error occurred while loading the application.",
  "error.page.description.localServerStartup": "An error occurred while starting the local server.",
  "error.page.details.label": "Error Details",
  "error.page.details.show": "Show technical details",
  "error.page.details.hide": "Hide technical details",
  "error.page.action.retry": "Try again",
  "error.page.action.restart": "Restart",
  "error.page.action.exportLogs": "Export Logs",
  "error.page.action.checking": "Checking...",
  "error.page.action.checkUpdates": "Check for updates",
  "error.page.action.updateTo": "Update to {{version}}",
  "error.page.circular": "[Circular]",
  "error.page.report.prefix": "Please report this error to the NovaClaw team",
  "error.page.report.discord": "on Discord",
  "error.page.version": "Version: {{version}}",

  "error.dev.rootNotFound":
    "Root element not found. Did you forget to add it to your index.html? Or maybe the id attribute got misspelled?",

  "error.serverSync.connectFailed": "Couldn't reach NovaClaw at {{url}}. Make sure it's running, then try again.",
  "error.serverSDK.noServerAvailable": "No server available",
  "error.serverSDK.serverNotAvailable": "Server not available",
  "error.childStore.persistedCacheCreateFailed": "Failed to create persisted cache",
  "error.childStore.persistedProjectMetadataCreateFailed": "Failed to create persisted project metadata",
  "error.childStore.persistedProjectIconCreateFailed": "Failed to create persisted project icon",
  "error.childStore.storeCreateFailed": "Failed to create store",
  "directory.error.invalidUrl": "That folder link doesn't point anywhere valid.",

  "error.chain.unknown": "Unknown error",
  "error.server.invalidConfiguration": "Invalid configuration",
  "error.chain.causedBy": "Caused by:",
  "error.chain.apiError": "API error",
  "error.chain.status": "Status: {{status}}",
  "error.chain.retryable": "Retryable: {{retryable}}",
  "error.chain.responseBody": "Response body:\n{{body}}",
  "error.chain.didYouMean": "Did you mean: {{suggestions}}",
  "error.chain.modelNotFound": "Model not found: {{provider}}/{{model}}",
  "error.chain.checkConfig": "Check the model in Settings → Models — it may have been renamed or removed.",
  "error.chain.mcpFailed":
    "Couldn't connect to the MCP tool server \"{{name}}\". NovaClaw can't sign in to MCP servers that require authentication yet.",
  "error.chain.providerAuthFailed": "Provider authentication failed ({{provider}}): {{message}}",
  "error.chain.providerInitFailed":
    'Failed to initialize provider "{{provider}}". Check credentials and configuration.',
  "error.chain.configJsonInvalid": "Config file at {{path}} isn't valid JSON (JSONC).",
  "error.chain.configJsonInvalidWithMessage": "Config file at {{path}} is not valid JSON(C): {{message}}",
  "error.chain.configDirectoryTypo":
    'Directory "{{dir}}" in {{path}} is not valid. Rename the directory to "{{suggestion}}" or remove it. This is a common typo.',
  "error.chain.configFrontmatterError": "Failed to parse frontmatter in {{path}}:\n{{message}}",
  "error.chain.configInvalid": "Config file at {{path}} is invalid",
  "error.chain.configInvalidWithMessage": "Config file at {{path}} is invalid: {{message}}",

  "notification.permission.title": "Permission required",
  "notification.permission.description": "{{sessionTitle}} in {{projectName}} needs permission",
  "notification.question.title": "Question",
  "notification.question.description": "{{sessionTitle}} in {{projectName}} has a question",
  "notification.action.goToSession": "Go to chat",

  "notification.session.responseReady.title": "Response ready",
  "notification.session.error.title": "Chat error",
  "notification.session.error.fallbackDescription": "An error occurred",

  "home.recentProjects": "Recent projects",
  "home.empty.title": "No folders opened yet",
  "home.empty.description": "Get started by opening a folder on your computer.",
  "home.title": "Home",
  "home.projects": "Projects",
  "home.project.add": "Add project",
  // Chats greeting entry (C5/O4 — was hardcoded English).
  "home.chat.greeting": "How can I help you today?",
  "home.chat.placeholder": "Message to start a new chat…",
  "home.chat.start": "Start",
  "home.chat.addProjectTitle": "Open a folder to start",
  "home.chat.addProjectHint": "Chats work inside a folder on your computer. Pick one and your agents get to work.",
  // Help tour (O3/O4/O6 — i18n'd; adds a Settings pointer; softened data-safety copy).
  "help.tour.skip": "Skip",
  "help.tour.back": "Back",
  "help.tour.next": "Next",
  "help.tour.getStarted": "Get started",
  "help.tour.step.welcome.title": "Welcome to NovaClaw",
  "help.tour.step.welcome.body":
    "Your private AI workspace — an operating system where AI helpers work for you like apps. It runs on your own hardware, so your conversations and data stay with you.",
  "help.tour.step.apps.title": "A home screen of apps",
  "help.tour.step.apps.body":
    "Tap a tile to open an app. The big gold tile is Chats — that’s where everything starts, and its Recent and Active views show what the AI is doing right now. Notes keeps your everyday things, and Files lets AI work on your folders.",
  "help.tour.step.home.title": "The logo is your Home button",
  "help.tour.step.home.body":
    "See the NovaClaw logo in the top-left corner? Click it anytime to jump back to this home screen — from any chat or app. Think of it as your Start button.",
  "help.tour.step.chat.title": "Chat, and let AI help",
  "help.tour.step.chat.body":
    "A helper can break a big job into smaller ones, use tools on your behalf, and hand back the result. It can even draw charts and small visualizations right inside the chat — not just text.",
  "help.tour.step.build.title": "Ask for your own apps",
  "help.tour.step.build.body":
    "Want something this screen doesn’t have? Just ask — “make me a stock prices app on the home screen” — and a helper builds it and pins it as a new tile.",
  "help.tour.step.settings.title": "Set up your models",
  "help.tour.step.settings.body":
    "Open Settings to connect the AI models your helpers use and to manage servers. Settings is also home to Recovery, where you can reset or restore things if you ever need to.",
  "help.tour.step.data.title": "Your data is yours — and safe",
  "help.tour.step.data.body":
    "Notes are shared with your AI helpers so they know your context. When AI edits or removes files, deletions go to a Trash you can restore from — so an accidental change is easy to undo.",
  "help.tour.step.done.title": "You’re all set",
  "help.tour.step.done.body":
    "Open Chats and say hi. Hover any tile for a hint of what it does, and reopen this tour anytime from the Help app.",
  "home.server.collapse": "Collapse server projects",
  "home.server.expand": "Expand server projects",
  "home.sessions.search.placeholder": "Search chats",
  "home.sessions.search.placeholder.scoped": "Search chats in {{scope}}",
  "home.sessions.search.sessions": "Chats",
  "home.sessions.search.noResults": "No chats found for {{query}}",
  "home.sessions.title": "Sessions",
  "home.sessions.empty": "Nothing here yet",
  "home.sessions.empty.description": "Start a chat to get going.",
  "home.sessions.group.today": "Today",
  "home.sessions.group.yesterday": "Yesterday",
  "home.sessions.group.older": "Older",
  "home.sessions.group.attention": "Needs attention",
  "home.session.info": "Details",
  "home.session.stop": "Stop this chat's current run",
  "home.session.export": "Export as Markdown",
  "home.session.export.pick": "Choose a folder to export “{{title}}” into",
  "home.session.export.toast.done": "Exported the chat",
  "home.session.export.toast.running": "Exported — the chat was still running, so the file ends mid-turn",
  "home.session.export.toast.failed": "Could not export that chat",
  "home.session.clone": "Clone chat",
  "home.session.tokens.title":
    "{{generated}} tokens generated ({{output}} text · {{reasoning}} reasoning), sub-agent threads included",
  "home.session.live.title": "Generating right now — approximate tokens this run and current speed",
  "home.scratch.name": "Scratch",
  "session.info.folder": "Folder",
  "session.info.tags": "Tags",
  "common.remove": "Remove",
  "session.info.tags.placeholder": "Add a tag and press Enter",
  "home.sessions.filter.all": "All",
  "home.sessions.sort.recent": "Recent",
  "home.sessions.sort.active": "Active",
  "home.sessions.sort.tokens": "Generated",
  "home.newAgent.placeholder": "Tell a new agent what to do — Enter opens its chat, ready to configure",
  "home.newAgent.folder.scratch": "Scratch",
  "home.newAgent.folder.pick": "Choose the agent's working folder",
  "home.newAgent.folder.reset": "Back to the scratch folder",
  "session.info.agent": "Agent",
  "session.info.model": "Model",
  "session.info.status": "Status",
  "session.info.status.ready": "Ready",
  "session.info.changes": "Workspace changes",
  "session.info.changes.value": "{{files}} files · +{{additions}} −{{deletions}}",
  "session.info.cost": "Cost",
  "session.info.created": "Created",
  "session.info.updated": "Last activity",
  "session.info.tokens.thisChat": "Tokens",
  "session.info.tokens.value": "{{total}} ({{input}} read · {{output}} written)",
  "session.info.tokens.withThreads": "With threads",
  "session.info.tokens.rollup": "{{total}} across {{threads}} sub-agent threads",
  "session.info.tokens.hint":
    "Tokens are the pieces of text the AI reads and writes — a rough measure of how much work this chat has done.",
  "session.info.adhoc.title": "Session tools",
  "session.info.adhoc.promote": "Promote",
  "session.info.adhoc.promoted": "Promoted",
  "session.info.adhoc.discard": "Discard",
  "session.info.adhoc.manual": "Manual",
  "session.info.adhoc.hint":
    "Tools this chat's agent defined for itself. Promote copies one into this instance's configuration for every chat; Discard throws it away.",
  "session.info.prompt.title": "System prompt (this chat)",
  "session.info.prompt.placeholder": "Extra standing instructions for this chat…",
  "session.info.prompt.hint":
    "Standing instructions layered on top of the agent's base prompt — for this chat only (chats spawned from it inherit them). Applies from the next reply; the base prompt is never changed.",
  "home.sessions.attention.waiting": "Waiting for you",
  "home.sessions.attention.working": "Working",
  "home.sessions.attention.error": "Something went wrong",
  "home.sessions.attention.unseen": "New activity",

  "session.tab.session": "Chat",
  "session.tab.review": "Review",
  "session.tab.context": "Context",
  "session.panel.reviewAndFiles": "Review and files",
  "session.review.filesChanged": "{{count}} Files Changed",
  "session.review.change.one": "Change",
  "session.review.change.other": "Changes",
  "session.review.loadingChanges": "Loading changes...",
  "session.review.empty": "No changes in this chat yet",
  "session.review.noVcs":
    "This folder isn't tracked by Git yet, so there's nothing to review. Create a Git repository below to track changes.",
  "session.review.noVcs.createGit.title": "Create a Git repository",
  "session.review.noVcs.createGit.description": "Track, review, and undo changes in this project",
  "session.review.noVcs.createGit.actionLoading": "Creating Git repository...",
  "session.review.noVcs.createGit.action": "Create Git repository",
  "session.review.noSnapshot":
    "Snapshot tracking is turned off, so per-session changes aren't available. Turn it on in settings to see them.",
  "session.review.noChanges": "No changes",
  "session.review.noUncommittedChanges": "No uncommitted changes yet",
  "session.review.noBranchChanges": "No branch changes yet",

  "session.files.selectToOpen": "Select a file to open",
  "session.files.all": "All files",
  "session.files.empty": "No files",
  "session.files.binaryContent": "Binary file (content cannot be displayed)",

  "session.messages.renderEarlier": "Render earlier messages",
  "session.messages.loadingEarlier": "Loading earlier messages...",
  "session.messages.loadEarlier": "Load earlier messages",
  "session.messages.loading": "Loading messages...",
  "session.messages.jumpToLatest": "Jump to latest",

  "session.context.addToContext": "Add {{selection}} to context",
  "session.todo.title": "Todos",
  "session.todo.collapse": "Collapse",
  "session.todo.expand": "Expand",
  "session.todo.progress": "{{done}} of {{total}} todos completed",
  "session.question.progress": "{{current}} of {{total}} questions",
  "session.followupDock.summary.one": "{{count}} queued message",
  "session.followupDock.summary.other": "{{count}} queued messages",
  "session.followupDock.sendNow": "Send now",
  "session.followupDock.edit": "Edit",
  "session.followupDock.collapse": "Collapse queued messages",
  "session.followupDock.expand": "Expand queued messages",
  "session.revertDock.summary.one": "{{count}} rolled back message",
  "session.revertDock.summary.other": "{{count}} rolled back messages",
  "session.revertDock.collapse": "Collapse rolled back messages",
  "session.revertDock.expand": "Expand rolled back messages",
  "session.revertDock.restore": "Restore message",

  "session.revert.confirm.title": "Revert to this prompt?",
  "session.revert.confirm.description":
    "This rewinds the chat to before this prompt: it and every later message are removed, and your working files are restored to that point. The prompt is placed back in the composer to edit and resend. This can't be undone.",
  "session.revert.confirm.action": "Revert",
  "session.revert.error.title": "Revert failed",
  "session.revert.error.description": "Could not revert to this prompt. Check the server logs and try again.",

  "session.responderDock.operator": "You have control",
  "session.responderDock.operatorHint": "Nova is paused — you're replying in this conversation for now.",
  "session.responderDock.handBack": "Hand back to Nova",
  "session.responderDock.takeOver": "Take control",

  "session.new.title": "Build anything",
  "session.new.project.new": "New project",
  "session.new.project.search": "Search projects",
  "session.new.project.add": "Add project",
  "session.new.worktree.main": "Main branch",
  "session.new.worktree.mainWithBranch": "Main branch ({{branch}})",
  "session.new.worktree.create": "Create new workspace",
  "session.new.workspace.runIn": "Run chat in",
  "session.new.workspace.triggerLocal": "Local",
  "session.new.workspace.local": "Local repository",
  "session.new.workspace.existing": "Workspace…",
  "session.new.lastModified": "Last modified",

  "session.header.search.placeholder": "Search {{project}}",
  "session.header.searchFiles": "Search files",
  "session.header.openIn": "Open in",
  "session.header.open.action": "Open {{app}}",
  "session.header.open.ariaLabel": "Open in {{app}}",
  "session.header.open.menu": "Open options",
  "session.header.open.copyPath": "Copy path",
  "session.header.open.finder": "Finder",
  "session.header.open.fileExplorer": "File Explorer",
  "session.header.open.fileManager": "File Manager",
  "session.header.open.app.vscode": "VS Code",
  "session.header.open.app.cursor": "Cursor",
  "session.header.open.app.zed": "Zed",
  "session.header.open.app.textmate": "TextMate",
  "session.header.open.app.antigravity": "Antigravity",
  "session.header.open.app.terminal": "Terminal",
  "session.header.open.app.iterm2": "iTerm2",
  "session.header.open.app.ghostty": "Ghostty",
  "session.header.open.app.warp": "Warp",
  "session.header.open.app.xcode": "Xcode",
  "session.header.open.app.androidStudio": "Android Studio",
  "session.header.open.app.powershell": "PowerShell",
  "session.header.open.app.sublimeText": "Sublime Text",

  "status.popover.trigger": "Status",
  "status.popover.ariaLabel": "Server configurations",
  "status.popover.tab.servers": "Servers",
  "status.popover.tab.mcp": "Connections",
  "status.popover.tab.plugins": "Plugins",
  "status.popover.action.manageServers": "Manage servers",

  "session.share.popover.title": "Publish on web",
  "session.share.popover.description.shared":
    "This session is public on the web. It is accessible to anyone with the link.",
  "session.share.popover.description.unshared":
    "Share session publicly on the web. It will be accessible to anyone with the link.",
  "session.share.action.share": "Share",
  "session.share.action.publish": "Publish",
  "session.share.action.publishing": "Publishing...",
  "session.share.action.unpublish": "Unpublish",
  "session.share.action.unpublishing": "Unpublishing...",
  "session.share.action.view": "View",
  "session.share.copy.copied": "Copied",
  "session.share.copy.copyLink": "Copy link",

  "prompt.loading": "Loading prompt...",
  "terminal.loading": "Loading terminal...",
  "terminal.title": "Terminal",
  "terminal.title.numbered": "Terminal {{number}}",
  "terminal.close": "Close terminal",
  "terminal.connectionLost.title": "Connection Lost",
  "terminal.connectionLost.abnormalClose": "Connection dropped unexpectedly (code {{code}})",
  "terminal.connectionLost.description":
    "The terminal connection was interrupted. This can happen when the server restarts.",

  "common.closeTab": "Close tab",
  "common.dismiss": "Dismiss",
  "common.moreCountSuffix": " (+{{count}} more)",
  "common.requestFailed": "Request failed",
  "common.moreOptions": "More options",
  "common.learnMore": "Learn more",
  "common.rename": "Rename",
  "common.reset": "Reset",
  "common.archive": "Archive",
  "common.delete": "Delete",
  "common.close": "Close",
  "common.edit": "Edit",
  "common.loadMore": "Load more",
  "common.key.esc": "ESC",
  "common.key.ctrl": "Ctrl",
  "common.key.alt": "Alt",
  "common.key.shift": "Shift",
  "common.key.meta": "Meta",
  "common.key.space": "Space",
  "common.key.backspace": "Backspace",
  "common.key.enter": "Enter",
  "common.key.tab": "Tab",
  "common.key.delete": "Delete",
  "common.key.home": "Home",
  "common.key.end": "End",
  "common.key.pageUp": "Page Up",
  "common.key.pageDown": "Page Down",
  "common.key.insert": "Insert",
  "common.unknown": "unknown",

  "common.time.justNow": "Just now",
  "common.time.minutesAgo.short": "{{count}}m ago",
  "common.time.hoursAgo.short": "{{count}}h ago",
  "common.time.daysAgo.short": "{{count}}d ago",

  "sidebar.menu.toggle": "Toggle menu",
  "sidebar.nav.projectsAndSessions": "Projects and chats",
  "sidebar.settings": "Settings",
  "sidebar.help": "Help",
  "sidebar.workspaces.enable": "Enable workspaces",
  "sidebar.workspaces.disable": "Disable workspaces",
  "sidebar.gettingStarted.title": "Getting started",
  "sidebar.gettingStarted.line1": "NovaClaw includes free models so you can start immediately.",
  "sidebar.gettingStarted.line2": "Connect an account like Claude, ChatGPT, or Gemini to unlock more AI models.",
  "sidebar.project.recentSessions": "Recent chats",
  "sidebar.project.viewAllSessions": "View all chats",
  "sidebar.project.clearNotifications": "Clear notifications",
  "sidebar.empty.title": "No projects open",
  "sidebar.empty.description": "Open a project to get started",

  "debugBar.ariaLabel": "Development performance diagnostics",
  "debugBar.na": "n/a",
  "debugBar.nav.label": "NAV",
  "debugBar.nav.tip":
    "Last completed route transition touching a session page, measured from router start until the first paint after it settles.",
  "debugBar.fps.label": "FPS",
  "debugBar.fps.tip": "Rolling frames per second over the last 5 seconds.",
  "debugBar.frame.label": "FRAME",
  "debugBar.frame.tip": "Worst frame time over the last 5 seconds.",
  "debugBar.jank.label": "JANK",
  "debugBar.jank.tip": "Frames over 32ms in the last 5 seconds.",
  "debugBar.long.label": "LONG",
  "debugBar.long.tip": "Blocked time and long-task count in the last 5 seconds. Max task: {{max}}.",
  "debugBar.delay.label": "DELAY",
  "debugBar.delay.tip": "Worst observed input delay in the last 5 seconds.",
  "debugBar.inp.label": "INP",
  "debugBar.inp.tip":
    "Approximate interaction duration over the last 5 seconds. This is INP-like, not the official Web Vitals INP.",
  "debugBar.cls.label": "CLS",
  "debugBar.cls.tip": "Cumulative layout shift for the current app lifetime.",
  "debugBar.mem.label": "MEM",
  "debugBar.mem.tipUnavailable": "Used JS heap vs heap limit. Chromium only.",
  "debugBar.mem.tip": "Used JS heap vs heap limit. {{used}} of {{limit}}.",

  "app.name.desktop": "NovaClaw Desktop",

  "settings.section.desktop": "Settings",
  "settings.section.server": "Server",
  "settings.section.safety": "Safety",
  "settings.tab.general": "General",
  "settings.tab.profile": "Profile",
  "settings.tab.appearance": "Appearance",
  "settings.tab.instances": "Instances",
  "settings.tab.shortcuts": "Shortcuts",
  "settings.tab.recovery": "Recovery",
  "settings.tab.about": "About",

  "settings.recovery.row.resetUi.title": "Reset appearance and layout",
  "settings.recovery.row.resetUi.description":
    "Reset how NovaClaw looks and is laid out back to the defaults — theme, the welcome tour, and view options. Your chats, files, and connected models are kept.",
  "settings.recovery.row.resetUi.action": "Reset",
  "settings.recovery.row.resetUi.confirm": "Click again to confirm",
  "settings.recovery.row.factory.title": "Factory reset",
  "settings.recovery.row.factory.description":
    "Erase all chats, sessions and configuration on this device and start fresh. Coming soon.",
  "settings.recovery.row.factory.action": "Erase everything",
  "settings.recovery.row.snapshots.title": "Snapshots",
  "settings.recovery.row.snapshots.description":
    "Roll the workspace back to an earlier point in time. File deletions already land in a dated Trash; full workspace snapshots are coming soon.",
  "settings.recovery.row.snapshots.action": "Browse snapshots",
  "settings.desktop.section.wsl": "WSL",
  "settings.desktop.wsl.title": "WSL integration",
  "settings.desktop.wsl.description": "Run the NovaClaw server inside WSL on Windows.",

  "settings.general.section.appearance": "Appearance",
  // The Appearance tab's visual section (color scheme/theme/fonts) — "Visual", since the tab title is
  // already "Appearance" and the tab also holds Sound Effects.
  "settings.appearance.section.visual": "Visual",
  // Color-scheme presets (uix.md §7).
  "settings.appearance.theme.title": "Color scheme",
  "settings.appearance.theme.description":
    "Pick a color palette. Each pairs one warm highlight color with a calm background.",
  "settings.appearance.theme.nova": "Nova",
  "settings.appearance.theme.summer": "Summer",
  "settings.appearance.theme.autumn": "Autumn",
  "settings.general.section.advanced": "Advanced",
  "settings.general.section.notifications": "System notifications",
  "settings.general.section.updates": "Updates",
  "settings.general.section.sounds": "Sound effects",
  "settings.general.section.feed": "Feed",
  "settings.general.section.display": "Display",

  "settings.general.row.instance.title": "Connected instance",
  "settings.general.row.instance.description":
    "Which NovaClaw instance this window is talking to. Pick another to point the whole UI at it.",
  "settings.general.row.instance.default": "default",
  "settings.general.row.instance.temporary":
    "Temporarily connected — this window returns to {{default}} (the default) next launch.",
  "settings.general.row.instance.return": "Return to default",
  "settings.instances.discovered.title": "Discovered on your network",
  "settings.instances.discovered.rescan": "Scan again",
  "settings.instances.discovered.add": "Add this instance",
  "settings.general.row.language.title": "Language",
  "settings.general.row.language.description": "Change the language NovaClaw is shown in.",
  "settings.general.row.shell.title": "Terminal Shell",
  "settings.general.row.shell.description":
    "Choose the shell used for your terminal. Compatible shells are also used for agent tool calls.",
  "settings.general.row.shell.autoDefault": "Auto (Default)",
  "settings.general.row.shell.terminalOnly": "terminal only",
  "settings.general.row.appearance.title": "Appearance",
  "settings.general.row.appearance.description": "Customise how NovaClaw looks on your device",
  "settings.general.row.colorScheme.title": "Mode",
  "settings.general.row.colorScheme.description": "Use light mode, dark mode, or match your system setting.",
  "settings.general.row.theme.title": "Theme",
  "settings.general.row.theme.description":
    "Choose a full visual style, including colors and fonts. Or browse more themes.",
  "settings.general.row.font.title": "Code Font",
  "settings.general.row.font.description": "Set the font used for code shown in chats. Leave blank to use the default.",
  "settings.general.row.terminalFont.title": "Terminal Font",
  "settings.general.row.terminalFont.description": "Customise the font used in the terminal",
  "settings.general.row.uiFont.title": "UI Font",
  "settings.general.row.uiFont.description": "Customise the font used throughout the interface",
  "settings.general.row.followup.title": "Follow-up behavior",
  "settings.general.row.followup.description": "Choose whether follow-up prompts steer immediately or wait in a queue",
  "settings.general.row.followup.option.queue": "Queue",
  "settings.general.row.followup.option.steer": "Steer",
  "settings.general.row.showFileTree.title": "File tree",
  "settings.general.row.showFileTree.description": "Show the file tree panel in sessions",
  "settings.general.row.showNavigation.title": "Navigation controls",
  "settings.general.row.showNavigation.description": "Show the back and forward buttons in the desktop title bar",
  "settings.general.row.showSearch.title": "Command palette",
  "settings.general.row.showSearch.description": "Show the search and command palette button in the title bar",
  "settings.general.row.showTerminal.title": "Terminal",
  "settings.general.row.showTerminal.description": "Show the terminal button in the desktop title bar",
  "settings.general.row.showStatus.title": "Server status",
  "settings.general.row.showStatus.description": "Show the server status button in the title bar",
  "settings.general.row.mobileTitlebarBottom.title": "Bottom navigation",
  "settings.general.row.mobileTitlebarBottom.description":
    "Place the title bar and session tabs at the bottom of the screen on mobile",
  "settings.general.row.showCustomAgents.title": "Custom agents",
  "settings.general.row.showCustomAgents.description": "Show the agent picker in the composer",
  "settings.general.row.defaultPermissionMode.title": "Default permission mode",
  "settings.general.row.defaultPermissionMode.description":
    'How much a new chat can do on its own before asking you. "Plan" and "Ask" check with you first; the higher modes act without asking, which is faster but riskier — only pick those for trusted work.',
  "settings.general.row.shellBundle.title": "Shell environment",
  "settings.general.row.shellBundle.description":
    "The bash + git substrate agents run on. Provisioning downloads the pinned PortableGit bundle (~59 MB) so every machine gets the same environment — do it before going airgapped",
  "settings.general.row.shellBundle.bundled": "Bundled PortableGit",
  "settings.general.row.shellBundle.system": "System bash",
  "settings.general.row.shellBundle.none": "No bash — agents fall back to cmd.exe",
  "settings.general.row.shellBundle.unknown": "Status unavailable",
  "settings.general.row.shellBundle.provision": "Provision",
  "settings.general.row.shellBundle.reprovision": "Re-provision",
  "settings.general.row.shellBundle.provisioning": "Provisioning…",
  "settings.general.row.telemetry.title": "Telemetry",
  "settings.general.row.telemetry.description":
    "Consent for future crash/usage reporting. Nothing is uploaded today — no telemetry system exists yet; this switch is the contract it will obey, and offline mode forces it off regardless.",
  "settings.general.row.paranoid.title": "Ask before reading outside the project folder",
  "settings.general.row.paranoid.description":
    "Off by default: agents may freely READ files outside your project folder, which normal work needs — a compiler, an SDK, a system header. Turn this on to be asked first every time. Either way, agents never WRITE outside the folder without your permission.",
  "settings.general.row.offline.title": "Offline / airgap mode",
  "settings.general.row.offline.description":
    "Block all network access except your model providers, so nothing else can phone home (fail-closed: if in doubt, it's blocked). This stops package installs, usage/telemetry uploads, and any network calls the agent's shell tries to make. Restart the server to apply.",
  "settings.general.row.offline.active": "airgapped",
  "settings.general.row.offline.inactive": "ready (offline mode is off)",
  "settings.instances.access.title": "This instance",
  "settings.instances.access.hint":
    "The API token other instances and agents must present to reach this one (HTTP Basic, username 'novaclaw'). Empty means open. Applies immediately.",
  "settings.instances.access.placeholder": "API token",
  "settings.instances.peers.title": "Agent peers",
  "settings.instances.peers.hint":
    "Peer instances this instance's agents may drive over HTTP — full API access with the stored token. Agents see them in their environment.",
  "settings.instances.peers.name": "name",
  "settings.instances.peers.url": "http://host:port",
  "settings.instances.peers.token": "peer token",
  "settings.instances.peers.add": "Add peer",
  "settings.general.row.virtualFs.title": "Virtual workspace",
  "settings.general.row.virtualFs.description":
    "Keep this instance's projects, notes, and files in an app-private folder — for hosts without a browsable filesystem.",
  "settings.general.row.feedReasoning.title": "Reasoning sections",
  "settings.general.row.feedReasoning.description":
    "How the model's reasoning shows in chat. Auto follows your expertise level.",
  "settings.general.row.feedTool.title": "Tool and shell cards",
  "settings.general.row.feedTool.description":
    "How tool calls (shell commands, edits, …) show in chat. Auto follows your expertise level.",
  "settings.general.feedDisplay.auto": "Auto",
  "settings.general.feedDisplay.expanded": "Expanded",
  "settings.general.feedDisplay.collapsed": "Collapsed",
  "settings.general.row.pinchZoom.title": "Pinch to zoom",
  "settings.general.row.pinchZoom.description": "Allow trackpad pinch and Ctrl-scroll gestures to zoom",

  "settings.general.row.wayland.title": "Use native Wayland",
  "settings.general.row.wayland.description": "Disable X11 fallback on Wayland. Requires restart.",
  "settings.general.row.wayland.tooltip":
    "On Linux with mixed refresh-rate monitors, native Wayland can be more stable.",

  "settings.general.row.releaseNotes.title": "Release notes",
  "settings.general.row.releaseNotes.description": 'Show a "What\'s New" summary after NovaClaw updates.',

  "settings.updates.row.startup.title": "Check for updates on startup",
  "settings.updates.row.startup.description": "Automatically check for updates when NovaClaw launches",
  "settings.updates.row.check.title": "Check for updates",
  "settings.updates.row.check.description": "Check for a newer version now and install it if one is available.",
  "settings.updates.action.checkNow": "Check now",
  "settings.updates.action.checking": "Checking...",
  "settings.updates.action.downloading": "Downloading...",
  "settings.updates.action.installing": "Installing...",
  "settings.updates.toast.latest.title": "You're up to date",
  "settings.updates.toast.latest.description": "You're running the latest version of NovaClaw.",
  "sound.option.none": "None",
  "sound.option.alert01": "Alert 01",
  "sound.option.alert02": "Alert 02",
  "sound.option.alert03": "Alert 03",
  "sound.option.alert04": "Alert 04",
  "sound.option.alert05": "Alert 05",
  "sound.option.alert06": "Alert 06",
  "sound.option.alert07": "Alert 07",
  "sound.option.alert08": "Alert 08",
  "sound.option.alert09": "Alert 09",
  "sound.option.alert10": "Alert 10",
  "sound.option.bipbop01": "Bip-bop 01",
  "sound.option.bipbop02": "Bip-bop 02",
  "sound.option.bipbop03": "Bip-bop 03",
  "sound.option.bipbop04": "Bip-bop 04",
  "sound.option.bipbop05": "Bip-bop 05",
  "sound.option.bipbop06": "Bip-bop 06",
  "sound.option.bipbop07": "Bip-bop 07",
  "sound.option.bipbop08": "Bip-bop 08",
  "sound.option.bipbop09": "Bip-bop 09",
  "sound.option.bipbop10": "Bip-bop 10",
  "sound.option.staplebops01": "Staplebops 01",
  "sound.option.staplebops02": "Staplebops 02",
  "sound.option.staplebops03": "Staplebops 03",
  "sound.option.staplebops04": "Staplebops 04",
  "sound.option.staplebops05": "Staplebops 05",
  "sound.option.staplebops06": "Staplebops 06",
  "sound.option.staplebops07": "Staplebops 07",
  "sound.option.nope01": "Nope 01",
  "sound.option.nope02": "Nope 02",
  "sound.option.nope03": "Nope 03",
  "sound.option.nope04": "Nope 04",
  "sound.option.nope05": "Nope 05",
  "sound.option.nope06": "Nope 06",
  "sound.option.nope07": "Nope 07",
  "sound.option.nope08": "Nope 08",
  "sound.option.nope09": "Nope 09",
  "sound.option.nope10": "Nope 10",
  "sound.option.nope11": "Nope 11",
  "sound.option.nope12": "Nope 12",
  "sound.option.yup01": "Yup 01",
  "sound.option.yup02": "Yup 02",
  "sound.option.yup03": "Yup 03",
  "sound.option.yup04": "Yup 04",
  "sound.option.yup05": "Yup 05",
  "sound.option.yup06": "Yup 06",

  "settings.general.notifications.agent.title": "Agent",
  "settings.general.notifications.agent.description":
    "Show system notification when the agent is complete or needs attention",
  "settings.general.notifications.permissions.title": "Permissions",
  "settings.general.notifications.permissions.description": "Show system notification when a permission is required",
  "settings.general.notifications.errors.title": "Errors",
  "settings.general.notifications.errors.description": "Show system notification when an error occurs",

  "settings.general.sounds.agent.title": "Agent",
  "settings.general.sounds.agent.description": "Play sound when the agent is complete or needs attention",
  "settings.general.sounds.permissions.title": "Permissions",
  "settings.general.sounds.permissions.description": "Play sound when a permission is required",
  "settings.general.sounds.errors.title": "Errors",
  "settings.general.sounds.errors.description": "Play sound when an error occurs",

  "settings.shortcuts.title": "Keyboard shortcuts",
  "settings.shortcuts.reset.button": "Reset to defaults",
  "settings.shortcuts.reset.toast.title": "Shortcuts reset",
  "settings.shortcuts.reset.toast.description": "Keyboard shortcuts have been reset to defaults.",
  "settings.shortcuts.conflict.title": "Shortcut already in use",
  "settings.shortcuts.conflict.description": "{{keybind}} is already assigned to {{titles}}.",
  "settings.shortcuts.unassigned": "Unassigned",
  "settings.shortcuts.pressKeys": "Press keys",
  "settings.shortcuts.search.placeholder": "Search shortcuts",
  "settings.shortcuts.search.empty": "No shortcuts found",

  "settings.shortcuts.group.general": "General",
  "settings.shortcuts.group.session": "Chat",
  "settings.shortcuts.group.navigation": "Navigation",
  "settings.shortcuts.group.modelAndAgent": "Model and agent",
  "settings.shortcuts.group.terminal": "Terminal",
  "settings.shortcuts.group.prompt": "Prompt",

  "settings.providers.title": "Providers",
  "settings.providers.description":
    "Connect the AI services you want to use — Anthropic, OpenAI, Google, and more. Your keys stay on this device.",
  "settings.providers.section.connected": "Connected providers",
  "settings.providers.connected.empty": "No connected providers",
  "settings.providers.connected.environmentDescription": "Connected from your environment variables",
  "settings.providers.section.popular": "Popular providers",
  "settings.providers.custom.description":
    "Add another AI service that uses the OpenAI API format — just point it at the server's address.",
  "settings.providers.tag.environment": "Environment",
  "settings.providers.tag.config": "Config",
  "settings.providers.tag.custom": "Custom",
  "settings.providers.tag.other": "Other",
  "settings.models.title": "Models",
  "settings.models.description":
    "Choose which AI models show up when you pick one for a chat, and check that each one is reachable.",
  "settings.models.probe.test": "Test",
  "settings.models.probe.probing": "Testing…",
  "settings.models.probe.ok": "OK",
  "settings.models.probe.unreachable": "Couldn't connect",
  "settings.models.probe.auth": "Sign-in failed — check your API key",
  "settings.models.probe.missing": "Model not found on this provider",
  "settings.models.probe.noUrl": "No URL configured",
  "settings.models.probe.error": "Error",
  "settings.models.probe.window": "window",
  // Capability tier — a rough size class NovaClaw uses to decide how much to scaffold a model
  // (and, later, to note in the system prompt). "Guess" = let NovaClaw probe and estimate it.
  "settings.models.tier.label": "Tier",
  "settings.models.tier.pick": "Set capability tier",
  "settings.models.tier.guess.name": "Guess",
  "settings.models.tier.guess.range": "auto",
  "settings.models.tier.guess.blurb":
    "Let NovaClaw estimate the tier by probing the model. Choose a specific tier if you already know its size.",
  "settings.models.tier.micro.name": "Micro",
  "settings.models.tier.micro.range": "under 7B",
  "settings.models.tier.micro.blurb":
    "Phone- and edge-sized models (e.g. Gemma 3 4B, Qwen3 4B, Llama 3.2 3B). Fast and cheap, but need small, well-scoped steps and heavy guidance.",
  "settings.models.tier.tiny.name": "Tiny",
  "settings.models.tier.tiny.range": "7B–24B",
  "settings.models.tier.tiny.blurb":
    "Small local models (e.g. Qwen3 8B/14B, Gemma 3 12B, Mistral Small). Good for everyday tasks with clear instructions; still benefit from being broken into steps.",
  "settings.models.tier.small.name": "Small",
  "settings.models.tier.small.range": "~24B–~64B",
  "settings.models.tier.small.blurb":
    "Capable local models (e.g. Qwen3 32B, Gemma 3 27B). Solid general assistants that can follow a multi-step plan with light scaffolding.",
  "settings.models.tier.medium.name": "Medium",
  "settings.models.tier.medium.range": "~64B–~128B",
  "settings.models.tier.medium.blurb":
    "Strong open models (e.g. Llama 3.3 70B, gpt-oss 120B). Reliable reasoning and tool use across most tasks.",
  "settings.models.tier.large.name": "Large",
  "settings.models.tier.large.range": "~128B–~256B",
  "settings.models.tier.large.blurb":
    "Near-frontier open models (e.g. DeepSeek V3, GLM-4.6, Qwen3 235B). Roughly Claude Sonnet class — they handle complex, long-running work with little hand-holding.",
  "settings.models.tier.frontier.name": "Frontier",
  "settings.models.tier.frontier.range": "256B+ / closed",
  "settings.models.tier.frontier.blurb":
    "The strongest models (e.g. Claude Opus & Sonnet, GPT-5, Gemini 2.5 Pro). Best judgment and reliability; they need the least guidance.",
  "settings.models.tier.dialog.title": "Model size",
  "settings.models.tier.dialog.description":
    "About how large is {{model}}? NovaClaw uses this to give it the right amount of guidance — smaller models get more scaffolding.",
  "settings.models.config.open": "Configure",
  "settings.models.config.title": "Configure {{model}}",
  "settings.models.config.description":
    "Set how this model runs. Leave a field blank to use the model's or provider's own default.",
  "settings.models.config.defaultPlaceholder": "default",
  "settings.models.config.section.sampling": "Sampling",
  "settings.models.config.section.limits": "Limits",
  "settings.models.config.section.capabilities": "Capabilities",
  "settings.models.config.section.modalities": "What it handles",
  "settings.models.config.temperature.name": "Temperature",
  "settings.models.config.temperature.desc":
    "Higher is more creative and varied; lower is more focused and repeatable. Around 0.7 for chat, 0 for code.",
  "settings.models.config.top_p.name": "Top-P (nucleus)",
  "settings.models.config.top_p.desc":
    "Only consider the most likely words that together make up this share of the probability. 1 = off.",
  "settings.models.config.top_k.name": "Top-K",
  "settings.models.config.top_k.desc": "Only consider the K most likely next words. 0 or blank = off.",
  "settings.models.config.min_p.name": "Min-P",
  "settings.models.config.min_p.desc":
    "Drop words less likely than this fraction of the top word — a gentler alternative to Top-P. 0 = off.",
  "settings.models.config.repetition_penalty.name": "Repetition penalty",
  "settings.models.config.repetition_penalty.desc":
    "Discourages repeating the same words. 1 = off; around 1.1 helps stop loops.",
  "settings.models.config.presence_penalty.name": "Presence penalty",
  "settings.models.config.presence_penalty.desc":
    "Discourages reusing any word already used, nudging toward new topics. 0 = off.",
  "settings.models.config.frequency_penalty.name": "Frequency penalty",
  "settings.models.config.frequency_penalty.desc":
    "Discourages words the more often they have already appeared. 0 = off.",
  "settings.models.config.context.name": "Context window",
  "settings.models.config.context.desc":
    "How many tokens of the conversation the model can see at once. Match the model's real limit.",
  "settings.models.config.maxTokens.name": "Max response length",
  "settings.models.config.maxTokens.desc": "The most tokens the model may generate in a single reply.",
  "settings.models.config.thinkingBudget.name": "Thinking budget",
  "settings.models.config.thinkingBudget.desc":
    "Soft cap on the model's reasoning per turn. When it's reached, the harness nudges the model to wrap up and answer — curbing runaway thinking in smaller models. Blank uses the default (¼ of the context).",
  "settings.models.config.reasoning.name": "Thinking",
  "settings.models.config.reasoning.desc":
    "Let the model think privately before answering. Turn on only if the model supports reasoning.",
  "settings.models.config.tool_call.name": "Tool use",
  "settings.models.config.tool_call.desc":
    "Let the model use NovaClaw's tools — read and edit files, run commands, search. Turn off for models that can't.",
  "settings.models.config.modalities.in.name": "Accepts",
  "settings.models.config.modalities.in.desc": "What you can send this model.",
  "settings.models.config.modalities.out.name": "Produces",
  "settings.models.config.modalities.out.desc": "What this model can return.",
  "settings.models.config.modality.text": "Text",
  "settings.models.config.modality.image": "Image",
  "settings.models.config.modality.audio": "Audio",
  "settings.models.config.preset.default": "Default",
  "settings.models.config.preset.custom": "Custom",
  "settings.models.config.preset.off": "Off",
  "settings.models.config.preset.disabled": "Disabled — no budget",
  "settings.models.config.preset.precise": "Precise",
  "settings.models.config.preset.focused": "Focused",
  "settings.models.config.preset.balanced": "Balanced",
  "settings.models.config.preset.creative": "Creative",
  "settings.models.config.preset.wild": "Wild",
  "settings.models.config.preset.diverse": "Diverse",
  "settings.models.config.preset.tight": "Tight",
  "settings.models.config.preset.wide": "Wide",
  "settings.models.config.preset.gentle": "Gentle",
  "settings.models.config.preset.light": "Light",
  "settings.models.config.preset.moderate": "Moderate",
  "settings.models.config.preset.strong": "Strong",
  "settings.models.config.toast.saved": "Model settings saved",
  "settings.models.config.toast.failed": "Couldn't save model settings",
  "settings.models.new.open": "Add models",
  "settings.models.new.title": "Add models",
  "settings.models.new.description": "Pick where your models come from.",
  "settings.models.new.custom.name": "Custom endpoint",
  "settings.models.new.custom.description": "Any OpenAI-compatible server — vLLM, llama.cpp, Ollama, LM Studio…",
  "settings.models.new.connect.title": "Connect to {{name}}",
  "settings.models.new.connect.description":
    "NovaClaw checks the connection and lists the models it serves, so you can pick which to add.",
  "settings.models.new.getKey": "Get an API key",
  "settings.models.new.keyHint": "Your key is stored on this instance and only ever sent to this provider.",
  "settings.models.new.field.apiKey.keep": "A key is already saved — leave empty to keep it",
  "settings.models.new.back": "Back",
  "settings.models.new.field.baseURL.label": "Endpoint URL",
  "settings.models.new.field.baseURL.placeholder": "http://localhost:8000/v1",
  "settings.models.new.field.providerID.label": "Short name (ID)",
  "settings.models.new.field.providerID.placeholder": "my-server",
  "settings.models.new.field.providerID.invalid": "Use lowercase letters, numbers, hyphens, or underscores.",
  "settings.models.new.field.name.label": "Display name (optional)",
  "settings.models.new.field.name.placeholder": "My Server",
  "settings.models.new.field.apiKey.label": "API key (optional)",
  "settings.models.new.field.apiKey.placeholder": "Leave blank if the endpoint needs no key",
  "settings.models.new.discover": "Find models",
  "settings.models.new.discovering": "Checking…",
  "settings.models.new.noModels": "Connected, but this endpoint didn't list any models.",
  "settings.models.new.pick": "Pick models to add — {{count}} found",
  "settings.models.new.preset": "{{family}} defaults",
  "settings.models.new.add": "Add selected",
  "settings.models.new.toast.added": "Models added",
  "settings.models.clone.action": "Clone",
  "settings.models.clone.toast.done": "Created {{model}}",
  "settings.models.clone.toast.failed": "Could not clone that model",
  "settings.models.remove.confirm.title": "Remove {{model}}?",
  "settings.models.remove.confirm.description":
    "This removes the model from your list here. It doesn't delete anything on the model server, and you can add it back later.",
  "settings.models.remove.confirm.action": "Remove",
  "settings.messengers.title": "Messengers",
  "settings.messengers.description":
    "Connect NovaClaw to your messaging apps — the agent can answer chats while you're away, and you can drive NovaClaw from your phone.",
  // How the operator actually USES a connected account from their phone. Without this the §0.1.5
  // address rule is invisible: an unaddressed message is silently ignored (by design — your notes to
  // self must stay yours), which is indistinguishable from a broken account.
  "settings.messengers.consoleHint":
    'To give NovaClaw a task from your phone, message YOURSELF — "Message Yourself" on WhatsApp, "Saved Messages" on Telegram — and start the message with "{{address}}, ". For example: "{{address}}, what\'s on my calendar today?"',
  "settings.messengers.consoleHintWhy":
    "Messages there that don't start with that are ignored, so your own notes to self stay private. The first one you send links that chat to a new session automatically.",
  "settings.messengers.add": "Add account",
  "settings.messengers.addThenLogin": "Add & log in",
  "settings.messengers.empty": "No messenger accounts yet. Add one to let NovaClaw talk where you talk.",
  "settings.messengers.airgapped": "Messengers are off while NovaClaw is offline or airgapped — nothing connects until you go back online.",
  "settings.messengers.enabled": "Enabled",
  "settings.messengers.login": "Log in",
  "settings.messengers.pair": "Pair",
  "settings.messengers.secret": "Access token",
  "settings.messengers.label": "Name",
  "settings.messengers.pickDriver": "Which messenger?",
  "settings.messengers.setup.title": "How to get this",
  "settings.messengers.setup.open": "Open the setup page",
  "settings.messengers.auth.login": "NovaClaw signs into your own account and answers as you while you're away. You stay in control — flip the responder any time.",
  "settings.messengers.auth.key": "Uses a bot or app token you paste — a separate identity from your own account.",
  "settings.messengers.auth.none": "Connects with just the settings below — no credentials needed.",
  "settings.messengers.toast.failed": "Messenger action failed",
  "settings.messengers.status.connected": "Connected",
  "settings.messengers.status.connecting": "Connecting…",
  "settings.messengers.status.backoff": "Reconnecting",
  "settings.messengers.status.challenge": "Needs your attention",
  "settings.messengers.status.error": "Error",
  "settings.messengers.status.disabled": "Off",
  "settings.messengers.status.airgapped": "Off (airgapped)",
  "settings.messengers.remove.confirm.title": "Remove {{label}}?",
  "settings.messengers.remove.confirm.description":
    "This disconnects the account and forgets its stored credential. Nothing is deleted on the messenger's side.",
  "settings.messengers.remove.confirm.action": "Remove",
  "settings.messengers.login.title": "Log in — {{label}}",
  "settings.messengers.login.sendCode": "Send code",
  "settings.messengers.login.sending": "Contacting…",
  "settings.messengers.login.codePlaceholder": "12345",
  "settings.messengers.login.finish": "Finish login",
  "settings.messengers.login.checking": "Checking…",
  "settings.messengers.login.done": "Logged in — the account is connecting.",
  "settings.messengers.pair.title": "Pair your phone — {{label}}",
  "settings.messengers.pair.instructions":
    "From the phone you want to control NovaClaw with, send this message to the connected account:",
  "settings.messengers.pair.expiry": "The code works once and expires in 10 minutes.",
  "settings.messengers.speed": "Speed",
  "settings.messengers.speed.title": "Typing speed — {{label}}",
  "settings.messengers.speed.description":
    "NovaClaw types replies at a human pace, across all chats at once, so this account is never flagged as a bot. This sets how fast it types, in characters per second.",
  "settings.messengers.speed.unit": "characters / second",
  "settings.messengers.speed.human": "A person types around {{default}}/s. Lower is safer; higher is faster but riskier.",
  "settings.messengers.speed.warning":
    "⚠️ This is faster than a human types. Messaging providers watch for bot-like speed and may flag or BAN your account for posting too fast. Only go this high if you accept that risk.",
  "settings.quality.title": "Quality",
  "settings.quality.description":
    "Quality Enforcement: your provisioned checks run automatically at write and turn boundaries; a failure steers the agent to fix it and re-run — a change doesn't count as done until the checks pass.",
  "settings.quality.toast.failed": "Saving quality settings failed",
  "settings.quality.row.enabled.title": "Enable quality enforcement",
  "settings.quality.row.enabled.description": "Run the provisioned checks on every change this server makes",
  "settings.quality.row.cadence.title": "Typecheck cadence",
  "settings.quality.row.cadence.description": "Run the whole-module typecheck every N writes",
  "settings.quality.row.testTimeout.title": "Test timeout (ms)",
  "settings.quality.row.testTimeout.description": "Hard limit for the test gate — a hung test counts as a failure",
  "settings.quality.commands.title": "Provisioned commands",
  "settings.quality.commands.description":
    "Empty = the step is skipped. {file} is replaced with the path of the file that was written (quoted). An agent can fill these in for you with the quality_provision tool.",
  "settings.quality.command.syntax.title": "Syntax check",
  "settings.quality.command.syntax.description": "Per-file parse on every write",
  "settings.quality.command.check.title": "Incremental verify",
  "settings.quality.command.check.description": "Per-file verifier on every write",
  "settings.quality.command.typecheck.title": "Typecheck",
  "settings.quality.command.typecheck.description": "Whole-module compile/type check, cadence-gated",
  "settings.quality.command.test.title": "Test gate",
  "settings.quality.command.test.description": "Runs once per completed turn that wrote files",
  "settings.quality.command.lint.title": "Structural pass",
  "settings.quality.command.lint.description": "Lint/structure check at the same turn-end gate",
  "settings.systemPrompt.title": "System Prompt",
  "settings.systemPrompt.description":
    "The assistant's composed prompt, in layers: the persona baseline and project instructions. The shipped base is never forked — clearing a field restores the default.",
  "settings.systemPrompt.toast.failed": "Saving system-prompt settings failed",
  "settings.systemPrompt.persona.title": "Persona",
  "settings.systemPrompt.persona.enabled.title": "Persona baseline",
  "settings.systemPrompt.persona.enabled.description":
    "Add the persona to the start of every agent's system prompt, so its behavior stays consistent even when you switch models.",
  "settings.systemPrompt.persona.name.title": "Assistant name",
  "settings.systemPrompt.persona.name.description": "Rename the assistant without forking the prompt text",
  "settings.systemPrompt.persona.prompt.title": "Persona prompt",
  "settings.systemPrompt.persona.prompt.description":
    "Replaces the canonical persona wholesale. Leave empty to use the default shown below.",
  "settings.systemPrompt.profile.title": "User profile",
  "settings.systemPrompt.profile.name.title": "Your name",
  "settings.systemPrompt.profile.name.description": "Injected so the assistant knows who it is helping",
  "settings.systemPrompt.profile.name.placeholder": "e.g. Nancy",
  "settings.systemPrompt.profile.about.title": "About you",
  "settings.systemPrompt.profile.about.description":
    "Background the assistant should know: role, expertise, preferences.",
  "settings.systemPrompt.profile.about.placeholder": "e.g. systems programmer building a local-LLM agent OS",
  "settings.systemPrompt.instructions.title": "Project instructions",
  "settings.systemPrompt.instructions.description":
    "Paths or URLs of instruction files loaded into every session (one per line). AGENTS.md files are discovered automatically.",
  "settings.systemPrompt.instructions.placeholder": "docs/style-guide.md",
  "settings.profile.title": "Profile",
  "settings.profile.description":
    "Tell the assistant who you are. When enabled, it can look your profile up on demand through a tool — your name and background stay out of every prompt until it actually needs them.",
  "settings.profile.toast.failed": "Saving your profile failed",
  "settings.profile.enabled.title": "Share my profile with the assistant",
  "settings.profile.enabled.description":
    "On when you've filled in your profile: the assistant can call a tool to read the details below on demand. Turn it off to keep them private.",
  "settings.profile.name.title": "Your name",
  "settings.profile.name.description": "What the assistant should call you",
  "settings.profile.name.placeholder": "e.g. Nancy",
  "settings.profile.about.title": "About you",
  "settings.profile.about.description":
    "Anything worth knowing: your role, expertise, the projects you work on, how you like answers.",
  "settings.profile.about.placeholder":
    "e.g. systems programmer building a local-LLM agent OS; prefers concise, direct answers",
  "settings.memory.title": "Memory",
  "settings.memory.description":
    "What NovaClaw remembers about you and your work. It learns as you chat — nothing to set up. Your memory stays on this device.",
  "settings.memory.enabled.title": "Remember across chats",
  "settings.memory.enabled.description":
    "Let NovaClaw learn and recall things about you and your work as you chat. Turn off to stop all recall and saving — what's already stored stays until you clear it.",
  "settings.memory.io.hint":
    "Export a backup to keep or move to another instance, restore one here, or clear everything for a fresh start.",
  "settings.memory.export.action": "Export",
  "settings.memory.export.toast": "Memory backup downloaded",
  "settings.memory.export.empty": "Nothing to back up yet",
  "settings.memory.import.action": "Import",
  "settings.memory.ingest.action": "Add document",
  "settings.memory.ingest.toast": "Added {{count}} passages from {{name}} to memory",
  "settings.memory.ingest.already": "{{name}} is already in memory",
  "settings.memory.import.toast": "Restored {{count}} memories",
  "settings.memory.import.empty": "That backup has no memories",
  "settings.memory.import.none": "Nothing could be restored",
  "settings.memory.import.invalid.title": "That doesn’t look like a memory backup",
  "settings.memory.import.invalid.description": "Pick a memory backup file exported from NovaClaw.",
  "settings.memory.import.invalid.version": "This backup is from a newer version of NovaClaw. Update to import it.",
  "settings.memory.import.confirm.title": "Restore memory?",
  "settings.memory.import.confirm.description":
    "Add {{count}} remembered things back into NovaClaw. Your existing memories are kept.",
  "settings.memory.import.confirm.action": "Restore",
  "settings.memory.clearAll.action": "Clear all",
  "settings.memory.clearAll.confirm.title": "Clear all memory?",
  "settings.memory.clearAll.confirm.description":
    "NovaClaw will forget everything it has learned, across every chat. A backup is downloaded first so you can restore it. This can’t be undone.",
  "settings.memory.clearAll.confirm.action": "Clear everything",
  "settings.memory.clearAll.toast": "Memory cleared — a backup was downloaded first",
  "settings.memory.clearChat.action": "Clear this chat",
  "settings.memory.clearChat.confirm.title": "Clear this chat’s memory?",
  "settings.memory.clearChat.confirm.description":
    "Forget what NovaClaw learned in this chat. Memory from other chats, and everything it remembers for good, are kept.",
  "settings.memory.clearChat.confirm.action": "Clear this chat",
  "settings.memory.clearChat.toast": "This chat’s memory was cleared",
  "settings.memory.list.title": "Remembered ({{count}})",
  "settings.memory.list.titleEmpty": "Remembered",
  "settings.memory.list.empty": "Nothing remembered yet. NovaClaw learns as you chat — no setup needed.",
  "settings.memory.scope.global": "Always",
  "settings.memory.scope.chat": "This chat",
  "settings.memory.scope.otherChat": "Another chat",
  "settings.memory.embedding.title": "Semantic search (advanced)",
  "settings.memory.embedding.description":
    "Point NovaClaw at a local embedding model and memory search also matches by MEANING, not just wording — it can find “favourite programming language” when you ask about a “coding tongue”. Leave blank to match on keywords only.",
  "settings.memory.embedding.url.title": "Embedding server",
  "settings.memory.embedding.url.description":
    "Address of an OpenAI-compatible embeddings server on your machine or network. Stays local.",
  "settings.memory.embedding.model.title": "Embedding model",
  "settings.memory.embedding.model.description": "The model id that server serves.",
  "settings.memory.forget.action": "Forget this",
  "settings.memory.toast.failed": "Something went wrong with memory",
  "settings.about.author": "by Nancy Sadkov",
  "settings.about.credits.title": "Built with open-source software",
  "settings.about.credits.description":
    "NovaClaw stands on these projects, used under their respective licenses. Thank you to their authors.",
  "settings.about.basedOn": "Part of NovaClaw is based on opencode (MIT) — © 2025 opencode.",
  "settings.about.more":
    "…and many other open-source packages, each under its own license — see the NOTICE file for the full list.",
  "settings.introspection.title": "Introspection",
  "settings.introspection.description":
    "A judge model periodically checks whether a running session is stuck and, when it is, injects a course-correcting note.",
  "settings.introspection.toast.failed": "Saving introspection settings failed",
  "settings.introspection.row.enabled.title": "Enable introspection",
  "settings.introspection.row.enabled.description": "Ask the judge model during long turns whether the agent is stuck.",
  "settings.introspection.row.cadence.title": "Cadence",
  "settings.introspection.row.cadence.description": "Judge every N continuation steps within a turn.",
  "settings.introspection.row.model.title": "Judge model",
  "settings.introspection.row.model.description":
    "Model that judges, as provider/model. Empty = same as the session's model.",
  "settings.introspection.row.model.placeholder": "same as active model",
  "settings.introspection.row.generate.title": "Generate the interjection",
  "settings.introspection.row.generate.description":
    "Let the judge model write the interjection from context instead of using the fixed text below.",
  "settings.introspection.row.prompt.title": "Introspection prompt",
  "settings.introspection.row.prompt.description":
    "The question the judge is asked about the recent context. Empty = the default stuck/looping check.",
  "settings.introspection.row.interjection.title": "Interjection",
  "settings.introspection.row.interjection.description":
    "Text injected into the session when the judge answers YES. Empty = the default redirect.",
  "settings.affective.title": "Affective",
  "settings.affective.description":
    "Emotion-modulated sampling: a per-session mood (derived from tool errors, repeated actions, and time-on-task) nudges temperature and related sampling parameters around the model's baseline. Unattended agent runs additionally get a redirect nudge when frustration or urgency runs high — attended chats never do.",
  "settings.affective.toast.failed": "Saving affective settings failed",
  "settings.affective.row.enabled.title": "Enable affective mode",
  "settings.affective.row.enabled.description":
    "Modulate sampling by session mood; unattended agent runs also get a nudge on frustration/urgency.",
  "settings.affective.row.temperature.title": "Baseline temperature",
  "settings.affective.row.temperature.description":
    "Calm-state temperature used when the model config sets none. Empty = 0.7.",
  "settings.affective.row.extended.title": "Extended parameters",
  "settings.affective.row.extended.description":
    "Also modulate top_k — for local engines (vLLM, llama.cpp) that accept it.",
  "settings.strict.title": "Strict mode",
  "settings.strict.description":
    "The training-wheels harness for small local models: instead of trusting the model to plan a long task, the system breaks work into tiny steps, verifies each one by actually compiling and running things, and recovers from mistakes automatically — so a modest model on your own hardware can finish jobs that normally need a frontier model. Applies to Strict-harness sessions.",
  "settings.strict.toast.failed": "Saving Strict-mode settings failed",
  "settings.strict.row.enabled.title": "Enable Strict mode",
  "settings.strict.row.enabled.description":
    "Run tasks under the Strict harness: step-by-step planning with a verified checkpoint after every action. Because it builds and runs things on its own, a chat also needs its permission mode set to Bypass (or Yolo) — below that, the chat explains and answers normally.",
  "settings.strict.row.verification.title": "Verification gates",
  "settings.strict.row.verification.description":
    "Track what each build produced and re-run the kept tests after every edit — a change that silently breaks something verified is caught immediately.",
  "settings.strict.row.recovery.title": "Recovery & keep-best",
  "settings.strict.row.recovery.description":
    "Snapshot the best result so far and restore it if later edits make things worse (including at the very end); undo runs of build-breaking edits automatically.",
  "settings.strict.row.editingAids.title": "Editing aids",
  "settings.strict.row.editingAids.description":
    "Show files with line numbers, reject edits that would not compile, and require line-number edits when the model keeps mis-quoting a file.",
  "settings.strict.row.budgetSteering.title": "Time-budget steering",
  "settings.strict.row.budgetSteering.description":
    "At 50% and 75% of the time budget, calmly steer the model to simplify and land an end-to-end result.",
  "settings.strict.row.attempts.title": "Parallel attempts (race)",
  "settings.strict.row.attempts.description":
    "Run several isolated attempts at the same task on separate copies of your project and keep the first one that verifiably succeeds — a lost race leaves your folder untouched. More attempts = better odds and more compute; your local hardware runs them nearly in parallel. Works for folders up to ~5000 files / 256 MB (larger ones fall back to a single attempt). Empty or 1 = off.",
  "settings.strict.row.wallMinutes.title": "Time budget (minutes)",
  "settings.strict.row.wallMinutes.description":
    "Wall-clock budget per Strict task; at exhaustion the best verified state is delivered. Empty = 45.",
  "settings.strict.row.executionTokens.title": "Execution budget (tokens)",
  "settings.strict.row.executionTokens.description":
    "How much room each working step gets to write its answer — file edits, commands, and the like. A step that runs out mid-file is wasted work, so leave headroom: one non-trivial source file already runs to 13–15k tokens. Empty = 24576.",
  "settings.strict.row.reasoningTokens.title": "Reasoning budget (tokens)",
  "settings.strict.row.reasoningTokens.description":
    "Let the model think a step through before it acts, and give that thinking its own room. Reasoning is all-or-nothing: a model cut off mid-thought returns nothing at all, so this needs to be generous — 24576 works, 8192 returns empty. Costs an extra call on the steps that plan and recover. Empty or 0 = off.",
  "settings.webSearch.title": "Web Search",
  "settings.webSearch.description":
    "Web search just works out of the box — NovaClaw searches free engines in-process, no setup. Point it at your own SearXNG for richer results, or turn a built-in engine off if it starts misbehaving.",
  "settings.webSearch.status": "Right now",
  "settings.webSearch.status.builtin": "Using NovaClaw's built-in search (DuckDuckGo + Wikipedia).",
  "settings.webSearch.status.searxng": "Using your SearXNG instance.",
  "settings.webSearch.status.airgapped": "Off — NovaClaw is in offline / airgap mode, so nothing leaves this machine.",
  "settings.webSearch.row.searxng.title": "Your SearXNG instance",
  "settings.webSearch.row.searxng.description": "A SearXNG URL to use instead of the built-in engines. Leave empty to use the built-in search.",
  "settings.webSearch.builtin.title": "Built-in engines",
  "settings.webSearch.builtin.description": "NovaClaw asks these free engines directly and merges the results. Turn one off if it starts failing.",
  "settings.webSearch.builtin.overridden": "Your SearXNG instance is handling search, so the built-in engines are off.",
  "settings.webSearch.builtin.engineHint": "Included in built-in search",
  "settings.webSearch.toast.failed": "Couldn't save web search settings",
  "settings.webSearch.throttle.title": "Traffic limits",
  "settings.webSearch.throttle.description":
    "How fast NovaClaw reads from the web. These apply to every web read — searches and articles alike. The defaults imitate a person reading, which is what keeps sites treating you as one.",
  "settings.webSearch.throttle.warning":
    "⚠️ Changing these can get you blocked. Sites judge you by your traffic, and reads come from your own connection — so a faster, heavier setting risks your IP being rate-limited or banned, for you and for anything else on your network. Leave a field empty to use its default.",
  "settings.webSearch.throttle.interval": "Delay between reads of one site",
  "settings.webSearch.throttle.interval.hint": "Milliseconds to wait before reading the same site again. Lower looks more like a bot.",
  "settings.webSearch.throttle.burst": "Reads allowed back-to-back",
  "settings.webSearch.throttle.burst.hint": "How many quick reads of one site before the delay kicks in — like opening a few tabs at once.",
  "settings.webSearch.throttle.concurrency": "Simultaneous reads per site",
  "settings.webSearch.throttle.concurrency.hint": "Keep at 1. Reading one site on several connections at once is the fastest way to get blocked.",
  "settings.webSearch.throttle.daily": "Reads per site per day",
  "settings.webSearch.throttle.daily.hint": "A daily ceiling per site, so a stuck agent can't spend all day hammering one server.",
  "settings.webSearch.throttle.sameUrl": "Same-page retry limit",
  "settings.webSearch.throttle.sameUrl.hint": "Refuse to fetch one page more times than this in a session — catches an agent stuck in a loop.",
  "settings.tools.title": "Tools",
  "settings.tools.description":
    "Ad-hoc tool recipes: a name, a one-line description the model sees in its prompt, and a manual it pulls on demand (the API shape plus a curl example). The model runs them from the shell — no MCP server to set up.",
  "settings.tools.empty": "No ad-hoc tools defined yet.",
  "settings.tools.add": "Add tool",
  "settings.tools.edit": "Edit",
  "settings.tools.delete": "Delete",
  "settings.tools.save": "Save",
  "settings.tools.cancel": "Cancel",
  "settings.tools.toast.failed": "Saving tools failed",
  "settings.tools.field.name": "name (lowercase slug, e.g. searxng)",
  "settings.tools.field.description": "One-line description (what it does; the model decides from this alone)",
  "settings.tools.field.manual": "Manual: the API shape + 1-2 curl/shell examples the model follows",
  "settings.tools.error.name": "Name must be a lowercase slug (a-z, 0-9, -, _), max 64 chars.",
  "settings.tools.error.description": "Description is required, max 300 chars.",
  "settings.tools.error.manual": "Manual is required, max 8192 chars.",
  "settings.tools.error.duplicate": "A tool with this name already exists.",
  "settings.agents.title": "Agents",
  "settings.agents.description": "Agent settings — coming soon.",
  "settings.commands.title": "Commands",
  "settings.commands.description": "Command settings will be configurable here.",
  "settings.mcp.title": "MCP",
  "settings.mcp.description": "MCP settings will be configurable here.",

  "settings.permissions.title": "Permissions",
  "settings.permissions.description": "Control what tools your agents can use by default.",
  "settings.permissions.section.tools": "Tools",
  "settings.permissions.toast.updateFailed.title": "Failed to update permissions",

  "settings.permissions.action.allow": "Allow",
  "settings.permissions.action.ask": "Ask",
  "settings.permissions.action.deny": "Deny",

  "settings.permissions.tool.read.title": "Read",
  "settings.permissions.tool.read.description": "Read a file",
  "settings.permissions.tool.edit.title": "Edit",
  "settings.permissions.tool.edit.description": "Change part of an existing file",
  "settings.permissions.tool.write.title": "Overwrite",
  "settings.permissions.tool.write.description": "Replace everything in an existing file",
  "settings.permissions.tool.create.title": "Create",
  "settings.permissions.tool.create.description": "Create a new file",
  "settings.permissions.tool.explore.title": "Explore",
  "settings.permissions.tool.explore.description": "List and search through your files",
  "settings.permissions.tool.glob.title": "Glob",
  "settings.permissions.tool.glob.description": "Match files using glob patterns",
  "settings.permissions.tool.grep.title": "Grep",
  "settings.permissions.tool.grep.description": "Search inside your files for matching text",
  "settings.permissions.tool.list.title": "List",
  "settings.permissions.tool.list.description": "List files within a directory",
  "settings.permissions.tool.bash.title": "Bash",
  "settings.permissions.tool.bash.description": "Run shell commands",
  "settings.permissions.tool.task.title": "Task",
  "settings.permissions.tool.task.description": "Start helper agents to work on part of the task",
  "settings.permissions.tool.skill.title": "Skill",
  "settings.permissions.tool.skill.description": "Load a skill by name",
  "settings.permissions.tool.todowrite.title": "Todo Write",
  "settings.permissions.tool.todowrite.description": "Update the todo list",
  "settings.permissions.tool.webfetch.title": "Web Fetch",
  "settings.permissions.tool.webfetch.description": "Fetch content from a URL",
  "settings.permissions.tool.websearch.title": "Web Search",
  "settings.permissions.tool.websearch.description": "Search the web",
  "settings.permissions.tool.external_directory.title": "External Directory",
  "settings.permissions.tool.external_directory.description": "Access files outside the project directory",
  "settings.permissions.tool.external_directory_read.title": "Read External Directory",
  "settings.permissions.tool.external_directory_read.description":
    "Read files outside the project directory (never grants writes there)",
  "settings.permissions.tool.external_directory_write.title": "Write External Directory",
  "settings.permissions.tool.external_directory_write.description":
    "Modify, create, or delete files outside the project directory",
  "settings.permissions.tool.doom_loop.title": "Doom Loop",
  "settings.permissions.tool.doom_loop.description": "Detect repeated tool calls with identical input",

  "session.gone.title": "This chat was deleted or has expired",
  "session.gone.body":
    "It may have been removed from another window or cleaned up automatically. Its tab has been closed.",
  "session.gone.action": "Back to Home",
  "session.delete.failed.title": "Couldn't delete chat",
  "session.delete.title": "Delete chat",
  "session.delete.confirm": 'Delete chat "{{name}}"?',
  "session.delete.description":
    "The whole conversation and its history are removed permanently. Files in your project folder are not touched.",
  "session.delete.button": "Delete chat",

  "workspace.new": "New workspace",
  "workspace.type.local": "local",
  "workspace.type.sandbox": "sandbox",
  "workspace.create.failed.title": "Failed to create workspace",
  "workspace.delete.failed.title": "Failed to delete workspace",
  "workspace.resetting.title": "Resetting workspace",
  "workspace.resetting.description": "This may take a minute.",
  "workspace.reset.failed.title": "Failed to reset workspace",
  "workspace.reset.success.title": "Workspace reset",
  "workspace.reset.success.description": "Workspace now matches the default branch.",
  "workspace.error.stillPreparing": "Workspace is still preparing",
  "workspace.status.checking": "Checking for unmerged changes...",
  "workspace.status.error": "Unable to verify git status.",
  "workspace.status.clean": "No unmerged changes detected.",
  "workspace.status.dirty": "This workspace has changes that haven't been merged into your main branch yet.",
  "workspace.delete.title": "Delete workspace",
  "workspace.delete.confirm": 'Delete workspace "{{name}}"?',
  "workspace.delete.button": "Delete workspace",
  "workspace.reset.title": "Reset workspace",
  "workspace.reset.confirm": 'Reset workspace "{{name}}"?',
  "workspace.reset.button": "Reset workspace",
  "workspace.reset.archived.none": "No active chats will be archived.",
  "workspace.reset.archived.one": "1 chat will be archived.",
  "workspace.reset.archived.many": "{{count}} chats will be archived.",
  "workspace.reset.note": "This will reset the workspace to match the default branch.",
}
