// ============================================ // 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'; }