新增多语言设置

pull/166/head
lyswhut 2020-02-19 20:41:34 +08:00
parent a17ba9f62c
commit b8f15bcca9
77 changed files with 1066 additions and 296 deletions

59
package-lock.json generated
View File

@ -1,6 +1,6 @@
{
"name": "lx-music-desktop",
"version": "0.15.0",
"version": "0.16.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -2704,8 +2704,7 @@
"@types/node": {
"version": "10.14.12",
"resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-10.14.12.tgz?cache=0&sync_timestamp=1563323059673&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-10.14.12.tgz",
"integrity": "sha1-DuwxVaRubE2x8nw+WIogX3Z9Yi8=",
"dev": true
"integrity": "sha1-DuwxVaRubE2x8nw+WIogX3Z9Yi8="
},
"@types/q": {
"version": "1.5.2",
@ -2714,9 +2713,12 @@
"dev": true
},
"@types/semver": {
"version": "6.2.0",
"resolved": "https://registry.npm.taobao.org/@types/semver/download/@types/semver-6.2.0.tgz?cache=0&sync_timestamp=1572034910183&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fsemver%2Fdownload%2F%40types%2Fsemver-6.2.0.tgz",
"integrity": "sha1-1ojVdEANlsWwEUlocFNm9DGDHho="
"version": "7.1.0",
"resolved": "https://registry.npm.taobao.org/@types/semver/download/@types/semver-7.1.0.tgz?cache=0&sync_timestamp=1580871311074&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fsemver%2Fdownload%2F%40types%2Fsemver-7.1.0.tgz",
"integrity": "sha1-yMYw1MGM0ya+/3dASIdZb5ZAhAg=",
"requires": {
"@types/node": "*"
}
},
"@vue/component-compiler-utils": {
"version": "3.1.1",
@ -4831,9 +4833,9 @@
}
},
"builder-util-runtime": {
"version": "8.4.0",
"resolved": "https://registry.npm.taobao.org/builder-util-runtime/download/builder-util-runtime-8.4.0.tgz?cache=0&sync_timestamp=1574846206242&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fbuilder-util-runtime%2Fdownload%2Fbuilder-util-runtime-8.4.0.tgz",
"integrity": "sha1-MWP//AeOa4891bbrEqg0VXNZBoI=",
"version": "8.6.0",
"resolved": "https://registry.npm.taobao.org/builder-util-runtime/download/builder-util-runtime-8.6.0.tgz",
"integrity": "sha1-twB8MBJtqakOmZMhKNKSLIwXhkk=",
"requires": {
"debug": "^4.1.1",
"sax": "^1.2.4"
@ -5046,9 +5048,9 @@
}
},
"cfonts": {
"version": "2.6.1",
"resolved": "https://registry.npm.taobao.org/cfonts/download/cfonts-2.6.1.tgz",
"integrity": "sha1-uErzJQD/JxsKY0HeQ6I9RkrRun8=",
"version": "2.7.0",
"resolved": "https://registry.npm.taobao.org/cfonts/download/cfonts-2.7.0.tgz",
"integrity": "sha1-tFGO2mUUJH/8yPZv+Ch9TaqIVd4=",
"dev": true,
"requires": {
"chalk": "^3.0.0",
@ -7036,24 +7038,29 @@
"dev": true
},
"electron-updater": {
"version": "4.2.0",
"resolved": "https://registry.npm.taobao.org/electron-updater/download/electron-updater-4.2.0.tgz",
"integrity": "sha1-+ez8ZX9l6tc31Cue/s9ijTdWtVA=",
"version": "4.2.2",
"resolved": "https://registry.npm.taobao.org/electron-updater/download/electron-updater-4.2.2.tgz",
"integrity": "sha1-V+EGv/rRb3Gx/6OWilKhtxyBR+Y=",
"requires": {
"@types/semver": "^6.0.2",
"builder-util-runtime": "8.4.0",
"@types/semver": "^7.1.0",
"builder-util-runtime": "8.6.0",
"fs-extra": "^8.1.0",
"js-yaml": "^3.13.1",
"lazy-val": "^1.0.4",
"lodash.isequal": "^4.5.0",
"pako": "^1.0.10",
"semver": "^6.3.0"
"pako": "^1.0.11",
"semver": "^7.1.3"
},
"dependencies": {
"pako": {
"version": "1.0.11",
"resolved": "https://registry.npm.taobao.org/pako/download/pako-1.0.11.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpako%2Fdownload%2Fpako-1.0.11.tgz",
"integrity": "sha1-bJWZ00DVTf05RjgCUqNXBaa5kr8="
},
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npm.taobao.org/semver/download/semver-6.3.0.tgz?cache=0&sync_timestamp=1565627380363&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-6.3.0.tgz",
"integrity": "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0="
"version": "7.1.3",
"resolved": "https://registry.npm.taobao.org/semver/download/semver-7.1.3.tgz?cache=0&sync_timestamp=1581458063470&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-7.1.3.tgz",
"integrity": "sha1-5DRc5zBxxT8zZEXPwZ77HDEd8qY="
}
}
},
@ -12264,7 +12271,8 @@
"pako": {
"version": "1.0.10",
"resolved": "https://registry.npm.taobao.org/pako/download/pako-1.0.10.tgz",
"integrity": "sha1-Qyi621CGpCaqkPVBl31JVdpclzI="
"integrity": "sha1-Qyi621CGpCaqkPVBl31JVdpclzI=",
"dev": true
},
"parallel-transform": {
"version": "1.1.0",
@ -16084,6 +16092,11 @@
"integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=",
"dev": true
},
"vue-i18n": {
"version": "8.15.3",
"resolved": "https://registry.npm.taobao.org/vue-i18n/download/vue-i18n-8.15.3.tgz?cache=0&sync_timestamp=1576684265396&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-i18n%2Fdownload%2Fvue-i18n-8.15.3.tgz",
"integrity": "sha1-n5R4Atm3NPy5LiznJNplTy+fwPQ="
},
"vue-loader": {
"version": "15.9.0",
"resolved": "https://registry.npm.taobao.org/vue-loader/download/vue-loader-15.9.0.tgz?cache=0&sync_timestamp=1581493732642&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-loader%2Fdownload%2Fvue-loader-15.9.0.tgz",

View File

@ -151,7 +151,7 @@
"babel-minify-webpack-plugin": "^0.3.1",
"babel-preset-minify": "^0.5.1",
"browserslist": "^4.8.7",
"cfonts": "^2.6.1",
"cfonts": "^2.7.0",
"chalk": "^3.0.0",
"changelog-parser": "^2.8.0",
"copy-webpack-plugin": "^5.1.1",
@ -206,7 +206,7 @@
"dnscache": "^1.0.2",
"electron-log": "^4.0.6",
"electron-store": "^5.1.0",
"electron-updater": "^4.2.0",
"electron-updater": "^4.2.2",
"flac-metadata": "^0.1.1",
"js-htmlencode": "^0.3.0",
"lrc-file-parser": "^1.0.0",
@ -215,6 +215,7 @@
"request": "^2.88.2",
"vue": "^2.6.11",
"vue-electron": "^1.0.6",
"vue-i18n": "^8.15.3",
"vue-router": "^3.1.5",
"vuex": "^3.1.2",
"vuex-electron": "^1.0.3",

View File

@ -1,25 +1,3 @@
### 新增
- 允许选中列表内歌曲名、歌手名、专辑名内的文字,选中后可使用键盘快捷键进行复制
- 新增在列表可选内容区域**鼠标右击**时自动复制列表已选文字的功能
- 新增在搜索框**鼠标右击**时自动粘贴剪贴板的文本到搜索框中
- 任务下载失败时将显示搜索按钮,方便在其他源搜索该歌曲
### 优化
- 优化木叶之村主题翻页器背景颜色
- 优化各个主题音质标签颜色
- 优化其他一些界面细节及用户交互效果
### 修复
- 修复启用透明窗口鼠标不穿透的bug
- 修复大窗口时设置的音乐来源选项不换行的问题
- 修复某些情况下暂停任务会自动开始任务的问题
- 修复移除暂停、错误的任务时不删除未下载完成的文件的问题
- 修复酷狗源歌单热门标签歌单列表无法加载问题
- 修复QQ源歌单热门标签歌单列表无法加载问题
### 其他
- 更新electron到 8.0.1
- 新增多语言设置目前软件内置了简体中文、繁体中文、英语三种语言欢迎提交PR翻译更多语言

View File

@ -2,21 +2,21 @@ module.exports = {
windowSizeList: [
{
id: 1,
name: '',
name: 'small',
width: 920,
height: 590,
tabList: '645px',
},
{
id: 2,
name: '',
name: 'medium',
width: 1012,
height: 650,
tabList: '719px',
},
{
id: 3,
name: '',
name: 'big',
width: 1104,
height: 708,
tabList: '792px',

View File

@ -55,6 +55,7 @@ export default {
}),
},
created() {
this.$i18n.locale = this.setting.langId
this.saveSetting = throttle(n => {
window.electronStore_config.set('setting', n)
})

View File

@ -6,25 +6,25 @@ div(:class="$style.aside")
div(:class="$style.menu")
dl
dt 在线音乐
dt {{$t('core.aside.online_music')}}
dd
router-link(:active-class="$style.active" to="search") 搜索
router-link(:active-class="$style.active" to="search") {{$t('core.aside.search')}}
dd
router-link(:active-class="$style.active" to="songList") 歌单
router-link(:active-class="$style.active" to="songList") {{$t('core.aside.song_list')}}
dd
router-link(:active-class="$style.active" to="leaderboard") 排行榜
router-link(:active-class="$style.active" to="leaderboard") {{$t('core.aside.leaderboard')}}
dl
dt 我的音乐
dt {{$t('core.aside.my_music')}}
dd
router-link(:active-class="($route.query.id === defaultList.id || $route.query.id == '') ? $style.active : ''" :to="`list?id=${defaultList.id || ''}`") {{defaultList.name}}
router-link(:active-class="$route.query.id === loveList.id ? $style.active : ''" :to="`list?id=${loveList.id}`") {{loveList.name}}
router-link(:active-class="($route.query.id === defaultList.id || $route.query.id == '') ? $style.active : ''" :to="`list?id=${defaultList.id || ''}`") {{$t('core.aside.default_list')}}
router-link(:active-class="$route.query.id === loveList.id ? $style.active : ''" :to="`list?id=${loveList.id}`") {{$t('core.aside.love_list')}}
router-link(:active-class="$route.query.id === item.id ? $style.active : ''" v-for="item in userList" :to="`list?id=${item._id}`" :key="item._id") {{item.name}}
dl
dt 其他
dt {{$t('core.aside.other')}}
dd
router-link(:active-class="$style.active" to="download") 下载管理
router-link(:active-class="$style.active" to="download") {{$t('core.aside.download')}}
dd
router-link(:active-class="$style.active" to="setting") 设置
router-link(:active-class="$style.active" to="setting") {{$t('core.aside.setting')}}
</template>
<script>

View File

@ -7,19 +7,19 @@ div(:class="$style.player")
div(:class="$style.right")
div(:class="$style.column1")
div(:class="$style.container")
div(:class="$style.title" @click="handleCopy(title)" :title="title + '(点击复制)'") {{title}}
div(:class="$style.title" @click="handleCopy(title)" :title="title + $t('core.player.copy_title')") {{title}}
div(:class="$style.volumeContent")
div(:class="$style.volume")
div(:class="$style.volumeBar" :style="{ transform: `scaleX(${volume || 0})` }")
div(:class="$style.volumeMask" @mousedown="handleVolumeMsDown" ref="dom_volumeMask" :title="`当前音量:${parseInt(volume * 100)}%`")
div(:class="$style.volumeMask" @mousedown="handleVolumeMsDown" ref="dom_volumeMask" :title="`${$t('core.player.volume')}${parseInt(volume * 100)}%`")
//- div(:class="$style.playBtn" @click='handleNext' title="")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 291.063 291.064' space='preserve')
use(xlink:href='#icon-sound')
div(:class="$style.playBtn" @click='handleNext' title="下一首")
div(:class="$style.playBtn" @click='handleNext' :title="$t('core.player.next')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 220.847 220.847' space='preserve')
use(xlink:href='#icon-nextMusic')
div(:class="$style.playBtn" :title="isPlay ? '暂停' : '播放'" @click='togglePlay')
div(:class="$style.playBtn" :title="isPlay ? $t('core.player.pause') : $t('core.player.play')" @click='togglePlay')
svg(v-if="isPlay" version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 277.338 277.338' space='preserve')
use(xlink:href='#icon-pause')
svg(v-else version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 170 170' space='preserve')
@ -196,19 +196,19 @@ export default {
this.audio.addEventListener('playing', () => {
console.log('开始播放')
this.status = '播放中...'
this.status = this.$t('core.player.playing')
this.startPlay()
})
this.audio.addEventListener('pause', () => {
console.log('暂停播放')
this.lyric.lrc.pause()
this.stopPlay()
this.status = '暂停播放'
this.status = this.$t('core.player.stop')
})
this.audio.addEventListener('ended', () => {
console.log('播放完毕')
this.stopPlay()
this.status = '播放完毕'
this.status = this.$t('core.player.end')
this.handleNext()
})
this.audio.addEventListener('error', () => {
@ -221,12 +221,12 @@ export default {
if (!this.audioErrorTime) this.audioErrorTime = this.audio.currentTime //
this.retryNum++
this.setUrl(this.list[this.playIndex], true)
this.status = 'URL过期正在刷新URL...'
this.status = this.$t('core.player.refresh_url')
return
}
this.sendProgressEvent(this.progress, 'error')
this.status = '音频加载出错5 秒后切换下一首'
this.status = this.$t('core.player.error')
this.addDelayNextTimeout()
})
this.audio.addEventListener('loadeddata', () => {
@ -236,10 +236,10 @@ export default {
this.audioErrorTime = 0
}
if (!this.targetSong.interval && this.listId != 'download') this.updateMusicInfo({ id: 'default', index: this.playIndex, data: { interval: formatPlayTime2(this.maxPlayTime) } })
this.status = '音乐加载中...'
this.status = this.$t('core.player.loading')
})
this.audio.addEventListener('loadstart', () => {
this.status = '音乐加载中...'
this.status = this.$t('core.player.loading')
})
this.audio.addEventListener('canplay', () => {
console.log('加载完成开始播放')
@ -252,7 +252,7 @@ export default {
this.clearBufferTimeout()
}
// if (this.musicInfo.lrc) this.lyric.lrc.play(this.audio.currentTime * 1000)
this.status = '音乐加载中...'
this.status = this.$t('core.player.loading')
})
// this.audio.addEventListener('canplaythrough', () => {
// console.log('')
@ -276,7 +276,7 @@ export default {
// console.log('...')
this.stopPlay()
this.startBuffering()
this.status = '缓冲中...'
this.status = this.$t('core.player.buffering')
})
this.lyric.lrc = new Lyric({
@ -431,7 +431,7 @@ export default {
setUrl(targetSong, isRefresh) {
let type = this.getPlayType(this.setting.player.highQuality, targetSong)
this.musicInfo.url = targetSong.typeUrl[type]
this.status = '歌曲链接获取中...'
this.status = this.$t('core.player.geting_url')
return this.getUrl({ musicInfo: targetSong, type, isRefresh }).then(() => {
this.audio.src = this.musicInfo.url = targetSong.typeUrl[type]
@ -466,7 +466,7 @@ export default {
if (this.isPlay && (this.musicInfo.url || this.listId == 'download')) this.lyric.lrc.play(this.audio.currentTime * 1000)
})
.catch(() => {
this.status = '歌词获取失败'
this.status = this.$t('core.player.lyric_error')
})
},
handleRemoveMusic() {

View File

@ -6,9 +6,9 @@
@event="handleEvent" :list="tipList" :visibleList="visibleList"
v-model="searchText")
div(:class="$style.control")
button(type="button" :class="$style.min" title="最小化" @click="min")
button(type="button" :class="$style.min" :title="$t('core.toolbar.min')" @click="min")
//- button(type="button" :class="$style.max" @click="max")
button(type="button" :class="$style.close" title="关闭" @click="close")
button(type="button" :class="$style.close" :title="$t('core.toolbar.close')" @click="close")
</template>
<script>

View File

@ -33,7 +33,9 @@ export default {
type: Boolean,
default: false,
},
label: {},
label: {
type: String,
},
disabled: {
type: Boolean,
default: false,
@ -149,6 +151,7 @@ export default {
cursor: pointer;
display: flex;
color: @color-theme;
margin-top: .25em;
// border: 1px solid #ccc;
&:after {
position: absolute;
@ -173,6 +176,7 @@ export default {
flex: auto;
line-height: 1;
margin-left: 5px;
line-height: 1.5;
cursor: pointer;
}

View File

@ -5,7 +5,7 @@ material-modal(:show="show" :bg-close="bgClose" @close="handleClose")
| {{ info.name }}
br
| {{ info.singer }}
material-btn(:class="$style.btn" :title="!checkSource(type.type) && '腾讯、网易音源仅支持下载128k音质'" :disabled="!checkSource(type.type)" :key="type.type" @click="handleClick(type.type)" v-for="type in info.types") {{getTypeName(type.type)}} {{ type.type.toUpperCase() }}{{ type.size && ` - ${type.size.toUpperCase()}` }}
material-btn(:class="$style.btn" :title="!checkSource(type.type) && $t('material.download_modal.btn_tip')" :disabled="!checkSource(type.type)" :key="type.type" @click="handleClick(type.type)" v-for="type in info.types") {{getTypeName(type.type)}} {{ type.type.toUpperCase() }}{{ type.size && ` - ${type.size.toUpperCase()}` }}
</template>
@ -41,12 +41,12 @@ export default {
switch (type) {
case 'flac':
case 'ape':
return '无损音质'
return this.$t('material.download_modal.lossless')
case '320k':
return '高品音质'
return this.$t('material.download_modal.high_quality')
case '192k':
case '128k':
return '普通音质'
return this.$t('material.download_modal.normal')
}
},
checkSource(type) {

View File

@ -2,13 +2,13 @@
material-modal(:show="show" :bg-close="bgClose" @close="handleClose")
main(:class="$style.main")
h2
| 已选择 {{list.length}} 首歌曲
| {{$t('material.download_multiple_modal.tip', { len: list.length })}}
br
| 请选择要优先下载的音质
material-btn(:class="$style.btn" @click="handleClick('128k')") 普通音质 - 128K
material-btn(:class="$style.btn" @click="handleClick('320k')") 高品音质 - 320K
| {{$t('material.download_multiple_modal.tip2')}}
material-btn(:class="$style.btn" @click="handleClick('128k')") {{$t('material.download_multiple_modal.normal')}} - 128K
material-btn(:class="$style.btn" @click="handleClick('320k')") {{$t('material.download_multiple_modal.high_quality')}} - 320K
//- material-btn(:class="$style.btn" @click="handleClick('ape')") - APE
material-btn(:class="$style.btn" @click="handleClick('flac')") 无损音质 - FLAC
material-btn(:class="$style.btn" @click="handleClick('flac')") {{$t('material.download_multiple_modal.lossless')}} - FLAC
</template>
<script>

View File

@ -1,22 +1,22 @@
<template lang="pug">
transition(enter-active-class="animated-fast zoomIn" leave-active-class="animated zoomOut")
div(:class="$style.btns" v-show="show")
button(type="button" v-if="playBtn" title="播放" @click.stop="handleClick('play')")
button(type="button" v-if="playBtn" :title="$t('material.flow_btn.play')" @click.stop="handleClick('play')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 287.386 287.386' space='preserve')
use(xlink:href='#icon-testPlay')
button(type="button" v-if="addBtn" title="添加" @click.stop="handleClick('add')")
button(type="button" v-if="addBtn" :title="$t('material.flow_btn.play')" @click.stop="handleClick('add')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 42 42' space='preserve')
use(xlink:href='#icon-addTo')
button(type="button" v-if="downloadBtn" title="下载" @click.stop="handleClick('download')")
button(type="button" v-if="downloadBtn" :title="$t('material.flow_btn.download')" @click.stop="handleClick('download')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 475.078 475.077' space='preserve')
use(xlink:href='#icon-download')
button(type="button" v-if="startBtn" title="开始" @click.stop="handleClick('start')")
button(type="button" v-if="startBtn" :title="$t('material.flow_btn.start')" @click.stop="handleClick('start')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 170 170' space='preserve')
use(xlink:href='#icon-play')
button(type="button" v-if="pauseBtn" title="暂停" @click.stop="handleClick('pause')")
button(type="button" v-if="pauseBtn" :title="$t('material.flow_btn.pause')" @click.stop="handleClick('pause')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 277.338 277.338' space='preserve')
use(xlink:href='#icon-pause')
button(type="button" v-if="removeBtn" title="移除" @click.stop="handleClick('remove')")
button(type="button" v-if="removeBtn" :title="$t('material.flow_btn.remove')" @click.stop="handleClick('remove')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 212.982 212.982' space='preserve')
use(xlink:href='#icon-delete')

View File

@ -1,30 +1,30 @@
<template lang="pug">
div(:class="$style.btns")
button(type="button" v-if="playBtn" title="播放" @click.stop="handleClick('play')")
button(type="button" v-if="playBtn" :title="$t('material.list_buttons.play')" @click.stop="handleClick('play')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 287.386 287.386' space='preserve')
use(xlink:href='#icon-testPlay')
button(type="button" v-if="listAddBtn" title="添加到..." @click.stop="handleClick('listAdd')")
button(type="button" v-if="listAddBtn" :title="$t('material.list_buttons.add_to')" @click.stop="handleClick('listAdd')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 42 42' space='preserve')
use(xlink:href='#icon-addTo')
button(type="button" v-if="downloadBtn" title="下载" @click.stop="handleClick('download')")
button(type="button" v-if="downloadBtn" :title="$t('material.list_buttons.download')" @click.stop="handleClick('download')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 475.078 475.077' space='preserve')
use(xlink:href='#icon-download')
button(type="button" title="添加" v-if="userInfo" @click.stop="handleClick('add')")
button(type="button" :title="$t('material.list_buttons.add')" v-if="userInfo" @click.stop="handleClick('add')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 42 42' space='preserve')
use(xlink:href='#icon-addTo')
button(type="button" v-if="startBtn" title="开始" @click.stop="handleClick('start')")
button(type="button" v-if="startBtn" :title="$t('material.list_buttons.start')" @click.stop="handleClick('start')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 170 170' space='preserve')
use(xlink:href='#icon-play')
button(type="button" v-if="pauseBtn" title="暂停" @click.stop="handleClick('pause')")
button(type="button" v-if="pauseBtn" :title="$t('material.list_buttons.pause')" @click.stop="handleClick('pause')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 277.338 277.338' space='preserve')
use(xlink:href='#icon-pause')
button(type="button" v-if="fileBtn" title="定位文件" @click.stop="handleClick('file')")
button(type="button" v-if="fileBtn" :title="$t('material.list_buttons.file')" @click.stop="handleClick('file')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='-61 0 512 512' space='preserve')
use(xlink:href='#icon-musicFile')
button(type="button" v-if="searchBtn" title="搜索" @click.stop="handleClick('search')")
button(type="button" v-if="searchBtn" :title="$t('material.list_buttons.search')" @click.stop="handleClick('search')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 30.239 30.239' space='preserve')
use(xlink:href='#icon-search')
button(type="button" v-if="removeBtn" title="移除" @click.stop="handleClick('remove')")
button(type="button" v-if="removeBtn" :title="$t('material.list_buttons.remove')" @click.stop="handleClick('remove')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 212.982 212.982' space='preserve')
use(xlink:href='#icon-delete')

View File

@ -6,20 +6,20 @@ div(:class="$style.pagination" v-if="allPage > 1")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 451.846 451.847' space='preserve')
use(xlink:href='#icon-left')
li(v-else)
button(type="button" @click="handleClick(page - 1)" title="上一页")
button(type="button" @click="handleClick(page - 1)" :title="$t('material.pagination.prev')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 451.846 451.847' space='preserve')
use(xlink:href='#icon-left')
li(v-if="allPage > btnLength && page > pageEvg+1" :class="$style.first")
button(type="button" @click="handleClick(1)" title="第 1 页")
button(type="button" @click="handleClick(1)" :title="$t('material.pagination.page', { num: 1 })")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 451.846 451.847' space='preserve')
use(xlink:href='#icon-first')
li(v-for="(p, index) in pages" :key="index" :class="{[$style.active] : p == page}")
span(v-if="p === page" v-text="page")
button(v-else type="button" @click="handleClick(p)" v-text="p" :title="`第 ${p} 页`")
button(v-else type="button" @click="handleClick(p)" v-text="p" :title="$t('material.pagination.page', { num: p })")
li(v-if="allPage > btnLength && allPage - page > pageEvg" :class="$style.last")
button(type="button" @click="handleClick(allPage)" :title="`第 ${allPage} 页`")
button(type="button" @click="handleClick(allPage)" :title="$t('material.pagination.page', { num: allPage })")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 451.846 451.847' space='preserve')
use(xlink:href='#icon-last')
@ -29,7 +29,7 @@ div(:class="$style.pagination" v-if="allPage > 1")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 451.846 451.847' space='preserve')
use(xlink:href='#icon-right')
li(v-else)
button(type="button" @click="handleClick(page + 1)" title="下一页")
button(type="button" @click="handleClick(page + 1)" :title="$t('material.pagination.next')")
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 451.846 451.847' space='preserve')
use(xlink:href='#icon-right')

View File

@ -8,12 +8,12 @@ div(:class="$style.songList")
tr
th.nobreak.center(style="width: 37px;")
material-checkbox(id="search_select_all" v-model="isSelectAll" @change="handleSelectAllData"
:indeterminate="isIndeterminate" :title="isSelectAll && !isIndeterminate ? '全不选' : '全选'")
th.nobreak(style="width: 25%;") 歌曲名
th.nobreak(style="width: 20%;") 歌手
th.nobreak(style="width: 20%;") 专辑
th.nobreak(style="width: 20%;") 操作
th.nobreak(style="width: 10%;") 时长
:indeterminate="isIndeterminate" :title="isSelectAll && !isIndeterminate ? $t('material.song_list.unselect_all') : $t('material.song_list.select_all')")
th.nobreak(style="width: 25%;") {{$t('material.song_list.name')}}
th.nobreak(style="width: 20%;") {{$t('material.song_list.singer')}}
th.nobreak(style="width: 20%;") {{$t('material.song_list.album')}}
th.nobreak(style="width: 20%;") {{$t('material.song_list.action')}}
th.nobreak(style="width: 10%;") {{$t('material.song_list.time')}}
div.scroll(:class="$style.tbody" ref="dom_scrollContent")
table
tbody(@contextmenu="handleContextMenu")
@ -22,8 +22,8 @@ div(:class="$style.songList")
material-checkbox(:id="index.toString()" v-model="selectdList" @change="handleChangeSelect" :value="item")
td.break(style="width: 25%;")
span.select {{item.name}}
span.badge.badge-theme-success(v-if="item._types.ape || item._types.flac") 无损
span.badge.badge-theme-info(v-else-if="item._types['320k']") 高品质
span.badge.badge-theme-success(v-if="item._types.ape || item._types.flac") {{$t('material.song_list.lossless')}}
span.badge.badge-theme-info(v-else-if="item._types['320k']") {{$t('material.song_list.high_quality')}}
td.break(style="width: 20%;")
span.select {{item.singer}}
td.break(style="width: 20%;")

View File

@ -6,7 +6,7 @@
svg(version='1.1' xmlns='http://www.w3.org/2000/svg' xlink='http://www.w3.org/1999/xlink' height='100%' viewBox='0 0 451.847 451.847' space='preserve')
use(xlink:href='#icon-down')
div.scroll(:class="$style.list" :style="{ width: listStyle }" @click.stop ref="dom_list")
div(:class="$style.tag" @click="handleClick(null)") 默认
div(:class="$style.tag" @click="handleClick(null)") {{$t('material.tag_list.default')}}
dl(v-for="type in list")
dt(:class="$style.type") {{type.name}}
dd(:class="$style.tag" v-for="tag in type.list" @click="handleClick(tag)") {{tag.name}}
@ -56,7 +56,7 @@ export default {
handleClick(item) {
if (!item) {
item = {
name: '默认',
name: this.$t('material.tab_list.default'),
id: null,
}
}

View File

@ -2,10 +2,10 @@
material-modal(:show="show" :bg-close="bgClose" @close="handleClose")
main(:class="$style.main")
h2
| 添加&nbsp;
| {{$t('material.list_add_modal.title_first')}}&nbsp;
span(:class="$style.name") {{this.musicInfo && `${musicInfo.name}`}}
| &nbsp;...
material-btn(:class="$style.btn" :title="`把该歌曲添加到 ${item.name}`" :key="item.id" @click="handleClick(index)" v-for="(item, index) in lists") {{item.name}}
| &nbsp;{{$t('material.list_add_modal.title_last')}}
material-btn(:class="$style.btn" :title="$t('material.list_add_modal.btn_title', { name: item.name })" :key="item.id" @click="handleClick(index)" v-for="(item, index) in lists") {{item.name}}
</template>
<script>

View File

@ -1,8 +1,8 @@
<template lang="pug">
material-modal(:show="show" :bg-close="bgClose" @close="handleClose")
main(:class="$style.main")
h2 添加已选的 {{musicList.length}} 首歌曲到...
material-btn(:class="$style.btn" :title="`把该歌曲添加到 ${item.name}`" :key="item.id" @click="handleClick(index)" v-for="(item, index) in lists") {{item.name}}
h2 {{$t('material.list_add_multiple_modal.title', { num: musicList.length })}}
material-btn(:class="$style.btn" :title="$t('material.list_add_multiple_modal.btn_title', { name: item.name })" :key="item.id" @click="handleClick(index)" v-for="(item, index) in lists") {{item.name}}
</template>
<script>

View File

@ -0,0 +1,12 @@
{
"online_music": "在线音乐",
"search": "搜索",
"song_list": "歌单",
"leaderboard": "排行榜",
"my_music": "我的音乐",
"default_list": "试听列表",
"love_list": "收藏列表",
"other": "其他",
"download": "下载管理",
"setting": "设置"
}

View File

@ -0,0 +1,16 @@
{
"copy_title": "(点击复制)",
"volume": "当前音量:",
"pause": "暂停",
"play": "播放",
"next": "下一首",
"playing": "播放中...",
"stop": "暂停播放",
"end": "播放完毕",
"refresh_url": "URL过期正在刷新URL...",
"error": "音频加载出错5 秒后切换下一首",
"loading": "音乐加载中...",
"buffering": "缓冲中...",
"geting_url": "歌曲链接获取中...",
"lyric_error": "歌词获取失败"
}

View File

@ -0,0 +1,4 @@
{
"min": "最小化",
"close": "关闭"
}

View File

@ -0,0 +1,6 @@
{
"btn_tip": "腾讯、网易音源仅支持下载128k音质",
"lossless": "无损音质",
"high_quality": "高品音质",
"normal": "普通音质"
}

View File

@ -0,0 +1,7 @@
{
"tip": "已选择 {len} 首歌曲",
"tip2": "请选择要优先下载的音质",
"normal": "普通音质",
"high_quality": "高品音质",
"lossless": "无损音质"
}

View File

@ -0,0 +1,8 @@
{
"play": "播放",
"add": "添加",
"download": "下载",
"start": "开始",
"pause": "暂停",
"remove": "移除"
}

View File

@ -0,0 +1,5 @@
{
"title_first": "添加",
"title_last": "到...",
"btn_title": "把该歌曲添加到 {name}"
}

View File

@ -0,0 +1,4 @@
{
"title": "添加已选的 {num} 首歌曲到...",
"btn_title": "把该歌曲添加到 {name}"
}

View File

@ -0,0 +1,11 @@
{
"play": "播放",
"add_to": "添加到...",
"download": "下载",
"add": "添加",
"start": "开始",
"pause": "暂停",
"file": "定位文件",
"search": "搜索",
"remove": "移除"
}

View File

@ -0,0 +1,5 @@
{
"prev": "上一页",
"next": "下一页",
"page": "第 {num} 页"
}

View File

@ -0,0 +1,12 @@
{
"select_all": "全选",
"unselect_all": "全不选",
"name": "歌曲名",
"singer": "歌手",
"album": "专辑",
"action": "操作",
"time": "时长",
"lossless": "无损",
"high_quality": "高品质",
"loding_list": "列表加载中..."
}

View File

@ -0,0 +1,3 @@
{
"default": "默认"
}

View File

@ -0,0 +1,14 @@
{
"select_all": "全选",
"unselect_all": "全不选",
"name": "歌曲名",
"progress": "进度",
"status": "状态",
"quality": "品质",
"action": "操作",
"all": "全部任务",
"runing": "正在下载",
"paused": "已暂停",
"error": "出错",
"finished": "下载完成"
}

View File

@ -0,0 +1,11 @@
{
"select_all": "全选",
"unselect_all": "全不选",
"name": "歌曲名",
"singer": "歌手",
"album": "专辑",
"action": "操作",
"time": "时长",
"loding_list": "加载中...",
"no_item": "列表竟然是空的..."
}

View File

@ -0,0 +1,12 @@
{
"select_all": "全选",
"unselect_all": "全不选",
"name": "歌曲名",
"singer": "歌手",
"album": "专辑",
"action": "操作",
"time": "时长",
"lossless": "无损",
"high_quality": "高品质",
"no_item": "搜我所想~~😉"
}

View File

@ -0,0 +1,104 @@
{
"basic": "基本设置",
"basic_theme": "主题颜色",
"basic_animation_title": "弹出层的动画效果",
"basic_animation": "弹出层随机动画",
"basic_source_title": "选择音乐来源",
"basic_source_test": "测试接口(几乎软件的所有功能都可用)",
"basic_source_temp": "临时接口(软件的某些功能不可用,建议测试接口不可用再使用本接口)",
"basic_source": "音乐来源",
"basic_window_size_title": "设置软件窗口尺寸",
"basic_window_size": "窗口尺寸",
"basic_window_size_small": "小",
"basic_window_size_medium": "中",
"basic_window_size_big": "大",
"basic_lang_title": "软件显示的语言",
"basic_lang": "语言",
"play": "播放设置",
"play_toggle_title": "都不选时播放完当前歌曲就停止播放",
"play_toggle": "歌曲切换方式",
"play_toggle_list_loop": "列表循环",
"play_toggle_random": "列表随机",
"play_toggle_list": "顺序播放",
"play_toggle_single_loop": "单曲循环",
"play_quality_title": "启用时将优先播放320K品质的歌曲",
"play_quality": "优先播放高品质音乐",
"play_task_bar_title": "在任务栏上显示当前歌曲播放进度",
"play_task_bar": "任务栏播放进度条",
"list": "列表设置",
"list_source_title": "是否显示歌曲源",
"list_source": "是否显示歌曲源(仅对我的音乐分类有效)",
"list_scroll_title": "是否记住播放列表滚动条位置",
"list_scroll": "记住列表滚动位置(仅对我的音乐分类有效)",
"download": "下载设置",
"download_path_title": "下载歌曲保存的路径",
"download_path": "下载路径",
"download_path_label": "当前下载路径:",
"download_path_open_label": "点击打开当前路径",
"download_path_change_btn": "更改",
"download_name_title": "下载歌曲时的命名方式",
"download_name": "文件命名方式",
"download_embed_pic_title": "是否将封面嵌入音频文件中",
"download_embed_pic": "封面嵌入只支持MP3格式",
"download_lyric_title": "是否同时下载歌词文件",
"download_lyric": "歌词下载",
"download_name1": "歌名 - 歌手",
"download_name2": "歌手 - 歌名",
"download_name3": "歌名",
"download_select_save_path": "选择歌曲保存路径",
"network": "网络设置",
"network_proxy_title": "代理设置(乱设置软件将无法联网)",
"network_proxy_host": "主机",
"network_proxy_port": "端口",
"network_proxy_username": "用户名",
"network_proxy_password": "密码",
"odc": "强迫症设置",
"odc_clear_search_input": "离开搜索界面时清空搜索框",
"odc_clear_search_list": "离开搜索界面时清空搜索列表",
"backup": "备份与恢复",
"backup_part": "部分数据",
"backup_part_import_list": "导入列表",
"backup_part_export_list": "导出列表",
"backup_part_import_setting": "导入设置",
"backup_part_export_setting": "导出设置",
"backup_all": "所有数据(设置与试听列表)",
"backup_all_import": "导入",
"backup_all_export": "导出",
"backup_all_import_desc": "选择备份文件",
"backup_all_export_desc": "选择备份保存位置",
"backup_part_import_setting_desc": "选择配置文件",
"backup_part_export_setting_desc": "选择设置保存位置",
"backup_part_import_list_desc": "选择列表文件",
"backup_part_export_list_desc": "选择设置保存位置",
"other": "其他",
"other_cache": "缓存大小(清理缓存后图片等资源将需要重新下载,不建议清理,软件会根据磁盘空间动态管理缓存大小)",
"other_cache_label": "软件已使用缓存大小:",
"other_cache_label_title": "当前已用缓存",
"other_cache_clear_btn": "清理缓存",
"update": "软件更新",
"update_latest_label": "最新版本:",
"update_unknown": "未知",
"update_current_label": "当前版本:",
"update_downloading": "发现新版本并在努力下载中,请稍后...⏳",
"update_progress": "下载进度:",
"update_latest": "软件已是最新,尽情地体验吧~🥂",
"update_open_version_modal_btn": "打开更新窗口 🚀",
"update_checking": "检查更新中...",
"update_init": "更新初始化中...",
"about": "关于洛雪音乐",
"is_enable": "是否启用",
"is_show": "是否显示",
"click_open": "点击打开",
"click_copy": "点击复制"
}

View File

@ -0,0 +1,12 @@
{
"online_music": "在線音樂",
"search": "搜索",
"song_list": "歌單",
"leaderboard": "排行榜",
"my_music": "我的音樂",
"default_list": "試聽列表",
"love_list": "收藏列表",
"other": "其他",
"download": "下載管理",
"setting": "設置"
}

View File

@ -0,0 +1,16 @@
{
"copy_title": "(點擊複製)",
"volume": "當前音量:",
"pause": "暫停",
"play": "播放",
"next": "下一首",
"playing": "播放中...",
"stop": "暫停播放",
"end": "播放完畢",
"refresh_url": "URL過期正在刷新URL...",
"error": "音頻加載出錯5 秒後切換下一首",
"loading": "音樂加載中...",
"buffering": "緩衝中...",
"geting_url": "歌曲鏈接獲取中...",
"lyric_error": "歌詞獲取失敗"
}

View File

@ -0,0 +1,4 @@
{
"min": "最小化",
"close": "關閉"
}

View File

@ -0,0 +1,6 @@
{
"btn_tip": "騰訊、網易音源僅支持下載128k音質",
"lossless": "無損音質",
"high_quality": "高品音質",
"normal": "普通音質"
}

View File

@ -0,0 +1,7 @@
{
"tip": "已選擇 {len} 首歌曲",
"tip2": "請選擇要優先下載的音質",
"normal": "普通音質",
"high_quality": "高品音質",
"lossless": "無損音質"
}

View File

@ -0,0 +1,8 @@
{
"play": "播放",
"add": "添加",
"download": "下載",
"start": "開始",
"pause": "暫停",
"remove": "移除"
}

View File

@ -0,0 +1,5 @@
{
"title_first": "添加",
"title_last": "到...",
"btn_title": "把該歌曲添加到 {name}"
}

View File

@ -0,0 +1,4 @@
{
"title": "添加已選的 {num} 首歌曲到...",
"btn_title": "把該歌曲添加到 {name}"
}

View File

@ -0,0 +1,11 @@
{
"play": "播放",
"add_to": "添加到...",
"download": "下載",
"add": "添加",
"start": "開始",
"pause": "暫停",
"file": "定位文件",
"search": "搜索",
"remove": "移除"
}

View File

@ -0,0 +1,5 @@
{
"prev": "上一頁",
"next": "下一頁",
"page": "第 {num} 頁"
}

View File

@ -0,0 +1,12 @@
{
"select_all": "全選",
"unselect_all": "全不選",
"name": "歌曲名",
"singer": "歌手",
"album": "專輯",
"action": "操作",
"time": "時長",
"lossless": "無損",
"high_quality": "高品質",
"loding_list": "列表加載中..."
}

View File

@ -0,0 +1,3 @@
{
"default": "默認"
}

View File

@ -0,0 +1,14 @@
{
"select_all": "全選",
"unselect_all": "全不選",
"name": "歌曲名",
"progress": "進度",
"status": "狀態",
"quality": "品質",
"action": "操作",
"all": "全部任務",
"runing": "正在下載",
"paused": "已暫停",
"error": "出錯",
"finished": "下載完成"
}

View File

@ -0,0 +1,11 @@
{
"select_all": "全選",
"unselect_all": "全不選",
"name": "歌曲名",
"singer": "歌手",
"album": "專輯",
"action": "操作",
"time": "時長",
"loding_list": "加載中...",
"no_item": "列表竟然是空的..."
}

View File

@ -0,0 +1,12 @@
{
"select_all": "全選",
"unselect_all": "全不選",
"name": "歌曲名",
"singer": "歌手",
"album": "專輯",
"action": "操作",
"time": "時長",
"lossless": "無損",
"high_quality": "高品質",
"no_item": "搜我所想~~😉"
}

View File

@ -0,0 +1,93 @@
{
"basic": "基本設置",
"basic_theme": "主題顏色",
"basic_animation_title": "彈出層的動畫效果",
"basic_animation": "彈出層隨機動畫",
"basic_source_title": "選擇音樂來源",
"basic_source_test": "測試接口(幾乎軟件的所有功能都可用)",
"basic_source_temp": "臨時接口(軟件的某些功能不可用,建議測試接口不可用再使用本接口)",
"basic_source": "音樂來源",
"basic_window_size_title": "設置軟件窗口尺寸",
"basic_window_size": "窗口尺寸",
"basic_window_size_small": "小",
"basic_window_size_medium": "中",
"basic_window_size_big": "大",
"basic_lang_title": "軟件顯示的語言",
"basic_lang": "語言",
"play": "播放設置",
"play_toggle_title": "都不選時播放完當前歌曲就停止播放",
"play_toggle": "歌曲切換方式",
"play_toggle_list_loop": "列表循環",
"play_toggle_random": "列表隨機",
"play_toggle_list": "順序播放",
"play_toggle_single_loop": "單曲循環",
"play_quality_title": "啟用時將優先播放320K品質的歌曲",
"play_quality": "優先播放高品質音樂",
"play_task_bar_title": "在任務欄上顯示當前歌曲播放進度",
"play_task_bar": "任務欄播放進度條",
"list": "列表設置",
"list_source_title": "是否顯示歌曲源",
"list_source": "是否顯示歌曲源(僅對我的音樂分類有效)",
"list_scroll_title": "是否記住播放列表滾動條位置",
"list_scroll": "記住列表滾動位置(僅對我的音樂分類有效)",
"download": "下載設置",
"download_path_title": "下載歌曲保存的路徑",
"download_path": "下載路徑",
"download_path_label": "當前下載路徑:",
"download_path_open_label": "點擊打開當前路徑",
"download_path_change_btn": "更改",
"download_name_title": "下載歌曲時的命名方式",
"download_name": "文件命名方式",
"download_embed_pic_title": "是否將封面嵌入音頻文件中",
"download_embed_pic": "封面嵌入只支持MP3格式",
"download_lyric_title": "是否同時下載歌詞文件",
"download_lyric": "歌詞下載",
"download_name1": "歌名 - 歌手",
"download_name2": "歌手 - 歌名",
"download_name3": "歌名",
"download_select_save_path": "選擇歌曲保存路徑",
"network": "網絡設置",
"network_proxy_title": "代理設置(亂設置軟件將無法聯網)",
"network_proxy_host": "主機",
"network_proxy_port": "端口",
"network_proxy_username": "用戶名",
"network_proxy_password": "密碼",
"odc": "強迫症設置",
"odc_clear_search_input": "離開搜索界面時清空搜索框",
"odc_clear_search_list": "離開搜索界面時清空搜索列表",
"backup": "備份與恢復",
"backup_part": "部分數據",
"backup_part_import_list": "導入列表",
"backup_part_export_list": "導出列表",
"backup_part_import_setting": "導入設置",
"backup_part_export_setting": "導出設置",
"backup_all": "所有數據(設置與試聽列表)",
"backup_all_import": "導入",
"backup_all_export": "導出",
"backup_all_import_desc": "選擇備份文件",
"backup_all_export_desc": "選擇備份保存位置",
"backup_part_import_setting_desc": "選擇配置文件",
"backup_part_export_setting_desc": "選擇設置保存位置",
"backup_part_import_list_desc": "選擇列表文件",
"backup_part_export_list_desc": "選擇設置保存位置",
"other": "其他",
"other_cache": "緩存大小(清理緩存後圖片等資源將需要重新下載,不建議清理,軟件會根據磁盤空間動態管理緩存大小)",
"other_cache_label": "軟件已使用緩存大小:",
"other_cache_label_title": "當前已用緩存",
"other_cache_clear_btn": "清理緩存",
"update": "軟件更新",
"update_latest_label": "最新版本:",
"update_unknown": "未知",
"update_current_label": "當前版本:",
"update_downloading": "發現新版本並在努力下載中,請稍後...⏳",
"update_progress": "下載進度:",
"update_latest": "軟件已是最新,盡情地體驗吧~🥂",
"update_open_version_modal_btn": "打開更新窗口 🚀",
"update_checking": "檢查更新中...",
"update_init": "更新初始化中...",
"about": "關於洛雪音樂",
"is_enable": "是否啟用",
"is_show": "是否顯示",
"click_open": "點擊打開",
"click_copy": "點擊複製"
}

View File

@ -0,0 +1,12 @@
{
"online_music": "Online music",
"search": "Search",
"song_list": "Song list",
"leaderboard": "Leaderboard",
"my_music": "My music",
"default_list": "Preview list",
"love_list": "Favorites list",
"other": "Other",
"download": "Download manage",
"setting": "Setting"
}

View File

@ -0,0 +1,16 @@
{
"copy_title": " (Click copy)",
"volume": "Volume: ",
"pause": "Pause",
"play": "Play",
"next": "Next",
"playing": "Playing...",
"stop": "Stopped",
"end": "End",
"refresh_url": "URL expired, refreshing URL...",
"error": "Music loading error, switch to next song after 5 seconds",
"loading": "Loding...",
"buffering": "Buffering...",
"geting_url": "Getting link...",
"lyric_error": "Get lyric failed"
}

View File

@ -0,0 +1,4 @@
{
"min": "Minimize",
"close": "Close"
}

View File

@ -0,0 +1,6 @@
{
"btn_tip": "Tencent and Netease sources only support download 128k",
"lossless": "Lossless",
"high_quality": "High Quality",
"normal": "Normal"
}

View File

@ -0,0 +1,7 @@
{
"tip": "{len} songs selected",
"tip2": "Select priority download quality",
"normal": "Normal",
"high_quality": "High-quality",
"lossless": "Lossless"
}

View File

@ -0,0 +1,8 @@
{
"play": "Play",
"add": "Add",
"download": "Download",
"start": "Start",
"pause": "Pause",
"remove": "Remove"
}

View File

@ -0,0 +1,5 @@
{
"title_first": "Add",
"title_last": "to...",
"btn_title": "Add the song to {name}"
}

View File

@ -0,0 +1,4 @@
{
"title": "Add selected {num} songs to...",
"btn_title": "Add the song to {name}"
}

View File

@ -0,0 +1,11 @@
{
"play": "Play",
"add_to": "Add to...",
"download": "Download",
"add": "add",
"start": "Start",
"pause": "Pause",
"file": "Locate file",
"search": "Search",
"remove": "Remove"
}

View File

@ -0,0 +1,5 @@
{
"prev": "Prev",
"next": "Next",
"page": "Page {num}"
}

View File

@ -0,0 +1,12 @@
{
"select_all": "Select all",
"unselect_all": "Unselect all",
"name": "Name",
"singer": "Singer",
"album": "Album",
"action": "Actions",
"time": "Interval",
"lossless": "SQ",
"high_quality": "HQ",
"loding_list": "List loading..."
}

View File

@ -0,0 +1,3 @@
{
"default": "Default"
}

View File

@ -0,0 +1,14 @@
{
"select_all": "Select all",
"unselect_all": "Unselect all",
"name": "Name",
"progress": "Progress",
"status": "Status",
"quality": "Quality",
"action": "Actions",
"all": "All task",
"runing": "Downloading",
"paused": "Paused",
"error": "Error",
"finished": "Finished"
}

View File

@ -0,0 +1,11 @@
{
"select_all": "Select all",
"unselect_all": "Unselect all",
"name": "Name",
"singer": "Singer",
"album": "Album",
"action": "Actions",
"time": "Interval",
"loding_list": "Loading...",
"no_item": "The list turned out to be empty..."
}

View File

@ -0,0 +1,12 @@
{
"select_all": "Select all",
"unselect_all": "Unselect all",
"name": "Name",
"singer": "Singer",
"album": "Album",
"action": "Actions",
"time": "Interval",
"lossless": "SQ",
"high_quality": "HQ",
"no_item": "Search what i think~~😉"
}

View File

@ -0,0 +1,104 @@
{
"basic": "Basic settings",
"basic_theme": "Theme",
"basic_animation_title": "Animation effect of pop-up layer",
"basic_animation": "Pop-up layer random animation",
"basic_source_title": "Select music source",
"basic_source_test": "test interface (almost all functions of the software are available)",
"basic_source_temp": "temp interface (some functions are not available, it is recommended to use this interface if the test interface is unavailable)",
"basic_source": "Music source",
"basic_window_size_title": "Set software window size",
"basic_window_size": "Window size",
"basic_window_size_small": "small",
"basic_window_size_medium": "medium",
"basic_window_size_big": "big",
"basic_lang_title": "Software display language",
"basic_lang": "Language",
"play": "Playback settings",
"play_toggle_title": "Stop playing when the current song is finished without selecting any",
"play_toggle": "Music switching method",
"play_toggle_list_loop": "list loop",
"play_toggle_random": "random list",
"play_toggle_list": "play in order",
"play_toggle_single_loop": "single cycle",
"play_quality_title": "320K quality songs will be played preferentially when enabled",
"play_quality": "Prioritize high-quality music",
"play_task_bar_title": "Show current song playback progress on taskbar",
"play_task_bar": "Taskbar playback progress bar",
"list": "List settings",
"list_source_title": "Whether to show song sources",
"list_source": "Whether to show song sources (only valid for my music category)",
"list_scroll_title": "Whether to remember playlist scroll bar position",
"list_scroll": "Remember list scroll position (only valid for my music category)",
"download": "Download settings",
"download_path_title": "Download song save path",
"download_path": "Save path",
"download_path_label": "current save path: ",
"download_path_open_label": "click to open the current path",
"download_path_change_btn": "Change",
"download_name_title": "Naming when downloading songs",
"download_name": "File naming",
"download_embed_pic_title": "Whether to embed the cover in the audio file",
"download_embed_pic": "Cover embedding (only supports MP3 format)",
"download_lyric_title": "Whether to download lyrics files at the same time",
"download_lyric": "Lyrics download",
"download_name1": "name - singer",
"download_name2": "singer - name",
"download_name3": "name",
"download_select_save_path": "Select a song save path",
"network": "Network settings",
"network_proxy_title": "Proxy settings (disorderly setting software will not be able to network)",
"network_proxy_host": "host",
"network_proxy_port": "port",
"network_proxy_username": "username",
"network_proxy_password": "password",
"odc": "OCD settings",
"odc_clear_search_input": "Clear search box when leaving search interface",
"odc_clear_search_list": "Clear search list when leaving search interface",
"backup": "Backup and restore",
"backup_part": "Part of data",
"backup_part_import_list": "import list",
"backup_part_export_list": "export list",
"backup_part_import_setting": "import settings",
"backup_part_export_setting": "export settings",
"backup_all": "All data (settings and list)",
"backup_all_import": "import",
"backup_all_export": "export",
"backup_all_import_desc": "Select backup file",
"backup_all_export_desc": "Select backup save location",
"backup_part_import_setting_desc": "Choose a profile",
"backup_part_export_setting_desc": "Select a setting to save the location",
"backup_part_import_list_desc": "Select list file",
"backup_part_export_list_desc": "Select a setting to save the location",
"other": "Other",
"other_cache": "cache size (After clearing the cache, resources such as pictures will need to be downloaded again. Cleaning is not recommended. The software will dynamically manage the cache size based on disk space.)",
"other_cache_label": "used cache size: ",
"other_cache_label_title": "currently used cache",
"other_cache_clear_btn": "clear cache",
"update": "Software update",
"update_latest_label": "Latest version: ",
"update_unknown": "unknown",
"update_current_label": "Current version: ",
"update_downloading": "New version found and working hard to download, please wait...⏳",
"update_progress": "Download progress: ",
"update_latest": "The software is up to date, enjoy yourself~🥂",
"update_open_version_modal_btn": "open update window 🚀",
"update_checking": "checking for updates...",
"update_init": "initializing update...",
"about": "About lx-music-desktop",
"is_enable": "is enabel",
"is_show": "is show",
"click_open": "click to open",
"click_copy": "click to copy"
}

View File

@ -0,0 +1,27 @@
// http://kazupon.github.io/vue-i18n/en/messages.html
const requireLang = require.context(
'@/lang',
true,
/\.json$/,
)
const messages = {}
for (const file of requireLang.keys()) {
if (file === './index.js') continue
const path = file.replace(/(\.\/|\.json$)/g, '').split('/')
path.reduce((o, s, i) => {
if (o[s]) return o[s]
o[s] = i + 1 === path.length
? requireLang(file)
: {}
return o[s]
}, messages)
}
export default messages

View File

@ -0,0 +1,19 @@
[
{
"name": "简体中文",
"locale": "cns",
"alternate": "zh-Hans",
"country": "cn",
"fallback": true
},
{
"name": "繁体中文",
"locale": "cnt",
"country": "cn"
},
{
"name": "English",
"locale": "en",
"country": "us"
}
]

View File

@ -10,6 +10,7 @@ import './plugins'
import App from './App'
import router from './route'
import store from './store'
import i18n from './plugins/i18n'
import '../common/error'
@ -24,6 +25,7 @@ Vue.config.productionTip = false
new Vue({
router,
store,
i18n,
el: '#root',
render: h => h(App),
})

View File

@ -0,0 +1,22 @@
/**
* Vue i18n
*
* @library
*
* http://kazupon.github.io/vue-i18n/en/
*/
// Lib imports
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import messages from '@/lang'
Vue.use(VueI18n)
const i18n = new VueI18n({
locale: 'cns',
fallbackLocale: 'cns',
messages,
})
export default i18n

View File

@ -177,7 +177,7 @@ export const isChildren = (parent, children) => {
* @param {*} setting
*/
export const updateSetting = (setting, version) => {
const defaultVersion = '1.0.15'
const defaultVersion = '1.0.16'
if (!version) {
if (setting) {
version = setting.version
@ -237,6 +237,7 @@ export const updateSetting = (setting, version) => {
},
windowSizeId: 1,
themeId: 0,
langId: 'cns',
sourceId: 'kw',
apiSource: 'temp',
randomAnimate: true,

View File

@ -10,12 +10,12 @@ div(:class="$style.download")
tr
th.nobreak.center(style="width: 37px;")
material-checkbox(id="search_select_all" v-model="isSelectAll" @change="handleSelectAllData"
:indeterminate="isIndeterminate" :title="isSelectAll && !isIndeterminate ? '全不选' : '全选'")
th.nobreak(style="width: 28%;") 歌曲名
th.nobreak(style="width: 22%;") 进度
th.nobreak(style="width: 15%;") 状态
th.nobreak(style="width: 10%;") 品质
th.nobreak(style="width: 20%;") 操作
:indeterminate="isIndeterminate" :title="isSelectAll && !isIndeterminate ? $t('view.download.unselect_all') : $t('view.download.select_all')")
th.nobreak(style="width: 28%;") {{$t('view.download.name')}}
th.nobreak(style="width: 22%;") {{$t('view.download.progress')}}
th.nobreak(style="width: 15%;") {{$t('view.download.status')}}
th.nobreak(style="width: 10%;") {{$t('view.download.quality')}}
th.nobreak(style="width: 20%;") {{$t('view.download.action')}}
div.scroll(v-if="list.length" :class="$style.tbody")
table
tbody
@ -52,23 +52,23 @@ export default {
isShowDownloadMultiple: false,
tabs: [
{
name: '全部任务',
name: this.$t('view.download.all'),
id: 'all',
},
{
name: '正在下载',
name: this.$t('view.download.runing'),
id: 'runing',
},
{
name: '已暂停',
name: this.$t('view.download.paused'),
id: 'paused',
},
{
name: '出错',
name: this.$t('view.download.error'),
id: 'error',
},
{
name: '下载完成',
name: this.$t('view.download.finished'),
id: 'finished',
},
],

View File

@ -3,7 +3,7 @@
div(:class="$style.header")
material-tab(:class="$style.tab" :list="types" align="left" item-key="id" item-name="name" v-model="tabId")
material-select(:class="$style.select" :list="sourceInfo.sources" item-key="id" item-name="name" v-model="source")
material-song-list(v-model="selectdData" @action="handleSongListAction" :source="source" :page="page" :limit="info.limit" :total="info.total" :list="list")
material-song-list(v-model="selectdData" @action="handleSongListAction" :source="source" :page="page" :limit="info.limit" :total="info.total" :noItem="$t('material.song_list.loding_list')" :list="list")
material-download-modal(:show="isShowDownload" :musicInfo="musicInfo" @select="handleAddDownload" @close="isShowDownload = false")
material-download-multiple-modal(:show="isShowDownloadMultiple" :list="selectdData" @select="handleAddDownloadMultiple" @close="isShowDownloadMultiple = false")
material-list-add-modal(:show="isShowListAdd" :musicInfo="musicInfo" @close="isShowListAdd = false")

View File

@ -8,12 +8,12 @@
tr
th.nobreak.center(style="width: 37px;")
material-checkbox(id="search_select_all" v-model="isSelectAll" @change="handleSelectAllData"
:indeterminate="isIndeterminate" :title="isSelectAll && !isIndeterminate ? '全不选' : '全选'")
th.nobreak(style="width: 25%;") 歌曲名
th.nobreak(style="width: 20%;") 歌手
th.nobreak(style="width: 20%;") 专辑
th.nobreak(style="width: 20%;") 操作
th.nobreak(style="width: 10%;") 时长
:indeterminate="isIndeterminate" :title="isSelectAll && !isIndeterminate ? $t('view.list.unselect_all') : $t('view.list.select_all')")
th.nobreak(style="width: 25%;") {{$t('view.list.name')}}
th.nobreak(style="width: 20%;") {{$t('view.list.singer')}}
th.nobreak(style="width: 20%;") {{$t('view.list.album')}}
th.nobreak(style="width: 20%;") {{$t('view.list.action')}}
th.nobreak(style="width: 10%;") {{$t('view.list.time')}}
div.scroll(:class="$style.tbody" @scroll="handleScroll" ref="dom_scrollContent")
table
tbody(@contextmenu="handleContextMenu")
@ -42,7 +42,7 @@
td(style="width: 10%;")
span(:class="$style.time") {{item.interval || '--/--'}}
div(:class="$style.noItem" v-else)
p(v-text="list.length ? '加载中...' : '列表竟然是空的...'")
p(v-text="list.length ? $t('view.list.loding_list') : $t('view.list.no_item')")
material-download-modal(:show="isShowDownload" :musicInfo="musicInfo" @select="handleAddDownload" @close="isShowDownload = false")
material-download-multiple-modal(:show="isShowDownloadMultiple" :list="selectdData" @select="handleAddDownloadMultiple" @close="isShowDownloadMultiple = false")
material-flow-btn(:show="isShowEditBtn" :play-btn="false" @btn-click="handleFlowBtnClick")
@ -313,14 +313,6 @@ export default {
if (isSelect) this.resetSelect()
this.isShowListAddMultiple = false
},
getSource(source) {
switch (source) {
case 'kw':
return '酷我'
default:
break
}
},
getMusicLocation(index) {
let dom = document.getElementById('mid_' + this.list[index].songmid)
return dom ? dom.offsetTop : 0

View File

@ -10,12 +10,12 @@
tr
th.nobreak.center(style="width: 37px;")
material-checkbox(id="search_select_all" v-model="isSelectAll" @change="handleSelectAllData"
:indeterminate="isIndeterminate" :title="isSelectAll && !isIndeterminate ? '全不选' : '全选'")
th.nobreak(style="width: 25%;") 歌曲名
th.nobreak(style="width: 20%;") 歌手
th.nobreak(style="width: 25%;") 专辑
th.nobreak(style="width: 15%;") 操作
th.nobreak(style="width: 10%;") 时长
:indeterminate="isIndeterminate" :title="isSelectAll && !isIndeterminate ? $t('view.search.unselect_all') : $t('view.search.select_all')")
th.nobreak(style="width: 25%;") {{$t('view.search.name')}}
th.nobreak(style="width: 20%;") {{$t('view.search.singer')}}
th.nobreak(style="width: 25%;") {{$t('view.search.album')}}
th.nobreak(style="width: 15%;") {{$t('view.search.action')}}
th.nobreak(style="width: 10%;") {{$t('view.search.time')}}
div.scroll(:class="$style.tbody" ref="dom_scrollContent")
table
tbody(@contextmenu="handleContextMenu")
@ -24,8 +24,8 @@
material-checkbox(:id="index.toString()" v-model="selectdData" :value="item")
td.break(style="width: 25%;")
span.select {{item.name}}
span.badge.badge-theme-success(v-if="item._types.ape || item._types.flac") 无损
span.badge.badge-theme-info(v-else-if="item._types['320k']") 高品质
span.badge.badge-theme-success(v-if="item._types.ape || item._types.flac") {{$t('material.song_list.lossless')}}
span.badge.badge-theme-info(v-else-if="item._types['320k']") {{$t('material.song_list.high_quality')}}
span(:class="$style.labelSource" v-if="searchSourceId == 'all'") {{item.source}}
td.break(style="width: 20%;")
span.select {{item.singer}}
@ -41,7 +41,7 @@
div(:class="$style.pagination")
material-pagination(:count="listInfo.total" :limit="listInfo.limit" :page="page" @btn-click="handleTogglePage")
div(v-else :class="$style.noitem")
p 搜我所想~~😉
p {{$t('view.search.no_item')}}
material-download-modal(:show="isShowDownload" :musicInfo="musicInfo" @select="handleAddDownload" @close="isShowDownload = false")
material-download-multiple-modal(:show="isShowDownloadMultiple" :list="selectdData" @select="handleAddDownloadMultiple" @close="isShowDownloadMultiple = false")
material-flow-btn(:show="isShowEditBtn && (searchSourceId == 'kw' || searchSourceId == 'all' || !isAPITemp)" :remove-btn="false" @btn-click="handleFlowBtnClick")

View File

@ -1,156 +1,163 @@
<template lang="pug">
div.scroll(:class="$style.setting")
dl
dt 基本设置
dt {{$t('view.setting.basic')}}
dd
h3 主题颜色
h3 {{$t('view.setting.basic_theme')}}
div
ul(:class="$style.theme")
li(v-for="theme in themes.list" :key="theme.id" @click="current_setting.themeId = theme.id" :class="[theme.class, themes.active == theme.id ? $style.active : '']")
span
| {{theme.name}}
dd(title='弹出层的动画效果')
h3 弹出层随机动画
dd(:title="$t('view.setting.basic_animation_title')")
h3 {{$t('view.setting.basic_animation')}}
div
material-checkbox(id="setting_animate" v-model="current_setting.randomAnimate" label="是否启用")
material-checkbox(id="setting_animate" v-model="current_setting.randomAnimate" :label="$t('view.setting.is_enable')")
dd(title='选择音乐来源')
h3 音乐来源
dd(:title="$t('view.setting.basic_source_title')")
h3 {{$t('view.setting.basic_source')}}
div
div(v-for="item in apiSources" :key="item.id" :class="$style.gapTop")
material-checkbox(:id="`setting_api_source_${item.id}`" name="setting_api_source" @change="handleAPISourceChange(item.id)"
need v-model="current_setting.apiSource" :disabled="item.disabled" :value="item.id" :label="item.label")
dd(title='设置软件窗口尺寸')
h3 窗口尺寸
dd(:title="$t('view.setting.basic_window_size_title')")
h3 {{$t('view.setting.basic_window_size')}}
div
material-checkbox(v-for="(item, index) in windowSizeList" :id="`setting_window_size_${item.id}`" name="setting_window_size" @change="handleWindowSizeChange(index)" :class="$style.gapLeft"
need v-model="current_setting.windowSizeId" :value="item.id" :label="item.name" :key="item.id")
need v-model="current_setting.windowSizeId" :value="item.id" :label="$t('view.setting.basic_window_size_' + item.name)" :key="item.id")
dt 播放设置
dd(title="都不选时播放完当前歌曲就停止播放")
h3 歌曲切换方式
dd(:title="$t('view.setting.basic_lang_title')")
h3 {{$t('view.setting.basic_lang')}}
div
material-checkbox(v-for="item in languageList" :key="item.locale" :id="`setting_lang_${item.locale}`" name="setting_lang"
@change="handleLangChange(item.locale)" :class="$style.gapLeft"
need v-model="current_setting.langId" :value="item.locale" :label="item.name")
dt {{$t('view.setting.play')}}
dd(:title="$t('view.setting.play_toggle_title')")
h3 {{$t('view.setting.play_toggle')}}
div
material-checkbox(:id="`setting_player_togglePlay_${item.value}`" :class="$style.gapLeft" :value="item.value" :key="item.value"
v-model="current_setting.player.togglePlayMethod" v-for="item in togglePlayMethods" :label="item.name")
dd(title='启用时将优先播放320K品质的歌曲')
h3 优先播放高品质音乐
dd(:title="$t('view.setting.play_quality_title')")
h3 {{$t('view.setting.play_quality')}}
div
material-checkbox(id="setting_player_highQuality" v-model="current_setting.player.highQuality" label="是否启用")
dd(title='在任务栏上显示当前歌曲播放进度')
h3 任务栏播放进度条
material-checkbox(id="setting_player_highQuality" v-model="current_setting.player.highQuality" :label="$t('view.setting.is_enable')")
dd(:title="$t('view.setting.play_task_bar_title')")
h3 {{$t('view.setting.play_task_bar')}}
div
material-checkbox(id="setting_player_showTaskProgess" v-model="current_setting.player.isShowTaskProgess" label="是否启用")
dt 列表设置
dd(title='是否显示歌曲源')
h3 是否显示歌曲源仅对我的音乐分类有效
material-checkbox(id="setting_player_showTaskProgess" v-model="current_setting.player.isShowTaskProgess" :label="$t('view.setting.is_enable')")
dt {{$t('view.setting.list')}}
dd(:title="$t('view.setting.list_source_title')")
h3 {{$t('view.setting.list_source')}}
div
material-checkbox(id="setting_list_showSource_enable" v-model="current_setting.list.isShowSource" label="是否显示")
dd(title='是否记住播放列表滚动条位置')
h3 记住列表滚动位置仅对我的音乐分类有效
material-checkbox(id="setting_list_showSource_enable" v-model="current_setting.list.isShowSource" :label="$t('view.setting.is_show')")
dd(:title="$t('view.setting.list_scroll_title')")
h3 {{$t('view.setting.list_scroll')}}
div
material-checkbox(id="setting_list_scroll_enable" v-model="current_setting.list.scroll.enable" label="是否启用")
//- dd(title='')
material-checkbox(id="setting_list_scroll_enable" v-model="current_setting.list.scroll.enable" :label="$t('view.setting.is_enable')")
//- dd(:title="")
h3 专辑栏
div
material-checkbox(id="setting_list_showalbum" v-model="current_setting.list.isShowAlbumName" label="是否显示专辑栏")
dt 下载设置
dd(title='下载歌曲保存的路径')
h3 下载路径
dt {{$t('view.setting.download')}}
dd(:title="$t('view.setting.download_path_title')")
h3 {{$t('view.setting.download_path')}}
div
p
| 当前下载路径
span.auto-hidden.hover(title="点击打开当前路径" :class="$style.savePath" @click="handleOpenDir(current_setting.download.savePath)") {{current_setting.download.savePath}}
| {{$t('view.setting.download_path_label')}}
span.auto-hidden.hover(:title="$t('view.setting.download_path_open_label')" :class="$style.savePath" @click="handleOpenDir(current_setting.download.savePath)") {{current_setting.download.savePath}}
p
material-btn(:class="$style.btn" min @click="handleChangeSavePath") 更改
dd(title='下载歌曲时的命名方式')
h3 文件命名方式
material-btn(:class="$style.btn" min @click="handleChangeSavePath") {{$t('view.setting.download_path_change_btn')}}
dd(:title="$t('view.setting.download_name_title')")
h3 {{$t('view.setting.download_name')}}
div
material-checkbox(:id="`setting_download_musicName_${item.value}`" :class="$style.gapLeft" name="setting_download_musicName" :value="item.value" :key="item.value" need
v-model="current_setting.download.fileName" v-for="item in musicNames" :label="item.name")
dd(title='是否将封面嵌入音频文件中')
h3 封面嵌入只支持MP3格式
dd(:title="$t('view.setting.download_embed_pic_title')")
h3 {{$t('view.setting.download_embed_pic')}}
div
material-checkbox(id="setting_download_isEmbedPic" v-model="current_setting.download.isEmbedPic" label="是否启用")
dd(title='是否同时下载歌词文件')
h3 歌词下载
material-checkbox(id="setting_download_isEmbedPic" v-model="current_setting.download.isEmbedPic" :label="$t('view.setting.is_enable')")
dd(:title="$t('view.setting.download_lyric_title')")
h3 {{$t('view.setting.download_lyric')}}
div
material-checkbox(id="setting_download_isDownloadLrc" v-model="current_setting.download.isDownloadLrc" label="是否启用")
dt 网络设置
material-checkbox(id="setting_download_isDownloadLrc" v-model="current_setting.download.isDownloadLrc" :label="$t('view.setting.is_enable')")
dt {{$t('view.setting.network')}}
dd
h3 代理设置乱设置软件将无法联网
h3 {{$t('view.setting.network_proxy_title')}}
div
p
material-checkbox(id="setting_network_proxy_enable" v-model="current_setting.network.proxy.enable" @change="handleProxyChange('enable')" label="是否启用")
material-checkbox(id="setting_network_proxy_enable" v-model="current_setting.network.proxy.enable" @change="handleProxyChange('enable')" :label="$t('view.setting.is_enable')")
p
material-input(:class="$style.gapLeft" v-model="current_setting.network.proxy.host" @change="handleProxyChange('host')" placeholder="主机")
material-input(:class="$style.gapLeft" v-model="current_setting.network.proxy.port" @change="handleProxyChange('port')" placeholder="端口")
material-input(:class="$style.gapLeft" v-model="current_setting.network.proxy.host" @change="handleProxyChange('host')" :placeholder="$t('view.setting.network_proxy_host')")
material-input(:class="$style.gapLeft" v-model="current_setting.network.proxy.port" @change="handleProxyChange('port')" :placeholder="$t('view.setting.network_proxy_port')")
p
material-input(:class="$style.gapLeft" v-model="current_setting.network.proxy.username" @change="handleProxyChange('username')" placeholder="用户名")
material-input(:class="$style.gapLeft" v-model="current_setting.network.proxy.password" @change="handleProxyChange('password')" type="password" placeholder="密码")
dt 强迫症设置
material-input(:class="$style.gapLeft" v-model="current_setting.network.proxy.username" @change="handleProxyChange('username')" :placeholder="$t('view.setting.network_proxy_username')")
material-input(:class="$style.gapLeft" v-model="current_setting.network.proxy.password" @change="handleProxyChange('password')" type="password" :placeholder="$t('view.setting.network_proxy_password')")
dt {{$t('view.setting.odc')}}
dd
h3 离开搜索界面时清空搜索框
h3 {{$t('view.setting.odc_clear_search_input')}}
div
material-checkbox(id="setting_odc_isAutoClearSearchInput" v-model="current_setting.odc.isAutoClearSearchInput" label="是否启用")
material-checkbox(id="setting_odc_isAutoClearSearchInput" v-model="current_setting.odc.isAutoClearSearchInput" :label="$t('view.setting.is_enable')")
dd
h3 离开搜索界面时清空搜索列表
h3 {{$t('view.setting.odc_clear_search_list')}}
div
material-checkbox(id="setting_odc_isAutoClearSearchList" v-model="current_setting.odc.isAutoClearSearchList" label="是否启用")
dt 备份与恢复
material-checkbox(id="setting_odc_isAutoClearSearchList" v-model="current_setting.odc.isAutoClearSearchList" :label="$t('view.setting.is_enable')")
dt {{$t('view.setting.backup')}}
dd
h3 部分数据
h3 {{$t('view.setting.backup_part')}}
div
material-btn(:class="[$style.btn, $style.gapLeft]" min @click="handleImportPlayList") 导入列表
material-btn(:class="[$style.btn, $style.gapLeft]" min @click="handleExportPlayList") 导出列表
material-btn(:class="[$style.btn, $style.gapLeft]" min @click="handleImportSetting") 导入设置
material-btn(:class="[$style.btn, $style.gapLeft]" min @click="handleExportSetting") 导出设置
material-btn(:class="[$style.btn, $style.gapLeft]" min @click="handleImportPlayList") {{$t('view.setting.backup_part_import_list')}}
material-btn(:class="[$style.btn, $style.gapLeft]" min @click="handleExportPlayList") {{$t('view.setting.backup_part_export_list')}}
material-btn(:class="[$style.btn, $style.gapLeft]" min @click="handleImportSetting") {{$t('view.setting.backup_part_import_setting')}}
material-btn(:class="[$style.btn, $style.gapLeft]" min @click="handleExportSetting") {{$t('view.setting.backup_part_export_setting')}}
dd
h3 所有数据设置与试听列表
h3 {{$t('view.setting.backup_all')}}
div
material-btn(:class="[$style.btn, $style.gapLeft]" min @click="handleImportAllData") 导入
material-btn(:class="[$style.btn, $style.gapLeft]" min @click="handleExportAllData") 导出
dt 其他
material-btn(:class="[$style.btn, $style.gapLeft]" min @click="handleImportAllData") {{$t('view.setting.backup_all_import')}}
material-btn(:class="[$style.btn, $style.gapLeft]" min @click="handleExportAllData") {{$t('view.setting.backup_all_export')}}
dt {{$t('view.setting.other')}}
dd
h3 缓存大小清理缓存后图片等资源将需要重新下载不建议清理软件会根据磁盘空间动态管理缓存大小
h3 {{$t('view.setting.other_cache')}}
div
p
| 软件已使用缓存大小
span.auto-hidden(title="当前已用缓存") {{cacheSize}}
| {{$t('view.setting.other_cache_label')}}
span.auto-hidden(:title="$t('view.setting.other_cache_label_title')") {{cacheSize}}
p
material-btn(:class="$style.btn" min @click="clearCache") 清理缓存
dt 软件更新
material-btn(:class="$style.btn" min @click="clearCache") {{$t('view.setting.other_cache_clear_btn')}}
dt {{$t('view.setting.update')}}
dd
p.small
| 最新版本{{version.newVersion ? version.newVersion.version : '未知'}}
p.small 当前版本{{version.version}}
| {{$t('view.setting.update_latest_label')}}{{version.newVersion ? version.newVersion.version : $t('view.setting.update_unknown')}}
p.small {{$t('view.setting.update_current_label')}}{{version.version}}
p.small(v-if="this.version.downloadProgress" style="line-height: 1.5;")
| 发现新版本并在努力下载中请稍后...
| {{$t('view.setting.update_downloading')}}
br
| 下载进度{{downloadProgress}}
| {{$t('view.setting.update_progress')}}{{downloadProgress}}
p(v-if="version.newVersion")
span(v-if="version.isLatestVer") 软件已是最新尽情地体验吧~🥂
material-btn(v-else :class="[$style.btn, $style.gapLeft]" min @click="showUpdateModal") 打开更新窗口 🚀
p.small(v-else) 检查更新中...
dt 关于洛雪音乐
span(v-if="version.isLatestVer") {{$t('view.setting.update_latest')}}
material-btn(v-else :class="[$style.btn, $style.gapLeft]" min @click="showUpdateModal") {{$t('view.setting.update_open_version_modal_btn')}}
p.small(v-else) {{$t('view.setting.update_checking')}}
dt {{$t('view.setting.about')}}
dd
p.small
| 本软件完全免费代码已开源开源地址
span.hover.underline(title="点击打开" @click="handleOpenUrl('https://github.com/lyswhut/lx-music-desktop#readme')") https://github.com/lyswhut/lx-music-desktop
span.hover.underline(:title="$t('view.setting.click_open')" @click="handleOpenUrl('https://github.com/lyswhut/lx-music-desktop#readme')") https://github.com/lyswhut/lx-music-desktop
p.small
| 最新版网盘下载地址网盘内有WindowsMAC版
span.hover.underline(title="点击打开" @click="handleOpenUrl('https://www.lanzous.com/b906260/')") 网盘地址
span.hover.underline(:title="$t('view.setting.click_open')" @click="handleOpenUrl('https://www.lanzous.com/b906260/')") 网盘地址
| &nbsp;&nbsp;密码
span.hover(title="点击复制" @click="clipboardWriteText('glqw')") glqw
span.hover(:title="$t('view.setting.click_copy')" @click="clipboardWriteText('glqw')") glqw
p.small
| 软件的常见问题可转至
span.hover.underline(title="点击打开" @click="handleOpenUrl('https://github.com/lyswhut/lx-music-desktop/blob/master/FAQ.md')") 常见问题
span.hover.underline(:title="$t('view.setting.click_open')" @click="handleOpenUrl('https://github.com/lyswhut/lx-music-desktop/blob/master/FAQ.md')") 常见问题
p.small
| 阅读常见问题后仍有问题可 mail to
span.hover(title="点击复制" @click="clipboardWriteText('lyswhut@qq.com')") lyswhut@qq.com
span.hover(:title="$t('view.setting.click_copy')" @click="clipboardWriteText('lyswhut@qq.com')") lyswhut@qq.com
| &nbsp;或到 GitHub 提交&nbsp;
span.hover.underline(title="点击打开" @click="handleOpenUrl('https://github.com/lyswhut/lx-music-desktop/issues')") issue
span.hover.underline(:title="$t('view.setting.click_open')" @click="handleOpenUrl('https://github.com/lyswhut/lx-music-desktop/issues')") issue
br
p.small
@ -203,6 +210,7 @@ import {
} from '../utils'
import { rendererSend } from '../../common/ipc'
import fs from 'fs'
import languageList from '@/lang/languages.json'
export default {
name: 'Setting',
@ -215,7 +223,57 @@ export default {
downloadProgress() {
return this.version.downloadProgress
? `${this.version.downloadProgress.percent.toFixed(2)}% - ${sizeFormate(this.version.downloadProgress.transferred)}/${sizeFormate(this.version.downloadProgress.total)} - ${sizeFormate(this.version.downloadProgress.bytesPerSecond)}/s`
: '更新初始化中...'
: this.$t('view.setting.update_init')
},
togglePlayMethods() {
return [
{
name: this.$t('view.setting.play_toggle_list_loop'),
value: 'listLoop',
},
{
name: this.$t('view.setting.play_toggle_random'),
value: 'random',
},
{
name: this.$t('view.setting.play_toggle_list'),
value: 'list',
},
{
name: this.$t('view.setting.play_toggle_single_loop'),
value: 'singleLoop',
},
]
},
apiSources() {
return [
{
id: 'test',
label: this.$t('view.setting.basic_source_test'),
disabled: false,
},
{
id: 'temp',
label: this.$t('view.setting.basic_source_temp'),
disabled: false,
},
]
},
musicNames() {
return [
{
name: this.$t('view.setting.download_name1'),
value: '歌名 - 歌手',
},
{
name: this.$t('view.setting.download_name2'),
value: '歌手 - 歌名',
},
{
name: this.$t('view.setting.download_name3'),
value: '歌名',
},
]
},
},
data() {
@ -254,55 +312,13 @@ export default {
isAutoClearSearchList: false,
},
windowSizeId: 1,
langId: 'cns',
themeId: 0,
sourceId: 0,
randomAnimate: true,
apiSource: 'messoer',
},
togglePlayMethods: [
{
name: '列表循环',
value: 'listLoop',
},
{
name: '列表随机',
value: 'random',
},
{
name: '顺序播放',
value: 'list',
},
{
name: '单曲循环',
value: 'singleLoop',
},
],
apiSources: [
{
id: 'test',
label: '测试接口(几乎软件的所有功能都可用)',
disabled: false,
},
{
id: 'temp',
label: '临时接口(软件的某些功能不可用,建议测试接口不可用再使用本接口)',
disabled: false,
},
],
musicNames: [
{
name: '歌名 - 歌手',
value: '歌名 - 歌手',
},
{
name: '歌手 - 歌名',
value: '歌手 - 歌名',
},
{
name: '歌名',
value: '歌名',
},
],
languageList,
cacheSize: '0 B',
}
},
@ -337,7 +353,7 @@ export default {
},
handleChangeSavePath() {
selectDir({
title: '选择歌曲保存路径',
title: this.$t('view.setting.download_select_save_path'),
defaultPath: this.current_setting.download.savePath,
properties: ['openDirectory'],
}).then(result => {
@ -429,7 +445,7 @@ export default {
},
handleImportAllData() {
selectDir({
title: '选择备份文件',
title: this.$t('view.setting.backup_all_import_desc'),
properties: ['openFile'],
filters: [
{ name: 'Setting', extensions: ['json'] },
@ -442,7 +458,7 @@ export default {
},
handleExportAllData() {
openSaveDir({
title: '选择备份保存位置',
title: this.$t('view.setting.backup_all_export_desc'),
defaultPath: 'lx_datas.json',
}).then(result => {
if (result.canceled) return
@ -451,7 +467,7 @@ export default {
},
handleImportSetting() {
selectDir({
title: '选择配置文件',
title: this.$t('view.setting.backup_part_import_setting_desc'),
properties: ['openFile'],
filters: [
{ name: 'Setting', extensions: ['json'] },
@ -464,7 +480,7 @@ export default {
},
handleExportSetting() {
openSaveDir({
title: '选择设置保存位置',
title: this.$t('view.setting.backup_part_export_setting_desc'),
defaultPath: 'lx_setting.json',
}).then(result => {
if (result.canceled) return
@ -473,7 +489,7 @@ export default {
},
handleImportPlayList() {
selectDir({
title: '选择列表文件',
title: this.$t('view.setting.backup_part_import_list_desc'),
properties: ['openFile'],
filters: [
{ name: 'Play List', extensions: ['json'] },
@ -486,7 +502,7 @@ export default {
},
handleExportPlayList() {
openSaveDir({
title: '选择设置保存位置',
title: this.$t('view.setting.backup_part_export_list_desc'),
defaultPath: 'lx_list.json',
}).then(result => {
if (result.canceled) return
@ -533,6 +549,9 @@ export default {
}
this.init()
},
handleLangChange(id) {
this.$i18n.locale = id
},
},
}
</script>

View File

@ -15,7 +15,7 @@
//- material-btn(:class="$style.closeDetailButton" :disabled="detailLoading" @click="playSongListDetail")
//- | &nbsp;
material-btn(:class="$style.closeDetailButton" @click="hideListDetail") 返回
material-song-list(v-model="selectdData" @action="handleSongListAction" :source="source" :page="listDetail.page" :limit="listDetail.limit" :total="listDetail.total" :list="listDetail.list")
material-song-list(v-model="selectdData" @action="handleSongListAction" :source="source" :page="listDetail.page" :limit="listDetail.limit" :total="listDetail.total" :noItem="$t('material.song_list.loding_list')" :list="listDetail.list")
transition(enter-active-class="animated-fast fadeIn" leave-active-class="animated-fast fadeOut")
div(:class="$style.songListContainer" v-if="!isVisibleListDetail")
div(:class="$style.header")
@ -44,7 +44,7 @@
use(xlink:href='#icon-right')
transition(enter-active-class="animated-fast fadeIn" leave-active-class="animated-fast fadeOut")
div(v-show="!listData.list.length" :class="$style.noitem")
p 列表加载中...
p {{$t('material.song_list.loding_list')}}
material-download-modal(:show="isShowDownload" :musicInfo="musicInfo" @select="handleAddDownload" @close="isShowDownload = false")
material-download-multiple-modal(:show="isShowDownloadMultiple" :list="selectdData" @select="handleAddDownloadMultiple" @close="isShowDownloadMultiple = false")
material-list-add-modal(:show="isShowListAdd" :musicInfo="musicInfo" @close="isShowListAdd = false")