first commit
This commit is contained in:
273
app/chrome-extension/utils/i18n.ts
Normal file
273
app/chrome-extension/utils/i18n.ts
Normal file
@@ -0,0 +1,273 @@
|
||||
/**
|
||||
* 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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user