diff --git a/src/i18n/i18n.ts b/src/i18n/i18n.ts index 29eac3b0..60d4a24a 100644 --- a/src/i18n/i18n.ts +++ b/src/i18n/i18n.ts @@ -1,4 +1,4 @@ -import { PostProcessorModule } from 'i18next'; +import { PostProcessorModule, TOptions, StringMap } from 'i18next'; import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; import en from './locales/en.json'; @@ -125,16 +125,18 @@ const titleCasePostProcessor: PostProcessorModule = { }, }; +const ignoreSentenceCaseLanguages = ['de'] + const sentenceCasePostProcessor: PostProcessorModule = { type: 'postProcessor', name: 'sentenceCase', - process: (value: string) => { + process: (value: string, _key: string, _options: TOptions, translator: any) => { const sentences = value.split('. '); return sentences .map((sentence) => { return ( - sentence.charAt(0).toLocaleUpperCase() + sentence.slice(1).toLocaleLowerCase() + sentence.charAt(0).toLocaleUpperCase() + (!ignoreSentenceCaseLanguages.includes(translator.language) ? sentence.slice(1).toLocaleLowerCase() : sentence.slice(1)) ); }) .join('. '); diff --git a/src/i18n/locales/de.json b/src/i18n/locales/de.json index dcbb8667..e80de296 100644 --- a/src/i18n/locales/de.json +++ b/src/i18n/locales/de.json @@ -8,8 +8,8 @@ "deletePlaylist": "löschen $t(entity.playlist_one)", "deselectAll": "Alle abwählen", "goToPage": "Gehe zur Seite", - "moveToTop": "Nach Oben", - "moveToBottom": "Nach Unten", + "moveToTop": "Nach oben", + "moveToBottom": "Nach unten", "removeFromPlaylist": "Entfernen von $t(entity.playlist_one)", "viewPlaylists": "Ansicht $t(entity.playlist_other)", "refresh": "$t(common.refresh)", @@ -23,7 +23,7 @@ "increase": "erhöhen", "rating": "Wertung", "bpm": "bpm", - "refresh": "erneuern", + "refresh": "Aktualisieren", "unknown": "Unbekannt", "areYouSure": "Bist Du sicher?", "edit": "Bearbeiten", @@ -61,7 +61,8 @@ "delete": "Löschen", "cancel": "Abbrechen", "forceRestartRequired": "Neustarten um die Änderungen zu übernehmen... Schließe die Benachrichtigung zum Neustarten", - "setting": "Einstellung", + "setting": "Einstellungen", + "setting_other": "Einstellungen", "version": "Version", "title": "Titel", "filter_one": "Filter", @@ -84,7 +85,7 @@ "sortOrder": "Reihenfolge", "none": "keine", "menu": "Menü", - "restartRequired": "Neustart benötigt", + "restartRequired": "(Neustart benötigt)", "previousSong": "vorheriger $t(entity.track_one)", "noResultsFromQuery": "Die Abfrage brachte keine Ergebnisse", "quit": "Verlassen", @@ -120,7 +121,7 @@ "loginRateError": "Zu viele Anmeldeversuche, bitte versuche es in einigen Sekunden erneut" }, "filter": { - "mostPlayed": "Meist gespielt", + "mostPlayed": "Meistgespielt", "comment": "Kommentar", "playCount": "Anzahl abgespielt", "recentlyUpdated": "kürzlich aktualisiert", @@ -224,12 +225,12 @@ "artist_other": "Interpreten", "folderWithCount_one": "{{count}} Verzeichnis", "folderWithCount_other": "{{count}} Verzeichnisse", - "albumArtist_one": "Album Interpret", - "albumArtist_other": "Album Interpreten", + "albumArtist_one": "Albuminterpret", + "albumArtist_other": "Albuminterpreten", "track_one": "Track", "track_other": "Tracks", - "albumArtistCount_one": "{{count}} Album Interpret", - "albumArtistCount_other": "{{count}} Album Interpreten", + "albumArtistCount_one": "{{count}} Albuminterpret", + "albumArtistCount_other": "{{count}} Albuminterpreten", "albumWithCount_one": "{{count}} Album", "albumWithCount_other": "{{count}} Alben", "favorite_one": "Favorit", @@ -272,12 +273,12 @@ "synchronized": "synchronisiert", "followCurrentLyric": "dem Songtext folgen", "opacity": "Deckkraft", - "lyricSize": "Songtext Größe", + "lyricSize": "Songtext-Größe", "showLyricProvider": "Songtext-Anbieter anzeigen", "unsynchronized": "nicht synchronisiert", - "lyricAlignment": "Songtext Ausrichtung", + "lyricAlignment": "Songtext-Ausrichtung", "useImageAspectRatio": "Bildseitenverhältnis verwenden", - "lyricGap": "Songtext Lücke" + "lyricGap": "Songtext-Lücke" }, "upNext": "als nächstes", "lyrics": "Songtexte", @@ -289,16 +290,16 @@ "manageServers": "Server verwalten", "expandSidebar": "Seitenleiste erweitern", "collapseSidebar": "Seitenleiste einklappen", - "openBrowserDevtools": "Browser Entwicklungswerkzeuge öffnen", + "openBrowserDevtools": "Browser-Entwicklungswerkzeuge öffnen", "goBack": "Gehe zurück", "goForward": "Gehe vorwärts", "settings": "$t(common.setting_other)", "quit": "$t(common.quit)" }, "home": { - "mostPlayed": "Meist gespielt", + "mostPlayed": "Meistgespielt", "newlyAdded": "Neu hinzugefügte Veröffentlichungen", - "explore": "Entdecken Sie Ihre Bibliothek", + "explore": "Entdecke deine Bibliothek", "recentlyPlayed": "Kürzlich gespielt", "title": "$t(common.home)" }, @@ -431,7 +432,7 @@ "sidebarCollapsedNavigation_description": "Zeigt die Navigation in der minimierten Seitenleiste an oder verbirgt sie", "mpvExecutablePath_help": "eine pro Zeile", "hotkey_volumeUp": "Lauter", - "skipDuration": "Sprung Dauer", + "skipDuration": "Sprungdauer", "showSkipButtons": "Schaltflächen zum Überspringen anzeigen", "playButtonBehavior_optionPlay": "$t(player.play)", "minimumScrobblePercentage": "minimale Scrobble-Dauer (Prozentsatz)", @@ -495,7 +496,7 @@ "savePlayQueue": "Wiedergabe-Warteschlange speichern", "minimumScrobbleSeconds_description": "die Mindestdauer in Sekunden, die das Lied abspielen muss, bevor es gescrobbelt wird", "skipPlaylistPage_description": "Gehen Sie beim Navigieren zu einer Wiedergabeliste zur Titelseite der Wiedergabeliste und nicht zur Standardseite", - "fontType_description": "Die integrierte Schriftart wählt eine der von Feishin bereitgestellten Schriftarten aus. Mit der Systemschriftart können Sie jede von Ihrem Betriebssystem bereitgestellte Schriftart auswählen. Benutzerdefiniert erlaubt es eine eigene Schriftart bereitstellen", + "fontType_description": "Die integrierte Schriftart wählt eine der von Feishin bereitgestellten Schriftarten aus. Mit der Systemschriftart können Sie jede von Ihrem Betriebssystem bereitgestellte Schriftart auswählen. Benutzerdefiniert erlaubt es eine eigene Schriftart bereitzustellen", "playButtonBehavior": "Verhalten der Wiedergabetaste", "volumeWheelStep": "Lautstärkeregler Stufe", "sidebarPlaylistList_description": "Ein- oder Ausblenden der Playlisten-Liste in der Seitenleiste", @@ -510,7 +511,7 @@ "sidebarConfiguration_description": "Wählen Sie die Elemente und die Reihenfolge aus, in der sie in der Seitenleiste angezeigt werden", "remotePort": "Port des Fernsteuerungsserver", "hotkey_playbackNext": "Nächster Track", - "useSystemTheme_description": "der systemdefinierten Hell oder Dunkel Präferenz folgen", + "useSystemTheme_description": "der systemdefinierten Hell- oder Dunkelpräferenz folgen", "playButtonBehavior_optionAddNext": "$t(player.addNext)", "lyricFetch_description": "Songtexte aus verschiedenen Internetquellen abrufen", "lyricFetchProvider_description": "Wählen Sie die Anbieter aus, von denen Sie Liedtexte abrufen möchten. Die Reihenfolge der Anbieter ist die Reihenfolge, in der sie abgefragt werden", diff --git a/src/main/main.ts b/src/main/main.ts index 2ca95d90..189eaf9d 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -317,9 +317,9 @@ const createWindow = async () => { } }); - const globalMediaKeysEnabled = store.get('global_media_hotkeys') as boolean; + const globalMediaKeysEnabled = store.get('global_media_hotkeys', true) as boolean; - if (globalMediaKeysEnabled !== false) { + if (globalMediaKeysEnabled) { enableMediaKeys(mainWindow); } @@ -633,7 +633,7 @@ ipcMain.on( } } - const globalMediaKeysEnabled = store.get('global_media_hotkeys') as boolean; + const globalMediaKeysEnabled = store.get('global_media_hotkeys', true) as boolean; if (globalMediaKeysEnabled) { enableMediaKeys(mainWindow); diff --git a/src/renderer/features/home/routes/home-route.tsx b/src/renderer/features/home/routes/home-route.tsx index ae143b4d..8f67cd0e 100644 --- a/src/renderer/features/home/routes/home-route.tsx +++ b/src/renderer/features/home/routes/home-route.tsx @@ -251,7 +251,16 @@ const HomeRoute = () => { property: 'name', route: { route: AppRoute.LIBRARY_ALBUMS_DETAIL, - slugs: [{ idProperty: 'id', slugProperty: 'albumId' }], + slugs: [ + { + idProperty: + server?.type === ServerType.JELLYFIN && + carousel.itemType === LibraryItem.SONG + ? 'albumId' + : 'id', + slugProperty: 'albumId', + }, + ], }, }, { @@ -272,7 +281,16 @@ const HomeRoute = () => { itemType={carousel.itemType} route={{ route: AppRoute.LIBRARY_ALBUMS_DETAIL, - slugs: [{ idProperty: 'id', slugProperty: 'albumId' }], + slugs: [ + { + idProperty: + server?.type === ServerType.JELLYFIN && + carousel.itemType === LibraryItem.SONG + ? 'albumId' + : 'id', + slugProperty: 'albumId', + }, + ], }} title={{ label: (