From ead017e4b1f0e8e63ba23c635fec029c7f4e1c06 Mon Sep 17 00:00:00 2001
From: alger
Date: Wed, 19 Feb 2025 01:01:43 +0800
Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20=E5=9B=BD=E9=99=85=E5=8C=96?=
=?UTF-8?q?=20(i18n)=20=E5=8A=9F=E8=83=BD=E5=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/i18n/lang/en-US.ts | 29 --
src/i18n/lang/en-US/artist.ts | 5 +
src/i18n/lang/en-US/common.ts | 47 +++
src/i18n/lang/en-US/comp.ts | 89 +++++
src/i18n/lang/en-US/donation.ts | 6 +
src/i18n/lang/en-US/download.ts | 36 ++
src/i18n/lang/en-US/favorite.ts | 15 +
src/i18n/lang/en-US/history.ts | 5 +
src/i18n/lang/en-US/index.ts | 29 ++
src/i18n/lang/en-US/login.ts | 22 ++
src/i18n/lang/en-US/player.ts | 49 +++
src/i18n/lang/en-US/search.ts | 19 +
src/i18n/lang/en-US/settings.ts | 208 +++++++++++
src/i18n/lang/en-US/songItem.ts | 18 +
src/i18n/lang/en-US/user.ts | 21 ++
src/i18n/lang/zh-CN.ts | 35 --
src/i18n/lang/zh-CN/artist.ts | 5 +
src/i18n/lang/zh-CN/common.ts | 46 +++
src/i18n/lang/zh-CN/comp.ts | 88 +++++
src/i18n/lang/zh-CN/donation.ts | 5 +
src/i18n/lang/zh-CN/download.ts | 36 ++
src/i18n/lang/zh-CN/favorite.ts | 11 +
src/i18n/lang/zh-CN/history.ts | 5 +
src/i18n/lang/zh-CN/index.ts | 29 ++
src/i18n/lang/zh-CN/login.ts | 22 ++
src/i18n/lang/zh-CN/player.ts | 49 +++
src/i18n/lang/zh-CN/search.ts | 19 +
src/i18n/lang/zh-CN/settings.ts | 208 +++++++++++
src/i18n/lang/zh-CN/songItem.ts | 18 +
src/i18n/lang/zh-CN/user.ts | 21 ++
src/i18n/main.ts | 54 +--
src/i18n/renderer.ts | 21 +-
src/main/index.ts | 17 +-
src/main/modules/tray.ts | 72 +++-
src/renderer/App.vue | 17 +-
src/renderer/components/Coffee.vue | 21 +-
src/renderer/components/LanguageSwitcher.vue | 50 ++-
src/renderer/components/MusicList.vue | 6 +-
src/renderer/components/MvPlayer.vue | 20 +-
src/renderer/components/PlaylistType.vue | 11 +-
src/renderer/components/RecommendAlbum.vue | 6 +-
src/renderer/components/RecommendSinger.vue | 10 +-
src/renderer/components/RecommendSonglist.vue | 6 +-
.../components/common/ArtistDrawer.vue | 13 +-
.../components/common/DonationList.vue | 19 +-
.../components/common/DownloadDrawer.vue | 63 ++--
.../components/common/InstallAppModal.vue | 19 +-
.../components/common/PlaylistDrawer.vue | 47 ++-
src/renderer/components/common/SongItem.vue | 25 +-
.../components/common/UpdateModal.vue | 29 +-
.../components/lyric/LyricSettings.vue | 47 +--
.../components/settings/ShortcutSettings.vue | 41 ++-
src/renderer/hooks/MusicHook.ts | 4 +-
src/renderer/layout/components/MusicFull.vue | 4 +-
src/renderer/layout/components/PlayBar.vue | 41 ++-
src/renderer/layout/components/SearchBar.vue | 22 +-
src/renderer/layout/components/TitleBar.vue | 14 +-
src/renderer/store/index.ts | 23 ++
src/renderer/views/favorite/index.vue | 32 +-
src/renderer/views/history/index.vue | 12 +-
src/renderer/views/login/index.vue | 42 ++-
src/renderer/views/search/index.vue | 16 +-
src/renderer/views/set/index.vue | 335 ++++++++++--------
src/renderer/views/user/index.vue | 26 +-
64 files changed, 1870 insertions(+), 510 deletions(-)
delete mode 100644 src/i18n/lang/en-US.ts
create mode 100644 src/i18n/lang/en-US/artist.ts
create mode 100644 src/i18n/lang/en-US/common.ts
create mode 100644 src/i18n/lang/en-US/comp.ts
create mode 100644 src/i18n/lang/en-US/donation.ts
create mode 100644 src/i18n/lang/en-US/download.ts
create mode 100644 src/i18n/lang/en-US/favorite.ts
create mode 100644 src/i18n/lang/en-US/history.ts
create mode 100644 src/i18n/lang/en-US/index.ts
create mode 100644 src/i18n/lang/en-US/login.ts
create mode 100644 src/i18n/lang/en-US/player.ts
create mode 100644 src/i18n/lang/en-US/search.ts
create mode 100644 src/i18n/lang/en-US/settings.ts
create mode 100644 src/i18n/lang/en-US/songItem.ts
create mode 100644 src/i18n/lang/en-US/user.ts
delete mode 100644 src/i18n/lang/zh-CN.ts
create mode 100644 src/i18n/lang/zh-CN/artist.ts
create mode 100644 src/i18n/lang/zh-CN/common.ts
create mode 100644 src/i18n/lang/zh-CN/comp.ts
create mode 100644 src/i18n/lang/zh-CN/donation.ts
create mode 100644 src/i18n/lang/zh-CN/download.ts
create mode 100644 src/i18n/lang/zh-CN/favorite.ts
create mode 100644 src/i18n/lang/zh-CN/history.ts
create mode 100644 src/i18n/lang/zh-CN/index.ts
create mode 100644 src/i18n/lang/zh-CN/login.ts
create mode 100644 src/i18n/lang/zh-CN/player.ts
create mode 100644 src/i18n/lang/zh-CN/search.ts
create mode 100644 src/i18n/lang/zh-CN/settings.ts
create mode 100644 src/i18n/lang/zh-CN/songItem.ts
create mode 100644 src/i18n/lang/zh-CN/user.ts
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 @@
- 支付宝
+ {{
+ t('comp.coffee.alipay')
+ }}
- 微信支付
+ {{
+ t('comp.coffee.wechat')
+ }}
@@ -39,7 +43,7 @@
class="text-sm text-gray-700 dark:text-gray-200 text-center cursor-pointer hover:text-green-500"
@click="copyQQ"
>
- QQ群:789288579
+ {{ t('comp.coffee.qqGroup') }}
@@ -48,11 +52,14 @@
-
+
diff --git a/src/renderer/components/MusicList.vue b/src/renderer/components/MusicList.vue
index e261758..0fe2bca 100644
--- a/src/renderer/components/MusicList.vue
+++ b/src/renderer/components/MusicList.vue
@@ -66,7 +66,9 @@
@remove-song="(id) => emit('remove-song', id)"
/>
- 加载更多...
+
+ {{ t('common.loadingMore') }}
+
@@ -80,6 +82,7 @@
diff --git a/src/renderer/components/common/UpdateModal.vue b/src/renderer/components/common/UpdateModal.vue
index 3730834..99a1de0 100644
--- a/src/renderer/components/common/UpdateModal.vue
+++ b/src/renderer/components/common/UpdateModal.vue
@@ -14,8 +14,10 @@
-
发现新版本 {{ updateInfo.latestVersion }}
-
当前版本 {{ updateInfo.currentVersion }}
+
{{ t('comp.update.title') }} {{ updateInfo.latestVersion }}
+
+ {{ t('comp.update.currentVersion') }} {{ updateInfo.currentVersion }}
+
@@ -39,7 +41,7 @@
:loading="downloading"
@click="closeModal"
>
- {{ '暂不更新' }}
+ {{ t('comp.update.cancel') }}
- 下载遇到问题?去
+ {{ t('comp.installApp.downloadProblem') }}
GitHub
- 下载最新版本
+ {{ t('comp.installApp.downloadProblemLinkText') }}
@@ -70,12 +72,15 @@