更新国际化支持

This commit is contained in:
jxxghp
2025-04-28 13:23:51 +08:00
parent 6b49464059
commit 8cf4b612d5
29 changed files with 3175 additions and 17187 deletions

View File

@@ -14,14 +14,18 @@ export default {
inputMessage: 'Enter message or command',
send: 'Send',
noData: 'No Data',
noContent: 'No Content Found',
noContent: 'No relevant content found',
all: 'All',
default: 'Default',
name: 'Name',
create: 'Create',
saving: 'Saving',
reset: 'Reset',
},
theme: {
light: 'Light',
dark: 'Dark',
auto: 'Auto',
auto: 'Follow System',
transparent: 'Transparent',
purple: 'Purple',
custom: 'Custom Theme',
@@ -36,22 +40,22 @@ export default {
selectLanguage: 'Select Language',
logout: 'Logout',
restarting: 'Restarting...',
confirmRestart: 'Confirm Restart?',
restartTip: 'After restarting, you will be logged out and need to log in again.',
confirmRestart: 'Confirm restart system?',
restartTip: 'After restart, you will be logged out and need to log in again.',
},
login: {
wallpapers: 'wallpapers',
wallpapers: 'Wallpapers',
username: 'Username',
password: 'Password',
otpCode: 'OTP Code',
otpCode: 'Two-Factor Code',
stayLoggedIn: 'Stay Logged In',
login: 'Login',
networkError: 'Login failed, please check your network connection!',
authFailure: 'Login failed, please check your username, password or OTP code!',
authFailure: 'Login failed, please check your username, password or two-factor authentication!',
permissionDenied: 'Login failed, you do not have permission to access!',
serverError: 'Login failed, server error!',
loginFailed: 'Login Failed',
checkCredentials: 'Please check your username, password or OTP code!',
checkCredentials: 'Please check your username, password or two-factor authentication code!',
},
menu: {
start: 'Start',
@@ -71,7 +75,7 @@ export default {
movieSubscribe: 'Movie Subscription',
tvSubscribe: 'TV Subscription',
history: 'History',
transfer: 'Transfer',
transfer: 'Organize',
rename: 'Rename',
statistic: 'Statistics',
setting: 'Settings',
@@ -84,11 +88,11 @@ export default {
workflow: 'Workflow',
calendar: 'Calendar',
downloadManager: 'Download Manager',
mediaOrganize: 'Media Organizer',
mediaOrganize: 'Media Organize',
fileManager: 'File Manager',
pluginManager: 'Plugins',
siteManager: 'Site Manager',
userManager: 'User Manager',
siteManager: 'Site Management',
userManager: 'User Management',
settings: 'Settings',
},
settingTabs: {
@@ -98,7 +102,7 @@ export default {
},
directory: {
title: 'Storage & Directories',
description: 'Download directories, media library directories, organization, metadata scraping',
description: 'Download directory, media library directory, organization, scraping',
},
site: {
title: 'Sites',
@@ -110,15 +114,15 @@ export default {
},
search: {
title: 'Search & Download',
description: 'Search data sources (TheMovieDb, Douban, Bangumi), download task labels, search sites',
description: 'Search data sources (TheMovieDb, Douban, Bangumi), download task tags, search sites',
},
subscribe: {
title: 'Subscription',
description: 'Subscription sites, subscription modes, subscription rules, upgrade rules',
description: 'Subscription sites, subscription mode, subscription rules, version upgrade rules',
},
scheduler: {
title: 'Services',
description: 'Scheduled tasks',
description: 'Scheduled jobs',
},
notification: {
title: 'Notifications',
@@ -126,7 +130,7 @@ export default {
},
words: {
title: 'Word Lists',
description: 'Custom recognition words, custom groups, custom placeholders, file organization filter words',
description: 'Custom recognition words, custom production/subtitle groups, custom placeholders, file organization block words',
},
about: {
title: 'About',
@@ -136,12 +140,12 @@ export default {
subscribeTabs: {
movie: {
mysub: 'My Subscriptions',
popular: 'Popular',
popular: 'Popular Subscriptions',
},
tv: {
mysub: 'My Subscriptions',
popular: 'Popular',
share: 'Shared',
popular: 'Popular Subscriptions',
share: 'Subscription Shares',
},
},
pluginTabs: {
@@ -155,12 +159,26 @@ export default {
},
user: {
admin: 'Administrator',
normalUser: 'Normal User',
normalUser: 'Regular User',
profile: 'Profile',
systemSettings: 'System Settings',
siteAuth: 'User Authentication',
helpDocs: 'Help Docs',
helpDocs: 'Help Documents',
restart: 'Restart',
management: 'User Management',
noUsers: 'No Users',
clickToAddUser: 'Click Add User card to add users',
addUser: 'Add User',
editUser: 'Edit User',
username: 'Username',
password: 'Password',
confirmPassword: 'Confirm Password',
role: 'Role',
email: 'Email',
enabled: 'Enabled',
disabled: 'Disabled',
status: 'Status',
operations: 'Operations',
},
nav: {
more: 'More',
@@ -178,7 +196,7 @@ export default {
},
rule: {
title: 'Rules',
subtitle: 'Rule Test',
subtitle: 'Rule Testing',
},
log: {
title: 'Logs',
@@ -186,7 +204,7 @@ export default {
},
network: {
title: 'Network',
subtitle: 'Speed & Connectivity Test',
subtitle: 'Network Speed and Connectivity Test',
},
system: {
title: 'System',
@@ -202,7 +220,7 @@ export default {
clickToAdd: 'Click to Add',
dragToCanvas: 'Drag to Canvas',
tapComponentHint: 'Tap component to add to canvas',
dragComponentHint: 'Drag components to canvas',
dragComponentHint: 'Drag component to canvas',
},
dashboard: {
storage: 'Storage Space',
@@ -224,9 +242,9 @@ export default {
tv: 'TV Show',
},
subscribe: {
normalSub: 'Subscription',
versionSub: 'Version Upgrade',
addSuccess: '{name} added successfully!',
normalSub: 'Subscribe',
versionSub: 'Version Upgrade Subscribe',
addSuccess: 'Added {name} successfully!',
addFailed: 'Failed to add {name}: {message}!',
cancelSuccess: 'Subscription cancelled!',
cancelFailed: 'Failed to cancel subscription: {message}!',
@@ -234,18 +252,16 @@ export default {
name: 'Name',
searchShares: 'Search Subscription Shares',
keyword: 'Keyword',
noShareData:
'No shared subscription data available, data sharing is not enabled or the server cannot be connected.',
noPopularData:
'No popular subscription data available, data sharing is not enabled or the server cannot be connected.',
noFilterData: 'No matching content found. Please change the filter criteria.',
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: 'Shared by',
sharer: 'Sharer',
follow: 'Follow',
unfollow: 'Unfollow',
recognitionWords: 'Recognition Words',
cancelShare: 'Cancel Share',
usageCount: 'Used {count} times',
usageCount: '{count} Uses',
},
recommend: {
all: 'All',
@@ -255,7 +271,7 @@ export default {
categoryRankings: 'Rankings',
trendingNow: 'Trending Now',
nowShowing: 'Now Showing',
bangumiDaily: 'Bangumi Daily',
bangumiDaily: 'Bangumi Daily Release',
tmdbHotMovies: 'TMDB Hot Movies',
tmdbHotTVShows: 'TMDB Hot TV Shows',
doubanHotMovies: 'Douban Hot Movies',
@@ -263,13 +279,13 @@ export default {
doubanHotAnime: 'Douban Hot Anime',
doubanNewMovies: 'Douban New Movies',
doubanNewTVShows: 'Douban New TV Shows',
doubanTop250: 'Douban Movie TOP250',
doubanTop250: 'Douban Top 250 Movies',
doubanChineseTVRankings: 'Douban Chinese TV Rankings',
doubanGlobalTVRankings: 'Douban Global TV Rankings',
noCategoryContent: 'No content to display in this category',
configureContent: 'Configure Content',
noCategoryContent: 'No content to display in current category',
configureContent: 'Configure Display Content',
customizeContent: 'Customize Content',
selectContentToDisplay: 'Select the content you want to display',
selectContentToDisplay: 'Select content you want to display on the page',
selectAll: 'Select All',
selectNone: 'Select None',
},
@@ -278,8 +294,8 @@ export default {
dragToReorder: 'Drag to reorder tabs',
},
downloading: {
noDownloader: 'No Downloaders',
configureDownloader: 'Please configure and enable downloaders in settings first.',
noDownloader: 'No Downloader',
configureDownloader: 'Please configure and enable a downloader in settings first.',
},
resource: {
searchResults: 'Resource Search Results',
@@ -301,8 +317,8 @@ export default {
},
notFound: {
title: 'Page Not Found ⚠️',
description: 'The page you are trying to access does not exist. Please check the URL.',
backButton: 'Back',
description: 'The page you tried to access does not exist. Please check if the address is correct.',
backButton: 'Go Back',
},
torrent: {
sortDefault: 'Default',
@@ -310,9 +326,9 @@ export default {
sortSize: 'Size',
sortSeeder: 'Seeders',
filterSite: 'Site',
filterSeason: 'Season',
filterFreeState: 'Promotion',
filterVideoCode: 'Video Code',
filterSeason: 'Season/Episode',
filterFreeState: 'Promotion Status',
filterVideoCode: 'Video Codec',
filterEdition: 'Quality',
filterResolution: 'Resolution',
filterReleaseGroup: 'Release Group',
@@ -325,15 +341,15 @@ export default {
episode: 'Episode {number}',
},
storage: {
usedPercent: 'Used {percent}%',
usedPercent: '{percent}% Used',
},
site: {
noSites: 'No Sites',
sitesWillBeShownHere: 'Added and supported sites will be displayed here.',
sitesWillBeShownHere: 'Added and supported sites will be shown here.',
},
message: {
loadMore: 'Load More',
noMoreData: 'No More Data',
noMoreData: 'No more data',
},
logging: {
level: 'Level',
@@ -833,7 +849,7 @@ export default {
otp: 'Enable Two-Factor Authentication',
avatar: 'Avatar',
uploadAvatar: 'Upload Avatar',
resetDefaultAvatar: 'Reset to Default Avatar',
resetDefaultAvatar: 'Reset Default Avatar',
restoreCurrentAvatar: 'Restore Current Avatar',
notifications: 'Notifications',
wechat: 'WeChat UserID',
@@ -846,28 +862,28 @@ export default {
updatingUser: 'Updating user [{name}], please wait',
usernameRequired: 'Username cannot be empty',
usernameExists: 'Username already exists',
passwordMismatch: 'Passwords do not match',
passwordMismatch: 'The two passwords do not match',
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 requirements, please select another avatar',
fileSizeLimit: 'File size cannot exceed 800KB',
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: 'Current avatar restored!',
restoreAvatarSuccess: 'Restored current avatar!',
deleteConfirm: 'Confirm delete user [{name}]?',
saveUserInfo: 'Save User Information',
cannotDeleteCurrentUser: 'Cannot delete the currently logged-in user',
cannotDeleteCurrentUser: 'Cannot delete current logged-in user',
deleteUser: 'Delete User',
},
searchBar: {
search: 'Search',
searchPlaceholder: 'Search functions, subscriptions, settings...',
searchPlaceholder: 'Search features, subscriptions, settings...',
recentSearches: 'Recent Searches',
noRecentSearches: 'No recent searches',
noRecentSearches: 'No recent search history',
functions: 'Functions',
noFunctionsFound: 'No matching functions',
plugins: 'Plugins',
@@ -877,13 +893,13 @@ export default {
searchSites: 'Search Sites',
selectSites: 'Select Sites',
collections: 'Collections',
collectionSearch: 'related collections',
actorSearch: 'related actors, directors, etc.',
historySearch: 'related history records',
collectionSearch: 'Related series works',
actorSearch: 'Related actors, directors, etc.',
historySearch: 'Related history records',
siteResources: 'Site Resources',
searchInSites: 'Search for torrents in sites',
relatedResources: 'related resources',
searchTip: 'Search for movies, TV shows, actors, resources, etc.',
searchInSites: 'Search for torrent resources in sites',
relatedResources: 'Related Resources',
searchTip: 'You can search for movies, TV shows, actors, resources, etc.',
},
searchSite: {
selectSites: 'Select Sites',
@@ -903,7 +919,7 @@ export default {
downloader: 'Downloader (Default)',
saveDirectory: 'Save Directory (Auto)',
defaultPlaceholder: 'Leave empty for default',
autoPlaceholder: 'Leave empty for auto match',
autoPlaceholder: 'Leave empty for auto-match',
downloading: 'Downloading...',
startDownload: 'Start Download',
downloadSuccess: '{site} {title} downloaded successfully!',
@@ -914,41 +930,39 @@ export default {
season: 'Season {number}',
title: 'Title',
description: 'Description',
descriptionHint:
'Fill in the description of the subscription. Search terms and identification terms in the subscription will be included in the share by default',
descriptionHint: 'Add a description about this subscription. Search terms, recognition words, etc. will be included in the share by default',
shareUser: 'Share User',
shareUserHint: 'Nickname of the sharer',
shareUserHint: 'Sharer\'s nickname',
confirmShare: 'Confirm Share',
shareSuccess: '{name} shared successfully!',
shareFailed: '{name} share failed: {message}!',
},
u115Auth: {
loginTitle: '115 Cloud Login',
scanQrCode: 'Please scan the QR code with WeChat or 115 client',
scanned: 'QR code scanned, please confirm login',
scanQrCode: 'Please scan with WeChat or 115 client',
scanned: 'Scanned, please confirm login',
complete: 'Complete',
},
aliyunAuth: {
loginTitle: 'Aliyun Drive Login',
scanQrCode: 'Please scan with Aliyun Drive App',
scanned: 'QR code scanned',
scanned: 'Scanned',
complete: 'Complete',
},
rcloneConfig: {
title: 'RClone Configuration',
filePath: 'Rclone Config File Path',
fileContent: 'Rclone Config File Content',
defaultContent:
'# Please fill in the rclone configuration file content here \n# Please refer to https://rclone.org/docs/ \n# Storage node name must be: MP',
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',
},
alistConfig: {
title: 'Alist Configuration',
serverUrl: 'Alist Server URL',
serverUrl: 'Alist server address',
username: 'Username',
password: 'Password',
tokenUrl: 'Token URL',
loginType: 'Login Type',
tokenUrl: 'Token acquisition address',
loginType: 'Login method',
loginTypeOptions: {
guest: 'Guest',
username: 'Username & Password',
@@ -967,17 +981,17 @@ export default {
schedule: 'Schedule',
cronExpr: 'Cron Expression',
cronExprDesc: 'Cron expression for workflow scheduling',
nameRequired: 'Please fill in all required information!',
addSuccess: 'Workflow created successfully. Please edit the process!',
addFailed: 'Failed to create workflow: {message}',
editSuccess: 'Workflow modified successfully!',
editFailed: 'Failed to modify workflow: {message}',
nameRequired: 'Please fill in complete information!',
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: 'No actions in the workflow, please add actions',
noActionsMessage: 'Workflow has no actions, please add actions',
addAction: 'Add Action',
editAction: 'Edit Action',
deleteAction: 'Delete Action',
@@ -995,24 +1009,24 @@ export default {
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 same type port!',
invalidConnection: 'Invalid connection: cannot connect to self or ports of the same type!',
componentNotFound: 'Component {component} not found',
componentAdded: 'Component added to canvas',
saveSuccess: 'Workflow saved successfully!',
saveFailed: 'Failed to save workflow: {message}',
importTitle: 'Import Workflow',
saveSuccess: 'Task workflow saved successfully!',
saveFailed: 'Failed to save task workflow: {message}',
importTitle: 'Import Task Workflow',
importSuccess: 'Import successful!',
importFailed: 'Import failed!',
codeCopied: 'Workflow code copied to clipboard!',
codeCopied: 'Task workflow code copied to clipboard!',
},
siteCookieUpdate: {
title: 'Update Site Cookie',
checkHint: 'Checking login status, please wait...',
confirmUpdateTitle: 'Confirm Update',
confirmUpdateMessage: "Do you want to update this site's cookie with the local cookie?",
confirmUpdateMessage: 'Do you want to update this site\'s cookie with the local cookie?',
processing: 'Processing...',
success: 'Cookie updated successfully',
failed: 'Cookie update failed',
failed: 'Failed to update cookie',
confirm: 'Confirm',
cancel: 'Cancel',
},
@@ -1024,7 +1038,7 @@ export default {
iconLabel: 'Site Icon',
uploadIcon: 'Upload Icon',
cookie: 'Cookie',
rssUrl: 'RSS URL',
rssUrl: 'RSS Link',
enableLabel: 'Enable',
pubEnableLabel: 'Public Resources',
priorityLabel: 'Priority',
@@ -1048,7 +1062,7 @@ export default {
title: 'Plugin Market Settings',
repoUrl: 'Plugin Repository URL',
repoPlaceholder: 'Format: https://github.com/jxxghp/MoviePilot-Plugins/,https://github.com/xxxx/xxxxxx/',
repoHint: 'Multiple addresses separated by commas, only supports Github repositories',
repoHint: 'Multiple URLs separated by commas, only Github repositories are supported',
close: 'Close',
save: 'Save',
saveSuccess: 'Plugin repository saved successfully',
@@ -1057,21 +1071,21 @@ export default {
userAuth: {
title: 'User Authentication',
codeLabel: 'Authentication Code',
codePlaceholder: 'Please enter the authentication code',
authBtn: 'Authenticate',
codePlaceholder: 'Please enter authentication code',
authBtn: 'Start Authentication',
closeBtn: 'Close',
selectSite: 'Select Authentication Site',
selectSiteRequired: 'Please select an authentication site!',
selectSiteRequired: 'Please select authentication site!',
siteConfigNotExist: 'Site configuration does not exist!',
fieldRequired: 'Please enter {name}!',
authSuccess: 'User authentication successful, please login again!',
authSuccess: 'User authentication successful, please log in again!',
authFailed: 'Authentication failed: {message}',
},
transferQueue: {
title: 'Transfer Queue',
title: 'Organization Queue',
name: 'Name',
type: 'Type',
state: 'State',
state: 'Status',
progress: 'Progress',
startTime: 'Start Time',
speedTitle: 'Speed',
@@ -1090,9 +1104,9 @@ export default {
close: 'Close',
},
reorganize: {
title: 'Reorganize',
sourceTitle: 'Source Files',
targetTitle: 'Target Files',
title: 'Organize',
sourceTitle: 'Source File',
targetTitle: 'Target File',
processingTitle: 'Processing',
confirmTitle: 'Confirm',
selectFile: 'Select File',
@@ -1105,120 +1119,119 @@ export default {
selectTargetPath: 'Select Target Path',
selectTargetDir: 'Select Target Directory',
selectFileName: 'Select Filename',
confirmMoving: 'Please confirm moving!',
sourceLabel: 'Source:',
targetLabel: 'Target Directory:',
confirmMoving: 'Please confirm move!',
sourceLabel: 'Source file:',
targetLabel: 'Target directory:',
filenameLabel: 'Filename:',
close: 'Close',
next: 'Next',
previous: 'Previous',
confirm: 'Confirm',
manualTitle: 'Manual Reorganize',
multipleItemsTitle: 'Reorganize - {count} Items',
singleItemTitle: 'Reorganize - {path}',
manualTitle: 'Manual Organization',
multipleItemsTitle: 'Organize - {count} Items',
singleItemTitle: 'Organize - {path}',
targetStorage: 'Target Storage',
targetStorageHint: 'Storage for reorganization',
transferType: 'Transfer Method',
transferTypeHint: 'File operation method',
targetStorageHint: 'Organization target storage',
transferType: 'Organization Method',
transferTypeHint: 'File operation organization method',
targetPath: 'Target Path',
targetPathHint: 'Target path for reorganization, leave empty for automatic matching',
targetPathPlaceholder: 'Leave empty for automatic',
targetPathHint: 'Organization target path, leave empty for auto-match',
targetPathPlaceholder: 'Leave empty for auto',
mediaType: 'Type',
mediaTypeHint: 'Media type of the file',
mediaTypeHint: 'File media type',
tmdbId: 'TheMovieDb ID',
doubanId: 'Douban ID',
mediaIdHint: 'Search media ID by name, leave empty for automatic recognition',
mediaIdPlaceholder: 'Leave empty for automatic recognition',
mediaIdHint: 'Query media ID by name, leave empty for auto recognition',
mediaIdPlaceholder: 'Leave empty for auto recognition',
episodeGroup: 'Episode Group ID',
episodeGroupHint: 'Specify episode group',
episodeGroupPlaceholder: 'Manually search episode group',
episodeGroupPlaceholder: 'Manually query episode group',
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 Format',
episodeFormatHint: 'Use {ep} to locate the episode part in the filename for recognition',
episodeFormatPlaceholder: 'Use {ep} to locate 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',
episodeOffset: 'Episode Offset',
episodeOffsetHint: 'Episode offset calculation, e.g., -10 or EP*2',
episodeOffsetPlaceholder: 'e.g., -10',
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: 'Minimum File Size (MB)',
minFileSizeHint: 'Only reorganize files larger than the minimum file size',
typeFolderOption: 'Categorize by Type',
typeFolderHint: 'Add subdirectories by media type in the target path during reorganization',
categoryFolderOption: 'Categorize by Category',
categoryFolderHint: 'Add subdirectories by media category in the target path during reorganization',
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 reorganization',
scrapeHint: 'Automatically scrape metadata after organization',
fromHistoryOption: 'Reuse Historical Recognition Info',
fromHistoryHint: 'Use media information recognized in historical reorganization records',
addToQueue: 'Add to Queue',
reorganizeNow: 'Reorganize Now',
fromHistoryHint: 'Use media info already recognized in historical organization records',
addToQueue: 'Add to Organization Queue',
reorganizeNow: 'Organize Now',
auto: 'Auto',
processing: 'Processing ...',
successMessage: 'File {name} has been added to the reorganization queue!',
successMessage: 'File {name} has been added to the organization queue!',
},
subscribeEdit: {
titleDefault: 'Default Subscription Rule',
titleDefault: 'Default Subscription Rules',
titleEditFormat: 'Edit Subscription - {name} {season}',
seasonFormat: 'Season {number}',
tabs: {
basic: 'Basic',
advance: 'Advanced',
},
searchKeyword: 'Search Keyword',
searchKeywordHint: 'Keyword used when searching sites',
searchKeyword: 'Search Keywords',
searchKeywordHint: 'Specify keywords used when searching sites',
totalEpisode: 'Total Episodes',
totalEpisodeHint: 'Total number of episodes',
startEpisode: 'Start Episode',
startEpisodeHint: 'Episode number to start subscription',
startEpisodeHint: 'Starting episode number to subscribe',
quality: 'Quality',
qualityHint: 'Resource quality for subscription',
qualityHint: 'Subscription resource quality',
resolution: 'Resolution',
resolutionHint: 'Resource resolution for subscription',
effect: 'Effect',
effectHint: 'Resource effect for subscription',
subscribeSites: 'Subscribe Sites',
subscribeSitesHint: 'Sites to subscribe from, use system settings if none selected',
resolutionHint: 'Subscription resource resolution',
effect: 'Effects',
effectHint: 'Subscription resource effects',
subscribeSites: 'Subscription Sites',
subscribeSitesHint: 'Range of sites for subscription, use system settings if none selected',
downloader: 'Downloader',
downloaderHint: 'Specify which downloader to use for this subscription',
downloaderHint: 'Specify downloader for this subscription',
savePath: 'Save Path',
savePathHint: 'Specify download path for this subscription, leave empty to use default directories',
savePathHint: 'Specify download save path for this subscription, leave empty to use default download directory',
bestVersion: 'Version Upgrade',
bestVersionHint: 'Enable version upgrade based on priority',
searchImdbid: 'Use ImdbID Search',
bestVersionHint: 'Perform version upgrade subscription based on upgrade priorities',
searchImdbid: 'Search Using ImdbID',
searchImdbidHint: 'Use ImdbID for precise resource searching',
showEditDialog: 'Edit More Rules When Subscribing',
showEditDialogHint: 'Show this edit dialog when adding subscription',
showEditDialogHint: 'Show this edit subscription dialog when adding subscription',
include: 'Include (Keywords, Regex)',
includeHint: 'Include rules, supports regex',
includeHint: 'Include rules, supports regular expressions',
exclude: 'Exclude (Keywords, Regex)',
excludeHint: 'Exclude rules, supports regex',
excludeHint: 'Exclude rules, supports regular expressions',
filterGroups: 'Priority Rule Groups',
filterGroupsHint: 'Filter subscription based on selected rule groups',
episodeGroup: 'Episode Group',
episodeGroupHint: 'Recognize and scrape based on specific episode group',
season: 'Season',
seasonHint: 'Specify season for subscription',
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, auto-detect if empty',
mediaCategoryHint: 'Specify category name, leave empty for auto-recognition',
customWords: 'Custom Recognition Words',
customWordsHint: 'Recognition words only for this subscription',
customWordsPlaceholder:
'Filter word\nReplaced word => Replacement\nFront position word <> Back position word >> Episode offset (EP)\nReplaced word => Replacement && Front position word <> Back position word >> Episode offset (EP)\nReplacement format: {[tmdbid/doubanid=xxx;type=movie/tv;s=xxx;e=xxx]} to specify TMDBID/Douban ID, where s and e are season and episode (optional)',
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: &#123; tmdbid/doubanid=xxx;type=movie/tv;s=xxx;e=xxx &#125; to directly specify TMDBID/Douban ID recognition, where s, e are season and episode numbers (optional)',
cancelSubscribe: 'Cancel Subscription',
cancelSubscribeConfirm: 'Are you sure you want to cancel this subscription?',
save: 'Save',
cancelSubscribeConfirm: 'Are you sure you want to cancel the subscription?',
},
subscribeFiles: {
title: 'Downloaded Files',
noFilesMessage: 'No files',
close: 'Close',
downloadTab: 'Downloaded Files',
downloadTab: 'Download Files',
libraryTab: 'Media Library Files',
episodeColumn: 'Episode',
torrentColumn: 'Torrent',
@@ -1262,28 +1275,136 @@ export default {
msgCount: 'Unread Messages',
inviteCount: 'Invites',
bonus: 'Bonus Points',
ratio: 'Share Ratio',
ratio: 'Ratio',
joinTime: 'Join Time',
trafficHistory: 'Traffic History',
seedingDistribution: 'Seeding Distribution',
volumeTitle: 'Volume',
countTitle: 'Count: ',
countTitle: 'Count:',
noData: 'None',
refreshing: 'Refreshing site data...',
close: 'Close',
},
siteResource: {
title: 'Site Resources',
searchHint: 'Search Resources',
searchHint: 'Search resources',
close: 'Close',
},
forkSubscribe: {
title: 'Fork Subscription',
selectSubscriber: 'Select Target User',
overwriteExisting: 'Overwrite Existing',
overwriteExistingHint: 'Whether to overwrite if the target user already has this subscription',
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',
createFolder: 'Create Folder',
fileName: 'Filename',
fileSize: 'File Size',
fileType: 'File Type',
lastModified: 'Last Modified',
actions: 'Actions',
rename: 'Rename',
delete: 'Delete',
confirmDelete: 'Confirm Delete',
upload: 'Upload',
download: 'Download',
preview: 'Preview',
selectAll: 'Select All',
deselectAll: 'Deselect All',
moveUp: 'Go Up',
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',
},
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',
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}',
uninstalling: 'Uninstalling {name} ...',
uninstallSuccess: 'Plugin {name} uninstalled successfully!',
uninstallFailed: 'Plugin {name} uninstallation failed: {message}',
updating: 'Updating {name} to v{version} ...',
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',
},
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 User',
telegramUser: 'Telegram User',
slackUser: 'Slack User',
vocechatUser: 'VoceChat User',
synologychatUser: 'SynologyChat User',
doubanUser: 'Douban User',
twoFactorAuthentication: 'Two-Factor Authentication',
enableTwoFactor: 'Enable Two-Factor Authentication',
disableTwoFactor: 'Disable Two-Factor Authentication',
otpGenerateFailed: 'Failed to get OTP URI: {message}!',
otpDisableSuccess: 'Two-factor authentication disabled successfully!',
otpDisableFailed: 'Failed to disable OTP: {message}!',
otpCodeRequired: 'Please enter the 6-digit verification code',
otpEnableSuccess: 'Two-factor authentication enabled successfully!',
otpEnableFailed: 'Failed to enable OTP: {message}!',
authenticatorApp: 'Authenticator App',
authenticatorAppDescription: 'Use an authenticator app like Google Authenticator, Microsoft Authenticator, Authy, or 1Password to scan the QR code. It will generate a 6-digit code for you to enter below.',
secretKeyTip: 'If you\'re having trouble with the QR code, select manual entry in your app and enter the code above.',
enterVerificationCode: 'Enter verification code to confirm enabling two-factor authentication',
avatarFormatTip: 'JPG, PNG, GIF, WEBP formats allowed, maximum size 800KB.',
},
}

View File

@@ -17,6 +17,10 @@ export default {
noContent: '没有找到相关内容',
all: '全部',
default: '默认',
name: '名称',
create: '新建',
saving: '保存中',
reset: '重置',
},
theme: {
light: '浅色',
@@ -161,6 +165,20 @@ export default {
siteAuth: '用户认证',
helpDocs: '帮助文档',
restart: '重启',
management: '用户管理',
noUsers: '没有用户',
clickToAddUser: '点击添加用户卡片添加用户',
addUser: '添加用户',
editUser: '编辑用户',
username: '用户名',
password: '密码',
confirmPassword: '确认密码',
role: '角色',
email: '邮箱',
enabled: '启用',
disabled: '禁用',
status: '状态',
operations: '操作',
},
nav: {
more: '更多',
@@ -1187,7 +1205,7 @@ export default {
customWords: '自定义识别词',
customWordsHint: '只对该订阅使用的识别词',
customWordsPlaceholder:
'屏蔽词\n被替换词 => 替换词\n前定位词 <> 后定位词 >> 集偏移量EP\n被替换词 => 替换词 && 前定位词 <> 后定位词 >> 集偏移量EP\n其中替换词支持格式{[tmdbid/doubanid=xxx;type=movie/tv;s=xxx;e=xxx]} 直接指定TMDBID/豆瓣ID识别其中s、e为季数和集数可选',
'屏蔽词\n被替换词 => 替换词\n前定位词 <> 后定位词 >> 集偏移量EP\n被替换词 => 替换词 && 前定位词 <> 后定位词 >> 集偏移量EP\n其中替换词支持格式&#123; tmdbid/doubanid=xxx;type=movie/tv;s=xxx;e=xxx &#125; 直接指定TMDBID/豆瓣ID识别其中s、e为季数和集数可选',
cancelSubscribe: '取消订阅',
save: '保存',
cancelSubscribeConfirm: '是否确认取消订阅?',
@@ -1264,4 +1282,113 @@ export default {
cancel: '取消',
},
},
file: {
newFolder: '新建文件夹',
createFolder: '创建文件夹',
fileName: '文件名',
fileSize: '文件大小',
fileType: '文件类型',
lastModified: '修改时间',
actions: '操作',
rename: '重命名',
delete: '删除',
confirmDelete: '确认删除',
upload: '上传',
download: '下载',
preview: '预览',
selectAll: '全选',
deselectAll: '取消全选',
moveUp: '返回上一级',
sortByName: '按名称排序',
sortByTime: '按时间排序',
currentName: '当前名称',
newName: '新名称',
includeSubfolders: '自动重命名目录内所有媒体文件',
emptyFolder: '空文件夹',
noFilesInFolder: '该文件夹内没有文件',
autoRecognize: '自动识别名称',
directoryTree: '目录树',
rootDirectory: '根目录',
noDirectories: '没有可用的目录',
},
person: {
alias: '别名:',
credits: '参演作品',
biography: '个人简介',
birthday: '出生日期',
placeOfBirth: '出生地',
},
error: {
title: '出错啦!',
networkError: '无法获取到媒体信息,请检查网络连接。',
serverError: '服务器错误,请稍后重试。',
notFound: '找不到请求的资源。',
},
plugin: {
sort: {
popular: '热门',
name: '插件名称',
author: '作者',
repository: '插件仓库',
latest: '最新发布',
},
installingPlugin: '正在安装插件...',
installing: '正在安装 {name} v{version} ...',
installSuccess: '插件 {name} 安装成功!',
installFailed: '插件 {name} 安装失败:{message}',
uninstalling: '正在卸载 {name} ...',
uninstallSuccess: '插件 {name} 卸载成功!',
uninstallFailed: '插件 {name} 卸载失败:{message}',
updating: '正在更新 {name} 至 v{version} ...',
updateSuccess: '插件 {name} 更新成功!',
updateFailed: '插件 {name} 更新失败:{message}',
noPlugins: '没有安装插件',
installed: '已安装',
notInstalled: '未安装',
hasUpdate: '有更新',
configuring: '配置',
enable: '启用',
disable: '禁用',
settings: '设置',
},
profile: {
personalInfo: '个人信息',
uploadNewAvatar: '上传新头像',
avatarFormatError: '上传的文件不符合要求,请重新选择头像',
avatarSizeError: '文件大小不得大于800KB',
avatarUploadSuccess: '新头像上传成功,待保存后生效!',
resetAvatarSuccess: '已重置为默认头像,待保存后生效!',
restoreAvatarSuccess: '已还原当前使用头像!',
savingInProgress: '正在保存中,请稍后...',
usernameRequired: '用户名不能为空',
passwordMismatch: '两次输入的密码不一致',
usernameChangeSuccess: '【{oldName}】更名【{newName}】,用户信息保存成功!',
saveSuccess: '用户信息保存成功!',
saveFailedWithNameChange: '【{oldName}】更名【{newName}】,信息保存失败:{message}',
saveFailed: '用户信息保存失败:{message}',
nickname: '昵称',
nicknamePlaceholder: '显示昵称,优先于用户名显示',
accountBinding: '账号绑定',
wechatUser: '微信用户',
telegramUser: 'Telegram用户',
slackUser: 'Slack用户',
vocechatUser: 'VoceChat用户',
synologychatUser: 'SynologyChat用户',
doubanUser: '豆瓣用户',
twoFactorAuthentication: '登录双重验证',
enableTwoFactor: '开启双重验证',
disableTwoFactor: '关闭双重验证',
otpGenerateFailed: '获取otp uri失败{message}',
otpDisableSuccess: '关闭登录双重验证成功!',
otpDisableFailed: '关闭otp失败{message}',
otpCodeRequired: '请填写6位验证码',
otpEnableSuccess: '开启登录双重验证成功!',
otpEnableFailed: '开启otp失败{message}',
authenticatorApp: '身份验证器',
authenticatorAppDescription:
'使用像Google Authenticator、Microsoft Authenticator、Authy或1Password这样的身份验证器应用程序扫描二维码。它将为您生成一个6位数的代码供您在下方输入。',
secretKeyTip: '如果您在使用二维码时遇到困难,请在您的应用程序中选择手动输入以上代码。',
enterVerificationCode: '输入验证码以确认开启双重验证',
avatarFormatTip: '允许 JPG、PNG、GIF、WEBP 格式, 最大尺寸 800KB。',
},
}