const common = { navigation: { library: 'Library', filters: { all: 'All', active: 'Active', completed: 'Completed', unfinished: 'Unfinished', }, categories: { musics: 'Musics', movies: 'Movies', compressed: 'Compressed', documents: 'Documents', pictures: 'Pictures', applications: 'Applications', other: 'Other', }, folders: 'Folders', queues: 'Queues', tools: 'Tools', scheduler: 'Scheduler', speedLimiter: 'Speed Limiter', logs: 'Logs', settings: 'Settings', }, actions: { hideSidebar: 'Hide Sidebar', showSidebar: 'Show Sidebar', resizeSidebar: 'Resize Sidebar', cancel: 'Cancel', continue: 'Continue', dismissNotification: 'Dismiss notification', queueName: 'Queue name', addNewQueue: 'Add new queue', startQueue: 'Start Queue', pauseQueue: 'Pause Queue', renameQueue: 'Rename Queue', deleteQueue: 'Delete Queue', }, dialogs: { errorBoundary: { title: 'Something went wrong.', description: 'A critical error occurred in the React component tree. The error details below can help identify the root cause.', reload: 'Reload App', }, duplicateDownloads: { title: 'Duplicate Downloads Detected', description: 'Some of the downloads you are adding already exist in the queue or on disk. Please choose how to resolve these conflicts.', rename: 'Rename', replace: 'Replace', skip: 'Skip', }, removeDownload: { title: 'Remove Download', confirmationSingle: 'Are you sure you want to remove this item from the list? You can also choose to delete the underlying file from your hard drive.', confirmationMultiple: 'Are you sure you want to remove these {{count}} items from the list? You can also choose to delete the underlying files from your hard drive.', errorSummary: '{{succeeded}} removed, {{failed}} failed: {{detail}}', remove: 'Remove', deleteFile: 'Delete file', }, }, window: { controls: 'Window controls', close: 'Close', minimize: 'Minimize', maximize: 'Maximize', }, downloads: { actions: { moveUp: 'Move Up', moveDown: 'Move Down', pause: 'Pause', start: 'Start', resume: 'Resume', options: 'Options', }, size: { downloadedOf: '{{downloaded}} downloaded of {{total}} {{unit}}', downloadedOfApproximate: '{{downloaded}} downloaded of approximately {{total}} {{unit}}', }, status: { ready: 'Ready', staged: 'In queue', queued: 'Queued', downloading: 'Downloading', processing: 'Processing', paused: 'Paused', completed: 'Completed', failed: 'Failed', retrying: 'Retrying', }, values: { processing: 'Processing...', muxing: 'Muxing...', }, }, speedLimiter: { title: 'Speed Limiter', unlimited: 'Unlimited', saveLimit: 'Save Limit', globalSpeedLimit: 'Global Speed Limit', description: 'Applies to new and active aria2 transfers and new yt-dlp media downloads. Explicit per-download limits remain attached to those transfers.', quickPresets: 'Quick Presets', removePreset: 'Remove {{value}} {{unit}} preset', customPresetIn: 'Custom preset in {{unit}}', addQuickPreset: 'Add quick preset', globalLimitSaved: 'Global limit saved at {{value}} {{unit}}', globalLimitDisabled: 'Global speed limit disabled', saveFailed: 'Could not save global speed limit: {{detail}}', presetAlreadyExists: '{{value}} {{unit}} is already in quick presets', presetAdded: 'Added {{value}} {{unit}} quick preset', presetRemoved: 'Removed {{value}} {{unit}} quick preset', }, logs: { title: 'Logs', entries: '({{count}} entries)', collecting: 'Collecting', off: 'Off', allLevels: 'All Levels', levels: { error: 'Error', warn: 'Warn', info: 'Info', debug: 'Debug', trace: 'Trace', }, pauseLogging: 'Pause diagnostic logging', enableLogging: 'Enable diagnostic logging', clearDisplayed: 'Clear displayed logs', export: 'Export logs', exportButton: 'Export Logs', logFiles: 'Log Files', localDiagnostics: 'Local diagnostics:', diagnosticsDescription: 'Diagnostic collection is opt-in, bounded, and local. Common secrets, URL queries, and home-directory paths are redacted during display and export. Nothing is uploaded automatically.', noEntries: 'No persisted log entries are available yet.', disabledDescription: 'Diagnostic logging is off. Existing support logs will appear here when available.', copy: 'Copy', copied: 'Copied to clipboard', copyFailed: 'Failed to copy to clipboard', exported: 'Support logs exported', exportFailed: 'Could not export logs: {{detail}}', cleared: 'Logs cleared', clearFailed: 'Could not clear logs: {{detail}}', enabled: 'Diagnostic logging enabled', disabled: 'Diagnostic logging disabled', updateFailed: 'Could not update diagnostic logging: {{detail}}', }, scheduler: { title: 'Scheduler', running: 'Running', disabled: 'Scheduler is disabled', noScheduledDay: 'No scheduled day selected', unsavedChanges: 'Unsaved changes', runNow: 'Run Now', pause: 'Pause', saveSettings: 'Save Settings', timing: 'Timing', startTime: 'Start Time', stopTime: 'Stop Time', timingDescription: 'If Firelink is asleep at the start time, it starts the selected queues when it returns later that day, unless the stop time has already passed.', runEveryDay: 'Run Every Day', queuesToSchedule: 'Queues to Schedule', defaultQueue: 'Default queue', afterCompletion: 'After Completion', afterCompletionDescription: 'Choose what happens after downloads started by the scheduler finish.', actionWarning: 'This action can interrupt other work on the computer. Firelink invokes it immediately after the scheduled queue finishes.', systemPermissions: 'System Permissions', macPermissionDescription: 'Sleep, restart, and shut down require macOS Automation permission for System Events.', permissionGranted: 'Automation permission granted', permissionChecking: 'Checking Automation permission...', permissionMissing: 'Automation permission missing', revokePermission: 'Revoke permission', grantPermission: 'Grant permission', permissionAvailable: 'Automation permission is available.', permissionMissingDetails: 'Automation permission is missing. Enable Firelink under Automation for System Events in System Settings.', revokePermissionDetails: 'macOS does not allow Firelink to revoke Automation permission directly. Revoke System Events access in System Settings, then return to Firelink.', requestingPermission: 'Requesting Automation permission...', enablePermissionDetails: 'Enable Firelink under Automation for System Events in System Settings, then return to Firelink.', systemActions: 'System Actions', windowsActionsDescription: 'Sleep, restart, and shut down use Windows system privileges. Firelink reports any rejected action when it runs; no permanent permission is claimed in advance.', linuxActionsDescription: 'Sleep, restart, and shut down use your Linux desktop and system policy. Firelink reports any rejected action when it runs; no permanent permission is claimed in advance.', validationDay: 'Select at least one day for the scheduler', validationQueue: 'Select at least one queue for the scheduler', validationStopTime: 'Stop time must be later than start time', saved: 'Scheduler settings saved', trackingOne: 'Tracking 1 scheduled download', trackingMany: 'Tracking {{count}} scheduled downloads', noStartableDownloads: 'No downloads in the selected queues can be started', pausedOne: 'Paused 1 active download', pausedMany: 'Paused {{count}} active downloads', noActiveDownloads: 'No active downloads', days: { su: 'Su', mo: 'Mo', tu: 'Tu', we: 'We', th: 'Th', fr: 'Fr', sa: 'Sa', }, postActions: { none: 'Do nothing', sleep: 'Sleep', restart: 'Restart', shutdown: 'Shut down', }, }, properties: { progress: 'Progress', size: 'Size', speed: 'Speed', eta: 'ETA', connections: 'Connections', speedCap: 'Speed cap', category: 'Category', lastTry: 'Last try', dateAdded: 'Date added', destination: 'Destination', lastError: 'Last error', saved: ' (saved)', defaultValue: ' (default)', savedTooltip: 'Saved for this download; Settings changes apply to new downloads.', defaultTooltip: 'Using the current default for new downloads.', identityReadOnly: 'File identity is read-only. Transfer settings are saved for redownload.', transferSettings: 'Transfer settings can be changed after stopping or pausing. Current transfers keep their existing backend options.', download: 'Download', url: 'URL', fileName: 'File name', saveLocation: 'Save location', select: 'Select', perFile: 'per file', useCurrentDefault: 'Use current default ({{count}})', savedPerDownload: 'Saved per download. The Settings default applies to new downloads.', limit: 'Limit', siteLogin: 'Site Login', siteLoginRedownload: 'Site Login for Redownload', matchingSiteLogin: 'Matching site login', customCredentials: 'Custom credentials', noLogin: 'No login', useSavedLogin: 'Will use saved login if available.', advancedTransfer: 'Advanced Transfer', advancedTransferRedownload: 'Advanced Transfer for Redownload', checksum: 'Checksum', verify: 'Verify', algorithm: 'Algorithm', digest: 'Digest', expectedDigest: 'Expected digest', cookies: 'Cookies', headers: 'Headers', mirrors: 'Mirrors', username: 'Username', password: 'Password', enterValidUrl: 'Enter a valid URL.', fileNameEmpty: 'File name cannot be empty.', cancel: 'Cancel', save: 'Save', }, keychain: { title: 'Credential Storage Access Needed', stores: { portable: 'the portable Firelink data folder', windows: 'Windows Credential Manager', linux: 'your Linux credential store', macos: 'macOS Keychain', system: "this system's credential store", siteCredentials: "the system's credential store", }, grantLabelPortable: 'Continue', grantLabelMacos: 'Grant Access', grantLabelDefault: 'Enable Secure Storage', description: 'Firelink uses the browser extension to capture downloads. To keep the extension paired after restarts, Firelink stores its pairing token in {{pairingStore}}. Optional site credentials are stored in {{siteCredentialStore}}.', portableExplanation: 'The pairing token is portable with this folder. Site credentials remain in the system credential store; a system prompt may appear after you grant access.', macosExplanation: 'macOS may show a Keychain prompt after you grant access.', defaultExplanation: 'This usually completes silently. If the credential service is unavailable, Firelink will show the error here and the extension will stay paired for this session only.', note: 'Note:', portableNote: 'Portable mode stores only the pairing token in this folder. It does not copy site passwords or browser credentials.', defaultNote: 'Firelink only writes its own dedicated credential entry. It cannot access other saved passwords or credential items on your system.', hint: 'Hint:', portableHint: 'The portable pairing token is already stored with this folder; you can enable it here or select Later.', defaultHint: 'If you select Later, the extension will only work for this session.', enableFromSettings: 'You can enable storage anytime from Settings > Integrations.', later: 'Later', enabling: 'Enabling...', timeout: 'Credential storage request timed out. You can select Later and try again.', unavailable: '{{store}} is unavailable.', accessRequired: 'Grant credential-store access before regenerating the pairing token.', storeUnavailable: 'Credential store access is unavailable.', }, app: { settingsSaveFailed: 'Could not save settings. Check storage permissions and try again.', systemActionCountdown: '{{action}} in 10 seconds.', systemActionCancelled: 'System action cancelled because another download is active or queued.', systemActionFailed: 'Scheduled system action failed: {{detail}}', downloadCompleteTitle: 'Download Complete', downloadCompleteBody: '{{fileName}} has finished downloading.', unknownFile: 'A file', downloadFailedTitle: 'Download Failed', downloadFailedBody: '{{fileName}} failed to download.', initializeDownloadsFailed: 'Could not initialize saved downloads: {{detail}}', extensionDisconnected: 'Browser extension disconnected because its pairing token changed.', copyToken: 'Copy token', integrations: 'Integrations', copyTokenFailed: 'Could not copy pairing token: {{detail}}', credentialPersistenceFailed: 'Secure credential persistence is unavailable. Browser pairing works for this session only: {{detail}}', resumeDownloadsFailed: 'Could not resume saved downloads: {{detail}}', updateAvailable: 'Firelink {{version}} is available.', viewRelease: 'View release', sleepPreventionFailed: 'Could not update sleep prevention: {{detail}}', schedulerNoQueues: 'Scheduler has no valid queues selected. Update Scheduler settings.', schedulerPauseOneFailed: 'Scheduler could not pause 1 download.', schedulerPauseManyFailed: 'Scheduler could not pause {{count}} downloads.', scheduledIncomplete: 'Scheduled downloads did not all complete. The post-queue system action was skipped.', scheduledActionSkippedActive: 'Scheduled system action skipped because another download is active or queued.', notificationsDisabled: 'System notifications are disabled for Firelink.', notificationsFailed: 'Could not configure notifications: {{detail}}', }, sidebar: { deleteQueueConfirm: 'Delete queue "{{name}}"? Its unfinished downloads will move to Main Queue.', deleteQueueFailed: 'Could not delete queue: {{detail}}', queueNameEmpty: 'Queue name cannot be empty', queueNameExists: 'A queue with this name already exists', startQueueFailed: 'Could not start queue: {{detail}}', pauseQueueFailed: 'Could not pause queue: {{detail}}', }, downloadTable: { unknownQueue: 'Unknown Queue', allDownloads: 'All Downloads', active: 'Active', completed: 'Completed', unfinished: 'Unfinished', headers: { fileName: 'File Name', size: 'Size', status: 'Status', speed: 'Speed', eta: 'ETA', dateAdded: 'Date Added', }, addDownload: 'Add Download', resumeAll: 'Resume All', pauseAll: 'Pause All', queueEmpty: 'Queue is empty', noCompletedDownloads: 'No Completed Downloads', noDownloads: 'No Downloads', queueEmptyDescription: 'Add downloads to this queue from an item menu or the Add window.', completedDescription: 'Completed downloads will appear here.', clickToAdd: 'Click', addButtonOr: 'button or', toAddDownloads: 'to add downloads', nonResumableOne: '1 download does not support resuming. If you pause it, you will have to start over again later. Are you sure you want to pause?', nonResumableMany: '{{count}} downloads do not support resuming. If you pause them, you will have to start over again later. Are you sure you want to pause?', interactionError: '{{message}}: {{detail}}', openFileFailed: 'Could not open downloaded file', revealFileFailed: 'Could not show download in Finder', pauseFailed: 'Could not pause download', resumeFailed: 'Could not resume {{fileName}}', moveManyFailed: 'Could not move downloads to queue', moveOneFailed: 'Could not move download to queue', copyAddressesFailed: 'Could not copy addresses', copyAddressFailed: 'Could not copy address', copyPathFailed: 'Could not copy file path', missingFileName: 'File name is missing', redownloadFailed: 'Redownload failed', startResume: 'Start/Resume', addToQueue: 'Add to Queue', copyAddress: 'Copy Address', remove: 'Remove', open: 'Open', showInFolder: 'Show in Folder', pause: 'Pause', start: 'Start', resume: 'Resume', redownload: 'Redownload', copyFilePath: 'Copy File Path', properties: 'Properties', backendRejectedStart: 'The backend rejected the start/resume request.', transferActive: 'Cannot change properties while transfer is active. Pause it first.', redownloadNotFound: 'Cannot redownload: download was not found.', redownloadActive: 'Cannot redownload a {{status}} download. Pause or wait for it to finish first.', originalUrlMissing: 'Cannot redownload: original URL is missing.', pauseBeforeMove: 'Pause {{file}} before moving it to another queue.', }, addDownloads: { unknownSize: 'Unknown size', unknown: 'Unknown', discardSetup: 'Discard this download setup?', speedInvalid: 'Speed limit must be greater than zero', duplicateResolveFailed: 'Could not resolve duplicate downloads: {{detail}}', addedWithFailures: '{{added}} added, {{failed}} failed. {{detail}}', addedOne: '1 download added', addedMany: '{{count}} downloads added', urlAlreadyQueued: 'URL already in queue', destinationConflict: 'Another selected download uses this destination', existingDownloadDestination: 'Existing Firelink download uses this destination', fileExistsOnDisk: 'File exists on disk; rename or skip to avoid deleting unrelated data', backendRejectedStart: 'Backend rejected download start.', playlistNoEntries: 'Playlist contains no downloadable entries', invalidMediaMetadata: 'Invalid media metadata or no formats found', noAvailableName: 'Could not find an available name for {{file}}.', pauseBeforeReplace: 'Pause {{file}} before replacing it.', cannotReplace: 'Cannot replace {{file}}: file is not owned by a Firelink download.', downloadLinks: 'Download Links', pastePlaceholder: 'Paste HTTP, HTTPS, FTP, or SFTP URLs here...\n\nFor media downloads, paste links from Youtube, X, TikTok, Instagram, Reddit, etc.', playlistSummary: 'Playlist “{{title}}”: {{loaded}}{{total}} entries loaded{{truncated}}{{skipped}}', safeEntryLimit: ' (safe entry limit reached)', selectedSummary: '{{ready}} selected ready, {{fallback}} fallback, {{mediaRetry}} media retry, {{blocked}} blocked', clearSelection: 'Clear selection', selectAll: 'Select all', refreshMetadata: 'Refresh Metadata', files: 'Files', required: 'Required', free: 'Free', preview: 'Preview', file: 'File', size: 'Size', status: 'Status', downloadPreview: 'Download preview', noLinks: 'No links added yet.', selectItem: 'Select {{file}}', fetchingPlaylist: 'Fetching playlist...', fetching: 'Fetching...', unsafeUrl: 'Unsafe URL', playlistFailed: 'Playlist failed', metadataFailed: 'Metadata failed', fallback: 'Fallback', invalid: 'Invalid', ready: 'Ready', mediaFormat: 'Media Format', playlistItem: 'Playlist item {{index}}', fetchingMediaStreams: 'Fetching media streams...', availableStreams: 'Available Streams', availableMediaStreams: 'Available media streams', metadataUnavailable: 'Metadata unavailable. Refresh metadata before adding this media.', saveLocation: 'Save Location', browse: 'Browse', categoryFolders: 'Files will be organized into category folders.', sharedFolder: 'All selected downloads will use this folder.', transferSettings: 'Transfer Settings', connectionsPerFile: 'Connections per File', connectionsPerFileAria: 'Connections per file', limitSpeedPerFile: 'Limit speed per file', speedLimitPerFileAria: 'Speed limit per file', authorization: 'Authorization', useAuthorization: 'Use authorization', username: 'Username', password: 'Password', advancedTransfer: 'Advanced Transfer', verifyChecksum: 'Verify Checksum', checksumAlgorithm: 'Checksum algorithm', expectedDigest: 'Expected digest', headers: 'Headers', requestHeaders: 'Request headers', cookies: 'Cookies', cookiePlaceholder: 'name=value; other=value', mirrors: 'Mirrors', cancel: 'Cancel', startDownloads: 'Start Downloads', addToQueue: 'Add to queue', pasteOneOrMore: 'Paste one or more links.', selectAtLeastOne: 'Select at least one download.', correctInvalid: 'Correct or remove {{count}} invalid URL{{plural}} before continuing.', waitingForMetadata: 'Waiting for metadata for {{count}} download{{plural}}.', removeUnsafe: 'Remove {{count}} unsafe URL{{plural}} before continuing.', mediaMetadataUnavailableSummary: 'Media metadata is unavailable for {{count}} item{{plural}}. Refresh metadata before adding.', metadataUnavailableFallback: 'Metadata is unavailable. Downloads can still be added using fallback details.', fallbackReady: '{{ready}} download{{readyPlural}} ready; {{failed}} will use fallback filename and unknown size.', readyToAdd: 'Ready to add {{count}} download{{plural}}.', }, settings: { tabs: { downloads: 'Downloads', lookAndFeel: 'Look and feel', network: 'Network', locations: 'Locations', siteLogins: 'Site Logins', power: 'Power', engine: 'Engine', integrations: 'Integrations', about: 'About', }, common: { thisOs: 'this OS', checking: 'Checking...', ready: 'Ready', errorMissing: 'Error / Missing', hideTechnicalDetails: 'Hide technical details', showTechnicalDetails: 'Show technical details', binary: 'Binary', expected: 'Expected', error: 'Error', tip: 'Tip', stderr: 'stderr', daemonProcessAlive: 'Daemon process alive', rpcReady: 'RPC ready', rpcPort: 'RPC port', daemonStderr: 'daemon stderr', packaging: 'Packaging: PyInstaller onedir (_internal required)', internalDirectoryFound: '_internal directory found', pythonRuntimeFound: 'Python runtime found', externalOpenFailed: 'Could not open {{label}}: {{detail}}', updateUnexpectedResponse: 'The update check returned an unexpected response.', updateUntrustedReleaseUrl: 'The update check returned an untrusted release URL.', updateFailed: 'Update check failed: {{detail}}', }, downloads: { defaultConnections: 'Default connections:', defaultConnectionsDescription: 'New downloads; existing items keep their saved value', parallelDownloads: 'Parallel downloads:', parallelDownloadsDescription: 'Max simultaneous active files', automaticRetries: 'Automatic retries:', automaticRetriesDescription: 'If a connection fails', systemNotification: 'Show system notification when download completes', systemNotificationDescription: 'Uses your operating system notification settings', completionChime: 'Play in-app completion chime', completionChimeDescription: 'Optional Firelink sound, independent of system notifications', clipboardLinks: 'Add clipboard links when Firelink becomes active', clipboardLinksDescription: 'Opens supported copied links in the Add window. Off by default.', }, lookAndFeel: { appTheme: 'App Theme', theme: 'Theme', ariaLabel: 'App theme', system: 'System', light: 'Light', dark: 'Dark', dracula: 'Dracula', nord: 'Nord', systemAppearance: 'System follows the current {{platform}} light or dark appearance.', display: 'Display', fontSize: 'Font size', fontSizeDescription: 'Scales the download list and compact controls.', small: 'Small', standard: 'Standard', large: 'Large', listDensity: 'List density', listDensityDescription: 'Changes row height, spacing, and progress bar scale.', compact: 'Compact', comfortable: 'Comfortable', relaxed: 'Relaxed', osIntegration: 'OS Integration', dockBadge: 'Show badge on Dock icon', dockBadgeDescription: 'Displays active download count on Firelink Dock icon.', menuBarIcon: 'Show menu bar icon', statusIndicatorIcon: 'Show status indicator icon', systemTrayIcon: 'Show system tray icon', macosTrayDescription: 'Provides quick access from the macOS menu bar.', windowsTrayDescription: 'Provides quick access from the Windows notification area.', linuxTrayDescription: 'Provides quick access from the desktop tray or status area when available.', defaultTrayDescription: 'Provides quick access from the OS tray area when available.', }, network: { proxy: 'Proxy', mode: 'Mode', modeDescription: 'Controls proxy use for new download requests.', noProxy: 'No Proxy', systemProxy: 'System Proxy', customProxy: 'Custom Proxy', proxyHost: 'Proxy host', proxyHostDescription: 'Host name, IP address, or HTTP proxy URL.', proxyHostPlaceholder: '127.0.0.1 or http://127.0.0.1', proxyPort: 'Proxy port', proxyPortDescription: 'Valid range is 1 to 65535.', noProxyDescription: 'Downloads ignore configured proxies.', systemProxyDescription: 'Downloads use the detected {{platform}} system proxy. Normal file downloads require an HTTP or HTTPS proxy endpoint; media downloads can use SOCKS.', customProxyDescription: 'Downloads use the configured HTTP proxy endpoint for metadata and download engines.', invalidCustomProxy: 'Enter a valid HTTP proxy host and port to enable the custom proxy.', incompleteCustomProxy: 'Enter a proxy host and port to enable the custom proxy.', checkingSystemProxy: 'Checking system proxy configuration…', detectedSystemProxy: 'A system proxy was detected. Normal file downloads require an HTTP or HTTPS endpoint; media downloads can use SOCKS.', noSystemProxy: 'No usable system proxy was detected. Downloads will use no proxy.', systemProxyReadFailed: 'System proxy configuration could not be read. Choose No Proxy or try again when it is available.', identity: 'Identity', customUserAgent: 'Custom User-Agent', userAgentDescription: 'Applied to metadata fetches and download engines.', userAgentPlaceholder: 'Leave blank for Firelink default', userAgentOverrides: 'Overrides the outbound User-Agent header. Leave blank for Firelink defaults.', chromeWindows: 'Chrome (Windows)', chromeMacos: 'Chrome (macOS)', edgeWindows: 'Edge (Windows)', firefoxWindows: 'Firefox (Windows)', firefoxMacos: 'Firefox (macOS)', safariMacos: 'Safari (macOS)', windowsDesktop: 'Windows desktop', macosDesktop: 'macOS desktop', }, locations: { baseDownloadFolder: 'Base Download Folder', baseDownloadFolderDescription: 'Automatic category folders are created inside this folder.', browse: 'Browse', baseFolderCreateFailed: 'Base folder saved, but category folders could not be created: {{detail}}', baseFolderUpdated: 'Base download folder updated', askWhereToSave: 'Ask where to save when adding downloads', automaticCategorySubfolders: 'Automatically save files to category subfolders', automaticCategorySubfoldersDescription: 'When off, automatic downloads use the base folder.', categorySubfolders: 'Category Subfolders', relativeToBase: 'Relative to the base folder', disabled: 'Disabled', categorySubfolder: '{{category}} subfolder', customFolder: 'Custom folder', useAutomatic: 'Use automatic', resetDefaults: 'Reset Defaults', resetToast: 'Reset category locations to default', }, siteLogins: { title: 'Site Credentials', noSavedLogins: 'No saved logins.', user: 'User: {{username}}', deleteCredential: 'Delete credential', deletedCredential: 'Deleted credential', deleteFailed: 'Could not delete credential: {{detail}}', addTitle: 'Add Site Credentials', urlPattern: 'URL Pattern:', urlPatternPlaceholder: 'e.g. *.example.com or example.com/downloads', username: 'Username:', password: 'Password:', usernamePlaceholder: 'Username', passwordPlaceholder: 'Password', saving: 'Saving…', addLogin: 'Add Login', urlPatternRequired: 'URL pattern is required.', urlPatternWhitespace: 'URL pattern cannot contain whitespace.', usernameRequired: 'Username is required.', passwordRequired: 'Password is required.', accessBeforeSave: 'Grant credential-store access before saving a site login.', saveFailed: 'Failed to save site credential securely.', addedCredential: 'Added site credential', }, power: { title: 'Power Management', preventSleep: 'Prevent system sleep while downloads are active', preventSleepDescription: 'The display may still turn off. Firelink only keeps the device awake enough to complete active transfers.', }, engine: { title: 'Media Downloader & Engines', description: 'Successful results are reused for this app session. Recheck runs real validation again.', recheck: 'Recheck engines', coreDownloader: 'Core Downloader (Aria2)', version: 'Version:', status: 'Status:', mediaExtractors: 'Media Extractors', browserCookiesSource: 'Browser Cookies Source:', cookieDescription: 'yt-dlp reads browser cookies to bypass video download limits or access restricted media. Firelink does not save browser cookies.', none: 'None', }, integrations: { title: 'Connect Browser Extension', description: 'Capture downloads directly from your browser in three easy steps.', portablePairingEnabled: 'Portable Pairing Enabled', pairingTokenPersisted: 'Pairing Token Persisted', portablePersistedDescription: 'Your pairing token is stored with this portable Firelink folder and will persist when the folder is moved. Treat the folder as sensitive.', systemPersistedDescription: 'Your pairing token is stored in the system credential store and will persist across restarts.', portablePairingAvailable: 'Portable Pairing Available', credentialStorageNeeded: 'Credential Storage Needed', portableAvailableDescription: 'Your pairing token is stored with this portable Firelink folder and will persist across restarts. Enable it here to review the portable-storage warning.', credentialStorageDescription: "Firelink needs access to this system's credential store to securely save your pairing token across app restarts. Currently, your extension will only stay connected for this session.", reviewPortablePairing: 'Review Portable Pairing', grantCredentialAccess: 'Grant Credential Access', copyToken: 'Copy Token', tokenDescription: 'This secure token authorizes your browser extension.', tokenCopied: 'Token copied to clipboard!', tokenCopyFailed: 'Could not copy token: {{detail}}', pairingTokenRegenerated: 'Pairing token regenerated', regenerateFailed: 'Could not regenerate pairing token: {{detail}}', getExtension: 'Get Extension', extensionDescription: 'Install Firelink Companion for Firefox or Chromium browsers.', firefoxAddons: 'Firefox Add-ons', chromiumZip: 'Chromium ZIP', pasteConnect: 'Paste & Connect', pasteConnectDescription: "Click the Firelink icon in your browser's toolbar and paste the copied token.", extensionServerStatus: 'Extension Server Status:', listening: '● Listening on 127.0.0.1:{{port}}', unavailable: '● Server unavailable', }, about: { firelinkIcon: 'Firelink Icon', unknown: 'Unknown', version: 'Version {{version}}', description: 'Cross-platform download manager for macOS, Windows, and Linux.', sourceCode: 'Source Code', source: 'Source', upToDate: 'Firelink {{version}} is up to date.', updateAvailable: 'Firelink {{version}} is available.', viewRelease: 'View release', updates: 'Updates', checkForUpdates: 'Check for Updates', updateDescription: 'Firelink checks GitHub Releases for new versions.', checking: 'Checking...', checkNow: 'Check Now', automaticUpdates: 'Automatically check for updates', createdBy: 'Created by NimBold', mitLicense: 'MIT License', credits: 'Credits: aria2, yt-dlp, FFmpeg, and Deno.', copyright: 'Copyright © 2026 NimBold. All rights reserved.', }, }, status: { ready: 'Ready', active: '{{count}} active', queued: '{{count}} queued', done: '{{count}} done', }, } as const; export const defaultNS = 'common' as const; export const resources = { en: { common, }, } as const;