From 306215669d07b9889693221c71d075a94df43b84 Mon Sep 17 00:00:00 2001 From: algerkong Date: Sat, 26 Jul 2025 23:32:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E6=97=A5=E8=AF=AD?= =?UTF-8?q?=E5=92=8C=E9=9F=A9=E8=AF=AD=E5=9B=BD=E9=99=85=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E4=B8=94=E4=BC=98=E5=8C=96=E8=AF=AD=E8=A8=80=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron.vite.config.ts | 3 +- src/i18n/lang/en-US/index.ts | 29 -- src/i18n/lang/ja-JP/README.md | 38 +++ src/i18n/lang/ja-JP/artist.ts | 5 + src/i18n/lang/ja-JP/common.ts | 56 ++++ src/i18n/lang/ja-JP/comp.ts | 190 +++++++++++++ src/i18n/lang/ja-JP/donation.ts | 8 + src/i18n/lang/ja-JP/download.ts | 87 ++++++ src/i18n/lang/ja-JP/favorite.ts | 13 + src/i18n/lang/ja-JP/history.ts | 5 + src/i18n/lang/ja-JP/login.ts | 22 ++ src/i18n/lang/ja-JP/player.ts | 123 ++++++++ src/i18n/lang/ja-JP/search.ts | 27 ++ src/i18n/lang/ja-JP/settings.ts | 285 +++++++++++++++++++ src/i18n/lang/ja-JP/songItem.ts | 28 ++ src/i18n/lang/ja-JP/user.ts | 48 ++++ src/i18n/lang/ko-KR/artist.ts | 5 + src/i18n/lang/ko-KR/common.ts | 56 ++++ src/i18n/lang/ko-KR/comp.ts | 190 +++++++++++++ src/i18n/lang/ko-KR/donation.ts | 8 + src/i18n/lang/ko-KR/download.ts | 87 ++++++ src/i18n/lang/ko-KR/favorite.ts | 13 + src/i18n/lang/ko-KR/history.ts | 5 + src/i18n/lang/ko-KR/login.ts | 22 ++ src/i18n/lang/ko-KR/player.ts | 122 ++++++++ src/i18n/lang/ko-KR/search.ts | 27 ++ src/i18n/lang/ko-KR/settings.ts | 285 +++++++++++++++++++ src/i18n/lang/ko-KR/songItem.ts | 28 ++ src/i18n/lang/ko-KR/user.ts | 48 ++++ src/i18n/lang/zh-CN/index.ts | 29 -- src/i18n/lang/zh-Hant/index.ts | 29 -- src/i18n/languages.ts | 25 ++ src/i18n/main.ts | 14 +- src/i18n/renderer.ts | 16 +- src/i18n/utils.ts | 60 ++++ src/locale/zh-CN.json | 58 ---- src/main/modules/tray.ts | 9 +- src/renderer/components/LanguageSwitcher.vue | 8 +- tsconfig.node.json | 14 + tsconfig.web.json | 3 +- vite.config.ts | 3 +- 41 files changed, 1953 insertions(+), 178 deletions(-) delete mode 100644 src/i18n/lang/en-US/index.ts create mode 100644 src/i18n/lang/ja-JP/README.md create mode 100644 src/i18n/lang/ja-JP/artist.ts create mode 100644 src/i18n/lang/ja-JP/common.ts create mode 100644 src/i18n/lang/ja-JP/comp.ts create mode 100644 src/i18n/lang/ja-JP/donation.ts create mode 100644 src/i18n/lang/ja-JP/download.ts create mode 100644 src/i18n/lang/ja-JP/favorite.ts create mode 100644 src/i18n/lang/ja-JP/history.ts create mode 100644 src/i18n/lang/ja-JP/login.ts create mode 100644 src/i18n/lang/ja-JP/player.ts create mode 100644 src/i18n/lang/ja-JP/search.ts create mode 100644 src/i18n/lang/ja-JP/settings.ts create mode 100644 src/i18n/lang/ja-JP/songItem.ts create mode 100644 src/i18n/lang/ja-JP/user.ts create mode 100644 src/i18n/lang/ko-KR/artist.ts create mode 100644 src/i18n/lang/ko-KR/common.ts create mode 100644 src/i18n/lang/ko-KR/comp.ts create mode 100644 src/i18n/lang/ko-KR/donation.ts create mode 100644 src/i18n/lang/ko-KR/download.ts create mode 100644 src/i18n/lang/ko-KR/favorite.ts create mode 100644 src/i18n/lang/ko-KR/history.ts create mode 100644 src/i18n/lang/ko-KR/login.ts create mode 100644 src/i18n/lang/ko-KR/player.ts create mode 100644 src/i18n/lang/ko-KR/search.ts create mode 100644 src/i18n/lang/ko-KR/settings.ts create mode 100644 src/i18n/lang/ko-KR/songItem.ts create mode 100644 src/i18n/lang/ko-KR/user.ts delete mode 100644 src/i18n/lang/zh-CN/index.ts delete mode 100644 src/i18n/lang/zh-Hant/index.ts create mode 100644 src/i18n/languages.ts create mode 100644 src/i18n/utils.ts delete mode 100644 src/locale/zh-CN.json diff --git a/electron.vite.config.ts b/electron.vite.config.ts index 7371e47..82aa7d7 100644 --- a/electron.vite.config.ts +++ b/electron.vite.config.ts @@ -18,7 +18,8 @@ export default defineConfig({ resolve: { alias: { '@': resolve('src/renderer'), - '@renderer': resolve('src/renderer') + '@renderer': resolve('src/renderer'), + '@i18n': resolve('src/i18n') } }, plugins: [ diff --git a/src/i18n/lang/en-US/index.ts b/src/i18n/lang/en-US/index.ts deleted file mode 100644 index 3619c66..0000000 --- a/src/i18n/lang/en-US/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -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/ja-JP/README.md b/src/i18n/lang/ja-JP/README.md new file mode 100644 index 0000000..dba757b --- /dev/null +++ b/src/i18n/lang/ja-JP/README.md @@ -0,0 +1,38 @@ +# 日本語翻訳 (Japanese Translation) + +このディレクトリには、AlgerMusicPlayerの日本語翻訳ファイルが含まれています。 + +## ファイル構成 + +- `artist.ts` - アーティスト関連の翻訳 +- `common.ts` - 共通の翻訳(ボタン、メッセージなど) +- `comp.ts` - コンポーネント関連の翻訳 +- `donation.ts` - 寄付関連の翻訳 +- `download.ts` - ダウンロード管理の翻訳 +- `favorite.ts` - お気に入り機能の翻訳 +- `history.ts` - 履歴機能の翻訳 +- `login.ts` - ログイン関連の翻訳 +- `player.ts` - プレイヤー機能の翻訳 +- `search.ts` - 検索機能の翻訳 +- `settings.ts` - 設定画面の翻訳 +- `songItem.ts` - 楽曲アイテムの翻訳 +- `user.ts` - ユーザー関連の翻訳 +- `index.ts` - すべての翻訳をエクスポートするメインファイル + +## 使用方法 + +アプリケーション内で言語を日本語に切り替えるには: + +1. 設定画面を開く +2. 「言語設定」セクションを見つける +3. ドロップダウンメニューから「日本語」を選択 + +## 翻訳の改善 + +翻訳の改善や修正がある場合は、該当するファイルを編集してプルリクエストを送信してください。 + +## 注意事項 + +- すべての翻訳キーは中国語版と英語版に対応しています +- 新しい機能が追加された場合は、対応する日本語翻訳も追加する必要があります +- 文字化けを避けるため、ファイルはUTF-8エンコーディングで保存してください \ No newline at end of file diff --git a/src/i18n/lang/ja-JP/artist.ts b/src/i18n/lang/ja-JP/artist.ts new file mode 100644 index 0000000..ab0a41b --- /dev/null +++ b/src/i18n/lang/ja-JP/artist.ts @@ -0,0 +1,5 @@ +export default { + hotSongs: '人気楽曲', + albums: 'アルバム', + description: 'アーティスト紹介' +}; \ No newline at end of file diff --git a/src/i18n/lang/ja-JP/common.ts b/src/i18n/lang/ja-JP/common.ts new file mode 100644 index 0000000..5883d7b --- /dev/null +++ b/src/i18n/lang/ja-JP/common.ts @@ -0,0 +1,56 @@ +export default { + play: '再生', + next: '次の曲', + previous: '前の曲', + volume: '音量', + settings: '設定', + search: '検索', + loading: '読み込み中...', + loadingMore: 'さらに読み込み中...', + alipay: 'Alipay', + wechat: 'WeChat Pay', + on: 'オン', + off: 'オフ', + show: '表示', + hide: '非表示', + confirm: '確認', + cancel: 'キャンセル', + configure: '設定', + open: '開く', + modify: '変更', + success: '操作成功', + error: '操作失敗', + warning: '警告', + info: 'お知らせ', + save: '保存', + delete: '削除', + refresh: '更新', + retry: '再試行', + reset: 'リセット', + back: '戻る', + copySuccess: 'クリップボードにコピーしました', + copyFailed: 'コピーに失敗しました', + validation: { + required: 'この項目は必須です', + invalidInput: '無効な入力です', + selectRequired: 'オプションを選択してください', + numberRange: '{min}から{max}の間の数値を入力してください' + }, + viewMore: 'もっと見る', + noMore: 'これ以上ありません', + selectAll: '全選択', + expand: '展開', + collapse: '折りたたみ', + songCount: '{count}曲', + language: '言語', + tray: { + show: '表示', + quit: '終了', + playPause: '再生/一時停止', + prev: '前の曲', + next: '次の曲', + pause: '一時停止', + play: '再生', + favorite: 'お気に入り' + } +}; \ No newline at end of file diff --git a/src/i18n/lang/ja-JP/comp.ts b/src/i18n/lang/ja-JP/comp.ts new file mode 100644 index 0000000..a58fe58 --- /dev/null +++ b/src/i18n/lang/ja-JP/comp.ts @@ -0,0 +1,190 @@ +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: '現在のシステムに適したインストールパッケージが見つかりません。手動でダウンロードしてください', + installConfirmTitle: '更新をインストール', + installConfirmContent: 'アプリを閉じて更新をインストールしますか?', + manualInstallTip: 'アプリを閉じた後にインストーラーが正常に起動しない場合は、ダウンロードフォルダでファイルを見つけて手動で開いてください。', + yesInstall: '今すぐインストール', + noThanks: '後でインストール', + fileLocation: 'ファイルの場所', + copy: 'パスをコピー', + copySuccess: 'パスをクリップボードにコピーしました', + copyFailed: 'コピーに失敗しました', + backgroundDownload: 'バックグラウンドダウンロード' + }, + coffee: { + title: 'コーヒーをおごる', + alipay: 'Alipay', + wechat: 'WeChat Pay', + alipayQR: 'Alipay QRコード', + wechatQR: 'WeChat QRコード', + coffeeDesc: '一杯のコーヒー、一つのサポート', + coffeeDescLinkText: 'もっと見る', + qqGroup: 'QQチャンネル:algermusic', + messages: { + copySuccess: 'クリップボードにコピーしました' + }, + donateList: 'コーヒーをおごる' + }, + playlistType: { + title: 'プレイリストカテゴリ', + showAll: 'すべて表示', + hide: '一部を非表示' + }, + recommendAlbum: { + title: '最新アルバム' + }, + recommendSinger: { + title: '毎日のおすすめ', + songlist: '毎日のおすすめリスト' + }, + recommendSonglist: { + title: '今週の人気音楽' + }, + searchBar: { + login: 'ログイン', + toLogin: 'ログインへ', + logout: 'ログアウト', + set: '設定', + theme: 'テーマ', + restart: '再起動', + refresh: '更新', + currentVersion: '現在のバージョン', + searchPlaceholder: '何かを検索してみましょう...', + zoom: 'ページズーム', + zoom100: '標準ズーム100%', + resetZoom: 'クリックしてズームをリセット', + zoomDefault: '標準ズーム' + }, + titleBar: { + closeTitle: '閉じる方法を選択してください', + minimizeToTray: 'トレイに最小化', + exitApp: 'アプリを終了', + rememberChoice: '選択を記憶する', + closeApp: 'アプリを閉じる' + }, + userPlayList: { + title: '{name}のよく聞く音楽' + }, + musicList: { + searchSongs: '楽曲を検索', + noSearchResults: '関連する楽曲が見つかりませんでした', + switchToNormal: 'デフォルトレイアウトに切り替え', + switchToCompact: 'コンパクトレイアウトに切り替え', + playAll: 'すべて再生', + collect: 'お気に入り', + collectSuccess: 'お気に入りに追加しました', + cancelCollectSuccess: 'お気に入りから削除しました', + operationFailed: '操作に失敗しました', + cancelCollect: 'お気に入りから削除', + addToPlaylist: 'プレイリストに追加', + addToPlaylistSuccess: 'プレイリストに追加しました', + songsAlreadyInPlaylist: '楽曲は既にプレイリストに存在します' + }, + playlist: { + import: { + button: 'プレイリストインポート', + title: 'プレイリストインポート', + description: 'メタデータ/テキスト/リンクの3つの方法でプレイリストをインポートできます', + linkTab: 'リンクインポート', + textTab: 'テキストインポート', + localTab: 'メタデータインポート', + linkPlaceholder: 'プレイリストのリンクを入力してください(1行に1つ)', + textPlaceholder: '楽曲情報を入力してください。形式:楽曲名 アーティスト名', + localPlaceholder: 'JSON形式の楽曲メタデータを入力してください', + linkTips: 'サポートされているリンクソース:', + linkTip1: 'プレイリストをWeChat/Weibo/QQでシェアした後、リンクをコピー', + linkTip2: 'プレイリスト/個人ページのリンクを直接コピー', + linkTip3: '記事のリンクを直接コピー', + textTips: '楽曲情報を入力してください(1行に1曲)', + textFormat: '形式:楽曲名 アーティスト名', + localTips: '楽曲メタデータを追加してください', + localFormat: '形式例:', + songNamePlaceholder: '楽曲名', + artistNamePlaceholder: 'アーティスト名', + albumNamePlaceholder: 'アルバム名', + addSongButton: '楽曲を追加', + addLinkButton: 'リンクを追加', + importToStarPlaylist: 'お気に入りの音楽にインポート', + playlistNamePlaceholder: 'プレイリスト名を入力してください', + importButton: 'インポート開始', + emptyLinkWarning: 'プレイリストのリンクを入力してください', + emptyTextWarning: '楽曲情報を入力してください', + emptyLocalWarning: '楽曲メタデータを入力してください', + invalidJsonFormat: 'JSON形式が正しくありません', + importSuccess: 'インポートタスクの作成に成功しました', + importFailed: 'インポートに失敗しました', + importStatus: 'インポート状況', + refresh: '更新', + taskId: 'タスクID', + status: 'ステータス', + successCount: '成功数', + failReason: '失敗理由', + unknownError: '不明なエラー', + statusPending: '処理待ち', + statusProcessing: '処理中', + statusSuccess: 'インポート成功', + statusFailed: 'インポート失敗', + statusUnknown: '不明なステータス', + taskList: 'タスクリスト', + taskListTitle: 'インポートタスクリスト', + action: '操作', + select: '選択', + fetchTaskListFailed: 'タスクリストの取得に失敗しました', + noTasks: 'インポートタスクがありません', + clearTasks: 'タスクをクリア', + clearTasksConfirmTitle: 'クリア確認', + clearTasksConfirmContent: 'すべてのインポートタスク記録をクリアしますか?この操作は元に戻せません。', + confirm: '確認', + cancel: 'キャンセル', + clearTasksSuccess: 'タスクリストをクリアしました', + clearTasksFailed: 'タスクリストのクリアに失敗しました' + } + }, + settings: '設定', + user: 'ユーザー', + toplist: 'ランキング', + history: 'お気に入り履歴', + list: 'プレイリスト', + mv: 'MV', + home: 'ホーム', + search: '検索' +}; \ No newline at end of file diff --git a/src/i18n/lang/ja-JP/donation.ts b/src/i18n/lang/ja-JP/donation.ts new file mode 100644 index 0000000..b5a19e2 --- /dev/null +++ b/src/i18n/lang/ja-JP/donation.ts @@ -0,0 +1,8 @@ +export default { + description: 'あなたの寄付は開発・保守作業をサポートするために使用され、サーバー保守、ドメイン更新などが含まれます。', + message: 'メッセージを残す際は、メールアドレスやGitHubユーザー名を記載してください。', + refresh: 'リストを更新', + toDonateList: 'コーヒーをおごる', + noMessage: 'メッセージがありません', + title: '寄付リスト' +}; \ No newline at end of file diff --git a/src/i18n/lang/ja-JP/download.ts b/src/i18n/lang/ja-JP/download.ts new file mode 100644 index 0000000..8e05f1a --- /dev/null +++ b/src/i18n/lang/ja-JP/download.ts @@ -0,0 +1,87 @@ +export default { + title: 'ダウンロード管理', + localMusic: 'ローカル音楽', + count: '合計{count}曲', + clearAll: '記録をクリア', + settings: '設定', + tabs: { + downloading: 'ダウンロード中', + downloaded: 'ダウンロード済み' + }, + empty: { + noTasks: 'ダウンロードタスクがありません', + noDownloaded: 'ダウンロード済みの楽曲がありません' + }, + progress: { + total: '全体の進行状況: {progress}%' + }, + status: { + downloading: 'ダウンロード中', + completed: '完了', + failed: '失敗', + unknown: '不明' + }, + artist: { + unknown: '不明なアーティスト' + }, + delete: { + title: '削除確認', + message: '楽曲「{filename}」を削除しますか?この操作は元に戻せません。', + confirm: '削除確認', + cancel: 'キャンセル', + success: '削除成功', + failed: '削除失敗', + fileNotFound: 'ファイルが存在しないか移動されました。記録から削除しました', + recordRemoved: 'ファイルの削除に失敗しましたが、記録から削除しました' + }, + clear: { + title: 'ダウンロード記録をクリア', + message: 'すべてのダウンロード記録をクリアしますか?この操作はダウンロード済みの音楽ファイルを削除しませんが、すべての記録をクリアします。', + confirm: 'クリア確認', + cancel: 'キャンセル', + success: 'ダウンロード記録をクリアしました' + }, + message: { + downloadComplete: '{filename}のダウンロードが完了しました', + downloadFailed: '{filename}のダウンロードに失敗しました: {error}' + }, + loading: '読み込み中...', + playStarted: '再生開始: {name}', + playFailed: '再生失敗: {name}', + path: { + copied: 'パスをクリップボードにコピーしました', + copyFailed: 'パスのコピーに失敗しました' + }, + settingsPanel: { + title: 'ダウンロード設定', + path: 'ダウンロード場所', + pathDesc: '音楽ファイルのダウンロード保存場所を設定', + pathPlaceholder: 'ダウンロードパスを選択してください', + noPathSelected: 'まずダウンロードパスを選択してください', + select: 'フォルダを選択', + open: 'フォルダを開く', + fileFormat: 'ファイル名形式', + fileFormatDesc: '音楽ダウンロード時のファイル命名形式を設定', + customFormat: 'カスタム形式', + separator: '区切り文字', + separators: { + dash: 'スペース-スペース', + underscore: 'アンダースコア', + space: 'スペース' + }, + dragToArrange: 'ドラッグで並び替えまたは矢印ボタンで順序を調整:', + formatVariables: '使用可能な変数', + preview: 'プレビュー効果:', + saveSuccess: 'ダウンロード設定を保存しました', + presets: { + songArtist: '楽曲名 - アーティスト名', + artistSong: 'アーティスト名 - 楽曲名', + songOnly: '楽曲名のみ' + }, + components: { + songName: '楽曲名', + artistName: 'アーティスト名', + albumName: 'アルバム名' + } + } +}; \ No newline at end of file diff --git a/src/i18n/lang/ja-JP/favorite.ts b/src/i18n/lang/ja-JP/favorite.ts new file mode 100644 index 0000000..6374f97 --- /dev/null +++ b/src/i18n/lang/ja-JP/favorite.ts @@ -0,0 +1,13 @@ +export default { + title: 'お気に入り', + count: '合計{count}曲', + batchDownload: '一括ダウンロード', + download: 'ダウンロード ({count})', + emptyTip: 'まだお気に入りの楽曲がありません', + downloadSuccess: 'ダウンロード完了', + downloadFailed: 'ダウンロード失敗', + downloading: 'ダウンロード中です。しばらくお待ちください...', + selectSongsFirst: 'まずダウンロードする楽曲を選択してください', + descending: '降順', + ascending: '昇順' +}; \ No newline at end of file diff --git a/src/i18n/lang/ja-JP/history.ts b/src/i18n/lang/ja-JP/history.ts new file mode 100644 index 0000000..ef833a0 --- /dev/null +++ b/src/i18n/lang/ja-JP/history.ts @@ -0,0 +1,5 @@ +export default { + title: '再生履歴', + playCount: '{count}', + getHistoryFailed: '履歴の取得に失敗しました' +}; \ No newline at end of file diff --git a/src/i18n/lang/ja-JP/login.ts b/src/i18n/lang/ja-JP/login.ts new file mode 100644 index 0000000..8883acf --- /dev/null +++ b/src/i18n/lang/ja-JP/login.ts @@ -0,0 +1,22 @@ +export default { + title: { + qr: 'QRコードログイン', + phone: '電話番号ログイン' + }, + qrTip: 'NetEase Cloudアプリでログイン', + phoneTip: 'NetEase Cloudアカウントでログイン', + placeholder: { + phone: '電話番号', + password: 'パスワード' + }, + button: { + login: 'ログイン', + switchToQr: 'QRコードログイン', + switchToPhone: '電話番号ログイン' + }, + message: { + loginSuccess: 'ログイン成功', + loadError: 'ログイン情報の読み込み中にエラーが発生しました', + qrCheckError: 'QRコードの状態確認中にエラーが発生しました' + } +}; \ No newline at end of file diff --git a/src/i18n/lang/ja-JP/player.ts b/src/i18n/lang/ja-JP/player.ts new file mode 100644 index 0000000..21e4777 --- /dev/null +++ b/src/i18n/lang/ja-JP/player.ts @@ -0,0 +1,123 @@ +export default { + nowPlaying: '再生中', + playlist: 'プレイリスト', + lyrics: '歌詞', + previous: '前へ', + play: '再生', + pause: '一時停止', + next: '次へ', + volumeUp: '音量を上げる', + volumeDown: '音量を下げる', + mute: 'ミュート', + unmute: 'ミュート解除', + songNum: '楽曲総数:{num}', + addCorrection: '{num}秒早める', + subtractCorrection: '{num}秒遅らせる', + playFailed: '現在の楽曲の再生に失敗しました。次の曲を再生します', + playMode: { + sequence: '順次再生', + loop: 'リピート再生', + random: 'ランダム再生' + }, + fullscreen: { + enter: 'フルスクリーン', + exit: 'フルスクリーン終了' + }, + close: '閉じる', + modeHint: { + single: 'リピート再生', + list: '自動で次の曲を再生' + }, + lrc: { + noLrc: '歌詞がありません。お楽しみください' + }, + reparse: { + title: '解析音源を選択', + desc: '音源をクリックして直接解析します。次回この楽曲を再生する際は選択した音源を使用します', + success: '再解析成功', + failed: '再解析失敗', + warning: '音源を選択してください', + bilibiliNotSupported: 'Bilibili動画は再解析をサポートしていません', + processing: '解析中...', + clear: 'カスタム音源をクリア' + }, + playBar: { + expand: '歌詞を展開', + collapse: '歌詞を折りたたみ', + like: 'いいね', + lyric: '歌詞', + noSongPlaying: '再生中の楽曲がありません', + eq: 'イコライザー', + playList: 'プレイリスト', + reparse: '再解析', + playMode: { + sequence: '順次再生', + loop: 'ループ再生', + random: 'ランダム再生' + }, + play: '再生開始', + pause: '再生一時停止', + prev: '前の曲', + next: '次の曲', + volume: '音量', + favorite: '{name}をお気に入りに追加しました', + unFavorite: '{name}をお気に入りから削除しました', + miniPlayBar: 'ミニ再生バー', + playbackSpeed: '再生速度', + advancedControls: 'その他の設定' + }, + eq: { + title: 'イコライザー', + reset: 'リセット', + on: 'オン', + off: 'オフ', + bass: '低音', + midrange: '中音', + treble: '高音', + presets: { + flat: 'フラット', + pop: 'ポップ', + rock: 'ロック', + classical: 'クラシック', + jazz: 'ジャズ', + electronic: 'エレクトロニック', + hiphop: 'ヒップホップ', + rb: 'R&B', + metal: 'メタル', + vocal: 'ボーカル', + dance: 'ダンス', + acoustic: 'アコースティック', + custom: 'カスタム' + } + }, + // タイマー機能関連 + sleepTimer: { + title: 'スリープタイマー', + cancel: 'タイマーをキャンセル', + timeMode: '時間で停止', + songsMode: '楽曲数で停止', + playlistEnd: 'プレイリスト終了後に停止', + afterPlaylist: 'プレイリスト終了後に停止', + activeUntilEnd: 'リスト終了まで再生', + minutes: '分', + hours: '時間', + songs: '曲', + set: '設定', + timerSetSuccess: '{minutes}分後に停止するよう設定しました', + songsSetSuccess: '{songs}曲再生後に停止するよう設定しました', + playlistEndSetSuccess: 'プレイリスト終了後に停止するよう設定しました', + timerCancelled: 'スリープタイマーをキャンセルしました', + timerEnded: 'スリープタイマーが作動しました', + playbackStopped: '音楽再生を停止しました', + minutesRemaining: '残り{minutes}分', + songsRemaining: '残り{count}曲' + }, + playList: { + clearAll: 'プレイリストをクリア', + alreadyEmpty: 'プレイリストは既に空です', + cleared: 'プレイリストをクリアしました', + empty: 'プレイリストが空です', + clearConfirmTitle: 'プレイリストをクリア', + clearConfirmContent: 'これによりプレイリスト内のすべての楽曲がクリアされ、現在の再生が停止されます。続行しますか?' + } +}; \ No newline at end of file diff --git a/src/i18n/lang/ja-JP/search.ts b/src/i18n/lang/ja-JP/search.ts new file mode 100644 index 0000000..e02038e --- /dev/null +++ b/src/i18n/lang/ja-JP/search.ts @@ -0,0 +1,27 @@ +export default { + title: { + hotSearch: '人気検索リスト', + searchList: '検索リスト', + searchHistory: '検索履歴' + }, + button: { + clear: 'クリア', + back: '戻る', + playAll: 'リストを再生' + }, + loading: { + more: '読み込み中...', + failed: '検索に失敗しました' + }, + noMore: 'これ以上ありません', + error: { + searchFailed: '検索に失敗しました' + }, + search: { + single: '楽曲', + album: 'アルバム', + playlist: 'プレイリスト', + mv: 'MV', + bilibili: 'Bilibili' + } +}; \ No newline at end of file diff --git a/src/i18n/lang/ja-JP/settings.ts b/src/i18n/lang/ja-JP/settings.ts new file mode 100644 index 0000000..0b31457 --- /dev/null +++ b/src/i18n/lang/ja-JP/settings.ts @@ -0,0 +1,285 @@ +export default { + theme: 'テーマ', + language: '言語', + regard: 'について', + logout: 'ログアウト', + sections: { + basic: '基本設定', + playback: '再生設定', + application: 'アプリケーション設定', + network: 'ネットワーク設定', + system: 'システム管理', + donation: '寄付サポート', + regard: 'について' + }, + basic: { + themeMode: 'テーマモード', + themeModeDesc: 'ライト/ダークテーマの切り替え', + autoTheme: 'システムに従う', + manualTheme: '手動切り替え', + 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: '音楽再生の音質を選択(NetEase Cloud VIP)', + qualityOptions: { + standard: '標準', + higher: '高音質', + exhigh: '超高音質', + lossless: 'ロスレス', + hires: 'Hi-Res', + jyeffect: 'HD サラウンド', + sky: 'イマーシブサラウンド', + dolby: 'Dolby Atmos', + jymaster: '超高解像度マスター' + }, + musicSources: '音源設定', + musicSourcesDesc: '音楽解析に使用する音源プラットフォームを選択', + musicSourcesWarning: '少なくとも1つの音源プラットフォームを選択する必要があります', + musicUnblockEnable: '音楽解析を有効にする', + musicUnblockEnableDesc: '有効にすると、再生できない音楽の解析を試みます', + configureMusicSources: '音源を設定', + selectedMusicSources: '選択された音源:', + noMusicSources: '音源が選択されていません', + gdmusicInfo: 'GD音楽台は複数のプラットフォーム音源を自動解析し、最適な結果を自動選択できます', + autoPlay: '自動再生', + autoPlayDesc: 'アプリを再起動した際に自動的に再生を継続するかどうか', + showStatusBar: 'ステータスバーコントロール機能を表示するかどうか', + showStatusBarContent: 'Macのステータスバーに音楽コントロール機能を表示できます(再起動後に有効)' + }, + application: { + closeAction: '閉じる動作', + closeActionDesc: 'ウィンドウを閉じる際の動作を選択', + closeOptions: { + ask: '毎回確認', + minimize: 'トレイに最小化', + close: '直接終了' + }, + shortcut: 'ショートカット設定', + shortcutDesc: 'グローバルショートカットをカスタマイズ', + download: 'ダウンロード管理', + downloadDesc: 'ダウンロードリストボタンを常に表示するかどうか', + unlimitedDownload: '無制限ダウンロード', + unlimitedDownloadDesc: '有効にすると音楽を無制限でダウンロードします(ダウンロード失敗の可能性があります)。デフォルトは300曲制限', + downloadPath: 'ダウンロードディレクトリ', + downloadPathDesc: '音楽ファイルのダウンロード場所を選択', + remoteControl: 'リモートコントロール', + remoteControlDesc: 'リモートコントロール機能を設定' + }, + 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 スターを付けてください🌟', + messages: { + checkError: '更新確認に失敗しました。後でもう一度お試しください' + } + }, + validation: { + selectProxyProtocol: 'プロキシプロトコルを選択してください', + proxyHost: 'プロキシアドレスを入力してください', + portNumber: '有効なポート番号を入力してください(1-65535)' + }, + lyricSettings: { + title: '歌詞設定', + tabs: { + display: '表示', + interface: 'インターフェース', + typography: 'テキスト', + mobile: 'モバイル' + }, + pureMode: 'ピュアモード', + hideCover: 'カバーを非表示', + centerDisplay: '中央表示', + showTranslation: '翻訳を表示', + hideLyrics: '歌詞を非表示', + hidePlayBar: '再生バーを非表示', + hideMiniPlayBar: 'ミニ再生バーを非表示', + backgroundTheme: '背景テーマ', + themeOptions: { + default: 'デフォルト', + light: 'ライト', + dark: 'ダーク' + }, + fontSize: 'フォントサイズ', + fontSizeMarks: { + small: '小', + medium: '中', + large: '大' + }, + letterSpacing: '文字間隔', + letterSpacingMarks: { + compact: 'コンパクト', + default: 'デフォルト', + loose: 'ゆったり' + }, + lineHeight: '行の高さ', + lineHeightMarks: { + compact: 'コンパクト', + default: 'デフォルト', + loose: 'ゆったり' + }, + mobileLayout: 'モバイルレイアウト', + layoutOptions: { + default: 'デフォルト', + ios: 'iOSスタイル', + android: 'Androidスタイル' + }, + mobileCoverStyle: 'カバースタイル', + coverOptions: { + record: 'レコード', + square: '正方形', + full: 'フルスクリーン' + }, + lyricLines: '歌詞行数', + mobileUnavailable: 'この設定はモバイルでのみ利用可能です' + }, + themeColor: { + title: '歌詞テーマカラー', + presetColors: 'プリセットカラー', + customColor: 'カスタムカラー', + preview: 'プレビュー効果', + previewText: '歌詞効果', + colorNames: { + 'spotify-green': 'Spotify グリーン', + 'apple-blue': 'Apple ブルー', + 'youtube-red': 'YouTube レッド', + orange: 'バイタルオレンジ', + purple: 'ミステリアスパープル', + pink: 'サクラピンク' + }, + tooltips: { + openColorPicker: 'カラーパレットを開く', + closeColorPicker: 'カラーパレットを閉じる' + }, + placeholder: '#1db954' + }, + shortcutSettings: { + title: 'ショートカット設定', + shortcut: 'ショートカット', + shortcutDesc: 'ショートカットをカスタマイズ', + shortcutConflict: 'ショートカットの競合', + inputPlaceholder: 'クリックしてショートカットを入力', + resetShortcuts: 'デフォルトに戻す', + disableAll: 'すべて無効', + enableAll: 'すべて有効', + togglePlay: '再生/一時停止', + prevPlay: '前の曲', + nextPlay: '次の曲', + volumeUp: '音量を上げる', + volumeDown: '音量を下げる', + toggleFavorite: 'お気に入り/お気に入り解除', + toggleWindow: 'ウィンドウ表示/非表示', + scopeGlobal: 'グローバル', + scopeApp: 'アプリ内', + enabled: '有効', + disabled: '無効', + messages: { + resetSuccess: 'デフォルトのショートカットに戻しました。保存を忘れずに', + conflict: '競合するショートカットがあります。再設定してください', + saveSuccess: 'ショートカット設定を保存しました', + saveError: 'ショートカットの保存に失敗しました。再試行してください', + cancelEdit: '変更をキャンセルしました', + disableAll: 'すべてのショートカットを無効にしました。保存を忘れずに', + enableAll: 'すべてのショートカットを有効にしました。保存を忘れずに' + } + }, + remoteControl: { + title: 'リモートコントロール', + enable: 'リモートコントロールを有効にする', + port: 'サービスポート', + allowedIps: '許可されたIPアドレス', + addIp: 'IPを追加', + emptyListHint: '空のリストはすべてのIPアクセスを許可することを意味します', + saveSuccess: 'リモートコントロール設定を保存しました', + accessInfo: 'リモートコントロールアクセスアドレス:' + } +}; \ No newline at end of file diff --git a/src/i18n/lang/ja-JP/songItem.ts b/src/i18n/lang/ja-JP/songItem.ts new file mode 100644 index 0000000..36f703a --- /dev/null +++ b/src/i18n/lang/ja-JP/songItem.ts @@ -0,0 +1,28 @@ +export default { + menu: { + play: '再生', + playNext: '次に再生', + download: '楽曲をダウンロード', + addToPlaylist: 'プレイリストに追加', + favorite: 'いいね', + unfavorite: 'いいね解除', + removeFromPlaylist: 'プレイリストから削除', + dislike: '嫌い', + undislike: '嫌い解除' + }, + message: { + downloading: 'ダウンロード中です。しばらくお待ちください...', + downloadFailed: 'ダウンロードに失敗しました', + downloadQueued: 'ダウンロードキューに追加しました', + addedToNextPlay: '次の再生に追加しました', + getUrlFailed: '音楽ダウンロードアドレスの取得に失敗しました。ログインしているか確認してください' + }, + dialog: { + dislike: { + title: 'お知らせ!', + content: 'この楽曲を嫌いにしますか?再度アクセスすると毎日のおすすめから除外されます。', + positiveText: '嫌い', + negativeText: 'キャンセル' + } + } +}; \ No newline at end of file diff --git a/src/i18n/lang/ja-JP/user.ts b/src/i18n/lang/ja-JP/user.ts new file mode 100644 index 0000000..89606ef --- /dev/null +++ b/src/i18n/lang/ja-JP/user.ts @@ -0,0 +1,48 @@ +export default { + profile: { + followers: 'フォロワー', + following: 'フォロー中', + level: 'レベル' + }, + playlist: { + created: '作成したプレイリスト', + mine: '私が作成した', + trackCount: '{count}曲', + playCount: '{count}回再生' + }, + ranking: { + title: '聴取ランキング', + playCount: '{count}回' + }, + follow: { + title: 'フォローリスト', + viewPlaylist: 'プレイリストを見る', + noFollowings: 'フォローがありません', + loadMore: 'さらに読み込み', + noSignature: 'この人は怠け者で、何も残していません', + userFollowsTitle: 'のフォロー', + myFollowsTitle: '私のフォロー' + }, + follower: { + title: 'フォロワーリスト', + noFollowers: 'フォロワーがいません', + loadMore: 'さらに読み込み', + userFollowersTitle: 'のフォロワー', + myFollowersTitle: '私のフォロワー' + }, + detail: { + playlists: 'プレイリスト', + records: '聴取ランキング', + noPlaylists: 'プレイリストがありません', + noRecords: '聴取記録がありません', + artist: 'アーティスト', + noSignature: 'この人は怠け者で、何も残していません', + invalidUserId: '無効なユーザーID', + noRecordPermission: '{name}は聴取ランキングを見せてくれません' + }, + message: { + loadFailed: 'ユーザーページの読み込みに失敗しました', + deleteSuccess: '削除成功', + deleteFailed: '削除失敗' + } +}; \ No newline at end of file diff --git a/src/i18n/lang/ko-KR/artist.ts b/src/i18n/lang/ko-KR/artist.ts new file mode 100644 index 0000000..135d79c --- /dev/null +++ b/src/i18n/lang/ko-KR/artist.ts @@ -0,0 +1,5 @@ +export default { + hotSongs: '인기 곡', + albums: '앨범', + description: '아티스트 소개' +}; \ No newline at end of file diff --git a/src/i18n/lang/ko-KR/common.ts b/src/i18n/lang/ko-KR/common.ts new file mode 100644 index 0000000..730613d --- /dev/null +++ b/src/i18n/lang/ko-KR/common.ts @@ -0,0 +1,56 @@ +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: '다시 시도', + reset: '재설정', + back: '뒤로', + copySuccess: '클립보드에 복사됨', + copyFailed: '복사 실패', + validation: { + required: '이 항목은 필수입니다', + invalidInput: '잘못된 입력', + selectRequired: '옵션을 선택해주세요', + numberRange: '{min}에서 {max} 사이의 숫자를 입력해주세요' + }, + viewMore: '더 보기', + noMore: '더 이상 없음', + selectAll: '전체 선택', + expand: '펼치기', + collapse: '접기', + songCount: '{count}곡', + language: '언어', + tray: { + show: '표시', + quit: '종료', + playPause: '재생/일시정지', + prev: '이전 곡', + next: '다음 곡', + pause: '일시정지', + play: '재생', + favorite: '즐겨찾기' + } +}; \ No newline at end of file diff --git a/src/i18n/lang/ko-KR/comp.ts b/src/i18n/lang/ko-KR/comp.ts new file mode 100644 index 0000000..0eba043 --- /dev/null +++ b/src/i18n/lang/ko-KR/comp.ts @@ -0,0 +1,190 @@ +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: '현재 시스템에 적합한 설치 패키지를 찾을 수 없습니다. 수동으로 다운로드해주세요', + installConfirmTitle: '업데이트 설치', + installConfirmContent: '앱을 닫고 업데이트를 설치하시겠습니까?', + manualInstallTip: '앱을 닫은 후 설치 프로그램이 정상적으로 나타나지 않으면 다운로드 폴더에서 파일을 찾아 수동으로 열어주세요.', + yesInstall: '지금 설치', + noThanks: '나중에 설치', + fileLocation: '파일 위치', + copy: '경로 복사', + copySuccess: '경로가 클립보드에 복사됨', + copyFailed: '복사 실패', + backgroundDownload: '백그라운드 다운로드' + }, + coffee: { + title: '커피 한 잔 사주세요', + alipay: '알리페이', + wechat: '위챗 페이', + alipayQR: '알리페이 결제 QR코드', + wechatQR: '위챗 결제 QR코드', + coffeeDesc: '커피 한 잔, 하나의 지원', + coffeeDescLinkText: '더 보기', + qqGroup: 'QQ 채널: algermusic', + messages: { + copySuccess: '클립보드에 복사됨' + }, + donateList: '커피 한 잔 사주세요' + }, + playlistType: { + title: '플레이리스트 분류', + showAll: '모두 표시', + hide: '일부 숨기기' + }, + recommendAlbum: { + title: '최신 앨범' + }, + recommendSinger: { + title: '일일 추천', + songlist: '일일 추천 목록' + }, + recommendSonglist: { + title: '이번 주 인기 음악' + }, + searchBar: { + login: '로그인', + toLogin: '로그인하기', + logout: '로그아웃', + set: '설정', + theme: '테마', + restart: '재시작', + refresh: '새로고침', + currentVersion: '현재 버전', + searchPlaceholder: '검색해보세요...', + zoom: '페이지 확대/축소', + zoom100: '표준 확대/축소 100%', + resetZoom: '클릭하여 확대/축소 재설정', + zoomDefault: '표준 확대/축소' + }, + titleBar: { + closeTitle: '닫기 방법을 선택해주세요', + minimizeToTray: '트레이로 최소화', + exitApp: '앱 종료', + rememberChoice: '선택 기억하기', + closeApp: '앱 닫기' + }, + userPlayList: { + title: '{name}의 자주 듣는 음악' + }, + musicList: { + searchSongs: '곡 검색', + noSearchResults: '관련 곡을 찾을 수 없습니다', + switchToNormal: '기본 레이아웃으로 전환', + switchToCompact: '컴팩트 레이아웃으로 전환', + playAll: '모두 재생', + collect: '수집', + collectSuccess: '수집 성공', + cancelCollectSuccess: '수집 취소 성공', + operationFailed: '작업 실패', + cancelCollect: '수집 취소', + addToPlaylist: '재생 목록에 추가', + addToPlaylistSuccess: '재생 목록에 추가 성공', + songsAlreadyInPlaylist: '곡이 이미 재생 목록에 있습니다' + }, + playlist: { + import: { + button: '플레이리스트 가져오기', + title: '플레이리스트 가져오기', + description: '메타데이터/텍스트/링크 세 가지 방법으로 플레이리스트 가져오기 지원', + linkTab: '링크 가져오기', + textTab: '텍스트 가져오기', + localTab: '메타데이터 가져오기', + linkPlaceholder: '플레이리스트 링크를 입력하세요. 한 줄에 하나씩', + textPlaceholder: '곡 정보를 입력하세요. 형식: 곡명 가수명', + localPlaceholder: 'JSON 형식의 곡 메타데이터를 입력하세요', + linkTips: '지원되는 링크 소스:', + linkTip1: '플레이리스트를 위챗/웨이보/QQ로 공유한 후 링크 복사', + linkTip2: '플레이리스트/개인 홈페이지 링크 직접 복사', + linkTip3: '기사 링크 직접 복사', + textTips: '곡 정보를 입력하세요. 한 줄에 한 곡씩', + textFormat: '형식: 곡명 가수명', + localTips: '곡 메타데이터를 추가해주세요', + localFormat: '형식 예시:', + songNamePlaceholder: '곡명', + artistNamePlaceholder: '아티스트명', + albumNamePlaceholder: '앨범명', + addSongButton: '곡 추가', + addLinkButton: '링크 추가', + importToStarPlaylist: '내가 좋아하는 음악으로 가져오기', + playlistNamePlaceholder: '플레이리스트 이름을 입력하세요', + importButton: '가져오기 시작', + emptyLinkWarning: '플레이리스트 링크를 입력해주세요', + emptyTextWarning: '곡 정보를 입력해주세요', + emptyLocalWarning: '곡 메타데이터를 입력해주세요', + invalidJsonFormat: 'JSON 형식이 올바르지 않습니다', + importSuccess: '가져오기 작업 생성 성공', + importFailed: '가져오기 실패', + importStatus: '가져오기 상태', + refresh: '새로고침', + taskId: '작업 ID', + status: '상태', + successCount: '성공 수', + failReason: '실패 이유', + unknownError: '알 수 없는 오류', + statusPending: '처리 대기 중', + statusProcessing: '처리 중', + statusSuccess: '가져오기 성공', + statusFailed: '가져오기 실패', + statusUnknown: '알 수 없는 상태', + taskList: '작업 목록', + taskListTitle: '가져오기 작업 목록', + action: '작업', + select: '선택', + fetchTaskListFailed: '작업 목록 가져오기 실패', + noTasks: '가져오기 작업이 없습니다', + clearTasks: '작업 지우기', + clearTasksConfirmTitle: '지우기 확인', + clearTasksConfirmContent: '모든 가져오기 작업 기록을 지우시겠습니까? 이 작업은 되돌릴 수 없습니다.', + confirm: '확인', + cancel: '취소', + clearTasksSuccess: '작업 목록이 지워졌습니다', + clearTasksFailed: '작업 목록 지우기 실패' + } + }, + settings: '설정', + user: '사용자', + toplist: '순위', + history: '수집 기록', + list: '플레이리스트', + mv: 'MV', + home: '홈', + search: '검색' +}; \ No newline at end of file diff --git a/src/i18n/lang/ko-KR/donation.ts b/src/i18n/lang/ko-KR/donation.ts new file mode 100644 index 0000000..880e433 --- /dev/null +++ b/src/i18n/lang/ko-KR/donation.ts @@ -0,0 +1,8 @@ +export default { + description: '귀하의 기부는 서버 유지보수, 도메인 갱신 등을 포함한 개발 및 유지보수 작업을 지원하는 데 사용됩니다.', + message: '메시지를 남길 때 이메일이나 GitHub 이름을 남겨주세요.', + refresh: '목록 새로고침', + toDonateList: '커피 한 잔 사주세요', + noMessage: '메시지가 없습니다', + title: '기부 목록' +}; \ No newline at end of file diff --git a/src/i18n/lang/ko-KR/download.ts b/src/i18n/lang/ko-KR/download.ts new file mode 100644 index 0000000..4613a59 --- /dev/null +++ b/src/i18n/lang/ko-KR/download.ts @@ -0,0 +1,87 @@ +export default { + title: '다운로드 관리', + localMusic: '로컬 음악', + count: '총 {count}곡', + clearAll: '기록 지우기', + settings: '설정', + tabs: { + downloading: '다운로드 중', + downloaded: '다운로드 완료' + }, + empty: { + noTasks: '다운로드 작업이 없습니다', + noDownloaded: '다운로드된 곡이 없습니다' + }, + progress: { + total: '전체 진행률: {progress}%' + }, + status: { + downloading: '다운로드 중', + completed: '완료', + failed: '실패', + unknown: '알 수 없음' + }, + artist: { + unknown: '알 수 없는 가수' + }, + delete: { + title: '삭제 확인', + message: '곡 "{filename}"을(를) 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.', + confirm: '삭제 확인', + cancel: '취소', + success: '삭제 성공', + failed: '삭제 실패', + fileNotFound: '파일이 존재하지 않거나 이동되었습니다. 기록에서 제거되었습니다', + recordRemoved: '파일 삭제 실패, 하지만 기록에서 제거되었습니다' + }, + clear: { + title: '다운로드 기록 지우기', + message: '모든 다운로드 기록을 지우시겠습니까? 이 작업은 다운로드된 음악 파일을 삭제하지 않지만 모든 기록을 지웁니다.', + confirm: '지우기 확인', + cancel: '취소', + success: '다운로드 기록이 지워졌습니다' + }, + message: { + downloadComplete: '{filename} 다운로드 완료', + downloadFailed: '{filename} 다운로드 실패: {error}' + }, + loading: '로딩 중...', + playStarted: '재생 시작: {name}', + playFailed: '재생 실패: {name}', + path: { + copied: '경로가 클립보드에 복사됨', + copyFailed: '경로 복사 실패' + }, + settingsPanel: { + title: '다운로드 설정', + path: '다운로드 위치', + pathDesc: '음악 파일 다운로드 저장 위치 설정', + pathPlaceholder: '다운로드 경로를 선택해주세요', + noPathSelected: '먼저 다운로드 경로를 선택해주세요', + select: '폴더 선택', + open: '폴더 열기', + fileFormat: '파일명 형식', + fileFormatDesc: '음악 다운로드 시 파일 이름 형식 설정', + customFormat: '사용자 정의 형식', + separator: '구분자', + separators: { + dash: '공백-공백', + underscore: '밑줄', + space: '공백' + }, + dragToArrange: '드래그하여 정렬하거나 화살표 버튼을 사용하여 순서 조정:', + formatVariables: '사용 가능한 변수', + preview: '미리보기 효과:', + saveSuccess: '다운로드 설정이 저장됨', + presets: { + songArtist: '곡명 - 가수명', + artistSong: '가수명 - 곡명', + songOnly: '곡명만' + }, + components: { + songName: '곡명', + artistName: '가수명', + albumName: '앨범명' + } + } +}; \ No newline at end of file diff --git a/src/i18n/lang/ko-KR/favorite.ts b/src/i18n/lang/ko-KR/favorite.ts new file mode 100644 index 0000000..61b2989 --- /dev/null +++ b/src/i18n/lang/ko-KR/favorite.ts @@ -0,0 +1,13 @@ +export default { + title: '내 수집', + count: '총 {count}곡', + batchDownload: '일괄 다운로드', + download: '다운로드 ({count})', + emptyTip: '아직 수집한 곡이 없습니다', + downloadSuccess: '다운로드 완료', + downloadFailed: '다운로드 실패', + downloading: '다운로드 중입니다. 잠시만 기다려주세요...', + selectSongsFirst: '먼저 다운로드할 곡을 선택해주세요', + descending: '내림차순', + ascending: '오름차순' +}; \ No newline at end of file diff --git a/src/i18n/lang/ko-KR/history.ts b/src/i18n/lang/ko-KR/history.ts new file mode 100644 index 0000000..bc22714 --- /dev/null +++ b/src/i18n/lang/ko-KR/history.ts @@ -0,0 +1,5 @@ +export default { + title: '재생 기록', + playCount: '{count}', + getHistoryFailed: '기록 가져오기 실패' +}; \ No newline at end of file diff --git a/src/i18n/lang/ko-KR/login.ts b/src/i18n/lang/ko-KR/login.ts new file mode 100644 index 0000000..06a4618 --- /dev/null +++ b/src/i18n/lang/ko-KR/login.ts @@ -0,0 +1,22 @@ +export default { + title: { + qr: 'QR코드 로그인', + phone: '휴대폰 번호 로그인' + }, + qrTip: '넷이즈 클라우드 뮤직 앱으로 QR코드를 스캔하여 로그인', + phoneTip: '넷이즈 클라우드 계정으로 로그인', + placeholder: { + phone: '휴대폰 번호', + password: '비밀번호' + }, + button: { + login: '로그인', + switchToQr: 'QR코드 로그인', + switchToPhone: '휴대폰 번호 로그인' + }, + message: { + loginSuccess: '로그인 성공', + loadError: '로그인 정보 로드 중 오류 발생', + qrCheckError: 'QR코드 상태 확인 중 오류 발생' + } +}; \ No newline at end of file diff --git a/src/i18n/lang/ko-KR/player.ts b/src/i18n/lang/ko-KR/player.ts new file mode 100644 index 0000000..4d3c302 --- /dev/null +++ b/src/i18n/lang/ko-KR/player.ts @@ -0,0 +1,122 @@ +export default { + nowPlaying: '현재 재생 중', + playlist: '재생 목록', + lyrics: '가사', + previous: '이전', + play: '재생', + pause: '일시정지', + next: '다음', + volumeUp: '볼륨 증가', + volumeDown: '볼륨 감소', + mute: '음소거', + unmute: '음소거 해제', + songNum: '총 곡 수: {num}', + addCorrection: '{num}초 앞당기기', + subtractCorrection: '{num}초 지연', + playFailed: '현재 곡 재생 실패, 다음 곡 재생', + playMode: { + sequence: '순차 재생', + loop: '한 곡 반복', + random: '랜덤 재생' + }, + fullscreen: { + enter: '전체화면', + exit: '전체화면 종료' + }, + close: '닫기', + modeHint: { + single: '한 곡 반복', + list: '자동으로 다음 곡 재생' + }, + lrc: { + noLrc: '가사가 없습니다. 음악을 감상해주세요' + }, + reparse: { + title: '음원 선택', + desc: '음원을 클릭하여 직접 분석하세요. 다음에 이 곡을 재생할 때 선택한 음원을 사용합니다', + success: '재분석 성공', + failed: '재분석 실패', + warning: '음원을 선택해주세요', + bilibiliNotSupported: 'B站 비디오는 재분석을 지원하지 않습니다', + processing: '분석 중...', + clear: '사용자 정의 음원 지우기' + }, + playBar: { + expand: '가사 펼치기', + collapse: '가사 접기', + like: '좋아요', + lyric: '가사', + noSongPlaying: '재생 중인 곡이 없습니다', + eq: '이퀄라이저', + playList: '재생 목록', + reparse: '재분석', + playMode: { + sequence: '순차 재생', + loop: '반복 재생', + random: '랜덤 재생' + }, + play: '재생 시작', + pause: '재생 일시정지', + prev: '이전 곡', + next: '다음 곡', + volume: '볼륨', + favorite: '{name} 즐겨찾기 추가됨', + unFavorite: '{name} 즐겨찾기 해제됨', + miniPlayBar: '미니 재생바', + playbackSpeed: '재생 속도', + advancedControls: '고급 설정' + }, + eq: { + title: '이퀄라이저', + reset: '재설정', + on: '켜기', + off: '끄기', + bass: '저음', + midrange: '중음', + treble: '고음', + presets: { + flat: '플랫', + pop: '팝', + rock: '록', + classical: '클래식', + jazz: '재즈', + electronic: '일렉트로닉', + hiphop: '힙합', + rb: 'R&B', + metal: '메탈', + vocal: '보컬', + dance: '댄스', + acoustic: '어쿠스틱', + custom: '사용자 정의' + } + }, + sleepTimer: { + title: '타이머 종료', + cancel: '타이머 취소', + timeMode: '시간으로 종료', + songsMode: '곡 수로 종료', + playlistEnd: '재생 목록 완료 후 종료', + afterPlaylist: '재생 목록 완료 후 종료', + activeUntilEnd: '목록 끝까지 재생', + minutes: '분', + hours: '시간', + songs: '곡', + set: '설정', + timerSetSuccess: '{minutes}분 후 종료로 설정됨', + songsSetSuccess: '{songs}곡 재생 후 종료로 설정됨', + playlistEndSetSuccess: '재생 목록 완료 후 종료로 설정됨', + timerCancelled: '타이머 종료 취소됨', + timerEnded: '타이머 종료 실행됨', + playbackStopped: '음악 재생이 중지됨', + minutesRemaining: '남은 시간 {minutes}분', + songsRemaining: '남은 곡 수 {count}곡' + }, + playList: { + clearAll: '재생 목록 비우기', + alreadyEmpty: '재생 목록이 이미 비어있습니다', + cleared: '재생 목록이 비워졌습니다', + empty: '재생 목록이 비어있습니다', + clearConfirmTitle: '재생 목록 비우기', + clearConfirmContent: '재생 목록의 모든 곡을 삭제하고 현재 재생을 중지합니다. 계속하시겠습니까?' + } +}; \ No newline at end of file diff --git a/src/i18n/lang/ko-KR/search.ts b/src/i18n/lang/ko-KR/search.ts new file mode 100644 index 0000000..c284609 --- /dev/null +++ b/src/i18n/lang/ko-KR/search.ts @@ -0,0 +1,27 @@ +export default { + title: { + hotSearch: '인기 검색', + searchList: '검색 목록', + searchHistory: '검색 기록' + }, + button: { + clear: '지우기', + back: '뒤로', + playAll: '재생 목록' + }, + loading: { + more: '로딩 중...', + failed: '검색 실패' + }, + noMore: '더 이상 없음', + error: { + searchFailed: '검색 실패' + }, + search: { + single: '단일곡', + album: '앨범', + playlist: '플레이리스트', + mv: 'MV', + bilibili: 'B站' + } +}; \ No newline at end of file diff --git a/src/i18n/lang/ko-KR/settings.ts b/src/i18n/lang/ko-KR/settings.ts new file mode 100644 index 0000000..0b30a5e --- /dev/null +++ b/src/i18n/lang/ko-KR/settings.ts @@ -0,0 +1,285 @@ +export default { + theme: '테마', + language: '언어', + regard: '정보', + logout: '로그아웃', + sections: { + basic: '기본 설정', + playback: '재생 설정', + application: '애플리케이션 설정', + network: '네트워크 설정', + system: '시스템 관리', + donation: '후원 지원', + regard: '정보' + }, + basic: { + themeMode: '테마 모드', + themeModeDesc: '낮/밤 테마 전환', + autoTheme: '시스템 따라가기', + manualTheme: '수동 전환', + 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: 'HD 서라운드', + sky: '몰입형 서라운드', + dolby: '돌비 애트모스', + jymaster: '초고화질 마스터' + }, + musicSources: '음원 설정', + musicSourcesDesc: '음악 해석에 사용할 음원 플랫폼 선택', + musicSourcesWarning: '최소 하나의 음원 플랫폼을 선택해야 합니다', + musicUnblockEnable: '음악 해석 활성화', + musicUnblockEnableDesc: '활성화하면 재생할 수 없는 음악을 해석하려고 시도합니다', + configureMusicSources: '음원 구성', + selectedMusicSources: '선택된 음원:', + noMusicSources: '음원이 선택되지 않음', + gdmusicInfo: 'GD 뮤직은 여러 플랫폼 음원을 자동으로 해석하고 최적의 결과를 자동 선택합니다', + autoPlay: '자동 재생', + autoPlayDesc: '앱을 다시 열 때 자동으로 재생을 계속할지 여부', + showStatusBar: '상태바 제어 기능 표시 여부', + showStatusBarContent: 'Mac 상태바에 음악 제어 기능을 표시할 수 있습니다 (재시작 후 적용)' + }, + application: { + closeAction: '닫기 동작', + closeActionDesc: '창을 닫을 때의 동작 선택', + closeOptions: { + ask: '매번 묻기', + minimize: '트레이로 최소화', + close: '직접 종료' + }, + shortcut: '단축키 설정', + shortcutDesc: '전역 단축키 사용자 정의', + download: '다운로드 관리', + downloadDesc: '다운로드 목록 버튼을 항상 표시할지 여부', + unlimitedDownload: '무제한 다운로드', + unlimitedDownloadDesc: '활성화하면 음악을 무제한으로 다운로드합니다 (다운로드 실패가 발생할 수 있음), 기본 제한 300곡', + downloadPath: '다운로드 디렉토리', + downloadPathDesc: '음악 파일의 다운로드 위치 선택', + remoteControl: '원격 제어', + remoteControlDesc: '원격 제어 기능 설정' + }, + 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 별점🌟 부탁드려요', + messages: { + checkError: '업데이트 확인 실패, 나중에 다시 시도하세요' + } + }, + validation: { + selectProxyProtocol: '프록시 프로토콜을 선택하세요', + proxyHost: '프록시 주소를 입력하세요', + portNumber: '유효한 포트 번호를 입력하세요 (1-65535)' + }, + lyricSettings: { + title: '가사 설정', + tabs: { + display: '표시', + interface: '인터페이스', + typography: '텍스트', + mobile: '모바일' + }, + pureMode: '순수 모드', + hideCover: '커버 숨기기', + centerDisplay: '중앙 표시', + showTranslation: '번역 표시', + hideLyrics: '가사 숨기기', + hidePlayBar: '재생바 숨기기', + hideMiniPlayBar: '미니 재생바 숨기기', + backgroundTheme: '배경 테마', + themeOptions: { + default: '기본', + light: '밝음', + dark: '어둠' + }, + fontSize: '폰트 크기', + fontSizeMarks: { + small: '작음', + medium: '중간', + large: '큼' + }, + letterSpacing: '글자 간격', + letterSpacingMarks: { + compact: '좁음', + default: '기본', + loose: '넓음' + }, + lineHeight: '줄 높이', + lineHeightMarks: { + compact: '좁음', + default: '기본', + loose: '넓음' + }, + mobileLayout: '모바일 레이아웃', + layoutOptions: { + default: '기본', + ios: 'iOS 스타일', + android: '안드로이드 스타일' + }, + mobileCoverStyle: '커버 스타일', + coverOptions: { + record: '레코드', + square: '정사각형', + full: '전체화면' + }, + lyricLines: '가사 줄 수', + mobileUnavailable: '이 설정은 모바일에서만 사용 가능합니다' + }, + themeColor: { + title: '가사 테마 색상', + presetColors: '미리 설정된 색상', + customColor: '사용자 정의 색상', + preview: '미리보기 효과', + previewText: '가사 효과', + colorNames: { + 'spotify-green': 'Spotify 그린', + 'apple-blue': '애플 블루', + 'youtube-red': 'YouTube 레드', + orange: '활력 오렌지', + purple: '신비 퍼플', + pink: '벚꽃 핑크' + }, + tooltips: { + openColorPicker: '색상 선택기 열기', + closeColorPicker: '색상 선택기 닫기' + }, + placeholder: '#1db954' + }, + shortcutSettings: { + title: '단축키 설정', + shortcut: '단축키', + shortcutDesc: '단축키 사용자 정의', + shortcutConflict: '단축키 충돌', + inputPlaceholder: '클릭하여 단축키 입력', + resetShortcuts: '기본값 복원', + disableAll: '모두 비활성화', + enableAll: '모두 활성화', + togglePlay: '재생/일시정지', + prevPlay: '이전 곡', + nextPlay: '다음 곡', + volumeUp: '볼륨 증가', + volumeDown: '볼륨 감소', + toggleFavorite: '즐겨찾기/즐겨찾기 취소', + toggleWindow: '창 표시/숨기기', + scopeGlobal: '전역', + scopeApp: '앱 내', + enabled: '활성화', + disabled: '비활성화', + messages: { + resetSuccess: '기본 단축키로 복원되었습니다. 저장을 잊지 마세요', + conflict: '충돌하는 단축키가 있습니다. 다시 설정하세요', + saveSuccess: '단축키 설정이 저장되었습니다', + saveError: '단축키 저장 실패, 다시 시도하세요', + cancelEdit: '수정이 취소되었습니다', + disableAll: '모든 단축키가 비활성화되었습니다. 저장을 잊지 마세요', + enableAll: '모든 단축키가 활성화되었습니다. 저장을 잊지 마세요' + } + }, + remoteControl: { + title: '원격 제어', + enable: '원격 제어 활성화', + port: '서비스 포트', + allowedIps: '허용된 IP 주소', + addIp: 'IP 추가', + emptyListHint: '빈 목록은 모든 IP 액세스를 허용함을 의미합니다', + saveSuccess: '원격 제어 설정이 저장되었습니다', + accessInfo: '원격 제어 액세스 주소:' + } +}; \ No newline at end of file diff --git a/src/i18n/lang/ko-KR/songItem.ts b/src/i18n/lang/ko-KR/songItem.ts new file mode 100644 index 0000000..c4905d1 --- /dev/null +++ b/src/i18n/lang/ko-KR/songItem.ts @@ -0,0 +1,28 @@ +export default { + menu: { + play: '재생', + playNext: '다음에 재생', + download: '곡 다운로드', + addToPlaylist: '플레이리스트에 추가', + favorite: '좋아요', + unfavorite: '좋아요 취소', + removeFromPlaylist: '플레이리스트에서 삭제', + dislike: '싫어요', + undislike: '싫어요 취소' + }, + message: { + downloading: '다운로드 중입니다. 잠시 기다려주세요...', + downloadFailed: '다운로드 실패', + downloadQueued: '다운로드 대기열에 추가됨', + addedToNextPlay: '다음 재생에 추가됨', + getUrlFailed: '음악 다운로드 주소 가져오기 실패, 로그인 상태를 확인하세요' + }, + dialog: { + dislike: { + title: '알림!', + content: '이 곡을 싫어한다고 확인하시겠습니까? 다시 들어가면 일일 추천에서 제외됩니다.', + positiveText: '싫어요', + negativeText: '취소' + } + } +}; \ No newline at end of file diff --git a/src/i18n/lang/ko-KR/user.ts b/src/i18n/lang/ko-KR/user.ts new file mode 100644 index 0000000..214ae52 --- /dev/null +++ b/src/i18n/lang/ko-KR/user.ts @@ -0,0 +1,48 @@ +export default { + profile: { + followers: '팔로워', + following: '팔로잉', + level: '레벨' + }, + playlist: { + created: '생성한 플레이리스트', + mine: '내가 만든', + trackCount: '{count}곡', + playCount: '{count}회 재생' + }, + ranking: { + title: '음악 청취 순위', + playCount: '{count}회' + }, + follow: { + title: '팔로잉 목록', + viewPlaylist: '플레이리스트 보기', + noFollowings: '팔로잉이 없습니다', + loadMore: '더 보기', + noSignature: '이 사람은 게을러서 아무것도 남기지 않았습니다', + userFollowsTitle: '의 팔로잉', + myFollowsTitle: '내 팔로잉' + }, + follower: { + title: '팔로워 목록', + noFollowers: '팔로워가 없습니다', + loadMore: '더 보기', + userFollowersTitle: '의 팔로워', + myFollowersTitle: '내 팔로워' + }, + detail: { + playlists: '플레이리스트', + records: '음악 청취 순위', + noPlaylists: '플레이리스트가 없습니다', + noRecords: '음악 청취 기록이 없습니다', + artist: '아티스트', + noSignature: '이 사람은 게을러서 아무것도 남기지 않았습니다', + invalidUserId: '사용자 ID가 유효하지 않습니다', + noRecordPermission: '{name}님이 음악 청취 순위를 보지 못하게 했습니다' + }, + message: { + loadFailed: '사용자 페이지 로드 실패', + deleteSuccess: '삭제 성공', + deleteFailed: '삭제 실패' + } +}; \ No newline at end of file diff --git a/src/i18n/lang/zh-CN/index.ts b/src/i18n/lang/zh-CN/index.ts deleted file mode 100644 index 3619c66..0000000 --- a/src/i18n/lang/zh-CN/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -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-Hant/index.ts b/src/i18n/lang/zh-Hant/index.ts deleted file mode 100644 index 3619c66..0000000 --- a/src/i18n/lang/zh-Hant/index.ts +++ /dev/null @@ -1,29 +0,0 @@ -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/languages.ts b/src/i18n/languages.ts new file mode 100644 index 0000000..a07f2c8 --- /dev/null +++ b/src/i18n/languages.ts @@ -0,0 +1,25 @@ +// 语言配置文件 - 集中管理语言相关的配置 + +// 语言显示名称映射 +export const LANGUAGE_DISPLAY_NAMES: Record = { + 'zh-CN': '简体中文', + 'zh-Hant': '繁體中文', + 'en-US': 'English', + 'ja-JP': '日本語', + 'ko-KR': '한국어' +}; + +// 默认语言 +export const DEFAULT_LANGUAGE = 'zh-CN'; + +// 回退语言 +export const FALLBACK_LANGUAGE = 'en-US'; + +// 语言排序优先级(用于在UI中的显示顺序) +export const LANGUAGE_PRIORITY: Record = { + 'zh-CN': 1, + 'zh-Hant': 2, + 'en-US': 3, + 'ja-JP': 4, + 'ko-KR': 5 +}; \ No newline at end of file diff --git a/src/i18n/main.ts b/src/i18n/main.ts index b1d8f67..129dca8 100644 --- a/src/i18n/main.ts +++ b/src/i18n/main.ts @@ -1,19 +1,15 @@ -import enUS from './lang/en-US'; -import zhCN from './lang/zh-CN'; -import zhHant from './lang/zh-Hant'; +import { DEFAULT_LANGUAGE } from './languages'; +import { buildLanguageMessages } from './utils'; -const messages = { - 'zh-CN': zhCN, - 'en-US': enUS, - 'zh-Hant': zhHant -} as const; +// 使用工具函数构建语言消息对象 +const messages = buildLanguageMessages(); type Language = keyof typeof messages; // 为主进程提供一个简单的 i18n 实现 const mainI18n = { global: { - currentLocale: 'zh-CN' as Language, + currentLocale: DEFAULT_LANGUAGE as Language, get locale() { return this.currentLocale; }, diff --git a/src/i18n/renderer.ts b/src/i18n/renderer.ts index 9169388..21999d6 100644 --- a/src/i18n/renderer.ts +++ b/src/i18n/renderer.ts @@ -1,19 +1,15 @@ import { createI18n } from 'vue-i18n'; -import enUS from './lang/en-US'; -import zhCN from './lang/zh-CN'; -import zhHant from './lang/zh-Hant'; +import { DEFAULT_LANGUAGE, FALLBACK_LANGUAGE } from './languages'; +import { buildLanguageMessages } from './utils'; -const messages = { - 'zh-CN': zhCN, - 'en-US': enUS, - 'zh-Hant': zhHant -}; +// 使用工具函数构建语言消息对象 +const messages = buildLanguageMessages(); const i18n = createI18n({ legacy: false, - locale: 'zh-CN', - fallbackLocale: 'en-US', + locale: DEFAULT_LANGUAGE, + fallbackLocale: FALLBACK_LANGUAGE, messages, globalInjection: true, silentTranslationWarn: true, diff --git a/src/i18n/utils.ts b/src/i18n/utils.ts new file mode 100644 index 0000000..f587ee1 --- /dev/null +++ b/src/i18n/utils.ts @@ -0,0 +1,60 @@ +// 自动导入所有语言的所有翻译文件 +const allLangModules = import.meta.glob('./lang/**/*.ts', { eager: true }); + +// 构建语言消息对象 +export const buildLanguageMessages = () => { + const messages: Record> = {}; + + Object.entries(allLangModules).forEach(([path, module]) => { + // 解析路径,例如 './lang/zh-CN/common.ts' -> { lang: 'zh-CN', module: 'common' } + const match = path.match(/\.\/lang\/([^/]+)\/([^/]+)\.ts$/); + if (match) { + const [, langCode, moduleName] = match; + + // 跳过 index 文件 + if (moduleName !== 'index') { + if (!messages[langCode]) { + messages[langCode] = {}; + } + messages[langCode][moduleName] = (module as any).default; + } + } + }); + + return messages; +}; + +// 获取所有支持的语言 +export const getSupportedLanguages = (): string[] => { + const messages = buildLanguageMessages(); + return Object.keys(messages); +}; + +export const isLanguageSupported = (lang: string): boolean => { + return getSupportedLanguages().includes(lang); +}; + +import { LANGUAGE_DISPLAY_NAMES, LANGUAGE_PRIORITY } from './languages'; + +// 获取语言显示名称的映射 +export const getLanguageDisplayNames = (): Record => { + return LANGUAGE_DISPLAY_NAMES; +}; + +// 生成语言选项数组,用于下拉选择等组件 +export const getLanguageOptions = () => { + const supportedLanguages = getSupportedLanguages(); + const displayNames = getLanguageDisplayNames(); + + // 按优先级排序 + const sortedLanguages = supportedLanguages.sort((a, b) => { + const priorityA = LANGUAGE_PRIORITY[a] || 999; + const priorityB = LANGUAGE_PRIORITY[b] || 999; + return priorityA - priorityB; + }); + + return sortedLanguages.map(lang => ({ + label: displayNames[lang] || lang, + value: lang + })); +}; \ No newline at end of file diff --git a/src/locale/zh-CN.json b/src/locale/zh-CN.json deleted file mode 100644 index 87f105b..0000000 --- a/src/locale/zh-CN.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "settings": { - "lyricSettings": { - "title": "歌词设置", - "tabs": { - "display": "显示", - "interface": "界面", - "typography": "文字", - "mobile": "移动端" - }, - "pureMode": "纯净模式", - "hideCover": "隐藏封面", - "centerDisplay": "居中显示", - "showTranslation": "显示翻译", - "hideLyrics": "隐藏歌词", - "hidePlayBar": "隐藏播放栏", - "hideMiniPlayBar": "隐藏迷你播放栏", - "backgroundTheme": "背景主题", - "themeOptions": { - "default": "默认", - "light": "亮色", - "dark": "暗色" - }, - "fontSize": "字体大小", - "fontSizeMarks": { - "small": "小", - "medium": "中", - "large": "大" - }, - "letterSpacing": "字间距", - "letterSpacingMarks": { - "compact": "紧凑", - "default": "默认", - "loose": "宽松" - }, - "lineHeight": "行高", - "lineHeightMarks": { - "compact": "紧凑", - "default": "默认", - "loose": "宽松" - }, - "mobileLayout": "移动端布局", - "layoutOptions": { - "default": "默认", - "ios": "iOS风格", - "android": "安卓风格" - }, - "mobileCoverStyle": "封面样式", - "coverOptions": { - "record": "唱片", - "square": "方形", - "full": "全屏" - }, - "lyricLines": "歌词行数", - "mobileUnavailable": "此设置仅在移动端可用" - } - } -} diff --git a/src/main/modules/tray.ts b/src/main/modules/tray.ts index 136542b..4871f3c 100644 --- a/src/main/modules/tray.ts +++ b/src/main/modules/tray.ts @@ -9,8 +9,8 @@ import { } from 'electron'; import { join } from 'path'; -import type { Language } from '../../i18n/main'; import i18n from '../../i18n/main'; +import { getLanguageOptions } from '../../i18n/utils'; import { getStore } from './config'; // 歌曲信息接口定义 @@ -33,11 +33,8 @@ let songTitleTray: Tray | null = null; let isPlaying = false; let currentSong: SongInfo | null = null; -const LANGUAGES: { label: string; value: Language }[] = [ - { label: '简体中文', value: 'zh-CN' }, - { label: 'English', value: 'en-US' }, - { label: '繁體中文', value: 'zh-Hant' } -]; +// 使用自动导入的语言选项 +const LANGUAGES = getLanguageOptions(); // 更新播放状态 export function updatePlayState(playing: boolean) { diff --git a/src/renderer/components/LanguageSwitcher.vue b/src/renderer/components/LanguageSwitcher.vue index d27779b..825e8d4 100644 --- a/src/renderer/components/LanguageSwitcher.vue +++ b/src/renderer/components/LanguageSwitcher.vue @@ -1,4 +1,5 @@