Merge branch 'main' into 'igorruckert-main-patch-30619'

# Conflicts:
#   src/lang/pt-br.js
This commit is contained in:
Igor Ruckert 2021-12-30 00:19:02 +00:00
commit 95b1833c97
16 changed files with 1160 additions and 1063 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "deemix-webui", "name": "deemix-webui",
"version": "1.8.7", "version": "1.8.10",
"scripts": { "scripts": {
"clean": "rimraf public/js/bundle.js public/js/bundle.temp.js public/js/bundle.js.map", "clean": "rimraf public/js/bundle.js public/js/bundle.temp.js public/js/bundle.js.map",
"clean-temp": "rimraf public/js/bundle.temp.js", "clean-temp": "rimraf public/js/bundle.temp.js",

File diff suppressed because one or more lines are too long

View File

@ -26,8 +26,7 @@
</i> </i>
<span <span
:class="{ hidden: isSlim }" :class="{ hidden: isSlim }"
class="ml-5 overflow-hidden capitalize whitespace-no-wrap main-tablinks-text" class="ml-3 overflow-hidden capitalize whitespace-no-wrap main-tablinks-text"
style="letter-spacing: 1.3px"
> >
{{ $t(link.label) }} {{ $t(link.label) }}
</span> </span>

View File

@ -254,7 +254,7 @@ export default {
}, },
updateQueue(update) { updateQueue(update) {
// downloaded and failed default to false? // downloaded and failed default to false?
const { uuid, downloaded, failed, progress, conversion, error, data, errid } = update const { uuid, downloaded, failed, progress, conversion, error, data, errid, stack } = update
if (uuid && this.queue.includes(uuid)) { if (uuid && this.queue.includes(uuid)) {
if (downloaded) { if (downloaded) {
@ -263,7 +263,7 @@ export default {
if (failed) { if (failed) {
this.queueList[uuid].failed++ this.queueList[uuid].failed++
this.queueList[uuid].errors.push({ message: error, data, errid }) this.queueList[uuid].errors.push({ message: error, data, errid, stack })
} }
if (progress) { if (progress) {

View File

@ -26,7 +26,7 @@
<li v-html="$t('about.thanks')"></li> <li v-html="$t('about.thanks')"></li>
<i18n path="about.upToDate.text" tag="li"> <i18n path="about.upToDate.text" tag="li">
<template #newsChannel> <template #newsChannel>
<a href="https://t.me/RemixDevNews" target="_blank">{{ $t('about.upToDate.newsChannel') }}</a> <a href="https://tg.deemix.app" target="_blank">{{ $t('about.upToDate.newsChannel') }}</a>
</template> </template>
</i18n> </i18n>
</ul> </ul>
@ -46,7 +46,10 @@
<a href="https://www.reddit.com/r/deemix" target="_blank">🤖 {{ $t('about.officialSubreddit') }}</a> <a href="https://www.reddit.com/r/deemix" target="_blank">🤖 {{ $t('about.officialSubreddit') }}</a>
</li> </li>
<li> <li>
<a href="https://t.me/RemixDevNews" target="_blank">📰 {{ $t('about.newsChannel') }}</a> <a href="https://tg.deemix.app" target="_blank">📰 {{ $t('about.newsChannel') }}</a>
</li>
<li>
<a href="https://t.me/RemixDevNews" target="_blank">💾 {{ $t('about.devlogChannel') }}</a>
</li> </li>
</ul> </ul>
@ -118,10 +121,6 @@
<strong>PayPal:</strong> <strong>PayPal:</strong>
<a href="https://paypal.me/RemixDev" target="_blank">PayPal.me/RemixDev</a> <a href="https://paypal.me/RemixDev" target="_blank">PayPal.me/RemixDev</a>
</li> </li>
<li>
<i class="ethereum" v-html="ethereum" />
<strong>Ethereum:</strong> 0x1d2aa67e671485CD4062289772B662e0A6Ff976c
</li>
</ul> </ul>
<h2>{{ $t('about.titles.license') }}</h2> <h2>{{ $t('about.titles.license') }}</h2>

View File

@ -13,7 +13,7 @@
<td>{{ error.data.id }}</td> <td>{{ error.data.id }}</td>
<td>{{ error.data.artist }}</td> <td>{{ error.data.artist }}</td>
<td>{{ error.data.title }}</td> <td>{{ error.data.title }}</td>
<td>{{ error.errid ? $t(`errors.ids.${error.errid}`) : error.message }}</td> <td><span :title="error.stack">{{ error.errid ? $t(`errors.ids.${error.errid}`) : error.message }}</span></td>
</tr> </tr>
</table> </table>
</div> </div>

View File

@ -24,10 +24,10 @@
</button> </button>
<div v-show="activeTab === 'playlist'"> <div v-show="activeTab === 'playlist'">
<div v-if="playlists.length === 0"> <div v-if="(playlists.length + spotifyPlaylists.length) === 0">
<h1>{{ $t('favorites.noPlaylists') }}</h1> <h1>{{ $t('favorites.noPlaylists') }}</h1>
</div> </div>
<div v-if="playlists.length > 0 || spotifyPlaylists.length > 0" class="release-grid"> <div v-if="(playlists.length + spotifyPlaylists.length) > 0" class="release-grid">
<div v-for="release in playlists" :key="release.id" class="release"> <div v-for="release in playlists" :key="release.id" class="release">
<router-link :to="{ name: 'Playlist', params: { id: release.id } }" class="cursor-pointer" tag="div"> <router-link :to="{ name: 'Playlist', params: { id: release.id } }" class="cursor-pointer" tag="div">
<CoverContainer :cover="release.picture_medium" :link="release.link" is-rounded @click.stop="addToQueue" /> <CoverContainer :cover="release.picture_medium" :link="release.link" is-rounded @click.stop="addToQueue" />
@ -194,6 +194,7 @@ export default defineComponent({
favoriteSpotifyPlaylists, favoriteSpotifyPlaylists,
favoritePlaylists, favoritePlaylists,
favoriteTracks, favoriteTracks,
lovedTracksPlaylist,
isRefreshingFavorites, isRefreshingFavorites,
refreshFavorites refreshFavorites
} = useFavorites() } = useFavorites()
@ -217,6 +218,7 @@ export default defineComponent({
artists: favoriteArtists, artists: favoriteArtists,
playlists: favoritePlaylists, playlists: favoritePlaylists,
spotifyPlaylists: favoriteSpotifyPlaylists, spotifyPlaylists: favoriteSpotifyPlaylists,
lovedTracks: lovedTracksPlaylist,
refreshFavorites, refreshFavorites,
isRefreshingFavorites isRefreshingFavorites
} }
@ -236,9 +238,12 @@ export default defineComponent({
const toDownload = this.getActiveRelease() const toDownload = this.getActiveRelease()
if (this.activeTab === 'track') { if (this.activeTab === 'track') {
const lovedTracks = this.getLovedTracksPlaylist() if (this.lovedTracks){
sendAddToQueue(this.lovedTracks)
sendAddToQueue(lovedTracks.link) } else {
const lovedTracks = this.getLovedTracksPlaylist()
sendAddToQueue(lovedTracks.link)
}
} else { } else {
sendAddToQueue(aggregateDownloadLinks(toDownload)) sendAddToQueue(aggregateDownloadLinks(toDownload))
} }
@ -255,6 +260,7 @@ export default defineComponent({
switch (tab) { switch (tab) {
case 'playlist': case 'playlist':
toDownload = this.playlists toDownload = this.playlists
toDownload += this.spotifyPlaylists
break break
case 'album': case 'album':
toDownload = this.albums toDownload = this.albums
@ -289,6 +295,7 @@ export default defineComponent({
if (lovedTracks.length !== 0) { if (lovedTracks.length !== 0) {
return lovedTracks[0] return lovedTracks[0]
} else { } else {
toast(this.$t('toasts.noLovedPlaylist'), 'warning', true)
throw new Error('No loved tracks playlist!') throw new Error('No loved tracks playlist!')
} }
} }

View File

@ -132,7 +132,7 @@
<h3>{{ $t('linkAnalyzer.countries') }}</h3> <h3>{{ $t('linkAnalyzer.countries') }}</h3>
<p v-for="(country, i) in countries" :key="i">{{ country[0] }} - {{ country[1] }}</p> <p v-for="(country, i) in countries" :key="i">{{ country[0] }} - {{ country[1] }}</p>
</template> </template>
<template v-else> <template v-else-if="this.type === 'track'">
<h3>{{ $t('linkAnalyzer.noCountries') }}</h3> <h3>{{ $t('linkAnalyzer.noCountries') }}</h3>
</template> </template>

View File

@ -2,85 +2,78 @@
<div class="fixed-footer"> <div class="fixed-footer">
<h1 class="mb-8 text-5xl">{{ $t('settings.title') }}</h1> <h1 class="mb-8 text-5xl">{{ $t('settings.title') }}</h1>
<div v-if="isLoggedIn" id="logged_in_info" ref="loggedInInfo">
<img
id="settings_picture"
ref="userpicture"
:src="pictureHref"
alt="Profile Picture"
class="w-32 h-32 rounded-full"
/>
<i18n path="settings.login.loggedIn" tag="p">
<template #username>
<strong id="settings_username" ref="username">{{ user.name || 'not logged' }}</strong>
</template>
</i18n>
<p>{{userLicense}} | {{user.country}}</p>
<button class="btn btn-primary" @click="logout">
{{ $t('settings.login.logout') }}
</button>
<select v-if="accounts.length > 1" id="family_account" v-model="accountNum" @change="changeAccount">
<option v-for="(account, i) in accounts" :key="account" :value="i.toString()">
{{ account.name }}
</option>
</select>
</div>
<div class="settings-group"> <div class="settings-group">
<h3 class="settings-group__header"><i class="material-icons">person</i>{{ $t('settings.login.title') }}</h3> <h3 class="settings-group__header"><i class="material-icons">person</i>{{ $t('settings.login.title') }}</h3>
<div class="my-5 space-y-5"> <div v-if="isLoggedIn" id="logged_in_info" ref="loggedInInfo">
<div class="flex items-center"> <img
<input id="settings_picture"
id="login_input_arl" ref="userpicture"
ref="loginInput" :src="pictureHref"
:value="arl" alt="Profile Picture"
autocomplete="off" class="w-32 h-32 rounded-full"
placeholder="ARL" />
type="password" <div class="user_info">
/> <i18n path="settings.login.loggedIn" tag="p">
<button class="ml-2 btn btn-primary btn-only-icon" @click="copyARLtoClipboard"> <template #username>
<i class="material-icons">assignment</i> <strong id="settings_username" ref="username">{{ user.name || 'not logged' }}</strong>
</template>
</i18n>
<p>{{userLicense}} | {{user.country}}</p>
<button class="btn btn-primary mt-3" @click="logout">
{{ $t('settings.login.logout') }}
</button> </button>
</div> </div>
<select v-if="accounts.length > 1" id="family_account" v-model="accountNum" @change="changeAccount">
<RouterLink :to="{ name: 'ARL' }" class="block"> <option v-for="(account, i) in accounts" :key="account" :value="i.toString()">
{{ $t('settings.login.arl.question') }} {{ account.name }}
</RouterLink> </option>
</select>
<!--
Uncomment when implemented
<a v-if="clientMode" class="block" href="#" @click="appLogin">
{{ $t('settings.login.login') }}
</a>
-->
<button class="btn btn-primary" style="width: 100%" @click="loginButton">
{{ $t('settings.login.arl.update') }}
</button>
</div> </div>
</div>
<div v-if="!isLoggedIn" class="settings-group"> <div v-else>
<h3 class="settings-group__header"> <form ref="loginWithCredentialsForm" @submit.prevent="loginWithCredentials">
<i class="material-icons">person</i>{{ $t('settings.loginWithCredentials.title') }} <label>
</h3> <span>{{ $t('settings.loginWithCredentials.email') }}</span>
<input type="text" name="email" placeholder="email@example.com" class="mb-6"/>
</label>
<label>
<span>{{ $t('settings.loginWithCredentials.password') }}</span>
<input type="password" name="password" placeholder="●●●●●●●●" class="mb-6"/>
</label>
<button class="btn btn-primary login-button" type="submit">{{ $t('settings.loginWithCredentials.login') }}</button>
</form>
</div>
<form ref="loginWithCredentialsForm" class="my-5 space-y-5" @submit.prevent="loginWithCredentials"> <BaseAccordion class="my-5 space-y-5">
<label> <template #title>
<span>{{ $t('settings.loginWithCredentials.email') }}</span> <span>{{ $t('settings.login.arl.title') }}</span>
<input type="text" name="email" /> </template>
</label> <div class="my-5 space-y-5">
<label> <div class="flex items-center">
<span>{{ $t('settings.loginWithCredentials.password') }}</span> <input
<input type="password" name="password" /> id="login_input_arl"
</label> ref="loginInput"
:value="arl"
autocomplete="off"
placeholder="ARL"
type="password"
/>
<button class="ml-2 btn btn-primary btn-only-icon" @click="copyARLtoClipboard">
<i class="material-icons">assignment</i>
</button>
</div>
<button class="btn btn-primary" type="submit">{{ $t('settings.loginWithCredentials.login') }}</button> <RouterLink :to="{ name: 'ARL' }" class="block">
</form> {{ $t('settings.login.arl.question') }}
</RouterLink>
<button class="btn btn-primary" style="width: 100%" @click="loginButton">
{{ $t('settings.login.arl.update') }}
</button>
</div>
</BaseAccordion>
</div> </div>
<div class="settings-group"> <div class="settings-group">
@ -364,6 +357,10 @@
<input v-model="settings.tags.artist" type="checkbox" /> <input v-model="settings.tags.artist" type="checkbox" />
<span class="checkbox-text">{{ $t('settings.tags.artist') }}</span> <span class="checkbox-text">{{ $t('settings.tags.artist') }}</span>
</label> </label>
<label class="with-checkbox" v-if="settings.tags.multiArtistSeparator != 'default'">
<input v-model="settings.tags.artists" type="checkbox" />
<span class="checkbox-text">{{ $t('settings.tags.artists') }}</span>
</label>
<label class="with-checkbox"> <label class="with-checkbox">
<input v-model="settings.tags.album" type="checkbox" /> <input v-model="settings.tags.album" type="checkbox" />
<span class="checkbox-text">{{ $t('settings.tags.album') }}</span> <span class="checkbox-text">{{ $t('settings.tags.album') }}</span>
@ -461,6 +458,9 @@
</label> </label>
</div> </div>
</div> </div>
<p v-if="settings.tags.multiArtistSeparator != 'default' && !settings.tags.artists" style="opacity: 0.75; color: #ffcc22">
{{ $t('settings.tags.artistsWarning') }}
</p>
</BaseAccordion> </BaseAccordion>
<BaseAccordion class="settings-group"> <BaseAccordion class="settings-group">
@ -506,6 +506,11 @@
<input v-model="settings.fallbackSearch" type="checkbox" /> <input v-model="settings.fallbackSearch" type="checkbox" />
<span class="checkbox-text">{{ $t('settings.downloads.fallbackSearch') }}</span> <span class="checkbox-text">{{ $t('settings.downloads.fallbackSearch') }}</span>
</label> </label>
<label class="with-checkbox">
<input v-model="settings.fallbackISRC" type="checkbox" />
<span class="checkbox-text">{{ $t('settings.downloads.fallbackISRC') }}</span>
</label>
</div> </div>
<div class="settings-container__third settings-container__third--only-checkbox"> <div class="settings-container__third settings-container__third--only-checkbox">
<label class="with-checkbox"> <label class="with-checkbox">
@ -517,6 +522,11 @@
<input v-model="settings.logSearched" type="checkbox" /> <input v-model="settings.logSearched" type="checkbox" />
<span class="checkbox-text">{{ $t('settings.downloads.logSearched') }}</span> <span class="checkbox-text">{{ $t('settings.downloads.logSearched') }}</span>
</label> </label>
<label class="with-checkbox">
<input v-model="settings.feelingLucky" type="checkbox" />
<span class="checkbox-text">{{ $t('settings.downloads.feelingLucky') }}</span>
</label>
</div> </div>
<div class="settings-container__third settings-container__third--only-checkbox"> <div class="settings-container__third settings-container__third--only-checkbox">
<label class="with-checkbox"> <label class="with-checkbox">
@ -579,6 +589,9 @@
<option value=";">{{ $t('settings.other.multiArtistSeparator.using', { separator: ';' }) }}</option> <option value=";">{{ $t('settings.other.multiArtistSeparator.using', { separator: ';' }) }}</option>
<option value="; ">{{ $t('settings.other.multiArtistSeparator.using', { separator: '; ' }) }}</option> <option value="; ">{{ $t('settings.other.multiArtistSeparator.using', { separator: '; ' }) }}</option>
</select> </select>
<p v-if="settings.tags.multiArtistSeparator != 'default'" style="opacity: 0.75; color: #ffcc22">
{{ $t('settings.other.multiArtistSeparator.warning') }}
</p>
</div> </div>
<label class="with-checkbox"> <label class="with-checkbox">
@ -1007,6 +1020,10 @@ export default {
const { email } = fromLoginForm('email') const { email } = fromLoginForm('email')
const { password } = fromLoginForm('password') const { password } = fromLoginForm('password')
if (!email || !password) return
toast(this.$t('toasts.loggingIn'), 'loading', false, 'login-toast')
const { accessToken, arl } = await postToServer('loginWithCredentials', { const { accessToken, arl } = await postToServer('loginWithCredentials', {
email, email,
password, password,
@ -1015,6 +1032,7 @@ export default {
if (accessToken !== this.accessToken) this.dispatchAccessTocken({ accessToken }) if (accessToken !== this.accessToken) this.dispatchAccessTocken({ accessToken })
if (arl) this.login(arl) if (arl) this.login(arl)
else toast(this.$t('toasts.loginFailed'), 'close', true, 'login-toast')
}, },
appLogin() { appLogin() {
window.api.send('applogin') window.api.send('applogin')
@ -1073,11 +1091,21 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
#logged_in_info { #logged_in_info {
display: flex; display: grid;
align-items: center; align-items: center;
flex-direction: column; flex-direction: column;
justify-content: space-evenly; justify-content: center;
height: 250px; grid-template-columns: 128px auto;
grid-template-rows: auto auto;
}
#logged_in_info .user_info {
padding-left: 24px;
}
#family_account {
margin-top: 24px;
grid-column: 1 / span 2;
} }
.locale-flag { .locale-flag {
@ -1164,4 +1192,12 @@ export default {
margin-bottom: 0.5rem; margin-bottom: 0.5rem;
} }
} }
.login-button {
display: block;
margin-left: auto;
padding-left: 24px;
padding-right: 24px;
margin-top: 0px;
}
</style> </style>

View File

@ -11,6 +11,13 @@ const de = {
toggle_download_tab_hint: 'Erweitern/Minimieren', toggle_download_tab_hint: 'Erweitern/Minimieren',
clean_queue_hint: 'Vollständige entfernen', clean_queue_hint: 'Vollständige entfernen',
cancel_queue_hint: 'Alle abbrechen', cancel_queue_hint: 'Alle abbrechen',
open_downloads_folder: 'Download Ordner öffnen',
cut: 'Ausschneiden',
copy: 'Kopieren',
copyLink: 'Link kopieren',
copyImageLink: 'Bildlink kopieren',
copyDeezerLink: 'Deezer Link kopieren',
paste: 'Einfügen',
listTabs: { listTabs: {
empty: '', empty: '',
all: 'Alle', all: 'Alle',
@ -28,7 +35,10 @@ const de = {
spotifyPlaylist: 'Spotify Playlist | Spotify Playlists', spotifyPlaylist: 'Spotify Playlist | Spotify Playlists',
releaseDate: 'Veröffentlichungsdatum', releaseDate: 'Veröffentlichungsdatum',
error: 'Fehler' error: 'Fehler'
} },
yes: 'Ja',
no: 'Nein',
empty: 'Leer'
}, },
about: { about: {
appStatus: { appStatus: {
@ -68,8 +78,7 @@ const de = {
officialSubreddit: 'Offizieller Subreddit', officialSubreddit: 'Offizieller Subreddit',
newsChannel: 'Neuigkeiten Kanal', newsChannel: 'Neuigkeiten Kanal',
questions: { questions: {
text: text: 'Suche bei Fragen oder Problemen mit der App als erstes nach einer Lösung im {subreddit}. Wenn du dort nichts findest, kannst du einen Beitrag mit deinen Problem auf dem Subreddit verfassen.',
'Suche bei Fragen oder Problemen mit der App als erstes nach einer Lösung im {subreddit}. Wenn du dort nichts findest, kannst du einen Beitrag mit deinen Problem auf dem Subreddit verfassen.',
subreddit: 'Subreddit' subreddit: 'Subreddit'
}, },
beforeReporting: beforeReporting:
@ -80,8 +89,7 @@ const de = {
dontOpenIssues: dontOpenIssues:
'<strong>ERSTELLE KEINE</strong> Fehlermeldungen um Fragen zu stellen, es existiert ein Subreddit dafür.', '<strong>ERSTELLE KEINE</strong> Fehlermeldungen um Fragen zu stellen, es existiert ein Subreddit dafür.',
newUI: { newUI: {
text: text: 'Wenn du Python fließend beherrschst, kannst du versuchen, mithilfe der Basisbibliothek eine neue Benutzeroberfläche für die App zu erstellen oder Fehler in der Bibliothek mit einem Pull-Request in der {repo} zu beheben.',
'Wenn du Python fließend beherrschst, kannst du versuchen, mithilfe der Basisbibliothek eine neue Benutzeroberfläche für die App zu erstellen oder Fehler in der Bibliothek mit einem Pull-Request in der {repo} zu beheben.',
repo: 'deemix Repo' repo: 'deemix Repo'
}, },
acceptFeatures: acceptFeatures:
@ -121,10 +129,13 @@ const de = {
notEncodedNoAlternative: 'Track noch nicht codiert und keine Alternative gefunden!', notEncodedNoAlternative: 'Track noch nicht codiert und keine Alternative gefunden!',
wrongBitrate: 'Track mit gewünschter Bitrate nicht gefunden.', wrongBitrate: 'Track mit gewünschter Bitrate nicht gefunden.',
wrongBitrateNoAlternative: 'Track mit gewünschter Bitrate nicht gefunden und keine Alternative gefunden!', wrongBitrateNoAlternative: 'Track mit gewünschter Bitrate nicht gefunden und keine Alternative gefunden!',
no360RA: 'Track ist nicht verfügbar in Reality Audio 360.', no360RA: 'Track ist nicht in Reality Audio 360 verfügbar.',
notAvailable: 'Track ist noch nicht verfügbar auf den Servern von Deezer!', notAvailable: 'Track ist nicht verfügbar auf den Servern von Deezer!',
notAvailableNoAlternative: notAvailableNoAlternative: 'Track ist nicht auf den Servern von Deezer verfügbar, keine Alternativen gefunden!',
'Track ist noch nicht verfügbar auf den Servern von Deezer und keine Alternativen gefunden!!' noSpaceLeft: 'Kein Speicherplatz auf dem Gerät!',
albumDoesntExists: 'Das Album des Tracks ist nicht vorhanden, konnte keine Informationen sammeln.',
wrongLicense: 'Dein Account kann die Spur nicht an der gewünschten Bitrate streamen.',
wrongGeolocation: 'Dein Account kann den Track nicht aus Deinem aktuellen Land streamen.'
} }
}, },
favorites: { favorites: {
@ -143,8 +154,7 @@ const de = {
} }
}, },
linkAnalyzer: { linkAnalyzer: {
info: info: 'Diesen Abschnitt kannst du nutzen, um weitere Informationen über den gewünschten Link zu erhalten, den du herunterladen möchtest.',
'Diesen Abschnitt kannst du nutzen, um weitere Informationen über den gewünschten Link zu erhalten, den du herunterladen möchtest.',
useful: useful:
'Dies ist z.B. nützlich, wenn du versuchst einige Titel herunterzuladen, welche in deinem Land nicht verfügbar sind, und du wissen möchtest, wo sie verfügbar sind.', 'Dies ist z.B. nützlich, wenn du versuchst einige Titel herunterzuladen, welche in deinem Land nicht verfügbar sind, und du wissen möchtest, wo sie verfügbar sind.',
linkNotSupported: 'Dieser Link wird noch nicht unterstützt', linkNotSupported: 'Dieser Link wird noch nicht unterstützt',
@ -162,8 +172,12 @@ const de = {
label: 'Label', label: 'Label',
recordType: 'Art der Aufnahme', recordType: 'Art der Aufnahme',
genres: 'Genres', genres: 'Genres',
tracklist: 'Trackliste' tracklist: 'Trackliste',
} readable: 'Lesbar',
available: 'Verfügbar'
},
countries: 'Länder',
noCountries: 'Dieser Track ist in keinem Land verfügbar.'
}, },
search: { search: {
startSearching: 'Suche starten!', startSearching: 'Suche starten!',
@ -183,7 +197,7 @@ const de = {
alreadyInQueue: '{item} ist bereits in der Warteschlange!', alreadyInQueue: '{item} ist bereits in der Warteschlange!',
finishDownload: '{item} vollständig heruntergeladen.', finishDownload: '{item} vollständig heruntergeladen.',
allDownloaded: 'Alle Downloads abgeschlossen!', allDownloaded: 'Alle Downloads abgeschlossen!',
refreshFavs: 'Abgeschlossene Downloads neu laden!', refreshFavs: 'Abgeschlossene Downloads neuladen!',
loggingIn: 'Einloggen', loggingIn: 'Einloggen',
loggedIn: 'Eingeloggt', loggedIn: 'Eingeloggt',
alreadyLogged: 'Bereits eingeloggt', alreadyLogged: 'Bereits eingeloggt',
@ -191,10 +205,14 @@ const de = {
loggedOut: 'Ausgeloggt', loggedOut: 'Ausgeloggt',
cancellingCurrentItem: 'Aktuelle Auswahl abbrechen.', cancellingCurrentItem: 'Aktuelle Auswahl abbrechen.',
currentItemCancelled: 'Aktuelle Auswahl wurde abgebrochen', currentItemCancelled: 'Aktuelle Auswahl wurde abgebrochen',
startAddingArtist: '{artist} Alben werden hinzugefügt', startAddingArtist: 'Alben von {artist} werden hinzugefügt',
finishAddingArtist: '{artist} Alben wurden hinzugefügt', finishAddingArtist: 'Alben von {artist} wurden hinzugefügt',
startConvertingSpotifyPlaylist: 'Konvertierern von Spotify-Tracks zu Deezer-Tracks', startConvertingSpotifyPlaylist: 'Konvertierern von Spotify-Tracks zu Deezer-Tracks',
finishConvertingSpotifyPlaylist: 'Spotify Playlist convertiert' finishConvertingSpotifyPlaylist: 'Spotify Playlist convertiert',
loginNeededToDownload: 'Du musst eingeloggt sein, um Tracks herunterladen zu können!',
deezerNotAvailable: 'Deezer ist in deinem Land nicht verfügbar. Du solltest eine VPN nutzen.',
startGeneratingItems: 'Verarbeite {n} Artikeln....',
finishGeneratingItems: '{n} Items generiert.'
}, },
settings: { settings: {
title: 'Einstellungen', title: 'Einstellungen',
@ -204,9 +222,10 @@ const de = {
loggedIn: 'Du bist eingeloggt als {username}', loggedIn: 'Du bist eingeloggt als {username}',
arl: { arl: {
question: 'Wie bekomme ich meine eigene ARL?', question: 'Wie bekomme ich meine eigene ARL?',
update: 'Update ARL' update: 'ARL aktualisieren'
}, },
logout: 'Ausloggen' logout: 'Ausloggen',
login: 'Über deezer.com einloggen'
}, },
loginWithCredentials: { loginWithCredentials: {
title: 'Mit Zugangsdaten einloggen', title: 'Mit Zugangsdaten einloggen',
@ -216,7 +235,10 @@ const de = {
}, },
appearance: { appearance: {
title: 'Design', title: 'Design',
slimDownloadTab: 'Schmaler Download-Tab' slimDownloadTab: 'Schmaler Download-Tab',
slimSidebar: 'Schlanke Seitenleiste',
searchButton: 'Suchschaltfläche anzeigen',
bitrateTags: 'Qualitäts-Tag in Download-Warteschlange anzeigen'
}, },
downloadPath: { downloadPath: {
title: 'Download Pfad' title: 'Download Pfad'
@ -224,8 +246,11 @@ const de = {
templates: { templates: {
title: 'Vorlagen', title: 'Vorlagen',
tracknameTemplate: 'Vorlage für den Tracknamen', tracknameTemplate: 'Vorlage für den Tracknamen',
albumTracknameTemplate: 'Vorlage für Tracks in einem Album', tracknameAvailableVariables: 'Verfügbare Trackname Variablen',
playlistTracknameTemplate: 'Vorlage für Tracks in einer Playlist' albumTracknameTemplate: 'Album-Track-Vorlage.',
albumTracknameAvailableVariables: 'Verfügbare Album-Track-Variablen',
playlistTracknameTemplate: 'Vorlage für Tracks in einer Playlist',
playlistTracknameAvailableVariables: 'Verfügbare Playlist Trackvariablen'
}, },
folders: { folders: {
title: 'Ordner', title: 'Ordner',
@ -259,7 +284,8 @@ const de = {
y: 'Ja überschreibe die Dateien', y: 'Ja überschreibe die Dateien',
n: 'Nein überschreibe die Dateien nicht', n: 'Nein überschreibe die Dateien nicht',
t: 'Überschreibe nur die Tags', t: 'Überschreibe nur die Tags',
b: 'Nein, behalte beide Dateien und füge der Kopie eine Nummer hinzu' b: 'Nein, behalte beide Dateien und füge der Kopie eine Nummer hinzu',
e: 'Nein, und schau nicht auf die Erweiterungen'
}, },
fallbackBitrate: 'Falls gewünschte Bitrate nicht verfügbar, auf niedrigere Bitrate zurückgreifen', fallbackBitrate: 'Falls gewünschte Bitrate nicht verfügbar, auf niedrigere Bitrate zurückgreifen',
fallbackSearch: 'Zur Suche zurückkehren, wenn der Song nicht verfügbar ist', fallbackSearch: 'Zur Suche zurückkehren, wenn der Song nicht verfügbar ist',
@ -284,7 +310,11 @@ const de = {
png: 'Ein png Bild', png: 'Ein png Bild',
both: 'Beides (jpg + png)' both: 'Beides (jpg + png)'
}, },
jpegImageQuality: 'JPEG Qualität' jpegImageQuality: 'JPEG Qualität',
embeddedArtworkPNG: 'Eingebettete Grafiken als PNG speichern',
embeddedPNGWarning: 'PNGs werden von Deezer nicht offiziell unterstützt und können fehlerhaft sein',
imageSizeWarning: 'Alles über x1200 wird nicht offiziell von Deezer verwendet, es können Probleme auftreten',
coverDescriptionUTF8: 'Cover-Beschreibung mit UTF8 speichern (iTunes Cover Fix)'
}, },
tags: { tags: {
head: 'Welche Tags sollen gespeichert werden?', head: 'Welche Tags sollen gespeichert werden?',
@ -308,9 +338,11 @@ const de = {
replayGain: 'Wiedergabe Lautstärke', replayGain: 'Wiedergabe Lautstärke',
label: 'Album Plattenlabel', label: 'Album Plattenlabel',
lyrics: 'Nicht synchronisierte Texte', lyrics: 'Nicht synchronisierte Texte',
syncedLyrics: 'Synchronisierte Texte',
copyright: 'Copyright', copyright: 'Copyright',
composer: 'Komponist', composer: 'Komponist',
involvedPeople: 'Mitwirkende Personen' involvedPeople: 'Mitwirkende Personen',
source: 'Quelle und Song ID'
}, },
other: { other: {
title: 'Sonstige', title: 'Sonstige',
@ -360,14 +392,21 @@ const de = {
title: 'Spotify Features', title: 'Spotify Features',
clientID: 'Spotify Client ID', clientID: 'Spotify Client ID',
clientSecret: 'Spotify Client Secret', clientSecret: 'Spotify Client Secret',
username: 'Spotify Benutzername' username: 'Spotify Benutzername',
question: 'Wie aktiviere ich die Spotify Features?'
}, },
reset: 'Auf Standardwerte zurücksetzen', reset: 'Auf Standardwerte zurücksetzen',
resetMessage: 'Bist du sicher, dass du zu den Standarteinstellungen zurückkehren willst?',
save: 'Speichern', save: 'Speichern',
toasts: { toasts: {
init: 'Einstellungen geladen!', init: 'Einstellungen geladen!',
update: 'Einstellungen aktualisiert!', update: 'Einstellungen aktualisiert!',
reset: 'Einstellungen auf den Standart zurückgesetzt!',
ARLcopied: 'ARL wurde in die Zwischenablage kopiert' ARLcopied: 'ARL wurde in die Zwischenablage kopiert'
},
logs: {
title: 'Logs',
areLogsActive: 'Aktiv'
} }
}, },
sidebar: { sidebar: {
@ -380,7 +419,11 @@ const de = {
about: 'Info' about: 'Info'
}, },
tracklist: { tracklist: {
downloadSelection: 'Downloads' downloadSelection: 'Herunterladen'
},
logs: {
event: 'Event',
data: 'Daten'
} }
} }

View File

@ -81,6 +81,7 @@ const en = {
officialWebuiRepo: 'Official WebUI Repository', officialWebuiRepo: 'Official WebUI Repository',
officialSubreddit: 'Official Subreddit', officialSubreddit: 'Official Subreddit',
newsChannel: 'News Channel', newsChannel: 'News Channel',
devlogChannel: 'Devlog Channel',
questions: { questions: {
text: `If you have questions or problems with the app, search for a solution on the {subreddit} first. Then, if you don't find anything you can make a post with your issue on the subreddit.`, text: `If you have questions or problems with the app, search for a solution on the {subreddit} first. Then, if you don't find anything you can make a post with your issue on the subreddit.`,
subreddit: 'subreddit' subreddit: 'subreddit'
@ -133,7 +134,9 @@ const en = {
noSpaceLeft: 'No space left on the device!', noSpaceLeft: 'No space left on the device!',
albumDoesntExists: "Track's album doesn't exist, failed to gather info.", albumDoesntExists: "Track's album doesn't exist, failed to gather info.",
wrongLicense: "Your account can't stream the track at the desired bitrate.", wrongLicense: "Your account can't stream the track at the desired bitrate.",
wrongGeolocation: "Your account can't stream the track from your current country." wrongGeolocation: "Your account can't stream the track from your current country.",
wrongGeolocationNoAlternative:
"Your account can't stream the track from your current country and no alternative found."
} }
}, },
favorites: { favorites: {
@ -212,7 +215,8 @@ const en = {
loginNeededToDownload: 'You need to log in to download tracks!', loginNeededToDownload: 'You need to log in to download tracks!',
deezerNotAvailable: 'Deezer is not available in your country. You should use a VPN.', deezerNotAvailable: 'Deezer is not available in your country. You should use a VPN.',
startGeneratingItems: 'Processing {n} items...', startGeneratingItems: 'Processing {n} items...',
finishGeneratingItems: 'Generated {n} items.' finishGeneratingItems: 'Generated {n} items.',
noLovedPlaylist: 'No loved tracks playlist!'
}, },
settings: { settings: {
title: 'Settings', title: 'Settings',
@ -221,6 +225,7 @@ const en = {
title: 'Login', title: 'Login',
loggedIn: 'You are logged in as {username}', loggedIn: 'You are logged in as {username}',
arl: { arl: {
title: 'Use ARL instead',
question: 'How do I get my own ARL?', question: 'How do I get my own ARL?',
update: 'Update ARL' update: 'Update ARL'
}, },
@ -289,6 +294,8 @@ const en = {
}, },
fallbackBitrate: 'Bitrate fallback', fallbackBitrate: 'Bitrate fallback',
fallbackSearch: 'Search fallback', fallbackSearch: 'Search fallback',
fallbackISRC: 'Fallback with ISRC search',
feelingLucky: 'Gamble with CDNs and caches',
logErrors: 'Create log files for errors', logErrors: 'Create log files for errors',
logSearched: 'Create log files for searched tracks', logSearched: 'Create log files for searched tracks',
createM3U8File: 'Create playlist file', createM3U8File: 'Create playlist file',
@ -320,6 +327,7 @@ const en = {
head: 'Which tags to save', head: 'Which tags to save',
title: 'Title', title: 'Title',
artist: 'Artist', artist: 'Artist',
artists: 'Extra ARTISTS tag',
album: 'Album', album: 'Album',
cover: 'Cover', cover: 'Cover',
trackNumber: 'Track Number', trackNumber: 'Track Number',
@ -342,7 +350,9 @@ const en = {
copyright: 'Copyright', copyright: 'Copyright',
composer: 'Composer', composer: 'Composer',
involvedPeople: 'Involved People', involvedPeople: 'Involved People',
source: 'Source and song ID' source: 'Source and song ID',
artistsWarning:
"Disabling the ARTISTS tag while not using standard specification won't preserve multiartist support"
}, },
other: { other: {
title: 'Other', title: 'Other',
@ -354,7 +364,9 @@ const en = {
nothing: 'Save only the main artist', nothing: 'Save only the main artist',
default: 'Using standard specification', default: 'Using standard specification',
andFeat: 'Using & and feat.', andFeat: 'Using & and feat.',
using: 'Using "{separator}"' using: 'Using "{separator}"',
warning:
'Using any separator other than the standard specification will add a extra ARTISTS tag to preserve multiartist support'
}, },
singleAlbumArtist: 'Save only the main album artist', singleAlbumArtist: 'Save only the main album artist',
albumVariousArtists: 'Keep "Various Artists" in the Album Artists', albumVariousArtists: 'Keep "Various Artists" in the Album Artists',

View File

@ -52,11 +52,11 @@ const fr = {
offline: 'app hors ligne' offline: 'app hors ligne'
}, },
updates: { updates: {
currentVersion: 'Version Actuelle', currentVersion: 'Version Actuelle Du Logiciel',
currentWebuiVersion: 'Version Actuelle De La WebUI', currentWebuiVersion: 'Version Actuelle De La WebUI',
versionNotAvailable: 'N/A', versionNotAvailable: 'N/A',
updateAvailable: "Vous n'utilisez pas la dernière version disponible : {version}", updateAvailable: "Vous n'utilisez pas la dernière version disponible : {version}",
deemixVersion: 'Version de la bibliothèque deemix' deemixVersion: 'Version Actuelle De La Bibliothèque deemix'
}, },
titles: { titles: {
usefulLinks: 'Liens Utiles', usefulLinks: 'Liens Utiles',
@ -83,6 +83,7 @@ const fr = {
officialWebuiRepo: 'Répertoire De Dépôt Officiel De La WebUI', officialWebuiRepo: 'Répertoire De Dépôt Officiel De La WebUI',
officialSubreddit: 'Subreddit Officiel', officialSubreddit: 'Subreddit Officiel',
newsChannel: "Canal d'Informations", newsChannel: "Canal d'Informations",
devlogChannel: 'Canal De Développement',
questions: { questions: {
text: `Si vous avez des questions ou des problèmes avec l'application, cherchez d'abord une solution dans le {subreddit}. Ensuite, si la solution ne s'y trouve pas, vous pouvez publier un message dans le subreddit en décrivant votre problème.`, text: `Si vous avez des questions ou des problèmes avec l'application, cherchez d'abord une solution dans le {subreddit}. Ensuite, si la solution ne s'y trouve pas, vous pouvez publier un message dans le subreddit en décrivant votre problème.`,
subreddit: 'subreddit' subreddit: 'subreddit'
@ -143,12 +144,14 @@ const fr = {
noSpaceLeft: "L'espace disponible sur cet appareil est insuffisant !", noSpaceLeft: "L'espace disponible sur cet appareil est insuffisant !",
albumDoesntExists: "Aucun album n'existe pour cette piste, impossible de collecter les informations nécessaires.", albumDoesntExists: "Aucun album n'existe pour cette piste, impossible de collecter les informations nécessaires.",
wrongLicense: 'Votre compte ne prend pas en charge la piste au débit souhaité.', wrongLicense: 'Votre compte ne prend pas en charge la piste au débit souhaité.',
wrongGeolocation: 'Votre compte ne prend pas en charge la piste depuis votre pays actuel.' wrongGeolocation: 'Votre compte ne prend pas en charge la piste depuis votre pays actuel.',
wrongGeolocationNoAlternative:
"Votre compte ne prend pas en charge la piste depuis votre pays actuel et aucune alternative n'a été trouvée."
} }
}, },
favorites: { favorites: {
title: 'Favoris', title: 'Favoris',
noPlaylists: "Aucune Playlist n'a été trouvée", noPlaylists: "Aucune Playlist Favorite n'a été trouvée",
noAlbums: "Aucun Album Favori n'a été trouvé", noAlbums: "Aucun Album Favori n'a été trouvé",
noArtists: "Aucun Artiste Favori n'a été trouvé", noArtists: "Aucun Artiste Favori n'a été trouvé",
noTracks: "Aucune Piste Favorite n'a été trouvée" noTracks: "Aucune Piste Favorite n'a été trouvée"
@ -232,6 +235,7 @@ const fr = {
title: 'Connexion', title: 'Connexion',
loggedIn: 'Vous êtes connecté en tant que {username}', loggedIn: 'Vous êtes connecté en tant que {username}',
arl: { arl: {
title: 'Utiliser de préférence la connexion via ARL',
question: 'Comment obtenir mon ARL personnel ?', question: 'Comment obtenir mon ARL personnel ?',
update: "Actualiser l'ARL" update: "Actualiser l'ARL"
}, },
@ -300,7 +304,9 @@ const fr = {
e: "Non, et ne pas tenir compte de l'extension du fichier" e: "Non, et ne pas tenir compte de l'extension du fichier"
}, },
fallbackBitrate: "Recourir à un débit plus faible si le débit préféré n'est pas disponible", fallbackBitrate: "Recourir à un débit plus faible si le débit préféré n'est pas disponible",
fallbackSearch: "Rechercher la piste si le lien original n'est pas disponible", fallbackSearch: "Rechercher la piste ailleurs si le lien original n'est pas disponible",
fallbackISRC: "Rechercher la piste à l'aide de son ISRC si le lien original n'est pas disponible",
feelingLucky: "Utiliser les CDNs et les caches (ancienne méthode de téléchargement des pistes)",
logErrors: "Créer un fichier journal d'erreurs", logErrors: "Créer un fichier journal d'erreurs",
logSearched: 'Créer un fichier journal des pistes recherchées', logSearched: 'Créer un fichier journal des pistes recherchées',
createM3U8File: 'Créer un fichier de playlist', createM3U8File: 'Créer un fichier de playlist',
@ -334,6 +340,7 @@ const fr = {
head: 'Métadonnées à sauvegarder', head: 'Métadonnées à sauvegarder',
title: 'Titre', title: 'Titre',
artist: 'Artiste', artist: 'Artiste',
artists: 'Métadonnée supplémentaire ARTISTS',
album: 'Album', album: 'Album',
cover: 'Pochette', cover: 'Pochette',
trackNumber: 'Numéro De Piste', trackNumber: 'Numéro De Piste',
@ -356,7 +363,9 @@ const fr = {
copyright: "Droits d'Auteur (Copyright)", copyright: "Droits d'Auteur (Copyright)",
composer: 'Compositeur', composer: 'Compositeur',
involvedPeople: 'Personnes Impliquées', involvedPeople: 'Personnes Impliquées',
source: 'ID de la source et de la piste' source: 'ID de la source et de la piste',
artistsWarning:
"La désactivation de la métadonnée ARTISTS sans utiliser la spécification standard ne préservera pas le support multi-artiste."
}, },
other: { other: {
title: 'Autre', title: 'Autre',
@ -368,7 +377,9 @@ const fr = {
nothing: "Enregistrer uniquement l'artiste principal", nothing: "Enregistrer uniquement l'artiste principal",
default: 'En utilisant la spécification standard', default: 'En utilisant la spécification standard',
andFeat: 'En utilisant & et feat.', andFeat: 'En utilisant & et feat.',
using: 'En utilisant "{separator}"' using: 'En utilisant "{separator}"',
warning:
"L'utilisation d'un séparateur autre que la spécification standard nécessitera l'ajout d'une métadonnée ARTISTS afin de préserver le support multi-artiste."
}, },
singleAlbumArtist: "Enregistrer uniquement l'artiste principal de l'album", singleAlbumArtist: "Enregistrer uniquement l'artiste principal de l'album",
albumVariousArtists: `Conserver "Various Artists" dans les Artistes de l'Album`, albumVariousArtists: `Conserver "Various Artists" dans les Artistes de l'Album`,

View File

@ -82,6 +82,7 @@ const it = {
officialWebuiRepo: `Repository Ufficiale dell'Interfaccia Web`, officialWebuiRepo: `Repository Ufficiale dell'Interfaccia Web`,
officialSubreddit: 'Subreddit Ufficiale', officialSubreddit: 'Subreddit Ufficiale',
newsChannel: 'Canale delle news', newsChannel: 'Canale delle news',
devlogChannel: 'Canale Devlog',
questions: { questions: {
text: `Se dovessi avere domande o problemi con l'app, cerca prima una soluzione nel {subreddit}. Se non trovi nulla, puoi postare li il tuo problema.`, text: `Se dovessi avere domande o problemi con l'app, cerca prima una soluzione nel {subreddit}. Se non trovi nulla, puoi postare li il tuo problema.`,
subreddit: 'subreddit ufficiale' subreddit: 'subreddit ufficiale'

View File

@ -1,11 +1,11 @@
const ko = { const ko = {
globals: { globals: {
welcome: '잘왔다, deemix에', welcome: 'Deemix에 오신 것을 환영합니다',
back: '뒤로', back: '뒤로',
loading: '불러오는 중', loading: '불러오는 중',
download: '{thing} 다운로드', download: '{thing} 다운로드',
by: 'by {artist}', by: '- {artist}',
in: 'in {album}', in: '{album}',
download_hint: '다운로드', download_hint: '다운로드',
play_hint: '재생', play_hint: '재생',
toggle_download_tab_hint: '펼치기/접기', toggle_download_tab_hint: '펼치기/접기',
@ -52,7 +52,7 @@ const ko = {
currentVersion: '현재 버전', currentVersion: '현재 버전',
currentWebuiVersion: '현재 WebUI 버전', currentWebuiVersion: '현재 WebUI 버전',
versionNotAvailable: 'N/A', versionNotAvailable: 'N/A',
updateAvailable: `최신버전으로 업데이트 할 수 있습니다: {version}`, updateAvailable: `최신 버전 ({version})으로 업데이트 할 수 있습니다`,
deemixVersion: 'deemix lib 버전' deemixVersion: 'deemix lib 버전'
}, },
titles: { titles: {
@ -169,7 +169,7 @@ const ko = {
} }
}, },
search: { search: {
startSearching: '검색을 해보세요!', startSearching: '검색세요!',
description: '트랙, 아티스트, 재생목록, Deezer 링크 등으로 검색할 수 있습니다!', description: '트랙, 아티스트, 재생목록, Deezer 링크 등으로 검색할 수 있습니다!',
fans: '{n}명의 팬들', fans: '{n}명의 팬들',
@ -180,7 +180,7 @@ const ko = {
noResultsPlaylist: '발견된 재생목록 없음' noResultsPlaylist: '발견된 재생목록 없음'
}, },
searchbar: '원하는 것을 검색하세요 (링크를 붙여넣을 수도 있습니다)', searchbar: '원하는 것을 검색하세요 (링크를 붙여넣을 수도 있습니다)',
downloads: '다운로드', downloads: '다운로드',
toasts: { toasts: {
restoringQueue: '다운로드 대기 열 복원중...', restoringQueue: '다운로드 대기 열 복원중...',
queueRestored: '다운로드 대기 열이 복원되었습니다!', queueRestored: '다운로드 대기 열이 복원되었습니다!',
@ -204,7 +204,7 @@ const ko = {
loginNeededToDownload: '트랙을 다운로드하려면 로그인이 필요합니다!', loginNeededToDownload: '트랙을 다운로드하려면 로그인이 필요합니다!',
deezerNotAvailable: 'Deezer 사이트는 현재 귀하의 국가에서 사용이 불가능합니다. VPN을 사용하세요.', deezerNotAvailable: 'Deezer 사이트는 현재 귀하의 국가에서 사용이 불가능합니다. VPN을 사용하세요.',
startGeneratingItems: '{n}개의 항목 진행중...', startGeneratingItems: '{n}개의 항목 진행중...',
finishGeneratingItems: '{n}개의 항목 생성.' finishGeneratingItems: '{n}개의 항목 생성되었습니다.'
}, },
settings: { settings: {
title: '설정', title: '설정',
@ -264,12 +264,12 @@ const ko = {
1: 'MP3 128kbps' 1: 'MP3 128kbps'
}, },
overwriteFile: { overwriteFile: {
title: '파일을 덮어쓸까요?', title: '파일 덮어쓰기 여부',
y: '네, 파일을 덮어쓰세요', y: '파일 덮어쓰기',
n: '아뇨, 파일을 덮어쓰지 마세요', n: '파일 덮어쓰지 않기',
t: '태그만 덮어쓰세요', t: '태그만 덮어쓰',
b: '아뇨, 양쪽 다 놔두고 중복되는 파일에 번호를 추가하세요', b: '모두 유지한 뒤 새 파일에 번호 넣기',
e: '아뇨, 확장명을 변경하세요' e: '확장자 변경하기'
}, },
fallbackBitrate: '비트레이트 대비책', fallbackBitrate: '비트레이트 대비책',
fallbackSearch: '검색 대비책', fallbackSearch: '검색 대비책',
@ -289,10 +289,10 @@ const ko = {
localArtworkSize: '외부 저장 그림 크기', localArtworkSize: '외부 저장 그림 크기',
embeddedArtworkSize: '내부 저장 그림 크기', embeddedArtworkSize: '내부 저장 그림 크기',
localArtworkFormat: { localArtworkFormat: {
title: '별도로 저장할 그림의 형식을 무엇으로 하시겠습니까?', title: '별도로 저장할 그림의 형식',
jpg: 'jpeg 이미지', jpg: 'jpeg 이미지',
png: 'png 이미지', png: 'png 이미지',
both: 'jpeg와 png 둘 다' both: 'jpeg와 png 모두'
}, },
jpegImageQuality: 'JPEG 이미지 품질', jpegImageQuality: 'JPEG 이미지 품질',
embeddedArtworkPNG: '포함된 그림의 형식을 PNG로 저장합니다', embeddedArtworkPNG: '포함된 그림의 형식을 PNG로 저장합니다',
@ -376,7 +376,7 @@ const ko = {
title: '스포티파이 기능', title: '스포티파이 기능',
clientID: 'Spotify ClientID', clientID: 'Spotify ClientID',
clientSecret: 'Spotify Client Secret', clientSecret: 'Spotify Client Secret',
username: 'Spotify 사용자이름', username: 'Spotify 사용자 이름',
question: '스포티파이 기능들을 사용하려면 어떻게 해야 합니까?' question: '스포티파이 기능들을 사용하려면 어떻게 해야 합니까?'
}, },
reset: '기본 설정으로 초기화', reset: '기본 설정으로 초기화',

View File

@ -9,12 +9,13 @@ const favoriteAlbums = ref([])
const favoriteSpotifyPlaylists = ref([]) const favoriteSpotifyPlaylists = ref([])
const favoritePlaylists = ref([]) const favoritePlaylists = ref([])
const favoriteTracks = ref([]) const favoriteTracks = ref([])
const lovedTracksPlaylist = ref('')
const isLoggedWithSpotify = computed(() => store.getters.isLoggedWithSpotify) const isLoggedWithSpotify = computed(() => store.getters.isLoggedWithSpotify)
const isRefreshingFavorites = ref(false) const isRefreshingFavorites = ref(false)
const setAllFavorites = data => { const setAllFavorites = data => {
const { tracks, albums, artists, playlists } = data const { tracks, albums, artists, playlists, lovedTracks } = data
isRefreshingFavorites.value = false isRefreshingFavorites.value = false
@ -22,6 +23,7 @@ const setAllFavorites = data => {
favoriteAlbums.value = albums favoriteAlbums.value = albums
favoritePlaylists.value = playlists favoritePlaylists.value = playlists
favoriteTracks.value = tracks favoriteTracks.value = tracks
lovedTracksPlaylist.value = lovedTracks
} }
const setSpotifyPlaylists = response => { const setSpotifyPlaylists = response => {
@ -59,6 +61,7 @@ export const useFavorites = () => ({
favoriteSpotifyPlaylists, favoriteSpotifyPlaylists,
favoritePlaylists, favoritePlaylists,
favoriteTracks, favoriteTracks,
lovedTracksPlaylist,
isRefreshingFavorites, isRefreshingFavorites,
refreshFavorites refreshFavorites
}) })

1740
yarn.lock

File diff suppressed because it is too large Load Diff