mirror of
https://github.com/catlog22/Claude-Code-Workflow.git
synced 2026-02-11 02:33:51 +08:00
- Implement tests for migration 005 to verify removal of deprecated fields in the database schema. - Ensure that new databases are created with a clean schema. - Validate that keywords are correctly extracted from the normalized file_keywords table. - Test symbol insertion without deprecated fields and subdir operations without direct_files. - Create a detailed search comparison test to evaluate vector search vs hybrid search performance. - Add a script for reindexing projects to extract code relationships and verify GraphAnalyzer functionality. - Include a test script to check TreeSitter parser availability and relationship extraction from sample files.
2398 lines
104 KiB
JavaScript
2398 lines
104 KiB
JavaScript
// ============================================
|
||
// I18N - Internationalization Module
|
||
// ============================================
|
||
// Supports English and Chinese (Simplified)
|
||
|
||
// Current language (default: detect from browser or use 'en')
|
||
let currentLang = 'en';
|
||
|
||
// Translation dictionaries
|
||
const i18n = {
|
||
en: {
|
||
// App title and brand
|
||
'app.title': 'CCW Dashboard',
|
||
'app.brand': 'Claude Code Workflow',
|
||
|
||
// Header
|
||
'header.project': 'Project:',
|
||
'header.recentProjects': 'Recent Projects',
|
||
'header.browse': 'Browse...',
|
||
'header.refreshWorkspace': 'Refresh workspace',
|
||
'header.toggleTheme': 'Toggle theme',
|
||
'header.language': 'Language',
|
||
|
||
// Sidebar - Project section
|
||
'nav.project': 'Project',
|
||
'nav.overview': 'Overview',
|
||
'nav.explorer': 'Explorer',
|
||
'nav.status': 'Status',
|
||
'nav.history': 'History',
|
||
'nav.memory': 'Memory',
|
||
'nav.contextMemory': 'Context',
|
||
'nav.promptHistory': 'Prompts',
|
||
|
||
// Sidebar - Sessions section
|
||
'nav.sessions': 'Sessions',
|
||
'nav.all': 'All',
|
||
'nav.active': 'Active',
|
||
'nav.archived': 'Archived',
|
||
|
||
// Sidebar - Lite Tasks section
|
||
'nav.liteTasks': 'Lite Tasks',
|
||
'nav.litePlan': 'Lite Plan',
|
||
'nav.liteFix': 'Lite Fix',
|
||
|
||
// Sidebar - MCP section
|
||
'nav.mcpServers': 'MCP Servers',
|
||
'nav.manage': 'Manage',
|
||
|
||
// Sidebar - Hooks section
|
||
'nav.hooks': 'Hooks',
|
||
|
||
// Sidebar - Footer
|
||
'nav.collapse': 'Collapse',
|
||
'nav.expand': 'Expand',
|
||
|
||
// Stats cards
|
||
'stats.totalSessions': 'Total Sessions',
|
||
'stats.activeSessions': 'Active Sessions',
|
||
'stats.totalTasks': 'Total Tasks',
|
||
'stats.completedTasks': 'Completed Tasks',
|
||
|
||
// Carousel
|
||
'carousel.noActiveSessions': 'No active sessions',
|
||
'carousel.previous': 'Previous',
|
||
'carousel.next': 'Next',
|
||
'carousel.pause': 'Pause auto-play',
|
||
|
||
// Content titles
|
||
'title.allSessions': 'All Sessions',
|
||
'title.activeSessions': 'Active Sessions',
|
||
'title.archivedSessions': 'Archived Sessions',
|
||
'title.sessions': 'Sessions',
|
||
'title.projectOverview': 'Project Overview',
|
||
'title.mcpManagement': 'MCP Server Management',
|
||
'title.fileExplorer': 'File Explorer',
|
||
'title.cliTools': 'CLI Tools & CCW',
|
||
'title.cliHistory': 'CLI Execution History',
|
||
'title.litePlanSessions': 'Lite Plan Sessions',
|
||
'title.liteFixSessions': 'Lite Fix Sessions',
|
||
'title.liteTasks': 'Lite Tasks',
|
||
'title.sessionDetail': 'Session Detail',
|
||
'title.liteTaskDetail': 'Lite Task Detail',
|
||
'title.hookManager': 'Hook Manager',
|
||
'title.memoryModule': 'Memory Module',
|
||
'title.promptHistory': 'Prompt History',
|
||
|
||
// Search
|
||
'search.placeholder': 'Search...',
|
||
|
||
// Session cards
|
||
'session.status.active': 'ACTIVE',
|
||
'session.status.archived': 'ARCHIVED',
|
||
'session.status.planning': 'PLANNING',
|
||
'session.tasks': 'tasks',
|
||
'session.findings': 'findings',
|
||
'session.dimensions': 'dimensions',
|
||
'session.progress': 'Progress',
|
||
|
||
// Empty states
|
||
'empty.noSessions': 'No Sessions Found',
|
||
'empty.noSessionsText': 'No workflow sessions match your current filter.',
|
||
'empty.noTasks': 'No Tasks',
|
||
'empty.noTasksText': 'This session has no tasks defined.',
|
||
'empty.noTaskFiles': 'No Task Files',
|
||
'empty.noTaskFilesText': 'No IMPL-*.json files found in .task/',
|
||
'empty.noLiteSessions': 'No {type} Sessions',
|
||
'empty.noLiteSessionsText': 'No sessions found in .workflow/.{type}/',
|
||
'empty.noMcpServers': 'No MCP servers configured for this project',
|
||
'empty.addMcpServersHint': 'Add servers from the available list below',
|
||
'empty.noGlobalMcpServers': 'No global MCP servers configured',
|
||
'empty.globalServersHint': 'Global servers are available to all projects from ~/.claude.json',
|
||
'empty.noAdditionalMcp': 'No additional MCP servers found in other projects',
|
||
'empty.noHooks': 'No hooks configured for this project',
|
||
'empty.createHookHint': 'Create a hook to automate actions on tool usage',
|
||
'empty.noGlobalHooks': 'No global hooks configured',
|
||
'empty.globalHooksHint': 'Global hooks apply to all Claude Code sessions',
|
||
'empty.noDiagnoses': 'No Diagnoses',
|
||
'empty.noDiagnosesText': 'No diagnosis-*.json files found for this session.',
|
||
|
||
// Session detail tabs
|
||
'tab.tasks': 'Tasks',
|
||
'tab.context': 'Context',
|
||
'tab.summary': 'Summary',
|
||
'tab.implPlan': 'IMPL Plan',
|
||
'tab.conflict': 'Conflict',
|
||
'tab.review': 'Review',
|
||
'tab.plan': 'Plan',
|
||
'tab.diagnoses': 'Diagnoses',
|
||
|
||
// Session detail
|
||
'detail.backToSessions': 'Back to Sessions',
|
||
'detail.backToLiteTasks': 'Back to {type}',
|
||
'detail.created': 'Created:',
|
||
'detail.archived': 'Archived:',
|
||
'detail.project': 'Project:',
|
||
'detail.tasks': 'Tasks:',
|
||
'detail.completed': 'completed',
|
||
|
||
// Task status
|
||
'task.status.pending': 'Pending',
|
||
'task.status.inProgress': 'In Progress',
|
||
'task.status.completed': 'Completed',
|
||
'task.completed': 'completed',
|
||
'task.inProgress': 'in progress',
|
||
'task.pending': 'pending',
|
||
|
||
// Task actions
|
||
'task.quickActions': 'Quick Actions:',
|
||
'task.allPending': 'All Pending',
|
||
'task.allInProgress': 'All In Progress',
|
||
'task.allCompleted': 'All Completed',
|
||
'task.setAllConfirm': 'Set all {count} tasks to "{status}"?',
|
||
'task.statusUpdated': 'Task {id} status updated',
|
||
'task.tasksUpdated': 'All {count} tasks updated',
|
||
'task.noPendingTasks': 'No pending tasks to start',
|
||
'task.noInProgressTasks': 'No in-progress tasks to complete',
|
||
'task.movedToInProgress': '{count} tasks moved to In Progress',
|
||
'task.tasksCompleted': '{count} tasks completed',
|
||
|
||
// Context tab
|
||
'context.description': 'description:',
|
||
'context.requirements': 'requirements:',
|
||
'context.focusPaths': 'focus_paths:',
|
||
'context.modificationPoints': 'modification_points:',
|
||
'context.acceptance': 'acceptance:',
|
||
'context.noData': 'No context data',
|
||
'context.loading': 'Loading context data...',
|
||
'context.loadError': 'Failed to load context: {error}',
|
||
|
||
// Flow control
|
||
'flow.implementationApproach': 'implementation_approach:',
|
||
'flow.preAnalysis': 'pre_analysis:',
|
||
'flow.targetFiles': 'target_files:',
|
||
'flow.noData': 'No flow control data',
|
||
|
||
// Summary tab
|
||
'summary.loading': 'Loading summaries...',
|
||
'summary.title': 'Summaries',
|
||
'summary.hint': 'Session summaries will be loaded from .summaries/',
|
||
'summary.noSummaries': 'No Summaries',
|
||
'summary.noSummariesText': 'No summaries found in .summaries/',
|
||
|
||
// IMPL Plan tab
|
||
'implPlan.loading': 'Loading IMPL plan...',
|
||
'implPlan.title': 'IMPL Plan',
|
||
'implPlan.hint': 'IMPL plan will be loaded from IMPL_PLAN.md',
|
||
|
||
// Review tab
|
||
'review.loading': 'Loading review data...',
|
||
'review.title': 'Review Data',
|
||
'review.hint': 'Review data will be loaded from review files',
|
||
|
||
// CLI Manager
|
||
'cli.tools': 'CLI Tools',
|
||
'cli.available': 'available',
|
||
'cli.refreshStatus': 'Refresh Status',
|
||
'cli.ready': 'Ready',
|
||
'cli.notInstalled': 'Not Installed',
|
||
'cli.setDefault': 'Set Default',
|
||
'cli.default': 'Default',
|
||
'cli.install': 'Install',
|
||
'cli.uninstall': 'Uninstall',
|
||
'cli.initIndex': 'Init Index',
|
||
'cli.geminiDesc': 'Google AI for code analysis',
|
||
'cli.qwenDesc': 'Alibaba AI assistant',
|
||
'cli.codexDesc': 'OpenAI code generation',
|
||
'cli.codexLensDesc': 'Code indexing & FTS search',
|
||
'cli.codexLensDescFull': 'Full-text code search engine',
|
||
'cli.semanticDesc': 'AI-powered code understanding',
|
||
'cli.semanticDescFull': 'Natural language code search',
|
||
|
||
// CodexLens Configuration
|
||
'codexlens.config': 'CodexLens Configuration',
|
||
'codexlens.status': 'Status',
|
||
'codexlens.installed': 'Installed',
|
||
'codexlens.notInstalled': 'Not Installed',
|
||
'codexlens.indexes': 'Indexes',
|
||
'codexlens.currentWorkspace': 'Current Workspace',
|
||
'codexlens.indexStoragePath': 'Index Storage Path',
|
||
'codexlens.whereIndexesStored': 'where indexes are stored',
|
||
'codexlens.currentPath': 'Current Path',
|
||
'codexlens.newStoragePath': 'New Storage Path',
|
||
'codexlens.pathPlaceholder': 'e.g., /path/to/indexes or ~/.codexlens/indexes',
|
||
'codexlens.pathInfo': 'Supports ~ for home directory. Changes take effect immediately.',
|
||
'codexlens.migrationRequired': 'Migration Required',
|
||
'codexlens.migrationWarning': 'After changing the path, existing indexes will need to be re-initialized for each workspace.',
|
||
'codexlens.actions': 'Actions',
|
||
'codexlens.initializeIndex': 'Initialize Index',
|
||
'codexlens.cleanAllIndexes': 'Clean All Indexes',
|
||
'codexlens.installCodexLens': 'Install CodexLens',
|
||
'codexlens.testSearch': 'Test Search',
|
||
'codexlens.testFunctionality': 'test CodexLens functionality',
|
||
'codexlens.textSearch': 'Text Search',
|
||
'codexlens.fileSearch': 'File Search',
|
||
'codexlens.symbolSearch': 'Symbol Search',
|
||
'codexlens.exactMode': 'Exact',
|
||
'codexlens.fuzzyMode': 'Fuzzy (Trigram)',
|
||
'codexlens.hybridMode': 'Hybrid (RRF)',
|
||
'codexlens.vectorMode': 'Vector (Semantic)',
|
||
'codexlens.searchPlaceholder': 'Enter search query (e.g., function name, file path, code snippet)',
|
||
'codexlens.runSearch': 'Run Search',
|
||
'codexlens.results': 'Results',
|
||
'codexlens.resultsCount': 'results',
|
||
'codexlens.saveConfig': 'Save Configuration',
|
||
'codexlens.searching': 'Searching...',
|
||
'codexlens.searchCompleted': 'Search completed',
|
||
'codexlens.searchFailed': 'Search failed',
|
||
'codexlens.enterQuery': 'Please enter a search query',
|
||
'codexlens.configSaved': 'Configuration saved successfully',
|
||
'codexlens.pathEmpty': 'Index directory path cannot be empty',
|
||
'codexlens.cleanConfirm': 'Are you sure you want to clean all CodexLens indexes? This cannot be undone.',
|
||
'codexlens.cleaning': 'Cleaning indexes...',
|
||
'codexlens.cleanSuccess': 'All indexes cleaned successfully',
|
||
'codexlens.cleanFailed': 'Failed to clean indexes',
|
||
'codexlens.loadingConfig': 'Loading configuration...',
|
||
|
||
// Model Management
|
||
'codexlens.semanticDeps': 'Semantic Dependencies',
|
||
'codexlens.checkingDeps': 'Checking dependencies...',
|
||
'codexlens.semanticInstalled': 'Semantic dependencies installed',
|
||
'codexlens.semanticNotInstalled': 'Semantic dependencies not installed',
|
||
'codexlens.installDeps': 'Install Dependencies',
|
||
'codexlens.installingDeps': 'Installing dependencies...',
|
||
'codexlens.depsInstalled': 'Dependencies installed successfully',
|
||
'codexlens.depsInstallFailed': 'Failed to install dependencies',
|
||
'codexlens.modelManagement': 'Model Management',
|
||
'codexlens.loadingModels': 'Loading models...',
|
||
'codexlens.downloadModel': 'Download',
|
||
'codexlens.deleteModel': 'Delete',
|
||
'codexlens.downloading': 'Downloading...',
|
||
'codexlens.deleting': 'Deleting...',
|
||
'codexlens.modelDownloaded': 'Model downloaded',
|
||
'codexlens.modelDownloadFailed': 'Model download failed',
|
||
'codexlens.modelDeleted': 'Model deleted',
|
||
'codexlens.modelDeleteFailed': 'Model deletion failed',
|
||
'codexlens.deleteModelConfirm': 'Are you sure you want to delete model',
|
||
|
||
// Semantic Search Configuration
|
||
'semantic.settings': 'Semantic Search Settings',
|
||
'semantic.configDesc': 'Configure LLM enhancement for semantic indexing',
|
||
'semantic.llmEnhancement': 'LLM Enhancement',
|
||
'semantic.llmDesc': 'Use LLM to generate code summaries for better semantic search',
|
||
'semantic.primaryTool': 'Primary LLM Tool',
|
||
'semantic.fallbackTool': 'Fallback Tool',
|
||
'semantic.batchSize': 'Batch Size',
|
||
'semantic.timeout': 'Timeout',
|
||
'semantic.file': 'file',
|
||
'semantic.files': 'files',
|
||
'semantic.enhanceInfo': 'LLM enhancement generates code summaries and keywords for each file, improving semantic search accuracy.',
|
||
'semantic.enhanceCommand': 'Run',
|
||
'semantic.enhanceAfterEnable': 'after enabling to process existing files.',
|
||
'semantic.runEnhanceNow': 'Run Enhance Now',
|
||
'semantic.viewStatus': 'View Status',
|
||
'semantic.testSearch': 'Test Semantic Search',
|
||
'semantic.searchPlaceholder': 'Enter semantic query (e.g., authentication logic, error handling)',
|
||
'semantic.runSearch': 'Run Semantic Search',
|
||
'semantic.close': 'Close',
|
||
'semantic.enabled': 'enabled',
|
||
'semantic.disabled': 'disabled',
|
||
'semantic.toolSetTo': 'Primary LLM tool set to',
|
||
'semantic.fallbackSetTo': 'Fallback tool set to',
|
||
'semantic.none': 'none',
|
||
'semantic.llmEnhancement': 'LLM Enhancement',
|
||
'semantic.batchSetTo': 'Batch size set to',
|
||
'semantic.timeoutSetTo': 'Timeout set to',
|
||
'semantic.minute': 'minute',
|
||
'semantic.minutes': 'minutes',
|
||
'semantic.enableFirst': 'Please enable LLM Enhancement first',
|
||
|
||
'cli.settings': 'CLI Execution Settings',
|
||
'cli.promptFormat': 'Prompt Format',
|
||
'cli.promptFormatDesc': 'Format for multi-turn conversation concatenation',
|
||
'cli.storageBackend': 'Storage Backend',
|
||
'cli.storageBackendDesc': 'CLI history stored in SQLite with FTS search',
|
||
'cli.smartContext': 'Smart Context',
|
||
'cli.smartContextDesc': 'Auto-analyze prompt and add relevant file paths',
|
||
'cli.nativeResume': 'Native Resume',
|
||
'cli.nativeResumeDesc': 'Use native tool resume (gemini -r, qwen --resume, codex resume)',
|
||
'cli.recursiveQuery': 'Recursive Query',
|
||
'cli.recursiveQueryDesc': 'Aggregate CLI history and memory data from parent and child projects',
|
||
'cli.maxContextFiles': 'Max Context Files',
|
||
'cli.maxContextFilesDesc': 'Maximum files to include in smart context',
|
||
|
||
// CCW Install
|
||
'ccw.install': 'CCW Install',
|
||
'ccw.installations': 'installation',
|
||
'ccw.installationsPlural': 'installations',
|
||
'ccw.noInstallations': 'No installations found',
|
||
'ccw.installCcw': 'Install CCW',
|
||
'ccw.upgrade': 'Upgrade',
|
||
'ccw.uninstall': 'Uninstall',
|
||
'ccw.files': 'files',
|
||
'ccw.globalInstall': 'Global Installation',
|
||
'ccw.globalInstallDesc': 'Install to user home directory (~/.claude)',
|
||
'ccw.pathInstall': 'Path Installation',
|
||
'ccw.pathInstallDesc': 'Install to a specific project folder',
|
||
'ccw.installPath': 'Installation Path',
|
||
'ccw.installToPath': 'Install to Path',
|
||
'ccw.uninstallConfirm': 'Uninstall CCW from this location?',
|
||
'ccw.upgradeStarting': 'Starting upgrade...',
|
||
'ccw.upgradeCompleted': 'Upgrade completed! Refreshing...',
|
||
'ccw.upgradeFailed': 'Upgrade failed: {error}',
|
||
|
||
// CCW Endpoint Tools
|
||
'ccw.endpointTools': 'CCW Endpoint Tools',
|
||
'ccw.tool': 'tool',
|
||
'ccw.tools': 'tools',
|
||
'ccw.noEndpointTools': 'No endpoint tools found',
|
||
'ccw.parameters': 'Parameters',
|
||
'ccw.required': 'required',
|
||
'ccw.optional': 'optional',
|
||
'ccw.default': 'Default:',
|
||
'ccw.options': 'Options:',
|
||
'ccw.noParams': 'This tool has no parameters',
|
||
'ccw.usageExample': 'Usage Example',
|
||
'ccw.endpointTool': 'endpoint tool',
|
||
|
||
// Explorer
|
||
'explorer.title': 'Explorer',
|
||
'explorer.refresh': 'Refresh',
|
||
'explorer.selectFile': 'Select a file to preview',
|
||
'explorer.selectFileHint': 'Select a file from the tree to preview its contents',
|
||
'explorer.loading': 'Loading file tree...',
|
||
'explorer.loadingFile': 'Loading file...',
|
||
'explorer.emptyDir': 'Empty directory',
|
||
'explorer.loadError': 'Failed to load: {error}',
|
||
'explorer.preview': 'Preview',
|
||
'explorer.source': 'Source',
|
||
'explorer.lines': 'lines',
|
||
'explorer.updateClaudeMd': 'Update CLAUDE.md',
|
||
'explorer.currentFolderOnly': 'Update CLAUDE.md (current folder only)',
|
||
'explorer.withSubdirs': 'Update CLAUDE.md (with subdirectories)',
|
||
|
||
// Task Queue
|
||
'taskQueue.title': 'Update Tasks',
|
||
'taskQueue.cli': 'CLI:',
|
||
'taskQueue.addTask': 'Add update task',
|
||
'taskQueue.startAll': 'Start all tasks',
|
||
'taskQueue.clearCompleted': 'Clear completed',
|
||
'taskQueue.noTasks': 'No tasks in queue',
|
||
'taskQueue.noTasksHint': 'Hover folder and click icons to add tasks',
|
||
'taskQueue.processing': 'Processing...',
|
||
'taskQueue.updated': 'Updated successfully',
|
||
'taskQueue.failed': 'Update failed',
|
||
'taskQueue.currentOnly': 'Current only',
|
||
'taskQueue.withSubdirs': 'With subdirs',
|
||
'taskQueue.startingTasks': 'Starting {count} task(s) in parallel...',
|
||
'taskQueue.queueCompleted': 'Queue completed: {success} succeeded, {failed} failed',
|
||
|
||
// Update CLAUDE.md Modal
|
||
'updateClaudeMd.title': 'Update CLAUDE.md',
|
||
'updateClaudeMd.targetDir': 'Target Directory',
|
||
'updateClaudeMd.cliTool': 'CLI Tool',
|
||
'updateClaudeMd.strategy': 'Strategy',
|
||
'updateClaudeMd.singleLayer': 'Single Layer - Current dir + child CLAUDE.md refs',
|
||
'updateClaudeMd.multiLayer': 'Multi Layer - Generate CLAUDE.md in all subdirs',
|
||
'updateClaudeMd.running': 'Running update...',
|
||
'updateClaudeMd.execute': 'Execute',
|
||
'updateClaudeMd.addToQueue': 'Add to Queue',
|
||
'updateClaudeMd.cancel': 'Cancel',
|
||
|
||
// MCP Manager
|
||
'mcp.currentAvailable': 'Current Available MCP',
|
||
'mcp.projectAvailable': 'Current Available MCP',
|
||
'mcp.newProjectServer': 'New Project Server',
|
||
'mcp.newServer': 'New Server',
|
||
'mcp.newGlobalServer': 'New Global Server',
|
||
'mcp.installToProject': 'Install to Project',
|
||
'mcp.installToGlobal': 'Install to Global',
|
||
'mcp.installToWorkspace': 'Install to Workspace',
|
||
'mcp.updateInWorkspace': 'Update in Workspace',
|
||
'mcp.updateInGlobal': 'Update in Global',
|
||
'mcp.serversConfigured': 'servers configured',
|
||
'mcp.serversAvailable': 'servers available',
|
||
'mcp.globalAvailable': '全局可用 MCP',
|
||
'mcp.globalServersFrom': '个服务器来自 ~/.claude.json',
|
||
'mcp.enterprise': 'Enterprise MCP Servers',
|
||
'mcp.enterpriseManaged': 'Managed',
|
||
'mcp.enterpriseReadOnly': 'servers (read-only)',
|
||
'mcp.user': 'User MCP Servers',
|
||
'mcp.userServersFrom': 'servers from ~/.claude.json',
|
||
'mcp.availableOther': 'Available from Other Projects',
|
||
'mcp.serversAvailable': 'servers available',
|
||
'mcp.allProjects': 'All Projects MCP Overview',
|
||
'mcp.projects': 'projects',
|
||
'mcp.project': 'Project',
|
||
'mcp.servers': 'MCP Servers',
|
||
'mcp.status': 'Status',
|
||
'mcp.current': '(Current)',
|
||
'mcp.noMcpServers': 'No MCP servers',
|
||
'mcp.add': 'Add',
|
||
'mcp.addToProject': 'Add to Project',
|
||
'mcp.installToProject': 'Install to project',
|
||
'mcp.installToGlobal': 'Install to global',
|
||
'mcp.removeFromProject': 'Remove from project',
|
||
'mcp.removeConfirm': 'Remove MCP server "{name}" from this project?',
|
||
'mcp.removeGlobal': 'Remove from global scope',
|
||
'mcp.removeGlobalConfirm': 'Remove global MCP server "{name}"? This will affect all projects.',
|
||
'mcp.readOnly': 'Read-only',
|
||
'mcp.usedIn': 'Used in {count} project',
|
||
'mcp.usedInPlural': 'Used in {count} projects',
|
||
'mcp.availableToAll': 'Available to all projects from ~/.claude.json',
|
||
'mcp.managedByOrg': 'Managed by organization (highest priority)',
|
||
'mcp.variables': 'variables',
|
||
'mcp.cmd': 'Command',
|
||
'mcp.url': 'URL',
|
||
'mcp.args': 'Arguments',
|
||
'mcp.env': 'Environment',
|
||
'mcp.usedInCount': 'Used in {count} project{s}',
|
||
'mcp.from': 'from',
|
||
'mcp.variant': 'variant',
|
||
'mcp.sourceEnterprise': 'Enterprise',
|
||
'mcp.sourceGlobal': 'Global',
|
||
'mcp.sourceProject': 'Project',
|
||
'mcp.viewDetails': 'View Details',
|
||
'mcp.clickToViewDetails': 'Click to view details',
|
||
|
||
// MCP Details Modal
|
||
'mcp.detailsModal.title': 'MCP Server Details',
|
||
'mcp.detailsModal.close': 'Close',
|
||
'mcp.detailsModal.serverName': 'Server Name',
|
||
'mcp.detailsModal.source': 'Source',
|
||
'mcp.detailsModal.configuration': 'Configuration',
|
||
'mcp.detailsModal.noEnv': 'No environment variables',
|
||
|
||
// MCP Create Modal
|
||
'mcp.createTitle': 'Create MCP Server',
|
||
'mcp.form': 'Form',
|
||
'mcp.json': 'JSON',
|
||
'mcp.serverName': 'Server Name',
|
||
'mcp.serverNamePlaceholder': 'e.g., my-mcp-server',
|
||
'mcp.scope': 'Scope',
|
||
'mcp.scopeProject': 'Project - Only this project',
|
||
'mcp.scopeGlobal': 'Global - All projects (~/.claude.json)',
|
||
'mcp.command': 'Command',
|
||
'mcp.commandPlaceholder': 'e.g., npx, uvx, node, python',
|
||
'mcp.arguments': 'Arguments (one per line)',
|
||
'mcp.envVars': 'Environment Variables (KEY=VALUE per line)',
|
||
'mcp.pasteJson': 'Paste MCP Server JSON Configuration',
|
||
'mcp.jsonFormatsHint': 'Supports {"servers": {...}}, {"mcpServers": {...}}, and direct server config formats.',
|
||
'mcp.previewServers': 'Preview (servers to be added):',
|
||
'mcp.create': 'Create',
|
||
'mcp.chooseInstallLocation': 'Choose Installation Location',
|
||
'mcp.installToClaudeJson': 'Install to .claude.json',
|
||
'mcp.installToMcpJson': 'Install to .mcp.json (Recommended)',
|
||
'mcp.claudeJsonDesc': 'Save in root .claude.json projects section (shared config)',
|
||
'mcp.mcpJsonDesc': 'Save in project .mcp.json file (recommended for version control)',
|
||
|
||
// New MCP Manager UI
|
||
'mcp.title': 'MCP Server Management',
|
||
'mcp.subtitle': 'Manage MCP servers for Claude, Codex, and project-level configurations',
|
||
'mcp.createNew': 'Create New',
|
||
'mcp.createFirst': 'Create Your First Server',
|
||
'mcp.noServers': 'No MCP Servers Configured',
|
||
'mcp.noServersDesc': 'Get started by creating a new MCP server or installing from templates',
|
||
'mcp.totalServers': 'Total Servers',
|
||
'mcp.enabled': 'Enabled',
|
||
'mcp.viewServer': 'View Server',
|
||
'mcp.editServer': 'Edit Server',
|
||
'mcp.createServer': 'Create Server',
|
||
'mcp.updateServer': 'Update Server',
|
||
'mcp.close': 'Close',
|
||
'mcp.cancel': 'Cancel',
|
||
'mcp.update': 'Update',
|
||
'mcp.install': 'Install',
|
||
'mcp.save': 'Save',
|
||
'mcp.delete': 'Delete',
|
||
'mcp.optional': 'Optional',
|
||
'mcp.description': 'Description',
|
||
'mcp.category': 'Category',
|
||
'mcp.installTo': 'Install To',
|
||
'mcp.cwd': 'Working Directory',
|
||
'mcp.httpHeaders': 'HTTP Headers',
|
||
'mcp.error': 'Error',
|
||
'mcp.success': 'Success',
|
||
'mcp.nameRequired': 'Server name is required',
|
||
'mcp.commandRequired': 'Command is required',
|
||
'mcp.urlRequired': 'URL is required',
|
||
'mcp.invalidArgsJson': 'Invalid JSON format for arguments',
|
||
'mcp.invalidEnvJson': 'Invalid JSON format for environment variables',
|
||
'mcp.invalidHeadersJson': 'Invalid JSON format for HTTP headers',
|
||
'mcp.serverInstalled': 'Server installed successfully',
|
||
'mcp.serverEnabled': 'Server enabled successfully',
|
||
'mcp.serverDisabled': 'Server disabled successfully',
|
||
'mcp.serverDeleted': 'Server deleted successfully',
|
||
'mcp.backToManager': 'Back to Manager',
|
||
'mcp.noTemplates': 'No Templates Available',
|
||
'mcp.noTemplatesDesc': 'Create templates from existing servers or add new ones',
|
||
'mcp.templatesDesc': 'Browse and install pre-configured MCP server templates',
|
||
|
||
// MCP Templates
|
||
'mcp.templates': 'MCP Templates',
|
||
'mcp.savedTemplates': 'saved templates',
|
||
'mcp.saveAsTemplate': 'Save as Template',
|
||
'mcp.enterTemplateName': 'Enter template name',
|
||
'mcp.enterTemplateDesc': 'Enter template description (optional)',
|
||
'mcp.enterServerName': 'Enter server name',
|
||
'mcp.templateSaved': 'Template "{name}" saved successfully',
|
||
'mcp.templateSaveFailed': 'Failed to save template: {error}',
|
||
'mcp.templateNotFound': 'Template "{name}" not found',
|
||
'mcp.templateInstalled': 'Server "{name}" installed successfully',
|
||
'mcp.templateInstallFailed': 'Failed to install template: {error}',
|
||
'mcp.deleteTemplate': 'Delete Template',
|
||
'mcp.deleteTemplateConfirm': 'Delete template "{name}"?',
|
||
'mcp.templateDeleted': 'Template "{name}" deleted successfully',
|
||
'mcp.templateDeleteFailed': 'Failed to delete template: {error}',
|
||
'mcp.toProject': 'To Project',
|
||
'mcp.toGlobal': 'To Global',
|
||
|
||
// MCP CLI Mode
|
||
'mcp.cliMode': 'CLI Mode',
|
||
'mcp.claudeMode': 'Claude Mode',
|
||
'mcp.codexMode': 'Codex Mode',
|
||
|
||
// Codex MCP
|
||
'mcp.codex.globalServers': 'Codex Global MCP Servers',
|
||
'mcp.codex.newServer': 'New Server',
|
||
'mcp.codex.noServers': 'No Codex MCP servers configured',
|
||
'mcp.codex.noServersHint': 'Add servers via "codex mcp add" or create one here',
|
||
'mcp.codex.infoTitle': 'About Codex MCP',
|
||
'mcp.codex.infoDesc': 'Codex MCP servers are global only (stored in ~/.codex/config.toml). Use TOML format for configuration.',
|
||
'mcp.codex.serverAdded': 'Codex MCP server "{name}" added',
|
||
'mcp.codex.addFailed': 'Failed to add Codex MCP server',
|
||
'mcp.codex.serverRemoved': 'Codex MCP server "{name}" removed',
|
||
'mcp.codex.removeFailed': 'Failed to remove Codex MCP server',
|
||
'mcp.codex.serverToggled': 'Codex MCP server "{name}" {state}',
|
||
'mcp.codex.toggleFailed': 'Failed to toggle Codex MCP server',
|
||
'mcp.codex.remove': 'Remove',
|
||
'mcp.codex.removeConfirm': 'Remove Codex MCP server "{name}"?',
|
||
'mcp.codex.copyToClaude': 'Copy to Claude',
|
||
'mcp.codex.copyToCodex': 'Copy to Codex',
|
||
'mcp.codex.install': 'Install to Codex',
|
||
'mcp.codex.copyFromClaude': 'Copy Claude Servers to Codex',
|
||
'mcp.codex.alreadyAdded': 'Already in Codex',
|
||
'mcp.codex.scopeCodex': 'Codex - Global (~/.codex/config.toml)',
|
||
'mcp.codex.enabledTools': 'Tools',
|
||
'mcp.codex.tools': 'tools enabled',
|
||
|
||
// Claude to Codex copy
|
||
'mcp.claude.copyFromCodex': 'Copy Codex Servers to Claude',
|
||
'mcp.claude.alreadyAdded': 'Already in Claude',
|
||
'mcp.claude.copyToClaude': 'Copy to Claude Global',
|
||
'mcp.claude.copyToCodex': 'Copy to Codex',
|
||
|
||
// MCP Edit Modal
|
||
'mcp.editModal.title': 'Edit MCP Server',
|
||
'mcp.editModal.serverNamePlaceholder': 'server-name',
|
||
'mcp.editModal.onePerLine': 'one per line',
|
||
'mcp.editModal.save': 'Save Changes',
|
||
'mcp.editModal.delete': 'Delete',
|
||
'mcp.editModal.nameRequired': 'Server name is required',
|
||
'mcp.editModal.commandRequired': 'Command or URL is required',
|
||
'mcp.editModal.saved': 'MCP server "{name}" updated',
|
||
'mcp.editModal.saveFailed': 'Failed to save MCP server',
|
||
'mcp.editModal.deleteConfirm': 'Delete MCP server "{name}"?',
|
||
'mcp.editModal.deleted': 'MCP server "{name}" deleted',
|
||
'mcp.editModal.deleteFailed': 'Failed to delete MCP server',
|
||
'mcp.clickToEdit': 'Click to edit',
|
||
'mcp.clickToViewDetails': 'Click to view details',
|
||
|
||
// Hook Manager
|
||
'hook.projectHooks': 'Project Hooks',
|
||
'hook.projectFile': '.claude/settings.json',
|
||
'hook.newHook': 'New Hook',
|
||
'hook.hooksConfigured': 'hooks configured',
|
||
'hook.globalHooks': 'Global Hooks',
|
||
'hook.globalFile': '~/.claude/settings.json',
|
||
'hook.wizards': 'Hook Wizards',
|
||
'hook.guidedSetup': 'Guided Setup',
|
||
'hook.wizardsDesc': 'Configure complex hooks with guided wizards',
|
||
'hook.quickInstall': 'Quick Install Templates',
|
||
'hook.oneClick': 'One-click hook installation',
|
||
'hook.envVarsRef': 'Environment Variables Reference',
|
||
'hook.filePaths': 'Space-separated file paths affected',
|
||
'hook.toolName': 'Name of the tool being executed',
|
||
'hook.toolInput': 'JSON input passed to the tool',
|
||
'hook.sessionId': 'Current Claude session ID',
|
||
'hook.projectDir': 'Current project directory path',
|
||
'hook.workingDir': 'Current working directory',
|
||
'hook.openWizard': 'Open Wizard',
|
||
'hook.installed': 'Installed',
|
||
'hook.installProject': 'Install (Project)',
|
||
'hook.installGlobal': 'Global',
|
||
'hook.uninstall': 'Uninstall',
|
||
'hook.viewDetails': 'View template details',
|
||
'hook.edit': 'Edit hook',
|
||
'hook.delete': 'Delete hook',
|
||
'hook.deleteConfirm': 'Remove this {event} hook?',
|
||
|
||
// Hook Create Modal
|
||
'hook.createTitle': 'Create Hook',
|
||
'hook.event': 'Hook Event',
|
||
'hook.selectEvent': 'Select an event...',
|
||
'hook.preToolUse': 'PreToolUse - Before a tool is executed',
|
||
'hook.postToolUse': 'PostToolUse - After a tool completes',
|
||
'hook.notification': 'Notification - On notifications',
|
||
'hook.stop': 'Stop - When agent stops',
|
||
'hook.matcher': 'Matcher (optional)',
|
||
'hook.matcherPlaceholder': 'e.g., Write, Edit, Bash (leave empty for all)',
|
||
'hook.matcherHint': 'Tool name to match. Leave empty to match all tools.',
|
||
'hook.commandLabel': 'Command',
|
||
'hook.commandPlaceholder': 'e.g., curl, bash, node',
|
||
'hook.argsLabel': 'Arguments (one per line)',
|
||
'hook.scope': 'Scope',
|
||
'hook.scopeProject': 'Project (.claude/settings.json)',
|
||
'hook.scopeGlobal': 'Global (~/.claude/settings.json)',
|
||
'hook.quickTemplates': 'Quick Templates',
|
||
|
||
// Hook templates
|
||
'hook.template.ccwNotify': 'CCW Notify',
|
||
'hook.template.ccwNotifyDesc': 'Notify dashboard on Write',
|
||
'hook.template.logTool': 'Log Tool Usage',
|
||
'hook.template.logToolDesc': 'Log all tool executions',
|
||
'hook.template.lintCheck': 'Lint Check',
|
||
'hook.template.lintCheckDesc': 'Run eslint on file changes',
|
||
'hook.template.gitAdd': 'Git Add',
|
||
'hook.template.gitAddDesc': 'Auto stage written files',
|
||
|
||
// Hook Quick Install Templates
|
||
'hook.tpl.codexlensSync': 'CodexLens Auto-Sync',
|
||
'hook.tpl.codexlensSyncDesc': 'Auto-update code index when files are written or edited',
|
||
'hook.tpl.ccwDashboardNotify': 'CCW Dashboard Notify',
|
||
'hook.tpl.ccwDashboardNotifyDesc': 'Notify CCW dashboard when files are written',
|
||
'hook.tpl.toolLogger': 'Tool Usage Logger',
|
||
'hook.tpl.toolLoggerDesc': 'Log all tool executions to a file',
|
||
'hook.tpl.autoLint': 'Auto Lint Check',
|
||
'hook.tpl.autoLintDesc': 'Run ESLint on JavaScript/TypeScript files after write',
|
||
'hook.tpl.autoGitStage': 'Auto Git Stage',
|
||
'hook.tpl.autoGitStageDesc': 'Automatically stage written files to git',
|
||
|
||
// Hook Template Categories
|
||
'hook.category.indexing': 'indexing',
|
||
'hook.category.notification': 'notification',
|
||
'hook.category.logging': 'logging',
|
||
'hook.category.quality': 'quality',
|
||
'hook.category.git': 'git',
|
||
'hook.category.memory': 'memory',
|
||
'hook.category.skill': 'skill',
|
||
|
||
// Hook Wizard Templates
|
||
'hook.wizard.memoryUpdate': 'Memory Update Hook',
|
||
'hook.wizard.memoryUpdateDesc': 'Automatically update CLAUDE.md documentation based on code changes',
|
||
'hook.wizard.onSessionEnd': 'On Session End',
|
||
'hook.wizard.onSessionEndDesc': 'Update documentation when Claude session ends',
|
||
'hook.wizard.periodicUpdate': 'Periodic Update',
|
||
'hook.wizard.periodicUpdateDesc': 'Update documentation at regular intervals during session',
|
||
'hook.wizard.skillContext': 'SKILL Context Loader',
|
||
'hook.wizard.skillContextDesc': 'Automatically load SKILL packages based on keywords in user prompts',
|
||
'hook.wizard.keywordMatching': 'Keyword Matching',
|
||
'hook.wizard.keywordMatchingDesc': 'Load specific SKILLs when keywords are detected in prompt',
|
||
'hook.wizard.autoDetection': 'Auto Detection',
|
||
'hook.wizard.autoDetectionDesc': 'Automatically detect and load SKILLs by name in prompt',
|
||
'hook.wizard.memorySetup': 'Memory Module Setup',
|
||
'hook.wizard.memorySetupDesc': 'Configure automatic context tracking (lightweight metadata recording)',
|
||
'hook.wizard.fileReadTracker': 'File Read Tracker',
|
||
'hook.wizard.fileReadTrackerDesc': 'Track file reads to build context heatmap',
|
||
'hook.wizard.fileWriteTracker': 'File Write Tracker',
|
||
'hook.wizard.fileWriteTrackerDesc': 'Track file modifications to identify core modules',
|
||
'hook.wizard.promptTracker': 'Prompt Tracker',
|
||
'hook.wizard.promptTrackerDesc': 'Record user prompts for pattern analysis',
|
||
'hook.wizard.selectTrackers': 'Select Trackers',
|
||
|
||
// Hook Wizard Labels
|
||
'hook.wizard.cliTools': 'CLI Tools:',
|
||
'hook.wizard.event': 'Event:',
|
||
'hook.wizard.availableSkills': 'Available SKILLs:',
|
||
'hook.wizard.loading': 'Loading...',
|
||
'hook.wizard.matches': 'Matches:',
|
||
'hook.wizard.whenToTrigger': 'When to Trigger',
|
||
'hook.wizard.configuration': 'Configuration',
|
||
'hook.wizard.commandPreview': 'Generated Command Preview',
|
||
'hook.wizard.installTo': 'Install To',
|
||
'hook.wizard.installHook': 'Install Hook',
|
||
'hook.wizard.noSkillsConfigured': 'No SKILLs configured yet',
|
||
'hook.wizard.clickAddSkill': 'Click "Add SKILL" to configure keyword triggers',
|
||
'hook.wizard.configureSkills': 'Configure SKILLs',
|
||
'hook.wizard.addSkill': 'Add SKILL',
|
||
'hook.wizard.selectSkill': 'Select SKILL...',
|
||
'hook.wizard.triggerKeywords': 'Trigger Keywords (comma-separated)',
|
||
'hook.wizard.autoDetectionMode': 'Auto Detection Mode',
|
||
'hook.wizard.autoDetectionInfo': 'SKILLs will be automatically loaded when their name appears in your prompt.',
|
||
'hook.wizard.noSkillsFound': 'No SKILLs found. Create SKILL packages in .claude/skills/',
|
||
'hook.wizard.noSkillConfigs': '# No SKILL configurations yet',
|
||
'hook.wizard.cliTool': 'CLI Tool',
|
||
'hook.wizard.intervalSeconds': 'Interval (seconds)',
|
||
'hook.wizard.updateStrategy': 'Update Strategy',
|
||
'hook.wizard.toolForDocGen': 'Tool for documentation generation',
|
||
'hook.wizard.timeBetweenUpdates': 'Time between updates',
|
||
'hook.wizard.relatedStrategy': 'Related: changed modules, Single-layer: current directory',
|
||
|
||
// Lite Tasks
|
||
'lite.plan': 'PLAN',
|
||
'lite.fix': 'FIX',
|
||
'lite.summary': 'Summary',
|
||
'lite.rootCause': 'Root Cause',
|
||
'lite.fixStrategy': 'Fix Strategy',
|
||
'lite.approach': 'Approach',
|
||
'lite.userRequirements': 'User Requirements',
|
||
'lite.focusPaths': 'Focus Paths',
|
||
'lite.metadata': 'Metadata',
|
||
'lite.severity': 'Severity:',
|
||
'lite.riskLevel': 'Risk Level:',
|
||
'lite.estimatedTime': 'Estimated Time:',
|
||
'lite.complexity': 'Complexity:',
|
||
'lite.execution': 'Execution:',
|
||
'lite.fixTasks': 'Fix Tasks',
|
||
'lite.modificationPoints': 'Modification Points:',
|
||
'lite.implementationSteps': 'Implementation Steps:',
|
||
'lite.verification': 'Verification:',
|
||
'lite.rawJson': 'Raw JSON',
|
||
'lite.noPlanData': 'No Plan Data',
|
||
'lite.noPlanDataText': 'No {file} found for this session.',
|
||
'lite.diagnosisSummary': 'Diagnosis Summary',
|
||
'lite.diagnosisDetails': 'Diagnosis Details',
|
||
'lite.totalDiagnoses': 'Total Diagnoses:',
|
||
'lite.angles': 'Angles:',
|
||
|
||
// Modals
|
||
'modal.contentPreview': 'Content Preview',
|
||
'modal.raw': 'Raw',
|
||
'modal.preview': 'Preview',
|
||
'modal.templateDetails': 'Template Details',
|
||
'modal.sessionJson': 'Session JSON',
|
||
'modal.copyToClipboard': 'Copy to Clipboard',
|
||
|
||
// Toast messages
|
||
'toast.workspaceRefreshed': 'Workspace refreshed',
|
||
'toast.refreshFailed': 'Refresh failed: {error}',
|
||
'toast.statusUpdateRequires': 'Status update requires server mode',
|
||
'toast.bulkUpdateRequires': 'Bulk update requires server mode',
|
||
'toast.failedToUpdate': 'Failed to update status',
|
||
'toast.errorUpdating': 'Error updating status: {error}',
|
||
'toast.failedToBulkUpdate': 'Failed to bulk update',
|
||
'toast.errorInBulk': 'Error in bulk update: {error}',
|
||
'toast.enterPrompt': 'Please enter a prompt',
|
||
'toast.enterPath': 'Please enter a path',
|
||
'toast.commandCopied': 'Command copied: {command}',
|
||
'toast.runCommand': 'Run: {command}',
|
||
'toast.completed': 'Completed',
|
||
'toast.failed': 'Failed',
|
||
'toast.error': 'Error: {error}',
|
||
'toast.templateNotFound': 'Template not found',
|
||
|
||
// Footer
|
||
'footer.generated': 'Generated:',
|
||
'footer.version': 'CCW Dashboard v1.0',
|
||
|
||
// Prompt History
|
||
'prompt.timeline': 'Prompt Timeline',
|
||
'prompt.searchPlaceholder': 'Search prompts...',
|
||
'prompt.allProjects': 'All Projects',
|
||
'prompt.currentProject': 'Current Project',
|
||
'prompt.noPromptsFound': 'No Prompts Found',
|
||
'prompt.noPromptsText': 'No prompts found matching your search criteria.',
|
||
'prompt.insights': 'Insights & Suggestions',
|
||
'prompt.analyze': 'Analyze',
|
||
'prompt.analyzing': 'Analyzing...',
|
||
'prompt.selectTool': 'Select Tool',
|
||
'prompt.quality': 'Quality',
|
||
'prompt.intent': 'Intent',
|
||
'prompt.project': 'Project',
|
||
'prompt.session': 'Session',
|
||
'prompt.noInsights': 'No insights yet',
|
||
'prompt.noInsightsText': 'Select a CLI tool and click Analyze to generate insights.',
|
||
'prompt.loadingInsights': 'Generating insights...',
|
||
'prompt.insightsError': 'Failed to generate insights',
|
||
'prompt.intent.implement': 'Implement',
|
||
'prompt.intent.fix': 'Fix',
|
||
'prompt.intent.explore': 'Explore',
|
||
'prompt.intent.debug': 'Debug',
|
||
'prompt.intent.refactor': 'Refactor',
|
||
'prompt.intent.test': 'Test',
|
||
'prompt.intent.document': 'Document',
|
||
'prompt.intent.general': 'General',
|
||
'prompt.timeJustNow': 'Just now',
|
||
'prompt.timeMinutesAgo': '{count} min ago',
|
||
'prompt.timeHoursAgo': '{count} hours ago',
|
||
'prompt.timeDaysAgo': '{count} days ago',
|
||
|
||
// Memory Module
|
||
'memory.contextHotspots': 'Context Hotspots',
|
||
'memory.mostRead': 'Most Read Files',
|
||
'memory.mostEdited': 'Most Edited Files',
|
||
'memory.mostMentioned': 'Most Mentioned Topics',
|
||
'memory.today': 'Today',
|
||
'memory.week': 'Week',
|
||
'memory.allTime': 'All Time',
|
||
'memory.noData': 'No data available',
|
||
'memory.memoryGraph': 'Memory Graph',
|
||
'memory.nodes': 'nodes',
|
||
'memory.resetView': 'Reset View',
|
||
'memory.zoomIn': 'Zoom In',
|
||
'memory.zoomOut': 'Zoom Out',
|
||
'memory.fitView': 'Fit to View',
|
||
'memory.file': 'File',
|
||
'memory.module': 'Module',
|
||
'memory.component': 'Component',
|
||
'memory.noGraphData': 'No graph data available',
|
||
'memory.d3NotLoaded': 'D3.js not loaded',
|
||
'memory.recentContext': 'Recent Context',
|
||
'memory.activities': 'activities',
|
||
'memory.searchContext': 'Search context...',
|
||
'memory.noRecentActivity': 'No recent activity',
|
||
'memory.reads': 'Reads',
|
||
'memory.edits': 'Edits',
|
||
'memory.mentions': 'Mentions',
|
||
'memory.prompts': 'Prompts',
|
||
'memory.nodeDetails': 'Node Details',
|
||
'memory.heat': 'Heat',
|
||
'memory.associations': 'Associations',
|
||
'memory.type': 'Type',
|
||
'memory.relatedNodes': 'Related Nodes',
|
||
'memory.noAssociations': 'No associations found',
|
||
'memory.justNow': 'Just now',
|
||
'memory.minutesAgo': 'minutes ago',
|
||
'memory.hoursAgo': 'hours ago',
|
||
'memory.title': 'Memory',
|
||
'memory.activeMemory': 'Active Memory',
|
||
'memory.active': 'Active',
|
||
'memory.inactive': 'Inactive',
|
||
'memory.syncNow': 'Sync Now',
|
||
'memory.syncComplete': 'Sync complete',
|
||
'memory.syncError': 'Sync failed',
|
||
'memory.filesAnalyzed': 'files analyzed',
|
||
'memory.activeMemoryEnabled': 'Active Memory enabled',
|
||
'memory.activeMemoryDisabled': 'Active Memory disabled',
|
||
'memory.activeMemoryError': 'Failed to toggle Active Memory',
|
||
'memory.interval': 'Interval',
|
||
'memory.intervalManual': 'Manual',
|
||
'memory.minutes': 'min',
|
||
'memory.cliTool': 'CLI',
|
||
'memory.lastSync': 'Last sync',
|
||
'memory.autoSyncActive': 'Auto-sync',
|
||
'memory.configUpdated': 'Configuration updated',
|
||
'memory.configError': 'Failed to update configuration',
|
||
'memory.insightsHistory': 'Insights History',
|
||
'memory.insightsEmpty': 'No insights yet. Run an analysis to generate insights.',
|
||
'memory.insightPatterns': 'Patterns',
|
||
'memory.insightSuggestions': 'Suggestions',
|
||
'memory.insightDetail': 'Insight Detail',
|
||
'memory.insightDelete': 'Delete',
|
||
'memory.insightDeleteConfirm': 'Are you sure you want to delete this insight?',
|
||
'memory.insightDeleted': 'Insight deleted',
|
||
'memory.prompts': 'prompts',
|
||
'memory.refreshInsights': 'Refresh',
|
||
|
||
// Skills
|
||
'nav.skills': 'Skills',
|
||
'title.skillsManager': 'Skills Manager',
|
||
'skills.title': 'Skills Manager',
|
||
'skills.description': 'Manage Claude Code skills and capabilities',
|
||
'skills.create': 'Create Skill',
|
||
'skills.projectSkills': 'Project Skills',
|
||
'skills.userSkills': 'User Skills',
|
||
'skills.skillsCount': 'skills',
|
||
'skills.noProjectSkills': 'No project skills found',
|
||
'skills.createHint': 'Create a skill in .claude/skills/ to add capabilities',
|
||
'skills.noUserSkills': 'No user skills found',
|
||
'skills.userSkillsHint': 'User skills apply to all your projects',
|
||
'skills.noDescription': 'No description provided',
|
||
'skills.tools': 'tools',
|
||
'skills.files': 'files',
|
||
'skills.descriptionLabel': 'Description',
|
||
'skills.metadata': 'Metadata',
|
||
'skills.location': 'Location',
|
||
'skills.version': 'Version',
|
||
'skills.allowedTools': 'Allowed Tools',
|
||
'skills.supportingFiles': 'Supporting Files',
|
||
'skills.path': 'Path',
|
||
'skills.loadError': 'Failed to load skill details',
|
||
'skills.deleteConfirm': 'Are you sure you want to delete the skill "{name}"?',
|
||
'skills.deleted': 'Skill deleted successfully',
|
||
'skills.deleteError': 'Failed to delete skill',
|
||
'skills.editNotImplemented': 'Edit feature coming soon',
|
||
'skills.createNotImplemented': 'Create feature coming soon',
|
||
'skills.createSkill': 'Create Skill', 'skills.sourceFolder': 'Source Folder', 'skills.sourceFolderPlaceholder': 'Path to skill folder', 'skills.sourceFolderHint': 'Select a folder containing a valid SKILL.md file', 'skills.sourceFolderRequired': 'Source folder path is required', 'skills.customName': 'Custom Name', 'skills.customNamePlaceholder': 'Leave empty to use skill name from SKILL.md', 'skills.customNameHint': 'Optional: Override the skill name', 'skills.validate': 'Validate', 'skills.import': 'Import', 'skills.validating': 'Validating...', 'skills.validSkill': 'Valid Skill', 'skills.invalidSkill': 'Invalid Skill', 'skills.validateFirst': 'Please validate the skill folder first', 'skills.created': 'Skill "{name}" created successfully', 'skills.createError': 'Failed to create skill', 'skills.validationError': 'Validation failed', 'skills.enterFolderPath': 'Enter skill folder path', 'skills.name': 'Name',
|
||
'skills.createMode': 'Creation Mode',
|
||
'skills.importFolder': 'Import Folder',
|
||
'skills.importFolderHint': 'Import existing skill folder',
|
||
'skills.cliGenerate': 'CLI Generate',
|
||
'skills.cliGenerateHint': 'Generate using AI',
|
||
'skills.generationType': 'Generation Type',
|
||
'skills.fromDescription': 'From Description',
|
||
'skills.fromDescriptionHint': 'Describe what you need',
|
||
'skills.fromTemplate': 'From Template',
|
||
'skills.comingSoon': 'Coming soon',
|
||
'skills.skillName': 'Skill Name',
|
||
'skills.skillNamePlaceholder': 'e.g., code-review, testing-helper',
|
||
'skills.skillNameHint': 'Choose a descriptive name for the skill',
|
||
'skills.skillNameRequired': 'Skill name is required',
|
||
'skills.descriptionPlaceholder': 'Describe what this skill should help with...\nExample: Help review code for security vulnerabilities and best practices',
|
||
'skills.descriptionRequired': 'Description is required',
|
||
'skills.descriptionGenerateHint': 'Be specific about what the skill should do',
|
||
'skills.generating': 'Generating skill via CLI... This may take a few minutes.',
|
||
'skills.generated': 'Skill "{name}" generated successfully',
|
||
'skills.generateError': 'Failed to generate skill',
|
||
'skills.generate': 'Generate',
|
||
'skills.cliGenerateInfo': 'AI will generate a complete skill based on your description',
|
||
'skills.cliGenerateTimeHint': 'Generation may take a few minutes depending on complexity',
|
||
|
||
// Rules
|
||
'nav.rules': 'Rules',
|
||
'title.rulesManager': 'Rules Manager',
|
||
'rules.title': 'Rules Manager',
|
||
'rules.description': 'Manage project and user rules for Claude Code',
|
||
'rules.create': 'Create Rule',
|
||
'rules.projectRules': 'Project Rules',
|
||
'rules.userRules': 'User Rules',
|
||
'rules.rulesCount': 'rules',
|
||
'rules.noProjectRules': 'No project rules found',
|
||
'rules.createHint': 'Create rules in .claude/rules/ for project-specific instructions',
|
||
'rules.noUserRules': 'No user rules found',
|
||
'rules.userRulesHint': 'User rules apply to all your projects',
|
||
'rules.typeLabel': 'Type',
|
||
'rules.conditional': 'Conditional',
|
||
'rules.global': 'Global',
|
||
'rules.pathConditions': 'Path Conditions',
|
||
'rules.content': 'Content',
|
||
'rules.filePath': 'File Path',
|
||
'rules.loadError': 'Failed to load rule details',
|
||
'rules.deleteConfirm': 'Are you sure you want to delete the rule "{name}"?',
|
||
'rules.deleted': 'Rule deleted successfully',
|
||
'rules.deleteError': 'Failed to delete rule',
|
||
'rules.editNotImplemented': 'Edit feature coming soon',
|
||
'rules.createNotImplemented': 'Create feature coming soon',
|
||
'rules.createRule': 'Create Rule',
|
||
'rules.location': 'Location',
|
||
'rules.fileName': 'File Name',
|
||
'rules.fileNameHint': 'Must end with .md',
|
||
'rules.fileNameRequired': 'File name is required',
|
||
'rules.fileNameMustEndMd': 'File name must end with .md',
|
||
'rules.subdirectory': 'Subdirectory',
|
||
'rules.subdirectoryHint': 'Optional: Organize rules into subdirectories',
|
||
'rules.conditionalRule': 'Conditional Rule',
|
||
'rules.conditionalHint': 'Apply this rule only to specific file paths',
|
||
'rules.addPath': 'Add Path',
|
||
'rules.contentPlaceholder': 'Enter rule content in Markdown format...',
|
||
'rules.contentHint': 'Use Markdown to write rule instructions for Claude',
|
||
'rules.contentRequired': 'Content is required',
|
||
'rules.created': 'Rule "{name}" created successfully',
|
||
'rules.createError': 'Failed to create rule',
|
||
'rules.createMode': 'Creation Mode',
|
||
'rules.manualInput': 'Manual Input',
|
||
'rules.manualInputHint': 'Write content directly',
|
||
'rules.cliGenerate': 'CLI Generate',
|
||
'rules.cliGenerateHint': 'Auto-generate via AI',
|
||
'rules.generationType': 'Generation Type',
|
||
'rules.fromDescription': 'From Description',
|
||
'rules.fromTemplate': 'From Template',
|
||
'rules.fromCodeExtract': 'Extract from Code',
|
||
'rules.description': 'Description',
|
||
'rules.descriptionPlaceholder': 'Describe the rule purpose and instructions...',
|
||
'rules.descriptionHint': 'AI will generate rule content based on your description',
|
||
'rules.descriptionRequired': 'Description is required',
|
||
'rules.extractScope': 'Analysis Scope',
|
||
'rules.extractScopeHint': 'File patterns to analyze (e.g., src/**/*.ts)',
|
||
'rules.extractScopeRequired': 'Analysis scope is required',
|
||
'rules.extractFocus': 'Focus Areas',
|
||
'rules.extractFocusHint': 'Comma-separated aspects to focus on (e.g., naming, error-handling)',
|
||
'rules.cliGenerating': 'Generating rule via CLI (this may take a few minutes)...',
|
||
|
||
// CLAUDE.md Manager
|
||
'nav.claudeManager': 'CLAUDE.md',
|
||
'title.claudeManager': 'CLAUDE.md Manager',
|
||
'claudeManager.title': 'CLAUDE.md Files',
|
||
'claudeManager.files': 'files',
|
||
'claudeManager.userLevel': 'User Level',
|
||
'claudeManager.projectLevel': 'Project Level',
|
||
'claudeManager.moduleLevel': 'Module Level',
|
||
'claudeManager.noFile': 'No CLAUDE.md file',
|
||
'claudeManager.noModules': 'No module CLAUDE.md files',
|
||
'claudeManager.selectFile': 'Select a file to view',
|
||
'claudeManager.noMetadata': 'Select a file to see metadata',
|
||
'claudeManager.fileInfo': 'File Information',
|
||
'claudeManager.level': 'Level',
|
||
'claudeManager.level_user': 'User (~/.claude/)',
|
||
'claudeManager.level_project': 'Project (.claude/)',
|
||
'claudeManager.level_module': 'Module',
|
||
'claudeManager.path': 'Path',
|
||
'claudeManager.size': 'Size',
|
||
'claudeManager.modified': 'Modified',
|
||
'claudeManager.statistics': 'Statistics',
|
||
'claudeManager.lines': 'Lines',
|
||
'claudeManager.words': 'Words',
|
||
'claudeManager.characters': 'Characters',
|
||
'claudeManager.actions': 'Actions',
|
||
'claudeManager.loadError': 'Failed to load CLAUDE.md files',
|
||
'claudeManager.refreshed': 'Files refreshed successfully',
|
||
'claudeManager.unsavedChanges': 'You have unsaved changes. Discard them?',
|
||
'claudeManager.saved': 'File saved successfully',
|
||
'claudeManager.saveError': 'Failed to save file',
|
||
|
||
// Graph Explorer
|
||
'nav.graphExplorer': 'Graph',
|
||
'title.graphExplorer': 'Code Graph Explorer',
|
||
'graph.codeRelations': 'Code Relations',
|
||
'graph.searchProcess': 'Search Process',
|
||
'graph.nodeTypes': 'Node Types',
|
||
'graph.edgeTypes': 'Edge Types',
|
||
'graph.noProject': 'No project selected',
|
||
'graph.selectProject': 'Select a project to view its code graph',
|
||
'graph.loading': 'Loading graph data...',
|
||
'graph.noData': 'No graph data available',
|
||
'graph.indexProject': 'Please index this project with codex-lens first',
|
||
'graph.nodeDetails': 'Node Details',
|
||
'graph.selectNode': 'Select a node to view details',
|
||
'graph.impactAnalysis': 'Impact Analysis',
|
||
'graph.directDependents': 'Direct Dependents',
|
||
'graph.affectedFiles': 'Affected Files',
|
||
'graph.fitView': 'Fit View',
|
||
'graph.zoomIn': 'Zoom In',
|
||
'graph.zoomOut': 'Zoom Out',
|
||
'graph.resetLayout': 'Reset Layout',
|
||
'graph.title': 'Code Graph',
|
||
'graph.filters': 'Filters',
|
||
'graph.legend': 'Legend',
|
||
'graph.nodes': 'nodes',
|
||
'graph.edges': 'edges',
|
||
'graph.noGraphData': 'No graph data available. Index this project with codex-lens first.',
|
||
'graph.noSearchData': 'No search process data available.',
|
||
'graph.center': 'Center',
|
||
'graph.resetFilters': 'Reset Filters',
|
||
'graph.cytoscapeNotLoaded': 'Graph library not loaded',
|
||
'graph.impactAnalysisError': 'Failed to load impact analysis',
|
||
'graph.searchProcessDesc': 'Visualize how search queries flow through the system',
|
||
'graph.searchProcessTitle': 'Search Pipeline',
|
||
'graph.resultsFound': 'results found',
|
||
'graph.type': 'Type',
|
||
'graph.line': 'Line',
|
||
'graph.path': 'Path',
|
||
'graph.depth': 'Depth',
|
||
'graph.exports': 'Exports',
|
||
'graph.imports': 'Imports',
|
||
'graph.references': 'References',
|
||
'graph.symbolType': 'Symbol Type',
|
||
'graph.affectedSymbols': 'Affected Symbols',
|
||
|
||
// CLI Sync (used in claude-manager.js)
|
||
'claude.cliSync': 'CLI Auto-Sync',
|
||
'claude.tool': 'Tool',
|
||
'claude.mode': 'Mode',
|
||
'claude.syncButton': 'Sync with CLI',
|
||
'claude.syncing': 'Analyzing with {tool}...',
|
||
'claude.syncSuccess': '{file} synced successfully',
|
||
'claude.syncError': 'Sync failed: {error}',
|
||
'claude.modeUpdate': 'Update (Smart Merge)',
|
||
'claude.modeGenerate': 'Generate (Full Replace)',
|
||
'claude.modeAppend': 'Append',
|
||
'claude.searchPlaceholder': 'Search files...',
|
||
'claude.viewModeClaude': 'CLAUDE.md Only',
|
||
'claude.viewModeAll': 'All Files',
|
||
'claude.createFile': 'Create File',
|
||
'claude.createDialogTitle': 'Create CLAUDE.md File',
|
||
'claude.selectLevel': 'Level',
|
||
'claude.levelUser': 'User (~/.claude/)',
|
||
'claude.levelProject': 'Project (.claude/)',
|
||
'claude.levelModule': 'Module (custom path)',
|
||
'claude.modulePath': 'Module Path',
|
||
'claude.selectTemplate': 'Template',
|
||
'claude.templateDefault': 'Default',
|
||
'claude.templateMinimal': 'Minimal',
|
||
'claude.templateComprehensive': 'Comprehensive',
|
||
'claude.deleteFile': 'Delete File',
|
||
'claude.deleteConfirm': 'Are you sure you want to delete {file}?',
|
||
'claude.deleteWarning': 'This action cannot be undone.',
|
||
'claude.copyContent': 'Copy Content',
|
||
'claude.contentCopied': 'Content copied to clipboard',
|
||
'claude.copyError': 'Failed to copy content',
|
||
'claude.modulePathRequired': 'Module path is required',
|
||
'claude.fileCreated': 'File created successfully',
|
||
'claude.createFileError': 'Failed to create file',
|
||
'claude.fileDeleted': 'File deleted successfully',
|
||
'claude.deleteFileError': 'Failed to delete file',
|
||
'claude.loadAllFilesError': 'Failed to load all files',
|
||
'claude.unsupportedFileType': 'Unsupported file type',
|
||
'claude.loadFileError': 'Failed to load file',
|
||
|
||
// Common
|
||
'common.cancel': 'Cancel',
|
||
'common.optional': '(Optional)',
|
||
'common.create': 'Create',
|
||
'common.save': 'Save',
|
||
'common.delete': 'Delete',
|
||
'common.edit': 'Edit',
|
||
'common.close': 'Close',
|
||
'common.refresh': 'Refresh',
|
||
'common.loading': 'Loading...',
|
||
'common.error': 'Error',
|
||
'common.success': 'Success',
|
||
'common.warning': 'Warning',
|
||
'common.info': 'Info',
|
||
'common.remove': 'Remove',
|
||
'common.removeFromRecent': 'Remove from recent',
|
||
'common.noDescription': 'No description',
|
||
'common.saving': 'Saving...',
|
||
'common.saveFailed': 'Failed to save',
|
||
'common.unknownError': 'Unknown error',
|
||
'common.exception': 'Exception',
|
||
},
|
||
|
||
zh: {
|
||
// App title and brand
|
||
'app.title': 'CCW 控制面板',
|
||
'app.brand': 'Claude Code Workflow',
|
||
|
||
// Header
|
||
'header.project': '项目:',
|
||
'header.recentProjects': '最近项目',
|
||
'header.browse': '浏览...',
|
||
'header.refreshWorkspace': '刷新工作区',
|
||
'header.toggleTheme': '切换主题',
|
||
'header.language': '语言',
|
||
|
||
// Sidebar - Project section
|
||
'nav.project': '项目',
|
||
'nav.overview': '概览',
|
||
'nav.explorer': '文件浏览器',
|
||
'nav.status': '状态',
|
||
'nav.history': '历史',
|
||
'nav.memory': '记忆',
|
||
'nav.contextMemory': '活动',
|
||
'nav.promptHistory': '洞察',
|
||
|
||
// Sidebar - Sessions section
|
||
'nav.sessions': '会话',
|
||
'nav.all': '全部',
|
||
'nav.active': '活跃',
|
||
'nav.archived': '已归档',
|
||
|
||
// Sidebar - Lite Tasks section
|
||
'nav.liteTasks': '轻量任务',
|
||
'nav.litePlan': '轻量规划',
|
||
'nav.liteFix': '轻量修复',
|
||
|
||
// Sidebar - MCP section
|
||
'nav.mcpServers': 'MCP 服务器',
|
||
'nav.manage': '管理',
|
||
|
||
// Sidebar - Hooks section
|
||
'nav.hooks': '钩子',
|
||
|
||
// Sidebar - Footer
|
||
'nav.collapse': '收起',
|
||
'nav.expand': '展开',
|
||
|
||
// Stats cards
|
||
'stats.totalSessions': '总会话数',
|
||
'stats.activeSessions': '活跃会话',
|
||
'stats.totalTasks': '总任务数',
|
||
'stats.completedTasks': '已完成任务',
|
||
|
||
// Carousel
|
||
'carousel.noActiveSessions': '暂无活跃会话',
|
||
'carousel.previous': '上一个',
|
||
'carousel.next': '下一个',
|
||
'carousel.pause': '暂停自动播放',
|
||
|
||
// Content titles
|
||
'title.allSessions': '所有会话',
|
||
'title.activeSessions': '活跃会话',
|
||
'title.archivedSessions': '已归档会话',
|
||
'title.sessions': '会话',
|
||
'title.projectOverview': '项目概览',
|
||
'title.mcpManagement': 'MCP 服务器管理',
|
||
'title.fileExplorer': '文件浏览器',
|
||
'title.cliTools': 'CLI 工具 & CCW',
|
||
'title.cliHistory': 'CLI 执行历史',
|
||
'title.litePlanSessions': '轻量规划会话',
|
||
'title.liteFixSessions': '轻量修复会话',
|
||
'title.liteTasks': '轻量任务',
|
||
'title.sessionDetail': '会话详情',
|
||
'title.liteTaskDetail': '轻量任务详情',
|
||
'title.hookManager': '钩子管理',
|
||
'title.memoryModule': '记忆模块',
|
||
'title.promptHistory': '提示历史',
|
||
|
||
// Search
|
||
'search.placeholder': '搜索...',
|
||
|
||
// Session cards
|
||
'session.status.active': '活跃',
|
||
'session.status.archived': '已归档',
|
||
'session.status.planning': '规划中',
|
||
'session.tasks': '个任务',
|
||
'session.findings': '个发现',
|
||
'session.dimensions': '个维度',
|
||
'session.progress': '进度',
|
||
|
||
// Empty states
|
||
'empty.noSessions': '未找到会话',
|
||
'empty.noSessionsText': '没有符合当前筛选条件的工作流会话。',
|
||
'empty.noTasks': '暂无任务',
|
||
'empty.noTasksText': '该会话没有定义任务。',
|
||
'empty.noTaskFiles': '未找到任务文件',
|
||
'empty.noTaskFilesText': '在 .task/ 目录中未找到 IMPL-*.json 文件',
|
||
'empty.noLiteSessions': '暂无 {type} 会话',
|
||
'empty.noLiteSessionsText': '在 .workflow/.{type}/ 目录中未找到会话',
|
||
'empty.noMcpServers': '该项目未配置 MCP 服务器',
|
||
'empty.addMcpServersHint': '从下方可用列表中添加服务器',
|
||
'empty.noGlobalMcpServers': '未配置全局 MCP 服务器',
|
||
'empty.globalServersHint': '全局服务器对所有项目可用,来自 ~/.claude.json',
|
||
'empty.noAdditionalMcp': '其他项目中未找到其他 MCP 服务器',
|
||
'empty.noHooks': '该项目未配置钩子',
|
||
'empty.createHookHint': '创建钩子以自动化工具使用时的操作',
|
||
'empty.noGlobalHooks': '未配置全局钩子',
|
||
'empty.globalHooksHint': '全局钩子适用于所有 Claude Code 会话',
|
||
'empty.noDiagnoses': '暂无诊断',
|
||
'empty.noDiagnosesText': '未找到该会话的 diagnosis-*.json 文件。',
|
||
|
||
// Session detail tabs
|
||
'tab.tasks': '任务',
|
||
'tab.context': '上下文',
|
||
'tab.summary': '摘要',
|
||
'tab.implPlan': '实现计划',
|
||
'tab.conflict': '冲突',
|
||
'tab.review': '审查',
|
||
'tab.plan': '计划',
|
||
'tab.diagnoses': '诊断',
|
||
|
||
// Session detail
|
||
'detail.backToSessions': '返回会话列表',
|
||
'detail.backToLiteTasks': '返回 {type}',
|
||
'detail.created': '创建时间:',
|
||
'detail.archived': '归档时间:',
|
||
'detail.project': '项目:',
|
||
'detail.tasks': '任务:',
|
||
'detail.completed': '已完成',
|
||
|
||
// Task status
|
||
'task.status.pending': '待处理',
|
||
'task.status.inProgress': '进行中',
|
||
'task.status.completed': '已完成',
|
||
'task.completed': '已完成',
|
||
'task.inProgress': '进行中',
|
||
'task.pending': '待处理',
|
||
|
||
// Task actions
|
||
'task.quickActions': '快捷操作:',
|
||
'task.allPending': '全部待处理',
|
||
'task.allInProgress': '全部进行中',
|
||
'task.allCompleted': '全部完成',
|
||
'task.setAllConfirm': '将所有 {count} 个任务设置为"{status}"?',
|
||
'task.statusUpdated': '任务 {id} 状态已更新',
|
||
'task.tasksUpdated': '所有 {count} 个任务已更新',
|
||
'task.noPendingTasks': '没有待处理的任务',
|
||
'task.noInProgressTasks': '没有进行中的任务',
|
||
'task.movedToInProgress': '{count} 个任务已移至进行中',
|
||
'task.tasksCompleted': '{count} 个任务已完成',
|
||
|
||
// Context tab
|
||
'context.description': '描述:',
|
||
'context.requirements': '需求:',
|
||
'context.focusPaths': '关注路径:',
|
||
'context.modificationPoints': '修改点:',
|
||
'context.acceptance': '验收标准:',
|
||
'context.noData': '暂无上下文数据',
|
||
'context.loading': '正在加载上下文数据...',
|
||
'context.loadError': '加载上下文失败: {error}',
|
||
|
||
// Flow control
|
||
'flow.implementationApproach': '实现方案:',
|
||
'flow.preAnalysis': '预分析:',
|
||
'flow.targetFiles': '目标文件:',
|
||
'flow.noData': '暂无流程控制数据',
|
||
|
||
// Summary tab
|
||
'summary.loading': '正在加载摘要...',
|
||
'summary.title': '摘要',
|
||
'summary.hint': '会话摘要将从 .summaries/ 加载',
|
||
'summary.noSummaries': '暂无摘要',
|
||
'summary.noSummariesText': '在 .summaries/ 中未找到摘要',
|
||
|
||
// IMPL Plan tab
|
||
'implPlan.loading': '正在加载实现计划...',
|
||
'implPlan.title': '实现计划',
|
||
'implPlan.hint': '实现计划将从 IMPL_PLAN.md 加载',
|
||
|
||
// Review tab
|
||
'review.loading': '正在加载审查数据...',
|
||
'review.title': '审查数据',
|
||
'review.hint': '审查数据将从审查文件加载',
|
||
|
||
// CLI Manager
|
||
'cli.tools': 'CLI 工具',
|
||
'cli.available': '可用',
|
||
'cli.refreshStatus': '刷新状态',
|
||
'cli.ready': '就绪',
|
||
'cli.notInstalled': '未安装',
|
||
'cli.setDefault': '设为默认',
|
||
'cli.default': '默认',
|
||
'cli.install': '安装',
|
||
'cli.uninstall': '卸载',
|
||
'cli.initIndex': '初始化索引',
|
||
'cli.geminiDesc': 'Google AI 代码分析',
|
||
'cli.qwenDesc': '阿里通义 AI 助手',
|
||
'cli.codexDesc': 'OpenAI 代码生成',
|
||
'cli.codexLensDesc': '代码索引 & 全文搜索',
|
||
'cli.codexLensDescFull': '全文代码搜索引擎',
|
||
'cli.semanticDesc': 'AI 驱动的代码理解',
|
||
'cli.semanticDescFull': '自然语言代码搜索',
|
||
|
||
// CodexLens 配置
|
||
'codexlens.config': 'CodexLens 配置',
|
||
'codexlens.status': '状态',
|
||
'codexlens.installed': '已安装',
|
||
'codexlens.notInstalled': '未安装',
|
||
'codexlens.indexes': '索引',
|
||
'codexlens.currentWorkspace': '当前工作区',
|
||
'codexlens.indexStoragePath': '索引存储路径',
|
||
'codexlens.whereIndexesStored': '索引存储位置',
|
||
'codexlens.currentPath': '当前路径',
|
||
'codexlens.newStoragePath': '新存储路径',
|
||
'codexlens.pathPlaceholder': '例如:/path/to/indexes 或 ~/.codexlens/indexes',
|
||
'codexlens.pathInfo': '支持 ~ 表示用户目录。更改立即生效。',
|
||
'codexlens.migrationRequired': '需要迁移',
|
||
'codexlens.migrationWarning': '更改路径后,需要为每个工作区重新初始化索引。',
|
||
'codexlens.actions': '操作',
|
||
'codexlens.initializeIndex': '初始化索引',
|
||
'codexlens.cleanAllIndexes': '清理所有索引',
|
||
'codexlens.installCodexLens': '安装 CodexLens',
|
||
'codexlens.testSearch': '测试搜索',
|
||
'codexlens.testFunctionality': '测试 CodexLens 功能',
|
||
'codexlens.textSearch': '文本搜索',
|
||
'codexlens.fileSearch': '文件搜索',
|
||
'codexlens.symbolSearch': '符号搜索',
|
||
'codexlens.exactMode': '精确模式',
|
||
'codexlens.fuzzyMode': '模糊模式 (Trigram)',
|
||
'codexlens.hybridMode': '混合模式 (RRF)',
|
||
'codexlens.vectorMode': '向量模式 (语义搜索)',
|
||
'codexlens.searchPlaceholder': '输入搜索查询(例如:函数名、文件路径、代码片段)',
|
||
'codexlens.runSearch': '运行搜索',
|
||
'codexlens.results': '结果',
|
||
'codexlens.resultsCount': '个结果',
|
||
'codexlens.saveConfig': '保存配置',
|
||
'codexlens.searching': '搜索中...',
|
||
'codexlens.searchCompleted': '搜索完成',
|
||
'codexlens.searchFailed': '搜索失败',
|
||
'codexlens.enterQuery': '请输入搜索查询',
|
||
'codexlens.configSaved': '配置保存成功',
|
||
'codexlens.pathEmpty': '索引目录路径不能为空',
|
||
'codexlens.cleanConfirm': '确定要清理所有 CodexLens 索引吗?此操作无法撤销。',
|
||
'codexlens.cleaning': '清理索引中...',
|
||
'codexlens.cleanSuccess': '所有索引已成功清理',
|
||
'codexlens.cleanFailed': '清理索引失败',
|
||
'codexlens.loadingConfig': '加载配置中...',
|
||
|
||
// 模型管理
|
||
'codexlens.semanticDeps': '语义搜索依赖',
|
||
'codexlens.checkingDeps': '检查依赖中...',
|
||
'codexlens.semanticInstalled': '语义搜索依赖已安装',
|
||
'codexlens.semanticNotInstalled': '语义搜索依赖未安装',
|
||
'codexlens.installDeps': '安装依赖',
|
||
'codexlens.installingDeps': '安装依赖中...',
|
||
'codexlens.depsInstalled': '依赖安装成功',
|
||
'codexlens.depsInstallFailed': '依赖安装失败',
|
||
'codexlens.modelManagement': '模型管理',
|
||
'codexlens.loadingModels': '加载模型中...',
|
||
'codexlens.downloadModel': '下载',
|
||
'codexlens.deleteModel': '删除',
|
||
'codexlens.downloading': '下载中...',
|
||
'codexlens.deleting': '删除中...',
|
||
'codexlens.modelDownloaded': '模型已下载',
|
||
'codexlens.modelDownloadFailed': '模型下载失败',
|
||
'codexlens.modelDeleted': '模型已删除',
|
||
'codexlens.modelDeleteFailed': '模型删除失败',
|
||
'codexlens.deleteModelConfirm': '确定要删除模型',
|
||
|
||
// Semantic Search 配置
|
||
'semantic.settings': '语义搜索设置',
|
||
'semantic.configDesc': '配置语义索引的 LLM 增强功能',
|
||
'semantic.llmEnhancement': 'LLM 增强',
|
||
'semantic.llmDesc': '使用 LLM 生成代码摘要以改进语义搜索',
|
||
'semantic.primaryTool': '主 LLM 工具',
|
||
'semantic.fallbackTool': '备用工具',
|
||
'semantic.batchSize': '批处理大小',
|
||
'semantic.timeout': '超时时间',
|
||
'semantic.file': '个文件',
|
||
'semantic.files': '个文件',
|
||
'semantic.enhanceInfo': 'LLM 增强为每个文件生成代码摘要和关键词,提高语义搜索准确度。',
|
||
'semantic.enhanceCommand': '运行',
|
||
'semantic.enhanceAfterEnable': '启用后处理现有文件。',
|
||
'semantic.runEnhanceNow': '立即运行增强',
|
||
'semantic.viewStatus': '查看状态',
|
||
'semantic.testSearch': '测试语义搜索',
|
||
'semantic.searchPlaceholder': '输入语义查询(例如:身份验证逻辑、错误处理)',
|
||
'semantic.runSearch': '运行语义搜索',
|
||
'semantic.close': '关闭',
|
||
'semantic.enabled': '已启用',
|
||
'semantic.disabled': '已禁用',
|
||
'semantic.toolSetTo': '主 LLM 工具已设置为',
|
||
'semantic.fallbackSetTo': '备用工具已设置为',
|
||
'semantic.none': '无',
|
||
'semantic.llmEnhancement': 'LLM 增强',
|
||
'semantic.batchSetTo': '批量大小已设置为',
|
||
'semantic.timeoutSetTo': '超时已设置为',
|
||
'semantic.minute': '分钟',
|
||
'semantic.minutes': '分钟',
|
||
'semantic.enableFirst': '请先启用 LLM 增强',
|
||
|
||
'cli.settings': 'CLI 调用设置',
|
||
'cli.promptFormat': '提示词格式',
|
||
'cli.promptFormatDesc': '多轮对话拼接格式',
|
||
'cli.storageBackend': '存储后端',
|
||
'cli.storageBackendDesc': 'CLI 历史使用 SQLite 存储,支持全文搜索',
|
||
'cli.smartContext': '智能上下文',
|
||
'cli.smartContextDesc': '自动分析提示词并添加相关文件路径',
|
||
'cli.nativeResume': '原生恢复',
|
||
'cli.nativeResumeDesc': '使用工具原生恢复命令 (gemini -r, qwen --resume, codex resume)',
|
||
'cli.recursiveQuery': '递归查询',
|
||
'cli.recursiveQueryDesc': '聚合显示父项目和子项目的 CLI 历史与内存数据',
|
||
'cli.maxContextFiles': '最大上下文文件数',
|
||
'cli.maxContextFilesDesc': '智能上下文包含的最大文件数',
|
||
|
||
// CCW Install
|
||
'ccw.install': 'CCW 安装',
|
||
'ccw.installations': '个安装',
|
||
'ccw.installationsPlural': '个安装',
|
||
'ccw.noInstallations': '未找到安装',
|
||
'ccw.installCcw': '安装 CCW',
|
||
'ccw.upgrade': '升级',
|
||
'ccw.uninstall': '卸载',
|
||
'ccw.files': '个文件',
|
||
'ccw.globalInstall': '全局安装',
|
||
'ccw.globalInstallDesc': '安装到用户主目录 (~/.claude)',
|
||
'ccw.pathInstall': '路径安装',
|
||
'ccw.pathInstallDesc': '安装到指定项目文件夹',
|
||
'ccw.installPath': '安装路径',
|
||
'ccw.installToPath': '安装到路径',
|
||
'ccw.uninstallConfirm': '从此位置卸载 CCW?',
|
||
'ccw.upgradeStarting': '开始升级...',
|
||
'ccw.upgradeCompleted': '升级完成!正在刷新...',
|
||
'ccw.upgradeFailed': '升级失败: {error}',
|
||
|
||
// CCW Endpoint Tools
|
||
'ccw.endpointTools': 'CCW 端点工具',
|
||
'ccw.tool': '个工具',
|
||
'ccw.tools': '个工具',
|
||
'ccw.noEndpointTools': '未找到端点工具',
|
||
'ccw.parameters': '参数',
|
||
'ccw.required': '必填',
|
||
'ccw.optional': '可选',
|
||
'ccw.default': '默认值:',
|
||
'ccw.options': '选项:',
|
||
'ccw.noParams': '此工具没有参数',
|
||
'ccw.usageExample': '使用示例',
|
||
'ccw.endpointTool': '端点工具',
|
||
|
||
// Explorer
|
||
'explorer.title': '浏览器',
|
||
'explorer.refresh': '刷新',
|
||
'explorer.selectFile': '选择文件预览',
|
||
'explorer.selectFileHint': '从树中选择文件以预览其内容',
|
||
'explorer.loading': '正在加载文件树...',
|
||
'explorer.loadingFile': '正在加载文件...',
|
||
'explorer.emptyDir': '空目录',
|
||
'explorer.loadError': '加载失败: {error}',
|
||
'explorer.preview': '预览',
|
||
'explorer.source': '源码',
|
||
'explorer.lines': '行',
|
||
'explorer.updateClaudeMd': '更新 CLAUDE.md',
|
||
'explorer.currentFolderOnly': '更新 CLAUDE.md(仅当前文件夹)',
|
||
'explorer.withSubdirs': '更新 CLAUDE.md(包含子目录)',
|
||
|
||
// Task Queue
|
||
'taskQueue.title': '更新任务',
|
||
'taskQueue.cli': 'CLI:',
|
||
'taskQueue.addTask': '添加更新任务',
|
||
'taskQueue.startAll': '开始所有任务',
|
||
'taskQueue.clearCompleted': '清除已完成',
|
||
'taskQueue.noTasks': '队列中没有任务',
|
||
'taskQueue.noTasksHint': '悬停文件夹并点击图标添加任务',
|
||
'taskQueue.processing': '处理中...',
|
||
'taskQueue.updated': '更新成功',
|
||
'taskQueue.failed': '更新失败',
|
||
'taskQueue.currentOnly': '仅当前',
|
||
'taskQueue.withSubdirs': '含子目录',
|
||
'taskQueue.startingTasks': '正在并行启动 {count} 个任务...',
|
||
'taskQueue.queueCompleted': '队列完成: {success} 个成功, {failed} 个失败',
|
||
|
||
// Update CLAUDE.md Modal
|
||
'updateClaudeMd.title': '更新 CLAUDE.md',
|
||
'updateClaudeMd.targetDir': '目标目录',
|
||
'updateClaudeMd.cliTool': 'CLI 工具',
|
||
'updateClaudeMd.strategy': '策略',
|
||
'updateClaudeMd.singleLayer': '单层 - 仅当前目录 + 子 CLAUDE.md 引用',
|
||
'updateClaudeMd.multiLayer': '多层 - 在所有子目录生成 CLAUDE.md',
|
||
'updateClaudeMd.running': '正在更新...',
|
||
'updateClaudeMd.execute': '执行',
|
||
'updateClaudeMd.addToQueue': '添加到队列',
|
||
'updateClaudeMd.cancel': '取消',
|
||
|
||
// MCP Manager
|
||
'mcp.currentAvailable': '当前可用 MCP',
|
||
'mcp.installToProject': '安装到项目',
|
||
'mcp.installToGlobal': '安装到全局',
|
||
'mcp.installToWorkspace': '安装到工作空间',
|
||
'mcp.updateInWorkspace': '在工作空间更新',
|
||
'mcp.updateInGlobal': '在全局更新',
|
||
'mcp.projectAvailable': '当前可用 MCP',
|
||
'mcp.newServer': '新建服务器',
|
||
'mcp.newGlobalServer': '新建全局服务器',
|
||
'mcp.newProjectServer': '新建项目服务器',
|
||
'mcp.serversConfigured': '个服务器已配置',
|
||
'mcp.serversAvailable': 'servers available',
|
||
'mcp.globalAvailable': '全局可用 MCP',
|
||
'mcp.globalServersFrom': '个服务器来自 ~/.claude.json',
|
||
'mcp.enterprise': '企业 MCP 服务器',
|
||
'mcp.enterpriseManaged': '托管',
|
||
'mcp.enterpriseReadOnly': '个服务器(只读)',
|
||
'mcp.user': '用户 MCP 服务器',
|
||
'mcp.userServersFrom': '个服务器来自 ~/.claude.json',
|
||
'mcp.availableOther': '其他项目可用',
|
||
'mcp.serversAvailable': '个服务器可用',
|
||
'mcp.allProjects': '所有项目 MCP 概览',
|
||
'mcp.projects': '个项目',
|
||
'mcp.project': '项目',
|
||
'mcp.servers': 'MCP 服务器',
|
||
'mcp.status': '状态',
|
||
'mcp.current': '(当前)',
|
||
'mcp.noMcpServers': '无 MCP 服务器',
|
||
'mcp.add': '添加',
|
||
'mcp.addToProject': '添加到项目',
|
||
'mcp.installToProject': '安装到项目',
|
||
'mcp.installToGlobal': '安装到全局',
|
||
'mcp.installToProject': 'Install to project',
|
||
'mcp.installToGlobal': 'Install to global',
|
||
'mcp.removeFromProject': '从项目移除',
|
||
'mcp.removeConfirm': '从此项目移除 MCP 服务器 "{name}"?',
|
||
'mcp.readOnly': '只读',
|
||
'mcp.usedIn': '用于 {count} 个项目',
|
||
'mcp.usedInPlural': '用于 {count} 个项目',
|
||
'mcp.availableToAll': '可用于所有项目,来自 ~/.claude.json',
|
||
'mcp.managedByOrg': '由组织管理(最高优先级)',
|
||
'mcp.variables': '个变量',
|
||
'mcp.cmd': '命令',
|
||
'mcp.url': '地址',
|
||
'mcp.args': '参数',
|
||
'mcp.env': '环境变量',
|
||
'mcp.usedInCount': '用于 {count} 个项目',
|
||
'mcp.from': '来自',
|
||
'mcp.variant': '变体',
|
||
'mcp.sourceEnterprise': '企业级',
|
||
'mcp.sourceGlobal': '全局',
|
||
'mcp.sourceProject': '项目级',
|
||
'mcp.viewDetails': '查看详情',
|
||
'mcp.clickToViewDetails': '点击查看详情',
|
||
|
||
// MCP Details Modal
|
||
'mcp.detailsModal.title': 'MCP 服务器详情',
|
||
'mcp.detailsModal.close': '关闭',
|
||
'mcp.detailsModal.serverName': '服务器名称',
|
||
'mcp.detailsModal.source': '来源',
|
||
'mcp.detailsModal.configuration': '配置',
|
||
'mcp.detailsModal.noEnv': '无环境变量',
|
||
|
||
// MCP Create Modal
|
||
'mcp.createTitle': '创建 MCP 服务器',
|
||
'mcp.form': '表单',
|
||
'mcp.json': 'JSON',
|
||
'mcp.serverName': '服务器名称',
|
||
'mcp.serverNamePlaceholder': '例如: my-mcp-server',
|
||
'mcp.command': '命令',
|
||
'mcp.commandPlaceholder': '例如: npx, uvx, node, python',
|
||
'mcp.arguments': '参数(每行一个)',
|
||
'mcp.envVars': '环境变量(每行 KEY=VALUE)',
|
||
'mcp.pasteJson': '粘贴 MCP 服务器 JSON 配置',
|
||
'mcp.jsonFormatsHint': '支持 {"servers": {...}}、{"mcpServers": {...}} 和直接服务器配置格式。',
|
||
'mcp.previewServers': '预览(将添加的服务器):',
|
||
'mcp.create': '创建',
|
||
'mcp.chooseInstallLocation': '选择安装位置',
|
||
'mcp.installToClaudeJson': '安装到 .claude.json',
|
||
'mcp.installToMcpJson': '安装到 .mcp.json(推荐)',
|
||
'mcp.claudeJsonDesc': '保存在根目录 .claude.json projects 字段下(共享配置)',
|
||
'mcp.mcpJsonDesc': '保存在项目 .mcp.json 文件中(推荐用于版本控制)',
|
||
|
||
// New MCP Manager UI
|
||
'mcp.title': 'MCP 服务器管理',
|
||
'mcp.subtitle': '管理 Claude、Codex 和项目级别的 MCP 服务器配置',
|
||
'mcp.createNew': '创建新服务器',
|
||
'mcp.createFirst': '创建第一个服务器',
|
||
'mcp.noServers': '未配置 MCP 服务器',
|
||
'mcp.noServersDesc': '开始创建新的 MCP 服务器或从模板安装',
|
||
'mcp.totalServers': '总服务器数',
|
||
'mcp.enabled': '已启用',
|
||
'mcp.viewServer': '查看服务器',
|
||
'mcp.editServer': '编辑服务器',
|
||
'mcp.createServer': '创建服务器',
|
||
'mcp.updateServer': '更新服务器',
|
||
'mcp.close': '关闭',
|
||
'mcp.cancel': '取消',
|
||
'mcp.update': '更新',
|
||
'mcp.install': '安装',
|
||
'mcp.save': '保存',
|
||
'mcp.delete': '删除',
|
||
'mcp.optional': '可选',
|
||
'mcp.description': '描述',
|
||
'mcp.category': '分类',
|
||
'mcp.installTo': '安装到',
|
||
'mcp.cwd': '工作目录',
|
||
'mcp.httpHeaders': 'HTTP 头',
|
||
'mcp.error': '错误',
|
||
'mcp.success': '成功',
|
||
'mcp.nameRequired': '服务器名称为必填项',
|
||
'mcp.commandRequired': '命令为必填项',
|
||
'mcp.urlRequired': 'URL 为必填项',
|
||
'mcp.invalidArgsJson': '参数 JSON 格式无效',
|
||
'mcp.invalidEnvJson': '环境变量 JSON 格式无效',
|
||
'mcp.invalidHeadersJson': 'HTTP 头 JSON 格式无效',
|
||
'mcp.serverInstalled': '服务器安装成功',
|
||
'mcp.serverEnabled': '服务器启用成功',
|
||
'mcp.serverDisabled': '服务器禁用成功',
|
||
'mcp.serverDeleted': '服务器删除成功',
|
||
'mcp.backToManager': '返回管理器',
|
||
'mcp.noTemplates': '无可用模板',
|
||
'mcp.noTemplatesDesc': '从现有服务器创建模板或添加新模板',
|
||
'mcp.templatesDesc': '浏览并安装预配置的 MCP 服务器模板',
|
||
|
||
// MCP CLI Mode
|
||
'mcp.cliMode': 'CLI 模式',
|
||
'mcp.claudeMode': 'Claude 模式',
|
||
'mcp.codexMode': 'Codex 模式',
|
||
|
||
// Codex MCP
|
||
'mcp.codex.globalServers': 'Codex 全局 MCP 服务器',
|
||
'mcp.codex.newServer': '新建服务器',
|
||
'mcp.codex.noServers': '未配置 Codex MCP 服务器',
|
||
'mcp.codex.noServersHint': '使用 "codex mcp add" 命令或在此处创建',
|
||
'mcp.codex.infoTitle': '关于 Codex MCP',
|
||
'mcp.codex.infoDesc': 'Codex MCP 服务器仅支持全局配置(存储在 ~/.codex/config.toml)。使用 TOML 格式配置。',
|
||
'mcp.codex.serverAdded': 'Codex MCP 服务器 "{name}" 已添加',
|
||
'mcp.codex.addFailed': '添加 Codex MCP 服务器失败',
|
||
'mcp.codex.serverRemoved': 'Codex MCP 服务器 "{name}" 已移除',
|
||
'mcp.codex.removeFailed': '移除 Codex MCP 服务器失败',
|
||
'mcp.codex.serverToggled': 'Codex MCP 服务器 "{name}" 已{state}',
|
||
'mcp.codex.toggleFailed': '切换 Codex MCP 服务器失败',
|
||
'mcp.codex.remove': '移除',
|
||
'mcp.codex.removeConfirm': '移除 Codex MCP 服务器 "{name}"?',
|
||
'mcp.codex.copyToClaude': '复制到 Claude',
|
||
'mcp.codex.copyToCodex': '复制到 Codex',
|
||
'mcp.codex.install': '安装到 Codex',
|
||
'mcp.codex.copyFromClaude': '从 Claude 复制服务器到 Codex',
|
||
'mcp.codex.alreadyAdded': '已在 Codex 中',
|
||
'mcp.codex.scopeCodex': 'Codex - 全局 (~/.codex/config.toml)',
|
||
'mcp.codex.enabledTools': '工具',
|
||
'mcp.codex.tools': '个工具已启用',
|
||
|
||
// Claude to Codex copy
|
||
'mcp.claude.copyFromCodex': '从 Codex 复制服务器到 Claude',
|
||
'mcp.claude.alreadyAdded': '已在 Claude 中',
|
||
'mcp.claude.copyToClaude': '复制到 Claude 全局',
|
||
'mcp.claude.copyToCodex': '复制到 Codex',
|
||
|
||
// MCP Edit Modal
|
||
'mcp.editModal.title': '编辑 MCP 服务器',
|
||
'mcp.editModal.serverNamePlaceholder': 'server-name',
|
||
'mcp.editModal.onePerLine': '每行一个',
|
||
'mcp.editModal.save': '保存更改',
|
||
'mcp.editModal.delete': '删除',
|
||
'mcp.editModal.nameRequired': '服务器名称必填',
|
||
'mcp.editModal.commandRequired': '命令或 URL 必填',
|
||
'mcp.editModal.saved': 'MCP 服务器 "{name}" 已更新',
|
||
'mcp.editModal.saveFailed': '保存 MCP 服务器失败',
|
||
'mcp.editModal.deleteConfirm': '删除 MCP 服务器 "{name}"?',
|
||
'mcp.editModal.deleted': 'MCP 服务器 "{name}" 已删除',
|
||
'mcp.editModal.deleteFailed': '删除 MCP 服务器失败',
|
||
'mcp.clickToEdit': '点击编辑',
|
||
'mcp.clickToViewDetails': '点击查看详情',
|
||
|
||
// Hook Manager
|
||
'hook.projectHooks': '项目钩子',
|
||
'hook.projectFile': '.claude/settings.json',
|
||
'hook.newHook': '新建钩子',
|
||
'hook.hooksConfigured': '个钩子已配置',
|
||
'hook.globalHooks': '全局钩子',
|
||
'hook.globalFile': '~/.claude/settings.json',
|
||
'hook.wizards': '钩子向导',
|
||
'hook.guidedSetup': '引导设置',
|
||
'hook.wizardsDesc': '通过向导配置复杂钩子',
|
||
'hook.quickInstall': '快速安装模板',
|
||
'hook.oneClick': '一键安装钩子',
|
||
'hook.envVarsRef': '环境变量参考',
|
||
'hook.filePaths': '受影响文件的空格分隔路径',
|
||
'hook.toolName': '正在执行的工具名称',
|
||
'hook.toolInput': '传递给工具的 JSON 输入',
|
||
'hook.sessionId': '当前 Claude 会话 ID',
|
||
'hook.projectDir': '当前项目目录路径',
|
||
'hook.workingDir': '当前工作目录',
|
||
'hook.openWizard': '打开向导',
|
||
'hook.installed': '已安装',
|
||
'hook.installProject': '安装(项目)',
|
||
'hook.installGlobal': '全局',
|
||
'hook.uninstall': '卸载',
|
||
'hook.viewDetails': '查看模板详情',
|
||
'hook.edit': '编辑钩子',
|
||
'hook.delete': '删除钩子',
|
||
'hook.deleteConfirm': '删除此 {event} 钩子?',
|
||
|
||
// Hook Create Modal
|
||
'hook.createTitle': '创建钩子',
|
||
'hook.event': '钩子事件',
|
||
'hook.selectEvent': '选择事件...',
|
||
'hook.preToolUse': 'PreToolUse - 工具执行前',
|
||
'hook.postToolUse': 'PostToolUse - 工具完成后',
|
||
'hook.notification': 'Notification - 通知时',
|
||
'hook.stop': 'Stop - 代理停止时',
|
||
'hook.matcher': '匹配器(可选)',
|
||
'hook.matcherPlaceholder': '例如: Write, Edit, Bash(留空匹配所有)',
|
||
'hook.matcherHint': '要匹配的工具名称。留空匹配所有工具。',
|
||
'hook.commandLabel': '命令',
|
||
'hook.commandPlaceholder': '例如: curl, bash, node',
|
||
'hook.argsLabel': '参数(每行一个)',
|
||
'hook.scope': '作用域',
|
||
'hook.scopeProject': '项目(.claude/settings.json)',
|
||
'hook.scopeGlobal': '全局(~/.claude/settings.json)',
|
||
'hook.quickTemplates': '快速模板',
|
||
|
||
// Hook templates
|
||
'hook.template.ccwNotify': 'CCW 通知',
|
||
'hook.template.ccwNotifyDesc': '写入时通知控制面板',
|
||
'hook.template.logTool': '工具使用日志',
|
||
'hook.template.logToolDesc': '记录所有工具执行',
|
||
'hook.template.lintCheck': 'Lint 检查',
|
||
'hook.template.lintCheckDesc': '文件更改时运行 eslint',
|
||
'hook.template.gitAdd': 'Git 暂存',
|
||
'hook.template.gitAddDesc': '自动暂存写入的文件',
|
||
|
||
// Hook Quick Install Templates
|
||
'hook.tpl.codexlensSync': 'CodexLens 自动同步',
|
||
'hook.tpl.codexlensSyncDesc': '文件写入或编辑时自动更新代码索引',
|
||
'hook.tpl.ccwDashboardNotify': 'CCW 控制面板通知',
|
||
'hook.tpl.ccwDashboardNotifyDesc': '文件写入时通知 CCW 控制面板',
|
||
'hook.tpl.toolLogger': '工具使用记录器',
|
||
'hook.tpl.toolLoggerDesc': '将所有工具执行记录到文件',
|
||
'hook.tpl.autoLint': '自动 Lint 检查',
|
||
'hook.tpl.autoLintDesc': '写入后对 JavaScript/TypeScript 文件运行 ESLint',
|
||
'hook.tpl.autoGitStage': '自动 Git 暂存',
|
||
'hook.tpl.autoGitStageDesc': '自动将写入的文件添加到 Git 暂存区',
|
||
|
||
// Hook Template Categories
|
||
'hook.category.indexing': '索引',
|
||
'hook.category.notification': '通知',
|
||
'hook.category.logging': '日志',
|
||
'hook.category.quality': '质量',
|
||
'hook.category.git': 'Git',
|
||
'hook.category.memory': '记忆',
|
||
'hook.category.skill': '技能',
|
||
|
||
// Hook Wizard Templates
|
||
'hook.wizard.memoryUpdate': '记忆更新钩子',
|
||
'hook.wizard.memoryUpdateDesc': '根据代码更改自动更新 CLAUDE.md 文档',
|
||
'hook.wizard.onSessionEnd': '会话结束时',
|
||
'hook.wizard.onSessionEndDesc': 'Claude 会话结束时更新文档',
|
||
'hook.wizard.periodicUpdate': '定期更新',
|
||
'hook.wizard.periodicUpdateDesc': '会话期间定期更新文档',
|
||
'hook.wizard.skillContext': 'SKILL 上下文加载器',
|
||
'hook.wizard.skillContextDesc': '根据用户提示中的关键词自动加载 SKILL 包',
|
||
'hook.wizard.keywordMatching': '关键词匹配',
|
||
'hook.wizard.keywordMatchingDesc': '当提示中检测到关键词时加载特定 SKILL',
|
||
'hook.wizard.autoDetection': '自动检测',
|
||
'hook.wizard.autoDetectionDesc': '根据提示中的名称自动检测并加载 SKILL',
|
||
'hook.wizard.memorySetup': '记忆模块设置',
|
||
'hook.wizard.memorySetupDesc': '配置自动上下文跟踪(轻量级元数据记录)',
|
||
'hook.wizard.fileReadTracker': '文件读取追踪器',
|
||
'hook.wizard.fileReadTrackerDesc': '追踪文件读取以构建上下文热图',
|
||
'hook.wizard.fileWriteTracker': '文件写入追踪器',
|
||
'hook.wizard.fileWriteTrackerDesc': '追踪文件修改以识别核心模块',
|
||
'hook.wizard.promptTracker': '提示追踪器',
|
||
'hook.wizard.promptTrackerDesc': '记录用户提示用于模式分析',
|
||
'hook.wizard.selectTrackers': '选择追踪器',
|
||
|
||
// Hook Wizard Labels
|
||
'hook.wizard.cliTools': 'CLI 工具:',
|
||
'hook.wizard.event': '事件:',
|
||
'hook.wizard.availableSkills': '可用 SKILL:',
|
||
'hook.wizard.loading': '加载中...',
|
||
'hook.wizard.matches': '匹配:',
|
||
'hook.wizard.whenToTrigger': '触发时机',
|
||
'hook.wizard.configuration': '配置',
|
||
'hook.wizard.commandPreview': '生成的命令预览',
|
||
'hook.wizard.installTo': '安装到',
|
||
'hook.wizard.installHook': '安装钩子',
|
||
'hook.wizard.noSkillsConfigured': '尚未配置任何 SKILL',
|
||
'hook.wizard.clickAddSkill': '点击"添加 SKILL"配置关键词触发器',
|
||
'hook.wizard.configureSkills': '配置 SKILL',
|
||
'hook.wizard.addSkill': '添加 SKILL',
|
||
'hook.wizard.selectSkill': '选择 SKILL...',
|
||
'hook.wizard.triggerKeywords': '触发关键词(逗号分隔)',
|
||
'hook.wizard.autoDetectionMode': '自动检测模式',
|
||
'hook.wizard.autoDetectionInfo': '当 SKILL 名称出现在提示中时将自动加载。',
|
||
'hook.wizard.noSkillsFound': '未找到 SKILL。请在 .claude/skills/ 中创建 SKILL 包',
|
||
'hook.wizard.noSkillConfigs': '# 尚未配置 SKILL',
|
||
'hook.wizard.cliTool': 'CLI 工具',
|
||
'hook.wizard.intervalSeconds': '间隔(秒)',
|
||
'hook.wizard.updateStrategy': '更新策略',
|
||
'hook.wizard.toolForDocGen': '用于生成文档的工具',
|
||
'hook.wizard.timeBetweenUpdates': '更新之间的时间间隔',
|
||
'hook.wizard.relatedStrategy': 'related: 已更改的模块, single-layer: 当前目录',
|
||
|
||
// Lite Tasks
|
||
'lite.plan': '规划',
|
||
'lite.fix': '修复',
|
||
'lite.summary': '摘要',
|
||
'lite.rootCause': '根本原因',
|
||
'lite.fixStrategy': '修复策略',
|
||
'lite.approach': '方法',
|
||
'lite.userRequirements': '用户需求',
|
||
'lite.focusPaths': '关注路径',
|
||
'lite.metadata': '元数据',
|
||
'lite.severity': '严重性:',
|
||
'lite.riskLevel': '风险等级:',
|
||
'lite.estimatedTime': '预计时间:',
|
||
'lite.complexity': '复杂度:',
|
||
'lite.execution': '执行:',
|
||
'lite.fixTasks': '修复任务',
|
||
'lite.modificationPoints': '修改点:',
|
||
'lite.implementationSteps': '实现步骤:',
|
||
'lite.verification': '验证:',
|
||
'lite.rawJson': '原始 JSON',
|
||
'lite.noPlanData': '暂无计划数据',
|
||
'lite.noPlanDataText': '未找到该会话的 {file}。',
|
||
'lite.diagnosisSummary': '诊断摘要',
|
||
'lite.diagnosisDetails': '诊断详情',
|
||
'lite.totalDiagnoses': '总诊断数:',
|
||
'lite.angles': '分析角度:',
|
||
|
||
// Modals
|
||
'modal.contentPreview': '内容预览',
|
||
'modal.raw': '原始',
|
||
'modal.preview': '预览',
|
||
'modal.templateDetails': '模板详情',
|
||
'modal.sessionJson': '会话 JSON',
|
||
'modal.copyToClipboard': '复制到剪贴板',
|
||
|
||
// Toast messages
|
||
'toast.workspaceRefreshed': '工作区已刷新',
|
||
'toast.refreshFailed': '刷新失败: {error}',
|
||
'toast.statusUpdateRequires': '状态更新需要服务器模式',
|
||
'toast.bulkUpdateRequires': '批量更新需要服务器模式',
|
||
'toast.failedToUpdate': '更新状态失败',
|
||
'toast.errorUpdating': '更新状态出错: {error}',
|
||
'toast.failedToBulkUpdate': '批量更新失败',
|
||
'toast.errorInBulk': '批量更新出错: {error}',
|
||
'toast.enterPrompt': '请输入提示',
|
||
'toast.enterPath': '请输入路径',
|
||
'toast.commandCopied': '命令已复制: {command}',
|
||
'toast.runCommand': '运行: {command}',
|
||
'toast.completed': '已完成',
|
||
'toast.failed': '失败',
|
||
'toast.error': '错误: {error}',
|
||
'toast.templateNotFound': '未找到模板',
|
||
|
||
// Footer
|
||
'footer.generated': '生成时间:',
|
||
'footer.version': 'CCW 控制面板 v1.0',
|
||
|
||
// Prompt History
|
||
'prompt.timeline': '提示词时间线',
|
||
'prompt.searchPlaceholder': '搜索提示词...',
|
||
'prompt.allProjects': '所有项目',
|
||
'prompt.currentProject': '当前项目',
|
||
'prompt.noPromptsFound': '未找到提示词',
|
||
'prompt.noPromptsText': '没有符合搜索条件的提示词。',
|
||
'prompt.insights': '洞察与建议',
|
||
'prompt.analyze': '分析',
|
||
'prompt.analyzing': '分析中...',
|
||
'prompt.selectTool': '选择工具',
|
||
'prompt.quality': '质量',
|
||
'prompt.intent': '意图',
|
||
'prompt.project': '项目',
|
||
'prompt.session': '会话',
|
||
'prompt.noInsights': '暂无洞察',
|
||
'prompt.noInsightsText': '选择 CLI 工具并点击分析以生成洞察。',
|
||
'prompt.loadingInsights': '正在生成洞察...',
|
||
'prompt.insightsError': '生成洞察失败',
|
||
'prompt.intent.implement': '实现',
|
||
'prompt.intent.fix': '修复',
|
||
'prompt.intent.explore': '探索',
|
||
'prompt.intent.debug': '调试',
|
||
'prompt.intent.refactor': '重构',
|
||
'prompt.intent.test': '测试',
|
||
'prompt.intent.document': '文档',
|
||
'prompt.intent.general': '通用',
|
||
'prompt.timeJustNow': '刚刚',
|
||
'prompt.timeMinutesAgo': '{count} 分钟前',
|
||
'prompt.timeHoursAgo': '{count} 小时前',
|
||
'prompt.timeDaysAgo': '{count} 天前',
|
||
|
||
// Memory Module
|
||
'memory.contextHotspots': '上下文热点',
|
||
'memory.mostRead': '最常读取的文件',
|
||
'memory.mostEdited': '最常编辑的文件',
|
||
'memory.mostMentioned': '最常提及的话题',
|
||
'memory.today': '今天',
|
||
'memory.week': '本周',
|
||
'memory.allTime': '全部时间',
|
||
'memory.noData': '无可用数据',
|
||
'memory.memoryGraph': '记忆图谱',
|
||
'memory.nodes': '节点',
|
||
'memory.resetView': '重置视图',
|
||
'memory.zoomIn': '放大',
|
||
'memory.zoomOut': '缩小',
|
||
'memory.fitView': '自适应',
|
||
'memory.file': '文件',
|
||
'memory.module': '模块',
|
||
'memory.component': '组件',
|
||
'memory.noGraphData': '无图谱数据',
|
||
'memory.d3NotLoaded': 'D3.js 未加载',
|
||
'memory.recentContext': '最近上下文',
|
||
'memory.activities': '活动',
|
||
'memory.searchContext': '搜索上下文...',
|
||
'memory.noRecentActivity': '无最近活动',
|
||
'memory.reads': '读取',
|
||
'memory.edits': '编辑',
|
||
'memory.mentions': '提及',
|
||
'memory.prompts': '提示',
|
||
'memory.nodeDetails': '节点详情',
|
||
'memory.heat': '热度',
|
||
'memory.associations': '关联',
|
||
'memory.type': '类型',
|
||
'memory.relatedNodes': '相关节点',
|
||
'memory.noAssociations': '未找到关联',
|
||
'memory.justNow': '刚刚',
|
||
'memory.minutesAgo': '分钟前',
|
||
'memory.hoursAgo': '小时前',
|
||
'memory.title': '记忆',
|
||
'memory.activeMemory': '活动记忆',
|
||
'memory.active': '已启用',
|
||
'memory.inactive': '未启用',
|
||
'memory.syncNow': '立即同步',
|
||
'memory.syncComplete': '同步完成',
|
||
'memory.syncError': '同步失败',
|
||
'memory.filesAnalyzed': '个文件已分析',
|
||
'memory.activeMemoryEnabled': '活动记忆已启用',
|
||
'memory.activeMemoryDisabled': '活动记忆已禁用',
|
||
'memory.activeMemoryError': '切换活动记忆失败',
|
||
'memory.interval': '间隔',
|
||
'memory.intervalManual': '手动',
|
||
'memory.minutes': '分钟',
|
||
'memory.cliTool': 'CLI',
|
||
'memory.lastSync': '上次同步',
|
||
'memory.autoSyncActive': '自动同步',
|
||
'memory.configUpdated': '配置已更新',
|
||
'memory.configError': '配置更新失败',
|
||
'memory.insightsHistory': '洞察历史',
|
||
'memory.insightsEmpty': '暂无洞察记录。运行分析以生成洞察。',
|
||
'memory.insightPatterns': '模式',
|
||
'memory.insightSuggestions': '建议',
|
||
'memory.insightDetail': '洞察详情',
|
||
'memory.insightDelete': '删除',
|
||
'memory.insightDeleteConfirm': '确定要删除此洞察吗?',
|
||
'memory.insightDeleted': '洞察已删除',
|
||
'memory.prompts': '提示',
|
||
'memory.refreshInsights': '刷新',
|
||
|
||
// Skills
|
||
'nav.skills': '技能',
|
||
'title.skillsManager': '技能管理',
|
||
'skills.title': '技能管理',
|
||
'skills.description': '管理 Claude Code 的技能和能力',
|
||
'skills.create': '创建技能',
|
||
'skills.projectSkills': '项目技能',
|
||
'skills.userSkills': '用户技能',
|
||
'skills.skillsCount': '个技能',
|
||
'skills.noProjectSkills': '未找到项目技能',
|
||
'skills.createHint': '在 .claude/skills/ 中创建技能以添加功能',
|
||
'skills.noUserSkills': '未找到用户技能',
|
||
'skills.userSkillsHint': '用户技能适用于所有项目',
|
||
'skills.noDescription': '无描述',
|
||
'skills.tools': '工具',
|
||
'skills.files': '文件',
|
||
'skills.descriptionLabel': '描述',
|
||
'skills.metadata': '元数据',
|
||
'skills.location': '位置',
|
||
'skills.version': '版本',
|
||
'skills.allowedTools': '允许的工具',
|
||
'skills.supportingFiles': '支持文件',
|
||
'skills.path': '路径',
|
||
'skills.loadError': '加载技能详情失败',
|
||
'skills.deleteConfirm': '确定要删除技能 "{name}" 吗?',
|
||
'skills.deleted': '技能删除成功',
|
||
'skills.deleteError': '删除技能失败',
|
||
'skills.editNotImplemented': '编辑功能即将推出',
|
||
'skills.createNotImplemented': '创建功能即将推出',
|
||
'skills.createSkill': '创建技能', 'skills.sourceFolder': '源文件夹', 'skills.sourceFolderPlaceholder': '技能文件夹路径', 'skills.sourceFolderHint': '选择包含有效 SKILL.md 文件的文件夹', 'skills.sourceFolderRequired': '源文件夹路径是必需的', 'skills.customName': '自定义名称', 'skills.customNamePlaceholder': '留空则使用 SKILL.md 中的技能名称', 'skills.customNameHint': '可选:覆盖技能名称', 'skills.validate': '验证', 'skills.import': '导入', 'skills.validating': '验证中...', 'skills.validSkill': '有效技能', 'skills.invalidSkill': '无效技能', 'skills.validateFirst': '请先验证技能文件夹', 'skills.created': '技能 "{name}" 创建成功', 'skills.createError': '创建技能失败', 'skills.validationError': '验证失败', 'skills.enterFolderPath': '输入技能文件夹路径', 'skills.name': '名称',
|
||
'skills.createMode': '创建模式',
|
||
'skills.importFolder': '导入文件夹',
|
||
'skills.importFolderHint': '导入现有技能文件夹',
|
||
'skills.cliGenerate': 'CLI生成',
|
||
'skills.cliGenerateHint': '使用AI生成',
|
||
'skills.generationType': '生成类型',
|
||
'skills.fromDescription': '从描述生成',
|
||
'skills.fromDescriptionHint': '描述你需要的功能',
|
||
'skills.fromTemplate': '从模板生成',
|
||
'skills.comingSoon': '即将推出',
|
||
'skills.skillName': '技能名称',
|
||
'skills.skillNamePlaceholder': '例如:代码审查、测试助手',
|
||
'skills.skillNameHint': '为技能选择一个描述性的名称',
|
||
'skills.skillNameRequired': '技能名称是必需的',
|
||
'skills.descriptionPlaceholder': '描述这个技能应该帮助什么...\n例如:帮助审查代码的安全漏洞和最佳实践',
|
||
'skills.descriptionRequired': '描述是必需的',
|
||
'skills.descriptionGenerateHint': '具体说明技能应该做什么',
|
||
'skills.generating': '正在通过 CLI 生成技能...这可能需要几分钟。',
|
||
'skills.generated': '技能 "{name}" 生成成功',
|
||
'skills.generateError': '生成技能失败',
|
||
'skills.generate': '生成',
|
||
'skills.cliGenerateInfo': 'AI 将根据你的描述生成完整的技能',
|
||
'skills.cliGenerateTimeHint': '生成时间取决于复杂度,可能需要几分钟',
|
||
|
||
// Rules
|
||
'nav.rules': '规则',
|
||
'title.rulesManager': '规则管理',
|
||
'rules.title': '规则管理',
|
||
'rules.description': '管理 Claude Code 的项目和用户规则',
|
||
'rules.create': '创建规则',
|
||
'rules.projectRules': '项目规则',
|
||
'rules.userRules': '用户规则',
|
||
'rules.rulesCount': '条规则',
|
||
'rules.noProjectRules': '未找到项目规则',
|
||
'rules.createHint': '在 .claude/rules/ 中创建规则以设置项目特定指令',
|
||
'rules.noUserRules': '未找到用户规则',
|
||
'rules.userRulesHint': '用户规则适用于所有项目',
|
||
'rules.typeLabel': '类型',
|
||
'rules.conditional': '条件规则',
|
||
'rules.global': '全局规则',
|
||
'rules.pathConditions': '路径条件',
|
||
'rules.content': '内容',
|
||
'rules.filePath': '文件路径',
|
||
'rules.loadError': '加载规则详情失败',
|
||
'rules.deleteConfirm': '确定要删除规则 "{name}" 吗?',
|
||
'rules.deleted': '规则删除成功',
|
||
'rules.deleteError': '删除规则失败',
|
||
'rules.editNotImplemented': '编辑功能即将推出',
|
||
'rules.createNotImplemented': '创建功能即将推出',
|
||
'rules.createRule': '创建规则',
|
||
'rules.location': '位置',
|
||
'rules.fileName': '文件名',
|
||
'rules.fileNameHint': '必须以 .md 结尾',
|
||
'rules.fileNameRequired': '文件名是必需的',
|
||
'rules.fileNameMustEndMd': '文件名必须以 .md 结尾',
|
||
'rules.subdirectory': '子目录',
|
||
'rules.subdirectoryHint': '可选:将规则组织到子目录中',
|
||
'rules.conditionalRule': '条件规则',
|
||
'rules.conditionalHint': '仅对特定文件路径应用此规则',
|
||
'rules.addPath': '添加路径',
|
||
'rules.contentPlaceholder': '以 Markdown 格式输入规则内容...',
|
||
'rules.contentHint': '使用 Markdown 为 Claude 编写规则说明',
|
||
'rules.contentRequired': '内容是必需的',
|
||
'rules.created': '规则 "{name}" 创建成功',
|
||
'rules.createError': '创建规则失败',
|
||
'rules.createMode': '创建模式',
|
||
'rules.manualInput': '手动输入',
|
||
'rules.manualInputHint': '直接编写内容',
|
||
'rules.cliGenerate': 'CLI生成',
|
||
'rules.cliGenerateHint': '通过AI自动生成',
|
||
'rules.generationType': '生成类型',
|
||
'rules.fromDescription': '从描述生成',
|
||
'rules.fromTemplate': '从模板生成',
|
||
'rules.fromCodeExtract': '从代码提取',
|
||
'rules.description': '描述',
|
||
'rules.descriptionPlaceholder': '描述规则目的和说明...',
|
||
'rules.descriptionHint': 'AI将根据您的描述生成规则内容',
|
||
'rules.descriptionRequired': '描述是必需的',
|
||
'rules.extractScope': '分析范围',
|
||
'rules.extractScopeHint': '要分析的文件模式(例如:src/**/*.ts)',
|
||
'rules.extractScopeRequired': '分析范围是必需的',
|
||
'rules.extractFocus': '关注领域',
|
||
'rules.extractFocusHint': '以逗号分隔的关注方面(例如:命名规范, 错误处理)',
|
||
'rules.cliGenerating': '正在通过 CLI 生成规则(可能需要几分钟)...',
|
||
|
||
// CLAUDE.md Manager
|
||
'nav.claudeManager': 'CLAUDE.md',
|
||
'title.claudeManager': 'CLAUDE.md 管理器',
|
||
'claudeManager.title': 'CLAUDE.md 文件',
|
||
'claudeManager.files': '个文件',
|
||
'claudeManager.userLevel': '用户级',
|
||
'claudeManager.projectLevel': '项目级',
|
||
'claudeManager.moduleLevel': '模块级',
|
||
'claudeManager.noFile': '无 CLAUDE.md 文件',
|
||
'claudeManager.noModules': '无模块 CLAUDE.md 文件',
|
||
'claudeManager.selectFile': '选择文件以查看',
|
||
'claudeManager.noMetadata': '选择文件以查看元数据',
|
||
'claudeManager.fileInfo': '文件信息',
|
||
'claudeManager.level': '级别',
|
||
'claudeManager.level_user': '用户级 (~/.claude/)',
|
||
'claudeManager.level_project': '项目级 (.claude/)',
|
||
'claudeManager.level_module': '模块级',
|
||
'claudeManager.path': '路径',
|
||
'claudeManager.size': '大小',
|
||
'claudeManager.modified': '修改时间',
|
||
'claudeManager.statistics': '统计信息',
|
||
'claudeManager.lines': '行数',
|
||
'claudeManager.words': '字数',
|
||
'claudeManager.characters': '字符数',
|
||
'claudeManager.actions': '操作',
|
||
'claudeManager.loadError': '加载 CLAUDE.md 文件失败',
|
||
'claudeManager.refreshed': '文件刷新成功',
|
||
'claudeManager.unsavedChanges': '您有未保存的更改。是否放弃?',
|
||
'claudeManager.saved': '文件保存成功',
|
||
'claudeManager.saveError': '文件保存失败',
|
||
|
||
// Graph Explorer
|
||
'nav.graphExplorer': '图谱',
|
||
'title.graphExplorer': '代码图谱浏览器',
|
||
'graph.codeRelations': '代码关系',
|
||
'graph.searchProcess': '搜索过程',
|
||
'graph.nodeTypes': '节点类型',
|
||
'graph.edgeTypes': '边类型',
|
||
'graph.noProject': '未选择项目',
|
||
'graph.selectProject': '选择一个项目以查看其代码图谱',
|
||
'graph.loading': '正在加载图谱数据...',
|
||
'graph.noData': '无图谱数据',
|
||
'graph.indexProject': '请先使用 codex-lens 为此项目建立索引',
|
||
'graph.nodeDetails': '节点详情',
|
||
'graph.selectNode': '选择节点以查看详情',
|
||
'graph.impactAnalysis': '影响分析',
|
||
'graph.directDependents': '直接依赖',
|
||
'graph.affectedFiles': '受影响文件',
|
||
'graph.fitView': '适应视图',
|
||
'graph.zoomIn': '放大',
|
||
'graph.zoomOut': '缩小',
|
||
'graph.resetLayout': '重置布局',
|
||
'graph.title': '代码图谱',
|
||
'graph.filters': '筛选器',
|
||
'graph.legend': '图例',
|
||
'graph.nodes': '个节点',
|
||
'graph.edges': '条边',
|
||
'graph.noGraphData': '无图谱数据。请先使用 codex-lens 为此项目建立索引。',
|
||
'graph.noSearchData': '无搜索过程数据。',
|
||
'graph.center': '居中',
|
||
'graph.resetFilters': '重置筛选',
|
||
'graph.cytoscapeNotLoaded': '图谱库未加载',
|
||
'graph.impactAnalysisError': '加载影响分析失败',
|
||
'graph.searchProcessDesc': '可视化搜索查询在系统中的流转过程',
|
||
'graph.searchProcessTitle': '搜索管道',
|
||
'graph.resultsFound': '个结果',
|
||
'graph.type': '类型',
|
||
'graph.line': '行号',
|
||
'graph.path': '路径',
|
||
'graph.depth': '深度',
|
||
'graph.exports': '导出',
|
||
'graph.imports': '导入',
|
||
'graph.references': '引用',
|
||
'graph.symbolType': '符号类型',
|
||
'graph.affectedSymbols': '受影响符号',
|
||
|
||
// CLI Sync (used in claude-manager.js)
|
||
'claude.cliSync': 'CLI 自动同步',
|
||
'claude.tool': '工具',
|
||
'claude.mode': '模式',
|
||
'claude.syncButton': '使用 CLI 同步',
|
||
'claude.syncing': '正在使用 {tool} 分析...',
|
||
'claude.syncSuccess': '{file} 同步成功',
|
||
'claude.syncError': '同步失败:{error}',
|
||
'claude.modeUpdate': '更新(智能合并)',
|
||
'claude.modeGenerate': '生成(完全替换)',
|
||
'claude.modeAppend': '追加',
|
||
'claude.searchPlaceholder': '搜索文件...',
|
||
'claude.viewModeClaude': '仅 CLAUDE.md',
|
||
'claude.viewModeAll': '所有文件',
|
||
'claude.createFile': '创建文件',
|
||
'claude.createDialogTitle': '创建 CLAUDE.md 文件',
|
||
'claude.selectLevel': '层级',
|
||
'claude.levelUser': '用户级 (~/.claude/)',
|
||
'claude.levelProject': '项目级 (.claude/)',
|
||
'claude.levelModule': '模块级(自定义路径)',
|
||
'claude.modulePath': '模块路径',
|
||
'claude.selectTemplate': '模板',
|
||
'claude.templateDefault': '默认',
|
||
'claude.templateMinimal': '最小化',
|
||
'claude.templateComprehensive': '完整',
|
||
'claude.deleteFile': '删除文件',
|
||
'claude.deleteConfirm': '确定要删除 {file} 吗?',
|
||
'claude.deleteWarning': '此操作无法撤销。',
|
||
'claude.copyContent': '复制内容',
|
||
'claude.contentCopied': '内容已复制到剪贴板',
|
||
'claude.copyError': '复制内容失败',
|
||
'claude.modulePathRequired': '模块路径为必填项',
|
||
'claude.fileCreated': '文件创建成功',
|
||
'claude.createFileError': '文件创建失败',
|
||
'claude.fileDeleted': '文件删除成功',
|
||
'claude.deleteFileError': '文件删除失败',
|
||
'claude.loadAllFilesError': '加载所有文件失败',
|
||
'claude.unsupportedFileType': '不支持的文件类型',
|
||
'claude.loadFileError': '加载文件失败',
|
||
|
||
// Duplicate keys for compatibility
|
||
'nav.claudeManager': 'CLAUDE.md',
|
||
'title.claudeManager': 'CLAUDE.md Manager',
|
||
'claudeManager.title': 'CLAUDE.md Files',
|
||
'claudeManager.files': 'files',
|
||
'claudeManager.userLevel': 'User Level',
|
||
'claudeManager.projectLevel': 'Project Level',
|
||
'claudeManager.moduleLevel': 'Module Level',
|
||
'claudeManager.noFile': 'No CLAUDE.md file',
|
||
'claudeManager.noModules': 'No module CLAUDE.md files',
|
||
'claudeManager.selectFile': 'Select a file to view',
|
||
'claudeManager.noMetadata': 'Select a file to see metadata',
|
||
'claudeManager.fileInfo': 'File Information',
|
||
'claudeManager.level': 'Level',
|
||
'claudeManager.level_user': 'User (~/.claude/)',
|
||
'claudeManager.level_project': 'Project (.claude/)',
|
||
'claudeManager.level_module': 'Module',
|
||
'claudeManager.path': 'Path',
|
||
'claudeManager.size': 'Size',
|
||
'claudeManager.modified': 'Modified',
|
||
'claudeManager.statistics': 'Statistics',
|
||
'claudeManager.lines': 'Lines',
|
||
'claudeManager.words': 'Words',
|
||
'claudeManager.characters': 'Characters',
|
||
'claudeManager.actions': 'Actions',
|
||
'claudeManager.loadError': 'Failed to load CLAUDE.md files',
|
||
'claudeManager.refreshed': 'Files refreshed successfully',
|
||
'claudeManager.unsavedChanges': 'You have unsaved changes. Discard them?',
|
||
'claudeManager.saved': 'File saved successfully',
|
||
'claudeManager.saveError': 'Failed to save file',
|
||
|
||
// Common
|
||
'common.cancel': '取消',
|
||
'common.optional': '(可选)',
|
||
'common.create': '创建',
|
||
'common.save': '保存',
|
||
'common.delete': '删除',
|
||
'common.edit': '编辑',
|
||
'common.close': '关闭',
|
||
'common.refresh': '刷新',
|
||
'common.loading': '加载中...',
|
||
'common.error': '错误',
|
||
'common.success': '成功',
|
||
'common.warning': '警告',
|
||
'common.info': '信息',
|
||
'common.remove': '移除',
|
||
'common.removeFromRecent': '从最近中移除',
|
||
'common.noDescription': '无描述',
|
||
'common.saving': '保存中...',
|
||
'common.saveFailed': '保存失败',
|
||
'common.unknownError': '未知错误',
|
||
'common.exception': '异常',
|
||
}
|
||
};
|
||
|
||
/**
|
||
* Initialize i18n - detect browser language or use stored preference
|
||
*/
|
||
function initI18n() {
|
||
// Check stored preference
|
||
const stored = localStorage.getItem('ccw-lang');
|
||
if (stored && i18n[stored]) {
|
||
currentLang = stored;
|
||
} else {
|
||
// Detect browser language
|
||
const browserLang = navigator.language || navigator.userLanguage;
|
||
if (browserLang.startsWith('zh')) {
|
||
currentLang = 'zh';
|
||
} else {
|
||
currentLang = 'en';
|
||
}
|
||
}
|
||
|
||
// Apply translations to DOM
|
||
applyTranslations();
|
||
updateLangToggle();
|
||
}
|
||
|
||
/**
|
||
* Get translation for a key with optional replacements
|
||
* @param {string} key - Translation key
|
||
* @param {Object} replacements - Optional key-value pairs for replacements
|
||
* @returns {string} Translated string
|
||
*/
|
||
function t(key, replacements = {}) {
|
||
const dict = i18n[currentLang] || i18n.en;
|
||
let text = dict[key] || i18n.en[key] || key;
|
||
|
||
// Apply replacements
|
||
for (const [k, v] of Object.entries(replacements)) {
|
||
text = text.replace(new RegExp(`\\{${k}\\}`, 'g'), v);
|
||
}
|
||
|
||
return text;
|
||
}
|
||
|
||
/**
|
||
* Switch language
|
||
* @param {string} lang - Language code ('en' or 'zh')
|
||
*/
|
||
function switchLang(lang) {
|
||
if (i18n[lang]) {
|
||
currentLang = lang;
|
||
localStorage.setItem('ccw-lang', lang);
|
||
applyTranslations();
|
||
updateLangToggle();
|
||
|
||
// Re-render current view to update dynamic content
|
||
if (typeof updateContentTitle === 'function') {
|
||
updateContentTitle();
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Apply translations to all elements with data-i18n attribute
|
||
*/
|
||
function applyTranslations() {
|
||
document.querySelectorAll('[data-i18n]').forEach(el => {
|
||
const key = el.dataset.i18n;
|
||
const translated = t(key);
|
||
|
||
// Handle different element types
|
||
if (el.tagName === 'INPUT' && el.type === 'text') {
|
||
el.placeholder = translated;
|
||
} else if (el.hasAttribute('title')) {
|
||
el.title = translated;
|
||
} else {
|
||
el.textContent = translated;
|
||
}
|
||
});
|
||
|
||
// Update elements with data-i18n-title
|
||
document.querySelectorAll('[data-i18n-title]').forEach(el => {
|
||
el.title = t(el.dataset.i18nTitle);
|
||
});
|
||
|
||
// Update elements with data-i18n-placeholder
|
||
document.querySelectorAll('[data-i18n-placeholder]').forEach(el => {
|
||
el.placeholder = t(el.dataset.i18nPlaceholder);
|
||
});
|
||
|
||
// Update document title
|
||
document.title = t('app.title');
|
||
}
|
||
|
||
/**
|
||
* Update language toggle button state
|
||
*/
|
||
function updateLangToggle() {
|
||
const langBtn = document.getElementById('langToggle');
|
||
if (langBtn) {
|
||
langBtn.textContent = currentLang.toUpperCase();
|
||
langBtn.title = t('header.language');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Get current language
|
||
* @returns {string} Current language code
|
||
*/
|
||
function getLang() {
|
||
return currentLang;
|
||
}
|
||
|
||
/**
|
||
* Check if current language is Chinese
|
||
* @returns {boolean}
|
||
*/
|
||
function isZh() {
|
||
return currentLang === 'zh';
|
||
}
|