274 lines
9.1 KiB
TypeScript
274 lines
9.1 KiB
TypeScript
/**
|
|
* 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<string, string> = {
|
|
// 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',
|
|
|
|
// 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;
|
|
}
|
|
}
|