{ "app": { "eyebrow": "ocswitch desktop", "brand": "ocswitch desktop", "title": "Native control panel", "subtitle": "{{version}} · {{shell}} shell · {{path}}", "loadingConfig": "loading config", "dev": "dev" }, "tray": { "appTitle": "ocswitch", "appTooltip": "ocswitch desktop", "proxyChecking": "Proxy: checking...", "proxyStatusHint": "Current proxy status", "proxyUnavailable": "Proxy: unavailable", "proxyRunning": "Proxy: running (%s)", "proxyStopped": "Proxy: stopped (%s)", "openWindow": "Open window", "openWindowHint": "Show desktop window", "hideWindow": "Hide window", "hideWindowHint": "Hide desktop window", "startProxy": "Start proxy", "startProxyHint": "Start local proxy", "stopProxy": "Stop proxy", "stopProxyHint": "Stop local proxy", "quit": "Quit", "quitHint": "Exit application" }, "nav": { "overview": { "title": "Overview", "description": "Status, actions, and environment" }, "providers": { "title": "Providers", "description": "Manage upstream endpoints" }, "aliases": { "title": "Aliases", "description": "Route models across targets" }, "log": { "title": "Log", "description": "Business routing, alias decisions, and failover chain" }, "network": { "title": "Network", "description": "Request metadata except LLM input and output content" }, "sync": { "title": "Sync", "description": "OpenCode sync and doctor" }, "settings": { "title": "Settings", "description": "Theme, language, desktop behavior" } }, "actions": { "refresh": "Refresh", "runDoctor": "Run doctor", "startProxy": "Start proxy", "stopProxy": "Stop proxy", "save": "Save", "reset": "Reset", "preview": "Preview", "apply": "Apply sync", "edit": "Edit", "delete": "Delete", "enable": "Enable", "disable": "Disable", "import": "Import providers", "bind": "Bind target", "unbind": "Unbind", "newProvider": "New provider", "newAlias": "New alias", "close": "Close", "cancel": "Cancel", "confirm": "Confirm", "exportConfig": "Export config", "importConfig": "Import config" }, "confirm": { "deleteProviderTitle": "Delete provider", "deleteAliasTitle": "Delete alias", "unbindTargetTitle": "Unbind target" }, "status": { "proxyRunning": "Proxy running", "proxyIdle": "Proxy idle", "enabled": "Enabled", "disabled": "Disabled", "yes": "Yes", "no": "No" }, "messages": { "refreshing": "Refreshing...", "fresh": "Fresh", "saving": "Saving...", "saved": "Saved", "running": "Running...", "applying": "Applying...", "previewing": "Previewing...", "importing": "Importing providers...", "loading": "Loading...", "noData": "No data yet.", "warningsSuffix": "Warnings: {{warnings}}", "proxyStarted": "Proxy started", "proxyStopped": "Proxy stopped", "doctorOk": "Doctor OK", "previewChanges": "Preview shows changes", "previewNoChanges": "Preview shows no changes", "syncApplied": "Sync applied", "syncUpToDate": "Already up to date", "confirmDeleteProvider": "Delete provider {{id}}? This cannot be undone.", "confirmDeleteAlias": "Delete alias {{alias}}? This cannot be undone.", "confirmUnbindTarget": "Unbind {{provider}}/{{model}} from {{alias}}?" }, "overview": { "title": "Overview", "subtitle": "See the current desktop state and run common actions without leaving this screen.", "actionsTitle": "Actions", "statsTitle": "System snapshot", "environmentTitle": "Environment", "environmentSubtitle": "Only runtime and desktop app details stay here.", "doctorTitle": "Doctor summary", "debugTitle": "Debug details", "debugSummary": "Show raw overview JSON", "providers": "Providers", "aliases": "Aliases", "routableAliases": "Routable aliases", "proxy": "Proxy", "version": "Version", "shell": "Shell", "configPath": "Config path", "startedAt": "Started at", "lastError": "Last error", "doctorReady": "Doctor has not run yet. Use it to inspect config and OpenCode wiring.", "doctorIssues": "{{count}} issue(s) found", "doctorHealthy": "No known issues" }, "providers": { "title": "Providers", "subtitle": "Edit upstream providers with a fixed editor and a scrollable list.", "listTitle": "Provider list", "formCreateTitle": "Create provider", "formEditTitle": "Edit provider {{id}}", "importTitle": "Import from OpenCode", "search": "Search providers", "searchPlaceholder": "Filter by id, name, or URL", "filter": "Status filter", "filterAll": "All", "filterEnabled": "Enabled", "filterDisabled": "Disabled", "listCount": "{{shown}} shown / {{total}} total", "detailHint": "Select one row to inspect and edit it on the right.", "selectTitle": "Select a provider", "selectHint": "The left list is optimized for density. Pick one row to inspect or edit details here.", "empty": "No providers configured yet.", "emptyHint": "Create one manually or import providers from your OpenCode config.", "noMatches": "No providers match the current filters.", "noMatchesHint": "Try a broader search term or switch the status filter.", "id": "Provider id", "name": "Display name", "baseUrl": "Base URL", "apiKey": "API key", "headers": "Headers", "models": "Models", "sourcePath": "Import path", "saveDisabled": "Save as disabled", "skipModels": "Skip /v1/models discovery", "clearHeaders": "Clear saved headers before update", "overwrite": "Overwrite existing providers", "apiKeyMasked": "API key", "apiKeyNotSet": "not set", "cardBaseUrl": "URL", "cardModels": "Models", "cardApiKey": "API key", "detailBasicsTitle": "Basics", "detailTogglesTitle": "Behavior", "headersNone": "none", "modelsNone": "none", "modelsCount": "{{count}} models", "sourceLabel": "Source", "placeholderId": "su8", "placeholderName": "SU8", "placeholderBaseUrl": "https://example.com/v1", "placeholderApiKey": "Leave blank to keep existing key when editing", "placeholderHeaders": "X-Token=abc\nX-Workspace=my-team", "placeholderSourcePath": "Leave blank to use global OpenCode config", "statusSaved": "Saved provider {{id}}", "statusEditing": "Editing provider {{id}}. Leave API key blank to keep the current value.", "statusEnabling": "Enabling provider {{id}}...", "statusDisabling": "Disabling provider {{id}}...", "statusEnabled": "Enabled provider {{id}}", "statusDisabled": "Disabled provider {{id}}", "statusDeleting": "Deleting provider {{id}}...", "statusDeleted": "Deleted provider {{id}}", "statusImportDone": "Import done: imported={{imported}}, skipped={{skipped}}" }, "aliases": { "title": "Aliases", "subtitle": "Separate alias editing from target binding so routing stays readable.", "listTitle": "Alias list", "formCreateTitle": "Create alias", "formEditTitle": "Edit alias {{alias}}", "bindTitle": "Bind target", "search": "Search aliases", "searchPlaceholder": "Filter by alias, display name, provider, or model", "listCount": "{{shown}} shown / {{total}} total", "detailHint": "Select one row to inspect alias settings and targets on the right.", "selectTitle": "Select an alias", "selectHint": "The left list stays compact so you can scan more routes per screen. Pick one row to inspect or edit details here.", "empty": "No aliases configured yet.", "emptyHint": "Create an alias first, then bind provider/model targets to it.", "noMatches": "No aliases match the current filters.", "noMatchesHint": "Try a different search term or create a new alias route.", "alias": "Alias", "displayName": "Display name", "aliasForBinding": "Alias for binding", "providerId": "Provider id", "model": "Model", "createDisabled": "Create or keep disabled", "targetDisabled": "Add target disabled", "placeholderAlias": "gpt-5.4", "placeholderDisplayName": "GPT 5.4", "placeholderAliasBinding": "Existing alias or new alias", "placeholderProviderId": "su8", "placeholderModel": "gpt-5.4", "targets": "Targets", "targetsCount": "{{count}} targets", "routable": "{{available}}/{{total}} routable", "cardRoute": "Route", "cardTargets": "Targets", "cardPrimary": "Primary", "detailBasicsTitle": "Alias details", "detailTargetsHint": "Manage routable provider/model targets for this alias.", "statusSaved": "Saved alias {{alias}}", "statusEditing": "Editing alias {{alias}}", "statusDeleting": "Deleting alias {{alias}}...", "statusDeleted": "Deleted alias {{alias}}", "statusBinding": "Binding target...", "statusBound": "Bound {{provider}}/{{model}} to {{alias}}", "statusRemoving": "Removing {{provider}}/{{model}} from {{alias}}...", "statusRemoved": "Removed {{provider}}/{{model}} from {{alias}}", "statusEnabling": "Enabling {{provider}}/{{model}} on {{alias}}...", "statusDisabling": "Disabling {{provider}}/{{model}} on {{alias}}...", "statusEnabled": "Enabled {{provider}}/{{model}} on {{alias}}", "statusDisabled": "Disabled {{provider}}/{{model}} on {{alias}}", "noTargets": "No targets bound." }, "sync": { "title": "Sync", "subtitle": "Preview and apply OpenCode sync without leaving the desktop shell.", "syncTitle": "OpenCode sync", "doctorTitle": "Doctor report", "targetPath": "Target path", "model": "model", "smallModel": "small_model", "placeholderTargetPath": "Use default OpenCode config", "placeholderModel": "ocswitch/", "outputTitle": "Last output", "doctorHint": "Run doctor to inspect config and OpenCode wiring.", "issuesTitle": "Issues", "noIssues": "No issues reported.", "debugTitle": "Raw doctor JSON", "debugSummary": "Show doctor output" }, "log": { "title": "Request log", "subtitle": "Inspect alias routing, final target, and failover chain for each request.", "count": "{{count}} requests", "empty": "No proxied requests yet.", "emptyHint": "Start the proxy and send a request to populate the timeline.", "success": "Success", "failed": "Failed", "failover": "Failover", "detailTitle": "Business detail", "detailSubtitle": "This panel focuses on alias-level routing semantics.", "alias": "Alias", "finalRoute": "Final route", "status": "Status", "totalTime": "Total time", "startedAt": "Started at", "firstByte": "First byte", "stream": "Stream", "chainTitle": "Attempt chain", "attemptLabel": "Attempt {{attempt}}", "provider": "Provider", "model": "Model" }, "network": { "title": "Network detail", "subtitle": "Inspect URL, timing, status, headers, and params without exposing model IO content.", "count": "{{count}} requests", "detailTitle": "Network inspector", "detailSubtitle": "Each attempt shows technical metadata captured around the upstream call.", "url": "URL", "firstByte": "TTFB", "totalTime": "Total time", "statusCode": "Status code", "requestHeaders": "Client request headers", "requestParams": "Client request params", "responseHeaders": "Upstream response headers", "responseBody": "Upstream response body", "attemptTitle": "Attempt {{attempt}} · {{provider}} / {{model}}" }, "settings": { "title": "Settings", "subtitle": "Persist desktop behavior, theme preference, and language preference.", "appearanceTitle": "Appearance", "languageTitle": "Language", "behaviorTitle": "Desktop behavior", "timeoutTitle": "Proxy timeouts", "configTitle": "Config file", "importTitle": "Import mode", "importModeText": "Import text", "importModeFile": "Import file", "importText": "Config text", "importFile": "Config file", "importPlaceholder": "Paste full ocswitch config JSON", "fileEmpty": "No file selected yet.", "exportDone": "Exported config {{path}}", "importDone": "Imported config {{path}}", "fileLoaded": "Loaded file {{name}}", "importEmpty": "Provide config content first.", "aboutTitle": "About", "aboutSubtitle": "Read-only environment details for the current desktop shell.", "theme": "Theme", "language": "Language", "languageLabel": "Preferred language", "themeSystem": "System", "themeLight": "Light", "themeDark": "Dark", "languageSystem": "System", "languageEnglish": "English", "languageChinese": "Simplified Chinese", "resolvedTheme": "Resolved theme", "resolvedLanguage": "Resolved language", "launchAtLogin": "Launch at login", "autoStartProxy": "Start proxy on app launch", "connectTimeout": "Connect timeout (ms)", "responseHeaderTimeout": "Response header timeout (ms)", "firstByteTimeout": "First byte timeout (ms)", "requestReadTimeout": "Client request read timeout (ms)", "streamIdleTimeout": "Stream idle timeout (ms)", "timeoutHint": "Saved values apply to the next proxy start.", "timeoutRunningHint": "The proxy is currently running. Saved values apply only after you restart it.", "saveTimeouts": "Save proxy timeouts", "minimizeToTray": "Minimize to tray / close to background", "notifications": "Native notifications" }, "errors": { "invalidHeaderFormat": "Invalid header \"{{line}}\". Use KEY=VALUE.", "invalidHeaderName": "Invalid header \"{{line}}\". Header name must not be empty." } }