From 2b8f14df578593a65202532661f3c45855999a18 Mon Sep 17 00:00:00 2001 From: exttex Date: Tue, 3 Nov 2020 10:11:37 +0100 Subject: [PATCH] 1.1.2 - Crossfade, theming --- app/background.js | 16 +- app/client/public/shibe.png | Bin 0 -> 68870 bytes app/client/src/App.vue | 8 + app/client/src/components/DownloadDialog.vue | 16 +- app/client/src/components/PlaylistTile.vue | 2 +- app/client/src/js/router.js | 5 + app/client/src/js/vuetify.js | 2 +- app/client/src/locales/ar.json | 14 +- app/client/src/locales/de.json | 26 ++- app/client/src/locales/el.json | 228 ++++++++++--------- app/client/src/locales/en.json | 15 +- app/client/src/locales/es.json | 136 ++++++----- app/client/src/locales/fa.json | 14 +- app/client/src/locales/fil.json | 144 ++++++------ app/client/src/locales/fr.json | 144 ++++++------ app/client/src/locales/he.json | 14 +- app/client/src/locales/hi.json | 14 +- app/client/src/locales/hr.json | 14 +- app/client/src/locales/hu.json | 34 ++- app/client/src/locales/id.json | 216 +++++++++--------- app/client/src/locales/it.json | 214 +++++++++-------- app/client/src/locales/ko.json | 14 +- app/client/src/locales/pl.json | 220 +++++++++--------- app/client/src/locales/pt.json | 118 +++++----- app/client/src/locales/ro.json | 212 +++++++++-------- app/client/src/locales/ru.json | 228 ++++++++++--------- app/client/src/locales/tr.json | 218 +++++++++--------- app/client/src/locales/uk.json | 226 +++++++++--------- app/client/src/locales/ur.json | 14 +- app/client/src/main.js | 65 +++++- app/client/src/views/About.vue | 151 ++++++++++++ app/client/src/views/AlbumPage.vue | 12 +- app/client/src/views/PlaylistPage.vue | 2 +- app/client/src/views/Settings.vue | 137 ++++++++--- app/client/styles/scrollbar.scss | 6 +- app/package.json | 2 +- app/src/downloads.js | 43 ++-- app/src/server.js | 15 +- app/src/settings.js | 4 + package.json | 2 +- 40 files changed, 1782 insertions(+), 1183 deletions(-) create mode 100644 app/client/public/shibe.png create mode 100644 app/client/src/views/About.vue diff --git a/app/background.js b/app/background.js index db45f67..71ca4ed 100644 --- a/app/background.js +++ b/app/background.js @@ -15,7 +15,7 @@ function assetPath(a) { } async function startServer() { - settings = await createServer(true, (e) => { + settings = await createServer(true, () => { //Server error shouldExit = true; if (win) win.close(); @@ -96,7 +96,11 @@ app.on('ready', async () => { //Restore or create new window function restoreWindow() { - if (win) return win.show(); + if (win) { + win.show(); + setThumbarButtons(); + return; + } createWindow(); } @@ -171,6 +175,10 @@ function setThumbarButtons() { ]); } +ipcMain.on('openUrl', (event, args) => { + shell.openExternal(args); +}); + //Playing state change from UI ipcMain.on('playing', (event, args) => { playing = args; @@ -184,13 +192,13 @@ ipcMain.on('updateSettings', (event, args) => { }); //onExit callback -ipcMain.on('onExit', (event) => { +ipcMain.on('onExit', () => { shouldExit = true; win.close(); }); //Open downloads directory -ipcMain.on('openDownloadsDir', async (event) => { +ipcMain.on('openDownloadsDir', async () => { if ((await shell.openPath(settings.downloadsPath)) == "") return; shell.showItemInFolder(settings.downloadsPath); }); diff --git a/app/client/public/shibe.png b/app/client/public/shibe.png new file mode 100644 index 0000000000000000000000000000000000000000..6b377c6a27b4726f26ef6431ce6d843c65bbe742 GIT binary patch literal 68870 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 literal 0 HcmV?d00001 diff --git a/app/client/src/App.vue b/app/client/src/App.vue index d160e05..3ec7107 100644 --- a/app/client/src/App.vue +++ b/app/client/src/App.vue @@ -111,6 +111,14 @@ {{$t('Downloads')}} + + + + mdi-information + + {{$t('About')}} + + diff --git a/app/client/src/components/DownloadDialog.vue b/app/client/src/components/DownloadDialog.vue index 8ae296a..7913d23 100644 --- a/app/client/src/components/DownloadDialog.vue +++ b/app/client/src/components/DownloadDialog.vue @@ -45,6 +45,10 @@ export default { type: Boolean, default: true }, + playlistName: { + type: String, + default: null + } }, data() { return { @@ -71,11 +75,15 @@ export default { }, //Add files to download queue async download() { - if (this.qualities.indexOf(this.qualityString) == 0 || !this.qualityString) { - await this.$axios.post(`/downloads`, this.tracks); - } else { - await this.$axios.post(`/downloads?q=${this.qualityInt()}`, this.tracks); + let data = { + tracks: this.tracks, + playlistName: this.playlistName, + quality: null } + if (this.qualities.indexOf(this.qualityString) != 0 && this.qualityString) { + data['quality'] = this.qualityInt(); + } + await this.$axios.post(`/downloads`, data); if (this.autostart) this.$axios.put('/download'); this.$emit("close"); diff --git a/app/client/src/components/PlaylistTile.vue b/app/client/src/components/PlaylistTile.vue index 519c163..db5d924 100644 --- a/app/client/src/components/PlaylistTile.vue +++ b/app/client/src/components/PlaylistTile.vue @@ -79,7 +79,7 @@ - + diff --git a/app/client/src/js/router.js b/app/client/src/js/router.js index cd2b241..b23d516 100644 --- a/app/client/src/js/router.js +++ b/app/client/src/js/router.js @@ -11,6 +11,7 @@ import ArtistPage from '@/views/ArtistPage.vue'; import Settings from '@/views/Settings.vue'; import DeezerPage from '@/views/DeezerPage.vue'; import DownloadsPage from '@/views/DownloadsPage.vue'; +import About from '@/views/About.vue'; Vue.use(VueRouter); @@ -74,6 +75,10 @@ const routes = [ { path: '/downloads', component: DownloadsPage, + }, + { + path: '/about', + component: About } ]; diff --git a/app/client/src/js/vuetify.js b/app/client/src/js/vuetify.js index e0e8f59..f200151 100644 --- a/app/client/src/js/vuetify.js +++ b/app/client/src/js/vuetify.js @@ -8,6 +8,6 @@ Vue.use(Vuetify); export default new Vuetify({ theme: { - dark: true, + dark: true } }); diff --git a/app/client/src/locales/ar.json b/app/client/src/locales/ar.json index 5344d4d..14a209f 100644 --- a/app/client/src/locales/ar.json +++ b/app/client/src/locales/ar.json @@ -108,5 +108,17 @@ "Don't minimize to tray": "عدم التصغير إلى شريط المهام", "Close on exit": "إغلاق عند الخروج", "Settings saved!": "تم حفظ الإعدادات!", - "Available only in Electron version!": "متاح فقط في اصدار الإلكترون!" + "Available only in Electron version!": "متاح فقط في اصدار الإلكترون!", + "Crossfade (ms)": "التلاشي (ملي ثانية)", + "Select primary color": "تحديد اللون الأساسي", + "Light theme": "المظهر الفاتح", + "Create folders for playlists": "إنشاء ملفات لقائمة التشغيل", + "About": "حول البرنامج", + "Links:": "الروابط:", + "Telegram Releases": "إصدارات على تيليجرام", + "Telegram Group": "مجموعة التليجرام", + "Discord": "دسكورد", + "Telegram Android Group": "مجموعة تيليجرام (أندرويد)", + "Credits:": "المساهمون:", + "Agree": "قبول" } \ No newline at end of file diff --git a/app/client/src/locales/de.json b/app/client/src/locales/de.json index c4a85c9..ffd3fc8 100644 --- a/app/client/src/locales/de.json +++ b/app/client/src/locales/de.json @@ -3,7 +3,7 @@ "Browse": "Durchsuchen", "Library": "Mediathek", "Tracks": "Titel", - "Playlists": "Wiedergabelisten", + "Playlists": "Playlisten", "Albums": "Alben", "Artists": "Künstler", "More": "Mehr", @@ -22,7 +22,7 @@ "Stream logging is disabled!": "Streamprotokollierung ist deaktiviert!", "Enable it in settings for history to work properly.": "Aktiviere es in den Einstellungen, damit der Verlauf korrekt funktioniert.", "History": "Verlauf", - "Create new playlist": "Neue Wiedergabeliste erstellen", + "Create new playlist": "Neue Playlist erstellen", "TRACKS": "Titel", "Sort by": "Sortieren nach", "Date Added": "Hinzugefügt am", @@ -30,15 +30,15 @@ "Artist (A-Z)": "Künstler (A-Z)", "Album (A-Z)": "Album (A-Z)", "Error loading lyrics or lyrics not found!": "Fehler beim Laden der Songtexte oder Songtexte nicht gefunden!", - "Create playlist": "Wiedergabeliste erstellen", + "Create playlist": "Playlist erstellen", "Create": "Erstellen", - "Add to playlist": "Zur Wiedergabeliste hinzufügen", + "Add to playlist": "Zur Playlist hinzufügen", "Create new": "Neu erstellen", "Remove": "Entfernen", "Play next": "Als nächstes spielen", "Add to queue": "Zur Warteschleife hinzufügen", "Remove from library": "Aus der Mediathek entfernen", - "Remove from playlist": "Aus Wiedergabeliste entfernen", + "Remove from playlist": "Aus Playlist entfernen", "Play track mix": "Track Mix abspielen", "Go to": "Gehe zu", "Track Mix": "Track Mix", @@ -46,7 +46,7 @@ "Released": "Veröffentlicht", "Disk": "Disk", "albums": "Alben", - "Play top": "Play top", + "Play top": "Top abspielen", "Radio": "Radio", "Show all albums": "Zeige alle Alben", "Show all singles": "Zeige alle Singles", @@ -108,5 +108,17 @@ "Don't minimize to tray": "Nicht in Statusleiste minimieren", "Close on exit": "Beim Beenden schließen", "Settings saved!": "Einstellungen gespeichert!", - "Available only in Electron version!": "Nur in der Electron-Version verfügbar!" + "Available only in Electron version!": "Nur in der Electron-Version verfügbar!", + "Crossfade (ms)": "Überblendung (ms)", + "Select primary color": "Primärfarbe auswählen", + "Light theme": "Helles Thema", + "Create folders for playlists": "Ordner für Wiedergabelisten erstellen", + "About": "Über", + "Links:": "Links:", + "Telegram Releases": "Telegram-Releases", + "Telegram Group": "Telegram Gruppe", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android-Gruppe", + "Credits:": "Credits:", + "Agree": "Einverstanden" } \ No newline at end of file diff --git a/app/client/src/locales/el.json b/app/client/src/locales/el.json index 5071360..5c15eb6 100644 --- a/app/client/src/locales/el.json +++ b/app/client/src/locales/el.json @@ -1,112 +1,124 @@ { - "Home": "Home", - "Browse": "Browse", - "Library": "Library", - "Tracks": "Tracks", - "Playlists": "Playlists", - "Albums": "Albums", - "Artists": "Artists", - "More": "More", - "Settings": "Settings", - "Downloads": "Downloads", - "Search or paste Deezer URL. Use / to quickly focus.": "Search or paste Deezer URL. Use \"/\" to quickly focus.", - "Play": "Play", - "Add to library": "Add to library", - "Download": "Download", - "fans": "fans", - "tracks": "tracks", - "Quality": "Quality", - "Estimated size:": "Estimated size:", - "Start downloading": "Start downloading", - "Cancel": "Cancel", - "Stream logging is disabled!": "Stream logging is disabled!", - "Enable it in settings for history to work properly.": "Enable it in settings for history to work properly.", - "History": "History", - "Create new playlist": "Create new playlist", - "TRACKS": "TRACKS", - "Sort by": "Sort by", - "Date Added": "Date Added", - "Name (A-Z)": "Name (A-Z)", - "Artist (A-Z)": "Artist (A-Z)", - "Album (A-Z)": "Album (A-Z)", - "Error loading lyrics or lyrics not found!": "Error loading lyrics or lyrics not found!", - "Create playlist": "Create playlist", - "Create": "Create", - "Add to playlist": "Add to playlist", - "Create new": "Create new", - "Remove": "Remove", - "Play next": "Play next", - "Add to queue": "Add to queue", - "Remove from library": "Remove from library", - "Remove from playlist": "Remove from playlist", - "Play track mix": "Play track mix", - "Go to": "Go to", - "Track Mix": "Track Mix", - "Duration": "Duration", - "Released": "Released", - "Disk": "Disk", - "albums": "albums", - "Play top": "Play top", - "Radio": "Radio", - "Show all albums": "Show all albums", - "Show all singles": "Show all singles", - "Show more": "Show more", - "Downloaded": "Downloaded", - "Queue": "Queue", - "Total": "Total", - "Stop": "Stop", - "Start": "Start", - "Show folder": "Show folder", - "Clear queue": "Clear queue", - "Playing from": "Playing from", - "Info": "Info", - "Lyrics": "Lyrics", - "Track number": "Track number", - "Disk number": "Disk number", - "Explicit": "Explicit", - "Source": "Source", + "Home": "Αρχική", + "Browse": "Περιήγηση", + "Library": "Βιβλιοθήκη", + "Tracks": "Κομμάτια", + "Playlists": "Λίστες αναπαραγωγής", + "Albums": "Album", + "Artists": "Καλλιτέχνες", + "More": "Περισσότερα", + "Settings": "Ρυθμίσεις", + "Downloads": "Λήψεις", + "Search or paste Deezer URL. Use / to quickly focus.": "Αναζήτηση ή επικόλληση διεύθυνσης URL Deezer. Χρησιμοποιήστε το \"/\" για γρήγορη εστίαση.", + "Play": "Αναπαραγωγή", + "Add to library": "Προσθήκη στη βιβλιοθήκη", + "Download": "Λήψη", + "fans": "θαυμαστές", + "tracks": "κομμάτια", + "Quality": "Ποιότητα", + "Estimated size:": "Εκτιμώμενος χρόνος:", + "Start downloading": "Έναρξη λήψης", + "Cancel": "Άκυρο", + "Stream logging is disabled!": "Η καταγραφή ροής είναι ανενεργή!", + "Enable it in settings for history to work properly.": "Ενεργοποιήστε το στις ρυθμίσεις για την σωστή λειτουργία του ιστορικού.", + "History": "Ιστορικό", + "Create new playlist": "Δημιουργία λίστας αναπαραγωγής", + "TRACKS": "ΤΡΑΓΟΥΔΙΑ", + "Sort by": "Ταξινόμηση κατά", + "Date Added": "Ημερομηνία Προσθήκης", + "Name (A-Z)": "Όνομα (Α-Ω)", + "Artist (A-Z)": "Καλλιτέχνης (Α-Ω)", + "Album (A-Z)": "Album (Α-Ω)", + "Error loading lyrics or lyrics not found!": "Σφάλμα κατά τη φόρτωση στίχων ή αδυναμία εύρεσης στίχων!", + "Create playlist": "Δημιουργία λίστας αναπαραγωγής", + "Create": "Δημιουργία", + "Add to playlist": "Προσθήκη στην λίστα αναπαραγωγής", + "Create new": "Δημιουργία νέου", + "Remove": "Αφαίρεση", + "Play next": "Παίξε αμέσως μετά", + "Add to queue": "Προσθήκη στην ουρά", + "Remove from library": "Κατάργηση από τη βιβλιοθήκη", + "Remove from playlist": "Κατάργηση από τη λίστα αναπαραγωγής", + "Play track mix": "Αναπαραγωγή μίξης τραγουδιών", + "Go to": "Πήγαινε σε", + "Track Mix": "Μίξη Τραγουδιών", + "Duration": "Διάρκεια", + "Released": "Κυκλοφόρησε", + "Disk": "Δίσκος", + "albums": "album", + "Play top": "Αναπαραγωγή κορυφαίου", + "Radio": "Ραδιόφωνο", + "Show all albums": "Εμφάνιση όλων των album", + "Show all singles": "Εμφάνιση όλων των single", + "Show more": "Εμφάνιση περισσότερων", + "Downloaded": "Ελήφθησαν", + "Queue": "Ουρά", + "Total": "Σύνολο ", + "Stop": "Διακοπή", + "Start": "Έναρξη", + "Show folder": "Εμφάνιση φακέλου", + "Clear queue": "Εκκαθάριση ουράς", + "Playing from": "Αναπαραγωγή από", + "Info": "Πληροφορίες", + "Lyrics": "Στίχοι", + "Track number": "Αριθμός τραγουδιού", + "Disk number": "Αριθμός δίσκου", + "Explicit": "Άσεμνο περιεχόμενο", + "Source": "Πηγή", "ID": "ID", - "Error logging in!": "Error logging in!", - "Please try again later, or try another account.": "Please try again later, or try another account.", - "Logout": "Logout", - "Login using browser": "Login using browser", - "Please login using your Deezer account:": "Please login using your Deezer account:", - "...or paste your ARL/Token below:": "...or paste your ARL/Token below:", + "Error logging in!": "Σφάλμα εισόδου!", + "Please try again later, or try another account.": "Δοκιμάστε ξανά αργότερα ή δοκιμάστε έναν άλλο λογαριασμό.", + "Logout": "Αποσύνδεση", + "Login using browser": "Σύνδεση χρησιμοποιώντας το πρόγραμμα περιήγησης", + "Please login using your Deezer account:": "Συνδεθείτε χρησιμοποιώντας τον λογαριασμό σας στο Deezer:", + "...or paste your ARL/Token below:": "... ή επικολλήστε το ARL/Token σας παρακάτω:", "ARL/Token": "ARL/Token", - "Login": "Login", - "By using this program, you disagree with Deezer's ToS.": "By using this program, you disagree with Deezer's ToS.", - "Only in Electron version!": "Only in Electron version!", - "Search results for:": "Search results for:", - "Error loading data!": "Error loading data!", - "Try again later!": "Try again later!", - "Search": "Search", - "Streaming Quality": "Streaming Quality", - "Download Quality": "Download Quality", - "Downloads Directory": "Downloads Directory", - "Simultaneous downloads": "Simultaneous downloads", - "Always show download confirm dialog before downloading.": "Always show download confirm dialog before downloading.", - "Show download dialog": "Show download dialog", - "Create folders for artists": "Create folders for artists", - "Create folders for albums": "Create folders for albums", - "Download lyrics": "Download lyrics", - "Variables": "Variables", - "UI": "UI", - "Show autocomplete in search": "Show autocomplete in search", - "Integrations": "Integrations", - "This allows listening history, flow and recommendations to work properly.": "This allows listening history, flow and recommendations to work properly.", - "Log track listens to Deezer": "Log track listens to Deezer", - "Connect your LastFM account to allow scrobbling.": "Connect your LastFM account to allow scrobbling.", - "Login with LastFM": "Login with LastFM", - "Disconnect LastFM": "Disconnect LastFM", - "Requires restart to apply!": "Requires restart to apply!", - "Enable Discord Rich Presence, requires restart to toggle!": "Enable Discord Rich Presence, requires restart to toggle!", - "Discord Rich Presence": "Discord Rich Presence", - "Enable Discord join button for syncing tracks, requires restart to toggle!": "Enable Discord join button for syncing tracks, requires restart to toggle!", - "Discord Join Button": "Discord Join Button", - "Other": "Other", - "Minimize to tray": "Minimize to tray", - "Don't minimize to tray": "Don't minimize to tray", - "Close on exit": "Close on exit", - "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Login": "Σύνδεση", + "By using this program, you disagree with Deezer's ToS.": "Χρησιμοποιώντας αυτό το πρόγραμμα, διαφωνείτε με τους όρους χρήσης του Deezer.", + "Only in Electron version!": "Μόνο στην έκδοση Electron!", + "Search results for:": "Αποτελέσματα αναζήτησης για:", + "Error loading data!": "Σφάλμα φόρτωσης δεδομένων!", + "Try again later!": "Δοκιμάστε ξανά αργότερα!", + "Search": "Αναζήτηση", + "Streaming Quality": "Ποιότητα ροής", + "Download Quality": "Ποιότητα λήψης", + "Downloads Directory": "Κατάλογος Λήψεων", + "Simultaneous downloads": "Ταυτόχρονες λήψεις", + "Always show download confirm dialog before downloading.": "Να εμφανίζεται πάντα το παράθυρο διαλόγου επιβεβαίωσης πριν από τη λήψη.", + "Show download dialog": "Εμφάνιση παραθύρου διαλόγου επιβεβαίωσης", + "Create folders for artists": "Δημιουργία φακέλου για καλλιτέχνη", + "Create folders for albums": "Δημιουργία φακέλων για album", + "Download lyrics": "Λήψη στίχων", + "Variables": "Μεταβλητές", + "UI": "Περιβάλλον Χρήστη", + "Show autocomplete in search": "Εμφάνιση αυτόματων συμπληρώσεων στην αναζήτηση", + "Integrations": "Ενσωματώσεις", + "This allows listening history, flow and recommendations to work properly.": "Επιτρέπει στο ιστορικό ακρόασης, το flow και τις προτάσεις να λειτουργούν σωστά.", + "Log track listens to Deezer": "Καταγραφή ακρόασης κομματιών στο Deezer", + "Connect your LastFM account to allow scrobbling.": "Συνδέστε τον λογαριασμό σας LastFM για να επιτρέψετε το scrobbling.", + "Login with LastFM": "Σύνδεση με LastFM", + "Disconnect LastFM": "Αποσύνδεση από LastFM", + "Requires restart to apply!": "Απαιτείται επανεκκίνηση για την εφαρμογή!", + "Enable Discord Rich Presence, requires restart to toggle!": "Ενεργοποίηση Discord Rich Presence, απαιτείται επανεκκίνηση!", + "Discord Rich Presence": "Ενεργοποίηση Discord Rich Presence", + "Enable Discord join button for syncing tracks, requires restart to toggle!": "Ενεργοποιήστε το κουμπί συμμετοχής Discord για συγχρονισμό κομματιών, απαιτείται επανεκκίνηση!", + "Discord Join Button": "Κουμπί συμμετοχής Discord", + "Other": "Άλλα", + "Minimize to tray": "Ελαχιστοποίηση σε εικονίδιο", + "Don't minimize to tray": "Μην ελαχιστοποιείτε σε εικονίδιο", + "Close on exit": "Κλείσιμο κατά την έξοδο", + "Settings saved!": "Οι ρυθμίσεις αποθηκεύτηκαν!", + "Available only in Electron version!": "Διαθέσιμο μόνο στην έκδοση Electron!", + "Crossfade (ms)": "Crossfade (ms)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" } \ No newline at end of file diff --git a/app/client/src/locales/en.json b/app/client/src/locales/en.json index 5071360..3711408 100644 --- a/app/client/src/locales/en.json +++ b/app/client/src/locales/en.json @@ -108,5 +108,18 @@ "Don't minimize to tray": "Don't minimize to tray", "Close on exit": "Close on exit", "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Available only in Electron version!": "Available only in Electron version!", + "Crossfade (ms)": "Crossfade (ms)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" + } \ No newline at end of file diff --git a/app/client/src/locales/es.json b/app/client/src/locales/es.json index 5071360..e78cd97 100644 --- a/app/client/src/locales/es.json +++ b/app/client/src/locales/es.json @@ -1,85 +1,85 @@ { - "Home": "Home", + "Home": "Inicio", "Browse": "Browse", - "Library": "Library", - "Tracks": "Tracks", - "Playlists": "Playlists", - "Albums": "Albums", - "Artists": "Artists", - "More": "More", - "Settings": "Settings", - "Downloads": "Downloads", + "Library": "Biblioteca", + "Tracks": "Canciones", + "Playlists": "Listas de reproducción", + "Albums": "Álbumes", + "Artists": "Artistas", + "More": "Más", + "Settings": "Configuración", + "Downloads": "Descargas", "Search or paste Deezer URL. Use / to quickly focus.": "Search or paste Deezer URL. Use \"/\" to quickly focus.", - "Play": "Play", + "Play": "Reproducir", "Add to library": "Add to library", - "Download": "Download", - "fans": "fans", - "tracks": "tracks", - "Quality": "Quality", - "Estimated size:": "Estimated size:", + "Download": "Descargar", + "fans": "seguidores", + "tracks": "canciones", + "Quality": "Calidad", + "Estimated size:": "Tamaño estimado:", "Start downloading": "Start downloading", - "Cancel": "Cancel", + "Cancel": "Cancelar", "Stream logging is disabled!": "Stream logging is disabled!", "Enable it in settings for history to work properly.": "Enable it in settings for history to work properly.", - "History": "History", + "History": "Historial", "Create new playlist": "Create new playlist", - "TRACKS": "TRACKS", - "Sort by": "Sort by", - "Date Added": "Date Added", - "Name (A-Z)": "Name (A-Z)", - "Artist (A-Z)": "Artist (A-Z)", - "Album (A-Z)": "Album (A-Z)", + "TRACKS": "CANCIONES", + "Sort by": "Ordenar por", + "Date Added": "Fecha de adición", + "Name (A-Z)": "Nombre (A-Z)", + "Artist (A-Z)": "Artista (A-Z)", + "Album (A-Z)": "Álbum (A-Z)", "Error loading lyrics or lyrics not found!": "Error loading lyrics or lyrics not found!", - "Create playlist": "Create playlist", - "Create": "Create", - "Add to playlist": "Add to playlist", - "Create new": "Create new", - "Remove": "Remove", - "Play next": "Play next", + "Create playlist": "Crear lista de reproducción", + "Create": "Crear", + "Add to playlist": "Agregar a la lista de reproducción", + "Create new": "Crear nuevo", + "Remove": "Quitar", + "Play next": "Reproducir siguiente", "Add to queue": "Add to queue", "Remove from library": "Remove from library", "Remove from playlist": "Remove from playlist", - "Play track mix": "Play track mix", - "Go to": "Go to", - "Track Mix": "Track Mix", - "Duration": "Duration", - "Released": "Released", - "Disk": "Disk", - "albums": "albums", - "Play top": "Play top", + "Play track mix": "Reproducir mezcla de canciones", + "Go to": "Ir a", + "Track Mix": "Mezcla de canciones", + "Duration": "Duración", + "Released": "Publicado", + "Disk": "Disco", + "albums": "álbumes", + "Play top": "Reproducir top", "Radio": "Radio", - "Show all albums": "Show all albums", + "Show all albums": "Mostrar todos los álbumes", "Show all singles": "Show all singles", - "Show more": "Show more", - "Downloaded": "Downloaded", - "Queue": "Queue", + "Show more": "Mostrar más", + "Downloaded": "Descargadas", + "Queue": "Cola", "Total": "Total", - "Stop": "Stop", - "Start": "Start", - "Show folder": "Show folder", - "Clear queue": "Clear queue", + "Stop": "Parar", + "Start": "Iniciar", + "Show folder": "Mostrar carpeta", + "Clear queue": "Limpiar cola", "Playing from": "Playing from", - "Info": "Info", - "Lyrics": "Lyrics", - "Track number": "Track number", - "Disk number": "Disk number", - "Explicit": "Explicit", - "Source": "Source", + "Info": "Información", + "Lyrics": "Letras", + "Track number": "Número de la canción", + "Disk number": "Número del disco", + "Explicit": "Explícito", + "Source": "Fuente", "ID": "ID", "Error logging in!": "Error logging in!", "Please try again later, or try another account.": "Please try again later, or try another account.", - "Logout": "Logout", + "Logout": "Cerrar sesión", "Login using browser": "Login using browser", "Please login using your Deezer account:": "Please login using your Deezer account:", "...or paste your ARL/Token below:": "...or paste your ARL/Token below:", "ARL/Token": "ARL/Token", - "Login": "Login", + "Login": "Ingresar", "By using this program, you disagree with Deezer's ToS.": "By using this program, you disagree with Deezer's ToS.", "Only in Electron version!": "Only in Electron version!", "Search results for:": "Search results for:", "Error loading data!": "Error loading data!", "Try again later!": "Try again later!", - "Search": "Search", + "Search": "Buscar", "Streaming Quality": "Streaming Quality", "Download Quality": "Download Quality", "Downloads Directory": "Downloads Directory", @@ -88,25 +88,37 @@ "Show download dialog": "Show download dialog", "Create folders for artists": "Create folders for artists", "Create folders for albums": "Create folders for albums", - "Download lyrics": "Download lyrics", + "Download lyrics": "Descargar letras", "Variables": "Variables", - "UI": "UI", + "UI": "IU", "Show autocomplete in search": "Show autocomplete in search", "Integrations": "Integrations", "This allows listening history, flow and recommendations to work properly.": "This allows listening history, flow and recommendations to work properly.", - "Log track listens to Deezer": "Log track listens to Deezer", + "Log track listens to Deezer": "Registrar la canción que escucha a Deezer", "Connect your LastFM account to allow scrobbling.": "Connect your LastFM account to allow scrobbling.", - "Login with LastFM": "Login with LastFM", + "Login with LastFM": "Iniciar sesión con LastFM", "Disconnect LastFM": "Disconnect LastFM", "Requires restart to apply!": "Requires restart to apply!", "Enable Discord Rich Presence, requires restart to toggle!": "Enable Discord Rich Presence, requires restart to toggle!", "Discord Rich Presence": "Discord Rich Presence", - "Enable Discord join button for syncing tracks, requires restart to toggle!": "Enable Discord join button for syncing tracks, requires restart to toggle!", + "Enable Discord join button for syncing tracks, requires restart to toggle!": "Activar el botón de unión de Discord para sincronizar las canciones, ¡requiere reiniciar para cambiarlo!", "Discord Join Button": "Discord Join Button", - "Other": "Other", + "Other": "Otro", "Minimize to tray": "Minimize to tray", "Don't minimize to tray": "Don't minimize to tray", "Close on exit": "Close on exit", - "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Settings saved!": "¡Configuraciones guardadas!", + "Available only in Electron version!": "Available only in Electron version!", + "Crossfade (ms)": "Desvanecimiento (ms)", + "Select primary color": "Seleccionar color primario", + "Light theme": "Tema claro", + "Create folders for playlists": "Crear carpetas para listas de reproducción", + "About": "Acerca de", + "Links:": "Enlaces:", + "Telegram Releases": "Lanzamientos en Telegram", + "Telegram Group": "Grupo en Telegram", + "Discord": "Discord", + "Telegram Android Group": "Grupo de Android en Telegram", + "Credits:": "Créditos:", + "Agree": "Acepto" } \ No newline at end of file diff --git a/app/client/src/locales/fa.json b/app/client/src/locales/fa.json index 5071360..afc8482 100644 --- a/app/client/src/locales/fa.json +++ b/app/client/src/locales/fa.json @@ -108,5 +108,17 @@ "Don't minimize to tray": "Don't minimize to tray", "Close on exit": "Close on exit", "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Available only in Electron version!": "Available only in Electron version!", + "Crossfade (ms)": "Crossfade (ms)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" } \ No newline at end of file diff --git a/app/client/src/locales/fil.json b/app/client/src/locales/fil.json index 5071360..f327637 100644 --- a/app/client/src/locales/fil.json +++ b/app/client/src/locales/fil.json @@ -2,56 +2,56 @@ "Home": "Home", "Browse": "Browse", "Library": "Library", - "Tracks": "Tracks", - "Playlists": "Playlists", - "Albums": "Albums", - "Artists": "Artists", + "Tracks": "Mga kanta", + "Playlists": "Mga playlist", + "Albums": "Mga album", + "Artists": "Mga artista", "More": "More", "Settings": "Settings", - "Downloads": "Downloads", + "Downloads": "Mga download", "Search or paste Deezer URL. Use / to quickly focus.": "Search or paste Deezer URL. Use \"/\" to quickly focus.", "Play": "Play", - "Add to library": "Add to library", - "Download": "Download", + "Add to library": "Idagdag sa library", + "Download": "I-download", "fans": "fans", - "tracks": "tracks", - "Quality": "Quality", - "Estimated size:": "Estimated size:", - "Start downloading": "Start downloading", - "Cancel": "Cancel", - "Stream logging is disabled!": "Stream logging is disabled!", + "tracks": "mga kanta", + "Quality": "Kalidad", + "Estimated size:": "Tinantyang laki:", + "Start downloading": "Simulan ang download", + "Cancel": "I-kansel", + "Stream logging is disabled!": "Naka-disable ang stream logging!", "Enable it in settings for history to work properly.": "Enable it in settings for history to work properly.", "History": "History", - "Create new playlist": "Create new playlist", + "Create new playlist": "Gumawa ng bagong playlist", "TRACKS": "TRACKS", "Sort by": "Sort by", "Date Added": "Date Added", "Name (A-Z)": "Name (A-Z)", - "Artist (A-Z)": "Artist (A-Z)", + "Artist (A-Z)": "Artista (A-Z)", "Album (A-Z)": "Album (A-Z)", "Error loading lyrics or lyrics not found!": "Error loading lyrics or lyrics not found!", - "Create playlist": "Create playlist", - "Create": "Create", - "Add to playlist": "Add to playlist", - "Create new": "Create new", - "Remove": "Remove", - "Play next": "Play next", - "Add to queue": "Add to queue", - "Remove from library": "Remove from library", - "Remove from playlist": "Remove from playlist", + "Create playlist": "Gumawa ng playlist", + "Create": "Gumawa", + "Add to playlist": "Idagdag sa playlist", + "Create new": "Gumawa ng bago", + "Remove": "Tanggalin", + "Play next": "I-play ang kasunod", + "Add to queue": "Idagdag sa queue", + "Remove from library": "Tanggalin sa library", + "Remove from playlist": "Tanggalin mula sa playlist", "Play track mix": "Play track mix", - "Go to": "Go to", + "Go to": "Pumunta sa", "Track Mix": "Track Mix", "Duration": "Duration", "Released": "Released", "Disk": "Disk", - "albums": "albums", + "albums": "Mga album", "Play top": "Play top", - "Radio": "Radio", - "Show all albums": "Show all albums", - "Show all singles": "Show all singles", + "Radio": "Radyo", + "Show all albums": "Ipakita lahat ng album", + "Show all singles": "Ipakita ang lahat ng mga single", "Show more": "Show more", - "Downloaded": "Downloaded", + "Downloaded": "Mga na-download", "Queue": "Queue", "Total": "Total", "Stop": "Stop", @@ -67,46 +67,58 @@ "Source": "Source", "ID": "ID", "Error logging in!": "Error logging in!", - "Please try again later, or try another account.": "Please try again later, or try another account.", - "Logout": "Logout", - "Login using browser": "Login using browser", - "Please login using your Deezer account:": "Please login using your Deezer account:", - "...or paste your ARL/Token below:": "...or paste your ARL/Token below:", + "Please try again later, or try another account.": "Paki-subukan ulit mamaya, o mag-try ng ibang account.", + "Logout": "Mag-logout", + "Login using browser": "Mag-login gamit ang browser", + "Please login using your Deezer account:": "Paki-login ang iyong Deezer account:", + "...or paste your ARL/Token below:": "...o ilagay ang iyong ARL/Token sa baba:", "ARL/Token": "ARL/Token", - "Login": "Login", - "By using this program, you disagree with Deezer's ToS.": "By using this program, you disagree with Deezer's ToS.", - "Only in Electron version!": "Only in Electron version!", - "Search results for:": "Search results for:", - "Error loading data!": "Error loading data!", - "Try again later!": "Try again later!", - "Search": "Search", - "Streaming Quality": "Streaming Quality", - "Download Quality": "Download Quality", - "Downloads Directory": "Downloads Directory", - "Simultaneous downloads": "Simultaneous downloads", - "Always show download confirm dialog before downloading.": "Always show download confirm dialog before downloading.", - "Show download dialog": "Show download dialog", - "Create folders for artists": "Create folders for artists", - "Create folders for albums": "Create folders for albums", - "Download lyrics": "Download lyrics", - "Variables": "Variables", + "Login": "Mag-login", + "By using this program, you disagree with Deezer's ToS.": "Sa paggamit ng program na ito, ikaw ay hindi sumasang-ayon sa ToS ng Deezer.", + "Only in Electron version!": "Sa Electron version lamang!", + "Search results for:": "Maghanap ng resulta para sa:", + "Error loading data!": "May problema habang naglo-load ng mga datos!", + "Try again later!": "Paki-subukan ulit mamaya!", + "Search": "Maghanap", + "Streaming Quality": "Kalidad ng streaming", + "Download Quality": "Kalidad ng download", + "Downloads Directory": "Lalagyan ng mga download", + "Simultaneous downloads": "Sabay-sabay na download", + "Always show download confirm dialog before downloading.": "Laging ipakita ang confirm dialog bago mag-download.", + "Show download dialog": "Ipakita ang download dialog", + "Create folders for artists": "Gumawa ng folder para sa mga artista", + "Create folders for albums": "Gumawa ng folder para sa mga album", + "Download lyrics": "I-download ang lyrics", + "Variables": "Mga variable", "UI": "UI", - "Show autocomplete in search": "Show autocomplete in search", - "Integrations": "Integrations", + "Show autocomplete in search": "Ipakita ang autocomplete sa search", + "Integrations": "Mga integration", "This allows listening history, flow and recommendations to work properly.": "This allows listening history, flow and recommendations to work properly.", "Log track listens to Deezer": "Log track listens to Deezer", - "Connect your LastFM account to allow scrobbling.": "Connect your LastFM account to allow scrobbling.", - "Login with LastFM": "Login with LastFM", - "Disconnect LastFM": "Disconnect LastFM", - "Requires restart to apply!": "Requires restart to apply!", - "Enable Discord Rich Presence, requires restart to toggle!": "Enable Discord Rich Presence, requires restart to toggle!", + "Connect your LastFM account to allow scrobbling.": "Ikabit ang iyong LastFM account para sa scrobbling.", + "Login with LastFM": "Mag-login gamit ang LastFM", + "Disconnect LastFM": "Tanggalin ang LastFM", + "Requires restart to apply!": "Kailangan i-restart para ma-apply!", + "Enable Discord Rich Presence, requires restart to toggle!": "I-enable ang Discord Rich Presence, kailangan i-restart para mabago!", "Discord Rich Presence": "Discord Rich Presence", - "Enable Discord join button for syncing tracks, requires restart to toggle!": "Enable Discord join button for syncing tracks, requires restart to toggle!", + "Enable Discord join button for syncing tracks, requires restart to toggle!": "I-enable ang Discord join button para sa pag-sync ng mga kanta, kailangan i-restart para mabago!", "Discord Join Button": "Discord Join Button", - "Other": "Other", - "Minimize to tray": "Minimize to tray", - "Don't minimize to tray": "Don't minimize to tray", - "Close on exit": "Close on exit", - "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Other": "Iba pa", + "Minimize to tray": "I-minimize sa tray", + "Don't minimize to tray": "Huwag i-minimize sa tray", + "Close on exit": "Isara sa pag-pindot ng X", + "Settings saved!": "Na-save ang settings!", + "Available only in Electron version!": "Meron lamang sa Electron version!", + "Crossfade (ms)": "Crossfade (ms)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" } \ No newline at end of file diff --git a/app/client/src/locales/fr.json b/app/client/src/locales/fr.json index 5071360..bc34f7e 100644 --- a/app/client/src/locales/fr.json +++ b/app/client/src/locales/fr.json @@ -1,62 +1,62 @@ { - "Home": "Home", - "Browse": "Browse", - "Library": "Library", - "Tracks": "Tracks", + "Home": "Accueil", + "Browse": "Explorer", + "Library": "Bibliothèque", + "Tracks": "Pistes", "Playlists": "Playlists", "Albums": "Albums", - "Artists": "Artists", - "More": "More", - "Settings": "Settings", - "Downloads": "Downloads", + "Artists": "Artistes", + "More": "Plus", + "Settings": "Paramètres", + "Downloads": "Téléchargements", "Search or paste Deezer URL. Use / to quickly focus.": "Search or paste Deezer URL. Use \"/\" to quickly focus.", "Play": "Play", "Add to library": "Add to library", - "Download": "Download", + "Download": "Télécharger", "fans": "fans", - "tracks": "tracks", - "Quality": "Quality", - "Estimated size:": "Estimated size:", - "Start downloading": "Start downloading", - "Cancel": "Cancel", + "tracks": "pistes", + "Quality": "Qualité", + "Estimated size:": "Durée estimée:", + "Start downloading": "Lancer le téléchargement", + "Cancel": "Annuler", "Stream logging is disabled!": "Stream logging is disabled!", "Enable it in settings for history to work properly.": "Enable it in settings for history to work properly.", - "History": "History", - "Create new playlist": "Create new playlist", - "TRACKS": "TRACKS", - "Sort by": "Sort by", - "Date Added": "Date Added", - "Name (A-Z)": "Name (A-Z)", - "Artist (A-Z)": "Artist (A-Z)", + "History": "Historique", + "Create new playlist": "Créer une nouvelle playlist", + "TRACKS": "PISTES", + "Sort by": "Trier par", + "Date Added": "Ajouté le", + "Name (A-Z)": "Nom (A-Z)", + "Artist (A-Z)": "Artiste (A-Z)", "Album (A-Z)": "Album (A-Z)", "Error loading lyrics or lyrics not found!": "Error loading lyrics or lyrics not found!", - "Create playlist": "Create playlist", - "Create": "Create", - "Add to playlist": "Add to playlist", + "Create playlist": "Créer une playlist", + "Create": "Créer", + "Add to playlist": "Ajouter à une playlist", "Create new": "Create new", - "Remove": "Remove", + "Remove": "Supprimer", "Play next": "Play next", - "Add to queue": "Add to queue", - "Remove from library": "Remove from library", - "Remove from playlist": "Remove from playlist", + "Add to queue": "Ajouter à la file d'attente", + "Remove from library": "Supprimer de la bibliothèque", + "Remove from playlist": "Supprimer de la playlist", "Play track mix": "Play track mix", "Go to": "Go to", "Track Mix": "Track Mix", - "Duration": "Duration", + "Duration": "Durée", "Released": "Released", - "Disk": "Disk", + "Disk": "Disque", "albums": "albums", "Play top": "Play top", "Radio": "Radio", - "Show all albums": "Show all albums", - "Show all singles": "Show all singles", - "Show more": "Show more", - "Downloaded": "Downloaded", + "Show all albums": "Afficher tous les albums", + "Show all singles": "Afficher tous les singles", + "Show more": "Afficher plus", + "Downloaded": "Téléchargés", "Queue": "Queue", "Total": "Total", - "Stop": "Stop", + "Stop": "Arrêter", "Start": "Start", - "Show folder": "Show folder", + "Show folder": "Afficher le dossier", "Clear queue": "Clear queue", "Playing from": "Playing from", "Info": "Info", @@ -67,46 +67,58 @@ "Source": "Source", "ID": "ID", "Error logging in!": "Error logging in!", - "Please try again later, or try another account.": "Please try again later, or try another account.", - "Logout": "Logout", - "Login using browser": "Login using browser", - "Please login using your Deezer account:": "Please login using your Deezer account:", - "...or paste your ARL/Token below:": "...or paste your ARL/Token below:", + "Please try again later, or try another account.": "Veuillez réessayer plus tard, ou essayez avec un autre compte.", + "Logout": "Déconnexion", + "Login using browser": "Connexion via navigateur", + "Please login using your Deezer account:": "Veuillez vous connecter en utilisant votre compte Deezer:", + "...or paste your ARL/Token below:": "...ou copiez votre ARL/Token ici:", "ARL/Token": "ARL/Token", - "Login": "Login", + "Login": "Connexion", "By using this program, you disagree with Deezer's ToS.": "By using this program, you disagree with Deezer's ToS.", - "Only in Electron version!": "Only in Electron version!", - "Search results for:": "Search results for:", + "Only in Electron version!": "Uniquement en version Electron !", + "Search results for:": "Résultats de la recherche pour:", "Error loading data!": "Error loading data!", - "Try again later!": "Try again later!", - "Search": "Search", - "Streaming Quality": "Streaming Quality", - "Download Quality": "Download Quality", - "Downloads Directory": "Downloads Directory", - "Simultaneous downloads": "Simultaneous downloads", + "Try again later!": "Réessayez plus tard !", + "Search": "Recherche", + "Streaming Quality": "Qualité en streaming", + "Download Quality": "Qualité de téléchargement", + "Downloads Directory": "Chemin de sauvegarde", + "Simultaneous downloads": "Limite téléchargements simultanés", "Always show download confirm dialog before downloading.": "Always show download confirm dialog before downloading.", "Show download dialog": "Show download dialog", - "Create folders for artists": "Create folders for artists", - "Create folders for albums": "Create folders for albums", - "Download lyrics": "Download lyrics", + "Create folders for artists": "Générer des dossiers par artiste", + "Create folders for albums": "Générer des dossiers par album", + "Download lyrics": "Télécharger les paroles", "Variables": "Variables", - "UI": "UI", + "UI": "Interface", "Show autocomplete in search": "Show autocomplete in search", - "Integrations": "Integrations", - "This allows listening history, flow and recommendations to work properly.": "This allows listening history, flow and recommendations to work properly.", + "Integrations": "Intégrations", + "This allows listening history, flow and recommendations to work properly.": "Cela permet à l'historique des titres écoutés, flow et aux recommandations de fonctionner correctement.", "Log track listens to Deezer": "Log track listens to Deezer", "Connect your LastFM account to allow scrobbling.": "Connect your LastFM account to allow scrobbling.", "Login with LastFM": "Login with LastFM", "Disconnect LastFM": "Disconnect LastFM", - "Requires restart to apply!": "Requires restart to apply!", - "Enable Discord Rich Presence, requires restart to toggle!": "Enable Discord Rich Presence, requires restart to toggle!", - "Discord Rich Presence": "Discord Rich Presence", - "Enable Discord join button for syncing tracks, requires restart to toggle!": "Enable Discord join button for syncing tracks, requires restart to toggle!", - "Discord Join Button": "Discord Join Button", - "Other": "Other", - "Minimize to tray": "Minimize to tray", - "Don't minimize to tray": "Don't minimize to tray", + "Requires restart to apply!": "Redémarrage nécessaire pour prendre effet !", + "Enable Discord Rich Presence, requires restart to toggle!": "Activer la présence Discord, nécessite un redémarrage pour prendre effet !", + "Discord Rich Presence": "Présence Discord", + "Enable Discord join button for syncing tracks, requires restart to toggle!": "Activer le bouton \"rejoindre\" sur Discord pour synchroniser les pistes, nécessite un redémarrage pour prendre effet !", + "Discord Join Button": "Bouton rejoindre sur Discord", + "Other": "Autre", + "Minimize to tray": "Réduire dans la zone de notification", + "Don't minimize to tray": "Ne pas réduire dans la zone de notification", "Close on exit": "Close on exit", - "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Settings saved!": "Paramètres sauvegardés !", + "Available only in Electron version!": "Uniquement disponible en version Electron !", + "Crossfade (ms)": "Crossfade (ms)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" } \ No newline at end of file diff --git a/app/client/src/locales/he.json b/app/client/src/locales/he.json index 5071360..afc8482 100644 --- a/app/client/src/locales/he.json +++ b/app/client/src/locales/he.json @@ -108,5 +108,17 @@ "Don't minimize to tray": "Don't minimize to tray", "Close on exit": "Close on exit", "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Available only in Electron version!": "Available only in Electron version!", + "Crossfade (ms)": "Crossfade (ms)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" } \ No newline at end of file diff --git a/app/client/src/locales/hi.json b/app/client/src/locales/hi.json index 5071360..afc8482 100644 --- a/app/client/src/locales/hi.json +++ b/app/client/src/locales/hi.json @@ -108,5 +108,17 @@ "Don't minimize to tray": "Don't minimize to tray", "Close on exit": "Close on exit", "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Available only in Electron version!": "Available only in Electron version!", + "Crossfade (ms)": "Crossfade (ms)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" } \ No newline at end of file diff --git a/app/client/src/locales/hr.json b/app/client/src/locales/hr.json index 5071360..afc8482 100644 --- a/app/client/src/locales/hr.json +++ b/app/client/src/locales/hr.json @@ -108,5 +108,17 @@ "Don't minimize to tray": "Don't minimize to tray", "Close on exit": "Close on exit", "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Available only in Electron version!": "Available only in Electron version!", + "Crossfade (ms)": "Crossfade (ms)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" } \ No newline at end of file diff --git a/app/client/src/locales/hu.json b/app/client/src/locales/hu.json index 5071360..efa789b 100644 --- a/app/client/src/locales/hu.json +++ b/app/client/src/locales/hu.json @@ -1,14 +1,14 @@ { - "Home": "Home", - "Browse": "Browse", - "Library": "Library", - "Tracks": "Tracks", - "Playlists": "Playlists", - "Albums": "Albums", - "Artists": "Artists", - "More": "More", - "Settings": "Settings", - "Downloads": "Downloads", + "Home": "Kezdőlap", + "Browse": "Böngészés", + "Library": "Könyvtár", + "Tracks": "Dalok", + "Playlists": "Lejátszási listák", + "Albums": "Albumok", + "Artists": "Előadók", + "More": "Továbbiak", + "Settings": "Beállítások", + "Downloads": "Letöltések", "Search or paste Deezer URL. Use / to quickly focus.": "Search or paste Deezer URL. Use \"/\" to quickly focus.", "Play": "Play", "Add to library": "Add to library", @@ -108,5 +108,17 @@ "Don't minimize to tray": "Don't minimize to tray", "Close on exit": "Close on exit", "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Available only in Electron version!": "Available only in Electron version!", + "Crossfade (ms)": "Crossfade (ms)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" } \ No newline at end of file diff --git a/app/client/src/locales/id.json b/app/client/src/locales/id.json index 5071360..648a1b4 100644 --- a/app/client/src/locales/id.json +++ b/app/client/src/locales/id.json @@ -1,112 +1,124 @@ { - "Home": "Home", - "Browse": "Browse", - "Library": "Library", - "Tracks": "Tracks", - "Playlists": "Playlists", - "Albums": "Albums", - "Artists": "Artists", - "More": "More", - "Settings": "Settings", - "Downloads": "Downloads", - "Search or paste Deezer URL. Use / to quickly focus.": "Search or paste Deezer URL. Use \"/\" to quickly focus.", - "Play": "Play", - "Add to library": "Add to library", - "Download": "Download", - "fans": "fans", - "tracks": "tracks", - "Quality": "Quality", - "Estimated size:": "Estimated size:", - "Start downloading": "Start downloading", - "Cancel": "Cancel", - "Stream logging is disabled!": "Stream logging is disabled!", - "Enable it in settings for history to work properly.": "Enable it in settings for history to work properly.", - "History": "History", - "Create new playlist": "Create new playlist", - "TRACKS": "TRACKS", - "Sort by": "Sort by", - "Date Added": "Date Added", - "Name (A-Z)": "Name (A-Z)", - "Artist (A-Z)": "Artist (A-Z)", + "Home": "Beranda", + "Browse": "Telusuri", + "Library": "Koleksi", + "Tracks": "Lagu", + "Playlists": "Daftar Putar", + "Albums": "Album", + "Artists": "Artis", + "More": "Lebih banyak", + "Settings": "Pengaturan", + "Downloads": "Unduhan", + "Search or paste Deezer URL. Use / to quickly focus.": "Cari atau tempel URL Deezer. Gunakan \"/\" untuk fokus dengan cepat.", + "Play": "Putar", + "Add to library": "Tambahkan ke koleksi", + "Download": "Unduh", + "fans": "penggemar", + "tracks": "lagu", + "Quality": "Kualitas", + "Estimated size:": "Perkiraan ukuran:", + "Start downloading": "Mulai mengunduh", + "Cancel": "Batalkan", + "Stream logging is disabled!": "Catatan pemutaran di nonaktifkan!", + "Enable it in settings for history to work properly.": "Aktifkan di pengaturan agar riwayat berfungsi dengan benar.", + "History": "Riwayat", + "Create new playlist": "Buat daftar putar baru", + "TRACKS": "LAGU", + "Sort by": "Urut berdasarkan", + "Date Added": "Tanggal Ditambahkan", + "Name (A-Z)": "Nama (A-Z)", + "Artist (A-Z)": "Artis (A-Z)", "Album (A-Z)": "Album (A-Z)", - "Error loading lyrics or lyrics not found!": "Error loading lyrics or lyrics not found!", - "Create playlist": "Create playlist", - "Create": "Create", - "Add to playlist": "Add to playlist", - "Create new": "Create new", - "Remove": "Remove", - "Play next": "Play next", - "Add to queue": "Add to queue", - "Remove from library": "Remove from library", - "Remove from playlist": "Remove from playlist", - "Play track mix": "Play track mix", - "Go to": "Go to", - "Track Mix": "Track Mix", - "Duration": "Duration", - "Released": "Released", + "Error loading lyrics or lyrics not found!": "Gagal memuat lirik atau lirik tidak tersedia!", + "Create playlist": "Buat daftar putar", + "Create": "Buat", + "Add to playlist": "Tambahkan ke daftar putar", + "Create new": "Buat baru", + "Remove": "Hapus", + "Play next": "Putar selanjutnya", + "Add to queue": "Tambahkan ke antrean", + "Remove from library": "Hapus dari koleksi", + "Remove from playlist": "Hapus dari daftar putar", + "Play track mix": "Putar lagu campuran", + "Go to": "Pergi ke", + "Track Mix": "Lagu Campuran", + "Duration": "Durasi", + "Released": "Dirilis", "Disk": "Disk", - "albums": "albums", - "Play top": "Play top", + "albums": "album", + "Play top": "Mainkan populer", "Radio": "Radio", - "Show all albums": "Show all albums", - "Show all singles": "Show all singles", - "Show more": "Show more", - "Downloaded": "Downloaded", - "Queue": "Queue", - "Total": "Total", - "Stop": "Stop", - "Start": "Start", - "Show folder": "Show folder", - "Clear queue": "Clear queue", - "Playing from": "Playing from", + "Show all albums": "Tampilkan semua album", + "Show all singles": "Tampilkan semua single", + "Show more": "Tampilkan lebih banyak", + "Downloaded": "Terunduh", + "Queue": "Antrean", + "Total": "Jumlah", + "Stop": "Berhenti", + "Start": "Mulai", + "Show folder": "Tampilkan folder", + "Clear queue": "Bersihkan antrean", + "Playing from": "Memainkan dari", "Info": "Info", - "Lyrics": "Lyrics", - "Track number": "Track number", - "Disk number": "Disk number", - "Explicit": "Explicit", - "Source": "Source", + "Lyrics": "Lirik", + "Track number": "Nomor lagu", + "Disk number": "Nomor disk", + "Explicit": "Eksplisit", + "Source": "Sumber", "ID": "ID", - "Error logging in!": "Error logging in!", - "Please try again later, or try another account.": "Please try again later, or try another account.", - "Logout": "Logout", - "Login using browser": "Login using browser", - "Please login using your Deezer account:": "Please login using your Deezer account:", - "...or paste your ARL/Token below:": "...or paste your ARL/Token below:", + "Error logging in!": "Gagal masuk!", + "Please try again later, or try another account.": "Coba lagi nanti, atau coba akun lain.", + "Logout": "Keluar", + "Login using browser": "Masuk menggunakan browser", + "Please login using your Deezer account:": "Silakan masuk menggunakan akun Deezer anda:", + "...or paste your ARL/Token below:": "...atau tempelkan ARL/Token dibawah ini:", "ARL/Token": "ARL/Token", - "Login": "Login", - "By using this program, you disagree with Deezer's ToS.": "By using this program, you disagree with Deezer's ToS.", - "Only in Electron version!": "Only in Electron version!", - "Search results for:": "Search results for:", - "Error loading data!": "Error loading data!", - "Try again later!": "Try again later!", - "Search": "Search", - "Streaming Quality": "Streaming Quality", - "Download Quality": "Download Quality", - "Downloads Directory": "Downloads Directory", - "Simultaneous downloads": "Simultaneous downloads", - "Always show download confirm dialog before downloading.": "Always show download confirm dialog before downloading.", - "Show download dialog": "Show download dialog", - "Create folders for artists": "Create folders for artists", - "Create folders for albums": "Create folders for albums", - "Download lyrics": "Download lyrics", - "Variables": "Variables", + "Login": "Masuk", + "By using this program, you disagree with Deezer's ToS.": "Dengan menggunakan program ini, kamu tidak setuju dengan ToS Deezer.", + "Only in Electron version!": "Hanya dalam versi Electron!", + "Search results for:": "Hasil pencarian untuk:", + "Error loading data!": "Gagal memuat data!", + "Try again later!": "Coba lagi nanti!", + "Search": "Cari", + "Streaming Quality": "Kualitas pemutaran", + "Download Quality": "Kualitas unduhan", + "Downloads Directory": "Folder Unduhan", + "Simultaneous downloads": "Unduhan serentak", + "Always show download confirm dialog before downloading.": "Selalu tampilkan dialog konfirmasi unduhan sebelum mengunduh.", + "Show download dialog": "Tampilkan dialog unduhan", + "Create folders for artists": "Buat folder untuk artis", + "Create folders for albums": "Buat folder untuk album", + "Download lyrics": "Unduh lirik", + "Variables": "Variabel", "UI": "UI", - "Show autocomplete in search": "Show autocomplete in search", - "Integrations": "Integrations", - "This allows listening history, flow and recommendations to work properly.": "This allows listening history, flow and recommendations to work properly.", - "Log track listens to Deezer": "Log track listens to Deezer", - "Connect your LastFM account to allow scrobbling.": "Connect your LastFM account to allow scrobbling.", - "Login with LastFM": "Login with LastFM", - "Disconnect LastFM": "Disconnect LastFM", - "Requires restart to apply!": "Requires restart to apply!", - "Enable Discord Rich Presence, requires restart to toggle!": "Enable Discord Rich Presence, requires restart to toggle!", + "Show autocomplete in search": "Tampilkan isi otomatis di pencarian", + "Integrations": "Integrasi", + "This allows listening history, flow and recommendations to work properly.": "Hal ini memungkinkan riwayat mendengarkan, aliran, dan rekomendasi berfungsi dengan baik.", + "Log track listens to Deezer": "Catat aktifitas mendengarkan lagu ke Deezer", + "Connect your LastFM account to allow scrobbling.": "Hubungkan ke akun LastFM mu untuk mengijinkan scrobbling.", + "Login with LastFM": "Masuk dengan LastFM", + "Disconnect LastFM": "Putuskan LastFM", + "Requires restart to apply!": "Mulai ulang untuk menerapkan!", + "Enable Discord Rich Presence, requires restart to toggle!": "Aktifkan Discord Rich Presence, perlu dimulai ulang untuk beralih!", "Discord Rich Presence": "Discord Rich Presence", - "Enable Discord join button for syncing tracks, requires restart to toggle!": "Enable Discord join button for syncing tracks, requires restart to toggle!", - "Discord Join Button": "Discord Join Button", - "Other": "Other", - "Minimize to tray": "Minimize to tray", - "Don't minimize to tray": "Don't minimize to tray", - "Close on exit": "Close on exit", - "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Enable Discord join button for syncing tracks, requires restart to toggle!": "Aktifkan tombol bergabung Discord untuk menyinkronkan lagu, perlu dimulai ulang untuk beralih!", + "Discord Join Button": "Tombol Bergabung Discord", + "Other": "Lainnya", + "Minimize to tray": "Minimalkan ke Tray", + "Don't minimize to tray": "Jangan minimalkan ke tray", + "Close on exit": "Tutup saat keluar", + "Settings saved!": "Pengaturan tersimpan!", + "Available only in Electron version!": "Hanya tersedia di versi Electron!", + "Crossfade (ms)": "Crossfade (ms)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" } \ No newline at end of file diff --git a/app/client/src/locales/it.json b/app/client/src/locales/it.json index 5071360..3656ac4 100644 --- a/app/client/src/locales/it.json +++ b/app/client/src/locales/it.json @@ -1,112 +1,124 @@ { "Home": "Home", - "Browse": "Browse", - "Library": "Library", - "Tracks": "Tracks", - "Playlists": "Playlists", - "Albums": "Albums", - "Artists": "Artists", - "More": "More", - "Settings": "Settings", - "Downloads": "Downloads", - "Search or paste Deezer URL. Use / to quickly focus.": "Search or paste Deezer URL. Use \"/\" to quickly focus.", + "Browse": "Sfoglia", + "Library": "Libreria", + "Tracks": "Brani", + "Playlists": "Playlist", + "Albums": "Album", + "Artists": "Artisti", + "More": "Altro", + "Settings": "Impostazioni", + "Downloads": "Download", + "Search or paste Deezer URL. Use / to quickly focus.": "Cerca qui o incolla un URL di Deezer. Usa \"/\" per mettere a fuoco questa barra.", "Play": "Play", - "Add to library": "Add to library", - "Download": "Download", - "fans": "fans", - "tracks": "tracks", - "Quality": "Quality", - "Estimated size:": "Estimated size:", - "Start downloading": "Start downloading", - "Cancel": "Cancel", - "Stream logging is disabled!": "Stream logging is disabled!", - "Enable it in settings for history to work properly.": "Enable it in settings for history to work properly.", - "History": "History", - "Create new playlist": "Create new playlist", - "TRACKS": "TRACKS", - "Sort by": "Sort by", - "Date Added": "Date Added", - "Name (A-Z)": "Name (A-Z)", - "Artist (A-Z)": "Artist (A-Z)", + "Add to library": "Aggiungi alla libreria", + "Download": "Scarica", + "fans": "fan", + "tracks": "brani", + "Quality": "Qualità", + "Estimated size:": "Dimensione stimata:", + "Start downloading": "Inizia il download", + "Cancel": "Annulla", + "Stream logging is disabled!": "Il logging delle stream è disabilitato!", + "Enable it in settings for history to work properly.": "Abilitalo nelle impostazioni per permettere alla cronologia di funzionare correttamente.", + "History": "Cronologia", + "Create new playlist": "Crea una playlist", + "TRACKS": "BRANI", + "Sort by": "Ordina per", + "Date Added": "Data di aggiunta", + "Name (A-Z)": "Nome (A-Z)", + "Artist (A-Z)": "Artista (A-Z)", "Album (A-Z)": "Album (A-Z)", - "Error loading lyrics or lyrics not found!": "Error loading lyrics or lyrics not found!", - "Create playlist": "Create playlist", - "Create": "Create", - "Add to playlist": "Add to playlist", - "Create new": "Create new", - "Remove": "Remove", - "Play next": "Play next", - "Add to queue": "Add to queue", - "Remove from library": "Remove from library", - "Remove from playlist": "Remove from playlist", - "Play track mix": "Play track mix", - "Go to": "Go to", - "Track Mix": "Track Mix", - "Duration": "Duration", - "Released": "Released", - "Disk": "Disk", - "albums": "albums", - "Play top": "Play top", + "Error loading lyrics or lyrics not found!": "Errore nel caricare i testi o testi non trovati!", + "Create playlist": "Crea playlist", + "Create": "Crea", + "Add to playlist": "Aggiungi a playlist", + "Create new": "Crea nuova", + "Remove": "Rimuovi", + "Play next": "Riproduci subito dopo", + "Add to queue": "Aggiungi alla coda", + "Remove from library": "Rimuovi dalla libreria", + "Remove from playlist": "Rimuovi dalla playlist", + "Play track mix": "Riproduci mix di brani", + "Go to": "Vai a", + "Track Mix": "Mix Di Tracce", + "Duration": "Durata", + "Released": "Data di uscita", + "Disk": "Disco", + "albums": "album", + "Play top": "Riproduci dall'inizio", "Radio": "Radio", - "Show all albums": "Show all albums", - "Show all singles": "Show all singles", - "Show more": "Show more", - "Downloaded": "Downloaded", - "Queue": "Queue", - "Total": "Total", + "Show all albums": "Mostra tutti gli album", + "Show all singles": "Mostra tutti i singoli", + "Show more": "Mostra di più", + "Downloaded": "Scaricato", + "Queue": "Coda", + "Total": "Totale", "Stop": "Stop", - "Start": "Start", - "Show folder": "Show folder", - "Clear queue": "Clear queue", - "Playing from": "Playing from", - "Info": "Info", - "Lyrics": "Lyrics", - "Track number": "Track number", - "Disk number": "Disk number", - "Explicit": "Explicit", - "Source": "Source", + "Start": "Avvia", + "Show folder": "Mostra cartella", + "Clear queue": "Pulisci la coda", + "Playing from": "Riproduzione da", + "Info": "Informazioni", + "Lyrics": "Testo", + "Track number": "Numero della traccia", + "Disk number": "Numero del disco", + "Explicit": "Esplicito", + "Source": "Fonte", "ID": "ID", - "Error logging in!": "Error logging in!", - "Please try again later, or try another account.": "Please try again later, or try another account.", - "Logout": "Logout", - "Login using browser": "Login using browser", - "Please login using your Deezer account:": "Please login using your Deezer account:", - "...or paste your ARL/Token below:": "...or paste your ARL/Token below:", + "Error logging in!": "Errore durante il login!", + "Please try again later, or try another account.": "Riprova più tardi, o prova un altro account.", + "Logout": "Disconnettiti", + "Login using browser": "Accedi utilizzando il browser", + "Please login using your Deezer account:": "Effettua il login usando il tuo account Deezer:", + "...or paste your ARL/Token below:": "...o incolla il tuo ARL/Token qui sotto:", "ARL/Token": "ARL/Token", "Login": "Login", - "By using this program, you disagree with Deezer's ToS.": "By using this program, you disagree with Deezer's ToS.", - "Only in Electron version!": "Only in Electron version!", - "Search results for:": "Search results for:", - "Error loading data!": "Error loading data!", - "Try again later!": "Try again later!", - "Search": "Search", - "Streaming Quality": "Streaming Quality", - "Download Quality": "Download Quality", - "Downloads Directory": "Downloads Directory", - "Simultaneous downloads": "Simultaneous downloads", - "Always show download confirm dialog before downloading.": "Always show download confirm dialog before downloading.", - "Show download dialog": "Show download dialog", - "Create folders for artists": "Create folders for artists", - "Create folders for albums": "Create folders for albums", - "Download lyrics": "Download lyrics", - "Variables": "Variables", - "UI": "UI", - "Show autocomplete in search": "Show autocomplete in search", - "Integrations": "Integrations", - "This allows listening history, flow and recommendations to work properly.": "This allows listening history, flow and recommendations to work properly.", - "Log track listens to Deezer": "Log track listens to Deezer", - "Connect your LastFM account to allow scrobbling.": "Connect your LastFM account to allow scrobbling.", - "Login with LastFM": "Login with LastFM", - "Disconnect LastFM": "Disconnect LastFM", - "Requires restart to apply!": "Requires restart to apply!", - "Enable Discord Rich Presence, requires restart to toggle!": "Enable Discord Rich Presence, requires restart to toggle!", + "By using this program, you disagree with Deezer's ToS.": "Utilizzando questo programma, non sei d'accordo con il ToS di Deezer.", + "Only in Electron version!": "Solo nella versione Electron!", + "Search results for:": "Risultati della ricerca per:", + "Error loading data!": "Errore nel caricamento dei dati!", + "Try again later!": "Riprova più tardi!", + "Search": "Cerca", + "Streaming Quality": "Qualità Streaming", + "Download Quality": "Qualità Download", + "Downloads Directory": "Cartella Download", + "Simultaneous downloads": "Download simultanei", + "Always show download confirm dialog before downloading.": "Mostra sempre la conferma di download prima di scaricare.", + "Show download dialog": "Mostra finestra di download", + "Create folders for artists": "Crea cartelle per gli artisti", + "Create folders for albums": "Crea cartelle per gli album", + "Download lyrics": "Scarica testo", + "Variables": "Variabili", + "UI": "Interfaccia", + "Show autocomplete in search": "Mostra elenco autocompletamento", + "Integrations": "Integrazioni", + "This allows listening history, flow and recommendations to work properly.": "Questo permette di usare la cronologia, il Flow e le raccomandazioni per funzionare correttamente.", + "Log track listens to Deezer": "Registra gli ascolti delle tracce a Deezer", + "Connect your LastFM account to allow scrobbling.": "Collega il tuo account LastFM per consentire lo scrobbling.", + "Login with LastFM": "Accedi con LastFM", + "Disconnect LastFM": "Disconnetti LastFM", + "Requires restart to apply!": "Richiede un riavvio!", + "Enable Discord Rich Presence, requires restart to toggle!": "Abilita Discord Rich Presence, richiede il riavvio!", "Discord Rich Presence": "Discord Rich Presence", - "Enable Discord join button for syncing tracks, requires restart to toggle!": "Enable Discord join button for syncing tracks, requires restart to toggle!", - "Discord Join Button": "Discord Join Button", - "Other": "Other", - "Minimize to tray": "Minimize to tray", - "Don't minimize to tray": "Don't minimize to tray", - "Close on exit": "Close on exit", - "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Enable Discord join button for syncing tracks, requires restart to toggle!": "Abilita il pulsante \"join\" di Discord per sincronizzare le tracce, richiede il riavvio!", + "Discord Join Button": "Pulsante Unisciti di Discord", + "Other": "Altro", + "Minimize to tray": "Minimizza ad icona", + "Don't minimize to tray": "Non minimizzare a icona", + "Close on exit": "Chiudi all'uscita", + "Settings saved!": "Impostazioni salvate!", + "Available only in Electron version!": "Disponibile solo nella versione Electron!", + "Crossfade (ms)": "Dissolvenza (ms)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" } \ No newline at end of file diff --git a/app/client/src/locales/ko.json b/app/client/src/locales/ko.json index 5071360..afc8482 100644 --- a/app/client/src/locales/ko.json +++ b/app/client/src/locales/ko.json @@ -108,5 +108,17 @@ "Don't minimize to tray": "Don't minimize to tray", "Close on exit": "Close on exit", "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Available only in Electron version!": "Available only in Electron version!", + "Crossfade (ms)": "Crossfade (ms)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" } \ No newline at end of file diff --git a/app/client/src/locales/pl.json b/app/client/src/locales/pl.json index 5071360..7493eee 100644 --- a/app/client/src/locales/pl.json +++ b/app/client/src/locales/pl.json @@ -1,112 +1,124 @@ { - "Home": "Home", - "Browse": "Browse", - "Library": "Library", - "Tracks": "Tracks", - "Playlists": "Playlists", - "Albums": "Albums", - "Artists": "Artists", - "More": "More", - "Settings": "Settings", - "Downloads": "Downloads", - "Search or paste Deezer URL. Use / to quickly focus.": "Search or paste Deezer URL. Use \"/\" to quickly focus.", - "Play": "Play", - "Add to library": "Add to library", - "Download": "Download", - "fans": "fans", - "tracks": "tracks", - "Quality": "Quality", - "Estimated size:": "Estimated size:", - "Start downloading": "Start downloading", - "Cancel": "Cancel", - "Stream logging is disabled!": "Stream logging is disabled!", - "Enable it in settings for history to work properly.": "Enable it in settings for history to work properly.", - "History": "History", - "Create new playlist": "Create new playlist", - "TRACKS": "TRACKS", - "Sort by": "Sort by", - "Date Added": "Date Added", - "Name (A-Z)": "Name (A-Z)", - "Artist (A-Z)": "Artist (A-Z)", + "Home": "Strona główna", + "Browse": "Przeglądaj", + "Library": "Biblioteka", + "Tracks": "Utwory", + "Playlists": "Playlisty", + "Albums": "Albumy", + "Artists": "Wykonawcy", + "More": "Więcej", + "Settings": "Ustawienia", + "Downloads": "Pobrane", + "Search or paste Deezer URL. Use / to quickly focus.": "Wyszukaj lub wklej adres URL Deezera. Wciśnij \"/\" aby szybko uaktywnić pasek wyszukiwania.", + "Play": "Odtwórz", + "Add to library": "Dodaj do biblioteki", + "Download": "Pobierz", + "fans": "fani", + "tracks": "utwory", + "Quality": "Jakość", + "Estimated size:": "Szacowany rozmiar:", + "Start downloading": "Rozpocznij pobieranie", + "Cancel": "Anuluj", + "Stream logging is disabled!": "Rejestrowanie strumieniowania jest wyłączone!", + "Enable it in settings for history to work properly.": "Włącz to w ustawieniach, aby historia działała prawidłowo.", + "History": "Historia", + "Create new playlist": "Utwórz nową playlistę", + "TRACKS": "UTWORY", + "Sort by": "Sortuj wg", + "Date Added": "Data dodania", + "Name (A-Z)": "Nazwa (A-Z)", + "Artist (A-Z)": "Artysta (A-Z)", "Album (A-Z)": "Album (A-Z)", - "Error loading lyrics or lyrics not found!": "Error loading lyrics or lyrics not found!", - "Create playlist": "Create playlist", - "Create": "Create", - "Add to playlist": "Add to playlist", - "Create new": "Create new", - "Remove": "Remove", - "Play next": "Play next", - "Add to queue": "Add to queue", - "Remove from library": "Remove from library", - "Remove from playlist": "Remove from playlist", - "Play track mix": "Play track mix", - "Go to": "Go to", - "Track Mix": "Track Mix", - "Duration": "Duration", - "Released": "Released", - "Disk": "Disk", - "albums": "albums", - "Play top": "Play top", + "Error loading lyrics or lyrics not found!": "Wystąpił błąd podczas ładowania tekstu lub tekst nie został znaleziony!", + "Create playlist": "Utwórz playlistę", + "Create": "Utwórz", + "Add to playlist": "Dodaj do playlisty", + "Create new": "Utwórz nową", + "Remove": "Usuń", + "Play next": "Odtwarzaj następne", + "Add to queue": "Dodaj do kolejki", + "Remove from library": "Usuń z biblioteki", + "Remove from playlist": "Usuń z playlisty", + "Play track mix": "Odtwórz mieszane utwory", + "Go to": "Przejdź do", + "Track Mix": "Mieszaj utwory", + "Duration": "Czas trwania", + "Released": "Wydano", + "Disk": "Płyta", + "albums": "albumy", + "Play top": "Odtwarzaj topkę", "Radio": "Radio", - "Show all albums": "Show all albums", - "Show all singles": "Show all singles", - "Show more": "Show more", - "Downloaded": "Downloaded", - "Queue": "Queue", - "Total": "Total", - "Stop": "Stop", - "Start": "Start", - "Show folder": "Show folder", - "Clear queue": "Clear queue", - "Playing from": "Playing from", + "Show all albums": "Pokaż wszystkie albumy", + "Show all singles": "Pokaż wszystkie single", + "Show more": "Pokaż więcej", + "Downloaded": "Pobrane", + "Queue": "Kolejka", + "Total": "Łącznie", + "Stop": "Zatrzymaj", + "Start": "Rozpocznij", + "Show folder": "Pokaż folder", + "Clear queue": "Wyczyść kolejkę", + "Playing from": "Odtwarzanie z", "Info": "Info", - "Lyrics": "Lyrics", - "Track number": "Track number", - "Disk number": "Disk number", - "Explicit": "Explicit", - "Source": "Source", + "Lyrics": "Tekst", + "Track number": "Numer utworu", + "Disk number": "Numer płyty", + "Explicit": "Wulgarne", + "Source": "Źródło", "ID": "ID", - "Error logging in!": "Error logging in!", - "Please try again later, or try another account.": "Please try again later, or try another account.", - "Logout": "Logout", - "Login using browser": "Login using browser", - "Please login using your Deezer account:": "Please login using your Deezer account:", - "...or paste your ARL/Token below:": "...or paste your ARL/Token below:", + "Error logging in!": "Błąd podczas logowania!", + "Please try again later, or try another account.": "Spróbuj ponownie później lub spróbuj innego konta.", + "Logout": "Wyloguj", + "Login using browser": "Zaloguj się za pomocą przeglądarki", + "Please login using your Deezer account:": "Zaloguj się używając swojego konta Deezer:", + "...or paste your ARL/Token below:": "...lub wklej ARL/Token poniżej:", "ARL/Token": "ARL/Token", - "Login": "Login", - "By using this program, you disagree with Deezer's ToS.": "By using this program, you disagree with Deezer's ToS.", - "Only in Electron version!": "Only in Electron version!", - "Search results for:": "Search results for:", - "Error loading data!": "Error loading data!", - "Try again later!": "Try again later!", - "Search": "Search", - "Streaming Quality": "Streaming Quality", - "Download Quality": "Download Quality", - "Downloads Directory": "Downloads Directory", - "Simultaneous downloads": "Simultaneous downloads", - "Always show download confirm dialog before downloading.": "Always show download confirm dialog before downloading.", - "Show download dialog": "Show download dialog", - "Create folders for artists": "Create folders for artists", - "Create folders for albums": "Create folders for albums", - "Download lyrics": "Download lyrics", - "Variables": "Variables", - "UI": "UI", - "Show autocomplete in search": "Show autocomplete in search", - "Integrations": "Integrations", - "This allows listening history, flow and recommendations to work properly.": "This allows listening history, flow and recommendations to work properly.", - "Log track listens to Deezer": "Log track listens to Deezer", - "Connect your LastFM account to allow scrobbling.": "Connect your LastFM account to allow scrobbling.", - "Login with LastFM": "Login with LastFM", - "Disconnect LastFM": "Disconnect LastFM", - "Requires restart to apply!": "Requires restart to apply!", - "Enable Discord Rich Presence, requires restart to toggle!": "Enable Discord Rich Presence, requires restart to toggle!", + "Login": "Zaloguj", + "By using this program, you disagree with Deezer's ToS.": "Korzystając z tego programu, nie zgadzasz się z ToS Deezera.", + "Only in Electron version!": "Tylko w wersji Electron!", + "Search results for:": "Wyniki wyszukiwania dla:", + "Error loading data!": "Błąd ładowania danych!", + "Try again later!": "Spróbuj ponownie później!", + "Search": "Szukaj", + "Streaming Quality": "Jakość odtwarzania", + "Download Quality": "Jakość pobierania", + "Downloads Directory": "Katalog pobierania", + "Simultaneous downloads": "Jednoczesne pobieranie", + "Always show download confirm dialog before downloading.": "Zawsze proś o potwierdzenie przed pobieraniem.", + "Show download dialog": "Pokazuj okno dialogowe pobierania", + "Create folders for artists": "Twórz foldery wykonawców", + "Create folders for albums": "Twórz foldery albumów", + "Download lyrics": "Pobierz tekst", + "Variables": "Zmienne", + "UI": "Interfejs", + "Show autocomplete in search": "Pokaż autouzupełnianie w wyszukiwarce", + "Integrations": "Połącz", + "This allows listening history, flow and recommendations to work properly.": "Pozwala na działanie historii odtwarzania, rekomendacji i automatycznych playlist.", + "Log track listens to Deezer": "Zapisuj historię odtwarzania na koncie Deezer", + "Connect your LastFM account to allow scrobbling.": "Połącz swoje konto LastFM, aby umożliwić scrobbling.", + "Login with LastFM": "Zaloguj używając LastFM", + "Disconnect LastFM": "Odłącz LastFM", + "Requires restart to apply!": "Zmiany wymagają ponownego uruchomienia!", + "Enable Discord Rich Presence, requires restart to toggle!": "Włącz Szczegółowy Widok Discord, wymaga ponownego uruchomienia!", "Discord Rich Presence": "Discord Rich Presence", - "Enable Discord join button for syncing tracks, requires restart to toggle!": "Enable Discord join button for syncing tracks, requires restart to toggle!", - "Discord Join Button": "Discord Join Button", - "Other": "Other", - "Minimize to tray": "Minimize to tray", - "Don't minimize to tray": "Don't minimize to tray", - "Close on exit": "Close on exit", - "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Enable Discord join button for syncing tracks, requires restart to toggle!": "Włącz w Discordzie przycisk dołączenia, aby synchronizować utwory, wymaga ponownego uruchomienia!", + "Discord Join Button": "Przycisk dołączenia Discord", + "Other": "Inne", + "Minimize to tray": "Minimalizuj do zasobnika", + "Don't minimize to tray": "Nie minimalizuj do zasobnika", + "Close on exit": "Wyłącz po zamknięciu okna", + "Settings saved!": "Ustawienia zapisane!", + "Available only in Electron version!": "Dostępne tylko w wersji Electron!", + "Crossfade (ms)": "Przejście (ms)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" } \ No newline at end of file diff --git a/app/client/src/locales/pt.json b/app/client/src/locales/pt.json index 5071360..6e54402 100644 --- a/app/client/src/locales/pt.json +++ b/app/client/src/locales/pt.json @@ -1,54 +1,54 @@ { - "Home": "Home", - "Browse": "Browse", - "Library": "Library", - "Tracks": "Tracks", + "Home": "Início", + "Browse": "Navegar", + "Library": "Biblioteca", + "Tracks": "Faixas", "Playlists": "Playlists", - "Albums": "Albums", - "Artists": "Artists", + "Albums": "Álbuns", + "Artists": "Artistas", "More": "More", - "Settings": "Settings", + "Settings": "Configurações", "Downloads": "Downloads", - "Search or paste Deezer URL. Use / to quickly focus.": "Search or paste Deezer URL. Use \"/\" to quickly focus.", + "Search or paste Deezer URL. Use / to quickly focus.": "Procure ou cole a URL do intérprete. Use \"/\" para focar rapidamente.", "Play": "Play", - "Add to library": "Add to library", + "Add to library": "Adicionar à biblioteca", "Download": "Download", "fans": "fans", - "tracks": "tracks", - "Quality": "Quality", - "Estimated size:": "Estimated size:", - "Start downloading": "Start downloading", - "Cancel": "Cancel", - "Stream logging is disabled!": "Stream logging is disabled!", - "Enable it in settings for history to work properly.": "Enable it in settings for history to work properly.", - "History": "History", - "Create new playlist": "Create new playlist", - "TRACKS": "TRACKS", + "tracks": "faixas", + "Quality": "Qualidade", + "Estimated size:": "Tempo estimado:", + "Start downloading": "Iniciar download", + "Cancel": "Cancelar", + "Stream logging is disabled!": "O registro de depuração extra está desativado!", + "Enable it in settings for history to work properly.": "Habilite nas configurações para que o histórico funcione corretamente.", + "History": "Histórico", + "Create new playlist": "Criar nova playlist", + "TRACKS": "FAIXAS", "Sort by": "Sort by", - "Date Added": "Date Added", - "Name (A-Z)": "Name (A-Z)", - "Artist (A-Z)": "Artist (A-Z)", - "Album (A-Z)": "Album (A-Z)", - "Error loading lyrics or lyrics not found!": "Error loading lyrics or lyrics not found!", - "Create playlist": "Create playlist", - "Create": "Create", - "Add to playlist": "Add to playlist", - "Create new": "Create new", - "Remove": "Remove", - "Play next": "Play next", - "Add to queue": "Add to queue", - "Remove from library": "Remove from library", - "Remove from playlist": "Remove from playlist", - "Play track mix": "Play track mix", - "Go to": "Go to", - "Track Mix": "Track Mix", - "Duration": "Duration", - "Released": "Released", - "Disk": "Disk", - "albums": "albums", - "Play top": "Play top", - "Radio": "Radio", - "Show all albums": "Show all albums", + "Date Added": "Data de adição", + "Name (A-Z)": "Nome (A-Z)", + "Artist (A-Z)": "Artista (A-Z)", + "Album (A-Z)": "Álbum (A-Z)", + "Error loading lyrics or lyrics not found!": "Erro ao carregar letras ou letras não encontradas!", + "Create playlist": "Criar playlist", + "Create": "Criar", + "Add to playlist": "Adicionar à playlist", + "Create new": "Criar novo", + "Remove": "Remover", + "Play next": "Reproduzir à seguir", + "Add to queue": "Adicionar à fila", + "Remove from library": "Remover da biblioteca", + "Remove from playlist": "Remover da playlist", + "Play track mix": "Reproduzir mistura de trilha", + "Go to": "Ir para", + "Track Mix": "Faixa Mix", + "Duration": "Duração", + "Released": "Lançamento", + "Disk": "Disco", + "albums": "álbuns", + "Play top": "Reproduzir no topo", + "Radio": "Rádio", + "Show all albums": "Mostrar todos os álbuns", "Show all singles": "Show all singles", "Show more": "Show more", "Downloaded": "Downloaded", @@ -99,14 +99,26 @@ "Login with LastFM": "Login with LastFM", "Disconnect LastFM": "Disconnect LastFM", "Requires restart to apply!": "Requires restart to apply!", - "Enable Discord Rich Presence, requires restart to toggle!": "Enable Discord Rich Presence, requires restart to toggle!", - "Discord Rich Presence": "Discord Rich Presence", - "Enable Discord join button for syncing tracks, requires restart to toggle!": "Enable Discord join button for syncing tracks, requires restart to toggle!", - "Discord Join Button": "Discord Join Button", - "Other": "Other", - "Minimize to tray": "Minimize to tray", - "Don't minimize to tray": "Don't minimize to tray", - "Close on exit": "Close on exit", - "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Enable Discord Rich Presence, requires restart to toggle!": "Ativar o Rich Presence do Discord, requer reiniciar para alternar!", + "Discord Rich Presence": "Habilitar o Discord", + "Enable Discord join button for syncing tracks, requires restart to toggle!": "Ativar o botão de adesão do Discord para sincronizar faixas requer reinicialização para alternar!", + "Discord Join Button": "Botão de Entrada Discord", + "Other": "Outros", + "Minimize to tray": "Minimizar para a bandeja", + "Don't minimize to tray": "Minimizar automaticamente para a bandeja", + "Close on exit": "Fechar ao sair", + "Settings saved!": "Configurações salvas!", + "Available only in Electron version!": "Disponível apenas na versão completa!", + "Crossfade (ms)": "Transição suave (ms)", + "Select primary color": "Escolha a cor primária", + "Light theme": "Tema Claro", + "Create folders for playlists": "Criar pastas para playlists", + "About": "Sobre", + "Links:": "Links:", + "Telegram Releases": "Versões no Telegram", + "Telegram Group": "Grupo do Telegram", + "Discord": "Discord", + "Telegram Android Group": "Grupo Android do Telegram", + "Credits:": "Créditos:", + "Agree": "Concordo" } \ No newline at end of file diff --git a/app/client/src/locales/ro.json b/app/client/src/locales/ro.json index 5071360..f3443c4 100644 --- a/app/client/src/locales/ro.json +++ b/app/client/src/locales/ro.json @@ -1,112 +1,124 @@ { "Home": "Home", - "Browse": "Browse", - "Library": "Library", - "Tracks": "Tracks", - "Playlists": "Playlists", - "Albums": "Albums", - "Artists": "Artists", - "More": "More", - "Settings": "Settings", - "Downloads": "Downloads", - "Search or paste Deezer URL. Use / to quickly focus.": "Search or paste Deezer URL. Use \"/\" to quickly focus.", + "Browse": "Caută", + "Library": "Librărie", + "Tracks": "Piese", + "Playlists": "Playlist-uri", + "Albums": "Albume", + "Artists": "Artiști", + "More": "Mai mult", + "Settings": "Setări", + "Downloads": "Descărcări", + "Search or paste Deezer URL. Use / to quickly focus.": "Caută sau lipește URL-ul Deezer. Folosește \"/\" pentru a se focaliza rapid.", "Play": "Play", - "Add to library": "Add to library", - "Download": "Download", - "fans": "fans", - "tracks": "tracks", - "Quality": "Quality", - "Estimated size:": "Estimated size:", - "Start downloading": "Start downloading", - "Cancel": "Cancel", - "Stream logging is disabled!": "Stream logging is disabled!", - "Enable it in settings for history to work properly.": "Enable it in settings for history to work properly.", - "History": "History", - "Create new playlist": "Create new playlist", - "TRACKS": "TRACKS", - "Sort by": "Sort by", - "Date Added": "Date Added", - "Name (A-Z)": "Name (A-Z)", - "Artist (A-Z)": "Artist (A-Z)", - "Album (A-Z)": "Album (A-Z)", - "Error loading lyrics or lyrics not found!": "Error loading lyrics or lyrics not found!", - "Create playlist": "Create playlist", - "Create": "Create", - "Add to playlist": "Add to playlist", - "Create new": "Create new", - "Remove": "Remove", - "Play next": "Play next", - "Add to queue": "Add to queue", - "Remove from library": "Remove from library", - "Remove from playlist": "Remove from playlist", - "Play track mix": "Play track mix", - "Go to": "Go to", - "Track Mix": "Track Mix", - "Duration": "Duration", - "Released": "Released", - "Disk": "Disk", - "albums": "albums", - "Play top": "Play top", + "Add to library": "Adaugă la librărie", + "Download": "Descărcați", + "fans": "fani", + "tracks": "piese", + "Quality": "Calitate", + "Estimated size:": "Dimensiune estimată:", + "Start downloading": "Începe descărcarea", + "Cancel": "Anulează", + "Stream logging is disabled!": "Stream logging-ul este dezactivat!", + "Enable it in settings for history to work properly.": "Activați-l în setări pentru ca istoricul să funcționeze corect.", + "History": "Istoric", + "Create new playlist": "Crează un nou playlist", + "TRACKS": "PIESE", + "Sort by": "Sortează după", + "Date Added": "Dată Adăugare", + "Name (A-Z)": "Nume (A-Z)", + "Artist (A-Z)": "Artiști (A-Z)", + "Album (A-Z)": "Albume (A-Z)", + "Error loading lyrics or lyrics not found!": "Eroare la încărcarea versurilor sau versurile nu au fost găsite!", + "Create playlist": "Crează un playlist", + "Create": "Creează", + "Add to playlist": "Adaugă la un playlist", + "Create new": "Crează nou", + "Remove": "Șterge", + "Play next": "Redă următorul", + "Add to queue": "Adaugă la coadă", + "Remove from library": "Șterge din librărie", + "Remove from playlist": "Șterge din playlist", + "Play track mix": "Redă mix-ul piesei", + "Go to": "Accesați", + "Track Mix": "Mix-ul Piesei", + "Duration": "Durată", + "Released": "Lansat", + "Disk": "Disc", + "albums": "albume", + "Play top": "Redă de la început", "Radio": "Radio", - "Show all albums": "Show all albums", - "Show all singles": "Show all singles", - "Show more": "Show more", - "Downloaded": "Downloaded", - "Queue": "Queue", + "Show all albums": "Afișează toate albumele", + "Show all singles": "Arată toate melodiile", + "Show more": "Arată mai multe", + "Downloaded": "Descărcate", + "Queue": "Coadă", "Total": "Total", "Stop": "Stop", - "Start": "Start", - "Show folder": "Show folder", - "Clear queue": "Clear queue", - "Playing from": "Playing from", - "Info": "Info", - "Lyrics": "Lyrics", - "Track number": "Track number", - "Disk number": "Disk number", + "Start": "Începe", + "Show folder": "Arată folder-ul", + "Clear queue": "Șterge coada", + "Playing from": "Redare din", + "Info": "Informații", + "Lyrics": "Versuri", + "Track number": "Numărul piesei", + "Disk number": "Numărul discului", "Explicit": "Explicit", - "Source": "Source", + "Source": "Sursă", "ID": "ID", - "Error logging in!": "Error logging in!", - "Please try again later, or try another account.": "Please try again later, or try another account.", - "Logout": "Logout", - "Login using browser": "Login using browser", - "Please login using your Deezer account:": "Please login using your Deezer account:", - "...or paste your ARL/Token below:": "...or paste your ARL/Token below:", + "Error logging in!": "Eroare la autentificare!", + "Please try again later, or try another account.": "Te rugăm să încerci din nou mai târziu, sau încearcă cu un alt cont.", + "Logout": "Deconectează-te", + "Login using browser": "Autentificare utilizând browserul", + "Please login using your Deezer account:": "Te rugăm să te conectezi utilizând contul tau Deezer:", + "...or paste your ARL/Token below:": "...sau lipiți ARL/Token-ul mai jos:", "ARL/Token": "ARL/Token", "Login": "Login", - "By using this program, you disagree with Deezer's ToS.": "By using this program, you disagree with Deezer's ToS.", - "Only in Electron version!": "Only in Electron version!", - "Search results for:": "Search results for:", - "Error loading data!": "Error loading data!", - "Try again later!": "Try again later!", - "Search": "Search", - "Streaming Quality": "Streaming Quality", - "Download Quality": "Download Quality", - "Downloads Directory": "Downloads Directory", - "Simultaneous downloads": "Simultaneous downloads", - "Always show download confirm dialog before downloading.": "Always show download confirm dialog before downloading.", - "Show download dialog": "Show download dialog", - "Create folders for artists": "Create folders for artists", - "Create folders for albums": "Create folders for albums", - "Download lyrics": "Download lyrics", - "Variables": "Variables", - "UI": "UI", - "Show autocomplete in search": "Show autocomplete in search", - "Integrations": "Integrations", - "This allows listening history, flow and recommendations to work properly.": "This allows listening history, flow and recommendations to work properly.", - "Log track listens to Deezer": "Log track listens to Deezer", - "Connect your LastFM account to allow scrobbling.": "Connect your LastFM account to allow scrobbling.", - "Login with LastFM": "Login with LastFM", - "Disconnect LastFM": "Disconnect LastFM", - "Requires restart to apply!": "Requires restart to apply!", - "Enable Discord Rich Presence, requires restart to toggle!": "Enable Discord Rich Presence, requires restart to toggle!", + "By using this program, you disagree with Deezer's ToS.": "Folosind acest program, nu sunteți de acord cu ToS-ul Deezer.", + "Only in Electron version!": "Doar în versiunea Electron!", + "Search results for:": "Rezultatele căutării pentru:", + "Error loading data!": "Eroare la încărcarea datelor!", + "Try again later!": "Încearcă din nou mai târziu!", + "Search": "Caută", + "Streaming Quality": "Calitatea streaming-ului", + "Download Quality": "Calitatea descărcărilor", + "Downloads Directory": "Descărcați in", + "Simultaneous downloads": "Descărcări simultane", + "Always show download confirm dialog before downloading.": "Arată întotdeauna confirmarea a descărcării înainte de descărcare.", + "Show download dialog": "Arată pagina de download", + "Create folders for artists": "Crează foldere pentru artiști", + "Create folders for albums": "Crează foldere pentru albume", + "Download lyrics": "Descărcați versurile .LRC", + "Variables": "Variabile", + "UI": "Interfață", + "Show autocomplete in search": "Afișează lista de autocompletare", + "Integrations": "Integrări", + "This allows listening history, flow and recommendations to work properly.": "Aceasta permite folosirea istoricului, Flow-ului și recomandările pentru a funcționa corect.", + "Log track listens to Deezer": "Înregistrează ascultările la Deezer", + "Connect your LastFM account to allow scrobbling.": "Conectați-vă contul LastFM pentru a permite scrobbling-ul.", + "Login with LastFM": "Conectează-te cu LastFM", + "Disconnect LastFM": "Deconectează LastFM", + "Requires restart to apply!": "Necesită repornirea pentru a aplica!", + "Enable Discord Rich Presence, requires restart to toggle!": "Activează Discord Rich Presence, necesită repornirea pentru a comuta!", "Discord Rich Presence": "Discord Rich Presence", - "Enable Discord join button for syncing tracks, requires restart to toggle!": "Enable Discord join button for syncing tracks, requires restart to toggle!", - "Discord Join Button": "Discord Join Button", - "Other": "Other", - "Minimize to tray": "Minimize to tray", - "Don't minimize to tray": "Don't minimize to tray", - "Close on exit": "Close on exit", - "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Enable Discord join button for syncing tracks, requires restart to toggle!": "Activează butonul de join la Discord pentru sincronizarea pieselor, necesită repornire în comutator!", + "Discord Join Button": "Butonul de join Discord", + "Other": "Altele", + "Minimize to tray": "Minimizează în bara de programe", + "Don't minimize to tray": "Nu minimiza în bara de programe", + "Close on exit": "Închide la ieșire", + "Settings saved!": "Setările au fost salvate!", + "Available only in Electron version!": "Disponibil doar în versiunea Electron!", + "Crossfade (ms)": "Crossfade (ms)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" } \ No newline at end of file diff --git a/app/client/src/locales/ru.json b/app/client/src/locales/ru.json index 5071360..3104233 100644 --- a/app/client/src/locales/ru.json +++ b/app/client/src/locales/ru.json @@ -1,112 +1,124 @@ { - "Home": "Home", - "Browse": "Browse", - "Library": "Library", - "Tracks": "Tracks", - "Playlists": "Playlists", - "Albums": "Albums", - "Artists": "Artists", - "More": "More", - "Settings": "Settings", - "Downloads": "Downloads", - "Search or paste Deezer URL. Use / to quickly focus.": "Search or paste Deezer URL. Use \"/\" to quickly focus.", - "Play": "Play", - "Add to library": "Add to library", - "Download": "Download", - "fans": "fans", - "tracks": "tracks", - "Quality": "Quality", - "Estimated size:": "Estimated size:", - "Start downloading": "Start downloading", - "Cancel": "Cancel", - "Stream logging is disabled!": "Stream logging is disabled!", - "Enable it in settings for history to work properly.": "Enable it in settings for history to work properly.", - "History": "History", - "Create new playlist": "Create new playlist", - "TRACKS": "TRACKS", - "Sort by": "Sort by", - "Date Added": "Date Added", - "Name (A-Z)": "Name (A-Z)", - "Artist (A-Z)": "Artist (A-Z)", - "Album (A-Z)": "Album (A-Z)", - "Error loading lyrics or lyrics not found!": "Error loading lyrics or lyrics not found!", - "Create playlist": "Create playlist", - "Create": "Create", - "Add to playlist": "Add to playlist", - "Create new": "Create new", - "Remove": "Remove", - "Play next": "Play next", - "Add to queue": "Add to queue", - "Remove from library": "Remove from library", - "Remove from playlist": "Remove from playlist", - "Play track mix": "Play track mix", - "Go to": "Go to", - "Track Mix": "Track Mix", - "Duration": "Duration", - "Released": "Released", - "Disk": "Disk", - "albums": "albums", - "Play top": "Play top", - "Radio": "Radio", - "Show all albums": "Show all albums", - "Show all singles": "Show all singles", - "Show more": "Show more", - "Downloaded": "Downloaded", - "Queue": "Queue", - "Total": "Total", - "Stop": "Stop", - "Start": "Start", - "Show folder": "Show folder", - "Clear queue": "Clear queue", - "Playing from": "Playing from", - "Info": "Info", - "Lyrics": "Lyrics", - "Track number": "Track number", - "Disk number": "Disk number", - "Explicit": "Explicit", - "Source": "Source", + "Home": "Главная", + "Browse": "Обзор", + "Library": "Избранное", + "Tracks": "Треки", + "Playlists": "Плейлисты", + "Albums": "Альбомы", + "Artists": "Артисты", + "More": "Ещё", + "Settings": "Настройки", + "Downloads": "Загрузки", + "Search or paste Deezer URL. Use / to quickly focus.": "Введите запрос или ссылку. \"/\" для быстрого поиска.", + "Play": "Воспроизвести", + "Add to library": "Добавить в Избранное", + "Download": "Скачать", + "fans": "поклонники", + "tracks": "треки", + "Quality": "Качество звука", + "Estimated size:": "Приблизительный размер:", + "Start downloading": "Начать загрузку", + "Cancel": "Отмена", + "Stream logging is disabled!": "Отправка статистики отключена!", + "Enable it in settings for history to work properly.": "Включите её в настройках для работы рекомендаций.", + "History": "История", + "Create new playlist": "Новый плейлист", + "TRACKS": "Треки", + "Sort by": "Сортировать по", + "Date Added": "Дата добавления", + "Name (A-Z)": "Название (А - Я)", + "Artist (A-Z)": "Исполнитель (А - Я)", + "Album (A-Z)": "Альбом (A - Я)", + "Error loading lyrics or lyrics not found!": "Ошибка получения текста!", + "Create playlist": "Создать плейлист", + "Create": "Создать", + "Add to playlist": "Добавить в плейлист", + "Create new": "Создать новый", + "Remove": "Удалить", + "Play next": "Играть следующим", + "Add to queue": "Добавить в очередь", + "Remove from library": "Удалить из Избранного", + "Remove from playlist": "Удалить из плейлиста", + "Play track mix": "Воспроизвести микс", + "Go to": "Перейти к", + "Track Mix": "Микс", + "Duration": "Продолжительность", + "Released": "Релиз", + "Disk": "Диск", + "albums": "альбомы", + "Play top": "Играть популярные", + "Radio": "Радио", + "Show all albums": "Показать все", + "Show all singles": "Показать все синглы", + "Show more": "Ещё", + "Downloaded": "Загрузки", + "Queue": "Очередь", + "Total": "Всего", + "Stop": "Остановить", + "Start": "Пуск", + "Show folder": "Открыть папку", + "Clear queue": "Очистить очередь", + "Playing from": "Сейчас играет", + "Info": "Инфо", + "Lyrics": "Текст песни", + "Track number": "Дорожка", + "Disk number": "Номер диска", + "Explicit": "18+", + "Source": "Источник", "ID": "ID", - "Error logging in!": "Error logging in!", - "Please try again later, or try another account.": "Please try again later, or try another account.", - "Logout": "Logout", - "Login using browser": "Login using browser", - "Please login using your Deezer account:": "Please login using your Deezer account:", - "...or paste your ARL/Token below:": "...or paste your ARL/Token below:", - "ARL/Token": "ARL/Token", - "Login": "Login", - "By using this program, you disagree with Deezer's ToS.": "By using this program, you disagree with Deezer's ToS.", - "Only in Electron version!": "Only in Electron version!", - "Search results for:": "Search results for:", - "Error loading data!": "Error loading data!", - "Try again later!": "Try again later!", - "Search": "Search", - "Streaming Quality": "Streaming Quality", - "Download Quality": "Download Quality", - "Downloads Directory": "Downloads Directory", - "Simultaneous downloads": "Simultaneous downloads", - "Always show download confirm dialog before downloading.": "Always show download confirm dialog before downloading.", - "Show download dialog": "Show download dialog", - "Create folders for artists": "Create folders for artists", - "Create folders for albums": "Create folders for albums", - "Download lyrics": "Download lyrics", - "Variables": "Variables", - "UI": "UI", - "Show autocomplete in search": "Show autocomplete in search", - "Integrations": "Integrations", - "This allows listening history, flow and recommendations to work properly.": "This allows listening history, flow and recommendations to work properly.", - "Log track listens to Deezer": "Log track listens to Deezer", - "Connect your LastFM account to allow scrobbling.": "Connect your LastFM account to allow scrobbling.", - "Login with LastFM": "Login with LastFM", - "Disconnect LastFM": "Disconnect LastFM", - "Requires restart to apply!": "Requires restart to apply!", - "Enable Discord Rich Presence, requires restart to toggle!": "Enable Discord Rich Presence, requires restart to toggle!", + "Error logging in!": "Ошибка авторизации!", + "Please try again later, or try another account.": "Пожалуйста, повторите попытку позже или попробуйте другой аккаунт.", + "Logout": "Выход", + "Login using browser": "Войти через браузер", + "Please login using your Deezer account:": "Войдите, используя свой аккаунт Deezer:", + "...or paste your ARL/Token below:": "...или вставьте ваш токен (ARL) ниже:", + "ARL/Token": "Токен (ARL) ", + "Login": "Вход", + "By using this program, you disagree with Deezer's ToS.": "Используя эту программу, вы не соглашаетесь с правилами использования Deezer.", + "Only in Electron version!": "Только в версии Electron!", + "Search results for:": "Результаты поиска для:", + "Error loading data!": "Ошибка при загрузке данных!", + "Try again later!": "Повторите попытку позже!", + "Search": "Поиск", + "Streaming Quality": "Качество при воспроизведении", + "Download Quality": "Качество при загрузке", + "Downloads Directory": "Папка загрузок", + "Simultaneous downloads": "Количество одновременных загрузок", + "Always show download confirm dialog before downloading.": "Подтверждать загрузки.", + "Show download dialog": "Подтверждение", + "Create folders for artists": "Создавать папки для исполнителей", + "Create folders for albums": "Создавать папки для альбомов", + "Download lyrics": "Скачивать тексты", + "Variables": "Переменные", + "UI": "Интерфейс", + "Show autocomplete in search": "Подсказки при поиске", + "Integrations": "Интеграции", + "This allows listening history, flow and recommendations to work properly.": "Для правильной работы Flow, рекомендаций и истории.", + "Log track listens to Deezer": "Отправлять статистику", + "Connect your LastFM account to allow scrobbling.": "Подключите ваш аккаунт LastFM, чтобы разрешить скробблинг.", + "Login with LastFM": "Авторизоваться через LastFM", + "Disconnect LastFM": "Отключить LastFM", + "Requires restart to apply!": "Требуется перезапуск приложения!", + "Enable Discord Rich Presence, requires restart to toggle!": "Включить Discord Rich Presence, требуется перезапуск!", "Discord Rich Presence": "Discord Rich Presence", - "Enable Discord join button for syncing tracks, requires restart to toggle!": "Enable Discord join button for syncing tracks, requires restart to toggle!", - "Discord Join Button": "Discord Join Button", - "Other": "Other", - "Minimize to tray": "Minimize to tray", - "Don't minimize to tray": "Don't minimize to tray", - "Close on exit": "Close on exit", - "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Enable Discord join button for syncing tracks, requires restart to toggle!": "Включить кнопку вступления Discord для синхронизации треков, требуется перезапуск!", + "Discord Join Button": "Кнопка \"Вступить\" в Discord", + "Other": "Другое", + "Minimize to tray": "Сворачивать в трей", + "Don't minimize to tray": "Не сворачивать в трей", + "Close on exit": "Закрывать при выходе", + "Settings saved!": "Настройки сохранены!", + "Available only in Electron version!": "Доступно только в версии на Electron!", + "Crossfade (ms)": "Кроссфейд (мс)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" } \ No newline at end of file diff --git a/app/client/src/locales/tr.json b/app/client/src/locales/tr.json index 5071360..6de61f3 100644 --- a/app/client/src/locales/tr.json +++ b/app/client/src/locales/tr.json @@ -1,112 +1,124 @@ { - "Home": "Home", - "Browse": "Browse", - "Library": "Library", - "Tracks": "Tracks", - "Playlists": "Playlists", - "Albums": "Albums", - "Artists": "Artists", - "More": "More", - "Settings": "Settings", - "Downloads": "Downloads", - "Search or paste Deezer URL. Use / to quickly focus.": "Search or paste Deezer URL. Use \"/\" to quickly focus.", - "Play": "Play", - "Add to library": "Add to library", - "Download": "Download", - "fans": "fans", - "tracks": "tracks", - "Quality": "Quality", - "Estimated size:": "Estimated size:", - "Start downloading": "Start downloading", - "Cancel": "Cancel", - "Stream logging is disabled!": "Stream logging is disabled!", - "Enable it in settings for history to work properly.": "Enable it in settings for history to work properly.", - "History": "History", - "Create new playlist": "Create new playlist", - "TRACKS": "TRACKS", - "Sort by": "Sort by", - "Date Added": "Date Added", - "Name (A-Z)": "Name (A-Z)", - "Artist (A-Z)": "Artist (A-Z)", - "Album (A-Z)": "Album (A-Z)", - "Error loading lyrics or lyrics not found!": "Error loading lyrics or lyrics not found!", - "Create playlist": "Create playlist", - "Create": "Create", - "Add to playlist": "Add to playlist", - "Create new": "Create new", - "Remove": "Remove", - "Play next": "Play next", - "Add to queue": "Add to queue", - "Remove from library": "Remove from library", - "Remove from playlist": "Remove from playlist", + "Home": "Ana Sayfa", + "Browse": "Gözat", + "Library": "Kütüphane", + "Tracks": "Parçalar", + "Playlists": "Oynatma listeleri", + "Albums": "Albümler", + "Artists": "Sanatçılar", + "More": "Daha Fazla", + "Settings": "Ayarlar", + "Downloads": "İndirilenler", + "Search or paste Deezer URL. Use / to quickly focus.": "Arama yapın veya Deezer URL'sini yapıştırın. Hızlı odaklanmak için \"/\" kullanın.", + "Play": "Oynat", + "Add to library": "Kütüphaneye ekle", + "Download": "İndir", + "fans": "hayranlar", + "tracks": "parçalar", + "Quality": "Kalite", + "Estimated size:": "Tahmini Süre:", + "Start downloading": "İndirmeyi başlat", + "Cancel": "İptal Et", + "Stream logging is disabled!": "Akış günlüğü devre dışı bırakıldı!", + "Enable it in settings for history to work properly.": "Geçmişin düzgün çalışması için ayarlarda etkinleştirin.", + "History": "Geçmiş", + "Create new playlist": "Yeni oynatma listesi oluştur", + "TRACKS": "PARÇALAR", + "Sort by": "Sırala", + "Date Added": "Eklenme Tarihi", + "Name (A-Z)": "Ad (A-Z)", + "Artist (A-Z)": "Sanatçı (A-Z)", + "Album (A-Z)": "Albüm (A-Z)", + "Error loading lyrics or lyrics not found!": "Şarkı sözleri bulunamadı veya yüklenirken hata oluştu!", + "Create playlist": "Oynatma listesi oluştur", + "Create": "Oluştur", + "Add to playlist": "Oynatma listesine ekle", + "Create new": "Yeni oluştur", + "Remove": "Kaldır", + "Play next": "Sonrakini çal", + "Add to queue": "Sıraya ekle", + "Remove from library": "Kütüphaneden kaldır", + "Remove from playlist": "Oynatma listesinden kaldır", "Play track mix": "Play track mix", - "Go to": "Go to", + "Go to": "Git", "Track Mix": "Track Mix", - "Duration": "Duration", - "Released": "Released", + "Duration": "Süre", + "Released": "Yayınlandı", "Disk": "Disk", - "albums": "albums", + "albums": "albümler", "Play top": "Play top", - "Radio": "Radio", - "Show all albums": "Show all albums", - "Show all singles": "Show all singles", - "Show more": "Show more", - "Downloaded": "Downloaded", - "Queue": "Queue", - "Total": "Total", - "Stop": "Stop", - "Start": "Start", - "Show folder": "Show folder", - "Clear queue": "Clear queue", - "Playing from": "Playing from", - "Info": "Info", - "Lyrics": "Lyrics", - "Track number": "Track number", - "Disk number": "Disk number", - "Explicit": "Explicit", - "Source": "Source", + "Radio": "Radyo", + "Show all albums": "Tüm albümleri göster", + "Show all singles": "Tüm şarkıları göster", + "Show more": "Daha fazla göster", + "Downloaded": "İndirildi", + "Queue": "Sıra", + "Total": "Toplam", + "Stop": "Durdur", + "Start": "Başlat", + "Show folder": "Klasörü göster", + "Clear queue": "Sırayı temizle", + "Playing from": "Şuradan oynatılıyor:", + "Info": "Bilgi", + "Lyrics": "Şarkı sözleri", + "Track number": "Parça Numarası", + "Disk number": "Disk numarası", + "Explicit": "Sakıncalı", + "Source": "Kaynak", "ID": "ID", - "Error logging in!": "Error logging in!", - "Please try again later, or try another account.": "Please try again later, or try another account.", - "Logout": "Logout", - "Login using browser": "Login using browser", - "Please login using your Deezer account:": "Please login using your Deezer account:", - "...or paste your ARL/Token below:": "...or paste your ARL/Token below:", + "Error logging in!": "Oturum açma hatası!", + "Please try again later, or try another account.": "Lütfen daha sonra tekrar deneyin veya başka bir hesap deneyin.", + "Logout": "Çıkış", + "Login using browser": "Tarayıcı kullanarak giriş yapın", + "Please login using your Deezer account:": "Lütfen Deezer hesabınızı kullanarak giriş yapın.", + "...or paste your ARL/Token below:": "yada ARL/Token aşağıya yapıştırın:", "ARL/Token": "ARL/Token", - "Login": "Login", - "By using this program, you disagree with Deezer's ToS.": "By using this program, you disagree with Deezer's ToS.", - "Only in Electron version!": "Only in Electron version!", - "Search results for:": "Search results for:", - "Error loading data!": "Error loading data!", - "Try again later!": "Try again later!", - "Search": "Search", - "Streaming Quality": "Streaming Quality", - "Download Quality": "Download Quality", - "Downloads Directory": "Downloads Directory", - "Simultaneous downloads": "Simultaneous downloads", - "Always show download confirm dialog before downloading.": "Always show download confirm dialog before downloading.", - "Show download dialog": "Show download dialog", - "Create folders for artists": "Create folders for artists", - "Create folders for albums": "Create folders for albums", - "Download lyrics": "Download lyrics", - "Variables": "Variables", - "UI": "UI", - "Show autocomplete in search": "Show autocomplete in search", - "Integrations": "Integrations", - "This allows listening history, flow and recommendations to work properly.": "This allows listening history, flow and recommendations to work properly.", + "Login": "Giriş", + "By using this program, you disagree with Deezer's ToS.": "Bu programı kullanarak Deezer'in Hizmet Şartları'na katılmıyorsunuz.", + "Only in Electron version!": "Sadece Electron versiyonunda!", + "Search results for:": "Arama sonuçları:", + "Error loading data!": "Veri yükleme hatası!", + "Try again later!": "Daha sonra yeniden deneyin!", + "Search": "Ara", + "Streaming Quality": "Yayın Kalitesi", + "Download Quality": "İndirme kalitesi", + "Downloads Directory": "İndirme Dizini", + "Simultaneous downloads": "Eşzamanlı indirmeler", + "Always show download confirm dialog before downloading.": "İndirmeden önce her zaman indirme onayı iletişim kutusunu göster.", + "Show download dialog": "İndirme iletişim kutusunu göster", + "Create folders for artists": "Sanatçılar için klasörler oluşturun", + "Create folders for albums": "Albümler için klasörler oluşturun", + "Download lyrics": ". Lrc şarkı sözlerini indir", + "Variables": "Değişkenler", + "UI": "Arayüz", + "Show autocomplete in search": "Otomatik tamamlama listesini göster", + "Integrations": "Entegrasyonlar", + "This allows listening history, flow and recommendations to work properly.": "Bu dinleme geçmişinin, akışının ve önerilerin düzgün çalışmasını sağlar.", "Log track listens to Deezer": "Log track listens to Deezer", - "Connect your LastFM account to allow scrobbling.": "Connect your LastFM account to allow scrobbling.", - "Login with LastFM": "Login with LastFM", - "Disconnect LastFM": "Disconnect LastFM", - "Requires restart to apply!": "Requires restart to apply!", - "Enable Discord Rich Presence, requires restart to toggle!": "Enable Discord Rich Presence, requires restart to toggle!", - "Discord Rich Presence": "Discord Rich Presence", - "Enable Discord join button for syncing tracks, requires restart to toggle!": "Enable Discord join button for syncing tracks, requires restart to toggle!", - "Discord Join Button": "Discord Join Button", - "Other": "Other", - "Minimize to tray": "Minimize to tray", - "Don't minimize to tray": "Don't minimize to tray", - "Close on exit": "Close on exit", - "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Connect your LastFM account to allow scrobbling.": "Scrobbling'e izin vermek için LastFM hesabınızı bağlayın.", + "Login with LastFM": "LastFM ile giriş yapın", + "Disconnect LastFM": "LastFM bağlantısını kes", + "Requires restart to apply!": "Yeniden başlatma gerekli!", + "Enable Discord Rich Presence, requires restart to toggle!": "Discord zengin içeriği etkinleştirin, geçiş yapmak için yeniden başlatma gerekir!", + "Discord Rich Presence": "Discord zengin içerik", + "Enable Discord join button for syncing tracks, requires restart to toggle!": "Şarkıları senkronize etmek için Discord katılma düğmesini etkinleştirin, geçiş yapmak için yeniden başlatma gerektirir!", + "Discord Join Button": "Discord Katılma Düğmesi", + "Other": "Diğer", + "Minimize to tray": "Simge durumuna küçülsün", + "Don't minimize to tray": "Simge durumuna küçülmesin tamamen kapansın", + "Close on exit": "Programı kapattığınızda", + "Settings saved!": "Ayarlar kaydedildi!", + "Available only in Electron version!": "Sadece Electron versiyonunda mevcuttur!", + "Crossfade (ms)": "Crossfade (ms)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" } \ No newline at end of file diff --git a/app/client/src/locales/uk.json b/app/client/src/locales/uk.json index 5071360..0fd97cc 100644 --- a/app/client/src/locales/uk.json +++ b/app/client/src/locales/uk.json @@ -1,112 +1,124 @@ { - "Home": "Home", - "Browse": "Browse", - "Library": "Library", - "Tracks": "Tracks", - "Playlists": "Playlists", - "Albums": "Albums", - "Artists": "Artists", - "More": "More", - "Settings": "Settings", - "Downloads": "Downloads", - "Search or paste Deezer URL. Use / to quickly focus.": "Search or paste Deezer URL. Use \"/\" to quickly focus.", - "Play": "Play", - "Add to library": "Add to library", - "Download": "Download", - "fans": "fans", - "tracks": "tracks", - "Quality": "Quality", - "Estimated size:": "Estimated size:", - "Start downloading": "Start downloading", - "Cancel": "Cancel", - "Stream logging is disabled!": "Stream logging is disabled!", - "Enable it in settings for history to work properly.": "Enable it in settings for history to work properly.", - "History": "History", - "Create new playlist": "Create new playlist", - "TRACKS": "TRACKS", - "Sort by": "Sort by", - "Date Added": "Date Added", - "Name (A-Z)": "Name (A-Z)", - "Artist (A-Z)": "Artist (A-Z)", - "Album (A-Z)": "Album (A-Z)", - "Error loading lyrics or lyrics not found!": "Error loading lyrics or lyrics not found!", - "Create playlist": "Create playlist", - "Create": "Create", - "Add to playlist": "Add to playlist", - "Create new": "Create new", - "Remove": "Remove", - "Play next": "Play next", - "Add to queue": "Add to queue", - "Remove from library": "Remove from library", - "Remove from playlist": "Remove from playlist", - "Play track mix": "Play track mix", - "Go to": "Go to", - "Track Mix": "Track Mix", - "Duration": "Duration", - "Released": "Released", - "Disk": "Disk", - "albums": "albums", - "Play top": "Play top", - "Radio": "Radio", - "Show all albums": "Show all albums", - "Show all singles": "Show all singles", - "Show more": "Show more", - "Downloaded": "Downloaded", - "Queue": "Queue", - "Total": "Total", - "Stop": "Stop", - "Start": "Start", - "Show folder": "Show folder", - "Clear queue": "Clear queue", - "Playing from": "Playing from", - "Info": "Info", - "Lyrics": "Lyrics", - "Track number": "Track number", - "Disk number": "Disk number", - "Explicit": "Explicit", - "Source": "Source", + "Home": "Головна", + "Browse": "Перегляд", + "Library": "Бібліотека", + "Tracks": "Треки", + "Playlists": "Плейлисти", + "Albums": "Альбоми", + "Artists": "Виконавці", + "More": "Більше", + "Settings": "Налаштування", + "Downloads": "Завантаження", + "Search or paste Deezer URL. Use / to quickly focus.": "Знайдіть або вставте URL Deezer. Використовуйте \"/\" для швидкого фокусування.", + "Play": "Відтворити", + "Add to library": "Додати до бібліотеки", + "Download": "Завантажити", + "fans": "фани", + "tracks": "треки", + "Quality": "Якість", + "Estimated size:": "Приблизний розмір:", + "Start downloading": "Почати завантаження", + "Cancel": "Скасувати", + "Stream logging is disabled!": "Журнал трансляції відключений!", + "Enable it in settings for history to work properly.": "Увімкніть це в налаштуваннях, щоб історія працювала належним чином.", + "History": "Історія", + "Create new playlist": "Створити новий плейлист", + "TRACKS": "ТРЕКИ", + "Sort by": "Сортувати за", + "Date Added": "Дата додавання", + "Name (A-Z)": "Назва (А-Я)", + "Artist (A-Z)": "Виконавець (А-Я)", + "Album (A-Z)": "Альбом (А-Я)", + "Error loading lyrics or lyrics not found!": "Помилка при завантаженні текстів або тексту не знайдено!", + "Create playlist": "Створити плейлист", + "Create": "Створити", + "Add to playlist": "Додати до плейлиста", + "Create new": "Створити новий", + "Remove": "Видалити", + "Play next": "Відтворити наступний", + "Add to queue": "Додати до черги", + "Remove from library": "Видалити з бібліотеки", + "Remove from playlist": "Видалити з плейлиста", + "Play track mix": "Відтворити трек мікс", + "Go to": "Перейти до", + "Track Mix": "Трек Мікс", + "Duration": "Тривалість", + "Released": "Реліз", + "Disk": "Диск", + "albums": "альбоми", + "Play top": "Грати зверху", + "Radio": "Радіо", + "Show all albums": "Показати всі альбоми", + "Show all singles": "Показати всі композиції", + "Show more": "Показати більше", + "Downloaded": "Завантажено", + "Queue": "Черга", + "Total": "Всього", + "Stop": "Зупинити", + "Start": "Почати", + "Show folder": "Показати теку", + "Clear queue": "Очистити чергу", + "Playing from": "Відтворення з", + "Info": "Інфо", + "Lyrics": "Текст", + "Track number": "Номер треку", + "Disk number": "Номер диску", + "Explicit": "Явний", + "Source": "Джерело", "ID": "ID", - "Error logging in!": "Error logging in!", - "Please try again later, or try another account.": "Please try again later, or try another account.", - "Logout": "Logout", - "Login using browser": "Login using browser", - "Please login using your Deezer account:": "Please login using your Deezer account:", - "...or paste your ARL/Token below:": "...or paste your ARL/Token below:", - "ARL/Token": "ARL/Token", - "Login": "Login", - "By using this program, you disagree with Deezer's ToS.": "By using this program, you disagree with Deezer's ToS.", - "Only in Electron version!": "Only in Electron version!", - "Search results for:": "Search results for:", - "Error loading data!": "Error loading data!", - "Try again later!": "Try again later!", - "Search": "Search", - "Streaming Quality": "Streaming Quality", - "Download Quality": "Download Quality", - "Downloads Directory": "Downloads Directory", - "Simultaneous downloads": "Simultaneous downloads", - "Always show download confirm dialog before downloading.": "Always show download confirm dialog before downloading.", - "Show download dialog": "Show download dialog", - "Create folders for artists": "Create folders for artists", - "Create folders for albums": "Create folders for albums", - "Download lyrics": "Download lyrics", - "Variables": "Variables", + "Error logging in!": "Помилка входу!", + "Please try again later, or try another account.": "Будь ласка, повторіть спробу пізніше, або спробуйте інший обліковий запис.", + "Logout": "Вийти", + "Login using browser": "Вхід через браузер", + "Please login using your Deezer account:": "Будь ласка, увійдіть, використовуючи свій обліковий запис Deezer:", + "...or paste your ARL/Token below:": "...або вставте свій ARL/Token нижче:", + "ARL/Token": "ARL/токен", + "Login": "Увійти", + "By using this program, you disagree with Deezer's ToS.": "Використовуючи цю програму, ви не погоджуєтесь із умовами використання Deezer.", + "Only in Electron version!": "Тільки в Electron версії!", + "Search results for:": "Результати пошуку для:", + "Error loading data!": "Помилка завантаження даних!", + "Try again later!": "Повторіть спробу пізніше!", + "Search": "Пошук", + "Streaming Quality": "Якість потоку", + "Download Quality": "Якість завантаження", + "Downloads Directory": "Тека для завантажень", + "Simultaneous downloads": "Одночасних завантажень", + "Always show download confirm dialog before downloading.": "Завжди показувати вікно підтвердження перед завантаженням.", + "Show download dialog": "Показувати діалогове вікно звантаження", + "Create folders for artists": "Створити теки для виконавців", + "Create folders for albums": "Створити теки для альбомів", + "Download lyrics": "Завантажити тексти пісень", + "Variables": "Змінні", "UI": "UI", - "Show autocomplete in search": "Show autocomplete in search", - "Integrations": "Integrations", - "This allows listening history, flow and recommendations to work properly.": "This allows listening history, flow and recommendations to work properly.", - "Log track listens to Deezer": "Log track listens to Deezer", - "Connect your LastFM account to allow scrobbling.": "Connect your LastFM account to allow scrobbling.", - "Login with LastFM": "Login with LastFM", - "Disconnect LastFM": "Disconnect LastFM", - "Requires restart to apply!": "Requires restart to apply!", - "Enable Discord Rich Presence, requires restart to toggle!": "Enable Discord Rich Presence, requires restart to toggle!", + "Show autocomplete in search": "Показувати автозаповнення при пошуку", + "Integrations": "Інтеграція", + "This allows listening history, flow and recommendations to work properly.": "Це дозволяє слухати історію, потік та рекомендації для правильної роботи.", + "Log track listens to Deezer": "Реєстр треків Deezer", + "Connect your LastFM account to allow scrobbling.": "Підключіть обліковий запис LastFM, щоб дозволити скроблінг.", + "Login with LastFM": "Увійти через LastFM", + "Disconnect LastFM": "Від'єднати LastFM", + "Requires restart to apply!": "Необхідно перезапустити для застосування!", + "Enable Discord Rich Presence, requires restart to toggle!": "Увімкнути Discord Rich Presence, для використання необхідний перезапуск!", "Discord Rich Presence": "Discord Rich Presence", - "Enable Discord join button for syncing tracks, requires restart to toggle!": "Enable Discord join button for syncing tracks, requires restart to toggle!", - "Discord Join Button": "Discord Join Button", - "Other": "Other", - "Minimize to tray": "Minimize to tray", - "Don't minimize to tray": "Don't minimize to tray", - "Close on exit": "Close on exit", - "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Enable Discord join button for syncing tracks, requires restart to toggle!": "Увімкніть кнопку приєднання Discord для синхронізації треків, для застосування потрібен перезапуск!", + "Discord Join Button": "Кнопка приєднання до Discord", + "Other": "Інше", + "Minimize to tray": "Згорнути в трей", + "Don't minimize to tray": "Не згортати в трей", + "Close on exit": "Закрити при виході", + "Settings saved!": "Налаштування збережено!", + "Available only in Electron version!": "Доступно лише в Electron версії!", + "Crossfade (ms)": "Перехресне затухання (мс)", + "Select primary color": "Виберіть основний колір", + "Light theme": "Світла тема", + "Create folders for playlists": "Створити теки для плейлистів", + "About": "Про додаток", + "Links:": "Посилання:", + "Telegram Releases": "Telegram релізи", + "Telegram Group": "Група в Telegram", + "Discord": "Discord", + "Telegram Android Group": "Група Андроїд Telegram", + "Credits:": "Автори:", + "Agree": "Погоджуюсь" } \ No newline at end of file diff --git a/app/client/src/locales/ur.json b/app/client/src/locales/ur.json index 5071360..afc8482 100644 --- a/app/client/src/locales/ur.json +++ b/app/client/src/locales/ur.json @@ -108,5 +108,17 @@ "Don't minimize to tray": "Don't minimize to tray", "Close on exit": "Close on exit", "Settings saved!": "Settings saved!", - "Available only in Electron version!": "Available only in Electron version!" + "Available only in Electron version!": "Available only in Electron version!", + "Crossfade (ms)": "Crossfade (ms)", + "Select primary color": "Select primary color", + "Light theme": "Light theme", + "Create folders for playlists": "Create folders for playlists", + "About": "About", + "Links:": "Links:", + "Telegram Releases": "Telegram Releases", + "Telegram Group": "Telegram Group", + "Discord": "Discord", + "Telegram Android Group": "Telegram Android Group", + "Credits:": "Credits:", + "Agree": "Agree" } \ No newline at end of file diff --git a/app/client/src/main.js b/app/client/src/main.js index 16210bc..ba5a1e7 100644 --- a/app/client/src/main.js +++ b/app/client/src/main.js @@ -228,15 +228,41 @@ new Vue({ //Configure html audio element configureAudio() { //Listen position updates - this.audio.addEventListener('timeupdate', () => { + this.audio.addEventListener('timeupdate', async () => { this.position = this.audio.currentTime * 1000; //Gapless playback - if (this.position >= (this.duration() - 7000) && this.state == 2) { - if (!this.shuffle && this.repeat != 2) + if (this.position >= (this.duration() - (this.settings.crossfadeDuration + 7500)) && this.state == 2) { + if (this.repeat != 2) this.loadGapless(); } + //Crossfade + if (this.settings.crossfadeDuration > 0 && this.position >= (this.duration() - this.settings.crossfadeDuration) && this.state == 2 && this.gapless.audio && !this.gapless.crossfade) { + this.gapless.crossfade = true; + let currentVolume = this.audio.volume; + this.gapless.audio.play(); + + let volumeStep = currentVolume / (this.settings.crossfadeDuration / 50); + for (let i=0; i<(this.settings.crossfadeDuration / 50); i++) { + if ((this.audio.volume - volumeStep) > 0) + this.audio.volume -= volumeStep; + this.gapless.audio.volume += volumeStep; + await new Promise((res) => setTimeout(() => res(), 50)); + } + this.audio.pause(); + + //Update audio + this.audio = this.gapless.audio; + this.playbackInfo = this.gapless.info; + this.track = this.gapless.track; + this.queue.index = this.gapless.index; + this.resetGapless(); + this.configureAudio(); + this.updateMediaSession(); + await this.savePlaybackInfo(); + } + //Scrobble/LogListen if (this.position >= this.duration() * 0.75) { this.logListen(); @@ -246,6 +272,7 @@ new Vue({ this.audio.volume = this.volume; this.audio.addEventListener('ended', async () => { + if (this.gapless.crossfade) return; //Repeat track if (this.repeat == 2) { @@ -346,20 +373,36 @@ new Vue({ //Reset gapless playback meta resetGapless() { - this.gapless = {promise: null,audio: null,info: null,track: null}; + this.gapless = {promise: null,audio: null,info: null,track: null,index:null}; }, //Load next track for gapless async loadGapless() { if (this.loaders != 0 || this.gapless.promise || this.gapless.audio) return; - //Last song - if (this.queue.index+1 >= this.queue.data.length) return; + + //Shuffle + if (this.shuffle) { + let index = Math.round(Math.random()*this.queue.data.length) - this.queue.index; + this.gapless.track = this.queue.data[index]; + this.gapless.index = index; + } else { + //Repeat list + if (this.repeat == 1 && this.queue.index == this.queue.data.length - 1) { + this.gapless.track = this.queue.data[0]; + this.gapless.index = 0; + } else { + //Last song + if (this.queue.index+1 >= this.queue.data.length) return; + //Next song + this.gapless.track = this.queue.data[this.queue.index + 1]; + this.gapless.index = this.queue.index + 1; + } + } //Save promise let resolve; this.gapless.promise = new Promise((res) => {resolve = res}); //Load meta - this.gapless.track = this.queue.data[this.queue.index + 1]; let info = await this.loadPlaybackInfo(this.gapless.track.streamUrl, this.gapless.track.duration); if (!info) { this.resetGapless(); @@ -367,6 +410,9 @@ new Vue({ } this.gapless.info = info this.gapless.audio = new Audio(`${window.location.origin}${info.url}`); + this.gapless.audio.volume = 0; + this.gapless.audio.preload = 'auto'; + this.gapless.crossfade = false; //Might get canceled if (this.gapless.promise) resolve(); @@ -465,6 +511,11 @@ new Vue({ let res = await this.$axios.get('/settings'); this.settings = res.data; this.$vuetify.theme.themes.dark.primary = this.settings.primaryColor; + this.$vuetify.theme.themes.light.primary = this.settings.primaryColor; + if (this.settings.lightTheme) { + this.$vuetify.theme.dark = false; + this.$vuetify.theme.light = true; + } i18n.locale = this.settings.language; this.volume = this.settings.volume; diff --git a/app/client/src/views/About.vue b/app/client/src/views/About.vue new file mode 100644 index 0000000..8e3d4cf --- /dev/null +++ b/app/client/src/views/About.vue @@ -0,0 +1,151 @@ + + + \ No newline at end of file diff --git a/app/client/src/views/AlbumPage.vue b/app/client/src/views/AlbumPage.vue index 6c32b5b..03bb0a1 100644 --- a/app/client/src/views/AlbumPage.vue +++ b/app/client/src/views/AlbumPage.vue @@ -14,7 +14,11 @@

{{album.title}}

-

{{album.artistString}}

+

+ + {{artist.name}}, + +

{{album.tracks.length}} {{$t("tracks")}}
{{$t("Duration")}}: {{duration}}
@@ -104,6 +108,12 @@ export default { }, async download() { this.downloadDialog = true; + }, + goArtist(artist) { + this.$router.push({ + path: '/artist', + query: {artist: JSON.stringify(artist)} + }); } }, async mounted() { diff --git a/app/client/src/views/PlaylistPage.vue b/app/client/src/views/PlaylistPage.vue index 3d6bd3e..162565c 100644 --- a/app/client/src/views/PlaylistPage.vue +++ b/app/client/src/views/PlaylistPage.vue @@ -55,7 +55,7 @@
- + diff --git a/app/client/src/views/Settings.vue b/app/client/src/views/Settings.vue index 018b9e2..ea8fa05 100644 --- a/app/client/src/views/Settings.vue +++ b/app/client/src/views/Settings.vue @@ -3,7 +3,7 @@

{{$t('Settings')}}

- + {{$t("Show download dialog")}} {{$t("Always show download confirm dialog before downloading.")}} - + + + + + + + {{$t("Create folders for playlists")}} + + - + {{$t("Create folders for artists")}} @@ -64,7 +73,7 @@ - + {{$t("Create folders for albums")}} @@ -73,7 +82,7 @@ - + {{$t("Download lyrics")}} @@ -83,35 +92,67 @@ + + + {{$t("UI")}} + + + + mdi-palette + + + {{$t("Select primary color")}} + + - + {{$t("Show autocomplete in search")}} + + + + + + + + {{$t("Light theme")}} + + + {{$t("Integrations")}} @@ -120,7 +161,7 @@ - + {{$t("Log track listens to Deezer")}} @@ -133,8 +174,8 @@ - {{$t("Login with LastFM")}} - {{$t("Connect your LastFM account to allow scrobbling.")}} + {{$t("Login with LastFM")}} + {{$t("Connect your LastFM account to allow scrobbling.")}} @@ -148,7 +189,7 @@ - + {{$t("Discord Rich Presence")}} @@ -158,7 +199,7 @@ - + {{$t("Discord Join Button")}} @@ -173,7 +214,7 @@ - + {{$t("Minimize to tray")}} @@ -182,7 +223,7 @@ - + {{$t("Close on exit")}} @@ -218,6 +259,16 @@ + + + + + + Save + + + + @@ -242,11 +293,20 @@ export default { {code: 'en', name: 'English'}, {code: 'ar', name: 'Arabic'}, {code: 'de', name: 'German'}, + {code: 'el', name: 'Greek'}, + {code: 'id', name: 'Indonesian'}, + {code: 'it', name: 'Italian'}, + {code: 'pl', name: 'Polish'}, + {code: 'ro', name: 'Romanian'}, + {code: 'ru', name: 'Russian'}, + {code: 'tr', name: 'Turkish'}, + {code: 'uk', name: 'Ukrainian'} ], + colorPicker: false, primaryColorIndex: 0, primaries: ['#F44336', '#E91E63', '#9C27B0', '#673AB7', '#3F51B5', '#2196F3', '#03A9F4', '#00BCD4', '#009688', '#4CAF50', '#8BC34A', '#CDDC39', '#FFEB3B', '#FFC107', '#FF9800', '#FF5722', - '#795548', '#607D8B', '#9E9E9E', '#333333', '#000000'] + '#795548', '#607D8B', '#9E9E9E'] } }, methods: { @@ -309,18 +369,28 @@ export default { await this.$root.saveSettings(); window.location.reload(); }, - changeColor() { - this.$vuetify.theme.themes.dark.primary = this.primaries[this.primaryColorIndex]; - this.$root.settings.primaryColor = this.primaries[this.primaryColorIndex]; - this.primaryColorIndex++; - if (this.primaryColorIndex == this.primaries.length) - this.primaryColorIndex = 0; + saveColor() { + this.colorPicker = false; + this.$vuetify.theme.themes.dark.primary = this.$root.settings.primaryColor; + this.$vuetify.theme.themes.light.primary = this.$root.settings.primaryColor; + this.$root.saveSettings(); }, updateLanguage(l) { let code = this.languages.filter(lang => lang.name == l)[0].code; this.language = code; this.$root.updateLanguage(code); this.$root.settings.language = code; + }, + //Update light theme + changeLightTheme(v) { + this.$root.settings.lightTheme = v; + if (v) { + this.$vuetify.theme.dark = false; + this.$vuetify.theme.light = true; + } else { + this.$vuetify.theme.dark = true; + this.$vuetify.theme.light = false; + } } }, computed: { @@ -347,16 +417,15 @@ export default { } } - //Shhhhhh - if (event.code == 'KeyC' && event.shiftKey) { - this.changeColor(); - } - - //SSHHSHSHHSH - console.log(event); + //RGB if (event.code == 'KeyG' && event.ctrlKey && event.altKey) { setInterval(() => { - this.changeColor(); + this.$vuetify.theme.themes.dark.primary = this.primaries[this.primaryColorIndex]; + this.$vuetify.theme.themes.light.primary = this.primaries[this.primaryColorIndex]; + this.$root.settings.primaryColor = this.primaries[this.primaryColorIndex]; + this.primaryColorIndex++; + if (this.primaryColorIndex == this.primaries.length) + this.primaryColorIndex = 0; }, 400); } }); diff --git a/app/client/styles/scrollbar.scss b/app/client/styles/scrollbar.scss index c8619ee..a9592c0 100644 --- a/app/client/styles/scrollbar.scss +++ b/app/client/styles/scrollbar.scss @@ -11,9 +11,9 @@ border-radius: 5px; } -::-webkit-scrollbar-track:hover { - background-color: #080808; -} +// ::-webkit-scrollbar-track:hover { +// background-color: #080808; +// } ::-webkit-scrollbar-thumb { border-radius: 5px; diff --git a/app/package.json b/app/package.json index 69893c3..1d659ff 100644 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "freezer", "private": true, - "version": "1.1.1", + "version": "1.1.2", "description": "", "main": "background.js", "scripts": { diff --git a/app/src/downloads.js b/app/src/downloads.js index f2130ff..83cac04 100644 --- a/app/src/downloads.js +++ b/app/src/downloads.js @@ -65,12 +65,23 @@ class DownloadManager { this.updateQueue(); } - async add(track, quality) { + //data: {tracks: [], quality, playlistName} + async addBatch(data) { + for (let track of data.tracks) { + let p = this.settings.downloadsPath; + if (data.playlistName && this.settings.playlistFolder) { + p = path.join(p, sanitize(data.playlistName)); + } + await this.add(track, data.quality, p); + } + } + + async add(track, quality, p) { //Sanitize quality let q = this.settings.downloadsQuality; if (quality) q = parseInt(quality.toString(), 10); - let download = new Download(track, q, 0); + let download = new Download(track, q, 0, p); //Check if in queue if (this.queue.some(d => d.track.id == track.id)) { @@ -430,16 +441,20 @@ class DownloadThread { } generatePath(quality) { + //Path + let folder = this.settings.downloadsPath; + if (this.download.path) + folder = this.download.path; + //User uploaded mp3s if (this.isUserUploaded) { //Generate path - let p = this.settings.downloadsPath; if (this.settings.createArtistFolder && this.download.track.artists[0].name.length > 0) - p = path.join(p, sanitize(this.download.track.artists[0].name)); + folder = path.join(folder, sanitize(this.download.track.artists[0].name)); if (this.settings.createAlbumFolder && this.download.track.album.title.length > 0) - p = path.join(p, sanitize(this.download.track.album.title)); + folder = path.join(folder, sanitize(this.download.track.album.title)); //Filename - let out = path.join(p, sanitize(this.download.track.title)); + let out = path.join(folder, sanitize(this.download.track.title)); if (!out.includes('.')) out += '.mp3'; return out; @@ -470,9 +485,8 @@ class DownloadThread { fn = fn.replace(new RegExp(k, 'g'), sanitize(props[k])); } //Generate folders - let p = this.settings.downloadsPath; - if (this.settings.createArtistFolder) p = path.join(p, sanitize(this.track.artists[0].name)); - if (this.settings.createAlbumFolder) p = path.join(p, sanitize(this.track.album.title)); + if (this.settings.createArtistFolder) folder = path.join(folder, sanitize(this.track.artists[0].name)); + if (this.settings.createAlbumFolder) folder = path.join(folder, sanitize(this.track.album.title)); //Extension if (quality.toString() == '9') { @@ -481,14 +495,16 @@ class DownloadThread { fn += '.mp3'; } - return path.join(p, fn); + return path.join(folder, fn); } } class Download { - constructor (track, quality, state) { + constructor (track, quality, state, path) { this.track = track; this.quality = quality; + this.path = path; + // 0 - none // 1 - downloading // 2 - postprocess @@ -506,12 +522,13 @@ class Download { _id: this.track.id, track: this.track, quality: this.quality, - state: this.state + state: this.state, + path: this.path } } static fromDB(json) { - return new Download(json.track, json.quality, json.state); + return new Download(json.track, json.quality, json.state, json.path); } } diff --git a/app/src/server.js b/app/src/server.js index 1304b8c..24e32ee 100644 --- a/app/src/server.js +++ b/app/src/server.js @@ -1,6 +1,6 @@ const express = require('express'); const path = require('path'); -const https = require('https'); +const packageJson = require('../package.json'); const fs = require('fs'); const axios = require('axios').default; const logger = require('./winston'); @@ -390,11 +390,7 @@ app.get('/suggestions/:query', async (req, res) => { //Post list of tracks to download app.post('/downloads', async (req, res) => { - let tracks = req.body; - let quality = req.query.q; - for (let track of tracks) { - downloadManager.add(track, quality); - } + downloadManager.addBatch(req.body); res.status(200).send('OK'); }); @@ -474,6 +470,13 @@ app.get('/fullurl', async (req, res) => { res.json({url: r.request.res.responseUrl}); }); +//About page +app.get('/about', async (req, res) => { + res.json({ + version: packageJson.version + }); +}); + //Redirect to index on unknown path app.all('*', (req, res) => { res.redirect('/'); diff --git a/app/src/settings.js b/app/src/settings.js index e2d86ec..abce2c3 100644 --- a/app/src/settings.js +++ b/app/src/settings.js @@ -34,6 +34,10 @@ class Settings { this.downloadLyrics = true; this.primaryColor = '#2196F3'; this.language = 'en'; + + this.crossfadeDuration = 3000; + this.lightTheme = false; + this.playlistFolder = false; } //Based on electorn app.getPath diff --git a/package.json b/package.json index b83fdf0..8be4bbe 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "freezer", "private": true, - "version": "1.1.1", + "version": "1.1.2", "description": "", "scripts": { "pack": "electron-builder --dir",