{
  "title": "Settings",
  "nav": {
    "appearance": "Appearance",
    "providers": "Model Providers",
    "execution": "Agent & Pipeline",
    "browser": "Browser Automation",
    "search": "Web Search",
    "storage": "Data & Storage",
    "users": "User Management",
    "remote": "Remote Access"
  },
  "appearance": {
    "title": "Appearance",
    "theme": "Theme",
    "themeDesc": "Choose a visual style for the interface",
    "language": "Language",
    "languageDesc": "Choose the display language",
    "modes": {
      "system": "System",
      "light": "Light",
      "dark": "Dark",
      "cyberpunk": "Cyberpunk",
      "mono": "Mono"
    }
  },
  "setupGuide": {
    "title": "Welcome — Configure Your LLM",
    "subtitle": "Markus needs at least one LLM provider to work. Choose a way to get started:",
    "skip": "Skip",
    "fromEnv": {
      "step": "1",
      "title": "From Environment Variables",
      "description": "Automatically detected API keys from .env or system environment.",
      "noKeysHint": "No API keys found. Set environment variables like <code>ANTHROPIC_API_KEY</code> or <code>OPENAI_API_KEY</code> and restart the server."
    },
    "fromOllama": {
      "step": "2",
      "title": "Local Ollama",
      "description": "Auto-detect a locally running Ollama service and select a model."
    },
    "fromOpenClaw": {
      "step": "3",
      "title": "From OpenClaw Config",
      "description": "Import model configs from an existing OpenClaw installation."
    },
    "manual": {
      "step": "4",
      "title": "Manual Configuration",
      "description": "Edit <code>~/.markus/markus.json</code> directly, then restart the server."
    },
    "browserExtension": {
      "step": "5",
      "title": "Install Browser Automation Extension",
      "description": "Let AI agents control Chrome to browse, test apps, and inspect pages — no permission dialog each time.",
      "notChrome": "Your current browser is not Chrome. Open Markus in Chrome to install the extension.",
      "alreadyConnected": "Extension is already connected.",
      "downloadBtn": "Download Extension",
      "openChromeBtn": "Open Extensions Page",
      "loadHint": "After unzipping, go to Chrome Extensions page → enable \"Developer mode\" → \"Load unpacked\" → select the unzipped folder"
    },
    "applyProviders": "Apply {{count}} Provider(s)",
    "foundPrefix": "Found:"
  },
  "systemStatus": {
    "title": "System Status",
    "status": "Status",
    "healthy": "Healthy",
    "version": "Version",
    "activeAgents": "Active Agents"
  },
  "defaultProvider": {
    "title": "Default LLM Provider",
    "primaryProvider": "Primary Provider",
    "primaryProviderDesc": "Used for all agent interactions unless overridden",
    "noProviders": "No providers configured",
    "updated": "Default provider updated to {{name}}",
    "autoFallback": "Auto-switch Model",
    "autoFallbackDesc": "When enabled, automatically try other providers/models if the primary one fails. When disabled, only use the selected model — errors will not trigger fallback."
  },
  "modelProviders": {
    "title": "Model Providers & Pricing",
    "disabled": "disabled",
    "notConfigured": "Click to set up",
    "addProvider": "+ Add Provider",
    "addNewProvider": "Add New Provider",
    "providerName": "Provider Name",
    "providerNameHint": "Use anthropic, openai, google, ollama for first-party; any other name uses OpenAI-compatible API",
    "apiKey": "API Key",
    "apiKeyPlaceholder": "Leave blank to keep current",
    "baseUrl": "Base URL (optional)",
    "baseUrlLabel": "Base URL",
    "defaultModel": "Default Model",
    "contextWindow": "Context Window",
    "maxOutputTokens": "Max Output Tokens",
    "inputCost": "$/1M Input",
    "outputCost": "$/1M Output",
    "editProvider": "Edit Provider",
    "deleteConfirm": "Delete provider \"{{name}}\"?",
    "providerAdded": "Provider {{name}} added",
    "notConfiguredHint": "Not configured. Use the \"Add Provider\" button below, or set API keys in environment variables.",
    "quickSetupHint": "Enter your API Key to start using this provider immediately.",
    "quickSetupPlaceholder": "Paste your API Key here...",
    "quickSetupSubmit": "Activate",
    "quickSetupSaving": "Activating...",
    "quickSetupSuccess": "{{name}} is now ready to use!",
    "pricingTitle": "Pricing (per 1M tokens)",
    "input": "Input",
    "output": "Output",
    "cacheRead": "Cache Read",
    "cacheWrite": "Cache Write",
    "availableModels": "Available Models",
    "addModel": "+ Add Model",
    "modelId": "Model ID",
    "displayName": "Display Name",
    "reasoning": "reasoning",
    "vision": "vision",
    "custom": "custom",
    "use": "Use",
    "switching": "Switching...",
    "model": "Model",
    "ctxTokens": "{{size}}K ctx",
    "costPerMillion": "${{input}}/{{output}} per 1M",
    "badgeDefault": "default",
    "badgeOAuth": "OAuth",
    "clickToDisable": "Click to disable",
    "clickToEnable": "Click to enable",
    "maxOutput": "Max Output",
    "kTokens": "{{k}}K tokens",
    "notApplicable": "N/A",
    "baseUrlDisplayDefault": "Default",
    "active": "active",
    "deleteCustomModelTitle": "Delete custom model",
    "costPair": "${{input}}/{{output}}",
    "adding": "Adding...",
    "costPerMillionIn": "$/1M in:",
    "costPerMillionOut": "out:",
    "placeholderContextTokens": "Context (tokens)",
    "placeholderProviderName": "e.g. deepseek, openrouter, my-provider",
    "placeholderApiKeySk": "sk-...",
    "placeholderBaseUrl": "https://api.example.com/v1",
    "placeholderDefaultModel": "e.g. deepseek-chat, gpt-4o",
    "placeholderContextExample": "e.g. 128000",
    "placeholderMaxOutputExample": "e.g. 16384",
    "placeholderCostInput": "e.g. 1",
    "placeholderCostOutput": "e.g. 5",
    "addProviderSubmit": "Add Provider",
    "saveFailed": "Save failed",
    "failedToAdd": "Failed to add",
    "test": "Test",
    "testing": "Testing...",
    "testOk": "OK ({{ms}}ms)",
    "testFailed": "Failed",
    "testFailedCode": "Error {{code}}",
    "testSuccess": "Connected in {{ms}}ms — reply: {{reply}}"
  },
  "oauth": {
    "loginFailed": "Login failed",
    "networkErrorDuringLogin": "Network error during OAuth login",
    "callbackFailed": "Callback failed"
  },
  "autoDetect": {
    "title": "Auto-detect & Import",
    "description": "Discover LLM providers from environment variables, local Ollama service, or existing configurations."
  },
  "ollama": {
    "title": "Local Ollama",
    "description": "Auto-detect a locally running Ollama service and configure it as a model provider. No API key required.",
    "detect": "Detect Ollama",
    "detecting": "Detecting...",
    "foundModels": "Found {{count}} model(s) at {{url}}",
    "notRunning": "Ollama is not running locally. Start Ollama first, then click detect.",
    "detectFailed": "Failed to detect Ollama service",
    "useModel": "Use {{model}}",
    "configured": "Ollama configured with model {{model}}",
    "applyFailed": "Failed to configure Ollama",
    "switchModel": "Switch Model"
  },
  "envConfig": {
    "title": "Environment Variable Configuration",
    "description": "Detect model API keys from environment variables and write them to the config file.",
    "refreshEnv": "Refresh Environment Variables",
    "detectedProviders": "Detected Providers — select to apply:",
    "noKeysFound": "No model API keys found in environment variables",
    "detectionFailed": "Detection failed",
    "failedToDetect": "Failed to detect environment variables",
    "applyToConfig": "Apply {{count}} Provider(s) to Config",
    "selectAtLeastOne": "Select at least one provider to apply",
    "applyFailed": "Apply failed (HTTP {{status}})",
    "failedToApply": "Failed to apply environment configs",
    "detectionFailedHttp": "Detection failed (HTTP {{status}})",
    "keyLabel": "Key:",
    "modelLabel": "Model:",
    "urlLabel": "URL:",
    "llmTimeout": "LLM Timeout: {{ms}}ms (from LLM_TIMEOUT_MS)"
  },
  "openClaw": {
    "title": "Import from OpenClaw",
    "description": "Detect and import LLM configurations from an existing OpenClaw installation.",
    "detect": "Detect OpenClaw Config",
    "detectShort": "Detect OpenClaw",
    "detectFailed": "Detection failed",
    "foundAt": "Found OpenClaw config at:",
    "providersModels": "{{providers}} providers, {{models}} models",
    "importConfigs": "Import Model Configs",
    "importFailed": "Import failed",
    "importedFrom": "Imported {{count}} model configs from OpenClaw",
    "notFound": "No OpenClaw config found.",
    "modelProvidersFound": "{{count}} model providers found:",
    "modelsCountSuffix": "{{count}} models",
    "withBaseUrl": " ({{url}})",
    "channelsPrefix": "Channels:"
  },
  "agentExecution": {
    "title": "Agent Execution",
    "maxToolIterations": "Max Tool Iterations",
    "maxToolIterationsDesc": "Safety cap on tool call loops per agent turn (0 = unlimited, applies to all agents and subagents)",
    "saved": "Saved",
    "failedToSave": "Failed to save"
  },
  "cognitive": {
    "title": "Cognitive Preparation Pipeline",
    "description": "Before each main LLM call, the agent runs a lightweight appraisal to assess the stimulus and prepare persona-aware context. This can improve response relevance at the cost of a small extra LLM call (~500ms).",
    "enabled": "Enable CPP",
    "enabledDesc": "When enabled, agents run a cognitive appraisal before responding",
    "maxDepth": "Max Cognitive Depth",
    "maxDepthDesc": "Controls how much preparation is done before each response",
    "depthD1": "Appraisal only",
    "depthD2": "Appraisal + Retrieval + Reflection",
    "depthD3": "Full pipeline + post-evaluation",
    "saved": "Saved",
    "failedToSave": "Failed to save"
  },
  "searchApi": {
    "title": "Web Search API Keys",
    "description": "Configure search API keys so agents can search the web for real-time information. Priority: Serper (Google) > Brave > Bocha > DuckDuckGo (free fallback).",
    "serper": "Serper (Google)",
    "serperHint": "Google search results via serper.dev",
    "brave": "Brave Search",
    "braveHint": "Privacy-focused search via brave.com",
    "bocha": "Bocha (博查)",
    "bochaHint": "AI-optimized search for Chinese & global content via bochaai.com",
    "configured": "Configured",
    "notConfigured": "Not configured",
    "apiKeyPlaceholder": "Paste API Key here...",
    "saved": "Search API keys saved",
    "failedToSave": "Failed to save search API keys",
    "envDetected": "from env",
    "freeBackend": "DuckDuckGo is always available as a free fallback (no API key needed)."
  },
  "browserAutomation": {
    "title": "Browser Automation",
    "description": "Settings for the Chrome DevTools browser skill. Agents use Chrome to browse, test web apps, and inspect pages.",
    "bringToFront": "Bring to Foreground",
    "bringToFrontDesc": "When enabled, Chrome tabs will be brought to the foreground when agents navigate. When disabled (default), agents work silently in the background without stealing focus.",
    "autoCloseTabs": "Auto-close Tabs",
    "autoCloseTabsDesc": "Automatically close agent-owned browser tabs when the agent task completes or the agent is removed.",
    "remoteDebuggingPort": "Remote Debugging Port",
    "remoteDebuggingPortDesc": "Set a persistent debugging port (e.g. 9222) to avoid Chrome's permission dialog every time an agent connects.",
    "remoteDebuggingPortDescLead": "Set a persistent debugging port (e.g. 9222) to avoid Chrome's permission dialog every time an agent connects. Start Chrome with",
    "remoteDebuggingPortDescTail": "then set the same port here. Set to 0 to use auto-connect (requires manual permission approval).",
    "tabsForeground": "Tabs will be brought to foreground",
    "tabsBackground": "Tabs will stay in background",
    "usingPort": "Using persistent connection on port {{port}} (no more permission dialogs)",
    "usingAutoConnect": "Using auto-connect mode (permission dialog required on each connection)",
    "autoClickAllowDialog": "Auto-Allow Chrome Debugging Dialog",
    "autoClickAllowDialogDesc": "Chrome shows an \"Allow remote debugging?\" dialog each time Markus connects. When enabled, Markus auto-clicks \"Allow\" via OS accessibility APIs.",
    "autoClickAllowDialogMacNote": "macOS: Grant Accessibility permission in System Settings > Privacy & Security > Accessibility for the app running Markus (Markus.app / Terminal / iTerm).",
    "autoClickAllowDialogWinNote": "Windows: No additional permissions needed. Uses built-in UI Automation.",
    "autoClickAllowDialogLinuxNote": "Linux: Not yet supported. Use Remote Debugging Port (above) as an alternative.",
    "autoClickAllowDialogSupported": "Supported on this platform",
    "autoClickAllowDialogUnsupported": "Not supported on this platform",
    "autoClickTest": "Test",
    "autoClickTesting": "Testing...",
    "autoClickTestSuccess": "Auto-click verified! Successfully connected to Chrome and loaded a test page ({{title}}).",
    "autoClickTestNoPermission": "Accessibility permission not granted. The system settings page has been opened — please add this app to the list.",
    "autoClickTestChromeNotRunning": "Chrome is not running. Please start Chrome first.",
    "autoClickTestUnsupported": "Auto-click is not supported on this platform. Use Remote Debugging Port instead.",
    "autoClickTestError": "Test failed: {{error}}",
    "modeExtension": "Chrome Extension (Active)",
    "modeExtensionDesc": "Browser tools route through the extension — no debugging dialog, no extra permissions, works when screen is locked.",
    "modeDebuggingPort": "Remote Debugging Port :{{port}} (Active)",
    "modeDebuggingPortDesc": "Connected via persistent debugging port — no permission dialog on each connection.",
    "modeAutoClick": "Auto-Connect + Auto-Click (Active)",
    "modeAutoClickDesc": "Using chrome-devtools-mcp with OS auto-click to handle the debugging dialog. May not work when screen is locked.",
    "modeManual": "Auto-Connect (Manual Approval Required)",
    "modeManualDesc": "Chrome will show a permission dialog each time an agent connects. You must click Allow manually.",
    "modeRecommended": "recommended",
    "generalSettings": "General",
    "fallbackModes": "Connection Mode (Fallback)",
    "extensionStatus": "Chrome Extension",
    "extensionStatusDesc": "Enables browser automation without the debugging dialog. No Accessibility permissions needed, works even when screen is locked.",
    "extensionConnected": "Connected",
    "extensionDisconnected": "Not Connected",
    "extensionActiveNote": "Extension active — browser tools route through extension (no debugging dialog)",
    "extensionSetupTitle": "Install Chrome Extension",
    "extensionStep1": "Download & Unzip",
    "extensionStep1Desc": "Download the zip and extract it to any location (e.g. Desktop)",
    "extensionStep1Btn": "Download markus-browser-extension.zip",
    "extensionStep1Downloading": "Preparing download...",
    "extensionStep2": "Open Chrome Extensions",
    "extensionStep2Desc": "Open the extensions management page in Chrome",
    "extensionStep2Btn": "Open chrome://extensions",
    "extensionStep3": "Load Extension",
    "extensionStep3Desc": "Enable \"Developer mode\" (top right toggle), click \"Load unpacked\", and select the folder extracted in step 1",
    "extensionDownloadError": "Failed to download extension",
    "extensionOpenError": "Failed to open Chrome extensions page"
  },
  "dataStorage": {
    "title": "Data & Storage",
    "scanning": "Scanning storage...",
    "openInFinder": "Open in Finder",
    "storageBreakdown": "Storage Breakdown",
    "agentStorage": "Agent Storage ({{count}})",
    "openFolder": "Open folder",
    "orphanedDirectories": "Orphaned Directories",
    "orphanedDesc": "These directories have no matching database record and were likely left behind when agents or teams were deleted.",
    "orphanedTotal": "Total: {{size}} across {{count}} director(ies).",
    "cleanSelected": "Clean Selected ({{size}})",
    "cleanAll": "Clean All ({{size}})",
    "cleaning": "Cleaning...",
    "cleaned": "Cleaned {{count}} dir(s), freed {{size}}",
    "bytesZero": "0 B",
    "unitB": "B",
    "unitKB": "KB",
    "unitMB": "MB",
    "unitGB": "GB",
    "teamKind": "team",
    "selectedWithSize": "{{count}} selected ({{size}})",
    "cleanupFailed": "Cleanup failed",
    "cleanedWithFailureNote": "{{base}} ({{count}} failed)"
  },
  "oauthConnected": "Connected to {{provider}} via OAuth",
  "authProfileDeleted": "Auth profile deleted",
  "browserOpened": "Browser opened for authorization. Complete the login in the browser window...",
  "remoteAccess": {
    "title": "Remote Access",
    "description": "Access this Markus instance from your phone or any device via WebRTC P2P connection through Markus Hub.",
    "loginRequired": "Sign in to Markus Hub to enable remote access.",
    "signIn": "Sign In",
    "signedInAs": "Signed in as",
    "enabled": "Remote access enabled",
    "disabled": "Remote access disabled",
    "connecting": "Connecting to signal server...",
    "registering": "Registering with Hub...",
    "connected": "Connected",
    "disconnected": "Disconnected",
    "peerCount_one": "{{count}} peer",
    "peerCount_other": "{{count}} peers",
    "url": "Remote URL",
    "copy": "Copy",
    "copied": "Copied!",
    "qrCode": "QR Code",
    "scanQr": "Scan with your phone camera to connect",
    "enableFailed": "Failed to enable remote access",
    "disableFailed": "Failed to disable remote access",
    "connectedPeers": "Connected Peers",
    "connectedSince": "Connected since {{time}}",
    "peerConnecting": "Connecting"
  },
  "userManagement": {
    "title": "User Management",
    "name": "Name",
    "email": "Email",
    "role": "Role",
    "actions": "Actions",
    "noUsers": "No users found",
    "editUser": "Edit",
    "deleteUser": "Delete",
    "resetPassword": "Reset Password",
    "save": "Save",
    "cancel": "Cancel",
    "confirmDelete": "Are you sure you want to remove this user? This action cannot be undone.",
    "confirmDeleteTitle": "Remove User",
    "newPassword": "New Password",
    "confirmReset": "Reset",
    "resetSuccess": "Password has been reset",
    "updateSuccess": "User updated",
    "deleteSuccess": "User removed",
    "error": "Operation failed",
    "cannotDeleteSelf": "You cannot delete your own account",
    "cannotDeleteOwner": "Cannot remove the primary owner",
    "inviteLink": "Invite",
    "inviteLinkGenerated": "Invite link generated — copy and send to the user",
    "copyInviteLink": "Send this link to the user so they can set up their account:",
    "linkCopied": "Link copied to clipboard",
    "copy": "Copy",
    "roles": {
      "owner": "Owner",
      "admin": "Admin",
      "member": "Member",
      "guest": "Guest"
    }
  }
}
