Files
Claude-Code-Workflow/ccw/src/templates/dashboard-js/i18n.js
catlog22 df23975a0b Add comprehensive tests for schema cleanup migration and search comparison
- 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.
2025-12-16 19:27:05 +08:00

2398 lines
104 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// ============================================
// 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';
}