337 lines
13 KiB
JSON
337 lines
13 KiB
JSON
{
|
|
"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/<alias>",
|
|
"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."
|
|
}
|
|
}
|