diff --git a/src/components/Navbar.vue b/src/components/Navbar.vue
index ac6429d..372fca0 100644
--- a/src/components/Navbar.vue
+++ b/src/components/Navbar.vue
@@ -112,7 +112,7 @@ export default {
data() {
return {
inputFocus: false,
- langs: ['zh-CN', 'en', 'tr'],
+ langs: ['zh-CN', 'zh-TW', 'en', 'tr'],
keywords: '',
isWindowMaximized: false,
};
diff --git a/src/locale/index.js b/src/locale/index.js
index 1d15041..e528213 100644
--- a/src/locale/index.js
+++ b/src/locale/index.js
@@ -5,6 +5,7 @@ import store from '@/store';
import en from './lang/en.js';
import zhCN from './lang/zh-CN.js';
+import zhTW from './lang/zh-TW.js';
import tr from './lang/tr.js';
Vue.use(VueClipboard);
@@ -15,6 +16,7 @@ const i18n = new VueI18n({
messages: {
en,
'zh-CN': zhCN,
+ 'zh-TW': zhTW,
tr,
},
silentTranslationWarn: true,
diff --git a/src/locale/lang/zh-TW.js b/src/locale/lang/zh-TW.js
new file mode 100644
index 0000000..92e4859
--- /dev/null
+++ b/src/locale/lang/zh-TW.js
@@ -0,0 +1,186 @@
+export default {
+ common: {
+ play: '播放',
+ songs: '首歌',
+ },
+ nav: {
+ home: '首頁',
+ explore: '發現',
+ library: '音樂庫',
+ search: '搜尋',
+ github: 'GitHub Repo',
+ },
+ home: {
+ recommendPlaylist: '推薦歌單',
+ recommendArtist: '推薦藝人',
+ newAlbum: '新曲上架',
+ seeMore: '查看全部',
+ charts: '排行榜',
+ },
+ library: {
+ sLibrary: '的音樂庫',
+ likedSongs: '我喜歡的音樂',
+ sLikedSongs: '喜歡的音樂',
+ playlists: '歌單',
+ albums: '專輯',
+ artists: '藝人',
+ mvs: 'MV',
+ newPlayList: '新增歌單',
+ userProfileMenu: {
+ settings: '設定',
+ logout: '登出',
+ },
+ },
+ explore: {
+ explore: '探索',
+ loadMore: '載入更多',
+ },
+ artist: {
+ latestRelease: '最新發佈',
+ popularSongs: '熱門歌曲',
+ showMore: '顯示更多',
+ showLess: '收起',
+ EPsSingles: 'EP 和單曲',
+ albums: '專輯',
+ withAlbums: '張專輯',
+ artist: '藝人',
+ videos: '個 MV',
+ following: '正在追蹤',
+ follow: '追蹤',
+ },
+ album: {
+ released: '發行於',
+ },
+ playlist: {
+ playlist: '歌單',
+ updatedAt: '最後更新於',
+ search: '搜尋歌單內音樂',
+ },
+ login: {
+ accessToAll: '可存取全部數據',
+ loginText: '登入網易雲帳號',
+ search: '搜尋網易雲帳號',
+ readonly: '只能讀取帳號公開數據',
+ usernameLogin: '使用者名稱登入',
+ searchHolder: '請輸入您的網易雲使用者名稱',
+ enterTip: '按 Enter 搜尋',
+ choose: '在選單中選擇你的帳號',
+ confirm: '確認',
+ countryCode: '國際區碼',
+ phone: '手機號碼',
+ email: 'Email',
+ password: '密碼',
+ login: '登入',
+ loginWithEmail: '信箱登入',
+ loginWithPhone: '手機號碼登入',
+ notice: `YesPlayMusic 承諾不會保存您的任何帳號資訊到雲端。
+ 您的密碼會在本地進行 MD5 加密後再傳輸到網易雲 API。
+ YesPlayMusic 並非網易雲官方網站,輸入帳號資訊前請慎重考慮。 您也可以前往
+ YesPlayMusic 的 GitHub 原始碼 Repo
+ 自行編譯並使用自託管的網易雲 API。`,
+ noticeElectron: `您的密碼會在本地進行 MD5 加密後再傳輸到網易雲 API。
+ YesPlayMusic 不會傳輸你的帳號數據到任何非網易雲音樂官方的伺服器。
`,
+ },
+ mv: {
+ moreVideo: '更多影片',
+ },
+ next: {
+ nowPlaying: '正在播放',
+ nextUp: '即將播放',
+ },
+ player: {
+ like: '喜歡',
+ previous: '上一首',
+ next: '下一首',
+ repeat: '循環播放',
+ repeatTrack: '單曲循環',
+ shuffle: '隨機播放',
+ play: '播放',
+ pause: '暫停',
+ mute: '靜音',
+ nextUp: '播放清單',
+ },
+ modal: {
+ close: '關閉',
+ },
+ search: {
+ artist: '藝人',
+ album: '專輯',
+ song: '歌曲',
+ mv: '影片',
+ playlist: '歌單',
+ noResult: '暫無結果',
+ searchFor: '搜尋',
+ },
+ settings: {
+ settings: '設定',
+ logout: '登出',
+ language: '語言',
+ musicQuality: {
+ text: '音質選擇',
+ low: '普通',
+ medium: '較高',
+ high: '極高',
+ lossless: '無損',
+ },
+ cacheLimit: {
+ text: '歌曲快取上限',
+ none: '無限制',
+ },
+ lyricFontSize: {
+ text: '歌詞字體大小',
+ small: '小',
+ medium: '中',
+ large: '大(預設)',
+ xlarge: '超大',
+ },
+ deviceSelector: '音訊輸出裝置',
+ permissionRequired: '需要麥克風權限',
+ appearance: {
+ text: '外觀',
+ auto: '自動',
+ light: '淺色',
+ dark: '深色',
+ },
+ automaticallyCacheSongs: '自動快取歌曲',
+ clearSongsCache: '清除歌曲快取',
+ cacheCount: '已快取 {song} 首 ({size})',
+ showLyricsTranslation: '顯示歌詞翻譯',
+ minimizeToTray: '最小化到系統列',
+ showPlaylistsByAppleMusic: '首頁顯示來自 Apple Music 的歌單',
+ enableDiscordRichPresence: '啟用 Discord Rich Presence',
+ enableGlobalShortcut: '啟用全域快捷鍵',
+ showLibraryDefault: '啟動後顯示音樂庫',
+ lyricsBackground: {
+ text: '顯示歌詞背景',
+ off: '關閉',
+ on: '開啟',
+ dynamic: '動態(GPU 占用較高)',
+ },
+ },
+ contextMenu: {
+ play: '播放',
+ addToQueue: '新增至佇列',
+ saveToMyLikedSongs: '新增至我喜歡的音樂',
+ removeFromMyLikedSongs: '從喜歡的音樂中刪除',
+ saveToLibrary: '新增至音樂庫',
+ removeFromLibrary: '從音樂庫刪除',
+ addToPlaylist: '新增至歌單',
+ searchInPlaylist: '歌單內搜尋',
+ copyUrl: '複製超連結',
+ allPlaylists: '全部歌單',
+ minePlaylists: '我建立的歌單',
+ likedPlaylists: '收藏的歌單',
+ },
+ toast: {
+ savedToPlaylist: '已新增至歌單',
+ removedFromPlaylist: '已從歌單中刪除',
+ savedToMyLikedSongs: '已新增至我喜歡的音樂',
+ removedFromMyLikedSongs: '已從喜歡的音樂中刪除',
+ copied: '已複製',
+ copyFailed: '複製失敗:',
+ needToLogin: '此動作需要登入網易雲帳號',
+ },
+};
diff --git a/src/store/index.js b/src/store/index.js
index 53201a0..d4804d6 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -29,10 +29,15 @@ if ([undefined, null].includes(store.state.settings.lang)) {
const defaultLang = 'en';
const langMapper = new Map()
.set('zh', 'zh-CN')
+ .set('zh-TW', 'zh-TW')
.set('en', 'en')
.set('tr', 'tr');
store.state.settings.lang =
- langMapper.get(navigator.language.slice(0, 2)) || defaultLang;
+ langMapper.get(
+ langMapper.has(navigator.language)
+ ? navigator.language
+ : navigator.language.slice(0, 2)
+ ) || defaultLang;
localStorage.setItem('settings', JSON.stringify(store.state.settings));
}
diff --git a/src/utils/filters.js b/src/utils/filters.js
index d7d78c9..5f3ed82 100644
--- a/src/utils/filters.js
+++ b/src/utils/filters.js
@@ -19,8 +19,21 @@ Vue.filter('formatTime', (Milliseconds, format = 'HH:MM:SS') => {
? `${hours}:${mins.padStart(2, '0')}:${seconds}`
: `${mins}:${seconds}`;
} else if (format === 'Human') {
- const hoursUnit = locale.locale === 'zh-CN' ? '小时' : 'hr';
- const minitesUnit = locale.locale === 'zh-CN' ? '分钟' : 'min';
+ let hoursUnit, minitesUnit;
+ switch (locale.locale) {
+ case 'zh-CN':
+ hoursUnit = '小时';
+ minitesUnit = '分钟';
+ break;
+ case 'zh-TW':
+ hoursUnit = '小時';
+ minitesUnit = '分鐘';
+ break;
+ default:
+ hoursUnit = 'hr';
+ minitesUnit = 'min';
+ break;
+ }
return hours !== '0'
? `${hours} ${hoursUnit} ${mins} ${minitesUnit}`
: `${mins} ${minitesUnit}`;
@@ -30,6 +43,7 @@ Vue.filter('formatTime', (Milliseconds, format = 'HH:MM:SS') => {
Vue.filter('formatDate', (timestamp, format = 'MMM D, YYYY') => {
if (!timestamp) return '';
if (locale.locale === 'zh-CN') format = 'YYYY年MM月DD日';
+ else if (locale.locale === 'zh-TW') format = 'YYYY年MM月DD日';
return dayjs(timestamp).format(format);
});
@@ -68,6 +82,17 @@ Vue.filter('formatPlayCount', count => {
return `${Math.floor((count / 10000) * 100) / 100}万`; // 2.3 万
}
return count;
+ } else if (locale.locale === 'zh-TW') {
+ if (count > 100000000) {
+ return `${Math.floor((count / 100000000) * 100) / 100}億`; // 2.32 億
+ }
+ if (count > 100000) {
+ return `${Math.floor((count / 10000) * 10) / 10}萬`; // 232.1 萬
+ }
+ if (count > 10000) {
+ return `${Math.floor((count / 10000) * 100) / 100}萬`; // 2.3 萬
+ }
+ return count;
} else {
if (count > 10000000) {
return `${Math.floor((count / 1000000) * 10) / 10}M`; // 233.2M
diff --git a/src/views/settings.vue b/src/views/settings.vue
index dc9c44f..bd76c56 100644
--- a/src/views/settings.vue
+++ b/src/views/settings.vue
@@ -35,6 +35,7 @@
+
@@ -916,6 +917,8 @@ export default {
.replace('Left', '←');
if (this.settings.lang === 'zh-CN') {
shortcut = shortcut.replace('Space', '空格');
+ } else if (this.settings.lang === 'zh-TW') {
+ shortcut = shortcut.replace('Space', '空白鍵');
}
if (process.platform === 'darwin') {
return shortcut