Files
FileCodeBoxFronted2026/src/i18n/locales/en-US.ts
T
orion b60c003ec2 优化 2026 前端无障碍与响应式体验
完善 2026 主题的移动端与桌面端交互体验,修复多项可访问性和信息展示问题。

- 允许浏览器缩放,补充焦点样式、按钮名称、表单标签和对话框键盘焦点管理\n- 支持 reduced-motion,扩大公共页、后台导航、记录列表和分页控件的触控区域\n- 优化系统设置分区导航、密码显示、字段语义和底部粘性保存栏\n- 压缩移动文件列表操作区,改善桌面表格滚动可达性和统计值截断\n- 优化仪表盘指标、趋势摘要、进度条语义及中英文文案
2026-07-21 11:05:23 +08:00

1023 lines
35 KiB
TypeScript

export default {
// Common
common: {
confirm: 'Confirm',
cancel: 'Cancel',
close: 'Close',
delete: 'Delete',
edit: 'Edit',
save: 'Save',
add: 'Add',
back: 'Back',
next: 'Next',
language: 'Select language',
switchToLight: 'Switch to light mode',
switchToDark: 'Switch to dark mode',
showPassword: 'Show password',
hidePassword: 'Hide password',
openMenu: 'Open navigation menu',
closeMenu: 'Close navigation menu',
dialog: 'Dialog',
previous: 'Previous',
loading: 'Loading...',
noData: 'No Data',
success: 'Success',
error: 'Error',
warning: 'Warning',
info: 'Information',
search: 'Search',
copy: 'Copy',
uploadSuccess: 'Upload successful',
uploadFailed: 'Upload failed',
copySuccess: 'Copy successful',
copyFailed: 'Copy failed',
deleteSuccess: 'Delete successful',
deleteFailed: 'Delete failed',
downloadSuccess: 'Download successful',
downloadFailed: 'Download failed',
shareSuccess: 'Share successful',
shareFailed: 'Share failed',
expiredFile: 'File has expired',
fileNotFound: 'File not found',
networkError: 'Network error',
unknownError: 'Unknown error',
invalidFileType: 'Invalid file type',
fileTooLarge: 'File too large',
uploadCanceled: 'Upload canceled',
processing: 'Processing',
pleaseWait: 'Please wait',
fileDetails: 'File Details',
enabled: 'Enabled',
disabled: 'Disabled',
minute: 'minute',
files: 'files',
second: 'second',
hour: 'hour',
day: 'day',
dayShort: 'd',
hourShort: 'h',
times: 'times',
appName: 'FileCodeBox - File Transfer',
appDescription: 'Ready-to-use file transfer system'
},
// Admin module
admin: {
logout: 'Logout',
dashboard: {
adminLabel: 'FileCodeBox Admin',
title: 'Dashboard',
totalFiles: 'Total Files',
storageSpace: 'Storage Space',
todayShares: 'Today Shares',
totalRetrievals: 'Total Retrievals',
activeFiles: 'Active files: {count}',
todayIncrease: 'Today added: {count}',
yesterdayShares: 'Yesterday: {count}',
serverUptime: 'Uptime',
refresh: 'Refresh',
refreshing: 'Refreshing',
lastUpdated: 'Last updated: {time}',
loadFailed: 'Failed to load dashboard data',
footerProduct: 'FileCodeBox Admin Console',
runtimeVersion: 'Runtime Version',
versionPending: 'Pending sync',
fileHealth: 'File Health',
fileHealthDesc: 'Status insights for available, risky, and pending file queues.',
activeFileRatio: 'Active Ratio',
fileShareRatio: 'File Ratio',
textShareRatio: 'Text Ratio',
binaryFiles: '{count} file shares',
textShares: '{count} text shares',
expiredFiles: 'Expired Files',
needCleanup: 'Clean up in file management',
chunkedFiles: 'Chunked Files',
storagePolicy: 'Storage & Upload Policy',
storagePolicyDesc: 'Current settings that affect upload behavior.',
storageBackend: 'Storage Backend',
singleFileLimit: 'Single File Limit',
guestUpload: 'Guest Upload',
maxSaveTime: 'Max Retention',
noSaveLimit: 'Unlimited',
todayCapacityReference: 'Today Size / Single File Limit',
healthActions: {
attention: {
title: 'Needs Attention',
description: 'Handle issue and warning files together'
},
storageIssue: {
title: 'Storage Issues',
description: 'Review files missing download metadata'
},
expiringSoon: {
title: 'Expiring Soon',
description: 'Extend shares that should stay available'
},
neverRetrieved: {
title: 'Never Retrieved',
description: 'Find shares that have not been retrieved yet'
},
permanent: {
title: 'Permanent',
description: 'View long-retention share records'
}
},
topDownloads: {
title: 'Top 5 Downloads',
description: 'Downloads and traffic in the selected date range',
file: 'File',
downloads: 'Downloads',
traffic: 'Traffic',
status: 'Status',
empty: 'No download records',
current: 'Current',
history: 'Historical'
},
trend: {
title: 'Download / Upload Trend',
mobileHint: 'Tap or slide to inspect; drag the bottom date axis to pan',
startDate: 'Start date',
endDate: 'End date',
zoomIn: 'Zoom in',
zoomOut: 'Zoom out',
reset: 'Reset',
noData: 'No data',
loadFailed: 'Failed to load analytics',
summary: '{window}: {downloads} downloads / {downloadTraffic}, {uploads} uploads / {uploadTraffic}'
}
},
fileManage: {
title: 'File Management'
},
settings: {
title: 'System Settings',
basicSettings: 'General',
websiteInfo: 'Site Information',
websiteName: 'Site Name',
websiteDescription: 'Site Description',
siteName: 'Site Name',
adminPassword: 'Admin Password',
passwordPlaceholder: 'Enter new password to change',
passwordNote: 'Leave empty to keep current',
keywords: 'SEO Keywords',
themeSelection: 'Theme',
robotsFile: 'Robots.txt Configuration',
notificationSettings: 'Notifications',
notificationTitle: 'Announcement Title',
notificationContent: 'Announcement Content',
storageSettings: 'Storage',
storagePath: 'Storage Path',
storagePathPlaceholder: 'Leave empty for default path',
storageMethod: 'Storage Type',
localStorage: 'Local Storage',
s3Storage: 'S3 Object Storage',
webdavStorage: 'WebDAV Storage',
chunkUploadNote: 'Chunked Upload (experimental, better for large files)',
s3AccessKeyId: 'Access Key ID',
s3SecretAccessKey: 'Secret Access Key',
s3BucketName: 'Bucket Name',
s3EndpointUrl: 'Endpoint URL',
s3RegionName: 'Region Name',
s3SignatureVersion: 'Signature Version',
s3Hostname: 'Custom Domain',
s3v2: 'S3v2',
s3v4: 'S3v4',
autoPlaceholder: 'Auto-detect',
enabled: 'Enabled',
disabled: 'Disabled',
webdavUrl: 'Enter WebDAV server URL',
webdavUsername: 'Enter WebDAV username',
webdavPassword: 'Enter WebDAV password',
webdavUrlPlaceholder: 'Enter WebDAV server URL',
webdavUsernamePlaceholder: 'Enter WebDAV username',
webdavPasswordPlaceholder: 'Enter WebDAV password',
enableProxy: 'Enable Download Proxy',
uploadLimits: 'Upload Settings',
uploadRateLimit: 'Time Window (limit uploads within this period)',
uploadPerMinute: 'Time Window (limit uploads within this period)',
minute: 'min',
uploadCountLimit: 'Max Files Allowed (within the time window)',
files: 'files',
fileSizeLimit: 'Max File Size',
expirationMethod: 'Expiration Options',
expirationType: 'Expiration Options',
expiration: {
day: 'Days',
hour: 'Hours',
minute: 'Minutes',
forever: 'Never Expire',
count: 'Download Count'
},
maxSaveTime: 'Max Retention Period',
timeUnits: {
second: 'sec',
minute: 'min',
hour: 'hr',
day: 'day'
},
guestUpload: 'Allow Guest Uploads',
errorLimits: 'Access Protection',
errorRateLimit: 'Detection Window (count errors within this period)',
errorPerMinute: 'Detection Window (count errors within this period)',
errorCountLimit: 'Max Errors Allowed (block after exceeding)',
times: 'times',
saveChanges: 'Save Settings',
fileSizeUnits: {
kb: 'KB',
mb: 'MB',
gb: 'GB'
}
}
},
// Navigation
nav: {
sendFile: 'Send File',
retrieveFile: 'Retrieve',
fileRecords: 'File Records'
},
// Retrieve page
retrieve: {
title: 'File Retrieval',
codeInput: {
placeholder: 'Enter 5-digit retrieval code',
label: 'Retrieval Code'
},
submit: 'Retrieve',
needSendFile: 'Need to send a file? Click here',
recordsDrawer: 'Retrieval Records',
messages: {
invalidCode: 'Please enter a 5-digit retrieval code',
retrieveSuccess: 'File retrieved successfully',
invalidCodeError: 'Invalid retrieval code',
retrieveFailure: 'Failed to retrieve file: ',
networkError: 'Retrieval failed, please try again later: ',
unknownError: 'Unknown error',
previewUnavailable: 'Preview is unavailable, you can still retrieve directly'
},
workspace: {
sendFile: 'Send File',
inspect: 'Preview',
inspecting: 'Previewing',
retrieving: 'Retrieving',
ready: 'Ready',
noPreview: 'Waiting for a code',
noPreviewDesc:
'Enter a 5-character retrieval code to preview file details before consuming a retrieval.',
latestRecord: 'Latest Retrieval',
noRecord: 'No retrieval records yet',
currentCode: 'Code',
fileSize: 'File Size',
viewDetail: 'View Detail',
historyCount: '{count} records',
openRecords: 'Open retrieval records',
security: 'Safe Retrieval',
securityState:
'Previewing does not consume retrieval count. Access is recorded only after confirmation.',
noExpiry: 'No limit',
unlimited: 'Unlimited',
remainingCount: '{count} left',
textType: 'Text Content',
fileType: 'File Download',
expiresAt: 'Expires At',
remainingDownloads: 'Remaining',
usedCount: 'Retrieved',
emptyCode: 'Empty',
previewState: 'Preview State',
waiting: 'Waiting'
}
},
// Send page
send: {
title: 'File Send',
sendText: 'Send Text',
uploadArea: {
dragText: 'Drag files here or',
clickText: 'click to select files',
textInput: 'Enter text to send here...',
placeholder: 'Click or drag files here to upload',
description: 'Supports various common formats',
descriptionWithLimit: 'Supports common formats, up to {size}',
retry: 'Retry',
selectedFiles: '{count} files selected',
status: {
initializing: 'Preparing upload...',
uploading: 'Uploading files...',
confirming: 'Confirming upload...',
success: 'Upload complete!'
}
},
submit: 'Secure Send',
submitting: 'Sending...',
needRetrieveFile: 'Need to retrieve? Click here',
sendRecords: 'Send Records',
secureEncryption: 'Secure Encryption',
workspace: {
uploadLimit: 'Single File Limit',
uploadMode: 'Upload Mode',
standardMode: 'Standard',
chunkMode: 'Chunked',
guestPolicy: 'Guest Upload',
guestOpen: 'Allowed',
guestClosed: 'Disabled',
currentTask: 'Current Task',
awaitingFile: 'Waiting for files',
fileReady: '{count} files ready',
textDraft: 'Text draft, {count} chars',
payload: 'Payload',
expirationPreview: 'Expiration',
security: 'Security',
latestRecord: 'Latest Send',
noRecord: 'No records yet',
copyLink: 'Copy Link',
viewDetail: 'View Detail',
historyTitle: 'Send History',
historyCount: '{count} records',
openRecords: 'Open send records'
},
fileDetails: 'File Details',
expirationMethod: 'Expiration Method',
expiration: {
day: 'By Day',
hour: 'By Hour',
minute: 'By Minute',
forever: 'Forever',
count: 'By Count',
label: 'Expiration Time',
method: 'Expiration method',
increment: 'Increase expiration value',
decrement: 'Decrease expiration value',
placeholders: {
days: 'Enter days',
hours: 'Enter hours',
minutes: 'Enter minutes',
count: 'Enter view count',
forever: 'Forever',
default: 'Enter value'
},
units: {
days: 'days',
hours: 'hours',
minutes: 'minutes',
times: 'times',
forever: 'Forever'
}
},
time: {
day: 'By Day',
hour: 'By Hour',
minute: 'By Minute',
forever: 'Forever',
count: 'By Count'
},
messages: {
selectFile: 'Please select a file to upload',
enterText: 'Please enter text to send',
enterExpirationValue: 'Please enter expiration value',
expirationTooLong: 'Expiration time cannot exceed {days} days',
sendSuccess: 'File sent successfully! Retrieve code: {code}',
initChunkUploadFailed: 'Failed to initialize chunk upload',
chunkUploadFailed: 'Chunk {index} upload failed',
completeUploadFailed: 'Failed to complete upload',
uploadFailed: 'Upload failed, please try again later',
guestUploadDisabled: 'Guest upload feature is disabled',
fileSizeExceeded: 'File size exceeds limit ({size})',
serverError: 'Server response error',
sendFailed: 'Send failed, please try again later',
expiresAfterCount: 'Expires after {count} times',
expiresAt: 'Expires at {date}',
emptyFileError: 'Cannot read empty file',
fileAddedFromClipboard: 'File added from clipboard: {filename}',
fileProcessingFailed: 'File processing failed',
expiresAfter: 'Expires after {value} {unit}'
}
},
// File records
fileRecord: {
filename: 'Filename',
size: 'Size',
date: 'Date',
code: 'Code',
actions: 'Actions',
download: 'Download',
viewDetails: 'View Details',
deleteRecord: 'Delete Record',
preview: 'Preview',
copyContent: 'Copy Content',
contentCopied: 'Content copied to clipboard',
copyFailed: 'Copy failed, please try again'
},
// File Detail Modal
fileDetail: {
title: 'File Details',
content: 'File Content',
previewContent: 'Preview Content',
download: 'Click to Download',
qrCode: 'Retrieve QR Code',
scanQrCode: 'Scan QR code for quick retrieval'
},
// Content Preview Modal
contentPreview: {
title: 'Content Preview'
},
// File Management
fileManage: {
title: 'File Management',
subtitle: '{count} share records. Filter by status, type, and usage.',
searchPlaceholder: 'Search code, name, or text...',
allFiles: 'All Files',
detail: 'Details',
detailTitle: 'File Details',
detailLoading: 'Loading details...',
detailFailed: 'Failed to load details',
editFileInfo: 'Edit File Information',
saveChanges: 'Save Changes',
refresh: 'Refresh List',
resetFilters: 'Reset Filters',
totalFiles: 'All Records',
activeFiles: 'Available',
expiredFiles: 'Expired',
storageUsed: 'Storage Used',
statusLabel: 'Status',
typeLabel: 'Type',
healthLabel: 'Health',
viewPreset: 'View',
viewPresetCustom: 'Custom Filters',
viewPresetAll: 'All Files',
viewPresetAttention: 'Needs Attention',
viewPresetExpiringSoon: 'Expiring Soon',
viewPresetStorageIssue: 'Storage Issues',
viewPresetNeverRetrieved: 'Never Retrieved',
viewPresetPermanent: 'Permanent',
saveViewPreset: 'Save View',
updateViewPreset: 'Update View',
deleteViewPreset: 'Delete View',
viewPresetNamePrompt: 'Enter a view name',
viewPresetSaveSuccess: 'View saved',
viewPresetSaveFailed: 'Failed to save view',
viewPresetDeleteConfirm: 'Delete view "{name}"?',
viewPresetDeleteSuccess: 'View deleted',
viewPresetDeleteFailed: 'Failed to delete view',
viewPresetLoadFailed: 'Failed to load saved views; using built-in views',
all: 'All',
active: 'Available',
expired: 'Expired',
fileType: 'File',
textType: 'Text',
chunkedType: 'Chunked',
healthFilters: {
all: 'All',
attention: 'Needs Attention',
danger: 'Issues',
warning: 'Warnings',
expiringSoon: 'Expiring Soon',
storageIssue: 'Storage Issues',
neverRetrieved: 'Never Retrieved',
healthy: 'Healthy',
permanent: 'Permanent'
},
sortBy: 'Sort',
sortOrder: 'Direction',
unlimited: 'Unlimited',
remaining: '{count} left',
loadError: 'Failed to load file list',
noMatches: 'No matching files',
viewText: 'View',
textPreview: 'Text Preview',
copyText: 'Copy Text',
copyCode: 'Copy Code',
copyLink: 'Copy Link',
copySuccess: 'Text copied to clipboard',
copyCodeSuccess: 'Retrieve code copied to clipboard',
copyLinkSuccess: 'Retrieve link copied to clipboard',
copyFailed: 'Copy failed, please try again',
charCount: '{count} characters',
downloadFile: 'Download File',
exportText: 'Export Text',
downloadSuccess: 'Downloaded: {name}',
exportSuccess: 'Exported: {name}',
downloadFailed: 'Download failed',
previewFailed: 'Failed to load preview',
loadingPreview: 'Loading preview...',
previewComplete: 'Loaded full content, {count} characters',
previewTruncated: 'Showing {shown} / {total} characters',
previewFallback: 'Preview endpoint unavailable; using text from the list',
selectCurrentPage: 'Select current page',
selectedCount: '{count} selected',
selectFile: 'Select {name}',
clearSelection: 'Clear Selection',
batchDelete: 'Batch Delete',
batchDeleteConfirm: 'Delete the selected {count} files? This action cannot be undone.',
batchDeleteSuccess: 'Deleted {count} files',
batchDeletePartialSuccess: 'Deleted {count} files, {failed} failed',
batchDeleteFailed: 'Batch delete failed',
batchEdit: 'Batch Edit',
batchEditTitle: 'Batch Edit File Policy',
batchEditSelected: 'Update the selected {count} files',
batchEditMode: 'Update Mode',
batchEditExpiresAt: 'Set Expiration Time',
batchEditRelativeExpire: 'Expire After Duration',
batchEditRelativeExpireValue: 'Expiration Duration',
batchEditRelativeExpirePlaceholder: 'Enter amount',
batchEditRelativeExpireUnit: 'Unit',
batchEditRelativeExpireHours: 'Hours',
batchEditRelativeExpireDays: 'Days',
batchEditDownloadLimit: 'Set Retrieval Limit',
batchEditForever: 'Make Permanent',
batchEditForeverHint: 'Clear the expiration time and make retrievals unlimited.',
batchUpdateConfirm: 'Update the selected {count} files?',
batchUpdateSuccess: 'Updated {count} files',
batchUpdatePartialSuccess: 'Updated {count} files, {failed} failed',
batchUpdateFailed: 'Batch update failed',
batchUpdateNoFields: 'Choose a policy to update',
batchPolicyActionConfirm: 'Apply "{action}" to the selected {count} files?',
batchPolicyActionSuccess: 'Processed {count} files',
batchPolicyActionPartialSuccess: 'Processed {count} files, {failed} failed',
batchPolicyActionFailed: 'Batch policy action failed',
policyActionSuccess: 'File policy updated',
policyActionFailed: 'Failed to apply policy action',
metadataInfo: 'Operations Notes',
metadataHint:
'Visible to admins only. Use it for handling notes, archive tags, and follow-up actions.',
metadataNote: 'Note',
metadataNotePlaceholder: 'Record context, handling history, or ownership...',
metadataTags: 'Tags',
metadataTagsPlaceholder: 'Comma-separated, e.g. Client A, Renew, Important',
metadataUpdatedAt: 'Last saved: {time}',
metadataNeverUpdated: 'No notes saved yet',
saveMetadata: 'Save Notes',
metadataSaveSuccess: 'Notes and tags saved',
metadataSaveFailed: 'Failed to save notes',
policyActions: {
extend24h: 'Extend 24h',
extend7d: 'Extend 7d',
makePermanent: 'Make Permanent',
resetDownloadLimit: 'Reset to {count}'
},
policyActionDescriptions: {
extend24h: 'Add one day from the active expiration',
extend7d: 'Good for a one-week temporary extension',
makePermanent: 'Clear expiration time and retrieval limits',
resetDownloadLimit: 'Restore retrievals to {count}'
},
applyBatchEdit: 'Apply Changes',
overview: 'Overview',
policyInfo: 'Policy',
storageInfo: 'Storage',
statusInsight: 'Status Insight',
nextAction: 'Next Action',
lifecycle: 'Lifecycle',
expandLifecycle: 'Show all lifecycle records ({count})',
collapseLifecycle: 'Collapse lifecycle records',
permanent: 'Permanent',
createdAt: 'Created Time',
remainingDownloads: 'Remaining Downloads',
textLength: 'Text Length',
hasDownloadLimit: 'Has Retrieval Limit',
hasExpirationTime: 'Has Expiration',
canPreviewText: 'Can Preview Text',
canDownload: 'Can Download',
storageBackend: 'Storage Backend',
fileHash: 'File Hash',
isChunked: 'Chunked Upload',
filePath: 'Storage Path',
uuidFileName: 'Stored File Name',
uploadId: 'Upload Session',
yes: 'Yes',
no: 'No',
insightSeverity: {
success: 'Healthy',
warning: 'Needs Attention',
danger: 'Issue',
info: 'Info',
neutral: 'Watch'
},
insightStates: {
available: 'Available for retrieval',
expired: 'Unavailable for retrieval',
storage_incomplete: 'Storage metadata incomplete',
expiring_soon: 'Expiring soon',
permanent: 'Permanent'
},
insightActions: {
monitor: 'No action needed',
extend_or_delete: 'Extend or clean up',
inspect_storage: 'Check storage info',
extend_expiration: 'Extend validity'
},
insightReasons: {
expired: 'Past expiration time',
download_limit_exhausted: 'Retrieval limit exhausted',
expires_soon: 'Expires within 24 hours',
never_retrieved: 'Never retrieved',
storage_metadata_incomplete: 'Missing downloadable storage metadata',
chunked_upload: 'Created by chunked upload'
},
timeline: {
status: {
done: 'Done',
pending: 'Pending',
active: 'Active',
expired: 'Expired',
exhausted: 'Exhausted',
unlimited: 'Unlimited'
},
created: {
title: 'Record Created',
description: 'The share record has been created and is currently {status}.'
},
content_ready: {
title: 'Content Ready',
description: 'Content type is {detail}; current status is {status}.'
},
upload_session: {
title: 'Upload Session',
description: 'Upload session recorded: {detail}.'
},
expiration_policy: {
title: 'Expiration Policy',
description: 'Expiration policy is currently {status}.',
remaining: '{time} left',
overdue: '{time} overdue'
},
download_limit: {
title: 'Retrieval Limit',
description: 'Retrieval limit is currently {status}; {value}.'
},
retrieved: {
title: 'Retrieval History',
description: 'Retrieved {value}; current status is {status}.'
},
retrieved_event: {
title: 'Retrieval #{value}',
description: 'This retrieval is complete; current status is {status}.'
},
retrieved_event_unknown: {
title: 'Retrieval History',
description: 'This retrieval is complete; current status is {status}.'
}
},
headers: {
select: 'Select',
code: 'Retrieve Code',
name: 'Name',
type: 'Type',
size: 'Size',
usage: 'Retrievals',
status: 'Status',
description: 'Description',
expiration: 'Expiration',
actions: 'Actions'
},
sort: {
createdAt: 'Created Time',
expiredAt: 'Expiration',
name: 'Name',
size: 'Size',
usedCount: 'Retrievals',
code: 'Retrieve Code',
desc: 'Descending',
asc: 'Ascending'
},
form: {
code: 'Retrieve Code',
codePlaceholder: 'Enter retrieve code',
filename: 'File Name',
filenamePlaceholder: 'Enter file name',
suffix: 'File Extension',
suffixPlaceholder: 'Enter file extension',
downloadLimit: 'Download Limit',
downloadLimitPlaceholder: 'Enter download limit'
}
},
// Side drawer
drawer: {
noRecords: 'No records'
},
// Admin pages
manage: {
settings: {
title: 'System Settings',
basicSettings: 'General',
websiteInfo: 'Site Information',
websiteName: 'Site Name',
websiteDescription: 'Site Description',
siteName: 'Site Name',
adminPassword: 'Admin Password',
passwordPlaceholder: 'Enter new password to change',
passwordNote: 'Leave empty to keep current',
keywords: 'SEO Keywords',
themeSelection: 'Theme',
notificationSettings: 'Notifications',
notificationTitle: 'Announcement Title',
notificationContent: 'Announcement Content',
storageSettings: 'Storage',
storagePath: 'Storage Path',
storagePathPlaceholder: 'Leave empty for default path',
storageMethod: 'Storage Type',
localStorage: 'Local Storage',
s3Storage: 'S3 Object Storage',
webdavStorage: 'WebDAV Storage',
chunkUploadNote: 'Chunked Upload (experimental, better for large files)',
enabled: 'Enabled',
disabled: 'Disabled',
webdavUrl: 'Enter WebDAV server URL',
webdavUsername: 'Enter WebDAV username',
webdavPassword: 'Enter WebDAV password',
webdavUrlPlaceholder: 'Enter WebDAV server URL',
webdavUsernamePlaceholder: 'Enter WebDAV username',
webdavPasswordPlaceholder: 'Enter WebDAV password',
enableProxy: 'Enable Download Proxy',
uploadLimits: 'Upload Settings',
uploadRateLimit: 'Time Window (limit uploads within this period)',
uploadPerMinute: 'Time Window (limit uploads within this period)',
minute: 'min',
uploadCountLimit: 'Max Files Allowed (within the time window)',
files: 'files',
fileSizeLimit: 'Max File Size',
expirationMethod: 'Expiration Options',
expirationType: 'Expiration Options',
expiration: {
day: 'Days',
hour: 'Hours',
minute: 'Minutes',
forever: 'Never Expire',
count: 'Download Count'
},
maxSaveTime: 'Max Retention Period',
timeUnits: {
second: 'sec',
minute: 'min',
hour: 'hr',
day: 'day'
},
guestUpload: 'Allow Guest Uploads',
errorLimits: 'Access Protection',
errorRateLimit: 'Detection Window (count errors within this period)',
errorPerMinute: 'Detection Window (count errors within this period)',
errorCountLimit: 'Max Errors Allowed (block after exceeding)',
times: 'times',
fileSizeUnits: {
kb: 'KB',
mb: 'MB',
gb: 'GB'
},
saveChanges: 'Save Settings',
refreshConfig: 'Refresh Config',
refreshing: 'Refreshing',
saving: 'Saving',
unsavedChanges: 'Unsaved configuration changes',
allChangesSaved: 'All configuration changes are saved',
refreshBlocked: 'Save current changes before refreshing'
,sectionNavigation: 'Settings section navigation'
,reloadSaved: 'Reload saved settings'
,robotsWarning: 'A Disallow: / rule blocks search engines from crawling the entire site.'
,fileSizeUnit: 'File size unit'
,timeUnit: 'Time unit'
},
systemSettings: {
title: 'System Settings',
basicSettings: 'General',
websiteInfo: 'Site Information',
websiteName: 'Site Name',
websiteDescription: 'Site Description',
adminPassword: 'Admin Password',
passwordPlaceholder: 'Enter new password to change',
passwordNote: 'Leave empty to keep current',
keywords: 'SEO Keywords',
themeSelection: 'Theme',
notificationSettings: 'Notifications',
notificationTitle: 'Announcement Title',
notificationContent: 'Announcement Content',
storageSettings: 'Storage',
storagePath: 'Storage Path',
storagePathPlaceholder: 'Leave empty for default path',
storageMethod: 'Storage Type',
localStorage: 'Local Storage',
s3Storage: 'S3 Object Storage',
webdavStorage: 'WebDAV Storage',
chunkUploadNote: 'Chunked Upload (experimental, better for large files)',
enabled: 'Enabled',
disabled: 'Disabled',
webdavUrl: 'Enter WebDAV server URL',
webdavUsername: 'Enter WebDAV username',
webdavPassword: 'Enter WebDAV password',
enableProxy: 'Enable Download Proxy',
uploadLimits: 'Upload Settings',
uploadRateLimit: 'Time Window (limit uploads within this period)',
minute: 'min',
uploadCountLimit: 'Max Files Allowed (within the time window)',
files: 'files',
fileSizeLimit: 'Max File Size',
expirationMethod: 'Expiration Options',
expirationMethods: {
day: 'Days',
hour: 'Hours',
minute: 'Minutes',
forever: 'Never Expire',
count: 'Download Count'
},
expiration: {
day: 'Days',
hour: 'Hours',
minute: 'Minutes',
forever: 'Never Expire',
count: 'Download Count'
},
maxSaveTime: 'Max Retention Period',
timeUnits: {
second: 'sec',
minute: 'min',
hour: 'hr',
day: 'day'
},
guestUpload: 'Allow Guest Uploads',
errorLimits: 'Access Protection',
errorRateLimit: 'Detection Window (count errors within this period)',
errorCountLimit: 'Max Errors Allowed (block after exceeding)',
times: 'times',
saveSettings: 'Save Settings',
saveSuccess: 'Settings saved successfully',
saveFailed: 'Failed to save, please try again',
getConfigFailed: 'Failed to load settings, please refresh'
},
dashboard: {
title: 'Dashboard',
totalFiles: 'Total Files',
storageSpace: 'Storage Space',
todayShares: 'Today Shares',
totalRetrievals: 'Total Retrievals',
activeFiles: 'Active files: {count}',
todayIncrease: 'Today added: {count}',
yesterdayShares: 'Yesterday: {count}',
serverUptime: 'Uptime',
refresh: 'Refresh',
fileHealth: 'File Health',
fileHealthDesc: 'Status insights for available, risky, and pending file queues.',
activeFileRatio: 'Active Ratio',
fileShareRatio: 'File Ratio',
textShareRatio: 'Text Ratio',
binaryFiles: '{count} file shares',
textShares: '{count} text shares',
expiredFiles: 'Expired Files',
needCleanup: 'Clean up in file management',
chunkedFiles: 'Chunked Files',
storagePolicy: 'Storage & Upload Policy',
storagePolicyDesc: 'Current settings that affect upload behavior.',
storageBackend: 'Storage Backend',
singleFileLimit: 'Single File Limit',
guestUpload: 'Guest Upload',
maxSaveTime: 'Max Retention',
noSaveLimit: 'Unlimited',
todayCapacityReference: 'Today Size / Single File Limit'
},
fileManage: {
title: 'File Management',
searchPlaceholder: 'Search file name, description...',
allFiles: 'All Files',
editFileInfo: 'Edit File Info',
saveChanges: 'Save Changes',
headers: {
code: 'Code',
name: 'Name',
size: 'Size',
description: 'Description',
expiration: 'Expiration',
actions: 'Actions'
},
form: {
code: 'Code',
codePlaceholder: 'Enter code',
filename: 'File Name',
filenamePlaceholder: 'Enter file name',
suffix: 'File Suffix',
suffixPlaceholder: 'Enter file suffix',
downloadLimit: 'Download Limit',
downloadLimitPlaceholder: 'Enter download limit'
},
updateFailed: 'Update failed',
deleteFailed: 'Delete failed',
deleteConfirm: 'Delete this file? This action cannot be undone.',
loadFileListFailed: 'Failed to load file list'
},
login: {
title: 'Login',
password: 'Password',
passwordPlaceholder: 'Password',
loginButton: 'Login',
loggingIn: 'Logging in...',
invalidPassword: 'Invalid password',
passwordTooShort: 'Password must be at least 6 characters',
loginFailed: 'Login failed',
noValidToken: 'Login failed: No valid token received'
}
},
// File size units
fileSize: {
bytes: 'Bytes',
kb: 'KB',
mb: 'MB',
gb: 'GB',
tb: 'TB'
},
// Utility functions
utils: {
// Time formatting
formatTime: 'Format timestamp to readable format',
formatFileSize: 'Format file size',
formatDuration: 'Format duration',
time: {
forever: 'Forever',
day: 'day',
hour: 'hour',
minute: 'minute',
second: 'second'
},
copyToClipboard: 'Copy text to clipboard',
copyFailed: 'Copy failed:',
debounce: 'Debounce function',
throttle: 'Throttle function',
validateEmail: 'Validate email format',
validateUrl: 'Validate URL format',
generateRandomString: 'Generate random string',
deepClone: 'Deep clone object',
getFileExtension: 'Get file extension',
isMobileDevice: 'Check if mobile device',
formatNumber: 'Format number with thousand separators',
clipboard: {
title: 'Clipboard utility functions',
copyText: 'Copy text to clipboard',
copySuccess: 'Copy successful',
copyFailed: 'Copy failed, please copy manually'
}
},
// Components
components: {
pagination: {
range: 'Showing {start} to {end} of {total}',
pageSize: 'Items per page',
perPage: '{size}/page',
goToPage: 'Go to page {page}',
showing: 'Showing',
to: 'to',
of: 'of',
total: 'total',
previous: 'Previous',
next: 'Next'
},
languageSwitcher: {
clickOutsideToClose: 'Click outside to close dropdown menu'
},
borderProgressBar: {
borderWidth: 'Border width',
cornerRadius: 'Corner radius',
createGradient: 'Create gradient',
drawBackground: 'Draw background',
calculateProgress: 'Calculate progress',
drawProgress: 'Draw progress'
}
},
// Miscellaneous
misc: {
emptyFileError: 'Cannot read empty file',
fileAddedFromClipboard: 'File added from clipboard: ',
fileProcessFailed: 'File processing failed',
chunkSize: 'Keep 2MB chunk size for hash calculation',
secureContext: 'If not in secure context (HTTP), return an alternative hash based on file info',
cryptoFallback: 'If crypto.subtle.digest fails, use fallback method',
generateAlternativeHash: 'Function to generate alternative hash',
fileInfoHash: 'Generate simple hash using filename, size and last modified time',
convertToHex: 'Convert to hex string and pad to 64 bits',
defaultChunkSize: 'Default chunk size is 5MB',
initChunkUpload: '1. Initialize chunk upload',
uploadChunk: '2. Upload chunk',
completeUpload: '3. Complete upload',
chunkUploadFailed: 'Chunk upload failed: ',
uploadProgressListener: 'Add upload progress listener',
noLimitCheck: 'If no limit, return true directly',
expirationValidation: 'Add expiration time validation',
chunkUploadReplacement: 'Use chunk upload to replace direct upload',
textUploadUnchanged: 'Text upload remains unchanged',
addSendRecord: 'Add new send record',
permanent: 'Permanent',
sendSuccessMessage: 'Show send success message',
resetForm: 'Reset form - only reset file and text content, keep expiration info',
showDetails: 'Show details',
autoCopyLink: 'Auto copy retrieve code link',
delayedLoading: 'Use onMounted hook to delay load non-critical resources or initialization',
nonCriticalInit: 'Place non-immediately needed initialization code here'
}
}