mirror of
https://github.com/tiennm99/ccs.git
synced 2026-10-11 03:13:12 +00:00
2238 lines
97 KiB
TypeScript
2238 lines
97 KiB
TypeScript
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;
|