{
  "app": {
    "title": "CC Switch",
    "description": "All-in-One Assistant for Claude Code, Codex & Gemini CLI"
  },
  "common": {
    "add": "Add",
    "edit": "Edit",
    "delete": "Delete",
    "save": "Save",
    "saving": "Saving...",
    "cancel": "Cancel",
    "confirm": "Confirm",
    "close": "Close",
    "done": "Done",
    "settings": "Settings",
    "about": "About",
    "version": "Version",
    "loading": "Loading...",
    "notInstalled": "Not installed",
    "success": "Success",
    "error": "Error",
    "unknown": "Unknown",
    "enterValidValue": "Please enter a valid value",
    "clear": "Clear",
    "format": "Format",
    "formatSuccess": "Formatted successfully",
    "formatError": "Format failed: {{error}}",
    "copy": "Copy",
    "view": "View",
    "back": "Back",
    "refresh": "Refresh",
    "refreshing": "Refreshing...",
    "import": "Import",
    "all": "All",
    "search": "Search",
    "reset": "Reset",
    "actions": "Actions",
    "deleting": "Deleting...",
    "auto": "Auto",
    "enabled": "Enabled",
    "notSet": "Not Set"
  },
  "firstRunNotice": {
    "title": "Welcome to CC Switch",
    "bodyDefault": "CC Switch lets you switch between multiple Claude Code / Codex / Gemini CLI providers with a single click. If you already had these tools configured, CC Switch has saved your existing setup as a provider named “default” so none of your previous configuration is lost.",
    "bodyOfficial": "An “Official” preset is also included in the list — click it any time you want to switch back to the official default. CC Switch automatically backs up your current config to “default” before switching, so you can move back and forth freely. That's how CC Switch works 😊",
    "confirm": "Got it"
  },
  "apiKeyInput": {
    "placeholder": "Enter API Key",
    "show": "Show API Key",
    "hide": "Hide API Key"
  },
  "jsonEditor": {
    "mustBeObject": "Configuration must be a JSON object, not an array or other type",
    "invalidJson": "Invalid JSON format"
  },
  "commonConfig": {
    "guideTitle": "What is a Common Config Snippet?",
    "guidePurpose": "It lets you share non-sensitive settings (plugins, environment variables, etc.) across different providers. These settings won't be lost when you switch providers.",
    "guideUsage": "How to use: ① Click \"Extract from Editor\" to save the common parts  ② Check \"Apply Common Config\" when creating a new provider",
    "guideReExtract": "If you've newly installed plugins or hooks, re-extract the common config so they sync to other providers.",
    "guideReassurance": "Don't worry — your original configuration is safely stored in the default provider and won't be lost.",
    "emptyTitle": "No common config snippet yet",
    "emptyHint": "Click \"Extract from Editor\" below to extract reusable parts from your current configuration"
  },
  "claudeConfig": {
    "configLabel": "Claude Code settings.json (JSON) *",
    "writeCommonConfig": "Apply Common Config",
    "editCommonConfig": "Edit Common Config",
    "editCommonConfigTitle": "Edit Common Config Snippet",
    "commonConfigHint": "This snippet will be merged into settings.json when 'Apply Common Config' is checked",
    "fullSettingsHint": "Full Claude Code settings.json content",
    "extractFromCurrent": "Extract from Editor",
    "extractNoCommonConfig": "No common config available to extract from editor",
    "extractFailed": "Extract failed: {{error}}",
    "saveFailed": "Save failed: {{error}}",
    "hideAttribution": "Hide AI Attribution",
    "enableTeammates": "Teammates Mode",
    "enableToolSearch": "Enable Tool Search",
    "effortMax": "Max Effort Thinking",
    "disableAutoUpgrade": "Disable Auto-Upgrade"
  },
  "header": {
    "viewOnGithub": "View on GitHub",
    "toggleDarkMode": "Switch to Dark Mode",
    "toggleLightMode": "Switch to Light Mode",
    "addProvider": "Add Provider",
    "switchToChinese": "Switch to Chinese",
    "switchToEnglish": "Switch to English",
    "enterEditMode": "Enter Edit Mode",
    "exitEditMode": "Exit Edit Mode",
    "windowMinimize": "Minimize window",
    "windowMaximize": "Maximize window",
    "windowRestore": "Restore window",
    "windowClose": "Close window"
  },
  "provider": {
    "connectivityCheck": "Connectivity check",
    "tabProvider": "Provider",
    "tabUniversal": "Universal",
    "noProviders": "No providers added yet",
    "noProvidersDescription": "If you already have a config, click \"Import Current Config\" — all data will be safely saved in a default provider",
    "noProvidersDescriptionSnippet": "Settings other than API key and endpoint (e.g. plugins) will be saved to a common config snippet for sharing across providers",
    "importCurrent": "Import Current Config",
    "importFromClaude": "Import existing providers from Claude Code",
    "importCurrentDescription": "Import current live config as default provider",
    "currentlyUsing": "Currently Using",
    "enable": "Enable",
    "inUse": "In Use",
    "blockedByProxyHint": "Can't switch to an official provider while proxy takeover is active",
    "editProvider": "Edit Provider",
    "editProviderHint": "Configuration will be applied to the current provider immediately after update.",
    "deleteProvider": "Delete Provider",
    "addNewProvider": "Add New Provider",
    "addFooterHint": "💡 After choosing a preset, fill in the fields below (e.g. API Key)",
    "addClaudeProvider": "Add Claude Code Provider",
    "addCodexProvider": "Add Codex Provider",
    "addGeminiProvider": "Add Gemini Provider",
    "addOpenCodeProvider": "Add OpenCode Provider",
    "addToConfig": "Add",
    "removeFromConfig": "Remove",
    "setAsDefault": "Set Default",
    "isDefault": "Current Default",
    "inConfig": "Added",
    "addProviderHint": "Fill in the information to quickly switch providers in the list.",
    "editClaudeProvider": "Edit Claude Code Provider",
    "editCodexProvider": "Edit Codex Provider",
    "configError": "Configuration Error",
    "notConfigured": "Not configured for official website",
    "applyToClaudePlugin": "Apply to Claude plugin",
    "removeFromClaudePlugin": "Remove from Claude plugin",
    "dragToReorder": "Drag to reorder",
    "dragHandle": "Drag to reorder",
    "searchPlaceholder": "Search name, notes, or URL...",
    "searchAriaLabel": "Search providers",
    "searchScopeHint": "Matches provider name, notes, and URL.",
    "searchCloseHint": "Press Esc to close",
    "searchCloseAriaLabel": "Close provider search",
    "noSearchResults": "No providers match your search.",
    "duplicate": "Duplicate",
    "sortUpdateFailed": "Failed to update sort order",
    "configureUsage": "Configure usage query",
    "officialPartner": "Official Partner",
    "managedByHermes": "Hermes Managed",
    "managedByHermesHint": "Defined in Hermes' providers: dict. Edit or remove it via Hermes Web UI.",
    "openTerminal": "Open Terminal",
    "terminalOpened": "Terminal opened",
    "terminalOpenFailed": "Failed to open terminal",
    "name": "Provider Name",
    "namePlaceholder": "e.g., Claude Official",
    "websiteUrl": "Website URL",
    "notes": "Notes",
    "notesPlaceholder": "e.g., Company dedicated account",
    "configJson": "Config JSON",
    "writeCommonConfig": "Apply Common Config",
    "editCommonConfigButton": "Edit common config",
    "configJsonHint": "Please fill in complete Claude Code configuration",
    "editCommonConfigTitle": "Edit common config snippet",
    "editCommonConfigHint": "Common config snippet will be merged into all providers that enable it",
    "addProvider": "Add Provider",
    "sortUpdated": "Sort order updated",
    "usageSaved": "Usage query configuration saved",
    "usageSaveFailed": "Failed to save usage query configuration",
    "geminiConfig": "Gemini Configuration",
    "geminiConfigHint": "Use .env format to configure Gemini",
    "form": {
      "gemini": {
        "model": "Model",
        "oauthTitle": "OAuth Authentication Mode",
        "oauthHint": "Google official uses OAuth personal authentication, no need to fill in API Key. The browser will automatically open for login on first use.",
        "apiKeyPlaceholder": "Enter Gemini API Key"
      }
    },
    "duplicateLiveIdsLoadFailed": "Failed to read provider identifiers from config, please fix the config and try again"
  },
  "claudeCode": {
    "needsRouting": "Needs Routing",
    "noRoutingSupport": "No Routing Support"
  },
  "codex": {
    "needsRouting": "Needs Routing",
    "noRoutingSupport": "No Routing Support",
    "officialRouting": "Official Account Routing",
    "nativeLogin": "Codex Sign-in"
  },
  "claudeDesktop": {
    "officialNotice": "Claude Desktop official providers use the built-in 1P sign-in. No API key or endpoint URL is required.",
    "mode": "Model handling",
    "modeDirect": "Direct",
    "modeProxy": "Requires routing",
    "modelMappingToggle": "Needs model mapping",
    "modelMappingOffHint": "Direct mode works only when the provider accepts Claude Desktop's three role IDs (claude-sonnet-* / claude-opus-* / claude-haiku-*); for any other model name (including legacy IDs like claude-3-5-sonnet-…), enable this switch to use mapping.",
    "modelMappingOnHint": "Claude Desktop only accepts the three role IDs claude-sonnet-* / claude-opus-* / claude-haiku-*. When enabled, CC Switch maps these three roles to your provider's actual models and keeps local routing running while in use.",
    "routeMapTitle": "Model mapping",
    "routeMapHint": "Fill in the actual request model for each of the Sonnet, Opus, and Haiku tiers. Use the menu display name for branded models such as DeepSeek or Kimi. Any tier left blank inherits the Sonnet tier's model (or the first tier you filled in), so the Haiku that sub-agents call is always available.",
    "routeModelLabel": "Model role",
    "routeRoleSonnet": "Sonnet",
    "routeRoleOpus": "Opus",
    "routeRoleFable": "Fable",
    "routeRoleHaiku": "Haiku",
    "labelOverrideLabel": "Menu display name",
    "upstreamModelLabel": "Requested model",
    "supports1mLabel": "Declare 1M",
    "supports1mShort": "1M",
    "directModelListTitle": "Manually specify Claude Desktop models (advanced, optional)",
    "directModelListCollapsedHint": "Native Claude model providers usually do not need this. Claude Desktop will fetch /v1/models automatically.",
    "directModelListHint": "Only fill this when the provider's /v1/models is unavailable or does not return Claude Desktop-recognized Sonnet / Opus / Haiku model IDs. Checking 1M declares 1M context support to Claude Desktop.",
    "directModelInvalid": "Direct models must use Claude Desktop-recognized Sonnet / Opus / Haiku model IDs",
    "addModel": "Add model",
    "addRoute": "Add model",
    "routeInvalid": "Choose a model role and enter the requested model",
    "routesRequired": "At least one model mapping is required",
    "statusTitle": "Claude Desktop configuration needs attention",
    "statusUnsupported": "This platform does not support writing Claude Desktop 3P configuration yet.",
    "statusStaleRawModels": "The Claude Desktop profile contains model IDs outside the Sonnet / Opus / Haiku role families. Newer Claude Desktop versions may reject it; switch to the current provider again to repair it.",
    "statusMissingRouteMappings": "The current provider has model mapping enabled but no valid routes. Edit the provider and add at least one mapping.",
    "statusGatewayTokenMissing": "The local routing token has not been generated yet. Switching to this provider again will write a new local token.",
    "statusBaseUrlMismatch": "The Claude Desktop profile points to a different URL than the current provider. Current: {{actual}}; expected: {{expected}}. Switch to the current provider again to repair it.",
    "route": {
      "tooltip": {
        "active": "Claude Desktop local routing is running - {{address}}:{{port}}",
        "inactive": "Turn on Claude Desktop local routing for providers that need model mapping or format conversion. Configured address: {{address}}:{{port}}"
      },
      "stopBlockedByTakeover": "Another app is using proxy takeover. Please disable that app's takeover in settings before stopping local routing."
    }
  },
  "notifications": {
    "providerAdded": "Provider added",
    "providerSaved": "Provider configuration saved",
    "providerDeleted": "Provider deleted successfully",
    "switchSuccess": "Switch successful!",
    "codexRestartRequired": "Switched successfully. Restart the client to apply changes.",
    "grokBuildRestartRequired": "Switched successfully. Restart Grok Build to apply changes.",
    "claudeDesktopRestartRequired": "Switched successfully. Restart Claude Desktop to apply changes.",
    "claudeDesktopProxyRestartRequired": "Switched successfully. Keep CC Switch running and restart Claude Desktop to apply changes.",
    "addToConfigSuccess": "Added to config",
    "removeFromConfigSuccess": "Removed from config",
    "switchFailedTitle": "Switch failed",
    "switchFailed": "Switch failed: {{error}}",
    "autoImported": "Default provider created from existing configuration",
    "addFailed": "Failed to add provider: {{error}}",
    "saveFailed": "Save failed: {{error}}",
    "saveFailedGeneric": "Save failed, please try again",
    "appliedToClaudePlugin": "Applied to Claude plugin",
    "removedFromClaudePlugin": "Removed from Claude plugin",
    "syncClaudePluginFailed": "Sync Claude plugin failed",
    "skipClaudeOnboardingFailed": "Failed to skip Claude Code first-run confirmation",
    "clearClaudeOnboardingSkipFailed": "Failed to restore Claude Code first-run confirmation",
    "updateSuccess": "Provider updated successfully",
    "updateFailed": "Failed to update provider: {{error}}",
    "deleteSuccess": "Provider deleted",
    "deleteFailed": "Failed to delete provider: {{error}}",
    "settingsSaved": "Settings saved",
    "settingsSaveFailed": "Failed to save settings: {{error}}",
    "proxyRequiredForSwitch": "This provider {{reason}}, requires the routing service to work properly. Start routing first.",
    "proxyReasonCopilot": "uses GitHub Copilot as a Claude provider",
    "proxyReasonOpenAIChat": "uses OpenAI Chat API format",
    "proxyReasonOpenAIResponses": "uses OpenAI Responses API format",
    "proxyReasonAnthropicMessages": "uses Anthropic Messages API format",
    "proxyReasonFullUrl": "has full URL connection mode enabled",
    "proxyReasonManagedOAuth": "uses managed OAuth login (token injected by local routing)",
    "proxyReasonRoutingRequired": "requires local routing to process requests",
    "openAIFormatHint": "This provider uses OpenAI-compatible format and requires the routing service to be enabled",
    "copilotProxyHint": "GitHub Copilot as a Claude provider always requires local routing; routing automatically selects Chat Completions or Responses based on the current model.",
    "openLinkFailed": "Failed to open link",
    "openclawModelsRegistered": "Models have been registered to /model list",
    "openclawDefaultModelSet": "Set as default model",
    "openclawDefaultModelSetFailed": "Failed to set default model",
    "openclawNoModels": "No models configured",
    "backfillWarning": "Switched successfully, but failed to save changes back to the previous provider",
    "windowControlFailed": "Window control failed: {{error}}",
    "officialBlockedByProxy": "Cannot switch to official provider while local routing is active. Using routing with official APIs may cause account bans.",
    "proxyOfficialWarning": "Current provider {{name}} is official. Consider switching to a third-party provider before using local routing.",
    "proxyReasonClaudeDesktop": "Using Claude Desktop local routing mode"
  },
  "confirm": {
    "deleteProvider": "Delete Provider",
    "deleteProviderMessage": "Are you sure you want to delete provider \"{{name}}\"? This action cannot be undone.",
    "removeProvider": "Remove Provider",
    "removeProviderMessage": "Are you sure you want to remove provider \"{{name}}\" from the configuration?\n\nAfter removal, this provider will no longer be active, but the configuration data will be retained in CC Switch. You can re-add it at any time.",
    "proxy": {
      "title": "Enable Local Routing",
      "message": "Local routing is an advanced feature. Please make sure you understand how it works before enabling.\n\nWe recommend consulting the relevant documentation or your provider for proper configuration.",
      "confirm": "I understand, enable"
    },
    "failover": {
      "title": "Enable Failover",
      "message": "Failover is an advanced feature. Please make sure you understand how it works before enabling.\n\nWe recommend configuring provider priorities in the failover queue first.",
      "confirm": "I understand, enable"
    },
    "unifyCodexHistory": {
      "title": "Unified Codex session history",
      "message": "When enabled, the official subscription and third-party providers share one session history list. Note: resuming an old session across providers may fail because its encrypted_content reasoning cannot be decrypted by another backend.\n\nYou can also migrate your existing official session history into the shared list (originals are backed up to ~/.cc-switch/backups first and can be restored when you turn this off).",
      "migrateExisting": "Also migrate existing official session history",
      "confirm": "I understand, enable"
    },
    "unifyCodexHistoryOff": {
      "title": "Turn off unified session history",
      "message": "After turning this off, the official subscription and third-party providers return to separate history lists. Sessions created while it was on cannot be attributed to a provider, so they stay in the third-party history and the official subscription will not see them.",
      "restoreBackup": "Restore the official sessions migrated at enable time back to the official history (exact restore from backup)",
      "confirm": "Turn off"
    },
    "usage": {
      "title": "Configure Usage Query",
      "message": "Usage query requires a custom script or API parameters. Please make sure you have obtained the necessary information from your provider.\n\nIf unsure how to configure, please consult your provider's documentation first.",
      "confirm": "I understand, configure"
    },
    "autoSync": {
      "title": "Enable Auto Sync",
      "message": "When auto sync is enabled, every database change will be automatically uploaded to the WebDAV server.\n\nThis may result in significant network traffic. Please ensure your network and WebDAV service can handle frequent data transfers.",
      "confirm": "I understand, enable"
    },
    "commonConfig": {
      "title": "About Common Config",
      "message": "The \"Common Config Snippet\" lets you share plugins, environment variables, and other settings across different providers — so they won't be lost when you switch.\n\nHow to use:\n① Edit a provider → click \"Edit Common Config\" → \"Extract from Editor\"\n② When creating a new provider, check \"Apply Common Config\" (enabled by default)\n\nIf you've newly installed plugins or hooks, re-extract the common config to keep them in sync.",
      "confirm": "Got it"
    }
  },
  "settings": {
    "title": "Settings",
    "general": "General",
    "tabGeneral": "General",
    "tabAuth": "Auth",
    "tabAdvanced": "Advanced",
    "tabProxy": "Routing",
    "authCenter": {
      "title": "OAuth Authentication Center",
      "description": "Use your other subscriptions in Claude Code — please be mindful of compliance risks.",
      "beta": "Beta",
      "copilotDescription": "Manage GitHub Copilot accounts",
      "codexOauthDescription": "Manage ChatGPT accounts",
      "xaiOauthDescription": "Manage xAI / Grok accounts"
    },
    "advanced": {
      "configDir": {
        "title": "Configuration Directory",
        "description": "Manage storage paths for Claude, Codex and Gemini configurations"
      },
      "proxy": {
        "title": "Local Routing",
        "description": "Control routing service toggle, view status and port info",
        "enableFeature": "Show Routing Toggle on Main Page",
        "enableFeatureDescription": "When enabled, the routing and failover toggles will appear at the top of the main page",
        "enableFailoverToggle": "Show Failover Toggle on Main Page",
        "enableFailoverToggleDescription": "When enabled, the failover toggle will appear independently at the top of the main page",
        "running": "Running",
        "stopped": "Stopped"
      },
      "connectivityCheck": {
        "title": "Connectivity Check Settings",
        "description": "Configure timeout, retries, and the slow-response threshold for provider reachability checks"
      },
      "failover": {
        "title": "Auto Failover",
        "description": "Configure failover queue and circuit breaker strategy"
      },
      "pricing": {
        "title": "Cost Pricing",
        "description": "Manage token pricing rules for each model"
      },
      "globalProxy": {
        "title": "Global Outbound Proxy",
        "description": "Configure proxy for CC Switch to access external APIs"
      },
      "data": {
        "title": "Data Management",
        "description": "Import and export local configuration data"
      },
      "backup": {
        "title": "Backup & Restore",
        "description": "Manage automatic backups, view and restore database snapshots"
      },
      "cloudSync": {
        "title": "Cloud Sync",
        "description": "Sync data across devices via WebDAV"
      },
      "rectifier": {
        "title": "Rectifier",
        "description": "Automatically fix API request compatibility issues",
        "enabled": "Enable Rectifier",
        "enabledDescription": "Master switch, all rectification features will be disabled when turned off",
        "requestGroup": "Request Rectification",
        "responseGroup": "Response Rectification",
        "thinkingSignature": "Thinking Signature Rectification",
        "thinkingSignatureDescription": "When an Anthropic-type provider returns thinking signature incompatibility or illegal request errors, automatically removes incompatible thinking-related blocks and retries once with the same provider",
        "thinkingBudget": "Thinking Budget Rectification",
        "thinkingBudgetDescription": "When an Anthropic-type provider returns budget_tokens constraint errors (such as at least 1024), automatically normalizes thinking to enabled, sets thinking budget to 32000, and raises max_tokens to 64000 if needed, then retries once",
        "mediaFallback": "Unsupported Image Fallback",
        "mediaFallbackDescription": "When a provider does not support image input (it declares text-only capability, or the upstream returns an unsupported-image error), automatically replaces image blocks with an [Unsupported Image] marker so the conversation is not interrupted",
        "mediaHeuristic": "Text-Only Model Preflight",
        "mediaHeuristicDescription": "Before sending, strips images for models in the built-in confirmed text-only registry. Turning this off only disables the proxy's registry-based preflight; declared text-only handling and upstream-error fallback remain, and Codex model-catalog capability declarations are unchanged"
      },
      "optimizer": {
        "title": "Bedrock Request Optimizer",
        "description": "Automatically optimize Thinking and Cache configuration before sending requests (only applies to Bedrock providers)",
        "enabled": "Enable Optimizer",
        "thinkingOptimizer": "Thinking Optimization",
        "thinkingOptimizerDescription": "Automatically enable Adaptive Thinking for Opus/Sonnet, and inject Extended Thinking for legacy models",
        "cacheInjection": "Cache Injection",
        "cacheInjectionDescription": "Automatically inject standard 5-minute cache breakpoints at key positions to reduce duplicate token billing"
      },
      "logConfig": {
        "title": "Application Diagnostic Logs",
        "description": "Control the output level for application diagnostic logs",
        "enabled": "Enable Diagnostic Logs",
        "enabledDescription": "Controls cc-switch.log; request usage records and crash.log are unaffected",
        "level": "Log Level",
        "levelDescription": "Set the minimum log level to output",
        "levels": {
          "error": "Error",
          "warn": "Warning",
          "info": "Info",
          "debug": "Debug",
          "trace": "Trace"
        },
        "levelHint": "Log level descriptions:",
        "levelDesc": {
          "error": "Critical errors only",
          "warn": "Errors + warnings",
          "info": "General operation info (default)",
          "debug": "Detailed info including SSE stream and request/response",
          "trace": "All logs, most verbose"
        }
      }
    },
    "language": "Language",
    "languageHint": "Preview interface language immediately after switching, takes effect permanently after saving.",
    "theme": "Theme",
    "themeHint": "Choose the appearance theme for the app, takes effect immediately.",
    "themeLight": "Light",
    "themeDark": "Dark",
    "themeSystem": "System",
    "importExport": "SQL Import/Export",
    "importExportHint": "Import or export database SQL backups for migration or restore (import supports only backups exported by CC Switch).",
    "exportConfig": "Export SQL Backup",
    "selectConfigFile": "Select SQL File",
    "noFileSelected": "No configuration file selected.",
    "import": "Import",
    "importing": "Importing...",
    "importSuccess": "Import Successful!",
    "importFailed": "Import Failed",
    "syncLiveFailed": "Imported, but failed to sync to the current provider. Please reselect the provider manually.",
    "importPartialSuccess": "Config imported, but failed to sync to the current provider.",
    "importPartialHint": "Please manually reselect the provider to refresh the live configuration.",
    "configExported": "Config exported to:",
    "exportFailed": "Export failed",
    "selectFileFailed": "Please choose a valid SQL backup file",
    "configCorrupted": "SQL file may be corrupted or invalid",
    "backupId": "Backup ID",
    "backupManager": {
      "title": "Database Backups",
      "description": "Automatic database snapshots for restoring to a previous state",
      "empty": "No backups yet",
      "restore": "Restore",
      "restoring": "Restoring...",
      "confirmTitle": "Confirm Restore",
      "confirmMessage": "Restoring this backup will overwrite the current database. A safety backup will be created first.",
      "restoreSuccess": "Restore successful! Safety backup created",
      "restoreFailed": "Restore failed",
      "safetyBackupId": "Safety Backup ID",
      "intervalLabel": "Auto-backup Interval",
      "retainLabel": "Backup Retention",
      "intervalDisabled": "Disabled",
      "intervalHours": "{{hours}} hours",
      "intervalDays": "{{days}} days",
      "rename": "Rename",
      "renameSuccess": "Backup renamed",
      "renameFailed": "Rename failed",
      "namePlaceholder": "Enter new name",
      "createBackup": "Backup Now",
      "creating": "Backing up...",
      "createSuccess": "Backup created successfully",
      "createFailed": "Backup failed",
      "delete": "Delete",
      "deleting": "Deleting...",
      "deleteSuccess": "Backup deleted",
      "deleteFailed": "Delete failed",
      "deleteConfirmTitle": "Confirm Delete",
      "deleteConfirmMessage": "This backup will be permanently deleted. This action cannot be undone."
    },
    "webdavSync": {
      "title": "WebDAV Cloud Sync",
      "description": "Sync database and skill configurations across devices via WebDAV.",
      "baseUrl": "WebDAV Server URL",
      "baseUrlPlaceholder": "https://dav.example.com/dav/",
      "username": "WebDAV Account",
      "usernamePlaceholder": "Email or username",
      "password": "WebDAV Password",
      "passwordPlaceholder": "App password",
      "remoteRoot": "Remote Root Directory",
      "profile": "Sync Profile Name",
      "autoSync": "Auto Sync",
      "autoSyncHint": "When enabled, each database change triggers an automatic WebDAV upload.",
      "test": "Test Connection",
      "testing": "Testing...",
      "testSuccess": "Connection successful",
      "testFailed": "Connection failed: {{error}}",
      "save": "Save Config",
      "saving": "Saving...",
      "saveFailed": "Failed to save config: {{error}}",
      "upload": "Upload to Cloud",
      "uploading": "Uploading...",
      "uploadSuccess": "Uploaded to WebDAV",
      "uploadFailed": "Upload failed: {{error}}",
      "autoSyncFailedToast": "Auto sync failed: {{error}}",
      "download": "Download from Cloud",
      "downloading": "Downloading...",
      "downloadSuccess": "Downloaded and restored from WebDAV",
      "downloadFailed": "Download failed: {{error}}",
      "lastSync": "Last sync: {{time}}",
      "autoSyncLastErrorTitle": "Last auto sync failed",
      "autoSyncLastErrorHint": "Please check network or WebDAV settings. Auto sync will retry on future changes.",
      "missingUrl": "Please enter the WebDAV server URL",
      "presets": {
        "label": "Provider",
        "jianguoyun": "Jianguoyun",
        "jianguoyunHint": "Generate an \"App Password\" in Jianguoyun security settings. Do not use your login password.",
        "nextcloud": "Nextcloud",
        "nextcloudHint": "Replace your-server with your Nextcloud domain and USERNAME with your username.",
        "synology": "Synology NAS",
        "synologyHint": "Install and enable the WebDAV Server package in Synology Package Center first.",
        "custom": "Custom"
      },
      "remoteRootDefault": "Default: cc-switch-sync",
      "profileDefault": "Default: default",
      "saveAndTestSuccess": "Config saved, connection OK",
      "saveAndTestFailed": "Config saved, but connection test failed: {{error}}",
      "noRemoteData": "No sync data found on the remote server",
      "incompatibleVersion": "Remote data is incompatible (protocol v{{protocolVersion}}, database {{dbCompatVersion}}). This client supports protocol v2 / db-v6.",
      "unsaved": "Unsaved",
      "saved": "Saved",
      "unsavedChanges": "Please save config first",
      "saveBeforeSync": "Save configuration first to enable upload/download.",
      "fetchingRemote": "Fetching remote info...",
      "fetchRemoteFailed": "Failed to fetch remote info. Please check configuration and network.",
      "confirmDownload": {
        "title": "Restore from Cloud",
        "deviceName": "Uploaded by",
        "createdAt": "Uploaded at",
        "path": "Remote path",
        "dbCompat": "DB compatibility",
        "artifacts": "Contents",
        "legacyNotice": "A legacy remote path was detected. After restoring, the next upload will write to the new v2/db-v6 path.",
        "warning": "This will overwrite all local data and skill configurations",
        "confirm": "Confirm Restore"
      },
      "confirmUpload": {
        "title": "Upload to Cloud",
        "content": "The following will be synced to the WebDAV server:",
        "dbItem": "Database (all provider configs and data)",
        "skillsItem": "Skills (all custom skills)",
        "targetPath": "Target path",
        "existingData": "Existing cloud data",
        "deviceName": "Uploaded by",
        "createdAt": "Uploaded at",
        "path": "Remote path",
        "dbCompat": "DB compatibility",
        "warning": "This will overwrite existing sync data on the remote server",
        "legacyNotice": "Legacy remote data was detected. This upload will write to the new v2/db-v6 path and will not overwrite the legacy path.",
        "confirm": "Confirm Upload"
      }
    },
    "syncType": {
      "label": "Sync Type",
      "webdav": "WebDAV",
      "s3": "S3 Compatible"
    },
    "s3Sync": {
      "presets": {
        "label": "Provider",
        "awsS3": "AWS S3",
        "awsS3Hint": "Use IAM Access Key with s3:PutObject/GetObject/HeadObject permissions. Region: us-east-1, ap-northeast-1, etc.",
        "minio": "MinIO",
        "minioHint": "Custom endpoint required, e.g. http://minio.local:9000. Region can be 'us-east-1'.",
        "r2": "Cloudflare R2",
        "r2Hint": "Endpoint: https://<account_id>.r2.cloudflarestorage.com. Region: 'auto'.",
        "oss": "Alibaba Cloud OSS",
        "ossHint": "Endpoint: https://oss-<region>.aliyuncs.com. Region: cn-hangzhou, cn-shanghai, etc.",
        "cos": "Tencent Cloud COS",
        "cosHint": "Endpoint: https://cos.<region>.myqcloud.com. Region: ap-guangzhou, ap-beijing, etc.",
        "obs": "Huawei OBS",
        "obsHint": "Endpoint: https://obs.<region>.myhuaweicloud.com. Region: cn-north-4, cn-east-3, etc.",
        "custom": "S3 Compatible (Custom)",
        "customHint": "Any S3-compatible service. Custom endpoint required."
      },
      "region": "Region",
      "regionPlaceholder": "e.g. us-east-1",
      "bucket": "Bucket",
      "bucketPlaceholder": "e.g. my-cc-switch-bucket",
      "accessKeyId": "Access Key ID",
      "accessKeyIdPlaceholder": "e.g. AKIA...",
      "secretAccessKey": "Secret Access Key",
      "secretAccessKeyPlaceholder": "Leave unchanged to keep the existing secret",
      "endpoint": "Endpoint (optional for AWS)",
      "endpointHint": "Required for most S3-compatible services",
      "endpointPlaceholder": "e.g. https://s3-compatible.example.com",
      "remoteRoot": "Remote Root Directory",
      "remoteRootDefault": "Default: cc-switch-sync",
      "profile": "Sync Profile Name",
      "profileDefault": "Default: default",
      "autoSync": "Auto Sync",
      "autoSyncHint": "When enabled, each database change triggers an automatic S3 upload.",
      "enabled": "Enable S3 Sync",
      "enabledHint": "Turn on S3 sync for manual and automatic cloud operations.",
      "mutualExclusionTitle": "Switch Sync Type",
      "mutualExclusionMessage": "Enabling S3 sync will disable the current WebDAV sync. Continue?",
      "mutualExclusionMessageReverse": "Enabling WebDAV sync will disable the current S3 sync. Continue?",
      "mutualExclusionFailed": "Failed to switch sync type: {{error}}",
      "testConnection": "Test Connection",
      "connectionOk": "S3 connection successful",
      "test": "Test Connection",
      "testing": "Testing...",
      "testSuccess": "S3 connection successful",
      "testFailed": "S3 connection failed: {{error}}",
      "save": "Save Config",
      "saving": "Saving...",
      "saveFailed": "Failed to save config: {{error}}",
      "saveAndTestSuccess": "Config saved, S3 connection OK",
      "saveAndTestFailed": "Config saved, but S3 connection test failed: {{error}}",
      "upload": "Upload to Cloud",
      "uploading": "Uploading...",
      "uploadSuccess": "Uploaded to S3",
      "uploadFailed": "S3 upload failed: {{error}}",
      "autoSyncFailedToast": "S3 auto sync failed: {{error}}",
      "download": "Download from Cloud",
      "downloading": "Downloading...",
      "downloadSuccess": "Downloaded and restored from S3",
      "downloadFailed": "S3 download failed: {{error}}",
      "lastSync": "Last sync: {{time}}",
      "autoSyncLastErrorTitle": "Last S3 auto sync failed",
      "autoSyncLastErrorHint": "Please check network or S3 settings. Auto sync will retry on future changes.",
      "missingBucket": "Please enter the S3 bucket",
      "noRemoteData": "No sync data found in the S3 bucket",
      "incompatibleVersion": "Remote data is incompatible (version {{version}}). This client supports protocol v2 / db-v6.",
      "unsaved": "Unsaved",
      "saved": "Saved",
      "unsavedChanges": "Please save config first",
      "saveBeforeSync": "Save configuration first to enable upload/download.",
      "fetchingRemote": "Fetching remote info...",
      "fetchRemoteFailed": "Failed to fetch remote info. Please check configuration and network.",
      "notConfigured": "S3 sync is not configured",
      "disabled": "S3 sync is disabled",
      "confirmDownload": {
        "title": "Restore from S3",
        "deviceName": "Uploaded by",
        "createdAt": "Uploaded at",
        "artifacts": "Contents",
        "warning": "This will overwrite all local data and skill configurations",
        "confirm": "Confirm Restore"
      },
      "confirmUpload": {
        "title": "Upload to S3",
        "content": "The following will be synced to the S3 bucket:",
        "dbItem": "Database (all provider configs and data)",
        "skillsItem": "Skills (all custom skills)",
        "targetPath": "Target object path",
        "existingData": "Existing cloud data",
        "deviceName": "Uploaded by",
        "createdAt": "Uploaded at",
        "warning": "This will overwrite existing sync data at the S3 path",
        "confirm": "Confirm Upload"
      }
    },
    "autoReload": "Data refreshed",
    "languageOptionChinese": "简体中文",
    "languageOptionTraditionalChinese": "繁體中文",
    "languageOptionEnglish": "English",
    "languageOptionJapanese": "日本語",
    "windowBehavior": "Window Behavior",
    "windowBehaviorHint": "Configure window minimize and Claude plugin integration policies.",
    "launchOnStartup": "Launch on Startup",
    "launchOnStartupDescription": "Automatically run CC Switch when system starts",
    "silentStartup": "Silent Startup",
    "silentStartupDescription": "Start in background mode without showing main window",
    "autoLaunchFailed": "Failed to set auto-launch",
    "minimizeToTray": "Minimize to tray on close",
    "minimizeToTrayDescription": "When checked, clicking the close button will hide to system tray, otherwise the app will exit directly.",
    "useAppWindowControls": "Enable app-level window controls",
    "useAppWindowControlsDescription": "Use built-in minimize, maximize/restore, and close buttons in the app header.",
    "enableClaudePluginIntegration": "Apply to Claude Code extension",
    "enableClaudePluginIntegrationDescription": "When enabled, the VS Code Claude Code extension provider will switch with this app",
    "skipClaudeOnboarding": "Skip Claude Code first-run confirmation",
    "skipClaudeOnboardingDescription": "When enabled, Claude Code will skip the first-run confirmation",
    "codexAuth": "Codex App Enhancements",
    "preserveCodexOfficialAuthOnSwitch": "Keep official login for direct switches",
    "preserveCodexOfficialAuthOnSwitchDescription": "Controls third-party switches when local routing is off. Takeover routing always preserves the Codex official login.",
    "unifyCodexSessionHistory": "Unified Codex session history",
    "unifyCodexSessionHistoryDescription": "When enabled, the official subscription runs under the shared \"custom\" provider id so official and third-party sessions appear in one history list, optionally migrating existing official sessions in (backed up first). When turning it off, the migrated sessions can be restored from backup. Note: resuming an old session across providers may fail because its encrypted_content reasoning can only be decrypted by the backend that created it.",
    "unifyCodexHistoryRestoreCompleted": "Official session history restored from backup ({{files}} session files, {{rows}} index rows)",
    "unifyCodexHistoryRestoreFailed": "Failed to restore official session history, please try again",
    "unifyCodexHistoryRestoreNothing": "No restorable migration backup for the current Codex directory",
    "unifyCodexHistoryRestoreSkippedToggleOn": "Unified session history was re-enabled; restore skipped",
    "appVisibility": {
      "title": "Homepage Display",
      "description": "Choose which apps to show on the homepage",
      "claudeDesc": "Anthropic Claude Code CLI",
      "codexDesc": "OpenAI Codex CLI",
      "geminiDesc": "Google Gemini CLI",
      "opencodeDesc": "OpenCode CLI",
      "showProfileSwitcher": "Show project switcher",
      "showProfileSwitcherDescription": "Show the project switcher in the main page header"
    },
    "skillStorage": {
      "title": "Skill Storage Location",
      "description": "Choose where CC Switch stores the master copies of your skills",
      "ccSwitch": "CC Switch",
      "unified": "~/.agents/skills",
      "ccSwitchHint": "Skills are stored in ~/.cc-switch/skills/ and synced to each app via symlink or copy.",
      "unifiedHint": "Skills are stored in ~/.agents/skills/, the Agent Skills open standard. Compatible tools (Claude Code, Codex, Gemini CLI, etc.) discover skills here natively.",
      "confirmTitle": "Migrate Skill Storage",
      "confirmMessage": "{{count}} skill(s) will be moved to the new location. Continue?",
      "migrationSuccess": "Successfully migrated {{count}} skill(s)",
      "migrationPartial": "Migrated {{migrated}} skill(s), {{errors}} error(s). Check logs for details."
    },
    "skillSync": {
      "title": "Skill Sync Method",
      "description": "Choose how to sync Skills files",
      "symlink": "Symlink",
      "copy": "Copy Files",
      "symlinkHint": "Symlinks save disk space and enable real-time sync. Note: May require admin privileges or Developer Mode on Windows"
    },
    "terminal": {
      "title": "Preferred Terminal",
      "description": "Choose which terminal app to use when clicking the terminal button",
      "fallbackHint": "If the selected terminal is unavailable, the system default will be used",
      "options": {
        "macos": {
          "terminal": "Terminal.app",
          "iterm2": "iTerm2",
          "alacritty": "Alacritty",
          "kitty": "Kitty",
          "ghostty": "Ghostty",
          "wezterm": "WezTerm",
          "kaku": "Kaku",
          "warp": "Warp"
        },
        "windows": {
          "cmd": "Command Prompt",
          "powershell": "PowerShell",
          "wt": "Windows Terminal"
        },
        "linux": {
          "gnomeTerminal": "GNOME Terminal",
          "konsole": "Konsole",
          "xfce4Terminal": "Xfce4 Terminal",
          "alacritty": "Alacritty",
          "kitty": "Kitty",
          "ghostty": "Ghostty"
        }
      }
    },
    "configDirectoryOverride": "Configuration Directory Override (Advanced)",
    "configDirectoryDescription": "When using Claude Code or Codex in environments like WSL, you can manually specify the configuration directory to the one in WSL to keep provider data consistent with the main environment.",
    "appConfigDir": "CC Switch Configuration Directory",
    "appConfigDirDescription": "Customize the storage location for CC Switch configuration (point to cloud sync folder to enable config sync)",
    "browsePlaceholderApp": "e.g., C:\\Users\\Administrator\\.cc-switch",
    "claudeConfigDir": "Claude Code Configuration Directory",
    "claudeConfigDirDescription": "Override Claude configuration directory (settings.json). Custom directories store .claude.json (MCP) inside the directory; the default ~/.claude directory keeps Claude Code's split ~/.claude.json path.",
    "codexConfigDir": "Codex Configuration Directory",
    "codexConfigDirDescription": "Override Codex configuration directory.",
    "geminiConfigDir": "Gemini Configuration Directory",
    "geminiConfigDirDescription": "Override Gemini configuration directory (.env).",
    "grokConfigDir": "Grok Build Configuration Directory",
    "grokConfigDirDescription": "Override Grok Build configuration directory (config.toml).",
    "opencodeConfigDir": "OpenCode Configuration Directory",
    "opencodeConfigDirDescription": "Override OpenCode configuration directory (opencode.json).",
    "openclawConfigDir": "OpenClaw Configuration Directory",
    "openclawConfigDirDescription": "Override OpenClaw configuration directory (openclaw.json).",
    "hermesConfigDir": "Hermes Configuration Directory",
    "hermesConfigDirDescription": "Override Hermes configuration directory (config.yaml).",
    "browsePlaceholderClaude": "e.g., /home/<your-username>/.claude",
    "browsePlaceholderCodex": "e.g., /home/<your-username>/.codex",
    "browsePlaceholderGemini": "e.g., /home/<your-username>/.gemini",
    "browsePlaceholderGrok": "e.g., /home/<your-username>/.grok",
    "browsePlaceholderOpencode": "e.g., /home/<your-username>/.config/opencode",
    "browsePlaceholderOpenclaw": "e.g., /home/<your-username>/.openclaw",
    "browsePlaceholderHermes": "e.g., /home/<your-username>/.hermes",
    "browseDirectory": "Browse Directory",
    "resetDefault": "Reset to default directory (takes effect after saving)",
    "checkForUpdates": "Check for Updates",
    "updateTo": "Update to v{{version}}",
    "updating": "Updating...",
    "checking": "Checking...",
    "upToDate": "Up to Date",
    "aboutHint": "View version information and update status.",
    "portableMode": "Portable mode: updates require manual download.",
    "updateAvailable": "New version available: {{version}}",
    "updateBadge": "Update available",
    "updateFailed": "Update installation failed, attempted to open download page.",
    "checkUpdateFailed": "Failed to check for updates, please try again later.",
    "openReleaseNotesFailed": "Failed to open release notes",
    "releaseNotes": "Release Notes",
    "viewReleaseNotes": "View release notes for this version",
    "viewCurrentReleaseNotes": "View current version release notes",
    "officialWebsite": "Official Website",
    "github": "GitHub",
    "manualInstallCommands": "Manual Install Commands",
    "oneClickInstallHint": "Install or upgrade Claude Code / Codex / Gemini CLI / OpenCode / OpenClaw / Hermes",
    "localEnvCheck": "Local environment check",
    "updateAllTools": "Update All ({{count}})",
    "currentVersion": "Current Version",
    "latestVersion": "Latest Version",
    "updateAvailableShort": "Update",
    "toolInstall": "Install",
    "toolUpdate": "Update",
    "toolReady": "Ready",
    "toolActionDone": "{{action}} completed for {{count}} tool(s)",
    "toolActionPartial": "{{action}} succeeded for {{succeeded}}, failed for {{failed}}",
    "toolActionFailed": "Install/update command failed",
    "toolNotRunnable": "Installed but not runnable (no version detected)",
    "toolActionVersionUnchangedTitle": "Version did not change",
    "toolActionVersionUnchanged": "Still on {{version}} (latest: {{latest}}). The updater may have reported success without applying the update.",
    "toolActionInstalledNotRunnable": "Installed, but it can't run in the current environment — please check",
    "installedNotRunnable": "Installed · can't run",
    "toolCheckEnv": "Check environment",
    "toolDiagnose": "Diagnose installs",
    "toolDiagnosing": "Diagnosing…",
    "toolConflictTitle": "Multiple installations detected",
    "toolConflictHint": "The command line uses the one marked Default; an upgrade may have written to another.",
    "toolConflictDefault": "Default",
    "toolConflictNotRunnable": "can't run",
    "toolDiagnoseNoConflict": "No conflicting installations found",
    "toolDiagnoseFailed": "Diagnosis failed",
    "toolUpgradeConfirmTitle": "Confirm upgrade target",
    "toolUpgradeConfirmHint": "Multiple installations detected. This upgrade won't update all of them; refer to each tool below for what it actually targets.",
    "toolUpgradeWillRun": "Will run:",
    "toolUpgradeConfirmBtn": "Confirm upgrade",
    "toolUpgradeUnanchoredHint": "Can't determine which install your command line uses; will run the default upgrade command (may install to the first npm on PATH).",
    "envBadge": {
      "wsl": "WSL",
      "windows": "Win",
      "macos": "macOS",
      "linux": "Linux"
    },
    "wslShell": "Shell",
    "wslShellFlag": "Flag",
    "installCommandsCopied": "Install commands copied",
    "installCommandsCopyFailed": "Copy failed, please copy manually.",
    "importFailedError": "Import config failed: {{message}}",
    "exportFailedError": "Export config failed:",
    "restartRequired": "Restart Required",
    "restartRequiredMessage": "Modifying the CC Switch configuration directory requires restarting the application to take effect. Restart now?",
    "restartNow": "Restart Now",
    "restartLater": "Restart Later",
    "restartFailed": "Application restart failed, please manually close and reopen.",
    "devModeRestartHint": "Dev Mode: Automatic restart not supported, please manually restart the application.",
    "saving": "Saving...",
    "globalProxy": {
      "label": "Global Proxy",
      "hint": "Proxy all requests (API, Skills download, etc.). When local routing is enabled, app traffic is also routed through this proxy. Leave empty for direct connection.",
      "username": "Username (optional)",
      "password": "Password (optional)",
      "test": "Test Connection",
      "scan": "Scan Local Proxies",
      "clear": "Clear",
      "scanFailed": "Scan failed: {{error}}",
      "saved": "Proxy settings saved",
      "saveFailed": "Save failed: {{error}}",
      "testSuccess": "Connected! Latency {{latency}}ms",
      "testFailed": "Connection failed: {{error}}",
      "pricingDefaultsTitle": "Pricing Defaults",
      "pricingDefaultsDescription": "Set the default multiplier and pricing model source per app.",
      "pricingAppLabel": "App",
      "defaultCostMultiplierLabel": "Default Multiplier",
      "defaultCostMultiplierHint": "Multiplier for cost calculation, decimals supported.",
      "pricingModelSourceLabel": "Pricing Model Source",
      "pricingModelSourceRequest": "Request model",
      "pricingModelSourceResponse": "Response model",
      "pricingSave": "Save Pricing Defaults",
      "pricingSaved": "Pricing defaults saved",
      "pricingSaveFailed": "Failed to save pricing defaults: {{error}}",
      "pricingLoadFailed": "Failed to load pricing defaults: {{error}}",
      "defaultCostMultiplierRequired": "Default multiplier is required",
      "defaultCostMultiplierInvalid": "Invalid multiplier format"
    },
    "saveFailedGeneric": "Save failed, please try again"
  },
  "apps": {
    "claude": "Claude",
    "claudeCode": "Claude Code",
    "claudeDesktop": "Claude Desktop",
    "claude-desktop": "Claude Desktop",
    "codex": "Codex",
    "gemini": "Gemini",
    "grokbuild": "Grok Build",
    "opencode": "OpenCode",
    "openclaw": "OpenClaw",
    "hermes": "Hermes"
  },
  "grokBuild": {
    "apiBackend": "API backend",
    "contextWindow": "Context window",
    "contextWindowInvalid": "Context window must be a positive integer",
    "profile": "Client model profile",
    "rawConfig": "config.toml",
    "invalidToml": "Invalid config.toml: {{error}}"
  },
  "sessionManager": {
    "title": "Session Manager",
    "subtitle": "Manage Claude Code, Codex, Gemini CLI, Grok Build, OpenCode, OpenClaw and Hermes sessions",
    "searchPlaceholder": "Search by content, directory, or ID",
    "searchSessions": "Search sessions",
    "providerFilterAll": "All",
    "providerFilterTooltip": "Provider filter",
    "sessionList": "Sessions",
    "viewModeTooltip": "View mode",
    "viewModeFlat": "List",
    "viewModeGrouped": "Grouped",
    "unknownDirectory": "Unknown directory",
    "toggleProviderGroup": "Expand or collapse {{provider}} provider group",
    "toggleDirectoryGroup": "Expand or collapse {{directory}} directory group",
    "collapseAllGroups": "Collapse all",
    "selectProviderGroupForBatch": "Select sessions in {{provider}} provider group",
    "selectDirectoryGroupForBatch": "Select sessions in {{directory}} directory group",
    "manageBatchTooltip": "Enter batch management",
    "exitBatchModeTooltip": "Exit batch management",
    "batchModeHint": "Select sessions to delete",
    "selectForBatch": "Select session",
    "selectedCount": "{{count}} selected",
    "selectAllFiltered": "Select all",
    "clearFilteredSelection": "Clear selection",
    "clearSelection": "Clear",
    "deleteSelected": "Delete",
    "batchDeleting": "Deleting...",
    "loadingSessions": "Loading sessions...",
    "noSessions": "No sessions found",
    "selectSession": "Select a session to view details",
    "noSummary": "No summary available",
    "lastActive": "Last active",
    "projectDir": "Project directory",
    "sourcePath": "Source file",
    "copyResumeCommand": "Copy resume command",
    "resumeCommandCopied": "Resume command copied",
    "openInTerminal": "Resume in terminal",
    "terminalTargetTerminal": "Terminal",
    "terminalTargetKitty": "kitty",
    "terminalTargetCopy": "Copy only",
    "terminalLaunched": "Terminal launched",
    "openFailed": "Failed to launch terminal",
    "resumeFallbackCopied": "Resume command copied for manual use",
    "copyProjectDir": "Copy directory",
    "projectDirCopied": "Directory copied",
    "copySourcePath": "Copy source file",
    "sourcePathCopied": "Source file copied",
    "delete": "Delete session",
    "deleting": "Deleting...",
    "deleteTooltip": "Permanently delete this local session record",
    "deleteConfirmTitle": "Delete session",
    "deleteConfirmMessage": "This will permanently delete the local session \"{{title}}\"\nSession ID: {{sessionId}}\n\nThis action cannot be undone.",
    "deleteConfirmAction": "Delete session",
    "sessionDeleted": "Session deleted",
    "deleteFailed": "Failed to delete session: {{error}}",
    "batchDeleteConfirmTitle": "Delete selected sessions",
    "batchDeleteConfirmMessage": "This will permanently delete {{count}} selected local sessions.\n\nThis action cannot be undone.",
    "batchDeleteConfirmAction": "Delete selected",
    "batchDeleteSuccess": "Deleted {{count}} sessions",
    "batchDeleteFailed": "{{failed}} sessions could not be deleted",
    "batchDeleteRequestFailed": "Batch delete failed. Please try again later.",
    "loadingMessages": "Loading transcript...",
    "emptySession": "No messages available",
    "clickToCopyPath": "Click to copy path",
    "tocTitle": "Contents",
    "justNow": "Just now",
    "minutesAgo": "{{count}} min ago",
    "hoursAgo": "{{count}} hr ago",
    "daysAgo": "{{count}} days ago",
    "roleUser": "User",
    "roleSystem": "System",
    "roleTool": "Tool",
    "resume": "Resume Session",
    "resumeTooltip": "Resume this session in terminal",
    "noResumeCommand": "This session cannot be resumed",
    "copyCommand": "Copy Command",
    "copyMessage": "Copy Message",
    "messageCopied": "Message copied",
    "conversationHistory": "Conversation History",
    "expandContent": "Expand full content",
    "collapseContent": "Collapse"
  },
  "console": {
    "providerSwitchReceived": "Received provider switch event:",
    "setupListenerFailed": "Failed to setup provider switch listener:",
    "updateProviderFailed": "Update provider failed:",
    "autoImportFailed": "Auto import default configuration failed:",
    "openLinkFailed": "Failed to open link:",
    "getVersionFailed": "Failed to get version info:",
    "loadSettingsFailed": "Failed to load settings:",
    "getConfigPathFailed": "Failed to get config path:",
    "getConfigDirFailed": "Failed to get config directory:",
    "detectPortableFailed": "Failed to detect portable mode:",
    "saveSettingsFailed": "Failed to save settings:",
    "updateFailed": "Update failed:",
    "checkUpdateFailed": "Check for updates failed:",
    "openConfigFolderFailed": "Failed to open config folder:",
    "selectConfigDirFailed": "Failed to select config directory:",
    "getDefaultConfigDirFailed": "Failed to get default config directory:",
    "openReleaseNotesFailed": "Failed to open release notes:"
  },
  "providerForm": {
    "supplierName": "Provider Name",
    "supplierNameRequired": "Provider Name *",
    "supplierNamePlaceholder": "e.g., Anthropic Official",
    "websiteUrl": "Website URL",
    "websiteUrlPlaceholder": "https://example.com (optional)",
    "apiEndpoint": "API Endpoint",
    "apiEndpointPlaceholder": "https://your-api-endpoint.com",
    "codexApiEndpointPlaceholder": "https://your-api-endpoint.com/v1",
    "manageAndTest": "Manage & Test",
    "configContent": "Config Content",
    "officialNoApiKey": "Official login does not require API Key, save directly",
    "codexOfficialNoApiKey": "Official does not require API Key, save directly",
    "codexApiKeyAutoFill": "Just fill in here, auth.json below will be auto-filled",
    "apiKeyAutoFill": "Just fill in here, config below will be auto-filled",
    "cnOfficialApiKeyHint": "💡 Only need to fill in API Key, endpoint is preset",
    "aggregatorApiKeyHint": "💡 Only need to fill in API Key, endpoint is preset",
    "thirdPartyApiKeyHint": "💡 Only need to fill in API Key, endpoint is preset",
    "customApiKeyHint": "💡 Custom configuration requires manually filling all necessary fields",
    "omoHint": "💡 OMO config manages Agent model assignments and supports both oh-my-openagent.jsonc and oh-my-opencode.jsonc",
    "officialHint": "💡 Official provider uses browser login, no API Key needed",
    "providerKeyStatusLoading": "Provider identifier status is still loading. Please try again shortly.",
    "getApiKey": "Get API Key",
    "partnerPromotion": {
      "a6api": "A6API is a token aggregation platform with a built-in real-time price leaderboard that automatically picks the lowest price on the market. Smooth and stable, simple to operate, and no more tedious price comparisons. Register now to claim free trial credits!",
      "sudocode": "With one SudoCode key, Claude Code and Claude Desktop use Claude Opus 5, while Codex uses GPT-5.6. Sign up, join QQ group 726213516, and contact the group owner to claim CNY ¥10 in trial credit.",
      "code0": "code0.ai is an AI coding service platform for developers, supporting Claude Code, Codex, and Gemini. Exclusive for CC Switch users: contact support via the official website to claim free trial credits!",
      "nekocode": "NekoCode gives developers a stable, efficient, and reliable API relay for Claude, Codex, and other AI models, with transparent pay-as-you-go pricing. Exclusive 10% off for CC Switch users: register via the link above and enter promo code cc-switch at recharge to save 10%!",
      "packycode": "PackyCode is an official partner of CC Switch. Register using this link and enter \"cc-switch\" promo code during recharge to get 10% off",
      "apikeyfun": "APIKEY.FUN offers a special deal for CC Switch users. Register through the exclusive link to enjoy up to permanent 5% off top-ups.",
      "apinebula": "APINEBULA offers CC Switch users a special discount: register using the link and enter the \"ccswitch\" promo code during your first top-up to get 10% off.",
      "atlascloud": "Atlas Cloud is a full-modal AI inference platform that gives developers one API for video generation, image generation, and LLM access. Check out its new Coding Plan promotion for more budget-friendly API access.",
      "patewayai": "PatewayAI offers special benefits for CC Switch users. Register via this link to receive $3 credit.",
      "claudeapi": "ClaudeAPI offers special benefits for CC Switch users. Register via this link to claim test credits.",
      "claudecn": "ClaudeCN is an enterprise-grade AI gateway operated by a registered company, supporting enterprise procurement processes with corporate payments, contracts, and compliance guarantees.",
      "runapi": "RunAPI offers special benefits for CC Switch users. Register via this link and contact customer support to claim ¥14 free credit.",
      "minimax_cn": "MiniMax Coding Plan Special Offer, Starter from ¥9.9",
      "minimax_en": "MiniMax Coding Plan Black Friday, Starter is now $2/mo (80% OFF!)",
      "opencode_go": "Subscribe to OpenCode Go via this link — only $5 for your first month, plus an extra $5 in credit!",
      "dmxapi": "Claude Code exclusive model 66% OFF now!",
      "cubence": "Cubence is an official partner of CC Switch. Register using this link and enter \"CCSWITCH\" promo code during recharge to get 10% off every top-up",
      "aigocode": "AIGoCode is an official partner of CC Switch. Register using this link and get 10% bonus credit on your first top-up!",
      "rightcode": "RightCode is an official partner of CC Switch. Register using this link and get 5% bonus credit on every top-up!",
      "aicodemirror": "AICodeMirror is an official partner of CC Switch. Register using this link to get 20% off!",
      "aicoding": "AI Coding offers an exclusive discount for CC Switch users — 10% off your first top-up!",
      "crazyrouter": "CrazyRouter offers an exclusive bonus for CC Switch users — 30% extra credit on your first top-up!",
      "sssaicode": "SSAI Code offers an exclusive bonus for CC Switch users — $10 extra credit on every top-up!",
      "siliconflow": "SiliconFlow is an official partner of CC Switch",
      "ucloud": "Compshare offers an exclusive bonus for CC Switch users — register via this link to get ¥5 platform trial credit!",
      "micu": "Micu is an official partner of CC Switch",
      "etok": "Join the ETok community on the official website and subscribe to a plan.",
      "shengsuanyun": "Shengsuanyun offers exclusive benefits for CC Switch users. New users who register via this link get ¥10 free credits and 10% bonus on first top-up!",
      "doubaoseed": "DouBao offers exclusive benefits for CC Switch users: register via this link to get 500K tokens of inference credits for all DouBao text models and 5M tokens of free Seedance 2.0 credits.",
      "volcengine_agentplan": "Volcengine Ark Coding Plan offers exclusive benefits for CC Switch users: subscribe via this link and new customers get 75% off for the first two months, plus an extra 5% off with the exclusive invite code 6J6FV5N2 — as low as ¥9.4/month!",
      "byteplus": "Register via this link to get 500,000 tokens of free inference quota per model.",
      "ccsub": "CCSub is a stable, affordable AI API relay — a drop-in replacement for Claude.ai & OpenAI subscriptions, with one key for all models at ~30% of direct API cost.",
      "subrouter": "SubRouter is an AI relay aggregator that lets one key access multiple models and providers.",
      "qiniu": "Qiniu Cloud is a multi-protocol AI relay: one key for native Claude, GPT, and Gemini models, with the Anthropic, OpenAI, and Gemini APIs all supported.",
      "fenno": "Fenno.ai is a stable, efficient API relay giving you access to a wide range of mainstream models. Exclusive CC Switch offer: subscribe via this link to the ¥9.9 Coding Plan worth $150 in credits!",
      "zetaapi": "ZetaAPI delivers real, undegraded models at as low as 35% of official pricing. Exclusive CC Switch offer: register via this link and use promo code CC-SWITCH for 10% off your first top-up!",
      "teamorouter": "TeamoRouter is an enterprise-grade Agentic LLM gateway with pricing up to 90% off. It offers exclusive benefits for CC Switch users: register via this link as a new user for 10% off your first top-up!"
    },
    "presets": {
      "ucloud": "Compshare",
      "ucloudCoding": "Compshare Coding Plan",
      "shengsuanyun": "Shengsuanyun",
      "qiniu": "Qiniu",
      "openrouter": "OpenRouter",
      "deepseek": "DeepSeek",
      "together": "Together AI"
    },
    "parameterConfig": "Parameter Config - {{name}} *",
    "mainModel": "Main Model (optional)",
    "mainModelPlaceholder": "e.g., GLM-4.6",
    "fastModel": "Fast Model (optional)",
    "fastModelPlaceholder": "e.g., GLM-4.5-Air",
    "modelHint": "💡 Leave blank to use provider's default model",
    "apiHint": "💡 Fill in Claude API compatible service endpoint, avoid trailing slash",
    "apiHintOAI": "💡 Fill in OpenAI Chat Completions compatible service endpoint, avoid trailing slash",
    "apiHintGeminiNative": "💡 Prefer a Gemini Native base URL such as https://generativelanguage.googleapis.com or https://generativelanguage.googleapis.com/v1beta; the proxy will append models/*:generateContent automatically",
    "codexApiHint": "💡 Fill in service endpoint compatible with OpenAI Response format",
    "fillSupplierName": "Please fill in provider name",
    "fillConfigContent": "Please fill in configuration content",
    "fillParameter": "Please fill in {{label}}",
    "fillTemplateValue": "Please fill in {{label}}",
    "endpointRequired": "API endpoint is required for non-official providers",
    "apiKeyRequired": "API Key is required for non-official providers",
    "softValidation": {
      "title": "Configuration has the following issues",
      "hint": "Save anyway? Switching to this provider may fail; you can fill these in later.",
      "saveAnyway": "Save anyway"
    },
    "configJsonError": "Config JSON format error, please check syntax",
    "authJsonRequired": "auth.json must be a JSON object",
    "authJsonError": "auth.json format error, please check JSON syntax",
    "fillAuthJson": "Please fill in auth.json configuration",
    "fillApiKey": "Please fill in OPENAI_API_KEY",
    "visitWebsite": "Visit {{url}}",
    "anthropicModel": "Main Model",
    "anthropicSmallFastModel": "Fast Model",
    "apiFormat": "API Format",
    "apiFormatHint": "Select the input format for the provider's API",
    "customUserAgent": "Custom User-Agent",
    "customUserAgentHint": "Only takes effect when local routing/proxy takeover is enabled; replaces the User-Agent in requests forwarded to the provider API.",
    "customUserAgentInvalid": "User-Agent must not contain control characters (e.g. line breaks); otherwise it will be ignored.",
    "customUserAgentPresets": "Presets",
    "localProxyRequestOverrides": "Local proxy request overrides",
    "localProxyRequestOverridesHint": "Only takes effect after local routing/proxy takeover; applied to the transformed upstream request.",
    "localProxyRequestOverridesInvalid": "Local proxy request overrides format error: {{error}}",
    "localProxyHeaderOverrides": "Header overrides",
    "localProxyHeaderOverridesInvalidDetail": "Header overrides format error: {{error}}",
    "localProxyBodyOverrides": "Body overrides",
    "localProxyBodyOverridesInvalidDetail": "Body overrides format error: {{error}}",
    "fullUrlLabel": "Full URL",
    "fullUrlEnabled": "Full URL Mode",
    "fullUrlDisabled": "Mark as Full URL",
    "fullUrlHint": "💡 Enter the full request URL. This mode requires routing to be enabled, and routing will use the URL as-is without appending a path",
    "fullUrlHintGeminiNative": "💡 In Gemini Native full URL mode, two inputs are supported: 1. official/structured Gemini URLs, which will still be normalized to the requested model and streaming method; 2. opaque custom relay URLs, which will be used mostly as-is with only query parameters appended",
    "apiFormatAnthropic": "Anthropic Messages (Native)",
    "apiFormatOpenAIChat": "OpenAI Chat Completions (Requires routing)",
    "apiFormatOpenAIResponses": "OpenAI Responses API (Requires routing)",
    "apiFormatGeminiNative": "Gemini Native generateContent (Requires routing)",
    "codexApiFormatResponses": "OpenAI Responses API (Native)",
    "codexApiFormatOpenAIChat": "OpenAI Chat Completions (Requires routing)",
    "codexApiFormatHint": "Select the Codex API format actually supported by this provider; the config stays on Responses for newer Codex versions, while Chat Completions is converted through local routing.",
    "authField": "Auth Field",
    "authFieldAuthToken": "ANTHROPIC_AUTH_TOKEN (Default)",
    "authFieldApiKey": "ANTHROPIC_API_KEY",
    "authFieldHint": "Select the authentication env variable name for the config",
    "apiHintResponses": "💡 Fill in OpenAI Responses API compatible service endpoint, avoid trailing slash",
    "anthropicDefaultHaikuModel": "Default Haiku Model",
    "anthropicDefaultSonnetModel": "Default Sonnet Model",
    "anthropicDefaultOpusModel": "Default Opus Model",
    "modelPlaceholder": "",
    "smallModelPlaceholder": "",
    "haikuModelPlaceholder": "",
    "modelHelper": "Optional: Specify default Claude model to use, leave blank to use system default.",
    "modelMappingLabel": "Model Mapping",
    "modelMappingHint": "Display names only affect the /model menu; 1M is only a Claude Code context-capability declaration.",
    "modelRoleLabel": "Model role",
    "modelRoleSonnet": "Sonnet",
    "modelRoleOpus": "Opus",
    "modelRoleFable": "Fable",
    "modelRoleHaiku": "Haiku",
    "modelRoleSubagent": "Subagent",
    "modelDisplayNameLabel": "Display name",
    "modelDisplayNamePlaceholder": "e.g. DeepSeek V4 Pro",
    "modelNoDisplayName": "Not shown in /model",
    "requestModelLabel": "Requested model",
    "modelOneMHeader": "Declare 1M",
    "modelOneMLabel": "1M",
    "fallbackModelLabel": "Default fallback model",
    "fallbackModelHint": "A fallback for requests that don't clearly map to Sonnet, Opus, Fable, or Haiku. Recommended for third-party/relay endpoints—otherwise such requests (including Haiku background subtasks) are forwarded under their original Claude model name and may fail if the upstream doesn't host it. Safe to leave blank for official endpoints.",
    "quickSetModels": "Quick Set",
    "quickSetSuccess": "Model name applied to all roles",
    "advancedOptionsToggle": "Advanced Options",
    "advancedOptionsHint": "Includes API format, auth field, and model mapping. Defaults work for most use cases.",
    "categoryOfficial": "Official",
    "categoryCnOfficial": "Opensource Official",
    "categoryAggregation": "Aggregation",
    "categoryThirdParty": "Third Party",
    "fetchModels": "Fetch Models",
    "fetchingModels": "Fetching...",
    "fetchModelsSuccess": "Found {{count}} models",
    "fetchModelsFailed": "Failed to fetch models",
    "fetchModelsEmpty": "No models found",
    "fetchModelsNeedApiKey": "Please fill in API Key first",
    "fetchModelsNeedEndpoint": "Please fill in API endpoint first",
    "fetchModelsNeedConfig": "Please fill in API endpoint and API Key first",
    "fetchModelsAuthFailed": "API Key is invalid or lacks permission",
    "fetchModelsNotSupported": "This provider does not support fetching model list",
    "fetchModelsEndpointNotFound": "No reachable models endpoint found. Please check the Base URL or confirm whether the provider exposes this API.",
    "fetchModelsTimeout": "Request timed out, please check network connection",
    "requiredFields": "Please fill in provider name, API endpoint, API Key and model"
  },
  "copilot": {
    "authSection": "GitHub Copilot Authentication",
    "authStatus": "Authentication Status",
    "authenticated": "Authenticated as {{username}}",
    "notAuthenticated": "Not authenticated",
    "loginWithGitHub": "Login with GitHub",
    "loginRequired": "Please login to GitHub Copilot first",
    "waitingForAuth": "Waiting for authorization...",
    "enterCode": "Please enter the code in your browser:",
    "logout": "Logout",
    "authSuccess": "GitHub Copilot authentication successful",
    "authFailed": "Authentication failed: {{error}}",
    "authTimeout": "Authentication timed out, please try again",
    "tokenExpired": "Token expired, please re-authenticate",
    "accountCount": "{{count}} account(s)",
    "selectAccount": "Select Account",
    "selectAccountPlaceholder": "Select a GitHub account",
    "useDefaultAccount": "Use default account",
    "loggedInAccounts": "Logged in accounts",
    "defaultAccount": "Default",
    "selected": "Selected",
    "removeAccount": "Remove account",
    "setAsDefault": "Set as default",
    "addAnotherAccount": "Add another account",
    "logoutAll": "Logout all accounts",
    "retry": "Retry",
    "copyCode": "Copy code",
    "migrationFailed": "Legacy auth migration failed: {{error}}",
    "loadModelsFailed": "Failed to load Copilot models",
    "deploymentType": "GitHub Deployment Type",
    "deploymentGitHubCom": "GitHub.com",
    "deploymentEnterprise": "GitHub Enterprise Server",
    "enterpriseDomainPlaceholder": "e.g. company.ghe.com"
  },
  "codexOauth": {
    "authStatus": "Auth status",
    "notAuthenticated": "Not authenticated",
    "loginWithChatGPT": "Sign in with ChatGPT",
    "loginRequired": "Please sign in to ChatGPT first",
    "waitingForAuth": "Waiting for authorization...",
    "enterCode": "Enter the code in your browser:",
    "accountCount": "{{count}} account(s)",
    "selectAccount": "Select account",
    "selectAccountPlaceholder": "Choose a ChatGPT account",
    "useDefaultAccount": "Use default account",
    "loggedInAccounts": "Logged in accounts",
    "defaultAccount": "Default",
    "selected": "Selected",
    "removeAccount": "Remove account",
    "setAsDefault": "Set as default",
    "addAnotherAccount": "Add another account",
    "logoutAll": "Logout all accounts",
    "retry": "Retry",
    "copyCode": "Copy code",
    "fastMode": "FAST mode",
    "fastModeDescription": "Send service_tier=\"priority\" for lower latency. Off by default — enabling it consumes your ChatGPT quota at a higher rate."
  },
  "xaiOauth": {
    "authStatus": "xAI OAuth authentication",
    "accountCount": "Usable accounts: {{count}}",
    "reauthRequired": "Sign-in required",
    "notAuthenticated": "Not authenticated",
    "selectAccount": "Select account",
    "selectAccountPlaceholder": "Select an xAI account",
    "useDefaultAccount": "Use default account",
    "accounts": "xAI accounts",
    "defaultAccount": "Default",
    "expired": "Credentials expired",
    "setAsDefault": "Set as default",
    "removeAccount": "Remove account",
    "addOrReauth": "Add account or sign in again",
    "login": "Sign in with xAI",
    "waitingForAuth": "Waiting for xAI authorization…",
    "enterCode": "If the browser did not fill it in automatically, enter:",
    "retry": "Retry",
    "logoutAll": "Remove all xAI accounts",
    "loginRequired": "Sign in to an xAI account first"
  },
  "managedAuth": {
    "selectedAccountNeedsReauth": "The linked account is missing or needs you to sign in again",
    "selectedAccountUnavailable": "The linked account is missing or needs you to sign in again. Select another account."
  },
  "endpointTest": {
    "title": "API Endpoint Management",
    "endpoints": "endpoints",
    "autoSelect": "Auto Select",
    "testSpeed": "Test",
    "testing": "Testing",
    "addEndpointPlaceholder": "https://api.example.com",
    "done": "Done",
    "noEndpoints": "No endpoints",
    "failed": "Failed",
    "enterValidUrl": "Please enter a valid URL",
    "invalidUrlFormat": "Invalid URL format",
    "onlyHttps": "Only HTTP/HTTPS supported",
    "urlExists": "This URL already exists",
    "saveFailed": "Save failed, please try again",
    "loadEndpointsFailed": "Failed to load custom endpoints:",
    "addEndpointFailed": "Failed to add custom endpoint:",
    "removeEndpointFailed": "Failed to remove custom endpoint:",
    "removeFailed": "Remove failed: {{error}}",
    "updateLastUsedFailed": "Failed to update endpoint last used time",
    "pleaseAddEndpoint": "Please add an endpoint first",
    "testUnavailable": "Speed test unavailable",
    "noResult": "No result returned",
    "testFailed": "Speed test failed: {{error}}",
    "empty": "No endpoints"
  },
  "providerAdvanced": {
    "pricingConfig": "Pricing Config",
    "useCustomPricing": "Use separate config",
    "pricingConfigDesc": "Configure separate pricing parameters for this provider. Uses global defaults when disabled.",
    "costMultiplier": "Cost Multiplier",
    "costMultiplierPlaceholder": "Leave empty to use global default (1)",
    "costMultiplierHint": "Actual cost = Base cost × Multiplier, supports decimals like 1.5",
    "pricingModelSourceLabel": "Pricing Mode",
    "pricingModelSourceInherit": "Inherit global default",
    "pricingModelSourceRequest": "Request model",
    "pricingModelSourceResponse": "Response model",
    "pricingModelSourceHint": "Choose whether to match pricing by request model or response model"
  },
  "codexConfig": {
    "authJson": "auth.json (JSON) *",
    "authJsonPlaceholder": "{\n  \"OPENAI_API_KEY\": \"sk-your-api-key-here\"\n}",
    "authJsonHint": "Codex auth.json configuration content",
    "authJsonStorageHint": "Proxy takeover is showing the stored auth, not the live auth.json.",
    "configToml": "config.toml (TOML)",
    "configTomlHint": "Codex config.toml configuration content",
    "configTomlStorageHint": "Proxy takeover is showing the stored config, not the live config.toml.",
    "proxyTakeoverStorageNotice": "💡 This app is under proxy takeover. You are editing the stored provider config; the live config is already temporarily managed by the proxy.",
    "writeCommonConfig": "Apply Common Config",
    "editCommonConfig": "Edit Common Config",
    "editCommonConfigTitle": "Edit Codex Common Config Snippet",
    "commonConfigHint": "This snippet will be appended to the end of config.toml when 'Apply Common Config' is checked",
    "enableGoalMode": "Enable Goal mode",
    "enableRemoteCompaction": "Enable remote compaction",
    "remoteCompactionHint": "When enabled, the active model_providers entry name is written as OpenAI so Codex can try remote compaction.",
    "apiUrlLabel": "API Request URL",
    "extractFromCurrent": "Extract from Editor",
    "extractNoCommonConfig": "No common config available to extract from editor",
    "extractFailed": "Extract failed: {{error}}",
    "saveFailed": "Save failed: {{error}}",
    "modelNameHint": "Specify the model to use, will be auto-updated in config.toml",
    "modelName": "Model Name",
    "upstreamFormatLabel": "Upstream Format",
    "upstreamFormatHint": "Pick Responses when your provider is natively a Responses API (direct, no format conversion); pick Chat when it uses the Chat Completions protocol; pick Anthropic Messages when it only offers the native Anthropic Messages protocol. Chat and Anthropic Messages both require routing takeover to convert to Responses.",
    "upstreamFormatChat": "Chat Completions (routing required)",
    "upstreamFormatResponses": "Responses (native)",
    "upstreamFormatAnthropic": "Anthropic Messages (routing required)",
    "anthropicAuthFieldLabel": "Auth field",
    "anthropicAuthFieldAuthToken": "ANTHROPIC_AUTH_TOKEN (Authorization)",
    "anthropicAuthFieldApiKey": "ANTHROPIC_API_KEY (x-api-key)",
    "anthropicAuthFieldHint": "Choose which header carries the API key to the gateway: ANTHROPIC_AUTH_TOKEN sends Authorization: Bearer; ANTHROPIC_API_KEY sends x-api-key. Only one is sent.",
    "impersonateClaudeCodeLabel": "Emulate Claude Code client",
    "impersonateClaudeCodeHint": "Enable when the gateway (or its upstream) restricts usage to Claude Code: spoofs the User-Agent, anthropic-beta and x-app headers, and injects the Claude Code identity as the first system prompt line.",
    "maxOutputTokensLabel": "Max output tokens",
    "maxOutputTokensPlaceholder": "Leave empty to use the default 8192",
    "maxOutputTokensHint": "Codex does not forward model_max_output_tokens in the request body, so the default 8192 ceiling can truncate long or thinking-heavy responses (stop_reason=max_tokens). This value overrides the request's max_tokens on the Anthropic path. Do not exceed the real output ceiling of the model/gateway or it may 400. Leave empty to use the default 8192.",
    "promptCacheRoutingLabel": "Prompt cache routing",
    "promptCacheRoutingAuto": "Auto (recommended)",
    "promptCacheRoutingEnabled": "Enabled",
    "promptCacheRoutingDisabled": "Disabled",
    "promptCacheRoutingHint": "Auto sends prompt_cache_key only to known-compatible upstreams. Enable it for other compatible gateways, or disable it if a strict gateway rejects unknown fields with HTTP 400. Only a stable client-provided session ID is used.",
    "upstreamModelName": "Upstream Model Name",
    "upstreamModelNameHint": "For Chat format, enter the real upstream model here; routing converts Codex Responses requests to Chat Completions while keeping this model.",
    "modelNamePlaceholder": "e.g., gpt-5-codex",
    "contextWindow1M": "1M Context Window",
    "contextWindow": "Context Window",
    "contextWindowPlaceholder": "e.g., 128000",
    "autoCompactLimit": "Auto Compact Limit",
    "autoCompactLimitPlaceholder": "e.g., 90000",
    "autoCompactLimitHint": "Auto-compacts history when context reaches this token limit",
    "modelMetadataAdvanced": "Model Metadata Advanced Options",
    "modelMetadataAdvancedHint": "Overrides Codex metadata for unknown models; clearing a field removes the matching config.toml entry.",
    "defaultModelLabel": "Default Model",
    "defaultModelPlaceholder": "e.g. gpt-5.6-sol",
    "defaultModelHint": "The model Codex requests by default; change it anytime without waiting for a preset update. If left empty while model mapping is configured, the first mapping row is used.",
    "defaultModelNotInCatalog": "This model is not in the model mapping, so the Codex /model menu won't list it (direct requests still work).",
    "addToModelMapping": "Add to mapping",
    "modelMappingTitle": "Model Mapping",
    "modelMappingHint": "Generates Codex model_catalog_json so /model can show these third-party model names; entries are saved exactly as listed. Codex must be restarted to refresh the model list after changes.",
    "addCatalogModel": "Add Model",
    "catalogDisplayName": "Display Name",
    "catalogDisplayNamePlaceholder": "e.g., DeepSeek V4 Flash",
    "catalogModelId": "Model ID",
    "catalogModelPlaceholder": "e.g., deepseek-v4-flash",
    "catalogColumnDisplay": "Menu Display Name",
    "catalogColumnModel": "Actual Request Model",
    "catalogColumnContext": "Context Window",
    "reasoningModeToggle": "Supports Thinking Mode",
    "reasoningModeHint": "Enable when the upstream Chat Completions API supports toggling thinking on/off. Providers like Kimi, GLM and Qwen usually fall into this category.",
    "reasoningEffortToggle": "Supports Reasoning Effort",
    "reasoningEffortHint": "Enable when the upstream supports thinking-depth control such as low/high/max. Enabling this also turns on thinking mode and converts Codex's reasoning.effort into the upstream Chat parameter.",
    "reasoningGroupTitle": "Reasoning Capability",
    "reasoningSectionHint": "Preset providers are configured automatically; custom providers are inferred from name/URL. Override manually only when auto-detection is wrong.",
    "advancedSectionHint": "Includes upstream format, model mapping, reasoning overrides and custom User-Agent. Providers using the Chat Completions protocol require routing takeover to be enabled.",
    "noCommonConfigToApply": "The common config snippet is empty or contains nothing to write"
  },
  "geminiConfig": {
    "envFile": "Environment Variables (.env)",
    "envFileHint": "Configure Gemini environment variables in .env format",
    "configJson": "Configuration File (config.json)",
    "configJsonHint": "Configure Gemini extended parameters in JSON format (optional)",
    "writeCommonConfig": "Apply Common Config",
    "editCommonConfig": "Edit Common Config",
    "editCommonConfigTitle": "Edit Gemini Common Config Snippet",
    "commonConfigHint": "This snippet writes to Gemini .env when 'Apply Common Config' is checked (GOOGLE_GEMINI_BASE_URL and GEMINI_API_KEY are not allowed)",
    "extractFromCurrent": "Extract from Editor",
    "extractNoCommonConfig": "No common config available to extract from editor",
    "extractFailed": "Extract failed: {{error}}",
    "saveFailed": "Save failed: {{error}}",
    "extractedConfigInvalid": "Extracted config format is invalid",
    "invalidJsonFormat": "Common config snippet format error (must be valid JSON)",
    "commonConfigInvalidKeys": "Common config snippet must not include GOOGLE_GEMINI_BASE_URL or GEMINI_API_KEY (found: {{keys}})",
    "commonConfigInvalidValues": "Common config snippet values must be strings",
    "noCommonConfigToApply": "Common config snippet is empty or has no applicable entries",
    "configMergeFailed": "Config merge failed: {{error}}",
    "configReplaceFailed": "Config replace failed: {{error}}"
  },
  "opencode": {
    "npmPackage": "API Format",
    "selectPackage": "Select API format",
    "npmPackageHint": "Select the API format for the AI service",
    "baseUrl": "Base URL",
    "baseUrlHint": "Custom API endpoint URL",
    "models": "Models",
    "modelsHint": "Configure available models and their display names",
    "addModel": "Add Model",
    "modelId": "Model ID",
    "modelName": "Display Name",
    "noModels": "No models configured",
    "modelsRequired": "Please add at least one model",
    "toggleModelDetails": "Toggle model details",
    "providerKey": "Provider Key",
    "providerKeyPlaceholder": "my-provider",
    "providerKeyHint": "Unique identifier in config file. Use lowercase letters, numbers, and hyphens only.",
    "providerKeyLockedHint": "This provider has already been added to the app config, so its key can no longer be changed.",
    "providerKeyRequired": "Provider key is required",
    "providerKeyDuplicate": "This key is already in use",
    "providerKeyInvalid": "Invalid format. Use lowercase letters, numbers, and hyphens only.",
    "headers": "Headers",
    "headersHint": "Optional HTTP headers sent with provider requests, such as HTTP-Referer or X-Title.",
    "addHeader": "Add header",
    "headerName": "Header",
    "headerValue": "Value",
    "headerNamePlaceholder": "X-Title",
    "headerValuePlaceholder": "CC Switch",
    "removeHeader": "Remove header",
    "noHeaders": "No custom headers configured",
    "extraOptions": "Extra Options",
    "extraOptionsHint": "Configure extra SDK options like timeout, setCacheKey, etc. Values are auto-parsed to appropriate types (number, boolean, etc.).",
    "addExtraOption": "Add",
    "extraOptionKey": "Key",
    "extraOptionValue": "Value",
    "extraOptionKeyPlaceholder": "timeout",
    "extraOptionValuePlaceholder": "600000",
    "noExtraOptions": "No extra options configured",
    "noModelOptions": "Model options, click + to add",
    "modelLimits": "Token Limits",
    "limitContext": "Context",
    "limitOutput": "Output",
    "modelExtraFields": "Model Properties",
    "noModelExtraFields": "Model properties (variants, cost, etc.), click + to add",
    "modelExtraFieldKeyPlaceholder": "variants",
    "sdkOptions": "SDK Options",
    "modelOptionKeyPlaceholder": "provider",
    "modelOptionValuePlaceholder": "{\"order\": [\"baseten\"]}"
  },
  "providerPreset": {
    "label": "Provider Preset",
    "custom": "Custom Configuration",
    "other": "Other",
    "hint": "You can continue to adjust the fields below after selecting a preset.",
    "searchTooltip": "Search presets",
    "searchAriaLabel": "Search provider presets",
    "searchPlaceholder": "Search name, website, or category...",
    "sortAriaLabel": "Toggle preset sorting",
    "sortNameAscTooltip": "Sort by name A-Z",
    "sortOriginalTooltip": "Restore original order",
    "noSearchResults": "No provider presets match your search."
  },
  "usage": {
    "title": "Usage Statistics",
    "subtitle": "View AI model usage and cost statistics",
    "today": "24 Hours",
    "last7days": "7 Days",
    "last30days": "30 Days",
    "presetToday": "Today",
    "preset1d": "1d",
    "preset7d": "7d",
    "preset14d": "14d",
    "preset30d": "30d",
    "totalRequests": "Total Requests",
    "totalCost": "Total Cost",
    "cost": "Cost",
    "unpriced": "Unpriced",
    "perMillion": "(per million)",
    "trends": "Usage Trends",
    "rangeToday": "Last 24 hours (hourly)",
    "rangeLast7Days": "Last 7 days",
    "rangeLast30Days": "Last 30 days",
    "totalTokens": "New Tokens (Input+Output)",
    "cacheTokens": "Cache Tokens",
    "realTotal": "Tokens Processed",
    "realTotalHint": "Input + Output + Cache Write + Cache Read",
    "freshInput": "Fresh Input",
    "cacheHitRate": "Cache Hit Rate",
    "requestLogs": "Request Logs",
    "providerStats": "Provider Stats",
    "modelStats": "Model Stats",
    "time": "Time",
    "provider": "Provider",
    "billingModel": "Billing Model",
    "inputTokens": "Input",
    "outputTokens": "Output",
    "cacheReadTokens": "Cache Hit",
    "cacheCreationTokens": "Cache Creation",
    "timingInfo": "Duration/TTFT",
    "status": "Status",
    "multiplier": "Multiplier",
    "requestModel": "Request Model",
    "responseModel": "Response Model",
    "noData": "No data",
    "unknownProvider": "Unknown Provider",
    "stream": "Stream",
    "nonStream": "Non-stream",
    "source": "Source",
    "requestsLabel": "requests",
    "costLabel": "total cost",
    "appFilter": {
      "all": "All",
      "claude": "Claude Code",
      "codex": "Codex",
      "gemini": "Gemini",
      "opencode": "OpenCode",
      "grokbuild": "Grok Build"
    },
    "rawInputLabel": "Raw",
    "rebuildCodex": {
      "title": "Codex Usage Maintenance",
      "description": "Rebuild Codex session usage from local rollout logs",
      "warning": "The database is backed up first. History whose source JSONL has been deleted cannot be re-imported.",
      "action": "Rebuild Codex Usage",
      "confirmTitle": "Rebuild Codex usage?",
      "confirmMessage": "This clears existing Codex session details and rollups, then imports them again from local Codex logs.\n\nHistory with deleted logs will be lost. Forks whose parent rollout is missing will be deferred.",
      "confirmAction": "Back Up and Rebuild",
      "completed": "Rebuild complete: {{imported}} imported, {{errors}} errors, {{suspected}} suspected duplicates, {{deferred}} deferred files",
      "failed": "Codex usage rebuild failed: {{error}}"
    },
    "totalRecords": "{{total}} records total",
    "goToPage": "Go",
    "pageInputPlaceholder": "Page",
    "modelPricing": "Model Pricing",
    "loadPricingError": "Failed to load pricing data",
    "modelPricingDesc": "Configure token costs for each model",
    "noPricingData": "No pricing data. Click \"Add\" to add model pricing configuration.",
    "model": "Model",
    "pricingModel": "Pricing Model",
    "displayName": "Display Name",
    "inputCost": "Input Cost",
    "outputCost": "Output Cost",
    "cacheReadCost": "Cache Hit",
    "cacheWriteCost": "Cache Creation",
    "deleteConfirmTitle": "Confirm Delete",
    "deleteConfirmDesc": "Are you sure you want to delete this model pricing? This action cannot be undone.",
    "queryFailed": "Query failed",
    "refreshUsage": "Refresh usage",
    "planUsage": "Plan usage",
    "invalid": "Expired",
    "total": "Total:",
    "used": "Used:",
    "remaining": "Remaining:",
    "justNow": "Just now",
    "minutesAgo": "{{count}} min ago",
    "hoursAgo": "{{count}} hr ago",
    "daysAgo": "{{count}} day ago",
    "multiplePlans": "{{count}} plans",
    "expand": "Expand",
    "collapse": "Collapse",
    "modelIdPlaceholder": "e.g., claude-3-5-sonnet-20241022",
    "displayNamePlaceholder": "e.g., Claude 3.5 Sonnet",
    "appType": "App Type",
    "statusCode": "Status Code",
    "allSources": "All Sources",
    "allModels": "All Models",
    "filterBySource": "Filter by source",
    "filterByModel": "Filter by model",
    "refreshInterval": "Auto-refresh interval",
    "refreshOff": "Off",
    "timeRange": "Time Range",
    "customRange": "Calendar Filter",
    "customRangeHint": "Supports both date and time",
    "startTime": "Start Time",
    "endTime": "End Time",
    "liveEndTime": "End time follows current time",
    "liveEndTimeNow": "Now",
    "input": "Input",
    "output": "Output",
    "cacheWrite": "Creation",
    "cacheWriteNotReported": "OpenAI protocol doesn't distinguish cache creation; only cache hits are reported",
    "cacheWritePartial": "Some protocols (e.g. OpenAI) don't report cache creation; the value may be incomplete",
    "cacheRead": "Hit",
    "baseCost": "Base",
    "costMultiplier": "Cost Multiplier",
    "withMultiplier": "with multiplier",
    "requestDetail": "Request Detail",
    "requestNotFound": "Request not found",
    "basicInfo": "Basic Info",
    "tokenUsage": "Token Usage",
    "cacheCreationCost": "Cache Creation Cost",
    "costBreakdown": "Cost Breakdown",
    "performance": "Performance",
    "latency": "Latency",
    "errorMessage": "Error Message",
    "requests": "Requests",
    "tokens": "Tokens",
    "avgCost": "Average Cost",
    "avgLatency": "Average Latency",
    "successRate": "Success Rate",
    "requestId": "Request ID",
    "never": "Never",
    "modelId": "Model ID",
    "modelIdRequired": "Model ID is required",
    "inputCostPerMillion": "Input Cost (per million tokens, USD)",
    "outputCostPerMillion": "Output Cost (per million tokens, USD)",
    "invalidPrice": "Price must be non-negative",
    "invalidTimeRange": "Please select complete start/end time",
    "invalidTimeRangeOrder": "Start time cannot be later than end time",
    "timeRangeTooLarge": "Time range is too large, please narrow it down",
    "addPricing": "Add Pricing",
    "editPricing": "Edit Pricing",
    "pricingAdded": "Pricing added",
    "pricingUpdated": "Pricing updated",
    "importFromModelsDev": "Import from models.dev",
    "modelsDevHint": "Skip manual entry — pick model pricing from models.dev",
    "modelsDevPickerTitle": "Import Pricing from models.dev",
    "modelsDevPickerDesc": "Select a model to import (prices in USD per million tokens). One model per import.",
    "modelsDevSearchPlaceholder": "Search models or providers (full search)...",
    "modelsDevAllProviders": "All providers",
    "modelsDevLoadError": "Failed to load models.dev data",
    "modelsDevRetry": "Retry",
    "modelsDevImportButton": "Import",
    "modelsDevImporting": "Importing...",
    "modelsDevImported": "Imported pricing for {{name}}",
    "modelsDevNoResults": "No matching models",
    "modelsDevTruncated": "Showing first {{shown}} of {{total}} results — refine your search",
    "modelsDevDefaultHint": "Showing the {{shown}} most recently released models (of {{total}}) — type to search all",
    "modelsDevAutoSync": {
      "title": "Automatic models.dev pricing sync",
      "description": "When enabled, periodically fetch selected prices when CC Switch launches and keep them in your local pricing file.",
      "enabled": "Enabled",
      "disabled": "Disabled",
      "enableConfirmTitle": "Enable automatic pricing sync?",
      "enableConfirmMessage": "After enabling, CC Switch will periodically update prices for the selected models from models.dev when it launches (at most once every 6 hours). Built-in and manually configured prices with the same model ID will be overwritten.",
      "enableConfirmAction": "Enable automatic sync",
      "configure": "Choose models",
      "configureTitle": "Choose models for automatic pricing sync",
      "configureDescription": "Search and filter models to update automatically. Your choices are stored locally.",
      "commonModels": "Automatically include common models",
      "commonModelsDescription": "Selects {{count}} recent Claude, GPT, Gemini, Grok, DeepSeek, Qwen, MiMo, LongCat, Kimi, MiniMax, and GLM models.",
      "selectFiltered": "Select filtered ({{count}})",
      "clearFiltered": "Clear filtered",
      "selectedCount": "{{count}} models selected",
      "selectionHint": "Selections with the same normalized model ID are imported once.",
      "commonBadge": "Common",
      "selectionSaved": "Automatic pricing selection saved",
      "syncSuccess": "Pricing sync complete: {{imported}} models checked, {{changed}} updated",
      "syncFailed": "Pricing sync failed: {{error}}",
      "configLoadFailed": "Failed to load local pricing configuration: {{error}}",
      "neverSynced": "Never",
      "lastSync": "Last sync",
      "commonStatus": "Common models",
      "lastError": "Last automatic sync failed: {{error}}",
      "localFile": "Local pricing file",
      "openFolder": "Open folder",
      "openFolderFailed": "Failed to open the local pricing folder: {{error}}",
      "reloadLocalFile": "Reload file",
      "localFileReloaded": "Local pricing file reloaded",
      "localFileReloadFailed": "Failed to reload local pricing file: {{error}}",
      "syncNow": "Sync now"
    },
    "cacheReadCostPerMillion": "Cache Read Cost (per million tokens, USD)",
    "cacheCreationCostPerMillion": "Cache Write Cost (per million tokens, USD)"
  },
  "usageScript": {
    "title": "Configure Usage Query",
    "enableUsageQuery": "Enable usage query",
    "presetTemplate": "Preset template",
    "requestUrl": "Request URL",
    "requestUrlPlaceholder": "e.g. https://api.example.com",
    "method": "HTTP method",
    "templateCustom": "Custom",
    "templateGeneral": "General",
    "templateNewAPI": "NewAPI",
    "templateCopilot": "GitHub Copilot",
    "templateTokenPlan": "Token Plan",
    "templateBalance": "Official",
    "templateOfficialSubscription": "Official Subscription",
    "copilotAutoAuth": "Auto OAuth authentication, no manual credentials needed",
    "tokenPlanHint": "Automatically uses the provider's API Key and Base URL to query Token Plan quota",
    "balanceHint": "Automatically uses the provider's API Key to query account balance",
    "officialSubscriptionHint": "Reads the local CLI OAuth credentials and calls the official API to query subscription quota. Disabled by default and only requests after you enable it.",
    "resetDate": "Reset date",
    "premiumRequests": "Premium Requests",
    "credentialsConfig": "Credentials",
    "credentialsHint": "Leave empty to use provider config",
    "optional": "optional",
    "apiKeyPlaceholder": "Leave empty to use provider's API Key",
    "baseUrlPlaceholder": "Leave empty to use provider's base URL",
    "baseUrl": "Base URL",
    "accessToken": "Access Token",
    "accessTokenPlaceholder": "Generate in 'Security Settings'",
    "userId": "User ID",
    "userIdPlaceholder": "e.g., 114514",
    "accessKeyId": "AccessKey ID",
    "secretAccessKey": "SecretAccessKey",
    "volcengineAkSkHint": "Volcengine usage query needs an account-level AccessKey ID / Secret (different from the inference API key). Create them in the Volcengine console via the top-right account menu → 'API Access Keys'.",
    "volcengineKeyConsoleLink": "Create keys at:",
    "zhipuTeamHint": "Zhipu team plan usage query needs the team API key (reuses this provider's credentials) + organization ID + project ID (sent as bigmodel-organization / bigmodel-project request headers). Find the organization and project IDs in the team admin console's usage page URL.",
    "zhipuTeamConsoleLink": "Team usage page:",
    "organizationId": "Organization ID",
    "organizationIdPlaceholder": "e.g. org-xxxxxx",
    "projectId": "Project ID",
    "projectIdPlaceholder": "e.g. proj-xxxxxx",
    "defaultPlan": "Default Plan",
    "queryFailedMessage": "Query failed",
    "queryScript": "Query script (JavaScript)",
    "timeoutSeconds": "Timeout (seconds)",
    "headers": "Headers",
    "body": "Body",
    "timeoutHint": "Range: 2-30 seconds",
    "timeoutMustBeInteger": "Timeout must be an integer, decimal part ignored",
    "timeoutCannotBeNegative": "Timeout cannot be negative",
    "autoIntervalMinutes": "Auto query interval (minutes, 0 to disable)",
    "autoQueryInterval": "Auto Query Interval (minutes)",
    "autoQueryIntervalHint": "0 to disable; recommend 5-60 minutes",
    "intervalMustBeInteger": "Interval must be an integer, decimal part ignored",
    "intervalCannotBeNegative": "Interval cannot be negative",
    "intervalAdjusted": "Interval adjusted to {{value}} minutes",
    "scriptHelp": "Script writing instructions:",
    "configFormat": "Configuration format:",
    "commentOptional": "optional",
    "commentResponseIsJson": "response is the JSON data returned by the API",
    "extractorFormat": "Extractor return format (all fields optional):",
    "tips": "💡 Tips:",
    "testing": "Testing...",
    "testScript": "Test script",
    "format": "Format",
    "saveConfig": "Save config",
    "scriptEmpty": "Script configuration cannot be empty",
    "mustHaveReturn": "Script must contain return statement",
    "testSuccess": "Test successful!",
    "testFailed": "Test failed",
    "formatSuccess": "Format successful",
    "formatFailed": "Format failed",
    "supportedVariables": "Supported Variables",
    "variablesHint": "Supported variables: {{apiKey}}, {{baseUrl}} | extractor function receives API response JSON object",
    "scriptConfig": "Request configuration",
    "extractorCode": "Extractor code",
    "extractorHint": "Return object should include remaining quota fields",
    "fieldIsValid": "• isValid: Boolean, whether plan is valid",
    "fieldInvalidMessage": "• invalidMessage: String, reason for expiration (shown when isValid is false)",
    "fieldRemaining": "• remaining: Number, remaining quota",
    "fieldUnit": "• unit: String, unit (e.g., \"USD\")",
    "fieldPlanName": "• planName: String, plan name",
    "fieldTotal": "• total: Number, total quota",
    "fieldUsed": "• used: Number, used quota",
    "fieldExtra": "• extra: String, custom display text",
    "tip1": "• Variables {{apiKey}} and {{baseUrl}} are automatically replaced",
    "tip2": "• Extractor function runs in sandbox environment, supports ES2020+ syntax",
    "tip3": "• Entire config must be wrapped in () to form object literal expression"
  },
  "dbUpgrade": {
    "title": "Database version is too new",
    "description": "This database was created by a newer version of CC Switch. Upgrade the app to continue. Upgrading will not delete your data.",
    "versionInfo": "Database v{{db}} · App supports v{{supported}}",
    "dbPath": "Database file",
    "checking": "Checking for available updates…",
    "updateAvailable": "Version v{{version}} is available; upgrading will let you continue.",
    "incompatibleTitle": "Upgrading won't fix this",
    "incompatibleDescription": "You are already on the latest version, but the database (v{{db}}) is still newer than this app supports (v{{supported}}). It was likely created by a third-party client or a newer build, so upgrading the official app cannot make it compatible.",
    "preparing": "Preparing update…",
    "downloading": "Downloading update…",
    "upgradeNow": "Upgrade app",
    "retry": "Retry upgrade",
    "openReleases": "Open releases page",
    "openConfigDir": "Open config folder",
    "quit": "Quit"
  },
  "errors": {
    "usage_query_failed": "Usage query failed",
    "configLoadFailedTitle": "Configuration Load Failed",
    "configLoadFailedMessage": "Unable to read configuration file:\n{{path}}\n\nError details:\n{{detail}}\n\nPlease check if the JSON is valid, or restore from a backup file (e.g., config.json.bak) in the same directory.\n\nThe app will exit so you can fix this.",
    "frontendCrashTitle": "Something went wrong in the interface",
    "frontendCrashMessage": "An attempt was made to write the error to the application diagnostic log. Reload the interface, and attach the log when opening an issue if the problem continues.",
    "reloadInterface": "Reload interface"
  },
  "presetSelector": {
    "title": "Select Configuration Type",
    "custom": "Custom",
    "customDescription": "Manually configure provider, requires complete configuration",
    "officialDescription": "Official login, no API Key required",
    "presetDescription": "Use preset configuration, only API Key required"
  },
  "mcp": {
    "title": "MCP Management",
    "import": "Import",
    "importExisting": "Import Existing",
    "addMcp": "Add MCP",
    "claudeTitle": "Claude Code MCP Management",
    "codexTitle": "Codex MCP Management",
    "geminiTitle": "Gemini MCP Management",
    "unifiedPanel": {
      "title": "MCP Server Management",
      "addServer": "Add Server",
      "editServer": "Edit Server",
      "deleteServer": "Delete Server",
      "deleteConfirm": "Are you sure you want to delete server \"{{id}}\"? This action cannot be undone.",
      "noServers": "No servers yet",
      "enabledApps": "Enabled Apps",
      "noImportFound": "No MCP servers to import found. All servers are already managed by CC Switch.",
      "importSuccess": "Successfully imported {{count}} MCP servers",
      "apps": {
        "claude": "Claude",
        "codex": "Codex",
        "gemini": "Gemini",
        "grokbuild": "Grok Build",
        "opencode": "OpenCode",
        "openclaw": "OpenClaw",
        "hermes": "Hermes"
      }
    },
    "userLevelPath": "User-level MCP path",
    "serverList": "Servers",
    "loading": "Loading...",
    "empty": "No MCP servers",
    "emptyDescription": "Click the button in the top right to add your first MCP server",
    "add": "Add MCP",
    "addServer": "Add MCP",
    "editServer": "Edit MCP",
    "addClaudeServer": "Add Claude Code MCP",
    "editClaudeServer": "Edit Claude Code MCP",
    "addCodexServer": "Add Codex MCP",
    "editCodexServer": "Edit Codex MCP",
    "configPath": "Config Path",
    "serverCount": "{{count}} MCP server(s) configured",
    "enabledCount": "{{count}} enabled",
    "template": {
      "fetch": "Quick Template: mcp-fetch"
    },
    "form": {
      "title": "MCP Title (Unique)",
      "titlePlaceholder": "my-mcp-server",
      "name": "Display Name",
      "namePlaceholder": "e.g. @modelcontextprotocol/server-time",
      "enabledApps": "Enable to Apps",
      "noAppsWarning": "At least one app must be selected",
      "description": "Description",
      "descriptionPlaceholder": "Optional description",
      "tags": "Tags (comma separated)",
      "tagsPlaceholder": "stdio, time, utility",
      "homepage": "Homepage",
      "homepagePlaceholder": "https://example.com",
      "docs": "Docs",
      "docsPlaceholder": "https://example.com/docs",
      "additionalInfo": "Additional Info",
      "jsonConfig": "Full JSON Configuration",
      "jsonConfigOrPrefix": "Full JSON configuration or use",
      "tomlConfigOrPrefix": "Full TOML configuration or use",
      "jsonPlaceholder": "{\n  \"type\": \"stdio\",\n  \"command\": \"uvx\",\n  \"args\": [\"mcp-server-fetch\"]\n}",
      "tomlConfig": "Full TOML Configuration",
      "tomlPlaceholder": "type = \"stdio\"\ncommand = \"uvx\"\nargs = [\"mcp-server-fetch\"]",
      "useWizard": "Config Wizard",
      "syncOtherSide": "Mirror to {{target}}",
      "syncOtherSideHint": "Apply the same settings to {{target}}; existing entries with the same id will be overwritten.",
      "willOverwriteWarning": "Will overwrite existing config in {{target}}"
    },
    "wizard": {
      "title": "MCP Configuration Wizard",
      "hint": "Quickly configure MCP server and auto-generate JSON configuration",
      "type": "Type",
      "typeStdio": "stdio",
      "typeHttp": "http",
      "typeSse": "sse",
      "command": "Command",
      "commandPlaceholder": "npx or uvx",
      "args": "Arguments",
      "argsPlaceholder": "arg1\narg2",
      "env": "Environment Variables",
      "envPlaceholder": "KEY1=value1\nKEY2=value2",
      "url": "URL",
      "urlPlaceholder": "https://api.example.com/mcp",
      "urlRequired": "Please enter URL",
      "headers": "Headers (optional)",
      "headersPlaceholder": "Authorization: Bearer your_token_here\nContent-Type: application/json",
      "preview": "Configuration Preview",
      "apply": "Apply Configuration"
    },
    "id": "Identifier (unique)",
    "type": "Type",
    "command": "Command",
    "validateCommand": "Validate Command",
    "args": "Args",
    "argsPlaceholder": "e.g., mcp-server-fetch --help",
    "env": "Environment (one per line, KEY=VALUE)",
    "envPlaceholder": "FOO=bar\nHELLO=world",
    "reset": "Reset",
    "msg": {
      "saved": "Saved",
      "deleted": "Deleted",
      "enabled": "Enabled",
      "disabled": "Disabled",
      "templateAdded": "Template added"
    },
    "error": {
      "idRequired": "Please enter identifier",
      "idExists": "Identifier already exists. Please choose another.",
      "jsonInvalid": "Invalid JSON format",
      "tomlInvalid": "Invalid TOML format",
      "commandRequired": "Please enter command",
      "singleServerObjectRequired": "Please paste a single MCP server object (do not include top-level mcpServers)",
      "saveFailed": "Save failed",
      "deleteFailed": "Delete failed"
    },
    "validation": {
      "ok": "Command available",
      "fail": "Command not found"
    },
    "confirm": {
      "deleteTitle": "Delete MCP Server",
      "deleteMessage": "Are you sure you want to delete MCP server \"{{id}}\"? This action cannot be undone."
    },
    "presets": {
      "title": "Select MCP Type",
      "enable": "Enable",
      "enabled": "Enabled",
      "installed": "Installed",
      "docs": "Docs",
      "requiresEnv": "Requires env",
      "fetch": {
        "name": "mcp-server-fetch",
        "description": "Universal HTTP request tool, supports GET/POST and other HTTP methods, suitable for quick API requests and web data scraping"
      },
      "time": {
        "name": "@modelcontextprotocol/server-time",
        "description": "Time query tool providing current time, timezone conversion, and date calculation features"
      },
      "memory": {
        "name": "@modelcontextprotocol/server-memory",
        "description": "Knowledge graph memory system supporting entities, relations, and observations to help AI remember important information from conversations"
      },
      "sequential-thinking": {
        "name": "@modelcontextprotocol/server-sequential-thinking",
        "description": "Sequential thinking tool helping AI break down complex problems into multiple steps for deeper thinking"
      },
      "context7": {
        "name": "@upstash/context7-mcp",
        "description": "Context7 documentation search tool providing latest library docs and code examples, with higher limits when configured with a key"
      }
    }
  },
  "prompts": {
    "manage": "Prompts",
    "title": "{{appName}} Prompt Management",
    "claudeTitle": "Claude Prompt Management",
    "codexTitle": "Codex Prompt Management",
    "add": "Add Prompt",
    "edit": "Edit Prompt",
    "addTitle": "Add {{appName}} Prompt",
    "editTitle": "Edit {{appName}} Prompt",
    "import": "Import Existing",
    "count": "{{count}} prompts",
    "enabled": "Enabled",
    "enable": "Enable",
    "enabledName": "Enabled: {{name}}",
    "noneEnabled": "No prompt enabled",
    "currentFile": "Current {{filename}} Content",
    "empty": "No prompts yet",
    "emptyDescription": "Click the button above to add or import prompts",
    "loading": "Loading...",
    "name": "Name",
    "namePlaceholder": "e.g., Default Project Prompt",
    "description": "Description",
    "descriptionPlaceholder": "Optional description",
    "content": "Content",
    "contentPlaceholder": "# {{filename}}\n\nEnter prompt content here...",
    "loadFailed": "Failed to load prompts",
    "saveSuccess": "Saved successfully",
    "saveFailed": "Failed to save",
    "deleteSuccess": "Deleted successfully",
    "deleteFailed": "Failed to delete",
    "enableSuccess": "Enabled successfully",
    "enableFailed": "Failed to enable",
    "disableSuccess": "Disabled successfully",
    "disableFailed": "Failed to disable",
    "importSuccess": "Imported successfully",
    "importFailed": "Failed to import",
    "confirm": {
      "deleteTitle": "Confirm Delete",
      "deleteMessage": "Are you sure you want to delete prompt \"{{name}}\"?"
    }
  },
  "profiles": {
    "switcherTooltip": {
      "claude": "Projects: switch the Claude Code provider / MCP / Skills / memory files in one click",
      "claude-desktop": "Projects: switch the Claude Desktop provider in one click",
      "codex": "Projects: switch the Codex provider / MCP / Skills / memory files in one click"
    },
    "none": "No project",
    "searchPlaceholder": "Search projects",
    "empty": "No projects yet",
    "createFromCurrent": "New project",
    "createDescription": {
      "claude": "Save the current Claude Code provider, MCP, Skills and memory file as a project you can switch to later.",
      "claude-desktop": "Save the current Claude Desktop provider as a project you can switch to later.",
      "codex": "Save the current Codex provider, MCP, Skills and memory file configuration as a project you can switch to later."
    },
    "manage": "Manage projects…",
    "manageTitle": "Manage Projects",
    "manageDescription": "Projects are configuration snapshots. When you switch projects, the current configuration is automatically saved back to the project you are leaving.",
    "namePlaceholder": "e.g. Development, Drawing",
    "rename": "Rename",
    "noSnapshotForScope": "Not saved for this app yet",
    "delete": "Delete",
    "deleteConfirmTitle": "Confirm Delete",
    "deleteConfirmMessage": "Are you sure you want to delete project \"{{name}}\"? Your current configuration will not be changed.",
    "createSuccess": "Project created",
    "createFailed": "Failed to create project: {{detail}}",
    "updateSuccess": "Project updated",
    "updateFailed": "Failed to update project: {{detail}}",
    "deleteSuccess": "Project deleted",
    "deleteFailed": "Failed to delete project: {{detail}}",
    "applySuccess": "Project applied",
    "applyFailed": "Failed to apply project: {{detail}}",
    "applyWarnings": "Project applied with {{warningCount}} warning(s):\n{{details}}",
    "clearSuccess": "Switched to no project"
  },
  "workspace": {
    "title": "Workspace Files",
    "manage": "Workspace",
    "files": {
      "agents": "Agent instructions and rules",
      "soul": "Agent personality and communication style",
      "user": "User profile and preferences",
      "identity": "Agent name and avatar",
      "tools": "Local tool documentation",
      "memory": "Long-term memory and decisions",
      "heartbeat": "Heartbeat run checklist",
      "bootstrap": "First-run bootstrap ritual",
      "boot": "Gateway reboot checklist"
    },
    "editing": "Edit {{filename}}",
    "saveSuccess": "Saved successfully",
    "saveFailed": "Failed to save",
    "loadFailed": "Failed to load",
    "openDirectory": "Open in file manager",
    "dailyMemory": {
      "title": "Daily Memory",
      "sectionTitle": "Daily Memory",
      "cardTitle": "Daily Memory Files",
      "cardDescription": "Browse & manage daily memories",
      "createToday": "Add Memory",
      "empty": "No daily memory files yet",
      "loadFailed": "Failed to load daily memory files",
      "createFailed": "Failed to create daily memory file",
      "deleteSuccess": "Daily memory file deleted",
      "deleteFailed": "Failed to delete daily memory file",
      "confirmDeleteTitle": "Delete Daily Memory",
      "confirmDeleteMessage": "Delete the daily memory for {{date}}? This cannot be undone.",
      "searchPlaceholder": "Search full content...",
      "searchScopeHint": "Full-text search across all daily memories. ⌘F",
      "searchCloseHint": "Esc to close",
      "noSearchResults": "No daily memories match your search.",
      "searching": "Searching...",
      "searchFailed": "Search failed",
      "matchCount": "{{count}} match(es)"
    }
  },
  "openclaw": {
    "backupCreated": "Backup created: {{path}}",
    "providerKey": "Provider Key",
    "providerKeyPlaceholder": "my-provider",
    "providerKeyHint": "Unique identifier in config file. Use lowercase letters, numbers, and hyphens only.",
    "providerKeyLockedHint": "This provider has already been added to the app config, so its key can no longer be changed.",
    "providerKeyRequired": "Provider key is required",
    "providerKeyDuplicate": "This key is already in use",
    "providerKeyInvalid": "Invalid format. Use lowercase letters, numbers, and hyphens only.",
    "apiProtocol": "API Protocol",
    "selectProtocol": "Select API Protocol",
    "apiProtocolHint": "Select the protocol type compatible with the provider's API. Most providers use OpenAI Completions format.",
    "baseUrl": "API Endpoint",
    "baseUrlHint": "The provider's API endpoint address.",
    "models": "Models",
    "addModel": "Add Model",
    "noModels": "No models configured. Click Add Model to configure available models.",
    "modelId": "Model ID",
    "modelIdPlaceholder": "claude-3-sonnet",
    "modelName": "Display Name",
    "modelNamePlaceholder": "Claude 3 Sonnet",
    "contextWindow": "Context Window",
    "maxTokens": "Max Output Tokens",
    "reasoning": "Reasoning Mode",
    "reasoningOn": "Enabled",
    "reasoningOff": "Disabled",
    "inputTypes": "Input Types",
    "inputCost": "Input Cost ($/M tokens)",
    "outputCost": "Output Cost ($/M tokens)",
    "advancedOptions": "Advanced Options",
    "cacheReadCost": "Cache Read Cost ($/M tokens)",
    "cacheWriteCost": "Cache Write Cost ($/M tokens)",
    "cacheCostHint": "Cache costs are used to calculate Prompt Caching costs. Leave empty if not using caching.",
    "modelsHint": "Configure the models supported by this provider. Model ID is used for API calls, Display Name for the interface.",
    "userAgent": "Send User-Agent",
    "userAgentHint": "Some providers require a browser User-Agent header to work properly.",
    "env": {
      "title": "Environment Variables",
      "description": "Manage environment variables in openclaw.json (API keys, custom variables, etc.)",
      "editorHint": "Edit the full env section as JSON. Nested objects such as env.vars and env.shellEnv are supported.",
      "objectRequired": "OpenClaw env must be a JSON object.",
      "invalidJson": "OpenClaw env must be valid JSON.",
      "empty": "OpenClaw env cannot be empty. Use {} for an empty object.",
      "keyPlaceholder": "Variable name",
      "valuePlaceholder": "Value",
      "add": "Add Variable",
      "saveSuccess": "Environment variables saved",
      "saveFailed": "Failed to save environment variables",
      "loadFailed": "Failed to load environment variables",
      "duplicateKey": "Duplicate variable name detected: {{key}}"
    },
    "tools": {
      "title": "Tool Permissions",
      "description": "Manage tool permissions in openclaw.json (allow/deny lists)",
      "profile": "Permission Profile",
      "profileMinimal": "Minimal",
      "profileCoding": "Coding",
      "profileMessaging": "Messaging",
      "profileFull": "Full",
      "profileUnset": "Not set",
      "unsupportedProfileTitle": "Unsupported tools profile detected",
      "unsupportedProfileDescription": "The current tools.profile value '{{value}}' is not in the supported OpenClaw list. It will be preserved until you choose a new value.",
      "unsupportedProfileLabel": "unsupported",
      "allowList": "Allow List",
      "denyList": "Deny List",
      "patternPlaceholder": "Tool name or pattern",
      "addAllow": "Add Allow",
      "addDeny": "Add Deny",
      "saveSuccess": "Tool permissions saved",
      "saveFailed": "Failed to save tool permissions",
      "loadFailed": "Failed to load tool permissions"
    },
    "agents": {
      "title": "Agents Config",
      "description": "Manage agents.defaults in openclaw.json (default model, runtime parameters, etc.)",
      "modelSection": "Model Configuration",
      "primaryModel": "Default Model",
      "primaryModelHint": "Select from models of configured providers",
      "notSet": "Not set",
      "fallbackModels": "Fallback Models",
      "fallbackModelsHint": "When the primary model is unavailable, fallbacks are tried in order",
      "addFallback": "Add fallback model",
      "noModels": "No configured provider models. Please add an OpenClaw provider first.",
      "notInList": "{{value}} (not configured)",
      "runtimeSection": "Runtime Parameters",
      "workspace": "Workspace Path",
      "timeout": "Timeout (seconds)",
      "contextTokens": "Context Tokens",
      "maxConcurrent": "Max Concurrent",
      "legacyTimeoutTitle": "Legacy timeout detected",
      "legacyTimeoutDescription": "This config still uses agents.defaults.timeout. Saving here will migrate it to timeoutSeconds.",
      "saveSuccess": "Agents config saved",
      "saveFailed": "Failed to save agents config",
      "loadFailed": "Failed to load agents config"
    },
    "health": {
      "title": "OpenClaw config warnings detected",
      "invalidToolsProfile": "tools.profile contains an unsupported value. OpenClaw currently expects minimal, coding, messaging, or full.",
      "legacyTimeout": "agents.defaults.timeout is deprecated. Save the Agents panel to migrate it to timeoutSeconds.",
      "stringifiedEnvVars": "env.vars should be an object, but the current value looks stringified or malformed.",
      "stringifiedShellEnv": "env.shellEnv should be an object, but the current value looks stringified or malformed.",
      "parseFailed": "openclaw.json could not be parsed as valid JSON5. Fix the file before editing it here."
    },
    "primaryModel": "Primary Model",
    "fallbackModel": "Fallback Model"
  },
  "hermes": {
    "form": {
      "baseUrl": "API Endpoint",
      "baseUrlHint": "The API endpoint URL for this provider.",
      "providerKey": "Provider Key",
      "providerKeyPlaceholder": "my-provider",
      "providerKeyHint": "Lowercase letters, numbers, and hyphens only. Used as the provider name in config.yaml.",
      "providerKeyLockedHint": "This provider is in Hermes config; key is locked.",
      "providerKeyRequired": "Provider key is required",
      "providerKeyInvalid": "Provider key can only contain lowercase letters, numbers, and hyphens",
      "providerKeyDuplicate": "This provider key already exists",
      "apiMode": "API Mode",
      "apiModeHint": "Provider API protocol. Choose the format that matches your endpoint.",
      "apiModeChatCompletions": "OpenAI Chat Completions",
      "apiModeAnthropicMessages": "Anthropic Messages",
      "apiModeCodexResponses": "OpenAI Responses",
      "apiModeBedrockConverse": "AWS Bedrock Converse",
      "baseUrlRequired": "API endpoint is required",
      "baseUrlScheme": "Use an http:// or https:// address",
      "baseUrlInvalid": "API endpoint is not a valid URL",
      "models": "Models",
      "addModel": "Add model",
      "noModels": "No models configured. Switching to this provider won't change the default model.",
      "modelId": "Model ID",
      "modelIdPlaceholder": "anthropic/claude-opus-5",
      "modelName": "Display name",
      "modelNamePlaceholder": "Claude Opus 5",
      "contextLength": "Context length",
      "advancedOptions": "Advanced options",
      "modelsHint": "On switch, the first model is written to top-level model.default.",
      "primaryModel": "Default",
      "fallbackModel": "Alternate",
      "providerAdvanced": "Provider advanced options",
      "rateLimitDelay": "Rate limit delay (seconds)",
      "rateLimitDelayHint": "Minimum delay in seconds between consecutive requests (optional). Leave empty for no limit."
    },
    "webui": {
      "open": "Open Hermes Web UI",
      "offline": "Hermes Web UI is not running. Start it with `hermes dashboard` first.",
      "openFailed": "Failed to open Hermes Web UI",
      "launchConfirmTitle": "Hermes Dashboard is not running",
      "launchConfirmMessage": "Open a terminal and start it now with `hermes dashboard`?\n\nThe browser will open automatically once startup completes.\n\nIf the terminal reports that `hermes` cannot be found or the web extras are missing, run first:\npip install hermes-agent[web]",
      "launchConfirmAction": "Open terminal & launch",
      "launching": "Started `hermes dashboard` in a terminal.",
      "launchFailed": "Failed to open terminal"
    },
    "memory": {
      "title": "Memory",
      "agentTab": "Agent Memory (MEMORY.md)",
      "userTab": "User Profile (USER.md)",
      "usage": "{{current}} / {{limit}} characters",
      "overLimit": "Over budget — Hermes will truncate on next load",
      "enableOn": "Enabled",
      "enableOff": "Disabled",
      "disabledHint": "Hermes will skip this memory until re-enabled",
      "toggleFailed": "Failed to toggle memory",
      "saveSuccess": "Memory saved",
      "saveFailed": "Failed to save memory",
      "loadFailed": "Failed to read memory file",
      "openConfig": "Adjust limits in Hermes Web UI",
      "runtimeNote": "Changes apply on Hermes restart or new session."
    }
  },
  "env": {
    "warning": {
      "title": "Environment Variable Conflicts Detected",
      "description": "Found {{count}} environment variables that may override your configuration"
    },
    "actions": {
      "expand": "View Details",
      "collapse": "Collapse",
      "selectAll": "Select All",
      "clearSelection": "Clear Selection",
      "deleteSelected": "Delete Selected ({{count}})",
      "deleting": "Deleting..."
    },
    "field": {
      "value": "Value",
      "source": "Source"
    },
    "source": {
      "userRegistry": "User Environment Variable (Registry)",
      "systemRegistry": "System Environment Variable (Registry)",
      "systemEnv": "System Environment Variable"
    },
    "delete": {
      "success": "Environment variables deleted successfully",
      "error": "Failed to delete environment variables"
    },
    "backup": {
      "location": "Backup location: {{path}}"
    },
    "confirm": {
      "title": "Confirm Delete Environment Variables",
      "message": "Are you sure you want to delete {{count}} environment variable(s)?",
      "backupNotice": "A backup will be created automatically before deletion. You can restore it later. Changes take effect after restarting the application or terminal.",
      "confirm": "Confirm Delete"
    },
    "error": {
      "noSelection": "Please select environment variables to delete"
    }
  },
  "skills": {
    "manage": "Skills",
    "title": "Skills Management",
    "description": "Discover and install skills from popular repositories to extend Claude Code/Codex/Gemini capabilities",
    "refresh": "Refresh",
    "refreshing": "Refreshing...",
    "repoManager": "Repository Management",
    "count": "{{count}} skills",
    "empty": "No skills available",
    "emptyDescription": "Add skill repositories to discover available skills",
    "addRepo": "Add Skill Repository",
    "loading": "Loading...",
    "installed": "Installed",
    "install": "Install",
    "installing": "Installing...",
    "uninstall": "Uninstall",
    "uninstalling": "Uninstalling...",
    "view": "View",
    "noDescription": "No description",
    "loadFailed": "Failed to load",
    "installSuccess": "Skill {{name}} installed",
    "installFailed": "Failed to install",
    "uninstallSuccess": "Skill {{name}} uninstalled",
    "uninstallFailed": "Failed to uninstall",
    "update": "Update",
    "updating": "Updating...",
    "updateAvailable": "Update",
    "updateSuccess": "Skill {{name}} updated to latest version",
    "updateFailed": "Failed to update",
    "checkUpdates": "Check Updates",
    "checkingUpdates": "Checking...",
    "noUpdates": "All skills are up to date",
    "updatesFound": "{{count}} skill(s) have updates available",
    "updateAll": "Update All ({{count}})",
    "updatingAll": "Updating...",
    "updateAllSuccess": "Successfully updated {{count}} skill(s)",
    "error": {
      "skillNotFound": "Skill not found: {{directory}}",
      "missingRepoInfo": "Missing repository info (owner or name)",
      "downloadTimeout": "Download repository {{owner}}/{{name}} timeout ({{timeout}}s)",
      "downloadTimeoutHint": "Please check network connection or retry later",
      "skillPathNotFound": "Skill path '{{path}}' not found in repository {{owner}}/{{name}}",
      "skillDirNotFound": "Skill directory not found: {{path}}",
      "directoryConflict": "Skill directory '{{directory}}' is already occupied by {{existing_repo}}, cannot install from {{new_repo}}",
      "emptyArchive": "Downloaded archive is empty",
      "invalidRepoRef": "Invalid repository reference: {{owner}}/{{name}}",
      "archiveTooLarge": "Archive exceeds the {{limit_mb}} MB extraction limit; aborted",
      "archiveTooManyEntries": "Archive has too many entries ({{count}}); the limit is {{limit}}",
      "downloadFailed": "Download failed: HTTP {{status}}",
      "allBranchesFailed": "All branches failed, tried: {{branches}}",
      "httpError": "HTTP error {{status}}",
      "http403": "GitHub access restricted, possibly rate limited",
      "http404": "Repository or branch not found, please check URL",
      "http429": "Too many requests, please wait and retry",
      "parseMetadataFailed": "Failed to parse skill metadata",
      "getHomeDirFailed": "Unable to get user home directory",
      "noSkillsInZip": "No skills found in ZIP file (requires SKILL.md file)",
      "networkError": "Network error",
      "fsError": "File system error",
      "unknownError": "Unknown error",
      "suggestion": {
        "checkNetwork": "Please check network connection",
        "checkProxy": "Consider configuring HTTP proxy",
        "retryLater": "Please retry later",
        "checkRepoUrl": "Please check repository URL and branch name",
        "checkDiskSpace": "Please check disk space",
        "checkPermission": "Please check directory permissions",
        "uninstallFirst": "Please uninstall the existing skill with the same name first",
        "checkZipContent": "Please verify the ZIP file contains valid skill directories (with SKILL.md files)"
      }
    },
    "repo": {
      "title": "Manage Skill Repositories",
      "description": "Add or remove GitHub skill repository sources",
      "url": "Repository URL",
      "urlPlaceholder": "owner/name or https://github.com/owner/name",
      "branch": "Branch",
      "branchPlaceholder": "main",
      "path": "Skills Path",
      "pathPlaceholder": "skills (optional, leave empty for root)",
      "add": "Add Repository",
      "list": "Added Repositories",
      "empty": "No repositories",
      "invalidUrl": "Invalid repository URL format",
      "addSuccess": "Repository {{owner}}/{{name}} added, detected {{count}} skills",
      "addFailed": "Failed to add",
      "removeSuccess": "Repository {{owner}}/{{name}} removed",
      "removeFailed": "Failed to remove",
      "skillCount": "{{count}} skills detected"
    },
    "search": "Search Skills",
    "searchPlaceholder": "Search skill name or repo...",
    "searchSource": {
      "repos": "Repos",
      "skillssh": "skills.sh"
    },
    "skillssh": {
      "searchPlaceholder": "Search skills.sh (min 2 chars)...",
      "installs": "{{count}} installs",
      "loadMore": "Load More",
      "loading": "Searching skills.sh...",
      "noResults": "No skills found for \"{{query}}\"",
      "error": "Failed to search skills.sh",
      "poweredBy": "Powered by skills.sh"
    },
    "filter": {
      "placeholder": "Filter by status",
      "all": "All",
      "installed": "Installed",
      "uninstalled": "Not installed",
      "repo": "Filter by repo",
      "allRepos": "All repos"
    },
    "noResults": "No matching skills found",
    "noInstalled": "No skills installed",
    "noInstalledDescription": "Discover and install skills from repositories, or import existing skills",
    "discover": "Discover Skills",
    "import": "Import Existing",
    "importDescription": "Select skills to import into CC Switch unified management",
    "importSuccess": "Successfully imported {{count}} skills",
    "importSelected": "Import Selected ({{count}})",
    "noUnmanagedFound": "No skills to import found. All skills are already managed by CC Switch.",
    "unmanagedAvailable": "Skills available to import",
    "foundIn": "Found in",
    "local": "Local",
    "uninstallConfirm": "Are you sure you want to uninstall \"{{name}}\"? This will remove the skill from all apps and create a local backup first.",
    "uninstallInMainPanel": "Please uninstall skills from the main panel",
    "notFound": "Skill not found",
    "backup": {
      "location": "Backup location: {{path}}"
    },
    "restoreFromBackup": {
      "button": "Restore Backup",
      "title": "Restore From Backup",
      "description": "Choose a Skills backup to restore its files locally and add it back to the current list.",
      "empty": "No Skills backups available to restore",
      "createdAt": "Backed up at",
      "path": "Backup path",
      "restore": "Restore",
      "restoring": "Restoring...",
      "delete": "Delete",
      "deleting": "Deleting...",
      "deleteSuccess": "Deleted backup for {{name}}",
      "deleteFailed": "Failed to delete skill backup",
      "deleteConfirmTitle": "Delete Backup",
      "deleteConfirmMessage": "Are you sure you want to delete the backup for \"{{name}}\"? This action cannot be undone.",
      "success": "Skill {{name}} restored from backup",
      "failed": "Failed to restore from backup"
    },
    "apps": {
      "claude": "Claude",
      "codex": "Codex",
      "gemini": "Gemini",
      "opencode": "OpenCode",
      "openclaw": "OpenClaw"
    },
    "installFromZip": {
      "button": "Install from ZIP",
      "installing": "Installing...",
      "successSingle": "Skill {{name}} installed",
      "successMultiple": "Successfully installed {{count}} skills",
      "noSkillsFound": "No skills found in ZIP file (requires SKILL.md file)"
    }
  },
  "deeplink": {
    "confirmImport": "Confirm Import Provider",
    "confirmImportDescription": "The following configuration will be imported from deep link into CC Switch",
    "importPrompt": "Import Prompt",
    "importPromptDescription": "Please confirm whether to import this system prompt",
    "importMcp": "Import MCP Servers",
    "importMcpDescription": "Please confirm whether to import these MCP Servers",
    "importSkill": "Add Skill Repository",
    "importSkillDescription": "Please confirm whether to add this Skill repository",
    "promptImportSuccess": "Prompt imported successfully",
    "promptImportSuccessDescription": "Imported prompt: {{name}}",
    "mcpImportSuccess": "MCP Servers imported successfully",
    "mcpImportSuccessDescription": "Successfully imported {{count}} server(s)",
    "mcpPartialSuccess": "Partial import success",
    "mcpPartialSuccessDescription": "Success: {{success}}, Failed: {{failed}}",
    "skillImportSuccess": "Skill repository added successfully",
    "skillImportSuccessDescription": "Added repository: {{repo}}",
    "app": "App Type",
    "providerName": "Provider Name",
    "homepage": "Homepage",
    "endpoint": "API Endpoint",
    "apiKey": "API Key",
    "icon": "Icon",
    "model": "Model",
    "haikuModel": "Haiku Model",
    "sonnetModel": "Sonnet Model",
    "opusModel": "Opus Model",
    "multiModel": "Multi-Modal Model",
    "notes": "Notes",
    "import": "Import",
    "importing": "Importing...",
    "warning": "Please confirm the information above is correct before importing. You can edit or delete it later in the provider list.",
    "parseError": "Failed to parse deep link",
    "importSuccess": "Import successful",
    "importSuccessDescription": "Provider \"{{name}}\" has been successfully imported",
    "importError": "Failed to import",
    "configSource": "Config Source",
    "configEmbedded": "Embedded Config",
    "configRemote": "Remote Config",
    "configDetails": "Config Details",
    "configUrl": "Config File URL",
    "configMergeError": "Failed to merge configuration file",
    "primaryEndpoint": "Primary",
    "mcp": {
      "title": "Batch Import MCP Servers",
      "targetApps": "Target Apps",
      "serverCount": "MCP Servers ({{count}})",
      "enabledWarning": "After import, configurations will be written to all specified apps immediately",
      "command": "Command",
      "args": "Args",
      "env": "Env",
      "url": "URL"
    },
    "prompt": {
      "title": "Import System Prompt",
      "app": "App",
      "name": "Name",
      "description": "Description",
      "contentPreview": "Content Preview",
      "enabledWarning": "After import, this prompt will be enabled immediately and other prompts will be disabled"
    },
    "skill": {
      "title": "Add Claude Skill Repository",
      "repo": "GitHub Repository",
      "directory": "Target Directory",
      "branch": "Branch",
      "skillsPath": "Skills Path",
      "hint": "This will add the Skill repository to the list.",
      "hintDetail": "After adding, you can install specific Skills from the Skills management page."
    },
    "usageScript": "Usage Query",
    "usageScriptEnabled": "Enabled",
    "usageScriptDisabled": "Disabled",
    "usageScriptCode": "Script code",
    "usageScriptWarning": "This is JavaScript that runs when usage is queried, once enabled. Import it only if you trust the source.",
    "usageApiKey": "Usage API Key",
    "usageBaseUrl": "Usage Query URL",
    "usageAutoInterval": "Auto Query",
    "usageAutoIntervalValue": "Every {{minutes}} minutes",
    "risk": {
      "envHijack": "This config sets environment variables that change how processes load code (e.g. injecting libraries or replacing CA certificates). Import only from a source you trust.",
      "privateEndpoint": "This address points at localhost or a private network. Do not import unless it is your own local service.",
      "shellCommand": "This config runs a full command line through a shell — what actually executes is in the arguments. Review each line."
    }
  },
  "iconPicker": {
    "search": "Search Icons",
    "searchPlaceholder": "Enter icon name...",
    "noResults": "No matching icons found",
    "category": {
      "aiProvider": "AI Providers",
      "cloud": "Cloud Platforms",
      "tool": "Dev Tools",
      "other": "Other"
    }
  },
  "providerIcon": {
    "label": "Icon",
    "colorLabel": "Icon Color",
    "selectIcon": "Select Icon",
    "preview": "Preview",
    "clickToChange": "Click to change icon",
    "clickToSelect": "Click to select icon"
  },
  "migration": {
    "success": "Configuration migrated successfully",
    "skillsSuccess": "Automatically imported {{count}} skill(s) into unified management",
    "skillsFailed": "Failed to auto import skills",
    "skillsFailedDescription": "Open the Skills page and click \"Import Existing\" to import manually (or restart and try again)."
  },
  "agents": {
    "title": "Agents"
  },
  "health": {
    "operational": "Operational",
    "degraded": "Degraded",
    "failed": "Failed",
    "circuitOpen": "Circuit Open",
    "consecutiveFailures": "{{count}} consecutive failures"
  },
  "failover": {
    "enabled": "{{app}} failover enabled",
    "disabled": "{{app}} failover disabled",
    "toggleFailed": "Operation failed: {{detail}}",
    "inQueue": "In queue",
    "addQueue": "Add",
    "priority": {
      "tooltip": "Failover priority {{priority}}"
    },
    "tooltip": {
      "enabled": "{{app}} failover enabled\nRequests follow queue priority (P1→P2→...)",
      "disabled": "Enable {{app}} failover\nSwitches to queue P1 immediately, then falls back on failures",
      "takeoverRequired": "Take over {{app}} first, then enable failover"
    }
  },
  "proxy": {
    "panel": {
      "serviceAddress": "Service Address",
      "addressCopied": "Address copied",
      "currentProvider": "Current Provider:",
      "waitingFirstRequest": "Current Provider: Waiting for first request...",
      "stoppedTitle": "Routing Service Stopped",
      "stoppedDescription": "Use the toggle above to start the service",
      "openSettings": "Configure Routing Service",
      "stats": {
        "activeConnections": "Active Connections",
        "totalRequests": "Total Requests",
        "successRate": "Success Rate",
        "uptime": "Uptime"
      }
    },
    "settings": {
      "title": "Routing Service Settings",
      "description": "Configure local routing server listening address, port and runtime parameters. Changes take effect immediately after saving.",
      "alert": {
        "autoApply": "Changes will be automatically synced to the running routing service without manual restart."
      },
      "basic": {
        "title": "Basic Settings",
        "description": "Configure routing service listening address and port."
      },
      "advanced": {
        "title": "Advanced Parameters",
        "description": "Control request stability and logging."
      },
      "timeout": {
        "title": "Timeout Settings",
        "description": "Configure timeout for streaming and non-streaming requests."
      },
      "fields": {
        "listenAddress": {
          "label": "Listen Address",
          "placeholder": "127.0.0.1",
          "description": "IP address the routing server listens on (recommended: 127.0.0.1)"
        },
        "listenPort": {
          "label": "Listen Port",
          "placeholder": "15721",
          "description": "Port number the routing server listens on (1024 ~ 65535)"
        },
        "maxRetries": {
          "label": "Max Retries",
          "placeholder": "3",
          "description": "Number of retries on request failure (0 ~ 10)"
        },
        "requestTimeout": {
          "label": "Request Timeout (sec)",
          "placeholder": "0 (unlimited) or 300",
          "description": "Maximum wait time for a single request (0 = unlimited, or 10 ~ 600 seconds)"
        },
        "enableLogging": {
          "label": "Record Request Usage",
          "description": "Write routing request usage and status to the local statistics database"
        },
        "streamingFirstByteTimeout": {
          "label": "Streaming First Byte Timeout (sec)",
          "description": "Maximum time to wait for the first data chunk"
        },
        "streamingIdleTimeout": {
          "label": "Streaming Idle Timeout (sec)",
          "description": "Maximum interval between data chunks"
        },
        "nonStreamingTimeout": {
          "label": "Non-Streaming Timeout (sec)",
          "description": "Total timeout for non-streaming requests"
        }
      },
      "validation": {
        "addressInvalid": "Please enter a valid IP address",
        "portMin": "Port must be greater than 1024",
        "portMax": "Port must be less than 65535",
        "retryMin": "Retry count cannot be negative",
        "retryMax": "Retry count cannot exceed 10",
        "timeoutNonNegative": "Timeout cannot be negative",
        "timeoutMax": "Timeout cannot exceed 600 seconds",
        "timeoutRange": "Please enter 0 or a value between 10-600",
        "streamingTimeoutMin": "Timeout must be at least 5 seconds",
        "streamingTimeoutMax": "Timeout cannot exceed 300 seconds"
      },
      "actions": {
        "save": "Save Configuration"
      },
      "toast": {
        "saved": "Routing configuration saved",
        "saveFailed": "Save failed: {{error}}"
      },
      "invalidPort": "Invalid port, please enter a number between 1024-65535",
      "invalidAddress": "Invalid address. Enter an IPv4 (e.g. 127.0.0.1), IPv6 (e.g. ::1), or localhost",
      "configSaved": "Routing configuration saved",
      "configSaveFailed": "Failed to save configuration",
      "restartRequired": "Restart routing service for address or port changes to take effect"
    },
    "switchFailed": "Switch failed: {{error}}",
    "takeover": {
      "hint": "Select apps to route — once enabled, requests from that app will go through local routing",
      "enabled": "{{app}} routing enabled",
      "disabled": "{{app}} routing disabled",
      "failed": "Failed to toggle routing: {{detail}}",
      "tooltip": {
        "active": "{{appLabel}} is routing - {{address}}:{{port}}\nSwitch provider for hot switching",
        "broken": "{{appLabel}} is routing, but routing service is not running",
        "inactive": "Route {{appLabel}}'s requests through local routing"
      }
    },
    "failover": {
      "proxyRequired": "Routing service must be started to configure failover",
      "autoSwitch": "Auto Failover",
      "autoSwitchDescription": "When enabled, switches to queue P1 immediately and automatically tries the next provider in the queue on failures"
    },
    "failoverQueue": {
      "title": "Failover Queue",
      "description": "Manage failover order for each app's providers",
      "info": "When auto failover is enabled, requests follow the queue priority order (P1 first). On failures, the system will try the next provider in the queue.",
      "selectProvider": "Select a provider to add to queue",
      "noAvailableProviders": "No providers available to add",
      "empty": "Failover queue is empty. Add providers to enable automatic failover.",
      "orderHint": "Queue order matches the provider list order on the Home page. Reorder providers on the Home page to change priority.",
      "dragHint": "Drag providers to adjust failover order. Lower numbers have higher priority.",
      "toggleEnabled": "Enable/Disable",
      "addSuccess": "Added to failover queue",
      "addFailed": "Failed to add",
      "removeSuccess": "Removed from failover queue",
      "removeFailed": "Failed to remove",
      "reorderSuccess": "Queue order updated",
      "reorderFailed": "Failed to update order",
      "toggleFailed": "Failed to update status"
    },
    "autoFailover": {
      "info": "When the failover queue has multiple providers, the system will try them in priority order when requests fail. When a provider reaches the consecutive failure threshold, the circuit breaker will open and skip it temporarily.",
      "configSaved": "Auto failover config saved",
      "configSaveFailed": "Failed to save",
      "validationFailed": "The following fields are out of valid range: {{fields}}",
      "retrySettings": "Retry & Timeout Settings",
      "failureThreshold": "Failure Threshold",
      "failureThresholdHint": "Open circuit breaker after this many consecutive failures (recommended: 3-10)",
      "timeout": "Recovery Wait Time (seconds)",
      "timeoutHint": "Wait this long before trying to recover after circuit opens (recommended: 30-120)",
      "circuitBreakerSettings": "Circuit Breaker Settings",
      "successThreshold": "Recovery Success Threshold",
      "successThresholdHint": "Close circuit breaker after this many successes in half-open state",
      "errorRate": "Error Rate Threshold (%)",
      "errorRateHint": "Open circuit breaker when error rate exceeds this value",
      "minRequests": "Minimum Requests",
      "minRequestsHint": "Minimum requests before calculating error rate",
      "explanationTitle": "How It Works",
      "failureThresholdLabel": "Failure Threshold",
      "failureThresholdExplain": "Circuit breaker opens after this many consecutive failures, making the provider temporarily unavailable",
      "timeoutLabel": "Recovery Wait Time",
      "timeoutExplain": "After circuit opens, wait this long before trying half-open state",
      "successThresholdLabel": "Recovery Success Threshold",
      "successThresholdExplain": "In half-open state, close circuit breaker after this many successes, making provider available again",
      "errorRateLabel": "Error Rate Threshold",
      "errorRateExplain": "Open circuit breaker when error rate exceeds this value, even if failure threshold not reached",
      "maxRetries": "Max Retries",
      "timeoutSettings": "Timeout Settings",
      "streamingFirstByte": "Streaming First Byte Timeout",
      "streamingIdle": "Streaming Idle Timeout",
      "nonStreaming": "Non-Streaming Timeout",
      "maxRetriesHint": "Number of retries on request failure (0-10)",
      "streamingFirstByteHint": "Max time to wait for first data chunk, range 1-120s, default 60s",
      "streamingIdleHint": "Max interval between data chunks, range 60-600s, 0 to disable (prevents mid-stream stalls)",
      "nonStreamingHint": "Total timeout for non-streaming requests, range 60-1200s, default 600s (10 min)"
    },
    "logging": {
      "enabled": "Logging enabled",
      "disabled": "Logging disabled",
      "failed": "Failed to toggle logging"
    },
    "server": {
      "started": "Routing service started - {{address}}:{{port}}",
      "startFailed": "Failed to start routing service: {{detail}}",
      "stopped": "Routing service stopped",
      "stopFailed": "Failed to stop routing service: {{detail}}"
    },
    "stoppedWithRestore": "Routing service stopped, all routing configs restored",
    "stopWithRestoreFailed": "Stop failed: {{detail}}"
  },
  "streamCheck": {
    "reachable": "{{providerName}} is reachable ({{responseTimeMs}}ms)",
    "reachableSlow": "{{providerName}} reachable but slow ({{responseTimeMs}}ms)",
    "unreachable": "{{providerName}} unreachable: {{message}}",
    "unreachableHint": "Could not establish a connection (DNS / connect / TLS / timeout). Check the base_url and your network.",
    "connectivityNote": "Connectivity check only probes whether the provider address is reachable; it does not send a real model request. Any response counts as \"reachable\" — which does not guarantee that auth or model settings are correct.",
    "configSaved": "Connectivity check settings saved",
    "configSaveFailed": "Save failed",
    "checkParams": "Check Parameters",
    "timeout": "Timeout (seconds)",
    "maxRetries": "Max Retries",
    "degradedThreshold": "Slow-response threshold (ms)",
    "error": "{{providerName}} check error: {{error}}"
  },
  "proxyConfig": {
    "proxyEnabled": "Routing Master Switch",
    "appTakeover": "Routing Enabled",
    "perAppConfig": "Per-App Config",
    "circuitBreaker": "Circuit Breaker",
    "circuitBreakerSettings": "Circuit Breaker Settings",
    "failureThreshold": "Failure Threshold",
    "successThreshold": "Success Threshold",
    "recoveryTimeout": "Recovery Timeout",
    "errorRateThreshold": "Error Rate Threshold",
    "minRequests": "Min Requests",
    "timeoutConfig": "Timeout Config",
    "streamingFirstByte": "Streaming First Byte Timeout",
    "streamingIdle": "Streaming Idle Timeout",
    "nonStreaming": "Non-Streaming Timeout"
  },
  "universalProvider": {
    "duplicate": "Duplicate",
    "duplicatedAndSynced": "Universal provider duplicated and synced",
    "duplicateError": "Failed to duplicate universal provider",
    "title": "Universal Provider",
    "description": "Universal providers manage Claude, Codex, and Gemini configurations simultaneously. Changes are automatically synced to all enabled apps.",
    "add": "Add Universal Provider",
    "edit": "Edit Universal Provider",
    "empty": "No universal providers yet",
    "emptyHint": "Click the \"Add Universal Provider\" button below to create one",
    "selectPreset": "Select Preset Type",
    "name": "Name",
    "namePlaceholder": "e.g., My NewAPI",
    "baseUrl": "API URL",
    "apiKey": "API Key",
    "websiteUrl": "Website URL",
    "websiteUrlPlaceholder": "https://example.com (optional, displayed in the list)",
    "notes": "Notes",
    "notesPlaceholder": "Optional: Add notes",
    "enabledApps": "Enabled Apps",
    "modelConfig": "Model Configuration",
    "model": "Model",
    "sync": "Sync to Apps",
    "synced": "Synced to all apps",
    "syncError": "Sync failed",
    "noAppsEnabled": "No apps enabled",
    "added": "Universal provider added",
    "addedAndSynced": "Universal provider added and synced",
    "addedButSyncFailed": "Universal provider added, but sync failed",
    "updated": "Universal provider updated",
    "deleted": "Universal provider deleted",
    "addFailed": "Failed to add universal provider",
    "hint": "Cross-app unified config, auto-sync to Claude/Codex/Gemini",
    "manage": "Manage",
    "loadError": "Failed to load universal providers",
    "saveError": "Failed to save universal provider",
    "deleteError": "Failed to delete universal provider",
    "deleteConfirmTitle": "Delete Universal Provider",
    "deleteConfirmDescription": "Are you sure you want to delete \"{{name}}\"? This will also delete its generated provider configurations in each app.",
    "syncConfirmTitle": "Sync Universal Provider",
    "syncConfirmDescription": "Syncing \"{{name}}\" will overwrite the associated provider configurations in Claude, Codex, and Gemini. Do you want to continue?",
    "syncConfirm": "Sync",
    "saveAndSync": "Save & Sync",
    "savedAndSynced": "Saved and synced to all apps",
    "saveAndSyncError": "Failed to save and sync",
    "configJsonPreview": "Config JSON Preview",
    "configJsonPreviewHint": "The following configurations will be synced to each app (only the displayed fields will be overwritten, other custom settings will be preserved)"
  },
  "omo": {
    "editProfile": "Edit OMO Config",
    "newProfile": "New OMO Config",
    "profileName": "Name",
    "mainAgents": "Main Agents",
    "subAgents": "Sub Agents",
    "categories": "Categories",
    "customAgents": "Custom Agents",
    "noCustomAgents": "No custom agents",
    "otherFields": "Other Config",
    "globalConfig": "OMO Global Config",
    "globalConfigShort": "OMO Config",
    "globalConfigSaved": "Global config saved",
    "addProfile": "Add OMO Provider",
    "disabledItems": "Disabled Items",
    "advanced": "Advanced Settings",
    "profileCreated": "OMO config created",
    "profileUpdated": "OMO config updated",
    "invalidJson": "Other Fields contains invalid JSON",
    "confirmDelete": "Delete Config",
    "confirmDeleteMsg": "Delete \"{{name}}\"?",
    "profileDeleted": "Config deleted",
    "imported": "Imported as \"{{name}}\"",
    "import": "Import",
    "global": "Global",
    "empty": "No OMO configs yet. Click + Add or Import from local.",
    "applied": "Applied",
    "apply": "Apply",
    "enable": "Enable",
    "enabled": "Enabled",
    "disabled": "OMO disabled",
    "disableFailed": "Failed to disable OMO: {{error}}",
    "selectPlaceholder": "Select...",
    "clear": "Clear",
    "clearWrapped": "(Clear)",
    "defaultWrapped": "(Default)",
    "variantPlaceholder": "variant",
    "selectEnabledModel": "Select configured model",
    "selectModel": "Select configured model",
    "recommendedHint": "Recommended: {{model}}",
    "searchModel": "Search model...",
    "selectModelFirst": "Select model first",
    "noEnabledModels": "No configured models",
    "noVariantsForModel": "No variants for model",
    "currentValueNotEnabled": "{{value}} (current value, not configured)",
    "currentValueUnavailable": "{{value}} (current value, unavailable)",
    "advancedLabel": "Advanced",
    "advancedJsonInvalid": "Advanced JSON is invalid",
    "advancedJsonHint": "temperature, top_p, budgetTokens, prompt_append, permission, etc. Leave empty for defaults",
    "noEnabledModelsWarning": "No configured models available. Configure OpenCode models first.",
    "modelSourcePartialWarning": "Some provider model configs are invalid and were skipped.",
    "modelSourceFallbackWarning": "Failed to load live provider state. Falling back to configured providers.",
    "importLocalReplaceSuccess": "Imported local file and replaced Agents/Categories/Other Fields",
    "importLocalFailed": "Failed to read local file: {{error}}",
    "agentKeyPlaceholder": "agent key",
    "categoryKeyPlaceholder": "category key",
    "modelNamePlaceholder": "model-name",
    "custom": "Custom",
    "customCategories": "Custom Categories",
    "modelConfiguration": "Model Configuration",
    "fillRecommended": "Fill Recommended",
    "fillRecommendedSuccess": "Filled {{count}} recommended models",
    "fillRecommendedPartial": "Filled {{filled}} recommended models, {{unmatched}} unmatched",
    "fillRecommendedMostlyUnmatched": "Filled only {{filled}}, {{unmatched}} unmatched (e.g. {{examples}}). Configure providers offering these models or pick a substitute.",
    "fillRecommendedAllSet": "All slots already have models configured",
    "fillRecommendedNoMatch": "Recommended models not found in configured providers (e.g. {{examples}})",
    "configSummary": "{{agents}} agents, {{categories}} categories configured · Click ⚙ for advanced params",
    "enabledModelsCount": "{{count}} configured models available",
    "source": "from:",
    "otherFieldsJson": "Other Fields (JSON)",
    "slimOtherFieldsHint": "Use this area for top-level OMO Slim config such as council, fallback, multiplexer, disabled_mcps, and todoContinuation.",
    "searchOrType": "Search or type custom value...",
    "noMatches": "No matches",
    "jsonMustBeObject": "{{field}} must be a JSON object",
    "jsonInvalid": "{{field}} contains invalid JSON",
    "importGlobalSuccess": "Imported global config from local file (unsaved)",
    "importGlobalFailed": "Failed to read local file: {{error}}",
    "importLocal": "Import Local",
    "saveGlobalConfig": "Save Global Config",
    "schemaUrl": "$schema",
    "resetDefault": "Reset",
    "sisyphusAgentConfig": "Sisyphus Agent Config",
    "disabledAgents": "Agents",
    "disabledAgentsPlaceholder": "Disabled Agents",
    "disabledMcps": "MCPs",
    "disabledMcpsPlaceholder": "Disabled MCPs",
    "disabledHooks": "Hooks",
    "disabledHooksPlaceholder": "Disabled Hooks",
    "disabledSkills": "Skills",
    "disabledSkillsPlaceholder": "Disabled Skills",
    "advancedLsp": "LSP Config",
    "advancedExperimental": "Experimental Features",
    "advancedBackgroundTask": "Background Tasks",
    "advancedBrowserAutomation": "Browser Automation",
    "advancedClaudeCode": "Claude Code",
    "agentDesc": {
      "sisyphus": "Main orchestrator",
      "hephaestus": "Autonomous deep worker",
      "prometheus": "Strategic planner",
      "atlas": "Task manager",
      "oracle": "Strategic advisor",
      "librarian": "Multi-repo researcher",
      "explore": "Fast code search",
      "multimodalLooker": "Media analyzer",
      "metis": "Pre-plan analysis advisor",
      "momus": "Plan reviewer",
      "sisyphusJunior": "Delegated task executor"
    },
    "agentTooltip": {
      "sisyphus": "Main orchestrator responsible for task planning, delegation and parallel execution. Uses extended thinking (32k budget) and drives workflows through TODO lists to ensure task completion.",
      "atlas": "Main orchestrator (holds TODO list) responsible for task distribution and coordination during execution phase. Delegates to specialized agents rather than completing all work directly.",
      "prometheus": "Strategic planner that collects requirements through interview mode and creates detailed work plans. Can only read/write Markdown files in .sisyphus/ directory, never writes code directly.",
      "hephaestus": "Autonomous deep worker (\"legitimate craftsman\") inspired by AmpCode deep mode. Goal-oriented execution that launches 2-5 explore/librarian agents in parallel for research before taking action.",
      "oracle": "Architecture decision and debugging advisor. Read-only consulting agent providing excellent logical reasoning and deep analysis. Cannot write files or delegate tasks.",
      "librarian": "Multi-repository analysis and documentation retrieval expert. Deeply understands codebases and provides evidence-based answers. Excels at finding official documentation and open-source implementation examples.",
      "explore": "Fast codebase exploration and context grep expert. Uses lightweight models for high-speed search. The scout for understanding code structure.",
      "multimodalLooker": "Visual content expert that analyzes PDFs, images, charts and other non-text media, extracting information and insights from them.",
      "metis": "Plan consultant that performs pre-analysis before planning. Identifies hidden intents, ambiguities and AI failure points to prevent over-engineering.",
      "momus": "Plan reviewer that validates plan clarity, verifiability and completeness with high precision. Rejects and requests revisions until plans are perfect.",
      "sisyphusJunior": "Category-generated executor, automatically created via category parameters. Focuses on executing assigned tasks and cannot re-delegate, preventing infinite delegation loops."
    },
    "categoryDesc": {
      "visualEngineering": "Visual/frontend engineering",
      "ultrabrain": "Ultra thinking",
      "deep": "Deep work",
      "artistry": "Creative/artistic",
      "quick": "Quick response",
      "unspecifiedLow": "General low tier",
      "unspecifiedHigh": "General high tier",
      "writing": "Writing"
    },
    "categoryTooltip": {
      "visualEngineering": "Frontend and visual engineering category for UI/UX design, styling, animation and interface implementation. Defaults to Gemini 3.6 Flash model.",
      "ultrabrain": "Deep logical reasoning category for complex architectural decisions requiring extensive analysis. Defaults to GPT-5.3 Codex ultra-high reasoning variant.",
      "deep": "Deep autonomous problem-solving category with goal-oriented execution. Conducts thorough research before action, suitable for difficult problems requiring deep understanding.",
      "artistry": "Highly creative and artistic task category that inspires novel ideas and creative solutions. Defaults to Gemini 3.6 Flash high variant.",
      "quick": "Lightweight task category for single-file modifications, typo fixes, and simple adjustments. Defaults to Claude Haiku 4.5 fast model.",
      "unspecifiedLow": "Uncategorized low-effort task category for tasks that don't fit other categories with small workload. Defaults to Claude Sonnet 4.5.",
      "unspecifiedHigh": "Uncategorized high-effort task category for tasks that don't fit other categories with large workload. Defaults to Claude Opus 5 max variant.",
      "writing": "Writing category for documentation, prose and technical writing. Defaults to Kimi K2.5 model."
    },
    "slimAgentDesc": {
      "orchestrator": "Orchestrator",
      "oracle": "Oracle",
      "librarian": "Librarian",
      "explorer": "Explorer",
      "designer": "Designer",
      "fixer": "Fixer",
      "council": "Council"
    },
    "slimAgentTooltip": {
      "orchestrator": "Writes executable code, orchestrates multi-agent workflow, summons experts",
      "oracle": "Root cause analysis, architecture review, debugging guidance (read-only)",
      "librarian": "Documentation lookup, GitHub code search (read-only)",
      "explorer": "Regex search, AST pattern matching, file discovery (read-only)",
      "designer": "Modern responsive design, CSS/Tailwind expertise",
      "fixer": "Code implementation, refactoring, testing, verification",
      "council": "Multi-model consensus agent. Runs multiple read-only councillors in parallel, then lets the master synthesize the final answer."
    }
  },
  "openclawConfig": {
    "defaultModel": {
      "title": "Default Model",
      "description": "Configure the default primary model and fallback models for OpenClaw",
      "primary": "Primary Model",
      "primaryPlaceholder": "e.g., deepseek/deepseek-chat",
      "fallbacks": "Fallback Models",
      "fallbacksPlaceholder": "e.g., openrouter/anthropic/claude-sonnet-4.5",
      "addFallback": "Add Fallback Model",
      "saved": "Default model configuration saved",
      "saveFailed": "Failed to save default model"
    },
    "modelCatalog": {
      "title": "Model Catalog",
      "description": "Configure model aliases and allowlist",
      "modelId": "Model ID",
      "modelIdPlaceholder": "e.g., deepseek/deepseek-chat",
      "alias": "Alias",
      "aliasPlaceholder": "e.g., DeepSeek",
      "addEntry": "Add Model",
      "removeEntry": "Remove",
      "saved": "Model catalog saved",
      "saveFailed": "Failed to save model catalog",
      "empty": "No model catalog entries",
      "emptyHint": "Add models to the catalog to configure aliases"
    },
    "suggestedDefaults": "Apply Suggested Defaults",
    "suggestedDefaultsHint": "Use this preset's recommended default model configuration"
  },
  "subscription": {
    "title": "Subscription Quota",
    "fiveHour": "5-Hour",
    "sevenDay": "7-Day",
    "sevenDayOpus": "7-Day (Opus)",
    "sevenDaySonnet": "7-Day (Sonnet)",
    "thirtyDay": "30-Day",
    "geminiPro": "Pro",
    "geminiFlash": "Flash",
    "geminiFlashLite": "Flash Lite",
    "weeklyLimit": "Weekly",
    "monthly": "Monthly",
    "credits": "Credits",
    "copilotPremium": "Premium",
    "utilization": "{{value}}%",
    "resetsIn": "Resets in {{time}}",
    "extraUsage": "Extra Usage",
    "expired": "Session expired",
    "expiredHint": "Run the {{tool}} command to refresh your login",
    "queryFailed": "Query failed",
    "refresh": "Refresh"
  }
}
