Compare commits

...

442 Commits

Author SHA1 Message Date
alger
56adac0d4e feat: 优化 tray 标题长度 2025-11-08 17:37:27 +08:00
alger
452e1d1129 feat: 去除构建麦克风权限 2025-11-08 14:26:59 +08:00
alger
34ba2250bf feat: 重构播放 store 2025-11-08 14:26:04 +08:00
alger
1005718c07 feat: 封面图预先加载 2025-11-08 14:22:44 +08:00
alger
3527da17da feat: 添加心动模式播放 2025-10-22 22:48:52 +08:00
alger
9bf513d35d feat: 添加历史日推功能 2025-10-22 21:52:22 +08:00
alger
35b798b69e fix: 修复远程控制关闭无法保存问题 2025-10-22 21:52:00 +08:00
alger
9535183405 feat: 添加播放记录热力图显示功能 2025-10-22 21:51:45 +08:00
alger
6d7ba6dbae feat: 历史记录页面 添加本地和云端两种记录支持,支持歌曲、歌单、专辑 2025-10-22 21:51:16 +08:00
alger
a9adb6be36 feat: 用户页面添加收藏专辑展示 2025-10-22 21:50:20 +08:00
alger
bee5445b6e fix: 修复mini播放栏主题颜色问题 将mini播放栏设为默认 2025-10-22 21:49:53 +08:00
alger
316d5932e3 feat: 移动端歌词点击跳转 优化国际化和移动端逐字歌词 2025-10-12 17:38:45 +08:00
alger
a5d3ff359c feat: 优化逐字歌词效果,桌面歌词添加逐字歌词效果 2025-10-12 17:11:48 +08:00
alger
77f3069e67 fix: 修复逐字歌词 字间距问题 2025-10-12 13:02:56 +08:00
alger
f3a9f8b979 feat: 自动隐藏menu滚动条 2025-10-11 20:27:15 +08:00
alger
29ba231a7d feat: 平板模式 2025-10-11 20:24:11 +08:00
alger
cb2baeadf5 feat: 逐字歌词 2025-10-11 20:23:54 +08:00
alger
4575e4f26d fix: 重新解析功能修复缓存问题 2025-10-11 20:23:36 +08:00
alger
dc8957dcf2 fix: 修复桌面歌词不透明显示标题栏的问题 2025-10-11 20:23:15 +08:00
algerkong
c83ad48ef4 feat(config): 添加GPU加速设置支持 2025-09-20 16:51:47 +08:00
algerkong
67370b9072 feat: bili播放优化 2025-09-20 16:40:45 +08:00
algerkong
93022691e2 fix: 修复优化bili解析搜索和播放问题 2025-09-20 15:38:35 +08:00
algerkong
0df86b583b fix: 修复节点问题 2025-09-20 15:37:44 +08:00
algerkong
df3a7994cb feat: 优化翻译 2025-09-20 15:12:54 +08:00
Alger
8fb4c4df68 Merge pull request #477 from lekoOwO/feature/lyric-translation 2025-09-20 15:07:29 +08:00
Leko
56922caa40 feat: 新增歌詞翻譯模組和 OpenCC 翻譯引擎 2025-09-14 17:16:53 +08:00
Leko
abbbf7e771 fix: 修復 vue-eslint-parser 不在 dev dependency 的問題 2025-09-14 16:05:44 +08:00
Leko
6d9235902a fix: 相容 pnpm 包管理器設置項 2025-09-14 14:45:00 +08:00
alger
659c9f9a4c feat: 优化解析功能,添加缓存 2025-09-14 01:03:29 +08:00
alger
8f0728d9db feat: 登录状态校验功能修改 2025-09-14 00:34:54 +08:00
alger
8f9c989815 feat: 优化代码提交流程 添加lint-staged 2025-09-14 00:21:07 +08:00
alger
d8734f8302 feat: 格式化代码 2025-09-14 00:19:41 +08:00
Alger
74b9d73241 Merge pull request #472 from souvenp/feat/menu-expand
feat: 左上角菜单展开状态持久保存
2025-09-14 00:00:54 +08:00
Alger
10421fa4d2 Merge branch 'main' into feat/menu-expand 2025-09-14 00:00:46 +08:00
Alger
d05a63c5e3 Merge pull request #471 from souvenp/feat/dislike-improvement
feat: 日推不感兴趣调用官方接口并返回新歌
2025-09-13 23:59:46 +08:00
Alger
a9f76c7952 Merge branch 'main' into feat/dislike-improvement 2025-09-13 23:59:40 +08:00
alger
70677dfb14 fix: 不喜欢的操作只有每日推荐歌曲才请求接口,去除不喜欢的提示 2025-09-13 23:58:33 +08:00
Alger
e9ef7123e7 Merge pull request #470 from souvenp/feat/search-suggestions
feat: search suggestions
2025-09-13 23:41:37 +08:00
Alger
5fbe4c3ad4 Merge branch 'main' into feat/search-suggestions 2025-09-13 23:41:26 +08:00
alger
bce02532ef fix: electron环境使用kg, 其他环境使用 wy api,独立kg搜索提示 API 到otherApi.ts 2025-09-13 23:40:01 +08:00
alger
9003de8d4b fix: 优化音源设置国际化 2025-09-13 23:16:07 +08:00
Alger
c98f5bb608 Merge pull request #468 from souvenp/fix/hires-download-bug
fix: 下载无损格式会返回hires音质的问题
2025-09-13 22:55:11 +08:00
Alger
6e67263766 Merge pull request #465 from souvenp/feat/add-custom-api 2025-09-13 22:53:37 +08:00
alger
e91667a2e6 fix: 修改国际化问题 和 音源优先级以及音源解析错误处理 2025-09-13 22:52:37 +08:00
Alger
7306722fcf Merge pull request #464 from souvenp/feat/flac-tags
feat: flac tags support and optimize cover images
2025-09-13 22:22:13 +08:00
alger
76db7e3ad6 feat: 添加3D封面组件并优化顶部按钮hover逻辑 2025-09-13 22:21:11 +08:00
shano
8aaabf4b65 feat: 菜单展开设置 2025-09-10 20:15:39 +08:00
shano
292ab56be8 feat: 菜单状态保存 2025-09-10 20:05:59 +08:00
shano
5ab3143fdd fix: 下载无损格式会返回hires音质的问题 2025-09-10 19:13:19 +08:00
shano
08f7e5adfe feat: electron only 2025-09-10 18:55:02 +08:00
shano
2a8d0f2066 feat: 搜索建议添加 2025-09-10 13:15:58 +08:00
shano
fb8b4c9341 feat: 日推不感兴趣调用官方接口 2025-09-10 13:13:17 +08:00
shano
dc99331911 Merge remote-tracking branch 'origin/feat/add-custom-api' into feat/add-custom-api 2025-09-10 09:58:04 +08:00
shano
7ae6e041b5 fix 2025-09-10 09:55:47 +08:00
shano
1171e0f9e7 feat: add custom api 2025-09-09 22:09:44 +08:00
shano
df236e491c feat: add custom api 2025-09-09 22:05:48 +08:00
shano
4368c05b80 feat: Flac metadata and optimize cover images 2025-09-07 17:57:19 +08:00
alger
d24d3d63b8 feat: 添加统计脚本 2025-08-12 20:50:10 +08:00
alger
ad57673129 feat: 优化音源逻辑 2025-08-12 19:54:20 +08:00
alger
ad51f57bd7 🦄 refactor: 重构播放列表逻辑 优化随机播放功能
feated: #368 #353
2025-08-12 19:51:29 +08:00
alger
88e1c2cd81 feat: 更新至4.9.0 2025-08-07 23:26:28 +08:00
alger
18853d401f feat: 替换Token设置弹窗为Cookie设置弹窗,并优化Token保存逻辑 2025-08-07 23:24:43 +08:00
alger
6b27116584 feat: 添加登录类型条件渲染 2025-08-07 23:11:25 +08:00
alger
283a123590 feat: 更新文本 2025-08-07 23:05:33 +08:00
alger
1597fbf108 feat: 修改Cookie文字 2025-08-07 22:57:37 +08:00
alger
3ba85f34ed feat: 优化类型处理 2025-08-07 22:57:17 +08:00
alger
daa8e7514d feat: 优化登录功能 添加UID登录功能 2025-08-07 22:57:02 +08:00
alger
aeb7f0361d feat: 播放速度设置弹窗标题添加速度显示 2025-08-07 22:56:41 +08:00
alger
16aeaf2948 feat: 添加Cookie登录功能及自动获取等相关管理设置
feat: #413 #424
2025-08-06 22:36:30 +08:00
alger
09ccd9f2a6 fix: 修复菜单显示不全的问题 添加滚动条
fixed(#328): 页面左侧菜单行高问题
2025-07-29 22:57:09 +08:00
alger
679089eda9 fix: 修复音量调整不同步的问题
fixed(#331):  软件存在两套音量调整逻辑,快捷键调整和音量条调整音量不一致
2025-07-29 22:19:34 +08:00
Alger
f2eba9a6d0 Merge pull request #403 from Hellodwadawd12312312/main
feat: 使用滑块增强播放速度控制并改进空安全
2025-07-26 23:51:06 +08:00
algerkong
306215669d feat: 添加日语和韩语国际化,并且优化语言相关代码 2025-07-26 23:32:58 +08:00
algerkong
b7a58a0073 fix: 修复歌曲初始化问题 2025-07-26 23:29:53 +08:00
Qumo
8fb382e21f feat: enhance playback speed controls with slider and improve null safety for playMusic 2025-07-24 08:22:03 +02:00
alger
c08c2cbf19 refactor: 更新 eslint 和 prettier 配置 格式化代码 2025-07-23 23:54:35 +08:00
alger
d1f5c8af84 feat: 桌面歌词添加主题颜色面板组件 2025-07-23 22:47:22 +08:00
alger
d5ba218b10 feat: 添加主题根据系统切换功能
feat: #387
2025-07-23 22:45:47 +08:00
alger
e489ab46b5 fix: 修复歌单列表页面翻页类型问题
fixed: #398
2025-07-23 22:43:59 +08:00
alger
9b3019d04b fix: 修复mini窗口恢复时导致的应用窗口变小问题 2025-07-22 00:40:34 +08:00
Alger
1e213388c1 Merge pull request #396 from algerkong/fix/mac-window-close
🐞 fix: 修复mac快捷键关闭窗口报错的问题
2025-07-21 23:51:43 +08:00
alger
67ef4d7221 🐞 fix: 修复mac快捷键关闭窗口报错的问题 2025-07-21 23:49:21 +08:00
alger
62a504e7d3 feat: 托盘菜单添加繁体中文设置 2025-07-21 23:35:48 +08:00
Alger
386db7384d Merge pull request #392 from dongguacute/main
feat(i18n): add Traditional Chinese (zh-Hant) localization support
2025-07-21 23:33:50 +08:00
dongguacute
2cc03cb080 feat(i18n): add Traditional Chinese (zh-Hant) localization support
add Traditional Chinese translations for all application strings
include new language files for artist, history, donation, favorite, login, search, user, common, download, player, settings, comp components
update main i18n configuration to include zh-Hant language
add zh-Hant option to language switcher component
2025-07-20 22:53:25 +08:00
algerkong
7891bf45fd feat: 更新版本至 4.8.2 2025-06-28 18:16:19 +08:00
algerkong
2f339b1373 🐞 fix: 修复在歌词界面添加到歌单抽屉被遮挡问题 2025-06-28 17:46:24 +08:00
algerkong
749a2a69c4 feat: 重新设计歌词页面的迷你播放栏 2025-06-28 17:40:57 +08:00
algerkong
5b97010b32 🐞 fix: 修复解析错误问题, 优化播放效果 2025-06-28 17:31:37 +08:00
algerkong
694dff425b feat: 添加清除自定义音源功能 2025-06-28 17:26:07 +08:00
algerkong
e8cf253567 feat: 更新版本至 4.8.1 2025-06-27 18:59:40 +08:00
algerkong
4d831777f1 🔧 chore: 移除统计,更新支持的音乐源列表 2025-06-27 18:49:37 +08:00
algerkong
95c255d2ba 🐞 fix: 修复网页端和快捷键无法调整音量的问题 2025-06-23 20:58:08 +08:00
algerkong
d739a6701b feat: 添加通知抽屉组件,优化用户体验并支持多平台提示 2025-06-23 20:56:50 +08:00
alger
d7169efcf5 feat: 更新版本至 4.8.0 2025-06-20 23:32:29 +08:00
alger
a7cce28050 feat: 在构建配置中添加对 Linux RPM 包的支持 2025-06-20 23:32:08 +08:00
alger
e99385c512 feat: 添加版本号比较函数,优化更新检查逻辑 2025-06-20 23:17:16 +08:00
alger
72c11eef6c 🎨 style: 更新歌词区域按钮样式,修复歌词时间调整按钮不显示问题 2025-06-20 23:06:57 +08:00
alger
facb03d3e1 feat: 添加 linux rpm 构建目标支持 2025-06-20 22:27:48 +08:00
alger
902feff2fb 🔧 chore: 降级 electron 版本至 35.2.0 2025-06-20 22:23:56 +08:00
alger
426cafd54c feat: 更新 AppMenu 组件,增加移动端适配,优化工具提示的禁用条件 2025-06-20 21:15:13 +08:00
alger
e4ed089085 chore: 更新 .gitignore 文件,添加 android/app/release 目录以排除构建文件 2025-06-20 21:08:43 +08:00
alger
7f6e11e508 feat: 移除代理配置,简化构建命令,更新环境变量设置 2025-06-20 21:08:26 +08:00
alger
81b61e4575 feat: 增强移动端播放页面效果,优化横屏效果,添加播放列表功能 2025-06-20 21:07:17 +08:00
Alger
66aa6b7aff Merge pull request #326 from hecai84/main
添加任务栏缩略图控制按钮
2025-06-20 17:49:09 +08:00
hecai
58ab9906cc 启动默认显示缩略图控制按钮。
(cherry picked from commit 1f438e391ab7bb37e38a31ec571724d33f35310b)
2025-06-19 09:26:28 +08:00
hecai
9bec67ebf9 添加任务栏缩略图控制按钮
(cherry picked from commit e0ddb7cb4821b5b48ed3ffb99a44c00c8cb4d46e)
2025-06-18 15:52:37 +08:00
Alger
386c9c7067 Merge pull request #320 from Hellodwadawd12312312/feature
修复音频初始化音量问题,完善翻译
2025-06-17 11:34:26 +08:00
Felix
b95f5e1b2f small fix 2025-06-16 08:44:50 +02:00
Qumo
090103bf1a Update audioService.ts 2025-06-16 07:47:40 +02:00
Qumo
5ee60d751e Update audioService.ts 2025-06-16 07:39:35 +02:00
Qumo
a85b5ff58b Merge branch 'algerkong:main' into feature 2025-06-16 07:28:28 +02:00
alger
58922dc91b feat: 更新类型定义文件路径,移除旧的 auto-imports 和 components 定义文件 2025-06-12 22:58:01 +08:00
alger
0d89e15e01 feat: 添加横屏模式支持,优化歌词和播放控制布局 2025-06-12 22:57:24 +08:00
algerkong
b9c38d257a feat: 重构播放控制逻辑,添加播放进度恢复功能并清理无用代码 2025-06-11 20:12:52 +08:00
algerkong
d227ac8b34 feat: 优化播放栏无法控制隐藏问题 2025-06-11 20:10:33 +08:00
algerkong
f9d85f11ad feat: 去除无用代码 2025-06-11 20:05:43 +08:00
Felix
49595ef57f more translation 2025-06-10 13:31:33 +02:00
Alger
cceb1de3fb Merge pull request #304 from Hellodwadawd12312312/feature
添加搜索类型的翻译
2025-06-09 10:41:25 +08:00
Felix
f59b5d5602 translation 2025-06-08 14:49:24 +02:00
alger
fabcf289dc feat: 优化歌曲列表组件布局,添加底部间距以提升视觉效果 2025-06-07 22:47:34 +08:00
alger
934580552d feat: 优化歌词组件和移动端界面设计 2025-06-07 22:30:39 +08:00
alger
6f1909a028 🐞 fix: 修复刷新后第一次播放出现的无法播放问题 2025-06-07 22:10:55 +08:00
alger
c5d71cf53c feat: 添加 Vite 配置文件并更新 package.json,支持开发模式下的 Web 预览 2025-06-07 21:34:19 +08:00
alger
21b2fc08be feat: 优化移动端界面设计以及歌词界面设计 添加播放模式选择 2025-06-07 10:48:54 +08:00
alger
155bdf246c feat: 优化提示组件,支持位置和图标显示选项 2025-06-06 23:37:24 +08:00
alger
e46df8a04e feat: 优化窗口大小管理功能,优化窗口状态保存与恢复逻辑
- 引入窗口大小管理器,初始化窗口大小管理
- 优化窗口状态保存与恢复,确保在迷你模式下正确应用窗口大小
- 移除不必要的代码,简化窗口管理逻辑
- 更新窗口创建逻辑,确保窗口大小和位置的正确性
2025-06-06 23:37:06 +08:00
alger
b203077cad feat: 添加下载设置功能,支持自定义文件名格式和下载路径配置
- 新增下载设置抽屉,允许用户设置下载路径和文件名格式
- 支持多种文件名格式预设和自定义格式
- 实现下载项的显示名称格式化
- 优化下载管理逻辑,避免重复通知
2025-06-05 23:02:41 +08:00
alger
a08fbf1ec8 style: 优化播放列表抽屉样式,调整标题和按钮颜色以提升可读性 2025-06-05 22:19:55 +08:00
alger
edd393c8ac feat: 新增歌单导入功能
添加歌单导入功能,支持通过链接、文本和元数据三种方式导入歌单
- 实现链接导入、文本导入和元数据导入三种方式
- 添加导入状态检查和显示功能
2025-06-04 22:53:49 +08:00
alger
8988cdb082 feat: 在音乐列表页面中添加 Electron 环境判断,优化多选下载操作的显示逻辑 2025-06-04 22:46:35 +08:00
alger
1221101821 feat: 列表添加多选下载功能,支持批量选择和下载音乐 2025-06-04 20:19:44 +08:00
alger
3ac3159058 feat: 添加下载管理页面, 引入文件类型检测库以支持多种音频格式 2025-06-03 22:35:04 +08:00
Alger
bfaa06b0d5 Merge pull request #281 from algerkong/feat/window-auto-size
feat: 添加主窗口自适应大小功能,页面缩放功能,支持缩放因子的调整和重置,并在搜索栏中提供缩放控制
2025-05-28 22:12:29 +08:00
alger
61700473b9 feat: 添加主窗口自适应大小功能,页面缩放功能,支持缩放因子的调整和重置,并在搜索栏中提供缩放控制 2025-05-28 22:08:17 +08:00
alger
bf4bcfcde6 chore: 更新 .gitignore 文件 2025-05-28 22:06:13 +08:00
Alger
475d7d2595 Merge pull request #280 from algerkong/fix/day-list
feat: 重构每日推荐数据加载逻辑,提取为独立函数并优化用户状态判断
2025-05-28 22:04:14 +08:00
alger
5e704a1f3c feat: 重构每日推荐数据加载逻辑,提取为独立函数并优化用户状态判断 2025-05-28 22:02:59 +08:00
Alger
6faab820da Merge pull request #279 from algerkong/fix/volume-color
feat: 添加mini播放栏鼠标滚轮调整音量 并优化音量滑块数字不展示问题
2025-05-28 22:01:07 +08:00
alger
5c7278544a feat: 添加mini播放栏鼠标滚轮调整音量 并优化音量滑块数字不展示问题 2025-05-28 21:58:32 +08:00
Alger
4c24bb9257 feat: Update README.md 2025-05-27 15:18:42 +08:00
alger
c975344dd0 feat: 添加歌词矫正功能,支持增加和减少矫正时间 2025-05-26 22:58:42 +08:00
Alger
08a14359a5 Merge pull request #268 from algerkong/fix/modal-zindex
fix: 修复更多设置弹窗被歌词窗口遮挡问题 并优化为互斥弹窗, 优化样式
2025-05-25 19:28:54 +08:00
alger
62e5166953 fix: 修复更多设置弹窗被歌词窗口遮挡问题 并优化为互斥弹窗, 优化样式 2025-05-25 19:26:24 +08:00
alger
7685ad3939 feat: 在配置中添加 publicDir 选项以指定资源目录 2025-05-25 11:35:16 +08:00
alger
d7c06586d6 feat: 在 EQControl 组件标题中添加桌面版可用提示标签 2025-05-25 11:07:06 +08:00
alger
5070a085e9 feat: 优化收藏和历史列表组件,添加加载状态管理和动画效果 2025-05-24 19:23:38 +08:00
alger
e5adb8aa72 fix: 修复设置页面动画速度滑块样式和文本错误 2025-05-24 19:23:13 +08:00
alger
d08439c99e feat:v4.7.1 2025-05-24 10:11:50 +08:00
alger
dee4515cb3 fix: 修复切换收藏和不喜欢状态时事件处理逻辑 2025-05-24 10:11:29 +08:00
alger
53bc1774ff fix: 修复下载请求中的音乐 URL 处理逻辑 2025-05-24 10:02:15 +08:00
alger
589540be29 feat: 优化歌曲组件事件处理,使用展开运算符简化事件传递 2025-05-23 22:43:01 +08:00
alger
2bcae85419 feat: 更新应用ico图标 2025-05-23 21:57:34 +08:00
alger
6e68927eec feat: 更新应用图标 2025-05-23 21:46:18 +08:00
alger
a4eea18fa5 feat:更新 4.7.0 2025-05-23 21:33:58 +08:00
alger
fe5b1d5de8 feat: 添加主窗口失去焦点时禁用最大化功能 2025-05-23 21:29:43 +08:00
alger
c8e6db11c9 feat: 更新应用图标,替换为新版本的图标文件 2025-05-23 20:43:13 +08:00
alger
5bef0e44a0 feat: 为歌曲下拉菜单添加圆角样式,优化歌曲预览布局 2025-05-23 20:08:57 +08:00
alger
d56a25eb3c feat: 在用户歌单中添加“我创建的”标签,优化获取用户歌单的逻辑 2025-05-23 20:08:40 +08:00
alger
a449b74ef2 feat: 添加 husky 预提交和预推送钩子,运行类型检查以确保代码质量 2025-05-23 20:07:29 +08:00
alger
ad7b504eef 🦄 refactor: 重构歌曲组件,添加基础组件和多种样式,优化播放列表抽屉功能 2025-05-23 19:39:46 +08:00
alger
6048e243c7 feat: 在歌手详情页添加歌曲操作工具栏,支持播放全部、添加到播放列表和搜索功能,布局切换功能 2025-05-23 19:39:32 +08:00
alger
0c74291a34 feat: 添加所有用户的关注和粉丝列表点击 优化播放排行获取和无权限展示 2025-05-23 19:39:26 +08:00
alger
7fa0fa5221 feat: 添加 macOS 下点击 Dock 图标激活主窗口的功能 2025-05-23 19:39:21 +08:00
alger
95af222da7 feat: 添加鼠标滚轮调整音量功能,并显示音量百分比 2025-05-23 19:39:16 +08:00
alger
9eefe62fba refactor: 移除未使用的导入和格式问题 2025-05-22 22:21:53 +08:00
Alger
b621995e24 Merge pull request #256 from algerkong/fix/downloadurl
fix: 修复并优化下载功能,重构添加 hook
2025-05-22 22:15:58 +08:00
Alger
91f97ff76b Merge branch 'main' into fix/downloadurl 2025-05-22 22:15:51 +08:00
Alger
cce2b96d29 Merge pull request #255 from algerkong/feat/nolike
feat: 歌曲右键 添加不喜欢功能以过滤每日推荐歌曲
2025-05-22 22:12:46 +08:00
alger
a0935c74fe feat: 歌曲右键 添加不喜欢功能以过滤每日推荐歌曲 2025-05-22 22:11:10 +08:00
alger
df5ecb6eb5 feat: 添加 tab监听以刷新下载列表 2025-05-22 20:59:06 +08:00
alger
ca51020602 refactor: 将下载逻辑提取到useDownload hook中 2025-05-22 20:58:47 +08:00
alger
258828ffbd feat: 双击播放由双击歌曲名改为双击整个组件都可以 2025-05-22 20:12:55 +08:00
alger
91b1ff7df9 fix: 修复播放音乐时URL未正确更新的问题 2025-05-22 20:12:47 +08:00
alger
8cc617a5f6 docs: 更新文档图片和README内容 2025-05-20 22:45:45 +08:00
alger
170ac45115 style: 顶部定时 添加悬停缩放效果和光标指针样式 2025-05-20 21:22:41 +08:00
alger
2dd45351e5 feat: 添加定时器过期检查功能 优化顶部定时点击 2025-05-20 20:57:16 +08:00
alger
f5f0dbb222 feat: 优化播放栏,整合高级控制菜单,将定时、均衡器、速度控制改为更多设置按钮显示, 添加定时关闭顶部显示功能 2025-05-19 23:13:06 +08:00
Alger
7fca6db2a3 Merge pull request #241 from Java-wyx/speed-up
feat: 添加播放速度控制功能
2025-05-19 19:17:26 +08:00
Java-wyx
655473699a feat: 添加播放速度控制功能
现有播放器不支持改变播放速度,用户无法实现 0.5×、1.5×、2.0× 等快进/慢放需求。为了提升可用性和灵活性,决定在播放栏增加速度选择菜单,并支持 Media Session API 同步速率
2025-05-19 17:59:20 +08:00
Alger
4d371df510 Merge pull request #236 from algerkong/dev
feat: 优化页面效果 音源解析优化
2025-05-18 13:12:18 +08:00
alger
a21521cc6f docs: 更新预览地址 2025-05-18 13:09:49 +08:00
alger
01a3a7a501 feat: 添加音乐平台链接,优化移动端样式 2025-05-18 12:45:19 +08:00
alger
e47c84e5eb feat:优化B站音频解析功能 2025-05-18 12:44:23 +08:00
alger
54cbb84e6e style(player): 统一音源选项的标签格式 2025-05-18 12:43:27 +08:00
alger
f68f49973a perf(请求): 增加请求超时时间至15000毫秒 2025-05-18 12:43:09 +08:00
alger
e9fe9000f6 🐞 fix(player): 修复播放状态判断逻辑
修复在播放相同ID但不同URL的音乐时,播放状态判断逻辑错误的问题。现在只有当音乐ID和URL都相同时才会切换播放/暂停状态。
2025-05-18 12:42:15 +08:00
alger
6d4e6ef214 feat: 移除不必要的Content-Security-Policy 2025-05-18 10:57:19 +08:00
alger
2379b2c9cc feat: 点击下一首自动播放,优化 https问题 2025-05-17 20:10:07 +08:00
Alger
8c6b69e762 Merge pull request #234 from algerkong/feat/control-status-bar
 feat: 添加mac状态栏播放按键控制功能开关
2025-05-17 14:47:14 +08:00
alger
ae1a7c963f 🌈 style: 移除未使用的SleepTimerPopover组件 2025-05-17 14:46:35 +08:00
alger
2476fbd6e3 feat: 添加mac状态栏播放按键控制功能开关 2025-05-17 14:45:39 +08:00
alger
f7951ec22f feat: 移动端去除定时关闭 2025-05-17 14:11:10 +08:00
alger
33a1057de9 feat: 修改移动端展示菜单 2025-05-17 13:53:52 +08:00
alger
2e96161bd0 feat: 修改播放列表展示形式,优化播放逻辑,添加清空播放列表功能 2025-05-17 13:27:50 +08:00
alger
56b3ecfd25 🔧 chore: 优化网页端下载程序功能 2025-05-15 22:06:12 +08:00
alger
54d66d05f4 🔧 chore: 更新 MusicListPage 组件,添加移动端布局判断,优化紧凑布局逻辑 2025-05-15 21:33:44 +08:00
alger
b32408b44e feat: 歌单列表相添加布局切换、播放全部、收藏、添加到播放列表 2025-05-15 21:20:01 +08:00
alger
3c792ce3cc 🔧 chore: 调整 PlaylistDrawer 组件的样式,增加内边距 2025-05-15 21:17:14 +08:00
alger
5084da333f feat: 在应用菜单中添加工具提示功能 2025-05-15 21:16:48 +08:00
alger
a8010c8ca7 feat: 添加排行榜页面 2025-05-15 21:16:33 +08:00
algerkong
e1ddffc8ae feat: 更新 README 2025-05-15 15:11:46 +08:00
alger
69b1e541c6 feat: 在收藏列表中添加歌曲点赞功能 2025-05-15 00:08:27 +08:00
alger
35b84f3e6a 🔧 chore: 更新收藏列表中活动项的背景颜色和文本颜色 2025-05-14 21:46:15 +08:00
alger
28b9fd5475 feat: 更新 README 和国际化文件,添加QQ 频道信息 2025-05-14 21:41:38 +08:00
Alger
dc70fde9e4 Merge pull request #227 from algerkong/fix/mini-bar-volume
🔧 chore:  mini播放栏不再显示音量调节
2025-05-14 21:26:57 +08:00
alger
278db37a88 🔧 chore: mini播放栏不再显示音量调节 2025-05-14 21:26:23 +08:00
alger
2803d40dd1 feat: 收藏列表添加升序降序排列 2025-05-14 21:18:42 +08:00
alger
54f82d384e feat: 退出登录 刷新页面 2025-05-14 21:18:11 +08:00
alger
7d1ffa603c 🔧 chore: 更新获取最新发布信息的 API URL 2025-05-13 22:38:03 +08:00
alger
49f7728eac feat: 更新至 v4.6.0 2025-05-11 21:51:42 +08:00
alger
890c0c86c1 🔧 chore: 尝试解决 windows 桌面歌词窗口标题出现的问题 2025-05-11 21:45:45 +08:00
alger
15f4ea4708 🔧 chore: 移除 MvPlayer 组件中未使用的 playerStore 引用,简化代码结构 2025-05-11 15:40:30 +08:00
Alger
dbb3fbcc09 Merge pull request #216 from algerkong/feat/search-music-play
 feat: 搜索列表添加下一首播放功能,修改播放逻辑搜索的歌曲点击播放不重新覆盖播放列表, 添加全部播放功能
2025-05-11 15:38:35 +08:00
alger
31640bb663 feat: 搜索列表添加下一首播放功能,修改播放逻辑搜索的歌曲点击播放不重新覆盖播放列表, 添加全部播放功能 2025-05-11 15:37:37 +08:00
Alger
10f4473c9d Merge pull request #215 from algerkong/feat/music-reparse
添加重新解析音乐功能
2025-05-11 15:13:00 +08:00
alger
3297eb5ccb Merge branch 'main' into feat/music-reparse 2025-05-11 15:10:18 +08:00
alger
82a69d0b00 feat: 增加音源重新解析功能 2025-05-11 15:09:56 +08:00
alger
3d66a890c2 feat: 优化歌手详情页的路由参数监听逻辑 2025-05-11 11:53:31 +08:00
alger
b3de2ae785 🔧 chore: 优化 MvPlayer 组件的关闭逻辑,简化音频暂停处理 2025-05-11 01:12:47 +08:00
alger
31ea3b7e0a 🔧 chore: 修改 MiniPlayBar 组件,调整音量滑块的样式和交互方式,优化悬停效果 2025-05-10 21:25:40 +08:00
alger
b8580efb17 feat: 修复图片加载过大问题 2025-05-10 20:41:27 +08:00
alger
9cc064c01b 🔧 chore:改进播放器组件的加载状态显示, 优化 GD音乐解析逻辑,增加超时处理,调整音源列表 2025-05-10 20:12:10 +08:00
alger
80450349c0 🐞 fix: 修复歌曲加入歌单失败问题 2025-05-09 19:44:31 +08:00
alger
9f125f88bd feat: 增加对 arm64 架构的支持,修改 Windows 图标和安装程序图标为新资源 2025-05-09 19:43:30 +08:00
alger
618c345a78 🔧 chore: 更新音乐源设置,移除 YouTube,添加 Kuwo,确保平台一致性 2025-05-09 19:43:01 +08:00
alger
44f9709bb3 🔧 chore: 更新 Electron 版本至 36.2.0,优化歌词视图的悬停效果 2025-05-09 19:42:49 +08:00
alger
3c1a144113 feat: 添加“收藏”功能至托盘菜单 2025-05-09 19:42:46 +08:00
alger
8ed13d4a85 🔧 chore: 优化播放器逻辑,改进播放失败处理,支持保持当前索引并增加重试机制 2025-05-07 23:55:14 +08:00
alger
3d71a293a1 🔧 chore: 在 App.vue 中引入 audioService,并在组件挂载时释放操作锁 2025-05-07 23:16:05 +08:00
alger
cb58abbbfd 🔧 chore: 优化操作锁逻辑,添加超时检查机制,确保操作锁在超时后自动释放 2025-05-07 22:36:55 +08:00
alger
e2527c3fb8 feat: 修改音乐列表为页面,优化专辑和歌单详情加载逻辑,支持通过路由跳转展示音乐列表 2025-05-07 22:36:52 +08:00
alger
3ca7e9a271 feat: 优化捐赠留言显示 2025-05-07 00:15:45 +08:00
algerkong
2f07550316 🔧 chore: 更新部署工作流,将主分支名称从 dev_electron 修改为 main 2025-05-03 23:54:16 +08:00
algerkong
eff9328a23 feat: 添加定时关闭功能,支持按时间、歌曲数和播放列表结束自动停止播放 2025-05-03 23:46:28 +08:00
algerkong
5f63ab6b4a 🐞 fix: 优化远程控制页面HTML路径获取逻辑,支持开发环境与生产环境的路径区分 2025-05-02 22:53:29 +08:00
Alger
c2e08db2e4 Merge pull request #186 from algerkong/feat/bili-favorite
 feat: 添加 B站视频 ID 匹配逻辑,优化收藏功能以支持 B站视频,确保收藏列表一致性
2025-05-02 22:43:44 +08:00
algerkong
903389e4bf 🐞 fix: 优化收藏列表样式,添加条件类以支持组件最大宽度 2025-05-02 22:42:43 +08:00
algerkong
327384ace5 feat: 添加 B站视频 ID 匹配逻辑,优化收藏功能以支持 B站视频,确保收藏列表一致性 2025-05-02 22:39:47 +08:00
algerkong
6ffe4daed0 🐞 fix: 优化播放列表索引更新逻辑,避免与 nextPlay/prevPlay 冲突,确保歌曲预加载一致性 2025-05-02 19:54:58 +08:00
algerkong
2b8c9bf22a 🔧 chore: 更新 Electron 版本至 36.1.0,修改应用图标 2025-05-02 19:40:53 +08:00
algerkong
c7d586407e 🐞 fix: 移除不必要的 i18n 导入,优化 MusicHook 逻辑 2025-05-02 19:35:32 +08:00
algerkong
c5af89e51f 🐞 fix: 移除不必要的监听器,优化音频播放逻辑,添加音频就绪事件处理,改进操作锁机制以防止并发操作 2025-05-02 19:25:12 +08:00
algerkong
2d8770b074 🐞 fix: 更新二维码检查接口,添加 noCookie 参数以优化登录状态检查 2025-05-02 18:45:04 +08:00
alger
4abb6a5a9f feat: 添加额外资源配置,优化远程控制页面HTML路径获取逻辑 2025-04-30 00:47:14 +08:00
alger
b1d515465a 🐞 fix: 修复远程控制页面找不到问题 2025-04-30 00:14:05 +08:00
alger
ea7dca7975 🌈 style: v4.5.0 2025-04-29 23:48:49 +08:00
alger
c98fa20a74 feat: 优化设置页面 拆分组件 2025-04-29 23:38:17 +08:00
Alger
16d6ff39c8 Merge pull request #173 from algerkong/fix/overlapping-playback
🐞 fix: 修复音乐播放重复声音的问题,添加锁机制,添加防抖机制,优化音频服务和快捷键处理逻辑
2025-04-29 23:33:44 +08:00
alger
159dd03a2c 🐞 fix: 修复音乐播放重复声音的问题,添加锁机制,添加防抖机制,优化音频服务和快捷键处理逻辑 2025-04-29 23:33:03 +08:00
Alger
167c8ad493 Merge pull request #171 from algerkong/feat/remote-control
 feat: 添加远程控制功能,支持远程控制音乐播放操作
2025-04-29 23:23:43 +08:00
alger
c82ffd0c7d feat: 添加远程控制功能,支持远程控制音乐播放操作 2025-04-29 23:21:16 +08:00
alger
0128662ed2 🎨 style: 优化应用图标 更新应用图标资源 2025-04-27 21:56:03 +08:00
alger
30695149d6 feat: 更新歌手数据加载逻辑,首页添加周杰伦歌手信息常驻 2025-04-25 23:10:02 +08:00
Alger
bbc1bb7436 Merge pull request #165 from algerkong/fix/artist-error
🐞 fix: 修复歌手页面数据加载问题
2025-04-25 23:08:31 +08:00
alger
57424f9e15 🐞 fix: 修复歌手页面数据加载问题 2025-04-25 23:07:09 +08:00
algerkong
32b93680b9 feat: 优化音源选择逻辑以去重 2025-04-25 09:07:19 +08:00
algerkong
0a22c7b5d7 feat: 优化设置模块,合并默认设置与存储设置,初始化时读取设置 2025-04-25 09:07:19 +08:00
algerkong
64f5fcaee4 🔧 chore: 移除不再使用的快捷键初始化功能 2025-04-25 09:07:19 +08:00
Alger
304c24a673 feat: Update README.md 2025-04-24 20:41:20 +08:00
Alger
a56bca98b2 feat: Update README.md 2025-04-24 20:38:25 +08:00
alger
1865bd95bc 🔧 chore: 更新版本号至 4.4.0 2025-04-23 00:26:43 +08:00
alger
fd37015466 🌈 style: v4.4.0 2025-04-23 00:18:02 +08:00
alger
7df1c25168 feat: 添加 GD 音乐台支持及相关设置,优化音源解析功能 2025-04-23 00:10:28 +08:00
alger
ed9cf9c4c5 feat: 优化音源解析功能,添加音源配置 2025-04-22 23:39:08 +08:00
alger
35b9cbfdbd 🔧 chore: 更新 electron 依赖版本至 35.2.0 2025-04-22 22:11:28 +08:00
algerkong
df6da2eb9e 🔧 chore: 移除 eslint-config-airbnb-base 依赖,并优化 .eslintrc.cjs 配置,以保持代码一致性 2025-04-21 21:17:10 +08:00
algerkong
2d966036bb 🔧 chore: 更新 @vue/eslint-config-prettier 和 @vue/eslint-config-typescript 依赖版本至最新,以保持代码质量和一致性 2025-04-21 21:15:36 +08:00
algerkong
499857a679 🔧 chore: 更新 @typescript-eslint 依赖版本至 8.30.1,以保持代码质量和一致性 2025-04-21 21:12:39 +08:00
algerkong
7624a1a71e 🔧 chore: 更新 eslint 版本至 9.0.0,以保持代码质量和一致性 2025-04-21 21:06:31 +08:00
Alger
05b85c4b7b Merge pull request #153 from algerkong/fix/download-froze
🐞 fix: 修复下载管理 切换tab程序卡死问题
2025-04-21 20:39:24 +08:00
algerkong
27d5bd8f81 🐞 fix: 修复下载管理 切换tab程序卡死问题 2025-04-21 20:38:05 +08:00
alger
c5da42b67d 🔧 chore: 修正音乐规则描述中的拼写错误,将 "Node.j" 更正为 "Node.js" 2025-04-20 00:14:00 +08:00
alger
5e484334de 🔧 chore: 更新 .gitignore 文件,添加 Android 资源目录以排除不必要的文件 2025-04-20 00:12:58 +08:00
algerkong
25b90fafdc feat: 调整 AppLayout 和 AppMenu 组件样式,优化底部菜单位置和间距 2025-04-18 19:18:37 +08:00
algerkong
a676136f48 🔧 chore: 更新依赖版本,优化 Electron 窗口设置,调整歌词窗口背景色样式 2025-04-18 19:18:31 +08:00
alger
76e55d4e6b 🐞 fix: 修复歌曲播放地址缓存导致播放失败问题 添加过期时间 2025-04-16 00:03:56 +08:00
alger
b7de5fc173 🌈 style: v4.3.0 2025-04-13 00:04:48 +08:00
alger
7bc8405df0 feat: 优化歌单加载逻辑 2025-04-12 23:51:37 +08:00
alger
a7f2045c7b feat: 添加统计服务 2025-04-12 23:16:12 +08:00
alger
b9b52f4d9f feat:确保仅在 Electron 中调用 API 发送歌曲数据 2025-04-12 13:05:08 +08:00
alger
09f8837fe4 feat: 增加无限滚动页面大小至100,以优化历史和收藏视图的加载体验 2025-04-12 12:37:08 +08:00
alger
d7fea7f888 feat: 优化歌单歌曲播放处理 2025-04-12 12:32:19 +08:00
alger
bb7d1e332f feat: 优化音乐封面显示逻辑,确保在缺失封面时使用默认图片,并更新推荐专辑组件以显示封面 2025-04-11 20:07:51 +08:00
alger
2dc907a20f 🌈 style: 修改依赖 2025-04-11 19:37:45 +08:00
Alger
ad3e52f6e1 Merge pull request #126 from algerkong/feat/music-list-search
 feat: 添加搜索功能至歌曲列表(可搜索名称 歌手 专辑),支持拼音匹配,优化播放列表加载逻辑,更好适配超大歌单
2025-04-11 19:36:10 +08:00
alger
b593ca3011 feat: 添加搜索功能至歌曲列表(可搜索名称 歌手 专辑),支持拼音匹配,优化播放列表加载逻辑,更好适配超大歌单 2025-04-11 19:35:21 +08:00
alger
988418e8d1 feat: 优化歌曲下载逻辑 2025-04-10 22:15:58 +08:00
Alger
1922311238 Merge pull request #123 from algerkong/feat/down-new
 feat: 歌曲下载内置封面歌词歌曲信息等,添加无限制下载功能,优化下载管理,支持清空下载记录
2025-04-10 00:27:48 +08:00
alger
3b1488f147 feat: 歌曲下载内置封面歌词歌曲信息等,添加无限制下载功能,优化下载管理,支持清空下载记录 2025-04-10 00:26:58 +08:00
alger
5f4b53c167 feat: 添加直接播放歌单功能,优化播放列表加载逻辑,支持异步加载完整歌单 2025-04-09 22:27:52 +08:00
alger
e17941dfb0 feat: 调整迷你播放栏列表项高度,从52px更改为69px,以优化滚动体验 2025-04-06 21:11:17 +08:00
Alger
9aff694116 Merge pull request #119 from algerkong/feat/shortcut
 feat: 添加快捷键管理功能,支持全局和应用内快捷键的启用/禁用,优化快捷键配置界面
2025-04-05 20:36:13 +08:00
algerkong
c2983ba079 feat: 添加快捷键管理功能,支持全局和应用内快捷键的启用/禁用,优化快捷键配置界面
feat: #117
2025-04-05 20:33:34 +08:00
algerkong
541ff2b76c feat: 优化桌面歌词 歌词行动态样式计算,提升歌词显示效果
feat: #115
2025-04-04 22:46:23 +08:00
algerkong
55b50d764b feat: 优化歌词界面配置 2025-04-04 22:19:35 +08:00
algerkong
30ff7b2930 feat: 优化历史歌曲获取功能, 分离网易云音乐和B站视频处理逻辑 2025-04-04 21:16:27 +08:00
algerkong
a24f901d1d feat: 优化B站视频代理URL获取逻辑 2025-04-04 21:16:09 +08:00
alger
7f7d41f883 feat: 更新迷你播放栏在页面显示逻辑 2025-04-02 00:07:37 +08:00
alger
7b27cf5bc6 fix: 修复类型问题 2025-04-01 23:34:17 +08:00
alger
ad8f7af3a9 feat: 更新至 v4.2.0
## v4.2.0

###  新功能
- 添加迷你播放器模式 ([0f55795](https://github.com/algerkong/AlgerMusicPlayer/commit/0f55795))
- 更新网易云音乐API版本,添加B站视频搜索功能和播放器组件 ([280fec1](https://github.com/algerkong/AlgerMusicPlayer/commit/280fec1))
- mac端添加状态栏 显示当前播放歌曲和操作按钮 ([374a7a8](https://github.com/algerkong/AlgerMusicPlayer/commit/374a7a8))
- 添加音频URL过期事件监听,自动重新获取B站和网易云音乐音频URL并恢复播放 ([ee6e9d4](https://github.com/algerkong/AlgerMusicPlayer/commit/ee6e9d4))
- 优化搜索功能,改进搜索历史管理和路由处理逻辑 ([477f8bb](https://github.com/algerkong/AlgerMusicPlayer/commit/477f8bb))
- 在播放列表中添加歌曲删除功能,优化播放列表管理逻辑 ([a5f694e](https://github.com/algerkong/AlgerMusicPlayer/commit/a5f694e)) (#94)
- 优化歌词窗口字体控制按钮样式 ([c5e50c9](https://github.com/algerkong/AlgerMusicPlayer/commit/c5e50c9))
- 优化首页banner加载逻辑 ([01ccad4](https://github.com/algerkong/AlgerMusicPlayer/commit/01ccad4))
- 优化歌手详情页面 由抽屉改为页面 ([dfb8f55](https://github.com/algerkong/AlgerMusicPlayer/commit/dfb8f55))
- 增加用户关注列表和关注用户详情页 可查看听歌排行和用户歌单 ([2924ad6](https://github.com/algerkong/AlgerMusicPlayer/commit/2924ad6))
- 优化进度条 鼠标悬停直接显示进度信息 ([9ce872e](https://github.com/algerkong/AlgerMusicPlayer/commit/9ce872e))
- 优化应用更新下载功能 可后台下载 弹出下载完成提示 不再自动关闭应用 ([23b2340](https://github.com/algerkong/AlgerMusicPlayer/commit/23b2340))

### 🐛 Bug 修复
- 修复进度条多次拖动和多次暂停播放引发的歌曲重复播放bug ([cfe197c](https://github.com/algerkong/AlgerMusicPlayer/commit/cfe197c)) (#104)
- 修复关闭按钮最小化 还在任务栏显示的bug ([e0d1305](https://github.com/algerkong/AlgerMusicPlayer/commit/e0d1305))
- 修复播放列表中歌曲删除时类型不匹配的问题 ([8d6d052](https://github.com/algerkong/AlgerMusicPlayer/commit/8d6d052))
2025-04-01 23:25:52 +08:00
alger
2599766e3e feat: cursor rule 2025-04-01 23:25:19 +08:00
alger
0f55795ca9 feat: 添加迷你模式功能,支持迷你窗口的显示与隐藏,更新设置项以控制迷你播放栏和歌词显示,优化路由管理以适应迷你模式 2025-04-01 23:22:26 +08:00
alger
8d6d0527db 🐛fix: 修复播放列表中歌曲删除时类型不匹配的问题,确保正确移除歌曲 2025-03-31 23:07:31 +08:00
alger
374a7a837d feat: mac添加音乐控制图标 , 托盘菜单项,更新播放状态和当前歌曲信息的逻辑
feat #105
2025-03-31 23:05:19 +08:00
alger
e0d13057c3 🐛fix: 修改标题栏行为,将最小化功能更改为托盘显示,优化窗口管理逻辑
fix #98
2025-03-31 23:04:35 +08:00
alger
23b2340169 feat: 优化更新提示对话框,支持文件路径复制和后台下载功能,优化安装流程
feat: #100
2025-03-31 23:01:03 +08:00
Alger
7e826311fe Merge pull request #104 from algerkong/fix/play-error
 feat: 优化音频播放进度更新逻辑,添加拖动滑块时的状态管理和节流处理
2025-03-31 22:58:36 +08:00
alger
cfe197c805 feat: 优化音频播放进度更新逻辑,添加拖动滑块时的状态管理和节流处理 2025-03-31 22:57:00 +08:00
Alger
230132904e Merge pull request #102 from algerkong/feat/bilibili-play
添加 bilibili资源搜索播放
2025-03-31 22:53:35 +08:00
alger
fb44ae45cc Merge branch 'dev_electron' into feat/bilibili-play 2025-03-31 22:48:59 +08:00
alger
9ce872eebe feat: 优化播放条滑块提示样式,添加滑块悬停提示功能 2025-03-30 12:56:42 +08:00
alger
ee6e9d43fd feat: 添加音频URL过期事件监听,自动重新获取B站和网易云音乐音频URL并恢复播放 2025-03-30 12:40:39 +08:00
alger
1a440fad09 feat: 添加B站音频URL获取功能,优化播放器逻辑,删除不再使用的BilibiliPlayer和MusicBar组件 2025-03-30 01:20:28 +08:00
alger
477f8bb99b feat: 优化搜索功能,改进搜索历史管理和路由处理逻辑 2025-03-30 00:18:44 +08:00
Alger
56c3ca1cce Merge pull request #94 from algerkong/feat/del-playlist
 feat: 在播放列表中添加歌曲删除功能,优化播放列表管理逻辑
2025-03-29 23:28:47 +08:00
alger
a5f694ea72 feat: 在播放列表中添加歌曲删除功能,优化播放列表管理逻辑
feat: #92
2025-03-29 23:26:26 +08:00
alger
280fec1990 feat: 更新网易云音乐 API 版本,添加 B站视频搜索功能和播放器组件 2025-03-29 23:19:51 +08:00
alger
c5e50c9fd5 feat: 优化歌词窗口字体控制按钮样式 2025-03-29 20:53:47 +08:00
alger
01ccad4df7 feat: 优化首页banner加载逻辑 2025-03-29 20:53:10 +08:00
alger
dfb8f55fba feat: 添加新的歌手详情页面 2025-03-29 20:52:50 +08:00
alger
2924ad6c18 feat: 增加用户关注列表 和 用户详情页 2025-03-24 22:54:04 +08:00
alger
9f5bac29a0 🚀new: v4.1.0 更新
### 🐛 Bug 修复
- 修复歌词窗口处理逻辑,解决 Windows 系统下桌面歌词窗口拖动问题
- 解决歌词初始化重复播放问题

###  新功能
- 优化移动端和网页端效果和体验
- 增加系统控制的音频服务的上一曲和下一曲功能
- 优化用户数据加载逻辑和错误处理
- 增强语言切换功能
- 首页添加用户歌单推荐
- 优化音频监听器初始化和设置保存逻辑

### 🔄 重构
- 将 Vuex 替换为 Pinia 状态管理
- 更新依赖版本
2025-03-23 12:33:13 +08:00
Alger
2fe1f0c04c Merge pull request #83 from algerkong/fix/duplicate-playback
 feat: 增强歌词窗口处理逻辑,修复可能引起的歌词初始化重复播放问题
2025-03-23 00:49:08 +08:00
alger
2a12f57cb2 feat: 增强歌词窗口处理逻辑,修复可能引起的歌词初始化重复播放问题 2025-03-23 00:47:01 +08:00
alger
4c10533a3d 🛠️ lint: 修复格式问题 2025-03-23 00:33:49 +08:00
alger
cda440b01a 🛠️ feat: 移除不必要的字体设置 2025-03-23 00:28:42 +08:00
alger
7b9e23743b lint: 修复格式问题 2025-03-22 15:01:38 +08:00
alger
e43270f35d lint: 修复格式问题 2025-03-22 14:54:24 +08:00
alger
9431faf932 feat: 优化移动端和网页端效果和体验
feat: #82
2025-03-22 13:45:23 +08:00
Alger
be03b5f8fc Merge pull request #82 from algerkong/feat/next-play
 feat: 增加音频服务的上一曲和下一曲功能
2025-03-22 10:40:19 +08:00
alger
8a414d0c25 feat: 增加音频服务的上一曲和下一曲功能 2025-03-22 10:37:57 +08:00
alger
f9fd9afcdd feat: 优化用户数据加载逻辑和错误处理 2025-03-22 10:31:05 +08:00
alger
b114cf4a33 feat: 增强语言切换功能和用户播放列表显示 2025-03-22 10:30:57 +08:00
alger
fa39d4ca55 feat: 优化音频监听器初始化和设置保存逻辑
- 在 App.vue 中引入 initAudioListeners 函数,确保在播放音乐时初始化音频监听器。
- 在 MusicHook.ts 中重构音频监听器的初始化逻辑,增加音频加载的超时处理。
- 在设置页面中实现防抖保存功能,避免频繁更新设置,提高性能和用户体验。

这些更改旨在提升音频播放的稳定性和设置管理的效率。
2025-03-21 00:19:15 +08:00
alger
650e4ff786 🔧 feat: 更新依赖版本 修复类型错误 优化首页推荐样式 2025-03-20 01:07:39 +08:00
alger
e355341596 🦄 refactor: 重构代码将 Vuex替换为 Pinia
集成 Pinia 状态管理
2025-03-19 22:48:28 +08:00
algerkong
4fa5ed0ca6 feat: 更新依赖和配置,增强开发体验
- 在 electron.vite.config.ts 中启用 Vue DevTools 插件
- 更新 package.json 中多个依赖版本,确保兼容性和性能
- 调整 tsconfig.node.json 的配置,优化模块解析
- 删除不再使用的组件 PlaylistType.vue、RecommendAlbum.vue、RecommendSinger.vue 和 RecommendSonglist.vue
- 在请求处理逻辑中改进错误日志输出,使用 console.error 替代 console.log
- 在首页视图中替换推荐歌手组件为顶部横幅组件

这些更改旨在提升开发效率和用户体验,确保项目的稳定性和可维护性。
2025-03-19 21:25:32 +08:00
alger
df9a1370c3 🐞 fix: 添加文件名清理功能以处理非法字符
- 新增 sanitizeFilename 函数,清理文件名中的非法字符
- 在下载音乐功能中应用清理后的文件名,确保文件名有效性

fixed: #78
2025-03-14 21:19:23 +08:00
alger
6a8813531f 🐞 fix: 修复歌词窗口拖动变大问题和多屏幕支持,优化字体样式
fixed: #77
2025-03-11 23:28:04 +08:00
alger
e5e45148c3 feat: 优化标题栏交互和下载按钮
- 为非 Electron 环境添加下载桌面版按钮
- 调整标题栏按钮显示逻辑,支持 Web 和桌面端不同交互
- 新增打开下载页面的方法,增强用户引导体验
2025-03-09 19:34:05 +08:00
alger
4a66796747 🚀 chore: 优化 GitHub Actions Web 部署工作 2025-03-09 12:13:19 +08:00
alger
7f8ab8be7c 🔒 chore: 添加 GitHub 部署密钥到 .gitignore 2025-03-08 23:52:32 +08:00
alger
ce276df55c feat: 优化赞赏支持 2025-03-08 23:22:56 +08:00
alger
ccc59ea893 🔧 fix: 优化音频服务和EQ设置的跨平台兼容性 2025-03-08 21:27:05 +08:00
alger
0b409f38d6 🚀 release: v4.0.0 2025-03-08 20:58:53 +08:00
alger
f9878ed88a feat: 优化歌词窗口交互和同步机制
- 增强歌词窗口数据同步逻辑,支持实时更新和状态管理
- 添加歌词窗口关闭事件监听和状态处理
- 优化无歌词时的默认提示和窗口行为
- 实现歌词窗口定时同步机制,提升用户体验
- 修复歌词窗口打开和关闭时的状态控制
- 国际化支持无歌曲播放时的提示文案
2025-03-08 19:00:50 +08:00
alger
e43e85480d feat: 增强音频播放状态管理和进度恢复功能
- 实现全局进度动画管理,优化歌词进度更新机制
- 新增音频播放进度本地存储和恢复功能
- 优化音频服务初始化和播放状态控制
- 改进音频上下文和 Howler 初始化逻辑
- 增加播放状态和进度的本地持久化支持
2025-03-08 18:31:46 +08:00
Alger
b97170d1b2 Update README.md 2025-03-08 17:07:32 +08:00
Alger
b9aa1d574a Merge pull request #75 from algerkong/feat/music-eq
 feat: 添加EQ音效调节功能 实时调节以及多个预设提供
2025-03-07 22:50:07 +08:00
alger
dd7b06d7e5 feat: 添加EQ音效调节功能 实时调节以及多个预设提供 2025-03-07 01:14:35 +08:00
alger
ddafcfba10 🔧 chore: 移除网站访问统计脚本和无用的统计显示元素 2025-03-05 23:03:05 +08:00
Alger
da5b8c408a Merge pull request #72 from algerkong/fix/random-music
fix: 修复随机播放模式 手动下一首不是随机的问题
2025-03-04 19:32:29 +08:00
alger
fb35d42fc4 fix: 修复随机播放模式 手动下一首不是随机的问题 2025-03-04 19:29:46 +08:00
Alger
dfd5d4c8b7 Merge pull request #71 from algerkong/fix/music-list-play
Fix/music list play
2025-03-02 22:49:00 +08:00
alger
e5309cedee feat: 音乐列表加载优化
- 重构音乐列表加载逻辑,提升数据加载性能和用户体验
- 新增歌曲总数显示,优化滚动加载和状态管理
- 改进歌曲数据格式化和异步加载处理
2025-03-02 08:27:07 +08:00
alger
d335f57a1a feat: 优化音乐列表加载策略,提升异步加载稳定性和错误处理 2025-03-01 10:57:06 +08:00
alger
c703d9c197 feat: 优化音乐列表加载和播放逻辑,增强性能和用户体验 2025-02-28 19:52:00 +08:00
alger
87a0ceb5b0 feat: 优化WEB下载应用程序代理 2025-02-28 19:50:53 +08:00
alger
891d70f3ed feat: 优化语言设置和国际化处理 2025-02-19 01:31:19 +08:00
alger
37b5908ddc 🌈 style: v3.9.3 2025-02-19 01:02:12 +08:00
alger
ead017e4b1 feat: 国际化 (i18n) 功能实现 2025-02-19 01:01:43 +08:00
alger
da2a32e420 Merge branch 'dev_electron' into dev_i18n 2025-02-13 10:39:25 +08:00
Alger
5fc6edba20 Update README.md 2025-02-12 11:56:35 +08:00
alger
1ef47b8f1d feat: 增加动态代理节点获取和缓存机制 2025-02-12 11:44:18 +08:00
alger
cdaab19afa feat: 修改捐赠列表 API 2025-02-12 10:12:20 +08:00
alger
6a0b03cfe1 feat: 优化更新检查逻辑,增加多个代理源支持 2025-02-12 10:11:50 +08:00
alger
d449930a02 🌈 style: v3.9.2 2025-01-26 00:31:18 +08:00
Alger
820509dbea Merge pull request #50 from algerkong/feat/download
 feat: 弱化下载功能 默认隐藏下载列表按钮 在设置中配置打开
2025-01-26 00:22:58 +08:00
alger
1493ab7317 feat: 弱化下载功能 默认隐藏下载列表按钮 在设置中配置打开 2025-01-26 00:20:08 +08:00
alger
c6ca63ee11 🐞 fix: 修复一些下载和登录问题
fix: #49
2025-01-25 23:53:20 +08:00
alger
4fa1295b84 🐞 fix: 修复登录状态问题 修复播放退出登录的问题 2025-01-25 21:49:22 +08:00
alger
174428b386 feat: 国际化功能基础实现 2025-01-23 11:02:55 +08:00
alger
599b0251af 🌈 style: v3.9.0 2025-01-22 23:43:17 +08:00
alger
25c2180247 feat: 添加右键添加到歌单 可以创建歌单 可以在我的歌单中右键取消收藏 2025-01-22 23:37:50 +08:00
alger
a6ff0e7f5c feat: 歌曲右键 添加下一首播放功能 2025-01-22 22:22:32 +08:00
alger
2e06711600 feat: 添加自动播放 和自动保存正在播放列表功能 2025-01-22 22:16:52 +08:00
Alger
80770d6c75 Update README.md 2025-01-20 09:53:24 +08:00
Alger
1e068df2ad Update README.md 2025-01-20 09:46:26 +08:00
alger
4172ff9fc6 🐞 fix: 修复我的搜藏 查看更多跳转空白页的问题 2025-01-19 18:46:36 +08:00
alger
83a7df9fe8 Merge branch 'feat/new-update' into dev_electron 2025-01-19 15:06:16 +08:00
alger
ba95dc11fe feat: 优化歌词下一首的滚动 2025-01-19 13:35:10 +08:00
alger
93829acdab feat: 升级依赖包 升级 electron 版本 2025-01-19 13:34:31 +08:00
alger
1f0f35dd51 🌈 style: v3.8.0 2025-01-18 03:26:14 +08:00
alger
be94d6ff8e feat: 添加歌词界面样式配置功能 2025-01-18 03:25:21 +08:00
alger
1bdb8fcb4a feat: 添加字体配置功能 可配置歌词页面 或全局字体 2025-01-17 22:45:59 +08:00
alger
914e043502 feat: 去除歌曲缓存 优化播放下一首 2025-01-17 22:35:42 +08:00
alger
dfa175b8b2 feat: 应用单例模式 2025-01-17 22:35:33 +08:00
alger
a94e0efba5 feat: 优化播放 2025-01-17 22:34:49 +08:00
alger
fb0831f2eb feat: 应用更新在内部更新 自动打开安装包 2025-01-17 00:02:57 +08:00
alger
573023600a 🌈 style: v3.7.2 2025-01-16 23:27:51 +08:00
Alger
041aad31b4 Merge pull request #47 from algerkong/fix/player-freeze-recovery-46
 feat: 优化播放体验 优化代码 优化歌词缓存
2025-01-16 23:20:57 +08:00
alger
f652932d71 feat: 优化播放体验 优化代码 优化歌词缓存 2025-01-16 23:19:16 +08:00
alger
7efeb9492b 🐞 fix: 修复类型错误 2025-01-16 00:58:57 +08:00
alger
055536eb5c 🌈 style: v3.7.1 2025-01-16 00:46:33 +08:00
Alger
14852fc8d3 Merge pull request #44 from algerkong/fix/minimize-on-space-after-restore-42
🐞 fix: 最小化点击后恢复窗口按空格会继续最小化
2025-01-16 00:43:05 +08:00
Alger
9866e772df Merge pull request #45 from algerkong/fix/repeat-sound-on-lyric-seek-43
🐞 fix: 修复单曲循环后点击歌词快进会有重复的声音播放
2025-01-16 00:42:50 +08:00
alger
87ca0836b1 🐞 fix: 修复单曲循环后点击歌词快进会有重复的声音播放 2025-01-16 00:40:44 +08:00
alger
fa07c5a40c 🐞 fix: 最小化点击后恢复窗口按空格会继续最小化
fixed #42
2025-01-16 00:38:47 +08:00
alger
5dbfea240b 🌈 style: v3.7.0 2025-01-15 00:52:09 +08:00
alger
c1344393c3 🐞 fix: 修复清除缓存问题 2025-01-15 00:51:32 +08:00
alger
426888f77c feat: 优化设置页面样式以及布局 2025-01-15 00:31:40 +08:00
alger
45cbc15c0f feat: 添加快捷键 以及快捷键管理功能
ref #39
2025-01-15 00:30:00 +08:00
alger
072025a543 🐞 fix: 修复抽屉zindex 修复一些样式问题
closes  #37 #38
2025-01-15 00:26:42 +08:00
alger
c6427aa3e1 feat: v3.6.0 2025-01-13 23:08:47 +08:00
alger
632cdb1239 feat: 优化页面样式 2025-01-13 22:55:46 +08:00
alger
8ffe472605 feat: 添加歌手详情抽屉 2025-01-13 22:13:46 +08:00
alger
8e86d378d0 feat: 优化音乐解析,添加搜索记录 添加搜索滚动加载更多 添加关闭动画功能 2025-01-13 22:13:21 +08:00
alger
744fd53fb1 feat: 添加歌词缓存功能 2025-01-12 20:59:36 +08:00
alger
3c64473dbb feat: 优化音乐播放 控制 系统控制功能 (#36,#16)
fixed #36,#16
2025-01-12 19:14:25 +08:00
alger
e70fed37da feat: 添加下载列表显示功能 可播放已经下载的歌曲 添加清除缓存功能 修复下载文件类型问题 2025-01-12 16:04:03 +08:00
alger
b749854c5e feat: 优化留言显示 2025-01-12 12:38:51 +08:00
alger
d9210cc50a feat: 修改 捐赠支持 添加留言显示 可隐藏列表 2025-01-12 01:25:39 +08:00
alger
f186d34885 📃 docs: 更新README 2025-01-11 19:12:26 +08:00
alger
ba992b7c33 📃 docs: v3.4.0 2025-01-11 19:03:06 +08:00
alger
24d7c839c7 🌈 style: 添加 "animate.css" 2025-01-11 18:51:40 +08:00
alger
a4f3df80c9 📃 docs: v3.4.0 2025-01-11 18:45:42 +08:00
alger
866fec6ee3 feat: 优化收藏逻辑 本地和线上同步 添加批量下载 2025-01-11 18:38:34 +08:00
alger
8f7d6fbb8d feat: 设置页 添加捐赠支持列表 2025-01-11 18:22:14 +08:00
alger
62e26cae7d 🌈 style: 优化代码格式化 2025-01-10 22:49:55 +08:00
alger
ddb814da10 feat: v3.3.0 2025-01-06 22:33:13 +08:00
alger
e266ea8ef8 🐞 fix: 修复类型校验问题 2025-01-06 22:24:37 +08:00
alger
a894954641 🐞 fix: 修复类型校验问题 2025-01-06 22:15:25 +08:00
alger
f640ab9969 feat: v3.3.0 2025-01-06 22:10:20 +08:00
alger
9eb17fd978 feat: 优化登录失效 2025-01-06 22:03:50 +08:00
alger
020aca7384 feat: 添加音质选择 优化灰色歌曲解析 2025-01-06 20:54:42 +08:00
alger
fcc47dc0ff feat: 添加退出登录 2025-01-05 15:58:48 +08:00
alger
17ce268da6 feat: 修复未登录 收藏问题 2025-01-05 15:01:55 +08:00
alger
43c64b1b43 feat: 收藏功能改为接口对接 2025-01-04 16:58:08 +08:00
alger
11ced6b418 feat: 优化更新检查 下载 功能 2025-01-04 16:13:37 +08:00
alger
3d3992154a 🐞 fix: 修复歌词滚动问题 2025-01-04 00:26:30 +08:00
alger
81e7b67c7f 📃 docs: 3.2.0 2025-01-03 23:59:07 +08:00
alger
d7e94a342b feat: 添加代理功能和 realIP配置功能 2025-01-03 23:53:07 +08:00
alger
46f8067577 feat: 关闭应用的提示修改 可存储配置最小化 还是 关闭 2025-01-03 22:24:13 +08:00
alger
1dc7d0ceca 🐞 fix: 修复歌词页面与底栏冲突问题(#26) 修复搜索歌曲列表页面显示错误问题 (#33)
closed #26   #33
2025-01-03 22:03:26 +08:00
alger
ba64631a17 🐞 fix: 修复搜索类型切换 没有重新加载搜索的问题(#25)
closed #25
2025-01-03 21:28:48 +08:00
alger
cdb9524f04 feat: 解决检查更新请求失败问题 2025-01-02 00:45:01 +08:00
alger
5213aa13c5 🌈 style: 修复格式问题 2025-01-02 00:27:31 +08:00
alger
d870d0198f 🌈 style: 修复格式问题 2025-01-02 00:25:54 +08:00
alger
976a9afd2f 📃 docs: v3.1.0 2025-01-02 00:18:41 +08:00
alger
018218a5bf feat: 优化主入口代码 添加歌曲下载功能 2025-01-02 00:14:05 +08:00
alger
38a9d6ed31 feat: 完善网页版 安装应用功能 2025-01-01 22:42:25 +08:00
309 changed files with 47967 additions and 7828 deletions

View File

@@ -1,12 +1,4 @@
# 你的接口地址 (必填)
VITE_API_LOCAL = ***
# 音乐破解接口地址
VITE_API_MUSIC = ***
# 代理地址
VITE_API_PROXY = ***
# 本地运行代理地址
VITE_API_PROXY = /api
VITE_API_MUSIC_PROXY = /music
VITE_API_PROXY_MUSIC = /music_proxy
VITE_API = http://127.0.0.1:30488
# 音乐破解接口地址 web端
VITE_API_MUSIC = ***

View File

@@ -1,6 +1,6 @@
name: 反馈 Bug
description: 通过 github 模板进行 Bug 反馈。
title: "描述问题的标题"
title: '描述问题的标题'
body:
- type: markdown
attributes:

View File

@@ -1,5 +1,5 @@
blank_issues_enabled: true
contact_links:
- name:
url:
about:
- name:
url:
about:

View File

@@ -1,6 +1,6 @@
name: 反馈新功能
description: 通过 github 模板进行新功能反馈。
title: "描述问题的标题"
title: '描述问题的标题'
body:
- type: markdown
attributes:

View File

@@ -1,4 +1,5 @@
## IssueShoot
- 预估时长: {{ .duration }}
- 期望完成时间: {{ .deadline }}
- 开发难度: {{ .level }}

View File

@@ -8,11 +8,11 @@ on:
jobs:
release:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [macos-latest, windows-latest, ubuntu-latest]
steps:
- name: Check out Git repository
uses: actions/checkout@v4
@@ -77,6 +77,7 @@ jobs:
dist/*.dmg
dist/*.exe
dist/*.deb
dist/*.rpm
dist/*.AppImage
dist/latest*.yml
dist/*.blockmap
@@ -84,4 +85,4 @@ jobs:
draft: false
prerelease: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

51
.github/workflows/deploy.yml vendored Normal file
View File

@@ -0,0 +1,51 @@
name: Deploy Web
on:
push:
branches:
- main # 或者您的主分支名称
workflow_dispatch: # 允许手动触发
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: 创建环境变量文件
run: |
echo "VITE_API=${{ secrets.VITE_API }}" > .env.production.local
echo "VITE_API_MUSIC=${{ secrets.VITE_API_MUSIC }}" >> .env.production.local
# 添加其他需要的环境变量
cat .env.production.local # 查看创建的文件内容,调试用
- name: Install Dependencies
run: npm install
- name: Build
run: npm run build
- name: Deploy to Server
uses: appleboy/scp-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USERNAME }}
key: ${{ secrets.DEPLOY_KEY }}
source: 'out/renderer/*'
target: ${{ secrets.DEPLOY_PATH }}
strip_components: 2
- name: Execute Remote Commands
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USERNAME }}
key: ${{ secrets.DEPLOY_KEY }}
script: |
cd ${{ secrets.DEPLOY_PATH }}
echo "部署完成于 $(date)"

20
.gitignore vendored
View File

@@ -16,7 +16,25 @@ dist.zip
.vscode
bun.lockb
bun.lock
.env.*.local
out
out
.cursorrules
.github/deploy_keys
resources/android/**/*
android/app/release
.cursor
.windsurf
.auto-imports.d.ts
.components.d.ts
src/renderer/auto-imports.d.ts
src/renderer/components.d.ts

7
.husky/pre-commit Normal file
View File

@@ -0,0 +1,7 @@
echo "对已暂存文件运行 lint-staged..."
npx lint-staged
echo "运行类型检查..."
npm run typecheck
echo "所有检查通过,准备提交..."

7
.husky/pre-push Executable file
View File

@@ -0,0 +1,7 @@
echo "对已暂存文件运行 lint-staged..."
npx lint-staged
echo "运行类型检查..."
npm run typecheck
echo "所有检查通过,准备提交..."

6
.prettierignore Normal file
View File

@@ -0,0 +1,6 @@
out
dist
pnpm-lock.yaml
LICENSE.md
tsconfig.json
tsconfig.*.json

View File

@@ -1,21 +1,54 @@
# 更新日志
## [v3.0.0] - 2024-03-21
## v4.9.0
### ✨ 新功能
- 新增自动更新检测功能
- 新增 GitHub Actions 自动构建和发布
- 新增主题色切换功能,支持日间/夜间模式 (#19, #21)
- 新增随机播放功能 (#20)
- 优化主题效果和图片清晰度
### 🏗️ 架构重构
- 重构整个项目架构
- 优化打包配置
- 修改后台服务为本地运行
- 优化项目结构
- 重新设计pc端歌词页面Mini播放栏
- 添加清除歌曲自定义解析功能
- 添加Cookie登录功能及自动获取等相关管理设置 ([16aeaf2](https://github.com/algerkong/AlgerMusicPlayer/commit/16aeaf2)) - 支持通过Cookie方式登录提供更便捷的登录体验
- 添加UID登录功能优化登录流程 ([daa8e75](https://github.com/algerkong/AlgerMusicPlayer/commit/daa8e75)) - 新增用户ID直接登录方式
- 添加主题根据系统切换功能 ([d5ba218](https://github.com/algerkong/AlgerMusicPlayer/commit/d5ba218)) - 支持跟随系统主题自动切换明暗模式
- 桌面歌词添加主题颜色面板组件 ([d1f5c8a](https://github.com/algerkong/AlgerMusicPlayer/commit/d1f5c8a)) - 为桌面歌词提供丰富的主题颜色自定义选项
- 增强播放速度控制,添加滑块控制并改善播放安全性 ([8fb382e](https://github.com/algerkong/AlgerMusicPlayer/commit/8fb382e)) 感谢[Qumo](https://github.com/Hellodwadawd12312312)的pr
- 添加日语和韩语国际化支持,并优化语言相关代码 ([3062156](https://github.com/algerkong/AlgerMusicPlayer/commit/3062156))
- 添加繁体中文本地化支持 ([2cc03cb](https://github.com/algerkong/AlgerMusicPlayer/commit/2cc03cb)) 感谢[dongguacute](https://github.com/dongguacute)的pr
- 播放速度设置弹窗标题添加速度显示 ([aeb7f03](https://github.com/algerkong/AlgerMusicPlayer/commit/aeb7f03))
### 🐞 问题修复
- 修复 web 移动端页面空白问题 (#24)
- 修复无用导入问题
- 优化错误处理
### 🐛 Bug 修复
- 修复mac快捷键关闭窗口报错的问题 ([67ef4d7](https://github.com/algerkong/AlgerMusicPlayer/commit/67ef4d7))
- 修复mini窗口恢复时导致的应用窗口变小问题 ([9b3019d](https://github.com/algerkong/AlgerMusicPlayer/commit/9b3019d))
- 修复歌单列表页面翻页类型问题 ([e489ab4](https://github.com/algerkong/AlgerMusicPlayer/commit/e489ab4))
- 修复歌曲初始化问题 ([b7a58a0](https://github.com/algerkong/AlgerMusicPlayer/commit/b7a58a0))
- 修复音量调整不同步的问题 ([679089e](https://github.com/algerkong/AlgerMusicPlayer/commit/679089e))
- 修复菜单显示不全的问题,添加滚动条 ([09ccd9f](https://github.com/algerkong/AlgerMusicPlayer/commit/09ccd9f))
### 🎨 优化
- 更新 eslint 和 prettier 配置,格式化代码 ([c08c2cb](https://github.com/algerkong/AlgerMusicPlayer/commit/c08c2cb))
- 优化类型处理和登录功能 ([3ba85f3](https://github.com/algerkong/AlgerMusicPlayer/commit/3ba85f3))
- 优化Cookie相关文字描述 ([1597fbf](https://github.com/algerkong/AlgerMusicPlayer/commit/1597fbf))
## 赞赏支持☕️
[赞赏列表](http://donate.alger.fun/)
<table>
<tr>
<th style="text-align:center">微信赞赏</th>
<th style="width:100px"></th>
<th style="text-align:center">支付宝赞赏</th>
</tr>
<tr>
<td align="center">
<img src="https://github.com/algerkong/algerkong/blob/main/wechat.jpg?raw=true" alt="WeChat QRcode" width="200"><br>
<h6>☕️喝点咖啡继续干</h6>
</td>
<td></td>
<td align="center">
<img src="https://github.com/algerkong/algerkong/blob/main/alipay.jpg?raw=true" alt="Alipay QRcode" width="200"><br>
<h6>🍔来个汉堡</h6>
</td>
</tr>
</table>

198
DEV.md Normal file
View File

@@ -0,0 +1,198 @@
# Alger Music Player 开发文档
## 项目结构
### 技术栈
- **前端框架**Vue 3 + TypeScript
- **UI 组件库**naive-ui
- **样式框架**Tailwind CSS
- **图标库**remixicon
- **状态管理**Pinia
- **工具库**VueUse
- **构建工具**Vite, electron-vite
- **打包工具**electron-builder
- **国际化**vue-i18n
- **HTTP 客户端**axios
- **本地存储**electron-store localstorage
- **网易云音乐 API**netease-cloud-music-api
- **音乐解锁**@unblockneteasemusic/server
### 项目结构
```
AlgerMusicPlayer/
├── build/                  # 构建相关文件
├── docs/                   # 项目文档
├── node_modules/           # 依赖包
├── out/                    # 构建输出目录
├── resources/              # 资源文件
├── src/                    # 源代码
  ├── i18n/               # 国际化配置
   ├── lang/           # 语言包
   ├── main.ts         # 主进程国际化入口
   └── renderer.ts     # 渲染进程国际化入口
  ├── main/               # Electron 主进程
   ├── modules/        # 主进程模块
   ├── index.ts        # 主进程入口
   ├── lyric.ts        # 歌词处理
   ├── server.ts       # 服务器
   ├── set.json        # 设置
   └── unblockMusic.ts # 音乐解锁
  ├── preload/            # 预加载脚本
   ├── index.ts        # 预加载脚本入口
   └── index.d.ts      # 预加载脚本类型声明
  └── renderer/           # Vue 渲染进程
      ├── api/            # API 请求
      ├── assets/         # 静态资源
      ├── components/     # 组件
       ├── common/     # 通用组件
       ├── home/       # 首页组件
       ├── lyric/      # 歌词组件
       ├── settings/   # 设置组件
       └── ...         # 其他组件
      ├── const/          # 常量定义
      ├── directive/      # 自定义指令
      ├── hooks/          # 自定义 Hooks
      ├── layout/         # 布局组件
      ├── router/         # 路由配置
      ├── services/       # 服务
      ├── store/          # Pinia 状态管理
       ├── modules/    # Pinia 模块
       └── index.ts    # Pinia 入口
      ├── type/           # 类型定义
      ├── types/          # 更多类型定义
      ├── utils/          # 工具函数
      ├── views/          # 页面视图
      ├── App.vue         # 根组件
      ├── index.css       # 全局样式
      ├── index.html      # HTML 模板
      ├── main.ts         # 渲染进程入口
      └── ...             # 其他文件
├── .env.development        # 开发环境变量
├── .env.development.local  # 本地开发环境变量
├── .env.production.local   # 本地生产环境变量
├── .eslintrc.cjs           # ESLint 配置
├── .gitignore              # Git 忽略文件
├── .prettierrc.yaml        # Prettier 配置
├── electron-builder.yml    # electron-builder 配置
├── electron.vite.config.ts # electron-vite 配置
├── package.json            # 项目配置
├── postcss.config.js       # PostCSS 配置
├── tailwind.config.js      # Tailwind 配置
├── tsconfig.json           # TypeScript 配置
├── tsconfig.node.json      # 节点 TypeScript 配置
└── tsconfig.web.json       # Web TypeScript 配置
```
### 主要组件说明
#### 主进程 (src/main)
主进程负责创建窗口、处理系统层面的交互以及与渲染进程的通信。
- **index.ts**: 应用主入口,负责创建窗口和应用生命周期管理
- **lyric.ts**: 歌词解析和处理
- **unblockMusic.ts**: 网易云音乐解锁功能
- **server.ts**: 本地服务器
#### 预加载脚本 (src/preload)
预加载脚本在渲染进程加载前执行,提供了渲染进程和主进程之间的桥接功能。
#### 渲染进程 (src/renderer)
渲染进程是基于 Vue 3 的前端应用,负责 UI 渲染和用户交互。
- **components/**: 包含各种 UI 组件
  - **common/**: 通用组件
  - **home/**: 首页相关组件
  - **lyric/**: 歌词显示组件
  - **settings/**: 设置界面组件
  - **MusicList.vue**: 音乐列表组件
  - **MvPlayer.vue**: MV 播放器
  - **EQControl.vue**: 均衡器控制
  - **...**: 其他组件
- **store/**: Pinia 状态管理
  - **modules/**: 各功能模块的状态管理
  - **index.ts**: 状态管理入口
- **views/**: 页面视图组件
- **router/**: 路由配置
- **api/**: API 请求封装
- **utils/**: 工具函数
### 开发指南
#### 命名约定
- 目录使用 kebab-case (如: components/auth-wizard)
- 组件文件名使用 PascalCase (如: AuthWizard.vue)
- 可组合式函数使用 camelCase (如: useAuthState.ts)
#### 代码风格
- 使用 Composition API 和 `<script setup>` 语法
- 使用 TypeScript 类型系统
- 优先使用类型而非接口
- 避免使用枚举,使用 const 对象代替
- 使用 tailwind 实现响应式设计
### 如何启动?
安装依赖最好使用node18+
```
npm install
```
#### 桌面端开发
启动桌面端开发:
```
npm run dev
```
#### 网页端开发
如果只启动网页端开发,需要自己部署服务 netease-cloud-music-api
需要复制一份 `.env.development.local``src/renderer`
```
# .env.development.local
# 你的接口地址 (必填)
VITE_API = ***
# 音乐破解接口地址
VITE_API_MUSIC = ***
```
启动web端开发
```
npm run dev:web
```
### 打包
打包桌面端:
```
npm run build:win
```
打包后的文件在 /dist 下
打包网页端:
```
npm run build
```
打包后的文件在 /out/renderer 下

149
README.md
View File

@@ -1,96 +1,101 @@
# Alger Music Player
<h2 align="center">🎵 Alger Music Player</h2>
<div align="center">
<div align="center">
<a href="https://github.com/algerkong/AlgerMusicPlayer/stargazers">
<img src="https://img.shields.io/github/stars/algerkong/AlgerMusicPlayer?style=for-the-badge&logo=github&label=Stars&logoColor=white&color=22c55e" alt="GitHub stars">
</a>
<a href="https://github.com/algerkong/AlgerMusicPlayer/releases">
<img src="https://img.shields.io/github/v/release/algerkong/AlgerMusicPlayer?style=for-the-badge&logo=github&label=Release&logoColor=white&color=1a67af" alt="GitHub release">
</a>
<a href="https://pd.qq.com/s/cs056n33q?b=5">
<img src="https://img.shields.io/badge/QQ频道-algermusic-blue?style=for-the-badge&color=yellow" alt="加入频道">
</a>
<a href="https://t.me/+9efsKRuvKBk2NWVl">
<img src="https://img.shields.io/badge/AlgerMusic-blue?style=for-the-badge&logo=telegram&logoColor=white&label=Telegram" alt="Telegram">
</a>
<a href="https://donate.alger.fun/">
<img src="https://img.shields.io/badge/%E9%A1%B9%E7%9B%AE%E6%8D%90%E8%B5%A0-blue?style=for-the-badge&logo=telegram&logoColor=pink&color=pink&label=%E8%B5%9E%E5%8A%A9" alt="赞助">
</a>
</div>
</div>
<div align="center">
<a href="https://hellogithub.com/repository/607b849c598d48e08fe38789d156ebdc" target="_blank"><img src="https://api.hellogithub.com/v1/widgets/recommend.svg?rid=607b849c598d48e08fe38789d156ebdc&claim_uid=ObuMXUfeHBmk9TI&theme=neutral" alt="FeaturedHelloGitHub" width="160" height="32" /></a>
</div>
[项目下安装以及常用问题文档](https://www.yuque.com/alger-pfg5q/ip4f1a/bmgmfmghnhgwghkm?singleDoc#)
主要功能如下
- 音乐推荐
- 网易云登录
- 播放历史
- 桌面歌词
-单 mv 搜索 专辑等功能
- 识别无法播放歌曲 并解析播放
- 主题切换 更新检测
- 本地服务 不依赖线上服务
- 可听周杰伦(搜索专辑
- 🎵 音乐推荐
- 🔐 网易云账号登录与同步
- 📝 功能
- 播放历史记录
-曲收藏管理
- 歌单 MV 排行榜 每日推荐
- 自定义快捷键配置(全局或应用内)
- 🎨 界面与交互
- 沉浸式歌词显示(点击左下角封面进入
- 独立桌面歌词窗口
- 明暗主题切换
- 迷你模式
- 状态栏控制
- 多语言支持
- 🎼 音乐功能
- 支持歌单、MV、专辑等完整音乐服务
- 音乐资源解析(基于 @unblockneteasemusic/server
- EQ均衡器
- 定时播放 远程控制播放 倍速播放
- 高品质音乐
- 音乐文件下载
- 搜索 MV 音乐 专辑 歌单 bilibili
- 音乐单独选择音源解析
- 🚀 技术特性
- 本地化服务无需依赖在线API (基于 netease-cloud-music-api)
- 全平台适配Desktop & Web & Mobile Web & Android<测试> & ios<后续>
## 项目简介
一个基于 electron typescript vue3 的桌面音乐播放器 适配 web端 桌面端 web移动端
一个第三方音乐播放器、本地服务、桌面歌词、音乐下载、最高音质
## 预览地址
[http://mc.alger.fun/](http://mc.alger.fun/)
QQ群:789288579
[http://music.alger.fun/](http://music.alger.fun/)
## 软件截图
![首页白](./docs/image.png)
![首页黑](./docs/image3.png)
![歌词](./docs/image1.png)
![歌词](./docs/image6.png)
![桌面歌词](./docs/image2.png)
![设置页面](./docs/image4.png)
![音乐远程控制](./docs/image5.png)
## 技术栈
## 项目启动
### 主要框架
- Vue 3 - 渐进式 JavaScript 框架
- TypeScript - JavaScript 的超集,添加了类型系统
- Electron - 跨平台桌面应用开发框架
- Vite - 下一代前端构建工具
- Naive UI - 基于 Vue 3 的组件库
```bash
npm install
npm run dev
```
## 开发文档
## 咖啡☕️
| 微信 | 支付宝 |
点击这里[开发文档](./DEV.md)
## 赞赏☕️
[赞赏列表](http://donate.alger.fun/)
| 微信赞赏 | 支付宝赞赏 |
| :--------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------: |
| <img src="https://github.com/algerkong/algerkong/blob/main/wechat.jpg?raw=true" alt="WeChat QRcode" width=200> | <img src="https://github.com/algerkong/algerkong/blob/main/alipay.jpg?raw=true" alt="Wechat QRcode" width=200> |
| <img src="https://github.com/algerkong/algerkong/blob/main/wechat.jpg?raw=true" alt="WeChat QRcode" width=200> <br><small>喝点咖啡继续干</small> | <img src="https://github.com/algerkong/algerkong/blob/main/alipay.jpg?raw=true" alt="Wechat QRcode" width=200> <br><small>来包辣条吧~</small> |
## 项目运行
```bash
# 安装依赖
npm install
## 项目统计
# 运行项目 web
npm run dev
# 运行项目 electron
npm run start
# 打包项目 web
npm run build
# 打包项目 electron
npm run win ...
# 具体看 package.json
```
#### 注意
- 本地运行需要配置 .env.development 文件
- 打包需要配置 .env.production 文件
```bash
# .env.development
VITE_API_LOCAL = /api
VITE_API_MUSIC_PROXY = /music
VITE_API_PROXY_MUSIC = /music_proxy
# 你的接口地址 (必填)
VITE_API = ***
# 音乐po接口地址
VITE_API_MUSIC = ***
VITE_API_PROXY = ***
# .env.production
# 你的接口地址 (必填)
VITE_API = ***
# 音乐po接口地址
VITE_API_MUSIC = ***
# 代理地址
VITE_API_PROXY = ***
```
## Stargazers over time
[![Stargazers over time](https://starchart.cc/algerkong/AlgerMusicPlayer.svg?variant=adaptive)](https://starchart.cc/algerkong/AlgerMusicPlayer)
![Alt](https://repobeats.axiom.co/api/embed/c4d01b3632e241c90cdec9508dfde86a7f54c9f5.svg 'Repobeats analytics image')
## 欢迎提Issues
## 免责声明
## 声明
本软件仅用于学习交流,禁止用于商业用途,否则后果自负。
希望大家还是要多多支持官方正版,此软件仅用作开发教学。

101
android/.gitignore vendored Normal file
View File

@@ -0,0 +1,101 @@
# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore
# Built application files
*.apk
*.aar
*.ap_
*.aab
# Files for the ART/Dalvik VM
*.dex
# Java class files
*.class
# Generated files
bin/
gen/
out/
# Uncomment the following line in case you need and you don't have the release build type files in your app
# release/
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Android Studio Navigation editor temp files
.navigation/
# Android Studio captures folder
captures/
# IntelliJ
*.iml
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries
# Android Studio 3 in .gitignore file.
.idea/caches
.idea/modules.xml
# Comment next line if keeping position of elements in Navigation Editor is relevant for you
.idea/navEditor.xml
# Keystore files
# Uncomment the following lines if you do not want to check your keystore files in.
#*.jks
#*.keystore
# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
.cxx/
# Google Services (e.g. APIs or Firebase)
# google-services.json
# Freeline
freeline.py
freeline/
freeline_project_description.json
# fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md
# Version control
vcs.xml
# lint
lint/intermediates/
lint/generated/
lint/outputs/
lint/tmp/
# lint/reports/
# Android Profiling
*.hprof
# Cordova plugins for Capacitor
capacitor-cordova-android-plugins
# Copied web assets
app/src/main/assets/public
# Generated Config files
app/src/main/assets/capacitor.config.json
app/src/main/assets/capacitor.plugins.json
app/src/main/res/xml/config.xml

90
auto-imports.d.ts vendored
View File

@@ -1,90 +0,0 @@
/* eslint-disable */
/* prettier-ignore */
// @ts-nocheck
// noinspection JSUnusedGlobalSymbols
// Generated by unplugin-auto-import
// biome-ignore lint: disable
export {}
declare global {
const EffectScope: (typeof import('vue'))['EffectScope'];
const computed: (typeof import('vue'))['computed'];
const createApp: (typeof import('vue'))['createApp'];
const customRef: (typeof import('vue'))['customRef'];
const defineAsyncComponent: (typeof import('vue'))['defineAsyncComponent'];
const defineComponent: (typeof import('vue'))['defineComponent'];
const effectScope: (typeof import('vue'))['effectScope'];
const getCurrentInstance: (typeof import('vue'))['getCurrentInstance'];
const getCurrentScope: (typeof import('vue'))['getCurrentScope'];
const h: (typeof import('vue'))['h'];
const inject: (typeof import('vue'))['inject'];
const isProxy: (typeof import('vue'))['isProxy'];
const isReactive: (typeof import('vue'))['isReactive'];
const isReadonly: (typeof import('vue'))['isReadonly'];
const isRef: (typeof import('vue'))['isRef'];
const markRaw: (typeof import('vue'))['markRaw'];
const nextTick: (typeof import('vue'))['nextTick'];
const onActivated: (typeof import('vue'))['onActivated'];
const onBeforeMount: (typeof import('vue'))['onBeforeMount'];
const onBeforeUnmount: (typeof import('vue'))['onBeforeUnmount'];
const onBeforeUpdate: (typeof import('vue'))['onBeforeUpdate'];
const onDeactivated: (typeof import('vue'))['onDeactivated'];
const onErrorCaptured: (typeof import('vue'))['onErrorCaptured'];
const onMounted: (typeof import('vue'))['onMounted'];
const onRenderTracked: (typeof import('vue'))['onRenderTracked'];
const onRenderTriggered: (typeof import('vue'))['onRenderTriggered'];
const onScopeDispose: (typeof import('vue'))['onScopeDispose'];
const onServerPrefetch: (typeof import('vue'))['onServerPrefetch'];
const onUnmounted: (typeof import('vue'))['onUnmounted'];
const onUpdated: (typeof import('vue'))['onUpdated'];
const onWatcherCleanup: (typeof import('vue'))['onWatcherCleanup'];
const provide: (typeof import('vue'))['provide'];
const reactive: (typeof import('vue'))['reactive'];
const readonly: (typeof import('vue'))['readonly'];
const ref: (typeof import('vue'))['ref'];
const resolveComponent: (typeof import('vue'))['resolveComponent'];
const shallowReactive: (typeof import('vue'))['shallowReactive'];
const shallowReadonly: (typeof import('vue'))['shallowReadonly'];
const shallowRef: (typeof import('vue'))['shallowRef'];
const toRaw: (typeof import('vue'))['toRaw'];
const toRef: (typeof import('vue'))['toRef'];
const toRefs: (typeof import('vue'))['toRefs'];
const toValue: (typeof import('vue'))['toValue'];
const triggerRef: (typeof import('vue'))['triggerRef'];
const unref: (typeof import('vue'))['unref'];
const useAttrs: (typeof import('vue'))['useAttrs'];
const useCssModule: (typeof import('vue'))['useCssModule'];
const useCssVars: (typeof import('vue'))['useCssVars'];
const useDialog: (typeof import('naive-ui'))['useDialog'];
const useId: (typeof import('vue'))['useId'];
const useLoadingBar: (typeof import('naive-ui'))['useLoadingBar'];
const useMessage: (typeof import('naive-ui'))['useMessage'];
const useModel: (typeof import('vue'))['useModel'];
const useNotification: (typeof import('naive-ui'))['useNotification'];
const useSlots: (typeof import('vue'))['useSlots'];
const useTemplateRef: (typeof import('vue'))['useTemplateRef'];
const watch: (typeof import('vue'))['watch'];
const watchEffect: (typeof import('vue'))['watchEffect'];
const watchPostEffect: (typeof import('vue'))['watchPostEffect'];
const watchSyncEffect: (typeof import('vue'))['watchSyncEffect'];
}
// for type re-export
declare global {
// @ts-ignore
export type {
Component,
ComponentPublicInstance,
ComputedRef,
DirectiveBinding,
ExtractDefaultPropTypes,
ExtractPropTypes,
ExtractPublicPropTypes,
InjectionKey,
PropType,
Ref,
MaybeRef,
MaybeRefOrGetter,
VNode,
WritableComputedRef
} from 'vue';
import('vue');
}

33
components.d.ts vendored
View File

@@ -1,33 +0,0 @@
/* eslint-disable */
// @ts-nocheck
// Generated by unplugin-vue-components
// Read more: https://github.com/vuejs/core/pull/3399
export {};
/* prettier-ignore */
declare module 'vue' {
export interface GlobalComponents {
NAvatar: typeof import('naive-ui')['NAvatar']
NButton: typeof import('naive-ui')['NButton']
NCheckbox: typeof import('naive-ui')['NCheckbox']
NConfigProvider: typeof import('naive-ui')['NConfigProvider']
NDialogProvider: typeof import('naive-ui')['NDialogProvider']
NDrawer: typeof import('naive-ui')['NDrawer']
NDropdown: typeof import('naive-ui')['NDropdown']
NEllipsis: typeof import('naive-ui')['NEllipsis']
NEmpty: typeof import('naive-ui')['NEmpty']
NImage: typeof import('naive-ui')['NImage']
NInput: typeof import('naive-ui')['NInput']
NInputNumber: typeof import('naive-ui')['NInputNumber']
NLayout: typeof import('naive-ui')['NLayout']
NMessageProvider: typeof import('naive-ui')['NMessageProvider']
NModal: typeof import('naive-ui')['NModal']
NPopover: typeof import('naive-ui')['NPopover']
NScrollbar: typeof import('naive-ui')['NScrollbar']
NSlider: typeof import('naive-ui')['NSlider']
NSpin: typeof import('naive-ui')['NSpin']
NSwitch: typeof import('naive-ui')['NSwitch']
RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView']
}
}

62
custom-api-readme.md Normal file
View File

@@ -0,0 +1,62 @@
## 🎵 自定义音源API配置
现在支持通过导入一个简单的 JSON 配置文件来对接第三方的音乐解析 API。这将提供极大的灵活性可以接入任意第三方音源。
### 如何使用
1. 前往 **设置 -> 播放设置 -> 音源设置**
2.**自定义 API 设置** 区域,点击 **“导入 JSON 配置”** 按钮。
3. 选择你已经编写好的 `xxx.json` 配置文件。
4. 导入成功后,程序将优先使用你的自定义 API 进行解析。
### JSON 配置文件格式说明
导入的配置文件必须是一个合法的 JSON 文件,并包含以下字段:
| 字段名 | 类型 | 是否必须 | 描述 |
| ---------------- | --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `name` | `string` | 是 | API 名称,将显示在应用的 UI 界面上。 |
| `apiUrl` | `string` | 是 | API 的基础请求地址。 |
| `method` | `string` | 否 | HTTP 请求方法。可以是 `"GET"``"POST"`。**如果省略,默认为 "GET"**。 |
| `params` | `object` | 是 | 请求时需要发送的参数。对于 `GET` 请求,它们会作为查询字符串;对于 `POST` 请求,它们会作为请求体。 |
| `qualityMapping` | `object` | 否 | **音质映射表**。用于将应用内部的音质值(如 `"lossless"`)翻译成你的 API 需要的特定值。如果省略,则直接使用应用内部值。 |
| `responseUrlPath`| `string` | 是 | **URL提取路径**。用于从 API 返回的 JSON 响应中找到最终可播放的音乐链接。支持点 `.` 和方括号 `[]` 语法来访问嵌套对象和数组。 |
#### 占位符
`params` 对象的值中,你可以使用以下占位符,程序在请求时会自动替换它们:
* `{songId}`: 将被替换为当前歌曲的 ID。
* `{quality}`: 将被替换为当前用户设置的音质字符串 (例如, `"higher"`, `"lossless"`)。
#### 音质值列表
应用内部使用的音质值如下,你可以在 `qualityMapping` 中使用它们作为**键**
`standard`, `higher`, `exhigh`, `lossless`, `hires`, `jyeffect`, `sky`, `dolby`, `jymaster`
### 示例
假设有一个 API 如下:
`https://api.example.com/music?song_id=12345&bitrate=320000`
它返回的 JSON 是:
`{ "code": 200, "data": { "play_url": "http://..." } }`
那么对应的 JSON 配置文件应该是:
```json
{
"name": "Example API",
"apiUrl": "https://api.example.com/music",
"method": "GET",
"params": {
"song_id": "{songId}",
"bitrate": "{quality}"
},
"qualityMapping": {
"higher": "128000",
"exhigh": "320000",
"lossless": "999000"
},
"responseUrlPath": "data.play_url"
}
```

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 MiB

After

Width:  |  Height:  |  Size: 897 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 MiB

After

Width:  |  Height:  |  Size: 900 KiB

BIN
docs/image4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 406 KiB

BIN
docs/image5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
docs/image6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

View File

@@ -22,7 +22,6 @@ mac:
entitlementsInherit: build/entitlements.mac.plist
extendInfo:
- NSCameraUsageDescription: Application requests access to the device's camera.
- NSMicrophoneUsageDescription: Application requests access to the device's microphone.
- NSDocumentsFolderUsageDescription: Application requests access to the user's Documents folder.
- NSDownloadsFolderUsageDescription: Application requests access to the user's Downloads folder.
notarize: false

View File

@@ -5,6 +5,7 @@ import AutoImport from 'unplugin-auto-import/vite';
import { NaiveUiResolver } from 'unplugin-vue-components/resolvers';
import Components from 'unplugin-vue-components/vite';
import viteCompression from 'vite-plugin-compression';
import VueDevTools from 'vite-plugin-vue-devtools';
export default defineConfig({
main: {
@@ -17,13 +18,14 @@ export default defineConfig({
resolve: {
alias: {
'@': resolve('src/renderer'),
'@renderer': resolve('src/renderer')
'@renderer': resolve('src/renderer'),
'@i18n': resolve('src/i18n')
}
},
plugins: [
vue(),
viteCompression(),
// VueDevTools(),
VueDevTools(),
AutoImport({
imports: [
'vue',
@@ -36,25 +38,10 @@ export default defineConfig({
resolvers: [NaiveUiResolver()]
})
],
publicDir: resolve('resources'),
server: {
proxy: {
// with options
[process.env.VITE_API_LOCAL as string]: {
target: process.env.VITE_API,
changeOrigin: true,
rewrite: (path) => path.replace(new RegExp(`^${process.env.VITE_API_LOCAL}`), '')
},
[process.env.VITE_API_MUSIC_PROXY as string]: {
target: process.env.VITE_API_MUSIC,
changeOrigin: true,
rewrite: (path) => path.replace(new RegExp(`^${process.env.VITE_API_MUSIC_PROXY}`), '')
},
[process.env.VITE_API_PROXY_MUSIC as string]: {
target: process.env.VITE_API_PROXY,
changeOrigin: true,
rewrite: (path) => path.replace(new RegExp(`^${process.env.VITE_API_PROXY_MUSIC}`), '')
}
}
host: '0.0.0.0',
port: 2389
}
}
});

237
eslint.config.mjs Normal file
View File

@@ -0,0 +1,237 @@
import js from '@eslint/js';
import typescript from '@typescript-eslint/eslint-plugin';
import typescriptParser from '@typescript-eslint/parser';
import vue from 'eslint-plugin-vue';
import vueParser from 'vue-eslint-parser';
import prettier from 'eslint-plugin-prettier';
import simpleImportSort from 'eslint-plugin-simple-import-sort';
import vueScopedCss from 'eslint-plugin-vue-scoped-css';
import globals from 'globals';
export default [
// 忽略文件配置
{
ignores: ['node_modules/**', 'dist/**', 'out/**', '.gitignore']
},
// 基础 JavaScript 配置
js.configs.recommended,
// JavaScript 文件配置
{
files: ['**/*.js', '**/*.cjs', '**/*.mjs'],
languageOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
globals: {
...globals.node,
...globals.browser
}
},
rules: {
'no-console': 'off',
'no-undef': 'error'
}
},
// TypeScript 文件配置
{
files: ['**/*.ts', '**/*.tsx'],
languageOptions: {
parser: typescriptParser,
parserOptions: {
ecmaVersion: 'latest',
sourceType: 'module',
allowImportExportEverywhere: true,
ecmaFeatures: {
jsx: true
}
},
globals: {
...globals.node,
...globals.browser,
// Vue 3 特定全局变量
defineProps: 'readonly',
defineEmits: 'readonly',
// TypeScript 全局类型
NodeJS: 'readonly',
ScrollBehavior: 'readonly'
}
},
plugins: {
'@typescript-eslint': typescript,
'simple-import-sort': simpleImportSort
},
rules: {
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-unused-vars': [
'error',
// we are only using this rule to check for unused arguments since TS
// catches unused variables but not args.
{ varsIgnorePattern: '.*', args: 'none' }
],
'@typescript-eslint/no-use-before-define': 'off',
'@typescript-eslint/ban-ts-comment': 'off',
'@typescript-eslint/ban-types': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
'simple-import-sort/imports': 'error',
'simple-import-sort/exports': 'error',
'no-console': 'off',
'no-unused-vars': [
'error',
// we are only using this rule to check for unused arguments since TS
// catches unused variables but not args.
{ varsIgnorePattern: '.*', args: 'none' }
],
'no-use-before-define': 'off',
'max-classes-per-file': 'off',
'no-await-in-loop': 'off',
'dot-notation': 'off',
'constructor-super': 'off',
'getter-return': 'off',
'no-const-assign': 'off',
'no-dupe-args': 'off',
'no-dupe-class-members': 'off',
'no-dupe-keys': 'off',
'no-func-assign': 'off',
'no-import-assign': 'off',
'no-new-symbol': 'off',
'no-obj-calls': 'off',
'no-redeclare': 'off',
'no-setter-return': 'off',
'no-this-before-super': 'off',
'no-undef': 'off',
'no-unreachable': 'off',
'no-unsafe-negation': 'off',
'no-var': 'error',
'prefer-const': 'error',
'prefer-rest-params': 'error',
'prefer-spread': 'error',
'valid-typeof': 'off',
'consistent-return': 'off',
'no-promise-executor-return': 'off',
'prefer-promise-reject-errors': 'off'
}
},
// Vue 文件配置
{
files: ['**/*.vue'],
languageOptions: {
parser: vueParser,
parserOptions: {
parser: typescriptParser,
ecmaVersion: 'latest',
sourceType: 'module',
allowImportExportEverywhere: true
},
globals: {
...globals.browser,
// Vue 3 特定全局变量
defineProps: 'readonly',
defineEmits: 'readonly',
// Vue 3 Composition API (如果使用了 unplugin-auto-import)
ref: 'readonly',
reactive: 'readonly',
computed: 'readonly',
watch: 'readonly',
watchEffect: 'readonly',
onMounted: 'readonly',
onUnmounted: 'readonly',
onBeforeUnmount: 'readonly',
nextTick: 'readonly',
inject: 'readonly',
provide: 'readonly',
// Naive UI (如果使用了 unplugin-auto-import)
useDialog: 'readonly',
useMessage: 'readonly',
// TypeScript 全局类型
NodeJS: 'readonly',
ScrollBehavior: 'readonly'
}
},
plugins: {
vue,
'@typescript-eslint': typescript,
prettier,
'simple-import-sort': simpleImportSort,
'vue-scoped-css': vueScopedCss
},
rules: {
// Vue 3 推荐规则
'vue/no-unused-vars': 'error',
'vue/no-unused-components': 'error',
'vue/no-multiple-template-root': 'off',
'vue/no-v-model-argument': 'off',
'vue/require-default-prop': 'off',
'vue/multi-word-component-names': 'off',
'vue/component-name-in-template-casing': ['error', 'kebab-case'],
'vue/no-reserved-props': 'off',
'vue/no-v-html': 'off',
'vue/first-attribute-linebreak': 'off',
'vue-scoped-css/enforce-style-type': [
'error',
{
allows: ['scoped']
}
],
'@typescript-eslint/explicit-function-return-type': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/explicit-module-boundary-types': 'off',
'prettier/prettier': 'error',
'simple-import-sort/imports': 'error',
'simple-import-sort/exports': 'error'
}
},
// TypeScript 类型定义文件配置
{
files: ['**/*.d.ts'],
rules: {
'no-unused-vars': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-empty-interface': 'off'
}
},
// JavaScript 第三方库文件配置
{
files: ['**/assets/**/*.js', '**/vendor/**/*.js', '**/lib/**/*.js'],
rules: {
'no-unused-vars': 'off',
'no-redeclare': 'off',
'no-self-assign': 'off',
'no-undef': 'off'
}
},
// 通用规则
{
files: ['**/*.js', '**/*.ts', '**/*.vue'],
rules: {
'no-console': 'off',
'no-underscore-dangle': 'off',
'no-nested-ternary': 'off',
'no-await-in-loop': 'off',
'no-continue': 'off',
'no-restricted-syntax': 'off',
'no-return-assign': 'off',
'no-unused-expressions': 'off',
'no-return-await': 'off',
'no-plusplus': 'off',
'no-param-reassign': 'off',
'no-shadow': 'off',
'guard-for-in': 'off',
'class-methods-use-this': 'off',
'no-case-declarations': 'off',
'no-unused-vars': [
'error',
// we are only using this rule to check for unused arguments since TS
// catches unused variables but not args.
{ varsIgnorePattern: '.*', args: 'none' }
]
}
}
];

View File

@@ -1,94 +1,133 @@
{
"name": "AlgerMusicPlayer",
"version": "3.0.0",
"version": "4.9.0",
"description": "Alger Music Player",
"author": "Alger <algerkc@qq.com>",
"main": "./out/main/index.js",
"homepage": "https://github.com/algerkong/AlgerMusicPlayer",
"scripts": {
"format": "prettier --write .",
"lint": "eslint . --ext .js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts,.vue --fix",
"prepare": "husky",
"format": "prettier --write ./src",
"lint": "eslint ./src --fix",
"typecheck:node": "tsc --noEmit -p tsconfig.node.json --composite false",
"typecheck:web": "vue-tsc --noEmit -p tsconfig.web.json --composite false",
"typecheck": "npm run typecheck:node && npm run typecheck:web",
"start": "electron-vite preview",
"dev": "electron-vite dev",
"build": "npm run typecheck && electron-vite build",
"dev:web": "vite dev",
"build": "electron-vite build",
"postinstall": "electron-builder install-app-deps",
"build:unpack": "npm run build && electron-builder --dir",
"build:win": "npm run build && electron-builder --win",
"build:mac": "npm run build && electron-builder --mac",
"build:linux": "npm run build && electron-builder --linux"
},
"dependencies": {
"@electron-toolkit/preload": "^3.0.0",
"@electron-toolkit/utils": "^3.0.0",
"@unblockneteasemusic/server": "^0.27.8-patch.1",
"electron-store": "^8.1.0",
"electron-updater": "^6.1.7",
"netease-cloud-music-api-alger": "^4.25.0"
"lint-staged": {
"*.{ts,tsx,vue,js}": [
"eslint --fix"
],
"*.{ts,tsx,vue,js,css,scss,md,json}": [
"prettier --write"
]
},
"devDependencies": {
"marked": "^15.0.4",
"@electron-toolkit/eslint-config": "^1.0.2",
"@electron-toolkit/eslint-config-ts": "^2.0.0",
"dependencies": {
"@electron-toolkit/preload": "^3.0.2",
"@electron-toolkit/utils": "^4.0.0",
"@unblockneteasemusic/server": "^0.27.8-patch.1",
"cors": "^2.8.5",
"electron-store": "^8.1.0",
"electron-updater": "^6.6.2",
"electron-window-state": "^5.0.3",
"express": "^4.18.2",
"file-type": "^21.0.0",
"flac-tagger": "^1.0.7",
"font-list": "^1.5.1",
"husky": "^9.1.7",
"music-metadata": "^11.2.3",
"netease-cloud-music-api-alger": "^4.26.1",
"node-id3": "^0.2.9",
"node-machine-id": "^1.1.12",
"pinia-plugin-persistedstate": "^4.5.0",
"sharp": "^0.34.3",
"vue-i18n": "^11.1.3"
},
"devDependencies": {
"@electron-toolkit/eslint-config": "^2.1.0",
"@electron-toolkit/eslint-config-ts": "^3.1.0",
"@electron-toolkit/tsconfig": "^1.0.1",
"@eslint/js": "^9.31.0",
"@rushstack/eslint-patch": "^1.10.3",
"@tailwindcss/postcss7-compat": "^2.2.4",
"@types/howler": "^2.2.12",
"@types/node": "^20.14.8",
"@typescript-eslint/eslint-plugin": "^7.0.0",
"@typescript-eslint/parser": "^7.0.0",
"@types/tinycolor2": "^1.4.6",
"@typescript-eslint/eslint-plugin": "^8.30.1",
"@typescript-eslint/parser": "^8.30.1",
"@vitejs/plugin-vue": "^5.0.5",
"@vue/compiler-sfc": "^3.5.0",
"@vue/eslint-config-prettier": "^9.0.0",
"@vue/eslint-config-typescript": "^13.0.0",
"@vue/eslint-config-prettier": "^10.2.0",
"@vue/eslint-config-typescript": "^14.5.0",
"@vue/runtime-core": "^3.5.0",
"@vueuse/core": "^11.0.3",
"@vueuse/electron": "^11.0.3",
"@vueuse/core": "^11.3.0",
"@vueuse/electron": "^13.8.0",
"animate.css": "^4.1.1",
"autoprefixer": "^10.4.20",
"axios": "^1.7.7",
"cross-env": "^7.0.3",
"electron": "^31.0.2",
"electron-builder": "^24.13.3",
"electron-vite": "^2.3.0",
"eslint": "^8.57.0",
"eslint-config-airbnb-base": "^15.0.0",
"eslint-config-prettier": "^9.0.0",
"eslint-plugin-import": "^2.29.1",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-simple-import-sort": "^12.0.0",
"eslint-plugin-vue": "^9.26.0",
"eslint-plugin-vue-scoped-css": "^2.7.2",
"electron": "^38.1.2",
"electron-builder": "^26.0.12",
"electron-vite": "^4.0.0",
"eslint": "^9.34.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-prettier": "^5.5.3",
"eslint-plugin-simple-import-sort": "^12.1.1",
"eslint-plugin-vue": "^10.3.0",
"eslint-plugin-vue-scoped-css": "^2.11.0",
"globals": "^16.3.0",
"howler": "^2.2.4",
"lint-staged": "^15.2.10",
"lodash": "^4.17.21",
"naive-ui": "^2.39.0",
"postcss": "^8.4.49",
"prettier": "^3.3.2",
"remixicon": "^4.2.0",
"sass": "^1.82.0",
"tailwindcss": "^3.4.15",
"marked": "^15.0.4",
"naive-ui": "^2.41.0",
"pinia": "^3.0.1",
"pinyin-match": "^1.2.6",
"postcss": "^8.4.47",
"prettier": "^3.6.2",
"remixicon": "^4.6.0",
"sass": "^1.86.0",
"tailwindcss": "^3.4.17",
"tinycolor2": "^1.6.0",
"tunajs": "^1.0.15",
"typescript": "^5.5.2",
"unplugin-auto-import": "^0.18.2",
"unplugin-vue-components": "^0.27.4",
"vfonts": "^0.1.0",
"vite": "^5.3.1",
"unplugin-auto-import": "^19.1.1",
"unplugin-vue-components": "^28.4.1",
"vite": "^6.2.2",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-vue-devtools": "7.4.0",
"vue": "^3.4.30",
"vue-router": "^4.4.3",
"vue-tsc": "^2.0.22",
"vuex": "^4.1.0"
"vite-plugin-vue-devtools": "7.7.2",
"vue": "^3.5.13",
"vue-eslint-parser": "^10.2.0",
"vue-router": "^4.5.0",
"vue-tsc": "^2.0.22"
},
"build": {
"appId": "com.alger.music",
"productName": "AlgerMusicPlayer",
"publish": [{
"provider": "github",
"owner": "algerkong",
"repo": "AlgerMusicPlayer"
}],
"publish": [
{
"provider": "github",
"owner": "algerkong",
"repo": "AlgerMusicPlayer"
}
],
"extraResources": [
{
"from": "resources/html",
"to": "html",
"filter": [
"**/*"
]
}
],
"mac": {
"icon": "resources/icon.icns",
"target": [
@@ -113,11 +152,15 @@
]
},
"win": {
"icon": "resources/favicon.ico",
"icon": "resources/icon.ico",
"target": [
{
"target": "nsis",
"arch": ["x64", "ia32"]
"arch": [
"x64",
"ia32",
"arm64"
]
}
],
"artifactName": "${productName}-${version}-win-${arch}.${ext}",
@@ -128,11 +171,24 @@
"target": [
{
"target": "AppImage",
"arch": ["x64"]
"arch": [
"x64",
"arm64"
]
},
{
"target": "deb",
"arch": ["x64"]
"arch": [
"x64",
"arm64"
]
},
{
"target": "rpm",
"arch": [
"x64",
"arm64"
]
}
],
"artifactName": "${productName}-${version}-linux-${arch}.${ext}",
@@ -142,12 +198,18 @@
"nsis": {
"oneClick": false,
"allowToChangeInstallationDirectory": true,
"installerIcon": "resources/favicon.ico",
"uninstallerIcon": "resources/favicon.ico",
"installerIcon": "resources/icon.ico",
"uninstallerIcon": "resources/icon.ico",
"createDesktopShortcut": true,
"createStartMenuShortcut": true,
"shortcutName": "AlgerMusicPlayer",
"include": "build/installer.nsh"
}
},
"pnpm": {
"onlyBuiltDependencies": [
"electron",
"esbuild"
]
}
}

10
prettier.config.js Normal file
View File

@@ -0,0 +1,10 @@
/**
* @type {import('prettier').Config}
*/
module.exports = {
singleQuote: true,
semi: true,
printWidth: 100,
trailingComma: 'none',
endOfLine: 'auto'
};

View File

@@ -0,0 +1,505 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"
/>
<title>AlgerMusicPlayer 远程控制</title>
<style>
:root {
--primary-color: #007aff;
--secondary-color: #5ac8fa;
--success-color: #4cd964;
--danger-color: #ff3b30;
--warning-color: #ff9500;
--light-gray: #f2f2f7;
--medium-gray: #e5e5ea;
--dark-gray: #8e8e93;
--text-color: #000000;
--text-secondary: #6c6c6c;
--background-color: #ffffff;
}
@media (prefers-color-scheme: dark) {
:root {
--primary-color: #0a84ff;
--secondary-color: #64d2ff;
--success-color: #30d158;
--danger-color: #ff453a;
--warning-color: #ff9f0a;
--light-gray: #1c1c1e;
--medium-gray: #2c2c2e;
--dark-gray: #8e8e93;
--text-color: #ffffff;
--text-secondary: #aeaeb2;
--background-color: #000000;
}
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
-webkit-tap-highlight-color: transparent;
}
body {
font-family:
-apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Helvetica Neue', Arial, sans-serif;
line-height: 1.6;
color: var(--text-color);
background-color: var(--light-gray);
display: flex;
flex-direction: column;
min-height: 100vh;
padding: 0;
margin: 0;
}
.header {
position: sticky;
top: 0;
z-index: 100;
background-color: var(--background-color);
padding: 12px 16px;
text-align: center;
border-bottom: 1px solid var(--medium-gray);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
.header h1 {
font-size: 18px;
font-weight: 600;
margin: 0;
}
.container {
max-width: 540px;
margin: 0 auto;
padding: 16px;
width: 100%;
flex: 1;
}
.card {
background-color: var(--background-color);
border-radius: 12px;
padding: 16px;
margin-bottom: 16px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.song-info {
display: flex;
align-items: center;
padding-bottom: 16px;
}
.song-cover {
width: 72px;
height: 72px;
border-radius: 8px;
object-fit: cover;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
background-color: var(--medium-gray);
}
.song-details {
margin-left: 16px;
flex: 1;
}
.song-details h2 {
margin: 0;
font-size: 18px;
font-weight: 600;
color: var(--text-color);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.song-details p {
margin: 4px 0 0;
font-size: 15px;
color: var(--text-secondary);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.play-state {
font-size: 14px;
color: var(--primary-color);
margin-top: 4px;
display: flex;
align-items: center;
}
.play-state::before {
content: '';
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
margin-right: 6px;
}
.playing .play-state::before {
background-color: var(--success-color);
}
.paused .play-state::before {
background-color: var(--warning-color);
}
.controls {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
margin-bottom: 16px;
}
.extra-controls {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 12px;
}
.btn {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
background-color: var(--background-color);
color: var(--primary-color);
border: 1px solid var(--medium-gray);
padding: 16px 0;
border-radius: 12px;
cursor: pointer;
font-size: 14px;
font-weight: 500;
transition: all 0.2s ease;
user-select: none;
position: relative;
overflow: hidden;
}
.btn:active {
transform: scale(0.97);
opacity: 0.7;
}
.btn::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: var(--primary-color);
opacity: 0;
transition: opacity 0.2s ease;
z-index: -1;
}
.btn:active::before {
opacity: 0.1;
}
.btn svg {
margin-bottom: 8px;
width: 24px;
height: 24px;
fill: var(--primary-color);
}
.btn-play svg {
width: 28px;
height: 28px;
margin-bottom: 6px;
}
.status-bar {
text-align: center;
padding: 8px 16px;
font-size: 14px;
color: var(--text-secondary);
background-color: var(--background-color);
border-top: 1px solid var(--medium-gray);
position: sticky;
bottom: 0;
}
.status-message {
display: inline-block;
transition: opacity 0.3s ease;
}
.status-message.fade {
opacity: 0;
}
.refresh-button {
color: var(--primary-color);
background: none;
border: none;
font-size: 14px;
cursor: pointer;
padding: 0;
margin-left: 8px;
}
@media (max-width: 350px) {
.controls,
.extra-controls {
gap: 8px;
}
.btn {
padding: 12px 0;
font-size: 12px;
}
.btn svg {
width: 20px;
height: 20px;
margin-bottom: 6px;
}
}
</style>
</head>
<body>
<div class="header">
<h1>AlgerMusicPlayer 远程控制</h1>
</div>
<div class="container">
<div class="card" id="songInfoCard">
<div class="song-info">
<img
id="songCover"
class="song-cover"
src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%238E8E93'%3E%3Cpath d='M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 14.5c-2.49 0-4.5-2.01-4.5-4.5S9.51 7.5 12 7.5s4.5 2.01 4.5 4.5-2.01 4.5-4.5 4.5zm0-5.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z'/%3E%3C/svg%3E"
alt="封面"
/>
<div class="song-details">
<h2 id="songTitle">未在播放</h2>
<p id="songArtist">--</p>
<div class="play-state" id="playState">未播放</div>
</div>
</div>
</div>
<div class="card">
<div class="controls">
<button id="prevBtn" class="btn">
<svg viewBox="0 0 24 24" fill="currentColor">
<path d="M6 6h2v12H6zm3.5 6l8.5 6V6z" />
</svg>
上一首
</button>
<button id="playBtn" class="btn btn-play">
<svg id="playIcon" viewBox="0 0 24 24" fill="currentColor">
<path d="M8 5v14l11-7z" />
</svg>
播放/暂停
</button>
<button id="nextBtn" class="btn">
<svg viewBox="0 0 24 24" fill="currentColor">
<path d="M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z" />
</svg>
下一首
</button>
</div>
<div class="extra-controls">
<button id="volumeDownBtn" class="btn">
<svg viewBox="0 0 24 24" fill="currentColor">
<path
d="M18.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM5 9v6h4l5 5V4L9 9H5z"
/>
</svg>
音量-
</button>
<button id="volumeUpBtn" class="btn">
<svg viewBox="0 0 24 24" fill="currentColor">
<path
d="M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"
/>
</svg>
音量+
</button>
</div>
</div>
<div class="card">
<div class="extra-controls">
<button id="favoriteBtn" class="btn">
<svg viewBox="0 0 24 24" fill="currentColor">
<path
d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"
/>
</svg>
收藏
</button>
<button id="refreshBtn" class="btn">
<svg viewBox="0 0 24 24" fill="currentColor">
<path
d="M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"
/>
</svg>
刷新
</button>
</div>
</div>
</div>
<div class="status-bar">
<span id="status" class="status-message">准备就绪</span>
</div>
<script>
// 页面加载完成后执行
document.addEventListener('DOMContentLoaded', () => {
// 获取DOM元素
const songInfoCard = document.getElementById('songInfoCard');
const songTitle = document.getElementById('songTitle');
const songArtist = document.getElementById('songArtist');
const songCover = document.getElementById('songCover');
const playState = document.getElementById('playState');
const playBtn = document.getElementById('playBtn');
const playIcon = document.getElementById('playIcon');
const prevBtn = document.getElementById('prevBtn');
const nextBtn = document.getElementById('nextBtn');
const favoriteBtn = document.getElementById('favoriteBtn');
const volumeUpBtn = document.getElementById('volumeUpBtn');
const volumeDownBtn = document.getElementById('volumeDownBtn');
const refreshBtn = document.getElementById('refreshBtn');
const status = document.getElementById('status');
let isPlaying = false;
// 显示状态消息并淡出
function showStatus(message, autoClear = true) {
status.textContent = message;
status.classList.remove('fade');
if (autoClear) {
setTimeout(() => {
status.classList.add('fade');
}, 2000);
}
}
// 更新播放/暂停图标
function updatePlayIcon() {
if (isPlaying) {
playIcon.innerHTML = '<path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z"/>';
} else {
playIcon.innerHTML = '<path d="M8 5v14l11-7z"/>';
}
}
// 更新状态的函数
async function updateStatus() {
try {
showStatus('获取播放状态...', false);
const response = await fetch('/api/status');
const data = await response.json();
// 更新播放状态
isPlaying = data.isPlaying;
updatePlayIcon();
// 更新UI
if (data.currentSong) {
songTitle.textContent = data.currentSong.name || '未知歌曲';
if (data.currentSong.ar && data.currentSong.ar.length) {
songArtist.textContent = data.currentSong.ar.map((a) => a.name).join(', ');
} else if (data.currentSong.artists && data.currentSong.artists.length) {
songArtist.textContent = data.currentSong.artists.map((a) => a.name).join(', ');
} else {
songArtist.textContent = '未知艺术家';
}
if (data.currentSong.picUrl) {
songCover.src = data.currentSong.picUrl;
}
} else {
songTitle.textContent = '未在播放';
songArtist.textContent = '--';
songCover.src =
"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%238E8E93'%3E%3Cpath d='M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 14.5c-2.49 0-4.5-2.01-4.5-4.5S9.51 7.5 12 7.5s4.5 2.01 4.5 4.5-2.01 4.5-4.5 4.5zm0-5.5c-.55 0-1 .45-1 1s.45 1 1 1 1-.45 1-1-.45-1-1-1z'/%3E%3C/svg%3E";
}
// 更新播放状态
playState.textContent = isPlaying ? '正在播放' : '已暂停';
songInfoCard.className = isPlaying ? 'card playing' : 'card paused';
showStatus('已更新', true);
} catch (error) {
console.error('获取状态失败:', error);
showStatus('获取状态失败');
}
}
// 发送命令的函数
async function sendCommand(endpoint) {
try {
showStatus('发送命令中...', false);
const response = await fetch('/api/' + endpoint, { method: 'POST' });
const data = await response.json();
showStatus(data.message || '命令已发送');
// 稍等后更新状态
setTimeout(updateStatus, 500);
} catch (error) {
console.error('发送命令失败:', error);
showStatus('发送命令失败');
}
}
// 绑定按钮事件
playBtn.addEventListener('click', () => sendCommand('toggle-play'));
prevBtn.addEventListener('click', () => sendCommand('prev'));
nextBtn.addEventListener('click', () => sendCommand('next'));
favoriteBtn.addEventListener('click', () => sendCommand('toggle-favorite'));
volumeUpBtn.addEventListener('click', () => sendCommand('volume-up'));
volumeDownBtn.addEventListener('click', () => sendCommand('volume-down'));
refreshBtn.addEventListener('click', updateStatus);
// 初始加载状态
updateStatus();
// 每1秒更新一次状态
setInterval(updateStatus, 1000);
// 添加触摸反馈
const buttons = document.querySelectorAll('.btn');
buttons.forEach((btn) => {
btn.addEventListener('touchstart', function () {
this.style.transform = 'scale(0.97)';
this.style.opacity = '0.7';
});
btn.addEventListener('touchend', function () {
this.style.transform = 'scale(1)';
this.style.opacity = '1';
});
});
// 检测深色模式变化
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
updateStatus();
});
});
</script>
</body>
</html>

Binary file not shown.

BIN
resources/icon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 68 KiB

BIN
resources/icons/next.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 B

BIN
resources/icons/pause.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 B

BIN
resources/icons/play.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 B

BIN
resources/icons/prev.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

View File

@@ -0,0 +1,5 @@
export default {
hotSongs: 'Hot Songs',
albums: 'Albums',
description: 'Artist Introduction'
};

View File

@@ -0,0 +1,51 @@
export default {
player: {
loading: 'Loading audio...',
retry: 'Retry',
playNow: 'Play Now',
loadingTitle: 'Loading...',
totalDuration: 'Total Duration: {duration}',
partsList: 'Parts List ({count} episodes)',
playStarted: 'Playback started',
switchingPart: 'Switching to part: {part}',
preloadingNext: 'Preloading next part: {part}',
playingCurrent: 'Playing current selected part: {name}',
num: 'M',
errors: {
invalidVideoId: 'Invalid video ID',
loadVideoDetailFailed: 'Failed to load video details',
loadPartInfoFailed: 'Unable to load video part information',
loadAudioUrlFailed: 'Failed to get audio playback URL',
videoDetailNotLoaded: 'Video details not loaded',
missingParams: 'Missing required parameters',
noAvailableAudioUrl: 'No available audio URL found',
loadPartAudioFailed: 'Failed to load part audio URL',
audioListEmpty: 'Audio list is empty, please retry',
currentPartNotFound: 'Current part audio not found',
audioUrlFailed: 'Failed to get audio URL',
playFailed: 'Playback failed, please retry',
getAudioUrlFailed: 'Failed to get audio URL, please retry',
audioNotFound: 'Corresponding audio not found, please retry',
preloadFailed: 'Failed to preload next part',
switchPartFailed: 'Failed to load audio URL when switching parts'
},
console: {
loadingDetail: 'Loading Bilibili video details',
detailData: 'Bilibili video detail data',
multipleParts: 'Video has multiple parts, total {count}',
noPartsData: 'Video has no parts or part data is empty',
loadingAudioSource: 'Loading audio source',
generatedAudioList: 'Generated audio list, total {count}',
getDashAudioUrl: 'Got dash audio URL',
getDurlAudioUrl: 'Got durl audio URL',
loadingPartAudio: 'Loading part audio URL: {part}, cid: {cid}',
loadPartAudioFailed: 'Failed to load part audio URL: {part}',
switchToPart: 'Switching to part: {part}',
audioNotFoundInList: 'Corresponding audio item not found',
preparingToPlay: 'Preparing to play current selected part: {name}',
preloadingNextPart: 'Preloading next part: {part}',
playingSelectedPart: 'Playing current selected part: {name}, audio URL: {url}',
preloadNextFailed: 'Failed to preload next part'
}
}
};

View File

@@ -0,0 +1,57 @@
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',
reset: 'Reset',
back: 'Back',
copySuccess: 'Copied to clipboard',
copyFailed: 'Copy failed',
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',
playPause: 'Play/Pause',
prev: 'Previous',
next: 'Next',
pause: 'Pause',
play: 'Play',
favorite: 'Favorite'
},
language: 'Language'
};

193
src/i18n/lang/en-US/comp.ts Normal file
View File

@@ -0,0 +1,193 @@
export default {
installApp: {
description: 'Install the application 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',
installConfirmTitle: 'Install Update',
installConfirmContent: 'Do you want to close the application and install the update?',
manualInstallTip:
'If the installer does not open automatically after closing the application, please find the file in your download folder and open it manually.',
yesInstall: 'Install Now',
noThanks: 'Later',
fileLocation: 'File Location',
copy: 'Copy Path',
copySuccess: 'Path copied to clipboard',
copyFailed: 'Copy failed',
backgroundDownload: 'Background Download'
},
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',
groupText: 'Wechat Public Account: AlgerMusic',
messages: {
copySuccess: 'Copied to clipboard'
},
donateList: 'Buy me a coffee'
},
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: 'Settings',
theme: 'Theme',
restart: 'Restart',
refresh: 'Refresh',
currentVersion: 'Current Version',
searchPlaceholder: 'Search for something...',
zoom: 'Zoom',
zoom100: 'Zoom 100%',
resetZoom: 'Reset Zoom',
zoomDefault: 'Default Zoom'
},
titleBar: {
closeTitle: 'Choose how to close',
minimizeToTray: 'Minimize to Tray',
exitApp: 'Exit App',
rememberChoice: 'Remember my choice',
closeApp: 'Close App'
},
userPlayList: {
title: "{name}'s Playlist"
},
musicList: {
searchSongs: 'Search Songs',
noSearchResults: 'No search results',
switchToNormal: 'Switch to normal layout',
switchToCompact: 'Switch to compact layout',
playAll: 'Play All',
collect: 'Collect',
collectSuccess: 'Collect Success',
cancelCollectSuccess: 'Cancel Collect Success',
cancelCollect: 'Cancel Collect',
addToPlaylist: 'Add to Playlist',
addToPlaylistSuccess: 'Add to Playlist Success',
operationFailed: 'Operation Failed',
songsAlreadyInPlaylist: 'Songs already in playlist'
},
playlist: {
import: {
button: 'Import Playlist',
title: 'Import Playlist',
description: 'Import playlists via metadata, text, or links',
linkTab: 'Import by Link',
textTab: 'Import by Text',
localTab: 'Import by Metadata',
linkPlaceholder: 'Enter playlist links, one per line',
textPlaceholder: 'Enter song information in format: Song Name Artist Name',
localPlaceholder: 'Enter song metadata in JSON format',
linkTips: 'Supported link sources:',
linkTip1: 'Copy links after sharing playlists to WeChat/Weibo/QQ',
linkTip2: 'Directly copy playlist/profile links',
linkTip3: 'Directly copy article links',
textTips: 'Enter song information, one song per line',
textFormat: 'Format: Song Name Artist Name',
localTips: 'Add song metadata',
localFormat: 'Format example:',
songNamePlaceholder: 'Song Name',
artistNamePlaceholder: 'Artist Name',
albumNamePlaceholder: 'Album Name',
addSongButton: 'Add Song',
addLinkButton: 'Add Link',
importToStarPlaylist: 'Import to My Favorite Music',
playlistNamePlaceholder: 'Enter playlist name',
importButton: 'Start Import',
emptyLinkWarning: 'Please enter playlist links',
emptyTextWarning: 'Please enter song information',
emptyLocalWarning: 'Please enter song metadata',
invalidJsonFormat: 'Invalid JSON format',
importSuccess: 'Import task created successfully',
importFailed: 'Import failed',
importStatus: 'Import Status',
refresh: 'Refresh',
taskId: 'Task ID',
status: 'Status',
successCount: 'Success Count',
failReason: 'Failure Reason',
unknownError: 'Unknown error',
statusPending: 'Pending',
statusProcessing: 'Processing',
statusSuccess: 'Success',
statusFailed: 'Failed',
statusUnknown: 'Unknown',
taskList: 'Task List',
taskListTitle: 'Import Task List',
action: 'Action',
select: 'Select',
fetchTaskListFailed: 'Failed to fetch task list',
noTasks: 'No import tasks',
clearTasks: 'Clear Tasks',
clearTasksConfirmTitle: 'Confirm Clear',
clearTasksConfirmContent:
'Are you sure you want to clear all import task records? This action cannot be undone.',
confirm: 'Confirm',
cancel: 'Cancel',
clearTasksSuccess: 'Task list cleared',
clearTasksFailed: 'Failed to clear task list'
}
},
settings: 'Settings',
user: 'User',
toplist: 'Toplist',
history: 'History',
list: 'Playlist',
mv: 'MV',
home: 'Home',
search: 'Search'
};

View File

@@ -0,0 +1,9 @@
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',
toDonateList: 'Buy me a coffee',
title: 'Donation List',
noMessage: 'No Message'
};

View File

@@ -0,0 +1,91 @@
export default {
title: 'Download Manager',
localMusic: 'Local Music',
count: '{count} songs in total',
clearAll: 'Clear All',
settings: 'Settings',
tabs: {
downloading: 'Downloading',
downloaded: 'Downloaded'
},
empty: {
noTasks: 'No download tasks',
noDownloaded: 'No downloaded songs',
noDownloadedHint: 'Download your favorite songs to listen offline'
},
progress: {
total: 'Total Progress: {progress}%'
},
items: 'items',
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',
fileNotFound: 'File not found or moved, removed from records',
recordRemoved: 'Failed to delete file, but removed from records'
},
clear: {
title: 'Clear Download Records',
message:
'Are you sure you want to clear all download records? This will not delete the actual music files, but will clear all records.',
confirm: 'Clear',
cancel: 'Cancel',
success: 'Download records cleared'
},
message: {
downloadComplete: '{filename} download completed',
downloadFailed: '{filename} download failed: {error}',
alreadyDownloading: '{filename} is already downloading'
},
loading: 'Loading...',
playStarted: 'Play started: {name}',
playFailed: 'Play failed: {name}',
path: {
copied: 'Path copied to clipboard',
copyFailed: 'Failed to copy path'
},
settingsPanel: {
title: 'Download Settings',
path: 'Download Location',
pathDesc: 'Set where your music files will be saved',
pathPlaceholder: 'Please select download path',
noPathSelected: 'Please select download path first',
select: 'Select Folder',
open: 'Open Folder',
fileFormat: 'Filename Format',
fileFormatDesc: 'Set how downloaded music files will be named',
customFormat: 'Custom Format',
separator: 'Separator',
separators: {
dash: 'Space-dash-space',
underscore: 'Underscore',
space: 'Space'
},
dragToArrange: 'Sort or use arrow buttons to arrange:',
formatVariables: 'Available variables',
preview: 'Preview:',
saveSuccess: 'Download settings saved',
presets: {
songArtist: 'Song - Artist',
artistSong: 'Artist - Song',
songOnly: 'Song only'
},
components: {
songName: 'Song name',
artistName: 'Artist name',
albumName: 'Album name'
}
}
};

View File

@@ -0,0 +1,17 @@
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',
descending: 'Descending',
ascending: 'Ascending'
};

View File

@@ -0,0 +1,45 @@
export default {
title: 'Play History',
heatmapTitle: 'Heatmap',
playCount: '{count}',
getHistoryFailed: 'Failed to get play history',
categoryTabs: {
songs: 'Songs',
playlists: 'Playlists',
albums: 'Albums'
},
tabs: {
all: 'All Records',
local: 'Local Records',
cloud: 'Cloud Records'
},
getCloudRecordFailed: 'Failed to get cloud records',
needLogin: 'Please login with cookie to view cloud records',
merging: 'Merging records...',
noDescription: 'No description',
noData: 'No records',
newKey: 'New translation',
heatmap: {
title: 'Play Heatmap',
loading: 'Loading data...',
unit: 'plays',
footerText: 'Hover to view details',
playCount: 'Played {count} times',
topSongs: 'Top songs of the day',
times: 'times',
totalPlays: 'Total Plays',
activeDays: 'Active Days',
noData: 'No play records',
colorTheme: 'Color Theme',
colors: {
green: 'Green',
blue: 'Blue',
orange: 'Orange',
purple: 'Purple',
red: 'Red'
},
mostPlayedSong: 'Most Played Song',
mostActiveDay: 'Most Active Day',
latestNightSong: 'Latest Night Song'
}
};

View File

@@ -0,0 +1,64 @@
export default {
title: {
qr: 'QR Code Login',
phone: 'Phone Login',
cookie: 'Cookie Login',
uid: 'UID Login'
},
qrTip: 'Scan with NetEase Cloud Music APP',
phoneTip: 'Login with NetEase Cloud account',
tokenTip: 'Enter a valid NetEase Cloud Music Cookie to login',
uidTip: 'Enter User ID for quick login',
placeholder: {
phone: 'Phone Number',
password: 'Password',
cookie: 'Please enter NetEase Cloud Music Cookie (token)',
uid: 'Please enter User ID (UID)'
},
button: {
login: 'Login',
switchToQr: 'QR Code Login',
switchToPhone: 'Phone Login',
switchToToken: 'Use Cookie Login',
switchToUid: 'UID Login',
backToQr: 'Back to QR Code Login',
cookieLogin: 'Cookie Login',
autoGetCookie: 'Auto Get Cookie',
refresh: 'Click to Refresh',
refreshing: 'Refreshing...',
refreshQr: 'Refresh QR Code'
},
message: {
loginSuccess: 'Login successful',
loginFailed: 'Login failed',
tokenLoginSuccess: 'Cookie login successful',
uidLoginSuccess: 'UID login successful',
loadError: 'Error loading login information',
qrCheckError: 'Error checking QR code status',
tokenRequired: 'Please enter Cookie',
tokenInvalid: 'Invalid Cookie, please check and try again',
uidRequired: 'Please enter User ID',
uidInvalid: 'Invalid User ID or user does not exist',
uidLoginFailed: 'UID login failed, please check if User ID is correct',
phoneRequired: 'Please enter phone number',
passwordRequired: 'Please enter password',
phoneLoginFailed: 'Phone login failed, please check if phone number and password are correct',
autoGetCookieSuccess: 'Auto get Cookie successful',
autoGetCookieFailed: 'Auto get Cookie failed',
autoGetCookieTip:
'Will open NetEase Cloud Music login page, please complete login and close the window',
qrCheckFailed: 'Failed to check QR code status, please refresh and try again',
qrLoading: 'Loading QR code...',
qrExpired: 'QR code has expired, please click to refresh',
qrExpiredShort: 'QR code expired',
qrExpiredWarning: 'QR code has expired, please click to refresh for a new one',
qrScanned: 'QR code scanned, please confirm login on your phone',
qrScannedShort: 'Scanned',
qrScannedInfo: 'QR code scanned, please confirm login on your phone',
qrConfirmed: 'Login successful, redirecting...',
qrGenerating: 'Generating QR code...'
},
qrTitle: 'NetEase Cloud Music QR Code Login',
uidWarning:
'Note: UID login is only for viewing user public information and cannot access features that require login permissions.'
};

View File

@@ -0,0 +1,136 @@
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',
songNum: 'Song Number: {num}',
addCorrection: 'Add {num} seconds',
subtractCorrection: 'Subtract {num} seconds',
playFailed: 'Play Failed, Play Next Song',
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',
noAutoScroll: 'This lyrics does not support auto-scroll'
},
reparse: {
title: 'Select Music Source',
desc: 'Click a source to directly reparse the current song. This source will be used next time this song plays.',
success: 'Reparse successful',
failed: 'Reparse failed',
warning: 'Please select a music source',
bilibiliNotSupported: 'Bilibili videos do not support reparsing',
processing: 'Processing...',
clear: 'Clear Custom Source',
customApiFailed: 'Custom API parsing failed, trying built-in sources...',
customApiError: 'Custom API request error, trying built-in sources...'
},
playBar: {
expand: 'Expand Lyrics',
collapse: 'Collapse Lyrics',
like: 'Like',
lyric: 'Lyric',
noSongPlaying: 'No song playing',
eq: 'Equalizer',
playList: 'Play List',
reparse: 'Reparse',
playMode: {
sequence: 'Sequence',
loop: 'Loop',
random: 'Random'
},
play: 'Play',
pause: 'Pause',
prev: 'Previous',
next: 'Next',
volume: 'Volume',
favorite: 'Favorite {name}',
unFavorite: 'Unfavorite {name}',
playbackSpeed: 'Playback Speed',
advancedControls: 'Advanced Controls',
intelligenceMode: {
title: 'Intelligence Mode',
needCookieLogin: 'Please login with Cookie method to use Intelligence Mode',
noFavoritePlaylist: 'Favorite playlist not found',
noLikedSongs: 'You have no liked songs yet',
loading: 'Loading Intelligence Mode',
success: 'Loaded {count} songs',
failed: 'Failed to get Intelligence Mode list',
error: 'Intelligence Mode error'
}
},
eq: {
title: 'Equalizer',
reset: 'Reset',
on: 'On',
off: 'Off',
bass: 'Bass',
midrange: 'Midrange',
treble: 'Treble',
presets: {
flat: 'Flat',
pop: 'Pop',
rock: 'Rock',
classical: 'Classical',
jazz: 'Jazz',
electronic: 'Electronic',
hiphop: 'Hip-Hop',
rb: 'R&B',
metal: 'Metal',
vocal: 'Vocal',
dance: 'Dance',
acoustic: 'Acoustic',
custom: 'Custom'
}
},
// Sleep timer related
sleepTimer: {
title: 'Sleep Timer',
cancel: 'Cancel Timer',
timeMode: 'By Time',
songsMode: 'By Songs',
playlistEnd: 'After Playlist',
afterPlaylist: 'After Playlist Ends',
activeUntilEnd: 'Active until end of playlist',
minutes: 'min',
hours: 'hr',
songs: 'songs',
set: 'Set',
timerSetSuccess: 'Timer set for {minutes} minutes',
songsSetSuccess: 'Timer set for {songs} songs',
playlistEndSetSuccess: 'Timer set to end after playlist',
timerCancelled: 'Sleep timer cancelled',
timerEnded: 'Sleep timer ended',
playbackStopped: 'Music playback stopped',
minutesRemaining: '{minutes} min remaining',
songsRemaining: '{count} songs remaining'
},
playList: {
clearAll: 'Clear Playlist',
alreadyEmpty: 'Playlist is already empty',
cleared: 'Playlist cleared',
empty: 'Playlist is empty',
clearConfirmTitle: 'Clear Playlist',
clearConfirmContent:
'This will clear all songs in the playlist and stop the current playback. Continue?'
}
};

View File

@@ -0,0 +1,27 @@
export default {
title: {
hotSearch: 'Hot Search',
searchList: 'Search Results',
searchHistory: 'Search History'
},
button: {
clear: 'Clear',
back: 'Back',
playAll: 'Play All'
},
loading: {
more: 'Loading...',
failed: 'Search failed'
},
noMore: 'No more results',
error: {
searchFailed: 'Search failed'
},
search: {
single: 'Single',
album: 'Album',
playlist: 'Playlist',
mv: 'MV',
bilibili: 'Bilibili'
}
};

View File

@@ -0,0 +1,364 @@
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',
autoTheme: 'Follow System',
manualTheme: 'Manual Switch',
language: 'Language Settings',
languageDesc: 'Change display language',
tokenManagement: 'Cookie Management',
tokenManagementDesc: 'Manage NetEase Cloud Music login Cookie',
tokenStatus: 'Current Cookie Status',
tokenSet: 'Set',
tokenNotSet: 'Not Set',
setToken: 'Set Cookie',
modifyToken: 'Modify Cookie',
clearToken: 'Clear Cookie',
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: '가나다라마 바사아자차 카타파하'
},
gpuAcceleration: 'GPU Acceleration',
gpuAccelerationDesc:
'Enable or disable hardware acceleration, can improve rendering performance but may increase GPU load',
gpuAccelerationRestart:
'Changing GPU acceleration settings requires application restart to take effect',
gpuAccelerationChangeSuccess:
'GPU acceleration settings updated, restart application to take effect',
gpuAccelerationChangeError: 'Failed to update GPU acceleration settings',
tabletMode: 'Tablet Mode',
tabletModeDesc: 'Enabling tablet mode allows using PC-style interface on mobile devices'
},
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'
},
musicSources: 'Music Sources',
musicSourcesDesc: 'Select music sources for song resolution',
musicSourcesWarning: 'At least one music source must be selected',
musicUnblockEnable: 'Enable Music Unblocking',
musicUnblockEnableDesc: 'When enabled, attempts to resolve unplayable songs',
configureMusicSources: 'Configure Sources',
selectedMusicSources: 'Selected sources:',
noMusicSources: 'No sources selected',
gdmusicInfo:
'GD Music Station intelligently resolves music from multiple platforms automatically',
autoPlay: 'Auto Play',
autoPlayDesc: 'Auto resume playback when reopening the app',
showStatusBar: 'Show Status Bar',
showStatusBarContent:
'You can display the music control function in your mac status bar (effective after a restart)',
fallbackParser: 'Fallback Parser (GD Music)',
fallbackParserDesc:
'When "GD Music" is checked and regular sources fail, this service will be used.',
parserGD: 'GD Music (Built-in)',
parserCustom: 'Custom API',
// Source labels
sourceLabels: {
migu: 'Migu',
kugou: 'Kugou',
pyncmd: 'NetEase (Built-in)',
bilibili: 'Bilibili',
gdmusic: 'GD Music',
custom: 'Custom API'
},
customApi: {
sectionTitle: 'Custom API Settings',
importConfig: 'Import JSON Config',
currentSource: 'Current Source',
notImported: 'No custom source imported yet.',
importSuccess: 'Successfully imported source: {name}',
importFailed: 'Import failed: {message}',
enableHint: 'Import a JSON config file to enable'
}
},
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',
unlimitedDownload: 'Unlimited Download',
unlimitedDownloadDesc: 'Enable unlimited download mode for music , default limit 300 songs',
downloadPath: 'Download Directory',
downloadPathDesc: 'Choose download location for music files',
remoteControl: 'Remote Control',
remoteControlDesc: 'Set remote control function'
},
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',
tabs: {
display: 'Display',
interface: 'Interface',
typography: 'Typography',
mobile: 'Mobile'
},
pureMode: 'Pure Mode',
hideCover: 'Hide Cover',
centerDisplay: 'Center Display',
showTranslation: 'Show Translation',
hideLyrics: 'Hide Lyrics',
hidePlayBar: 'Hide Play Bar',
hideMiniPlayBar: 'Hide Mini Play Bar',
showMiniPlayBar: 'Show Mini Play Bar',
backgroundTheme: 'Background Theme',
themeOptions: {
default: 'Default',
light: 'Light',
dark: 'Dark'
},
fontSize: 'Font Size',
fontSizeMarks: {
small: 'Small',
medium: 'Medium',
large: 'Large'
},
letterSpacing: 'Letter Spacing',
letterSpacingMarks: {
compact: 'Compact',
default: 'Default',
loose: 'Loose'
},
lineHeight: 'Line Height',
lineHeightMarks: {
compact: 'Compact',
default: 'Default',
loose: 'Loose'
},
mobileLayout: 'Mobile Layout',
layoutOptions: {
default: 'Default',
ios: 'iOS Style',
android: 'Android Style'
},
mobileCoverStyle: 'Cover Style',
coverOptions: {
record: 'Record',
square: 'Square',
full: 'Full Screen'
},
lyricLines: 'Lyric Lines',
mobileUnavailable: 'This setting is only available on mobile devices'
},
translationEngine: 'Lyric Translation Engine',
translationEngineOptions: {
none: 'Off',
opencc: 'OpenCC Traditionalize'
},
themeColor: {
title: 'Lyric Theme Color',
presetColors: 'Preset Colors',
customColor: 'Custom Color',
preview: 'Preview',
previewText: 'Lyric Effect',
colorNames: {
'spotify-green': 'Spotify Green',
'apple-blue': 'Apple Blue',
'youtube-red': 'YouTube Red',
orange: 'Vibrant Orange',
purple: 'Mystic Purple',
pink: 'Cherry Pink'
},
tooltips: {
openColorPicker: 'Open Color Picker',
closeColorPicker: 'Close Color Picker'
},
placeholder: '#1db954'
},
shortcutSettings: {
title: 'Shortcut Settings',
shortcut: 'Shortcut',
shortcutDesc: 'Customize global shortcuts',
shortcutConflict: 'Shortcut Conflict',
inputPlaceholder: 'Click to input shortcut',
resetShortcuts: 'Reset',
disableAll: 'Disable All',
enableAll: 'Enable All',
togglePlay: 'Play/Pause',
prevPlay: 'Previous',
nextPlay: 'Next',
volumeUp: 'Volume Up',
volumeDown: 'Volume Down',
toggleFavorite: 'Favorite/Unfavorite',
toggleWindow: 'Show/Hide Window',
scopeGlobal: 'Global',
scopeApp: 'App Only',
enabled: 'Enabled',
disabled: 'Disabled',
messages: {
resetSuccess: 'Shortcuts reset successfully, please save',
conflict: 'Shortcut conflict, please reset',
saveSuccess: 'Shortcuts saved successfully',
saveError: 'Failed to save shortcuts',
cancelEdit: 'Edit cancelled',
disableAll: 'All shortcuts disabled, please save to apply',
enableAll: 'All shortcuts enabled, please save to apply'
}
},
remoteControl: {
title: 'Remote Control',
enable: 'Enable Remote Control',
port: 'Port',
allowedIps: 'Allowed IPs',
addIp: 'Add IP',
emptyListHint: 'Empty list means allow all IPs',
saveSuccess: 'Remote control settings saved',
accessInfo: 'Remote control access address:'
},
cookie: {
title: 'Cookie Settings',
description: 'Please enter NetEase Cloud Music Cookie:',
placeholder: 'Please paste the complete Cookie...',
help: {
format: 'Cookie usually starts with "MUSIC_U="',
source: 'Can be obtained from browser developer tools network requests',
storage: 'Cookie will be automatically saved to local storage after setting'
},
action: {
save: 'Save Cookie',
paste: 'Paste',
clear: 'Clear'
},
validation: {
required: 'Please enter Cookie',
format: 'Cookie format may be incorrect, please check if it contains MUSIC_U'
},
message: {
saveSuccess: 'Cookie saved successfully',
saveError: 'Failed to save Cookie',
pasteSuccess: 'Pasted successfully',
pasteError: 'Paste failed, please copy manually'
},
info: {
length: 'Current length: {length} characters'
}
}
};

View File

@@ -0,0 +1,28 @@
export default {
menu: {
play: 'Play',
playNext: 'Play Next',
download: 'Download',
addToPlaylist: 'Add to Playlist',
favorite: 'Like',
unfavorite: 'Unlike',
removeFromPlaylist: 'Remove from Playlist',
dislike: 'Dislike',
undislike: 'Undislike'
},
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, please check if logged in'
},
dialog: {
dislike: {
title: 'Dislike',
content: 'Are you sure you want to dislike this song?',
positiveText: 'Dislike',
negativeText: 'Cancel'
}
}
};

View File

@@ -0,0 +1,53 @@
export default {
profile: {
followers: 'Followers',
following: 'Following',
level: 'Level'
},
playlist: {
created: 'Created Playlists',
mine: 'Mine',
trackCount: '{count} tracks',
playCount: 'Played {count} times'
},
tabs: {
created: 'Created',
favorite: 'Favorite',
album: 'Album'
},
ranking: {
title: 'Listening History',
playCount: '{count} times'
},
follow: {
title: 'Follow List',
viewPlaylist: 'View Playlist',
noFollowings: 'No Followings',
loadMore: 'Load More',
noSignature: 'This guy is lazy, nothing left',
userFollowsTitle: "'s Followings",
myFollowsTitle: 'My Followings'
},
follower: {
title: 'Follower List',
noFollowers: 'No Followers',
loadMore: 'Load More',
userFollowersTitle: "'s Followers",
myFollowersTitle: 'My Followers'
},
detail: {
playlists: 'Playlists',
records: 'Listening History',
noPlaylists: 'No Playlists',
noRecords: 'No Listening History',
artist: 'Artist',
noSignature: 'This guy is lazy, nothing left',
invalidUserId: 'Invalid User ID',
noRecordPermission: "{name} doesn't let you see your listening history"
},
message: {
loadFailed: 'Failed to load user page',
deleteSuccess: 'Successfully deleted',
deleteFailed: 'Failed to delete'
}
};

View File

@@ -0,0 +1,5 @@
export default {
hotSongs: '人気楽曲',
albums: 'アルバム',
description: 'アーティスト紹介'
};

View File

@@ -0,0 +1,51 @@
export default {
player: {
loading: 'オーディオ読み込み中...',
retry: '再試行',
playNow: '今すぐ再生',
loadingTitle: '読み込み中...',
totalDuration: '総再生時間: {duration}',
partsList: 'パートリスト ({count}話)',
playStarted: '再生を開始しました',
switchingPart: 'パートを切り替え中: {part}',
preloadingNext: '次のパートをプリロード中: {part}',
playingCurrent: '現在選択されたパートを再生中: {name}',
num: '万',
errors: {
invalidVideoId: '無効な動画ID',
loadVideoDetailFailed: '動画詳細の取得に失敗しました',
loadPartInfoFailed: '動画パート情報の読み込みができません',
loadAudioUrlFailed: 'オーディオ再生URLの取得に失敗しました',
videoDetailNotLoaded: '動画詳細が読み込まれていません',
missingParams: '必要なパラメータが不足しています',
noAvailableAudioUrl: '利用可能なオーディオURLが見つかりません',
loadPartAudioFailed: 'パートオーディオURLの読み込みに失敗しました',
audioListEmpty: 'オーディオリストが空です。再試行してください',
currentPartNotFound: '現在のパートのオーディオが見つかりません',
audioUrlFailed: 'オーディオURLの取得に失敗しました',
playFailed: '再生に失敗しました。再試行してください',
getAudioUrlFailed: 'オーディオURLの取得に失敗しました。再試行してください',
audioNotFound: '対応するオーディオが見つかりません。再試行してください',
preloadFailed: '次のパートのプリロードに失敗しました',
switchPartFailed: 'パート切り替え時のオーディオURL読み込みに失敗しました'
},
console: {
loadingDetail: 'Bilibiliビデオ詳細を読み込み中',
detailData: 'Bilibiliビデオ詳細データ',
multipleParts: 'ビデオに複数のパートがあります。合計{count}個',
noPartsData: 'ビデオにパートがないか、パートデータが空です',
loadingAudioSource: 'オーディオソースを読み込み中',
generatedAudioList: 'オーディオリストを生成しました。合計{count}個',
getDashAudioUrl: 'dashオーディオURLを取得しました',
getDurlAudioUrl: 'durlオーディオURLを取得しました',
loadingPartAudio: 'パートオーディオURLを読み込み中: {part}, cid: {cid}',
loadPartAudioFailed: 'パートオーディオURLの読み込みに失敗: {part}',
switchToPart: 'パートに切り替え中: {part}',
audioNotFoundInList: '対応するオーディオアイテムが見つかりません',
preparingToPlay: '現在選択されたパートの再生準備中: {name}',
preloadingNextPart: '次のパートをプリロード中: {part}',
playingSelectedPart: '現在選択されたパートを再生中: {name}、オーディオURL: {url}',
preloadNextFailed: '次のパートのプリロードに失敗しました'
}
}
};

View File

@@ -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: 'お気に入り'
}
};

193
src/i18n/lang/ja-JP/comp.ts Normal file
View File

@@ -0,0 +1,193 @@
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: 'もっと見る',
groupText: '微信公众号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: '検索'
};

View File

@@ -0,0 +1,9 @@
export default {
description:
'あなたの寄付は開発・保守作業をサポートするために使用され、サーバー保守、ドメイン更新などが含まれます。',
message: 'メッセージを残す際は、メールアドレスやGitHubユーザー名を記載してください。',
refresh: 'リストを更新',
toDonateList: 'コーヒーをおごる',
noMessage: 'メッセージがありません',
title: '寄付リスト'
};

View File

@@ -0,0 +1,88 @@
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: 'アルバム名'
}
}
};

View File

@@ -0,0 +1,13 @@
export default {
title: 'お気に入り',
count: '合計{count}曲',
batchDownload: '一括ダウンロード',
download: 'ダウンロード ({count})',
emptyTip: 'まだお気に入りの楽曲がありません',
downloadSuccess: 'ダウンロード完了',
downloadFailed: 'ダウンロード失敗',
downloading: 'ダウンロード中です。しばらくお待ちください...',
selectSongsFirst: 'まずダウンロードする楽曲を選択してください',
descending: '降順',
ascending: '昇順'
};

View File

@@ -0,0 +1,37 @@
export default {
title: '再生履歴',
heatmapTitle: 'ヒートマップ',
playCount: '{count}',
getHistoryFailed: '履歴の取得に失敗しました',
tabs: {
all: 'すべての記録',
local: 'ローカル記録',
cloud: 'クラウド記録'
},
getCloudRecordFailed: 'クラウド記録の取得に失敗しました',
needLogin: 'cookieを使用してログインしてクラウド記録を表示できます',
merging: '記録を統合中...',
heatmap: {
title: '再生ヒートマップ',
loading: 'データを読み込み中...',
unit: '回再生',
footerText: 'ホバーして詳細を表示',
playCount: '{count} 回再生',
topSongs: 'その日の人気曲',
times: '回',
totalPlays: '総再生回数',
activeDays: 'アクティブ日数',
noData: '再生記録がありません',
colorTheme: 'カラーテーマ',
colors: {
green: 'グリーン',
blue: 'ブルー',
orange: 'オレンジ',
purple: 'パープル',
red: 'レッド'
},
mostPlayedSong: '最も再生された曲',
mostActiveDay: '最もアクティブな日',
latestNightSong: '深夜に再生した曲'
}
};

View File

@@ -0,0 +1,50 @@
export default {
title: {
qr: 'QRコードログイン',
phone: '電話番号ログイン',
cookie: 'Cookieログイン',
uid: 'UIDログイン'
},
qrTip: 'NetEase Cloudアプリでログイン',
phoneTip: 'NetEase Cloudアカウントでログイン',
tokenTip: '有効なNetEase Cloud MusicのCookieを入力してログイン',
uidTip: 'ユーザーIDを入力してクイックログイン',
placeholder: {
phone: '電話番号',
password: 'パスワード',
cookie: 'NetEase Cloud MusicのCookietokenを入力してください',
uid: 'ユーザーIDUIDを入力してください'
},
button: {
login: 'ログイン',
switchToQr: 'QRコードログイン',
switchToPhone: '電話番号ログイン',
switchToToken: 'Cookieログインを使用',
switchToUid: 'UIDログイン',
backToQr: 'QRコードログインに戻る',
cookieLogin: 'Cookieログイン',
autoGetCookie: 'Cookie自動取得',
refresh: 'クリックしてリフレッシュ',
refreshing: 'リフレッシュ中...',
refreshQr: 'QRコードをリフレッシュ'
},
message: {
loginSuccess: 'ログイン成功',
tokenLoginSuccess: 'Cookieログイン成功',
uidLoginSuccess: 'UIDログイン成功',
loadError: 'ログイン情報の読み込み中にエラーが発生しました',
qrCheckError: 'QRコードの状態確認中にエラーが発生しました',
tokenRequired: 'Cookieを入力してください',
tokenInvalid: 'Cookieが無効です。確認して再試行してください',
uidRequired: 'ユーザーIDを入力してください',
uidInvalid: 'ユーザーIDが無効またはユーザーが存在しません',
uidLoginFailed: 'UIDログインに失敗しました。ユーザーIDが正しいか確認してください',
autoGetCookieSuccess: 'Cookie自動取得成功',
autoGetCookieFailed: 'Cookie自動取得失敗',
autoGetCookieTip:
'NetEase Cloud Musicのログインページを開きます。ログイン完了後、ウィンドウを閉じてください'
},
qrTitle: 'NetEase Cloud Music QRコードログイン',
uidWarning:
'注意UIDログインはユーザーの公開情報を表示するためのみ使用でき、ログイン権限が必要な機能にはアクセスできません。'
};

View File

@@ -0,0 +1,137 @@
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: '歌詞がありません。お楽しみください',
noAutoScroll: '本歌詞は自動スクロールをサポートしていません'
},
reparse: {
title: '解析音源を選択',
desc: '音源をクリックして直接解析します。次回この楽曲を再生する際は選択した音源を使用します',
success: '再解析成功',
failed: '再解析失敗',
warning: '音源を選択してください',
bilibiliNotSupported: 'Bilibili動画は再解析をサポートしていません',
processing: '解析中...',
clear: 'カスタム音源をクリア',
customApiFailed: 'カスタムAPIの解析に失敗しました。内蔵音源を試しています...',
customApiError: 'カスタムAPIのリクエストでエラーが発生しました。内蔵音源を試しています...'
},
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: 'その他の設定',
intelligenceMode: {
title: 'インテリジェンスモード',
needCookieLogin: 'Cookie方式でログインしてからインテリジェンスモードを使用してください',
noFavoritePlaylist: '「お気に入りの音楽」プレイリストが見つかりません',
noLikedSongs: 'まだ「いいね」した楽曲がありません',
loading: 'インテリジェンスモードを読み込み中',
success: '{count} 曲を読み込みました',
failed: 'インテリジェンスモードのリスト取得に失敗しました',
error: 'インテリジェンスモードの再生でエラーが発生しました'
}
},
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:
'これによりプレイリスト内のすべての楽曲がクリアされ、現在の再生が停止されます。続行しますか?'
}
};

View File

@@ -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'
}
};

View File

@@ -0,0 +1,363 @@
export default {
theme: 'テーマ',
language: '言語',
regard: 'について',
logout: 'ログアウト',
sections: {
basic: '基本設定',
playback: '再生設定',
application: 'アプリケーション設定',
network: 'ネットワーク設定',
system: 'システム管理',
donation: '寄付サポート',
regard: 'について'
},
basic: {
themeMode: 'テーマモード',
themeModeDesc: 'ライト/ダークテーマの切り替え',
autoTheme: 'システムに従う',
manualTheme: '手動切り替え',
language: '言語設定',
languageDesc: '表示言語を切り替え',
tokenManagement: 'Cookie管理',
tokenManagementDesc: 'NetEase Cloud MusicログインCookieを管理',
tokenStatus: '現在のCookieステータス',
tokenSet: '設定済み',
tokenNotSet: '未設定',
setToken: 'Cookieを設定',
modifyToken: 'Cookieを変更',
clearToken: 'Cookieをクリア',
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: '가나다라마 바사아자차 카타파하'
},
gpuAcceleration: 'GPUアクセラレーション',
gpuAccelerationDesc:
'ハードウェアアクセラレーションを有効または無効にします。レンダリングパフォーマンスを向上させますが、GPU負荷が増える可能性があります',
gpuAccelerationRestart: 'GPUアクセラレーション設定の変更はアプリの再起動後に有効になります',
gpuAccelerationChangeSuccess:
'GPUアクセラレーション設定を更新しました。アプリの再起動後に有効になります',
gpuAccelerationChangeError: 'GPUアクセラレーション設定の更新に失敗しました',
tabletMode: 'タブレットモード',
tabletModeDesc:
'タブレットモードを有効にすると、モバイルデバイスでPCスタイルのインターフェースを使用できます'
},
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のステータスバーに音楽コントロール機能を表示できます再起動後に有効',
fallbackParser: '代替解析サービス (GD音楽台)',
fallbackParserDesc:
'「GD音楽台」にチェックが入っていて、通常の音源で再生できない場合、このサービスが使用されます。',
parserGD: 'GD 音楽台 (内蔵)',
parserCustom: 'カスタム API',
sourceLabels: {
migu: 'Migu',
kugou: 'Kugou',
pyncmd: 'NetEase (内蔵)',
bilibili: 'Bilibili',
gdmusic: 'GD 音楽台',
custom: 'カスタム API'
},
customApi: {
sectionTitle: 'カスタム API 設定',
enableHint:
'カスタム API を有効にするには、まずカスタム API をインポートする必要があります。',
importConfig: 'JSON設定をインポート',
currentSource: '現在の音源',
notImported: 'カスタム音源はまだインポートされていません。',
importSuccess: '音源のインポートに成功しました: {name}',
importFailed: 'インポートに失敗しました: {message}'
}
},
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: 'ミニ再生バーを非表示',
showMiniPlayBar: 'ミニ再生バーを表示',
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: 'この設定はモバイルでのみ利用可能です'
},
translationEngine: '歌詞翻訳エンジン',
translationEngineOptions: {
none: 'オフ',
opencc: 'OpenCC 繁体字化'
},
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: 'リモートコントロールアクセスアドレス:'
},
cookie: {
title: 'Cookie設定',
description: 'NetEase Cloud MusicのCookieを入力してください',
placeholder: '完全なCookieを貼り付けてください...',
help: {
format: 'Cookieは通常「MUSIC_U=」で始まります',
source: 'ブラウザの開発者ツールのネットワークリクエストから取得できます',
storage: 'Cookie設定後、自動的にローカルストレージに保存されます'
},
action: {
save: 'Cookieを保存',
paste: '貼り付け',
clear: 'クリア'
},
validation: {
required: 'Cookieを入力してください',
format: 'Cookie形式が正しくない可能性があります。MUSIC_Uが含まれているか確認してください'
},
message: {
saveSuccess: 'Cookieの保存に成功しました',
saveError: 'Cookieの保存に失敗しました',
pasteSuccess: '貼り付けに成功しました',
pasteError: '貼り付けに失敗しました。手動でコピーしてください'
},
info: {
length: '現在の長さ:{length} 文字'
}
}
};

View File

@@ -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: 'キャンセル'
}
}
};

View File

@@ -0,0 +1,53 @@
export default {
profile: {
followers: 'フォロワー',
following: 'フォロー中',
level: 'レベル'
},
playlist: {
created: '作成したプレイリスト',
mine: '私が作成した',
trackCount: '{count}曲',
playCount: '{count}回再生'
},
tabs: {
created: '作成',
favorite: 'お気に入り',
album: 'アルバム'
},
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: '削除失敗'
}
};

View File

@@ -0,0 +1,5 @@
export default {
hotSongs: '인기 곡',
albums: '앨범',
description: '아티스트 소개'
};

View File

@@ -0,0 +1,51 @@
export default {
player: {
loading: '오디오 로딩 중...',
retry: '다시 시도',
playNow: '지금 재생',
loadingTitle: '로딩 중...',
totalDuration: '총 재생시간: {duration}',
partsList: '파트 목록 ({count}화)',
playStarted: '재생이 시작되었습니다',
switchingPart: '파트 전환 중: {part}',
preloadingNext: '다음 파트 미리 로딩 중: {part}',
playingCurrent: '현재 선택된 파트 재생 중: {name}',
num: '만',
errors: {
invalidVideoId: '유효하지 않은 비디오 ID',
loadVideoDetailFailed: '비디오 세부정보 로드 실패',
loadPartInfoFailed: '비디오 파트 정보를 로드할 수 없습니다',
loadAudioUrlFailed: '오디오 재생 URL 가져오기 실패',
videoDetailNotLoaded: '비디오 세부정보가 로드되지 않았습니다',
missingParams: '필수 매개변수가 누락되었습니다',
noAvailableAudioUrl: '사용 가능한 오디오 URL을 찾을 수 없습니다',
loadPartAudioFailed: '파트 오디오 URL 로드 실패',
audioListEmpty: '오디오 목록이 비어있습니다. 다시 시도해주세요',
currentPartNotFound: '현재 파트의 오디오를 찾을 수 없습니다',
audioUrlFailed: '오디오 URL 가져오기 실패',
playFailed: '재생 실패. 다시 시도해주세요',
getAudioUrlFailed: '오디오 URL 가져오기 실패. 다시 시도해주세요',
audioNotFound: '해당 오디오를 찾을 수 없습니다. 다시 시도해주세요',
preloadFailed: '다음 파트 미리 로딩 실패',
switchPartFailed: '파트 전환 시 오디오 URL 로드 실패'
},
console: {
loadingDetail: 'Bilibili 비디오 세부정보 로딩 중',
detailData: 'Bilibili 비디오 세부정보 데이터',
multipleParts: '비디오에 여러 파트가 있습니다. 총 {count}개',
noPartsData: '비디오에 파트가 없거나 파트 데이터가 비어있습니다',
loadingAudioSource: '오디오 소스 로딩 중',
generatedAudioList: '오디오 목록을 생성했습니다. 총 {count}개',
getDashAudioUrl: 'dash 오디오 URL을 가져왔습니다',
getDurlAudioUrl: 'durl 오디오 URL을 가져왔습니다',
loadingPartAudio: '파트 오디오 URL 로딩 중: {part}, cid: {cid}',
loadPartAudioFailed: '파트 오디오 URL 로드 실패: {part}',
switchToPart: '파트로 전환 중: {part}',
audioNotFoundInList: '해당 오디오 항목을 찾을 수 없습니다',
preparingToPlay: '현재 선택된 파트 재생 준비 중: {name}',
preloadingNextPart: '다음 파트 미리 로딩 중: {part}',
playingSelectedPart: '현재 선택된 파트 재생 중: {name}, 오디오 URL: {url}',
preloadNextFailed: '다음 파트 미리 로딩 실패'
}
}
};

View File

@@ -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: '즐겨찾기'
}
};

192
src/i18n/lang/ko-KR/comp.ts Normal file
View File

@@ -0,0 +1,192 @@
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: '더 보기',
groupText: '微信公众号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: '검색'
};

View File

@@ -0,0 +1,9 @@
export default {
description:
'귀하의 기부는 서버 유지보수, 도메인 갱신 등을 포함한 개발 및 유지보수 작업을 지원하는 데 사용됩니다.',
message: '메시지를 남길 때 이메일이나 GitHub 이름을 남겨주세요.',
refresh: '목록 새로고침',
toDonateList: '커피 한 잔 사주세요',
noMessage: '메시지가 없습니다',
title: '기부 목록'
};

View File

@@ -0,0 +1,88 @@
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: '앨범명'
}
}
};

View File

@@ -0,0 +1,13 @@
export default {
title: '내 수집',
count: '총 {count}곡',
batchDownload: '일괄 다운로드',
download: '다운로드 ({count})',
emptyTip: '아직 수집한 곡이 없습니다',
downloadSuccess: '다운로드 완료',
downloadFailed: '다운로드 실패',
downloading: '다운로드 중입니다. 잠시만 기다려주세요...',
selectSongsFirst: '먼저 다운로드할 곡을 선택해주세요',
descending: '내림차순',
ascending: '오름차순'
};

View File

@@ -0,0 +1,37 @@
export default {
title: '재생 기록',
heatmapTitle: '히트맵',
playCount: '{count}',
getHistoryFailed: '기록 가져오기 실패',
tabs: {
all: '전체 기록',
local: '로컬 기록',
cloud: '클라우드 기록'
},
getCloudRecordFailed: '클라우드 기록 가져오기 실패',
needLogin: 'cookie를 사용하여 로그인하여 클라우드 기록을 볼 수 있습니다',
merging: '기록 병합 중...',
heatmap: {
title: '재생 히트맵',
loading: '데이터 로딩 중...',
unit: '회 재생',
footerText: '마우스를 올려서 자세히 보기',
playCount: '{count}회 재생',
topSongs: '오늘의 인기곡',
times: '회',
totalPlays: '총 재생 횟수',
activeDays: '활동 일수',
noData: '재생 기록이 없습니다',
colorTheme: '색상 테마',
colors: {
green: '그린',
blue: '블루',
orange: '오렌지',
purple: '퍼플',
red: '레드'
},
mostPlayedSong: '가장 많이 재생한 노래',
mostActiveDay: '가장 활발한 날',
latestNightSong: '가장 늘게 재생한 노래'
}
};

View File

@@ -0,0 +1,50 @@
export default {
title: {
qr: 'QR코드 로그인',
phone: '휴대폰 번호 로그인',
cookie: 'Cookie 로그인',
uid: 'UID 로그인'
},
qrTip: '넷이즈 클라우드 뮤직 앱으로 QR코드를 스캔하여 로그인',
phoneTip: '넷이즈 클라우드 계정으로 로그인',
tokenTip: '유효한 넷이즈 클라우드 뮤직 Cookie을 입력하여 로그인',
uidTip: '사용자 ID를 입력하여 빠른 로그인',
placeholder: {
phone: '휴대폰 번호',
password: '비밀번호',
cookie: '넷이즈 클라우드 뮤직 Cookie(token)을 입력하세요',
uid: '사용자 ID(UID)를 입력하세요'
},
button: {
login: '로그인',
switchToQr: 'QR코드 로그인',
switchToPhone: '휴대폰 번호 로그인',
switchToToken: 'Cookie 로그인 사용',
switchToUid: 'UID 로그인',
backToQr: 'QR코드 로그인으로 돌아가기',
cookieLogin: 'Cookie 로그인',
autoGetCookie: 'Cookie 자동 가져오기',
refresh: '새로고침',
refreshing: '새로고침 중...',
refreshQr: 'QR코드 새로고침'
},
message: {
loginSuccess: '로그인 성공',
tokenLoginSuccess: 'Cookie 로그인 성공',
uidLoginSuccess: 'UID 로그인 성공',
loadError: '로그인 정보 로드 중 오류 발생',
qrCheckError: 'QR코드 상태 확인 중 오류 발생',
tokenRequired: 'Cookie을 입력하세요',
tokenInvalid: 'Cookie이 유효하지 않습니다. 확인 후 다시 시도하세요',
uidRequired: '사용자 ID를 입력하세요',
uidInvalid: '사용자 ID가 유효하지 않거나 사용자가 존재하지 않습니다',
uidLoginFailed: 'UID 로그인에 실패했습니다. 사용자 ID가 올바른지 확인하세요',
autoGetCookieSuccess: 'Cookie 자동 가져오기 성공',
autoGetCookieFailed: 'Cookie 자동 가져오기 실패',
autoGetCookieTip:
'넷이즈 클라우드 뮤직 로그인 페이지를 열겠습니다. 로그인 완료 후 창을 닫아주세요'
},
qrTitle: '넷이즈 클라우드 뮤직 QR코드 로그인',
uidWarning:
'주의: UID 로그인은 사용자 공개 정보를 확인하는 데만 사용할 수 있으며, 로그인 권한이 필요한 기능에 액세스할 수 없습니다.'
};

View File

@@ -0,0 +1,135 @@
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: '가사가 없습니다. 음악을 감상해주세요',
noAutoScroll: '본 가사는 자동 스크롤을 지원하지 않습니다'
},
reparse: {
title: '음원 선택',
desc: '음원을 클릭하여 직접 분석하세요. 다음에 이 곡을 재생할 때 선택한 음원을 사용합니다',
success: '재분석 성공',
failed: '재분석 실패',
warning: '음원을 선택해주세요',
bilibiliNotSupported: 'B站 비디오는 재분석을 지원하지 않습니다',
processing: '분석 중...',
clear: '사용자 정의 음원 지우기',
customApiFailed: '사용자 정의 API 분석 실패, 기본 음원을 시도합니다...',
customApiError: '사용자 정의 API 요청 오류, 기본 음원을 시도합니다...'
},
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: '고급 설정',
intelligenceMode: {
title: '인텔리전스 모드',
needCookieLogin: '쿠키 방식으로 로그인한 후 인텔리전스 모드를 사용할 수 있습니다',
noFavoritePlaylist: '내가 좋아하는 음악 재생목록을 찾을 수 없습니다',
noLikedSongs: '아직 좋아한 노래가 없습니다',
loading: '인텔리전스 모드를 불러오는 중',
success: '총 {count}곡을 불러왔습니다',
failed: '인텔리전스 모드 목록을 가져오는 데 실패했습니다',
error: '인텔리전스 모드 재생 오류'
}
},
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: '재생 목록의 모든 곡을 삭제하고 현재 재생을 중지합니다. 계속하시겠습니까?'
}
};

View File

@@ -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站'
}
};

View File

@@ -0,0 +1,364 @@
export default {
theme: '테마',
language: '언어',
regard: '정보',
logout: '로그아웃',
sections: {
basic: '기본 설정',
playback: '재생 설정',
application: '애플리케이션 설정',
network: '네트워크 설정',
system: '시스템 관리',
donation: '후원 지원',
regard: '정보'
},
basic: {
themeMode: '테마 모드',
themeModeDesc: '낮/밤 테마 전환',
autoTheme: '시스템 따라가기',
manualTheme: '수동 전환',
language: '언어 설정',
languageDesc: '표시 언어 전환',
tokenManagement: 'Cookie 관리',
tokenManagementDesc: '넷이즈 클라우드 뮤직 로그인 Cookie 관리',
tokenStatus: '현재 Cookie 상태',
tokenSet: '설정됨',
tokenNotSet: '설정되지 않음',
setToken: 'Cookie 설정',
modifyToken: 'Cookie 수정',
clearToken: 'Cookie 지우기',
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: '가나다라마 바사아자차 카타파하'
},
gpuAcceleration: 'GPU 가속',
gpuAccelerationDesc:
'GPU 가속을 사용하면 애니메이션이 빠르게 재생되고 애니메이션이 느리게 재생되는 것보다 느릴 수 있습니다.',
gpuAccelerationRestart: 'GPU 가속 설정을 변경하면 애플리케이션을 다시 시작해야 합니다',
gpuAccelerationChangeSuccess:
'GPU 가속 설정이 업데이트되었습니다. 애플리케이션을 다시 시작하여 적용하십시오',
gpuAccelerationChangeError: 'GPU 가속 설정 업데이트에 실패했습니다',
tabletMode: '태블릿 모드',
tabletModeDesc:
'태블릿 모드를 사용하면 모바일 기기에서 PC 스타일의 인터페이스를 사용할 수 있습니다'
},
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 상태바에 음악 제어 기능을 표시할 수 있습니다 (재시작 후 적용)',
fallbackParser: '대체 분석 서비스 (GD Music)',
fallbackParserDesc:
'"GD Music"을 선택하고 일반 음원을 사용할 수 없을 때 이 서비스를 사용합니다.',
parserGD: 'GD Music (내장)',
parserCustom: '사용자 지정 API',
// 음원 라벨
sourceLabels: {
migu: 'Migu',
kugou: 'Kugou',
pyncmd: 'NetEase (내장)',
bilibili: 'Bilibili',
gdmusic: 'GD Music',
custom: '사용자 지정 API'
},
customApi: {
sectionTitle: '사용자 지정 API 설정',
importConfig: 'JSON 설정 가져오기',
currentSource: '현재 음원',
notImported: '아직 사용자 지정 음원을 가져오지 않았습니다.',
importSuccess: '음원 가져오기 성공: {name}',
importFailed: '가져오기 실패: {message}',
enableHint: '사용하려면 먼저 JSON 구성 파일을 가져오세요'
}
},
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: '미니 재생바 숨기기',
showMiniPlayBar: '미니 재생바 표시',
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: '이 설정은 모바일에서만 사용 가능합니다'
},
translationEngine: '가사 번역 엔진',
translationEngineOptions: {
none: '닫기',
opencc: 'OpenCC 중국어 번체'
},
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: '원격 제어 액세스 주소:'
},
cookie: {
title: 'Cookie 설정',
description: '넷이즈 클라우드 뮤직의 Cookie를 입력하세요:',
placeholder: '완전한 Cookie를 붙여넣으세요...',
help: {
format: 'Cookie는 일반적으로 "MUSIC_U="로 시작합니다',
source: '브라우저 개발자 도구의 네트워크 요청에서 얻을 수 있습니다',
storage: 'Cookie 설정 후 자동으로 로컬 저장소에 저장됩니다'
},
action: {
save: 'Cookie 저장',
paste: '붙여넣기',
clear: '지우기'
},
validation: {
required: 'Cookie를 입력하세요',
format: 'Cookie 형식이 올바르지 않을 수 있습니다. MUSIC_U가 포함되어 있는지 확인하세요'
},
message: {
saveSuccess: 'Cookie 저장 성공',
saveError: 'Cookie 저장 실패',
pasteSuccess: '붙여넣기 성공',
pasteError: '붙여넣기 실패, 수동으로 복사하세요'
},
info: {
length: '현재 길이: {length} 문자'
}
}
};

View File

@@ -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: '취소'
}
}
};

View File

@@ -0,0 +1,53 @@
export default {
profile: {
followers: '팔로워',
following: '팔로잉',
level: '레벨'
},
playlist: {
created: '생성한 플레이리스트',
mine: '내가 만든',
trackCount: '{count}곡',
playCount: '{count}회 재생'
},
tabs: {
created: '생성',
favorite: '즐겨찾기',
album: '앨범'
},
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: '삭제 실패'
}
};

View File

@@ -0,0 +1,5 @@
export default {
hotSongs: '热门歌曲',
albums: '专辑',
description: '艺人介绍'
};

View File

@@ -0,0 +1,51 @@
export default {
player: {
loading: '听书加载中...',
retry: '重试',
playNow: '立即播放',
loadingTitle: '加载中...',
totalDuration: '总时长: {duration}',
partsList: '分P列表 (共{count}集)',
playStarted: '已开始播放',
switchingPart: '切换到分P: {part}',
preloadingNext: '预加载下一个分P: {part}',
playingCurrent: '播放当前选中的分P: {name}',
num: '万',
errors: {
invalidVideoId: '视频ID无效',
loadVideoDetailFailed: '获取视频详情失败',
loadPartInfoFailed: '无法加载视频分P信息',
loadAudioUrlFailed: '获取音频播放地址失败',
videoDetailNotLoaded: '视频详情未加载',
missingParams: '缺少必要参数',
noAvailableAudioUrl: '未找到可用的音频地址',
loadPartAudioFailed: '加载分P音频URL失败',
audioListEmpty: '音频列表为空,请重试',
currentPartNotFound: '未找到当前分P的音频',
audioUrlFailed: '获取音频URL失败',
playFailed: '播放失败,请重试',
getAudioUrlFailed: '获取音频地址失败,请重试',
audioNotFound: '未找到对应的音频,请重试',
preloadFailed: '预加载下一个分P失败',
switchPartFailed: '切换分P时加载音频URL失败'
},
console: {
loadingDetail: '加载B站视频详情',
detailData: 'B站视频详情数据',
multipleParts: '视频有多个分P共{count}个',
noPartsData: '视频无分P或分P数据为空',
loadingAudioSource: '加载音频源',
generatedAudioList: '已生成音频列表,共{count}首',
getDashAudioUrl: '获取到dash音频URL',
getDurlAudioUrl: '获取到durl音频URL',
loadingPartAudio: '加载分P音频URL: {part}, cid: {cid}',
loadPartAudioFailed: '加载分P音频URL失败: {part}',
switchToPart: '切换到分P: {part}',
audioNotFoundInList: '未找到对应的音频项',
preparingToPlay: '准备播放当前选中的分P: {name}',
preloadingNextPart: '预加载下一个分P: {part}',
playingSelectedPart: '播放当前选中的分P: {name}音频URL: {url}',
preloadNextFailed: '预加载下一个分P失败'
}
}
};

View File

@@ -0,0 +1,58 @@
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: '语言',
today: '今天',
yesterday: '昨天',
tray: {
show: '显示',
quit: '退出',
playPause: '播放/暂停',
prev: '上一首',
next: '下一首',
pause: '暂停',
play: '播放',
favorite: '收藏'
}
};

194
src/i18n/lang/zh-CN/comp.ts Normal file
View File

@@ -0,0 +1,194 @@
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: '支付宝收款码',
wechatQR: '微信收款码',
coffeeDesc: '一杯咖啡,一份支持',
coffeeDescLinkText: '查看更多',
groupText: '微信公众号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: '歌曲已存在于播放列表中',
historyRecommend: '历史日推',
fetchDatesFailed: '获取日期列表失败',
fetchSongsFailed: '获取歌曲列表失败',
noSongs: '暂无歌曲'
},
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: '搜索'
};

View File

@@ -0,0 +1,8 @@
export default {
description: '您的捐赠将用于支持开发和维护工作,包括但不限于服务器维护、域名续费等。',
message: '留言时可留下您的邮箱或 github名称。',
refresh: '刷新列表',
toDonateList: '请我喝咖啡',
noMessage: '暂无留言',
title: '捐赠列表'
};

View File

@@ -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: '专辑名'
}
}
};

View File

@@ -0,0 +1,13 @@
export default {
title: '我的收藏',
count: '共 {count} 首',
batchDownload: '批量下载',
download: '下载 ({count})',
emptyTip: '还没有收藏歌曲',
downloadSuccess: '下载完成',
downloadFailed: '下载失败',
downloading: '正在下载中,请稍候...',
selectSongsFirst: '请先选择要下载的歌曲',
descending: '降',
ascending: '升'
};

View File

@@ -0,0 +1,44 @@
export default {
title: '播放历史',
heatmapTitle: '热力图',
playCount: '{count}',
getHistoryFailed: '获取历史记录失败',
categoryTabs: {
songs: '歌曲',
playlists: '歌单',
albums: '专辑'
},
tabs: {
all: '全部记录',
local: '本地记录',
cloud: '云端记录'
},
getCloudRecordFailed: '获取云端记录失败',
needLogin: '请使用cookie登录以查看云端记录',
merging: '正在合并记录...',
noDescription: '暂无描述',
noData: '暂无记录',
heatmap: {
title: '播放热力图',
loading: '正在加载数据...',
unit: '次播放',
footerText: '鼠标悬停查看详细信息',
playCount: '播放 {count} 次',
topSongs: '当天热门歌曲',
times: '次',
totalPlays: '总播放次数',
activeDays: '活跃天数',
noData: '暂无播放记录',
colorTheme: '配色方案',
colors: {
green: '绿色',
blue: '蓝色',
orange: '橙色',
purple: '紫色',
red: '红色'
},
mostPlayedSong: '播放最多的歌曲',
mostActiveDay: '最活跃的一天',
latestNightSong: '最晚播放的歌曲'
}
};

View File

@@ -0,0 +1,62 @@
export default {
title: {
qr: '扫码登录',
phone: '手机号登录',
cookie: 'Cookie登录',
uid: 'UID登录'
},
qrTip: '使用网易云APP扫码登录',
phoneTip: '使用网易云账号登录',
tokenTip: '输入有效的网易云音乐Cookie即可登录',
uidTip: '输入用户ID快速登录',
placeholder: {
phone: '手机号',
password: '密码',
cookie: '请输入网易云音乐Cookietoken',
uid: '请输入用户IDUID'
},
button: {
login: '登录',
switchToQr: '扫码登录',
switchToPhone: '手机号登录',
switchToToken: '使用Cookie登录',
switchToUid: 'UID登录',
backToQr: '返回二维码登录',
cookieLogin: 'Cookie登录',
autoGetCookie: '自动获取Cookie',
refresh: '点击刷新',
refreshing: '刷新中...',
refreshQr: '刷新二维码'
},
message: {
loginSuccess: '登录成功',
loginFailed: '登录失败',
tokenLoginSuccess: 'Cookie登录成功',
uidLoginSuccess: 'UID登录成功',
loadError: '加载登录信息时出错',
qrCheckError: '检查二维码状态时出错',
tokenRequired: '请输入Cookie',
tokenInvalid: 'Cookie无效请检查后重试',
uidRequired: '请输入用户ID',
uidInvalid: '用户ID无效或用户不存在',
uidLoginFailed: 'UID登录失败请检查用户ID是否正确',
phoneRequired: '请输入手机号',
passwordRequired: '请输入密码',
phoneLoginFailed: '手机号登录失败,请检查手机号和密码是否正确',
autoGetCookieSuccess: '自动获取Cookie成功',
autoGetCookieFailed: '自动获取Cookie失败',
autoGetCookieTip: '将打开网易云音乐登录页面,请完成登录后关闭窗口',
qrCheckFailed: '检查二维码状态失败,请刷新重试',
qrLoading: '正在加载二维码...',
qrExpired: '二维码已过期,请点击刷新',
qrExpiredShort: '二维码已过期',
qrExpiredWarning: '二维码已过期,请点击刷新获取新的二维码',
qrScanned: '已扫码,请在手机上确认登录',
qrScannedShort: '已扫码',
qrScannedInfo: '已扫码,请在手机上确认登录',
qrConfirmed: '登录成功,正在跳转...',
qrGenerating: '正在生成二维码...'
},
qrTitle: '扫码登录网易云音乐',
uidWarning: '注意UID登录仅用于查看用户公开信息无法访问需要登录权限的功能'
};

View File

@@ -0,0 +1,136 @@
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: '暂无歌词, 请欣赏',
noAutoScroll: '本歌词不支持自动滚动'
},
reparse: {
title: '选择解析音源',
desc: '点击音源直接进行解析,下次播放此歌曲时将使用所选音源',
success: '重新解析成功',
failed: '重新解析失败',
warning: '请选择一个音源',
bilibiliNotSupported: 'B站视频不支持重新解析',
processing: '解析中...',
clear: '清除自定义音源',
customApiFailed: '自定义API解析失败正在尝试使用内置音源...',
customApiError: '自定义API请求出错正在尝试使用内置音源...'
},
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: '更多设置',
intelligenceMode: {
title: '心动模式',
needCookieLogin: '请使用 Cookie 方式登录后使用心动模式',
noFavoritePlaylist: '未找到我喜欢的音乐歌单',
noLikedSongs: '您还没有喜欢的歌曲',
loading: '正在加载心动模式',
success: '已加载 {count} 首歌曲',
failed: '获取心动模式列表失败',
error: '心动模式播放出错'
}
},
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: '这将清空所有播放列表中的歌曲并停止当前播放。是否继续?'
}
};

View File

@@ -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站'
}
};

View File

@@ -0,0 +1,361 @@
export default {
theme: '主题',
language: '语言',
regard: '关于',
logout: '退出登录',
sections: {
basic: '基础设置',
playback: '播放设置',
application: '应用设置',
network: '网络设置',
system: '系统管理',
donation: '捐赠支持',
regard: '关于'
},
basic: {
themeMode: '主题模式',
themeModeDesc: '切换日间/夜间主题',
autoTheme: '跟随系统',
manualTheme: '手动切换',
language: '语言设置',
languageDesc: '切换显示语言',
tokenManagement: 'Cookie管理',
tokenManagementDesc: '管理网易云音乐登录Cookie',
tokenStatus: '当前Cookie状态',
tokenSet: '已设置',
tokenNotSet: '未设置',
setToken: '设置Cookie',
modifyToken: '修改Cookie',
clearToken: '清除Cookie',
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: '가나다라마 바사아자차 카타파하'
},
gpuAcceleration: 'GPU加速',
gpuAccelerationDesc: '启用或禁用硬件加速可以提高渲染性能但可能会增加GPU负载',
gpuAccelerationRestart: '更改GPU加速设置需要重启应用后生效',
gpuAccelerationChangeSuccess: 'GPU加速设置已更新重启应用后生效',
gpuAccelerationChangeError: 'GPU加速设置更新失败',
tabletMode: '平板模式',
tabletModeDesc: '启用后将在移动设备上使用PC样式界面适合平板等大屏设备'
},
playback: {
quality: '音质设置',
qualityDesc: '选择音乐播放音质网易云VIP',
qualityOptions: {
standard: '标准',
higher: '较高',
exhigh: '极高',
lossless: '无损',
hires: 'Hi-Res',
jyeffect: '高清环绕声',
sky: '沉浸环绕声',
dolby: '杜比全景声',
jymaster: '超清母带'
},
musicSources: '音源设置',
musicSourcesDesc: '选择音乐解析使用的音源平台',
musicSourcesWarning: '至少需要选择一个音源平台',
musicUnblockEnable: '启用音乐解析',
musicUnblockEnableDesc: '开启后将尝试解析无法播放的音乐',
configureMusicSources: '配置音源',
selectedMusicSources: '已选音源:',
noMusicSources: '未选择音源',
gdmusicInfo: 'GD音乐台可自动解析多个平台音源自动选择最佳结果',
autoPlay: '自动播放',
autoPlayDesc: '重新打开应用时是否自动继续播放',
showStatusBar: '是否显示状态栏控制功能',
showStatusBarContent: '可以在您的mac状态栏显示音乐控制功能(重启后生效)',
fallbackParser: 'GD音乐台(music.gdstudio.xyz)设置',
fallbackParserDesc:
'GD音乐台将自动尝试多个音乐平台进行解析无需额外配置。优先级高于其他解析方式但是请求可能较慢。感谢music.gdstudio.xyz\n',
parserGD: 'GD 音乐台 (内置)',
parserCustom: '自定义 API',
// 音源标签
sourceLabels: {
migu: '咪咕音乐',
kugou: '酷狗音乐',
pyncmd: '网易云(内置)',
bilibili: 'Bilibili',
gdmusic: 'GD音乐台',
custom: '自定义 API'
},
// 自定义API相关的提示
customApi: {
sectionTitle: '自定义 API 设置',
importConfig: '导入 JSON 配置',
currentSource: '当前音源',
notImported: '尚未导入自定义音源。',
importSuccess: '成功导入音源: {name}',
importFailed: '导入失败: {message}',
enableHint: '请先导入 JSON 配置文件才能启用'
}
},
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 点个star🌟呗',
messages: {
checkError: '检查更新失败,请稍后重试'
}
},
validation: {
selectProxyProtocol: '请选择代理协议',
proxyHost: '请输入代理地址',
portNumber: '请输入有效的端口号(1-65535)'
},
lyricSettings: {
title: '歌词设置',
tabs: {
display: '显示',
interface: '界面',
typography: '文字',
mobile: '移动端'
},
pureMode: '纯净模式',
hideCover: '隐藏封面',
centerDisplay: '居中显示',
showTranslation: '显示翻译',
hideLyrics: '隐藏歌词',
hidePlayBar: '隐藏播放栏',
hideMiniPlayBar: '隐藏迷你播放栏',
showMiniPlayBar: '显示迷你播放栏',
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: '此设置仅在移动端可用'
},
translationEngine: '歌詞翻譯引擎',
translationEngineOptions: {
none: '关闭',
opencc: 'OpenCC 繁化'
},
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: '远程控制访问地址:'
},
cookie: {
title: 'Cookie设置',
description: '请输入网易云音乐的Cookie',
placeholder: '请粘贴完整的Cookie...',
help: {
format: 'Cookie通常以 "MUSIC_U=" 开头',
source: '可以从浏览器开发者工具的网络请求中获取',
storage: 'Cookie设置后将自动保存到本地存储'
},
action: {
save: '保存Cookie',
paste: '粘贴',
clear: '清空'
},
validation: {
required: '请输入Cookie',
format: 'Cookie格式可能不正确请检查是否包含MUSIC_U'
},
message: {
saveSuccess: 'Cookie保存成功',
saveError: 'Cookie保存失败',
pasteSuccess: '粘贴成功',
pasteError: '粘贴失败,请手动复制'
},
info: {
length: '当前长度:{length} 字符'
}
}
};

View File

@@ -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: '取消'
}
}
};

View File

@@ -0,0 +1,53 @@
export default {
profile: {
followers: '粉丝',
following: '关注',
level: '等级'
},
playlist: {
created: '创建的歌单',
mine: '我创建的',
trackCount: '{count}首',
playCount: '播放{count}次'
},
tabs: {
created: '创建',
favorite: '收藏',
album: '专辑'
},
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: '删除失败'
}
};

View File

@@ -0,0 +1,5 @@
export default {
hotSongs: '熱門歌曲',
albums: '專輯',
description: '藝人介紹'
};

View File

@@ -0,0 +1,51 @@
export default {
player: {
loading: '聽書載入中...',
retry: '重試',
playNow: '立即播放',
loadingTitle: '載入中...',
totalDuration: '總時長: {duration}',
partsList: '分P列表 (共{count}集)',
playStarted: '已開始播放',
switchingPart: '切換到分P: {part}',
preloadingNext: '預載入下一個分P: {part}',
playingCurrent: '播放當前選中的分P: {name}',
num: '萬',
errors: {
invalidVideoId: '影片ID無效',
loadVideoDetailFailed: '獲取影片詳情失敗',
loadPartInfoFailed: '無法載入影片分P資訊',
loadAudioUrlFailed: '獲取音訊播放地址失敗',
videoDetailNotLoaded: '影片詳情未載入',
missingParams: '缺少必要參數',
noAvailableAudioUrl: '未找到可用的音訊地址',
loadPartAudioFailed: '載入分P音訊URL失敗',
audioListEmpty: '音訊列表為空,請重試',
currentPartNotFound: '未找到當前分P的音訊',
audioUrlFailed: '獲取音訊URL失敗',
playFailed: '播放失敗,請重試',
getAudioUrlFailed: '獲取音訊地址失敗,請重試',
audioNotFound: '未找到對應的音訊,請重試',
preloadFailed: '預載入下一個分P失敗',
switchPartFailed: '切換分P時載入音訊URL失敗'
},
console: {
loadingDetail: '載入B站影片詳情',
detailData: 'B站影片詳情資料',
multipleParts: '影片有多個分P共{count}個',
noPartsData: '影片無分P或分P資料為空',
loadingAudioSource: '載入音訊來源',
generatedAudioList: '已生成音訊列表,共{count}首',
getDashAudioUrl: '獲取到dash音訊URL',
getDurlAudioUrl: '獲取到durl音訊URL',
loadingPartAudio: '載入分P音訊URL: {part}, cid: {cid}',
loadPartAudioFailed: '載入分P音訊URL失敗: {part}',
switchToPart: '切換到分P: {part}',
audioNotFoundInList: '未找到對應的音訊項目',
preparingToPlay: '準備播放當前選中的分P: {name}',
preloadingNextPart: '預載入下一個分P: {part}',
playingSelectedPart: '播放當前選中的分P: {name}音訊URL: {url}',
preloadNextFailed: '預載入下一個分P失敗'
}
}
};

View File

@@ -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: '收藏'
}
};

View File

@@ -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: '支付寶收款碼',
wechatQR: '微信收款碼',
coffeeDesc: '一杯咖啡,一份支持',
coffeeDescLinkText: '查看更多',
groupText: '微信公众号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: '搜尋'
};

View File

@@ -0,0 +1,8 @@
export default {
description: '您的捐贈將用於支持開發和維護工作,包括但不限於伺服器維護、域名續費等。',
message: '留言時可留下您的電子郵件或 github 名稱。',
refresh: '重新整理列表',
toDonateList: '請我喝杯咖啡',
noMessage: '暫無留言',
title: '捐贈列表'
};

View File

@@ -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: '專輯名'
}
}
};

