import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; import { getInitialLocale } from '@/lib/locales'; const resources = { en: { translation: { locale: { en: 'English', 'zh-CN': 'Simplified Chinese', }, layout: { languageSwitcher: 'Language', }, nav: { general: 'General', home: 'Home', analytics: 'Analytics', identityAccess: 'Identity & Access', apiProfiles: 'API Profiles', cliproxyPlus: 'CLIProxy Plus', cliproxyOverview: 'Overview', controlPanel: 'Control Panel', githubCopilot: 'GitHub Copilot', cursorIde: 'Cursor IDE', accounts: 'Accounts', allAccounts: 'All Accounts', sharedData: 'Shared Data', compatibleClis: 'Compatible CLIs', factoryDroid: 'Factory Droid', system: 'System', health: 'Health', settings: 'Settings', openrouterTooltip: '349+ models via OpenRouter', }, home: { profiles: 'Profiles', cliproxy: 'CLIProxy', accounts: 'Accounts', health: 'Health', configurationRequired: 'Configuration Required', }, auth: { dashboardTitle: 'CCS Dashboard', loginDescription: 'Enter your credentials to access the dashboard', username: 'Username', password: 'Password', usernamePlaceholder: 'Enter username', passwordPlaceholder: 'Enter password', signIn: 'Sign In', signingIn: 'Signing in...', loginFailed: 'Login failed', }, commonToast: { apiKeyRequired: 'API key is required', accountAddedPresetFailed: 'Account added, but failed to apply default preset', settingsCopied: 'Settings copied to clipboard', enterPresetName: 'Please enter a preset name to save', codeCopied: 'Code copied to clipboard', copyCodeFailed: 'Failed to copy code', appliedModelAllTiers: 'Applied model to all tiers', settingsSaved: 'Settings saved', defaultTargetUpdated: 'Default target updated', failedUpdateDefaultTarget: 'Failed to update default target to {{target}}{{suffix}}', }, profileDialog: { editTitle: 'Edit Profile', createTitle: 'Create API Profile', name: 'Name', namePlaceholder: 'my-api', baseUrl: 'Base URL', baseUrlPlaceholder: 'https://api.example.com', apiKey: 'API Key', defaultModel: 'Default Model (ANTHROPIC_MODEL)', defaultModelHint: 'Leave blank to use: {{model}}', modelMappingTitle: 'Model Mapping (Opus/Sonnet/Haiku)', modelMappingDesc: 'Configure different model IDs for each tier. Useful for API proxies that route different model types to different backends.', opusModel: 'Opus Model (ANTHROPIC_DEFAULT_OPUS_MODEL)', sonnetModel: 'Sonnet Model (ANTHROPIC_DEFAULT_SONNET_MODEL)', haikuModel: 'Haiku Model (ANTHROPIC_DEFAULT_HAIKU_MODEL)', cancel: 'Cancel', saving: 'Saving...', update: 'Update', create: 'Create', }, modelTierMapping: { title: 'Model Tier Mapping', advanced: 'Advanced', description: "Configure different models for Claude Code's opus/sonnet/haiku tiers.", autoSuggest: 'Auto-suggest based on {{provider}}', opusPlaceholder: 'e.g., anthropic/claude-opus-4', sonnetPlaceholder: 'e.g., anthropic/claude-sonnet-4', haikuPlaceholder: 'e.g., anthropic/claude-3.5-haiku', footer: 'These set ANTHROPIC_DEFAULT_OPUS_MODEL, ANTHROPIC_DEFAULT_SONNET_MODEL, ANTHROPIC_DEFAULT_HAIKU_MODEL.', }, envEditor: { sensitive: 'sensitive', none: 'No environment variables configured.', noneHint: 'Add variables using the input below or edit the JSON directly.', addVariable: 'Add Environment Variable', keyPlaceholder: 'VARIABLE_NAME', valuePlaceholder: 'value', }, setupVariant: { using: 'Using:', variantNameRequired: 'Variant Name *', variantNamePlaceholder: 'e.g., my-gemini, g3, flash', invokeHintPrefix: 'Use this name to invoke:', model: 'Model', modelPlaceholder: 'e.g., gemini-2.5-pro, claude-opus-4-5', choosePresetInstead: 'Choose from presets instead', selectModel: 'Select a model', customModelName: 'Custom model name...', enterAnyModel: 'Enter any model name supported by CLIProxy', defaultModel: 'Default: {{model}}', providerDefault: 'provider default', back: 'Back', skip: 'Skip', creating: 'Creating...', createVariant: 'Create Variant', skipHint: 'Skip if you just wanted to add an account without creating a variant', }, customPresetDialog: { title: 'Custom Preset', presetNameOptional: 'Preset Name (optional)', presetNamePlaceholder: 'e.g., My Custom Config', codexTipPrefix: 'Codex tip: suffixes', codexTipSuffix: 'pin effort. Unsuffixed models use Thinking settings.', defaultModel: 'Default Model', defaultModelDesc: 'Used when no specific tier is requested', opusModel: 'Opus (Most capable)', opusModelDesc: 'For complex reasoning tasks', sonnetModel: 'Sonnet (Balanced)', sonnetModelDesc: 'Balance of speed and capability', haikuModel: 'Haiku (Fast)', haikuModelDesc: 'Quick responses for simple tasks', cancel: 'Cancel', savePreset: 'Save Preset', applyPreset: 'Apply Preset', }, componentModelSelector: { selectModel: 'Select model', availableModelsCount: 'Available Models ({{count}})', preview: 'Preview', }, copilotSettings: { enableCopilot: 'Enable Copilot', enableCopilotDesc: 'Allow using GitHub Copilot subscription', basicSettings: 'Basic Settings', accountType: 'Account Type', accountTypeIndividual: 'Individual', accountTypeBusiness: 'Business', accountTypeEnterprise: 'Enterprise', rateLimiting: 'Rate Limiting', rateLimitSeconds: 'Rate Limit (seconds)', noLimit: 'No limit', waitOnRateLimit: 'Wait on Rate Limit', waitOnRateLimitDesc: 'Wait instead of error when limit hit', daemonSettings: 'Daemon Settings', autoStartDaemon: 'Auto-start Daemon', autoStartDaemonDesc: 'Start copilot-api when using profile', }, providerModelSelector: { selectModel: 'Select model', noModelsForProvider: 'No models available for this provider', broken: 'BROKEN', deprecated: 'DEPRECATED', paid: 'PAID', freeTier: 'Free Tier', paidTier: 'Paid Tier', modelKnownIssues: 'This model has known issues', viewIssueDetails: 'View issue details', modelDeprecated: 'This model is deprecated', recommended: 'Recommended', allModelsCount: 'All Models ({{count}})', noModelsAvailable: 'No models available', }, createAuthProfileDialog: { title: 'Create New Account', description: 'Auth profiles require Claude CLI login. Run the command below in your terminal. You can edit sync mode, group, and continuity depth later from the Accounts table.', profileName: 'Profile Name', profileNamePlaceholder: 'e.g., work, personal, client', invalidProfileName: 'Name must start with a letter and contain only letters, numbers, dashes, or underscores.', enableSharedHistory: 'Enable shared history sync with other ccs auth accounts', historySyncGroupOptional: 'History Sync Group (optional)', historySyncGroupPlaceholder: 'default, sprint-a, client-x', historySyncGroupHint: 'Leave empty to use the default shared group. Spaces are normalized to dashes.', deeperContinuity: 'Advanced: deeper continuity mode', deeperContinuityHint: 'Adds sync for session-env, file-history, shell-snapshots, and todos. Credentials stay isolated.', invalidContextGroup: 'Group must start with a letter and use only letters, numbers, dashes, or underscores (max {{max}} chars).', command: 'Command', commandFallback: 'ccs auth create ', afterRunPrefix: 'After running the command:', afterRunStep1: 'Complete the Claude login in your browser', afterRunStep2: 'Return here and refresh to see the new account', poolingHint: 'Prefer pooled Claude OAuth routing instead? Use CLIProxy Claude pool from the Accounts page action button.', close: 'Close', copied: 'Copied!', copyCommand: 'Copy Command', }, cliproxyModelCategory: { google: 'Google (Gemini)', openai: 'OpenAI (GPT)', anthropic: 'Anthropic (Claude)', antigravity: 'Antigravity', other: 'Other', }, cliproxyOverviewComponents: { availableModels: 'Available Models', noModelsAvailable: 'No models available', startSessionHint: 'Start a CLIProxy session to fetch available models', totalCount: '{{count}} total', availableThroughGroupedByProvider: 'Models available through {{backendLabel}}, grouped by provider', moreCount: '+{{count}} more', }, categorizedModelSelector: { selectModel: 'Select a model', noModelsAvailable: 'No models available', modelPlaceholder: 'Model...', }, openrouterQuickStart: { recommended: 'Recommended', title: 'Start with OpenRouter', description: 'Access {{modelCountLabel}} models from OpenAI, Anthropic, Google, Meta and more - all through one API.', featureOneApi: 'One API, all providers', featureTierMapping: 'Model tier mapping', createOpenRouterProfile: 'Create OpenRouter Profile', getApiKeyAt: 'Get your API key at', or: 'or', createCustomProfile: 'Create Custom API Profile', }, credentialHealth: { title: 'Credential Health', ready: 'Ready', noCredentialsConfigured: 'No credentials configured. Use the login buttons above to authenticate.', neverUsed: 'Never used', justNow: 'Just now', unknown: 'Unknown', daysAgo: '{{count}}d ago', hoursAgo: '{{count}}h ago', minutesAgo: '{{count}}m ago', }, proxyStatusWidget: { justNow: 'just now', minutesAgo: '{{count}}m ago', hoursAgo: '{{count}}h ago', syncReady: 'Sync Ready', noConfig: 'No Config', remoteProxy: 'Remote Proxy', active: 'Active', trafficAutoRouted: 'Traffic auto-routed to remote server', tooltipSync: 'Sync profiles to CLIProxy', tooltipRestart: 'Restart', tooltipStop: 'Stop', tooltipClose: 'Close', tooltipVersionSettings: 'Version settings', versionManagement: 'Version Management', selectVersionPlaceholder: 'Select version to install...', stable: '(stable)', install: 'Install', versionsAboveUnstable: 'Versions above {{version}} have known issues', lastChecked: 'Last checked {{time}}', notRunning: 'Not running', start: 'Start', port: 'Port {{port}}', sessionCount: '{{count}} session', sessionCount_other: '{{count}} sessions', installUnstableTitle: 'Install Unstable Version?', installUnstableDesc: 'You are about to install v{{version}}, which is above the maximum stable version v{{maxStable}}.', installUnstableWarning: 'This version has known stability issues and may cause unexpected behavior.', installUnstableConfirm: 'Are you sure you want to proceed?', cancel: 'Cancel', installAnyway: 'Install Anyway', clickToDowngrade: 'Click to downgrade', clickToUpdate: 'Click to update', }, syncStatusCard: { profileSync: 'Profile Sync', ready: 'Ready', noConfig: 'No Config', syncsProfilesDesc: 'Syncs API profiles to local CLIProxy config', runDoctorHint: 'Run ccs doctor --fix to generate config.', details: 'Details', syncNow: 'Sync Now', }, syncDialog: { title: 'Sync Profiles to Local CLIProxy', description: 'Sync your CCS API profiles to the local CLIProxy config.yaml.', noProfiles: 'No profiles configured to sync.', createProfilesFirst: 'Create API profiles first using the Profiles tab.', modelLabel: 'Model:', ready: 'Ready', profilesToSync_one: '{{count}} profile to sync', profilesToSync_other: '{{count}} profiles to sync', cancel: 'Cancel', syncing: 'Syncing...', synced: 'Synced!', syncNow: 'Sync Now', }, errorLogs: { title: 'Error Logs', failedRequests_one: '{{count}} failed request', failedRequests_other: '{{count}} failed requests', cliproxyDiagnostics: 'CLIProxy Diagnostics', showingCount: 'Showing 50 of {{total}} logs', selectLog: 'Select a log to view details', failedLoadContent: 'Failed to load log content', copyAbsolutePath: 'Copy absolute path', copyRawContent: 'Copy raw log content', tabOverview: 'Overview', tabHeaders: 'Headers', tabRequest: 'Request', tabResponse: 'Response', tabRaw: 'Raw', modelLabel: 'Model:', quotaResetsIn: 'Quota resets in ', method: 'Method', provider: 'Provider', version: 'Version', endpoint: 'Endpoint', url: 'URL', timestamp: 'Timestamp', na: 'N/A', noHeaders: 'No headers available', noRequestBody: 'No request body', noResponseBody: 'No response body', rateLimitedMsg: 'Rate Limited. Switch to a different account or wait for quota reset. Model {{model}} has exhausted quota.', rateLimitedMsgNoModel: 'Rate Limited. Switch to a different account or wait for quota reset.', authFailedMsg: 'Authentication failed. Re-authenticate via CLIProxy Settings or check API key.', notFoundMsg: 'Endpoint not found. This endpoint may not exist on this provider.', serverErrorMsg: 'Server error from upstream. Retry later or check provider status page.', timeoutMsg: 'Request timed out. Check network connection or increase timeout settings.', unknown: 'unknown', }, editAccountContext: { title: 'Edit History Sync', description: 'Configure how "{{name}}" shares history and continuity with other ccs auth accounts.', syncMode: 'Sync Mode', selectContextMode: 'Select context mode', isolatedOption: 'isolated (no sync)', sharedOption: 'shared (sync enabled)', sharedModeHint: 'Shared mode reuses workspace context for accounts in the same history sync group.', isolatedModeHint: 'Isolated mode keeps this account fully separate from other ccs auth accounts.', historySyncGroup: 'History Sync Group', groupPlaceholder: 'default', groupHint: 'Normalized to lowercase (spaces become dashes). Allowed: letters, numbers, _ , - (max {{max}} chars).', invalidGroup: 'Enter a valid group name that starts with a letter.', continuityDepth: 'Continuity Depth', selectContinuityDepth: 'Select continuity depth', standardOption: 'standard (projects only)', deeperOption: 'deeper continuity (advanced)', deeperHint: 'Advanced mode also syncs session-env, file-history, shell-snapshots, and todos.', standardHint: 'Standard mode syncs project workspace context only.', credentialsIsolated: 'Credentials and .anthropic remain isolated per account in all modes.', cancel: 'Cancel', save: 'Save', saving: 'Saving...', }, historySyncLearningMap: { title: 'How History Sync Works', description: 'Isolated -> Shared -> Deeper. Use Sync per row for all changes.', learningMap: 'Learning Map', isolated: 'Isolated', shared: 'Shared', deeper: 'Deeper', cliproxyManaged_one: '{{count}} CLIProxy Claude pool account is managed in Action Center / CLIProxy page.', cliproxyManaged_other: '{{count}} CLIProxy Claude pool accounts are managed in Action Center / CLIProxy page.', showDetails: 'Show details: groups, switching, and legacy policy', modeSwitch: 'Mode Switch', modeSwitchDesc: 'Sync dialog lets users move between isolated/shared and choose deeper continuity.', historySyncGroup: 'History Sync Group', historySyncGroupDesc: 'Same group means shared project context lane. Default fallback is default.', }, accountsTable: { name: 'Name', type: 'Type', defaultBadge: 'default', created: 'Created', lastUsed: 'Last Used', historySync: 'History Sync', actions: 'Actions', syncTitle: 'Edit sync mode, group, and continuity depth', confirmLegacyTitle: "Confirm this legacy account's current mode as explicit", sync: 'Sync', confirm: 'Confirm', active: 'Active', setDefault: 'Set Default', deleteAccount: 'Delete account', cannotDeleteDefault: 'Cannot delete default account', noAccounts: 'No CCS auth accounts found. Use ccs auth create to add accounts.', resetToDefault: 'Reset to CCS Default', deleteDialogTitle: 'Delete Account', deleteDialogDesc: 'Are you sure you want to delete the account "{{name}}"? This will remove the profile and all its session data. This action cannot be undone.', cancel: 'Cancel', delete: 'Delete', sharedGroupStandard: 'shared ({{group}}, standard)', sharedGroupDeeper: 'shared ({{group}}, deeper)', sharedGroupLegacy: 'shared ({{group}}, standard legacy)', isolatedLegacy: 'isolated (legacy default)', isolated: 'isolated', }, addAccountDialog: { title: 'Add {{displayName}} Account', descKiro: 'Choose a Kiro auth method, then authenticate via browser or import from Kiro IDE.', descDeviceCode: 'Click Authenticate. A verification code will appear for you to enter on the provider website.', descOauth: 'Click Authenticate to get an OAuth URL. Open it in any browser to sign in.', powerUserEnabled: 'Power user mode enabled', powerUserSkipped: 'AGY responsibility checklist is skipped from Settings > Proxy. You accept full responsibility for OAuth/account risk.', authMethod: 'Auth Method', selectKiroAuthMethod: 'Select Kiro auth method', nicknameRequired: 'Nickname (required)', nicknameOptional: 'Nickname (optional)', nicknamePlaceholder: 'e.g., work, personal', nicknameRequiredHint: 'Required for this provider. Use a unique friendly name (e.g., work, personal).', nicknameOptionalHint: 'A friendly name to identify this account. Auto-generated from email if left empty.', waitingForAuth: 'Waiting for authentication...', deviceCodeHint: 'A verification code dialog will appear shortly. Enter the code on the provider website.', browserHint: 'Complete the authentication in your browser. This dialog closes automatically.', openUrlLabel: 'Open this URL in any browser to sign in:', copied: 'Copied', copy: 'Copy', open: 'Open', popupBlocked: 'Popup blocked. Copy the URL above and open it manually in your browser.', redirectPasteLabel: "Redirect didn't work? Paste the callback URL:", callbackPlaceholder: 'Paste the redirect URL here...', submitCallback: 'Submit Callback', submitting: 'Submitting...', preparingUrl: 'Preparing sign-in URL...', cancel: 'Cancel', importingToken: 'Importing token from Kiro IDE...', authenticate: 'Authenticate', importFromIde: 'Import from IDE', importing: 'Importing...', }, flowViz: { backToProviders: 'Back to providers', showDetails: 'Show Details', hideDetails: 'Hide Details', resetLayout: 'Reset layout', provider: 'Provider', totalRequests: 'Total Requests', accounts: 'Accounts', connectionTimeline: 'Connection Timeline', noRecentConnections: 'No recent connections', }, quickStats: { totalRequests: 'Total Requests', successRate: 'Success Rate', totalTokens: 'Total Tokens', activeModels: 'Active Models', }, authMonitor: { accounts: 'Accounts', accountsCount: '{{count}} accounts', success: 'Success', failed: 'Failed', successRate: 'Success Rate', }, accountCard: { resumeAccount: 'Resume account', pauseAccount: 'Pause account', quotaLoading: 'Quota...', quota: 'Quota', quotaUnavailable: 'Quota limits unavailable', reauthNeeded: 'Reauth needed', removeAndReadd: 'Remove and re-add account', autoRefreshFailed: 'Auto-refresh failed', }, antigravityChecklist: { title: 'Antigravity OAuth Responsibility', subtitle: 'Complete all 4 steps before you can authenticate.', mandatory: 'Mandatory', completion: 'Completion', stepsCount: '{{current}}/4 steps', }, accountSafetyWarning: { title: 'OAuth Account Safety Warning', subtitle: 'Issue #509 · Gemini + AGY OAuth risk', firstLine: 'Issue #509 documents suspension/ban reports tied to ccs agy and shared-account usage between ccs gemini and ccs agy.', secondLine: 'Continue only if you accept full responsibility for OAuth and account-access risk.', issueLabel: 'Read issue #509', proxySettingsLabel: 'Gemini + AGY controls: Settings > Proxy', }, cliproxyDialog: { name: 'Name', provider: 'Provider', account: 'Account', accountOptional: 'Account (optional)', model: 'Model', modelOptional: 'Model (optional)', defaultTarget: 'Default Target', defaultTier: 'Default Tier', tierConfig: 'Tier Configuration', selectProvider: 'Select provider...', useDefaultAccount: 'Use default account', defaultSuffix: '(default)', opus: 'Opus', sonnet: 'Sonnet', haiku: 'Haiku', claudeCode: 'Claude Code', factoryDroid: 'Factory Droid', cancel: 'Cancel', create: 'Create', creating: 'Creating...', saveChanges: 'Save Changes', saving: 'Saving...', placeholderName: 'my-gemini', placeholderModel: 'gemini-2.5-pro', placeholderComposite: 'my-composite', placeholderModelId: 'model-id', placeholderAccountId: 'account-id', editCompositeTitle: 'Edit Composite Variant: {{name}}', editSingleTitle: 'Edit Single Variant: {{name}}', }, profileEditor: { profileInfo: 'Profile Information', profileName: 'Profile Name', filePath: 'File Path', lastModified: 'Last Modified', defaultTarget: 'Default Target', quickUsage: 'Quick Usage', runWithProfile: 'Run with profile', runOnDroid: 'Run on Droid', droidAliasExplicit: 'Droid alias (explicit)', overrideToClaude: 'Override to Claude', overrideToClaudeExplicit: 'Override to Claude (explicit)', setAsDefault: 'Set as default', provider: 'Provider', custom: 'Custom', }, settings: { sectionLoadFailed: 'Failed to load section', unknownError: 'Unknown error occurred', reloadPage: 'Reload page', refresh: 'Refresh', copy: 'Copy', copied: 'Copied', saved: 'Saved', loading: 'Loading...', configFileNotFound: 'Config file not found', }, settingsTabs: { web: 'Web', env: 'Env', think: 'Think', proxy: 'Proxy', auth: 'Auth', backup: 'Backup', }, settingsAuth: { failedFetchTokens: 'Failed to fetch auth tokens', failedSaveTokens: 'Failed to save tokens', tokensUpdated: 'Tokens updated. Restart CLIProxy to apply.', failedRegenerate: 'Failed to regenerate secret', secretRegenerated: 'New management secret generated. Restart CLIProxy to apply.', failedReset: 'Failed to reset tokens', tokensReset: 'Tokens reset to defaults. Restart CLIProxy to apply.', description: 'Configure CLIProxy authentication tokens. Changes require CLIProxy restart.', apiKey: 'API Key', custom: 'Custom', apiKeyDesc: 'Used by Claude Code to authenticate with CLIProxy', apiKeyPlaceholder: 'API key', managementSecret: 'Management Secret', managementSecretDesc: 'Used by CCS dashboard to access CLIProxy management APIs', managementSecretPlaceholder: 'Management secret', generateSecret: 'Generate new secure secret', resetDefaults: 'Reset to Defaults', resetDesc: 'Resets both API key and management secret to their default values.', saving: 'Saving...', save: 'Save', }, settingsGlobalEnv: { description: 'Environment variables injected into all non-Claude subscription profiles (gemini, codex, agy, ghcp, etc.)', enabled: 'Global Env enabled', disabled: 'Global Env disabled', enabledDesc: 'Env vars will be injected into third-party profiles', disabledDesc: 'Env vars will not be injected', envVars: 'Environment Variables', noneConfigured: 'No environment variables configured', addNew: 'Add New Variable', keyName: 'KEY_NAME', value: 'value', add: 'Add', quickAdd: 'Quick Add Common Variables', allConfigured: 'All common variables are configured', }, settingsBackups: { failedFetch: 'Failed to fetch backups', failedRestore: 'Failed to restore backup', restoreSuccess: 'Backup restored successfully', title: 'Settings Backups', description: 'Restore previous versions of your settings.json file. Backups are created automatically when settings are modified.', none: 'No backups available', noneHint: 'Backups will appear here when you modify settings', latest: 'Latest', restoring: 'Restoring...', restore: 'Restore', restoreConfirmTitle: 'Restore Backup?', restoreConfirmPrefix: 'This will replace your current settings with backup from', restoreConfirmSuffix: 'This action cannot be undone.', cancel: 'Cancel', }, settingsWebsearch: { description: 'CLI-based web search for third-party profiles (gemini, codex, agy, etc.)', enabled: 'WebSearch enabled', disabled: 'WebSearch disabled', checking: 'Checking status...', providers: 'Providers', noneConfigured: 'No providers configured', noneConfiguredHint: 'Install CLI tools to enable web search providers', checkProviders: 'Check for providers', installed: 'installed', notInstalled: 'not installed', model: 'Model:', howInstall: 'How to install {{name}} CLI', installGlobally: 'Install globally', requiresKey: '(requires xAI API key)', freeTier: '(FREE tier available)', viewDocs: 'View documentation', }, settingsProxy: { failedLoadAgyMode: 'Failed to load AGY power user mode', failedUpdateAgyMode: 'Failed to update AGY power user mode', failedVerifyAgyMode: 'Failed to verify AGY power user mode persistence', notPersistedAgyMode: 'AGY power user mode was not persisted. Config may have been modified by another process.', agyModeEnabled: 'AGY power user mode enabled.', agyModeDisabled: 'AGY power user mode disabled.', typePhraseToContinue: 'Type "{{value}}" to continue.', description: 'Configure local or remote {{backend}} connection for proxy-based profiles', backendPlus: 'CLIProxy Plus', backend: 'CLIProxy', instanceStatus: 'Instance Status', connectionMode: 'Connection Mode', local: 'Local', remote: 'Remote', localDesc: 'Run {{backend}} binary on this machine', remoteDesc: 'Connect to a remote {{backend}} server', backendBinary: 'Backend Binary', stopProxyToSwitch: 'Stop the running proxy in Instance Status to switch backend.', default: 'Default', plusDesc: 'Full provider support including Kiro and GitHub Copilot', originalDesc: 'Original binary (Gemini, Codex, Antigravity only)', variantsIncompatible: 'Existing Kiro/Copilot variants will not work with CLIProxyAPI. Switch to CLIProxyAPIPlus or remove those variants.', safety: 'Safety', agyModeTitle: 'Antigravity Power User Mode', agyModeDesc: 'Skip AGY responsibility checklist in Add Account and `ccs agy` flows.', agyWarning: 'Use only if you fully understand the OAuth suspension/ban risk pattern (#509). CCS cannot assume responsibility for account loss.', finalConfirm: 'Final confirmation required', finalConfirmDesc: 'Enabling this will skip AGY safety checkpoints in both dashboard and CLI. Review issue #509 and type the exact phrase to proceed.', step1: 'Step 1', readIssue: 'Read issue #509', step2: 'Step 2', typePrefix: 'Type', typeSuffix: 'to enable.', typePhraseAria: 'Type I ACCEPT RISK to enable Antigravity power user mode', exactPhrase: 'Exact phrase required.', enableAgyMode: 'Enable Power User Mode', toggleAgyMode: 'Toggle AGY power user mode', fallbackSettings: 'Fallback Settings', enableFallback: 'Enable fallback to local', enableFallbackDesc: 'Use local proxy if remote is unreachable', autoStartLocal: 'Auto-start local proxy', autoStartLocalDesc: 'Automatically start local proxy on fallback', advanced: 'Advanced', debugMode: 'Debug Mode', debugModeDesc: 'Enable developer diagnostics in browser console', debugModeEnabled: 'Debug mode enabled. Check browser console for detailed logs.', localProxy: 'Local Proxy', port: 'Port', autoStart: 'Auto-start', localAutoStartDesc: 'Start local proxy automatically when needed', remoteConfigTitle: 'Remote Server Configuration', host: 'Host', hostPlaceholder: '192.168.1.100 or proxy.example.com', defaultPort: 'default: {{value}}', portPlaceholder: 'Leave empty for {{value}}', protocol: 'Protocol', http: 'HTTP', https: 'HTTPS', apiKeyOptional: 'API Key (optional)', apiKeyPlaceholder: 'For /v1/* API endpoints', apiKeyDesc: 'Used for API requests to /v1/chat/completions', managementKeyOptional: 'Management Key (optional)', managementKeyPlaceholder: 'For /v0/management/* endpoints', managementKeyDesc: 'Used for dashboard management APIs. Falls back to API Key if not set.', testing: 'Testing...', testConnection: 'Test Connection', connectedLatency: 'Connected ({{value}}ms)', connectionFailed: 'Connection failed', invalidPortOrEmpty: 'Port must be an integer between 1 and 65535, or empty for default', invalidLocalPort: 'Local port must be an integer between 1 and 65535', backendPlusApi: 'CLIProxyAPIPlus', backendApi: 'CLIProxyAPI', }, settingsThinking: { description: 'Configure extended thinking/reasoning for supported models.', supportedProviders: 'Supported Providers', modeTitle: 'Thinking Mode', modeAutoDesc: 'Automatically set thinking based on model tier', modeOffDesc: 'Disable extended thinking', modeManualDesc: 'Set a persistent override level or use CLI flags per run', tierDefaults: 'Tier Defaults', tierDefaultsDesc: 'Default thinking level for each model tier when in auto mode.', persistentOverride: 'Persistent Override', persistentOverrideDesc: 'Applied to all sessions. CLI flags still take priority.', enterCustomBudget: 'Enter custom budget', apply: 'Apply', providerOverrides: 'Provider Overrides ({{count}})', providerOverridesDesc: 'Override tier defaults for specific providers. Add custom provider keys as needed.', addProviderPlaceholder: 'Add provider key (e.g. qwen)', showWarnings: 'Show Warnings', showWarningsDesc: 'Display warnings when thinking values are clamped or adjusted', cliEnvOverride: 'CLI & Env Override', supportLine1Prefix: 'Thinking budget:', supportLine1Suffix: '(token-based)', supportLine2Prefix: 'Reasoning effort:', supportLine2SuffixPrefix: '(suffix or ', supportLine2SuffixPostfix: ': medium/high/xhigh)', supportLine3Prefix: 'Codex suffixes pin effort (for example ', supportLine3Suffix: '); unsuffixed models use Thinking mode.', }, analytics: { title: 'Analytics', subtitle: 'Track usage and insights', month: 'Month', allTime: 'All Time', updated: 'Updated {{value}}', }, analyticsSummary: { totalTokens: 'Total Tokens', totalTokensSubtitle: '{{input}} in / {{output}} out', totalCost: 'Total Cost', totalCostSubtitle: '${{value}}/day avg', cacheTokens: 'Cache Tokens', cacheTokensSubtitle: '${{cost}} ({{percent}}% of cost)', inputCost: 'Input Cost', outputCost: 'Output Cost', tokensSubtitle: '{{value}} tokens', }, apiProfiles: { title: 'API Profiles', new: 'New', searchPlaceholder: 'Search profiles...', loadingProfiles: 'Loading profiles...', failedLoadTitle: 'Failed to load profiles', failedLoadDesc: 'Unable to fetch API profiles. Please try again.', retry: 'Retry', noProfilesYet: 'No API profiles yet', noProfilesDesc: 'Create your first profile to connect to custom API endpoints', createProfile: 'Create Profile', noProfileMatch: 'No profiles match "{{query}}"', profileCount: '{{count}} profile', profileCount_other: '{{count}} profiles', configuredCount: '{{count}} configured', deleteProfileTitle: 'Delete Profile', deleteProfileDesc: 'Are you sure you want to delete "{{name}}"? This will remove the settings file and cannot be undone.', delete: 'Delete', unsavedChangesTitle: 'Unsaved Changes', unsavedChangesDesc: 'You have unsaved changes in "{{current}}". Discard and switch to "{{next}}"?', discardSwitch: 'Discard and Switch', }, accountsPage: { title: 'Accounts', managePrefix: 'Manage', manageSuffix: 'accounts and pool onboarding from one panel.', mobileManageSuffix: 'continuity per account.', primaryActions: 'Primary Actions', createAccount: 'Create Account', authClaudeInPool: 'Authenticate Claude in Pool', openClaudePoolSettings: 'Open Claude Pool Settings', openCliProxyClaudePool: 'Open CLIProxy Claude Pool', migrationFollowup: 'Migration Follow-up', legacyContextPending: '{{count}} account still needs first-time mode confirmation.', legacyContextPending_other: '{{count}} accounts still need first-time mode confirmation.', legacyContinuityPending: '{{count}} shared account remains on standard legacy continuity depth.', legacyContinuityPending_other: '{{count}} shared accounts remain on standard legacy continuity depth.', confirmingLegacy: 'Confirming Legacy Policies...', confirmLegacy: 'Confirm Legacy Policies ({{count}})', noLegacyFollowup: 'No legacy follow-up pending.', continuityGuide: 'Continuity Guide', expandWhenNeeded: 'Expand only when needed.', sharedStandard: 'Shared Standard', sharedStandardDesc: 'Project workspace sync only. Best default for most teams.', sharedDeeper: 'Shared Deeper', sharedDeeperPrefix: 'Adds', isolated: 'Isolated', isolatedDesc: 'No link. Best for strict separation.', quickCommands: 'Quick Commands', quickCommandsDesc: 'Copy and run in terminal.', workspaceBadge: 'ccs auth Workspace', historySyncBadge: 'History Sync Controls', authAccounts: 'Auth Accounts', tableScopePrefix: 'This table is intentionally scoped to', tableScopeMiddle: 'accounts. Use', tableScopeSuffix: 'for mode/group/depth changes.', accountMatrix: 'Account Matrix', sharedTotalDesc: 'Shared total: {{count}}. Actions include Sync settings and legacy confirmation.', loadingAccounts: 'Loading accounts...', }, health: { justNow: 'just now', secondsAgo: '{{count}}s ago', minutesAgo: '{{count}}m ago', hoursAgo: '{{count}}h ago', systemHealth: 'System Health', build: 'build {{version}}', lastScan: 'Last scan:', autoRefresh: 'Auto-refresh:', refresh: 'Refresh', checks: 'Checks', version: 'Version', platform: 'Platform', liveMonitoring: 'Live monitoring active', copied: 'Copied to clipboard', refreshing: 'Refreshing health checks...', fix: 'Fix', applyFix: 'Apply Fix', healthLabel: 'health', }, updates: { actionRequired: 'Action Required', done: 'Done', all: 'All', inboxTitle: 'Updates Inbox', inboxSubtitle: 'Focus on actions, then mark updates done or dismissed.', needsAction: 'Needs Action', doneCount: 'Done', searchPlaceholder: 'Search actions or commands', noNotices: 'No notices match this view.', noUpdates: 'No updates available.', published: 'Published {{date}}', markDone: 'Mark done', dismiss: 'Dismiss', reopen: 'Reopen', doNext: 'Do Next', impactedIntegrations: 'Impacted Integrations', impactedDesc: 'Related areas based on update scope and routing.', whyMatters: 'Why It Matters', whyMattersDesc: 'Short context only, no wall-of-text release notes.', open: 'Open', progressNeedsAction: 'Needs Action', progressInReview: 'In Review', progressDone: 'Done', progressDismissed: 'Dismissed', statusNew: 'New', statusStable: 'Stable', statusPlanned: 'Planned', dashboard: 'Dashboard', cliUsage: 'CLI Usage', }, cliproxyPage: { connected: 'Connected', notConnected: 'Not connected', variant: 'variant', parentNotConnected: 'Parent not connected', viaProvider: 'via {{provider}}', emptyTitle: 'CCS Profile Manager', emptyDesc: 'Manage OAuth authentication, account preferences, and model selection for CLIProxy providers. Configure how CCS routes requests to different AI backends.', emptyControlPanelPrefix: 'For live usage stats and real-time monitoring, visit the', controlPanel: 'Control Panel', quickSetup: 'Quick Setup', accountManagement: 'CCS-level account management', providers: 'Providers', variants: 'Variants', providerCount: '{{count}} provider', providerCount_other: '{{count}} providers', connectedCount: '{{count}} connected', variantDisplay: '{{name}} ({{provider}} variant)', }, copilotPage: { title: 'Copilot', subtitle: 'GitHub Copilot proxy', setup: 'Setup', auth: 'Auth', daemon: 'Daemon', unofficialTitle: 'Unofficial API - Use at Your Own Risk', unofficialItem1: 'Reverse-engineered API - may break anytime', unofficialItem2: 'Excessive use may trigger account restrictions', unofficialItem3: 'No warranty, no responsibility from CCS', yes: 'Yes', no: 'No', installed: 'Installed', missing: 'Missing', integration: 'Integration', enabled: 'Enabled', disabled: 'Disabled', github: 'GitHub', connected: 'Connected', notConnected: 'Not Connected', authenticate: 'Authenticate', authenticating: 'Authenticating...', status: 'Status', running: 'Running', stopped: 'Stopped', port: 'Port', stopping: 'Stopping...', stop: 'Stop', starting: 'Starting...', start: 'Start', installing: 'Installing...', installCopilotApi: 'Install copilot-api', proxy: 'Proxy', active: 'Active', inactive: 'Inactive', }, cursorPage: { title: 'Cursor', beta: 'Beta', subtitle: 'Dedicated Cursor integration controls', unofficialTitle: 'Unofficial API - Use at Your Own Risk', unofficialItem1: 'Reverse-engineered integration may break anytime', unofficialItem2: 'Abuse or excessive usage may risk account restrictions', unofficialItem3: 'No warranty, no responsibility from CCS', integration: 'Integration', authentication: 'Authentication', daemon: 'Daemon', enabled: 'Enabled', disabled: 'Disabled', expired: 'Expired', notConnected: 'Not connected', running: 'Running', stopped: 'Stopped', actions: 'Actions', disableIntegration: 'Disable Integration', enableIntegration: 'Enable Integration', autoDetectAuth: 'Auto-detect Auth', manualAuthImport: 'Manual Auth Import', stopDaemon: 'Stop Daemon', startDaemon: 'Start Daemon', port: 'Port', configuration: 'Cursor Configuration', lastModified: 'Last modified:', neverSaved: 'Never saved', saving: 'Saving...', save: 'Save', modelConfig: 'Model Config', settings: 'Settings', info: 'Info', presets: 'Presets', presetsDesc: 'Apply pre-configured model mappings', modelMapping: 'Model Mapping', modelMappingDesc: 'Configure which models to use for each tier', defaultModel: 'Default Model', defaultModelDesc: 'Used when no specific tier is requested.', opusModel: 'Opus (Most capable)', opusModelDesc: 'Complex reasoning and highest quality responses.', sonnetModel: 'Sonnet (Balanced)', sonnetModelDesc: 'General coding and day-to-day chat workloads.', haikuModel: 'Haiku (Fast)', haikuModelDesc: 'Low-latency and lightweight request paths.', runtimeSettings: 'Runtime Settings', autoStartDaemon: 'Auto-start Daemon', autoStartDesc: 'Start Cursor daemon automatically when integration is used.', ghostMode: 'Ghost Mode', ghostModeDesc: 'Request x-ghost-mode to reduce telemetry.', provider: 'Provider', filePath: 'File Path', availableModels: 'Available Models', loadingModels: 'Loading models...', noModels: 'No model metadata available yet. Start daemon and refresh.', default: 'Default', rawConfiguration: 'Raw Configuration (JSON)', manualImportTitle: 'Manual Cursor Auth Import', manualImportDesc: 'Provide Cursor access token and machine ID if auto-detect is unavailable.', accessToken: 'Access Token', accessTokenPlaceholder: 'Paste Cursor access token', machineId: 'Machine ID', machineIdPlaceholder: '32-char hex (UUID without hyphens)', cancel: 'Cancel', import: 'Import', selectModel: 'Select model', useDefaultModel: 'Use Default Model', availableModelCount: 'Available Models ({{count}})', invalidPort: 'Port must be an integer between 1 and 65535', defaultModelRequired: 'Default model is required', savedConfig: 'Cursor config and model mapping saved', failedSaveConfig: 'Failed to save config', modelsLoadingWait: 'Models are still loading. Please wait before applying a preset.', noModelsAvailable: 'No models available yet. Start the daemon and refresh first.', appliedCodexPreset: 'Applied GPT-5.3 Codex preset', appliedClaudePreset: 'Applied Claude 4.6 preset', appliedGeminiPreset: 'Applied Gemini 3 preset', integrationEnabled: 'Cursor integration enabled', integrationDisabled: 'Cursor integration disabled', failedUpdateIntegration: 'Failed to update integration state', credentialsImported: 'Cursor credentials imported', autoDetectFailed: 'Auto-detect failed', manualRequired: 'Token and machine ID are required', manualImportFailed: 'Manual import failed', failedStartDaemon: 'Failed to start daemon', daemonStarted: 'Daemon started', daemonStartedWithPid: 'Daemon started (PID: {{pid}})', failedStopDaemon: 'Failed to stop daemon', daemonStopped: 'Daemon stopped', rawLoading: 'Raw settings are still loading. Please wait and try again.', invalidJson: 'Invalid JSON', rawSaved: 'Raw settings saved', rawChanged: 'Raw settings changed externally. Refresh and retry.', failedSaveRaw: 'Failed to save raw settings', savedAll: 'Cursor configuration saved', }, droidPage: { loadingDiagnostics: 'Loading Droid diagnostics...', failedDiagnostics: 'Failed to load Droid diagnostics.', overview: 'Overview', byok: 'BYOK', docs: 'Docs', runtimeInstall: 'Runtime and Installation', status: 'Status', detected: 'Detected', notFound: 'Not Found', detectionSource: 'Detection source', binaryPath: 'Binary path', installDirectory: 'Install directory', version: 'Version', overridePath: 'Override (CCS_DROID_PATH)', configFiles: 'Config Files', path: 'Path', resolved: 'Resolved', size: 'Size', lastModified: 'Last modified', parseWarning: 'Parse warning: {{value}}', readWarning: 'Read warning: {{value}}', warnings: 'Warnings', byokSummary: 'BYOK Summary', activeModelSelector: 'Active model selector', customModels: 'Custom models', ccsManaged: 'CCS-managed', userManaged: 'User-managed', malformedEntries: 'Malformed entries', providers: 'Providers', none: 'none', customModelsTitle: 'Custom Models', modelName: 'Name / Model', provider: 'Provider', baseUrl: 'Base URL', noCustomModels: 'No custom models', docsAlignedNotes: 'Docs-Aligned Notes', factoryDocs: 'Factory Docs', providerFactCheckDocs: 'Provider Fact-Check Docs', providerValues: 'Provider values: {{value}}', settingsHierarchy: 'Settings hierarchy: {{value}}', settingsTitle: 'Droid BYOK Settings', fixJsonBeforeQuickSettings: 'Fix JSON syntax before using quick settings controls.', fixJsonBeforeReasoning: 'Fix JSON syntax before updating BYOK reasoning settings.', unableUpdateReasoning: 'Unable to update selected BYOK model reasoning setting.', fixJsonBeforeBudget: 'Fix JSON syntax before updating thinking budget.', anthropicOnlyBudget: 'Thinking budget is only available for Anthropic BYOK models.', invalidJson: 'Invalid JSON: {{value}}', saved: 'Droid settings saved', changedExternally: 'Droid settings changed externally. Refresh and retry.', failedSave: 'Failed to save Droid settings', }, sharedPage: { commands: 'Commands', skills: 'Skills', agents: 'Agents', title: 'Shared Data', subtitle: 'Commands, skills, and agents shared across Claude instances', totalShared: 'Total Shared', visible: 'Visible', markdownDetail: 'Markdown detail view', filterPrefix: 'Filter:', configurationRequired: 'Configuration Required', countsUnavailable: 'Counts unavailable', retryCounts: 'Retry counts', filterPlaceholder: 'Filter {{tab}} by name, description, or path', showing: 'Showing {{visible}} of {{total}} {{tab}}', showingQuery: ' for "{{query}}"', refreshing: ' (refreshing...)', loadingShared: 'Loading shared {{tab}}...', failedLoadShared: 'Failed to load shared {{tab}}', retry: 'Retry', noSharedFound: 'No shared {{tab}} found. Run `ccs sync` or add items in your shared directory.', noMatch: 'No {{tab}} match "{{query}}".', selectOne: 'Select a {{tab}} to view full content.', pathLabel: 'Path', resolvedSource: 'Resolved Source', loadingMarkdown: 'Loading markdown content...', failedLoadContent: 'Failed to load content', retryContent: 'Retry content', noMarkdown: 'No markdown content available.', }, }, }, 'zh-CN': { translation: { locale: { en: 'English', 'zh-CN': '简体中文', }, layout: { languageSwitcher: '语言', }, nav: { general: '通用', home: '首页', analytics: '分析', identityAccess: '身份与访问', apiProfiles: 'API 配置', cliproxyPlus: 'CLIProxy Plus', cliproxyOverview: '概览', controlPanel: '控制面板', githubCopilot: 'GitHub Copilot', cursorIde: 'Cursor IDE', accounts: '账号', allAccounts: '全部账号', sharedData: '共享数据', compatibleClis: '兼容 CLI', factoryDroid: 'Factory Droid', system: '系统', health: '健康', settings: '设置', openrouterTooltip: '通过 OpenRouter 提供 349+ 模型', }, home: { profiles: '配置', cliproxy: 'CLIProxy', accounts: '账号', health: '健康', configurationRequired: '需要配置', }, auth: { dashboardTitle: 'CCS 控制台', loginDescription: '请输入凭据以访问控制台', username: '用户名', password: '密码', usernamePlaceholder: '请输入用户名', passwordPlaceholder: '请输入密码', signIn: '登录', signingIn: '登录中...', loginFailed: '登录失败', }, commonToast: { apiKeyRequired: 'API key 为必填项', accountAddedPresetFailed: '账号已添加,但应用默认预设失败', settingsCopied: '设置已复制到剪贴板', enterPresetName: '请先输入预设名称再保存', codeCopied: '验证码已复制到剪贴板', copyCodeFailed: '复制验证码失败', appliedModelAllTiers: '已将模型应用到全部层级', settingsSaved: '设置已保存', defaultTargetUpdated: '默认目标已更新', failedUpdateDefaultTarget: '更新默认目标到 {{target}} 失败{{suffix}}', }, profileDialog: { editTitle: '编辑配置', createTitle: '创建 API 配置', name: '名称', namePlaceholder: 'my-api', baseUrl: 'Base URL', baseUrlPlaceholder: 'https://api.example.com', apiKey: 'API Key', defaultModel: '默认模型(ANTHROPIC_MODEL)', defaultModelHint: '留空则使用:{{model}}', modelMappingTitle: '模型映射(Opus/Sonnet/Haiku)', modelMappingDesc: '为不同档位配置不同模型 ID,适合按模型类型路由到不同后端的 API 代理。', opusModel: 'Opus 模型(ANTHROPIC_DEFAULT_OPUS_MODEL)', sonnetModel: 'Sonnet 模型(ANTHROPIC_DEFAULT_SONNET_MODEL)', haikuModel: 'Haiku 模型(ANTHROPIC_DEFAULT_HAIKU_MODEL)', cancel: '取消', saving: '保存中...', update: '更新', create: '创建', }, modelTierMapping: { title: '模型档位映射', advanced: '高级', description: '为 Claude Code 的 opus/sonnet/haiku 档位配置不同模型。', autoSuggest: '基于 {{provider}} 自动建议', opusPlaceholder: '例如:anthropic/claude-opus-4', sonnetPlaceholder: '例如:anthropic/claude-sonnet-4', haikuPlaceholder: '例如:anthropic/claude-3.5-haiku', footer: '这些字段对应 ANTHROPIC_DEFAULT_OPUS_MODEL、ANTHROPIC_DEFAULT_SONNET_MODEL、ANTHROPIC_DEFAULT_HAIKU_MODEL。', }, envEditor: { sensitive: '敏感', none: '尚未配置环境变量。', noneHint: '可在下方输入添加,或直接编辑 JSON。', addVariable: '添加环境变量', keyPlaceholder: 'VARIABLE_NAME', valuePlaceholder: 'value', }, setupVariant: { using: '当前使用:', variantNameRequired: '变体名称 *', variantNamePlaceholder: '例如:my-gemini、g3、flash', invokeHintPrefix: '可通过该名称调用:', model: '模型', modelPlaceholder: '例如:gemini-2.5-pro、claude-opus-4-5', choosePresetInstead: '改为从预设中选择', selectModel: '选择模型', customModelName: '自定义模型名称...', enterAnyModel: '可输入 CLIProxy 支持的任意模型名', defaultModel: '默认:{{model}}', providerDefault: '提供商默认值', back: '返回', skip: '跳过', creating: '创建中...', createVariant: '创建变体', skipHint: '如果你只想添加账号而不创建变体,可以直接跳过', }, customPresetDialog: { title: '自定义预设', presetNameOptional: '预设名称(可选)', presetNamePlaceholder: '例如:我的自定义配置', codexTipPrefix: 'Codex 提示:后缀', codexTipSuffix: '会固定 effort。无后缀模型使用 Thinking 设置。', defaultModel: '默认模型', defaultModelDesc: '未指定档位时使用', opusModel: 'Opus(最强)', opusModelDesc: '用于复杂推理任务', sonnetModel: 'Sonnet(均衡)', sonnetModelDesc: '兼顾速度与能力', haikuModel: 'Haiku(快速)', haikuModelDesc: '适合简单任务的快速响应', cancel: '取消', savePreset: '保存预设', applyPreset: '应用预设', }, componentModelSelector: { selectModel: '选择模型', availableModelsCount: '可用模型({{count}})', preview: '预览', }, copilotSettings: { enableCopilot: '启用 Copilot', enableCopilotDesc: '允许使用 GitHub Copilot 订阅', basicSettings: '基础设置', accountType: '账户类型', accountTypeIndividual: '个人', accountTypeBusiness: '企业', accountTypeEnterprise: '组织', rateLimiting: '速率限制', rateLimitSeconds: '速率限制(秒)', noLimit: '不限制', waitOnRateLimit: '触发限速时等待', waitOnRateLimitDesc: '达到限制时等待而不是报错', daemonSettings: '守护进程设置', autoStartDaemon: '自动启动守护进程', autoStartDaemonDesc: '使用配置时自动启动 copilot-api', }, providerModelSelector: { selectModel: '选择模型', noModelsForProvider: '该提供商暂无可用模型', broken: '故障', deprecated: '已弃用', paid: '付费', freeTier: '免费档', paidTier: '付费档', modelKnownIssues: '该模型存在已知问题', viewIssueDetails: '查看问题详情', modelDeprecated: '该模型已弃用', recommended: '推荐', allModelsCount: '全部模型({{count}})', noModelsAvailable: '暂无可用模型', }, createAuthProfileDialog: { title: '创建新账号', description: 'Auth 配置需要先完成 Claude CLI 登录。请在终端执行下方命令。稍后你仍可在 Accounts 表中编辑同步模式、分组与连续性深度。', profileName: '配置名称', profileNamePlaceholder: '例如:work、personal、client', invalidProfileName: '名称必须以字母开头,且只能包含字母、数字、短横线或下划线。', enableSharedHistory: '与其他 ccs auth 账号启用共享历史同步', historySyncGroupOptional: '历史同步分组(可选)', historySyncGroupPlaceholder: 'default、sprint-a、client-x', historySyncGroupHint: '留空将使用默认共享分组。空格会自动规范为短横线。', deeperContinuity: '高级:更深连续性模式', deeperContinuityHint: '会同步 session-env、file-history、shell-snapshots 与 todos。凭据仍保持隔离。', invalidContextGroup: '分组必须以字母开头,且只能包含字母、数字、短横线或下划线(最多 {{max}} 个字符)。', command: '命令', commandFallback: 'ccs auth create ', afterRunPrefix: '执行命令后:', afterRunStep1: '在浏览器中完成 Claude 登录', afterRunStep2: '返回此处并刷新,即可看到新账号', poolingHint: '如果更倾向于共享池化 Claude OAuth 路由,可在 Accounts 页面操作按钮中使用 CLIProxy Claude pool。', close: '关闭', copied: '已复制!', copyCommand: '复制命令', }, cliproxyModelCategory: { google: 'Google(Gemini)', openai: 'OpenAI(GPT)', anthropic: 'Anthropic(Claude)', antigravity: 'Antigravity', other: '其他', }, cliproxyOverviewComponents: { availableModels: '可用模型', noModelsAvailable: '暂无可用模型', startSessionHint: '启动 CLIProxy 会话后即可拉取可用模型', totalCount: '共 {{count}} 个', availableThroughGroupedByProvider: '通过 {{backendLabel}} 提供的模型,按提供商分组', moreCount: '另外 {{count}} 个', }, categorizedModelSelector: { selectModel: '选择模型', noModelsAvailable: '暂无可用模型', modelPlaceholder: '模型...', }, openrouterQuickStart: { recommended: '推荐', title: '从 OpenRouter 开始', description: '通过一个 API 即可访问来自 OpenAI、Anthropic、Google、Meta 等的 {{modelCountLabel}} 个模型。', featureOneApi: '一个 API,接入全部提供商', featureTierMapping: '模型档位映射', createOpenRouterProfile: '创建 OpenRouter 配置', getApiKeyAt: '在此获取 API Key:', or: '或', createCustomProfile: '创建自定义 API 配置', }, credentialHealth: { title: '凭据健康状态', ready: '就绪', noCredentialsConfigured: '尚未配置凭据。请使用上方登录按钮完成认证。', neverUsed: '从未使用', justNow: '刚刚', unknown: '未知', daysAgo: '{{count}} 天前', hoursAgo: '{{count}} 小时前', minutesAgo: '{{count}} 分钟前', }, proxyStatusWidget: { justNow: '刚刚', minutesAgo: '{{count}} 分钟前', hoursAgo: '{{count}} 小时前', syncReady: '同步就绪', noConfig: '未配置', remoteProxy: '远程代理', active: '已连接', trafficAutoRouted: '流量已自动转发到远程服务器', tooltipSync: '同步配置到 CLIProxy', tooltipRestart: '重启', tooltipStop: '停止', tooltipClose: '关闭', tooltipVersionSettings: '版本设置', versionManagement: '版本管理', selectVersionPlaceholder: '选择要安装的版本...', stable: '(稳定版)', install: '安装', versionsAboveUnstable: '高于 {{version}} 的版本存在已知问题', lastChecked: '上次检查 {{time}}', notRunning: '未运行', start: '启动', port: '端口 {{port}}', sessionCount: '{{count}} 个会话', sessionCount_other: '{{count}} 个会话', installUnstableTitle: '安装非稳定版本?', installUnstableDesc: '即将安装 v{{version}},该版本高于当前最大稳定版 v{{maxStable}}。', installUnstableWarning: '该版本存在已知稳定性问题,可能导致异常行为。', installUnstableConfirm: '确定要继续吗?', cancel: '取消', installAnyway: '仍要安装', clickToDowngrade: '点击降级', clickToUpdate: '点击更新', }, syncStatusCard: { profileSync: '配置同步', ready: '就绪', noConfig: '未配置', syncsProfilesDesc: '将 API 配置同步到本地 CLIProxy 配置', runDoctorHint: '运行 ccs doctor --fix 生成配置。', details: '详情', syncNow: '立即同步', }, syncDialog: { title: '同步配置到本地 CLIProxy', description: '将 CCS API 配置同步到本地 CLIProxy 的 config.yaml。', noProfiles: '没有可同步的配置。', createProfilesFirst: '请先在「配置」页创建 API 配置。', modelLabel: '模型:', ready: '就绪', profilesToSync_one: '{{count}} 个配置待同步', profilesToSync_other: '{{count}} 个配置待同步', cancel: '取消', syncing: '同步中...', synced: '已同步!', syncNow: '立即同步', }, errorLogs: { title: '错误日志', failedRequests_one: '{{count}} 个失败请求', failedRequests_other: '{{count}} 个失败请求', cliproxyDiagnostics: 'CLIProxy 诊断', showingCount: '显示 50 / {{total}} 条', selectLog: '选择一条日志查看详情', failedLoadContent: '加载日志内容失败', copyAbsolutePath: '复制绝对路径', copyRawContent: '复制原始日志', tabOverview: '概览', tabHeaders: '请求头', tabRequest: '请求体', tabResponse: '响应体', tabRaw: '原始', modelLabel: '模型:', quotaResetsIn: '配额重置于 ', method: '方法', provider: '提供商', version: '版本', endpoint: '端点', url: 'URL', timestamp: '时间戳', na: '无', noHeaders: '无请求头', noRequestBody: '无请求体内容', noResponseBody: '无响应体内容', rateLimitedMsg: '触发限速。请切换账号或等待配额重置。模型 {{model}} 配额已用尽。', rateLimitedMsgNoModel: '触发限速。请切换账号或等待配额重置。', authFailedMsg: '认证失败。请通过 CLIProxy 设置重新认证或检查 API Key。', notFoundMsg: '端点未找到,该提供商可能不存在此端点。', serverErrorMsg: '上游服务器错误。请稍后重试或查看提供商状态页。', timeoutMsg: '请求超时。请检查网络或增大超时设置。', unknown: '未知', }, editAccountContext: { title: '编辑历史同步', description: '配置「{{name}}」与其他 ccs auth 账号共享历史与连续性的方式。', syncMode: '同步模式', selectContextMode: '选择同步模式', isolatedOption: '隔离(不同步)', sharedOption: '共享(启用同步)', sharedModeHint: '共享模式会为同一历史同步分组内的账号复用工作区上下文。', isolatedModeHint: '隔离模式使该账号与其他 ccs auth 账号完全独立。', historySyncGroup: '历史同步分组', groupPlaceholder: 'default', groupHint: '会规范为小写(空格变为短横线)。允许:字母、数字、_、-(最多 {{max}} 字符)。', invalidGroup: '请输入以字母开头的有效分组名。', continuityDepth: '连续性深度', selectContinuityDepth: '选择连续性深度', standardOption: '标准(仅项目)', deeperOption: '更深连续性(高级)', deeperHint: '高级模式还会同步 session-env、file-history、shell-snapshots 和 todos。', standardHint: '标准模式仅同步项目工作区上下文。', credentialsIsolated: '凭据与 .anthropic 在所有模式下均按账号隔离。', cancel: '取消', save: '保存', saving: '保存中...', }, historySyncLearningMap: { title: '历史同步说明', description: '隔离 -> 共享 -> 更深。在每行使用「同步」进行所有更改。', learningMap: '说明', isolated: '隔离', shared: '共享', deeper: '更深', cliproxyManaged_one: '{{count}} 个 CLIProxy Claude 池账号在操作中心 / CLIProxy 页面管理。', cliproxyManaged_other: '{{count}} 个 CLIProxy Claude 池账号在操作中心 / CLIProxy 页面管理。', showDetails: '显示详情:分组、切换与旧策略', modeSwitch: '模式切换', modeSwitchDesc: '同步对话框可让用户在隔离/共享间切换并选择更深连续性。', historySyncGroup: '历史同步分组', historySyncGroupDesc: '同一分组即共享项目上下文。默认回退为 default。', }, accountsTable: { name: '名称', type: '类型', defaultBadge: '默认', created: '创建时间', lastUsed: '最后使用', historySync: '历史同步', actions: '操作', syncTitle: '编辑同步模式、分组与连续性深度', confirmLegacyTitle: '确认此旧账号的当前模式为显式', sync: '同步', confirm: '确认', active: '当前', setDefault: '设为默认', deleteAccount: '删除账号', cannotDeleteDefault: '不能删除默认账号', noAccounts: '未找到 CCS auth 账号。请使用 ccs auth create 添加。', resetToDefault: '恢复为 CCS 默认', deleteDialogTitle: '删除账号', deleteDialogDesc: '确定要删除账号「{{name}}」吗?将移除该配置及其所有会话数据,且无法撤销。', cancel: '取消', delete: '删除', sharedGroupStandard: '共享({{group}},标准)', sharedGroupDeeper: '共享({{group}},更深)', sharedGroupLegacy: '共享({{group}},标准旧策略)', isolatedLegacy: '隔离(旧默认)', isolated: '隔离', }, addAccountDialog: { title: '添加 {{displayName}} 账号', descKiro: '选择 Kiro 认证方式,然后通过浏览器或从 Kiro IDE 导入完成认证。', descDeviceCode: '点击认证后,验证码将显示,请在提供商网站输入。', descOauth: '点击认证获取 OAuth URL,在任意浏览器中打开即可登录。', powerUserEnabled: '已启用高级用户模式', powerUserSkipped: '已在设置 > 代理 中跳过 AGY 责任清单,您需自行承担 OAuth/账号风险。', authMethod: '认证方式', selectKiroAuthMethod: '选择 Kiro 认证方式', nicknameRequired: '昵称(必填)', nicknameOptional: '昵称(选填)', nicknamePlaceholder: '例如:工作、个人', nicknameRequiredHint: '该提供商必填。请使用唯一易记名称(如工作、个人)。', nicknameOptionalHint: '用于区分账号的友好名称。留空将根据邮箱自动生成。', waitingForAuth: '等待认证中...', deviceCodeHint: '验证码对话框即将出现,请在提供商网站输入验证码。', browserHint: '在浏览器中完成认证后,本对话框将自动关闭。', openUrlLabel: '在任意浏览器中打开此 URL 登录:', copied: '已复制', copy: '复制', open: '打开', popupBlocked: '弹窗被拦截。请复制上方 URL 在浏览器中手动打开。', redirectPasteLabel: '重定向未生效?请粘贴回调 URL:', callbackPlaceholder: '在此粘贴重定向 URL...', submitCallback: '提交回调', submitting: '提交中...', preparingUrl: '正在准备登录 URL...', cancel: '取消', importingToken: '正在从 Kiro IDE 导入令牌...', authenticate: '认证', importFromIde: '从 IDE 导入', importing: '导入中...', }, flowViz: { backToProviders: '返回提供商', showDetails: '显示详情', hideDetails: '隐藏详情', resetLayout: '重置布局', provider: '提供商', totalRequests: '总请求数', accounts: '账号', connectionTimeline: '连接时间线', noRecentConnections: '暂无最近连接', }, quickStats: { totalRequests: '总请求数', successRate: '成功率', totalTokens: '总 Token 数', activeModels: '活跃模型数', }, authMonitor: { accounts: '账号', accountsCount: '{{count}} 个账号', success: '成功', failed: '失败', successRate: '成功率', }, accountCard: { resumeAccount: '恢复账号', pauseAccount: '暂停账号', quotaLoading: '配额...', quota: '配额', quotaUnavailable: '配额限制不可用', reauthNeeded: '需要重新认证', removeAndReadd: '移除并重新添加账号', autoRefreshFailed: '自动刷新失败', }, antigravityChecklist: { title: 'Antigravity OAuth 责任须知', subtitle: '认证前请完成全部 4 步。', mandatory: '必读', completion: '完成度', stepsCount: '{{current}}/4 步', }, accountSafetyWarning: { title: 'OAuth 账号安全提示', subtitle: 'Issue #509 · Gemini + AGY OAuth 风险', firstLine: 'Issue #509 记录了与 ccs agy 及 ccs gemini 与 ccs agy 共享账号使用相关的封禁/停用报告。', secondLine: '仅在您愿意承担 OAuth 与账号访问风险的前提下继续。', issueLabel: '查看 issue #509', proxySettingsLabel: 'Gemini + AGY 控制:设置 > 代理', }, cliproxyDialog: { name: '名称', provider: '提供商', account: '账号', accountOptional: '账号(选填)', model: '模型', modelOptional: '模型(选填)', defaultTarget: '默认目标', defaultTier: '默认档位', tierConfig: '档位配置', selectProvider: '选择提供商...', useDefaultAccount: '使用默认账号', defaultSuffix: '(默认)', opus: 'Opus', sonnet: 'Sonnet', haiku: 'Haiku', claudeCode: 'Claude Code', factoryDroid: 'Factory Droid', cancel: '取消', create: '创建', creating: '创建中...', saveChanges: '保存更改', saving: '保存中...', placeholderName: 'my-gemini', placeholderModel: 'gemini-2.5-pro', placeholderComposite: 'my-composite', placeholderModelId: 'model-id', placeholderAccountId: 'account-id', editCompositeTitle: '编辑复合变体:{{name}}', editSingleTitle: '编辑单一样式:{{name}}', }, profileEditor: { profileInfo: '配置信息', profileName: '配置名称', filePath: '文件路径', lastModified: '最后修改', defaultTarget: '默认目标', quickUsage: '快速使用', runWithProfile: '使用配置运行', runOnDroid: '在 Droid 上运行', droidAliasExplicit: 'Droid 别名(显式)', overrideToClaude: '切换为 Claude', overrideToClaudeExplicit: '切换为 Claude(显式)', setAsDefault: '设为默认', provider: '提供商', custom: '自定义', }, settings: { sectionLoadFailed: '加载分区失败', unknownError: '发生未知错误', reloadPage: '重新加载页面', refresh: '刷新', copy: '复制', copied: '已复制', saved: '已保存', loading: '加载中...', configFileNotFound: '未找到配置文件', }, settingsTabs: { web: '网页', env: '环境', think: '思考', proxy: '代理', auth: '认证', backup: '备份', }, settingsAuth: { failedFetchTokens: '获取认证令牌失败', failedSaveTokens: '保存令牌失败', tokensUpdated: '令牌已更新,请重启 CLIProxy 生效。', failedRegenerate: '重新生成密钥失败', secretRegenerated: '新的管理密钥已生成,请重启 CLIProxy 生效。', failedReset: '重置令牌失败', tokensReset: '令牌已重置为默认值,请重启 CLIProxy 生效。', description: '配置 CLIProxy 认证令牌。修改后需要重启 CLIProxy。', apiKey: 'API Key', custom: '自定义', apiKeyDesc: 'Claude Code 通过该值向 CLIProxy 鉴权', apiKeyPlaceholder: 'API key', managementSecret: '管理密钥', managementSecretDesc: 'CCS Dashboard 使用该值访问 CLIProxy 管理接口', managementSecretPlaceholder: '管理密钥', generateSecret: '生成新的安全密钥', resetDefaults: '重置为默认值', resetDesc: '将 API key 和管理密钥都恢复为默认值。', saving: '保存中...', save: '保存', }, settingsGlobalEnv: { description: '向所有非 Claude 订阅型配置注入环境变量(gemini、codex、agy、ghcp 等)', enabled: '全局环境变量已启用', disabled: '全局环境变量已禁用', enabledDesc: '环境变量将注入第三方配置', disabledDesc: '环境变量不会被注入', envVars: '环境变量', noneConfigured: '尚未配置环境变量', addNew: '新增变量', keyName: 'KEY_NAME', value: 'value', add: '添加', quickAdd: '快速添加常用变量', allConfigured: '常用变量已全部配置', }, settingsBackups: { failedFetch: '获取备份失败', failedRestore: '恢复备份失败', restoreSuccess: '备份恢复成功', title: '设置备份', description: '恢复 settings.json 的历史版本。每次修改设置时会自动创建备份。', none: '暂无备份', noneHint: '修改设置后,备份会显示在这里', latest: '最新', restoring: '恢复中...', restore: '恢复', restoreConfirmTitle: '确认恢复备份?', restoreConfirmPrefix: '这将用以下备份替换当前设置:', restoreConfirmSuffix: '此操作不可撤销。', cancel: '取消', }, settingsWebsearch: { description: '面向第三方配置(gemini、codex、agy 等)的 CLI 网页搜索', enabled: 'WebSearch 已启用', disabled: 'WebSearch 已禁用', checking: '正在检查状态...', providers: '提供商', noneConfigured: '未配置任何提供商', noneConfiguredHint: '请先安装 CLI 工具以启用网页搜索提供商', checkProviders: '检查可用提供商', installed: '已安装', notInstalled: '未安装', model: '模型:', howInstall: '如何安装 {{name}} CLI', installGlobally: '全局安装', requiresKey: '(需要 xAI API key)', freeTier: '(提供免费额度)', viewDocs: '查看文档', }, settingsProxy: { failedLoadAgyMode: '加载 AGY 高级模式失败', failedUpdateAgyMode: '更新 AGY 高级模式失败', failedVerifyAgyMode: '校验 AGY 高级模式持久化失败', notPersistedAgyMode: 'AGY 高级模式未成功持久化,配置可能被其他进程修改。', agyModeEnabled: 'AGY 高级模式已启用。', agyModeDisabled: 'AGY 高级模式已关闭。', typePhraseToContinue: '请输入“{{value}}”后继续。', description: '为基于代理的配置设置本地或远程 {{backend}} 连接', backendPlus: 'CLIProxy Plus', backend: 'CLIProxy', instanceStatus: '实例状态', connectionMode: '连接模式', local: '本地', remote: '远程', localDesc: '在本机运行 {{backend}} 二进制', remoteDesc: '连接到远程 {{backend}} 服务器', backendBinary: '后端二进制', stopProxyToSwitch: '请先在实例状态中停止正在运行的代理,再切换后端。', default: '默认', plusDesc: '完整支持包括 Kiro 和 GitHub Copilot 在内的提供商', originalDesc: '原版二进制(仅 Gemini、Codex、Antigravity)', variantsIncompatible: '现有 Kiro/Copilot 变体与 CLIProxyAPI 不兼容。请切换到 CLIProxyAPIPlus 或移除这些变体。', safety: '安全', agyModeTitle: 'Antigravity 高级模式', agyModeDesc: '在 Add Account 与 `ccs agy` 流程中跳过 AGY 责任确认清单。', agyWarning: '仅在你充分理解 OAuth 封禁风险模式(#509)后使用。CCS 不对账号损失承担责任。', finalConfirm: '需要最终确认', finalConfirmDesc: '启用后会跳过 Dashboard 与 CLI 的 AGY 安全检查。请先阅读 issue #509,并输入精确短语后继续。', step1: '步骤 1', readIssue: '阅读 issue #509', step2: '步骤 2', typePrefix: '输入', typeSuffix: '以启用。', typePhraseAria: '输入 I ACCEPT RISK 以启用 Antigravity 高级模式', exactPhrase: '必须输入完全一致的短语。', enableAgyMode: '启用高级模式', toggleAgyMode: '切换 AGY 高级模式', fallbackSettings: '回退设置', enableFallback: '启用本地回退', enableFallbackDesc: '远程不可达时使用本地代理', autoStartLocal: '自动启动本地代理', autoStartLocalDesc: '发生回退时自动启动本地代理', advanced: '高级', debugMode: '调试模式', debugModeDesc: '在浏览器控制台输出开发诊断信息', debugModeEnabled: '调试模式已开启,请在浏览器控制台查看详细日志。', localProxy: '本地代理', port: '端口', autoStart: '自动启动', localAutoStartDesc: '需要时自动启动本地代理', remoteConfigTitle: '远程服务器配置', host: '主机', hostPlaceholder: '192.168.1.100 或 proxy.example.com', defaultPort: '默认:{{value}}', portPlaceholder: '留空使用 {{value}}', protocol: '协议', http: 'HTTP', https: 'HTTPS', apiKeyOptional: 'API Key(可选)', apiKeyPlaceholder: '用于 /v1/* API 接口', apiKeyDesc: '用于 /v1/chat/completions 接口请求', managementKeyOptional: '管理密钥(可选)', managementKeyPlaceholder: '用于 /v0/management/* 接口', managementKeyDesc: '用于 Dashboard 管理接口。未设置时回退使用 API Key。', testing: '测试中...', testConnection: '测试连接', connectedLatency: '已连接({{value}}ms)', connectionFailed: '连接失败', invalidPortOrEmpty: '端口必须是 1 到 65535 的整数,或留空使用默认值', invalidLocalPort: '本地端口必须是 1 到 65535 的整数', backendPlusApi: 'CLIProxyAPIPlus', backendApi: 'CLIProxyAPI', }, settingsThinking: { description: '为支持的模型配置扩展思考/推理。', supportedProviders: '支持的提供商', modeTitle: '思考模式', modeAutoDesc: '根据模型档位自动设置思考级别', modeOffDesc: '关闭扩展思考', modeManualDesc: '设置持久覆盖级别,或按次使用 CLI 参数', tierDefaults: '档位默认值', tierDefaultsDesc: '自动模式下各模型档位的默认思考级别。', persistentOverride: '持久覆盖', persistentOverrideDesc: '应用到所有会话。CLI 参数仍具有更高优先级。', enterCustomBudget: '输入自定义预算', apply: '应用', providerOverrides: '提供商覆盖({{count}})', providerOverridesDesc: '为特定提供商覆盖档位默认值。可按需添加自定义提供商键。', addProviderPlaceholder: '添加提供商键(例如 qwen)', showWarnings: '显示告警', showWarningsDesc: '当思考值被限制或调整时显示告警', cliEnvOverride: 'CLI 与环境变量覆盖', supportLine1Prefix: '思考预算:', supportLine1Suffix: '(基于 token)', supportLine2Prefix: '推理强度:', supportLine2SuffixPrefix: '(后缀或 ', supportLine2SuffixPostfix: ':medium/high/xhigh)', supportLine3Prefix: 'Codex 后缀会固定强度(例如 ', supportLine3Suffix: ');无后缀模型使用 Thinking mode。', }, analytics: { title: '分析', subtitle: '追踪使用情况与洞察', month: '本月', allTime: '全部时间', updated: '更新于 {{value}}', }, analyticsSummary: { totalTokens: '总 Token', totalTokensSubtitle: '输入 {{input}} / 输出 {{output}}', totalCost: '总成本', totalCostSubtitle: '日均 ${{value}}', cacheTokens: '缓存 Token', cacheTokensSubtitle: '${{cost}}(占成本 {{percent}}%)', inputCost: '输入成本', outputCost: '输出成本', tokensSubtitle: '{{value}} 个 token', }, apiProfiles: { title: 'API 配置', new: '新建', searchPlaceholder: '搜索配置...', loadingProfiles: '正在加载配置...', failedLoadTitle: '加载配置失败', failedLoadDesc: '无法获取 API 配置,请稍后重试。', retry: '重试', noProfilesYet: '还没有 API 配置', noProfilesDesc: '创建你的第一个配置以连接自定义 API 端点', createProfile: '创建配置', noProfileMatch: '没有匹配“{{query}}”的配置', profileCount: '{{count}} 个配置', configuredCount: '{{count}} 个已配置', deleteProfileTitle: '删除配置', deleteProfileDesc: '确定要删除“{{name}}”吗?这会移除设置文件且无法恢复。', delete: '删除', unsavedChangesTitle: '未保存的更改', unsavedChangesDesc: '你在“{{current}}”中有未保存内容,是否丢弃并切换到“{{next}}”?', discardSwitch: '丢弃并切换', }, accountsPage: { title: '账号', managePrefix: '统一管理', manageSuffix: '账号与池化接入流程。', mobileManageSuffix: '的连续性配置。', primaryActions: '主要操作', createAccount: '创建账号', authClaudeInPool: '在 Pool 中认证 Claude', openClaudePoolSettings: '打开 Claude Pool 设置', openCliProxyClaudePool: '打开 CLIProxy Claude Pool', migrationFollowup: '迁移后续处理', legacyContextPending: '{{count}} 个账号仍需首次模式确认。', legacyContinuityPending: '{{count}} 个共享账号仍处于标准旧版连续性深度。', confirmingLegacy: '正在确认旧版策略...', confirmLegacy: '确认旧版策略({{count}})', noLegacyFollowup: '暂无待处理的迁移后续项。', continuityGuide: '连续性指南', expandWhenNeeded: '按需展开查看。', sharedStandard: '共享标准', sharedStandardDesc: '仅同步项目工作区。适合大多数团队。', sharedDeeper: '共享更深', sharedDeeperPrefix: '额外包含', isolated: '隔离', isolatedDesc: '不建立链接。适合严格隔离场景。', quickCommands: '快捷命令', quickCommandsDesc: '复制后在终端运行。', workspaceBadge: 'ccs auth 工作区', historySyncBadge: '历史同步控制', authAccounts: '认证账号', tableScopePrefix: '该表仅展示', tableScopeMiddle: '账号。模式/分组/深度调整请使用', tableScopeSuffix: '。', accountMatrix: '账号矩阵', sharedTotalDesc: '共享总数:{{count}}。可执行 Sync 设置和旧版确认操作。', loadingAccounts: '正在加载账号...', }, health: { justNow: '刚刚', secondsAgo: '{{count}} 秒前', minutesAgo: '{{count}} 分钟前', hoursAgo: '{{count}} 小时前', systemHealth: '系统健康', build: '构建 {{version}}', lastScan: '上次扫描:', autoRefresh: '自动刷新:', refresh: '刷新', checks: '检查项', version: '版本', platform: '平台', liveMonitoring: '实时监控已启用', copied: '已复制到剪贴板', refreshing: '正在刷新健康检查...', fix: '修复', applyFix: '应用修复', healthLabel: '健康', }, updates: { actionRequired: '待处理', done: '已完成', all: '全部', inboxTitle: '更新收件箱', inboxSubtitle: '先处理操作,再将更新标记为完成或忽略。', needsAction: '需处理', doneCount: '已完成', searchPlaceholder: '搜索操作或命令', noNotices: '当前视图下没有通知。', noUpdates: '暂无更新。', published: '发布于 {{date}}', markDone: '标记完成', dismiss: '忽略', reopen: '重新打开', doNext: '下一步', impactedIntegrations: '受影响的集成', impactedDesc: '根据更新范围与路由匹配的相关区域。', whyMatters: '为什么重要', whyMattersDesc: '仅保留简要背景,不展示冗长发布说明。', open: '打开', progressNeedsAction: '需处理', progressInReview: '审阅中', progressDone: '已完成', progressDismissed: '已忽略', statusNew: '新', statusStable: '稳定', statusPlanned: '计划中', dashboard: 'Dashboard', cliUsage: 'CLI 用法', }, cliproxyPage: { connected: '已连接', notConnected: '未连接', variant: '变体', parentNotConnected: '上游未连接', viaProvider: '通过 {{provider}}', emptyTitle: 'CCS 配置管理', emptyDesc: '管理 CLIProxy 提供商的 OAuth 认证、账号偏好与模型选择,配置 CCS 的请求路由。', emptyControlPanelPrefix: '如需查看实时用量和监控,请前往', controlPanel: '控制面板', quickSetup: '快速设置', accountManagement: 'CCS 级账号管理', providers: '提供商', variants: '变体', providerCount: '{{count}} 个提供商', connectedCount: '{{count}} 个已连接', variantDisplay: '{{name}}({{provider}} 变体)', }, copilotPage: { title: 'Copilot', subtitle: 'GitHub Copilot 代理', setup: '安装', auth: '认证', daemon: '守护进程', unofficialTitle: '非官方 API - 风险自负', unofficialItem1: '逆向接口,可能随时失效', unofficialItem2: '过度使用可能触发账号限制', unofficialItem3: 'CCS 不提供担保,也不承担责任', yes: '是', no: '否', installed: '已安装', missing: '缺失', integration: '集成', enabled: '已启用', disabled: '已禁用', github: 'GitHub', connected: '已连接', notConnected: '未连接', authenticate: '去认证', authenticating: '认证中...', status: '状态', running: '运行中', stopped: '已停止', port: '端口', stopping: '停止中...', stop: '停止', starting: '启动中...', start: '启动', installing: '安装中...', installCopilotApi: '安装 copilot-api', proxy: '代理', active: '活跃', inactive: '未激活', }, cursorPage: { title: 'Cursor', beta: 'Beta', subtitle: 'Cursor 集成专用控制面板', unofficialTitle: '非官方 API - 风险自负', unofficialItem1: '逆向集成可能随时失效', unofficialItem2: '滥用或过量使用可能导致账号受限', unofficialItem3: 'CCS 不提供担保,也不承担责任', integration: '集成', authentication: '认证', daemon: '守护进程', enabled: '已启用', disabled: '已禁用', expired: '已过期', notConnected: '未连接', running: '运行中', stopped: '已停止', actions: '操作', disableIntegration: '禁用集成', enableIntegration: '启用集成', autoDetectAuth: '自动检测认证', manualAuthImport: '手动导入认证', stopDaemon: '停止守护进程', startDaemon: '启动守护进程', port: '端口', configuration: 'Cursor 配置', lastModified: '最后修改:', neverSaved: '从未保存', saving: '保存中...', save: '保存', modelConfig: '模型配置', settings: '设置', info: '信息', presets: '预设', presetsDesc: '应用预设模型映射', modelMapping: '模型映射', modelMappingDesc: '为不同档位配置使用模型', defaultModel: '默认模型', defaultModelDesc: '未指定档位时使用。', opusModel: 'Opus(最强)', opusModelDesc: '复杂推理与最高质量输出。', sonnetModel: 'Sonnet(均衡)', sonnetModelDesc: '日常编码和通用对话。', haikuModel: 'Haiku(快速)', haikuModelDesc: '低延迟与轻量请求。', runtimeSettings: '运行时设置', autoStartDaemon: '自动启动守护进程', autoStartDesc: '在使用集成时自动启动 Cursor 守护进程。', ghostMode: 'Ghost 模式', ghostModeDesc: '请求时附带 x-ghost-mode 以减少遥测。', provider: '提供商', filePath: '文件路径', availableModels: '可用模型', loadingModels: '加载模型中...', noModels: '暂无模型元数据,请先启动守护进程后刷新。', default: '默认', rawConfiguration: '原始配置(JSON)', manualImportTitle: '手动导入 Cursor 认证', manualImportDesc: '若无法自动检测,请提供 Cursor access token 与 machine ID。', accessToken: '访问令牌', accessTokenPlaceholder: '粘贴 Cursor access token', machineId: '机器 ID', machineIdPlaceholder: '32 位十六进制(无连字符 UUID)', cancel: '取消', import: '导入', selectModel: '选择模型', useDefaultModel: '使用默认模型', availableModelCount: '可用模型({{count}})', invalidPort: '端口必须是 1 到 65535 之间的整数', defaultModelRequired: '默认模型必填', savedConfig: 'Cursor 配置与模型映射已保存', failedSaveConfig: '保存配置失败', modelsLoadingWait: '模型仍在加载中,请稍后再应用预设。', noModelsAvailable: '暂无可用模型,请先启动守护进程并刷新。', appliedCodexPreset: '已应用 GPT-5.3 Codex 预设', appliedClaudePreset: '已应用 Claude 4.6 预设', appliedGeminiPreset: '已应用 Gemini 3 预设', integrationEnabled: 'Cursor 集成已启用', integrationDisabled: 'Cursor 集成已禁用', failedUpdateIntegration: '更新集成状态失败', credentialsImported: 'Cursor 凭据已导入', autoDetectFailed: '自动检测失败', manualRequired: 'Token 和 machine ID 为必填项', manualImportFailed: '手动导入失败', failedStartDaemon: '启动守护进程失败', daemonStarted: '守护进程已启动', daemonStartedWithPid: '守护进程已启动(PID: {{pid}})', failedStopDaemon: '停止守护进程失败', daemonStopped: '守护进程已停止', rawLoading: '原始设置仍在加载,请稍后重试。', invalidJson: 'JSON 无效', rawSaved: '原始设置已保存', rawChanged: '原始设置已被外部修改,请刷新后重试。', failedSaveRaw: '保存原始设置失败', savedAll: 'Cursor 配置已保存', }, droidPage: { loadingDiagnostics: '加载 Droid 诊断中...', failedDiagnostics: '加载 Droid 诊断失败。', overview: '概览', byok: 'BYOK', docs: '文档', runtimeInstall: '运行时与安装', status: '状态', detected: '已检测', notFound: '未找到', detectionSource: '检测来源', binaryPath: '二进制路径', installDirectory: '安装目录', version: '版本', overridePath: '覆盖路径(CCS_DROID_PATH)', configFiles: '配置文件', path: '路径', resolved: '解析结果', size: '大小', lastModified: '最后修改', parseWarning: '解析告警:{{value}}', readWarning: '读取告警:{{value}}', warnings: '告警', byokSummary: 'BYOK 概览', activeModelSelector: '当前模型选择器', customModels: '自定义模型', ccsManaged: 'CCS 管理', userManaged: '用户管理', malformedEntries: '异常条目', providers: '提供商', none: '无', customModelsTitle: '自定义模型', modelName: '名称 / 模型', provider: '提供商', baseUrl: 'Base URL', noCustomModels: '没有自定义模型', docsAlignedNotes: '文档对齐说明', factoryDocs: 'Factory 文档', providerFactCheckDocs: 'Provider 校验文档', providerValues: 'Provider 值:{{value}}', settingsHierarchy: 'Settings 层级:{{value}}', settingsTitle: 'Droid BYOK 设置', fixJsonBeforeQuickSettings: '请先修复 JSON 语法,再使用快速设置。', fixJsonBeforeReasoning: '请先修复 JSON 语法,再更新 BYOK 推理设置。', unableUpdateReasoning: '无法更新所选 BYOK 模型的推理设置。', fixJsonBeforeBudget: '请先修复 JSON 语法,再更新思考预算。', anthropicOnlyBudget: '思考预算仅适用于 Anthropic BYOK 模型。', invalidJson: 'JSON 无效:{{value}}', saved: 'Droid 设置已保存', changedExternally: 'Droid 设置已被外部修改,请刷新后重试。', failedSave: '保存 Droid 设置失败', }, sharedPage: { commands: '命令', skills: '技能', agents: '代理', title: '共享数据', subtitle: '在 Claude 实例间共享的命令、技能和代理', totalShared: '共享总数', visible: '可见', markdownDetail: 'Markdown 详情视图', filterPrefix: '筛选:', configurationRequired: '需要配置', countsUnavailable: '统计不可用', retryCounts: '重试统计', filterPlaceholder: '按名称、描述或路径筛选 {{tab}}', showing: '显示 {{visible}} / {{total}} 个{{tab}}', showingQuery: '(关键字“{{query}}”)', refreshing: '(刷新中...)', loadingShared: '正在加载共享{{tab}}...', failedLoadShared: '加载共享{{tab}}失败', retry: '重试', noSharedFound: '未找到共享{{tab}}。请运行 `ccs sync` 或在共享目录添加内容。', noMatch: '没有匹配“{{query}}”的{{tab}}。', selectOne: '选择一个{{tab}}查看完整内容。', pathLabel: '路径', resolvedSource: '解析后来源', loadingMarkdown: '正在加载 Markdown 内容...', failedLoadContent: '加载内容失败', retryContent: '重试内容加载', noMarkdown: '暂无 Markdown 内容。', }, }, }, } as const; if (!i18n.isInitialized) { i18n.use(initReactI18next).init({ resources, lng: getInitialLocale(), fallbackLng: 'en', interpolation: { escapeValue: false, }, }); } export default i18n;