mirror of
https://github.com/nimbold/Firelink.git
synced 2026-08-18 23:26:18 +00:00
c4d3a2be51
- Enforce generation-safe seed admission and budget tracking. - Make web-seed RPC, persistence, rollback, and startup attachment lifecycle-safe. - Keep Torrent progress, DHT, seed-capacity, and web-seed validation covered. - Ignore local TORRENT_FEATURES.md roadmap notes.
1001 lines
54 KiB
TypeScript
1001 lines
54 KiB
TypeScript
const common = {
|
||
navigation: {
|
||
library: 'Library',
|
||
filters: {
|
||
all: 'All',
|
||
active: 'Active',
|
||
completed: 'Completed',
|
||
unfinished: 'Unfinished',
|
||
},
|
||
categories: {
|
||
musics: 'Music',
|
||
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',
|
||
applyToAll: 'Apply to all',
|
||
renameAll: 'Rename all',
|
||
replaceAll: 'Replace all',
|
||
skipAll: 'Skip all',
|
||
},
|
||
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',
|
||
seeding: 'Seeding',
|
||
waitingToSeed: 'Waiting to seed',
|
||
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',
|
||
connectionCount: '{{active}}/{{total}}',
|
||
connectionCountUnknown: '—/{{total}}',
|
||
connectionsUnavailable: '—',
|
||
speedCap: 'Speed cap',
|
||
liveSpeedLimit: 'Live speed cap',
|
||
liveSpeedLimitHint: 'Applies to active normal downloads only. Media downloads cannot be changed while running.',
|
||
liveSpeedLimitPlaceholder: 'e.g. 1024K',
|
||
liveSpeedLimitApply: 'Apply',
|
||
liveSpeedLimitClear: 'Clear',
|
||
liveSpeedLimitFailed: 'Could not update live speed cap: {{detail}}',
|
||
liveSpeedLimitUnavailable: 'Live speed control is unavailable for media downloads while running.',
|
||
liveTorrentUploadLimit: 'Live Torrent upload limit',
|
||
liveTorrentUploadLimitHint: 'Applies to active Torrent downloads and seeding. Clear it to remove the per-Torrent upload cap.',
|
||
liveTorrentUploadLimitPlaceholder: 'e.g. 1024K',
|
||
liveTorrentUploadLimitFailed: 'Could not update the live Torrent upload limit: {{detail}}',
|
||
liveTorrentPeerOptions: 'Live Torrent peer controls',
|
||
liveTorrentPeerOptionsApply: 'Apply peer controls',
|
||
liveTorrentPeerOptionsHint: 'Changes apply without replacing the active Torrent. Leave blank to use Aria2 defaults.',
|
||
torrentPeerOptionsSavedHint: 'Saved per Torrent. 0 peers means unlimited; blank uses Aria2 defaults.',
|
||
torrentTrackers: 'Additional Torrent trackers',
|
||
torrentTrackersHint: 'One HTTP, HTTPS, or UDP tracker per line. Optional comma-separated entries are also accepted; credentials are not allowed.',
|
||
torrentTrackersInvalid: 'Torrent tracker list is invalid. Use HTTP, HTTPS, or UDP tracker URLs without credentials.',
|
||
torrentExcludeTrackers: 'Excluded Torrent trackers',
|
||
torrentExcludeTrackersHint: 'One HTTP, HTTPS, or UDP tracker per line, or * to exclude all announce URLs. Credentials are not allowed; DHT and PEX settings are unchanged.',
|
||
torrentExcludeTrackersInvalid: 'Excluded Torrent tracker list is invalid. Use HTTP, HTTPS, or UDP tracker URLs without credentials, or *.',
|
||
torrentTrackerConnectTimeout: 'Tracker connect timeout',
|
||
torrentTrackerTimeout: 'Tracker request timeout',
|
||
torrentTrackerInterval: 'Tracker interval',
|
||
torrentTrackerTimingHint: 'Connect timeout covers establishing a tracker connection; request timeout covers the response afterward. Blank values keep Aria2’s 60-second defaults, and interval 0 follows tracker response and download progress.',
|
||
torrentTrackerTimeoutInvalid: 'Tracker timeout must be a whole number from 1 to 604800 seconds',
|
||
torrentTrackerIntervalInvalid: 'Tracker interval must be a whole number from 0 to 604800 seconds',
|
||
torrentVerifyIntegrity: 'Verify Torrent integrity',
|
||
torrentVerifyIntegrityHint: 'Applied when this Torrent starts or retries. It may recheck pieces and download damaged data; active transfers cannot change it.',
|
||
torrentMaxPeers: 'Maximum Torrent peers',
|
||
torrentPeerSpeedLimit: 'Peer speed threshold',
|
||
torrentMaxPeersInvalid: 'Torrent maximum peers must be an integer from 0 to 1000',
|
||
torrentPeerSpeedLimitInvalid: 'Torrent peer speed threshold must be greater than zero',
|
||
torrentPeerDiagnostics: 'Torrent peer diagnostics',
|
||
torrentPeerDiagnosticsRefresh: 'Refresh',
|
||
torrentPeerDiagnosticsLoading: 'Loading peer diagnostics…',
|
||
torrentPeerDiagnosticsUnavailable: 'Peer diagnostics are available while this Torrent is active.',
|
||
torrentPeerDiagnosticsFailed: 'Could not read Torrent peer diagnostics.',
|
||
torrentPeerDiagnosticsHint: 'Speeds and connection flags only are shown; peer IPs, ports, IDs, and bitfields are not retained.',
|
||
torrentFileProgress: 'Torrent file progress',
|
||
torrentFileProgressRefresh: 'Refresh',
|
||
torrentFileProgressLoading: 'Loading file progress…',
|
||
torrentFileProgressUnavailable: 'File progress is available while this Torrent is active or paused.',
|
||
torrentFileProgressFailed: 'Could not read Torrent file progress.',
|
||
torrentFileProgressHint: 'Validated relative paths and completed bytes are shown; daemon paths and URIs are not exposed.',
|
||
torrentFileProgressPath: 'File',
|
||
torrentFileProgressCompleted: 'Completed',
|
||
torrentFileProgressSelected: 'Selected',
|
||
torrentFileProgressUnselected: 'Not selected',
|
||
torrentPieceProgress: 'Torrent piece progress',
|
||
torrentPieceProgressRefresh: 'Refresh',
|
||
torrentPieceProgressLoading: 'Loading piece progress…',
|
||
torrentPieceProgressUnavailable: 'Piece progress is available while this Torrent is active or paused.',
|
||
torrentPieceProgressFailed: 'Could not read Torrent piece progress.',
|
||
torrentPieceProgressHint: 'Each cell summarizes adjacent pieces. Raw bitfields are never exposed.',
|
||
torrentPieceProgressSummary: '{{completed}} of {{total}} pieces complete · {{size}} each',
|
||
torrentPieceProgressMap: 'Torrent piece completion map',
|
||
torrentWebSeeds: 'Torrent web seeds',
|
||
torrentWebSeedsHint: 'One line per seed in the form file index|HTTP(S) URI. Firelink expands multi-file paths natively.',
|
||
torrentWebSeedsPlaceholder: '0|https://mirror.example/torrent/',
|
||
torrentWebSeedsApply: 'Apply web seeds',
|
||
torrentWebSeedsLoading: 'Applying…',
|
||
torrentWebSeedsFailed: 'Could not validate or apply the Torrent web seeds.',
|
||
torrentPeerCount: '{{total}} peers · {{seeders}} seeders',
|
||
torrentPeerDownload: 'Download',
|
||
torrentPeerUpload: 'Upload',
|
||
torrentPeerSeeder: 'Seeder',
|
||
torrentPeerAmChoking: 'Firelink choking',
|
||
torrentPeerChoking: 'Peer choking',
|
||
torrentPeerShowing: 'Showing {{shown}} of {{total}} peers.',
|
||
seconds: 'seconds',
|
||
torrentStopTimeout: 'Stop stalled Torrent after',
|
||
torrentStopTimeoutHint: 'Aria2 stops this Torrent after this many consecutive seconds at 0 B/s. 0 disables the policy; changes apply when the Torrent starts or retries.',
|
||
torrentStopTimeoutInvalid: 'Torrent stall timeout must be a whole number from 0 to 604800 seconds',
|
||
torrentPrioritizePiece: 'Prioritize Torrent pieces',
|
||
torrentPrioritizePieceHint: 'Optional Aria2 preview policy: head, tail, or both; each may use a size such as 1M. Changes apply when the Torrent starts or retries.',
|
||
torrentPrioritizePieceInvalid: 'Torrent piece priority must use head and/or tail with optional K or M sizes between 1K and 1024M',
|
||
torrentEncryptionPolicy: 'Torrent encryption policy',
|
||
torrentEncryptionPolicyHint: 'Applied when this Torrent starts or retries. Choose one policy so the handshake and payload encryption settings stay consistent.',
|
||
torrentEncryptionDisabled: 'Disabled',
|
||
torrentEncryptionRequireCrypto: 'Require obfuscated handshake',
|
||
torrentEncryptionForceEncryption: 'Force encrypted payload (ARC4)',
|
||
torrentEncryptionPolicyInvalid: 'Choose a valid Torrent encryption policy',
|
||
torrentRemoveUnselectedFile: 'Delete unselected Torrent files after completion',
|
||
torrentRemoveUnselectedFileHint: 'Only applies when a subset of files is selected. Aria2 permanently deletes the other files after the Torrent completes.',
|
||
torrentRemoveUnselectedFileConfirm: 'Delete {{count}} unselected Torrent files after completion? This cannot be undone.',
|
||
torrentRemoveUnselectedFileSelectionRequired: 'Select a subset of Torrent files before enabling unselected-file removal.',
|
||
liveTorrentPeerOptionsFailed: 'Could not update live Torrent peer controls: {{detail}}',
|
||
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...',
|
||
waitingForPrompt: 'Waiting for system prompt…',
|
||
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: {
|
||
loading: 'Loading…',
|
||
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}}',
|
||
queueConcurrency: 'Concurrent downloads',
|
||
queueConcurrencyGlobal: 'Use global limit',
|
||
queueConcurrencyFailed: 'Could not update queue concurrency: {{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',
|
||
},
|
||
columnOptions: {
|
||
open: 'Column options for {{column}}',
|
||
dragToReorder: 'Drag to reorder columns',
|
||
alignContent: 'Align content position',
|
||
left: 'Left',
|
||
center: 'Center',
|
||
right: 'Right',
|
||
resetLayout: 'Reset column layout',
|
||
},
|
||
addDownload: 'Add Download',
|
||
resumeAll: 'Resume All',
|
||
pauseAll: 'Pause All',
|
||
summary: {
|
||
items: '{{count}} items',
|
||
selected: '{{count}} selected',
|
||
downloaded: 'Downloaded',
|
||
remaining: 'Remaining',
|
||
active: 'Active',
|
||
unknown: 'Unknown',
|
||
estimated: 'Estimated {{value}}',
|
||
},
|
||
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',
|
||
queueReorderHint: 'Drag rows to reorder or use the hotkeys:',
|
||
queueReorderShortcut: '{{key}} + Arrow Up/Down moves the focused row',
|
||
queuePriorityControls: 'Move selected downloads in the queue',
|
||
queueDragHandle: 'Drag {{fileName}} to reorder',
|
||
queueReorderFailed: 'Could not reorder 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',
|
||
updatedOne: '1 download updated',
|
||
updatedMany: '{{count}} downloads updated',
|
||
urlAlreadyQueued: 'URL already in queue',
|
||
destinationConflict: 'Another selected download uses this destination',
|
||
existingDownloadDestination: 'Existing Firelink download uses this destination',
|
||
matchingDownloadFilename: 'An unfinished download already has this filename',
|
||
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, SFTP, or magnet URLs here... You can also choose .torrent files below.\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',
|
||
torrentFiles: 'Torrent files',
|
||
chooseTorrentFiles: 'Add .torrent files',
|
||
torrentMetadataPending: 'Aria2 will resolve the magnet metadata when the transfer starts.',
|
||
torrentSeeding: 'Torrent seeding',
|
||
seedAfterDownload: 'Seed after download completes',
|
||
seedTime: 'Seed time',
|
||
minutes: 'minutes',
|
||
seconds: 'seconds',
|
||
seedRatio: 'Seed ratio',
|
||
seedRatioHint: '0 means time-only seeding; otherwise seeding stops at the first limit reached.',
|
||
limitTorrentUpload: 'Limit torrent upload',
|
||
torrentUploadLimit: 'Torrent upload limit',
|
||
torrentSeedTimeInvalid: 'Torrent seed time must be greater than zero',
|
||
torrentSeedRatioInvalid: 'Torrent seed ratio must be zero or greater',
|
||
torrentUploadLimitInvalid: 'Torrent upload limit must be greater than zero',
|
||
torrentTrackers: 'Additional Torrent trackers',
|
||
torrentTrackersHint: 'Saved with this Torrent and applied on its next start or retry.',
|
||
torrentTrackersInvalid: 'Torrent tracker list is invalid. Use HTTP, HTTPS, or UDP tracker URLs without credentials.',
|
||
torrentExcludeTrackers: 'Excluded Torrent trackers',
|
||
torrentExcludeTrackersHint: 'Saved with this Torrent and applied on its next start or retry. * excludes all announce URLs; DHT and PEX settings are unchanged.',
|
||
torrentExcludeTrackersInvalid: 'Excluded Torrent tracker list is invalid. Use HTTP, HTTPS, or UDP tracker URLs without credentials, or *.',
|
||
torrentTrackerConnectTimeout: 'Tracker connect timeout',
|
||
torrentTrackerTimeout: 'Tracker request timeout',
|
||
torrentTrackerInterval: 'Tracker interval',
|
||
torrentTrackerTimingHint: 'Saved with this Torrent and applied on its next start or retry. Connect timeout covers establishing the connection; request timeout covers the response afterward. Blank values keep Aria2’s 60-second defaults, and interval 0 follows tracker response and download progress.',
|
||
torrentTrackerTimeoutInvalid: 'Tracker timeout must be a whole number from 1 to 604800 seconds',
|
||
torrentTrackerIntervalInvalid: 'Tracker interval must be a whole number from 0 to 604800 seconds',
|
||
torrentVerifyIntegrity: 'Verify Torrent integrity',
|
||
torrentVerifyIntegrityHint: 'Recheck piece hashes when starting or retrying; damaged pieces may be downloaded again.',
|
||
torrentMaxPeers: 'Maximum Torrent peers',
|
||
torrentPeerSpeedLimit: 'Peer speed threshold',
|
||
torrentPeerOptionsHint: 'Leave blank for Aria2 defaults (55 peers and 50K). 0 peers means unlimited.',
|
||
torrentMaxPeersInvalid: 'Torrent maximum peers must be an integer from 0 to 1000',
|
||
torrentPeerSpeedLimitInvalid: 'Torrent peer speed threshold must be greater than zero',
|
||
torrentStopTimeout: 'Stop stalled Torrent after',
|
||
torrentStopTimeoutHint: 'Aria2 stops this Torrent after this many consecutive seconds at 0 B/s. 0 disables the policy.',
|
||
torrentStopTimeoutInvalid: 'Torrent stall timeout must be a whole number from 0 to 604800 seconds',
|
||
torrentPrioritizePiece: 'Prioritize Torrent pieces',
|
||
torrentPrioritizePieceHint: 'Saved with this Torrent and applied on its next start or retry. Use head, tail, or both with optional K or M sizes.',
|
||
torrentPrioritizePieceInvalid: 'Torrent piece priority must use head and/or tail with optional K or M sizes between 1K and 1024M',
|
||
torrentEncryptionPolicy: 'Torrent encryption policy',
|
||
torrentEncryptionPolicyHint: 'Saved with this Torrent and applied on its next start or retry. The selected policy keeps Aria2 encryption settings consistent.',
|
||
torrentEncryptionDisabled: 'Disabled',
|
||
torrentEncryptionRequireCrypto: 'Require obfuscated handshake',
|
||
torrentEncryptionForceEncryption: 'Force encrypted payload (ARC4)',
|
||
torrentEncryptionPolicyInvalid: 'Choose a valid Torrent encryption policy',
|
||
torrentRemoveUnselectedFile: 'Delete unselected Torrent files after completion',
|
||
torrentRemoveUnselectedFileHint: 'Only applies when a selected subset is configured. The unselected files are not Firelink-owned and are permanently removed when the Torrent completes.',
|
||
torrentRemoveUnselectedFileConfirm: 'Enable permanent deletion of unselected Torrent files after completion? This cannot be undone.',
|
||
torrentRemoveUnselectedFileSelectionRequired: 'Select a subset of Torrent files before enabling unselected-file removal.',
|
||
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',
|
||
quality: 'Quality',
|
||
format: 'Format',
|
||
video: 'Video',
|
||
audio: 'Audio',
|
||
noCommonFormat: 'No single format is available for all selected items.',
|
||
noCommonQuality: 'No single quality is available for all selected items.',
|
||
playlistQuality: 'Playlist quality',
|
||
playlistQualitySelected: '{{selected}} of {{total}} selected',
|
||
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.',
|
||
dedicatedFolder: 'Save in a new folder',
|
||
dedicatedFolderName: 'Folder name',
|
||
dedicatedFolderDescription: 'Creates this folder inside each automatic category folder.',
|
||
dedicatedFolderManualDescription: 'Creates this folder inside the selected save location.',
|
||
saveFolderName: 'Save folder name',
|
||
dedicatedFolderNameRequired: 'Enter a folder name before saving.',
|
||
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.',
|
||
correctInvalidOne: 'Correct or remove {{count}} invalid URL before continuing.',
|
||
correctInvalidFew: 'Correct or remove {{count}} invalid URLs before continuing.',
|
||
correctInvalidMany: 'Correct or remove {{count}} invalid URLs before continuing.',
|
||
waitingForMetadataOne: 'Waiting for metadata for {{count}} download.',
|
||
waitingForMetadataFew: 'Waiting for metadata for {{count}} downloads.',
|
||
waitingForMetadataMany: 'Waiting for metadata for {{count}} downloads.',
|
||
removeUnsafeOne: 'Remove {{count}} unsafe URL before continuing.',
|
||
removeUnsafeFew: 'Remove {{count}} unsafe URLs before continuing.',
|
||
removeUnsafeMany: 'Remove {{count}} unsafe URLs before continuing.',
|
||
mediaMetadataUnavailableSummaryOne: 'Media metadata is unavailable for {{count}} item. Refresh metadata before adding.',
|
||
mediaMetadataUnavailableSummaryFew: 'Media metadata is unavailable for {{count}} items. Refresh metadata before adding.',
|
||
mediaMetadataUnavailableSummaryMany: 'Media metadata is unavailable for {{count}} items. Refresh metadata before adding.',
|
||
metadataUnavailableFallback: 'Metadata is unavailable. Downloads can still be added using fallback details.',
|
||
fallbackReadyOne: '{{ready}} download ready; {{failed}} will use fallback filename and unknown size.',
|
||
fallbackReadyFew: '{{ready}} downloads ready; {{failed}} will use fallback filename and unknown size.',
|
||
fallbackReadyMany: '{{ready}} downloads ready; {{failed}} will use fallback filename and unknown size.',
|
||
readyToAddOne: 'Ready to add {{count}} download.',
|
||
readyToAddFew: 'Ready to add {{count}} downloads.',
|
||
readyToAddMany: 'Ready to add {{count}} downloads.',
|
||
},
|
||
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: {
|
||
language: 'Language',
|
||
languageAndRegion: 'Language & region',
|
||
layout: 'Layout',
|
||
languageDescription: 'Choose the Firelink interface language.',
|
||
sidebarPosition: 'Sidebar position',
|
||
sidebarPositionDescription: 'Choose where the sidebar appears. Automatic follows the interface direction.',
|
||
sidebarPositionAutomatic: 'Automatic (recommended)',
|
||
sidebarPositionLeft: 'Left',
|
||
sidebarPositionRight: 'Right',
|
||
windowControls: 'Window controls',
|
||
windowControlStyle: 'Control style',
|
||
windowControlsDescription: 'Choose how Firelink draws its custom window buttons. Automatic follows your operating system.',
|
||
windowControlStyleAutomatic: 'Automatic (recommended)',
|
||
windowControlStyleMacos: 'macOS Traffic Lights',
|
||
windowControlStyleWindows: 'Windows 11 Fluent',
|
||
windowControlStyleGnome: 'GNOME / Adwaita',
|
||
windowControlStyleMinimal: 'Minimal',
|
||
languageSystem: 'System default',
|
||
languageEnglish: 'English',
|
||
languageChinese: 'Simplified Chinese',
|
||
languageHebrew: 'Hebrew',
|
||
languagePersian: 'Persian',
|
||
languageUkrainian: 'Ukrainian',
|
||
languageRussian: 'Russian',
|
||
calendar: 'Calendar',
|
||
calendarDescription: 'Choose the calendar used for displayed dates and times. Gregorian is the default; this does not change scheduling or stored timestamps.',
|
||
calendarGregorian: 'Gregorian',
|
||
calendarPersian: 'Persian',
|
||
calendarHebrew: 'Hebrew',
|
||
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',
|
||
fontFamily: 'Font',
|
||
fontFamilyDescription: 'Choose the interface font. System uses platform and locale-aware fallbacks.',
|
||
fontFamilySystem: 'System UI (recommended)',
|
||
fontFamilyInter: 'Inter',
|
||
fontFamilyOutfit: 'Outfit',
|
||
fontFamilyVazirmatn: 'Vazirmatn',
|
||
fontFamilyNotoSansHebrew: 'Noto Sans Hebrew',
|
||
fontFamilyNotoSansSc: 'Noto Sans SC',
|
||
fontFamilyRoboto: 'Roboto',
|
||
fontFamilySerif: 'Serif',
|
||
fontFamilyMonospace: 'Monospace',
|
||
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.',
|
||
torrentPeerDiscovery: 'BitTorrent peer discovery',
|
||
torrentDht: 'IPv4 DHT and UDP trackers',
|
||
torrentDhtDescription: 'Find peers without relying only on trackers. Disabling this also disables UDP tracker support.',
|
||
torrentDht6: 'IPv6 DHT',
|
||
torrentDht6Description: 'Use IPv6 for distributed peer discovery when the network provides a usable IPv6 path.',
|
||
torrentPex: 'Peer Exchange (PEX)',
|
||
torrentPexDescription: 'Allow connected peers to share additional peer addresses.',
|
||
torrentLpd: 'Local Peer Discovery (LPD)',
|
||
torrentLpdDescription: 'Discover compatible peers on the local network. This increases local network visibility.',
|
||
torrentPeerDiscoveryRestartNote: 'These options are global to Aria2 and take effect after Firelink restarts. Aria2 still disables peer discovery for private torrents.',
|
||
torrentNetwork: 'BitTorrent network binding',
|
||
torrentAdvanced: 'Advanced Torrent network',
|
||
torrentDhtMessageTimeout: 'DHT message timeout',
|
||
torrentDhtMessageTimeoutDescription: 'Whole seconds for DHT and UDP message waits. This does not affect remote .torrent HTTP fetches or HTTP tracker requests. Applies after Firelink restarts.',
|
||
torrentSeparateSeedSlots: 'Separate seeding capacity',
|
||
torrentSeparateSeedSlotsDescription: 'Keep seeding outside the download limit and cap it with a Firelink-managed pool.',
|
||
torrentMaxConcurrentSeeds: 'Maximum concurrent seeds',
|
||
torrentMaxConcurrentSeedsDescription: 'Maximum number of Torrents Firelink lets seed at once when separate capacity is enabled.',
|
||
torrentListenPort: 'TCP peer ports',
|
||
torrentListenPortDescription: 'TCP ports for incoming BitTorrent peer connections. Leave blank for Aria2’s default range.',
|
||
torrentDhtListenPort: 'UDP/DHT ports',
|
||
torrentDhtListenPortDescription: 'UDP ports for DHT and UDP trackers. Leave blank for Aria2’s default range.',
|
||
torrentExternalIp: 'External IP address',
|
||
torrentExternalIpDescription: 'Address announced to peers and trackers when the host is behind NAT. Leave blank unless you know the reachable address.',
|
||
torrentExternalIpPlaceholder: '203.0.113.7',
|
||
torrentDhtEntryPoint: 'IPv4 DHT entry point',
|
||
torrentDhtEntryPointDescription: 'Optional bootstrap host and port, for example router.example:6881.',
|
||
torrentDhtEntryPoint6: 'IPv6 DHT entry point',
|
||
torrentDhtEntryPoint6Description: 'Optional IPv6 bootstrap address and port in bracketed form, for example [2001:db8::1]:6881.',
|
||
torrentDhtListenAddr6: 'IPv6 DHT listen address',
|
||
torrentDhtListenAddr6Description: 'IPv6 address for the DHT socket. Leave blank to let Aria2 choose.',
|
||
torrentLpdInterface: 'LPD interface',
|
||
torrentLpdInterfaceDescription: 'Network interface name or address used for Local Peer Discovery. Leave blank for the default interface.',
|
||
torrentPeerIdPrefix: 'Peer ID prefix',
|
||
torrentPeerIdPrefixDescription: 'Overrides the BitTorrent peer-ID prefix. Use only if you understand the privacy and protocol-identity impact; leave blank for Aria2’s default.',
|
||
torrentPeerAgent: 'Peer agent',
|
||
torrentPeerAgentDescription: 'Overrides the client string sent in the BitTorrent extended handshake. This changes protocol identity and may affect compatibility; leave blank for Aria2’s default.',
|
||
torrentNetworkRestartNote: 'These settings are launch-scoped and apply after Firelink restarts. Opening ports may require router port forwarding and an operating-system firewall rule; availability depends on the platform and network.',
|
||
torrentResourceLimits: 'BitTorrent resource limits',
|
||
torrentMaxOpenFiles: 'Maximum open Torrent files',
|
||
torrentMaxOpenFilesDescription: 'Global Aria2 limit for files open at once in multi-file Torrents. Lower values reduce file-descriptor use; the default is 100. Changes apply to new Torrents without restarting Aria2, and this does not raise your operating system limit.',
|
||
torrentMaxOpenFilesUpdateFailed: 'Could not apply the Torrent open-file limit: {{detail}}',
|
||
torrentOverallUploadLimit: 'Overall Aria2 upload limit',
|
||
torrentOverallUploadLimitDescription: 'Caps combined Aria2 upload traffic, primarily active Torrent seeding in Firelink. Leave blank for unlimited; the value is applied live and restored when Firelink restarts.',
|
||
torrentOverallUploadLimitInvalid: 'Enter a valid upload limit, such as 512K or 2M.',
|
||
torrentOverallUploadLimitUpdateFailed: 'Could not apply the overall Aria2 upload limit: {{detail}}',
|
||
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',
|
||
rememberLastUsedDownloadDirectory: 'Remember the last used download directory',
|
||
rememberLastUsedDownloadDirectoryDescription: 'Use the last folder selected in the Add window for the next download until the app restarts.',
|
||
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.',
|
||
preventDisplaySleep: 'Keep the display awake while downloads are active',
|
||
preventDisplaySleepDescription: 'Optional and separate from system-sleep prevention. The display will remain on until active transfers finish.',
|
||
},
|
||
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',
|
||
seeding: 'Seeding',
|
||
},
|
||
} as const;
|
||
|
||
export default common;
|