diff --git a/main.ts b/main.ts index 39682f240..06303747b 100644 --- a/main.ts +++ b/main.ts @@ -9,7 +9,7 @@ /* eslint-disable @typescript-eslint/no-unsafe-argument */ /* eslint-disable @typescript-eslint/no-unsafe-return */ /* eslint-disable @typescript-eslint/ban-types */ -import { app, BrowserWindow, ipcMain, Menu, nativeTheme, protocol, Tray } from 'electron'; +import { app, BrowserWindow, ipcMain, Menu, nativeImage, nativeTheme, protocol, Tray } from 'electron'; import log from 'electron-log'; import * as path from 'path'; import * as url from 'url'; @@ -602,6 +602,18 @@ try { } }); + ipcMain.on('update-dock-icon', (event: any, arg: any) => { + if (!isMacOS() || !app.dock) { + return; + } + + if (arg) { + app.dock.setIcon(nativeImage.createFromBuffer(arg)); + } else { + app.dock.setIcon(nativeImage.createFromPath(path.join(globalAny.__static, 'icons/icon.icns'))); + } + }); + ipcMain.handle('settings:getAll', () => settings.getAll()); ipcMain.handle('settings:set', (_, key: string, value: any) => settings.set(key, value)); } diff --git a/main/common/settings/default-settings.ts b/main/common/settings/default-settings.ts index 8599d6a24..bc27a28b7 100644 --- a/main/common/settings/default-settings.ts +++ b/main/common/settings/default-settings.ts @@ -85,4 +85,5 @@ export const DEFAULT_SETTINGS = { jumpToPlayingSong: true, showSquareImages: false, useCompactYearView: false, + showAlbumArtOnDockIcon: true, } as const; diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 631cb7c98..bff3ff1b2 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -20,6 +20,7 @@ import { DesktopBase } from './common/io/desktop.base'; import { LifetimeService } from './services/lifetime/lifetime.service'; import { AudioVisualizer } from './services/playback/audio-visualizer'; import { DiscordService } from './services/discord/discord.service'; +import { DockService } from './services/dock/dock.service'; import { DatabaseMigratorBase } from './data/database-migrator.base'; @Component({ @@ -36,6 +37,7 @@ export class AppComponent implements OnInit { private appearanceService: AppearanceServiceBase, private translatorService: TranslatorServiceBase, private discordService: DiscordService, + private dockService: DockService, private scrobblingService: ScrobblingService, private trayService: TrayServiceBase, private mediaSessionService: MediaSessionService, @@ -89,6 +91,7 @@ export class AppComponent implements OnInit { this.translatorService.applyLanguage(); this.trayService.updateTrayContextMenu(); this.mediaSessionService.initialize(); + this.dockService.initialize(); this.scrobblingService.initialize(); this.eventListenerService.listenToEvents(); this.lifetimeService.initialize(); diff --git a/src/app/common/application/i18n.spec.ts b/src/app/common/application/i18n.spec.ts index fb7994918..4b29c7eca 100644 --- a/src/app/common/application/i18n.spec.ts +++ b/src/app/common/application/i18n.spec.ts @@ -105,6 +105,7 @@ describe('validate i18n', () => { 'disc-count', 'disc-number', 'discord', + 'dock', 'donate', 'donate-instructions', 'donate-now', @@ -263,6 +264,7 @@ describe('validate i18n', () => { 'select-folder', 'select-playlist-folder', 'settings', + 'show-album-art-on-dock-icon', 'show-all-folders-in-the-collection', 'show-audio-visualizer', 'show-dopamine', diff --git a/src/app/common/settings/settings.base.ts b/src/app/common/settings/settings.base.ts index 42755c2e4..d23eccade 100644 --- a/src/app/common/settings/settings.base.ts +++ b/src/app/common/settings/settings.base.ts @@ -89,4 +89,5 @@ export abstract class SettingsBase { public abstract jumpToPlayingSong: boolean; public abstract showSquareImages: boolean; public abstract useCompactYearView: boolean; + public abstract showAlbumArtOnDockIcon: boolean; } diff --git a/src/app/common/settings/settings.ts b/src/app/common/settings/settings.ts index 982687c49..1e7d9c29f 100644 --- a/src/app/common/settings/settings.ts +++ b/src/app/common/settings/settings.ts @@ -843,4 +843,13 @@ export class Settings implements SettingsBase { public set useCompactYearView(v: boolean) { this.set('useCompactYearView', v); } + + // showAlbumArtOnDockIcon + public get showAlbumArtOnDockIcon(): boolean { + return this.get('showAlbumArtOnDockIcon'); + } + + public set showAlbumArtOnDockIcon(v: boolean) { + this.set('showAlbumArtOnDockIcon', v); + } } diff --git a/src/app/services/dock/dock.service.ts b/src/app/services/dock/dock.service.ts new file mode 100644 index 000000000..e33e0623b --- /dev/null +++ b/src/app/services/dock/dock.service.ts @@ -0,0 +1,139 @@ +import { Injectable } from '@angular/core'; +import { Subscription } from 'rxjs'; +import { Constants } from '../../common/application/constants'; +import { Logger } from '../../common/logger'; +import { FileAccessBase } from '../../common/io/file-access.base'; +import { IpcProxyBase } from '../../common/io/ipc-proxy.base'; +import { SettingsBase } from '../../common/settings/settings.base'; +import { PlaybackService } from '../playback/playback.service'; +import { MetadataService } from '../metadata/metadata.service'; +import { TrackModel } from '../track/track-model'; +import { PlaybackStarted } from '../playback/playback-started'; + +@Injectable({ providedIn: 'root' }) +export class DockService { + private _subscription: Subscription | undefined; + + public constructor( + private playbackService: PlaybackService, + private metadataService: MetadataService, + private fileAccess: FileAccessBase, + private ipcProxy: IpcProxyBase, + private settings: SettingsBase, + private logger: Logger, + ) {} + + public get isMacOS(): boolean { + return process.platform === 'darwin'; + } + + public get showAlbumArtOnDockIcon(): boolean { + return this.settings.showAlbumArtOnDockIcon; + } + + public set showAlbumArtOnDockIcon(v: boolean) { + this.settings.showAlbumArtOnDockIcon = v; + this.initialize(); + } + + public initialize(): void { + if (!this.isMacOS) { + return; + } + + this.removeSubscriptions(); + + if (this.settings.showAlbumArtOnDockIcon) { + this.addSubscriptions(); + + if (this.playbackService.currentTrack != undefined) { + this.updateDockIconAsync(this.playbackService.currentTrack); + } + } else { + this.resetDockIcon(); + } + } + + private addSubscriptions(): void { + this._subscription = new Subscription(); + + this._subscription.add( + this.playbackService.playbackStarted$.subscribe((playbackStarted: PlaybackStarted) => { + this.updateDockIconAsync(playbackStarted.currentTrack); + }), + ); + + this._subscription.add( + this.playbackService.playbackStopped$.subscribe(() => { + this.resetDockIcon(); + }), + ); + } + + private removeSubscriptions(): void { + if (this._subscription) { + this._subscription.unsubscribe(); + } + } + + private async updateDockIconAsync(track: TrackModel): Promise { + try { + const imageUrl = await this.metadataService.createAlbumImageUrlAsync(track, 0); + + if (imageUrl === Constants.emptyImage) { + this.resetDockIcon(); + return; + } + + let artworkBuffer: Buffer; + + if (imageUrl.startsWith('data:')) { + const base64 = imageUrl.split(',')[1]; + artworkBuffer = Buffer.from(base64, 'base64'); + } else if (imageUrl.startsWith('file:///')) { + artworkBuffer = await this.fileAccess.getFileContentAsBufferAsync(imageUrl.replace('file:///', '')); + } else { + this.resetDockIcon(); + return; + } + + const pngBuffer = await this.applySquircleMaskAsync(artworkBuffer); + this.ipcProxy.sendToMainProcess('update-dock-icon', pngBuffer); + } catch (e: unknown) { + this.logger.error(e, 'Could not update dock icon', 'DockService', 'updateDockIconAsync'); + this.resetDockIcon(); + } + } + + private async applySquircleMaskAsync(artworkBuffer: Buffer): Promise { + const { Jimp } = await import('jimp'); + + const iconSize = 1024; + const inset = 100; + const contentSize = iconSize - 2 * inset; + const half = contentSize / 2; + const n = 5; + + const artwork = await Jimp.read(artworkBuffer); + artwork.resize({ w: contentSize, h: contentSize }); + + const result = new Jimp({ width: iconSize, height: iconSize, color: 0x00000000 }); + + for (let y = 0; y < contentSize; y++) { + for (let x = 0; x < contentSize; x++) { + const nx = Math.abs((x - half + 0.5) / half); + const ny = Math.abs((y - half + 0.5) / half); + + if (Math.pow(nx, n) + Math.pow(ny, n) <= 1) { + result.setPixelColor(artwork.getPixelColor(x, y), x + inset, y + inset); + } + } + } + + return await result.getBuffer('image/png'); + } + + private resetDockIcon(): void { + this.ipcProxy.sendToMainProcess('update-dock-icon', undefined); + } +} diff --git a/src/app/testing/settings-mock.ts b/src/app/testing/settings-mock.ts index fd15df389..7fb2a5b57 100644 --- a/src/app/testing/settings-mock.ts +++ b/src/app/testing/settings-mock.ts @@ -93,6 +93,7 @@ export class SettingsMock implements SettingsBase { public jumpToPlayingSong: boolean; public showSquareImages: boolean; public useCompactYearView: boolean; + public showAlbumArtOnDockIcon: boolean; public get albumKeyIndex(): string { return this.albumKeyIndexMock; diff --git a/src/app/ui/components/settings/behavior-settings/behavior-settings.component.html b/src/app/ui/components/settings/behavior-settings/behavior-settings.component.html index 49aa1c7d9..f8caf40a0 100644 --- a/src/app/ui/components/settings/behavior-settings/behavior-settings.component.html +++ b/src/app/ui/components/settings/behavior-settings/behavior-settings.component.html @@ -20,6 +20,15 @@ {{ 'invert-notification-area-icon-color' | translate }} +
+ +
{{ 'dock' | translate }}
+
+ + {{ 'show-album-art-on-dock-icon' | translate }} +
+
{{ 'follow-song' | translate }}
diff --git a/src/app/ui/components/settings/behavior-settings/behavior-settings.component.spec.ts b/src/app/ui/components/settings/behavior-settings/behavior-settings.component.spec.ts index e4f655fcb..27bd3267b 100644 --- a/src/app/ui/components/settings/behavior-settings/behavior-settings.component.spec.ts +++ b/src/app/ui/components/settings/behavior-settings/behavior-settings.component.spec.ts @@ -1,6 +1,7 @@ import { IMock, Mock } from 'typemoq'; import { BehaviorSettingsComponent } from './behavior-settings.component'; import { MediaSessionService } from '../../../../services/media-session/media-session.service'; +import { DockService } from '../../../../services/dock/dock.service'; import { SettingsBase } from '../../../../common/settings/settings.base'; import { TrayServiceBase } from '../../../../services/tray/tray.service.base'; import { DialogServiceBase } from '../../../../services/dialog/dialog.service.base'; @@ -11,6 +12,7 @@ describe('BehaviorSettingsComponent', () => { let component: BehaviorSettingsComponent; let trayServiceMock: IMock; let mediaSessionServiceMock: IMock; + let dockServiceMock: IMock; let dialogServiceMock: IMock; let translatorServiceMock: IMock; let settingsMock: IMock; @@ -20,6 +22,7 @@ describe('BehaviorSettingsComponent', () => { settingsMock = Mock.ofType(); trayServiceMock = Mock.ofType(); mediaSessionServiceMock = Mock.ofType(); + dockServiceMock = Mock.ofType(); dialogServiceMock = Mock.ofType(); translatorServiceMock = Mock.ofType(); loggerMock = Mock.ofType(); @@ -27,6 +30,7 @@ describe('BehaviorSettingsComponent', () => { component = new BehaviorSettingsComponent( trayServiceMock.object, mediaSessionServiceMock.object, + dockServiceMock.object, dialogServiceMock.object, translatorServiceMock.object, settingsMock.object, @@ -62,6 +66,15 @@ describe('BehaviorSettingsComponent', () => { expect(component.mediaSessionService).toBeDefined(); }); + it('should define dockService', () => { + // Arrange + + // Act + + // Assert + expect(component.dockService).toBeDefined(); + }); + it('should define settings', () => { // Arrange diff --git a/src/app/ui/components/settings/behavior-settings/behavior-settings.component.ts b/src/app/ui/components/settings/behavior-settings/behavior-settings.component.ts index 808d5f641..bfa715786 100644 --- a/src/app/ui/components/settings/behavior-settings/behavior-settings.component.ts +++ b/src/app/ui/components/settings/behavior-settings/behavior-settings.component.ts @@ -1,6 +1,7 @@ import { Component, OnInit, ViewEncapsulation } from '@angular/core'; import { TrayServiceBase } from '../../../../services/tray/tray.service.base'; import { MediaSessionService } from '../../../../services/media-session/media-session.service'; +import { DockService } from '../../../../services/dock/dock.service'; import { SettingsBase } from '../../../../common/settings/settings.base'; import { CollectionUtils } from '../../../../common/utils/collections-utils'; import { DialogServiceBase } from '../../../../services/dialog/dialog.service.base'; @@ -19,6 +20,7 @@ export class BehaviorSettingsComponent implements OnInit { public constructor( public trayService: TrayServiceBase, public mediaSessionService: MediaSessionService, + public dockService: DockService, private dialogService: DialogServiceBase, private translatorService: TranslatorServiceBase, public settings: SettingsBase, diff --git a/src/assets/i18n/ar.json b/src/assets/i18n/ar.json index 5ed16f230..90b4ce9b9 100644 --- a/src/assets/i18n/ar.json +++ b/src/assets/i18n/ar.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "إظهار شاشة الترحيب في إعادة التشغيل التالية", "online": "متصل", "discord": "ديسكورد", + "dock": "Dock", "enable-discord-rich-presence": "تفعيل Discord Rich Presence", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "حول", "components": "المكونات", "version": "الإصدار", diff --git a/src/assets/i18n/bg.json b/src/assets/i18n/bg.json index d0c3d0a0c..97b4a8799 100644 --- a/src/assets/i18n/bg.json +++ b/src/assets/i18n/bg.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Покажете началния екран при следващото рестартиране", "online": "Online", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Активирайте Discord Rich Presence", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "Относно", "components": "Компоненти", "version": "Версия", diff --git a/src/assets/i18n/cs.json b/src/assets/i18n/cs.json index 31c82ec8c..5d31bd846 100644 --- a/src/assets/i18n/cs.json +++ b/src/assets/i18n/cs.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Zobrazit při příštím spuštění uvítací obrazovku", "online": "Online", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Povolit status na Discordu", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "O aplikaci", "components": "Komponenty", "version": "Verze", diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 676d6c541..49d144d21 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Zeige den Willkommensbildschirm beim nächsten Start", "online": "Online", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Discord Rich Presence einschalten", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "Über", "components": "Komponenten", "version": "Version", diff --git a/src/assets/i18n/el.json b/src/assets/i18n/el.json index 1df19c71b..6aa9fb4a4 100644 --- a/src/assets/i18n/el.json +++ b/src/assets/i18n/el.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Δείξε μου την οθόνη καλωσορίσματος στην επόμενη επανεκκίνηση", "online": "Σε σύνδεση", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Ενεργοποίηση Discord Rich Presence", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "Σχετικά με", "components": "Components", "version": "Έκδοση", diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index b6a386db0..e39eeee56 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Show the welcome screen on the next restart", "online": "Online", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Enable Discord Rich Presence", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "About", "components": "Components", "version": "Version", diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index a4f553248..79dd7fcfd 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Mostrar la pantalla de bienvenida en el próximo reinicio", "online": "En línea", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Habilitar Discord Rich Presence", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "Acerca de", "components": "Componentes", "version": "Versión", diff --git a/src/assets/i18n/fa.json b/src/assets/i18n/fa.json index 5ee7c247b..9d96824a4 100644 --- a/src/assets/i18n/fa.json +++ b/src/assets/i18n/fa.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "صفحه خوش آمد گویی را در راه اندازی مجدد بعدی نشان دهید", "online": "برخط", "discord": "اختلاف", + "dock": "Dock", "enable-discord-rich-presence": "Discord Rich Presence را فعال کنید", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "در باره", "components": "اجزاء", "version": "نسخه", diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index fed24db80..af3ebda8c 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Afficher l'écran d'accueil au prochain redémarrage", "online": "En ligne", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Activer Discord Rich Presence", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "À propos", "components": "Composants", "version": "Version", diff --git a/src/assets/i18n/he.json b/src/assets/i18n/he.json index a80194fb6..d37bc2312 100644 --- a/src/assets/i18n/he.json +++ b/src/assets/i18n/he.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "הצג את מסך הפתיחה בהפעלה הבאה", "online": "רשת", "discord": "דיסקורד", + "dock": "Dock", "enable-discord-rich-presence": "הפעל נוכחות עשירה בדיסקורד (Discord Rich Presence)", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "אודות", "components": "רכיבים", "version": "גרסה", diff --git a/src/assets/i18n/hr.json b/src/assets/i18n/hr.json index 4ed91e029..483cfa97b 100644 --- a/src/assets/i18n/hr.json +++ b/src/assets/i18n/hr.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Prikaži zaslon dobrodošlice kod sljedećeg pokretanja", "online": "Na mreži", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Omogući Discord Rich Presence", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "O programu", "components": "Komponente", "version": "Verzija", diff --git a/src/assets/i18n/it.json b/src/assets/i18n/it.json index c39b762f4..779f23254 100644 --- a/src/assets/i18n/it.json +++ b/src/assets/i18n/it.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Mostra la schermata di benvenuto al prossimo riavvio", "online": "Online", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Abilita Discord Rich Presence", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "Informazioni", "components": "Componenti", "version": "Versione", diff --git a/src/assets/i18n/ja-JP.json b/src/assets/i18n/ja-JP.json index ff214b33f..445cc0e67 100644 --- a/src/assets/i18n/ja-JP.json +++ b/src/assets/i18n/ja-JP.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "次の再起動時にウィザード画面を表示する", "online": "通信関連設定", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Discord の Rich Presence機能を有効にする", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "このアプリについて", "components": "使用コンポーネント", "version": "Version", diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index 6478b920a..a9efd7c66 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "다음 재시작에 환영 화면을 표시", "online": "온라인", "discord": "디스코드", + "dock": "Dock", "enable-discord-rich-presence": "디스코드 리치 프레즌스 기능 사용", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "정보", "components": "구성 요소", "version": "버전", diff --git a/src/assets/i18n/ku.json b/src/assets/i18n/ku.json index 5ca38d6f4..69273c892 100644 --- a/src/assets/i18n/ku.json +++ b/src/assets/i18n/ku.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Dîmendera pêşwaziyê li ser ji nû ve destpêkirina nû nîşan bide", "online": "Serhêl", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Hebûna Rich Discord çalak bike", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "Derbar", "components": "Pêkhate", "version": "Goherto", diff --git a/src/assets/i18n/nl.json b/src/assets/i18n/nl.json index 7c08349d3..b70f09103 100644 --- a/src/assets/i18n/nl.json +++ b/src/assets/i18n/nl.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Toon het welkomstscherm bij de volgende herstart", "online": "Online", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Schakel Discord Rich Presence in", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "Over", "components": "Componenten", "version": "Versie", diff --git a/src/assets/i18n/pl.json b/src/assets/i18n/pl.json index 7e8b563a9..2c879727c 100644 --- a/src/assets/i18n/pl.json +++ b/src/assets/i18n/pl.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Pokaż ekran powitalny po następnym uruchomieniu", "online": "Ustawienia sieciowe", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Włącz Discord Rich Presence", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "O programie", "components": "Składniki", "version": "Wersja", diff --git a/src/assets/i18n/pt-BR.json b/src/assets/i18n/pt-BR.json index f63f0ad2d..f68b03ae3 100644 --- a/src/assets/i18n/pt-BR.json +++ b/src/assets/i18n/pt-BR.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Mostrar a tela de boas-vindas no próximo reinício", "online": "Online", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Ativar o Discord Rich Presence", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "Sobre", "components": "Componentes", "version": "Versão", diff --git a/src/assets/i18n/pt-PT.json b/src/assets/i18n/pt-PT.json index 28eea3832..9ac7de53a 100644 --- a/src/assets/i18n/pt-PT.json +++ b/src/assets/i18n/pt-PT.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Mostrar o ecrã de boas-vindas no próximo reinício", "online": "Online", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Ativar Discord Rich Presence", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "Acerca", "components": "Componentes", "version": "Versão", diff --git a/src/assets/i18n/ru.json b/src/assets/i18n/ru.json index 32a71b4cd..1e395c42d 100644 --- a/src/assets/i18n/ru.json +++ b/src/assets/i18n/ru.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Показать экран приветствия при следующем запуске", "online": "Интернет", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Включить расширенный статус в Discord", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "О программе", "components": "Компоненты", "version": "Версия", diff --git a/src/assets/i18n/sv.json b/src/assets/i18n/sv.json index 6cc0f5ff2..a244e7e8d 100644 --- a/src/assets/i18n/sv.json +++ b/src/assets/i18n/sv.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Visa välkomstskärmen vid nästa omstart", "online": "Uppkopplad", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Aktivera Discord Aktivitetsstatus", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "Om", "components": "Komponenter", "version": "Version", diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json index 4ff1785a0..03aab868d 100644 --- a/src/assets/i18n/tr.json +++ b/src/assets/i18n/tr.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Bir sonraki yeniden başlatmada hoş geldiniz ekranını göster", "online": "Çevrimiçi", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Discord Etkinliğini Etkinleştir", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "Hakkında", "components": "Bileşenler", "version": "Versiyon", diff --git a/src/assets/i18n/vi.json b/src/assets/i18n/vi.json index 1944fb6c7..d8b149fc5 100644 --- a/src/assets/i18n/vi.json +++ b/src/assets/i18n/vi.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "Hiện màn hình chào mừng trong lần tới", "online": "Trực tuyến", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "Bật Discord Rich Presence", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "Giới thiệu", "components": "Thành phần", "version": "Phiên bản", diff --git a/src/assets/i18n/zh-CN.json b/src/assets/i18n/zh-CN.json index 54a49af45..7b781fe47 100644 --- a/src/assets/i18n/zh-CN.json +++ b/src/assets/i18n/zh-CN.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "下次启动时显示欢迎页", "online": "在线", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "启用 Discord Rich Presence", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "关于", "components": "组件", "version": "版本", diff --git a/src/assets/i18n/zh-TW.json b/src/assets/i18n/zh-TW.json index 155b53dbd..e8fd956a5 100644 --- a/src/assets/i18n/zh-TW.json +++ b/src/assets/i18n/zh-TW.json @@ -48,7 +48,9 @@ "show-welcome-screen-on-next-restart": "下次重新啟動時展示歡迎頁面", "online": "線上", "discord": "Discord", + "dock": "Dock", "enable-discord-rich-presence": "啟用 Discord Rich Presence", + "show-album-art-on-dock-icon": "Show album art on dock icon", "about": "關於", "components": "元件", "version": "版本",