diff --git a/src/i18n/lang/en-US.ts b/src/i18n/lang/en-US.ts deleted file mode 100644 index 17b0a7a..0000000 --- a/src/i18n/lang/en-US.ts +++ /dev/null @@ -1,29 +0,0 @@ -export default { - common: { - play: 'Play', - pause: 'Pause', - next: 'Next', - previous: 'Previous', - volume: 'Volume', - settings: 'Settings', - search: 'Search', - loading: 'Loading...' - }, - settings: { - theme: 'Theme', - language: 'Language', - about: 'About', - logout: 'Logout' - }, - player: { - nowPlaying: 'Now Playing', - playlist: 'Playlist', - lyrics: 'Lyrics' - }, - artist: { - songs: 'Songs', - albums: 'Albums', - mv: 'MV', - description: 'Description' - } -}; diff --git a/src/i18n/lang/en-US/artist.ts b/src/i18n/lang/en-US/artist.ts new file mode 100644 index 0000000..f948243 --- /dev/null +++ b/src/i18n/lang/en-US/artist.ts @@ -0,0 +1,5 @@ +export default { + hotSongs: 'Hot Songs', + albums: 'Albums', + description: 'Artist Introduction' +}; diff --git a/src/i18n/lang/en-US/common.ts b/src/i18n/lang/en-US/common.ts new file mode 100644 index 0000000..b2cb933 --- /dev/null +++ b/src/i18n/lang/en-US/common.ts @@ -0,0 +1,47 @@ +export default { + play: 'Play', + next: 'Next', + previous: 'Previous', + volume: 'Volume', + settings: 'Settings', + search: 'Search', + loading: 'Loading...', + loadingMore: 'Loading more...', + alipay: 'Alipay', + wechat: 'WeChat Pay', + on: 'On', + off: 'Off', + show: 'Show', + hide: 'Hide', + confirm: 'Confirm', + cancel: 'Cancel', + configure: 'Configure', + open: 'Open', + modify: 'Modify', + success: 'Operation Successful', + error: 'Operation Failed', + warning: 'Warning', + info: 'Info', + save: 'Save', + delete: 'Delete', + refresh: 'Refresh', + retry: 'Retry', + validation: { + required: 'This field is required', + invalidInput: 'Invalid input', + selectRequired: 'Please select an option', + numberRange: 'Please enter a number between {min} and {max}', + ipAddress: 'Please enter a valid IP address', + portNumber: 'Please enter a valid port number (1-65535)' + }, + viewMore: 'View More', + noMore: 'No more', + expand: 'Expand', + collapse: 'Collapse', + songCount: '{count} songs', + tray: { + show: 'Show', + quit: 'Quit' + }, + language: 'Language' +}; diff --git a/src/i18n/lang/en-US/comp.ts b/src/i18n/lang/en-US/comp.ts new file mode 100644 index 0000000..33f96d6 --- /dev/null +++ b/src/i18n/lang/en-US/comp.ts @@ -0,0 +1,89 @@ +export default { + installApp: { + description: 'Install the application on the desktop for a better experience', + noPrompt: 'Do not prompt again', + install: 'Install now', + cancel: 'Cancel', + download: 'Download', + downloadFailed: 'Download failed', + downloadComplete: 'Download complete', + downloadProblem: 'Download problem? Go to', + downloadProblemLinkText: 'Download the latest version' + }, + playlistDrawer: { + title: 'Add to playlist', + createPlaylist: 'Create new playlist', + cancelCreate: 'Cancel create', + create: 'Create', + playlistName: 'Playlist name', + privatePlaylist: 'Private playlist', + publicPlaylist: 'Public playlist', + createSuccess: 'Playlist created successfully', + createFailed: 'Playlist creation failed', + addSuccess: 'Song added successfully', + addFailed: 'Song addition failed', + private: 'Private', + public: 'Public', + count: 'songs', + loginFirst: 'Please login first', + getPlaylistFailed: 'Get playlist failed', + inputPlaylistName: 'Please enter the playlist name' + }, + update: { + title: 'New version found', + currentVersion: 'Current version', + cancel: 'Do not update', + prepareDownload: 'Preparing to download...', + downloading: 'Downloading...', + nowUpdate: 'Update now', + downloadFailed: 'Download failed, please try again or download manually', + startFailed: 'Start download failed, please try again or download manually', + noDownloadUrl: + 'No suitable installation package found for the current system, please download manually' + }, + coffee: { + title: 'Buy me a coffee', + alipay: 'Alipay', + wechat: 'Wechat', + alipayQR: 'Alipay QR code', + wechatQR: 'Wechat QR code', + coffeeDesc: 'A cup of coffee, a support', + coffeeDescLinkText: 'View more', + qqGroup: 'QQ group: 789288579', + messages: { + copySuccess: 'Copied to clipboard' + } + }, + playlistType: { + title: 'Playlist Category', + showAll: 'Show all', + hide: 'Hide some' + }, + recommendAlbum: { + title: 'Latest Album' + }, + recommendSinger: { + title: 'Daily Recommendation', + songlist: 'Daily Recommendation List' + }, + recommendSonglist: { + title: 'Weekly Hot Music' + }, + searchBar: { + login: 'Login', + toLogin: 'To Login', + logout: 'Logout', + set: 'Set', + theme: 'Theme', + restart: 'Restart', + refresh: 'Refresh', + currentVersion: 'Current Version', + searchPlaceholder: 'Search for something...' + }, + titleBar: { + closeTitle: 'Choose how to close', + minimizeToTray: 'Minimize to Tray', + exitApp: 'Exit App', + rememberChoice: 'Remember my choice' + } +}; diff --git a/src/i18n/lang/en-US/donation.ts b/src/i18n/lang/en-US/donation.ts new file mode 100644 index 0000000..ff64ccb --- /dev/null +++ b/src/i18n/lang/en-US/donation.ts @@ -0,0 +1,6 @@ +export default { + description: + 'Your donation will be used to support development and maintenance work, including but not limited to server maintenance, domain name renewal, etc.', + message: 'You can leave your email or github name when leaving a message.', + refresh: 'Refresh List' +}; diff --git a/src/i18n/lang/en-US/download.ts b/src/i18n/lang/en-US/download.ts new file mode 100644 index 0000000..e688cf9 --- /dev/null +++ b/src/i18n/lang/en-US/download.ts @@ -0,0 +1,36 @@ +export default { + title: 'Download Manager', + localMusic: 'Local Music', + tabs: { + downloading: 'Downloading', + downloaded: 'Downloaded' + }, + empty: { + noTasks: 'No download tasks', + noDownloaded: 'No downloaded songs' + }, + progress: { + total: 'Total Progress: {progress}%' + }, + status: { + downloading: 'Downloading', + completed: 'Completed', + failed: 'Failed', + unknown: 'Unknown' + }, + artist: { + unknown: 'Unknown Artist' + }, + delete: { + title: 'Delete Confirmation', + message: 'Are you sure you want to delete "{filename}"? This action cannot be undone.', + confirm: 'Delete', + cancel: 'Cancel', + success: 'Successfully deleted', + failed: 'Failed to delete' + }, + message: { + downloadComplete: '{filename} download completed', + downloadFailed: '{filename} download failed: {error}' + } +}; diff --git a/src/i18n/lang/en-US/favorite.ts b/src/i18n/lang/en-US/favorite.ts new file mode 100644 index 0000000..7137862 --- /dev/null +++ b/src/i18n/lang/en-US/favorite.ts @@ -0,0 +1,15 @@ +export default { + title: 'Favorites', + count: 'Total {count}', + batchDownload: 'Batch Download', + selectAll: 'All', + download: 'Download ({count})', + cancel: 'Cancel', + emptyTip: 'No favorite songs yet', + viewMore: 'View More', + noMore: 'No more', + downloadSuccess: 'Download completed', + downloadFailed: 'Download failed', + downloading: 'Downloading, please wait...', + selectSongsFirst: 'Please select songs to download first' +}; diff --git a/src/i18n/lang/en-US/history.ts b/src/i18n/lang/en-US/history.ts new file mode 100644 index 0000000..95c9f06 --- /dev/null +++ b/src/i18n/lang/en-US/history.ts @@ -0,0 +1,5 @@ +export default { + title: 'Play History', + playCount: '{count}', + getHistoryFailed: 'Failed to get play history' +}; diff --git a/src/i18n/lang/en-US/index.ts b/src/i18n/lang/en-US/index.ts new file mode 100644 index 0000000..3619c66 --- /dev/null +++ b/src/i18n/lang/en-US/index.ts @@ -0,0 +1,29 @@ +import artist from './artist'; +import common from './common'; +import comp from './comp'; +import donation from './donation'; +import download from './download'; +import favorite from './favorite'; +import history from './history'; +import login from './login'; +import player from './player'; +import search from './search'; +import settings from './settings'; +import songItem from './songItem'; +import user from './user'; + +export default { + common, + donation, + favorite, + history, + login, + player, + search, + settings, + songItem, + user, + download, + comp, + artist +}; diff --git a/src/i18n/lang/en-US/login.ts b/src/i18n/lang/en-US/login.ts new file mode 100644 index 0000000..7af66da --- /dev/null +++ b/src/i18n/lang/en-US/login.ts @@ -0,0 +1,22 @@ +export default { + title: { + qr: 'QR Code Login', + phone: 'Phone Login' + }, + qrTip: 'Scan with NetEase Cloud Music APP', + phoneTip: 'Login with NetEase Cloud account', + placeholder: { + phone: 'Phone Number', + password: 'Password' + }, + button: { + login: 'Login', + switchToQr: 'QR Code Login', + switchToPhone: 'Phone Login' + }, + message: { + loginSuccess: 'Login successful', + loadError: 'Error loading login information', + qrCheckError: 'Error checking QR code status' + } +}; diff --git a/src/i18n/lang/en-US/player.ts b/src/i18n/lang/en-US/player.ts new file mode 100644 index 0000000..dc27e3b --- /dev/null +++ b/src/i18n/lang/en-US/player.ts @@ -0,0 +1,49 @@ +export default { + nowPlaying: 'Now Playing', + playlist: 'Playlist', + lyrics: 'Lyrics', + previous: 'Previous', + play: 'Play', + pause: 'Pause', + next: 'Next', + volumeUp: 'Volume Up', + volumeDown: 'Volume Down', + mute: 'Mute', + unmute: 'Unmute', + playMode: { + sequence: 'Sequence', + loop: 'Loop', + random: 'Random' + }, + fullscreen: { + enter: 'Enter Fullscreen', + exit: 'Exit Fullscreen' + }, + close: 'Close', + modeHint: { + single: 'Single', + list: 'Next' + }, + lrc: { + noLrc: 'No lyrics, please enjoy' + }, + playBar: { + expand: 'Expand Lyrics', + collapse: 'Collapse Lyrics', + like: 'Like', + lyric: 'Lyric', + playList: 'Play List', + playMode: { + sequence: 'Sequence', + loop: 'Loop', + random: 'Random' + }, + play: 'Play', + pause: 'Pause', + prev: 'Previous', + next: 'Next', + volume: 'Volume', + favorite: 'Favorite {name}', + unFavorite: 'Unfavorite {name}' + } +}; diff --git a/src/i18n/lang/en-US/search.ts b/src/i18n/lang/en-US/search.ts new file mode 100644 index 0000000..4f473e2 --- /dev/null +++ b/src/i18n/lang/en-US/search.ts @@ -0,0 +1,19 @@ +export default { + title: { + hotSearch: 'Hot Search', + searchList: 'Search Results', + searchHistory: 'Search History' + }, + button: { + clear: 'Clear', + back: 'Back' + }, + loading: { + more: 'Loading...', + failed: 'Search failed' + }, + noMore: 'No more results', + error: { + searchFailed: 'Search failed' + } +}; diff --git a/src/i18n/lang/en-US/settings.ts b/src/i18n/lang/en-US/settings.ts new file mode 100644 index 0000000..2e5f67c --- /dev/null +++ b/src/i18n/lang/en-US/settings.ts @@ -0,0 +1,208 @@ +export default { + theme: 'Theme', + language: 'Language', + regard: 'About', + logout: 'Logout', + sections: { + basic: 'Basic Settings', + playback: 'Playback Settings', + application: 'Application Settings', + network: 'Network Settings', + system: 'System Management', + donation: 'Donation', + regard: 'About' + }, + basic: { + themeMode: 'Theme Mode', + themeModeDesc: 'Switch between light/dark theme', + language: 'Language Settings', + languageDesc: 'Change display language', + font: 'Font Settings', + fontDesc: 'Select fonts, prioritize fonts in order', + fontScope: { + global: 'Global', + lyric: 'Lyrics Only' + }, + animation: 'Animation Speed', + animationDesc: 'Enable/disable animations', + animationSpeed: { + slow: 'Very Slow', + normal: 'Normal', + fast: 'Very Fast' + }, + fontPreview: { + title: 'Font Preview', + chinese: 'Chinese', + english: 'English', + japanese: 'Japanese', + korean: 'Korean', + chineseText: '静夜思 床前明月光 疑是地上霜', + englishText: 'The quick brown fox jumps over the lazy dog', + japaneseText: 'あいうえお かきくけこ さしすせそ', + koreanText: '가나다라마 바사아자차 카타파하' + } + }, + playback: { + quality: 'Audio Quality', + qualityDesc: 'Select music playback quality (VIP)', + qualityOptions: { + standard: 'Standard', + higher: 'Higher', + exhigh: 'Extreme', + lossless: 'Lossless', + hires: 'Hi-Res', + jyeffect: 'HD Surround', + sky: 'Immersive', + dolby: 'Dolby Atmos', + jymaster: 'Master' + }, + autoPlay: 'Auto Play', + autoPlayDesc: 'Auto resume playback when reopening the app' + }, + application: { + closeAction: 'Close Action', + closeActionDesc: 'Choose action when closing window', + closeOptions: { + ask: 'Ask Every Time', + minimize: 'Minimize to Tray', + close: 'Exit Directly' + }, + shortcut: 'Shortcut Settings', + shortcutDesc: 'Customize global shortcuts', + download: 'Download Management', + downloadDesc: 'Always show download list button', + downloadPath: 'Download Directory', + downloadPathDesc: 'Choose download location for music files' + }, + network: { + apiPort: 'Music API Port', + apiPortDesc: 'Restart required after modification', + proxy: 'Proxy Settings', + proxyDesc: 'Enable proxy when unable to access music', + proxyHost: 'Proxy Host', + proxyHostPlaceholder: 'Enter proxy host', + proxyPort: 'Proxy Port', + proxyPortPlaceholder: 'Enter proxy port', + realIP: 'RealIP Settings', + realIPDesc: 'Use realIP parameter with mainland China IP to resolve access restrictions abroad', + messages: { + proxySuccess: 'Proxy settings saved, restart required to take effect', + proxyError: 'Please check your input', + realIPSuccess: 'RealIP settings saved', + realIPError: 'Please enter a valid IP address' + } + }, + system: { + cache: 'Cache Management', + cacheDesc: 'Clear cache', + cacheClearTitle: 'Select cache types to clear:', + cacheTypes: { + history: { + label: 'Play History', + description: 'Clear played song records' + }, + favorite: { + label: 'Favorites', + description: 'Clear local favorite songs (cloud favorites not affected)' + }, + user: { + label: 'User Data', + description: 'Clear login info and user-related data' + }, + settings: { + label: 'App Settings', + description: 'Clear all custom app settings' + }, + downloads: { + label: 'Download History', + description: 'Clear download history (downloaded files not affected)' + }, + resources: { + label: 'Music Resources', + description: 'Clear cached music files, lyrics and other resources' + }, + lyrics: { + label: 'Lyrics Resources', + description: 'Clear cached lyrics resources' + } + }, + restart: 'Restart', + restartDesc: 'Restart application', + messages: { + clearSuccess: 'Cache cleared successfully, some settings will take effect after restart' + } + }, + about: { + version: 'Version', + checkUpdate: 'Check for Updates', + checking: 'Checking...', + latest: 'Already latest version', + hasUpdate: 'New version available', + gotoUpdate: 'Go to Update', + gotoGithub: 'Go to Github', + author: 'Author', + authorDesc: 'algerkong Give a star🌟', + messages: { + checkError: 'Failed to check for updates, please try again later' + } + }, + validation: { + selectProxyProtocol: 'Please select proxy protocol', + proxyHost: 'Please enter proxy host', + portNumber: 'Please enter a valid port number (1-65535)' + }, + lyricSettings: { + title: 'Lyric Settings', + pureMode: 'Pure Mode', + hideCover: 'Hide Cover', + centerDisplay: 'Center Display', + showTranslation: 'Show Translation', + hidePlayBar: 'Hide Play Bar', + fontSize: 'Font Size', + letterSpacing: 'Letter Spacing', + lineHeight: 'Line Height', + backgroundTheme: 'Background Theme', + fontSizeMarks: { + small: 'Small', + medium: 'Medium', + large: 'Large' + }, + letterSpacingMarks: { + compact: 'Compact', + default: 'Default', + loose: 'Loose' + }, + lineHeightMarks: { + compact: 'Compact', + default: 'Default', + loose: 'Loose' + }, + themeOptions: { + default: 'Default', + light: 'Light', + dark: 'Dark' + } + }, + shortcutSettings: { + title: 'Shortcut Settings', + shortcut: 'Shortcut', + shortcutDesc: 'Customize global shortcuts', + shortcutConflict: 'Shortcut Conflict', + inputPlaceholder: 'Click to input shortcut', + resetShortcuts: 'Reset', + togglePlay: 'Play/Pause', + prevPlay: 'Previous', + nextPlay: 'Next', + volumeUp: 'Volume Up', + volumeDown: 'Volume Down', + toggleFavorite: 'Favorite/Unfavorite', + toggleWindow: 'Show/Hide Window', + messages: { + resetSuccess: 'Shortcuts reset successfully, please save', + conflict: 'Shortcut conflict, please reset', + saveSuccess: 'Shortcuts saved successfully', + saveError: 'Failed to save shortcuts', + cancelEdit: 'Edit cancelled' + } + } +}; diff --git a/src/i18n/lang/en-US/songItem.ts b/src/i18n/lang/en-US/songItem.ts new file mode 100644 index 0000000..7cfc2d7 --- /dev/null +++ b/src/i18n/lang/en-US/songItem.ts @@ -0,0 +1,18 @@ +export default { + menu: { + play: 'Play', + playNext: 'Play Next', + download: 'Download', + addToPlaylist: 'Add to Playlist', + favorite: 'Like', + unfavorite: 'Unlike', + removeFromPlaylist: 'Remove from Playlist' + }, + message: { + downloading: 'Downloading, please wait...', + downloadFailed: 'Download failed', + downloadQueued: 'Added to download queue', + addedToNextPlay: 'Added to play next', + getUrlFailed: 'Failed to get music download URL' + } +}; diff --git a/src/i18n/lang/en-US/user.ts b/src/i18n/lang/en-US/user.ts new file mode 100644 index 0000000..ef1b4f6 --- /dev/null +++ b/src/i18n/lang/en-US/user.ts @@ -0,0 +1,21 @@ +export default { + profile: { + followers: 'Followers', + following: 'Following', + level: 'Level' + }, + playlist: { + created: 'Created Playlists', + trackCount: '{count} tracks', + playCount: 'Played {count} times' + }, + ranking: { + title: 'Listening History', + playCount: '{count} times' + }, + message: { + loadFailed: 'Failed to load user page', + deleteSuccess: 'Successfully deleted', + deleteFailed: 'Failed to delete' + } +}; diff --git a/src/i18n/lang/zh-CN.ts b/src/i18n/lang/zh-CN.ts deleted file mode 100644 index e7239d5..0000000 --- a/src/i18n/lang/zh-CN.ts +++ /dev/null @@ -1,35 +0,0 @@ -export default { - common: { - play: '播放', - next: '下一首', - previous: '上一首', - volume: '音量', - settings: '设置', - search: '搜索', - loading: '加载中...', - alipay: '支付宝', - wechat: '微信支付' - }, - settings: { - theme: '主题', - language: '语言', - about: '关于', - logout: '退出登录' - }, - player: { - nowPlaying: '正在播放', - playlist: '播放列表', - lyrics: '歌词' - }, - artist: { - songs: '热门歌曲', - albums: '专辑', - mv: 'MV', - description: '简介' - }, - donation: { - description: '您的捐赠将用于支持开发和维护工作,包括但不限于服务器维护、域名续费等。', - message: '留言时可留下您的邮箱或 github名称。', - refresh: '刷新列表' - } -}; diff --git a/src/i18n/lang/zh-CN/artist.ts b/src/i18n/lang/zh-CN/artist.ts new file mode 100644 index 0000000..54f6036 --- /dev/null +++ b/src/i18n/lang/zh-CN/artist.ts @@ -0,0 +1,5 @@ +export default { + hotSongs: '热门歌曲', + albums: '专辑', + description: '艺人介绍' +}; diff --git a/src/i18n/lang/zh-CN/common.ts b/src/i18n/lang/zh-CN/common.ts new file mode 100644 index 0000000..5f61650 --- /dev/null +++ b/src/i18n/lang/zh-CN/common.ts @@ -0,0 +1,46 @@ +export default { + play: '播放', + next: '下一首', + previous: '上一首', + volume: '音量', + settings: '设置', + search: '搜索', + loading: '加载中...', + loadingMore: '加载更多...', + alipay: '支付宝', + wechat: '微信支付', + on: '开启', + off: '关闭', + show: '显示', + hide: '隐藏', + confirm: '确认', + cancel: '取消', + configure: '配置', + open: '打开', + modify: '修改', + success: '操作成功', + error: '操作失败', + warning: '警告', + info: '提示', + save: '保存', + delete: '删除', + refresh: '刷新', + retry: '重试', + validation: { + required: '此项是必填的', + invalidInput: '输入无效', + selectRequired: '请选择一个选项', + numberRange: '请输入 {min} 到 {max} 之间的数字' + }, + viewMore: '查看更多', + noMore: '没有更多了', + selectAll: '全选', + expand: '展开', + collapse: '收起', + songCount: '{count}首', + language: '语言', + tray: { + show: '显示', + quit: '退出' + } +}; diff --git a/src/i18n/lang/zh-CN/comp.ts b/src/i18n/lang/zh-CN/comp.ts new file mode 100644 index 0000000..759d771 --- /dev/null +++ b/src/i18n/lang/zh-CN/comp.ts @@ -0,0 +1,88 @@ +export default { + installApp: { + description: '在桌面安装应用,获得更好的体验', + noPrompt: '不再提示', + install: '立即安装', + cancel: '暂不安装', + download: '下载', + downloadFailed: '下载失败', + downloadComplete: '下载完成', + downloadProblem: '下载遇到问题?去', + downloadProblemLinkText: '下载最新版本' + }, + playlistDrawer: { + title: '添加到歌单', + createPlaylist: '创建新歌单', + cancelCreate: '取消创建', + create: '创建', + playlistName: '歌单名称', + privatePlaylist: '私密歌单', + publicPlaylist: '公开歌单', + createSuccess: '歌单创建成功', + createFailed: '歌单创建失败', + addSuccess: '歌曲添加成功', + addFailed: '歌曲添加失败', + private: '私密', + public: '公开', + count: '首歌曲', + loginFirst: '请先登录', + getPlaylistFailed: '获取歌单失败', + inputPlaylistName: '请输入歌单名称' + }, + update: { + title: '发现新版本', + currentVersion: '当前版本', + cancel: '暂不更新', + prepareDownload: '准备下载...', + downloading: '下载中...', + nowUpdate: '立即更新', + downloadFailed: '下载失败,请重试或手动下载', + startFailed: '启动下载失败,请重试或手动下载', + noDownloadUrl: '未找到适合当前系统的安装包,请手动下载' + }, + coffee: { + title: '请我喝咖啡', + alipay: '支付宝', + wechat: '微信支付', + alipayQR: '支付宝收款码', + wechatQR: '微信收款码', + coffeeDesc: '一杯咖啡,一份支持', + coffeeDescLinkText: '查看更多', + qqGroup: 'QQ群:789288579', + messages: { + copySuccess: '已复制到剪贴板' + } + }, + playlistType: { + title: '歌单分类', + showAll: '显示全部', + hide: '隐藏一些' + }, + recommendAlbum: { + title: '最新专辑' + }, + recommendSinger: { + title: '每日推荐', + songlist: '每日推荐列表' + }, + recommendSonglist: { + title: '本周最热音乐' + }, + searchBar: { + login: '登录', + toLogin: '去登录', + logout: '退出登录', + set: '设置', + theme: '主题', + restart: '重启', + refresh: '刷新', + currentVersion: '当前版本', + searchPlaceholder: '搜索点什么吧...' + }, + titleBar: { + closeTitle: '请选择关闭方式', + minimizeToTray: '最小化到托盘', + exitApp: '退出应用', + rememberChoice: '记住我的选择' + } +}; diff --git a/src/i18n/lang/zh-CN/donation.ts b/src/i18n/lang/zh-CN/donation.ts new file mode 100644 index 0000000..6f22e54 --- /dev/null +++ b/src/i18n/lang/zh-CN/donation.ts @@ -0,0 +1,5 @@ +export default { + description: '您的捐赠将用于支持开发和维护工作,包括但不限于服务器维护、域名续费等。', + message: '留言时可留下您的邮箱或 github名称。', + refresh: '刷新列表' +}; diff --git a/src/i18n/lang/zh-CN/download.ts b/src/i18n/lang/zh-CN/download.ts new file mode 100644 index 0000000..7199964 --- /dev/null +++ b/src/i18n/lang/zh-CN/download.ts @@ -0,0 +1,36 @@ +export default { + title: '下载管理', + localMusic: '本地音乐', + tabs: { + downloading: '下载中', + downloaded: '已下载' + }, + empty: { + noTasks: '暂无下载任务', + noDownloaded: '暂无已下载歌曲' + }, + progress: { + total: '总进度: {progress}%' + }, + status: { + downloading: '下载中', + completed: '已完成', + failed: '失败', + unknown: '未知' + }, + artist: { + unknown: '未知歌手' + }, + delete: { + title: '删除确认', + message: '确定要删除歌曲 "{filename}" 吗?此操作不可恢复。', + confirm: '确定删除', + cancel: '取消', + success: '删除成功', + failed: '删除失败' + }, + message: { + downloadComplete: '{filename} 下载完成', + downloadFailed: '{filename} 下载失败: {error}' + } +}; diff --git a/src/i18n/lang/zh-CN/favorite.ts b/src/i18n/lang/zh-CN/favorite.ts new file mode 100644 index 0000000..4ff1874 --- /dev/null +++ b/src/i18n/lang/zh-CN/favorite.ts @@ -0,0 +1,11 @@ +export default { + title: '我的收藏', + count: '共 {count} 首', + batchDownload: '批量下载', + download: '下载 ({count})', + emptyTip: '还没有收藏歌曲', + downloadSuccess: '下载完成', + downloadFailed: '下载失败', + downloading: '正在下载中,请稍候...', + selectSongsFirst: '请先选择要下载的歌曲' +}; diff --git a/src/i18n/lang/zh-CN/history.ts b/src/i18n/lang/zh-CN/history.ts new file mode 100644 index 0000000..78641fa --- /dev/null +++ b/src/i18n/lang/zh-CN/history.ts @@ -0,0 +1,5 @@ +export default { + title: '播放历史', + playCount: '{count}', + getHistoryFailed: '获取历史记录失败' +}; diff --git a/src/i18n/lang/zh-CN/index.ts b/src/i18n/lang/zh-CN/index.ts new file mode 100644 index 0000000..3619c66 --- /dev/null +++ b/src/i18n/lang/zh-CN/index.ts @@ -0,0 +1,29 @@ +import artist from './artist'; +import common from './common'; +import comp from './comp'; +import donation from './donation'; +import download from './download'; +import favorite from './favorite'; +import history from './history'; +import login from './login'; +import player from './player'; +import search from './search'; +import settings from './settings'; +import songItem from './songItem'; +import user from './user'; + +export default { + common, + donation, + favorite, + history, + login, + player, + search, + settings, + songItem, + user, + download, + comp, + artist +}; diff --git a/src/i18n/lang/zh-CN/login.ts b/src/i18n/lang/zh-CN/login.ts new file mode 100644 index 0000000..2b86294 --- /dev/null +++ b/src/i18n/lang/zh-CN/login.ts @@ -0,0 +1,22 @@ +export default { + title: { + qr: '扫码登录', + phone: '手机号登录' + }, + qrTip: '使用网易云APP扫码登录', + phoneTip: '使用网易云账号登录', + placeholder: { + phone: '手机号', + password: '密码' + }, + button: { + login: '登录', + switchToQr: '扫码登录', + switchToPhone: '手机号登录' + }, + message: { + loginSuccess: '登录成功', + loadError: '加载登录信息时出错', + qrCheckError: '检查二维码状态时出错' + } +}; diff --git a/src/i18n/lang/zh-CN/player.ts b/src/i18n/lang/zh-CN/player.ts new file mode 100644 index 0000000..5d18fc0 --- /dev/null +++ b/src/i18n/lang/zh-CN/player.ts @@ -0,0 +1,49 @@ +export default { + nowPlaying: '正在播放', + playlist: '播放列表', + lyrics: '歌词', + previous: '上一个', + play: '播放', + pause: '暂停', + next: '下一个', + volumeUp: '音量增加', + volumeDown: '音量减少', + mute: '静音', + unmute: '取消静音', + playMode: { + sequence: '顺序播放', + loop: '循环播放', + random: '随机播放' + }, + fullscreen: { + enter: '全屏', + exit: '退出全屏' + }, + close: '关闭', + modeHint: { + single: '单曲循环', + list: '自动播放下一个' + }, + lrc: { + noLrc: '暂无歌词, 请欣赏' + }, + playBar: { + expand: '展开歌词', + collapse: '收起歌词', + like: '喜欢', + lyric: '歌词', + playList: '播放列表', + playMode: { + sequence: '顺序播放', + loop: '循环播放', + random: '随机播放' + }, + play: '开始播放', + pause: '暂停播放', + prev: '上一首', + next: '下一首', + volume: '音量', + favorite: '已收藏{name}', + unFavorite: '已取消收藏{name}' + } +}; diff --git a/src/i18n/lang/zh-CN/search.ts b/src/i18n/lang/zh-CN/search.ts new file mode 100644 index 0000000..f6c5f91 --- /dev/null +++ b/src/i18n/lang/zh-CN/search.ts @@ -0,0 +1,19 @@ +export default { + title: { + hotSearch: '热搜列表', + searchList: '搜索列表', + searchHistory: '搜索历史' + }, + button: { + clear: '清空', + back: '返回' + }, + loading: { + more: '加载中...', + failed: '搜索失败' + }, + noMore: '没有更多了', + error: { + searchFailed: '搜索失败' + } +}; diff --git a/src/i18n/lang/zh-CN/settings.ts b/src/i18n/lang/zh-CN/settings.ts new file mode 100644 index 0000000..551cdbe --- /dev/null +++ b/src/i18n/lang/zh-CN/settings.ts @@ -0,0 +1,208 @@ +export default { + theme: '主题', + language: '语言', + regard: '关于', + logout: '退出登录', + sections: { + basic: '基础设置', + playback: '播放设置', + application: '应用设置', + network: '网络设置', + system: '系统管理', + donation: '捐赠支持', + regard: '关于' + }, + basic: { + themeMode: '主题模式', + themeModeDesc: '切换日间/夜间主题', + language: '语言设置', + languageDesc: '切换显示语言', + font: '字体设置', + fontDesc: '选择字体,优先使用排在前面的字体', + fontScope: { + global: '全局', + lyric: '仅歌词' + }, + animation: '动画速度', + animationDesc: '是否开启动画', + animationSpeed: { + slow: '极慢', + normal: '正常', + fast: '极快' + }, + fontPreview: { + title: '字体预览', + chinese: '中文', + english: 'English', + japanese: '日本語', + korean: '한국어', + chineseText: '静夜思 床前明月光 疑是地上霜', + englishText: 'The quick brown fox jumps over the lazy dog', + japaneseText: 'あいうえお かきくけこ さしすせそ', + koreanText: '가나다라마 바사아자차 카타파하' + } + }, + playback: { + quality: '音质设置', + qualityDesc: '选择音乐播放音质(VIP)', + qualityOptions: { + standard: '标准', + higher: '较高', + exhigh: '极高', + lossless: '无损', + hires: 'Hi-Res', + jyeffect: '高清环绕声', + sky: '沉浸环绕声', + dolby: '杜比全景声', + jymaster: '超清母带' + }, + autoPlay: '自动播放', + autoPlayDesc: '重新打开应用时是否自动继续播放' + }, + application: { + closeAction: '关闭行为', + closeActionDesc: '选择关闭窗口时的行为', + closeOptions: { + ask: '每次询问', + minimize: '最小化到托盘', + close: '直接退出' + }, + shortcut: '快捷键设置', + shortcutDesc: '自定义全局快捷键', + download: '下载管理', + downloadDesc: '是否始终显示下载列表按钮', + downloadPath: '下载目录', + downloadPathDesc: '选择音乐文件的下载位置' + }, + network: { + apiPort: '音乐API端口', + apiPortDesc: '修改后需要重启应用', + proxy: '代理设置', + proxyDesc: '无法访问音乐时可以开启代理', + proxyHost: '代理地址', + proxyHostPlaceholder: '请输入代理地址', + proxyPort: '代理端口', + proxyPortPlaceholder: '请输入代理端口', + realIP: 'realIP设置', + realIPDesc: '由于限制,此项目在国外使用会受到限制可使用realIP参数,传进国内IP解决', + messages: { + proxySuccess: '代理设置已保存,重启应用后生效', + proxyError: '请检查输入是否正确', + realIPSuccess: '真实IP设置已保存', + realIPError: '请输入有效的IP地址' + } + }, + system: { + cache: '缓存管理', + cacheDesc: '清除缓存', + cacheClearTitle: '请选择要清除的缓存类型:', + cacheTypes: { + history: { + label: '播放历史', + description: '清除播放过的歌曲记录' + }, + favorite: { + label: '收藏记录', + description: '清除本地收藏的歌曲记录(不会影响云端收藏)' + }, + user: { + label: '用户数据', + description: '清除登录信息和用户相关数据' + }, + settings: { + label: '应用设置', + description: '清除应用的所有自定义设置' + }, + downloads: { + label: '下载记录', + description: '清除下载历史记录(不会删除已下载的文件)' + }, + resources: { + label: '音乐资源', + description: '清除已加载的音乐文件、歌词等资源缓存' + }, + lyrics: { + label: '歌词资源', + description: '清除已加载的歌词资源缓存' + } + }, + restart: '重启', + restartDesc: '重启应用', + messages: { + clearSuccess: '清除成功,部分设置在重启后生效' + } + }, + about: { + version: '版本', + checkUpdate: '检查更新', + checking: '检查中...', + latest: '当前已是最新版本', + hasUpdate: '发现新版本', + gotoUpdate: '前往更新', + gotoGithub: '前往 Github', + author: '作者', + authorDesc: 'algerkong 点个star🌟呗', + messages: { + checkError: '检查更新失败,请稍后重试' + } + }, + validation: { + selectProxyProtocol: '请选择代理协议', + proxyHost: '请输入代理地址', + portNumber: '请输入有效的端口号(1-65535)' + }, + lyricSettings: { + title: '页面设置', + pureMode: '纯净模式', + hideCover: '隐藏封面', + centerDisplay: '居中显示', + showTranslation: '显示翻译', + hidePlayBar: '隐藏播放栏', + fontSize: '字体大小', + fontSizeMarks: { + small: '小', + medium: '中', + large: '大' + }, + letterSpacing: '文字间距', + letterSpacingMarks: { + compact: '紧凑', + default: '默认', + loose: '宽松' + }, + lineHeight: '行高', + lineHeightMarks: { + compact: '紧凑', + default: '默认', + loose: '宽松' + }, + backgroundTheme: '背景主题', + themeOptions: { + default: '默认', + light: '亮色', + dark: '暗色' + } + }, + shortcutSettings: { + title: '快捷键设置', + shortcut: '快捷键', + shortcutDesc: '自定义快捷键', + shortcutConflict: '快捷键冲突', + inputPlaceholder: '点击输入快捷键', + resetShortcuts: '恢复默认', + togglePlay: '播放/暂停', + prevPlay: '上一首', + nextPlay: '下一首', + volumeUp: '音量增加', + volumeDown: '音量减少', + toggleFavorite: '收藏/取消收藏', + toggleWindow: '显示/隐藏窗口', + messages: { + resetSuccess: '已恢复默认快捷键,请记得保存', + conflict: '存在冲突的快捷键,请重新设置', + saveSuccess: '快捷键设置已保存', + saveError: '保存快捷键失败,请重试', + cancelEdit: '已取消修改' + } + } +}; diff --git a/src/i18n/lang/zh-CN/songItem.ts b/src/i18n/lang/zh-CN/songItem.ts new file mode 100644 index 0000000..7c90b36 --- /dev/null +++ b/src/i18n/lang/zh-CN/songItem.ts @@ -0,0 +1,18 @@ +export default { + menu: { + play: '播放', + playNext: '下一首播放', + download: '下载歌曲', + addToPlaylist: '添加到歌单', + favorite: '喜欢', + unfavorite: '取消喜欢', + removeFromPlaylist: '从歌单中删除' + }, + message: { + downloading: '正在下载中,请稍候...', + downloadFailed: '下载失败', + downloadQueued: '已加入下载队列', + addedToNextPlay: '已添加到下一首播放', + getUrlFailed: '获取音乐下载地址失败' + } +}; diff --git a/src/i18n/lang/zh-CN/user.ts b/src/i18n/lang/zh-CN/user.ts new file mode 100644 index 0000000..872a9ce --- /dev/null +++ b/src/i18n/lang/zh-CN/user.ts @@ -0,0 +1,21 @@ +export default { + profile: { + followers: '粉丝', + following: '关注', + level: '等级' + }, + playlist: { + created: '创建的歌单', + trackCount: '{count}首', + playCount: '播放{count}次' + }, + ranking: { + title: '听歌排行', + playCount: '{count}次' + }, + message: { + loadFailed: '加载用户页面失败', + deleteSuccess: '删除成功', + deleteFailed: '删除失败' + } +}; diff --git a/src/i18n/main.ts b/src/i18n/main.ts index 73e29f8..58138d4 100644 --- a/src/i18n/main.ts +++ b/src/i18n/main.ts @@ -1,28 +1,38 @@ -import type { I18nOptions } from 'vue-i18n'; -import { createI18n } from 'vue-i18n'; - -import { getStore } from '../main/modules/config'; import enUS from './lang/en-US'; import zhCN from './lang/zh-CN'; -// 从配置中获取保存的语言设置 -const store = getStore(); -const savedLanguage = (store?.get('set.language') as string) || 'zh-CN'; +const messages = { + 'zh-CN': zhCN, + 'en-US': enUS +} as const; -const options = { - legacy: false, - locale: savedLanguage, - fallbackLocale: 'en-US', - messages: { - 'zh-CN': zhCN, - 'en-US': enUS - }, - silentTranslationWarn: true, - silentFallbackWarn: true -} as I18nOptions; +type Language = keyof typeof messages; -const i18n = createI18n(options); +// 为主进程提供一个简单的 i18n 实现 +const mainI18n = { + global: { + currentLocale: 'zh-CN' as Language, + get locale() { + return this.currentLocale; + }, + set locale(value: Language) { + this.currentLocale = value; + }, + t(key: string) { + const keys = key.split('.'); + let current: any = messages[this.currentLocale]; + for (const k of keys) { + if (current[k] === undefined) { + // 如果找不到翻译,返回键名 + return key; + } + current = current[k]; + } + return current; + }, + messages + } +}; -export const $t: typeof i18n.global.t = i18n.global.t; - -export default i18n; +export type { Language }; +export default mainI18n; diff --git a/src/i18n/renderer.ts b/src/i18n/renderer.ts index 0521055..ba19223 100644 --- a/src/i18n/renderer.ts +++ b/src/i18n/renderer.ts @@ -1,26 +1,21 @@ -import type { I18nOptions } from 'vue-i18n'; import { createI18n } from 'vue-i18n'; import enUS from './lang/en-US'; import zhCN from './lang/zh-CN'; -// 从配置中获取保存的语言设置 -const savedLanguage = - window?.electron?.ipcRenderer?.sendSync('get-store-value', 'set.language') || 'zh-CN'; +const messages = { + 'zh-CN': zhCN, + 'en-US': enUS +}; -const options = { +const i18n = createI18n({ legacy: false, - locale: savedLanguage, + locale: 'zh-CN', fallbackLocale: 'en-US', - messages: { - 'zh-CN': zhCN, - 'en-US': enUS - }, + messages, globalInjection: true, silentTranslationWarn: true, silentFallbackWarn: true -} as I18nOptions; - -const i18n = createI18n(options); +}); export default i18n; diff --git a/src/main/index.ts b/src/main/index.ts index 3023695..0a4d111 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -2,13 +2,14 @@ import { electronApp, optimizer } from '@electron-toolkit/utils'; import { app, ipcMain, nativeImage } from 'electron'; import { join } from 'path'; +import type { Language } from '../i18n/main'; import i18n from '../i18n/main'; import { loadLyricWindow } from './lyric'; import { initializeConfig } from './modules/config'; import { initializeFileManager } from './modules/fileManager'; import { initializeFonts } from './modules/fonts'; import { initializeShortcuts, registerShortcuts } from './modules/shortcuts'; -import { initializeTray } from './modules/tray'; +import { initializeTray, updateTrayMenu } from './modules/tray'; import { setupUpdateHandlers } from './modules/update'; import { createMainWindow, initializeWindowManager } from './modules/window'; import { startMusicApi } from './server'; @@ -28,7 +29,14 @@ let mainWindow: Electron.BrowserWindow; // 初始化应用 function initialize() { // 初始化配置管理 - initializeConfig(); + const store = initializeConfig(); + + // 设置初始语言 + const savedLanguage = store.get('set.language') as Language; + if (savedLanguage) { + i18n.global.locale = savedLanguage; + } + // 初始化文件管理 initializeFileManager(); // 初始化窗口管理 @@ -97,8 +105,11 @@ if (!isSingleInstance) { }); // 监听语言切换 - ipcMain.on('change-language', (_, locale) => { + ipcMain.on('change-language', (_, locale: Language) => { + // 更新主进程的语言设置 i18n.global.locale = locale; + // 更新托盘菜单 + updateTrayMenu(); // 通知所有窗口语言已更改 mainWindow?.webContents.send('language-changed', locale); }); diff --git a/src/main/modules/tray.ts b/src/main/modules/tray.ts index 479ca37..d8e4871 100644 --- a/src/main/modules/tray.ts +++ b/src/main/modules/tray.ts @@ -1,8 +1,59 @@ import { app, BrowserWindow, Menu, nativeImage, Tray } from 'electron'; import { join } from 'path'; +import type { Language } from '../../i18n/main'; +import i18n from '../../i18n/main'; + let tray: Tray | null = null; +const LANGUAGES: { label: string; value: Language }[] = [ + { label: '简体中文', value: 'zh-CN' }, + { label: 'English', value: 'en-US' } +]; + +// 导出更新菜单的函数 +export function updateTrayMenu() { + if (!tray) return; + + // 创建一个上下文菜单 + const contextMenu = Menu.buildFromTemplate([ + { + label: i18n.global.t('common.tray.show'), + click: () => { + BrowserWindow.getAllWindows()[0]?.show(); + } + }, + { type: 'separator' }, + { + label: i18n.global.t('common.language'), + submenu: LANGUAGES.map(({ label, value }) => ({ + label, + type: 'radio', + checked: i18n.global.locale === value, + click: () => { + // 更新主进程的语言设置 + i18n.global.locale = value; + // 更新托盘菜单 + updateTrayMenu(); + // 通知渲染进程 + const win = BrowserWindow.getAllWindows()[0]; + win?.webContents.send('set-language', value); + } + })) + }, + { type: 'separator' }, + { + label: i18n.global.t('common.tray.quit'), + click: () => { + app.quit(); + } + } + ]); + + // 设置系统托盘图标的上下文菜单 + tray.setContextMenu(contextMenu); +} + /** * 初始化系统托盘 */ @@ -12,25 +63,8 @@ export function initializeTray(iconPath: string, mainWindow: BrowserWindow) { .resize({ width: 16, height: 16 }); tray = new Tray(trayIcon); - // 创建一个上下文菜单 - const contextMenu = Menu.buildFromTemplate([ - { - label: '显示', - click: () => { - mainWindow.show(); - } - }, - { - label: '退出', - click: () => { - mainWindow.destroy(); - app.quit(); - } - } - ]); - - // 设置系统托盘图标的上下文菜单 - tray.setContextMenu(contextMenu); + // 初始化菜单 + updateTrayMenu(); // 当系统托盘图标被点击时,切换窗口的显示/隐藏 tray.on('click', () => { diff --git a/src/renderer/App.vue b/src/renderer/App.vue index c13b349..6c35b30 100644 --- a/src/renderer/App.vue +++ b/src/renderer/App.vue @@ -15,18 +15,18 @@ import { darkTheme, lightTheme } from 'naive-ui'; import { computed, onMounted, watch } from 'vue'; import homeRouter from '@/router/home'; -import store from '@/store'; +import globalStore from '@/store'; import { isElectron } from '@/utils'; import { isMobile } from './utils'; const theme = computed(() => { - return store.state.theme; + return globalStore.state.theme; }); // 监听字体变化并应用 watch( - () => [store.state.setData.fontFamily, store.state.setData.fontScope], + () => [globalStore.state.setData.fontFamily, globalStore.state.setData.fontScope], ([newFont, fontScope]) => { const appElement = document.body; if (!appElement) return; @@ -60,12 +60,13 @@ watch( ); onMounted(() => { - store.dispatch('initializeSettings'); - store.dispatch('initializeTheme'); - store.dispatch('initializeSystemFonts'); - store.dispatch('initializePlayState'); + globalStore.dispatch('initializeSettings'); + globalStore.dispatch('initializeLanguage'); + globalStore.dispatch('initializeTheme'); + globalStore.dispatch('initializeSystemFonts'); + globalStore.dispatch('initializePlayState'); if (isMobile.value) { - store.commit( + globalStore.commit( 'setMenus', homeRouter.filter((item) => item.meta.isMobile) ); diff --git a/src/renderer/components/Coffee.vue b/src/renderer/components/Coffee.vue index b9e046a..0e09420 100644 --- a/src/renderer/components/Coffee.vue +++ b/src/renderer/components/Coffee.vue @@ -7,7 +7,7 @@ quaternary class="inline-flex items-center gap-2 px-4 py-2 transition-all duration-300 hover:-translate-y-0.5" > - 请我喝咖啡 + {{ t('comp.coffee.title') }} @@ -17,20 +17,24 @@
当前版本 {{ updateInfo.currentVersion }}
++ {{ t('comp.update.currentVersion') }} {{ updateInfo.currentVersion }} +
- 下载遇到问题?去 + {{ t('comp.installApp.downloadProblem') }} GitHub - 下载最新版本 + {{ t('comp.installApp.downloadProblemLinkText') }}