{
  "admin": {
    "nav": {
      "dashboard": "Dashboard",
      "providers": "Providers",
      "adapters": "Adapters",
      "logs": "Logs",
      "capture": "Capture",
      "settings": "Settings"
    },
    "sidebar": {
      "running": "Running",
      "offline": "Offline",
      "loading": "Loading...",
      "switchLang": "Switch Language",
      "port": "Port",
      "portPlaceholder": "Leave empty for default 9000",
      "portSetSuccess": "Port saved and applied",
      "portSetSuccessWithRestart": "Port saved, please restart the service",
      "portRestartHint": "restart to take effect"
    },
    "general": {
      "title": "General",
      "desc": "Language, theme, port and config reload",
      "clientTitle": "Browser Preferences",
      "clientDesc": "Only affects this browser and does not modify the service",
      "serviceTitle": "Current Service Runtime",
      "serviceDesc": "These actions directly modify the currently connected service",
      "portChangeConfirm": "Changing the listening port may disconnect this page. Continue?",
      "language": "Language",
      "theme": "Theme",
      "themeSystem": "System",
      "themeLight": "Light",
      "themeDark": "Dark"
    },
    "managementKey": {
      "title": "Management API Key",
      "desc": "Used for admin endpoints protected by the server's admin_key. It is separate from the proxy API key and stored only in this browser.",
      "placeholder": "Enter the same key as the server admin_key",
      "set": "A management key is saved in this browser",
      "notSet": "No management key is saved in this browser",
      "currentService": "Current service",
      "sessionOnly": "Persistent browser storage is unavailable; the key is valid only for this page session",
      "saved": "Management API key saved",
      "removed": "Management API key removed"
    },
    "common": {
      "save": "Save",
      "cancel": "Cancel",
      "delete": "Delete",
      "edit": "Edit",
      "add": "Add",
      "test": "Test",
      "run": "Run",
      "close": "Close",
      "confirm": "Confirm",
      "search": "Search",
      "refresh": "Refresh",
      "expand": "Expand",
      "collapse": "Collapse",
      "copy": "Copy",
      "clear": "Clear",
      "saving": "Saving...",
      "testing": "Testing...",
      "none": "No data",
      "noMatch": "No matching {{name}}",
      "normal": "Normal",
      "error": "Error",
      "remove": "Remove",
      "hide": "Hide",
      "view": "View",
      "reloadConfig": "Reload Config",
      "configReloaded": "Config reloaded",
      "reloadFailed": "Reload failed",
      "requestFailed": "Request failed",
      "copyFailed": "Copy failed",
      "parseFailed": "Data parse failed"
    },
    "dashboard": {
      "status": "Status",
      "providerCount": "Providers",
      "modelCount": "Models",
      "adapterCount": "Adapters",
      "requests": "Requests",
      "inputTokens": "Input Tokens",
      "cacheHits": "Cache Hits",
      "cacheCreation": "Cache Creation",
      "today": "Today",
      "output": "Output",
      "total": "Total",
      "hitRate": "Cache Hit Rate {{rate}}",
      "newCacheTokens": "New cache tokens written",
      "proxyKey": "Proxy API Key",
      "proxyKeyPlaceholder": "Leave empty to skip auth",
      "proxyKeySet": "Set (requests must include Authorization: Bearer <key> or x-api-key header)",
      "proxyKeyNotSet": "Not set — all requests are accessible directly",
      "proxyKeySetSuccess": "Proxy key set",
      "proxyKeyRemoveSuccess": "Proxy key removed",
      "loadMore": "Load More",
      "usage": {
        "trendTitle": "Token Usage Trend",
        "trendDesc": "Input / Output / Cache Read / Cache Create aggregated by day",
        "breakdownTitle": "Breakdown Comparison",
        "dimProvider": "Provider",
        "dimAdapter": "Adapter",
        "dimModel": "Provider Model",
        "dimAdapterModel": "Adapter Model",
        "days1": "Today",
        "days7": "7 days",
        "days30": "30 days",
        "days90": "90 days",
        "daysUnit": "days",
        "emptyTitle": "No usage data",
        "emptyDesc": "No proxy requests recorded in {{range}}. Send a request to see the trend here.",
        "storageTitle": "Usage Data Storage",
        "storageDesc": "{{events}} events · {{aggregates}} aggregates · {{size}}",
        "cleanupBtn": "Clean up",
        "cleanupAllBtn": "Clear all",
        "cleanupAllConfirm": "Are you sure you want to delete ALL usage data? This cannot be undone.",
        "cleanupConfirm": "Are you sure you want to delete all usage data older than {{days}} days? This cannot be undone.",
        "cleanupDone": "Cleaned {{events}} events / {{aggregates}} aggregates",
        "cleanupFailed": "Cleanup failed"
      },
      "chart": {
        "input": "Input",
        "output": "Output",
        "cacheRead": "Cache Read",
        "cacheCreate": "Cache Create",
        "total": "Total",
        "requests": "Requests"
      }
    },
    "logs": {
      "title": "Logs",
      "matchCount": "{{count}} matches · Page {{page}}/{{totalPages}}",
      "filterAll": "All",
      "filterRequest": "Request",
      "filterSystem": "System",
      "filterError": "error",
      "filterWarn": "warn",
      "filterInfo": "info",
      "filterDebug": "debug",
      "logLevel": "Log Level",
      "searchPlaceholder": "Search…",
      "time": "Time",
      "level": "Level",
      "message": "Message",
      "detail": "Detail",
      "empty": "No logs yet",
      "noMatch": "No matching logs",
      "pagePrev": "◀",
      "pageNext": "▶",
      "pageFirst": "⏮",
      "pageLast": "⏭"
    },
    "providers": {
      "title": "Providers",
      "searchPlaceholder": "Search providers...",
      "add": "+ Add",
      "name": "Name",
      "type": "Type",
      "modelCount": "Models",
      "status": "Status",
      "actions": "Actions",
      "empty": "No data",
      "noMatch": "No matching providers",
      "editTitle": "Edit Provider",
      "addTitle": "Add Provider",
      "formName": "Name",
      "formNamePlaceholder": "my-provider",
      "formType": "Type",
      "formProtocols": "Protocols",
      "formProtocolsHint": "Select one or more protocols. Each selected protocol can use its own Base URL.",
      "formProtocol": "Protocol",
      "addProtocol": "Add Protocol",
      "removeProtocol": "Remove Protocol",
      "formApiKey": "API Key",
      "formApiKeyPlaceholder": "sk-...",
      "formApiBase": "API Base (optional)",
      "formApiBasePlaceholder": "https://api.openai.com",
      "formModels": "Models",
      "formModelId": "Model ID",
      "formModelIdPlaceholder": "e.g. gpt-4o",
      "addModel": "Add Model",
      "thinkingBudget": "Thinking Budget",
      "reasoningEffort": "Reasoning Effort",
      "defaultEffort": "Default",
      "lowEffort": "Low",
      "mediumEffort": "Medium",
      "highEffort": "High",
      "xhighEffort": "XHigh",
      "maxEffort": "Max",
      "thinkingType": "Type",
      "defaultType": "None",
      "hideKey": "Hide",
      "showKey": "Show",
      "keepEmptyHint": "Leave empty to keep current value",
      "pullModels": "Pull Remote Models",
      "pullModelsTitle": "Remote Models",
      "pullModelsCount": "{{count}} models, {{existing}} already exist",
      "pullModelsLoading": "Loading...",
      "pullModelsNone": "No models found",
      "pullModelsError": "Request failed",
      "pullModelsImport": "Import Selected",
      "importedModels": "Imported {{added}} models",
      "importedModelsSkip": "(skipped {{skipped}} duplicates)",
      "deleteConfirm": "Delete provider \"{{name}}\"?",
      "saveFailed": "Save failed",
      "deleteFailed": "Delete failed",
      "notFound": "Provider not found",
      "updated": "Provider updated",
      "created": "Provider created",
      "deleted": "Provider deleted",
      "validationName": "Please enter a name",
      "validationModels": "Please add at least one model",
      "validationApiKey": "Please enter an API Key",
      "validationProtocols": "Please configure at least one protocol",
      "inputModalities": "Input",
      "inputModalitiesHint": "Check the input modalities supported by the model. When image is unchecked, images in requests will be routed through a vision fallback model.",
      "visionBadgeTitle": "Models with image input:",
      "validationProviderName": "Please enter a provider name first",
      "keepOriginal": "Leave empty to keep original value",
      "pullModelsSearch": "Search model ID or description…",
      "pullModelsSelectAll": "Select All",
      "pullModelsInvert": "Invert",
      "pullModelsClear": "Clear"
    },
    "vision": {
      "title": "Vision Fallback",
      "desc": "Provide automatic image recognition for models that don't support image input. When a request contains images, the configured vision model is called to generate a text description, which is then forwarded to the original model.",
      "enable": "Enable Vision Fallback",
      "selectProvider": "Select Provider",
      "selectModel": "Select Model",
      "promptPlaceholder": "Optional: custom vision prompt (leave empty for default)",
      "noVisionModel": "No vision-capable model available. First mark a model as supporting image input in Providers.",
      "modelNotImageWarning": "This model is not declared as supporting image input. Saving will be rejected. First mark the model as supporting image input in Providers.",
      "saved": "Vision fallback enabled",
      "removed": "Vision fallback disabled",
      "saveFailed": "Save failed",
      "cache": {
        "title": "Vision Result Cache",
        "desc": "Cache image descriptions by content. Repeat requests with the same image reuse the cached description without calling the vision model.",
        "stats": "hits {{hits}} / miss {{misses}} · hit rate {{rate}} · cached {{size}}/{{max}}",
        "disabled": "Cache not enabled on server",
        "clear": "Clear Cache",
        "clearConfirm": "Clear all vision cache? Cached images will be re-recognized on next request.",
        "cleared": "Vision cache cleared",
        "clearFailed": "Clear failed"
      }
    },
    "adapters": {
      "title": "Adapter Mappings",
      "searchPlaceholder": "Search adapters...",
      "add": "+ Add",
      "adapter": "Adapter",
      "baseUrl": "Base URL",
      "modelMapping": "Model Mapping",
      "status": "Status",
      "actions": "Actions",
      "empty": "No adapters",
      "noMatch": "No matching adapters",
      "editTitle": "Edit Adapter",
      "addTitle": "Add Adapter",
      "formName": "Name",
      "formNamePlaceholder": "my-tool",
      "formDefaultMaxTokens": "Default Max Tokens",
      "defaultMaxTokensHint": "Leave empty to use the upstream API's default",
      "formRequestDefaults": "Request Defaults",
      "formStreamDefault": "stream default",
      "streamFollow": "Default (follow)",
      "streamOn": "Stream",
      "streamOff": "Non-stream",
      "requestDefaultsHint": "Applied when the client omits these; 'Default (follow)' passes through as-is",
      "formModelMapping": "Model Mapping",
      "sourceModelId": "Source Model ID",
      "targetModelId": "Target Model ID",
      "sourcePlaceholder": "Model ID from the tool",
      "provider": "Provider",
      "addMapping": "Add Mapping",
      "bulkImport": "Import All",
      "selectProviderFirst": "-- Select Provider --",
      "noModelsInProvider": "Provider \"{{provider}}\" has no models configured",
      "importedModels": "Imported {{added}} model(s)",
      "importedModelsSkip": ", skipped {{skipped}} existing",
      "selectProvider": "-- Select Provider --",
      "selectModel": "-- Select Model --",
      "deleteConfirm": "Delete adapter \"{{name}}\"?",
      "saveFailed": "Save failed",
      "deleteFailed": "Delete failed",
      "updated": "Adapter updated",
      "created": "Adapter created",
      "deleted": "Adapter deleted",
      "testTitle": "Test Adapter — {{name}}",
      "runTest": "Run",
      "clearResults": "Clear Results",
      "noResults": "Click \"Run\" to test the selected model mapping",
      "reachable": "Unreachable"
    },
    "capture": {
      "title": "Protocol Capture",
      "start": "▶ Start Capture",
      "pause": "⏸ Pause",
      "stop": "■ Stop",
      "entryCount": "{{count}} entries",
      "source": "Source",
      "sourceProxy": "Proxy",
      "filterAll": "All",
      "time": "Time",
      "duration": "Duration",
      "sourceCol": "Source",
      "adapter": "Adapter",
      "inboundProtocol": "Inbound Protocol",
      "inboundModel": "Inbound Model",
      "upstreamProvider": "Upstream Provider",
      "upstreamProtocol": "Upstream Protocol",
      "upstreamModel": "Upstream Model",
      "requestSize": "Request Size",
      "responseSize": "Response Size",
      "empty": "No packets — send a proxy request to capture",
      "copyRaw": "Copy Raw"
    },
    "test": {
      "title": "Test — {{name}}",
      "run": "Run",
      "testing": "Testing...",
      "clearResults": "Clear Results",
      "close": "Close",
      "noResults": "Click \"Run\" to test the selected model",
      "unreachable": "Unreachable",
      "requestFailed": "Request failed"
    },
    "confirm": {
      "cancel": "Cancel",
      "confirm": "Confirm"
    }
  },
  "cli": {
    "start": {
      "configNotFound": "Error: config file not found: {{path}}",
      "alreadyRunning": "Error: proxy is already running (PID: {{pid}})",
      "configLoaded": "Configuration loaded successfully",
      "configLoadFailed": "Configuration load failed: {{error}}",
      "started": "Proxy started: http://{{host}}:{{port}}",
      "adminApi": "  Admin API:  http://{{host}}:{{port}}/admin/",
      "aiApi": "  AI API:    http://{{host}}:{{port}}/v1/",
      "pid": "PID: {{pid}}",
      "configFile": "Config: {{configPath}}",
      "sigterm": "\nSIGTERM received, shutting down...",
      "language": "Language: {{lang}}"
    },
    "stop": {
      "notRunning": "No running proxy found",
      "stalePid": "Found stale PID file, cleaning up...",
      "stopping": "Stopping proxy (PID: {{pid}})...",
      "forceKill": "Process did not exit in time, force killed (PID: {{pid}})",
      "recovered": "Recovered proxy from port {{port}} (PID: {{pid}})..."
    },
    "status": {
      "notRunning": "Proxy is not running",
      "running": "Proxy is running (PID: {{pid}})",
      "port": "Port: {{port}}"
    },
    "restart": {
      "stopping": "Stopping proxy (PID: {{pid}})...",
      "restarting": "Proxy stopped, restarting...",
      "stalePid": "Found stale PID file, cleaning up..."
    },
    "reload": {
      "success": "Configuration reloaded (version: {{version}})",
      "failed": "Configuration reload failed: {{error}}",
      "errorItem": "  - {{message}}",
      "connectionFailed": "Could not connect to proxy: {{error}}"
    }
  },
  "backend": {
    "config": {
      "reloadSuccess": "Configuration reloaded",
      "reloadFailed": "Configuration reload failed",
      "validationFailed": "Configuration validation failed",
      "validationErrors": "Configuration validation failed:\n{{errors}}",
      "duplicateModelId": "Model ID \"{{modelId}}\" is duplicated in provider \"{{provider}}\"",
      "duplicateSourceModelId": "Source model ID \"{{sourceModelId}}\" is duplicated in adapter \"{{adapter}}\""
    },
    "provider": {
      "validationFailed": "Validation failed",
      "referencedByAdapter": "Provider \"{{name}}\" is referenced by adapter \"{{adapter}}\" and cannot be deleted",
      "deleteRequest": "Delete provider request received",
      "deleted": "Provider deleted",
      "createRequest": "Create provider request received",
      "created": "Provider created",
      "updateRequest": "Update provider request received",
      "updated": "Provider updated",
      "notFound": "Model not found: {{model}}"
    },
    "adapter": {
      "validationFailed": "Validation failed",
      "serverError": "Server state error",
      "deleteRequest": "Delete adapter request received",
      "deleted": "Adapter deleted",
      "createRequest": "Create adapter request received",
      "created": "Adapter created"
    },
    "model": {
      "testRequest": "Model test request received",
      "testResult": "Model test",
      "testFailed": "Model test failed",
      "testReachable": "Reachable",
      "testUnreachable": "Unreachable",
      "adapterTestRouteFailed": "Adapter test route resolution failed",
      "adapterTestResult": "Adapter test",
      "adapterTestFailed": "Adapter test failed",
      "pullModelsFailed": "Failed to pull remote models"
    },
    "proxy": {
      "requestError": "Request error",
      "modelNotFound": "Model not found: {{model}}"
    },
    "errors": {
      "readBodyFailed": "Failed to read request body",
      "invalidJson": "Request body is not valid JSON"
    }
  }
}
