From 71787ece6441f32e991cf941d73047f8c6eca8ed Mon Sep 17 00:00:00 2001 From: jxxghp Date: Sun, 27 Apr 2025 22:19:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=9B=BD=E9=99=85=E5=8C=96?= =?UTF-8?q?=E6=94=AF=E6=8C=81=EF=BC=9A=E5=9C=A8=E5=A4=9A=E4=B8=AA=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E4=B8=AD=E5=BC=95=E5=85=A5=20vue-i18n=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=87=E6=9C=AC=E7=BF=BB=E8=AF=91=E5=92=8C?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/en-US.ts | 89 ++++++---- src/locales/zh-CN.ts | 168 ++++++++++-------- src/views/setting/AccountSettingAbout.vue | 4 +- src/views/setting/AccountSettingDirectory.vue | 35 ++-- .../setting/AccountSettingNotification.vue | 10 +- src/views/setting/AccountSettingRule.vue | 80 +++++---- src/views/setting/AccountSettingScheduler.vue | 34 ++-- src/views/setting/AccountSettingSearch.vue | 41 +++-- src/views/setting/AccountSettingSubscribe.vue | 71 ++++---- src/views/setting/AccountSettingSystem.vue | 10 +- 10 files changed, 298 insertions(+), 244 deletions(-) diff --git a/src/locales/en-US.ts b/src/locales/en-US.ts index a0fdca28..1d4198fe 100644 --- a/src/locales/en-US.ts +++ b/src/locales/en-US.ts @@ -387,6 +387,7 @@ export default { currentVersion: 'Current Version', viewChangelog: 'View Changelog', changelog: 'Changelog', + dataDirectory: '/moviepilot', }, system: { basicSettings: 'Basic Settings', @@ -439,6 +440,11 @@ export default { copyFailed: 'Copy failed: browser may not support or user blocked!', copyError: 'Copy failed!', reloading: 'Applying configuration...', + qbittorrent: 'Qbittorrent', + transmission: 'Transmission', + emby: 'Emby', + jellyfin: 'Jellyfin', + plex: 'Plex', }, site: { siteSync: 'Site Synchronization', @@ -517,6 +523,11 @@ export default { manualProcess: 'Manual Process', plugin: 'Plugin', other: 'Other', + telegram: 'Telegram', + slack: 'Slack', + synologyChat: 'SynologyChat', + voceChat: 'VoceChat', + webPush: 'WebPush', }, words: { customIdentifiers: 'Custom Identifiers', @@ -586,11 +597,16 @@ export default { downloadUser: 'Remote Search Auto Download User List', downloadUserHint: 'Whether to automatically download when searching with Telegram, WeChat, etc., comma separated, set to all to represent all users auto-download', + downloadUserPlaceholder: 'UserID1,UserID2', 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', + downloadLabelPlaceholder: 'MOVIEPILOT', }, directory: { storage: 'Storage', @@ -620,24 +636,29 @@ export default { priorityRuleGroups: 'Priority Rule Groups', priorityRuleGroupsDesc: 'Preset priority rule groups for use in search and subscription.', downloadRules: 'Download Rules', - downloadRulesDesc: 'Prioritize downloads when multiple resources match.', + 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', - saveSuccess: 'Custom rules saved successfully', - saveFailed: 'Failed to save custom rules!', - groupSaveSuccess: 'Priority rule groups saved successfully', - groupSaveFailed: 'Failed to save priority rule groups!', - prioritySaveSuccess: 'Priority rules saved successfully', - prioritySaveFailed: 'Failed to save priority rules!', - emptyRuleId: 'Rules with empty IDs exist! Cannot save, please modify!', - emptyRuleName: 'Rules with empty names exist! Cannot save, please modify!', - duplicateRuleId: 'Duplicate rule IDs exist! Cannot save, please modify!', - duplicateRuleName: 'Duplicate rule names exist! Cannot save, please modify!', - emptyGroupName: 'Rule groups with empty names exist! Cannot save, please modify!', - duplicateGroupName: 'Duplicate rule group names exist! Cannot save, please modify!', - copySuccess: 'Copied to clipboard!', - copyFailed: 'Copy failed: browser may not support or user blocked!', - copyError: 'Copy failed!', importCustomRules: 'Import Custom Rules', importRuleGroups: 'Import Priority Rule Groups', importFailed: 'Failed to import rules! Cannot parse input data!', @@ -645,33 +666,27 @@ export default { 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!', - torrentPriority: { - torrent: 'Resource Priority', - site: 'Site Priority', - upload: 'Site Upload Amount', - seeder: 'Resource Seeders', - }, }, scheduler: { - scheduledTasks: 'Scheduled Tasks', - scheduledTasksDesc: - 'Includes system built-in services and plugin-provided services. Manual execution will not affect the normal schedule of tasks.', + title: 'Scheduled Jobs', + subtitle: + "Includes built-in system services and plugin services. Manual execution will not affect the job's normal schedule.", provider: 'Provider', taskName: 'Task Name', taskStatus: 'Task Status', nextRunTime: 'Next Run Time', execute: 'Execute', - noServices: 'No background services', - submitSuccess: 'Task execution request submitted successfully!', - status: { - running: 'Running', - stopped: 'Stopped', - waiting: 'Waiting', - }, + noService: 'No background services', + running: 'Running', + stopped: 'Stopped', + waiting: 'Waiting', + executeSuccess: 'Scheduled job execution request submitted successfully!', }, 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', @@ -684,12 +699,6 @@ export default { timedSearchHint: 'Search all sites every 24 hours to supplement resources that may be missed by subscription', checkLocalMedia: 'Check Local Media Library', checkLocalMediaHint: 'Check if resources exist on storage disk to avoid duplicate downloads', - subscribeSites: 'Subscription Sites', - subscribeSitesDesc: 'Only selected sites will be used in subscription.', - saveSuccess: 'Subscription sites saved successfully', - saveFailed: 'Failed to save subscription sites!', - settingsSaveSuccess: 'Subscription basic settings saved successfully', - settingsSaveFailed: 'Failed to save subscription basic settings!', modes: { auto: 'Auto', rss: 'Site RSS', @@ -703,6 +712,10 @@ export default { hour12: '12 hours', day1: '1 day', }, + saveSuccess: 'Subscription sites saved successfully', + saveFailed: 'Failed to save subscription sites!', + settingsSaveSuccess: 'Subscription basic settings saved successfully', + settingsSaveFailed: 'Failed to save subscription basic settings!', }, }, } diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 4b36e3ce..e8544e05 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -326,47 +326,6 @@ export default { site: { noSites: '没有站点', sitesWillBeShownHere: '已添加并支持的站点将会在这里显示。', - siteSync: '站点同步', - siteSyncDesc: '从CookieCloud快速同步站点数据。', - enableLocalCookieCloud: '启用本地CookieCloud服务器', - enableLocalCookieCloudHint: '使用内建CookieCloud服务同步站点数据,服务地址为:http://localhost:3000/cookiecloud', - serviceAddress: '服务地址', - serviceAddressPlaceholder: 'https://movie-pilot.org/cookiecloud', - serviceAddressHint: '远端CookieCloud服务地址,格式:https://movie-pilot.org/cookiecloud', - userKey: '用户KEY', - userKeyHint: 'CookieCloud浏览器插件生成的用户KEY', - e2ePassword: '端对端加密密码', - e2ePasswordHint: 'CookieCloud浏览器插件生成的端对端加密密码', - autoSyncInterval: '自动同步间隔', - autoSyncIntervalHint: '从CookieCloud服务器自动同步站点Cookie到MoviePilot的时间间隔', - syncBlacklist: '同步域名黑名单', - syncBlacklistPlaceholder: '多个域名,分割', - syncBlacklistHint: 'CookieCloud同步域名黑名单,多个域名,分割', - userAgent: '浏览器User-Agent', - userAgentHint: 'CookieCloud插件所在的浏览器的User-Agent', - siteDataRefresh: '站点数据刷新', - siteDataRefreshInterval: '站点数据刷新间隔', - siteDataRefreshIntervalHint: '刷新站点用户上传下载等数据的时间间隔', - readSiteMessage: '阅读站点消息', - readSiteMessageHint: '刷新数据时读取站点消息并发送通知', - siteReset: '站点重置', - confirmReset: '确认删除所有站点数据并重新同步。', - confirmResetHint: '删除所有站点数据并重新从CookieCloud同步,操作请先清空涉及站点的相关设置。', - resetSites: '重置站点数据', - resettingSites: '正在重置...', - syncInterval: { - hourly: '每小时', - every6Hours: '每6小时', - every12Hours: '每12小时', - daily: '每天', - weekly: '每周', - monthly: '每月', - never: '永不', - }, - saveSuccess: '保存站点设置成功', - saveFailed: '站点设置保存失败!', - resetSuccess: '站点重置成功,请等待CookieCloud同步完成!', - resetFailed: '站点重置失败!', }, message: { loadMore: '加载更多', @@ -426,6 +385,7 @@ export default { currentVersion: '当前版本', viewChangelog: '查看变更日志', changelog: '变更日志', + dataDirectory: '/moviepilot', }, system: { basicSettings: '基础设置', @@ -478,6 +438,54 @@ export default { copyFailed: '复制失败:可能是浏览器不支持或被用户阻止!', copyError: '复制失败!', reloading: '正在应用配置...', + qbittorrent: 'Qbittorrent', + transmission: 'Transmission', + emby: 'Emby', + jellyfin: 'Jellyfin', + plex: 'Plex', + }, + site: { + siteSync: '站点同步', + siteSyncDesc: '从CookieCloud快速同步站点数据。', + enableLocalCookieCloud: '启用本地CookieCloud服务器', + enableLocalCookieCloudHint: '使用内建CookieCloud服务同步站点数据,服务地址为:http://localhost:3000/cookiecloud', + serviceAddress: '服务地址', + serviceAddressPlaceholder: 'https://movie-pilot.org/cookiecloud', + serviceAddressHint: '远端CookieCloud服务地址,格式:https://movie-pilot.org/cookiecloud', + userKey: '用户KEY', + userKeyHint: 'CookieCloud浏览器插件生成的用户KEY', + e2ePassword: '端对端加密密码', + e2ePasswordHint: 'CookieCloud浏览器插件生成的端对端加密密码', + autoSyncInterval: '自动同步间隔', + autoSyncIntervalHint: '从CookieCloud服务器自动同步站点Cookie到MoviePilot的时间间隔', + syncBlacklist: '同步域名黑名单', + syncBlacklistPlaceholder: '多个域名,分割', + syncBlacklistHint: 'CookieCloud同步域名黑名单,多个域名,分割', + userAgent: '浏览器User-Agent', + userAgentHint: 'CookieCloud插件所在的浏览器的User-Agent', + siteDataRefresh: '站点数据刷新', + siteDataRefreshInterval: '站点数据刷新间隔', + siteDataRefreshIntervalHint: '刷新站点用户上传下载等数据的时间间隔', + readSiteMessage: '阅读站点消息', + readSiteMessageHint: '刷新数据时读取站点消息并发送通知', + siteReset: '站点重置', + confirmReset: '确认删除所有站点数据并重新同步。', + confirmResetHint: '删除所有站点数据并重新从CookieCloud同步,操作请先清空涉及站点的相关设置。', + resetSites: '重置站点数据', + resettingSites: '正在重置...', + syncInterval: { + hourly: '每小时', + every6Hours: '每6小时', + every12Hours: '每12小时', + daily: '每天', + weekly: '每周', + monthly: '每月', + never: '永不', + }, + saveSuccess: '保存站点设置成功', + saveFailed: '站点设置保存失败!', + resetSuccess: '站点重置成功,请等待CookieCloud同步完成!', + resetFailed: '站点重置失败!', }, notification: { channels: '通知渠道', @@ -510,6 +518,11 @@ export default { manualProcess: '手动处理', plugin: '插件', other: '其它', + telegram: 'Telegram', + slack: 'Slack', + synologyChat: 'SynologyChat', + voceChat: 'VoceChat', + webPush: 'WebPush', }, words: { customIdentifiers: '自定义识别词', @@ -572,12 +585,16 @@ export default { tvCategory: '电视剧', animeCategory: '动漫', downloadUser: '远程搜索自动下载用户', - downloadUserHint: - '使用Telegram、微信等远程搜索时是否自动下载,多个用户使用英文逗号分隔,设置为all代表所有用户自动下载', multipleNameSearch: '多名称资源搜索', multipleNameSearchHint: '使用多个名称(中文、英文等)搜索站点资源并合并搜索结果,会增加站点访问频率', downloadSubtitle: '下载站点字幕', downloadSubtitleHint: '检查站点资源是否有单独的字幕文件并自动下载', + mediaSource: '媒体搜索数据源', + mediaSourceHint: '搜索媒体信息时使用的数据源以及排序', + filterRuleGroupHint: '搜索媒体信息时按选定的过滤规则组对结果进行过滤', + downloadUserPlaceholder: '用户ID1,用户ID2', + downloadUserHint: '使用Telegram、微信等搜索时是否自动下载,使用逗号分割,设置为 all 代表所有用户自动择优下载', + downloadLabelPlaceholder: 'MOVIEPILOT', }, directory: { storage: '存储', @@ -607,23 +624,28 @@ export default { priorityRuleGroupsDesc: '预设优先级规则组,以便在搜索和订阅中使用。', downloadRules: '下载规则', downloadRulesDesc: '同时命中多个资源时择优下载。', + resourcePriority: '资源优先级', + sitePriority: '站点优先级', + siteUpload: '站点上传量', + resourceSeeder: '资源做种数', + emptyIdError: '存在空ID的规则,无法保存,请修改!', + emptyNameError: '存在空名字的规则,无法保存,请修改!', + duplicateIdError: '存在重复规则ID!无法保存,请修改!', + duplicateNameError: '存在重复规则名称!无法保存,请修改!', + customRuleSaveSuccess: '自定义规则保存成功', + customRuleSaveFailed: '自定义规则保存失败!', + emptyGroupNameError: '存在空名字的规则组!无法保存,请修改!', + duplicateGroupNameError: '存在重复规则组名称!无法保存,请修改!', + ruleGroupSaveSuccess: '优先级规则组保存成功', + ruleGroupSaveFailed: '优先级规则组保存失败!', + customRuleCopySuccess: '自定义规则已复制到剪贴板!', + customRuleCopyFailed: '自定义规则复制失败:可能是浏览器不支持或被用户阻止!', + customRuleCopyError: '自定义规则复制失败!', + ruleGroupCopySuccess: '优先级规则组已复制到剪贴板!', + ruleGroupCopyFailed: '优先级规则组复制失败:可能是浏览器不支持或被用户阻止!', + ruleGroupCopyError: '优先级规则组复制失败!', currentPriorityRules: '当前使用下载优先规则', currentPriorityRulesHint: '排在前面的优先级越高,未选择的项不纳入排序', - saveSuccess: '自定义规则保存成功', - saveFailed: '自定义规则保存失败!', - groupSaveSuccess: '优先级规则组保存成功', - groupSaveFailed: '优先级规则组保存失败!', - prioritySaveSuccess: '优先规则保存成功', - prioritySaveFailed: '优先规则保存失败!', - emptyRuleId: '存在空ID的规则,无法保存,请修改!', - emptyRuleName: '存在空名字的规则,无法保存,请修改!', - duplicateRuleId: '存在重复规则ID!无法保存,请修改!', - duplicateRuleName: '存在重复规则名称!无法保存,请修改!', - emptyGroupName: '存在空名字的规则组!无法保存,请修改!', - duplicateGroupName: '存在重复规则组名称!无法保存,请修改!', - copySuccess: '已复制到剪贴板!', - copyFailed: '复制失败:可能是浏览器不支持或被用户阻止!', - copyError: '复制失败!', importCustomRules: '导入自定义规则', importRuleGroups: '导入优先级规则组', importFailed: '导入规则失败!无法解析输入的数据!', @@ -631,12 +653,6 @@ export default { duplicateValue: '存在重名值', importNoId: '导入失败!发现有规则不存在ID,可能属于优先级规则组!', importHasId: '导入失败!发现有规则存在相同ID,可能属于自定义规则!', - torrentPriority: { - torrent: '资源优先级', - site: '站点优先级', - upload: '站点上传量', - seeder: '资源做种数', - }, }, scheduler: { scheduledTasks: '定时作业', @@ -646,17 +662,17 @@ export default { taskStatus: '任务状态', nextRunTime: '下一次执行时间', execute: '执行', - noServices: '没有后台服务', - submitSuccess: '定时作业执行请求提交成功!', - status: { - running: '正在运行', - stopped: '已停止', - waiting: '等待', - }, + noService: '没有后台服务', + running: '正在运行', + stopped: '已停止', + waiting: '等待', + executeSuccess: '定时作业执行请求提交成功!', }, subscribe: { basicSettings: '基础设置', basicSettingsDesc: '设定订阅模式、周期等基础设置', + subscribeSites: '订阅站点', + subscribeSitesDesc: '只有选中的站点才会在订阅中使用。', mode: '订阅模式', modeHint: '自动:自动爬取站点首页,站点RSS:通过站点RSS链接订阅', rssInterval: '站点RSS周期', @@ -669,12 +685,6 @@ export default { timedSearchHint: '每隔24小时全站搜索,以补全订阅可能漏掉的资源', checkLocalMedia: '检查本地媒体库资源', checkLocalMediaHint: '检查存储盘是否存在资源,以避免重复下载', - subscribeSites: '订阅站点', - subscribeSitesDesc: '只有选中的站点才会在订阅中使用。', - saveSuccess: '订阅站点保存成功', - saveFailed: '订阅站点保存失败!', - settingsSaveSuccess: '订阅基础设置保存成功', - settingsSaveFailed: '订阅基础设置保存失败!', modes: { auto: '自动', rss: '站点RSS', @@ -688,6 +698,10 @@ export default { hour12: '12小时', day1: '1天', }, + saveSuccess: '订阅站点保存成功', + saveFailed: '订阅站点保存失败!', + settingsSaveSuccess: '订阅基础设置保存成功', + settingsSaveFailed: '订阅基础设置保存失败!', }, }, } diff --git a/src/views/setting/AccountSettingAbout.vue b/src/views/setting/AccountSettingAbout.vue index 700bfa19..0b6cf126 100644 --- a/src/views/setting/AccountSettingAbout.vue +++ b/src/views/setting/AccountSettingAbout.vue @@ -140,7 +140,9 @@ onMounted(() => {
{{ t('setting.about.dataDir') }}
- /moviepilot + {{ t('setting.about.dataDirectory') }}
diff --git a/src/views/setting/AccountSettingDirectory.vue b/src/views/setting/AccountSettingDirectory.vue index f1ae91b4..adc39862 100644 --- a/src/views/setting/AccountSettingDirectory.vue +++ b/src/views/setting/AccountSettingDirectory.vue @@ -8,6 +8,9 @@ import { TransferDirectoryConf, StorageConf } from '@/api/types' import DirectoryCard from '@/components/cards/DirectoryCard.vue' import StorageCard from '@/components/cards/StorageCard.vue' import ProgressDialog from '@/components/dialog/ProgressDialog.vue' +import { useI18n } from 'vue-i18n' + +const { t } = useI18n() // 所有下载目录 const directories = ref([]) @@ -195,8 +198,8 @@ onMounted(() => { - 存储 - 设置本地或网盘存储。 + {{ t('setting.directory.storage') }} + {{ t('setting.directory.storageDesc') }} {
- 保存 + {{ t('common.save') }}
@@ -225,8 +228,8 @@ onMounted(() => { - 目录 - 设置媒体文件整理目录结构,按先后顺序依次匹配。 + {{ t('setting.directory.directory') }} + {{ t('setting.directory.directoryDesc') }} {
- 保存 + {{ t('common.save') }} @@ -264,8 +267,8 @@ onMounted(() => { - 整理 & 刮削 - 设置重命名格式、刮削选项等。 + {{ t('setting.directory.organizeAndScrap') }} + {{ t('setting.directory.organizeAndScrapDesc') }} @@ -273,16 +276,16 @@ onMounted(() => { { {
- 保存 + {{ t('common.save') }}
@@ -311,5 +314,5 @@ onMounted(() => {
- + diff --git a/src/views/setting/AccountSettingNotification.vue b/src/views/setting/AccountSettingNotification.vue index 95180f69..7fbd154b 100644 --- a/src/views/setting/AccountSettingNotification.vue +++ b/src/views/setting/AccountSettingNotification.vue @@ -216,19 +216,19 @@ onMounted(() => { {{ t('setting.notification.wechat') }} - Telegram + {{ t('setting.notification.telegram') }} - Slack + {{ t('setting.notification.slack') }} - SynologyChat + {{ t('setting.notification.synologyChat') }} - VoceChat + {{ t('setting.notification.voceChat') }} - WebPush + {{ t('setting.notification.webPush') }} diff --git a/src/views/setting/AccountSettingRule.vue b/src/views/setting/AccountSettingRule.vue index 82604154..3f95e3dd 100644 --- a/src/views/setting/AccountSettingRule.vue +++ b/src/views/setting/AccountSettingRule.vue @@ -8,6 +8,10 @@ import { CustomRule, FilterRuleGroup } from '@/api/types' import CustomerRuleCard from '@/components/cards/CustomRuleCard.vue' import FilterRuleGroupCard from '@/components/cards/FilterRuleGroupCard.vue' import ImportCodeDialog from '@/components/dialog/ImportCodeDialog.vue' +import { useI18n } from 'vue-i18n' + +// 国际化 +const { t } = useI18n() // 自定义规则列表 const customRules = ref([]) @@ -32,10 +36,10 @@ const $toast = useToast() // 种子优先规则下拉框 const TorrentPriorityItems = [ - { title: '资源优先级', value: 'torrent' }, - { title: '站点优先级', value: 'site' }, - { title: '站点上传量', value: 'upload' }, - { title: '资源做种数', value: 'seeder' }, + { title: t('setting.rule.resourcePriority'), value: 'torrent' }, + { title: t('setting.rule.sitePriority'), value: 'site' }, + { title: t('setting.rule.siteUpload'), value: 'upload' }, + { title: t('setting.rule.resourceSeeder'), value: 'seeder' }, ] // 调用API查询自动分类配置 @@ -51,12 +55,12 @@ async function loadMediaCategories() { async function saveCustomRules() { // 检查是否存在空id规则 if (customRules.value.some(item => !item.id)) { - $toast.error('存在空ID的规则,无法保存,请修改!') + $toast.error(t('setting.rule.emptyIdError')) return } // 检查是否存在空的规则名称 if (customRules.value.some(item => !item.name)) { - $toast.error('存在空名字的规则,无法保存,请修改!') + $toast.error(t('setting.rule.emptyNameError')) return } // 获取所有规则ID和名称 @@ -64,18 +68,18 @@ async function saveCustomRules() { const names = customRules.value.map(item => item.name) // 检查是否存在重名的规则ID if (new Set(ids).size !== ids.length) { - $toast.error('存在重复规则ID!无法保存,请修改!') + $toast.error(t('setting.rule.duplicateIdError')) return } // 检查是否存在重名规则名称 if (new Set(names).size !== names.length) { - $toast.error('存在重复规则名称!无法保存,请修改!') + $toast.error(t('setting.rule.duplicateNameError')) return } try { const result: { [key: string]: any } = await api.post('system/setting/CustomFilterRules', customRules.value) - if (result.success) $toast.success('自定义规则保存成功') - else $toast.error('自定义规则保存失败!') + if (result.success) $toast.success(t('setting.rule.customRuleSaveSuccess')) + else $toast.error(t('setting.rule.customRuleSaveFailed')) } catch (error) { console.log(error) } @@ -117,19 +121,19 @@ async function queryFilterRuleGroups() { async function saveFilterRuleGroups() { // 检查是否存在空的规则组名称 if (filterRuleGroups.value.some(item => !item.name)) { - $toast.error('存在空名字的规则组!无法保存,请修改!') + $toast.error(t('setting.rule.emptyGroupNameError')) return } // 检查是否存在重名规则组 const names = filterRuleGroups.value.map(item => item.name) if (new Set(names).size !== names.length) { - $toast.error('存在重复规则组名称!无法保存,请修改!') + $toast.error(t('setting.rule.duplicateGroupNameError')) return } try { const result: { [key: string]: any } = await api.post('system/setting/UserFilterRuleGroups', filterRuleGroups.value) - if (result.success) $toast.success('优先级规则组保存成功') - else $toast.error('优先级规则组保存失败!') + if (result.success) $toast.success(t('setting.rule.ruleGroupSaveSuccess')) + else $toast.error(t('setting.rule.ruleGroupSaveFailed')) } catch (error) { console.log(error) } @@ -157,10 +161,14 @@ async function shareRules(rules: CustomRule[] | FilterRuleGroup[], type: string) try { let success success = copyToClipboard(value) - if (await success) $toast.success(`${type === 'custom' ? '自定义规则' : '优先级规则组'}已复制到剪贴板!`) - else $toast.error(`${type === 'custom' ? '自定义规则' : '优先级规则组'}复制失败:可能是浏览器不支持或被用户阻止!`) + if (await success) + $toast.success( + type === 'custom' ? t('setting.rule.customRuleCopySuccess') : t('setting.rule.ruleGroupCopySuccess'), + ) + else + $toast.error(type === 'custom' ? t('setting.rule.customRuleCopyFailed') : t('setting.rule.ruleGroupCopyFailed')) } catch (e) { - $toast.error(`${type === 'custom' ? '自定义规则' : '优先级规则组'}复制失败!`) + $toast.error(type === 'custom' ? t('setting.rule.customRuleCopyError') : t('setting.rule.ruleGroupCopyError')) console.error(e) } } @@ -178,7 +186,7 @@ function saveCodeString(type: string, codeString: any) { try { parsedCode = JSON.parse(codeString.value) } catch (e) { - $toast.error('导入规则失败!无法解析输入的数据!') + $toast.error(t('setting.rule.importFailed')) console.error(e) return } @@ -194,10 +202,10 @@ function saveCodeString(type: string, codeString: any) { const newFilterRuleGroups = extractFilterRuleGroups(parsedCode) || [] filterRuleGroups.value = [...filterRuleGroups.value, ...newFilterRuleGroups] } else { - $toast.error('导入规则失败!未知的数据类型!') + $toast.error(t('setting.rule.importUnknownType')) } } catch (e) { - $toast.error('导入规则失败!') + $toast.error(t('setting.rule.importFailed')) console.error(e) } } @@ -272,8 +280,8 @@ function isValidValue(value: any, type: string): boolean { function validateCustomRule(hasName: boolean, hasId: boolean, noDuplicates: boolean): boolean { if (!hasName || !hasId || !noDuplicates) { - if (!noDuplicates) $toast.warning(`存在重名值`) - if (!hasId) $toast.error(`导入失败!发现有规则不存在ID,可能属于优先级规则组!`) + if (!noDuplicates) $toast.warning(t('setting.rule.duplicateValue')) + if (!hasId) $toast.error(t('setting.rule.importNoId')) return false } return true @@ -281,8 +289,8 @@ function validateCustomRule(hasName: boolean, hasId: boolean, noDuplicates: bool function validateGroupRule(hasName: boolean, hasId: boolean, noDuplicates: boolean): boolean { if (!hasName || hasId || !noDuplicates) { - if (!noDuplicates) $toast.warning(`存在重名值`) - if (hasId) $toast.error(`导入失败!发现有规则存在相同ID,可能属于自定义规则!`) + if (!noDuplicates) $toast.warning(t('setting.rule.duplicateValue')) + if (hasId) $toast.error(t('setting.rule.importHasId')) return false } return true @@ -367,8 +375,8 @@ onMounted(() => { - 自定义规则 - 自定义优先级规则项 + {{ t('setting.rule.customRules') }} + {{ t('setting.rule.customRulesDesc') }} {
- 保存 + {{ t('common.save') }} @@ -416,8 +424,8 @@ onMounted(() => { - 优先级规则组 - 预设优先级规则组,以便在搜索和订阅中使用。 + {{ t('setting.rule.priorityRuleGroups') }} + {{ t('setting.rule.priorityRuleGroupsDesc') }} {
- 保存 + {{ t('common.save') }} @@ -466,7 +474,7 @@ onMounted(() => { { - 下载规则 - 同时命中多个资源时择优下载。 + {{ t('setting.rule.downloadRules') }} + {{ t('setting.rule.downloadRulesDesc') }} @@ -488,8 +496,8 @@ onMounted(() => { multiple clearable chips - label="当前使用下载优先规则" - hint="排在前面的优先级越高,未选择的项不纳入排序" + :label="t('setting.rule.currentPriorityRules')" + :hint="t('setting.rule.currentPriorityRulesHint')" persistent-hint /> @@ -499,7 +507,7 @@ onMounted(() => {
- 保存 + {{ t('common.save') }}
diff --git a/src/views/setting/AccountSettingScheduler.vue b/src/views/setting/AccountSettingScheduler.vue index 30b0aa1f..f3282e85 100644 --- a/src/views/setting/AccountSettingScheduler.vue +++ b/src/views/setting/AccountSettingScheduler.vue @@ -2,6 +2,10 @@ import { useToast } from 'vue-toast-notification' import api from '@/api' import type { ScheduleInfo } from '@/api/types' +import { useI18n } from 'vue-i18n' + +// 国际化 +const { t } = useI18n() // 提示框 const $toast = useToast() @@ -26,11 +30,11 @@ async function loadSchedulerList() { // 任务状态颜色 function getSchedulerColor(status: string) { switch (status) { - case '正在运行': + case t('setting.scheduler.running'): return 'success' - case '已停止': + case t('setting.scheduler.stopped'): return 'error' - case '等待': + case t('setting.scheduler.waiting'): return '' default: return '' @@ -46,7 +50,7 @@ function runCommand(id: string) { jobid: id, }, }) - $toast.success('定时作业执行请求提交成功!') + $toast.success(t('setting.scheduler.executeSuccess')) // 1秒后刷新数据 setTimeout(() => { loadSchedulerList() @@ -77,16 +81,16 @@ onUnmounted(() => { diff --git a/src/views/setting/AccountSettingSystem.vue b/src/views/setting/AccountSettingSystem.vue index e0b935bb..0b0b42aa 100644 --- a/src/views/setting/AccountSettingSystem.vue +++ b/src/views/setting/AccountSettingSystem.vue @@ -532,10 +532,10 @@ onDeactivated(() => { - Qbittorrent + {{ t('setting.system.qbittorrent') }} - Transmission + {{ t('setting.system.transmission') }} @@ -580,13 +580,13 @@ onDeactivated(() => { - Emby + {{ t('setting.system.emby') }} - Jellyfin + {{ t('setting.system.jellyfin') }} - Plex + {{ t('setting.system.plex') }} {{ t('setting.system.trimeMedia') }}