mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-07-30 02:14:43 +08:00
c1048ebcbe
Codex CLI only uses OpenAI Responses API. Remove unused Chat Completions routes, handler, parser config, URL builder branches, frontend API format selector, and stale i18n keys. Claude openai_chat support is preserved.
1642 lines
75 KiB
JSON
1642 lines
75 KiB
JSON
{
|
||
"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",
|
||
"toggleTheme": "Toggle theme",
|
||
"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..."
|
||
},
|
||
"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"
|
||
},
|
||
"claudeConfig": {
|
||
"configLabel": "Claude Code settings.json (JSON) *",
|
||
"writeCommonConfig": "Write Common Config",
|
||
"editCommonConfig": "Edit Common Config",
|
||
"editCommonConfigTitle": "Edit Common Config Snippet",
|
||
"commonConfigHint": "This snippet will be merged into settings.json when 'Write 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}}"
|
||
},
|
||
"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"
|
||
},
|
||
"provider": {
|
||
"tabProvider": "Provider",
|
||
"tabUniversal": "Universal",
|
||
"noProviders": "No providers added yet",
|
||
"noProvidersDescription": "Click the \"Add Provider\" button in the top right to configure your first API provider",
|
||
"currentlyUsing": "Currently Using",
|
||
"enable": "Enable",
|
||
"inUse": "In Use",
|
||
"editProvider": "Edit Provider",
|
||
"editProviderHint": "Configuration will be applied to the current provider immediately after update.",
|
||
"deleteProvider": "Delete Provider",
|
||
"addNewProvider": "Add New Provider",
|
||
"addClaudeProvider": "Add Claude Code Provider",
|
||
"addCodexProvider": "Add Codex Provider",
|
||
"addGeminiProvider": "Add Gemini Provider",
|
||
"addOpenCodeProvider": "Add OpenCode Provider",
|
||
"addToConfig": "Add",
|
||
"removeFromConfig": "Remove",
|
||
"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",
|
||
"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": "Write 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"
|
||
}
|
||
}
|
||
},
|
||
"notifications": {
|
||
"providerAdded": "Provider added",
|
||
"providerSaved": "Provider configuration saved",
|
||
"providerDeleted": "Provider deleted successfully",
|
||
"switchSuccess": "Switch successful!",
|
||
"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}}",
|
||
"openAIChatFormatHint": "This provider uses OpenAI Chat format and requires the proxy service to be enabled",
|
||
"openAIChatFormatRequiresProxy": "This provider uses OpenAI Chat format and requires the proxy service for format conversion. Please enable the proxy and takeover the current app first.",
|
||
"fullUrlRequiresProxy": "This provider is configured with a full API path. The client may append duplicate paths in direct connection mode. Please enable the proxy and takeover the current app first.",
|
||
"urlMismatchRequiresProxy": "This provider's request URL configuration does not match the API format. It cannot work properly in direct connection mode. Please enable the proxy and takeover the current app first.",
|
||
"fullUrlWarningOnDisable": "The current provider is configured with a full API path or special format. It may not work properly after disabling the proxy. Consider switching to a base URL configuration or keep the proxy enabled.",
|
||
"openAIChatFormatWarningOnDisable": "The current provider uses OpenAI Chat format. It may not work properly after disabling the proxy. Consider keeping the proxy enabled.",
|
||
"urlMismatchWarningOnDisable": "The current provider's request URL configuration may rely on the proxy. It may not work properly after disabling the proxy. Consider switching to a base URL configuration or keep the proxy enabled.",
|
||
"switchAppliedUnverified": "Switch applied (direct mode not verified)",
|
||
"switchAppliedUnverifiedDesc": "Unable to verify whether this endpoint requires the proxy. If it doesn't work after switching, enable the proxy and takeover the current app.",
|
||
"openLinkFailed": "Failed to open link"
|
||
},
|
||
"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."
|
||
},
|
||
"settings": {
|
||
"title": "Settings",
|
||
"general": "General",
|
||
"tabGeneral": "General",
|
||
"tabAdvanced": "Advanced",
|
||
"advanced": {
|
||
"configDir": {
|
||
"title": "Configuration Directory",
|
||
"description": "Manage storage paths for Claude, Codex and Gemini configurations"
|
||
},
|
||
"proxy": {
|
||
"title": "Local Proxy",
|
||
"description": "Control proxy service toggle, view status and port info",
|
||
"running": "Running",
|
||
"stopped": "Stopped"
|
||
},
|
||
"modelTest": {
|
||
"title": "Model Test Config",
|
||
"description": "Configure default models and prompts for model testing"
|
||
},
|
||
"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/export configurations and backup/restore"
|
||
},
|
||
"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": "Automatically fix Claude API errors caused by thinking signature validation failures"
|
||
},
|
||
"logConfig": {
|
||
"title": "Log Management",
|
||
"description": "Control log output level",
|
||
"enabled": "Enable Logging",
|
||
"enabledDescription": "Master switch, all logging will be disabled when turned off",
|
||
"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",
|
||
"autoReload": "Data refreshed",
|
||
"languageOptionChinese": "中文",
|
||
"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.",
|
||
"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",
|
||
"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"
|
||
},
|
||
"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"
|
||
},
|
||
"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) and keep claude.json (MCP) alongside it.",
|
||
"codexConfigDir": "Codex Configuration Directory",
|
||
"codexConfigDirDescription": "Override Codex configuration directory.",
|
||
"geminiConfigDir": "Gemini Configuration Directory",
|
||
"geminiConfigDirDescription": "Override Gemini configuration directory (.env).",
|
||
"opencodeConfigDir": "OpenCode Configuration Directory",
|
||
"opencodeConfigDirDescription": "Override OpenCode configuration directory (opencode.json).",
|
||
"browsePlaceholderClaude": "e.g., /home/<your-username>/.claude",
|
||
"browsePlaceholderCodex": "e.g., /home/<your-username>/.codex",
|
||
"browsePlaceholderGemini": "e.g., /home/<your-username>/.gemini",
|
||
"browsePlaceholderOpencode": "e.g., /home/<your-username>/.config/opencode",
|
||
"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",
|
||
"oneClickInstall": "One-click Install",
|
||
"oneClickInstallHint": "Install Claude Code / Codex / Gemini CLI / OpenCode",
|
||
"localEnvCheck": "Local environment check",
|
||
"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.). 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"
|
||
}
|
||
},
|
||
"apps": {
|
||
"claude": "Claude",
|
||
"codex": "Codex",
|
||
"gemini": "Gemini",
|
||
"opencode": "OpenCode"
|
||
},
|
||
"sessionManager": {
|
||
"title": "Session Manager",
|
||
"subtitle": "Manage Codex and Claude Code sessions",
|
||
"searchPlaceholder": "Search by content, directory, or ID",
|
||
"searchSessions": "Search sessions",
|
||
"providerFilterAll": "All",
|
||
"sessionList": "Sessions",
|
||
"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",
|
||
"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"
|
||
},
|
||
"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 writes to oh-my-opencode.jsonc",
|
||
"officialHint": "💡 Official provider uses browser login, no API Key needed",
|
||
"getApiKey": "Get API Key",
|
||
"partnerPromotion": {
|
||
"zhipu": "Zhipu GLM is an official partner of CC Switch. Use this link to top up and get a 10% discount",
|
||
"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",
|
||
"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!)",
|
||
"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!"
|
||
},
|
||
"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",
|
||
"codexApiHint": "💡 Fill in service endpoint compatible with OpenAI Response format",
|
||
"directRequestUrl": "CLI Direct Request URL:",
|
||
"directRequestUrlDesc": "Actual request URL after CLI appends default suffix",
|
||
"proxyRequestUrl": "CCS Proxy Request URL:",
|
||
"proxyRequestUrlDesc": "URL forwarded to upstream after CCS smart path detection",
|
||
"fullUrlWarningTitle": "Full API path detected",
|
||
"fullUrlWarning": "The URL contains a full API path. This configuration only works in proxy mode. For direct connection mode, please enter only the base URL.",
|
||
"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",
|
||
"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",
|
||
"anthropicReasoningModel": "Reasoning Model (Thinking)",
|
||
"apiFormat": "API Format",
|
||
"apiFormatHint": "Select the input format for the provider's API",
|
||
"apiFormatAnthropic": "Anthropic Messages (Native)",
|
||
"apiFormatOpenAIChat": "OpenAI Chat Completions (Requires proxy)",
|
||
"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.",
|
||
"categoryOfficial": "Official",
|
||
"categoryCnOfficial": "Opensource Official",
|
||
"categoryAggregation": "Aggregation",
|
||
"categoryThirdParty": "Third Party"
|
||
},
|
||
"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}}",
|
||
"status": "Status: {{code}}"
|
||
},
|
||
"providerAdvanced": {
|
||
"testConfig": "Model Test Config",
|
||
"useCustomConfig": "Use separate config",
|
||
"testConfigDesc": "Configure separate model testing parameters for this provider. Uses global settings when disabled.",
|
||
"testModel": "Test Model",
|
||
"testModelPlaceholder": "Leave empty to use global config",
|
||
"timeoutSecs": "Timeout (seconds)",
|
||
"testPrompt": "Test Prompt",
|
||
"degradedThreshold": "Degraded Threshold (ms)",
|
||
"maxRetries": "Max Retries",
|
||
"proxyConfig": "Proxy Config",
|
||
"useCustomProxy": "Use separate proxy",
|
||
"proxyConfigDesc": "Configure separate network proxy for this provider. Uses system proxy or global settings when disabled.",
|
||
"proxyUsername": "Username (optional)",
|
||
"proxyPassword": "Password (optional)",
|
||
"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",
|
||
"configToml": "config.toml (TOML)",
|
||
"configTomlHint": "Codex config.toml configuration content",
|
||
"writeCommonConfig": "Write 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 'Write Common Config' is checked",
|
||
"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}}"
|
||
},
|
||
"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": "Write Common Config",
|
||
"editCommonConfig": "Edit Common Config",
|
||
"editCommonConfigTitle": "Edit Gemini Common Config Snippet",
|
||
"commonConfigHint": "This snippet writes to Gemini .env (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",
|
||
"providerKey": "Provider Key",
|
||
"providerKeyPlaceholder": "my-provider",
|
||
"providerKeyHint": "Unique identifier in config file. Cannot be changed after creation. Use lowercase letters, numbers, and hyphens only.",
|
||
"providerKeyRequired": "Provider key is required",
|
||
"providerKeyDuplicate": "This key is already in use",
|
||
"providerKeyInvalid": "Invalid format. Use lowercase letters, numbers, and hyphens only.",
|
||
"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",
|
||
"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."
|
||
},
|
||
"usage": {
|
||
"title": "Usage Statistics",
|
||
"subtitle": "View AI model usage and cost statistics",
|
||
"today": "24 Hours",
|
||
"last7days": "7 Days",
|
||
"last30days": "30 Days",
|
||
"totalRequests": "Total Requests",
|
||
"totalCost": "Total Cost",
|
||
"cost": "Cost",
|
||
"perMillion": "(per million)",
|
||
"trends": "Usage Trends",
|
||
"rangeToday": "Last 24 hours (hourly)",
|
||
"rangeLast7Days": "Last 7 days",
|
||
"rangeLast30Days": "Last 30 days",
|
||
"totalTokens": "Total Tokens",
|
||
"cacheTokens": "Cache Tokens",
|
||
"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",
|
||
"totalRecords": "{{total}} records total",
|
||
"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",
|
||
"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",
|
||
"allApps": "All Apps",
|
||
"statusCode": "Status Code",
|
||
"searchProviderPlaceholder": "Search provider...",
|
||
"searchModelPlaceholder": "Search model...",
|
||
"timeRange": "Time Range",
|
||
"input": "Input",
|
||
"output": "Output",
|
||
"cacheWrite": "Creation",
|
||
"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"
|
||
},
|
||
"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",
|
||
"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",
|
||
"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"
|
||
},
|
||
"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."
|
||
},
|
||
"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",
|
||
"opencode": "OpenCode"
|
||
}
|
||
},
|
||
"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}}\"?"
|
||
}
|
||
},
|
||
"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",
|
||
"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",
|
||
"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 description...",
|
||
"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.",
|
||
"foundIn": "Found in",
|
||
"local": "Local",
|
||
"uninstallConfirm": "Are you sure you want to uninstall \"{{name}}\"? This will remove the skill from all apps.",
|
||
"uninstallInMainPanel": "Please uninstall skills from the main panel",
|
||
"notFound": "Skill not found",
|
||
"apps": {
|
||
"claude": "Claude",
|
||
"codex": "Codex",
|
||
"gemini": "Gemini",
|
||
"opencode": "OpenCode"
|
||
},
|
||
"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"
|
||
},
|
||
"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."
|
||
}
|
||
},
|
||
"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"
|
||
},
|
||
"modelTest": {
|
||
"testProvider": "Test model"
|
||
},
|
||
"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"
|
||
}
|
||
},
|
||
"proxy": {
|
||
"takeover": {
|
||
"toggleFailed": "Failed to toggle takeover",
|
||
"toggleFailedDesc": "Check proxy service status and permissions, then try again."
|
||
},
|
||
"panel": {
|
||
"serviceAddress": "Service Address",
|
||
"addressCopied": "Address copied",
|
||
"currentProvider": "Current Provider:",
|
||
"waitingFirstRequest": "Current Provider: Waiting for first request...",
|
||
"stoppedTitle": "Proxy Service Stopped",
|
||
"stoppedDescription": "Use the toggle in the top right to start the service",
|
||
"openSettings": "Configure Proxy Service",
|
||
"stats": {
|
||
"activeConnections": "Active Connections",
|
||
"totalRequests": "Total Requests",
|
||
"successRate": "Success Rate",
|
||
"uptime": "Uptime"
|
||
}
|
||
},
|
||
"settings": {
|
||
"title": "Proxy Service Settings",
|
||
"description": "Configure local proxy server listening address, port and runtime parameters. Changes take effect immediately after saving.",
|
||
"alert": {
|
||
"autoApply": "Changes will be automatically synced to the running proxy service without manual restart."
|
||
},
|
||
"basic": {
|
||
"title": "Basic Settings",
|
||
"description": "Configure proxy 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 proxy server listens on (recommended: 127.0.0.1)"
|
||
},
|
||
"listenPort": {
|
||
"label": "Listen Port",
|
||
"placeholder": "15721",
|
||
"description": "Port number the proxy 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": "Enable Logging",
|
||
"description": "Log all proxy requests for troubleshooting"
|
||
},
|
||
"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": "Proxy configuration saved",
|
||
"saveFailed": "Save failed: {{error}}"
|
||
},
|
||
"invalidPort": "Invalid port, please enter a number between 1024-65535",
|
||
"invalidAddress": "Invalid address, please enter a valid IP address (e.g. 127.0.0.1) or localhost",
|
||
"configSaved": "Proxy configuration saved",
|
||
"configSaveFailed": "Failed to save configuration",
|
||
"restartRequired": "Restart proxy service for address or port changes to take effect"
|
||
},
|
||
"switchFailed": "Switch failed: {{error}}",
|
||
"failover": {
|
||
"proxyRequired": "Proxy 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"
|
||
}
|
||
},
|
||
"streamCheck": {
|
||
"configSaved": "Health check config saved",
|
||
"configSaveFailed": "Save failed",
|
||
"testModels": "Test Models",
|
||
"claudeModel": "Claude Model",
|
||
"codexModel": "Codex Model",
|
||
"geminiModel": "Gemini Model",
|
||
"checkParams": "Check Parameters",
|
||
"timeout": "Timeout (seconds)",
|
||
"maxRetries": "Max Retries",
|
||
"degradedThreshold": "Degraded Threshold (ms)",
|
||
"testPrompt": "Test Prompt"
|
||
},
|
||
"proxyConfig": {
|
||
"proxyEnabled": "Proxy Enabled",
|
||
"appTakeover": "Proxy 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"
|
||
},
|
||
"circuitBreaker": {
|
||
"failureThreshold": "Failure Threshold",
|
||
"successThreshold": "Success Threshold",
|
||
"timeoutSeconds": "Timeout (seconds)",
|
||
"errorRateThreshold": "Error Rate Threshold",
|
||
"minRequests": "Min Requests",
|
||
"validationFailed": "The following fields are out of valid range: {{fields}}",
|
||
"configSaved": "Circuit breaker config saved",
|
||
"saveFailed": "Failed to save"
|
||
},
|
||
"universalProvider": {
|
||
"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",
|
||
"updated": "Universal provider updated",
|
||
"deleted": "Universal provider deleted",
|
||
"addSuccess": "Universal provider added successfully",
|
||
"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}}",
|
||
"writeCommonConfig": "Write to common config",
|
||
"editCommonConfig": "Edit common config",
|
||
"editCommonConfigTitle": "Common Config",
|
||
"commonConfigHint": "OMO common config will be merged into all OMO configs that enable it",
|
||
"selectPlaceholder": "Select...",
|
||
"clear": "Clear",
|
||
"clearWrapped": "(Clear)",
|
||
"defaultWrapped": "(Default)",
|
||
"variantPlaceholder": "variant",
|
||
"selectEnabledModel": "Select enabled model",
|
||
"selectModelFirst": "Select model first",
|
||
"noEnabledModels": "No enabled models",
|
||
"noVariantsForModel": "No variants for model",
|
||
"currentValueNotEnabled": "{{value}} (current value, not enabled)",
|
||
"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 enabled models available. Configure and enable OpenCode models first.",
|
||
"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",
|
||
"configSummary": "{{agents}} agents, {{categories}} categories configured · Click ⚙ for advanced params",
|
||
"enabledModelsCount": "{{count}} enabled models available",
|
||
"source": "from:",
|
||
"otherFieldsJson": "Other Fields (JSON)",
|
||
"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"
|
||
}
|
||
}
|