mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-08-28 19:47:49 +08:00
4612 lines
191 KiB
TypeScript
4612 lines
191 KiB
TypeScript
export default {
|
||
common: {
|
||
confirm: 'Confirm',
|
||
cancel: 'Cancel',
|
||
save: 'Save',
|
||
close: 'Close',
|
||
version: 'Version',
|
||
author: 'Author',
|
||
delete: 'Delete',
|
||
edit: 'Edit',
|
||
add: 'Add',
|
||
search: 'Search',
|
||
loading: 'Loading',
|
||
success: 'Success',
|
||
error: 'Error',
|
||
openInNewWindow: 'Open in new window',
|
||
download: 'Download',
|
||
uploadSpeed: 'Upload speed',
|
||
downloadSpeed: 'Download speed',
|
||
inputMessage: 'Enter message or command',
|
||
send: 'Send',
|
||
noData: 'No data',
|
||
noContent: 'No relevant content found',
|
||
all: 'All',
|
||
active: 'Active',
|
||
inactive: 'Inactive',
|
||
filter: 'Filter',
|
||
noMatchingData: 'No matching data',
|
||
tryChangingFilters: 'Try changing filters',
|
||
default: 'Default',
|
||
name: 'Name',
|
||
create: 'Create',
|
||
saving: 'Saving',
|
||
reset: 'Reset',
|
||
theme: 'Theme',
|
||
uiMode: 'UI Layout',
|
||
language: 'Language',
|
||
pleaseWait: 'Please wait...',
|
||
viewDetails: 'View Details',
|
||
user: 'User',
|
||
config: 'Configuration',
|
||
pause: 'Pause',
|
||
enable: 'Enable',
|
||
confirmAction: 'Confirm {action}',
|
||
details: 'Details',
|
||
files: 'Files',
|
||
share: 'Share',
|
||
subscribe: 'Subscribe',
|
||
unsubscribe: 'Unsubscribe',
|
||
media: 'Media',
|
||
unknown: 'Unknown',
|
||
notFetched: 'Not Fetched',
|
||
notice: 'Notice',
|
||
itemsPerPage: 'Items per page',
|
||
pageText: '{0}-{1} of {2}',
|
||
noDataText: 'No data',
|
||
next: 'Next',
|
||
previous: 'Previous',
|
||
skip: 'Skip',
|
||
loadingText: 'Loading...',
|
||
networkRequired: 'This feature requires network connection',
|
||
networkDisconnected: 'Network connection lost',
|
||
featuresLimited: 'Some features may be limited',
|
||
serverConnectionFailed: 'Server connection failed',
|
||
networkConnectionFailed: 'Network connection failed',
|
||
requestTimeout: 'Request timed out',
|
||
invalidApiResponse: 'The server returned an invalid response',
|
||
apiRequestFailed: 'Request failed',
|
||
sessionExpired: 'Session expired, please sign in again',
|
||
troubleshooting: 'Troubleshooting',
|
||
checking: 'Checking',
|
||
retry: 'Retry',
|
||
networkOnline: 'Network Online',
|
||
networkOffline: 'Network Offline',
|
||
serviceAvailable: 'Service Available',
|
||
serviceUnavailable: 'Service Unavailable',
|
||
status: 'Status',
|
||
preset: 'Preset',
|
||
refresh: 'Refresh',
|
||
swUpdateReady: 'New version is ready, please refresh the page to get the latest features',
|
||
ascending: 'Ascending',
|
||
descending: 'Descending',
|
||
versionMismatch: 'The browser cache version is inconsistent with the server version, please try to clear the cache',
|
||
clearCache: 'Clear Cache',
|
||
sortMode: 'Sort Mode',
|
||
sortModeHint: 'Drag sorting mode is active',
|
||
exit: 'Exit',
|
||
},
|
||
mediaType: {
|
||
movie: 'Movie',
|
||
tv: 'TV Show',
|
||
music: 'Music',
|
||
anime: 'Anime',
|
||
collection: 'Collection',
|
||
unknown: 'Unknown',
|
||
},
|
||
notificationSwitch: {
|
||
resourceDownload: 'Resource Download',
|
||
organize: 'Organize',
|
||
subscribe: 'Subscribe',
|
||
site: 'Site',
|
||
mediaServer: 'Media Server',
|
||
manual: 'Manual',
|
||
plugin: 'Plugin',
|
||
agent: 'Agent',
|
||
other: 'Other',
|
||
},
|
||
actionStep: {
|
||
addDownload: 'Add Download',
|
||
addSubscribe: 'Add Subscribe',
|
||
fetchDownloads: 'Fetch Downloads',
|
||
fetchMedias: 'Fetch Media',
|
||
fetchRss: 'Fetch RSS',
|
||
fetchTorrents: 'Fetch Torrents',
|
||
filterMedias: 'Filter Media',
|
||
filterTorrents: 'Filter Torrents',
|
||
scanFile: 'Scan Directory',
|
||
scrapeFile: 'Scrape File',
|
||
sendEvent: 'Send Event',
|
||
sendMessage: 'Send Message',
|
||
transferFile: 'Transfer File',
|
||
invokePlugin: 'Invoke Plugin',
|
||
note: 'Note',
|
||
},
|
||
qualityOptions: {
|
||
all: 'All',
|
||
blurayOriginal: 'Blu-ray Original',
|
||
remux: 'Remux',
|
||
bluray: 'BluRay',
|
||
uhd: 'UHD',
|
||
webdl: 'WEB-DL',
|
||
hdtv: 'HDTV',
|
||
h265: 'H265',
|
||
h264: 'H264',
|
||
},
|
||
audioQualityOptions: {
|
||
all: 'All Audio Qualities',
|
||
hires: 'Hi-Res Lossless',
|
||
lossless: 'Lossless (including Hi-Res)',
|
||
lossy: 'Lossy',
|
||
},
|
||
audioFormatOptions: {
|
||
all: 'All Formats',
|
||
lossless: 'All Lossless Formats',
|
||
},
|
||
resolutionOptions: {
|
||
all: 'All',
|
||
'4k': '4K',
|
||
'1080p': '1080p',
|
||
'720p': '720p',
|
||
},
|
||
effectOptions: {
|
||
all: 'All',
|
||
dolbyVision: 'Dolby Vision',
|
||
dolbyAtmos: 'Dolby Atmos',
|
||
hdr: 'HDR',
|
||
sdr: 'SDR',
|
||
},
|
||
theme: {
|
||
light: 'Light',
|
||
dark: 'Dark',
|
||
auto: 'Follow System',
|
||
autoUI: 'Auto',
|
||
transparent: 'Transparent',
|
||
glass: 'Glass',
|
||
glassSettings: 'Glass Settings',
|
||
glassAppearance: 'Material',
|
||
glassAppearanceClear: 'Clear',
|
||
glassAppearanceTinted: 'Tinted',
|
||
glassAppearanceFrosted: 'Frosted',
|
||
glassAppearanceHint:
|
||
'Clear emphasizes wallpaper detail, Tinted adds color coverage, and Frosted uses blur diffusion for a denser glass surface.',
|
||
glassQuality: 'Quality',
|
||
glassQualityCss: 'Standard',
|
||
glassQualityBalanced: 'Balanced',
|
||
glassQualityHigh: 'High',
|
||
glassQualityCssHint:
|
||
'Static CSS material with the lowest resource use; clarity, transmission, and reflection remain available.',
|
||
glassQualityBalancedHint: 'Shared live refraction that balances liquid feedback and GPU use.',
|
||
glassQualityHighHint: 'Full temporal flow, diffusion detail, and content protection at a higher GPU cost.',
|
||
glassQualityMobileHint: 'Keeps the selected material quality; real-time motion is disabled on mobile.',
|
||
glassPreset: 'Preset',
|
||
glassPresetNatural: 'Natural',
|
||
glassPresetGlide: 'Glide',
|
||
glassPresetLiquid: 'Liquid',
|
||
glassPresetHint: 'Natural stays balanced, Glide favors smooth movement, and Liquid adds deformation and inertia.',
|
||
glassDynamicsMode: 'Motion Effect',
|
||
glassDynamicsModeFluid: 'Fluid',
|
||
glassDynamicsModeRipple: 'Ripple',
|
||
glassDynamicsModeOff: 'Off',
|
||
glassDynamicsModeFluidHint: 'Creates continuous flow and refraction that follow the pointer.',
|
||
glassDynamicsModeRippleHint: 'Creates ripples that spread across nearby glass surfaces as the pointer moves.',
|
||
glassDynamicsModeOffHint: 'Keeps the static material without pointer-driven motion.',
|
||
glassMaterialTuning: 'Material',
|
||
glassDynamicTuning: 'Motion',
|
||
glassTranslationStrength: 'Sample Translation',
|
||
glassDeformationStrength: 'Deformation',
|
||
glassFlowStrength: 'Flow Strength',
|
||
glassReflectionStrength: 'Reflection Brightness',
|
||
glassTransmissionStrength: 'Transmission Brightness',
|
||
glassTransparencyStrength: 'Clarity',
|
||
glassMaterialStrengthHint:
|
||
'Clarity controls wallpaper texture visibility. Transmission Brightness controls the background inside the glass. Reflection Brightness controls surface reflections and highlights.',
|
||
glassOpticalStrengthHint:
|
||
'Sample Translation moves the shared wallpaper. Deformation controls local bending. Flow Strength controls trail range and inertia.',
|
||
purple: 'Purple',
|
||
custom: 'Custom Style',
|
||
transparency: 'Transparency',
|
||
transparencyAdjust: 'Transparency Adjustment',
|
||
transparencyOpacity: 'Opacity',
|
||
transparencyBlur: 'Blur',
|
||
backgroundPosterOpacity: 'Background Opacity',
|
||
backgroundBlur: 'Background Frosted Blur',
|
||
transparencyGlassQuality: 'Glass Effect Quality',
|
||
transparencyGlassQualityLightweight: 'Lightweight',
|
||
transparencyGlassQualityRealtime: 'Realtime',
|
||
transparencyGlassQualityLightweightHint:
|
||
'Keeps a similar translucent glass look while reducing live background sampling on dense pages.',
|
||
transparencyGlassQualityRealtimeHint:
|
||
'Uses the full live glass rendering path for higher visual quality, but may increase GPU usage.',
|
||
transparencyReset: 'Reset',
|
||
transparencyLow: 'Low Transparency',
|
||
transparencyMedium: 'Medium Transparency',
|
||
transparencyHigh: 'High Transparency',
|
||
customCssSaveSuccess: 'Custom CSS saved successfully, please refresh the page to take effect!',
|
||
customCssSaveFailed: 'Failed to save custom CSS to server',
|
||
deviceNotSupport: 'Current device does not support monitoring system theme changes',
|
||
customizer: {
|
||
title: 'Theme Customizer',
|
||
subtitle: 'Customize & Preview in Real Time',
|
||
theming: 'Theming',
|
||
primaryColor: 'Primary Color',
|
||
usePrimaryColor: 'Use {color} primary color',
|
||
chooseCustomColor: 'Choose custom primary color',
|
||
skins: 'Borders',
|
||
skinDefault: 'No Border',
|
||
skinBordered: 'Bordered',
|
||
radius: 'Corners',
|
||
radiusNone: 'Square',
|
||
radiusSmall: 'Small',
|
||
radiusDefault: 'Default',
|
||
radiusLarge: 'Large',
|
||
radiusExtra: 'Larger',
|
||
shadow: 'Shadows',
|
||
shadowLevel: 'Level {level}',
|
||
semiDarkMenu: 'Semi Dark Menu',
|
||
layout: 'Layout',
|
||
layoutVertical: 'Vertical',
|
||
layoutCollapsed: 'Collapsed',
|
||
layoutHorizontal: 'Horizontal',
|
||
reset: 'Reset theme customizer',
|
||
appModeLayoutLocked: 'App mode keeps mobile navigation fixed. Switch to desktop UI mode to customize layout.',
|
||
},
|
||
},
|
||
app: {
|
||
moviepilot: 'MoviePilot',
|
||
slogan: 'Intelligent Movie & TV Media Library Management Tool',
|
||
recommend: 'Recommend',
|
||
subscribeMovie: 'Movie Subscription',
|
||
subscribeTv: 'TV Subscription',
|
||
settings: 'Settings',
|
||
selectLanguage: 'Select Language',
|
||
logout: 'Logout',
|
||
restarting: 'Restarting...',
|
||
confirmRestart: 'Confirm restart system?',
|
||
restartTip: 'After restart, you will be logged out and need to log in again.',
|
||
restartTimeout: 'Restart timeout, the system may need more time to recover, please refresh the page manually later',
|
||
restartFailed: 'Restart failed, please check system status',
|
||
offline: 'Application Offline',
|
||
offlineMessage: 'Network connection lost, some features may be limited',
|
||
connectionChecking: 'Reconnecting to MoviePilot',
|
||
connectionCheckingMessage: 'Checking the service status. You can continue browsing this page.',
|
||
serviceUnavailable: 'MoviePilot is temporarily unavailable',
|
||
serviceUnavailableMessage: 'The service may be starting up, or the reverse proxy may be temporarily unavailable.',
|
||
serviceTimeoutMessage: 'The MoviePilot service timed out. It will retry automatically.',
|
||
browserOfflineMessage: 'The browser reports no network connection. Trying MoviePilot directly.',
|
||
continueBrowsing: 'Continue browsing',
|
||
online: 'Application Online',
|
||
onlineMessage: 'Network connection restored',
|
||
},
|
||
pwa: {
|
||
installApp: 'Install MoviePilot App',
|
||
installDescription: 'Get better offline experience and performance',
|
||
install: 'Install',
|
||
installSuccess: 'App installed successfully!',
|
||
installGuide: 'Installation Guide',
|
||
installInstructions: 'Install MoviePilot on {platform}:',
|
||
installNote:
|
||
'After installation, you can quickly access MoviePilot from your home screen and enjoy offline features.',
|
||
gotIt: 'Got it',
|
||
// Platform specific descriptions
|
||
platforms: {
|
||
ios: 'iOS',
|
||
android: 'Android',
|
||
chrome: 'Chrome',
|
||
edge: 'Edge',
|
||
firefox: 'Firefox',
|
||
safari: 'Safari',
|
||
desktop: 'Desktop',
|
||
mobile: 'Mobile',
|
||
other: 'Other Browser',
|
||
},
|
||
// Installation steps
|
||
installSteps: {
|
||
ios: {
|
||
0: 'Tap the share button at the bottom of the browser',
|
||
1: 'Select "Add to Home Screen"',
|
||
2: 'Tap "Add" to confirm installation',
|
||
},
|
||
android: {
|
||
0: 'Tap the browser menu (three dots)',
|
||
1: 'Select "Add to Home Screen" or "Install App"',
|
||
2: 'Tap "Install" to confirm',
|
||
},
|
||
chrome: {
|
||
0: 'Click the install icon in the address bar',
|
||
1: 'Or click "Install MoviePilot" in the browser menu',
|
||
2: 'Click "Install" to confirm',
|
||
},
|
||
edge: {
|
||
0: 'Click the app icon in the address bar',
|
||
1: 'Select "Install this site as an app"',
|
||
2: 'Click "Install" to confirm',
|
||
},
|
||
firefox: {
|
||
0: 'Click the install icon in the address bar',
|
||
1: 'Select "Install"',
|
||
2: 'Confirm installation to desktop',
|
||
},
|
||
safari: {
|
||
0: 'Click the share button',
|
||
1: 'Select "Add to Home Screen"',
|
||
2: 'Tap "Add" to confirm',
|
||
},
|
||
desktop: {
|
||
0: 'Click the install icon in the address bar',
|
||
1: 'Select "Install App"',
|
||
2: 'Follow the prompts to complete installation',
|
||
},
|
||
mobile: {
|
||
0: 'Tap the browser menu',
|
||
1: 'Select "Add to Home Screen"',
|
||
2: 'Confirm installation',
|
||
},
|
||
other: {
|
||
0: 'Look for "Install" option in your browser',
|
||
1: 'Usually in the address bar or menu',
|
||
2: 'Follow the prompts to complete installation',
|
||
},
|
||
},
|
||
},
|
||
login: {
|
||
wallpapers: 'Wallpapers',
|
||
tagline: 'Your smart media library',
|
||
welcomeBack: 'Welcome Back',
|
||
copyright: '© {year} MoviePilot',
|
||
username: 'Username',
|
||
password: 'Password',
|
||
showPassword: 'Show password',
|
||
hidePassword: 'Hide password',
|
||
otpCode: 'Verification Code',
|
||
stayLoggedIn: 'Stay Logged In',
|
||
login: 'Login',
|
||
networkError: 'Login failed, please check your network connection!',
|
||
authFailure: 'Login failed. Check your username, password, or verification code',
|
||
permissionDenied: 'Login failed, you do not have permission to access!',
|
||
noPermission: 'Login failed, you have no functional permissions, please contact the administrator!',
|
||
serverError: 'Login failed, server error!',
|
||
loginFailed: 'Login Failed',
|
||
secondaryVerification: 'Two-Step Verification',
|
||
orDivider: 'OR',
|
||
loginWithPasskey: 'Login with Passkey',
|
||
loginWithOtp: 'Verify and Sign In',
|
||
otpPlaceholder: 'Enter 6-digit code',
|
||
passkeyLoginStartFailed: 'Failed to start Passkey authentication',
|
||
passkeyNotSelected: 'No Passkey selected',
|
||
passkeyLoginFailed: 'Passkey login failed',
|
||
passkeyAuthCanceled: 'Passkey authentication canceled',
|
||
passkeyNotSupported: 'Current browser does not support Passkeys',
|
||
passkeySecureContextRequired: 'Passkey requires HTTPS secure connection',
|
||
mfa: {
|
||
back: 'Back to login',
|
||
methodsUnavailable: 'Verification methods are unavailable. Please sign in again',
|
||
otpPrompt: 'Enter the 6-digit code generated by your authenticator',
|
||
verificationFailed: 'Verification failed. Check the code and try again',
|
||
},
|
||
},
|
||
menu: {
|
||
start: 'Start',
|
||
discovery: 'Discovery',
|
||
subscribe: 'Subscribe',
|
||
organize: 'Organize',
|
||
system: 'System',
|
||
},
|
||
navItems: {
|
||
dashboard: 'Dashboard',
|
||
mediaInfo: 'Media Library',
|
||
recommend: 'Recommend',
|
||
site: 'Sites',
|
||
search: 'Search',
|
||
searchResult: 'Search Results',
|
||
download: 'Download',
|
||
movieSubscribe: 'Movie Subscription',
|
||
tvSubscribe: 'TV Subscription',
|
||
musicSubscribe: 'Music Subscription',
|
||
history: 'History',
|
||
transfer: 'Organize',
|
||
rename: 'Rename',
|
||
statistic: 'Statistics',
|
||
setting: 'Settings',
|
||
plugin: 'Plugins',
|
||
user: 'Users',
|
||
about: 'About',
|
||
explore: 'Explore',
|
||
movie: 'Movies',
|
||
tv: 'TV Shows',
|
||
music: 'Music',
|
||
workflow: 'Workflow',
|
||
calendar: 'Calendar',
|
||
downloadManager: 'Download Manager',
|
||
mediaOrganize: 'Media Organize',
|
||
fileManager: 'File Manager',
|
||
pluginManager: 'Plugins',
|
||
siteManager: 'Site Management',
|
||
userManager: 'User Management',
|
||
settings: 'Settings',
|
||
},
|
||
music: {
|
||
title: 'Music Search',
|
||
searchFromGlobal: 'Use the global search at the top to look up a song, album or artist',
|
||
searchDescription: 'Songs, albums or artists',
|
||
noResults: 'No matching music found',
|
||
searchResources: 'Search Resources',
|
||
subscribe: 'Subscribe',
|
||
unsubscribe: 'Unsubscribe',
|
||
album: 'Album',
|
||
albumArtist: 'Album Artist',
|
||
albumType: 'Album Type',
|
||
albumTracks: 'Tracks in This Album',
|
||
albumNotFound: 'Album not found',
|
||
albums: 'Albums',
|
||
eps: 'EPs',
|
||
singles: 'Singles',
|
||
tracks: 'Tracks',
|
||
track: 'Track',
|
||
trackTotal: 'Tracks',
|
||
trackNumber: 'Track {number}',
|
||
trackCount: '{count} tracks',
|
||
discNumber: 'Disc {number}',
|
||
releases: 'Releases',
|
||
releaseDate: 'Release Date',
|
||
duration: 'Duration',
|
||
ratingVotes: 'Rating Votes',
|
||
listenCount: 'Listens',
|
||
listenCountValue: '{count} listens',
|
||
relatedArtists: 'Related Artists',
|
||
relatedAlbums: 'Related Albums',
|
||
artistAlbums: "Artist's Albums",
|
||
artistType: 'Artist Type',
|
||
artistNotFound: 'Artist not found',
|
||
entityRecording: 'Track',
|
||
entityAlbum: 'Album',
|
||
entityArtist: 'Artist',
|
||
audioQualityHires: 'Hi-Res',
|
||
audioQualityLossless: 'Lossless',
|
||
audioQualityLossy: 'Lossy',
|
||
audioFormatLossless: 'Lossless Formats',
|
||
gender: 'Gender',
|
||
area: 'Area',
|
||
lifeSpan: 'Active Period',
|
||
aliases: 'Aliases',
|
||
filter: {
|
||
mode: 'Mode',
|
||
modeChart: 'Top Charts',
|
||
modeFresh: 'Fresh Releases',
|
||
entity: 'Chart',
|
||
entityRecording: 'Top Tracks',
|
||
entityAlbum: 'Top Albums',
|
||
period: 'Period',
|
||
sort: 'Sort',
|
||
cover: 'Cover',
|
||
scope: 'Scope',
|
||
days: 'Time Window',
|
||
daysValue: 'Last {days} days',
|
||
thisWeek: 'This Week',
|
||
thisMonth: 'This Month',
|
||
thisYear: 'This Year',
|
||
lastWeek: 'Last Week',
|
||
lastMonth: 'Last Month',
|
||
lastQuarter: 'Last Quarter',
|
||
lastHalfYear: 'Last Half Year',
|
||
lastYear: 'Last Year',
|
||
allTime: 'All Time',
|
||
mostListened: 'Most Listened',
|
||
leastListened: 'Least Listened',
|
||
sortReleaseDate: 'Release Date',
|
||
sortArtist: 'Artist',
|
||
sortReleaseName: 'Album Name',
|
||
released: 'Released',
|
||
upcoming: 'Upcoming',
|
||
all: 'All',
|
||
withCover: 'With Cover Only',
|
||
country: 'Country/Region',
|
||
countryUs: 'United States',
|
||
countryGb: 'United Kingdom',
|
||
countryCn: 'China',
|
||
countryJp: 'Japan',
|
||
countryKr: 'South Korea',
|
||
},
|
||
},
|
||
settingTabs: {
|
||
system: {
|
||
title: 'System',
|
||
description:
|
||
'Basic settings, downloaders (Qbittorrent, Transmission), media servers (Emby, ZSpace, Jellyfin, Plex, TrimeMedia, Ugreen)',
|
||
},
|
||
directory: {
|
||
title: 'Storage & Directories',
|
||
description: 'Download directory, media library directory, organization, scraping',
|
||
},
|
||
site: {
|
||
title: 'Sites',
|
||
description: 'Site synchronization, site data refresh, site reset',
|
||
},
|
||
rule: {
|
||
title: 'Rules',
|
||
description: 'Custom rules, priority rule groups, download rules',
|
||
},
|
||
search: {
|
||
title: 'Search & Download',
|
||
description: 'Search data sources (TheMovieDb, Douban, Bangumi), download task tags, search sites',
|
||
},
|
||
subscribe: {
|
||
title: 'Subscription',
|
||
description: 'Subscription sites, subscription mode, subscription rules, version upgrade rules',
|
||
},
|
||
scheduler: {
|
||
title: 'Services',
|
||
description: 'Scheduled jobs',
|
||
},
|
||
cache: {
|
||
title: 'Cache',
|
||
description: 'Torrent cache, media recognition data cache, image file cache management',
|
||
},
|
||
notification: {
|
||
title: 'Notifications',
|
||
description:
|
||
'Notification channels (WeChat Work, WeChat ClawBot, Telegram, Slack, SynologyChat, VoceChat, WebPush), message scope',
|
||
},
|
||
about: {
|
||
title: 'About',
|
||
description: 'Software version',
|
||
},
|
||
},
|
||
subscribeTabs: {
|
||
movie: {
|
||
mysub: 'My Subscriptions',
|
||
popular: 'Popular Subscriptions',
|
||
},
|
||
tv: {
|
||
mysub: 'My Subscriptions',
|
||
popular: 'Popular Subscriptions',
|
||
share: 'Subscription Shares',
|
||
},
|
||
music: {
|
||
mysub: 'My Subscriptions',
|
||
},
|
||
},
|
||
workflowTabs: {
|
||
list: 'My Workflows',
|
||
share: 'Workflow Share',
|
||
},
|
||
pluginTabs: {
|
||
installed: 'My Plugins',
|
||
market: 'Plugin Market',
|
||
},
|
||
discoverTabs: {
|
||
themoviedb: 'TheMovieDb',
|
||
douban: 'Douban',
|
||
bangumi: 'Bangumi',
|
||
anilist: 'AniList',
|
||
music: 'MusicBrainz',
|
||
},
|
||
user: {
|
||
admin: 'Admin',
|
||
normal: 'Normal User',
|
||
active: 'Active',
|
||
inactive: 'Inactive',
|
||
noEmail: 'No Email',
|
||
movieSubscriptions: 'Movie Subscriptions',
|
||
tvSubscriptions: 'TV Show Subscriptions',
|
||
cannotDeleteCurrentUser: 'Cannot delete the currently logged in user!',
|
||
confirmDeleteUser: 'Are you sure you want to delete all data of user {username}?',
|
||
deleteSuccess: 'User deleted successfully',
|
||
deleteFailed: 'Failed to delete user!',
|
||
profile: 'Profile',
|
||
systemSettings: 'System Settings',
|
||
wizardSettings: 'Setup Wizard',
|
||
siteAuth: 'User Authentication',
|
||
helpDocs: 'Help Documents',
|
||
about: 'About',
|
||
restart: 'Restart',
|
||
management: 'User Management',
|
||
noUsers: 'No Users',
|
||
clickToAddUser: 'Click Add User card to add users',
|
||
addUser: 'Add User',
|
||
editUser: 'Edit User',
|
||
username: 'Username',
|
||
usernameHint: 'Username for system login',
|
||
password: 'Password',
|
||
passwordHint: 'Please enter your login password',
|
||
confirmPassword: 'Confirm Password',
|
||
confirmPasswordHint: 'Please enter the password again to confirm',
|
||
role: 'Role',
|
||
email: 'Email',
|
||
enabled: 'Enabled',
|
||
disabled: 'Disabled',
|
||
status: 'Status',
|
||
operations: 'Operations',
|
||
},
|
||
nav: {
|
||
more: 'More',
|
||
},
|
||
notification: {
|
||
center: 'Notification Center',
|
||
markRead: 'Mark as Read',
|
||
clear: 'Clear Notifications',
|
||
clearConfirm: 'Clear all notification history from Notification Center?',
|
||
clearAllMessages: 'Clear All Messages',
|
||
clearSystemMessages: 'Clear System Messages',
|
||
clearMediaMessages: 'Clear Media Messages',
|
||
clearAllConfirm: 'Clear all notification history from Notification Center?',
|
||
clearSystemConfirm: 'Clear system message history from Notification Center?',
|
||
clearMediaConfirm: 'Clear media message history from Notification Center?',
|
||
clearSuccess: 'Notifications cleared',
|
||
clearAllSuccess: 'All notifications cleared',
|
||
clearSystemSuccess: 'System messages cleared',
|
||
clearMediaSuccess: 'Media messages cleared',
|
||
clearFailed: 'Failed to clear notifications',
|
||
empty: 'No Notifications',
|
||
systemMessages: 'System Messages',
|
||
mediaMessages: 'Media Messages',
|
||
channel: 'Notification Channel',
|
||
name: 'Name',
|
||
nameHint: 'Name of notification channel',
|
||
type: 'Type',
|
||
typeHint: 'Type of notification channel',
|
||
customTypeHint: 'Custom notification type, used for plugin implementation scenarios',
|
||
customTypePlaceholder: 'custom',
|
||
nameRequired: 'Please enter name',
|
||
enabled: 'Enabled',
|
||
config: 'Configuration',
|
||
wechat: {
|
||
name: 'WeChat Work',
|
||
useBotMode: 'Use AI Bot',
|
||
useBotModeHint: 'Enable WebSocket bot mode with fixed dmPolicy=open and groupPolicy=disabled',
|
||
corpId: 'Corp ID',
|
||
corpIdHint: 'Corp ID in WeChat Work backend enterprise information',
|
||
corpIdRequired: 'Corp ID cannot be empty',
|
||
appId: 'App AgentId',
|
||
appIdHint: 'AgentId of self-built app in WeChat Work',
|
||
appIdRequired: 'App AgentId cannot be empty',
|
||
appSecret: 'App Secret',
|
||
appSecretHint: 'Secret of self-built app in WeChat Work',
|
||
appSecretRequired: 'App Secret cannot be empty',
|
||
proxy: 'Proxy Address',
|
||
proxyHint:
|
||
'Proxy address for WeChat message forwarding, required for self-built apps created after June 20, 2022',
|
||
token: 'Token',
|
||
tokenHint: 'Token in WeChat Work self-built app -> API message receiving configuration',
|
||
encodingAesKey: 'EncodingAESKey',
|
||
encodingAesKeyHint: 'EncodingAESKey in WeChat Work self-built app -> API message receiving configuration',
|
||
botId: 'Bot ID',
|
||
botIdHint: 'Bot ID of the WeChat Work AI bot',
|
||
botSecret: 'Bot Secret',
|
||
botSecretHint: 'WebSocket secret of the WeChat Work AI bot',
|
||
botChatId: 'Default Target',
|
||
botChatIdHint:
|
||
'Use user userid; for proactive group messages use group:chatid. Leave empty to notify known interacted users',
|
||
botChatIdPlaceholder: 'userid or group:chatid',
|
||
botWsUrl: 'WebSocket URL',
|
||
botWsUrlHint: 'WebSocket endpoint for the WeChat Work AI bot, usually the default value',
|
||
admins: 'Admin Whitelist',
|
||
adminsHint: 'User IDs that can use admin menu and commands, separated by commas',
|
||
adminsPlaceholder: 'User IDs list, separated by commas',
|
||
},
|
||
wechatclawbot: {
|
||
name: 'WeChat ClawBot',
|
||
baseUrl: 'iLink Base URL',
|
||
baseUrlHint: 'iLink service URL for WeChat ClawBot, keep default in most cases',
|
||
defaultTarget: 'Default Target',
|
||
defaultTargetHint: 'Optional target userid; leave empty to notify interacted users',
|
||
defaultTargetPlaceholder: 'userid (optional)',
|
||
admins: 'Admin Whitelist',
|
||
adminsHint: 'User IDs allowed to run slash commands, separated by commas',
|
||
adminsPlaceholder: 'User IDs list, separated by commas',
|
||
pollTimeout: 'Poll Timeout (seconds)',
|
||
pollTimeoutHint: 'Long polling timeout, recommended 20-30 seconds',
|
||
loginStatus: 'Login Status',
|
||
connected: 'Connected',
|
||
waiting: 'Waiting for QR scan',
|
||
scanned: 'Scanned, waiting for confirmation',
|
||
confirmed: 'Confirmed, establishing connection',
|
||
expired: 'QR code expired',
|
||
refreshQrcode: 'Refresh QR Code',
|
||
logout: 'Logout',
|
||
noQrcode: 'No QR code yet. Refresh or save config first.',
|
||
scanHint: 'Scan with WeChat to bind. Save and enable this channel before first use.',
|
||
accountId: 'Account ID',
|
||
qrcodeUpdatedAt: 'QR Updated At',
|
||
knownTargets: 'Recent Interacted Users',
|
||
noKnownTargets: 'No interaction records yet',
|
||
statusLoadFailed: 'Failed to load WeChat ClawBot status',
|
||
qrcodeRefreshSuccess: 'WeChat ClawBot QR code refreshed',
|
||
qrcodeRefreshFailed: 'Failed to refresh WeChat ClawBot QR code',
|
||
logoutSuccess: 'WeChat ClawBot logged out',
|
||
logoutFailed: 'Failed to logout WeChat ClawBot',
|
||
},
|
||
feishu: {
|
||
name: 'Feishu',
|
||
appId: 'App ID',
|
||
appIdHint: 'App ID of the Feishu Open Platform application',
|
||
appIdRequired: 'App ID cannot be empty',
|
||
appSecret: 'App Secret',
|
||
appSecretHint: 'App Secret of the Feishu Open Platform application',
|
||
appSecretRequired: 'App Secret cannot be empty',
|
||
openId: 'Default User Open ID',
|
||
openIdHint: 'Default recipient user Open ID; leave empty to prefer recent interacted users',
|
||
openIdPlaceholder: 'ou_xxx',
|
||
chatId: 'Default Group Chat ID',
|
||
chatIdHint: 'Default recipient group chat ID; either this or Open ID is enough',
|
||
chatIdPlaceholder: 'oc_xxx',
|
||
admins: 'Admin Whitelist',
|
||
adminsHint: 'Open IDs allowed to run commands and admin actions, separated by commas',
|
||
adminsPlaceholder: 'Open ID list, separated by commas',
|
||
verificationToken: 'Verification Token',
|
||
verificationTokenHint: 'Verification Token for Feishu event subscription, required when validation is enabled',
|
||
encryptKey: 'Encrypt Key',
|
||
encryptKeyHint: 'Encrypt Key for Feishu event subscription, required when encryption is enabled',
|
||
},
|
||
telegram: {
|
||
name: 'Telegram',
|
||
token: 'Bot Token',
|
||
tokenHint: 'Telegram bot token, format: 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11',
|
||
tokenRequired: 'Bot Token cannot be empty',
|
||
chatId: 'Chat ID',
|
||
chatIdHint: 'Chat ID of user, group or channel that receives notifications',
|
||
chatIdRequired: 'Chat ID cannot be empty',
|
||
users: 'User Whitelist',
|
||
usersHint: 'User IDs that can use Telegram bot, separated by commas. Leave empty to allow all users',
|
||
admins: 'Admin Whitelist',
|
||
adminsHint: 'User IDs that can use admin menu and commands, separated by commas',
|
||
adminsPlaceholder: 'User IDs list, separated by commas',
|
||
usersPlaceholder: 'User IDs list, separated by commas',
|
||
apiUrl: 'Proxy Api Url',
|
||
apiUrlHint: 'Custom proxy Api Url, format: https://api.telegram.org',
|
||
apiUrlPlaceholder: 'https://api.telegram.org',
|
||
},
|
||
slack: {
|
||
name: 'Slack',
|
||
oauthToken: 'Slack Bot User OAuth Token',
|
||
oauthTokenHint: 'Bot User OAuth Token in Slack app OAuth & Permissions page',
|
||
oauthTokenRequired: 'OAuth Token cannot be empty',
|
||
appToken: 'Slack App-Level Token',
|
||
appTokenHint: 'App-Level Token in Slack app OAuth & Permissions page',
|
||
channel: 'Channel Name',
|
||
channelHint: 'Channel to send messages, default is "all"',
|
||
channelRequired: 'Channel Name cannot be empty',
|
||
admins: 'Admin Whitelist',
|
||
adminsHint: 'User IDs that can use admin menu and commands, separated by commas',
|
||
adminsPlaceholder: 'User IDs list, separated by commas',
|
||
},
|
||
discord: {
|
||
name: 'Discord',
|
||
botToken: 'Bot Token',
|
||
botTokenHint: 'Discord Bot Token (enable Message Content Intent in Dev Portal)',
|
||
botTokenRequired: 'Bot Token is required',
|
||
guildId: 'Guild ID',
|
||
guildIdHint: 'Optional, restrict to a specific guild; leave blank to use any joined guild',
|
||
guildIdPlaceholder: '123456789012345678',
|
||
channelId: 'Channel ID',
|
||
channelIdHint: 'Optional, default broadcast channel; leave blank to auto-pick a writable channel',
|
||
channelIdPlaceholder: '123456789012345678',
|
||
admins: 'Admin Whitelist',
|
||
adminsHint: 'User IDs that can use admin menu and commands, separated by commas',
|
||
adminsPlaceholder: 'User IDs list, separated by commas',
|
||
},
|
||
synologychat: {
|
||
name: 'Synology Chat',
|
||
webhook: 'Webhook URL',
|
||
webhookHint: 'Synology Chat bot webhook URL',
|
||
webhookRequired: 'Webhook URL cannot be empty',
|
||
token: 'Token',
|
||
tokenHint: 'Synology Chat bot token',
|
||
admins: 'Admin Whitelist',
|
||
adminsHint: 'User IDs that can use admin menu and commands, separated by commas',
|
||
adminsPlaceholder: 'User IDs list, separated by commas',
|
||
},
|
||
vocechat: {
|
||
name: 'VoceChat',
|
||
host: 'Address',
|
||
hostHint: 'VoceChat server address, format: http(s)://ip:port',
|
||
hostRequired: 'Address cannot be empty',
|
||
apiKey: 'Bot API Key',
|
||
apiKeyHint: 'VoceChat bot API key',
|
||
apiKeyRequired: 'API Key cannot be empty',
|
||
channelId: 'Channel ID',
|
||
channelIdHint: 'VoceChat channel ID, without #',
|
||
admins: 'Admin Whitelist',
|
||
adminsHint: 'User IDs that can use admin menu and commands, separated by commas',
|
||
adminsPlaceholder: 'User IDs list, separated by commas',
|
||
},
|
||
webpush: {
|
||
name: 'WebPush',
|
||
username: 'Login Username',
|
||
usernameHint: 'Only push messages to the corresponding logged-in user',
|
||
usernameRequired: 'Username cannot be empty',
|
||
},
|
||
qqbot: {
|
||
name: 'QQ',
|
||
appId: 'App ID',
|
||
appIdHint: 'QQ Open Platform bot App ID',
|
||
appIdRequired: 'App ID cannot be empty',
|
||
appSecret: 'App Secret',
|
||
appSecretHint: 'QQ Open Platform bot App Secret',
|
||
appSecretRequired: 'App Secret cannot be empty',
|
||
openId: 'User OpenID',
|
||
openIdHint: 'Default recipient openid (C2C), user must have interacted with bot before',
|
||
openIdPlaceholder: '32-char hex',
|
||
groupOpenId: 'Group OpenID',
|
||
groupOpenIdHint: 'Default group openid (group chat), use either this or User OpenID',
|
||
groupOpenIdPlaceholder: 'Group openid',
|
||
admins: 'Admin Whitelist',
|
||
adminsHint: 'User IDs that can use admin menu and commands, separated by commas',
|
||
adminsPlaceholder: 'User IDs list, separated by commas',
|
||
},
|
||
},
|
||
shortcut: {
|
||
title: 'Shortcuts',
|
||
recognition: {
|
||
title: 'Recognition',
|
||
subtitle: 'Name Recognition Test',
|
||
},
|
||
rule: {
|
||
title: 'Rules',
|
||
subtitle: 'Rule Testing',
|
||
},
|
||
log: {
|
||
title: 'Logs',
|
||
subtitle: 'Real-time Logs',
|
||
},
|
||
network: {
|
||
title: 'Network',
|
||
subtitle: 'Network Speed and Connectivity Test',
|
||
},
|
||
system: {
|
||
title: 'System',
|
||
subtitle: 'Health Check',
|
||
},
|
||
words: {
|
||
title: 'Words',
|
||
subtitle: 'Word Settings',
|
||
},
|
||
cache: {
|
||
title: 'Cache',
|
||
subtitle: 'Manage Cache',
|
||
},
|
||
scheduler: {
|
||
title: 'Services',
|
||
subtitle: 'Scheduled Services',
|
||
},
|
||
},
|
||
agentAssistant: {
|
||
title: 'AI Assistant',
|
||
assistant: 'Assistant',
|
||
ready: 'Ready',
|
||
thinking: 'Thinking',
|
||
newChat: 'New Chat',
|
||
enterFullscreen: 'Enter fullscreen',
|
||
exitFullscreen: 'Exit fullscreen',
|
||
history: 'Chat History',
|
||
historyLoading: 'Loading chat history...',
|
||
historyLoadFailed: 'Failed to load chat history',
|
||
noHistory: 'No chat history yet',
|
||
deleteHistory: 'Delete chat history',
|
||
unknownChannel: 'Unknown channel',
|
||
webAgentChannel: 'Web Assistant',
|
||
untitledSession: 'Untitled chat',
|
||
emptyTitle: 'What should we handle today?',
|
||
emptySubtitle: 'Ask about sites, subscriptions, downloads, or organization tasks.',
|
||
placeholder: 'Ask MoviePilot, Type / for commands',
|
||
processingPlaceholder: 'Processing...',
|
||
commandLoading: 'Loading commands...',
|
||
commandLoadFailed: 'Failed to load commands',
|
||
stop: 'Stop generating',
|
||
download: 'Download',
|
||
attachFile: 'Choose image or file',
|
||
recordVoice: 'Record voice',
|
||
stopRecording: 'Stop recording ({time})',
|
||
attachmentMessage: 'Attachment message',
|
||
removeAttachment: 'Remove attachment',
|
||
uploadFailed: 'Attachment upload failed',
|
||
recordUnsupported: 'Voice recording is not supported by this browser',
|
||
recordPermissionDenied: 'Cannot access the microphone. Please check browser permissions.',
|
||
recordFailed: 'Voice recording failed. Please try again.',
|
||
choiceSelected: 'Selected: {option}',
|
||
choiceExpired: 'This choice expired. Please ask again.',
|
||
error: 'Assistant response failed',
|
||
noStream: 'This browser cannot read streaming responses',
|
||
recoveryFailed: 'Failed to recover the background response. Please try again later.',
|
||
},
|
||
workflow: {
|
||
components: 'Action Components',
|
||
clickToAdd: 'Click to Add',
|
||
dragToCanvas: 'Drag to Canvas',
|
||
tapComponentHint: 'Tap component to add to canvas',
|
||
dragComponentHint: 'Drag component to canvas',
|
||
task: {
|
||
edit: 'Edit Task',
|
||
editFlow: 'Edit Flow',
|
||
share: 'Share',
|
||
moreActions: 'More actions',
|
||
continue: 'Continue',
|
||
restart: 'Restart',
|
||
run: 'Run Now',
|
||
reset: 'Reset Task',
|
||
delete: 'Delete Task',
|
||
confirmDelete: 'Are you sure to delete task {name} ?',
|
||
confirmReset: 'Are you sure to reset task {name} ?',
|
||
deleteSuccess: 'Task deleted successfully!',
|
||
deleteFailed: 'Failed to delete task: {message}',
|
||
enableSuccess: 'Task enabled successfully!',
|
||
enableFailed: 'Failed to enable task: {message}',
|
||
pauseSuccess: 'Task paused successfully!',
|
||
pauseFailed: 'Failed to pause task: {message}',
|
||
runSuccess: 'Task execution completed!',
|
||
runFailed: 'Task execution failed: {message}',
|
||
resetSuccess: 'Task reset successfully!',
|
||
resetFailed: 'Failed to reset task: {message}',
|
||
status: {
|
||
success: 'Success',
|
||
running: 'Running',
|
||
failed: 'Failed',
|
||
paused: 'Paused',
|
||
waiting: 'Pending',
|
||
},
|
||
info: {
|
||
trigger: 'Trigger',
|
||
timer: 'Timer',
|
||
status: 'Status',
|
||
actionCount: 'Action Count',
|
||
runCount: 'Run {count} times',
|
||
progress: 'Progress',
|
||
error: 'Error Message',
|
||
manualTrigger: 'Manual',
|
||
lastExecuted: 'Last run {time}',
|
||
neverExecuted: 'Never run',
|
||
executionIncomplete: 'Previous run is incomplete',
|
||
executingAction: 'Running {name}',
|
||
noActions: 'No actions',
|
||
},
|
||
},
|
||
scanFile: {
|
||
title: 'Scan Directory',
|
||
subtitle: 'Scan directory files to queue',
|
||
storage: 'Storage',
|
||
directory: 'Directory',
|
||
},
|
||
addDownload: {
|
||
title: 'Add Download',
|
||
subtitle: 'Add resource to downloader',
|
||
downloader: 'Downloader',
|
||
category: 'Category',
|
||
savePath: 'Save Path',
|
||
sequential: 'Sequential',
|
||
forceResume: 'Force Resume',
|
||
firstLastPiece: 'First Last Piece',
|
||
onlyLack: 'Only Download Lack Resource',
|
||
categoryPlaceholder: 'Use comma to separate multiple',
|
||
savePathPlaceholder: 'Leave empty for auto',
|
||
},
|
||
addSubscribe: {
|
||
title: 'Add Subscribe',
|
||
subtitle: 'Add resource to subscription',
|
||
type: 'Type',
|
||
name: 'Name',
|
||
season: 'Season',
|
||
episode: 'Episode',
|
||
},
|
||
fetchMedias: {
|
||
title: 'Fetch Media Data',
|
||
subtitle: 'Fetch media data list from rankings',
|
||
source: 'Source',
|
||
searchType: 'Search Type',
|
||
type: 'Type',
|
||
name: 'Name',
|
||
year: 'Year',
|
||
ranking: 'Ranking',
|
||
api: 'Plugin API',
|
||
apiPath: 'API Path',
|
||
selectRanking: 'Select Ranking',
|
||
tmdbTrending: 'TMDB Trending',
|
||
doubanShowing: 'Now Showing',
|
||
bangumiCalendar: 'Bangumi Daily',
|
||
tmdbMovies: 'TMDB Popular Movies',
|
||
tmdbTvs: 'TMDB Popular TV Shows',
|
||
doubanMovieHot: 'Douban Hot Movies',
|
||
doubanTvHot: 'Douban Hot TV Shows',
|
||
doubanTvAnimation: 'Douban Hot Anime',
|
||
doubanMovies: 'Douban Latest Movies',
|
||
doubanTvs: 'Douban Latest TV Shows',
|
||
doubanMovieTop250: 'Douban Movie TOP250',
|
||
doubanTvWeeklyChinese: 'Douban Chinese TV Weekly',
|
||
doubanTvWeeklyGlobal: 'Douban Global TV Weekly',
|
||
},
|
||
filterMedias: {
|
||
title: 'Filter Media Data',
|
||
subtitle: 'Filter media data list',
|
||
type: 'Type',
|
||
name: 'Name',
|
||
year: 'Year',
|
||
vote: 'Vote',
|
||
},
|
||
scrapeFile: {
|
||
title: 'Scrape File',
|
||
subtitle: 'Scrape media info and images',
|
||
},
|
||
sendEvent: {
|
||
title: 'Send Event',
|
||
subtitle: 'Send task execution event',
|
||
},
|
||
fetchDownloads: {
|
||
title: 'Fetch Downloads',
|
||
subtitle: 'Fetch download queue task status',
|
||
loop: 'Loop Execution',
|
||
loopInterval: 'Loop Interval (seconds)',
|
||
},
|
||
fetchRss: {
|
||
title: 'Fetch RSS Resources',
|
||
subtitle: 'Subscribe RSS feed to get resources',
|
||
url: 'RSS URL',
|
||
userAgent: 'User-Agent',
|
||
timeout: 'Timeout',
|
||
matchMedia: 'Match Media Info',
|
||
useProxy: 'Use Proxy',
|
||
},
|
||
fetchTorrents: {
|
||
title: 'Search Site Resources',
|
||
subtitle: 'Search site torrent resource list',
|
||
searchType: 'Search Type',
|
||
searchOptions: {
|
||
name: 'Name',
|
||
mediaList: 'Media List',
|
||
},
|
||
name: 'Name',
|
||
year: 'Year',
|
||
type: 'Type',
|
||
season: 'Season',
|
||
sites: 'Sites',
|
||
matchMedia: 'Match Media Info',
|
||
},
|
||
sendMessage: {
|
||
title: 'Send Message',
|
||
subtitle: 'Send task execution message',
|
||
channel: 'Message Channel',
|
||
userId: 'User ID',
|
||
},
|
||
transferFile: {
|
||
title: 'Organize Files',
|
||
subtitle: 'Organize and rename files in queue',
|
||
source: 'Source',
|
||
sourceOptions: {
|
||
fileList: 'File List',
|
||
downloads: 'Downloads',
|
||
},
|
||
},
|
||
filterTorrents: {
|
||
title: 'Filter Resources',
|
||
subtitle: 'Filter resource list',
|
||
quality: 'Quality',
|
||
resolution: 'Resolution',
|
||
effect: 'Effect',
|
||
size: 'Size Range',
|
||
include: 'Include (Keywords, Regex)',
|
||
exclude: 'Exclude (Keywords, Regex)',
|
||
ruleGroups: 'Filter Rule Groups',
|
||
},
|
||
invokePlugin: {
|
||
title: 'Invoke Plugin',
|
||
subtitle: 'Call plugin to perform specific actions',
|
||
plugin: 'Plugin',
|
||
actionid: 'Action ID',
|
||
actionParams: 'Action Parameters',
|
||
loadPluginSettingFailed: 'Failed to load plugin settings',
|
||
},
|
||
note: {
|
||
title: 'Note',
|
||
subtitle: 'Add workflow description notes',
|
||
content: 'Note Content',
|
||
placeholder: 'Please enter note content...',
|
||
},
|
||
title: 'Workflow',
|
||
share: 'Workflow Share',
|
||
searchShares: 'Search Workflow Shares',
|
||
noShareData: 'No shared workflows',
|
||
sharer: 'Sharer',
|
||
trigger: 'Trigger',
|
||
timer: 'Timer',
|
||
manualTrigger: 'Manual Trigger',
|
||
actionCount: 'Action Count',
|
||
preview: {
|
||
title: 'Flow Overview',
|
||
actionCount: '{count} actions',
|
||
flowCount: '{count} connections',
|
||
moreActions: '{count} more',
|
||
hasBranches: 'Branched',
|
||
unknownAction: 'Unknown action',
|
||
},
|
||
normalFork: 'Fork Workflow',
|
||
cancelShare: 'Cancel Share',
|
||
cancelSuccess: 'Share cancelled successfully',
|
||
cancelFailed: 'Failed to cancel share: {message}',
|
||
usageCount: 'Used {count} times',
|
||
addSuccess: 'Forked {name} successfully!',
|
||
addFailed: 'Failed to fork {name}: {message}',
|
||
noWorkflow: 'No Workflow',
|
||
noWorkflowDescription: 'Click the add button to create a workflow task.',
|
||
},
|
||
dashboard: {
|
||
storage: 'Storage',
|
||
storageSummary: '{available} available / {total} total',
|
||
mediaStatistic: 'Media Statistics',
|
||
recommendedMedia: 'Recommended Media',
|
||
selectRecommendSource: 'Select recommendation source',
|
||
previousRecommend: 'Previous recommendation',
|
||
nextRecommend: 'Next recommendation',
|
||
showRecommend: 'Show recommendation {index}',
|
||
noRecommendations: 'No recommendations from this source',
|
||
recommendLoadFailed: 'Failed to load recommendations',
|
||
weeklyOverview: 'Import Statistics',
|
||
realTimeSpeed: 'Real-time Speed',
|
||
scheduler: 'Background Tasks',
|
||
cpu: 'CPU',
|
||
cpuUsage: 'CPU Usage',
|
||
memory: 'Memory',
|
||
memoryUsage: 'Memory Usage',
|
||
memoryUsed: 'Used',
|
||
memoryCached: 'Cached',
|
||
memoryAvailable: 'Available',
|
||
averageUsage: 'Average',
|
||
network: 'Network Traffic',
|
||
upload: 'Upload',
|
||
download: 'Download',
|
||
library: 'My Media Library',
|
||
playing: 'Continue Watching',
|
||
latest: 'Latest Imports',
|
||
noLatest: 'No recent imports',
|
||
noPlaying: 'No continue-watching items',
|
||
noLibrary: 'No media library data',
|
||
mediaServerLoadFailed: 'Failed to load media server data',
|
||
staleData: 'Refresh failed. Showing the last successful data.',
|
||
recentImports: 'Recent Transfers',
|
||
viewAll: 'View All',
|
||
settings: 'Dashboard Settings',
|
||
chooseContent: 'Choose content to display',
|
||
editLayout: 'Edit Layout',
|
||
exitEditMode: 'Done Editing',
|
||
resetLayout: 'Reset Layout',
|
||
dragHandle: 'Drag Component',
|
||
current: 'Current',
|
||
episodes: 'Episodes',
|
||
users: 'Users',
|
||
activeUsers: 'Active users',
|
||
noSchedulers: 'No Background Services',
|
||
transferQueue: 'Transfer Queue',
|
||
transferProgress: '{completed} / {total} files',
|
||
taskRunning: 'Running',
|
||
taskWaiting: 'Waiting',
|
||
noRecentImports: 'No recent transfer records',
|
||
monthlyAddition: '+{count} this month',
|
||
quickActions: {
|
||
title: 'Quick Actions',
|
||
downloadManager: 'Downloads',
|
||
globalSearch: 'Global Search',
|
||
fileManager: 'Files',
|
||
systemSettings: 'Settings',
|
||
cacheManager: 'Cache',
|
||
pluginCenter: 'Plugins',
|
||
},
|
||
systemInfo: {
|
||
title: 'System Information',
|
||
hostname: 'Host Name',
|
||
operatingSystem: 'Operating System',
|
||
runtime: 'Runtime',
|
||
runtimeValue: '{days}d {hours}h {minutes}m',
|
||
version: 'Version',
|
||
checkUpdate: 'Check Update',
|
||
},
|
||
weeklyOverviewDescription: 'Added {count} media in the last week',
|
||
speed: {
|
||
totalUpload: 'Total Upload',
|
||
totalDownload: 'Total Download',
|
||
freeSpace: 'Free Disk Space',
|
||
},
|
||
processes: {
|
||
title: 'System Processes',
|
||
pid: 'Process ID',
|
||
name: 'Process Name',
|
||
runtime: 'Runtime',
|
||
memory: 'Memory Usage',
|
||
},
|
||
errors: {
|
||
loadMediaServer: 'Failed to load media server settings:',
|
||
loadLatest: 'Failed to load recently added from media server "{server}":',
|
||
},
|
||
},
|
||
media: {
|
||
status: {
|
||
inLibrary: 'In Library',
|
||
missing: 'Missing',
|
||
partiallyMissing: 'Partially Missing',
|
||
subscribed: 'Subscribed',
|
||
seasonsSubscribed: '{count} Seasons Subscribed',
|
||
allSeasonsSubscribed: 'All Seasons Subscribed',
|
||
},
|
||
minutes: 'minutes',
|
||
overview: 'Overview',
|
||
seasons: 'Seasons',
|
||
specials: 'Specials',
|
||
seasonNumber: 'Season {number}',
|
||
episodeCount: '{count} Episodes',
|
||
episodeGroups: {
|
||
select: 'Select Episode Group',
|
||
default: 'Default',
|
||
summary: '{seasons} Seasons · {episodes} Episodes',
|
||
current: 'Current: {name} · {seasons} Seasons · {episodes} Episodes',
|
||
previous: 'View previous episode groups',
|
||
next: 'View more episode groups',
|
||
},
|
||
actions: {
|
||
searchResource: 'Search Resource',
|
||
searchSubtitle: 'Search Subtitle',
|
||
subscribe: 'Subscribe',
|
||
playOnline: 'Play Online',
|
||
playInApp: 'Play in App',
|
||
playInWeb: 'Play in Web',
|
||
},
|
||
search: {
|
||
byTitle: 'Title',
|
||
byImdb: 'IMDB Link',
|
||
},
|
||
info: {
|
||
originalTitle: 'Original Title',
|
||
status: 'Status',
|
||
releaseDate: 'Release Date',
|
||
digitalRelease: 'Digital Release',
|
||
physicalRelease: 'Physical Release',
|
||
originalLanguage: 'Original Language',
|
||
productionCountries: 'Production Countries',
|
||
productionCompanies: 'Production Companies',
|
||
doubanId: 'Douban ID',
|
||
},
|
||
subscribe: {
|
||
normal: 'Subscribe',
|
||
bestVersion: 'Best Version Subscribe',
|
||
addFailed: 'Failed to add subscription: {reason}!',
|
||
canceled: 'Subscription canceled!',
|
||
cancelFailed: 'Failed to cancel subscription: {reason}!',
|
||
},
|
||
castAndCrew: 'Cast & Crew',
|
||
recommendations: 'Recommendations',
|
||
similar: 'Similar',
|
||
error: {
|
||
title: 'Error!',
|
||
noMediaInfo: 'No media information recognized.',
|
||
},
|
||
server: {
|
||
plex: 'Plex',
|
||
jellyfin: 'Jellyfin',
|
||
emby: 'Emby',
|
||
zspace: 'ZSpace',
|
||
appLaunchFailed: 'App launch failed, redirecting to web version',
|
||
appNotInstalled: 'App not detected, redirecting to web version',
|
||
downloadApp: 'Download App',
|
||
},
|
||
},
|
||
subscribe: {
|
||
normalSub: 'Subscribe',
|
||
versionSub: 'Version Upgrade Subscribe',
|
||
addSuccess: 'Added {name} successfully!',
|
||
addFailed: 'Failed to add {name}: {message}!',
|
||
modeUpdateSuccess: 'Updated to {mode}!',
|
||
cancelSuccess: 'Subscription cancelled!',
|
||
cancelFailed: 'Failed to cancel subscription: {message}!',
|
||
notFound: 'Subscription not found!',
|
||
requestFailed: 'Request failed. Please try again later.',
|
||
native: {
|
||
invalidMedia: 'Unable to open native subscription: invalid media information.',
|
||
missingId: 'Unable to open native subscription: provide a valid media source ID.',
|
||
missingTitle: 'Unable to open native subscription: provide a media title.',
|
||
unsupportedType: 'Unable to open native subscription: media type must be movie or TV.',
|
||
permissionDenied: 'The current user does not have subscription permission.',
|
||
},
|
||
filterSubscriptions: 'Filter Subscriptions',
|
||
name: 'Name',
|
||
searchShares: 'Search Subscription Shares',
|
||
keyword: 'Keyword',
|
||
noShareData: 'No shared subscription data received, data sharing not enabled or server cannot connect.',
|
||
noPopularData: 'No popular subscription data received, data sharing not enabled or server cannot connect.',
|
||
noFilterData: 'No related content found with current filters, please change filter conditions.',
|
||
noSubscribeData: 'Please search to add movie or TV show subscriptions.',
|
||
sharer: 'Sharer',
|
||
follow: 'Follow',
|
||
unfollow: 'Unfollow',
|
||
recognitionWords: 'Recognition Words',
|
||
cancelShare: 'Cancel Share',
|
||
usageCount: '{count} Uses',
|
||
confirmToggle: 'Are you sure you want to {action} subscription {name}?',
|
||
toggleSuccess: '{name} has been {action}d!',
|
||
toggleFailed: '{action} failed: {message}',
|
||
resetConfirm:
|
||
'After reset, {name} will be restored to its initial state, downloaded records will be cleared, and unimported content will be downloaded again. Are you sure?',
|
||
resetSuccess: '{name} has been reset successfully!',
|
||
resetFailed: '{name} reset failed: {message}',
|
||
shareStatistics: 'Share Statistics',
|
||
shareCount: 'Shares',
|
||
totalReuseCount: 'Total Reuse Count',
|
||
ranking: 'Ranking',
|
||
noStatisticsData: 'No share statistics data available',
|
||
bestVersion: 'Version Upgrading',
|
||
bestVersionEpisodeShort: 'Episode',
|
||
bestVersionWholeShort: 'Full',
|
||
bestVersionEpisodeProgressTooltip: 'Upgraded {completed} · Downloaded {downloaded} · Total {total}',
|
||
subscribeProgressTooltip: 'Downloaded {downloaded} · Total {total}',
|
||
completed: 'Completed',
|
||
subscribing: 'Subscribing',
|
||
notStarted: 'Not Started',
|
||
pending: 'Pending',
|
||
paused: 'Paused',
|
||
cardStatePaused: 'Paused',
|
||
cardStatePending: 'Pending',
|
||
mediaDetail: 'Media Details',
|
||
fileStatistics: 'File Statistics',
|
||
sortTitle: 'Sort',
|
||
sort: {
|
||
custom: 'Custom',
|
||
lastUpdate: 'Last Updated',
|
||
addTime: 'Added Time',
|
||
lackEpisode: 'Missing Episodes',
|
||
},
|
||
selectedCount: 'Selected {count}/{total} items',
|
||
noSelectedItems: 'Please select subscriptions to operate',
|
||
batchSelectAll: 'Select All Subscriptions',
|
||
batchDeselectAll: 'Deselect All Subscriptions',
|
||
exitBatchMode: 'Exit Batch Mode',
|
||
batchEnable: 'Batch Enable',
|
||
batchPause: 'Batch Pause',
|
||
batchDelete: 'Batch Delete',
|
||
batchEnableConfirm: 'Are you sure you want to enable {count} selected subscriptions?',
|
||
batchPauseConfirm: 'Are you sure you want to pause {count} selected subscriptions?',
|
||
batchDeleteConfirm: 'Are you sure you want to delete {count} selected subscriptions? This action cannot be undone!',
|
||
batchEnableSuccess: 'Successfully enabled {count} subscriptions',
|
||
batchPauseSuccess: 'Successfully paused {count} subscriptions',
|
||
batchDeleteSuccess: 'Successfully deleted {count} subscriptions',
|
||
batchEnableFailed: 'Failed to enable {count} subscriptions',
|
||
batchPauseFailed: 'Failed to pause {count} subscriptions',
|
||
batchDeleteFailed: 'Failed to delete {count} subscriptions',
|
||
batchEnableError: 'Batch enable operation failed',
|
||
batchPauseError: 'Batch pause operation failed',
|
||
batchDeleteError: 'Batch delete operation failed',
|
||
minSubscribers: 'Minimum Subscribers',
|
||
},
|
||
recommend: {
|
||
all: 'All',
|
||
categoryMovie: 'Movies',
|
||
categoryTV: 'TV Shows',
|
||
categoryAnime: 'Anime',
|
||
categoryMusic: 'Music',
|
||
categoryRankings: 'Rankings',
|
||
trendingNow: 'Trending Now',
|
||
nowShowing: 'Now Showing',
|
||
bangumiDaily: 'Bangumi Daily Release',
|
||
anilistTrendingNow: 'AniList TRENDING NOW',
|
||
anilistPopularThisSeason: 'AniList POPULAR THIS SEASON',
|
||
listenBrainzWeekly: 'Weekly Popular Music',
|
||
doubanMusic: 'Douban Music Picks',
|
||
tmdbHotMovies: 'TMDB Hot Movies',
|
||
tmdbHotTVShows: 'TMDB Hot TV Shows',
|
||
doubanHotMovies: 'Douban Hot Movies',
|
||
doubanHotTVShows: 'Douban Hot TV Shows',
|
||
doubanHotAnime: 'Douban Hot Anime',
|
||
doubanNewMovies: 'Douban New Movies',
|
||
doubanNewTVShows: 'Douban New TV Shows',
|
||
doubanTop250: 'Douban Top 250 Movies',
|
||
doubanChineseTVRankings: 'Douban Chinese TV Rankings',
|
||
doubanGlobalTVRankings: 'Douban Global TV Rankings',
|
||
noCategoryContent: 'No content to display in current category',
|
||
configureContent: 'Configure Display Content',
|
||
customizeContent: 'Customize Recommendations',
|
||
selectContentToDisplay: 'Select content you want to display on the page',
|
||
selectAll: 'Select All',
|
||
selectNone: 'Select None',
|
||
},
|
||
discover: {
|
||
customizeTabs: 'Customize Explore Tabs',
|
||
configureTabsHint: 'Drag to reorder tabs and choose which tabs to display',
|
||
selectAll: 'Select All',
|
||
selectNone: 'Select None',
|
||
saveSettingsFailed: 'Failed to save explore tab settings. Please try again later.',
|
||
},
|
||
downloading: {
|
||
noDownloader: 'No Downloader',
|
||
configureDownloader: 'Please configure and enable a downloader in settings first.',
|
||
title: 'Downloading',
|
||
noTask: 'No Task',
|
||
noTaskDescription: 'Downloading tasks will be displayed here.',
|
||
},
|
||
resource: {
|
||
searchResults: 'Resource Search Results',
|
||
subtitleSearchResults: 'Subtitle Search Results',
|
||
keyword: 'Keyword',
|
||
title: 'Title',
|
||
year: 'Year',
|
||
season: 'Season',
|
||
switchingView: 'Switching View',
|
||
backToHome: 'Back to Home',
|
||
searching: 'Searching, please wait...',
|
||
noData: 'No Data',
|
||
noResourceFound: 'No resources found',
|
||
filteredNoResults: 'Found {count} resource(s), but none match the filter rules',
|
||
searchStreamTimeout: 'The search connection timed out. Please try again later.',
|
||
searchStreamDisconnected: 'The search connection was interrupted. Please try again later.',
|
||
aiRecommend: 'AI Recommendation',
|
||
reRecommend: 'Regenerate Recommendation',
|
||
aiRecommendError: 'AI Recommendation Failed',
|
||
refreshSearch: 'Re-search',
|
||
},
|
||
browse: {
|
||
actor: 'Actor',
|
||
},
|
||
appcenter: {
|
||
others: 'Others',
|
||
},
|
||
notFound: {
|
||
title: '⚠️ Page Not Found',
|
||
description: 'The page you tried to access does not exist. Please check if the address is correct.',
|
||
backButton: 'Go Back',
|
||
},
|
||
torrent: {
|
||
selectAll: 'Select All',
|
||
clear: 'Clear',
|
||
clearFilters: 'Clear Filters',
|
||
confirm: 'Confirm',
|
||
resources: 'resources',
|
||
noResults: 'No results found',
|
||
sortDefault: 'Default',
|
||
sortSite: 'Site',
|
||
sortSize: 'Size',
|
||
sortSeeder: 'Seeder',
|
||
sortPublishTime: 'Publish Time',
|
||
filterSite: 'Site',
|
||
filterSeason: 'Season',
|
||
filterFreeState: 'Free State',
|
||
filterVideoCode: 'Video Code',
|
||
filterEdition: 'Edition',
|
||
filterResolution: 'Resolution',
|
||
filterReleaseGroup: 'Release Group',
|
||
noMatchingResults: 'No matching data',
|
||
allFilters: 'All Filters',
|
||
clearAll: 'Clear All',
|
||
},
|
||
calendar: {
|
||
episode: 'Episode {number}',
|
||
libraryProgress: 'In library {completed}/{total}',
|
||
currentEpisodeInLibrary: 'Current in library',
|
||
currentEpisodePartiallyInLibrary: 'Partially in library',
|
||
currentEpisodeNotInLibrary: 'Current not in library',
|
||
libraryStateComplete: 'In library',
|
||
libraryStatePartial: 'Partial',
|
||
libraryStateNone: 'Missing',
|
||
compactLibraryProgress: '{state} ({completed}/{total})',
|
||
libraryUpdatedAt: 'Updated {time}',
|
||
libraryUpdatedAtShort: '{time}',
|
||
expandDayEvents: 'Show {count} more items for this day',
|
||
mobileFilterTitle: 'Subscription Calendar',
|
||
itemCount: '{count} items',
|
||
hideExpired: 'Hide expired',
|
||
showExpired: 'Show expired',
|
||
today: 'Today',
|
||
todayUpdated: 'Updated today',
|
||
upcoming: 'Upcoming',
|
||
expired: 'Aired',
|
||
episodeCount: '{count} episodes',
|
||
mobileEpisodeTitle: 'Episode {number}',
|
||
runtimeMinutes: '{minutes} min',
|
||
movie: 'Movie',
|
||
imageLoadFailed: 'Failed',
|
||
noMatchingEvents: 'No calendar items match the current filters',
|
||
mediaTypeFilterTitle: 'Media type filter',
|
||
filterAll: 'All',
|
||
filterMovie: 'Movie',
|
||
filterTv: 'TV Series',
|
||
},
|
||
storage: {
|
||
name: 'Name',
|
||
type: 'Type',
|
||
customTypeHint: 'Custom storage type, used for plugins and other scenarios',
|
||
usedPercent: '{percent}% Used',
|
||
noConfigNeeded: 'This storage type does not require configuration, please configure the directory directly!',
|
||
notConfigured: 'Not Configured',
|
||
local: 'Local',
|
||
alipan: 'Aliyun Drive',
|
||
u115: '115 Cloud',
|
||
rclone: 'RClone',
|
||
alist: 'OpenList',
|
||
alistgo: 'AList',
|
||
smb: 'SMB Network Share',
|
||
custom: 'Custom',
|
||
},
|
||
filterRules: {
|
||
specSub: 'Special Subtitle',
|
||
cnSub: 'Chinese Subtitle',
|
||
cnVoi: 'Chinese Dubbing',
|
||
gz: 'Official Seed',
|
||
notCnVoi: 'Exclude: Chinese Dubbing',
|
||
hkVoi: 'Cantonese Dubbing',
|
||
notHkVoi: 'Exclude: Cantonese Dubbing',
|
||
free: 'Promotion: Free',
|
||
audioHires: 'Audio Quality: Hi-Res',
|
||
audioLossless: 'Audio Quality: Lossless',
|
||
audioFlac: 'Audio Format: FLAC',
|
||
audioAlac: 'Audio Format: ALAC',
|
||
audioApe: 'Audio Format: APE',
|
||
audioWav: 'Audio Format: WAV',
|
||
audioDsd: 'Audio Format: DSD',
|
||
audioMp3: 'Audio Format: MP3',
|
||
audioAac: 'Audio Format: AAC',
|
||
audioOpus: 'Audio Format: OPUS',
|
||
bitrate320: 'Minimum Bitrate: 320 kbps',
|
||
bitrate256: 'Minimum Bitrate: 256 kbps',
|
||
bitrate192: 'Minimum Bitrate: 192 kbps',
|
||
resolution4k: 'Resolution: 4K',
|
||
resolution1080p: 'Resolution: 1080P',
|
||
resolution720p: 'Resolution: 720P',
|
||
not720p: 'Exclude: 720P',
|
||
qualityBlu: 'Quality: Blu-ray',
|
||
notBlu: 'Exclude: Blu-ray',
|
||
qualityBluray: 'Quality: BLURAY',
|
||
notBluray: 'Exclude: BLURAY',
|
||
qualityUhd: 'Quality: UHD',
|
||
notUhd: 'Exclude: UHD',
|
||
qualityRemux: 'Quality: REMUX',
|
||
notRemux: 'Exclude: REMUX',
|
||
qualityWebdl: 'Quality: WEB-DL',
|
||
notWebdl: 'Exclude: WEB-DL',
|
||
quality60fps: 'Quality: 60fps',
|
||
not60fps: 'Exclude: 60fps',
|
||
codecH265: 'Codec: H265',
|
||
notH265: 'Exclude: H265',
|
||
codecH264: 'Codec: H264',
|
||
notH264: 'Exclude: H264',
|
||
effectDolby: 'Effect: Dolby Vision',
|
||
notDolby: 'Exclude: Dolby Vision',
|
||
effectAtmos: 'Effect: Dolby Atmos',
|
||
notAtmos: 'Exclude: Dolby Atmos',
|
||
effectHdr: 'Effect: HDR',
|
||
notHdr: 'Exclude: HDR',
|
||
effectSdr: 'Effect: SDR',
|
||
notSdr: 'Exclude: SDR',
|
||
effect3d: 'Effect: 3D',
|
||
not3d: 'Exclude: 3D',
|
||
},
|
||
transferType: {
|
||
copy: 'Copy',
|
||
move: 'Move',
|
||
link: 'Hard Link',
|
||
softlink: 'Soft Link',
|
||
},
|
||
site: {
|
||
noSites: 'No Sites',
|
||
noFilterData: 'No matching sites found',
|
||
sitesWillBeShownHere: 'Added and supported sites will be displayed here.',
|
||
title: 'Site',
|
||
status: {
|
||
enabled: 'Enabled',
|
||
disabled: 'Disabled',
|
||
},
|
||
fields: {
|
||
url: 'Site URL',
|
||
priority: 'Priority',
|
||
status: 'Status',
|
||
rss: 'RSS URL',
|
||
timeout: 'Timeout (seconds)',
|
||
downloader: 'Downloader',
|
||
cookie: 'Site Cookie',
|
||
userAgent: 'User-Agent',
|
||
authorization: 'Authorization Header',
|
||
apiKey: 'API Key',
|
||
limitAccess: 'Limit Site Access Frequency',
|
||
limitInterval: 'Interval Period (seconds)',
|
||
limitCount: 'Access Count per Period',
|
||
limitSeconds: 'Access Interval (seconds)',
|
||
useProxy: 'Use Proxy',
|
||
browserSimulation: 'Browser Simulation',
|
||
selectFile: 'Select File',
|
||
},
|
||
hints: {
|
||
url: 'Format: http://www.example.com/',
|
||
priority: 'Lower priority value means higher priority',
|
||
status: 'Enable/Disable site',
|
||
rss: 'Subscription link used when subscription mode is `Site RSS`, manual input if not auto-retrieved',
|
||
timeout: 'Site request timeout, no limit when set to 0',
|
||
downloader: 'Downloader used for this site',
|
||
cookie: 'Cookie information in site request header',
|
||
userAgent: 'User-Agent of the browser used to get Cookie',
|
||
authorization: 'Authorization information in site request header, required for special sites',
|
||
apiKey: 'Site API Key, required for special sites',
|
||
limitInterval: 'Duration of the rate limit control period',
|
||
limitCount: 'Allowed access count within the period',
|
||
limitSeconds: 'Minimum interval between each access',
|
||
useProxy: 'Use proxy server to access this site',
|
||
browserSimulation: 'Use browser simulation for authentic site access',
|
||
import: 'Batch import site data, supports JSON format files',
|
||
selectFile: 'Select JSON file',
|
||
dragDropFile: 'Drag and drop file here or click to select file',
|
||
supportedFormat: 'Supports JSON format site configuration files',
|
||
},
|
||
actions: {
|
||
add: 'Add Site',
|
||
edit: 'Edit Site',
|
||
import: 'Import',
|
||
export: 'Export',
|
||
startImport: 'Start Import',
|
||
},
|
||
messages: {
|
||
addSuccess: 'Site added successfully',
|
||
addFailed: 'Failed to add site',
|
||
updateSuccess: 'Updated successfully',
|
||
updateFailed: 'Update failed',
|
||
exportSuccess: 'Sites exported successfully',
|
||
exportFailed: 'Failed to export sites',
|
||
importSuccess: 'Successfully imported {count} sites',
|
||
importFailed: 'Failed to import sites',
|
||
importPartialFailed: 'Import completed, {success} successful, {failed} failed',
|
||
importAllFailed: 'Import failed, all {count} sites failed to import',
|
||
noDataToImport: 'No data to import',
|
||
noValidData: 'No valid data',
|
||
someInvalidData: 'Some data is invalid, valid data: {valid}/{total}',
|
||
invalidFileType: 'Unsupported file type, please select a JSON file',
|
||
invalidFileFormat: 'Invalid file format, please check file content',
|
||
parseFileError: 'Failed to parse file, please check file format',
|
||
previewData: 'Preview data ({count} sites)',
|
||
importing: 'Importing... ({progress}%)',
|
||
importErrors: 'Import encountered {count} errors',
|
||
},
|
||
errors: {
|
||
loadDownloader: 'Failed to load downloader settings',
|
||
title: 'Import Error Details',
|
||
failed: 'Import Failed',
|
||
details: 'Error Details',
|
||
},
|
||
results: {
|
||
successTitle: 'Successfully Imported Sites',
|
||
success: 'Import Success',
|
||
},
|
||
testConnectivity: 'Test Connectivity',
|
||
testing: 'Testing ...',
|
||
testSuccess: '{name} connectivity test successful, ready to use!',
|
||
testFailed: '{name} connectivity test failed: {message}',
|
||
connectionNormal: 'Connection Normal',
|
||
connectionSlow: 'Connection Slow',
|
||
connectionFailed: 'Connection Failed',
|
||
connectionUnknown: 'Connection Unknown',
|
||
deleteConfirm: 'Are you sure you want to delete this site?',
|
||
deleteSuccess: '{name} deleted successfully!',
|
||
deleteFailed: '{name} deletion failed: {message}',
|
||
browseResources: 'Browse Resources',
|
||
deleteSite: 'Delete Site',
|
||
updateCookie: 'Update Cookie',
|
||
viewUserData: 'View User Data',
|
||
statistics: 'Statistics',
|
||
totalSites: 'Total Sites',
|
||
normalSites: 'Normal Sites',
|
||
slowSites: 'Slow Sites',
|
||
failedSites: 'Failed Sites',
|
||
averageTime: 'Average Time',
|
||
successRate: 'Success Rate',
|
||
successCount: 'Success Count',
|
||
failCount: 'Fail Count',
|
||
lastAccess: 'Last Access',
|
||
timeRecords: 'Time Records',
|
||
recentTimeRecords: 'Recent Time Records',
|
||
accessTime: 'Access Time',
|
||
responseTime: 'Response Time',
|
||
noTimeRecords: 'No Time Records',
|
||
preview: {
|
||
title: 'Preview Sites',
|
||
showing: 'Showing {count}/{total}',
|
||
unnamed: 'Unnamed Site',
|
||
noUrl: 'No Site URL',
|
||
invalid: 'Invalid Data',
|
||
},
|
||
},
|
||
message: {
|
||
loadMore: 'Load More',
|
||
noMoreData: 'No more data',
|
||
},
|
||
logging: {
|
||
level: 'Level',
|
||
time: 'Time',
|
||
program: 'Program',
|
||
content: 'Content',
|
||
refreshing: 'Refreshing',
|
||
initializing: 'Initializing',
|
||
searchPlaceholder: 'Search logs',
|
||
allLevels: 'All Levels',
|
||
followTail: 'Follow latest logs',
|
||
wrapLines: 'Wrap lines',
|
||
pauseStream: 'Pause stream',
|
||
resumeStream: 'Resume stream',
|
||
waitingForLogs: 'Waiting for logs...',
|
||
paused: 'Paused',
|
||
connected: 'Live',
|
||
lineCount: 'Showing {visible}/{total} lines',
|
||
jumpToLatest: 'Jump to latest ({count})',
|
||
},
|
||
moduleTest: {
|
||
normal: 'Normal',
|
||
disabled: 'Disabled',
|
||
error: 'Error',
|
||
checking: 'Checking...',
|
||
complete: 'Check Complete',
|
||
preparing: 'Preparing...',
|
||
totalModules: 'Total Modules',
|
||
recheck: 'Recheck',
|
||
requestFailed: 'Network request failed',
|
||
},
|
||
nameTest: {
|
||
recognize: 'Recognize',
|
||
recognizing: 'Recognizing...',
|
||
recognizeAgain: 'Recognize Again',
|
||
title: 'Title',
|
||
titleHint: 'Enter a torrent name, release title, or file name; audio file names are recognized as music',
|
||
subtitle: 'Subtitle',
|
||
subtitleHint: 'Optional torrent description, alias, or release details to improve recognition accuracy',
|
||
source: 'Recognition Source',
|
||
sourceHint: 'Uses the backend recognition setting by default; switch it for this test only',
|
||
customWords: 'Custom Words',
|
||
customWordsPlaceholder: 'Enter one recognition rule per line; applied directly to this recognition test',
|
||
customWordsHint:
|
||
'Same format as Custom Words settings: block word / old => new / before <> after >> episode offset',
|
||
saveWords: 'Save Words',
|
||
saveWordsSuccess: 'Custom words appended to the word list',
|
||
saveWordsNoChange: 'These words already exist, no need to save again',
|
||
saveWordsFailed: 'Failed to save custom words',
|
||
requestFailed: 'Recognition request failed',
|
||
unrecognized: 'No media recognized',
|
||
waitingResult: 'Waiting for recognition result',
|
||
analysisTitle: 'Analysis Flow',
|
||
analysisSubtitle: 'Title preprocessing, meta info, and media match',
|
||
summary: {
|
||
year: 'Year',
|
||
episode: 'Episode',
|
||
type: 'Type',
|
||
source: 'Source',
|
||
},
|
||
steps: {
|
||
original: {
|
||
title: 'Original Title',
|
||
caption: 'The raw string entering recognition',
|
||
},
|
||
words: {
|
||
title: 'Custom Words',
|
||
caption: 'Applied custom recognition words',
|
||
value: '{count} matched',
|
||
none: 'No custom words applied',
|
||
},
|
||
meta: {
|
||
title: 'Meta Info',
|
||
caption: 'Parsed name, episodes, and resource terms',
|
||
},
|
||
classification: {
|
||
title: 'Media Classification',
|
||
},
|
||
source: {
|
||
title: 'Recognition Source',
|
||
caption: 'The media source matched by this recognition',
|
||
},
|
||
media: {
|
||
title: 'Media ID',
|
||
caption: 'The native media ID from the matched source',
|
||
},
|
||
},
|
||
},
|
||
netTest: {
|
||
notTested: 'Not Tested',
|
||
testing: 'Testing...',
|
||
normal: 'Normal',
|
||
},
|
||
ruleTest: {
|
||
test: 'Test',
|
||
testing: 'Testing...',
|
||
testAgain: 'Test Again',
|
||
title: 'Title',
|
||
titleHint: 'Enter a release title to simulate a search or download result',
|
||
subtitle: 'Subtitle',
|
||
subtitleHint: 'Optional release description, tags, or site subtitle used for recognition and filtering',
|
||
ruleGroup: 'Rule Group',
|
||
ruleGroupHint: 'Select the filter rule group to validate',
|
||
ruleGroupPlaceholder: 'Please select',
|
||
priority: 'Priority: {value}',
|
||
noPriorityRule: 'No priority rule matched!',
|
||
requestFailed: 'Rule test request failed',
|
||
waitingResult: 'Waiting for rule test result',
|
||
matched: 'Filter rule matched',
|
||
priorityLabel: 'Priority',
|
||
analysisTitle: 'Filter Flow',
|
||
analysisSubtitle: 'Rule group, media recognition, filter match, and priority order',
|
||
ruleCount: '{count} rules',
|
||
summary: {
|
||
priority: 'Priority',
|
||
ruleGroup: 'Rule Group',
|
||
ruleCount: 'Rules',
|
||
media: 'Media',
|
||
},
|
||
steps: {
|
||
group: {
|
||
title: 'Rule Group',
|
||
caption: 'Current group contains {count} priority rules',
|
||
empty: 'No rules in this group',
|
||
},
|
||
media: {
|
||
title: 'Media Recognition',
|
||
caption: 'Recognize media context before filtering',
|
||
none: 'No media recognized',
|
||
},
|
||
filter: {
|
||
title: 'Filter Match',
|
||
matched: 'Resource passes the filter rules',
|
||
pending: 'No match result returned',
|
||
},
|
||
priority: {
|
||
title: 'Priority Result',
|
||
caption: 'Converted priority for the matched resource',
|
||
empty: 'No priority generated',
|
||
},
|
||
},
|
||
},
|
||
setting: {
|
||
about: {
|
||
title: 'About MoviePilot',
|
||
softwareVersion: 'Software Version',
|
||
frontendVersion: 'Frontend Version',
|
||
systemUptime: 'System Uptime',
|
||
browserVersion: 'Browser Cached Version',
|
||
authVersion: 'Auth Resource Version',
|
||
indexerVersion: 'Indexer Resource Version',
|
||
configDir: 'Config Directory',
|
||
dataDir: 'Data Directory',
|
||
timezone: 'Timezone',
|
||
latest: 'Latest',
|
||
supportingSites: 'Supporting Sites',
|
||
support: 'Support',
|
||
documentation: 'Documentation',
|
||
feedback: 'Feedback',
|
||
channel: 'Release Channel',
|
||
versions: 'Software Versions',
|
||
latestVersion: 'Latest Version',
|
||
currentVersion: 'Current Version',
|
||
viewChangelog: 'View Changelog',
|
||
changelog: 'Changelog',
|
||
dataDirectory: '/moviepilot',
|
||
expand: 'Expand',
|
||
collapse: 'Collapse',
|
||
clearCache: 'Clear Cache',
|
||
versionStatistic: 'Version Statistics',
|
||
versionStatisticTitle: 'Installation Version Statistics',
|
||
totalInstallUsers: 'Install Users',
|
||
activeToday: 'Active Today',
|
||
active7Days: 'Active 7 Days',
|
||
active30Days: 'Active 30 Days',
|
||
backendVersionStatistic: 'Backend Versions',
|
||
frontendVersionStatistic: 'Frontend Versions',
|
||
version: 'Version',
|
||
users: 'Users',
|
||
lastUpdated: 'Updated At',
|
||
noVersionStatisticData: 'No statistics data',
|
||
uptimeUnits: {
|
||
day: '{count} day',
|
||
days: '{count} days',
|
||
hour: '{count} hour',
|
||
hours: '{count} hours',
|
||
minute: '{count} minute',
|
||
minutes: '{count} minutes',
|
||
second: '{count} second',
|
||
seconds: '{count} seconds',
|
||
},
|
||
},
|
||
system: {
|
||
custom: 'Custom',
|
||
basicSettings: 'Basic Settings',
|
||
basicSettingsDesc: 'Configure server global functions.',
|
||
appDomain: 'Access Domain',
|
||
appDomainHint: 'MoviePilot access URL used for notification links and passkey verification',
|
||
wallpaper: 'Background Wallpaper',
|
||
wallpaperHint: 'Choose the source of the login page background',
|
||
recognizeSource: 'Recognition Data Source',
|
||
recognizeSourceHint: 'Set the default media info recognition data source',
|
||
apiToken: 'API Token',
|
||
apiTokenHint: 'Set the token value used when external requests access MoviePilot API',
|
||
apiTokenMinChars: 'Cannot be less than 16 characters',
|
||
apiTokenRequired: 'Required field; please enter API Token',
|
||
apiTokenLength: 'API Token must be at least 16 characters',
|
||
githubToken: 'Github Token',
|
||
githubTokenFormat: 'ghp_**** or github_pat_****',
|
||
githubTokenHint:
|
||
'Used to increase the rate limit threshold when plugins access Github API,it is recommended to configure, otherwise plugins may not work properly',
|
||
ocrHost: 'OCR Server',
|
||
ocrHostHint: 'Used for site check-in, updating site cookies and other captcha recognition',
|
||
aiAgent: 'Enable AI Assistant',
|
||
aiAgentEnable: 'Enable AI Assistant',
|
||
aiAgentEnableHint: 'Enable AI assistant functionality, requires LLM configuration',
|
||
aiAgentSectionTitle: 'AI Assistant Configuration',
|
||
aiAgentSectionDesc:
|
||
'After enabling it, you can use the Agent in message conversations and optionally turn on transfer-failure takeover and AI recommendations.',
|
||
llmProvider: 'LLM Provider',
|
||
llmProviderHint: 'Select the LLM service provider to use',
|
||
llmModel: 'LLM Model Name',
|
||
llmModelHint: 'Specify the LLM model to use, such as deepseek-v4-flash, gpt-5.4, etc.',
|
||
llmModelPlaceholder: 'Enter or select an LLM model name',
|
||
llmModelResolvedHint: 'Max context has been auto-filled to {context}K from the model catalog. Source: {source}',
|
||
llmThinking: 'Thinking Mode / Depth',
|
||
llmThinkingHint:
|
||
'Thinking depth: off/auto/minimal/low/medium/high/max/xhigh. Unsupported levels will be mapped to the nearest provider-supported value.',
|
||
llmThinkingLevelOff: 'Off (off)',
|
||
llmThinkingLevelAuto: 'Auto (auto)',
|
||
llmThinkingLevelMinimal: 'Minimal (minimal)',
|
||
llmThinkingLevelLow: 'Low (low)',
|
||
llmThinkingLevelMedium: 'Medium (medium)',
|
||
llmThinkingLevelHigh: 'High (high)',
|
||
llmThinkingLevelMax: 'Max (max)',
|
||
llmThinkingLevelXhigh: 'XHigh (xhigh)',
|
||
llmSupportImageInput: 'Model Supports Image Input',
|
||
llmSupportImageInputHint:
|
||
'When enabled, message images are sent to the LLM as multimodal image input. When disabled, images are saved locally as attachments and only the file path is passed to the AI assistant.',
|
||
llmSupportAudioInput: 'Support Audio Input',
|
||
llmSupportAudioInputHint:
|
||
'When enabled, incoming audio messages are transcribed before being handled by the AI assistant.',
|
||
llmSupportAudioOutput: 'Support Audio Output',
|
||
llmSupportAudioOutputHint: 'When enabled, the AI assistant can send voice replies on supported channels.',
|
||
llmMaxContextTokens: 'LLM Max Context Tokens (K)',
|
||
llmMaxContextTokensHint:
|
||
'Set the maximum number of context tokens (in thousands) for the LLM. Exceeding this limit will trigger context trimming.',
|
||
llmApiKey: 'LLM API Key',
|
||
llmApiKeyHint: 'API key from the LLM service provider for authentication',
|
||
llmApiKeyPlaceholder: 'Please enter API key',
|
||
llmBaseUrl: 'LLM Base URL',
|
||
llmBaseUrlHint: 'Base URL for LLM API, used for custom API endpoints',
|
||
llmBaseUrlPlaceholder: 'Enter the LLM API base URL',
|
||
llmUseProxy: 'Use System Proxy',
|
||
llmUseProxyHint:
|
||
'When enabled, Agent connections to the current LLM provider use the system proxy from advanced settings.',
|
||
llmUserAgent: 'User-Agent',
|
||
llmUserAgentHint: 'User-Agent sent to OpenAI-compatible APIs. Leave empty to use the SDK default.',
|
||
llmUserAgentPlaceholder: 'Leave empty to use the SDK default User-Agent',
|
||
llmApiProtocol: 'API Protocol',
|
||
llmApiProtocolHint:
|
||
'Request protocol for OpenAI-compatible APIs: auto-select by model capability, or force Chat Completions / Responses.',
|
||
llmApiProtocolAuto: 'Auto (auto)',
|
||
llmApiProtocolChatCompletions: 'Chat Completions',
|
||
llmApiProtocolResponses: 'Responses',
|
||
llmWebSearchMode: 'Web Search',
|
||
llmWebSearchModeHint:
|
||
'Use MoviePilot local search, model-hosted search, automatic fallback, or disable web access. Hosted search is available only for models that declare support.',
|
||
llmWebSearchModeBuiltinSupportedHint:
|
||
'This model supports provider-hosted search. Built-in and Auto use the required protocol without a separate search API key.',
|
||
llmWebSearchModeLocal: 'MoviePilot local search',
|
||
llmWebSearchModeBuiltin: 'Model-hosted search',
|
||
llmWebSearchModeAuto: 'Auto (hosted first)',
|
||
llmWebSearchModeDisabled: 'Disable web search',
|
||
llmTemperature: 'Temperature',
|
||
llmTemperatureHint:
|
||
'Controls response randomness. Lower values are steadier and higher values are more varied. Backend default is 0.3; 0-2 is usually recommended.',
|
||
llmProviderAuth: 'Provider Authorization',
|
||
llmProviderAuthHint:
|
||
'Providers that support account authorization can complete sign-in here and reuse the saved auth state.',
|
||
llmProviderConnectedAs: 'Connected as: {label}',
|
||
llmProviderDisconnect: 'Disconnect Authorization',
|
||
llmProviderDisconnected: 'Provider authorization disconnected',
|
||
llmProviderAuthDialogTitle: 'Provider Authorization',
|
||
llmProviderPopupBlocked:
|
||
'The browser blocked the authorization popup. Use the button below to continue manually.',
|
||
llmProviderDeviceCode: 'Device Code',
|
||
llmProviderOpenAuthPage: 'Open Authorization Page',
|
||
llmProviderCheckAuthStatus: 'Check Authorization Status',
|
||
audioInputProvider: 'Audio Input Provider',
|
||
audioInputProviderHint:
|
||
'Service used to transcribe incoming audio messages. Supports OpenAI audio, Chat Audio compatible APIs, Xiaomi MiMo, and MiniMax.',
|
||
audioProviderOpenAiAudio: 'OpenAI Audio Compatible',
|
||
audioProviderChatAudio: 'Chat Audio Compatible',
|
||
audioProviderMimo: 'Xiaomi MiMo',
|
||
audioProviderMinimax: 'MiniMax',
|
||
audioInputApiKey: 'Audio Input API Key',
|
||
audioInputApiKeyHint: 'API key used for audio transcription.',
|
||
audioInputBaseUrl: 'Audio Input Base URL',
|
||
audioInputBaseUrlHint:
|
||
'Base URL for audio input. Use the matching compatible endpoint for Chat Audio services; MiMo defaults to https://api.xiaomimimo.com/v1, MiniMax defaults to https://api.minimaxi.com/v1.',
|
||
audioInputModel: 'Audio Input Model',
|
||
audioInputModelHint: 'Model name used to convert audio content into text.',
|
||
audioInputLanguage: 'Recognition Language',
|
||
audioInputLanguageHint:
|
||
'Default language for audio transcription, such as zh or en. Leave blank to use the backend default.',
|
||
audioOutputProvider: 'Audio Output Provider',
|
||
audioOutputProviderHint:
|
||
'Service used to generate voice replies. Supports OpenAI audio, Chat Audio compatible APIs, Xiaomi MiMo, and MiniMax.',
|
||
audioOutputApiKey: 'Audio Output API Key',
|
||
audioOutputApiKeyHint: 'API key used for speech synthesis.',
|
||
audioOutputBaseUrl: 'Audio Output Base URL',
|
||
audioOutputBaseUrlHint:
|
||
'Base URL for audio output. Use the matching compatible endpoint for Chat Audio services; MiMo defaults to https://api.xiaomimimo.com/v1, MiniMax defaults to https://api.minimaxi.com/v1.',
|
||
audioOutputModel: 'Audio Output Model',
|
||
audioOutputModelHint: 'Model name used to convert text content into speech.',
|
||
audioOutputVoice: 'Voice Preset',
|
||
audioOutputVoiceHint: 'Speaker or voice preset used for speech synthesis.',
|
||
audioOutputIncludeText: 'Include Text with Voice Replies',
|
||
audioOutputIncludeTextHint: 'When sending a voice reply, also include the text version of the response.',
|
||
llmTestAction: 'Test Call',
|
||
llmTestSuccessToast: 'LLM test call succeeded',
|
||
llmTestFailedToast: 'LLM test call failed',
|
||
llmTestFailedToastWithMessage: 'LLM test call failed: {message}',
|
||
aiAgentGlobal: 'Global AI Assistant',
|
||
aiAgentGlobalHint:
|
||
'Global AI Assistant On: AI assistant by default. Use /noai for traditional search; Global AI Assistant Off: Traditional search by default. Use /ai for AI assistant.',
|
||
aiAgentJobInterval: 'Scheduled Wake',
|
||
aiAgentJobIntervalHint:
|
||
'Set the check interval for scheduled wake. Select "Disabled" to disable scheduled tasks.',
|
||
aiAgentVerbose: 'Verbose Mode',
|
||
aiAgentVerboseHint: 'When enabled, tool call process will be displayed in AI agent responses',
|
||
aiAgentHideEntry: 'Hide Global Entry',
|
||
aiAgentHideEntryHint:
|
||
'Only hide the floating AI assistant entry in the bottom-right corner. Message channels and background assistant features are not affected.',
|
||
aiAgentJobIntervalDisabled: 'Disabled',
|
||
aiAgentJobInterval1h: '1 Hour',
|
||
aiAgentJobInterval3h: '3 Hours',
|
||
aiAgentJobInterval6h: '6 Hours',
|
||
aiAgentJobInterval12h: '12 Hours',
|
||
aiAgentJobInterval24h: '24 Hours',
|
||
aiAgentJobInterval1w: '1 Week',
|
||
aiAgentJobInterval1M: '1 Month',
|
||
aiAgentMcpTitle: 'External MCP Tools',
|
||
aiAgentMcpSummary: '{total} MCP servers configured, {enabled} enabled.',
|
||
aiAgentMcpSettings: 'Set MCP',
|
||
aiAgentMcpDialogTitle: 'Agent MCP Settings',
|
||
aiAgentMcpDialogDesc: 'Configure external MCP servers and test tools available to the AI assistant.',
|
||
aiAgentMcpAddServer: 'Add Server',
|
||
aiAgentMcpEmpty: 'No MCP servers configured yet.',
|
||
aiAgentMcpNewServer: 'New MCP Server',
|
||
aiAgentMcpUnnamedServer: 'Unnamed Server',
|
||
aiAgentMcpName: 'Server Name',
|
||
aiAgentMcpTransport: 'Transport',
|
||
aiAgentMcpTransportStdio: 'stdio',
|
||
aiAgentMcpTransportSse: 'SSE',
|
||
aiAgentMcpTransportHttp: 'HTTP',
|
||
aiAgentMcpEnabled: 'Enable Server',
|
||
aiAgentMcpEnabledHint: 'When enabled, the AI assistant loads tools from this server at runtime',
|
||
aiAgentMcpRequireAdmin: 'Admin Only',
|
||
aiAgentMcpRequireAdminHint: 'Recommended for external tools that may have elevated permissions',
|
||
aiAgentMcpTimeout: 'Timeout (seconds)',
|
||
aiAgentMcpToolPrefix: 'Tool Prefix',
|
||
aiAgentMcpToolPrefixHint: 'Leave empty to derive it from the server name and avoid tool name conflicts',
|
||
aiAgentMcpDescription: 'Description',
|
||
aiAgentMcpCommand: 'Command',
|
||
aiAgentMcpArgs: 'Arguments',
|
||
aiAgentMcpArgsHint: 'One argument per line, such as -y or server-filesystem',
|
||
aiAgentMcpEnv: 'Environment Variables',
|
||
aiAgentMcpKeyValueHint: 'One KEY=VALUE pair per line',
|
||
aiAgentMcpUrl: 'Service URL',
|
||
aiAgentMcpHeaders: 'Headers',
|
||
aiAgentMcpTest: 'Test Connection',
|
||
aiAgentMcpSaveSuccess: 'MCP configuration saved',
|
||
aiAgentMcpSaveFailed: 'Failed to save MCP configuration',
|
||
advancedSettings: 'Advanced Settings',
|
||
advancedSettingsDesc: 'System advanced settings, only need to be adjusted in special cases',
|
||
downloaders: 'Downloaders',
|
||
downloadersDesc: 'Only the default downloader will be used by default.',
|
||
aiAgentRetryTransfer: 'AI Takeover on Transfer Failure',
|
||
aiAgentRetryTransferHint:
|
||
'When enabled, the AI assistant will automatically take over and retry when file transfer/organization fails, using AI capabilities to resolve recognition and matching issues.',
|
||
aiRecommendEnabled: 'AI Search Recommendation',
|
||
aiRecommendEnabledHint:
|
||
'Enable AI search recommendation. When enabled, an AI recommendation button will be displayed on the search result page, recommending resources based on user preferences.',
|
||
aiRecommendUserPreference: 'User Preference',
|
||
aiRecommendUserPreferenceHint: 'Set user preferences for AI recommendation, e.g., 4K WEB-DL Dolby Vision',
|
||
aiRecommendMaxItems: 'AI Recommendation Analysis Limit',
|
||
aiRecommendMaxItemsHint:
|
||
'Limit the number of search results sent to the AI assistant for analysis. More items mean slower analysis and more token consumption. It is recommended to manually filter to a general range before using AI recommendation.',
|
||
mediaServers: 'Media Servers',
|
||
mediaServersDesc: 'All enabled media servers will be used.',
|
||
trimeMedia: 'TrimeMedia',
|
||
system: 'System',
|
||
media: 'Media',
|
||
network: 'Network',
|
||
log: 'Log',
|
||
data: 'Data',
|
||
lab: 'Lab',
|
||
downloaderSaveSuccess: 'Downloader settings saved successfully',
|
||
downloaderSaveFailed: 'Failed to save downloader settings!',
|
||
defaultDownloaderNotice: 'No default downloader set, [{name}] has been set as the default downloader',
|
||
mediaServerSaveSuccess: 'Media server settings saved successfully',
|
||
mediaServerSaveFailed: 'Failed to save media server settings!',
|
||
saveFailed: 'Failed to save settings: {message}!',
|
||
basicSaveSuccess: 'Basic settings saved successfully',
|
||
advancedSaveSuccess: 'Advanced settings saved successfully',
|
||
copySuccess: 'Copied to clipboard!',
|
||
copyFailed: 'Copy failed: browser may not support or user blocked!',
|
||
copyError: 'Copy failed!',
|
||
reloading: 'Applying configuration...',
|
||
qbittorrent: 'Qbittorrent',
|
||
transmission: 'Transmission',
|
||
rtorrent: 'rTorrent',
|
||
emby: 'Emby',
|
||
zspace: 'ZSpace',
|
||
jellyfin: 'Jellyfin',
|
||
plex: 'Plex',
|
||
ugreen: 'Ugreen',
|
||
navidrome: 'Navidrome Music Server',
|
||
reloadSuccess: 'System configuration has taken effect',
|
||
reloadFailed: 'Failed to reload system!',
|
||
auxAuthEnable: 'User Auxiliary Authentication',
|
||
auxAuthEnableHint: 'Allow external services to authenticate login and automatically create users',
|
||
globalImageCache: 'Global Image Cache',
|
||
globalImageCacheHint: 'Cache media images locally to improve image loading speed',
|
||
subscribeStatisticShare: 'Share Subscription Data',
|
||
subscribeStatisticShareHint:
|
||
'Share subscription statistics to popular subscriptions for other MP users to reference',
|
||
pluginStatisticShare: 'Report Plugin Installation Data',
|
||
pluginStatisticShareHint: 'Report plugin installation data to the server for statistics and display purposes',
|
||
usageStatisticShare: 'Report Installation Version Statistics',
|
||
usageStatisticShareHint:
|
||
'Report anonymous installation ID and current backend/frontend versions to count users by version',
|
||
workflowStatisticShare: 'Share Workflow Data',
|
||
workflowStatisticShareHint: 'Share workflow statistics to popular workflows for other MP users to reference',
|
||
bigMemoryMode: 'Large Memory Mode',
|
||
bigMemoryModeHint: 'Use more memory to cache data and improve system performance',
|
||
dbWalEnable: 'Sqlite WAL Mode',
|
||
dbWalEnableHint:
|
||
'Can improve read/write concurrency performance, but may increase the risk of data loss in exceptional cases, requires restart to take effect',
|
||
tmdbApiDomain: 'TMDB API Service Address',
|
||
tmdbApiDomainPlaceholder: 'api.themoviedb.org',
|
||
tmdbApiDomainHint: 'Customize TheMovieDb API domain or proxy address',
|
||
tmdbApiDomainRequired: 'Please enter TMDB API domain',
|
||
tmdbApiKey: 'TMDB API Key',
|
||
tmdbApiKeyPlaceholder: 'Please enter TMDB API Key',
|
||
tmdbApiKeyHint: 'Set TheMovieDb API Key',
|
||
tmdbApiKeyRequired: 'Please enter TMDB API Key',
|
||
acoustIdApiKey: 'AcoustID API Key',
|
||
acoustIdApiKeyPlaceholder: 'Please enter AcoustID API Key',
|
||
acoustIdApiKeyHint: 'Used to identify MusicBrainz recording IDs from audio fingerprints',
|
||
acoustIdApiKeyRequired: 'Please enter AcoustID API Key',
|
||
musicMetadataToSimplified: 'Convert Music Metadata to Simplified Chinese',
|
||
musicMetadataToSimplifiedHint:
|
||
'Force recognized music titles, artists, albums, categories, and other metadata to Simplified Chinese',
|
||
tmdbImageDomain: 'TMDB Image Service Address',
|
||
tmdbImageDomainPlaceholder: 'image.tmdb.org',
|
||
tmdbImageDomainHint: 'Customize TheMovieDb image service domain or proxy address',
|
||
tmdbImageDomainRequired: 'Please enter image service domain',
|
||
musicCoverProxy: 'Music Cover Proxy Address',
|
||
musicCoverProxyPlaceholder: 'https://your-proxy.example.com',
|
||
musicCoverProxyHint:
|
||
'Customize music cover proxy address to fix cover not showing when coverartarchive.org is inaccessible. Leave empty to use official address',
|
||
tmdbLocale: 'TMDB Metadata Language',
|
||
tmdbLocalePlaceholder: 'en',
|
||
tmdbLocaleHint: 'Customize TheMovieDb metadata language',
|
||
metaCacheExpire: 'Per-item Media Metadata Cache TTL',
|
||
metaCacheExpireHint: 'Independent TTL for each recognition metadata item; use the built-in default when set to 0',
|
||
metaCacheExpireRequired: 'Please enter metadata cache time',
|
||
metaCacheExpireMin: 'Metadata cache time must be greater than or equal to 0',
|
||
scrapFollowTmdb: 'Follow TMDB Recognition',
|
||
scrapFollowTmdbHint:
|
||
'When turned off, organization history will be used (if available) to avoid TMDB data changes during subscription',
|
||
scrapOriginalImage: 'Scrap TheMovieDb Original Language Image',
|
||
scrapOriginalImageHint: 'Scrap original language image from TheMovieDb, otherwise scrap metadata language image',
|
||
fanartEnable: 'Fanart Image Data Source',
|
||
fanartEnableHint: 'Use image data from fanart.tv',
|
||
fanartLang: 'Fanart Language',
|
||
fanartLangHint: 'Set language preference for Fanart images, ordered by priority when multiple selected',
|
||
recognizePluginFirst: 'Prioritize Plugin Recognition',
|
||
recognizePluginFirstHint:
|
||
'Prioritize calling plugins for media recognition. If a plugin matches, native recognition will be skipped',
|
||
mediaRecognizeShare: 'Use Shared Media Recognition',
|
||
mediaRecognizeShareHint:
|
||
'Report successful keyword to media ID mappings and reuse shared recognition results when local recognition fails',
|
||
githubProxy: 'Github Acceleration Proxy',
|
||
githubProxyPlaceholder: 'Leave empty for no proxy',
|
||
githubProxyHint: 'Use proxy to accelerate Github access speed',
|
||
pipProxy: 'PIP Acceleration Proxy',
|
||
pipProxyPlaceholder: 'Leave empty for no proxy',
|
||
pipProxyHint: 'Use proxy to accelerate pip library installation speed for plugins, etc.',
|
||
dohEnable: 'DNS Over HTTPS',
|
||
dohEnableHint: 'Use DOH to resolve specific domains to prevent DNS pollution',
|
||
dohResolvers: 'DOH Servers',
|
||
dohResolversPlaceholder: 'https://dns.google/dns-query,1.1.1.1',
|
||
dohResolversHint: 'DNS resolver server addresses, multiple addresses separated by commas',
|
||
dohDomains: 'DOH Domains',
|
||
dohDomainsPlaceholder: 'example.com,example2.com',
|
||
dohDomainsHint: 'Domains to be resolved using DOH, multiple domains separated by commas',
|
||
debug: 'Debug Mode',
|
||
debugHint: 'When debug mode is enabled, logs will be recorded at DEBUG level to help troubleshoot issues',
|
||
logLevel: 'Log Level',
|
||
logLevelHint: 'Set the level of log recording to control log output volume',
|
||
logMaxFileSize: 'Maximum Log File Size (MB)',
|
||
logMaxFileSizeHint: 'Limit the maximum size of a single log file, logs will be split automatically when exceeded',
|
||
logMaxFileSizeRequired: 'Maximum log file size',
|
||
logMaxFileSizeMin: 'Maximum log file size must be greater than or equal to 1',
|
||
logBackupCount: 'Maximum Number of Log File Backups',
|
||
logBackupCountHint:
|
||
'Set the maximum number of backups for each module log file, old logs will be overwritten when exceeded',
|
||
logBackupCountRequired: 'Please enter the maximum number of log file backups',
|
||
logBackupCountMin: 'Maximum number of log file backups must be greater than or equal to 1',
|
||
logFileFormat: 'Log File Format',
|
||
logFileFormatHint: 'Set the output format of log files to customize the displayed content of logs',
|
||
dbBackupEnable: 'Enable Data Backup',
|
||
dbBackupEnableHint: 'Enable scheduled backups and backups before database migrations',
|
||
dbBackupCron: 'Backup Schedule',
|
||
dbBackupCronHint: 'Cron expression; leave empty to disable scheduled backups',
|
||
dbBackupCronInvalid: 'Backup schedule must be empty or a valid Cron expression',
|
||
dbBackupPath: 'Backup Directory',
|
||
dbBackupPathPlaceholder: '/config/database_backup',
|
||
dbBackupPathHint:
|
||
'Leave empty to use database_backup under the configuration directory; local paths are supported',
|
||
dbBackupRetentionDays: 'Backup Retention Days',
|
||
dbBackupRetentionDaysHint: 'Unit: days. Set to 0 for no limit',
|
||
dbBackupRetentionDaysInvalid: 'Backup retention days must be an integer greater than or equal to 0',
|
||
dbBackupMaxCount: 'Maximum Backup Count',
|
||
dbBackupMaxCountHint: 'Set to 0 for no limit',
|
||
dbBackupMaxCountInvalid: 'Maximum backup count must be an integer greater than or equal to 0',
|
||
dbBackupOnUpgrade: 'Back Up Before Database Migration',
|
||
dbBackupOnUpgradeHint:
|
||
'Automatically create a backup when pending migrations are detected for an existing database',
|
||
dataCleanupEnable: 'Enable Data Cleanup',
|
||
dataCleanupEnableHint: 'Automatically remove expired data using the configured retention periods',
|
||
dataCleanupDaysRequired: 'Please enter a cleanup retention period',
|
||
dataCleanupDaysMin: 'Cleanup retention period must be greater than or equal to 0',
|
||
dataCleanupMessageDays: 'Message Retention Days',
|
||
dataCleanupMessageDaysHint: 'Unit: days. Set to 0 to skip cleanup for the message table',
|
||
dataCleanupDownloadHistoryDays: 'Download History Retention Days',
|
||
dataCleanupDownloadHistoryDaysHint:
|
||
'Unit: days. Set to 0 to skip cleanup for download history and its related orphaned download file records',
|
||
dataCleanupSiteUserDataDays: 'Site User Data Retention Days',
|
||
dataCleanupSiteUserDataDaysHint: 'Unit: days. Set to 0 to skip cleanup for the site user data table',
|
||
dataCleanupTransferHistoryDays: 'Transfer History Retention Days',
|
||
dataCleanupTransferHistoryDaysHint: 'Unit: days. Set to 0 to skip cleanup for the transfer history table',
|
||
downloadFilesCleanupNotice:
|
||
'The download files table has no independent timestamp field. Its orphan record cleanup follows the retention period of download history.',
|
||
pluginAutoReload: 'Plugin Hot Reload',
|
||
pluginAutoReloadHint: 'Automatically reload after modifying plugin files, used when developing plugins',
|
||
pluginLocalRepoPaths: 'Local Plugin Repository Paths',
|
||
pluginLocalRepoPathsHint:
|
||
'Local plugin repository directories. Separate multiple directories with commas. Relative and absolute paths are supported.',
|
||
encodingDetectionPerformanceMode: 'Encoding Detection Performance Mode',
|
||
encodingDetectionPerformanceModeHint:
|
||
'Prioritize detection efficiency, but may reduce encoding detection accuracy',
|
||
rustAccel: 'Rust Acceleration',
|
||
rustAccelHint:
|
||
'Use the backend Rust extension to accelerate filtering, RSS, indexer parsing, and recognition hot paths',
|
||
rustAccelUnavailableHint:
|
||
'The backend Rust acceleration extension is not installed or loaded, so this cannot be enabled',
|
||
transferThreads: 'File Transfer Threads',
|
||
transferThreadsHint: 'Multi-threaded file transfer can improve speed but may increase system resource usage',
|
||
tokenizedSearch: 'Tokenized Search',
|
||
tokenizedSearchHint:
|
||
'Improve organization history search precision, but may increase performance overhead and unexpected results',
|
||
monitorNetworkFastMode: 'Fast Monitoring for Network Storage',
|
||
monitorNetworkFastModeHint:
|
||
'Allow kernel-notification (fast) monitoring on network/FUSE mounts. Enable only if the mount reliably delivers file change notifications, otherwise new files will not be detected. Takes effect immediately after saving (monitors are rebuilt automatically).',
|
||
transferMaxFailedRetries: 'Transfer Retries on Failure',
|
||
transferMaxFailedRetriesHint:
|
||
'Maximum automatic retries after a failed transfer, so a transient network or recognition glitch cannot permanently skip a file. Once exhausted, transfer it manually or delete the transfer history. Range 1-10; the counter resets on a successful transfer or when the record is deleted. Takes effect immediately after saving.',
|
||
fsProxyEnabled: 'Isolate Local File Operations',
|
||
fsProxyEnabledHint:
|
||
'Run local file reads, copies, moves and deletes in a separate subprocess. When a FUSE mount such as CloudDrive2 stops responding, these calls hang forever and cannot be interrupted, which in turn stalls the transfer queue and directory monitoring. Isolated, they can be force-reclaimed after a timeout and surface as ordinary errors that the existing retry logic handles. Disable to fall back to direct calls, matching the previous behaviour.',
|
||
fsProxyTimeout: 'File Operation Timeout (seconds)',
|
||
fsProxyTimeoutHint:
|
||
'Maximum wait for fast operations such as reading attributes, listing directories, deleting and renaming. On timeout the mount is treated as unresponsive and the subprocess is reclaimed. Only applies when "Isolate Local File Operations" is enabled. Takes effect immediately after saving.',
|
||
fsProxyStallTimeout: 'File Copy Stall Timeout (seconds)',
|
||
fsProxyStallTimeoutHint:
|
||
'How long a copy may make no progress at all. The check is based on whether progress advances rather than total elapsed time, so copying a large file for hours is never misjudged — only a completely stalled transfer is aborted. Only applies when "Isolate Local File Operations" is enabled. Takes effect immediately after saving.',
|
||
tmdbLanguage: {
|
||
zhCN: 'Simplified Chinese',
|
||
zhTW: 'Traditional Chinese',
|
||
en: 'English',
|
||
},
|
||
fanartLanguage: {
|
||
zh: 'Chinese',
|
||
en: 'English',
|
||
ja: 'Japanese',
|
||
ko: 'Korean',
|
||
de: 'German',
|
||
fr: 'French',
|
||
es: 'Spanish',
|
||
it: 'Italian',
|
||
pt: 'Portuguese',
|
||
ru: 'Russian',
|
||
},
|
||
logLevelItems: {
|
||
debug: 'DEBUG',
|
||
info: 'INFO',
|
||
warning: 'WARNING',
|
||
error: 'ERROR',
|
||
critical: 'CRITICAL',
|
||
},
|
||
wallpaperItems: {
|
||
tmdb: 'TMDB Movie Posters',
|
||
bing: 'Bing Daily Wallpaper',
|
||
mediaserver: 'Media Server',
|
||
none: 'No Wallpaper',
|
||
customize: 'Customize',
|
||
},
|
||
mb: 'MB',
|
||
hour: 'hour',
|
||
day: 'day',
|
||
customizeWallpaperApi: 'Customize Wallpaper Api',
|
||
customizeWallpaperApiHint:
|
||
'It will get the image file extension format images that are allowed in settings in the content returned by the API.',
|
||
customizeWallpaperApiRequired: 'Required field; please enter Wallpaper API',
|
||
securityImageDomains: 'Security Image Domains',
|
||
securityImageDomainsHint: 'Allowed image domains whitelist for caching, used to control trusted image sources',
|
||
noSecurityImageDomains: 'No security domains',
|
||
securityImageDomainAdd: 'Add domain, e.g.: image.tmdb.org',
|
||
imageProxyAllowedPrivateRanges: 'Image Proxy Allowed Private Ranges',
|
||
imageProxyAllowedPrivateRangesHint:
|
||
'Only applies after a URL matches a security image domain. Use for TUN mappings or internal CDNs; broad ranges weaken SSRF protection',
|
||
noImageProxyAllowedPrivateRanges: 'No allowed ranges',
|
||
imageProxyAllowedPrivateRangeAdd: 'Add CIDR, e.g.: 198.18.0.0/15',
|
||
proxyHost: 'Proxy Server',
|
||
proxyHostHint: 'Set proxy server address, support: http(s), socks5, socks5h, etc.',
|
||
moviePilotAutoUpdate: 'Auto Update MoviePilot',
|
||
moviePilotAutoUpdateHint: 'Automatically update MoviePilot to the latest release version when restarting',
|
||
autoUpdateResource: 'Auto Update Resource',
|
||
autoUpdateResourceHint: 'Automatically detect and update site resource package when restarting',
|
||
// Scraping Switch Settings
|
||
scrapingSwitchSettings: 'Scraping Switch Settings',
|
||
scrapingSwitchSettingsDesc: 'Control various media file scraping function switches',
|
||
movie: 'Movie',
|
||
tv: 'TV Show',
|
||
season: 'Season',
|
||
episode: 'Episode',
|
||
movieNfo: 'NFO',
|
||
seasonNfo: 'NFO',
|
||
moviePoster: 'Poster',
|
||
movieBackdrop: 'Backdrop',
|
||
movieLogo: 'Logo',
|
||
movieDisc: 'Disc',
|
||
movieBanner: 'Banner',
|
||
movieThumb: 'Thumb',
|
||
tvNfo: 'NFO',
|
||
tvPoster: 'Poster',
|
||
tvBackdrop: 'Backdrop',
|
||
tvBanner: 'Banner',
|
||
tvLogo: 'Logo',
|
||
tvThumb: 'Thumb',
|
||
seasonPoster: 'Poster',
|
||
seasonBanner: 'Banner',
|
||
seasonThumb: 'Thumb',
|
||
episodeNfo: 'NFO',
|
||
episodeThumb: 'Thumb',
|
||
music: 'Music',
|
||
musicNfo: 'Audio Tags',
|
||
musicPoster: 'Cover Art',
|
||
musicLyrics: 'Lyrics',
|
||
scrapingSwitchSaveFailed: 'Scraping switch settings save failed: {message}',
|
||
scrapingSwitchSaveError: 'Scraping switch settings save failed',
|
||
policy: {
|
||
skipDesc: 'Skip scraping, this file will not be generated',
|
||
missingOnlyDesc: 'Scrape only if missing, existing file remains unchanged',
|
||
overwriteDesc: 'Always scrape, existing file will be overwritten',
|
||
},
|
||
},
|
||
site: {
|
||
siteSync: 'Site Synchronization',
|
||
siteSyncDesc: 'Quickly sync site data from CookieCloud',
|
||
enableLocalCookieCloud: 'Enable Local CookieCloud Server',
|
||
enableLocalCookieCloudHint:
|
||
'Use built-in CookieCloud service to sync site data, service address: http://localhost:3000/cookiecloud',
|
||
serviceAddress: 'Service Address',
|
||
serviceAddressPlaceholder: 'https://movie-pilot.org/cookiecloud',
|
||
serviceAddressHint: 'Remote CookieCloud service address, format: https://movie-pilot.org/cookiecloud',
|
||
userKey: 'User KEY',
|
||
userKeyHint: 'User KEY generated by CookieCloud browser plugin',
|
||
e2ePassword: 'End-to-End Encryption Password',
|
||
e2ePasswordHint: 'End-to-end encryption password generated by CookieCloud browser plugin',
|
||
cookieCloudAuthHeader: 'Upload Auth Header',
|
||
cookieCloudAuthHeaderHint:
|
||
'Leave blank to disable upload authentication, otherwise the uploader or reverse proxy must send X-CookieCloud-Auth',
|
||
autoSyncInterval: 'Auto Sync Interval',
|
||
autoSyncIntervalHint:
|
||
'Time interval for automatically syncing site cookies from CookieCloud server to MoviePilot',
|
||
syncBlacklist: 'Sync Domain Blacklist',
|
||
syncBlacklistPlaceholder: 'Multiple domains, separated by commas',
|
||
syncBlacklistHint: 'CookieCloud sync domain blacklist, multiple domains separated by commas',
|
||
userAgent: 'Browser User-Agent',
|
||
userAgentHint: 'User-Agent of the browser with CookieCloud plugin',
|
||
browserEmulation: 'Browser Emulation',
|
||
browserEmulationHint: 'Choose how to emulate browser when accessing sites (CloakBrowser or FlareSolverr)',
|
||
ocrHost: 'OCR Server',
|
||
ocrHostHint: 'Used for site check-in, cookie updates, and other captcha recognition tasks',
|
||
flaresolverrUrl: 'FlareSolverr URL',
|
||
flaresolverrUrlHint: 'Required when using FlareSolverr, e.g. http://127.0.0.1:8191',
|
||
siteDataRefresh: 'Site Data Refresh',
|
||
siteOptions: 'Site Options',
|
||
siteDataRefreshInterval: 'Site Data Refresh Interval',
|
||
siteDataRefreshIntervalHint: 'Time interval for refreshing site user upload/download data',
|
||
searchResourcePages: 'Search Resource Pages',
|
||
searchResourcePagesHint:
|
||
'Number of consecutive pages to fetch from the current page when searching site resources. Default is 1.',
|
||
readSiteMessage: 'Read Site Messages',
|
||
readSiteMessageHint: 'Read site messages and send notifications when refreshing data',
|
||
siteReset: 'Site Reset',
|
||
confirmReset: 'Confirm to delete all site data and resync.',
|
||
confirmResetHint:
|
||
'Delete all site data and resync from CookieCloud. Please clear all related site settings before this operation.',
|
||
resetSites: 'Reset Site Data',
|
||
resettingSites: 'Resetting...',
|
||
syncInterval: {
|
||
hourly: 'Hourly',
|
||
every6Hours: 'Every 6 Hours',
|
||
every12Hours: 'Every 12 Hours',
|
||
daily: 'Daily',
|
||
weekly: 'Weekly',
|
||
monthly: 'Monthly',
|
||
never: 'Never',
|
||
},
|
||
saveSuccess: 'Site settings saved successfully',
|
||
saveFailed: 'Failed to save site settings!',
|
||
resetSuccess: 'Sites reset successfully, please wait for CookieCloud sync to complete!',
|
||
resetFailed: 'Failed to reset sites!',
|
||
},
|
||
notification: {
|
||
channels: 'Notification Channels',
|
||
channelsDesc: 'Set message sending channel parameters',
|
||
organizeSuccess: 'Media Import',
|
||
downloadAdded: 'Download Added',
|
||
subscribeAdded: 'Subscribe Added',
|
||
subscribeComplete: 'Subscribe Complete',
|
||
templateConfigTitle: 'Message Template',
|
||
templateConfigDesc: 'Set message template, support Jinja2 syntax.',
|
||
templateSaveFailed: 'Failed to save template!',
|
||
templateSaveSuccess: 'Template saved successfully',
|
||
templateLoadFailed: 'Failed to load template!',
|
||
scope: 'Notification Scope',
|
||
scopeDesc: 'Corresponding message types will only be sent to specified users.',
|
||
messageType: 'Message Type',
|
||
scopeRange: 'Scope',
|
||
operationUserOnly: 'Operation User Only',
|
||
adminOnly: 'Admin Only',
|
||
userAndAdmin: 'Operation User and Admin',
|
||
allUsers: 'All Users',
|
||
sendTime: 'Notification Send Time',
|
||
sendTimeDesc: 'Set the time range for sending messages.',
|
||
startTime: 'Start Time',
|
||
endTime: 'End Time',
|
||
saveSuccess: 'Notification settings saved successfully',
|
||
saveFailed: 'Failed to save notification settings!',
|
||
switchSaveSuccess: 'Message type switches saved successfully',
|
||
switchSaveFailed: 'Failed to save message type switches!',
|
||
timeSaveSuccess: 'Notification send time saved successfully',
|
||
timeSaveFailed: 'Failed to save notification send time!',
|
||
channel: 'Notification',
|
||
wechat: 'WeChat Work',
|
||
wechatClawBot: 'WeChat ClawBot',
|
||
feishu: 'Feishu',
|
||
resourceDownload: 'Resource Download',
|
||
mediaImport: 'Media Import',
|
||
subscription: 'Subscription',
|
||
site: 'Site',
|
||
mediaServer: 'Media Server',
|
||
manualProcess: 'Manual Process',
|
||
plugin: 'Plugin',
|
||
other: 'Other',
|
||
telegram: 'Telegram',
|
||
slack: 'Slack',
|
||
synologyChat: 'SynologyChat',
|
||
voceChat: 'VoceChat',
|
||
webPush: 'WebPush',
|
||
qq: 'QQ',
|
||
custom: 'Custom Notification',
|
||
},
|
||
words: {
|
||
summary: '{sections} word lists · {entries} entries',
|
||
sectionListLabel: 'Word list categories',
|
||
switchHint: 'Select an item on the left to edit it',
|
||
entryCount: '{count} entries',
|
||
ruleCount: '{count} rules',
|
||
listLabel: 'Word list content (one rule per line)',
|
||
lineNumbers: 'Line numbers',
|
||
syntaxHighlighting: 'Syntax highlighting',
|
||
saved: 'Saved',
|
||
unsaved: 'Unsaved changes',
|
||
saveChanges: 'Save changes',
|
||
guideTitle: 'Syntax tips',
|
||
dragToSort: 'Drag to reorder',
|
||
noRules: 'No episode format rules yet',
|
||
identifiersShort: 'Identifiers',
|
||
releaseGroupsShort: 'Groups',
|
||
customizationShort: 'Placeholders',
|
||
excludeWordsShort: 'Block words',
|
||
episodeFormatRuleShort: 'Episode rules',
|
||
customIdentifiers: 'Custom Identifiers',
|
||
identifiersDesc: 'Add rules to preprocess torrent names or file names to correct identification',
|
||
identifiersPlaceholder: 'Enter one identifier rule per line',
|
||
identifiersHint: 'Support regular expressions, special characters need \\ escape, one line for each rule',
|
||
formatTitle: 'Supported configuration formats (mind the spaces):',
|
||
formatContent:
|
||
'Block words\n' +
|
||
'Word to replace => Replacement\n' +
|
||
'Front word <> Back word >> Episode offset (EP)\n' +
|
||
'Word to replace => Replacement && Front word <> Back word >> Episode offset (EP)\n' +
|
||
'Replacement format supports: {[tmdbid/doubanid/bangumiid/anilistid=xxx;type=movie/tv;g=xxx;s=xxx;e=xxx]} to directly specify a media data source ID, where g is the episode group ID and s/e are season and episode numbers (all optional)',
|
||
identifierSaveSuccess: 'Custom identifiers saved successfully',
|
||
identifierSaveFailed: 'Failed to save custom identifiers!',
|
||
|
||
customReleaseGroups: 'Custom Release/Subtitle Groups',
|
||
releaseGroupsDesc: 'Add release/subtitle groups that cannot be identified.',
|
||
releaseGroupsPlaceholder: 'Enter one release/subtitle group per line',
|
||
releaseGroupsHint: 'Support regular expressions, special characters need \\ escape, one line for each group',
|
||
releaseGroupSaveSuccess: 'Custom release/subtitle groups saved successfully',
|
||
releaseGroupSaveFailed: 'Failed to save custom release/subtitle groups!',
|
||
|
||
customization: 'Custom Placeholders',
|
||
customizationDesc: 'Add custom placeholder regex patterns, use {customization} in rename format.',
|
||
customizationPlaceholder: 'Enter one placeholder regex per line',
|
||
customizationHint:
|
||
'Support regular expressions, special characters need \\ escape, separate multiple matches with new lines',
|
||
customizationSaveSuccess: 'Custom placeholders saved successfully',
|
||
customizationSaveFailed: 'Failed to save custom placeholders!',
|
||
|
||
transferExcludeWords: 'File Organization Block Words',
|
||
excludeWordsDesc: 'Files or directories containing block words will not be organized.',
|
||
excludeWordsPlaceholder: 'Enter one block word per line',
|
||
excludeWordsHint: 'Support regular expressions, special characters need \\ escape, one line for each block word',
|
||
excludeWordsSaveSuccess: 'File organization block words saved successfully',
|
||
excludeWordsSaveFailed: 'Failed to save file organization block words!',
|
||
|
||
episodeFormatRule: 'Manual Reorganize Episode Format Rules',
|
||
episodeFormatRuleDesc: 'Extract episode number from filename via regex.',
|
||
episodeFormatRuleName: 'Rule Name',
|
||
episodeFormatRuleNameHint: 'Enter the rule name',
|
||
episodeFormatRulePattern: 'Regular Expression',
|
||
episodeFormatRulePatternHint: 'Must contain (?<ep>...) named group',
|
||
episodeFormatRuleMinSize: 'Min Size (MB)',
|
||
episodeFormatRuleMinSizeHint: 'Files smaller than this will be ignored',
|
||
episodeFormatRuleGuideTitle: 'Tips',
|
||
episodeFormatRuleGuideContent:
|
||
'Rules are matched from top to bottom, and the first matched rule will be used.\n' +
|
||
'Write matching rules based on the actual filename structure:\n' +
|
||
'Match fixed text directly, and mark the episode number with the named group (?<ep>...);\n' +
|
||
'For other variable but position-sensitive parts, use named groups like (?<a>...) and (?<b>...).\n' +
|
||
'Escape special characters such as [](). when they should be matched literally;\n' +
|
||
'it is recommended to use ^ and $ to constrain the full filename, especially $, to avoid false positives from partial matches.',
|
||
episodeFormatRuleAdd: 'Add Rule',
|
||
episodeFormatRuleEdit: 'Edit Rule',
|
||
episodeFormatRuleDeleteConfirm: 'Are you sure you want to delete this rule?',
|
||
episodeFormatRuleSaveSuccess: 'Episode format rules saved successfully',
|
||
episodeFormatRuleSaveFailed: 'Failed to save episode format rules!',
|
||
episodeFormatRuleEmptyError: 'Rule name and regular expression cannot be empty',
|
||
},
|
||
search: {
|
||
basicSettings: 'Basic Settings',
|
||
basicSettingsDesc: 'Set data sources, rule groups and other basic information',
|
||
recognizeSource: 'Recognition Data Source',
|
||
recognizeSourceDesc:
|
||
'Default is TMDB. Douban is usually more friendly for Chinese works, but some foreign works have incomplete information.',
|
||
themoviedb: 'TheMovieDb',
|
||
douban: 'Douban',
|
||
filterRuleGroup: 'Filter Rule Group',
|
||
filterRuleGroupDesc: 'Set filter rule groups used during download process.',
|
||
downloadLabel: 'Download Task Label',
|
||
downloadLabelDesc: 'Download labels in downloader, used for filtering queries.',
|
||
downloadLabelHint: 'Support multiple labels, separated by commas',
|
||
downloadSite: 'Search Sites',
|
||
downloadSiteDesc: 'Set site scope for specific category searches.',
|
||
movieSites: 'Movie Sites',
|
||
tvSites: 'TV Show Sites',
|
||
animeSites: 'Anime Sites',
|
||
saveSites: 'Save Sites',
|
||
saveSuccess: 'Search settings saved successfully',
|
||
saveFailed: 'Failed to save search settings!',
|
||
saveRuleFailed: 'Failed to save rules!',
|
||
movieCategory: 'Movies',
|
||
tvCategory: 'TV Shows',
|
||
animeCategory: 'Anime',
|
||
downloadUser: 'Remote Search Auto Download User List',
|
||
downloadUserHint:
|
||
'Whether to auto-download when searching with Telegram, WeChat Work, etc., comma separated, set to all for all users',
|
||
multipleNameSearch: 'Multiple Name Resource Search',
|
||
multipleNameSearchHint:
|
||
'Search site resources using multiple names (Chinese, English, etc.) and merge search results, will increase site access frequency',
|
||
downloadSubtitle: 'Download Site Subtitles',
|
||
downloadSubtitleHint: 'Check if site resources have separate subtitle files and download them automatically',
|
||
mediaSource: 'Media Search Data Source',
|
||
mediaSourceHint: 'Data sources and sorting used when searching for media information',
|
||
filterRuleGroupHint: 'Filter results by selected filter rule groups when searching for media information',
|
||
downloadUserPlaceholder: 'UserID1,UserID2',
|
||
downloadLabelPlaceholder: 'MOVIEPILOT',
|
||
},
|
||
directory: {
|
||
storage: 'Storage',
|
||
storageDesc: 'Set up local or cloud storage.',
|
||
directory: 'Directory',
|
||
mediaType: 'Media Type',
|
||
directoryDesc: 'Set up media file organization directory structure, matching in sequence.',
|
||
organizeAndScrap: 'Organization & Scraping',
|
||
organizeAndScrapDesc: 'Set rename format, scraping options, etc.',
|
||
scrapSource: 'Scraping Data Source',
|
||
scrapSourceHint: 'Metadata source for scraping',
|
||
mountedLocalDiskDeleteEmptyDirs: 'Delete Empty Directories on Mounted Drives',
|
||
mountedLocalDiskDeleteEmptyDirsHint:
|
||
'When disabled, move operations keep source directories on local network or FUSE mounts.',
|
||
movieRenameFormat: 'Movie Rename Format',
|
||
movieRenameFormatHint:
|
||
'Using Jinja2 syntax, format reference: https://jinja.palletsprojects.com/en/3.0.x/templates',
|
||
tvRenameFormat: 'TV Show Rename Format',
|
||
tvRenameFormatHint: 'Using Jinja2 syntax, format reference: https://jinja.palletsprojects.com/en/3.0.x/templates',
|
||
musicRenameFormat: 'Music Rename Format',
|
||
musicRenameFormatHint: 'Uses Jinja2 syntax with music fields such as artist, album, track, and disc',
|
||
saveSuccess: 'Storage settings saved successfully',
|
||
saveFailed: 'Failed to save storage settings!',
|
||
directorySaveSuccess: 'Directory settings saved successfully',
|
||
directorySaveFailed: 'Failed to save directory settings!',
|
||
organizeSaveSuccess: 'Organization options saved successfully',
|
||
organizeSaveFailed: 'Failed to save organization options!',
|
||
duplicateDirectoryName: 'Duplicate directory names exist! Cannot save, please modify!',
|
||
defaultDirName: 'Directory',
|
||
storageSaveSuccess: 'Storage settings saved successfully',
|
||
storageSaveFailed: 'Failed to save storage settings!',
|
||
},
|
||
category: {
|
||
title: 'Category Policy',
|
||
subtitle: 'Configure media auto-categorization rules by type, language, region, etc.',
|
||
movie: 'Movies',
|
||
tv: 'TV Shows',
|
||
name: 'Category Name (Directory)',
|
||
genre: 'Genre',
|
||
language: 'Language',
|
||
languagePlaceholder: 'e.g., en,fr,zh (comma separated)',
|
||
country: 'Country/Region',
|
||
countryPlaceholder: 'e.g., US,CN,JP',
|
||
year: 'Year',
|
||
yearPlaceholder: 'e.g., 2023, 2020-2024',
|
||
addMovie: 'Add Movie Category',
|
||
addTv: 'Add TV Category',
|
||
saveSuccess: 'Category policy saved successfully',
|
||
loadFailed: 'Failed to load category configuration',
|
||
saveFailed: 'Save failed: {message}',
|
||
},
|
||
rule: {
|
||
customRules: 'Custom Rules',
|
||
customRulesDesc: 'Custom priority rule items',
|
||
priorityRuleGroups: 'Priority Rule Groups',
|
||
priorityRuleGroupsDesc: 'Preset priority rule groups for use in search and subscription.',
|
||
downloadRules: 'Download Rules',
|
||
downloadRulesDesc: 'Choose the best option when multiple resources are matched.',
|
||
resourcePriority: 'Resource Priority',
|
||
sitePriority: 'Site Priority',
|
||
siteUpload: 'Site Upload',
|
||
resourceSeeder: 'Resource Seeders',
|
||
emptyIdError: 'A rule has an empty ID, cannot save. Please modify!',
|
||
emptyNameError: 'A rule has an empty name, cannot save. Please modify!',
|
||
duplicateIdError: 'Duplicate rule IDs exist! Cannot save, please modify!',
|
||
duplicateNameError: 'Duplicate rule names exist! Cannot save, please modify!',
|
||
customRuleSaveSuccess: 'Custom rules saved successfully',
|
||
customRuleSaveFailed: 'Failed to save custom rules!',
|
||
emptyGroupNameError: 'A rule group has an empty name! Cannot save, please modify!',
|
||
duplicateGroupNameError: 'Duplicate rule group names exist! Cannot save, please modify!',
|
||
ruleGroupSaveSuccess: 'Priority rule groups saved successfully',
|
||
ruleGroupSaveFailed: 'Failed to save priority rule groups!',
|
||
customRuleCopySuccess: 'Custom rules copied to clipboard!',
|
||
customRuleCopyFailed: 'Failed to copy custom rules: browser may not support or user blocked!',
|
||
customRuleCopyError: 'Failed to copy custom rules!',
|
||
ruleGroupCopySuccess: 'Priority rule groups copied to clipboard!',
|
||
ruleGroupCopyFailed: 'Failed to copy priority rule groups: browser may not support or user blocked!',
|
||
ruleGroupCopyError: 'Failed to copy priority rule groups!',
|
||
currentPriorityRules: 'Current Download Priority Rules',
|
||
currentPriorityRulesHint: 'Higher priority for items at the front, unselected items are not included in sorting',
|
||
importCustomRules: 'Import Custom Rules',
|
||
importRuleGroups: 'Import Priority Rule Groups',
|
||
importFailed: 'Failed to import rules! Cannot parse input data!',
|
||
importUnknownType: 'Failed to import rules! Unknown data type!',
|
||
duplicateValue: 'Duplicate values exist',
|
||
importNoId: 'Import failed! Found rules without IDs, may belong to priority rule groups!',
|
||
importHasId: 'Import failed! Found rules with IDs, may belong to custom rules!',
|
||
},
|
||
scheduler: {
|
||
title: 'Scheduled Jobs',
|
||
subtitle: 'Includes built-in system services and plugin services',
|
||
provider: 'Provider',
|
||
taskName: 'Task Name',
|
||
taskStatus: 'Task Status',
|
||
nextRunTime: 'Next Run Time',
|
||
execute: 'Execute',
|
||
noService: 'No background services',
|
||
running: 'Running',
|
||
stopped: 'Stopped',
|
||
waiting: 'Waiting',
|
||
executeSuccess: 'Scheduled job execution request submitted successfully!',
|
||
mobileWaitingAfter: 'In {time}',
|
||
mobileNoNextRun: 'No schedule',
|
||
},
|
||
subscribe: {
|
||
basicSettings: 'Basic Settings',
|
||
basicSettingsDesc: 'Set subscription mode, cycle and other basic settings',
|
||
subscribeSites: 'Subscribe Sites',
|
||
subscribeSitesDesc: 'Only selected sites will be used in subscriptions.',
|
||
mode: 'Subscription Mode',
|
||
modeHint: 'Auto: automatically crawl site homepage, Site RSS: subscribe via site RSS link',
|
||
rssInterval: 'Site RSS Interval',
|
||
rssIntervalHint: 'Set the site RSS running cycle, effective when subscription mode is `Site RSS`',
|
||
filterRuleGroup: 'Subscription Priority Rule Group',
|
||
filterRuleGroupHint: 'Filter subscriptions based on selected filter rule groups',
|
||
bestVersionRuleGroup: 'Version Upgrade Priority Rule Group',
|
||
bestVersionRuleGroupHint: 'Filter version upgrade subscriptions based on selected filter rule groups',
|
||
timedSearch: 'Subscription Scheduled Search',
|
||
timedSearchHint:
|
||
'Search all sites at specified intervals to supplement resources that may be missed by subscription',
|
||
searchInterval: 'Subscription Search Interval',
|
||
searchIntervalHint:
|
||
'Set the time interval for subscription search, only effective when subscription scheduled search is enabled',
|
||
checkLocalMedia: 'Check File System Resources',
|
||
checkLocalMediaHint:
|
||
'Scan the storage directory for existing resource files to avoid duplicate downloads; regardless of whether it is enabled, the media server will be checked',
|
||
modes: {
|
||
auto: 'Auto',
|
||
rss: 'Site RSS',
|
||
},
|
||
intervals: {
|
||
min5: '5 minutes',
|
||
min10: '10 minutes',
|
||
min20: '20 minutes',
|
||
min30: '30 minutes',
|
||
hour1: '1 hour',
|
||
hour12: '12 hours',
|
||
day1: '1 day',
|
||
day3: '3 days',
|
||
week1: '1 week',
|
||
},
|
||
saveSuccess: 'Subscription sites saved successfully',
|
||
saveFailed: 'Failed to save subscription sites!',
|
||
settingsSaveSuccess: 'Subscription basic settings saved successfully',
|
||
settingsSaveFailed: 'Failed to save subscription basic settings!',
|
||
},
|
||
cache: {
|
||
title: 'Cache Management',
|
||
subtitle: 'Manage system caches',
|
||
cacheType: 'Cache Type',
|
||
torrentCache: 'Resource Cache',
|
||
recognitionCache: 'Recognition Cache',
|
||
recognitionType: 'Type',
|
||
recognitionTypeOptions: {
|
||
all: 'All',
|
||
media: 'Movie/TV',
|
||
music: 'Music',
|
||
},
|
||
totalCount: 'Total Count',
|
||
siteCount: 'Site Count',
|
||
recognized: 'Recognized',
|
||
sharedRecognized: 'Shared Recognition',
|
||
recognizedOnly: 'Recognized Only',
|
||
unrecognizedOnly: 'Unrecognized Only',
|
||
allStatuses: 'All Statuses',
|
||
filterByTitle: 'Filter by Title',
|
||
filterBySite: 'Filter by Site',
|
||
filterRecognitionCache: 'Search cache key, title, or {source} ID',
|
||
filterAllRecognitionCache: 'Search cache key, title, artist, or recognition ID',
|
||
selectSite: 'Select Site',
|
||
loadingMore: 'Loading...',
|
||
refresh: 'Refresh Cache',
|
||
refreshList: 'Refresh List',
|
||
listRefreshSuccess: 'Cache list refreshed',
|
||
deleteSelected: 'Delete Selected',
|
||
clearAll: 'Clear All Cache',
|
||
refreshSuccess: 'Cache refresh completed',
|
||
refreshFailed: 'Failed to refresh cache',
|
||
clearSuccess: 'Cache clear completed',
|
||
clearFailed: 'Failed to clear cache',
|
||
deleteSuccess: 'Cache item deleted successfully',
|
||
deleteFailed: 'Failed to delete cache item',
|
||
deleteSelectedSuccess: 'Successfully deleted {count} cache items',
|
||
deleteSelectedFailed: 'Failed to delete cache items',
|
||
loadFailed: 'Failed to load cache data',
|
||
selectDeleteWarning: 'Please select cache items to delete',
|
||
reidentify: 'Re-identify',
|
||
reidentifySuccess: 'Re-identification completed',
|
||
reidentifyFailed: 'Re-identification failed',
|
||
poster: 'Poster',
|
||
cacheKey: 'Recognition Request',
|
||
tmdbId: 'TMDB ID',
|
||
musicbrainzId: 'MusicBrainz ID',
|
||
doubanId: 'Douban ID',
|
||
torrentTitle: 'Title',
|
||
site: 'Site',
|
||
size: 'Size',
|
||
publishTime: 'Publish Time',
|
||
recognitionResult: 'Recognition Result',
|
||
recognitionStatus: 'Status',
|
||
actions: 'Actions',
|
||
unrecognized: 'Unrecognized',
|
||
noData: 'No cache data',
|
||
noDataHint: 'Click "Refresh Cache" button to get the latest torrent cache',
|
||
noRecognitionCache: 'No {source} recognition cache',
|
||
noRecognitionCacheHint: 'Recognition records will appear here after media is identified',
|
||
reidentifyDialog: {
|
||
title: 'Re-identify',
|
||
torrentInfo: 'Torrent Info',
|
||
tmdbId: 'TMDB ID',
|
||
tmdbIdHint: 'Optional, manually specify TMDB ID for recognition',
|
||
doubanId: 'Douban ID',
|
||
doubanIdHint: 'Optional, manually specify Douban ID for recognition',
|
||
bangumiId: 'Bangumi ID',
|
||
anilistId: 'AniList ID',
|
||
mediaSource: 'Recognition source',
|
||
mediaSourceHint: 'Applies only to this re-identification and does not change the system default',
|
||
mediaId: 'Media ID',
|
||
mediaIdHint: 'Optional source-native media ID; leave blank to recognize by title',
|
||
autoHint: 'If no ID is specified, the torrent will be automatically re-identified',
|
||
cancel: 'Cancel',
|
||
confirm: 'Re-identify',
|
||
},
|
||
mediaType: {
|
||
movie: 'Movie',
|
||
tv: 'TV Show',
|
||
music: 'Music',
|
||
unknown: 'Unknown',
|
||
},
|
||
musicType: {
|
||
recording: 'Single',
|
||
album: 'Album',
|
||
artist: 'Artist',
|
||
},
|
||
clearConfirm: 'Are you sure you want to clear all cache?',
|
||
recognitionClearConfirm: 'Clear all {source} recognition cache?',
|
||
recognitionClearAllConfirm: 'Clear all recognition cache (movie/TV and music)?',
|
||
tmdbClearConfirm: 'Clear all TheMovieDb recognition cache?',
|
||
recognitionSource: {
|
||
themoviedb: 'TheMovieDb',
|
||
douban: 'Douban',
|
||
bangumi: 'Bangumi',
|
||
anilist: 'AniList',
|
||
musicbrainz: 'MusicBrainz',
|
||
theaudiodb: 'TheAudioDB',
|
||
doubanmusic: 'Douban Music',
|
||
},
|
||
},
|
||
},
|
||
dialog: {
|
||
progress: {
|
||
processing: 'Processing',
|
||
},
|
||
subscribeSeason: {
|
||
title: 'Subscribe - {title}',
|
||
selectMode: 'Subscription Type',
|
||
selectGroup: 'Select Episode Group',
|
||
defaultGroup: 'Default',
|
||
seasonCount: '{count} Seasons',
|
||
episodeCount: '{count} Episodes',
|
||
seasonNumber: 'Season {number}',
|
||
airDate: 'First aired on {date}',
|
||
voteAverage: '{score}',
|
||
status: {
|
||
exists: 'Exists',
|
||
partial: 'Partially Missing',
|
||
missing: 'Missing',
|
||
},
|
||
submit: 'Submit Subscription',
|
||
selectSeasons: 'Please select seasons to subscribe',
|
||
},
|
||
userAddEdit: {
|
||
add: 'Add User',
|
||
edit: 'Edit User',
|
||
username: 'Username',
|
||
usernameRequired: 'Username cannot be empty',
|
||
password: 'Password',
|
||
passwordMinLength: 'Password must be at least 6 characters',
|
||
confirmPassword: 'Confirm Password',
|
||
confirmPasswordRequired: 'Please confirm password',
|
||
passwordMismatch: 'Passwords do not match',
|
||
email: 'Email',
|
||
nickname: 'Nickname',
|
||
status: 'Status',
|
||
active: 'Active',
|
||
inactive: 'Inactive',
|
||
superUser: 'Super User',
|
||
otp: 'Enable Two-Factor Authentication',
|
||
avatar: 'Avatar',
|
||
uploadAvatar: 'Upload Avatar',
|
||
resetDefaultAvatar: 'Reset Default Avatar',
|
||
restoreCurrentAvatar: 'Restore Current Avatar',
|
||
notifications: 'Notifications',
|
||
wechat: 'WeChat Work UserID',
|
||
wechatClawBot: 'WeChat ClawBot UserID',
|
||
telegram: 'Telegram UserID',
|
||
slack: 'Slack UserID',
|
||
discord: 'Discord UserID',
|
||
vocechat: 'VoceChat UserID',
|
||
synologyChat: 'SynologyChat UserID',
|
||
webPush: 'WebPush',
|
||
creatingUser: 'Creating user [{name}], please wait',
|
||
updatingUser: 'Updating user [{name}], please wait',
|
||
usernameExists: 'Username already exists',
|
||
userCreated: 'User [{name}] created successfully',
|
||
userCreateFailed: 'Failed to create user: {message}',
|
||
userUpdateSuccess: 'User [{name}] updated successfully',
|
||
userUpdateFailed: 'Failed to update user: {message}',
|
||
userDeleteSuccess: 'User [{name}] deleted successfully',
|
||
userDeleteFailed: 'Failed to delete user: {message}',
|
||
invalidFile: 'The uploaded file does not meet the requirements, please choose a new avatar',
|
||
fileSizeLimit: 'File size must not exceed 800KB',
|
||
avatarUploadSuccess: 'New avatar uploaded successfully, will take effect after saving!',
|
||
resetAvatarSuccess: 'Reset to default avatar, will take effect after saving!',
|
||
restoreAvatarSuccess: 'Restored current avatar!',
|
||
deleteConfirm: 'Confirm delete user [{name}]?',
|
||
saveUserInfo: 'Save User Information',
|
||
cannotDeleteCurrentUser: 'Cannot delete current logged-in user',
|
||
deleteUser: 'Delete User',
|
||
permissions: {
|
||
title: 'Permission Settings',
|
||
presetNormal: 'Normal User',
|
||
presetAdmin: 'Administrator',
|
||
discovery: 'Discovery',
|
||
discoveryDesc: 'Access recommendation and exploration features',
|
||
search: 'Search',
|
||
searchDesc: 'Search site resources and add downloads',
|
||
subscribe: 'Subscribe',
|
||
subscribeDesc: 'Manage movie and TV show subscriptions',
|
||
manage: 'Manage',
|
||
manageDesc: 'Access download management and site management etc.',
|
||
categoryTitle: 'Permission Categories',
|
||
categoryHint: 'Enable a category first, then choose the concrete features available in it',
|
||
summary: '{categories} categories / {features} features enabled',
|
||
featureTitleSuffix: ' Features',
|
||
featureHint: 'Disabled features are hidden from navigation, app center, and direct route access',
|
||
disabledCategoryHint: 'This category is disabled, so its features are not accessible',
|
||
selectAll: 'Select All',
|
||
clear: 'Clear',
|
||
default: 'Default',
|
||
featureScope: 'Feature scope',
|
||
features: {
|
||
recommend: 'Recommendations',
|
||
explore: 'Explore',
|
||
resourceSearch: 'Resource Search',
|
||
movieSubscribe: 'Movie Subscriptions',
|
||
tvSubscribe: 'TV Subscriptions',
|
||
musicSubscribe: 'Music Subscriptions',
|
||
calendar: 'Subscription Calendar',
|
||
subscribeShare: 'Subscription Share',
|
||
workflow: 'Workflow',
|
||
downloading: 'Download Manager',
|
||
history: 'Media Organize',
|
||
fileManager: 'File Manager',
|
||
site: 'Site Manager',
|
||
},
|
||
featureDescriptions: {
|
||
recommend: 'Recommendation page and ranking content',
|
||
explore: 'Explore page, discovery sources, and media detail browsing',
|
||
resourceSearch: 'Site resource search and result page',
|
||
movieSubscribe: 'Movie subscription list and popular movies',
|
||
tvSubscribe: 'TV subscription list, popular shows, and share tab',
|
||
musicSubscribe: 'Music subscriptions and automatic resource search',
|
||
calendar: 'Subscription schedule and calendar view',
|
||
subscribeShare: 'Subscription share list access',
|
||
workflow: 'Workflow list and shared workflows',
|
||
downloading: 'Current download task management',
|
||
history: 'Organize history and import records',
|
||
fileManager: 'File browsing and file management',
|
||
site: 'Site list, status, and maintenance',
|
||
},
|
||
},
|
||
},
|
||
searchBar: {
|
||
search: 'Search',
|
||
searchPlaceholder: 'Search movies, TV shows and more...',
|
||
recentSearches: 'Recent Searches',
|
||
noRecentSearches: 'No recent search history',
|
||
functions: 'Functions',
|
||
noFunctionsFound: 'No matching functions',
|
||
plugins: 'Plugins',
|
||
noPluginsFound: 'No matching plugins',
|
||
subscriptions: 'Subscriptions',
|
||
noSubscriptionsFound: 'No matching subscriptions',
|
||
searchSites: 'Search Sites',
|
||
selectSites: 'Select Sites',
|
||
collections: 'Collections',
|
||
collectionSearch: 'Related series works',
|
||
actorSearch: 'Related actors, directors, etc.',
|
||
historySearch: 'Related history records',
|
||
subscribeShareSearch: 'Related subscription shares',
|
||
siteResources: 'Site Resources',
|
||
searchInSites: 'Search for torrent resources in sites',
|
||
searchMusicInSites: 'Search for music resources in sites',
|
||
searchSubtitlesInSites: 'Search for subtitle resources in sites',
|
||
relatedResources: 'Related Resources',
|
||
relatedMusicResources: 'Related Music Resources',
|
||
relatedSubtitles: 'Related Subtitles',
|
||
searchTip: 'You can search for movies, TV shows, actors, resources, etc.',
|
||
emptySearchHint: 'Enter keywords to search',
|
||
escClose: 'Close',
|
||
openSearch: 'Open search',
|
||
mediaSourceFor: '{type} search source',
|
||
searchWithSource: 'Search with {source}',
|
||
},
|
||
searchSite: {
|
||
selectSites: 'Select Sites',
|
||
siteSearch: 'Site Search',
|
||
searchAllSites: 'Selected {selected}/{total} sites',
|
||
selectAll: 'Select All',
|
||
deselectAll: 'Deselect All',
|
||
confirm: 'Confirm',
|
||
cancel: 'Cancel',
|
||
},
|
||
importCode: {
|
||
import: 'Import',
|
||
title: 'Import Code',
|
||
},
|
||
addDownload: {
|
||
confirmDownload: 'Confirm Download',
|
||
downloader: 'Downloader (Default)',
|
||
saveDirectory: 'Save Directory (Auto)',
|
||
defaultPlaceholder: 'Leave empty for default',
|
||
autoPlaceholder: 'Leave empty for auto-match',
|
||
downloading: 'Downloading...',
|
||
startDownload: 'Start Download',
|
||
downloadSuccess: '{site} {title} downloaded successfully!',
|
||
downloadFailed: '{site} {title} download failed: {message}!',
|
||
unrecognizedTitle: 'Media Information Not Recognized',
|
||
unrecognizedContent: 'Media information for this resource could not be recognized. Download it anyway?',
|
||
continueDownload: 'Continue Download',
|
||
showAdvancedOptions: 'Show Advanced Options',
|
||
hideAdvancedOptions: 'Hide Advanced Options',
|
||
},
|
||
addSubtitleDownload: {
|
||
confirmDownload: 'Confirm Subtitle Download',
|
||
saveDirectory: 'Save Directory (Auto)',
|
||
autoPlaceholder: 'Leave empty for auto-match',
|
||
downloading: 'Downloading...',
|
||
startDownload: 'Download Subtitle',
|
||
downloaded: 'Downloaded',
|
||
downloadSuccess: '{site} {title} subtitle downloaded successfully!',
|
||
downloadFailed: '{site} {title} subtitle download failed: {message}!',
|
||
},
|
||
subscribeShare: {
|
||
shareSubscription: 'Share Subscription',
|
||
season: 'Season {number}',
|
||
title: 'Title',
|
||
description: 'Description',
|
||
descriptionHint:
|
||
'Add a description about this subscription. Search terms, recognition words, etc. will be included in the share by default',
|
||
shareUser: 'Share User',
|
||
shareUserHint: "Sharer's nickname",
|
||
confirmShare: 'Confirm Share',
|
||
shareSuccess: '{name} shared successfully!',
|
||
shareFailed: '{name} share failed: {message}!',
|
||
},
|
||
workflowShare: {
|
||
shareWorkflow: 'Share Workflow',
|
||
title: 'Title',
|
||
description: 'Description',
|
||
descriptionHint:
|
||
'Add a description about this workflow. Actions and flows will be included in the share by default',
|
||
shareUser: 'Share User',
|
||
shareUserHint: "Sharer's nickname",
|
||
confirmShare: 'Confirm Share',
|
||
shareSuccess: '{name} shared successfully!',
|
||
shareFailed: '{name} share failed: {message}!',
|
||
securityWarning: 'Security Warning',
|
||
securityWarningMessage:
|
||
'Before sharing, please ensure the workflow does not contain sensitive information such as PassKey in RSS links to avoid information leakage.',
|
||
},
|
||
u115Auth: {
|
||
loginTitle: '115 Cloud Authorization',
|
||
openAuthWindow: 'Open Authorization Window',
|
||
authorizing: 'Please complete authorization in the new window...',
|
||
authSuccess: 'Authorization successful!',
|
||
authFailed: 'Authorization failed or expired',
|
||
authCanceled: 'Authorization canceled, please try again',
|
||
urlEmpty: 'Authorization URL is empty',
|
||
urlFetchFailed: 'Failed to fetch authorization URL',
|
||
popupBlocked: 'Unable to open authorization window, please check browser popup settings',
|
||
complete: 'Complete',
|
||
reset: 'Reset',
|
||
},
|
||
aliyunAuth: {
|
||
loginTitle: 'Aliyun Drive Login',
|
||
scanQrCode: 'Please scan with Aliyun Drive App',
|
||
scanned: 'Scanned',
|
||
complete: 'Complete',
|
||
reset: 'Reset',
|
||
},
|
||
rcloneConfig: {
|
||
title: 'RClone Configuration',
|
||
filePath: 'rclone config file path',
|
||
fileContent: 'rclone config file content',
|
||
defaultContent:
|
||
'# Please fill in your rclone config file content here \n# Please refer to https://rclone.org/docs/ \n# Storage node name must be: MP',
|
||
complete: 'Complete',
|
||
reset: 'Reset',
|
||
},
|
||
alistConfig: {
|
||
title: 'OpenList Configuration',
|
||
serverUrl: 'OpenList server address',
|
||
username: 'Username',
|
||
password: 'Password',
|
||
tokenUrl: 'Token acquisition address',
|
||
loginType: 'Login method',
|
||
loginTypeOptions: {
|
||
guest: 'Guest',
|
||
username: 'Username & Password',
|
||
token: 'Token',
|
||
},
|
||
complete: 'Complete',
|
||
reset: 'Reset',
|
||
},
|
||
alistgoConfig: {
|
||
title: 'AList Configuration',
|
||
serverUrl: 'AList server address',
|
||
},
|
||
smbConfig: {
|
||
title: 'SMB Network Share Configuration',
|
||
host: 'SMB Server Address',
|
||
hostHint: 'IP address or hostname of the SMB server',
|
||
share: 'Share Name',
|
||
shareHint: 'Name of the shared folder to connect to',
|
||
username: 'Username',
|
||
usernameHint: 'SMB login username',
|
||
password: 'Password',
|
||
passwordHint: 'SMB login password',
|
||
domain: 'Domain',
|
||
domainHint: 'SMB domain name, such as WORKGROUP or domain controller name',
|
||
complete: 'Complete',
|
||
reset: 'Reset',
|
||
},
|
||
workflowAddEdit: {
|
||
addTitle: 'Add Workflow',
|
||
editTitle: 'Edit Workflow',
|
||
name: 'Name',
|
||
namePlaceholder: 'Workflow name',
|
||
desc: 'Description',
|
||
descPlaceholder: 'Workflow description',
|
||
maxWorkers: 'Max Parallel Actions',
|
||
enabled: 'Enabled',
|
||
triggerType: 'Trigger Type',
|
||
triggerTypeTimer: 'Timer Trigger',
|
||
triggerTypeEvent: 'Event Trigger',
|
||
triggerTypeManual: 'Manual Trigger',
|
||
schedule: 'Schedule',
|
||
cronExpr: 'Cron Expression',
|
||
cronExprDesc: 'Cron expression for workflow scheduling',
|
||
eventType: 'Event Type',
|
||
eventTypePlaceholder: 'Please select event type',
|
||
nameRequired: 'Please fill in complete information!',
|
||
triggerRequired: 'Please select trigger type!',
|
||
timerRequired: 'Please fill in timer expression!',
|
||
eventTypeRequired: 'Please select event type!',
|
||
addSuccess: 'Task created successfully, please edit the workflow!',
|
||
addFailed: 'Failed to create task: {message}',
|
||
editSuccess: 'Task modified successfully!',
|
||
editFailed: 'Failed to modify task: {message}',
|
||
cancel: 'Cancel',
|
||
confirm: 'Confirm',
|
||
},
|
||
workflowActions: {
|
||
title: 'Edit Workflow',
|
||
noActionsMessage: 'Workflow has no actions, please add actions',
|
||
addAction: 'Add Action',
|
||
editAction: 'Edit Action',
|
||
deleteAction: 'Delete Action',
|
||
moveUp: 'Move Up',
|
||
moveDown: 'Move Down',
|
||
nameLabel: 'Action Name',
|
||
nameRequired: 'Action name cannot be empty',
|
||
typeLabel: 'Action Type',
|
||
typeRequired: 'Action type cannot be empty',
|
||
paramsLabel: 'Action Parameters',
|
||
outputLabel: 'Action Output',
|
||
saveAction: 'Save Action',
|
||
cancelAction: 'Cancel',
|
||
confirmDeleteTitle: 'Confirm Delete Action',
|
||
confirmDeleteMessage: 'Are you sure you want to delete this action? This operation cannot be undone.',
|
||
yesDelete: 'Yes, Delete',
|
||
noCancel: 'Cancel',
|
||
invalidConnection: 'Invalid connection: cannot connect to self or ports of the same type!',
|
||
componentNotFound: 'Component {component} not found',
|
||
componentAdded: 'Component added to canvas',
|
||
saveSuccess: 'Task workflow saved successfully!',
|
||
saveFailed: 'Failed to save task workflow: {message}',
|
||
importTitle: 'Import Task Workflow',
|
||
importSuccess: 'Import successful!',
|
||
importFailed: 'Import failed!',
|
||
codeCopied: 'Task workflow code copied to clipboard!',
|
||
edgeSettingsTitle: 'Flow Condition',
|
||
edgeConditionLabel: 'Condition',
|
||
conditionAlways: 'Always continue',
|
||
conditionHasOutput: 'Has {field} output',
|
||
conditionNoOutput: 'No {field} output',
|
||
conditionHasValue: '{field} has value',
|
||
conditionCustom: 'Custom condition (preserved)',
|
||
edgeNoConditionFields: 'The previous node has no output available for conditions',
|
||
edgeConditionalLabel: 'Condition',
|
||
edgeSave: 'Save',
|
||
edgeCancel: 'Cancel',
|
||
edgeSaveSuccess: 'Flow condition saved',
|
||
},
|
||
siteCookieUpdate: {
|
||
title: 'Update Site Cookie & UA',
|
||
processing: 'Please wait...',
|
||
updating: 'Updating {site} Cookie & UA...',
|
||
success: '{site} Cookie & UA updated successfully!',
|
||
failed: '{site} update failed: {message}',
|
||
requestFailed: 'Request failed, please try again later',
|
||
updateButton: 'Start Update',
|
||
},
|
||
siteAddEdit: {
|
||
addTitle: 'Add Site',
|
||
editTitle: 'Edit Site',
|
||
nameLabel: 'Site Name',
|
||
urlLabel: 'Site URL',
|
||
iconLabel: 'Site Icon',
|
||
uploadIcon: 'Upload Icon',
|
||
cookie: 'Cookie',
|
||
rssUrl: 'RSS Link',
|
||
enableLabel: 'Enable',
|
||
pubEnableLabel: 'Public Resources',
|
||
priorityLabel: 'Priority',
|
||
signInLabel: 'Sign In',
|
||
proxies: 'Proxies',
|
||
userInfo: 'User Info',
|
||
cancel: 'Cancel',
|
||
confirm: 'Save',
|
||
},
|
||
pluginConfig: {
|
||
title: 'Plugin Configuration',
|
||
save: 'Save',
|
||
close: 'Close',
|
||
viewData: 'View Data',
|
||
saving: 'Saving {name} configuration...',
|
||
saveSuccess: 'Plugin {name} configuration saved',
|
||
saveFailed: 'Failed to save plugin {name} configuration: {message}',
|
||
},
|
||
pluginData: {
|
||
title: 'Plugin Data',
|
||
save: 'Save',
|
||
close: 'Close',
|
||
},
|
||
pluginMarketSetting: {
|
||
title: 'Plugin Market Settings',
|
||
repoUrl: 'Plugin Repository URL',
|
||
repoPlaceholder: 'Format: https://github.com/jxxghp/MoviePilot-Plugins/,https://github.com/xxxx/xxxxxx/',
|
||
repoHint: 'Separate multiple URLs with new lines or commas',
|
||
urlPlaceholder: 'Enter plugin repository URL',
|
||
textPlaceholder: 'https://github.com/jxxghp/MoviePilot-Plugins/\nhttps://github.com/xxxx/xxxxxx/',
|
||
repoCountHint: '{count} plugin repository URLs maintained',
|
||
listMode: 'List',
|
||
textMode: 'Text',
|
||
textHint: 'Paste repository URLs one per line or separated by commas.',
|
||
addRepo: 'Add repository',
|
||
noRepos: 'No plugin repository URLs',
|
||
invalidUrl: 'Please enter a valid URL',
|
||
duplicateUrl: 'This URL already exists',
|
||
invalidText: 'There are {count} invalid URLs in the text. Fix them before saving.',
|
||
invalidTextIgnored: '{count} invalid URLs ignored',
|
||
duplicateTextIgnored: 'Duplicate URLs will be removed automatically when saving.',
|
||
syncSources: 'Sync Plugin Sources',
|
||
syncSuccess: 'Plugin sources synced. {added} added, {total} total.',
|
||
syncFailed: 'Failed to sync plugin sources: {message}!',
|
||
close: 'Close',
|
||
save: 'Save',
|
||
saveSuccess: 'Plugin repository saved successfully',
|
||
saveFailed: 'Failed to save plugin repository: {message}!',
|
||
},
|
||
userAuth: {
|
||
title: 'User Authentication',
|
||
codeLabel: 'Authentication Code',
|
||
codePlaceholder: 'Please enter authentication code',
|
||
authBtn: 'Start Authentication',
|
||
closeBtn: 'Close',
|
||
selectSite: 'Select Authentication Site',
|
||
selectSiteRequired: 'Please select authentication site!',
|
||
siteConfigNotExist: 'Site configuration does not exist!',
|
||
fieldRequired: 'Please enter {name}!',
|
||
authSuccess: 'User authentication successful, please log in again!',
|
||
authFailed: 'Authentication failed: {message}',
|
||
},
|
||
transferQueue: {
|
||
title: 'Organization Queue',
|
||
queueSummary: '{media} media · {tasks} files',
|
||
mediaList: 'Media Queue',
|
||
mediaProgressCount: '{completed} / {total} files',
|
||
overallCount: '{completed} / {total} files',
|
||
mediaFileSummary: '{count} files · {size} total',
|
||
fileName: 'File Name',
|
||
operation: 'Action',
|
||
cancelTask: 'Cancel Task',
|
||
name: 'Name',
|
||
type: 'Type',
|
||
state: 'Status',
|
||
progress: 'Progress',
|
||
startTime: 'Start Time',
|
||
speedTitle: 'Speed',
|
||
pathTitle: 'Path',
|
||
sizeTitle: 'Size',
|
||
waitingState: 'Waiting',
|
||
runningState: 'Organizing',
|
||
finishedState: 'Completed',
|
||
failedState: 'Failed',
|
||
cancelledState: 'Cancelled',
|
||
noTasks: 'No tasks being organized',
|
||
noTasksHint: 'Task progress and status will appear here once organization starts.',
|
||
processing: 'Please wait ...',
|
||
stopAll: 'Stop All',
|
||
startAll: 'Start All',
|
||
refresh: 'Refresh',
|
||
close: 'Close',
|
||
processingFile: 'Processing',
|
||
overallProgress: 'Overall Progress',
|
||
currentFileProgress: 'Current File Progress',
|
||
processingStatus: 'Processing',
|
||
},
|
||
reorganize: {
|
||
title: 'Organize',
|
||
sourceTitle: 'Source File',
|
||
targetTitle: 'Target File',
|
||
processingTitle: 'Processing',
|
||
confirmTitle: 'Confirm',
|
||
selectFile: 'Select File',
|
||
selectTarget: 'Select Target',
|
||
selectMediaType: 'Select Media Type',
|
||
movie: 'Movie',
|
||
tv: 'TV Show',
|
||
selectTmdbId: 'Select TMDB ID',
|
||
selectMediaInfo: 'Select Media Info',
|
||
selectTargetPath: 'Select Target Path',
|
||
selectTargetDir: 'Select Target Directory',
|
||
selectFileName: 'Select Filename',
|
||
confirmMoving: 'Please confirm move!',
|
||
sourceLabel: 'Source file:',
|
||
targetLabel: 'Target directory:',
|
||
filenameLabel: 'Filename:',
|
||
close: 'Close',
|
||
next: 'Next',
|
||
previous: 'Previous',
|
||
confirm: 'Confirm',
|
||
manualTitle: 'Manual Organization',
|
||
multipleItemsTitle: '{count} Items',
|
||
singleItemTitle: '{path}',
|
||
targetStorage: 'Target Storage',
|
||
targetStorageHint: 'Organization target storage. Choose Auto to let the backend match it.',
|
||
transferType: 'Organization Method',
|
||
transferTypeHint: 'File operation method. Choose Auto to use the backend match or default rule.',
|
||
targetPath: 'Target Path',
|
||
targetPathHint: 'Organization target path. Choose Auto to match by source path.',
|
||
targetPathPlaceholder: 'Choose Auto or enter a path',
|
||
mediaType: 'Type',
|
||
mediaTypeHint: 'File media type',
|
||
musicEntity: 'Music Entity',
|
||
mediaSource: 'Data Source',
|
||
mediaSourceHint: 'Uses the backend recognition setting by default; switch it for this organization and scrape',
|
||
tmdbId: 'TheMovieDb ID',
|
||
doubanId: 'Douban ID',
|
||
bangumiId: 'Bangumi ID',
|
||
anilistId: 'AniList ID',
|
||
mediaId: 'Media ID',
|
||
mediaIdHint: 'Query media ID by name, leave empty for auto recognition',
|
||
mediaIdPlaceholder: 'Leave empty for auto recognition',
|
||
mediaIdInvalid: 'Invalid media ID format',
|
||
mediaSearchInput: 'Search Media',
|
||
mediaSearchPlaceholder: 'Enter a media title',
|
||
episodeGroup: 'Episode Group',
|
||
episodeGroupHint:
|
||
'After entering a TMDB ID, episode groups are queried automatically; group IDs can still be entered manually',
|
||
episodeGroupPlaceholder: 'Enter TMDB ID first',
|
||
defaultEpisodeGroup: 'No episode group',
|
||
defaultEpisodeGroupHint: 'Use TMDB default season and episode order',
|
||
seasonCount: '{count} seasons',
|
||
episodeCount: '{count} episodes',
|
||
season: 'Season',
|
||
seasonHint: 'Which season',
|
||
episodeDetail: 'Episode',
|
||
episodeDetailHint: 'Episode number or range, e.g. 1 or 1,2',
|
||
episodeDetailPlaceholder: 'Start episode,End episode',
|
||
episodeFormat: 'Episode Positioning',
|
||
episodeFormatHint: 'Use {ep} to position episode number part in filename to assist recognition',
|
||
episodeFormatPlaceholder: 'Use {ep} to position episode',
|
||
episodeFormatRecommendAction: 'Generate',
|
||
episodeFormatRecommendLoading: 'Generating...',
|
||
episodeFormatRecommendSelectFile: 'Please select a single file, a single directory, or multiple files first',
|
||
episodeFormatRecommendInvalidSelection: 'Current selection cannot be used for template generation',
|
||
episodeFormatRecommendNeedWords:
|
||
'Manual episode positioning rules are empty, please fill them in on the words page first',
|
||
episodeFormatRecommendSuccess: 'Episode format template generated',
|
||
episodeFormatRecommendOverwriteSuccess: 'Current episode format has been overwritten by the generated result',
|
||
episodeFormatRecommendFailed: 'Failed to generate episode format, please try again later',
|
||
episodeFormatRecommendRule: 'Matched Rule: {rule}',
|
||
episodeFormatRecommendSample: 'Sample File: {file}',
|
||
episodeFormatRuleDetails: 'Manual Episode Positioning Rule',
|
||
episodeFormatFinal: 'Final Episode Positioning: {format}',
|
||
episodeFormatManualInput: 'Manual Episode Positioning Input',
|
||
episodeFormatRulePattern: 'Rule Regex: {pattern}',
|
||
episodeOffset: 'Episode Offset',
|
||
episodeOffsetHint: 'Episode offset calculation, e.g. -10 or EP*2',
|
||
episodeOffsetPlaceholder: 'e.g. -10',
|
||
episodePart: 'Specify Part',
|
||
episodePartHint: 'Specify part, e.g. part1',
|
||
episodePartPlaceholder: 'e.g. part1',
|
||
minFileSize: 'Min File Size (MB)',
|
||
minFileSizeHint: 'Only organize files larger than minimum file size',
|
||
typeFolderOption: 'Classify by Type',
|
||
typeFolderHint: 'Add subdirectory by media type in target path during organization',
|
||
categoryFolderOption: 'Classify by Category',
|
||
categoryFolderHint: 'Add subdirectory by media category in target path during organization',
|
||
scrapeOption: 'Scrape Metadata',
|
||
scrapeHint: 'Automatically scrape metadata after organization',
|
||
fromHistoryOption: 'Reuse Historical Recognition Info',
|
||
fromHistoryHint: 'Use media info already recognized in historical organization records',
|
||
previewTitle: 'Preview Result',
|
||
previewSubtitle: 'Click "Preview" to inspect the expected organization result without changing files.',
|
||
previewResult: 'Preview',
|
||
previewLoading: 'Generating preview result...',
|
||
previewRequestFailed: 'Preview request failed',
|
||
transferRequestFailed: 'Organization request failed',
|
||
previewTotal: 'Total {count}',
|
||
previewSuccess: 'Success {count}',
|
||
previewFailed: 'Failed {count}',
|
||
previewMediaInfo: 'Media',
|
||
previewMediaName: 'Name',
|
||
previewMediaType: 'Type',
|
||
previewSeasonInfo: 'Season',
|
||
previewSeasonLabel: 'Season',
|
||
previewEpisodeCount: 'Episodes',
|
||
customWordsApplied: 'Recognition Word Details',
|
||
customWordsSameRules: '{count} files applied the same recognition words',
|
||
previewAfterColumn: 'After',
|
||
previewBeforeColumn: 'Before',
|
||
previewFileNameColumn: 'Filename',
|
||
previewEmptyTitle: 'No preview yet',
|
||
previewEmptyDescription: 'Click "Preview" to inspect the organization result here.',
|
||
noPreviewData: 'No preview data',
|
||
noFailedPreviewData: 'No failed items',
|
||
copySuccess: 'Path copied',
|
||
copyFailed: 'Copy failed',
|
||
addToQueue: 'Add to Organization Queue',
|
||
reorganizeNow: 'Organize Now',
|
||
reorganizeAgain: 'Reorganize',
|
||
historyFound:
|
||
'{count} successful organization record(s) found. Reorganizing removes the old target and history; move mode keeps the current source file.',
|
||
auto: 'Auto',
|
||
processing: 'Processing ...',
|
||
successMessage: 'File {name} has been added to the organization queue!',
|
||
},
|
||
subscribeMode: {
|
||
title: 'Choose Subscription Type',
|
||
normal: 'Normal',
|
||
bestVersion: 'Version Upgrade',
|
||
bestVersionEpisode: 'Episode',
|
||
bestVersionFull: 'Full',
|
||
},
|
||
subscribeEdit: {
|
||
titleDefault: 'Default Subscription Rules',
|
||
titleEdit: 'Edit Subscription',
|
||
seasonFormat: 'Season {number}',
|
||
tabs: {
|
||
basic: 'Basic',
|
||
advance: 'Advanced',
|
||
},
|
||
searchKeyword: 'Search Keywords',
|
||
searchKeywordHint: 'Specify keywords used when searching sites',
|
||
totalEpisode: 'Total Episodes',
|
||
totalEpisodeHint: 'Total number of episodes',
|
||
startEpisode: 'Start Episode',
|
||
startEpisodeHint: 'Starting episode number to subscribe',
|
||
quality: 'Quality',
|
||
qualityHint: 'Subscription resource quality',
|
||
resolution: 'Resolution',
|
||
resolutionHint: 'Subscription resource resolution',
|
||
effect: 'Effects',
|
||
effectHint: 'Subscription resource effects',
|
||
audioQuality: 'Audio Quality',
|
||
audioQualityHint: 'Filter by Hi-Res, lossless, or lossy tier',
|
||
audioFormat: 'Audio Format',
|
||
audioFormatHint: 'Filter by FLAC, ALAC, DSD, MP3, and other formats',
|
||
minBitrate: 'Minimum Bitrate',
|
||
minBitrateHint: 'Resource titles must declare at least this bitrate',
|
||
minBitDepth: 'Minimum Bit Depth',
|
||
minBitDepthHint: 'Resource titles must declare at least this bit depth',
|
||
minSampleRate: 'Minimum Sample Rate',
|
||
minSampleRateHint: 'Resource titles must declare at least this sample rate',
|
||
subscribeSites: 'Subscription Sites',
|
||
subscribeSitesHint: 'Range of sites for subscription, use system settings if none selected',
|
||
downloader: 'Downloader',
|
||
downloaderHint: 'Specify downloader for this subscription',
|
||
savePath: 'Save Path',
|
||
savePathHint: 'Specify download save path for this subscription, leave empty to use default download directory',
|
||
bestVersion: 'Version Upgrade',
|
||
bestVersionHint: 'Perform version upgrade subscription based on upgrade priorities',
|
||
musicBestVersionHint: 'Keep downloading higher-scoring audio versions until top-tier Hi-Res is reached',
|
||
bestVersionFull: 'Full Season Upgrade',
|
||
bestVersionFullHint: 'Only download full-season packs and do not split packs by episode',
|
||
searchImdbid: 'Search Using ImdbID',
|
||
searchImdbidHint: 'Use ImdbID for precise resource searching',
|
||
showEditDialog: 'Edit More Rules When Subscribing',
|
||
showEditDialogHint: 'Show this edit subscription dialog when adding subscription',
|
||
include: 'Include (Keywords, Regex)',
|
||
includeHint: 'Include rules, supports regular expressions',
|
||
exclude: 'Exclude (Keywords, Regex)',
|
||
excludeHint: 'Exclude rules, supports regular expressions',
|
||
filterGroups: 'Priority Rule Groups',
|
||
filterGroupsHint: 'Filter subscriptions by selected filter rule groups',
|
||
episodeGroup: 'Specify Episode Group',
|
||
episodeGroupHint: 'Recognize and scrape by specific episode group',
|
||
season: 'Specify Season',
|
||
seasonHint: 'Specify any season for subscription',
|
||
mediaCategory: 'Custom Category',
|
||
mediaCategoryHint: 'Specify category name, leave empty for auto-recognition',
|
||
customWords: 'Custom Recognition Words',
|
||
customWordsHint: 'Recognition words only used for this subscription',
|
||
customWordsPlaceholder:
|
||
'Block word\nReplaced word => Replacement word\nPrefix <> Suffix >> Episode offset (EP)\nReplaced word => Replacement word && Prefix <> Suffix >> Episode offset (EP)\nReplacement word supports format: {[tmdbid/doubanid/bangumiid/anilistid=xxx;type=movie/tv;g=xxx;s=xxx;e=xxx]} to directly specify a media data source ID, where g is the episode group ID and s/e are season and episode numbers (all optional)',
|
||
cancelSubscribe: 'Cancel Subscription',
|
||
save: 'Save',
|
||
cancelSubscribeConfirm: 'Are you sure you want to cancel the subscription?',
|
||
updateSuccess: '{name} updated successfully!',
|
||
updateFailed: 'Failed to update {name}: {message}!',
|
||
defaultSaveSuccess: 'Default {type} subscription rules saved successfully.',
|
||
defaultSaveFailed: 'Failed to save default {type} subscription rules: {message}!',
|
||
},
|
||
subscribeFiles: {
|
||
title: 'Subscription Files',
|
||
noFilesMessage: 'No files',
|
||
close: 'Close',
|
||
downloadTab: 'Download Files',
|
||
libraryTab: 'Media Library Files',
|
||
episodeColumn: 'Episode',
|
||
torrentColumn: 'Torrent',
|
||
fileColumn: 'File',
|
||
itemsPerPage: 'Items per page',
|
||
pageText: '{0}-{1} of {2} items',
|
||
loadingText: 'Loading...',
|
||
noData: 'No data',
|
||
season: 'Season {number}',
|
||
movieEpisode: 'Movie',
|
||
totalEpisodes: 'Episodes',
|
||
downloadedCount: 'Downloaded',
|
||
libraryCount: 'In Library',
|
||
missingCount: 'Missing {count}',
|
||
episodeList: 'Episodes',
|
||
episodeTotal: '{count} episodes',
|
||
filePath: 'File path',
|
||
copyPath: 'Copy path',
|
||
copySuccess: 'Path copied',
|
||
copyFailed: 'Copy failed',
|
||
noPath: 'No path',
|
||
noOverview: 'No overview',
|
||
noTabFiles: 'No {tab}',
|
||
statusInLibrary: 'In Library',
|
||
statusDownloaded: 'Downloaded',
|
||
statusMissing: 'Pending',
|
||
subscribeRunning: 'Running',
|
||
subscribePending: 'Pending',
|
||
subscribePaused: 'Paused',
|
||
subscribeNew: 'New',
|
||
unknownTorrent: 'Unknown torrent',
|
||
downloader: 'Downloader',
|
||
},
|
||
subscribeHistory: {
|
||
title: '{type} Subscription History',
|
||
resubscribe: 'Resubscribe',
|
||
resubscribeMovie: 'Resubscribing {name}...',
|
||
resubscribeTv: 'Resubscribing {name} Season {season}...',
|
||
resubscribeMusic: 'Resubscribing {name}...',
|
||
season: 'Season {season}',
|
||
noData: 'No completed subscriptions',
|
||
noDataHint: 'Completed subscription history will be displayed here',
|
||
},
|
||
downloadHistory: {
|
||
title: 'Download History',
|
||
actions: 'Download history actions',
|
||
unknownTitle: 'Unknown Media',
|
||
noData: 'No download history',
|
||
noDataHint: 'Added download tasks will be displayed here',
|
||
loadFailed: 'Failed to load download history',
|
||
deleteFailed: 'Failed to delete download history',
|
||
},
|
||
siteUserData: {
|
||
title: 'Site User Data',
|
||
updateTime: 'Update Time',
|
||
username: 'Username',
|
||
uploadTitle: 'Upload',
|
||
uploadTotal: 'Total Upload',
|
||
downloadTitle: 'Download',
|
||
downloadTotal: 'Total Download',
|
||
seedingTitle: 'Seeding',
|
||
seedingCount: 'Total Seeding Count',
|
||
seedingSize: 'Total Seeding Size',
|
||
userLevel: 'User Level',
|
||
msgCount: 'Unread Messages',
|
||
inviteCount: 'Invites',
|
||
bonus: 'Bonus Points',
|
||
ratio: 'Ratio',
|
||
joinTime: 'Join Time',
|
||
trafficHistory: 'Traffic History',
|
||
seedingDistribution: 'Seeding Distribution',
|
||
volumeTitle: 'Volume',
|
||
countTitle: 'Count:',
|
||
noData: 'None',
|
||
refreshing: 'Refreshing site data...',
|
||
loadFailed: 'Failed to load site data',
|
||
refreshFailed: 'Failed to refresh site data',
|
||
close: 'Close',
|
||
},
|
||
siteResource: {
|
||
browseTitle: 'Browse - {name}',
|
||
searchKeyword: 'Search Keyword',
|
||
resourceCategory: 'Resource Category',
|
||
noCategory: 'This site has no resource categories configured',
|
||
search: 'Search',
|
||
itemsPerPage: 'Items Per Page',
|
||
noData: 'No Data',
|
||
loading: 'Loading...',
|
||
loadFailed: 'Failed to load resources. Please retry.',
|
||
titleColumn: 'Title',
|
||
timeColumn: 'Time',
|
||
sizeColumn: 'Size',
|
||
seedersColumn: 'Seeders',
|
||
peersColumn: 'Peers',
|
||
viewDetails: 'View Details',
|
||
downloadTorrent: 'Download Torrent',
|
||
pageText: '{0}-{1} of {2} items',
|
||
},
|
||
forkSubscribe: {
|
||
title: 'Copy Subscription',
|
||
selectSubscriber: 'Select Copy Target',
|
||
overwriteExisting: 'Overwrite Existing Subscription',
|
||
overwriteExistingHint: 'Whether to overwrite when target user already has this subscription',
|
||
confirm: 'Confirm',
|
||
cancel: 'Cancel',
|
||
},
|
||
},
|
||
file: {
|
||
newFolder: 'New Folder',
|
||
autoRecognizeName: 'Auto Recognize Name',
|
||
createFolder: 'Create Folder',
|
||
fileName: 'File Name',
|
||
fileSize: 'File Size',
|
||
fileType: 'File Type',
|
||
lastModified: 'Last Modified',
|
||
actions: 'Actions',
|
||
rename: 'Rename',
|
||
delete: 'Delete',
|
||
confirmFileDelete: 'Confirm Delete',
|
||
upload: 'Upload',
|
||
download: 'Download',
|
||
preview: 'Preview',
|
||
selectAll: 'Select All',
|
||
deselectAll: 'Deselect All',
|
||
moveUp: 'Go Back',
|
||
sortByName: 'Sort by Name',
|
||
sortByTime: 'Sort by Time',
|
||
currentName: 'Current Name',
|
||
newName: 'New Name',
|
||
includeSubfolders: 'Auto rename all media files in directory',
|
||
emptyFolder: 'Empty Folder',
|
||
noFilesInFolder: 'No files in this folder',
|
||
autoRecognize: 'Auto Recognize Name',
|
||
directoryTree: 'Directory Tree',
|
||
rootDirectory: 'Root Directory',
|
||
noDirectories: 'No directories available',
|
||
directory: 'Directory',
|
||
file: 'File',
|
||
size: 'Size',
|
||
modifyTime: 'Modify Time',
|
||
noFiles: 'No directories or files',
|
||
emptyDirectory: 'Empty directory',
|
||
confirmDelete: 'Are you sure you want to delete {type} {name}?',
|
||
confirmBatchDelete: 'Are you sure you want to delete {count} selected items?',
|
||
deleting: 'Deleting {name}...',
|
||
recognize: 'Recognize',
|
||
recognizing: 'Recognizing {path}...',
|
||
recognizeFailed: '{path} recognition failed!',
|
||
scrape: 'Scrape',
|
||
manualScrape: 'Manual Scrape',
|
||
scraping: 'Scraping {path}...',
|
||
scrapeCompleted: '{path} scraping completed!',
|
||
confirmScrape: 'Are you sure you want to scrape {path}?',
|
||
confirmBatchScrape: 'Are you sure you want to scrape {count} selected items?',
|
||
renaming: 'Renaming {name}...',
|
||
renamingAll: 'Renaming {path} and all files in the directory...',
|
||
close: 'Close',
|
||
loadingDirectoryStructure: 'Loading directory structure...',
|
||
reorganize: 'Reorganize',
|
||
filterPlaceholder: 'Filter (supports * ? wildcards)',
|
||
},
|
||
person: {
|
||
alias: 'Also Known As:',
|
||
credits: 'Credits',
|
||
biography: 'Biography',
|
||
birthday: 'Birthday',
|
||
placeOfBirth: 'Place of Birth',
|
||
},
|
||
error: {
|
||
title: 'Error!',
|
||
networkError: 'Unable to get media information, please check your network connection.',
|
||
serverError: 'Server error, please try again later.',
|
||
notFound: 'Requested resource not found.',
|
||
},
|
||
plugin: {
|
||
sort: {
|
||
popular: 'Popular',
|
||
rating: 'Rating',
|
||
name: 'Plugin Name',
|
||
author: 'Author',
|
||
repository: 'Plugin Repository',
|
||
latest: 'Latest Release',
|
||
},
|
||
installingPlugin: 'Installing plugin...',
|
||
installing: 'Installing {name} v{version} ...',
|
||
installSuccess: 'Plugin {name} installed successfully!',
|
||
installFailed: 'Plugin {name} installation failed: {message}',
|
||
filterPlugins: 'Filter Plugins',
|
||
name: 'Name',
|
||
hasNewVersion: 'Has New Version',
|
||
running: 'Running',
|
||
author: 'Author',
|
||
label: 'Label',
|
||
repository: 'Repository',
|
||
sortTitle: 'Sort',
|
||
filter: 'Filter: {name}',
|
||
noMatchingContent: 'No matching content found',
|
||
pleaseInstallFromMarket: 'Please install plugins from the plugin market',
|
||
allPluginsInstalled: 'All plugins are installed',
|
||
searchPlugins: 'Search Plugins',
|
||
searchPlaceholder: 'Search by plugin name or description',
|
||
uninstalling: 'Uninstalling {name} ...',
|
||
uninstallSuccess: 'Plugin {name} uninstalled successfully!',
|
||
uninstallFailed: 'Plugin {name} uninstallation failed: {message}',
|
||
updating: 'Updating {name} ...',
|
||
updateSuccess: 'Plugin {name} updated successfully!',
|
||
updateFailed: 'Plugin {name} update failed: {message}',
|
||
noPlugins: 'No plugins installed',
|
||
installed: 'Installed',
|
||
notInstalled: 'Not Installed',
|
||
hasUpdate: 'Update Available',
|
||
configuring: 'Configuring',
|
||
enable: 'Enable',
|
||
disable: 'Disable',
|
||
settings: 'Settings',
|
||
about: 'About',
|
||
projectHome: 'Project Home',
|
||
updateHistory: 'Update History',
|
||
versionHistory: 'Version History',
|
||
releaseVersionsLoadFailed: 'Failed to load Release versions',
|
||
latestVersion: 'Latest',
|
||
currentVersion: 'Current',
|
||
installReleaseVersion: 'Install',
|
||
confirmInstallOldRelease:
|
||
'Install {name} v{version}? This version has no MoviePilot compatibility metadata and may fail to load or run.',
|
||
local: 'Local',
|
||
systemVersion: 'System Version',
|
||
incompatibleSystemVersion: 'The current MoviePilot version does not meet this plugin requirement.',
|
||
installToLocal: 'Install to Local',
|
||
totalDownloads: 'Total {count} downloads',
|
||
rating: 'Plugin Rating',
|
||
ratingSummary: '{rating} from {count} ratings',
|
||
yourRating: 'Your Rating',
|
||
submitRating: 'Submit Rating',
|
||
ratingSuccess: 'Your rating for {name} was submitted',
|
||
ratingFailed: 'Failed to submit rating: {message}',
|
||
viewData: 'View Data',
|
||
update: 'Update',
|
||
reset: 'Reset',
|
||
uninstall: 'Uninstall',
|
||
viewLogs: 'View Logs',
|
||
authorHome: 'Author Home',
|
||
confirmUninstall: 'Are you sure you want to uninstall plugin {name}?',
|
||
confirmReset:
|
||
'This operation will restore plugin {name} to default settings and clear all related data. Are you sure you want to continue?',
|
||
resetSuccess: 'Plugin {name} data has been reset',
|
||
resetFailed: 'Plugin {name} reset failed: {message}',
|
||
updateHistoryTitle: '{name} Version History',
|
||
updateHistoryEmpty: 'No update history available yet',
|
||
updateHistoryLoadFailed: 'Failed to load update history. Please try again later.',
|
||
updateToLatest: 'Update to Latest Version',
|
||
updatingTo: 'Updating {name} to v{version} ...',
|
||
folderNameEmpty: 'Folder name cannot be empty',
|
||
folderExists: 'Folder already exists',
|
||
folderCreateSuccess: 'Folder created successfully',
|
||
folderRenameSuccess: 'Folder renamed successfully',
|
||
folderRenameFailed: 'Failed to rename folder',
|
||
folderDeleteSuccess: 'Folder deleted successfully',
|
||
folderDeleteFailed: 'Failed to delete folder',
|
||
removeFromFolderSuccess: 'Plugin removed from folder',
|
||
operationFailed: 'Operation failed',
|
||
saveFolderConfigFailed: 'Failed to save folder config',
|
||
newFolder: 'New Folder',
|
||
folderName: 'Folder Name',
|
||
cancel: 'Cancel',
|
||
create: 'Create',
|
||
clone: 'Clone',
|
||
cloneTitle: 'Create Plugin Clone',
|
||
cloneSubtitle: 'Create an independent clone instance for {name}',
|
||
cloneFeature: 'Plugin Clone Feature',
|
||
cloneDescription:
|
||
'Create an independent copy of the plugin with separate configuration and data, suitable for multi-account, testing environments, etc.',
|
||
suffix: 'Clone Suffix',
|
||
suffixPlaceholder: 'e.g.: Test, Backup, Site1',
|
||
suffixHint: 'Unique identifier to distinguish clones, only letters and numbers allowed',
|
||
suffixRequired: 'Clone suffix cannot be empty',
|
||
suffixFormatError: 'Only letters and numbers allowed',
|
||
suffixLengthError: 'Length cannot exceed 20 characters',
|
||
cloneName: 'Clone Name',
|
||
cloneNamePlaceholder: 'e.g.: Auto Backup Test Version',
|
||
cloneNameHint: 'Display name for the clone plugin (optional)',
|
||
cloneDefaultName: '{name} Clone',
|
||
cloneDescriptionLabel: 'Clone Description',
|
||
cloneDescriptionPlaceholder: 'Describe the purpose and features of this clone...',
|
||
cloneDescriptionHint: 'Detailed description of the clone plugin purpose (optional)',
|
||
cloneDefaultDescription: '{description} (Clone Version)',
|
||
cloneVersion: 'Version',
|
||
cloneVersionPlaceholder: 'e.g.: 1.0, 2.1.0',
|
||
cloneVersionHint: 'Custom version number for the clone plugin (optional)',
|
||
cloneIcon: 'Icon URL',
|
||
cloneIconPlaceholder: 'https://example.com/icon.png',
|
||
cloneIconHint: 'Custom icon for the clone plugin (optional)',
|
||
cloneNotice:
|
||
'Clone plugins are disabled by default after creation and need to be manually configured and enabled. The clone suffix cannot be modified once set.',
|
||
createClone: 'Create Clone',
|
||
cloning: 'Creating clone for {name}...',
|
||
cloneSuccess: 'Plugin clone {name} created successfully!',
|
||
cloneFailed: 'Plugin clone creation failed: {message}',
|
||
cloneFailedGeneral: 'Plugin clone creation failed',
|
||
logTitle: 'Plugin Logging',
|
||
quickAccess: 'Quick Access',
|
||
noPluginsWithPage: 'No plugins with detail pages available',
|
||
tapToOpen: 'Tap to Return',
|
||
recentlyUsed: 'Recently Used',
|
||
allPlugins: 'All Plugins',
|
||
noRecentPlugins: 'None',
|
||
},
|
||
profile: {
|
||
personalInfo: 'Personal Information',
|
||
uploadNewAvatar: 'Upload New Avatar',
|
||
avatarFormatError: 'The uploaded file does not meet requirements, please select a new avatar',
|
||
avatarSizeError: 'File size must not exceed 800KB',
|
||
avatarUploadSuccess: 'New avatar uploaded successfully, will take effect after saving!',
|
||
resetAvatarSuccess: 'Reset to default avatar, will take effect after saving!',
|
||
restoreAvatarSuccess: 'Restored current avatar!',
|
||
savingInProgress: 'Saving in progress, please wait...',
|
||
usernameRequired: 'Username cannot be empty',
|
||
passwordMismatch: 'The two passwords do not match',
|
||
usernameChangeSuccess: '[{oldName}] renamed to [{newName}], user information saved successfully!',
|
||
saveSuccess: 'User information saved successfully!',
|
||
saveFailedWithNameChange: '[{oldName}] renamed to [{newName}], information save failed: {message}!',
|
||
saveFailed: 'User information save failed: {message}!',
|
||
nickname: 'Nickname',
|
||
nicknamePlaceholder: 'Display nickname, takes precedence over username',
|
||
accountBinding: 'Account Binding',
|
||
wechatUser: 'WeChat Work User',
|
||
wechatClawBotUser: 'WeChat ClawBot User',
|
||
feishuUser: 'Feishu User',
|
||
telegramUser: 'Telegram User',
|
||
slackUser: 'Slack User',
|
||
discordUser: 'Discord User',
|
||
vocechatUser: 'VoceChat User',
|
||
synologychatUser: 'SynologyChat User',
|
||
doubanUser: 'Douban User',
|
||
setupAuthenticator: 'Set Up Two-Step Verification',
|
||
authenticatorManagement: 'Two-Step Verification',
|
||
authenticatorEnabled: 'Two-step verification is enabled',
|
||
clearAuthenticatorTip: 'Turn it off before setting up another authenticator.',
|
||
clearAuthenticator: 'Turn Off Two-Step Verification',
|
||
enableTwoFactor: 'Enable Two-Step Verification',
|
||
disableTwoFactor: 'Turn Off Two-Step Verification',
|
||
accountSecurity: 'Account Security',
|
||
otpSecondFactor: 'Two-step verification for password sign-in',
|
||
passkeyPasswordless: 'Sign in directly without a password',
|
||
enabled: 'Enabled',
|
||
keysCount: '{count} keys',
|
||
passkeyManagement: 'Passkey Management',
|
||
registerNewPasskey: 'Register New Passkey',
|
||
passkeyDescription: 'Passkeys allow you to sign in quickly and securely without a password.',
|
||
passkeyAppDescription:
|
||
'Passkeys are a simpler, more secure way to sign in, serving as an alternative to passwords. You can authenticate using passkey-supported apps like iCloud Keychain, Bitwarden, or hardware keys.',
|
||
passkeyName: 'Passkey Name',
|
||
passkeyNamePlaceholder: 'e.g.: iPhone, Windows Hello',
|
||
registerPasskey: 'Register Passkey',
|
||
createdAt: 'Created',
|
||
lastUsedAt: 'Last used',
|
||
noPasskeys: 'You haven’t registered any passkeys yet',
|
||
passkeyNameRequired: 'Please enter a passkey name',
|
||
passkeyRegisterSuccess: 'Passkey registered successfully',
|
||
passkeyRegisterFailed: 'Registration failed',
|
||
passkeyRegisterCancelled: 'Registration cancelled',
|
||
passkeyDeleteSuccess: 'Passkey deleted',
|
||
passkeyDeleteFailed: 'Delete failed',
|
||
deletePasskey: 'Delete Passkey',
|
||
passkeyDomainWarning:
|
||
'The availability of PassKeys is closely related to the {domain}. In a public network environment, please make sure to configure the correct access domain name in "Basic Settings". Domain changes or configuration errors will cause the PassKey to be unusable.',
|
||
accessDomain: 'access domain name',
|
||
otpGenerateFailed: 'Failed to load authenticator setup: {message}',
|
||
otpDisableSuccess: 'Two-step verification turned off',
|
||
otpDisableFailed: 'Failed to turn off two-step verification: {message}',
|
||
otpCodeRequired: 'Please enter the 6-digit verification code',
|
||
otpEnableSuccess: 'Two-step verification enabled',
|
||
otpEnableFailed: 'Failed to enable two-step verification: {message}',
|
||
confirmToDisableOtp: 'Verify your login password before turning off two-step verification.',
|
||
confirmToDeletePasskey: 'For security reasons, verifying your login password is required to delete a Passkey.',
|
||
authenticatorAppDescription:
|
||
'Use an authenticator app like Google Authenticator, Microsoft Authenticator, Authy, or 1Password to scan the QR code and generate a 6-digit code.',
|
||
secretKeyTip:
|
||
"If you're having trouble with the QR code, select manual entry in your app and enter the code above.",
|
||
enterVerificationCode: 'Enter the 6-digit code generated by your authenticator',
|
||
avatarFormatTip: 'JPG, PNG, GIF, WEBP formats allowed, maximum size 800KB.',
|
||
},
|
||
transferHistory: {
|
||
title: 'Transfer History',
|
||
searchPlaceholder: 'Search (supports * ? wildcards)',
|
||
titleColumn: 'Title',
|
||
pathColumn: 'Path',
|
||
modeColumn: 'Mode',
|
||
sizeColumn: 'Size',
|
||
dateColumn: 'Date',
|
||
statusColumn: 'Status',
|
||
actionsColumn: 'Actions',
|
||
seasonEpisode: 'Season/Episode',
|
||
transferQueue: 'Transfer Queue',
|
||
groupMode: 'Group Mode',
|
||
listMode: 'List Mode',
|
||
deleteConfirm: 'Confirm delete {title} {seasons}{episodes}?',
|
||
deleteConfirmBatch: 'Confirm delete {count} records?',
|
||
deleteFailed: 'Failed to delete: {message}',
|
||
deleteRequestFailed: 'Failed to delete: Request failed',
|
||
batchDeleteFailed: 'Failed to delete {failed} of {total} records',
|
||
deleting: 'Deleting {name}...',
|
||
deleteRecordOnly: 'Delete Record Only',
|
||
deleteSourceOnly: 'Delete Record and Source File',
|
||
deleteDestOnly: 'Delete Record and Media Library File',
|
||
deleteAll: 'Delete All',
|
||
transferMode: {
|
||
copy: 'Copy',
|
||
move: 'Move',
|
||
link: 'Hard Link',
|
||
softlink: 'Soft Link',
|
||
rclone_copy: 'Rclone Copy',
|
||
rclone_move: 'Rclone Move',
|
||
},
|
||
status: {
|
||
success: 'Success',
|
||
failed: 'Failed',
|
||
unknown: 'Unknown',
|
||
},
|
||
noData: 'No Data',
|
||
loading: 'Loading...',
|
||
pageSize: 'Items Per Page',
|
||
pageInfo: '{begin} - {end} / {total}',
|
||
selectedCount: 'Selected {count}/{total} items',
|
||
aiRedoDisabled: 'Please enable the AI assistant in system settings first',
|
||
aiRedoQueued: 'Assistant organize task submitted: {title}',
|
||
aiRedoFailed: 'Failed to submit assistant organize task',
|
||
actions: {
|
||
aiRedo: 'Assistant Organize',
|
||
aiRedoPending: 'Assistant Organizing...',
|
||
batchAiRedo: 'Assistant Batch Organize',
|
||
batchSelect: 'Batch Select',
|
||
exitBatchSelect: 'Exit Batch Select',
|
||
exitBatchMode: 'Exit Batch Mode',
|
||
selectAll: 'Select All',
|
||
deselectAll: 'Deselect All',
|
||
redo: 'Reorganize',
|
||
delete: 'Delete',
|
||
batchRedo: 'Batch Reorganize',
|
||
batchDelete: 'Batch Delete',
|
||
},
|
||
batchOperationTitle: 'Batch Operation',
|
||
progress: {
|
||
processing: 'Processing',
|
||
pleaseWait: 'Please wait...',
|
||
},
|
||
table: {
|
||
emptyTitle: 'Actions',
|
||
},
|
||
},
|
||
customRule: {
|
||
error: {
|
||
emptyIdName: 'Rule ID and rule name cannot be empty',
|
||
idOccupied: 'Current rule ID is occupied by built-in rule',
|
||
nameOccupied: 'Current rule name is occupied by built-in rule',
|
||
idExists: 'Rule ID [{id}] already exists',
|
||
nameExists: 'Rule name [{name}] already exists',
|
||
},
|
||
title: '{id} - Configuration',
|
||
field: {
|
||
ruleId: 'Rule ID',
|
||
ruleName: 'Rule Name',
|
||
include: 'Include',
|
||
exclude: 'Exclude',
|
||
sizeRange: 'Size (MB)',
|
||
seeders: 'Seeders',
|
||
publishTime: 'Publish Time (min)',
|
||
},
|
||
placeholder: {
|
||
ruleId: 'Required; no duplicate with other rule IDs',
|
||
ruleName: 'Required; no duplicate with other rule names',
|
||
include: 'Keywords/Regex',
|
||
exclude: 'Keywords/Regex',
|
||
sizeRange: '0/1-10',
|
||
seeders: '0/1-10',
|
||
publishTime: '0/1-10',
|
||
},
|
||
hint: {
|
||
ruleId: 'Combination of letters and numbers; no spaces',
|
||
ruleName: 'Use alias for easy identification',
|
||
include: 'Keywords or regex that must be included, separated by |',
|
||
exclude: 'Keywords or regex that must not be included, separated by |',
|
||
sizeRange: 'Minimum resource file size or range (MB)',
|
||
seeders: 'Minimum number of seeders or range',
|
||
publishTime: 'Minimum time since publication or range (min)',
|
||
},
|
||
action: {
|
||
confirm: 'Confirm',
|
||
},
|
||
},
|
||
downloader: {
|
||
title: 'Downloader',
|
||
name: 'Name',
|
||
type: 'Type',
|
||
enabled: 'Enabled',
|
||
customTypeHint: 'Custom downloader type, for plugin scenarios',
|
||
rtorrentHostHint: 'HTTP: http://ip:port/RPC2 or SCGI: scgi://ip:port',
|
||
default: 'Default',
|
||
host: 'Host',
|
||
apiKey: 'API Key',
|
||
username: 'Username',
|
||
password: 'Password',
|
||
qbittorrentApiKeyHint:
|
||
'For qBittorrent 5.2+, you can use the WebUI API Key directly. When set, API Key auth is preferred.',
|
||
category: 'Auto Category Management',
|
||
sequentail: 'Sequential Download',
|
||
force_resume: 'Force Resume',
|
||
first_last_piece: 'First/Last Piece Priority',
|
||
incomplete_files_ext: 'Incomplete File Suffix',
|
||
incomplete_files_extHint: 'Append .!qB while downloading and remove it after completion',
|
||
rename_partial_files: 'Incomplete File Suffix',
|
||
rename_partial_filesHint: 'Append .part while downloading and remove it after completion',
|
||
saveSuccess: 'Downloader settings saved successfully',
|
||
saveFailed: 'Failed to save downloader settings',
|
||
nameRequired: 'Name cannot be empty',
|
||
nameDuplicate: 'Name already exists',
|
||
defaultChanged: 'Default downloader exists, has been replaced',
|
||
hostRequired: 'Host cannot be empty',
|
||
usernameRequired: 'Username cannot be empty',
|
||
passwordRequired: 'Password cannot be empty',
|
||
pathMapping: 'Path Mapping',
|
||
pathMappingRequired: 'Path cannot be empty',
|
||
pathMappingError: 'Must start with /',
|
||
storagePath: 'Storage Path',
|
||
downloadPath: 'Download Path',
|
||
},
|
||
filterRule: {
|
||
title: 'Filter Rule',
|
||
groupName: 'Group Name',
|
||
priority: 'Priority',
|
||
rules: 'Rules',
|
||
add: 'Add Rule',
|
||
import: 'Import Rules',
|
||
share: 'Share Rules',
|
||
save: 'Save Rules',
|
||
nameRequired: 'Rule group name cannot be empty',
|
||
nameDuplicate: 'Rule group name already exists',
|
||
importSuccess: 'Rules imported successfully',
|
||
importFailed: 'Failed to import rules',
|
||
shareSuccess: 'Rules copied to clipboard',
|
||
shareFailed: 'Failed to copy rules',
|
||
mediaType: 'Media Type',
|
||
category: 'Media Category',
|
||
mediaTypeItems: {
|
||
movie: 'Movie',
|
||
tv: 'TV Show',
|
||
anime: 'Anime',
|
||
collection: 'Collection',
|
||
unknown: 'Unknown',
|
||
},
|
||
},
|
||
mediaserver: {
|
||
type: 'Type',
|
||
customTypeHint: 'Custom media server type, for plugin scenarios',
|
||
enableMediaServer: 'Enable Media Server',
|
||
syncInterval: 'Automatic Sync Interval',
|
||
syncIntervalHint:
|
||
'Leave blank to use the legacy global default ({interval} hours); set to 0 to disable automatic sync for this server',
|
||
nameRequired: 'Required; cannot be duplicated',
|
||
serverAlias: 'Media server alias',
|
||
host: 'Host',
|
||
hostPlaceholder: 'http(s)://ip:port',
|
||
hostHint: 'Server address, format: http(s)://ip:port',
|
||
playHost: 'External Playback URL',
|
||
playHostPlaceholder: 'http(s)://domain:port',
|
||
playHostHint: 'URL for playback page redirection, format: http(s)://domain:port',
|
||
apiKey: 'API Key',
|
||
embyApiKeyHint: 'API key generated in Emby Settings -> Advanced -> API Keys',
|
||
jellyfinApiKeyHint: 'API key generated in Jellyfin Settings -> Advanced -> API Keys',
|
||
plexToken: 'X-Plex-Token',
|
||
plexTokenHint: 'X-Plex-Token obtained from Plex request URL in browser F12 -> Network',
|
||
username: 'Username',
|
||
usernameHint: 'Login username',
|
||
password: 'Password',
|
||
passwordHint: 'Login password',
|
||
accessCode: 'Access Code',
|
||
accessCodeHint: 'Access code enabled in fnOS Settings -> Security -> Access Settings. Leave empty if not enabled',
|
||
syncLibraries: 'Sync Libraries',
|
||
syncLibrariesHint: 'Only selected libraries will be synchronized',
|
||
scanMode: 'Scan Mode',
|
||
scanModeHint: 'Applies to full-library and targeted refresh: New & Modified / Supplement Missing / Full Override',
|
||
verifySsl: 'Verify SSL Certificate',
|
||
verifySslHint: 'When enabled, HTTPS certificates are verified; disable for self-signed certificates',
|
||
scanModeOptions: {
|
||
newAndModified: 'New & Modified',
|
||
supplementMissing: 'Supplement Missing',
|
||
fullOverride: 'Full Override',
|
||
},
|
||
hostRequired: 'Host cannot be empty',
|
||
apiKeyRequired: 'API Key cannot be empty',
|
||
tokenRequired: 'Token cannot be empty',
|
||
usernameRequired: 'Username cannot be empty',
|
||
passwordRequired: 'Password cannot be empty',
|
||
nameExists: '【{name}】 already exists, please use a different name',
|
||
},
|
||
bangumi: {
|
||
category: 'Category',
|
||
sort: 'Sort',
|
||
year: 'Year',
|
||
cat: {
|
||
other: 'Other',
|
||
tv: 'TV',
|
||
ova: 'OVA',
|
||
movie: 'Movie',
|
||
web: 'WEB',
|
||
},
|
||
sortType: {
|
||
rank: 'Rank',
|
||
date: 'Date',
|
||
},
|
||
},
|
||
anilist: {
|
||
sort: 'Sort',
|
||
genre: 'Genre',
|
||
format: 'Format',
|
||
season: 'Season',
|
||
year: 'Year',
|
||
status: 'Status',
|
||
country: 'Country',
|
||
sortType: {
|
||
popularity: 'Most Popular',
|
||
trending: 'Trending',
|
||
score: 'Highest Rated',
|
||
newest: 'Newest',
|
||
},
|
||
formatType: {
|
||
tv: 'TV',
|
||
tv_short: 'TV Short',
|
||
movie: 'Movie',
|
||
ova: 'OVA',
|
||
ona: 'ONA',
|
||
special: 'Special',
|
||
music: 'Music',
|
||
},
|
||
seasonType: {
|
||
winter: 'Winter',
|
||
spring: 'Spring',
|
||
summer: 'Summer',
|
||
fall: 'Fall',
|
||
},
|
||
statusType: {
|
||
releasing: 'Releasing',
|
||
finished: 'Finished',
|
||
not_yet_released: 'Not Yet Released',
|
||
},
|
||
countryType: {
|
||
jp: 'Japan',
|
||
cn: 'China',
|
||
kr: 'South Korea',
|
||
tw: 'Taiwan',
|
||
},
|
||
genreType: {
|
||
action: 'Action',
|
||
adventure: 'Adventure',
|
||
comedy: 'Comedy',
|
||
drama: 'Drama',
|
||
fantasy: 'Fantasy',
|
||
horror: 'Horror',
|
||
mahoushoujo: 'Mahou Shoujo',
|
||
mecha: 'Mecha',
|
||
music: 'Music',
|
||
mystery: 'Mystery',
|
||
psychological: 'Psychological',
|
||
romance: 'Romance',
|
||
scifi: 'Sci-Fi',
|
||
sliceoflife: 'Slice of Life',
|
||
sports: 'Sports',
|
||
supernatural: 'Supernatural',
|
||
thriller: 'Thriller',
|
||
},
|
||
},
|
||
tmdb: {
|
||
type: 'Type',
|
||
sort: 'Sort',
|
||
genre: 'Genre',
|
||
language: 'Language',
|
||
rating: 'Rating',
|
||
sortType: {
|
||
popularityDesc: 'Popularity Descending',
|
||
popularityAsc: 'Popularity Ascending',
|
||
releaseDateDesc: 'Release Date Descending',
|
||
releaseDateAsc: 'Release Date Ascending',
|
||
firstAirDateDesc: 'First Air Date Descending',
|
||
firstAirDateAsc: 'First Air Date Ascending',
|
||
voteAverageDesc: 'Vote Average Descending',
|
||
voteAverageAsc: 'Vote Average Ascending',
|
||
time: 'Latest',
|
||
count: 'Popular',
|
||
rating: 'Rating',
|
||
},
|
||
genreType: {
|
||
action: 'Action',
|
||
adventure: 'Adventure',
|
||
animation: 'Animation',
|
||
comedy: 'Comedy',
|
||
crime: 'Crime',
|
||
documentary: 'Documentary',
|
||
drama: 'Drama',
|
||
family: 'Family',
|
||
fantasy: 'Fantasy',
|
||
history: 'History',
|
||
horror: 'Horror',
|
||
music: 'Music',
|
||
mystery: 'Mystery',
|
||
romance: 'Romance',
|
||
scienceFiction: 'Science Fiction',
|
||
tvMovie: 'TV Movie',
|
||
thriller: 'Thriller',
|
||
war: 'War',
|
||
western: 'Western',
|
||
actionAdventure: 'Action & Adventure',
|
||
kids: 'Kids',
|
||
news: 'News',
|
||
reality: 'Reality',
|
||
sciFiFantasy: 'Sci-Fi & Fantasy',
|
||
soap: 'Soap',
|
||
talk: 'Talk',
|
||
warPolitics: 'War & Politics',
|
||
},
|
||
languageType: {
|
||
zh: 'Chinese',
|
||
en: 'English',
|
||
ja: 'Japanese',
|
||
ko: 'Korean',
|
||
fr: 'French',
|
||
de: 'German',
|
||
es: 'Spanish',
|
||
it: 'Italian',
|
||
ru: 'Russian',
|
||
pt: 'Portuguese',
|
||
ar: 'Arabic',
|
||
hi: 'Hindi',
|
||
th: 'Thai',
|
||
},
|
||
},
|
||
douban: {
|
||
type: 'Type',
|
||
sort: 'Sort',
|
||
genre: 'Genre',
|
||
zone: 'Region',
|
||
year: 'Year',
|
||
music: {
|
||
genre: {
|
||
pop: 'Pop',
|
||
rock: 'Rock',
|
||
folk: 'Folk',
|
||
electronic: 'Electronic',
|
||
jazz: 'Jazz',
|
||
classical: 'Classical',
|
||
soundtrack: 'Soundtrack',
|
||
indie: 'Indie',
|
||
instrumental: 'Instrumental',
|
||
},
|
||
region: { mainland: 'Mainland China', hongKong: 'Hong Kong', taiwan: 'Taiwan', cantonese: 'Cantonese' },
|
||
sort: { comprehensive: 'Comprehensive', rating: 'Rating', date: 'Date', markCount: 'Most Marked' },
|
||
},
|
||
sortType: {
|
||
comprehensive: 'Comprehensive',
|
||
releaseDate: 'Release Date',
|
||
recentHot: 'Recent Hot',
|
||
highScore: 'High Score',
|
||
},
|
||
genreType: {
|
||
comedy: 'Comedy',
|
||
romance: 'Romance',
|
||
action: 'Action',
|
||
scienceFiction: 'Science Fiction',
|
||
animation: 'Animation',
|
||
mystery: 'Mystery',
|
||
crime: 'Crime',
|
||
thriller: 'Thriller',
|
||
adventure: 'Adventure',
|
||
music: 'Music',
|
||
history: 'History',
|
||
fantasy: 'Fantasy',
|
||
horror: 'Horror',
|
||
war: 'War',
|
||
biography: 'Biography',
|
||
musical: 'Musical',
|
||
martialArts: 'Martial Arts',
|
||
erotic: 'Erotic',
|
||
disaster: 'Disaster',
|
||
western: 'Western',
|
||
documentary: 'Documentary',
|
||
shortFilm: 'Short Film',
|
||
},
|
||
zoneType: {
|
||
chinese: 'Chinese',
|
||
europeanAmerican: 'European & American',
|
||
korean: 'Korean',
|
||
japanese: 'Japanese',
|
||
mainlandChina: 'Mainland China',
|
||
usa: 'USA',
|
||
hongKong: 'Hong Kong',
|
||
taiwan: 'Taiwan',
|
||
uk: 'UK',
|
||
france: 'France',
|
||
germany: 'Germany',
|
||
italy: 'Italy',
|
||
spain: 'Spain',
|
||
india: 'India',
|
||
thailand: 'Thailand',
|
||
russia: 'Russia',
|
||
canada: 'Canada',
|
||
australia: 'Australia',
|
||
ireland: 'Ireland',
|
||
sweden: 'Sweden',
|
||
brazil: 'Brazil',
|
||
denmark: 'Denmark',
|
||
},
|
||
yearType: {
|
||
'2020s': '2020s',
|
||
'2010s': '2010s',
|
||
'2000s': '2000s',
|
||
'1990s': '1990s',
|
||
'1980s': '1980s',
|
||
'1970s': '1970s',
|
||
'1960s': '1960s',
|
||
},
|
||
},
|
||
directory: {
|
||
alias: 'Directory Alias',
|
||
mediaType: 'Media Type',
|
||
mediaCategory: 'Media Category',
|
||
resourceStorage: 'Resource Storage',
|
||
resourceDirectory: 'Resource Directory',
|
||
sortByType: 'Sort by Type',
|
||
sortByCategory: 'Sort by Category',
|
||
autoTransfer: 'Auto Transfer',
|
||
monitorMode: 'Monitor Mode',
|
||
libraryStorage: 'Library Storage',
|
||
libraryDirectory: 'Library Directory',
|
||
transferType: 'Transfer Type',
|
||
transferTypeHint: 'File operation organization method, hard link saves space, copy is safer',
|
||
overwriteMode: 'Overwrite Mode',
|
||
overwriteModeHint: 'How to handle when target file already exists',
|
||
smartRename: 'Smart Rename',
|
||
scrapingMetadata: 'Scrape Metadata',
|
||
sendNotification: 'Send Notification',
|
||
noTransfer: 'No Transfer',
|
||
downloaderMonitor: 'Downloader Monitor',
|
||
directoryMonitor: 'Directory Monitor',
|
||
manualTransfer: 'Manual Transfer',
|
||
performanceMode: 'Performance Mode',
|
||
compatibilityMode: 'Compatibility Mode',
|
||
pleaseSelectStorage: 'Please select storage',
|
||
pleaseSelectLibraryStorage: 'Please select library storage',
|
||
pleaseSelectDownloadStorage: 'Please select download storage',
|
||
noSupportedTransferType: 'No supported transfer type',
|
||
never: 'Never',
|
||
always: 'Always',
|
||
byFileSize: 'By File Size',
|
||
keepLatestOnly: 'Keep Latest Only',
|
||
},
|
||
validators: {
|
||
required: 'This field is required',
|
||
number: 'Please enter a number',
|
||
},
|
||
folder: {
|
||
settingAppearance: 'Appearance Settings',
|
||
rename: 'Rename',
|
||
deleteFolder: 'Delete Folder',
|
||
folderNameCannotBeEmpty: 'Folder name cannot be empty',
|
||
confirmDeleteFolder:
|
||
'Are you sure you want to delete folder "{folderName}"? Plugins in this folder will be moved back to the main list.',
|
||
folderSettingsSaved: 'Folder settings saved',
|
||
renameFolder: 'Rename Folder',
|
||
folderName: 'Folder Name',
|
||
folderAppearanceSettings: 'Folder Appearance Settings',
|
||
showFolderIcon: 'Show Folder Icon',
|
||
icon: 'Icon',
|
||
iconColor: 'Icon Color',
|
||
backgroundGradient: 'Background Gradient',
|
||
customBackgroundImageURL: 'Custom Background Image URL (Optional)',
|
||
customBackgroundImageHint: 'Supports web image URLs, leave blank for gradient background',
|
||
pluginCount: '{count} Plugins',
|
||
},
|
||
setupWizard: {
|
||
title: 'Welcome to MoviePilot!',
|
||
subtitle: 'Complete the configuration by the wizard, and start using it immediately.',
|
||
completed: 'Setup Wizard completed!',
|
||
failed: 'Setup Wizard failed, please try again',
|
||
complete: 'Complete Configuration',
|
||
loading: 'Loading configuration data...',
|
||
testing: 'Testing',
|
||
connectivityTestSuccess: 'Connectivity test passed',
|
||
connectivityTestFailed: 'Connectivity test failed',
|
||
testingStorage: 'Testing storage',
|
||
checkingStorage: 'Checking storage connectivity',
|
||
testingDownloader: 'Testing downloader',
|
||
checkingDownloader: 'Checking downloader connectivity',
|
||
testingMediaServer: 'Testing media server',
|
||
checkingMediaServer: 'Checking media server connectivity',
|
||
testingNotification: 'Testing notification',
|
||
checkingNotification: 'Checking notification connectivity',
|
||
testFailedHint: 'Please check if the configuration is correct, you can retest after modification',
|
||
unsupportedDownloaderType: 'Unsupported downloader type: {type}',
|
||
unsupportedMediaServerType: 'Unsupported media server type: {type}',
|
||
unsupportedNotificationType: 'Unsupported notification type: {type}',
|
||
storageTestFailed: 'Storage test failed',
|
||
downloaderTestFailed: 'Downloader test failed',
|
||
downloaderNotSelected: 'No downloader selected',
|
||
mediaServerTestFailed: 'Media server test failed',
|
||
mediaServerNotSelected: 'No media server selected',
|
||
notificationTestFailed: 'Notification test failed',
|
||
notificationNotSelected: 'No notification type selected',
|
||
saveStepFailed: 'Failed to save step settings',
|
||
basicSettingsSaved: 'Basic settings saved successfully',
|
||
saveBasicSettingsFailed: 'Failed to save basic settings',
|
||
storageSettingsSaved: 'Storage settings saved successfully',
|
||
saveStorageSettingsFailed: 'Failed to save storage settings',
|
||
downloaderSettingsSaved: 'Downloader settings saved successfully',
|
||
saveDownloaderSettingsFailed: 'Failed to save downloader settings',
|
||
mediaServerSettingsSaved: 'Media server settings saved successfully',
|
||
saveMediaServerSettingsFailed: 'Failed to save media server settings',
|
||
notificationSettingsSaved: 'Notification settings saved successfully',
|
||
saveNotificationSettingsFailed: 'Failed to save notification settings',
|
||
saveSiteAuthSettingsFailed: 'Failed to save user site authentication settings: {message}',
|
||
saveAgentSettingsFailed: 'Failed to save AI assistant settings',
|
||
preferenceSettingsSaved: 'Preference settings saved successfully',
|
||
savePreferenceSettingsFailed: 'Failed to save preference settings',
|
||
passwordUpdateSuccess: 'Password updated successfully',
|
||
userCreateSuccess: 'User created successfully',
|
||
passwordUpdateFailed: 'Failed to update password',
|
||
basic: {
|
||
title: 'Basic Settings',
|
||
description: 'Set access domain, username/password and network configuration',
|
||
appDomain: 'App Domain',
|
||
appDomainHint: 'MoviePilot access URL used for notification links and passkey verification',
|
||
wallpaper: 'Background Wallpaper',
|
||
wallpaperHint: 'Choose the source of the login page background',
|
||
recognizeSource: 'Recognize Source',
|
||
recognizeSourceHint: 'Set the default media info recognition data source',
|
||
apiToken: 'API Token',
|
||
apiTokenHint: 'API Token required for accessing MoviePilot API, please record it for subsequent use',
|
||
currentUserHint: 'Current user, cannot be modified',
|
||
passwordOptionalHint: 'Leave blank to keep current password',
|
||
confirmPasswordHint: 'Confirm new password',
|
||
apiTokenRequired: 'API Token is required',
|
||
},
|
||
siteAuth: {
|
||
title: 'User Authentication',
|
||
description: 'Configure site authentication and auxiliary authentication',
|
||
info: 'User Site Authentication',
|
||
infoDesc:
|
||
'Completing site authentication unlocks site capabilities and some plugin permissions. This step is optional and can also be configured later from the user menu.',
|
||
selectSiteHint: 'Choose a supported auth site and fill in the required credentials for that site',
|
||
submitHint:
|
||
'When you click Next, the wizard will immediately validate against the selected auth site and save the current parameters on success.',
|
||
siteConfigNotExist: 'Authentication site configuration does not exist',
|
||
fieldRequired: 'Please enter {name}',
|
||
},
|
||
storage: {
|
||
title: 'Storage',
|
||
description: 'Configure download directory and media library directory',
|
||
info: 'Storage Configuration',
|
||
infoDesc: 'Configure local storage directories for download and media library management',
|
||
downloadPath: 'Download Directory',
|
||
downloadPathHint: 'Set the storage path for downloaded files',
|
||
libraryPath: 'Media Library Directory',
|
||
libraryPathHint: 'Set the storage path for media files',
|
||
downloadPathRequired: 'Download directory is required',
|
||
libraryPathRequired: 'Media library directory is required',
|
||
},
|
||
downloader: {
|
||
title: 'Downloader',
|
||
description: 'Configure downloader',
|
||
info: 'Downloader Configuration',
|
||
infoDesc: 'Configure downloader for resource download, can choose qBittorrent or Transmission',
|
||
type: 'Downloader Type',
|
||
typeHint: 'Select the type of downloader to use',
|
||
name: 'Downloader Name',
|
||
nameHint: 'Set a name for the downloader',
|
||
qbittorrentConfig: 'qBittorrent Configuration',
|
||
transmissionConfig: 'Transmission Configuration',
|
||
host: 'Server Address',
|
||
username: 'Username',
|
||
password: 'Password',
|
||
downloadPath: 'Download Path',
|
||
},
|
||
mediaServer: {
|
||
title: 'Media Server',
|
||
description: 'Configure media server',
|
||
info: 'Media Server Configuration',
|
||
infoDesc:
|
||
'Configure media server for media library management, can choose Emby, ZSpace, Jellyfin, Plex, TrimeMedia or Ugreen.',
|
||
type: 'Media Server Type',
|
||
typeHint: 'Select the type of media server to use',
|
||
name: 'Server Name',
|
||
nameHint: 'Set a name for the media server',
|
||
embyConfig: 'Emby Configuration',
|
||
zspaceConfig: 'ZSpace Configuration',
|
||
jellyfinConfig: 'Jellyfin Configuration',
|
||
plexConfig: 'Plex Configuration',
|
||
host: 'Server Address',
|
||
apiKey: 'API Key',
|
||
token: 'Access Token',
|
||
},
|
||
notification: {
|
||
title: 'Notification',
|
||
description: 'Configure notification channels',
|
||
info: 'Notification Configuration',
|
||
infoDesc: 'Configure notification channels for receiving system messages (optional)',
|
||
type: 'Notification Type',
|
||
typeHint: 'Select the type of notification channel to use',
|
||
name: 'Notification Name',
|
||
nameHint: 'Set a name for the notification channel',
|
||
feishuConfig: 'Feishu Configuration',
|
||
telegramConfig: 'Telegram Configuration',
|
||
emailConfig: 'Email Configuration',
|
||
botToken: 'Bot Token',
|
||
chatId: 'Chat ID',
|
||
smtpServer: 'SMTP Server',
|
||
smtpPort: 'SMTP Port',
|
||
senderEmail: 'Sender Email',
|
||
senderPassword: 'Sender Password',
|
||
receiverEmail: 'Receiver Email',
|
||
},
|
||
agent: {
|
||
title: 'AI Assistant',
|
||
description: 'Configure the Agent assistant and LLM parameters',
|
||
info: 'AI Assistant Configuration',
|
||
infoDesc:
|
||
'After enabling it, you can use the Agent in message conversations and optionally turn on transfer-failure takeover and AI recommendations.',
|
||
providerRequired: 'LLM provider is required',
|
||
apiKeyRequired: 'LLM API key is required',
|
||
authOrApiKeyRequired: 'Provide an LLM API key or complete provider authorization first',
|
||
modelRequired: 'LLM model name is required',
|
||
maxContextTokensRequired: 'LLM max context tokens must be greater than 0',
|
||
recommendMaxItemsRequired: 'AI recommendation analysis limit must be greater than 0',
|
||
},
|
||
preferences: {
|
||
title: 'Resource Preferences',
|
||
description: 'Set resource download preferences',
|
||
info: 'Resource Preferences',
|
||
infoDesc:
|
||
'Set resource download preferences, the system will automatically select the best resources based on these preferences',
|
||
quality: 'Quality Preference',
|
||
qualityHint: 'Select preferred video quality',
|
||
subtitle: 'Subtitle Preference',
|
||
subtitleHint: 'Select preferred subtitle type',
|
||
resolution: 'Resolution Preference',
|
||
resolutionHint: 'Select preferred video resolution',
|
||
presetRules: 'Preset Rules',
|
||
detailedConfig: 'Detailed Configuration',
|
||
quickPresets: 'Quick Presets',
|
||
quickPresetsDesc: 'Select preset configuration, system will automatically apply corresponding rules',
|
||
personalizationOptions: 'Personalization Options',
|
||
personalizationOptionsDesc: 'Adjust rules according to your needs',
|
||
excludeDolbyVision: 'Exclude Dolby Vision',
|
||
excludeDolbyVisionHint: 'Exclude Dolby Vision resources from rules when selected',
|
||
excludeBluray: 'Exclude Blu-ray',
|
||
excludeBlurayHint: 'Exclude Blu-ray resources from rules when selected',
|
||
presets: {
|
||
'4k-enthusiast': {
|
||
name: '4K Enthusiast',
|
||
description: 'Pursue the highest quality, prioritize 4K',
|
||
},
|
||
'balanced': {
|
||
name: 'Balanced Mode',
|
||
description: 'Balance between quality and storage space',
|
||
},
|
||
'space-saver': {
|
||
name: 'Space Saver',
|
||
description: 'Prioritize smaller files to save storage space',
|
||
},
|
||
'free-priority': {
|
||
name: 'Free Priority',
|
||
description: 'Prioritize free resources, no other requirements',
|
||
},
|
||
},
|
||
},
|
||
},
|
||
}
|