Compare commits

...

13 Commits

Author SHA1 Message Date
ikun0014
e7c69385cf
Merge remote-tracking branch 'upstream/dev' into dev 2024-12-21 22:56:09 +08:00
3gf8jv4dv
47d4088c3e
Implement zh-TW language (#659)
- Implementation based on Simplified Chinese text and Taiwanese language
habits
- Review the zh-CN text again during revision of the zh-TW and revise it

Tested in the Android Studio virtual machine.
2024-12-21 00:27:29 +08:00
3gf8jv4dv
0dd4efa74a
Revise zh-CN language (#658)
* Revise zh-CN language

Port from desktop edition
Some are additional revisions

* update

* Update PactModal.tsx

* update

* update

---------

Co-authored-by: lyswhut <lyswhut@qq.com>
2024-12-19 23:59:07 +08:00
lyswhut
e5a6b2fb52 Fix eslint error 2024-12-19 00:15:54 +08:00
3gf8jv4dv
262b574937
Fix i18n keys (#657) 2024-12-19 00:06:18 +08:00
3gf8jv4dv
d74a6976fc
Revise ISSUE_TEMPLATE [skip ci] (#652)
Changes from desktop project.
2024-12-09 19:21:38 +08:00
3gf8jv4dv
582001d27c
Revise repo docs [skip ci] (#651)
Changes from desktop project.
2024-12-09 19:19:40 +08:00
lyswhut
87af10a25e 更新依赖&版本号(1.7.0-beta.6) 2024-12-07 15:39:19 +08:00
lyswhut
5e100f7a72 禁止动态执行代码 2024-12-07 15:25:10 +08:00
lyswhut
4c9db436c5 修复切换列表播放歌曲时可能会出现播放的歌曲不对应的问题 2024-12-05 12:09:52 +08:00
lyswhut
e662fc7400 优化换源歌曲查找 2024-12-03 17:54:14 +08:00
lyswhut
6c24adf098 更新依赖&版本号(1.7.0-beta.5) 2024-12-03 12:50:58 +08:00
lyswhut
55194329c1 修复导出文件到范围存储类型的目录时,扩展名丢失的问题 2024-12-02 12:30:16 +08:00
28 changed files with 1020 additions and 10091 deletions

58
.github/ISSUE_TEMPLATE/bug.yml vendored Normal file
View File

@ -0,0 +1,58 @@
name: 🐞 报告错误
description: 报告一个错误Bug请先查看常见问题及搜索 Issue 列表中有无你要提的问题。
title: "[Bug]: "
body:
- type: checkboxes
id: check-answer
attributes:
label: 解决方案检查
description: 请确保你已完成以下所有操作
options:
- label: 我已阅读 [常见问题](https://lyswhut.github.io/lx-music-doc/mobile/faq),但没有找到解决方案。
required: true
- label: 我已搜索 [Issue 列表](https://github.com/lyswhut/lx-music-mobile/issues?q=is%3Aissue+),但没有发现类似的问题。
required: true
- type: textarea
id: expected-behavior
attributes:
label: 预期行为
description: 对期望发生的事情的清晰简明描述。
validations:
required: true
- type: textarea
id: actual-behavior
attributes:
label: 实际行为
description: 对实际发生的事情的清晰简明描述。
validations:
required: true
- type: input
id: version
attributes:
label: LX Music 版本
description: 你使用什么版本的 LX Music
placeholder: 例如 1.6.0 arm64-v8a
validations:
required: true
- type: input
id: last-known-working-version
attributes:
label: 最后正常的版本
description: 如果有,请在此处填写最后正常的版本。
placeholder: 1.5.0 arm64-v8a
- type: input
id: operating-system-version
attributes:
label: 操作系统版本
description: |
你使用什么版本的操作系统?
在 Android 上,通常单击「系统设置 > 关于」。
各类厂商定制 Android 系统的位置可能有所不同。
placeholder: 例如 Android 15
validations:
required: true
- type: textarea
id: additional-information
attributes:
label: 附加信息
description: 如果你的问题需要进一步解释,或者你所遇到的问题不容易重现,请在此处添加更多信息。(直接把图片/视频拖到编辑框即可添加图片/视频)

40
.github/ISSUE_TEMPLATE/feature.yml vendored Normal file
View File

@ -0,0 +1,40 @@
name: ✨ 功能请求
description: 为这个项目提出一个想法,请先查看常见问题及搜索 Issue 列表中有无你要提的问题。
title: "[Feature]: "
body:
- type: checkboxes
id: check-answer
attributes:
label: 解决方案检查
description: 请确保你已完成以下所有操作。
options:
- label: 我已阅读 [常见问题](https://lyswhut.github.io/lx-music-doc/mobile/faq),但没有找到解决方案。
required: true
- label: 我已搜索 [Issue 列表](https://github.com/lyswhut/lx-music-mobile/issues?q=is%3Aissue+),但没有发现类似的问题。
required: true
- type: textarea
id: problem-description
attributes:
label: 问题描述
description: 请添加清晰简洁的描述,说明你希望通过此功能请求解决的问题。
validations:
required: true
- type: textarea
id: proposed-solution
attributes:
label: 描述你想要的解决方案
description: 简洁明了地描述你要发生的事情。
validations:
required: true
- type: textarea
id: alternatives-considered
attributes:
label: 描述你考虑过的替代方案
description: 对你考虑过的所有替代解决方案或功能的简洁明了的描述。
validations:
required: false
- type: textarea
id: additional-information
attributes:
label: 附加信息
description: 如果你的问题需要进一步解释,或者想要表达其他内容,请在此处添加更多信息。(直接把图片/视频拖到编辑框即可添加图片/视频)

View File

@ -1,20 +1,26 @@
module.exports = {
upgrade: true,
reject: [
'react-native-navigation',
'@types/react',
'@types/react-native',
'message2call',
'react',
'react-native',
'react-native-pager-view',
// 'react-native-pager-view',
'react-native-navigation',
'@react-native/metro-config',
'@react-native/babel-preset',
'@react-native/typescript-config',
],
// target: 'newest',
// filter: [
// 'react-native-navigation',
// ],
// target: 'patch',
// filter: [
// '@types/react',
// '@types/react-native',
// 'react',
// 'react-native',

15
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,15 @@
{
"i18n-ally.localesPaths": [
"src/lang"
],
// "i18n-ally.fullReloadOnChanged": true,
"i18n-ally.keystyle": "nested",
"i18n-ally.displayLanguage": "zh_cn",
"i18n-ally.sourceLanguage": "zh_cn",
"i18n-ally.translate.engines": [
"google-cn",
"google"
],
"i18n-ally.sortKeys": true,
"typescript.tsdk": "packages/shared/eslint/node_modules/typescript/lib",
}

115
FAQ.md Normal file
View File

@ -0,0 +1,115 @@
# lx-music-mobile 常见问题
本文档已迁移至:<https://lyswhut.github.io/lx-music-doc/mobile/faq>
<!-- 在阅读本常见问题后仍然无法解决你的问题请提交issue或者加企鹅群`830125506`反馈(无事勿加,入群先看群公告),反馈时请**注明**已阅读常见问题!
## LX Music中的音乐播放列表机制
1. 默认情况下,播放搜索列表、歌单列表、排行榜列表的歌曲时会自动将该歌曲添加到“我的列表”的试听列表后再播放,手动将歌曲添加到试听列表,再去试听列表找到这首歌点播放是等价的
2. 如果你想要播放多首歌曲,需要使用多选功能(若不知道如何多选请看常见问题)多选后,将歌曲这些歌曲添加到“我的列表”播放,或使用稍后播放功能播放
3. 第2条适用于搜索列表、歌单列表、排行榜列表、我的列表的歌曲
4. 对于歌单详情列表除了可以使用第2条的方式播放外你可以点击详情页上面的播放按钮临时播放当前歌单或点击收藏将当前歌单收藏到“我的列表”后再去播放
5. 对于排行榜详情列表除了可以使用第2条的方式播放外你可以在长按排行榜名字后弹出的菜单中播放或收藏整个排行榜这与第四条的歌单中的播放、与收藏按钮功能一致
6. v0.11.0及之后新增了“双击列表里的歌曲时自动切换到当前列表播放”设置,默认关闭,此功能仅对歌单、排行榜有效
7. 将歌曲添加“稍后播放”后,它们会被放在一个优先级最高的特殊队列中,点击“下一曲”时会消耗该队列中的歌曲,并且无法通过“上一曲”功能播放该队列的上一首歌曲
8. 在切歌时若不是通过“上一曲”、“下一曲”功能切歌(例如直接点击“排行榜列表”、“我的列表”中的歌曲切歌),“稍后播放”队列将会被清空
## 歌曲无法试听与下载
### 所有歌曲都提示 `请求异常😮,可以多试几次,若还是不行就换一首吧。。。`
尝试更换网络,如切换到移动网络,若移动网络还是不行则尝试开关下手机的飞行模式后再试,<br>
若使用家庭网络的话可尝试将光猫断电5分钟左右再通电联网后播放。
### 其他情况
尝试在在浏览器打开这个地址`http://ts.tempmusics.tk`浏览器显示404是正常的如果不是404那就证明所在网络无法访问接口服务器对于此类情况请尝试切换其他网络。
### 通用解决方法
尝试按以下顺序解决:
1. 尝试更新到最新版本
2. 尝试切换其他歌曲(或直接搜索该歌曲),若全部歌曲都无法试听与下载则进行下一步
3. 尝试到 设置-音乐来源 切换到其他接口
4. 尝试切换网络,比如用手机开热点(所有歌曲都提示请求异常时可通过此方法解决,或等一两天后再试)
5. 若还不行请到这个链接查看详情:<https://github.com/lyswhut/lx-music-desktop/issues/5>
6. 若没有在第5条链接中的第一条评论中看到接口无法使用的说明则应该是你网络无法访问接口服务器的问题如果接口有问题我会在那里说明。
想要知道是不是自己网络的问题可以看看`http://ts.tempmusics.tk`能不能在浏览器打开浏览器显示404是正常的如果不是404那就证明所在网络无法访问接口服务器。
若网页无法打开或打来不是404则应该是DNS的问题可以尝试以下办法
1. 将DNS改成自动获取试试
2. 手动把DNS改一下不要用360的DNS可以把DNS改成`223.6.6.6``8.8.8.8`
## 列表多选
长按列表将会进入多选模式。
- 例子一想要选中1-5项进入多选模式后取消所有选中的内容切换到区间点击第一项再点击第五项即可完成选择
- 例子二想要选中1项与第3项进入多选模式后点击第一项再点击第三项即可完成选择
- 例子三:想要选中当前列表的全部内容,进入多选模式后,点击全选即可完成选择(注:由于**在线列表**使用分页加载,全选只会选择目前已加载的内容,若要完整选择整个在线列表的内容则需要往下滑动将列表加载完毕再进行全选)。
注:选完后可用歌曲列表三个点的菜单操作已选的内容
## 无法打开外部歌单
不支持垮源打开歌单,请**确认**你需要打开的歌单平台是否与软件标签所写的**歌单源**对应(不一样的话请通过右上角切换歌单源);<br>
对于分享出来的歌单若打开失败可尝试先在浏览器中打开后再从浏览器地址栏复制URL地址到软件打开<br>
或者如果你知道歌单 id 也可以直接输入歌单 id 打开。<br>
注:网易源的“我喜欢”歌单无法在未登录的情况下打开,所以你需要手动创建一个歌单后将“我喜欢”里的歌曲移动到该歌单打开
## 播放整个歌单或排行榜
播放在线列表内的歌曲需要将它们都添加到我的列表才能播放,你可以全选列表内的歌曲然后添加到现有列表或者新创建的列表,然后去播放该列表内的歌曲。
## 桌面歌词启用后不显示
安卓6及更高的版本需要给予LX Music显示悬浮窗的权限才能使用桌面歌词功能请确认是否授予此权限不懂怎么授予的话请自行百度“开启悬浮窗权限”
## 下载功能
移动端暂不支持歌曲下载功能。
## 同步功能的使用(实验性,首次使用前建议先备份一次列表)
**注意:由于同步传输时的数据是明文传输,请在受信任的网络下使用此功能!**<br>
此功能需要配合PC端使用移动端与PC端处在同一个局域网路由器的网络下时可以多端实时同步歌曲列表使用方法
1. 在PC端的设置-数据同步开启同步功能(这时如果出现安全软件、防火墙等提示网络连接弹窗时需要点击允许)
2. 在移动端的设置-同步-同步服务器地址输入PC端显示的同步服务器地址如果显示可以多个则输入与**移动端上显示的本机地址**最相似的那个端口号与PC端的同步端口一致**输入完毕后需要按一下键盘上的回车键使输入的内容生效**
3. 输入完这两项后点击“启动同步”
4. 若连接成功对于首次同步时若两边的设备的列表不为空则PC端会弹出选择列表同步方式的弹窗同步方式的说明弹窗下面有介绍
#### 关于同步弹窗的说明
对于首次同步时若两边的设备的列表不为空则PC端会弹出选择列表同步方式的弹窗此弹窗内的同步方式仅针对**首次同步**<br>
第一次同步成功后,以后再同步时将会自动根据两边设备的列表内容合并同步,不信你可以在同步完成后断开两边的连接,然后在两边增删一些歌曲或列表后再同步试试看~😉
#### 连接同步服务失败的可能原因
- 此功能需要PC端与移动端都连接在同一个路由器下的网络才能使用
- 检查防火墙是否拦截了PC端的服务端口
- 路由器若开启了AP隔离则此功能无法使用
#### 连接同步服务失败的检查
1. 确保PC端的同步服务已启用成功若连接码、同步服务地址没有内容则证明服务启动失败此时看启用同步功能复选框后面的错误信息自行解决另外若你不知道端口号是什么意思就不要乱改或不要改得太大与太小
2. 在手机浏览器地址栏输入`http://x.x.x.x:23332/hello` **(注:将`x.x.x.x`换成PC端显示的同步服务地址`23332`为PC端的端口号** 后回车,若此地址可以打开并显示 `Hello~::^-^::`则证明移动端与PC端网络已互通
3. 若移动端无法打开第2步的地址则在PC端的浏览器地址栏输入并打开该地址若可以打开则要么是被LX Music PC端被电脑防火墙拦截要么PC端与移动端不在同一个网络下或者路由器开启了AP隔离一般在公共网络下会出现这种情况
## 更新已收藏的在线歌单
该功能仅对直接从歌单详情页点“收藏”按钮收藏的歌单有效,可右击已收藏的列表名从弹出的菜单中选择“更新”使用该功能,
需要注意的是:这将会覆盖本地的目标列表,歌曲将被替换成最新的在线列表。
## 杀毒软件提示有病毒或恶意行为
本人只能保证我写的代码不包含任何**恶意代码**、**收集用户信息**的行为并且软件代码已开源请自行查阅软件安装包也是由CI拉取源代码构建构建日志[GitHub Actions](https://github.com/lyswhut/lx-music-mobile/actions)<br>
尽管如此但这不意味着软件是100%安全的,由于软件使用了第三方依赖,当这些依赖存在恶意行为时([供应链攻击](https://docs.microsoft.com/zh-cn/windows/security/threat-protection/intelligence/supply-chain-malware)),软件也将会受到牵连,所以我只能尽量选择使用较多人用、信任度较高的依赖。<br>
当然,以上说明建立的前提是在你所用的安装包是从**本项目主页上写的链接**下载的,或者有相关能力者还可以下载源代码自己构建安装包。
最后,若出现杀毒软件报毒、存在恶意行为,请自行判断选择是否继续使用本软件! -->

View File

@ -1,5 +1,7 @@
<p align="center"><a href="https://github.com/lyswhut/lx-music-mobile"><img width="200" src="https://github.com/lyswhut/lx-music-mobile/blob/master/doc/images/icon.png" alt="lx-music logo"></a></p>
<h1 align="center">LX Music 移动版</h1>
<p align="center">
<a href="https://github.com/lyswhut/lx-music-mobile/releases"><img src="https://img.shields.io/github/release/lyswhut/lx-music-mobile" alt="Release version"></a>
<a href="https://github.com/lyswhut/lx-music-mobile/actions/workflows/release.yml"><img src="https://github.com/lyswhut/lx-music-mobile/workflows/Build/badge.svg" alt="Build status"></a>
@ -10,103 +12,100 @@
<!-- <a href="https://github.com/lyswhut/lx-music-mobile/blob/master/LICENSE"><img src="https://img.shields.io/github/license/lyswhut/lx-music-mobile" alt="License"></a> -->
</p>
1
<p align="center">一个基于 React Native 开发的音乐软件</p>
<h2 align="center">洛雪音乐助手移动版</h2>
### 说明
一个基于 React native 开发的音乐软件。
## 说明
支持的平台:
- Android
不计划支持IOS
*注:由于没有相关开发环境及证书,所以 **没有计划支持 iOS**。*<br>
*桌面版项目地址:<https://github.com/lyswhut/lx-music-desktop>*
软件变化请查看:[更新日志](https://github.com/lyswhut/lx-music-mobile/blob/master/CHANGELOG.md)<br>
软件下载请转到:[发布页面](https://github.com/lyswhut/lx-music-mobile/releases)<br>
或者到网盘下载网盘内有MAC、windows版`https://www.lanzoui.com/b0bf2cfa/` 密码:`glqw`(若链接无法打开请百度:蓝奏云链接打不开)<br>
使用常见问题请转至:[常见问题](https://lyswhut.github.io/lx-music-doc/mobile/faq)<br>
桌面版项目地址:<https://github.com/lyswhut/lx-music-desktop>
软件变化请查看 [更新日志](https://github.com/lyswhut/lx-music-mobile/blob/master/CHANGELOG.md)。
目前本项目的原始发布地址只有**GitHub**及**蓝奏网盘**,其他渠道均为第三方转载发布,与本项目无关!
软件下载请查看 [GitHub Releases](https://github.com/lyswhut/lx-music-mobile/releases)。
为了提高使用门槛本软件内的默认设置、UI操作不以新手友好为目标所以使用前建议先根据你的喜好浏览调整一遍软件设置阅读一遍[音乐播放列表机制](https://lyswhut.github.io/lx-music-doc/mobile/faq/playlist)
使用常见问题请参阅 [常见问题](https://lyswhut.github.io/lx-music-doc/mobile/faq)。
#### 数据同步服务
目前本项目的原始发布地址只有 [**GitHub Releases**](https://github.com/lyswhut/lx-music-mobile/releases),其他渠道均为第三方转载发布,与本项目无关!
从v1.0.0起,我们发布了一个独立版的[数据同步服务](https://github.com/lyswhut/lx-music-sync-server#readme),如果你有服务器,可以将其部署到服务器上作为私人多端同步服务使用,详情看该项目说明
为了提高使用门槛本软件内的默认设置、UI 操作不以新手友好为目标,所以使用前建议先根据你的喜好浏览调整一遍软件设置,阅读一遍 [音乐播放列表机制](https://lyswhut.github.io/lx-music-doc/mobile/faq/playlist)。
### 贡献代码
### 数据同步服务
本项目欢迎PR但为了PR能顺利合并需要注意以下几点
从 v1.0.0 起,我们发布了一个独立版的 [数据同步服务](https://github.com/lyswhut/lx-music-sync-server#readme),如果你有服务器,可以将其部署到服务器上作为私人多端同步服务使用,详情看该项目说明。
- 对于添加新功能的PR建议在PR前先创建issue说明以确认该功能是否确实需要
- 对于修复Bug PR请提供修复前后的说明及重现方式
- 其他类型的PR则适当附上说明
## 贡献代码
本项目欢迎 PR但为了 PR 能顺利合并,需要注意以下几点:
- 对于添加新功能的 PR建议在提交 PR 前先创建 issue 进行说明,以确认该功能是否确实需要;
- 对于修复 bug 的 PR请提供修复前后的说明及重现方式
- 对于其他类型的 PR则适当附上说明。
贡献代码步骤:
1. 参照[源码使用方法](https://lyswhut.github.io/lx-music-doc/mobile/use-source-code)设置开发环境
2. 克隆本仓库代码并切换`dev`分支开发
3. 提交PR
1. 参照 [源码使用方法](https://lyswhut.github.io/lx-music-doc/mobile/use-source-code) 设置开发环境
2. 克隆本仓库代码并切换`dev` 分支进行开发;
3. 提交 PR`dev` 分支。
<!--
### UI界面
## 用户界面
<p><a href="https://github.com/lyswhut/lx-music-mobile"><img width="100%" src="https://github.com/lyswhut/lx-music-mobile/blob/master/doc/images/app.png" alt="lx-music UI"></a></p> -->
<p><a href="https://github.com/lyswhut/lx-music-mobile"><img width="100%" src="https://github.com/lyswhut/lx-music-mobile/blob/master/doc/images/app.png" alt="lx-music mobile UI"></a></p> -->
### 项目协议
## 项目协议
本项目基于 [Apache License 2.0](https://github.com/lyswhut/lx-music-mobile/blob/master/LICENSE) 许可证发行,以下协议是对于 Apache License 2.0 的补充,如有冲突,以以下协议为准。
---
词语约定:本协议中的“本项目”指洛雪音乐移动版项目;“使用者”指签署本协议的使用者;“官方音乐平台”指对本项目内置的包括酷我、酷狗、咪咕等音乐源的官方平台统称;“版权数据”指包括但不限于图像、音频、名字等在内的他人拥有所属版权的数据。
*词语约定:本协议中的“本项目”指 LX Music洛雪音乐助手)移动版项目;“使用者”指签署本协议的使用者;“官方音乐平台”指对本项目内置的包括酷我、酷狗、咪咕等音乐源的官方平台统称;“版权数据”指包括但不限于图像、音频、名字等在内的他人拥有所属版权的数据。*
#### 一、数据来源
### 一、数据来源
1.1 本项目的各官方平台在线数据来源原理是从其公开服务器中拉取数据与未登录状态在官方平台APP获取的数据相同经过对数据简单地筛选与合并后进行展示因此本项目不对数据的合法性、准确性负责。
1.1 本项目的各官方平台在线数据来源原理是从其公开服务器中拉取数据(与未登录状态在官方平台 APP 获取的数据相同),经过对数据简单地筛选与合并后进行展示,因此本项目不对数据的合法性、准确性负责。
1.2 本项目本身没有获取某个音频数据的能力,本项目使用的在线音频数据来源来自软件设置内“音乐来源”设置所选择的“源”返回的在线链接。例如播放某首歌,本项目所做的只是将希望播放的歌曲名字、歌手名字等信息传递给“源”,若“源”返回了一个链接,则本项目将认为这就是该歌曲的音频数据而进行使用,至于这是不是正确的音频数据本项目无法校验其准确性,所以使用本项目的过程中可能会出现希望播放的音频与实际播放的音频不对应或者无法播放的问题。
1.3 本项目的非官方平台数据(例如我的收藏列表)来自使用者本地系统或者使用者连接的同步服务,本项目不对这些数据的合法性、准确性负责。
#### 二、版权数据
### 二、版权数据
2.1 使用本项目的过程中可能会产生版权数据。对于这些版权数据,本项目不拥有它们的所有权。为了避免侵权,使用者务必在**24小时内**清除使用本项目的过程中所产生的版权数据。
2.1 使用本项目的过程中可能会产生版权数据。对于这些版权数据,本项目不拥有它们的所有权。为了避免侵权,使用者务必在 **24 小时内** 清除使用本项目的过程中所产生的版权数据。
#### 三、音乐平台别名
### 三、音乐平台别名
3.1 本项目内的官方音乐平台别名为本项目内对官方音乐平台的一个称呼,不包含恶意。如果官方音乐平台觉得不妥,可联系本项目更改或移除。
#### 四、资源使用
### 四、资源使用
4.1 本项目内使用的部分包括但不限于字体、图片等资源来源于互联网。如果出现侵权可联系本项目移除。
#### 五、免责声明
### 五、免责声明
5.1 由于使用本项目产生的包括由于本协议或由于使用或无法使用本项目而引起的任何性质的任何直接、间接、特殊、偶然或结果性损害(包括但不限于因商誉损失、停工、计算机故障或故障引起的损害赔偿,或任何及所有其他商业损害或损失)由使用者负责。
#### 六、使用限制
### 六、使用限制
6.1 本项目完全免费,且开源发布于 GitHub 面向全世界人用作对技术的学习交流。本项目不对项目内的技术可能存在违反当地法律法规的行为作保证。
6.2 **禁止在违反当地法律法规的情况下使用本项目。** 对于使用者在明知或不知当地法律法规不允许的情况下使用本项目所造成的任何违法违规行为由使用者承担,本项目不承担由此造成的任何直接、间接、特殊、偶然或结果性责任。
#### 七、版权保护
### 七、版权保护
7.1 音乐平台不易,请尊重版权,支持正版。
#### 八、非商业性质
### 八、非商业性质
8.1 本项目仅用于对技术可行性的探索及研究,不接受任何商业(包括但不限于广告等)合作及捐赠。
#### 九、接受协议
### 九、接受协议
9.1 若你使用了本项目,代表你接受本协议。
9.1 若你使用了本项目,代表你接受本协议。
---
若对此有疑问请 mail to: lyswhut+qq.com (请将`+`替换成`@`)
若对此有疑问请 mail to: lyswhut+qq.com (请将 `+` 替换成 `@`)

View File

@ -545,9 +545,25 @@ globalThis.lx_setup = (key, id, name, description, version, author, homepage, ra
globalThis.eval = function() {
throw new Error('eval is not available')
}
globalThis.Function = function() {
throw new Error('Function is not available')
}
const proxyFunctionConstructor = new Proxy(Function.prototype.constructor, {
apply() {
throw new Error('Dynamic code execution is not allowed.')
},
construct() {
throw new Error('Dynamic code execution is not allowed.')
},
})
// eslint-disable-next-line no-extend-native
Object.defineProperty(Function.prototype, 'constructor', {
value: proxyFunctionConstructor,
writable: false,
configurable: false,
enumerable: false,
})
globalThis.Function = proxyFunctionConstructor
// globalThis.Function = function() {
// throw new Error('Function is not available')
// }
const excludes = [
Function.prototype.toString,

View File

@ -7,8 +7,8 @@ buildscript {
compileSdkVersion = 35
targetSdkVersion = 29
ndkVersion = "25.1.8937393"
kotlinVersion = "1.8.10" // Or any version above 1.3.x
ndkVersion = "26.1.10909125"
kotlinVersion = "1.9.24" // Or any version above 1.3.x
RNNKotlinVersion = kotlinVersion
}
repositories {
@ -16,7 +16,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath("com.android.tools.build:gradle")
classpath('com.android.tools.build:gradle:8.6.1')
classpath("com.facebook.react:react-native-gradle-plugin")
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")
}

Binary file not shown.

View File

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-all.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME

16
android/gradlew vendored
View File

@ -55,7 +55,7 @@
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
@ -145,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
@ -153,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
@ -202,11 +202,11 @@ fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \

20
android/gradlew.bat vendored
View File

@ -43,11 +43,11 @@ set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail

9867
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -57,15 +57,16 @@
"react-native-background-timer": "github:lyswhut/react-native-background-timer#55ecaa80880e9cec1fff81f3ce10e6250ab3c40c",
"react-native-exception-handler": "^2.10.10",
"react-native-fast-image": "^8.6.3",
"react-native-file-system": "github:lyswhut/react-native-file-system#cb3b807ac68c5cdb2c32ca10fdbb5e5209154ece",
"react-native-file-system": "github:lyswhut/react-native-file-system#2a37b90dbb8d37c5180777d0bf0d4f160812b0c1",
"react-native-fs": "^2.20.0",
"react-native-local-media-metadata": "github:lyswhut/react-native-local-media-metadata#5e55e67ecd1d557f29453e1cf34ff087efabbc7b",
"react-native-local-media-metadata": "github:lyswhut/react-native-local-media-metadata#5eac1b6c70e934a1ad7b800b3ab7122f1075f704",
"react-native-navigation": "7.39.2",
"react-native-pager-view": "6.3.0",
"react-native-pager-view": "6.6.1",
"react-native-quick-base64": "^2.1.2",
"react-native-quick-md5": "^3.0.6",
"rn-fetch-blob": "^0.12.0",
"react-native-track-player": "github:lyswhut/react-native-track-player#01873f81e30de85ab96363ad7351cf4bdcd39e37"
"react-native-track-player": "github:lyswhut/react-native-track-player#57eeeba57e28702fa931d4aeb753da225b6fcf6c",
"react-native-vector-icons": "^10.2.0"
},
"devDependencies": {
"@babel/core": "^7.26.0",
@ -77,7 +78,7 @@
"@react-native/metro-config": "^0.74.88",
"@react-native/typescript-config": "^0.74.88",
"@tsconfig/react-native": "^3.0.5",
"@types/react": "^18.3.12",
"@types/react": "^18.3.14",
"@types/react-native": "^0.72.8",
"@types/react-native-background-timer": "^2.0.2",
"@types/react-native-vector-icons": "^6.4.18",
@ -86,7 +87,7 @@
"eslint-config-standard": "^17.1.0",
"eslint-config-standard-with-typescript": "^43.0.1",
"eslint-plugin-react": "^7.37.2",
"eslint-plugin-react-hooks": "^5.0.0",
"eslint-plugin-react-hooks": "^5.1.0",
"typescript": "^5.7.2"
}
}

View File

@ -14,6 +14,11 @@
- 首次使用的提示窗口可以点击背景或者返回键关闭(#577
- 上移 Toast 位置避免遮挡播放模式图标(#603 @sibojia
### 修复
- 修复导出文件到范围存储类型的目录时,扩展名丢失的问题
- 修复切换列表播放歌曲时可能会出现播放的歌曲不对应的问题
### 变更
- 歌曲缓存地址不再存储到缓存目录

View File

@ -68,7 +68,7 @@ export default forwardRef<DesktopLyricEnableType, {}>((props, ref) => {
closeBtn={false}
cancelText={t('disagree')}
confirmText={t('agree_go')}
text={t('setting_lyric_dektop_permission_tip')} />
text={t('setting_lyric_desktop_permission_tip')} />
)
: null
)

View File

@ -76,7 +76,7 @@ const delayRetry = async(musicInfo: LX.Music.MusicInfo | LX.Download.ListItem, i
// if (cancelDelayRetry) cancelDelayRetry()
return new Promise<string | null>((resolve, reject) => {
const time = getRandom(2, 6)
setStatusText(global.i18n.t('player__geting_url_delay_retry', { time }))
setStatusText(global.i18n.t('player__getting_url_delay_retry', { time }))
const tiemout = setTimeout(() => {
getMusicPlayUrl(musicInfo, isRefresh, true).then((result) => {
cancelDelayRetry = null
@ -95,7 +95,7 @@ const delayRetry = async(musicInfo: LX.Music.MusicInfo | LX.Download.ListItem, i
}
const getMusicPlayUrl = async(musicInfo: LX.Music.MusicInfo | LX.Download.ListItem, isRefresh = false, isRetryed = false): Promise<string | null> => {
// this.musicInfo.url = await getMusicPlayUrl(targetSong, type)
setStatusText(global.i18n.t('player__geting_url'))
setStatusText(global.i18n.t('player__getting_url'))
addLoadTimeout()
// const type = getPlayType(settingState.setting['player.isPlayHighQuality'], musicInfo)
@ -269,7 +269,6 @@ const handlePlay = async() => {
* @param index
*/
export const playList = async(listId: string, index: number) => {
await pause()
const prevListId = playerState.playInfo.playerListId
setPlayListId(listId)
setPlayMusicInfo(listId, getList(listId)[index])
@ -288,12 +287,12 @@ const handleToggleStop = async() => {
const randomNextMusicInfo = {
info: null as LX.Player.PlayMusicInfo | null,
index: -1,
// index: -1,
}
export const resetRandomNextMusicInfo = () => {
if (randomNextMusicInfo.info) {
randomNextMusicInfo.info = null
randomNextMusicInfo.index = -1
// randomNextMusicInfo.index = -1
}
}
@ -377,13 +376,12 @@ export const getNextPlayMusicInfo = async(): Promise<LX.Player.PlayMusicInfo | n
if (togglePlayMethod == 'random') {
randomNextMusicInfo.info = nextPlayMusicInfo
randomNextMusicInfo.index = nextIndex
// randomNextMusicInfo.index = nextIndex
}
return nextPlayMusicInfo
}
const handlePlayNext = async(playMusicInfo: LX.Player.PlayMusicInfo) => {
await pause()
setPlayMusicInfo(playMusicInfo.listId, playMusicInfo.musicInfo, playMusicInfo.isTempPlay)
await handlePlay()
}

View File

@ -198,8 +198,8 @@
"player__buffering": "buffering...",
"player__end": "finished playing",
"player__error": "Audio loading error, switch to next track after 5 seconds",
"player__geting_url": "Acquiring the song link...",
"player__geting_url_delay_retry": "The server is busy, try again in {time} seconds...",
"player__getting_url": "Acquiring the song link...",
"player__getting_url_delay_retry": "The server is busy, try again in {time} seconds...",
"player__loading": "Music loading...",
"player__refresh_url": "The URL has expired, refreshing the URL...",
"player_cache_migrating": "Song cache is being migrated, please wait ⌛️",
@ -241,7 +241,7 @@
"setting_backup_part_import_list": "Import List",
"setting_backup_part_import_list_desc": "Select the list of backup files",
"setting_backup_part_import_list_tip_error": "List import failed 😕",
"setting_backup_part_import_list_tip_runing": "🚀I am trying to import...\nIf the list is too big, it may take some time⏳",
"setting_backup_part_import_list_tip_running": "🚀I am trying to import...\nIf the list is too big, it may take some time⏳",
"setting_backup_part_import_list_tip_success": "Import successful 🎉",
"setting_backup_part_import_list_tip_unzip": "📦File parsing...\nIf the file is too large, it may take some time⏳",
"setting_backup_part_import_setting": "Import settings",
@ -301,7 +301,7 @@
"setting_list_click_action": "When you click a song in the list, it will automatically switch to the current list for playback (only valid for playlists and leaderboards)",
"setting_list_show interval": "Show song duration",
"setting_list_show_album_name": "Show song album name",
"setting_lyric_dektop_permission_tip": "The desktop lyrics function needs to be granted the permission of LX Music Mod to display the floating window in the system permission setting before it can be used. Do you go to the relevant interface to grant this permission?",
"setting_lyric_desktop_permission_tip": "The desktop lyrics function needs to be granted the permission of LX Music to display the floating window in the system permission setting before it can be used. Do you go to the relevant interface to grant this permission?",
"setting_lyric_desktop": "Desktop lyrics",
"setting_lyric_desktop_enable": "Show desktop lyrics",
"setting_lyric_desktop_lock": "Lock lyrics",
@ -364,7 +364,7 @@
"setting_sync_code_fail": "Invalid connection code",
"setting_sync_code_input_tip": "Please enter the connection code",
"setting_sync_code_label": "You need to enter the connection code for the first connection",
"setting_sync_enbale": "Enable sync",
"setting_sync_enable": "Enable sync",
"setting_sync_history": "History address",
"setting_sync_history_empty": "Nothing here",
"setting_sync_history_title": "Connection history",

View File

@ -1,7 +1,9 @@
import zh_cn from './zh_cn.json'
import zh_tw from './zh_tw.json'
import en_us from './en_us.json'
type Message = Record<keyof typeof zh_cn, string>
| Record<keyof typeof zh_tw, string>
| Record<keyof typeof en_us, string>
@ -14,6 +16,14 @@ const langs = [
fallback: true,
message: zh_cn,
},
{
name: '繁體中文',
locale: 'zh_tw',
// alternate: 'zh-hant',
country: 'cn',
fallback: true,
message: zh_tw,
},
{
name: 'English',
locale: 'en_us',

View File

@ -10,8 +10,7 @@
"change_position": "调整位置",
"change_position_list_title": "调整列表位置",
"change_position_music_multi_title": "将已选的 {num} 首歌曲的位置调整到",
"change_position_music_title": "将 {name} 的位置调整到",
"download_music_title": "下载 {name}",
"change_position_music_title": "将「{name}」的位置调整到",
"change_position_tip": "请输入新的位置",
"close": "关闭",
"collect": "收藏",
@ -20,12 +19,12 @@
"collect_toplist": "收藏排行榜",
"comment_hide_text": "收起评论",
"comment_not support": "该歌曲不支持获取评论",
"comment_refresh": "这已经是 {name} 的评论啦",
"comment_refresh": "这已经是「{name}」的评论啦",
"comment_show_image": "显示图片",
"comment_show_text": "展开评论",
"comment_tab_hot": "热门 {total}",
"comment_tab_new": "最新 {total}",
"comment_title": "{name} - {singer} 的评论",
"comment_title": "「{name}」的评论",
"confirm": "确认",
"confirm_button_text": "是的",
"confirm_tip": "再确认一下,你真的要这样做吗?",
@ -34,23 +33,23 @@
"create_new_folder": "新建文件夹",
"create_new_folder_error_tip": "输入的名称不合法",
"create_new_folder_tip": "请输入新文件夹名",
"date_format_hour": "{num}小时前",
"date_format_minute": "{num}分钟前",
"date_format_second": "{num}秒前",
"date_format_hour": "{num} 小时前",
"date_format_minute": "{num} 分钟前",
"date_format_second": "{num} 秒前",
"deep_link__handle_error_tip": "调用失败:{message}",
"delete": "除",
"delete": "除",
"dialog_cancel": "我不",
"dialog_confirm": "好的",
"disagree": "我就不",
"disagree_tip": "那算了... 🙄",
"disagree_tip": "那算了...🙄",
"dislike": "不喜欢",
"duplicate_list_tip": "你之前已收藏过该列表 [{name}],是否需要更新里面的歌曲?",
"duplicate_list_tip": "你之前已收藏过列表「{name}」,是否需要更新里面的歌曲?",
"edit_metadata": "编辑标签",
"exit_app_tip": "确定要退出应用吗?",
"ignoring_battery_optimization_check_tip": "LX Music Mod没有在忽略电池优化的名单中,这可能会导致在后台播放音乐时被系统暂停的问题是否将LX Music Mod加入该白名单中?",
"ignoring_battery_optimization_check_tip": "LX Music 没有在忽略电池优化名单中,这可能会导致在后台播放音乐时被系统暂停。是否将 LX Music 加入该白名单中?",
"ignoring_battery_optimization_check_title": "后台运行权限设置提醒",
"input_error": "不要乱输好吧😡",
"list_add_btn_title": "把该歌曲添加到 {name}",
"list_add_btn_title": "把该歌曲添加到「{name}」",
"list_add_tip_exists": "列表已经存在这首歌啦,不要再点我啦~😡",
"list_add_title_first_add": "添加",
"list_add_title_first_move": "移动",
@ -71,13 +70,13 @@
"list_import": "导入",
"list_import_part_button_cancel": "不要啊",
"list_import_part_button_confirm": "覆盖掉",
"list_import_part_confirm": "导入的列表({importName})与本地列表({localName})的ID相同是否覆盖本地列表",
"list_import_part_confirm": "导入的列表({importName})与本地列表({localName})的 ID 相同,是否覆盖本地列表?",
"list_import_part_desc": "选择列表文件",
"list_import_tip__alldata": "这是一个所有数据备份文件,你需要去这里导入:\n设置 -> 备份与恢复 -> 列表数据 -> 导入列表",
"list_import_tip__alldata": "这是一个「所有数据」备份文件,你需要去这里导入:\n\n设置 → 备份与恢复 → 列表数据 → 导入列表",
"list_import_tip__failed": "导入失败",
"list_import_tip__playlist": "这是一个列表备份文件,你需要去这里导入:\n设置 -> 备份与恢复 -> 列表数据 -> 导入列表",
"list_import_tip__playlist_part": "这是一个单列表文件,你需要去这里导入:\n我的列表 -> 点击任意一个列表名右侧的菜单按钮 -> 在弹出的菜单中选择导入",
"list_import_tip__setting": "这是一个设置备份文件,移动端不支持导入此类文件",
"list_import_tip__playlist": "这是一个「列表」备份文件,你需要去这里导入:\n\n设置 → 备份与恢复 → 列表数据 → 导入列表",
"list_import_tip__playlist_part": "这是一个「单列表」文件,你需要去这里导入:\n\n我的列表 → 点击任意一个列表名右侧的菜单按钮 → 在弹出的菜单中选择「导入」",
"list_import_tip__setting": "这是一个「设置」备份文件,移动版不支持导入此类文件",
"list_import_tip__unknown": "未知的文件类型,请尝试升级到最新版本后再试",
"list_loading": "加载中...",
"list_multi_add_title_first_add": "添加已选的",
@ -85,8 +84,8 @@
"list_multi_add_title_last": "首歌曲到...",
"list_remove": "移除",
"list_remove_music_multi_tip": "你真的想要移除所选的 {num} 首歌曲吗?",
"list_remove_tip": "你真的想要移除 {name} 吗?",
"list_remove_tip_button": "是的 没错",
"list_remove_tip": "你真的想要移除「{name}」吗?",
"list_remove_tip_button": "是的没错",
"list_rename": "重命名",
"list_rename_title": "重命名列表",
"list_select_all": "全选",
@ -106,22 +105,22 @@
"list_sort_modal_by_field": "排序字段",
"list_sort_modal_by_name": "歌曲名",
"list_sort_modal_by_random": "随机乱序",
"list_sort_modal_by_singer": "歌手名",
"list_sort_modal_by_source": "歌曲源",
"list_sort_modal_by_singer": "艺术家",
"list_sort_modal_by_source": "歌曲源",
"list_sort_modal_by_time": "时长",
"list_sort_modal_by_type": "排序类别",
"list_sort_modal_by_up": "升序",
"list_sync": "更新",
"list_sync_confirm_tip": "这将会把 {name} 内的歌曲替换成在线列表的歌曲,你确认要更新吗?",
"list_sync_confirm_tip": "这将会把「{name}」内的歌曲替换成在线列表的歌曲,你确认要更新吗?",
"list_temp": "临时列表",
"list_update_error": "{name} 更新失败",
"list_update_success": "{name} 更新成功",
"list_update_error": "「{name}」更新失败",
"list_update_success": "「{name}」更新成功",
"list_updating": "更新中",
"lists__duplicate": "重复歌曲",
"lists_dislike_music_add_tip": "已添加",
"lists_dislike_music_singer_tip": "你真的不喜欢 {singer} 的 {name} 吗?",
"lists_dislike_music_tip": "你真的不喜欢 {name} 吗?",
"load_failed": "啊 加载失败了 😥",
"lists_dislike_music_singer_tip": "你真的不喜欢 {singer} 的「{name}」吗?",
"lists_dislike_music_tip": "你真的不喜欢「{name}」吗?",
"load_failed": "啊~加载失败了😥",
"loading": "加载中...",
"location": "来自{location}",
"lyric__load_error": "歌词获取失败",
@ -141,11 +140,11 @@
"metadata_edit_modal_form_parse_name": "从文件名解析歌曲名、艺术家",
"metadata_edit_modal_form_parse_name_singer": "歌曲名 - 艺术家",
"metadata_edit_modal_form_parse_singer_name": "艺术家 - 歌曲名",
"metadata_edit_modal_form_pic": "歌曲封面",
"metadata_edit_modal_form_pic": "歌曲专辑封面",
"metadata_edit_modal_form_remove_lyric": "清空",
"metadata_edit_modal_form_remove_pic": "移除图片",
"metadata_edit_modal_form_select_pic": "选择图片",
"metadata_edit_modal_form_select_pic_title": "选择歌曲封面图片",
"metadata_edit_modal_form_select_pic_title": "选择歌曲专辑封面图片",
"metadata_edit_modal_form_singer": "艺术家",
"metadata_edit_modal_processing": "写入中...",
"metadata_edit_modal_success": "保存成功",
@ -155,14 +154,14 @@
"music_source_detail": "歌曲详情页",
"name": "歌曲名:{name}",
"nav_exit": "退出应用",
"nav_love": "我的收藏",
"nav_love": "我的列表",
"nav_search": "搜索",
"nav_setting": "设置",
"nav_songlist": "歌单",
"nav_top": "排行榜",
"never_show": "不再提醒",
"no_item": "列表竟然是空的...",
"notifications_check_tip": "你没有允许LX Music Mod显示通知或LX Music Mod通知设置里的Music Service通知被禁用这将无法使用通知栏进行暂停、切歌等操作是否去开启",
"notifications_check_tip": "你没有允许 LX Music 显示通知,或 LX Music 通知设置里的MusicService通知被禁用,这将无法使用通知栏进行暂停、切歌等操作,是否去开启?",
"notifications_check_title": "通知权限提醒",
"ok": "我知道了",
"open_storage_error_tip": "输入的路径不合法",
@ -172,7 +171,7 @@
"open_storage_select_path_tip": "提示:对于外部存储,在授予存储权限后仍然无法访问时,可以点击下面的按钮选择允许访问的路径。",
"open_storage_tip": "输入存储路径",
"open_storage_title": "请手动在下方输入路径以指定外置存储器",
"parent_dir_name": "级目录",
"parent_dir_name": "上一级目录",
"pause": "暂停",
"play": "播放",
"play_all": "播放全部",
@ -183,10 +182,10 @@
"play_detail_setting_lrc_font_size": "歌词字体大小",
"play_detail_setting_playback_rate": "播放速率",
"play_detail_setting_playback_rate_reset": "重置",
"play_detail_setting_show_lyric_progress_setting": "允许通过歌词调整播放进度",
"play_detail_setting_show_lyric_progress_setting": "允许通过拖拽歌词调整播放进度",
"play_detail_setting_title": "播放器设置",
"play_detail_setting_volume": "音量大小",
"play_detail_todo_tip": "你想干嘛?不可以的,这个功能还没有实现哦😛,不过你可以试着长按来定位当前播放的歌曲(仅对播放“我的列表”里的歌曲有效哦)",
"play_detail_todo_tip": "你想干嘛?不可以的,这个功能还没有实现哦😛,不过你可以试着长按来定位当前播放的歌曲(仅对播放「我的列表」里的歌曲有效哦)",
"play_later": "稍后播放",
"play_list_loop": "列表循环播放",
"play_list_order": "顺序播放",
@ -198,10 +197,10 @@
"player__buffering": "缓冲中...",
"player__end": "播放完毕",
"player__error": "音频加载出错5 秒后切换下一首",
"player__geting_url": "歌曲链接获取中...",
"player__geting_url_delay_retry": "服务器繁忙,{time}秒后重试...",
"player__getting_url": "歌曲链接获取中...",
"player__getting_url_delay_retry": "服务器繁忙,{time} 秒后重试...",
"player__loading": "音乐加载中...",
"player__refresh_url": "URL过期正在刷新URL...",
"player__refresh_url": "URL 过期,正在刷新 URL...",
"player_cache_migrating": "歌曲缓存迁移中,请稍等 ⌛️",
"quality_high_quality": "HQ",
"quality_lossless": "SQ",
@ -218,19 +217,19 @@
"setting__other_lyric_raw_clear_btn": "清理歌词缓存",
"setting__other_lyric_raw_label": "歌词数量:",
"setting__other_meta_cache": "其他缓存管理",
"setting__other_music_url_clear_btn": "清理歌曲URL缓存",
"setting__other_music_url_label": "歌曲URL数量",
"setting__other_music_url_clear_btn": "清理歌曲 URL 缓存",
"setting__other_music_url_label": "歌曲 URL 数量:",
"setting__other_other_source_clear_btn": "清理换源歌曲缓存",
"setting__other_other_source_label": "换源歌曲信息数量:",
"setting__other_resource_cache": "资源缓存管理(包括歌曲、图片缓存)",
"setting_about": "关于洛雪音乐",
"setting_about": "关于 LX Music",
"setting_backup": "备份与恢复",
"setting_backup_all": "所有数据(列表数据与设置数据)",
"setting_backup_all_export": "导出",
"setting_backup_all_export_desc": "选择备份保存位置",
"setting_backup_all_import": "导入",
"setting_backup_all_import_desc": "选择备份文件",
"setting_backup_part": "列表数据(与PC端列表备份文件通用)",
"setting_backup_part": "列表数据(与桌面版列表备份文件通用)",
"setting_backup_part_export_list": "导出列表",
"setting_backup_part_export_list_desc": "选择歌单备份文件保存位置",
"setting_backup_part_export_list_tip_failed": "歌单导出失败",
@ -241,20 +240,20 @@
"setting_backup_part_import_list": "导入列表",
"setting_backup_part_import_list_desc": "选择列表备份文件",
"setting_backup_part_import_list_tip_error": "列表导入失败😕",
"setting_backup_part_import_list_tip_runing": "🚀正在努力导入中...\n若列表太大可能需要一些时间⏳",
"setting_backup_part_import_list_tip_running": "🚀正在努力导入中...\n若列表太大可能需要一些时间⏳",
"setting_backup_part_import_list_tip_success": "导入成功🎉",
"setting_backup_part_import_list_tip_unzip": "📦文件解析中...\n若文件太大可能需要一些时间⏳",
"setting_backup_part_import_setting": "导入设置",
"setting_backup_part_import_setting_desc": "选择配置文件",
"setting_basic": "基本设置",
"setting_basic_always_keep_statusbar_height": "总是保留状态栏高度",
"setting_basic_always_keep_statusbar_height_tip": "默认情况下,程序会动态判断是否需要为系统状态栏保留间距,但如果在你的设备上出现软件可交互内容与状态栏内容显示重叠的情况,可以启用该设置以始终为系统状态栏保留空间。",
"setting_basic_always_keep_statusbar_height_tip": "默认情况下,软件会动态判断是否需要为系统状态栏保留间距,但如果在你的设备上出现软件可交互内容与状态栏内容显示重叠的情况,可以启用该选项以始终为系统状态栏保留空间。",
"setting_basic_animation": "弹出层随机动画",
"setting_basic_auto_hide_play_bar": "弹出键盘时自动隐藏播放栏",
"setting_basic_drawer_layout_position": "导航、收藏列表弹出方向",
"setting_basic_drawer_layout_position_left": "左侧",
"setting_basic_drawer_layout_position_right": "右侧",
"setting_basic_font_size": "字体大小设置 [重启后生效]",
"setting_basic_font_size": "字体大小设置(重启后生效)",
"setting_basic_font_size_100": "标准",
"setting_basic_font_size_110": "大",
"setting_basic_font_size_120": "较大",
@ -279,12 +278,12 @@
"setting_basic_source_ikun_us": "ikun公益音源美国Cloudflare节点",
"setting_basic_source_title": "选择音乐来源",
"setting_basic_source_user_api_btn": "自定义源管理",
"setting_basic_sourcename": "音源名字",
"setting_basic_sourcename": "歌曲来源名称",
"setting_basic_sourcename_alias": "别名",
"setting_basic_sourcename_real": "原名",
"setting_basic_sourcename_title": "选择音源名字类型",
"setting_basic_sourcename_title": "选择歌曲来源名称类型",
"setting_basic_startup_auto_play": "启动后自动播放音乐",
"setting_basic_startup_push_play_detail_screen": "启动后打开播放详情界面",
"setting_basic_startup_push_play_detail_screen": "启动后打开播放详情",
"setting_basic_theme": "主题颜色",
"setting_basic_theme_auto_theme": "跟随系统亮、暗模式切换主题",
"setting_basic_theme_dynamic_bg": "使用动态背景",
@ -292,9 +291,9 @@
"setting_basic_theme_hide_bg_dark": "隐藏黑色主题背景",
"setting_basic_theme_more_btn_show": "更多主题",
"setting_basic_use_system_file_selector": "使用系统文件选择器",
"setting_basic_use_system_file_selector_tip": "启用该选项后,导入备份文件、自定义源等操作将不需要申请存储权限,但可能在某些系统上不可用。\n若启用该设置后无法导入文件,则可关闭该设置,回退到软件内置文件选择器。",
"setting_dislike_list_input_tip": "歌曲名@歌手名\n歌曲名\n@歌手名",
"setting_dislike_list_tips": "1. 每条一行,若歌曲或者歌手名字中存在“@”符号,需要将其替换成“#”\n2. 指定某歌手的某首歌:歌曲名@歌手名\n3. 指定某首歌:歌曲名\n4. 指定某歌手:@歌手名",
"setting_basic_use_system_file_selector_tip": "启用该选项后,导入备份文件、自定义源等操作将不需要申请存储权限,但可能在某些系统上不可用。\n\n若启用该选项后无法导入文件则可关闭该选项,回退到软件内置文件选择器。",
"setting_dislike_list_input_tip": "歌曲名@艺术家\n歌曲名\n@艺术家",
"setting_dislike_list_tips": "1. 每条一行,若歌曲或者艺术家名字中存在「@」符号,需要将其替换成「#」\n2. 指定某艺术家的某首歌:歌曲名@艺术家\n3. 指定某首歌:歌曲名\n4. 指定某艺术家:@艺术家",
"setting_list": "列表设置",
"setting_list_add_music_location_type": "添加歌曲到列表时的位置",
"setting_list_add_music_location_type_bottom": "底部",
@ -302,7 +301,7 @@
"setting_list_click_action": "点击列表里的歌曲时自动切换到当前列表播放(仅对歌单、排行榜有效)",
"setting_list_show interval": "显示歌曲时长",
"setting_list_show_album_name": "显示歌曲专辑名",
"setting_lyric_dektop_permission_tip": "桌面歌词功能需要在系统权限设置中授予LX Music Mod显示悬浮窗口的权限才能使用,是否去相关界面授予权限?",
"setting_lyric_desktop_permission_tip": "桌面歌词功能需要在系统权限设置中授予 LX Music 显示悬浮窗口的权限才能使用,是否去相关界面授予权限?",
"setting_lyric_desktop": "桌面歌词",
"setting_lyric_desktop_enable": "显示桌面歌词",
"setting_lyric_desktop_lock": "锁定歌词",
@ -322,12 +321,12 @@
"setting_lyric_desktop_toggle_anima": "显示歌词切换动画",
"setting_lyric_desktop_view_width": "窗口百分比宽度",
"setting_other": "其他",
"setting_other_cache": "缓存管理(包括歌曲、歌词、错误日志等缓存,没有歌曲播放相关的问题不建议清理)",
"setting_other_cache": "缓存管理(包括歌曲、歌词、错误日志等缓存,没有歌曲播放相关的问题不建议清理)",
"setting_other_cache_clear_btn": "清理缓存",
"setting_other_cache_clear_success_tip": "缓存清理完成",
"setting_other_cache_getting": "统计缓存中...",
"setting_other_cache_size": "当前已用缓存大小:",
"setting_other_dislike_list_show_btn": "编辑不喜欢歌曲规则",
"setting_other_dislike_list_show_btn": "编辑规则",
"setting_other_log": "错误日志(运行发生异常时的日志)",
"setting_other_log_btn_clean": "清空",
"setting_other_log_btn_hide": "关闭",
@ -337,9 +336,9 @@
"setting_other_log_tip_null": "日志是空的哦~",
"setting_other_log_user_api_log": "记录自定义源日志",
"setting_play_audio_offload": "启用音频卸载",
"setting_play_audio_offload_tip": "启用音频卸载可以节省耗电量,但在某些设备上可能会出现所有歌曲都提示 「音频加载出错」 或者 「无法完整播放整首歌」 的问题这是由于当前系统的bug导致的。\n对于遇到这个问题的人可以关闭此选项后完全重启应用再试。",
"setting_play_audio_offload_tip": "启用音频卸载可以节省耗电量,但在某些设备上可能会出现所有歌曲都提示「音频加载出错」或「无法完整播放整首歌」的问题,这是由于当前系统的 bug 导致的。\n\n对于遇到这个问题的人可以关闭该选项后完全重启应用再试。",
"setting_play_auto_clean_played_list": "自动清空已播放列表",
"setting_play_auto_clean_played_list_tip": "随机播放模式下,通过 「点击」 与 「播放列表相同的列表内的歌曲」 切歌时,若启用 「自动清空已播放列表」,则已播放的歌曲将重新参与随机播放。",
"setting_play_auto_clean_played_list_tip": "随机播放模式下,通过点击「与播放列表相同的列表」内的歌曲切歌时,若启用「自动清空已播放列表」,则已播放的歌曲将重新参与随机播放。",
"setting_play_cache_size": "最大缓存大小MB",
"setting_play_select": "播放音质选择",
"setting_play_cache_size_no_cache": "禁用缓存",
@ -347,11 +346,11 @@
"setting_play_handle_audio_focus": "其他应用播放声音时,自动暂停播放",
"setting_play_handle_audio_focus_tip": "重启应用后生效",
"setting_play_lyric_transition": "显示歌词翻译",
"setting_play_play_quality": "优先播放的音质(如果支持",
"setting_play_s2t": "将播放的歌词转繁体",
"setting_play_play_quality": "优先播放的音质(如果可用",
"setting_play_s2t": "将播放的中文歌词转换为繁体",
"setting_play_save_play_time": "记住播放进度",
"setting_play_show_bluetooth_lyric": "显示蓝牙歌词",
"setting_play_show_notification_image": "在通知栏显示歌曲图片",
"setting_play_show_notification_image": "在通知栏显示歌曲专辑封面图片",
"setting_play_show_roma": "显示歌词罗马音(如果可用)",
"setting_play_show_translation": "显示歌词翻译(如果可用)",
"setting_player": "播放设置",
@ -360,18 +359,18 @@
"setting_search_show_history_search": "显示历史搜索记录",
"setting_search_show_hot_search": "显示热门搜索",
"setting_sync": "数据同步",
"setting_sync_address": "本机IP地址:{address}",
"setting_sync_code_blocked_ip": "当前设备的IP已被服务端封禁",
"setting_sync_address": "当前设备地址:{address}",
"setting_sync_code_blocked_ip": "当前设备的 IP 已被服务端封禁!",
"setting_sync_code_fail": "连接码无效",
"setting_sync_code_input_tip": "请输入连接码",
"setting_sync_code_label": "首次连接需要输入连接码",
"setting_sync_enbale": "启用同步",
"setting_sync_enable": "启用同步",
"setting_sync_history": "历史地址",
"setting_sync_history_empty": "这里啥也没有😮",
"setting_sync_history_title": "连接历史",
"setting_sync_host_label": "同步服务地址",
"setting_sync_host_value_error_tip": "地址需要以 http:// 或者 https:// 开头!",
"setting_sync_host_value_tip": "http://IP地址:端口号",
"setting_sync_host_value_error_tip": "地址需要以「http://」或「https://」开头!",
"setting_sync_host_value_tip": "http://<IP 地址>:<端口号>",
"setting_sync_port_label": "同步服务端口号",
"setting_sync_port_tip": "请输入同步服务端口号",
"setting_sync_status": "状态:{status}",
@ -379,15 +378,15 @@
"setting_theme": "主题设置",
"setting_version": "软件更新",
"setting_version_show_ver_modal": "打开更新窗口 🚀",
"share_card_title_music": "将 {name} 分享到...",
"share_card_title_music": "将「{name}」分享到...",
"share_title_music": "歌曲分享",
"singer": "艺术家:{name}",
"songlist_hot": "最热",
"songlist_hot_collect": "热藏",
"songlist_new": "最新",
"songlist_open": "导入",
"songlist_open_input_placeholder": "输入歌单链接或歌单ID",
"songlist_open_input_tip": "1、不支持跨源打开歌单请确认要打开的歌单与当前歌单源是否对应\n2、若遇到无法打开的歌单链接欢迎反馈\n3、酷狗源不支持用歌单ID打开但支持酷狗码打开",
"songlist_open_input_placeholder": "输入歌单链接或歌单 ID",
"songlist_open_input_tip": "1、不支持跨源打开歌单请确认要打开的歌单与当前歌单源是否对应\n2、若遇到无法打开的歌单链接欢迎反馈\n3、酷狗源不支持用歌单 ID 打开,但支持酷狗码打开",
"songlist_recommend": "推荐",
"songlist_rise": "飙升",
"songlist_tag_default": "默认",
@ -412,27 +411,27 @@
"storage_file_no_match": "选择的文件不符合要求!",
"storage_file_no_select_file_failed_tip": "使用系统文件选择器选择文件失败,是否回退到软件内置文件选择器?",
"storage_permission_tip_disagree": "你个骗纸,刚刚问你,你都说同意的,最后又拒绝,哼 🥺",
"storage_permission_tip_disagree_ask_again": "功能无法使用,因为你已经永久拒绝洛雪访问手机存储😫。\n若想继续你需要去👉系统权限管理👈将洛雪的存储权限设置为允许",
"storage_permission_tip_request": "使用功能需要允许洛雪访问手机存储,是否同意并继续?",
"storage_permission_tip_disagree_ask_again": "功能无法使用,因为你已经永久拒绝洛雪访问手机存储😫。\n若想继续你需要去👉系统权限管理👈将洛雪的存储权限设置为允许",
"storage_permission_tip_request": "使用功能需要允许洛雪访问手机存储,是否同意并继续?",
"sync__dislike_mode_merge_tip_desc": "合并两边列表内容并去重",
"sync__dislike_mode_other_tip_desc": "“取消同步”将不使用不喜欢列表同步功能",
"sync__dislike_mode_other_tip_desc": "「取消同步」将不使用「不喜欢的歌曲」列表同步功能",
"sync__dislike_mode_overwrite_tip_desc": "被覆盖者的列表将被替换成覆盖者的列表",
"sync__dislike_mode_title": "选择与 {name} 的不喜欢列表同步方式",
"sync__dislike_mode_title": "选择与「{name}」的不喜欢列表同步方式",
"sync__list_mode_merge_tip_desc": "将两边的列表合并到一起,相同的歌曲将被去掉(去掉的是被合并者的歌曲),不同的歌曲将被添加。",
"sync__list_mode_other_tip_desc": "“取消同步”将不使用列表同步功能。",
"sync__list_mode_overwrite_tip_desc": "被覆盖者与覆盖者列表ID相同的列表将被删除后替换成覆盖者的列表列表ID不同的列表将被合并到一起若勾选完全覆盖,则被覆盖者的所有列表将被移除,然后替换成覆盖者的列表。",
"sync__list_mode_title": "选择与 {name} 的列表同步方式",
"sync__mode_merge_btn_local_remote": "本机列表 合并 远程列表",
"sync__mode_merge_btn_remote_local": "远程列表 合并 本机列表",
"sync__mode_merge_tip": "合并: ",
"sync__list_mode_overwrite_tip_desc": "被覆盖者与覆盖者列表 ID 相同的列表将被删除后替换成覆盖者的列表(列表 ID 不同的列表将被合并到一起)。若勾选「完全覆盖」,则被覆盖者的所有列表将被移除,然后替换成覆盖者的列表。",
"sync__list_mode_title": "选择与「{name}」的列表同步方式",
"sync__mode_merge_btn_local_remote": "「本机列表」合并「远程列表」",
"sync__mode_merge_btn_remote_local": "「远程列表」合并「本机列表」",
"sync__mode_merge_tip": "合并",
"sync__mode_other_label": "其他",
"sync__mode_other_tip": "其他: ",
"sync__mode_other_tip": "其他",
"sync__mode_overwrite": "完全覆盖",
"sync__mode_overwrite_btn_cancel": "取消同步",
"sync__mode_overwrite_btn_local_remote": "本机列表 覆盖 远程列表",
"sync__mode_overwrite_btn_remote_local": "远程列表 覆盖 本机列表",
"sync__mode_overwrite_btn_local_remote": "「本机列表」覆盖「远程列表」",
"sync__mode_overwrite_btn_remote_local": "「远程列表」覆盖「本机列表」",
"sync__mode_overwrite_label": "覆盖",
"sync__mode_overwrite_tip": "覆盖: ",
"sync__mode_overwrite_tip": "覆盖",
"sync_status_disabled": "未连接",
"theme_black": "黑灯瞎火",
"theme_blue": "蓝田生玉",
@ -458,14 +457,14 @@
"timeout_exit_label_isPlayed": "等待歌曲播放完毕再停止播放",
"timeout_exit_min": "分钟",
"timeout_exit_tip_cancel": "已取消定时停止播放",
"timeout_exit_tip_max": "最多只能设置{num}分钟哦",
"timeout_exit_tip_max": "最多只能设置 {num} 分钟哦",
"timeout_exit_tip_off": "设置定时停止播放",
"timeout_exit_tip_on": "{time} 后停止播放",
"toggle_source": "歌曲换源",
"toggle_source_failed": "换源失败,请尝试手动在其他源搜索该歌曲播放",
"toggle_source_try": "尝试切换到其他源...",
"understand": "已了解 👌",
"user_api__init_failed_alert": "自定义源 [{name}] 初始化失败:",
"user_api__init_failed_alert": "自定义源「{name}」初始化失败:",
"user_api_add_failed_tip": "无效的自定义源文件",
"user_api_allow_show_update_alert": "允许显示更新弹窗",
"user_api_btn_import": "导入",
@ -478,15 +477,15 @@
"user_api_import_desc": "选择自定义源文件",
"user_api_import_failed_tip": "自定义源导入失败:\n{message}",
"user_api_import_success_tip": "导入成功 🎉",
"user_api_max_tip": "最多只能同时存在20个源哦🤪\n想要继续导入的话请先移除一些旧的源腾出位置吧",
"user_api_max_tip": "最多只能同时存在 20 个源哦🤪\n想要继续导入的话请先移除一些旧的源腾出位置吧",
"user_api_note": "提示:虽然我们已经尽可能地隔离了脚本的运行环境,但导入包含恶意行为的脚本仍可能会影响你的系统,请谨慎导入。",
"user_api_readme": "源编写说明:",
"user_api_remove_tip": "你真的要移除 {name} 吗?",
"user_api_remove_tip": "你真的要移除「{name}」吗?",
"user_api_title": "自定义源管理(实验性)",
"user_api_update_alert": "自定义源 [{name}] 发现新版本",
"user_api_update_alert": "自定义源「{name}」发现新版本",
"user_api_update_alert_open_url": "打开更新地址",
"version_btn_close": "关闭",
"version_btn_downloading": "正在努力下载中...{current}/{total} ({progress}%)",
"version_btn_downloading": "正在努力下载中... {current}/{total} ({progress}%)",
"version_btn_failed": "重试",
"version_btn_ignore": "忽略",
"version_btn_ignore_cancel": "取消忽略",
@ -502,12 +501,12 @@
"version_tip_downloaded": "安装包已经下载完毕。",
"version_tip_failed": "安装包下载失败,你可以重试或者去项目地址手动下载新版更新。\n💡提示一般多点几次重试即可正常更新",
"version_tip_latest": "软件已是最新,尽情地体验吧~🥂",
"version_tip_min": "已切换到后台下载,你可以去 设置-软件更新 重新打开本弹窗哦",
"version_tip_min": "已切换到后台下载,你可以去「设置 → 软件更新」重新打开本弹窗哦",
"version_tip_unknown": "获取最新版本信息失败,建议手动去项目地址检查是否有新版本",
"version_title_checking": "⏳ 检查更新中 ⏳",
"version_title_failed": "❌ 下载失败 ❌",
"version_title_latest": "🎉 当前版本已是最新 🎊",
"version_title_new": "🌟 发现新版本 🌟",
"version_title_unknown": "❓ 获取最新版本信息失败 ❓",
"version_title_update": "🚀 程序更新 🚀"
}
"version_title_update": "🚀 软件更新 🚀"
}

510
src/lang/zh_tw.json Normal file
View File

@ -0,0 +1,510 @@
{
"add_to": "添加到...",
"agree": "好好好",
"agree_go": "去開啟",
"agree_to": "去設定",
"back": "返回",
"back_home": "返回桌布",
"cancel": "取消",
"cancel_button_text_2": "不不不,點錯了",
"change_position": "調整位置",
"change_position_list_title": "調整清單位置",
"change_position_music_multi_title": "將已選的 {num} 首歌曲的位置調整到",
"change_position_music_title": "將「{name}」的位置調整到",
"change_position_tip": "請輸入新的位置",
"close": "關閉",
"collect": "收藏",
"collect_songlist": "收藏歌單",
"collect_success": "收藏成功",
"collect_toplist": "收藏排行榜",
"comment_hide_text": "收起評論",
"comment_not support": "該歌曲不支援獲取評論",
"comment_refresh": "這已經是「{name}」的評論啦",
"comment_show_image": "顯示圖片",
"comment_show_text": "展開評論",
"comment_tab_hot": "熱門 {total}",
"comment_tab_new": "最新 {total}",
"comment_title": "「{name}」的評論",
"confirm": "確認",
"confirm_button_text": "是的",
"confirm_tip": "再確認一下,你真的要這樣做嗎?",
"copy_name": "分享歌曲",
"copy_name_tip": "已複製",
"create_new_folder": "建立資料夾",
"create_new_folder_error_tip": "輸入的名稱不合法",
"create_new_folder_tip": "請輸入新資料夾名",
"date_format_hour": "{num} 小時前",
"date_format_minute": "{num} 分鐘前",
"date_format_second": "{num} 秒前",
"deep_link__handle_error_tip": "呼叫失敗:{message}",
"delete": "移除",
"dialog_cancel": "我不",
"dialog_confirm": "好的",
"disagree": "我就不",
"disagree_tip": "那算了...🙄",
"dislike": "不喜歡",
"duplicate_list_tip": "你之前已收藏過清單「{name}」,是否需要更新裡面的歌曲?",
"edit_metadata": "編輯標籤",
"exit_app_tip": "確定要退出應用嗎?",
"ignoring_battery_optimization_check_tip": "LX Music 沒有在「忽略電池效能最佳化」的白名單中,這可能會導致在後台播放音樂時被系統暫停。是否將 LX Music 加入該白名單中?",
"ignoring_battery_optimization_check_title": "後台執行權限設定提醒",
"input_error": "不要亂寫好吧😡",
"list_add_btn_title": "把該歌曲添加到「{name}」",
"list_add_tip_exists": "清單已經存在這首歌啦,不要再點我啦~😡",
"list_add_title_first_add": "添加",
"list_add_title_first_move": "移動",
"list_add_title_last": "到...",
"list_create": "建立清單",
"list_create_input_placeholder": "你想起什麼名...",
"list_duplicate_tip": "已存在同名清單,是否繼續建立?",
"list_edit_action_tip_add_failed": "添加失敗",
"list_edit_action_tip_add_success": "添加成功",
"list_edit_action_tip_exist": "該清單已經有這首歌啦",
"list_edit_action_tip_move_failed": "移動失敗",
"list_edit_action_tip_move_success": "移動成功",
"list_edit_action_tip_remove_success": "移除成功",
"list_end": "到底啦~",
"list_error": "載入失敗😥,點擊嘗試重新載入",
"list_export": "匯出",
"list_export_part_desc": "選擇清單檔案儲存位置",
"list_import": "匯入",
"list_import_part_button_cancel": "不要啊",
"list_import_part_button_confirm": "覆蓋掉",
"list_import_part_confirm": "匯入的清單({importName})與本機清單({localName})的 ID 相同,是否覆蓋本機清單?",
"list_import_part_desc": "選擇清單檔案",
"list_import_tip__alldata": "這是一個「所有資料」備份檔案,你需要去這裡匯入:\n\n設定 → 備份與復原 → 清單資料 → 匯入清單",
"list_import_tip__failed": "匯入失敗",
"list_import_tip__playlist": "這是一個「清單」備份檔案,你需要去這裡匯入:\n\n設定 → 備份與復原 → 清單資料 → 匯入清單",
"list_import_tip__playlist_part": "這是一個「僅清單」檔案,你需要去這裡匯入:\n\n我的清單 → 點擊任意一個清單名右側的選單按鈕 → 在彈出的選單中選擇「匯入」",
"list_import_tip__setting": "這是一個「設定」備份檔案,行動版不支援匯入此類檔案",
"list_import_tip__unknown": "未知的檔案類型,請嘗試升級到最新版本後再試",
"list_loading": "載入中...",
"list_multi_add_title_first_add": "添加已選的",
"list_multi_add_title_first_move": "移動已選的",
"list_multi_add_title_last": "首歌曲到...",
"list_remove": "移除",
"list_remove_music_multi_tip": "你真的想要移除所選的 {num} 首歌曲嗎?",
"list_remove_tip": "你真的想要移除「{name}」嗎?",
"list_remove_tip_button": "是的,沒錯",
"list_rename": "重新命名",
"list_rename_title": "重新命名清單",
"list_select_all": "全選",
"list_select_cancel": "取消",
"list_select_local_file": "添加本機歌曲",
"list_select_local_file_desc": "選擇本機歌曲資料夾",
"list_select_local_file_empty_tip": "沒有在目前目錄中發現歌曲",
"list_select_local_file_result_failed_tip": "共發現 {total} 首歌曲,成功添加 {success} 首,失敗 {failed} 首,可到錯誤日誌查看添加失敗的歌曲",
"list_select_local_file_result_tip": "共發現 {total} 首歌曲,已全部添加!",
"list_select_local_file_temp_add_tip": "共找到 {total} 個符合要求的檔案,已快速添加到目前清單,現在將進入檔案標籤讀取流程,請勿退出應用!",
"list_select_range": "區間",
"list_select_single": "單選",
"list_select_unall": "反選",
"list_sort": "排序歌曲",
"list_sort_modal_by_album": "專輯",
"list_sort_modal_by_down": "降序",
"list_sort_modal_by_field": "排序欄位",
"list_sort_modal_by_name": "標題",
"list_sort_modal_by_random": "隨機亂序",
"list_sort_modal_by_singer": "演出者",
"list_sort_modal_by_source": "歌曲來源",
"list_sort_modal_by_time": "長度",
"list_sort_modal_by_type": "排序類別",
"list_sort_modal_by_up": "升序",
"list_sync": "更新",
"list_sync_confirm_tip": "這將會把「{name}」內的歌曲取代成線上清單的歌曲,你確認要更新嗎?",
"list_temp": "臨時清單",
"list_update_error": "「{name}」更新失敗",
"list_update_success": "「{name}」更新成功",
"list_updating": "更新中",
"lists__duplicate": "重複歌曲",
"lists_dislike_music_add_tip": "已添加",
"lists_dislike_music_singer_tip": "你真的不喜歡 {singer} 的「{name}」嗎?",
"lists_dislike_music_tip": "你真的不喜歡「{name}」嗎?",
"load_failed": "啊~載入失敗了😥",
"loading": "載入中...",
"location": "來自{location}",
"lyric__load_error": "歌詞獲取失敗",
"metadata_edit_modal_confirm": "儲存",
"metadata_edit_modal_failed": "儲存失敗,詳情可查看錯誤日誌",
"metadata_edit_modal_file_name": "檔案名",
"metadata_edit_modal_file_path": "檔案路徑",
"metadata_edit_modal_form_album_name": "專輯",
"metadata_edit_modal_form_lyric": "LRC 歌詞",
"metadata_edit_modal_form_match_lyric": "線上匹配",
"metadata_edit_modal_form_match_lyric_failed": "線上歌詞匹配失敗",
"metadata_edit_modal_form_match_lyric_success": "歌詞匹配成功🎉",
"metadata_edit_modal_form_match_pic": "線上匹配",
"metadata_edit_modal_form_match_pic_failed": "線上匹配封面失敗",
"metadata_edit_modal_form_match_pic_success": "封面匹配成功🎉",
"metadata_edit_modal_form_name": "歌曲名",
"metadata_edit_modal_form_parse_name": "從檔案名解析標題和演出者",
"metadata_edit_modal_form_parse_name_singer": "標題 - 演出者",
"metadata_edit_modal_form_parse_singer_name": "演出者 - 標題",
"metadata_edit_modal_form_pic": "歌曲專輯封面",
"metadata_edit_modal_form_remove_lyric": "清空",
"metadata_edit_modal_form_remove_pic": "移除圖片",
"metadata_edit_modal_form_select_pic": "選擇圖片",
"metadata_edit_modal_form_select_pic_title": "選擇歌曲專輯封面圖片",
"metadata_edit_modal_form_singer": "演出者",
"metadata_edit_modal_processing": "寫入中...",
"metadata_edit_modal_success": "儲存成功",
"metadata_edit_modal_tip": "歌曲名不能為空",
"metadata_edit_modal_title": "編輯歌曲標籤",
"move_to": "移動到...",
"music_source_detail": "歌曲詳情頁",
"name": "標題:{name}",
"nav_exit": "退出應用",
"nav_love": "我的清單",
"nav_search": "搜尋",
"nav_setting": "設定",
"nav_songlist": "歌單",
"nav_top": "排行榜",
"never_show": "不再提醒",
"no_item": "清單竟然是空的...",
"notifications_check_tip": "你沒有允許 LX Music 顯示通知,或 LX Music 通知設定裡的「MusicService」通知被停用這將無法使用通知欄進行暫停、切歌等操作是否去開啟",
"notifications_check_title": "通知權限提醒",
"ok": "我知道了",
"open_storage_error_tip": "輸入的路徑不合法",
"open_storage_not_found_title": "未找到外部記憶卡,請手動在下方輸入路徑以指定外部儲存器",
"open_storage_select_managed_folder_failed_tip": "選擇儲存路徑失敗:{msg}",
"open_storage_select_path": "開啟儲存路徑",
"open_storage_select_path_tip": "提示:對於外部儲存,在授予儲存權限後仍然無法訪問時,可以點擊下面的按鈕選擇允許訪問的路徑。",
"open_storage_tip": "輸入儲存路徑",
"open_storage_title": "請手動在下方輸入路徑以指定外部儲存器",
"parent_dir_name": "上一級目錄",
"pause": "暫停",
"play": "播放",
"play_all": "播放全部",
"play_detail_setting_lrc_align": "歌詞對齊方式",
"play_detail_setting_lrc_align_center": "置中",
"play_detail_setting_lrc_align_left": "置左",
"play_detail_setting_lrc_align_right": "置右",
"play_detail_setting_lrc_font_size": "歌詞字體大小",
"play_detail_setting_playback_rate": "播放速率",
"play_detail_setting_playback_rate_reset": "重設",
"play_detail_setting_show_lyric_progress_setting": "允許透過拖曳歌詞調整播放進度",
"play_detail_setting_title": "播放器設定",
"play_detail_setting_volume": "音量大小",
"play_detail_todo_tip": "你想幹嘛?不可以的,這個功能還沒有實現哦😛,不過你可以試著長按來定位目前播放的歌曲(僅對播放「我的清單」裡的歌曲有效哦)",
"play_later": "稍後播放",
"play_list_loop": "重複播放清單",
"play_list_order": "順序播放",
"play_list_random": "隨機播放",
"play_next": "下一曲",
"play_prev": "上一曲",
"play_single": "停用歌曲切換",
"play_single_loop": "重複播放",
"player__buffering": "緩衝中...",
"player__end": "播放完畢",
"player__error": "音訊載入出錯5 秒後切換下一首",
"player__getting_url": "歌曲連結獲取中...",
"player__getting_url_delay_retry": "伺服器繁忙,{time} 秒後重試...",
"player__loading": "音樂載入中...",
"player__refresh_url": "URL 過期,正在重新整理 URL...",
"player_cache_migrating": "歌曲快取遷移中,請稍等 ⌛️",
"quality_high_quality": "HQ",
"quality_lossless": "SQ",
"quality_lossless_24bit": "24bit",
"search__welcome": "搜我所想~~😉",
"search_history_search": "歷史搜尋",
"search_hot_search": "熱門搜尋",
"search_type_music": "歌曲",
"search_type_songlist": "歌單",
"setting__other_dislike_list": "不喜歡的歌曲規則",
"setting__other_dislike_list_label": "規則數量:{num}",
"setting__other_dislike_list_saved_tip": "已儲存",
"setting__other_lyric_raw_clear_btn": "清理歌詞快取",
"setting__other_lyric_raw_label": "歌詞數量:",
"setting__other_meta_cache": "其他快取管理",
"setting__other_music_url_clear_btn": "清理歌曲 URL 快取",
"setting__other_music_url_label": "歌曲 URL 數量:",
"setting__other_other_source_clear_btn": "清理換源歌曲快取",
"setting__other_other_source_label": "換源歌曲資訊數量:",
"setting__other_resource_cache": "資源快取管理(包括歌曲、圖片快取)",
"setting_about": "關於 LX Music",
"setting_backup": "備份與復原",
"setting_backup_all": "所有資料(清單資料與設定資料)",
"setting_backup_all_export": "匯出",
"setting_backup_all_export_desc": "選擇備份儲存位置",
"setting_backup_all_import": "匯入",
"setting_backup_all_import_desc": "選擇備份檔案",
"setting_backup_part": "清單資料(與桌面版清單備檔案通用)",
"setting_backup_part_export_list": "匯出清單",
"setting_backup_part_export_list_desc": "選擇歌單備份檔案儲存位置",
"setting_backup_part_export_list_tip_failed": "歌單匯出失敗",
"setting_backup_part_export_list_tip_success": "匯出成功",
"setting_backup_part_export_list_tip_zip": "📦檔案打包中...\n若檔案太大可能需要一些時間⏳",
"setting_backup_part_export_setting": "匯出設定",
"setting_backup_part_export_setting_desc": "選擇設定儲存位置",
"setting_backup_part_import_list": "匯入清單",
"setting_backup_part_import_list_desc": "選擇清單備份檔案",
"setting_backup_part_import_list_tip_error": "清單匯入失敗😕",
"setting_backup_part_import_list_tip_running": "🚀正在努力匯入中...\n若清單太大可能需要一些時間⏳",
"setting_backup_part_import_list_tip_success": "匯入成功🎉",
"setting_backup_part_import_list_tip_unzip": "📦檔案解析中...\n若檔案太大可能需要一些時間⏳",
"setting_backup_part_import_setting": "匯入設定",
"setting_backup_part_import_setting_desc": "選擇設定檔",
"setting_basic": "基本設定",
"setting_basic_always_keep_statusbar_height": "總是保留狀態欄高度",
"setting_basic_always_keep_statusbar_height_tip": "預設情況下,軟體會動態判斷是否需要為系統狀態欄保留間距,但如果在你的裝置上出現軟體可互動內容與狀態欄內容顯示重疊的情況,可以啟用該選項以始終為系統狀態欄保留空間。",
"setting_basic_animation": "彈出層隨機動畫",
"setting_basic_auto_hide_play_bar": "彈出鍵盤時自動隱藏播放欄",
"setting_basic_drawer_layout_position": "導航、收藏清單彈出方向",
"setting_basic_drawer_layout_position_left": "左側",
"setting_basic_drawer_layout_position_right": "右側",
"setting_basic_font_size": "字體大小設定(重啟後生效)",
"setting_basic_font_size_100": "標準",
"setting_basic_font_size_110": "大",
"setting_basic_font_size_120": "較大",
"setting_basic_font_size_130": "非常大",
"setting_basic_font_size_80": "較小",
"setting_basic_font_size_90": "小",
"setting_basic_font_size_preview": "LX Music 字體大小預覽",
"setting_basic_home_page_scroll": "啟用豎屏首頁橫向滾動",
"setting_basic_lang": "語言",
"setting_basic_share_type": "分享方式",
"setting_basic_share_type_clipboard": "複製到剪貼簿",
"setting_basic_share_type_system": "使用系統分享",
"setting_basic_show_animation": "顯示切換動畫",
"setting_basic_show_back_btn": "顯示返回桌布按鈕",
"setting_basic_show_exit_btn": "顯示退出應用按鈕",
"setting_basic_source": "音樂 API",
"setting_basic_source_direct": "試聽 API這是最後的選擇...",
"setting_basic_source_status_failed": "初始化失敗",
"setting_basic_source_status_initing": "初始化中",
"setting_basic_source_status_success": "初始化成功",
"setting_basic_source_temp": "臨時 API軟體的某些功能不可用建議測試 API 不可用再使用本介面)",
"setting_basic_source_test": "測試 API幾乎軟體的所有功能都可用",
"setting_basic_source_title": "選擇音樂 API",
"setting_basic_source_user_api_btn": "音樂 API 管理",
"setting_basic_sourcename": "歌曲來源名稱",
"setting_basic_sourcename_alias": "別名",
"setting_basic_sourcename_real": "原名",
"setting_basic_sourcename_title": "選擇歌曲來源名稱類型",
"setting_basic_startup_auto_play": "啟動後自動播放音樂",
"setting_basic_startup_push_play_detail_screen": "啟動後自動開啟播放詳情頁",
"setting_basic_theme": "主題顏色",
"setting_basic_theme_auto_theme": "跟隨系統亮、暗模式切換主題",
"setting_basic_theme_dynamic_bg": "使用動態背景",
"setting_basic_theme_font_shadow": "啟用字體陰影",
"setting_basic_theme_hide_bg_dark": "隱藏黑色主題背景",
"setting_basic_theme_more_btn_show": "更多主題",
"setting_basic_use_system_file_selector": "使用系統檔案選擇器",
"setting_basic_use_system_file_selector_tip": "啟用該選項後,匯入備份檔案、音樂 API 等操作將不需要申請儲存權限,但可能在某些系統上不可用。\n\n若啟用該選項後無法匯入檔案則可關閉該選項回退到軟體內建檔案選擇器。",
"setting_dislike_list_input_tip": "標題@演出者\n標題\n@演出者",
"setting_dislike_list_tips": "1. 每條一行,若歌曲或者演出者名字中存在「@」符號,需要將其取代成「#」\n2. 指定某演出者的某首歌:標題@演出者\n3. 指定某首歌:演出者\n4. 指定某演出者:@演出者",
"setting_list": "清單設定",
"setting_list_add_music_location_type": "添加歌曲到清單時的位置",
"setting_list_add_music_location_type_bottom": "底部",
"setting_list_add_music_location_type_top": "頂部",
"setting_list_click_action": "點擊清單裡的歌曲時自動切換到目前清單播放(僅對歌單、排行榜有效)",
"setting_list_show interval": "顯示歌曲時長",
"setting_list_show_album_name": "顯示歌曲專輯",
"setting_lyric_desktop_permission_tip": "桌面歌詞功能需要在系統權限設定中授予 LX Music 「重疊顯示於其他應用程式上方」權限才能使用,是否去相關頁面授予該權限?",
"setting_lyric_desktop": "桌面歌詞",
"setting_lyric_desktop_enable": "顯示桌面歌詞",
"setting_lyric_desktop_lock": "鎖定歌詞",
"setting_lyric_desktop_maxlineNum": "最大行數",
"setting_lyric_desktop_single_line": "使用單行歌詞",
"setting_lyric_desktop_text_opacity": "歌詞字體透明度",
"setting_lyric_desktop_text_size": "歌詞字體大小",
"setting_lyric_desktop_text_x": "歌詞水平對齊方式",
"setting_lyric_desktop_text_x_center": "置中",
"setting_lyric_desktop_text_x_left": "置左",
"setting_lyric_desktop_text_x_right": "置右",
"setting_lyric_desktop_text_y": "歌詞垂直對齊方式",
"setting_lyric_desktop_text_y_bottom": "居底",
"setting_lyric_desktop_text_y_center": "置中",
"setting_lyric_desktop_text_y_top": "居頂",
"setting_lyric_desktop_theme": "歌詞主題色",
"setting_lyric_desktop_toggle_anima": "顯示歌詞切換動畫",
"setting_lyric_desktop_view_width": "視窗百分比寬度",
"setting_other": "其他",
"setting_other_cache": "快取管理(包括歌曲、歌詞、錯誤日誌等快取,若沒有歌曲播放相關的問題則不建議清理)",
"setting_other_cache_clear_btn": "清理快取",
"setting_other_cache_clear_success_tip": "快取清理完成",
"setting_other_cache_getting": "統計快取中...",
"setting_other_cache_size": "目前已用快取大小:",
"setting_other_dislike_list_show_btn": "編輯規則",
"setting_other_log": "錯誤日誌(執行發生異常時的日誌)",
"setting_other_log_btn_clean": "清空",
"setting_other_log_btn_hide": "關閉",
"setting_other_log_btn_show": "查看日誌",
"setting_other_log_sync_log": "記錄同步日誌",
"setting_other_log_tip_clean_success": "日誌清理完成",
"setting_other_log_tip_null": "日誌是空的哦~",
"setting_other_log_user_api_log": "記錄音樂 API 日誌",
"setting_play_audio_offload": "啟用音訊移除",
"setting_play_audio_offload_tip": "啟用音訊移除可以節省耗電量,但在某些裝置上可能會出現所有歌曲都提示「音訊載入出錯」或「無法完整播放整首歌」的問題,這是由於目前系統的 bug 導致的。\n\n對於遇到這個問題的人可以關閉該選項後完全重啟應用再試。",
"setting_play_auto_clean_played_list": "自動清空已播放清單",
"setting_play_auto_clean_played_list_tip": "隨機播放模式下,透過點擊「與播放清單相同的清單」內的歌曲切歌時,若啟用「自動清空已播放清單」,則已播放的歌曲將重新參與隨機播放。",
"setting_play_cache_size": "最大快取大小MB",
"setting_play_cache_size_no_cache": "停用快取",
"setting_play_cache_size_save_tip": "快取設定完畢,重啟應用後生效",
"setting_play_handle_audio_focus": "其他應用播放聲音時,自動暫停播放",
"setting_play_handle_audio_focus_tip": "重啟應用後生效",
"setting_play_lyric_transition": "顯示歌詞翻譯",
"setting_play_play_quality": "優先播放的音質(如果可用)",
"setting_play_s2t": "將播放的中文歌詞轉換為繁體",
"setting_play_save_play_time": "記住播放進度",
"setting_play_show_bluetooth_lyric": "顯示藍牙歌詞",
"setting_play_show_notification_image": "在通知欄顯示歌曲專輯封面圖片",
"setting_play_show_roma": "顯示歌詞羅馬音(如果可用)",
"setting_play_show_translation": "顯示歌詞翻譯(如果可用)",
"setting_player": "播放設定",
"setting_player_save_play_time": "記住播放進度",
"setting_search": "搜尋設定",
"setting_search_show_history_search": "顯示歷史搜尋記錄",
"setting_search_show_hot_search": "顯示熱門搜尋",
"setting_sync": "資料同步",
"setting_sync_address": "目前裝置位址:{address}",
"setting_sync_code_blocked_ip": "目前裝置的 IP 已被服務端封禁!",
"setting_sync_code_fail": "連線碼無效",
"setting_sync_code_input_tip": "請輸入連線碼",
"setting_sync_code_label": "首次連線需要輸入連線碼",
"setting_sync_enable": "啟用同步",
"setting_sync_history": "歷史位址",
"setting_sync_history_empty": "這裡什麼也沒有😮",
"setting_sync_history_title": "連線歷史",
"setting_sync_host_label": "同步服務位址",
"setting_sync_host_value_error_tip": "位址需要以「http://」或「https://」開頭!",
"setting_sync_host_value_tip": "http://<IP 位址>:<埠號>",
"setting_sync_port_label": "同步服務埠號",
"setting_sync_port_tip": "請輸入同步服務埠號",
"setting_sync_status": "狀態:{status}",
"setting_sync_status_enabled": "已連線",
"setting_theme": "主題設定",
"setting_version": "軟體更新",
"setting_version_show_ver_modal": "開啟更新視窗 🚀",
"share_card_title_music": "將「{name}」分享到...",
"share_title_music": "歌曲分享",
"singer": "演出者:{name}",
"songlist_hot": "最熱",
"songlist_hot_collect": "熱藏",
"songlist_new": "最新",
"songlist_open": "匯入",
"songlist_open_input_placeholder": "輸入歌單連結或歌單 ID",
"songlist_open_input_tip": "1、不支援跨源開啟歌單請確認要開啟的歌單與目前歌單源是否對應\n2、若遇到無法開啟的歌單連結歡迎回報\n3、酷狗源不支援用歌單 ID 開啟,但支援用酷狗碼開啟",
"songlist_recommend": "推薦",
"songlist_rise": "飆升",
"songlist_tag_default": "預設",
"songlist_tag_hot": "熱門",
"songlist_tags": "歌單類別",
"source_alias_all": "聚合大會",
"source_alias_bd": "小杜音樂",
"source_alias_kg": "小枸音樂",
"source_alias_kw": "小蝸音樂",
"source_alias_mg": "小蜜音樂",
"source_alias_tx": "小秋音樂",
"source_alias_wy": "小芸音樂",
"source_real_all": "聚合搜尋",
"source_real_bd": "百度音樂",
"source_real_kg": "酷狗音樂",
"source_real_kw": "酷我音樂",
"source_real_mg": "咪咕音樂",
"source_real_tx": "企鵝音樂",
"source_real_wy": "網易音樂",
"stop": "停止",
"stopped": "已停止",
"storage_file_no_match": "選擇的檔案不符合要求!",
"storage_file_no_select_file_failed_tip": "使用系統檔案選擇器選擇檔案失敗,是否回退到軟體內建檔案選擇器?",
"storage_permission_tip_disagree": "你個騙紙,剛剛問你,你都說同意的,最後又拒絕,哼 🥺",
"storage_permission_tip_disagree_ask_again": "該功能無法使用,因為你已經永久拒絕洛雪訪問手機儲存😫。\n若想繼續你需要去👉系統權限管理👈將洛雪的儲存權限設定為「允許」",
"storage_permission_tip_request": "使用該功能需要允許洛雪訪問手機儲存,是否同意並繼續?",
"sync__dislike_mode_merge_tip_desc": "合併兩邊清單內容並去重",
"sync__dislike_mode_other_tip_desc": "「取消同步」將不使用「不喜歡的歌曲」清單同步功能",
"sync__dislike_mode_overwrite_tip_desc": "被覆蓋者的清單將被取代成覆蓋者的清單",
"sync__dislike_mode_title": "選擇與「{name}」的「不喜歡的歌曲」清單同步方式",
"sync__list_mode_merge_tip_desc": "將兩邊的清單合併到一起,相同的歌曲將被去掉(去掉的是被合併者的歌曲),不同的歌曲將被添加。",
"sync__list_mode_other_tip_desc": "「取消同步」將不使用清單同步功能。",
"sync__list_mode_overwrite_tip_desc": "被覆蓋者與覆蓋者清單 ID 相同的清單將被刪除後取代成覆蓋者的清單(清單 ID 不同的清單將被合併到一起)。若勾選「完全覆蓋」,則被覆蓋者的所有清單將被移除,然後取代成覆蓋者的清單。",
"sync__list_mode_title": "選擇與「{name}」的清單同步方式",
"sync__mode_merge_btn_local_remote": "「本機清單」合併「遠端清單」",
"sync__mode_merge_btn_remote_local": "「遠端清單」合併「本機清單」",
"sync__mode_merge_tip": "合併:",
"sync__mode_other_label": "其他",
"sync__mode_other_tip": "其他:",
"sync__mode_overwrite": "完全覆蓋",
"sync__mode_overwrite_btn_cancel": "取消同步",
"sync__mode_overwrite_btn_local_remote": "「本機清單」覆蓋「遠端清單」",
"sync__mode_overwrite_btn_remote_local": "「遠端清單」覆蓋「本機清單」",
"sync__mode_overwrite_label": "覆蓋",
"sync__mode_overwrite_tip": "覆蓋:",
"sync_status_disabled": "未連線",
"theme_black": "黑燈瞎火",
"theme_blue": "藍田生玉",
"theme_blue2": "清熱版藍",
"theme_blue_plus": "蛋雅深藍",
"theme_brown": "泥牛入海",
"theme_china_ink": "近墨者黑",
"theme_green": "綠意盎然",
"theme_grey": "灰常美麗",
"theme_happy_new_year": "新年快樂",
"theme_mid_autumn": "月裡嫦娥",
"theme_ming": "青出於黑",
"theme_naruto": "木葉之村",
"theme_orange": "橙黃橘綠",
"theme_pink": "粉裝玉琢",
"theme_purple": "重斤球紫",
"theme_red": "熱情似火",
"timeout_exit_btn_cancel": "取消定時",
"timeout_exit_btn_update": "更新定時",
"timeout_exit_btn_wait_cancel": "取消退出",
"timeout_exit_btn_wait_tip": "計時已結束,正在等待退出...",
"timeout_exit_input_tip": "輸入倒數計時分鐘數",
"timeout_exit_label_isPlayed": "等待歌曲播放完畢再停止播放",
"timeout_exit_min": "分鐘",
"timeout_exit_tip_cancel": "已取消定時停止播放",
"timeout_exit_tip_max": "最多只能設定 {num} 分鐘哦",
"timeout_exit_tip_off": "設定定時停止播放",
"timeout_exit_tip_on": "{time} 後停止播放",
"toggle_source": "歌曲換源",
"toggle_source_failed": "換源失敗,請嘗試手動在其他來源搜尋該歌曲播放",
"toggle_source_try": "嘗試切換到其他源...",
"understand": "已了解 👌",
"user_api__init_failed_alert": "音樂 API「{name}」初始化失敗:",
"user_api_add_failed_tip": "無效的音樂 API 檔案",
"user_api_allow_show_update_alert": "允許顯示更新彈出視窗",
"user_api_btn_import": "匯入",
"user_api_btn_import_local": "從本機匯入",
"user_api_btn_import_online": "從線上匯入",
"user_api_btn_import_online_input_confirm": "匯入",
"user_api_btn_import_online_input_loading": "匯入中...",
"user_api_btn_import_online_input_tip": "請輸入 HTTP 連結",
"user_api_empty": "這裡竟然是空的 😲",
"user_api_import_desc": "選擇音樂 API 檔案",
"user_api_import_failed_tip": "音樂 API 匯入失敗:\n{message}",
"user_api_import_success_tip": "匯入成功 🎉",
"user_api_max_tip": "最多只能同時存在 20 個 API 哦🤪\n想要繼續匯入的話請先移除一些舊的 API 騰出位置吧",
"user_api_note": "提示:雖然我們已經盡可能地隔離了腳本的執行環境,但匯入包含惡意行為的腳本仍可能會影響你的系統,請謹慎匯入。",
"user_api_readme": "API 編寫說明:",
"user_api_remove_tip": "你真的要移除「{name}」嗎?",
"user_api_title": "音樂 API 管理(實驗性)",
"user_api_update_alert": "音樂 API「{name}」發現新版本",
"user_api_update_alert_open_url": "開啟更新位址",
"version_btn_close": "關閉",
"version_btn_downloading": "正在努力下載中... {current}/{total} ({progress}%)",
"version_btn_failed": "重試",
"version_btn_ignore": "忽略",
"version_btn_ignore_cancel": "取消忽略",
"version_btn_min": "後台下載",
"version_btn_new": "更新",
"version_btn_unknown": "項目首頁",
"version_btn_update": "安裝",
"version_label_change_log": "更新說明:",
"version_label_current_ver": "目前版本:",
"version_label_history": "歷史版本:",
"version_label_latest_ver": "最新版本:",
"version_tip_checking": "檢查更新中...⏳",
"version_tip_downloaded": "安裝包已經下載完畢。",
"version_tip_failed": "安裝包下載失敗,你可以重試或者去項目位址手動下載新版更新。\n💡提示一般多點幾次重試即可正常更新",
"version_tip_latest": "軟體已是最新,盡情地體驗吧~🥂",
"version_tip_min": "已切換到後台下載,你可以去「設定 → 軟體更新」重新開啟本彈出視窗哦",
"version_tip_unknown": "獲取最新版本資訊失敗,建議手動去項目位址檢查是否有新版本",
"version_title_checking": "⏳ 檢查更新中 ⏳",
"version_title_failed": "❌ 下載失敗 ❌",
"version_title_latest": "🎉 目前版本已是最新 🎊",
"version_title_new": "🌟 發現新版本 🌟",
"version_title_unknown": "❓ 獲取最新版本資訊失敗 ❓",
"version_title_update": "🚀 軟體更新 🚀"
}

View File

@ -12,6 +12,7 @@ import { exitApp } from '@/utils/nativeModules/utils'
import { updateSetting } from '@/core/common'
import { checkUpdate } from '@/core/version'
import { initDeeplink } from '@/core/init/deeplink'
import settingState from '@/store/setting/state'
const Content = () => {
const theme = useTheme()
@ -34,30 +35,29 @@ const Content = () => {
<View style={styles.main}>
<Text style={styles.title} size={18} ></Text>
<ScrollView style={styles.content} keyboardShouldPersistTaps={'always'}>
<Text selectable style={styles.text} >** LX Music官方发布Github Issue询问问题 **</Text>
<Text selectable style={styles.text} > <Text onPress={openLicensePage} style={textLinkStyle}>Apache License 2.0</Text> 使使使 Apache License 2.0 {'\n'}</Text>
<Text selectable style={styles.text} >使使{'\n'}</Text>
<Text selectable style={styles.bold} ></Text>
<Text selectable style={styles.text} >1.1 APP获取的数据相同</Text>
<Text selectable style={styles.text} >1.2 使线线使使</Text>
{!settingState.setting['common.isAgreePact'] && <Text selectable style={styles.bold} >使使使{'\n'}</Text>}
<Text selectable style={styles.text} > <Text onPress={openLicensePage} style={textLinkStyle}>Apache License 2.0</Text> Apache License 2.0 {'\n'}</Text>
<Text selectable style={styles.text} > LX Music使使{'\n'}</Text>
<Text selectable style={styles.bold} >{'\n'}</Text>
<Text selectable style={styles.text} >1.1 APP {'\n'}</Text>
<Text selectable style={styles.text} >1.2 使线线使使{'\n'}</Text>
<Text selectable style={styles.text} >1.3 使使{'\n'}</Text>
<Text selectable style={styles.bold} ></Text>
<Text selectable style={styles.text} >2.1 使使 <Text style={styles.bold}>24</Text> 使{'\n'}</Text>
<Text selectable style={styles.bold} ></Text>
<Text selectable style={styles.bold} >{'\n'}</Text>
<Text selectable style={styles.text} >2.1 使使 <Text style={styles.bold}>24 </Text> 使{'\n'}</Text>
<Text selectable style={styles.bold} >{'\n'}</Text>
<Text selectable style={styles.text} >3.1 {'\n'}</Text>
<Text selectable style={styles.bold} >使</Text>
<Text selectable style={styles.bold} >使{'\n'}</Text>
<Text selectable style={styles.text} >4.1 使{'\n'}</Text>
<Text selectable style={styles.bold} ></Text>
<Text selectable style={styles.bold} >{'\n'}</Text>
<Text selectable style={styles.text} >5.1 使使使使{'\n'}</Text>
<Text selectable style={styles.bold} >使</Text>
<Text selectable style={styles.text} >6.1 <Text onPress={openHomePage} style={textLinkStyle}>GitHub</Text> </Text>
<Text selectable style={styles.bold} >使{'\n'}</Text>
<Text selectable style={styles.text} >6.1 <Text onPress={openHomePage} style={textLinkStyle}>GitHub</Text> {'\n'}</Text>
<Text selectable style={styles.text} >6.2 <Text style={styles.bold}>使</Text>使使使{'\n'}</Text>
<Text selectable style={styles.bold} ></Text>
<Text selectable style={styles.bold} >{'\n'}</Text>
<Text selectable style={styles.text} >7.1 {'\n'}</Text>
<Text selectable style={styles.bold} ></Text>
<Text selectable style={styles.bold} >{'\n'}</Text>
<Text selectable style={styles.text} >8.1 广{'\n'}</Text>
<Text selectable style={styles.bold} ></Text>
<Text selectable style={styles.bold} >{'\n'}</Text>
<Text selectable style={styles.text} >9.1 使{'\n'}</Text>
<Text selectable style={styles.text} >* </Text>
</ScrollView>
@ -100,7 +100,7 @@ const Footer = ({ componentId }: { componentId: string }) => {
const confirmBtn = useMemo(() => {
if (isAgreePact) return { disabled: false, text: '关闭' }
return time ? { disabled: true, text: `同意${time}` } : { disabled: false, text: '同意' }
return time ? { disabled: true, text: `接受${time}` } : { disabled: false, text: '接受' }
}, [isAgreePact, time])
useEffect(() => {
@ -134,18 +134,18 @@ const Footer = ({ componentId }: { componentId: string }) => {
isAgreePact
? null
: (
<Text selectable style={styles.tip} size={13}>使退</Text>
)
<Text selectable style={styles.tip} size={13}>使退</Text>
)
}
<View style={styles.btns}>
{
isAgreePact
? null
: (
<Button style={{ ...styles.btn, backgroundColor: theme['c-button-background'] }} onPress={handleRejct}>
<Text color={theme['c-button-font']}></Text>
</Button>
)
<Button style={{ ...styles.btn, backgroundColor: theme['c-button-background'] }} onPress={handleRejct}>
<Text color={theme['c-button-font']}></Text>
</Button>
)
}
<Button disabled={confirmBtn.disabled} style={{ ...styles.btn, backgroundColor: theme['c-button-background'] }} onPress={handleConfirm}>
<Text color={theme['c-button-font']}>{confirmBtn.text}</Text>

View File

@ -20,10 +20,10 @@ export default memo(() => {
void openUrl('https://github.com/ikunshare/ikun-music-mobile#readme')
}
const openIssuePage = () => {
void openUrl('https://github.com/lyswhut/lx-music-mobile/issues')
void openUrl('https://github.com/ikunshare/ikun-music-mobile/issues')
}
const openNetdiskPage = () => {
void openUrl('https://www.lanzoui.com/s/LXMusic')
const openGHReleasePage = () => {
void openUrl('https://github.com/ikunshare/ikun-music-mobile/releases')
}
const openFAQPage = () => {
void openUrl('https://lyswhut.github.io/lx-music-doc/mobile/faq')
@ -46,39 +46,57 @@ export default memo(() => {
return (
<Section title={t('setting_about')}>
<View style={styles.part}>
<Text style={styles.text} ></Text>
<Text style={styles.text} ></Text>
<TouchableOpacity onPress={openHomePage}>
<Text style={textLinkStyle}>https://github.com/ikunshare/ikun-music-mobile</Text>
</TouchableOpacity>
</View>
<View style={styles.part}>
<Text style={styles.text}></Text>
<TouchableOpacity onPress={openNetdiskPage}>
<Text style={textLinkStyle}>LXMusicMod</Text>
<Text style={styles.text}></Text>
<TouchableOpacity onPress={openGHReleasePage}>
<Text style={textLinkStyle}>GitHub Release</Text>
</TouchableOpacity>
</View>
<View style={styles.part}>
<Text style={styles.text} ></Text>
<TouchableOpacity onPress={openFAQPage}>
<Text style={textLinkStyle}></Text>
<Text style={textLinkStyle}></Text>
</TouchableOpacity>
</View>
<View style={styles.part}>
<Text style={styles.text}><Text style={styles.boldText}></Text>使<Text style={styles.boldText} > </Text></Text>
<Text style={styles.text}>Telegaram群组 </Text>
<TouchableOpacity onPress={goToTGGroup}><Text style={textLinkStyle}>849514974</Text></TouchableOpacity>
<Text style={styles.text}> </Text>
<Text style={styles.text}><Text style={styles.boldText}>+寿</Text></Text>
</View>
<View style={styles.part}>
<Text style={styles.text}><Text style={styles.boldText}>GitHub</Text><Text style={styles.boldText}></Text></Text>
<Text style={styles.text}>vivo等应用商店发布同名应用</Text>
<Text style={styles.text}>使<Text style={styles.boldText}>广</Text><Text style={styles.boldText}></Text>使</Text>
<Text style={styles.text}><Text style={styles.boldText}></Text></Text>
<Text style={styles.text}><Text style={styles.boldText}></Text>使<Text style={styles.boldText} ></Text></Text>
<Text style={styles.text}> GitHub </Text>
<TouchableOpacity onPress={openIssuePage}>
<Text style={textLinkStyle}>Issue</Text>
</TouchableOpacity>
<Text style={styles.text}></Text>
</View>
<View style={styles.part}>
<Text style={styles.text}></Text>
</View>
<View style={styles.part}>
<Text style={styles.text}><Text style={styles.boldText}> GitHub, Telegram</Text></Text>
</View>
<View style={styles.part}>
<Text style={styles.text}><Text style={styles.boldText}>vivo </Text></Text>
</View>
<View style={styles.part}>
<Text style={styles.text}>使<Text style={styles.boldText}>广</Text><Text style={styles.boldText}></Text>使</Text>
</View>
<View style={styles.part}>
<Text style={styles.text}><Text style={styles.boldText}></Text><Text style={styles.boldText}></Text><Text style={styles.boldText}></Text></Text>
</View>
<View style={styles.part}>
<Text style={styles.text}></Text>
<TouchableOpacity onPress={openPactModal}><Text style={styles.text} color={theme['c-primary-font']}></Text></TouchableOpacity>
<Text style={styles.text}>线</Text>
<TouchableOpacity onPress={openPartPage}><Text style={textLinkStyle}></Text></TouchableOpacity>
<Text style={styles.text}></Text>
</View>
<View style={styles.part}>
<Text style={styles.text}>By: </Text>
<Text style={styles.text}></Text>
</View>
</Section>
)
})

View File

@ -87,8 +87,12 @@ export const handleImportListPart = async(listData: LX.ConfigFile.MyListInfoPart
})
if (confirm) {
listData.name = targetList.name
void overwriteList(listData)
toast(global.i18n.t('setting_backup_part_import_list_tip_success'))
void overwriteList(listData).then(() => {
toast(global.i18n.t('setting_backup_part_import_list_tip_success'))
}).catch((err) => {
log.error(err)
toast(global.i18n.t('setting_backup_part_import_list_tip_error'))
})
return
}
listData.id += `__${Date.now()}`

View File

@ -24,7 +24,7 @@ export default memo(() => {
const handleGetAppCacheSize = () => {
void Promise.all([getAppCacheSize(), getCacheSize()]).then(([size, size2]) => {
const count = size + size2
setCacheSize(sizeFormate(count as number))
setCacheSize(sizeFormate(count))
})
}

View File

@ -155,7 +155,7 @@ export default memo(({ host, setHost }: {
return (
<>
<View style={styles.infoContent}>
<CheckBoxItem disabled={!host} check={isEnableSync} label={t('setting_sync_enbale')} onChange={handleSetEnableSync} />
<CheckBoxItem disabled={!host} check={isEnableSync} label={t('setting_sync_enable')} onChange={handleSetEnableSync} />
<Text style={styles.textAddr} size={13}>{t('setting_sync_address', { address })}</Text>
<Text style={styles.text} size={13}>{t('setting_sync_status', { status })}</Text>
</View>

View File

@ -174,7 +174,7 @@ export default memo(({ isWaiting, setIsWaiting }: {
return (
<>
<View style={{ marginTop: 5 }}>
<CheckBoxItem disabled={isWaiting || !port || !host} check={isEnableSync} label={t('setting_sync_enbale')} onChange={handleSetEnableSync} />
<CheckBoxItem disabled={isWaiting || !port || !host} check={isEnableSync} label={t('setting_sync_enable')} onChange={handleSetEnableSync} />
<Text style={{ ...styles.text, marginTop: setSpText(5) }} size={13}>{t('setting_sync_address', { address })}</Text>
<Status />
</View>

View File

@ -140,10 +140,12 @@ export const findMusic = async(musicInfo) => {
newResult.push(...sortMusic(result, item => item.fSinger == fSinger && item.fMusicName == fMusicName && item.interval == interval))
newResult.push(...sortMusic(result, item => item.fMusicName == fMusicName && item.fSinger == fSinger && item.fAlbumName == fAlbumName))
newResult.push(...sortMusic(result, item => item.fSinger == fSinger && item.fMusicName == fMusicName))
newResult.push(...sortMusic(result, item => item.fMusicName == fMusicName && item.interval == interval))
newResult.push(...sortMusic(result, item => item.fSinger == fSinger && item.interval == interval))
newResult.push(...sortMusic(result, item => item.interval == interval))
newResult.push(...sortMusic(result, item => item.fMusicName == fMusicName))
newResult.push(...sortMusic(result, item => item.fSinger == fSinger))
newResult.push(...sortMusic(result, item => item.fAlbumName == fAlbumName))
newResult.push(...sortMusic(result, item => item.interval == interval))
for (const item of result) {
delete item.fSinger
delete item.fMusicName