View File

@@ -0,0 +1,13 @@
export default {
title: '我的收藏',
count: '共 {count} 首',
batchDownload: '批次下載',
download: '下載 ({count})',
emptyTip: '還沒有收藏歌曲',
downloadSuccess: '下載完成',
downloadFailed: '下載失敗',
downloading: '正在下載中,請稍候...',
selectSongsFirst: '請先選擇要下載的歌曲',
descending: '降',
ascending: '升'
};

View File

@@ -0,0 +1,44 @@
export default {
title: '播放歷史',
heatmapTitle: '熱力圖',
playCount: '{count}',
getHistoryFailed: '取得歷史記錄失敗',
categoryTabs: {
songs: '歌曲',
playlists: '歌單',
albums: '專輯'
},
tabs: {
all: '全部記錄',
local: '本地記錄',
cloud: '雲端記錄'
},
getCloudRecordFailed: '取得雲端記錄失敗',
needLogin: '請使用cookie登入以查看雲端記錄',
merging: '正在合併記錄...',
noDescription: '暫無描述',
noData: '暫無記錄',
heatmap: {
title: '播放熱力圖',
loading: '正在載入數據...',
unit: '次播放',
footerText: '滑鼠懸停查看詳細信息',
playCount: '播放 {count} 次',
topSongs: '當天熱門歌曲',
times: '次',
totalPlays: '總播放次數',
activeDays: '活躍天數',
noData: '暫無播放記錄',
colorTheme: '配色方案',
colors: {
green: '綠色',
blue: '藍色',
orange: '橙色',
purple: '紫色',
red: '紅色'
},
mostPlayedSong: '播放最多的歌曲',
mostActiveDay: '最活躍的一天',
latestNightSong: '最晚播放的歌曲'
}
};

Some files were not shown because too many files have changed in this diff Show More