/** * Chrome Extension i18n utility * Provides safe access to chrome.i18n.getMessage with fallbacks */ // Fallback messages for when Chrome APIs aren't available (English) const fallbackMessages: Record = { // Extension metadata extensionName: 'chrome-mcp-server', extensionDescription: 'Exposes browser capabilities with your own chrome', // Section headers nativeServerConfigLabel: 'Native Server Configuration', semanticEngineLabel: 'Semantic Engine', embeddingModelLabel: 'Embedding Model', indexDataManagementLabel: 'Index Data Management', modelCacheManagementLabel: 'Model Cache Management', // Status labels statusLabel: 'Status', runningStatusLabel: 'Running Status', connectionStatusLabel: 'Connection Status', lastUpdatedLabel: 'Last Updated:', // Connection states connectButton: 'Connect', disconnectButton: 'Disconnect', connectingStatus: 'Connecting...', connectedStatus: 'Connected', disconnectedStatus: 'Disconnected', detectingStatus: 'Detecting...', // Server states serviceRunningStatus: 'Service Running (Port: {0})', serviceNotConnectedStatus: 'Service Not Connected', connectedServiceNotStartedStatus: 'Connected, Service Not Started', // Configuration labels mcpServerConfigLabel: 'MCP Server Configuration', connectionPortLabel: 'Connection Port', refreshStatusButton: 'Refresh Status', copyConfigButton: 'Copy Configuration', copyUserIdButton: 'Copy User ID', // Action buttons retryButton: 'Retry', cancelButton: 'Cancel', confirmButton: 'Confirm', saveButton: 'Save', closeButton: 'Close', resetButton: 'Reset', // Progress states initializingStatus: 'Initializing...', processingStatus: 'Processing...', loadingStatus: 'Loading...', clearingStatus: 'Clearing...', cleaningStatus: 'Cleaning...', downloadingStatus: 'Downloading...', // Semantic engine states semanticEngineReadyStatus: 'Semantic Engine Ready', semanticEngineInitializingStatus: 'Semantic Engine Initializing...', semanticEngineInitFailedStatus: 'Semantic Engine Initialization Failed', semanticEngineNotInitStatus: 'Semantic Engine Not Initialized', initSemanticEngineButton: 'Initialize Semantic Engine', reinitializeButton: 'Reinitialize', // Model states downloadingModelStatus: 'Downloading Model... {0}%', switchingModelStatus: 'Switching Model...', modelLoadedStatus: 'Model Loaded', modelFailedStatus: 'Model Failed to Load', // Model descriptions lightweightModelDescription: 'Lightweight Multilingual Model', betterThanSmallDescription: 'Slightly larger than e5-small, but better performance', multilingualModelDescription: 'Multilingual Semantic Model', // Performance levels fastPerformance: 'Fast', balancedPerformance: 'Balanced', accuratePerformance: 'Accurate', // Error messages networkErrorMessage: 'Network connection error, please check network and retry', modelCorruptedErrorMessage: 'Model file corrupted or incomplete, please retry download', unknownErrorMessage: 'Unknown error, please check if your network can access HuggingFace', permissionDeniedErrorMessage: 'Permission denied', timeoutErrorMessage: 'Operation timed out', // Data statistics indexedPagesLabel: 'Indexed Pages', indexSizeLabel: 'Index Size', activeTabsLabel: 'Active Tabs', vectorDocumentsLabel: 'Vector Documents', cacheSizeLabel: 'Cache Size', cacheEntriesLabel: 'Cache Entries', // Data management clearAllDataButton: 'Clear All Data', clearAllCacheButton: 'Clear All Cache', cleanExpiredCacheButton: 'Clean Expired Cache', exportDataButton: 'Export Data', importDataButton: 'Import Data', // Dialog titles confirmClearDataTitle: 'Confirm Clear Data', settingsTitle: 'Settings', aboutTitle: 'About', helpTitle: 'Help', // Dialog messages clearDataWarningMessage: 'This operation will clear all indexed webpage content and vector data, including:', clearDataList1: 'All webpage text content index', clearDataList2: 'Vector embedding data', clearDataList3: 'Search history and cache', clearDataIrreversibleWarning: 'This operation is irreversible! After clearing, you need to browse webpages again to rebuild the index.', confirmClearButton: 'Confirm Clear', // Cache states cacheDetailsLabel: 'Cache Details', noCacheDataMessage: 'No cache data', loadingCacheInfoStatus: 'Loading cache information...', processingCacheStatus: 'Processing cache...', expiredLabel: 'Expired', // Browser integration bookmarksBarLabel: 'Bookmarks Bar', newTabLabel: 'New Tab', currentPageLabel: 'Current Page', // Accessibility menuLabel: 'Menu', navigationLabel: 'Navigation', mainContentLabel: 'Main Content', // Future features languageSelectorLabel: 'Language', themeLabel: 'Theme', lightTheme: 'Light', darkTheme: 'Dark', autoTheme: 'Auto', advancedSettingsLabel: 'Advanced Settings', debugModeLabel: 'Debug Mode', verboseLoggingLabel: 'Verbose Logging', // Notifications successNotification: 'Operation completed successfully', warningNotification: 'Warning: Please review before proceeding', infoNotification: 'Information', configCopiedNotification: 'Configuration copied to clipboard', dataClearedNotification: 'Data cleared successfully', // Units bytesUnit: 'bytes', kilobytesUnit: 'KB', megabytesUnit: 'MB', gigabytesUnit: 'GB', itemsUnit: 'items', pagesUnit: 'pages', // Legacy keys for backwards compatibility nativeServerConfig: 'Native Server Configuration', runningStatus: 'Running Status', refreshStatus: 'Refresh Status', lastUpdated: 'Last Updated:', mcpServerConfig: 'MCP Server Configuration', connectionPort: 'Connection Port', connecting: 'Connecting...', disconnect: 'Disconnect', connect: 'Connect', semanticEngine: 'Semantic Engine', embeddingModel: 'Embedding Model', retry: 'Retry', indexDataManagement: 'Index Data Management', clearing: 'Clearing...', clearAllData: 'Clear All Data', copyConfig: 'Copy Configuration', serviceRunning: 'Service Running (Port: {0})', connectedServiceNotStarted: 'Connected, Service Not Started', serviceNotConnected: 'Service Not Connected', detecting: 'Detecting...', lightweightModel: 'Lightweight Multilingual Model', betterThanSmall: 'Slightly larger than e5-small, but better performance', multilingualModel: 'Multilingual Semantic Model', fast: 'Fast', balanced: 'Balanced', accurate: 'Accurate', semanticEngineReady: 'Semantic Engine Ready', semanticEngineInitializing: 'Semantic Engine Initializing...', semanticEngineInitFailed: 'Semantic Engine Initialization Failed', semanticEngineNotInit: 'Semantic Engine Not Initialized', downloadingModel: 'Downloading Model... {0}%', switchingModel: 'Switching Model...', networkError: 'Network connection error, please check network and retry', modelCorrupted: 'Model file corrupted or incomplete, please retry download', unknownError: 'Unknown error, please check if your network can access HuggingFace', reinitialize: 'Reinitialize', initializing: 'Initializing...', initSemanticEngine: 'Initialize Semantic Engine', indexedPages: 'Indexed Pages', indexSize: 'Index Size', activeTabs: 'Active Tabs', vectorDocuments: 'Vector Documents', confirmClearData: 'Confirm Clear Data', clearDataWarning: 'This operation will clear all indexed webpage content and vector data, including:', clearDataIrreversible: 'This operation is irreversible! After clearing, you need to browse webpages again to rebuild the index.', confirmClear: 'Confirm Clear', cancel: 'Cancel', confirm: 'Confirm', processing: 'Processing...', modelCacheManagement: 'Model Cache Management', cacheSize: 'Cache Size', cacheEntries: 'Cache Entries', cacheDetails: 'Cache Details', noCacheData: 'No cache data', loadingCacheInfo: 'Loading cache information...', processingCache: 'Processing cache...', cleaning: 'Cleaning...', cleanExpiredCache: 'Clean Expired Cache', clearAllCache: 'Clear All Cache', expired: 'Expired', bookmarksBar: 'Bookmarks Bar', }; /** * Safe i18n message getter with fallback support * @param key Message key * @param substitutions Optional substitution values * @returns Localized message or fallback */ export function getMessage(key: string, substitutions?: string[]): string { try { // Check if Chrome extension APIs are available if (typeof chrome !== 'undefined' && chrome.i18n && chrome.i18n.getMessage) { const message = chrome.i18n.getMessage(key, substitutions); if (message) { return message; } } } catch (error) { console.warn(`Failed to get i18n message for key "${key}":`, error); } // Fallback to English messages let fallback = fallbackMessages[key] || key; // Handle substitutions in fallback messages if (substitutions && substitutions.length > 0) { substitutions.forEach((value, index) => { fallback = fallback.replace(`{${index}}`, value); }); } return fallback; } /** * Check if Chrome extension i18n APIs are available */ export function isI18nAvailable(): boolean { try { return ( typeof chrome !== 'undefined' && chrome.i18n && typeof chrome.i18n.getMessage === 'function' ); } catch { return false; } }