mirror of
https://github.com/nimbold/Firelink.git
synced 2026-08-24 09:46:29 +00:00
feat(i18n): add localization infrastructure and English catalog
Refs #17
This commit is contained in:
@@ -0,0 +1,711 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user