Files
ccs/ui/src/lib/i18n.ts
T

2238 lines
97 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 <name>',
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 <strong>v{{version}}</strong>, which is above the maximum stable version <strong>v{{maxStable}}</strong>.',
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 <code>ccs doctor --fix</code> 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 <name>',
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:
'即将安装 <strong>v{{version}}</strong>,该版本高于当前最大稳定版 <strong>v{{maxStable}}</strong>。',
installUnstableWarning: '该版本存在已知稳定性问题,可能导致异常行为。',
installUnstableConfirm: '确定要继续吗?',
cancel: '取消',
installAnyway: '仍要安装',
clickToDowngrade: '点击降级',
clickToUpdate: '点击更新',
},
syncStatusCard: {
profileSync: '配置同步',
ready: '就绪',
noConfig: '未配置',
syncsProfilesDesc: '将 API 配置同步到本地 CLIProxy 配置',
runDoctorHint: '运行 <code>ccs doctor --fix</code> 生成配置。',
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;