From 00ee85e53daa72a6ea8f73c9c55e29c96c08ae5e Mon Sep 17 00:00:00 2001 From: Callum Date: Mon, 22 Jun 2026 23:55:16 +1000 Subject: [PATCH 001/287] Read repeat/shuffle state in SessionPlayer Implement getRepeatMode and getQueueShuffleMode in the SessionPlayer plugin so that repeat and shuffle buttons work. Since the loop and shuffle buttons read the existing mode to compute the next one, they both never issued SetRepeatMode/SetShuffleQueue commands, so pressing the buttons just did nothing in remote control. I used PlayState.RepeatMode and PlayState.PlaybackOrder, which already was reported by remote targets. The buttons work now and the icons reflect the state that exists on the controlled device through onStateChanged like they should. --- src/plugins/sessionPlayer/plugin.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/plugins/sessionPlayer/plugin.js b/src/plugins/sessionPlayer/plugin.js index 04ad027002..0a0d5b5867 100644 --- a/src/plugins/sessionPlayer/plugin.js +++ b/src/plugins/sessionPlayer/plugin.js @@ -535,7 +535,9 @@ class SessionPlayer { } getRepeatMode() { - // not supported? + let state = this.lastPlayerData || {}; + state = state.PlayState || {}; + return state.RepeatMode || 'RepeatNone'; } setQueueShuffleMode(mode) { @@ -545,7 +547,9 @@ class SessionPlayer { } getQueueShuffleMode() { - // not supported? + let state = this.lastPlayerData || {}; + state = state.PlayState || {}; + return state.PlaybackOrder === 'Shuffle' ? 'Shuffle' : 'Sorted'; } displayContent(options) { From 9e5c0e94391dbb456a26e47e47c053f85a0a9eb5 Mon Sep 17 00:00:00 2001 From: Callum Date: Mon, 22 Jun 2026 23:57:10 +1000 Subject: [PATCH 002/287] Set PlayState.PlaybackOrder in PlaybackManager Previously we only set PlayState.ShuffleMode, which only existed in the client state. This was ignored by the server which uses PlaybackOrder instead, which means the shuffle state wouldn't be transmitted over remote control, making the shuffle button always show as sorted and clicking it again would re-shuffle instead of unshuffling. --- src/components/playback/playbackmanager.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index 926bf285eb..ed78d09356 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2176,6 +2176,8 @@ export class PlaybackManager { state.PlayState.IsPaused = player.paused(); state.PlayState.RepeatMode = self.getRepeatMode(player); state.PlayState.ShuffleMode = self.getQueueShuffleMode(player); + // Needed for remote control because ShuffleMode doesn't exist in PlayerStateInfo from the server + state.PlayState.PlaybackOrder = state.PlayState.ShuffleMode === 'Shuffle' ? 'Shuffle' : 'Default'; state.PlayState.MaxStreamingBitrate = self.getMaxStreamingBitrate(player); state.PlayState.PositionTicks = getCurrentTicks(player); From af42c87f346a3a764986d606b668ae7e4b8bb92c Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Tue, 23 Jun 2026 20:51:30 +0200 Subject: [PATCH 003/287] Fix missing and unaired filters --- src/components/filterdialog/filterdialog.js | 37 +++++++++++++-------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/components/filterdialog/filterdialog.js b/src/components/filterdialog/filterdialog.js index f936a41200..27e7c0f9bc 100644 --- a/src/components/filterdialog/filterdialog.js +++ b/src/components/filterdialog/filterdialog.js @@ -102,8 +102,9 @@ function updateFilterControls(context, options) { context.querySelector('#chkThemeVideo').checked = query.HasThemeVideo === true; context.querySelector('#chkSpecialFeature').checked = query.HasSpecialFeature === true; context.querySelector('#chkSpecialEpisode').checked = query.ParentIndexNumber === 0; - context.querySelector('#chkMissingEpisode').checked = query.IsMissing === true; - context.querySelector('#chkFutureEpisode').checked = query.IsUnaired === true; + const isMissingChecked = query.IsMissing === true; + context.querySelector('#chkMissingEpisode').checked = isMissingChecked; + context.querySelector('#chkFutureEpisode').checked = query.IsUnaired === true || (isMissingChecked && query.IsUnaired === null); for (const elem of context.querySelectorAll('.chkStatus')) { const filters = `,${query.SeriesStatus || ''}`; const filterName = elem.getAttribute('data-filter'); @@ -127,6 +128,24 @@ function triggerChange(instance) { Events.trigger(instance, 'filterchange'); } +function applyEpisodeStatusFilters(query, isMissingChecked, isUnairedChecked) { + query.StartIndex = 0; + + if (isMissingChecked && isUnairedChecked) { + query.IsMissing = true; + query.IsUnaired = null; + } else if (isMissingChecked) { + query.IsMissing = true; + query.IsUnaired = false; + } else if (isUnairedChecked) { + query.IsMissing = null; + query.IsUnaired = true; + } else { + query.IsMissing = false; + query.IsUnaired = null; + } +} + function setVisibility(context, options) { if (options.mode === 'livetvchannels' || options.mode === 'albums' || options.mode === 'artists' || options.mode === 'albumartists' || options.mode === 'songs') { hideByClass(context, 'videoStandard'); @@ -351,9 +370,9 @@ class FilterDialog { triggerChange(this); }); const chkMissingEpisode = context.querySelector('#chkMissingEpisode'); + const chkFutureEpisode = context.querySelector('#chkFutureEpisode'); chkMissingEpisode.addEventListener('change', () => { - query.StartIndex = 0; - query.IsMissing = !!chkMissingEpisode.checked; + applyEpisodeStatusFilters(query, chkMissingEpisode.checked, chkFutureEpisode.checked); triggerChange(this); }); const chkSpecialEpisode = context.querySelector('#chkSpecialEpisode'); @@ -362,16 +381,8 @@ class FilterDialog { query.ParentIndexNumber = chkSpecialEpisode.checked ? 0 : null; triggerChange(this); }); - const chkFutureEpisode = context.querySelector('#chkFutureEpisode'); chkFutureEpisode.addEventListener('change', () => { - query.StartIndex = 0; - if (chkFutureEpisode.checked) { - query.IsUnaired = true; - query.IsVirtualUnaired = null; - } else { - query.IsUnaired = null; - query.IsVirtualUnaired = false; - } + applyEpisodeStatusFilters(query, chkMissingEpisode.checked, chkFutureEpisode.checked); triggerChange(this); }); const chkSubtitle = context.querySelector('#chkSubtitle'); From 6731c18ba8e1bc823a65178369ec65ab323ae626 Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Wed, 24 Jun 2026 21:34:46 +0200 Subject: [PATCH 004/287] Fix modern layout --- src/utils/items.ts | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/utils/items.ts b/src/utils/items.ts index ee406decfd..80b677398f 100644 --- a/src/utils/items.ts +++ b/src/utils/items.ts @@ -57,19 +57,32 @@ export const getEpisodeFilter = ( viewType: LibraryTab, libraryViewSettings: LibraryViewSettings ) => { + const episodeFilters = libraryViewSettings.Filters?.EpisodeFilter; + const isMissingSelected = episodeFilters?.includes(EpisodeFilter.IsMissing); + const isUnairedSelected = episodeFilters?.includes(EpisodeFilter.IsUnaired); + + let isMissing: boolean | undefined; + let isUnaired: boolean | undefined; + + if (viewType === LibraryTab.Episodes) { + if (isMissingSelected) { + isMissing = true; + if (!isUnairedSelected) { + isUnaired = false; + } + } else if (isUnairedSelected) { + isUnaired = true; + } else { + isMissing = false; + } + } + return { - parentIndexNumber: libraryViewSettings.Filters?.EpisodeFilter?.includes( - EpisodeFilter.ParentIndexNumber - ) ? + parentIndexNumber: episodeFilters?.includes(EpisodeFilter.ParentIndexNumber) ? 0 : undefined, - isMissing: - viewType === LibraryTab.Episodes ? - !!libraryViewSettings.Filters?.EpisodeFilter?.includes(EpisodeFilter.IsMissing) : - undefined, - isUnaired: libraryViewSettings.Filters?.EpisodeFilter?.includes(EpisodeFilter.IsUnaired) ? - true : - undefined + isMissing, + isUnaired }; }; From d6d780893488e5264f7fa6ee4cd6fc92d34a95ca Mon Sep 17 00:00:00 2001 From: dkanada Date: Tue, 30 Jun 2026 03:30:37 +0900 Subject: [PATCH 005/287] migrate comics and PDFs to new BookOsd component --- src/plugins/bookPlayer/BookOsd/BookOsd.scss | 10 +- src/plugins/bookPlayer/BookOsd/BookOsd.tsx | 49 ++++++++- src/plugins/bookPlayer/plugin.js | 2 +- src/plugins/comicsPlayer/plugin.js | 109 +++++++------------- src/plugins/comicsPlayer/style.scss | 16 +-- src/plugins/pdfPlayer/plugin.js | 71 +++++-------- src/plugins/pdfPlayer/style.scss | 15 +-- src/scripts/settings/userSettings.js | 2 +- src/themes/_base/_theme.scss | 6 -- 9 files changed, 118 insertions(+), 162 deletions(-) diff --git a/src/plugins/bookPlayer/BookOsd/BookOsd.scss b/src/plugins/bookPlayer/BookOsd/BookOsd.scss index 4c9e2b142d..6e582dfc15 100644 --- a/src/plugins/bookPlayer/BookOsd/BookOsd.scss +++ b/src/plugins/bookPlayer/BookOsd/BookOsd.scss @@ -4,6 +4,7 @@ z-index: 1002; display: flex; justify-content: space-between; + pointer-events: none; flex-direction: column; } @@ -14,6 +15,7 @@ height: 5vh; padding: 0 0.8vw; background-color: var(--jf-palette-AppBar-defaultBg); + pointer-events: auto; } // TODO disable landscape on mobile devices @@ -23,6 +25,10 @@ } } +.bookOsdSpacer { + flex: 1; +} + .bookOsdTop { padding-top: env(safe-area-inset-top); } @@ -31,10 +37,6 @@ padding-bottom: env(safe-area-inset-bottom); } -.bookOsdMargin { - margin-left: auto; -} - .bookOsdTitle { font-size: 1.1rem; margin-left: 0.35rem; diff --git a/src/plugins/bookPlayer/BookOsd/BookOsd.tsx b/src/plugins/bookPlayer/BookOsd/BookOsd.tsx index 9df50dc9b8..2374aba272 100644 --- a/src/plugins/bookPlayer/BookOsd/BookOsd.tsx +++ b/src/plugins/bookPlayer/BookOsd/BookOsd.tsx @@ -3,9 +3,11 @@ import React, { type FC, useCallback, useState } from 'react'; import './BookOsd.scss'; import IconButton from '../../../elements/emby-button/IconButton'; import globalize from 'lib/globalize'; +import * as userSettings from '../../../scripts/settings/userSettings'; +import type { BaseItemDto } from '@jellyfin/sdk/lib/generated-client'; interface BookOsdProps { - title: string; + item: BaseItemDto; onExit: () => void; onPrevious: () => void; onNext: () => void; @@ -13,11 +15,18 @@ interface BookOsdProps { onRotateTheme?: () => void; onDecreaseFontSize?: () => void; onIncreaseFontSize?: () => void; + onToggleDirection?: () => void; + onToggleLayout?: () => void; onToggleFullscreen?: () => void; } +interface ComicsPlayerSettings { + langDir?: string; + pagesPerView?: number; +} + const BookOsd: FC = ({ - title, + item, onExit, onPrevious, onNext, @@ -25,10 +34,26 @@ const BookOsd: FC = ({ onRotateTheme, onDecreaseFontSize, onIncreaseFontSize, + onToggleDirection, + onToggleLayout, onToggleFullscreen }) => { + const settings = userSettings.getComicsPlayerSettings(item.Id!) as ComicsPlayerSettings; + + const [direction, setDirection] = useState(settings.langDir === 'rtl'); + const [layout, setLayout] = useState(settings.pagesPerView === 1); const [fullscreen, setFullscreen] = useState(false); + const onClickDirection = useCallback(() => { + onToggleDirection?.(); + setDirection(state => !state); + }, [onToggleDirection]); + + const onClickLayout = useCallback(() => { + onToggleLayout?.(); + setLayout(state => !state); + }, [onToggleLayout]); + const onClickFullscreen = useCallback(() => { onToggleFullscreen?.(); setFullscreen(state => !state); @@ -38,19 +63,19 @@ const BookOsd: FC = ({
- {title} + {item.Name}
+
{onOpenTableOfContents && ( )} @@ -78,6 +103,22 @@ const BookOsd: FC = ({ /> )} + {onToggleDirection && ( + + )} + + {onToggleLayout && ( + + )} + {onToggleFullscreen && ( { + onDirChanged() { let langDir = this.comicsPlayerSettings.langDir; if (!langDir || langDir === 'ltr') { @@ -112,26 +122,16 @@ export class ComicsPlayer { this.changeLanguageDirection(langDir); this.comicsPlayerSettings.langDir = langDir; - }; + } changeLanguageDirection(langDir) { const currentPage = this.currentPage; this.swiperInstance.changeLanguageDirection(langDir); - - const prevIcon = langDir === 'ltr' ? 'arrow_circle_left' : 'arrow_circle_right'; - this.mediaElement.querySelector('.btnToggleLangDir > span').classList.remove(prevIcon); - - const newIcon = langDir === 'ltr' ? 'arrow_circle_right' : 'arrow_circle_left'; - this.mediaElement.querySelector('.btnToggleLangDir > span').classList.add(newIcon); - - const dirTitle = langDir === 'ltr' ? 'Right To Left' : 'Left To Right'; - this.mediaElement.querySelector('.btnToggleLangDir').title = dirTitle; - this.reload(currentPage); } - onViewChanged = () => { + onViewChanged() { let view = this.comicsPlayerSettings.pagesPerView; if (!view || view === 1) { @@ -143,7 +143,7 @@ export class ComicsPlayer { this.changeView(view); this.comicsPlayerSettings.pagesPerView = view; - }; + } changeView(view) { const currentPage = this.currentPage; @@ -151,15 +151,6 @@ export class ComicsPlayer { this.swiperInstance.params.slidesPerView = view; this.swiperInstance.params.slidesPerGroup = view; - const prevIcon = view === 1 ? 'devices_fold' : 'import_contacts'; - this.mediaElement.querySelector('.btnToggleView > span').classList.remove(prevIcon); - - const newIcon = view === 1 ? 'import_contacts' : 'devices_fold'; - this.mediaElement.querySelector('.btnToggleView > span').classList.add(newIcon); - - const viewTitle = view === 1 ? 'Double Page View' : 'Single Page View'; - this.mediaElement.querySelector('.btnToggleView').title = viewTitle; - this.reload(currentPage); } @@ -192,37 +183,17 @@ export class ComicsPlayer { } } - bindMediaElementEvents() { - const elem = this.mediaElement; - - elem?.addEventListener('close', this.onDialogClosed, { once: true }); - elem?.querySelector('.btnExit').addEventListener('click', this.onDialogClosed, { once: true }); - elem?.querySelector('.btnToggleLangDir').addEventListener('click', this.onDirChanged); - elem?.querySelector('.btnToggleView').addEventListener('click', this.onViewChanged); - } - bindEvents() { - this.bindMediaElementEvents(); - + this.mediaElement?.addEventListener('close', this.onDialogClosed, { once: true }); document.addEventListener('keydown', this.onWindowKeyDown); } - unbindMediaElementEvents() { - const elem = this.mediaElement; - - elem?.removeEventListener('close', this.onDialogClosed); - elem?.querySelector('.btnExit').removeEventListener('click', this.onDialogClosed); - elem?.querySelector('.btnToggleLangDir').removeEventListener('click', this.onDirChanged); - elem?.querySelector('.btnToggleView').removeEventListener('click', this.onViewChanged); - } - unbindEvents() { - this.unbindMediaElementEvents(); - + this.mediaElement?.removeEventListener('close', this.onDialogClosed); document.removeEventListener('keydown', this.onWindowKeyDown); } - createMediaElement() { + createMediaElement(options) { let elem = this.mediaElement; if (elem) { return elem; @@ -239,39 +210,25 @@ export class ComicsPlayer { removeOnClose: true }); - const viewIcon = this.comicsPlayerSettings.pagesPerView === 1 ? 'import_contacts' : 'devices_fold'; - const dirIcon = this.comicsPlayerSettings.langDir === 'ltr' ? 'arrow_circle_right' : 'arrow_circle_left'; - elem.id = 'comicsPlayer'; elem.classList.add('slideshowDialog'); - elem.innerHTML = `
+ elem.innerHTML = `
-
-
-
-
- - -
`; dialogHelper.open(elem); } this.mediaElement = elem; - - const dirTitle = this.comicsPlayerSettings.langDir === 'ltr' ? 'Right To Left' : 'Left To Right'; - this.mediaElement.querySelector('.btnToggleLangDir').title = dirTitle; - - const viewTitle = this.comicsPlayerSettings.pagesPerView === 1 ? 'Double Page View' : 'Single Page View'; - this.mediaElement.querySelector('.btnToggleView').title = viewTitle; + this.unmountBookOsd = renderComponent(BookOsd, { + item: options.items[0], + onExit: this.onDialogClosed, + onPrevious: this.previous, + onNext: this.next, + onToggleDirection: this.onDirChanged, + onToggleLayout: this.onViewChanged + }, elem.querySelector('#bookOsdMount')); this.bindEvents(); return elem; @@ -329,10 +286,6 @@ export class ComicsPlayer { slidesPerGroup: this.comicsPlayerSettings.pagesPerView, slidesPerColumn: 1, initialSlide: this.currentPage, - navigation: { - nextEl: '.swiper-button-next', - prevEl: '.swiper-button-prev' - }, pagination: { el: '.swiper-pagination', clickable: true, @@ -356,6 +309,14 @@ export class ComicsPlayer { }); } + next() { + this.swiperInstance?.slideNext(); + } + + previous() { + this.swiperInstance?.slidePrev(); + } + getImgFromUrl(url) { return `
diff --git a/src/plugins/comicsPlayer/style.scss b/src/plugins/comicsPlayer/style.scss index 3061950cdc..5c832f33a0 100644 --- a/src/plugins/comicsPlayer/style.scss +++ b/src/plugins/comicsPlayer/style.scss @@ -2,7 +2,9 @@ background: #fff; .slideshowSwiperContainer { - height: 100%; + position: relative; + top: 5vh; + height: 90vh; } .slider-zoom-container { @@ -27,16 +29,4 @@ transform: translate(-50%, 0%); text-shadow: 0 0 20px #fff; } - - .actionButtons { - right: 0.5vh; - top: 0.5vh; - z-index: 1002; - position: absolute; - } - - .actionButtonIcon { - color: #000; - opacity: 0.7; - } } diff --git a/src/plugins/pdfPlayer/plugin.js b/src/plugins/pdfPlayer/plugin.js index 9f6925234e..7235e0ddc2 100644 --- a/src/plugins/pdfPlayer/plugin.js +++ b/src/plugins/pdfPlayer/plugin.js @@ -10,9 +10,11 @@ import dom from '../../utils/dom'; import { appRouter } from '../../components/router/appRouter'; import { ServerConnections } from 'lib/jellyfin-apiclient'; import Events from '../../utils/events.ts'; +import BookOsd from '../bookPlayer/BookOsd/BookOsd'; +import { renderComponent } from '../../utils/reactUtils'; +import 'material-design-icons-iconfont'; import './style.scss'; -import '../../elements/emby-button/paper-icon-button-light'; export class PdfPlayer { constructor() { @@ -21,6 +23,9 @@ export class PdfPlayer { this.id = 'pdfplayer'; this.priority = 1; + this.previous = this.previous.bind(this); + this.next = this.next.bind(this); + this.onDialogClosed = this.onDialogClosed.bind(this); this.onWindowKeyDown = this.onWindowKeyDown.bind(this); this.onTouchStart = this.onTouchStart.bind(this); @@ -34,12 +39,13 @@ export class PdfPlayer { loading.show(); - const elem = this.createMediaElement(); + const elem = this.createMediaElement(options); return this.setCurrentSrc(elem, options); } stop() { this.unbindEvents(); + this.unmountBookOsd?.(); const stopInfo = { src: this.item @@ -133,37 +139,19 @@ export class PdfPlayer { this.stop(); } - bindMediaElementEvents() { - const elem = this.mediaElement; - - elem.addEventListener('close', this.onDialogClosed, { once: true }); - elem.querySelector('.btnExit').addEventListener('click', this.onDialogClosed, { once: true }); - } - bindEvents() { - this.bindMediaElementEvents(); - + this.mediaElement?.addEventListener('close', this.onDialogClosed, { once: true }); document.addEventListener('keydown', this.onWindowKeyDown); document.addEventListener('touchstart', this.onTouchStart); } - unbindMediaElementEvents() { - const elem = this.mediaElement; - - elem.removeEventListener('close', this.onDialogClosed); - elem.querySelector('.btnExit').removeEventListener('click', this.onDialogClosed); - } - unbindEvents() { - if (this.mediaElement) { - this.unbindMediaElementEvents(); - } - + this.mediaElement?.removeEventListener('close', this.onDialogClosed); document.removeEventListener('keydown', this.onWindowKeyDown); document.removeEventListener('touchstart', this.onTouchStart); } - createMediaElement() { + createMediaElement(options) { let elem = this.mediaElement; if (elem) { return elem; @@ -180,19 +168,20 @@ export class PdfPlayer { removeOnClose: true }); - let html = ''; - html += ''; - html += '
'; - html += ''; - html += '
'; - elem.id = 'pdfPlayer'; - elem.innerHTML = html; + elem.innerHTML = '
'; dialogHelper.open(elem); } this.mediaElement = elem; + this.unmountBookOsd = renderComponent(BookOsd, { + item: options.items[0], + onExit: this.onDialogClosed, + onPrevious: this.previous, + onNext: this.next + }, elem.querySelector('#bookOsdMount')); + return elem; } @@ -254,13 +243,6 @@ export class PdfPlayer { Events.trigger(this, 'pause'); } - replaceCanvas(canvas) { - const old = document.getElementById('canvas'); - - canvas.id = 'canvas'; - old.parentNode.replaceChild(canvas, old); - } - loadPage(number) { const prefix = 'page'; const pad = 2; @@ -277,11 +259,13 @@ export class PdfPlayer { if (!this.pages[page]) { this.pages[page] = document.createElement('canvas'); this.renderPage(this.pages[page], parseInt(page.slice(4), 10)); + + this.pages[page].id = 'canvas'; } } // show the requested page - this.replaceCanvas(this.pages[prefix + number], number); + document.querySelector('#canvas')?.replaceWith(this.pages[prefix + number]); // delete all pages outside the cache area for (const page in this.pages) { @@ -294,21 +278,14 @@ export class PdfPlayer { renderPage(canvas, number) { const devicePixelRatio = window.devicePixelRatio || 1; this.book.getPage(number).then(page => { + const current = document.querySelector('#canvas'); const original = page.getViewport({ scale: 1 }); - const scale = Math.min((window.innerHeight / original.height), (window.innerWidth / original.width)) * devicePixelRatio; + const scale = Math.min((current.clientHeight / original.height), (current.clientWidth / original.width)) * devicePixelRatio; const viewport = page.getViewport({ scale }); canvas.width = viewport.width; canvas.height = viewport.height; - if (window.innerWidth < window.innerHeight) { - canvas.style.width = '100%'; - canvas.style.height = 'auto'; - } else { - canvas.style.height = '100%'; - canvas.style.width = 'auto'; - } - const context = canvas.getContext('2d'); const renderContext = { diff --git a/src/plugins/pdfPlayer/style.scss b/src/plugins/pdfPlayer/style.scss index 29c5c7d543..d76dd8cc91 100644 --- a/src/plugins/pdfPlayer/style.scss +++ b/src/plugins/pdfPlayer/style.scss @@ -7,19 +7,10 @@ background: #fff; #canvas { + position: relative; + top: 5vh; + height: 90vh; display: block; margin: auto; } - - .actionButtons { - right: 0.5vh; - top: 0.5vh; - z-index: 1002; - position: absolute; - } - - .actionButtonIcon { - color: #000; - opacity: 0.7; - } } diff --git a/src/scripts/settings/userSettings.js b/src/scripts/settings/userSettings.js index 9a3b4f68ed..563268d787 100644 --- a/src/scripts/settings/userSettings.js +++ b/src/scripts/settings/userSettings.js @@ -667,7 +667,7 @@ export class UserSettings { */ getComicsPlayerSettings(mediaSourceId) { const settings = JSON.parse(this.get('comicsPlayerSettings', false) || '{}'); - return Object.assign(defaultComicsPlayerSettings, settings[mediaSourceId]); + return Object.assign({}, defaultComicsPlayerSettings, settings[mediaSourceId]); } /** diff --git a/src/themes/_base/_theme.scss b/src/themes/_base/_theme.scss index 25d4107843..eaeb98bf27 100644 --- a/src/themes/_base/_theme.scss +++ b/src/themes/_base/_theme.scss @@ -507,12 +507,6 @@ a[data-role=button], color: var(--jf-palette-text-primary, $text-primary); } -#bookPlayer .bookOsdRow, -#comicsPlayer .actionButtonIcon, -#pdfPlayer .actionButtonIcon { - color: var(--jf-palette-text-primary, $text-primary); -} - #dialogToc { background-color: var(--jf-palette-background-default, $background-default); } From a75cac291a875361e171c2818acbb5f0def73deb Mon Sep 17 00:00:00 2001 From: theguymadmax Date: Wed, 1 Jul 2026 16:45:36 -0400 Subject: [PATCH 006/287] make sortby an array --- .../libraries/components/ItemsView.tsx | 4 +- .../libraries/components/SortButton.tsx | 200 +++++++++--------- .../features/libraries/utils/settings.ts | 6 +- src/hooks/useFetchItems.ts | 10 +- src/types/library.ts | 2 +- 5 files changed, 110 insertions(+), 112 deletions(-) diff --git a/src/apps/modern/features/libraries/components/ItemsView.tsx b/src/apps/modern/features/libraries/components/ItemsView.tsx index 5f3f5f8979..613feda79c 100644 --- a/src/apps/modern/features/libraries/components/ItemsView.tsx +++ b/src/apps/modern/features/libraries/components/ItemsView.tsx @@ -57,7 +57,7 @@ const ItemsView: FC = () => { listOptions.showArtist = true; listOptions.addToListButton = true; } else if (viewType === LibraryTab.Albums) { - listOptions.sortBy = libraryViewSettings.SortBy; + listOptions.sortBy = libraryViewSettings.SortBy[0]; listOptions.addToListButton = true; } else if (viewType === LibraryTab.Episodes) { listOptions.showParentTitle = true; @@ -171,7 +171,7 @@ const ItemsView: FC = () => { noItemsMessage ]); - const hasSortName = libraryViewSettings.SortBy !== ItemSortBy.Random; + const hasSortName = libraryViewSettings.SortBy[0] !== ItemSortBy.Random; const itemsContainerClass = classNames( 'padded-left padded-right', diff --git a/src/apps/modern/features/libraries/components/SortButton.tsx b/src/apps/modern/features/libraries/components/SortButton.tsx index 5b99aee1e6..31f6224a55 100644 --- a/src/apps/modern/features/libraries/components/SortButton.tsx +++ b/src/apps/modern/features/libraries/components/SortButton.tsx @@ -17,49 +17,49 @@ import { LibraryTab } from 'types/libraryTab'; type SortOption = { label: string; - value: ItemSortBy; + value: ItemSortBy[]; }; type SortOptionsMapping = Record; const collectionMovieOptions: SortOption[] = [ - { label: 'Name', value: ItemSortBy.SortName }, - { label: 'OptionRandom', value: ItemSortBy.Random }, - { label: 'OptionCommunityRating', value: ItemSortBy.CommunityRating }, - { label: 'OptionDateAdded', value: ItemSortBy.DateCreated }, - { label: 'OptionParentalRating', value: ItemSortBy.OfficialRating }, - { label: 'OptionReleaseDate', value: ItemSortBy.PremiereDate } + { label: 'Name', value: [ItemSortBy.SortName] }, + { label: 'OptionRandom', value: [ItemSortBy.Random] }, + { label: 'OptionCommunityRating', value: [ItemSortBy.CommunityRating, ItemSortBy.SortName] }, + { label: 'OptionDateAdded', value: [ItemSortBy.DateCreated, ItemSortBy.SortName] }, + { label: 'OptionParentalRating', value: [ItemSortBy.OfficialRating, ItemSortBy.SortName] }, + { label: 'OptionReleaseDate', value: [ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName] } ]; const movieOrFavoriteOptions = [ - { label: 'Name', value: ItemSortBy.SortName }, - { label: 'OptionRandom', value: ItemSortBy.Random }, - { label: 'OptionCommunityRating', value: ItemSortBy.CommunityRating }, - { label: 'OptionCriticRating', value: ItemSortBy.CriticRating }, - { label: 'OptionDateAdded', value: ItemSortBy.DateCreated }, - { label: 'OptionDatePlayed', value: ItemSortBy.DatePlayed }, - { label: 'OptionParentalRating', value: ItemSortBy.OfficialRating }, - { label: 'OptionPlayCount', value: ItemSortBy.PlayCount }, - { label: 'OptionReleaseDate', value: ItemSortBy.PremiereDate }, - { label: 'Runtime', value: ItemSortBy.Runtime } + { label: 'Name', value: [ItemSortBy.SortName] }, + { label: 'OptionRandom', value: [ItemSortBy.Random] }, + { label: 'OptionCommunityRating', value: [ItemSortBy.CommunityRating, ItemSortBy.SortName] }, + { label: 'OptionCriticRating', value: [ItemSortBy.CriticRating, ItemSortBy.SortName] }, + { label: 'OptionDateAdded', value: [ItemSortBy.DateCreated, ItemSortBy.SortName] }, + { label: 'OptionDatePlayed', value: [ItemSortBy.DatePlayed, ItemSortBy.SortName] }, + { label: 'OptionParentalRating', value: [ItemSortBy.OfficialRating, ItemSortBy.SortName] }, + { label: 'OptionPlayCount', value: [ItemSortBy.PlayCount, ItemSortBy.SortName] }, + { label: 'OptionReleaseDate', value: [ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName] }, + { label: 'Runtime', value: [ItemSortBy.Runtime, ItemSortBy.SortName] } ]; const photosOrPhotoAlbumsOptions = [ - { label: 'Name', value: ItemSortBy.SortName }, - { label: 'OptionRandom', value: ItemSortBy.Random }, - { label: 'OptionDateAdded', value: ItemSortBy.DateCreated } + { label: 'Name', value: [ItemSortBy.SortName] }, + { label: 'OptionRandom', value: [ItemSortBy.Random] }, + { label: 'OptionDateAdded', value: [ItemSortBy.DateCreated, ItemSortBy.SortName] } ]; const videoOrMusicVideoOptions = [ - { label: 'Name', value: ItemSortBy.SortName }, - { label: 'OptionRandom', value: ItemSortBy.Random }, - { label: 'OptionCommunityRating', value: ItemSortBy.CommunityRating }, - { label: 'OptionDateAdded', value: ItemSortBy.DateCreated }, - { label: 'OptionDatePlayed', value: ItemSortBy.DatePlayed }, - { label: 'OptionParentalRating', value: ItemSortBy.OfficialRating }, - { label: 'OptionPlayCount', value: ItemSortBy.PlayCount }, - { label: 'OptionReleaseDate', value: ItemSortBy.PremiereDate }, - { label: 'Runtime', value: ItemSortBy.Runtime } + { label: 'Name', value: [ItemSortBy.SortName] }, + { label: 'OptionRandom', value: [ItemSortBy.Random] }, + { label: 'OptionCommunityRating', value: [ItemSortBy.CommunityRating, ItemSortBy.SortName] }, + { label: 'OptionDateAdded', value: [ItemSortBy.DateCreated, ItemSortBy.SortName] }, + { label: 'OptionDatePlayed', value: [ItemSortBy.DatePlayed, ItemSortBy.SortName] }, + { label: 'OptionParentalRating', value: [ItemSortBy.OfficialRating, ItemSortBy.SortName] }, + { label: 'OptionPlayCount', value: [ItemSortBy.PlayCount, ItemSortBy.SortName] }, + { label: 'OptionReleaseDate', value: [ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName] }, + { label: 'Runtime', value: [ItemSortBy.Runtime, ItemSortBy.SortName] } ]; const sortOptionsMapping: SortOptionsMapping = { @@ -67,91 +67,91 @@ const sortOptionsMapping: SortOptionsMapping = { [LibraryTab.Collections]: collectionMovieOptions, [LibraryTab.Favorites]: movieOrFavoriteOptions, [LibraryTab.Series]: [ - { label: 'Name', value: ItemSortBy.SortName }, - { label: 'OptionRandom', value: ItemSortBy.Random }, - { label: 'OptionCommunityRating', value: ItemSortBy.CommunityRating }, - { label: 'OptionDateShowAdded', value: ItemSortBy.DateCreated }, - { label: 'OptionDateEpisodeAdded', value: ItemSortBy.DateLastContentAdded }, - { label: 'OptionDatePlayed', value: ItemSortBy.SeriesDatePlayed }, - { label: 'OptionParentalRating', value: ItemSortBy.OfficialRating }, - { label: 'OptionReleaseDate', value: ItemSortBy.PremiereDate } + { label: 'Name', value: [ItemSortBy.SortName] }, + { label: 'OptionRandom', value: [ItemSortBy.Random] }, + { label: 'OptionCommunityRating', value: [ItemSortBy.CommunityRating, ItemSortBy.SortName] }, + { label: 'OptionDateShowAdded', value: [ItemSortBy.DateCreated, ItemSortBy.SortName] }, + { label: 'OptionDateEpisodeAdded', value: [ItemSortBy.DateLastContentAdded, ItemSortBy.SortName] }, + { label: 'OptionDatePlayed', value: [ItemSortBy.SeriesDatePlayed, ItemSortBy.SortName] }, + { label: 'OptionParentalRating', value: [ItemSortBy.OfficialRating, ItemSortBy.SortName] }, + { label: 'OptionReleaseDate', value: [ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName] } ], [LibraryTab.Episodes]: [ - { label: 'Name', value: ItemSortBy.SeriesSortName }, - { label: 'OptionRandom', value: ItemSortBy.Random }, - { label: 'OptionCommunityRating', value: ItemSortBy.CommunityRating }, - { label: 'OptionDateAdded', value: ItemSortBy.DateCreated }, - { label: 'OptionReleaseDate', value: ItemSortBy.PremiereDate }, - { label: 'OptionDatePlayed', value: ItemSortBy.DatePlayed }, - { label: 'OptionParentalRating', value: ItemSortBy.OfficialRating }, - { label: 'OptionPlayCount', value: ItemSortBy.PlayCount }, - { label: 'Runtime', value: ItemSortBy.Runtime } + { label: 'Name', value: [ItemSortBy.SeriesSortName] }, + { label: 'OptionRandom', value: [ItemSortBy.Random] }, + { label: 'OptionCommunityRating', value: [ItemSortBy.CommunityRating, ItemSortBy.SortName] }, + { label: 'OptionDateAdded', value: [ItemSortBy.DateCreated, ItemSortBy.SortName] }, + { label: 'OptionReleaseDate', value: [ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName] }, + { label: 'OptionDatePlayed', value: [ItemSortBy.DatePlayed, ItemSortBy.SortName] }, + { label: 'OptionParentalRating', value: [ItemSortBy.OfficialRating, ItemSortBy.SortName] }, + { label: 'OptionPlayCount', value: [ItemSortBy.PlayCount, ItemSortBy.SortName] }, + { label: 'Runtime', value: [ItemSortBy.Runtime, ItemSortBy.SortName] } ], [LibraryTab.Albums]: [ - { label: 'Name', value: ItemSortBy.SortName }, - { label: 'OptionRandom', value: ItemSortBy.Random }, - { label: 'AlbumArtist', value: ItemSortBy.AlbumArtist }, - { label: 'OptionCommunityRating', value: ItemSortBy.CommunityRating }, - { label: 'OptionCriticRating', value: ItemSortBy.CriticRating }, - { label: 'OptionReleaseDate', value: ItemSortBy.ProductionYear }, - { label: 'OptionDateAdded', value: ItemSortBy.DateCreated } + { label: 'Name', value: [ItemSortBy.SortName] }, + { label: 'OptionRandom', value: [ItemSortBy.Random] }, + { label: 'AlbumArtist', value: [ItemSortBy.AlbumArtist, ItemSortBy.SortName] }, + { label: 'OptionCommunityRating', value: [ItemSortBy.CommunityRating, ItemSortBy.SortName] }, + { label: 'OptionCriticRating', value: [ItemSortBy.CriticRating, ItemSortBy.SortName] }, + { label: 'OptionReleaseDate', value: [ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName] }, + { label: 'OptionDateAdded', value: [ItemSortBy.DateCreated, ItemSortBy.SortName] } ], [LibraryTab.Books]: [ - { label: 'Name', value: ItemSortBy.SortName }, - { label: 'OptionRandom', value: ItemSortBy.Random }, - { label: 'OptionReleaseDate', value: ItemSortBy.ProductionYear }, - { label: 'OptionDateAdded', value: ItemSortBy.DateCreated }, - { label: 'OptionDatePlayed', value: ItemSortBy.DatePlayed }, - { label: 'IndexNumber', value: ItemSortBy.IndexNumber } + { label: 'Name', value: [ItemSortBy.SortName] }, + { label: 'OptionRandom', value: [ItemSortBy.Random] }, + { label: 'OptionReleaseDate', value: [ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName] }, + { label: 'OptionDateAdded', value: [ItemSortBy.DateCreated, ItemSortBy.SortName] }, + { label: 'OptionDatePlayed', value: [ItemSortBy.DatePlayed, ItemSortBy.SortName] }, + { label: 'IndexNumber', value: [ItemSortBy.IndexNumber, ItemSortBy.SortName] } ], [LibraryTab.Songs]: [ - { label: 'Name', value: ItemSortBy.SortName }, - { label: 'OptionRandom', value: ItemSortBy.Random }, - { label: 'Album', value: ItemSortBy.Album }, - { label: 'AlbumArtist', value: ItemSortBy.AlbumArtist }, - { label: 'Artist', value: ItemSortBy.Artist }, - { label: 'OptionDateAdded', value: ItemSortBy.DateCreated }, - { label: 'OptionDatePlayed', value: ItemSortBy.DatePlayed }, - { label: 'OptionPlayCount', value: ItemSortBy.PlayCount }, - { label: 'OptionReleaseDate', value: ItemSortBy.PremiereDate }, - { label: 'Runtime', value: ItemSortBy.Runtime } + { label: 'Name', value: [ItemSortBy.SortName] }, + { label: 'OptionRandom', value: [ItemSortBy.Random] }, + { label: 'Album', value: [ItemSortBy.Album, ItemSortBy.SortName] }, + { label: 'AlbumArtist', value: [ItemSortBy.AlbumArtist, ItemSortBy.SortName] }, + { label: 'Artist', value: [ItemSortBy.Artist, ItemSortBy.SortName] }, + { label: 'OptionDateAdded', value: [ItemSortBy.DateCreated, ItemSortBy.SortName] }, + { label: 'OptionDatePlayed', value: [ItemSortBy.DatePlayed, ItemSortBy.SortName] }, + { label: 'OptionPlayCount', value: [ItemSortBy.PlayCount, ItemSortBy.SortName] }, + { label: 'OptionReleaseDate', value: [ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName] }, + { label: 'Runtime', value: [ItemSortBy.Runtime, ItemSortBy.SortName] } ], [LibraryTab.Playlists]: [ - { label: 'Name', value: ItemSortBy.SortName }, - { label: 'OptionRandom', value: ItemSortBy.Random }, - { label: 'OptionDateAdded', value: ItemSortBy.DateCreated }, - { label: 'OptionDatePlaylistUpdated', value: ItemSortBy.DateLastContentAdded }, - { label: 'OptionReleaseDate', value: ItemSortBy.PremiereDate }, - { label: 'Runtime', value: ItemSortBy.Runtime } + { label: 'Name', value: [ItemSortBy.SortName] }, + { label: 'OptionRandom', value: [ItemSortBy.Random] }, + { label: 'OptionDateAdded', value: [ItemSortBy.DateCreated, ItemSortBy.SortName] }, + { label: 'OptionDatePlaylistUpdated', value: [ItemSortBy.DateLastContentAdded, ItemSortBy.SortName] }, + { label: 'OptionReleaseDate', value: [ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName] }, + { label: 'Runtime', value: [ItemSortBy.Runtime, ItemSortBy.SortName] } ], [LibraryTab.PhotoAlbums]: photosOrPhotoAlbumsOptions, [LibraryTab.Photos]: photosOrPhotoAlbumsOptions, [LibraryTab.Videos]:videoOrMusicVideoOptions, [LibraryTab.MusicVideos]:videoOrMusicVideoOptions, [LibraryTab.Folders]: [ - { label: 'Name', value: ItemSortBy.SortName }, - { label: 'OptionRandom', value: ItemSortBy.Random }, - { label: 'OptionCommunityRating', value: ItemSortBy.CommunityRating }, - { label: 'OptionDateAdded', value: ItemSortBy.DateCreated }, - { label: 'OptionDatePlayed', value: ItemSortBy.DatePlayed }, - { label: 'Folders', value: ItemSortBy.IsFolder }, - { label: 'OptionParentalRating', value: ItemSortBy.OfficialRating }, - { label: 'OptionPlayCount', value: ItemSortBy.PlayCount }, - { label: 'OptionReleaseDate', value: ItemSortBy.PremiereDate }, - { label: 'Runtime', value: ItemSortBy.Runtime } + { label: 'Name', value: [ItemSortBy.SortName] }, + { label: 'OptionRandom', value: [ItemSortBy.Random] }, + { label: 'OptionCommunityRating', value: [ItemSortBy.CommunityRating, ItemSortBy.SortName] }, + { label: 'OptionDateAdded', value: [ItemSortBy.DateCreated, ItemSortBy.SortName] }, + { label: 'OptionDatePlayed', value: [ItemSortBy.DatePlayed, ItemSortBy.SortName] }, + { label: 'Folders', value: [ItemSortBy.IsFolder, ItemSortBy.SortName] }, + { label: 'OptionParentalRating', value: [ItemSortBy.OfficialRating, ItemSortBy.SortName] }, + { label: 'OptionPlayCount', value: [ItemSortBy.PlayCount, ItemSortBy.SortName] }, + { label: 'OptionReleaseDate', value: [ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName] }, + { label: 'Runtime', value: [ItemSortBy.Runtime, ItemSortBy.SortName] } ], [LibraryTab.Mixed]: [ - { label: 'Name', value: ItemSortBy.SortName }, - { label: 'OptionRandom', value: ItemSortBy.Random }, - { label: 'OptionCommunityRating', value: ItemSortBy.CommunityRating }, - { label: 'OptionCriticRating', value: ItemSortBy.CriticRating }, - { label: 'OptionDateAdded', value: ItemSortBy.DateCreated }, - { label: 'OptionDateEpisodeAdded', value: ItemSortBy.DateLastContentAdded }, - { label: 'OptionDatePlayed', value: ItemSortBy.DatePlayed }, - { label: 'OptionParentalRating', value: ItemSortBy.OfficialRating }, - { label: 'OptionPlayCount', value: ItemSortBy.PlayCount }, - { label: 'OptionReleaseDate', value: ItemSortBy.PremiereDate }, - { label: 'Runtime', value: ItemSortBy.Runtime } + { label: 'Name', value: [ItemSortBy.SortName] }, + { label: 'OptionRandom', value: [ItemSortBy.Random] }, + { label: 'OptionCommunityRating', value: [ItemSortBy.CommunityRating, ItemSortBy.SortName] }, + { label: 'OptionCriticRating', value: [ItemSortBy.CriticRating, ItemSortBy.SortName] }, + { label: 'OptionDateAdded', value: [ItemSortBy.DateCreated, ItemSortBy.SortName] }, + { label: 'OptionDateEpisodeAdded', value: [ItemSortBy.DateLastContentAdded, ItemSortBy.SortName] }, + { label: 'OptionDatePlayed', value: [ItemSortBy.DatePlayed, ItemSortBy.SortName] }, + { label: 'OptionParentalRating', value: [ItemSortBy.OfficialRating, ItemSortBy.SortName] }, + { label: 'OptionPlayCount', value: [ItemSortBy.PlayCount, ItemSortBy.SortName] }, + { label: 'OptionReleaseDate', value: [ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName] }, + { label: 'Runtime', value: [ItemSortBy.Runtime, ItemSortBy.SortName] } ] }; @@ -186,11 +186,11 @@ const SortButton: FC = ({ }, []); const onMenuItemClick = useCallback( - (sortBy: ItemSortBy) => { + (sortBy: ItemSortBy[]) => { setLibraryViewSettings((prevState) => { let sortOrder: SortOrder = SortOrder.Ascending; // If the user clicks the currently selected sort option, toggle the sort order - if (prevState.SortBy === sortBy) { + if (prevState.SortBy[0] === sortBy[0]) { sortOrder = prevState.SortOrder === SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending; } @@ -235,7 +235,7 @@ const SortButton: FC = ({ {sortMenuOptions .map((option) => ( onMenuItemClick(option.value)} > @@ -243,7 +243,7 @@ const SortButton: FC = ({ {globalize.translate(option.label)} - {libraryViewSettings.SortBy === option.value && ( + {libraryViewSettings.SortBy[0] === option.value[0] && ( libraryViewSettings.SortOrder === SortOrder.Ascending ? ( ) : ( diff --git a/src/apps/modern/features/libraries/utils/settings.ts b/src/apps/modern/features/libraries/utils/settings.ts index 79eae16e3e..d379b8fcb7 100644 --- a/src/apps/modern/features/libraries/utils/settings.ts +++ b/src/apps/modern/features/libraries/utils/settings.ts @@ -6,12 +6,12 @@ import { SortOrder } from '@jellyfin/sdk/lib/generated-client/models/sort-order' import { type ParentId, ViewMode, type LibraryViewSettings } from 'types/library'; import { LibraryTab } from 'types/libraryTab'; -export const getDefaultSortBy = (viewType: LibraryTab) => { +export const getDefaultSortBy = (viewType: LibraryTab): ItemSortBy[] => { if (viewType === LibraryTab.Episodes) { - return ItemSortBy.SeriesSortName; + return [ItemSortBy.SeriesSortName]; } - return ItemSortBy.SortName; + return [ItemSortBy.SortName]; }; export const getDefaultLibraryViewSettings = (viewType: LibraryTab): LibraryViewSettings => { diff --git a/src/hooks/useFetchItems.ts b/src/hooks/useFetchItems.ts index 38dd298cb3..b242527872 100644 --- a/src/hooks/useFetchItems.ts +++ b/src/hooks/useFetchItems.ts @@ -245,7 +245,7 @@ const fetchGetItemsViewByType = async ( ...getFiltersQuery(viewType, libraryViewSettings), ...getLimitQuery(), ...getAlphaPickerQuery(libraryViewSettings), - sortBy: [libraryViewSettings.SortBy], + sortBy: libraryViewSettings.SortBy, sortOrder: [libraryViewSettings.SortOrder], includeItemTypes: itemType, startIndex: libraryViewSettings.StartIndex @@ -266,7 +266,7 @@ const fetchGetItemsViewByType = async ( ...getFiltersQuery(viewType, libraryViewSettings), ...getLimitQuery(), ...getAlphaPickerQuery(libraryViewSettings), - sortBy: [libraryViewSettings.SortBy], + sortBy: libraryViewSettings.SortBy, sortOrder: [libraryViewSettings.SortOrder], includeItemTypes: itemType, startIndex: libraryViewSettings.StartIndex @@ -341,9 +341,7 @@ const fetchGetItemsViewByType = async ( ...getFiltersQuery(viewType, libraryViewSettings), ...getLimitQuery(), ...getAlphaPickerQuery(libraryViewSettings), - sortBy: libraryViewSettings.SortBy === ItemSortBy.IsFolder ? - [ItemSortBy.IsFolder, ItemSortBy.SortName] : - [libraryViewSettings.SortBy], + sortBy: libraryViewSettings.SortBy, sortOrder: [libraryViewSettings.SortOrder], includeItemTypes: itemType, startIndex: libraryViewSettings.StartIndex @@ -378,7 +376,7 @@ const fetchGetItemsViewByType = async ( ...getLimitQuery(), ...getAlphaPickerQuery(libraryViewSettings), isFavorite: viewType === LibraryTab.Favorites ? true : undefined, - sortBy: [libraryViewSettings.SortBy], + sortBy: libraryViewSettings.SortBy, sortOrder: [libraryViewSettings.SortOrder], includeItemTypes: itemType, startIndex: libraryViewSettings.StartIndex diff --git a/src/types/library.ts b/src/types/library.ts index 8715151c77..cfd1f79d5a 100644 --- a/src/types/library.ts +++ b/src/types/library.ts @@ -53,7 +53,7 @@ export enum ViewMode { } export interface LibraryViewSettings { - SortBy: ItemSortBy; + SortBy: ItemSortBy[]; SortOrder: SortOrder; StartIndex: number; CardLayout: boolean; From 8d6295e1dac07d2baa17ff3897e148609950873b Mon Sep 17 00:00:00 2001 From: Andi Chandler Date: Thu, 2 Jul 2026 22:30:58 -0400 Subject: [PATCH 007/287] Translated using Weblate (English (United Kingdom)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/en_GB/ --- src/strings/en-gb.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/en-gb.json b/src/strings/en-gb.json index dad1809132..3a6695f985 100644 --- a/src/strings/en-gb.json +++ b/src/strings/en-gb.json @@ -1923,5 +1923,7 @@ "VideoRotationNotSupported": "The video rotation is not supported", "ConfirmSplitMedia": "Are you sure you wish to split the media sources into separate items?", "HeaderSplitMedia": "Split Media Apart", - "Creators": "Creators" + "Creators": "Creators", + "IndexNumber": "Index Number", + "NoCastTargets": "No cast targets available" } From d5bfa28bc4adbcdd5d741619b0fd533092e41f44 Mon Sep 17 00:00:00 2001 From: wabisabi926 Date: Thu, 2 Jul 2026 21:57:05 -0400 Subject: [PATCH 008/287] Translated using Weblate (Chinese (Simplified Han script)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 260e53c9ce..893100e6ac 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -57,7 +57,7 @@ "ButtonEditOtherUserPreferences": "编辑此用户的用户配置,图片和个人参数。", "ButtonForgotPassword": "忘记密码", "ButtonFullscreen": "全屏", - "ButtonGotIt": "知道了", + "ButtonGotIt": "确定", "ButtonInfo": "详情", "ButtonLibraryAccess": "媒体库访问", "ButtonManualLogin": "手动登录", @@ -77,7 +77,7 @@ "ButtonSelectDirectory": "选择目录", "ButtonSelectView": "选择视图", "ButtonSend": "发送", - "ButtonShutdown": "关闭服务器", + "ButtonShutdown": "关闭", "ButtonSignIn": "登录", "ButtonSignOut": "退出", "ButtonStart": "开始", @@ -119,7 +119,7 @@ "DeleteUserConfirmation": "你确定要删除此用户?", "Descending": "降序", "Desktop": "桌面 (Legacy)", - "DetectingDevices": "正在侦测设备", + "DetectingDevices": "正在检测设备", "DeviceAccessHelp": "这仅适用于可以唯一标识的设备,而不会阻止浏览器访问。限制用户设备访问会阻止使用未在此被批准的新增设备。", "DirectPlaying": "直接播放", "DirectStreamHelp2": "直接串流占用的 CPU 资源通常取决于音频规格。只有视频流是无损的。", @@ -949,12 +949,12 @@ "XmlTvSportsCategoriesHelp": "这些类别的节目将显示为体育节目。用 \"|\" 分隔多个。", "Yes": "是", "Yesterday": "昨天", - "Absolute": "绝对顺序", + "Absolute": "绝对排序", "AnyLanguage": "任何语言", - "Art": "艺术图", + "Art": "透明艺术图", "AspectRatio": "长宽比", - "Box": "包装盒正面", - "BoxRear": "包装盒背面", + "Box": "盒装正面", + "BoxRear": "盒装背面", "ChannelNumber": "频道号码", "ColorSpace": "色彩空间", "Directors": "导演", @@ -1032,7 +1032,7 @@ "Smaller": "更小", "TagsValue": "标签:{0}", "Vertical": "垂直", - "Depressed": "凹陷", + "Depressed": "压抑", "Uniform": "轮廓", "GroupVersions": "按版本分组", "MusicAlbum": "音乐专辑", @@ -1058,8 +1058,8 @@ "LabelAudioBitrate": "比特率", "LabelAudioBitDepth": "采样位宽", "FetchingData": "获取额外数据", - "CopyStreamURLSuccess": "已成功复制URL地址。", - "CopyStreamURL": "复制串流URL地址", + "CopyStreamURLSuccess": "已成功复制 URL 地址。", + "CopyStreamURL": "复制串流 URL 地址", "ButtonAddImage": "添加图片", "LabelPlayer": "播放器", "LabelBaseUrl": "基础 URL", @@ -1247,7 +1247,7 @@ "LabelCurrentStatus": "当前状态", "KnownProxiesHelp": "填写已知连接 Jellyfin 时所经代理的 IP 或主机名(用逗号分隔)。此设置用于正确解析\"X-Forwarded-For\"请求头,确保客户端真实 IP 被识别。保存后需重启服务生效。", "EnableQuickConnect": "在此服务器上启用快速连接", - "ButtonUseQuickConnect": "使用Quick Connect", + "ButtonUseQuickConnect": "使用快速连接", "ButtonActivate": "启用", "Authorize": "授权", "EnableAutoCast": "设为默认", @@ -1334,7 +1334,7 @@ "UseEpisodeImagesInNextUp": "在“接下来”和“继续观看”模块中使用剧集图片", "LabelLocalCustomCss": "用于样式的自定义 CSS 代码,仅适用于此客户端。 您可能想要禁用服务器自定义 CSS 代码。", "LabelDisableCustomCss": "禁用服务器提供的主题/品牌的自定义 CSS 代码。", - "DisableCustomCss": "禁用服务器提供的自定义CSS", + "DisableCustomCss": "禁用服务器提供的自定义 CSS", "VideoLevelNotSupported": "视频级别不支持", "AudioProfileNotSupported": "音频配置不支持", "AudioBitDepthNotSupported": "音频位深不支持", @@ -1692,7 +1692,7 @@ "LabelSelectPreferredTranscodeVideoAudioCodec": "转码播放视频时首选的音频编码", "SelectPreferredTranscodeVideoAudioCodecHelp": "选择转码播放视频时首选的音频编码方式。如果首选的音频编码不被支持,服务器将使用下一个最佳的音频编码。", "Regional": "区域", - "AlternateDVD": "替换DVD", + "AlternateDVD": "替换 DVD", "Alternate": "替换", "LabelSelectPreferredTranscodeVideoCodec": "转码播放视频时首选的视频编码", "SelectPreferredTranscodeVideoCodecHelp": "选择转码播放时首选的视频编码方式。如果首选的视频编码不被支持,服务器将使用下一个最佳的视频编码。", @@ -1873,7 +1873,7 @@ "HeaderDeletePlaylist": "删除播放列表", "NewPlaylist": "新建播放列表", "OptionDatePlaylistUpdated": "播放列表更新时间", - "ApiKeysLoadError": "API密钥加载失败", + "ApiKeysLoadError": "API 密钥加载失败", "DevicesLoadError": "加载设备失败", "HeaderLatestBooks": "最近添加的书籍", "LabelInternalServerUri": "内部URI", @@ -1891,7 +1891,7 @@ "Watch": "开启日志跟踪", "TrickplayLoadError": "进度条预览图设置加载失败", "LabelExternalServerUriHelp": "用于外部访问的已发布服务器 URI。", - "ActivitiesLoadError": "活动加载失败", + "ActivitiesLoadError": "加载活动记录失败", "Authors": "作者", "LabelInternalServerUriHelp": "用于内部访问的已发布 URI。", "BrandingLoadError": "品牌设置加载失败", @@ -1924,5 +1924,6 @@ "ConfirmSplitMedia": "确定要将这些媒体源拆分为单独的项目吗?", "Creators": "主创人员", "HeaderSplitMedia": "拆分媒体", - "IndexNumber": "索引编号" + "IndexNumber": "索引编号", + "NoCastTargets": "无可用投屏设备" } From 8d339400949dbdb0dd2982a5b25cb199c0bb8054 Mon Sep 17 00:00:00 2001 From: Helak Date: Fri, 3 Jul 2026 05:01:28 -0400 Subject: [PATCH 009/287] Translated using Weblate (Czech) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/ --- src/strings/cs.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/cs.json b/src/strings/cs.json index b2f026811d..d40f29324d 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1924,5 +1924,6 @@ "ConfirmSplitMedia": "Opravdu chcete rozdělit zdroje médií na samostatné položky?", "HeaderSplitMedia": "Rozdělit média", "Creators": "Tvůrci", - "IndexNumber": "Indexové číslo" + "IndexNumber": "Indexové číslo", + "NoCastTargets": "Nejsou k dispozici žádné obrazovky" } From 2c4a70b574a5b5a1806956aba5cabfa9bf61cc18 Mon Sep 17 00:00:00 2001 From: hoanghuy309 Date: Fri, 3 Jul 2026 08:29:10 -0400 Subject: [PATCH 010/287] Translated using Weblate (Vietnamese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/ --- src/strings/vi.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/vi.json b/src/strings/vi.json index fb3c10c65d..0d7d3be800 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -1923,5 +1923,7 @@ "TableOfContents": "Mục Lục", "ConfirmSplitMedia": "Bạn có chắc chắn muốn tách các nguồn thông tin đa phương tiện thành các mục riêng biệt không?", "HeaderSplitMedia": "Tách Phương Tiện Riêng Biệt", - "Creators": "Người tạo" + "Creators": "Người tạo", + "IndexNumber": "Số Chỉ Mục", + "NoCastTargets": "Không có mục tiêu sử dụng" } From 07c1638a2f8bed3d650832aee6bb9845ec15ce6a Mon Sep 17 00:00:00 2001 From: Matias Date: Fri, 3 Jul 2026 13:11:06 -0400 Subject: [PATCH 011/287] Translated using Weblate (Portuguese (Brazil)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_BR/ --- src/strings/pt-br.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index dfc69ebda4..dd2af81eec 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -1923,5 +1923,7 @@ "StillWatchingPrompt": "Ainda procurando prompt", "StillWatchingOption": "{0} episódios ou {1} minutos", "HeaderBackupWarning": "CUIDADO: agendamento de tarefas em andamento", - "VideoRotationNotSupported": "A rotação de vídeo não é suportada" + "VideoRotationNotSupported": "A rotação de vídeo não é suportada", + "IndexNumber": "Número do índice", + "NoCastTargets": "Não há destinos de cast disponíveis" } From 4b13b3f58b41734f8c2c7ab6ebd57256fbb13625 Mon Sep 17 00:00:00 2001 From: Translation expert Date: Fri, 3 Jul 2026 17:26:51 -0400 Subject: [PATCH 012/287] Translated using Weblate (Arabic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ar/ --- src/strings/ar.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/ar.json b/src/strings/ar.json index 9294787f72..d55a7f310a 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -1923,5 +1923,7 @@ "TableOfContents": "جدول المحتويات", "HeaderSplitMedia": "تقسيم الوسائط منفصلة", "ConfirmSplitMedia": "هل انت متأكد من رغبتك في تقسيم مصادر الوسائط إلى عناصر منفصلة؟", - "Creators": "مكوّنين" + "Creators": "مكوّنين", + "IndexNumber": "رقم المؤشر", + "NoCastTargets": "لا اهداف بث متوفرة" } From 321371b310707c92a1481da12340ee85b97a5165 Mon Sep 17 00:00:00 2001 From: Ulrik Date: Sat, 4 Jul 2026 14:33:42 -0400 Subject: [PATCH 013/287] Translated using Weblate (Danish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/ --- src/strings/da.json | 84 +++++++++++++++++++++++---------------------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/src/strings/da.json b/src/strings/da.json index 201e1f986e..98b5cd885e 100644 --- a/src/strings/da.json +++ b/src/strings/da.json @@ -3,7 +3,7 @@ "Add": "Tilføj", "AddToCollection": "Tilføj til samling", "AddToPlayQueue": "Tilføj til afspilningskøen", - "AddToPlaylist": "Tilføj til en afspilningsliste", + "AddToPlaylist": "Tilføj til en playliste", "AddedOnValue": "Tilføjet {0}", "Alerts": "Advarsler", "All": "Alle", @@ -38,8 +38,8 @@ "ButtonBack": "Tilbage", "ButtonCancel": "Annuller", "ButtonChangeServer": "Skift server", - "ButtonEditOtherUserPreferences": "Rediger denne brugers profil, billede og personlige indstillinger.", - "ButtonForgotPassword": "Glemt Adgangskode", + "ButtonEditOtherUserPreferences": "Redigér denne brugers profil, billede og personlige indstillinger.", + "ButtonForgotPassword": "Glemt adgangskode", "ButtonFullscreen": "Fuld skærm", "ButtonGotIt": "Forstået", "ButtonLibraryAccess": "Biblioteksadgang", @@ -97,9 +97,9 @@ "DoNotRecord": "Optag ej", "Download": "Hent", "DrmChannelsNotImported": "Kanaler med DRM importeres ikke.", - "Edit": "Rediger", - "EditImages": "Rediger billeder", - "EditSubtitles": "Rediger undertekster", + "Edit": "Redigér", + "EditImages": "Redigér billeder", + "EditSubtitles": "Redigér undertekster", "EnableCinemaMode": "Biograftilstand", "EnableColorCodedBackgrounds": "Farvekodet baggrunde", "EnableHardwareEncoding": "Aktiver hardware indkoding", @@ -144,7 +144,7 @@ "HeaderActiveRecordings": "Aktive optagelser", "HeaderActivity": "Aktivitet", "HeaderAddToCollection": "Tilføj til samling", - "HeaderAddToPlaylist": "Tilføj til afspilningsliste", + "HeaderAddToPlaylist": "Tilføj til playliste", "HeaderAddUpdateImage": "Tilføj/opdater billede", "HeaderAdditionalParts": "Andre stier", "HeaderAlert": "Advarsel", @@ -176,7 +176,7 @@ "HeaderDeveloperInfo": "Information om udvikleren", "HeaderDeviceAccess": "Enhedsadgang", "HeaderDevices": "Enheder", - "HeaderEditImages": "Rediger billeder", + "HeaderEditImages": "Redigér billeder", "HeaderEnabledFields": "Aktiverede felter", "HeaderEnabledFieldsHelp": "Fjern fluebenet fra et felt for at låse det og forhindre dets data fra at blive ændret.", "HeaderError": "Fejl", @@ -306,7 +306,7 @@ "LabelContentType": "Indholdstype", "LabelCountry": "Land/Region", "LabelCriticRating": "Kritiker bedømmelse", - "LabelCurrentPassword": "Nuværende kode", + "LabelCurrentPassword": "Nuværende adgangskode", "LabelCustomCertificatePath": "Brugerdefineret SSL certifikat sti", "LabelCustomCertificatePathHelp": "Sti til PKCS #12 fil indeholdende et certifikat og privat nøgle for at aktivere TLS understøttelse på et brugerdefineret domæne.", "LabelCustomCss": "Brugerdefineret CSS kode", @@ -396,7 +396,7 @@ "LabelMovieRecordingPath": "Filmoptagelsessti", "LabelName": "Navn", "LabelNewName": "Nyt navn", - "LabelNewPassword": "Ny kode", + "LabelNewPassword": "Ny adgangskode", "LabelNewPasswordConfirm": "Gentag adgangskode", "LabelNewsCategories": "Nyhedskategorier", "LabelNumber": "Nummer", @@ -415,7 +415,7 @@ "LabelPersonRoleHelp": "Eksempel: Isbilschauffør", "LabelPlaceOfBirth": "Fødselssted", "LabelPlayDefaultAudioTrack": "Afspil standardlydsporet uanset sproget", - "LabelPlaylist": "Afspilningsliste", + "LabelPlaylist": "Playliste", "LabelPostProcessor": "Efterbehandlingsapplikation", "LabelPostProcessorArguments": "Kommandolinjeargumenter til efterbehandler", "LabelPostProcessorArgumentsHelp": "Benyt {path} som stien til optagelsesfilen.", @@ -470,7 +470,7 @@ "LabelTypeText": "Tekst", "LabelUser": "Bruger", "LabelUserAgent": "Bruger agent", - "LabelUserRemoteClientBitrateLimitHelp": "Overskriv den globale standard-indstilling sat i server indstillinger, se Dashboard > Afspilning > Streaming.", + "LabelUserRemoteClientBitrateLimitHelp": "Overskriv den globale standard-indstilling sat i server indstillinger, se Kontrolpanel > Afspilning > Streaming.", "LabelUsername": "Brugernavn", "LabelVaapiDevice": "VA API Enhed", "LabelVaapiDeviceHelp": "Dette er ydelsesnoten der benyttes til hardwareaccelerering.", @@ -545,7 +545,7 @@ "MinutesBefore": "minutter før", "Monday": "Mandag", "MoreFromValue": "Mere fra {0}", - "MoreUsersCanBeAddedLater": "Flere brugere kan tilføjes senere fra dashboardet.", + "MoreUsersCanBeAddedLater": "Flere brugere kan tilføjes senere fra kontrolpanelet.", "MoveLeft": "Flyt mod venstre", "MoveRight": "Flyt mod højre", "MovieLibraryHelp": "Gennemse {0}film navngivningsguiden{1}.", @@ -672,7 +672,7 @@ "ReleaseDate": "Udgivelsesdato", "RememberMe": "Husk Mig", "RemoveFromCollection": "Fjern fra samling", - "RemoveFromPlaylist": "Fjer fra afspilningsliste", + "RemoveFromPlaylist": "Fjern fra playliste", "Repeat": "Gentag", "RepeatEpisodes": "Gentag episoder", "ReplaceAllMetadata": "Erstat alle metadata", @@ -762,7 +762,7 @@ "ViewPlaybackInfo": "Vis afspilnings information", "Wednesday": "Onsdag", "WelcomeToProject": "Velkommen til Jellyfin!", - "WizardCompleted": "Det er alt, hvad vi har brug for nu. Jellyfin er begyndt at indsamle information om dit mediebibliotek. Se nogle af vores apps, og klik derefter på Udfør for at se Dashboard.", + "WizardCompleted": "Det er alt, hvad vi har brug for nu. Jellyfin er begyndt at indsamle information om dit mediebibliotek. Se nogle af vores apps, og klik derefter på Udfør for at se Kontrolpanel.", "Writer": "Forfatter", "XmlTvKidsCategoriesHelp": "Programmer med disse kategorier bliver vist som programmer for børn. Adskil flere med '|'.", "XmlTvMovieCategoriesHelp": "Programmer med disse kategorier bliver vist som film. Adskil flere med '|'.", @@ -834,7 +834,7 @@ "Down": "Ned", "DownloadsValue": "{0} hentninger", "DropShadow": "Baggrundsskygge", - "EditMetadata": "Rediger metadata", + "EditMetadata": "Redigér metadata", "EnableBackdropsHelp": "Vis baggrundsbilleder i baggrunden af nogle sider mens man gennemser biblioteket.", "EnableDisplayMirroring": "Visning afspejling", "EnableExternalVideoPlayers": "Eksterne video afspillere", @@ -888,7 +888,7 @@ "LabelCache": "Cache", "LabelCertificatePassword": "Adgangskode til certifikat", "LabelCertificatePasswordHelp": "Hvis dit certifikat kræver en adgangskode, skriv det venligst her.", - "LabelDashboardTheme": "Server dashboard tema", + "LabelDashboardTheme": "Serverkontrolpanel-tema", "LabelDateTimeLocale": "Dato og tid område", "LabelDefaultScreen": "Standard skærm", "LabelDisplayLanguage": "Visningssprog", @@ -967,7 +967,7 @@ "PlayNext": "Afspil næste", "PlayNextEpisodeAutomatically": "Afspil næste afsnit automatisk", "PlaybackErrorNoCompatibleStream": "Denne klient er ikke kompatibel med mediet, og serveren sender ikke et kompatibelt medieformat.", - "Playlists": "Afspilningslister", + "Playlists": "Playlister", "Previous": "Forrige", "Primary": "Primær", "Raised": "Forhøjet", @@ -1072,7 +1072,7 @@ "LabelPlayMethod": "Afspilnings metode", "LabelPlayerDimensions": "Afspillerdimensioner", "LabelPlayer": "Afspiller", - "LabelPasswordResetProvider": "Udbyder til nulstilling as kodeord", + "LabelPasswordResetProvider": "Udbyder til nulstilling af adgangskode", "LabelLibraryPageSizeHelp": "Angiv antallet af objekter, der skal vises pr. biblioteksside. Vælg 0 for at deaktivere opdeling i sider. Bemærk at hvis denne sættes til 0 eller alt over 100 kan give problemer eller reduceret præstation.", "LabelLibraryPageSize": "Størrelse på biblioteksside", "LabelFolder": "Mappe", @@ -1104,7 +1104,7 @@ "UnsupportedPlayback": "Jellyfin kan ikke dekryptere indhold, der er beskyttet af DRM, men alt indhold vil blive forsøgt afspillet uanset, inklusive beskyttede titler. Nogle filer kan eventuelt vises med sort skærm på grund af kryptering eller andre funktioner, der ikke understøttes, såsom interaktive titler.", "Filter": "Filtrer", "New": "Nye", - "ButtonTogglePlaylist": "Spilleliste", + "ButtonTogglePlaylist": "Playliste", "ButtonSyncPlay": "SyncPlay", "HeaderRemoteAccessSettings": "Fjernadgangs-indstillinger", "HeaderHttpsSettings": "HTTPS-indstillinger", @@ -1130,7 +1130,7 @@ "ButtonCast": "Cast til enhed", "ClearQueue": "Ryd kø", "Bwdif": "Bob Weaver DeInterlacing Filter (BWDIF)", - "ButtonUseQuickConnect": "Brug Quick Connect", + "ButtonUseQuickConnect": "Brug Lyn-forbind", "ButtonPlayer": "Afspiller", "Authorize": "Tillad", "ApiKeysCaption": "Liste over aktive API nøgler", @@ -1158,7 +1158,7 @@ "HeaderAutoDiscovery": "Netværksopdagelse", "HeaderAddUser": "Tilføj bruger", "HeaderAddUpdateSubtitle": "Tilføj/Opdater undertekster", - "EnableQuickConnect": "Aktiver hurtig tilkobling på denne server", + "EnableQuickConnect": "Aktivér Lyn-forbind på denne server", "EnableFasterAnimationsHelp": "Brug hurtigere animationer og overgange.", "EnableFasterAnimations": "Hurtigere animationer", "DisablePlugin": "Deaktiver", @@ -1186,16 +1186,16 @@ "SelectServer": "Vælg server", "Restart": "Genstart", "ResetPassword": "Nulstil adgangskode", - "QuickConnectNotAvailable": "Bed din server administrator om at aktivere Quick Connect", - "QuickConnectNotActive": "Quick Connect er ikke aktiveret på denne server", - "QuickConnectInvalidCode": "Ugyldig Quick Connect kode", - "QuickConnectDescription": "For at logge ind med Quick Connect, vælg da 'Quick Connect' knappen på den enhed du er logget ind fra og indtast den viste kode nedenfor.", - "QuickConnectDeactivated": "Quick Connect blev deaktiveret før log ind anmodningen kunne blive godkendt", + "QuickConnectNotAvailable": "Bed din server administrator om at aktivere Lyn-forbind", + "QuickConnectNotActive": "Lyn-forbind er ikke aktiveret på denne server", + "QuickConnectInvalidCode": "Ugyldig Lyn-forbind-kode", + "QuickConnectDescription": "For at logge ind med Lyn-forbind vælg da 'Lyn-forbind'-knappen på den enhed du er logget ind fra og indtast den viste kode nedenfor.", + "QuickConnectDeactivated": "Lyn-forbind blev deaktiveret før log ind anmodningen kunne blive godkendt", "QuickConnectAuthorizeSuccess": "Du har godkendt din enhed med succes!", - "QuickConnectAuthorizeFail": "Ukendt Quick Connect kode", + "QuickConnectAuthorizeFail": "Ukendt Lyn-forbind-kode", "QuickConnectAuthorizeCode": "Angiv kode {0} for at logge ind", "QuickConnectActivationSuccessful": "Aktivering blev gennemført", - "QuickConnect": "Hurtig tilkobling", + "QuickConnect": "Lyn-forbind", "Profile": "Profil", "PreviousTrack": "Gå til forrige", "Preview": "Forhåndsvisning", @@ -1249,7 +1249,7 @@ "LabelRequireHttps": "Kræv HTTPS", "LabelRepositoryUrl": "Arkiv URL", "LabelRepositoryName": "Arkiv navn", - "LabelQuickConnectCode": "Quick connect kode", + "LabelQuickConnectCode": "Lyn-forbind-kode", "LabelPublishedServerUri": "Udgivne server-URI'er", "LabelOpenclDevice": "OpenCL Enhed", "LabelIsForced": "Tvunget", @@ -1531,7 +1531,7 @@ "UnknownError": "Der forekom en ukendt fejl.", "SearchResultsEmpty": "Fejl! Ingen resultater fundet for \"{0}\"", "LabelSystem": "System", - "PasswordRequiredForAdmin": "Administratorkontoer krævet et kodeord.", + "PasswordRequiredForAdmin": "Administrator-konti kræver en adgangskode.", "Studio": "Studio", "LabelEnableLUFSScan": "Aktiver LUFS scan", "UserMenu": "Brugermenu", @@ -1557,7 +1557,7 @@ "LabelMediaDetails": "Media detaljer", "MenuClose": "Luk menu", "MediaInfoDvBlSignalCompatibilityId": "DV bl signals kompatibilitets id", - "ButtonEditUser": "Rediger bruger", + "ButtonEditUser": "Redigér bruger", "HeaderAllRecordings": "Alle optagelser", "ListView": "Liste Visning", "LabelVppTonemappingContrastHelp": "Anvend konstrastforstærkning i VPP-tonemapping. Den anbefalede værdi er 1.", @@ -1666,8 +1666,8 @@ "Letterer": "Skrift fra", "LibraryScanFanoutConcurrencyHelp": "Maksimalt antal parallelle opgaver under biblioteks­scanning. Hvis feltet efterlades tomt, vælges en grænse baseret på antallet af kerner i systemet. ADVARSEL: Et for højt tal kan give problemer med netværksfilsystemer – sænk tallet, hvis du oplever problemer.", "Lyrics": "Sangtekster", - "PlaylistError.AddFailed": "Fejl ved tilføjelse til afspilningsliste", - "PlaylistError.CreateFailed": "Fejl ved oprettelse af afspilningsliste", + "PlaylistError.AddFailed": "Fejl ved tilføjelse til playliste", + "PlaylistError.CreateFailed": "Fejl ved oprettelse af playliste", "SaveLyricsIntoMediaFolders": "Gem sangtekster i medie-mapper", "SaveLyricsIntoMediaFoldersHelp": "Gemmer sangtekst ved siden af lydfiler vil gøre dem nemmere at håndtere.", "Translator": "Oversætter", @@ -1677,7 +1677,7 @@ "HeaderNoLyrics": "Ingen sangtekster blev fundet", "HeaderVideoAdvanced": "Video Avanceret", "PlaylistPublic": "Tillad offentlig adgang", - "PlaylistPublicDescription": "Tillad at denne afspilningsliste kan blive set af enhver forbundet bruger.", + "PlaylistPublicDescription": "Tillad at denne playliste kan blive set af enhver bruger der er logget ind.", "LabelTileHeight": "Flisehøjde", "LabelTileHeightHelp": "Maks. billeder per flise in Y-retningen.", "LabelTrickplayThreadsHelp": "Antallet af tråde at videregive til '-threads' argumentet fra FFmpeg.", @@ -1707,7 +1707,7 @@ "PluginEnableError": "Der opstod en fejl under aktivering af plugin'et.", "Alternate": "Alternativ", "AlternateDVD": "Alternativ DVD", - "EditLyrics": "Rediger sangtekst", + "EditLyrics": "Redigér sangtekster", "LabelDropLyricsHere": "Smid sangtekster her, eller klik på gennemse.", "SelectPreferredTranscodeVideoCodecHelp": "Vælg det fortrukkede video codec at omkode til. Hvis det valgte codec ikke understøttes vil serveren bruge det næstbedste tilgængelige codec.", "LabelTrickplayKeyFrameOnlyExtraction": "Generer kun billeder fra nøglerammer", @@ -1734,7 +1734,7 @@ "LabelScreensaverTime": "Pauseskærm-tid", "LabelAudioTagSettings": "Lydmærkat-indstillinger", "LabelQsvDevice": "QSV-enhed", - "HeaderEditPlaylist": "Rediger playliste", + "HeaderEditPlaylist": "Redigér playliste", "HeaderNewPlaylist": "Ny playliste", "LabelAlwaysRemuxFlacAudioFiles": "Remux altid FLAC lydfiler", "LabelAlwaysRemuxMp3AudioFiles": "Remux altid MP3 lydfiler", @@ -1825,7 +1825,7 @@ "HeaderUpdateRequired": "Opdatering Nødvendig", "PluginsLoadError": "En fejl opstod imens der blev loaded plugins.", "ButtonLearnMore": "Lær Mere", - "MessageForgotPasswordPinReset": "Skriv PIN her for at færdigøre Adgangskode nulstilling", + "MessageForgotPasswordPinReset": "Skriv PIN her for at færdigøre adgangskode-nulstilling", "BackupsPageLoadError": "Fejlede ved at load backup side", "ButtonCreateBackup": "Opret Backup", "Create": "Opret", @@ -1867,11 +1867,13 @@ "ButtonAddTunerDevice": "Tilføj Tuner Enhed", "LabelSlideshowInterval": "Billede Slideshow Interval", "LabelSlideshowIntervalHelp": "Mængden af tid i sekunder hvert billede er vist slideshows.", - "HeaderDeletePlaylist": "Slet Playliste", + "HeaderDeletePlaylist": "Slet playliste", "ConfirmDeleteCollection": "Er du sikker på at du vil slette denne kollektion?", - "ConfirmDeletePlaylist": "Er du sikker på at du vil slette denne Playliste?", + "ConfirmDeletePlaylist": "Er du sikker på at du vil slette denne playliste?", "HeaderDeleteCollection": "Slet kollektion", "ActivitiesLoadError": "kunne ikke indlæse aktiviteter", "ApiKeysLoadError": "Kunne ikke indlæse API nøgler", - "Authors": "Forfattere" + "Authors": "Forfattere", + "NewPlaylist": "Ny playliste", + "Disabled": "Deaktiveret" } From 75ea077651b0abc2086b11b825faf48e3e89405c Mon Sep 17 00:00:00 2001 From: Lofuuzi Date: Sun, 5 Jul 2026 03:56:24 -0400 Subject: [PATCH 014/287] Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant_HK/ --- src/strings/zh-hk.json | 129 +++++++++++++++++++++-------------------- 1 file changed, 65 insertions(+), 64 deletions(-) diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index bc0135b8af..94092c8e8d 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -54,7 +54,7 @@ "LabelAudioLanguagePreference": "首選音訊語言", "LabelCache": "快取", "LabelCachePath": "快取路徑", - "LabelCachePathHelp": "幫伺服器暫存檔(例如圖片)指定自訂路徑。漏空嘅話就會用返初始位置。", + "LabelCachePathHelp": "幫伺服器暫存檔(例如圖像)指定自訂路徑。漏空嘅話就會用返初始位置。", "LabelCommunityRating": "討論區評分", "LabelContentType": "內容類型", "LabelCountry": "國家/地區", @@ -72,7 +72,7 @@ "LabelServerNameHelp": "呢個名係用嚟認住你部伺服器嘅,初始會直接用你部機嘅 Hostname。", "LabelHttpsPort": "本地 HTTPS 埠號碼", "LabelHttpsPortHelp": "HTTPS 伺服器用嘅 TCP 埠號碼。", - "LabelImageFetchersHelp": "啟用並設定邊個圖片下載來源優先使用。", + "LabelImageFetchersHelp": "啟用並設定邊個圖像下載來源優先使用。", "LabelLanguage": "語言", "LabelLocalHttpServerPortNumber": "本地 HTTP 埠號碼", "LabelLocalHttpServerPortNumberHelp": "HTTP 伺服器用嘅 TCP 埠號碼。", @@ -107,8 +107,8 @@ "LabelPublicHttpPortHelp": "要對應返本地 HTTP 連線埠嘅公共連線埠冧把。", "LabelPublicHttpsPort": "公開 HTTPS 埠號碼", "LabelPublicHttpsPortHelp": "要對應返本地 HTTPS 連線埠嘅公共連線埠冧把。", - "LabelSaveLocalMetadata": "將媒體圖片同埋資料儲存喺媒體資料夾入面", - "LabelSaveLocalMetadataHelp": "將媒體圖片同資料儲存喺媒體資料夾入面,方便遲啲自己編輯。", + "LabelSaveLocalMetadata": "將媒體圖像同埋資料儲存喺媒體資料夾入面", + "LabelSaveLocalMetadataHelp": "將媒體圖像同資料儲存喺媒體資料夾入面,方便遲啲自己編輯。", "LabelSkipIfAudioTrackPresentHelp": "熄咗呢項嘅話,無論音訊係咩語言,系統都會強制下載字幕。", "LabelSkipIfGraphicalSubsPresentHelp": "保留文字版本字幕會令傳輸更有效率,亦可以減少影片需要轉碼嘅機會。", "LabelStatus": "狀態", @@ -176,7 +176,7 @@ "Refresh": "重新整理", "Saturday": "禮拜六", "Save": "儲存", - "SearchForCollectionInternetMetadata": "由網上搜尋相關嘅圖片同媒體詳細資料", + "SearchForCollectionInternetMetadata": "由網上搜尋相關嘅圖像同媒體詳細資料", "SearchForSubtitles": "搵字幕", "Sunday": "禮拜日", "TabAccess": "可以通行", @@ -184,7 +184,7 @@ "TabDashboard": "控制台", "TabLatest": "近排新增", "TabMusic": "音樂", - "TabNetworks": "TV 網路", + "TabNetworks": "電視網路", "TabOther": "其它", "TabServer": "伺服器", "TabUpcoming": "即將發佈", @@ -273,7 +273,7 @@ "DeleteUser": "刪走使用者", "DeleteMedia": "刪走媒體", "DeleteImageConfirmation": "你確定要刪走呢張圖?", - "DeleteImage": "刪走圖片", + "DeleteImage": "刪走圖像", "ErrorDefault": "處理呢個指令嗰陣出咗錯,唔該稍後再試。", "Default": "初始", "DateAdded": "新增日期", @@ -282,7 +282,7 @@ "ContinueWatching": "繼續睇返", "Connect": "連線", "ConfirmEndPlayerSession": "你係咪想喺 {0} 秒後關閉 Jellyfin?", - "ConfirmDeleteImage": "確定刪走圖片?", + "ConfirmDeleteImage": "確定刪走圖像?", "CommunityRating": "觀眾評分", "ClientSettings": "用戶端設定", "ChannelNumber": "頻道號碼", @@ -317,7 +317,7 @@ "ButtonArrowLeft": "左", "ButtonAddServer": "新增伺服器", "ButtonAddMediaLibrary": "新增媒體櫃", - "ButtonAddImage": "新增圖片", + "ButtonAddImage": "新增圖像", "Browse": "瀏覽", "Blacklist": "黑名單", "BirthPlaceValue": "出生地點:{0}", @@ -327,12 +327,12 @@ "Backdrop": "背景", "AlwaysPlaySubtitles": "一直顯示", "Display": "顯示", - "EditImages": "編輯圖片", + "EditImages": "編輯圖像", "DownloadsValue": "{0} 個下載", "Download": "下載", "DisplayInMyMedia": "喺主頁顯示", "ButtonSyncPlay": "一齊睇", - "BurnSubtitlesHelp": "決定伺服器係咪要將字幕「燒」入去影片度。避開呢樣嘢可以大幅提升效能。揀「自動」嘅話,系統會自動處理圖片格式字幕(好似 VobSub、PGS 或 SUB/IDX 等)同埋某啲 ASS/SSA 字幕。", + "BurnSubtitlesHelp": "決定伺服器係咪要將字幕「燒」入去影片度。避開呢樣嘢可以大幅提升效能。揀「自動」嘅話,系統會自動處理圖像格式字幕(好似 VobSub、PGS 或 SUB/IDX 等)同埋某啲 ASS/SSA 字幕。", "BoxRear": "盒裝(背面)", "BoxSet": "套裝", "Box": "盒裝", @@ -343,7 +343,7 @@ "ColorSpace": "色彩空間", "ColorPrimaries": "主色調", "CinemaModeConfigurationHelp": "戲院模式帶畀你真正嘅戲院體驗,喺播正片之前可以揀播預告片同自訂開場片。", - "ChangingMetadataImageSettingsNewContent": "更改媒體詳細資料或下載圖片嘅設定,只會對之後新增嘅內容生效。如果想套用落現有內容,你要手動重新整理返啲媒體詳細資料。", + "ChangingMetadataImageSettingsNewContent": "更改媒體詳細資料或下載圖像嘅設定,只會對之後新增嘅內容生效。如果想套用落現有內容,你要手動重新整理返啲媒體詳細資料。", "ButtonSelectView": "揀顯示方式", "ButtonLibraryAccess": "媒體櫃存取", "BookLibraryHelp": "支援有聲書同文字版電子書。唔該睇返 {0} 有聲書命名指南 {1}。", @@ -401,8 +401,8 @@ "EnableDecodingColorDepth10Vp9": "啟用 VP9 10-bit 硬體解碼", "EnableDecodingColorDepth10Hevc": "啟用 HEVC 10-bit 硬體解碼", "EnableColorCodedBackgrounds": "彩色背景", - "EnableBlurHashHelp": "喺圖片未載入完嗰陣,顯示一個用已載入數據整出嚟嘅模糊縮圖(BlurHash)。", - "EnableBlurHash": "啟用圖片模糊預覽效果(BlurHash)", + "EnableBlurHashHelp": "喺圖像未載入完嗰陣,顯示一個用已載入數據整出嚟嘅模糊縮圖(BlurHash)。", + "EnableBlurHash": "啟用圖像模糊預覽效果(BlurHash)", "EnableBackdropsHelp": "喺瀏覽媒體櫃嗰陣,將「背景圖」顯示喺頁面背景。", "EditMetadata": "編輯媒體詳細資料", "DropShadow": "陰影", @@ -514,11 +514,11 @@ "LabelLanNetworks": "區域網路", "LabelKodiMetadataUserHelp": "儲存觀看進度到 NFO 檔,方便畀其他應用程式讀取。", "LabelKodiMetadataUser": "將呢位用家嘅觀看進度儲存落 NFO 檔度", - "LabelKodiMetadataSaveImagePathsHelp": "如果你啲圖片檔名唔係跟足 Kodi 嗰套標準,建議你啟用呢個功能。", - "LabelKodiMetadataSaveImagePaths": "喺 NFO 檔案入面儲存埋圖片路徑", - "LabelKodiMetadataEnablePathSubstitutionHelp": "允許伺服器用路徑取代設定,去替代原本嘅圖片路徑。", + "LabelKodiMetadataSaveImagePathsHelp": "如果你啲圖像檔名唔係跟足 Kodi 嗰套標準,建議你啟用呢個功能。", + "LabelKodiMetadataSaveImagePaths": "喺 NFO 檔案入面儲存埋圖像路徑", + "LabelKodiMetadataEnablePathSubstitutionHelp": "允許伺服器用路徑取代設定,去替代原本嘅圖像路徑。", "LabelKodiMetadataEnablePathSubstitution": "啟用路徑取代", - "LabelKodiMetadataEnableExtraThumbsHelp": "為咗最大程度兼容 Kodi 嘅主題,下載返嚟嘅圖片會同時儲存喺「extrafanart」同「extrathumbs」資料夾。", + "LabelKodiMetadataEnableExtraThumbsHelp": "為咗最大程度兼容 Kodi 嘅主題,下載返嚟嘅圖像會同時儲存喺「extrafanart」同「extrathumbs」資料夾。", "LabelKodiMetadataEnableExtraThumbs": "將「額外背景圖」嘅內容複製去「額外縮圖」欄位", "LabelKodiMetadataDateFormatHelp": "NFO 檔案入面嘅所有日期都會以呢個格式嚟解析。", "LabelKodiMetadataDateFormat": "發佈日期格式", @@ -528,7 +528,7 @@ "LabelIsForced": "強制", "LabelInternetQuality": "網路畫質", "LabelImportOnlyFavoriteChannels": "只限已標記做「心水」嘅頻道", - "LabelImageType": "圖片格式", + "LabelImageType": "圖像格式", "LabelHomeScreenSectionValue": "主畫面第 {0} 部分", "LabelHomeNetworkQuality": "屋企網路畫質", "LabelHardwareEncoding": "硬體加速", @@ -546,8 +546,8 @@ "LabelFileOrUrl": "檔案或者網址", "LabelffmpegPathHelp": "FFmpeg 程式檔案嘅路徑,或者係放咗 FFmpeg 嘅資料夾路徑。", "LabelffmpegPath": "FFmpeg 路徑", - "LabelExtractChaptersDuringLibraryScanHelp": "掃描媒體櫃嗰陣順便產生埋章節圖片。唔係嘅話,就要等排程工作嗰陣先整,咁樣掃描媒體櫃個速度會快啲。", - "LabelExtractChaptersDuringLibraryScan": "喺掃描媒體櫃嗰陣順便擷取章節圖片", + "LabelExtractChaptersDuringLibraryScanHelp": "掃描媒體櫃嗰陣順便產生埋章節圖像。唔係嘅話,就要等排程工作嗰陣先整,咁樣掃描媒體櫃個速度會快啲。", + "LabelExtractChaptersDuringLibraryScan": "喺掃描媒體櫃嗰陣順便擷取章節圖像", "LabelEpisodeNumber": "集", "LabelEndDate": "結束日期", "LabelEncoderPreset": "初始編碼", @@ -639,8 +639,8 @@ "InstantMix": "即時混音", "InstallingPackage": "裝緊 {0}(版本 {1})", "ImportFavoriteChannelsHelp": "系統只會匯入嗰啲喺調諧器裝置上面被標記做「心水」嘅頻道。", - "Images": "圖片", - "Image": "圖片", + "Images": "圖像", + "Image": "圖像", "Identify": "識別", "HttpsRequiresCert": "你需要提供 SSL 憑證(例如 Let's Encrypt)先可以啟用加密連線。如果你提供唔到憑證,唔該停用加密連線。", "Horizontal": "橫向", @@ -653,11 +653,11 @@ "HeaderVideoQuality": "影片畫質", "HeaderUser": "使用者", "HeaderUploadSubtitle": "上載字幕", - "HeaderUploadImage": "上載圖片", + "HeaderUploadImage": "上載圖像", "HeaderUpcomingOnTV": "即將播映", "HeaderUninstallPlugin": "解除安裝外掛程式", "HeaderTypeText": "輸入文字", - "HeaderTypeImageFetchers": "圖片來源 ({0})", + "HeaderTypeImageFetchers": "圖像來源 ({0})", "HeaderTuners": "調諧器", "HeaderTunerDevices": "調諧器", "HeaderTracks": "曲目", @@ -730,7 +730,7 @@ "HeaderKeepRecording": "繼續錄影", "HeaderInstantMix": "即時混播", "HeaderInstall": "安裝", - "HeaderImageOptions": "圖片選項", + "HeaderImageOptions": "圖像選項", "HeaderIdentifyItemHelp": "輸入一個或多個搜尋條件。想搵多啲結果嘅話,就刪走部分條件。", "HeaderHttpsSettings": "HTTPS 設定", "HeaderGuideProviders": "節目表(Guide)資料提供者", @@ -740,7 +740,7 @@ "HeaderError": "錯誤", "HeaderEnabledFieldsHelp": "唔剔呢個選項就可以鎖定欄位,防止入面嘅資料被改動。", "HeaderEnabledFields": "已啟用嘅欄位", - "HeaderEditImages": "編輯圖片", + "HeaderEditImages": "編輯圖像", "HeaderDVR": "DVR", "HeaderDownloadSync": "下載 & 同步", "HeaderDetectMyDevices": "偵測我嘅裝置", @@ -852,7 +852,7 @@ "HeaderConfirmRevokeApiKey": "撤銷 API 金鑰", "HeaderConfirmPluginInstallation": "確認安裝外掛程式", "HeaderConfigureRemoteAccess": "設定遠端存取", - "HeaderChapterImages": "章節圖片", + "HeaderChapterImages": "章節圖像", "HeaderChannelAccess": "頻道存取", "HeaderCastAndCrew": "演員 & 工作人員", "HeaderCancelSeries": "取消錄製影集", @@ -871,7 +871,7 @@ "HeaderAdmin": "管理", "HeaderAddUser": "新增使用者", "HeaderAddUpdateSubtitle": "新增/更新 字幕", - "HeaderAddUpdateImage": "新增/更新圖片", + "HeaderAddUpdateImage": "新增/更新圖像", "HeaderAddToPlaylist": "加落播放清單", "HeaderActivity": "活動", "HeaderAccessScheduleHelp": "整一個時間表,限制用家只可以喺指定時段內登入。", @@ -903,7 +903,7 @@ "FastForward": "快進", "Extras": "額外", "ExtraLarge": "特大", - "ExtractChapterImagesHelp": "提取章節圖片可以等用戶端顯示圖形化嘅場景選擇選單。呢個過程可能比較慢,亦都幾食資源,仲可能要用幾 GB 空間。系統會喺偵測到新片或者每晚執行排程工作嗰陣去行。你隨時可以喺「排程工作」度改時間,建議唔好喺繁忙時間行呢個工作。", + "ExtractChapterImagesHelp": "提取章節圖像可以等用戶端顯示圖形化嘅場景選擇選單。呢個過程可能比較慢,亦都幾食資源,仲可能要用幾 GB 空間。系統會喺偵測到新片或者每晚執行排程工作嗰陣去行。你隨時可以喺「排程工作」度改時間,建議唔好喺繁忙時間行呢個工作。", "MusicVideos": "MV", "AgeValue": "({0}歲)", "MediaInfoLanguage": "語言", @@ -957,13 +957,13 @@ "HomeVideosPhotos": "家庭影片同相片", "MessageConfirmRevokeApiKey": "你確定要廢除呢個 API 金鑰?呢個應用程式同伺服器嘅連線會即刻斷開。", "LabelSyncPlaySettingsExtraTimeOffsetHelp": "手動調整特定裝置嘅同步延遲(以毫秒計)。呢個係用嚟校正同步嘅,改嗰陣要小心啲。", - "HeaderDummyChapter": "章節圖片", + "HeaderDummyChapter": "章節圖像", "IgnoreDtsHelp": "熄咗呢個選項或者可以解決某啲問題,例如當音訊同影片串流分開處理嗰陣冇聲出嘅情況。", "DownloadAll": "下載全部", "LabelDummyChapterDuration": "間距", "LabelDummyChapterDurationHelp": "模擬章節之間嘅間隔(秒)。設為 0 就會熄咗模擬章節生成。更改呢個值唔會影響現有嘅模擬章節。", "DeletedScene": "刪減片段", - "EnableSplashScreen": "啟用啟動畫面(Splash Screen)圖片", + "EnableSplashScreen": "啟用啟動畫面(Splash Screen)圖像", "Unreleased": "仲未發佈", "ThemeSong": "主題曲", "Scene": "場景", @@ -994,10 +994,10 @@ "MessageUnableToConnectToServer": "目前連唔到去所選嘅伺服器。唔該確保伺服器行緊,然後再試下。", "MessageUnauthorizedUser": "你暫時未獲得授權連線呢個伺服器。詳細資訊唔該聯絡伺服器管理員。", "LabelChapterImageResolution": "解像度", - "LabelChapterImageResolutionHelp": "擷取章節圖片嘅解像度。改呢個設定唔會影響已經整好咗嘅模擬章節。", + "LabelChapterImageResolutionHelp": "擷取章節圖像嘅解像度。改呢個設定唔會影響已經整好咗嘅模擬章節。", "HeaderRecordingMetadataSaving": "錄影媒體詳細資料", - "UseEpisodeImagesInNextUp": "喺「跟住落嚟」同「繼續睇返」區域,顯示該集數嘅圖片", - "UseEpisodeImagesInNextUpHelp": "「跟住落嚟」同「繼續睇返」區域會用相關集數嘅圖片取代劇集主縮圖嚟顯示。", + "UseEpisodeImagesInNextUp": "喺「跟住落嚟」同「繼續睇返」區域,顯示該集數嘅圖像", + "UseEpisodeImagesInNextUpHelp": "「跟住落嚟」同「繼續睇返」區域會用相關集數嘅圖像取代劇集主縮圖嚟顯示。", "TabScheduledTasks": "工作排程器", "LabelPlaybackInfo": "播放資訊", "EnableCardLayout": "顯示卡片式佈局(CardBox)", @@ -1183,9 +1183,9 @@ "HeaderUploadLyrics": "上載歌詞", "HeaderVideoAdvanced": "進階影片選項", "Illustrator": "畫師", - "ImageDeleteFailed": "圖片移除失敗咗", - "ImageUploadCancelled": "取消咗圖片上載", - "ImageUploadFailed": "圖片上載失敗咗", + "ImageDeleteFailed": "圖像移除失敗咗", + "ImageUploadCancelled": "取消咗圖像上載", + "ImageUploadFailed": "圖像上載失敗咗", "LabelAllowFmp4TranscodingContainer": "允許用 fMP4 做轉碼容器", "LabelAlwaysRemuxFlacAudioFiles": "遇到 FLAC 音訊一律重新封裝(Remux)", "LabelAlwaysRemuxMp3AudioFiles": "遇到 MP3 音訊一律重新封裝(Remux)", @@ -1203,7 +1203,7 @@ "LabelEnablePlugin": "啟用外掛程式", "LabelFallbackMaxStreamingBitrate": "串流位元率回退值 (Mbps)", "LabelGroupShowsIntoCollectionsHelp": "喺顯示影集清單嗰陣,屬於同一個系列嘅影集會合併埋一齊顯示。", - "LabelImageCache": "圖片快取", + "LabelImageCache": "圖像快取", "LabelInstalled": "已下載", "LabelIsSynced": "已同步", "LabelLevel": "等級", @@ -1213,8 +1213,8 @@ "LabelLyricDownloaders": "歌詞下載", "LabelNoChangelog": "呢個版本冇提供更新日誌。", "LabelNotInstalled": "未安裝", - "LabelParallelImageEncodingLimit": "同時進行圖片編碼嘅數量限制", - "LabelParallelImageEncodingLimitHelp": "允許同時進行嘅圖片轉碼最大數量。由佢嘅話系統會根據你 CPU 核心數量嚟自動揀。", + "LabelParallelImageEncodingLimit": "同時進行圖像編碼嘅數量限制", + "LabelParallelImageEncodingLimitHelp": "允許同時進行嘅圖像轉碼最大數量。由佢嘅話系統會根據你 CPU 核心數量嚟自動揀。", "LabelQsvDevice": "QSV 裝置", "LabelQsvDeviceHelp": "喺多顯卡系統入面指定 Intel QSV 用邊部裝置。喺 Linux,呢個係渲染節點,例如 /dev/dri/renderD128;喺 Windows,呢個係由 0 開始計嘅裝置索引。除非你清楚自己做緊咩,若唔係建議由佢。", "LabelRepository": "資源櫃", @@ -1264,11 +1264,11 @@ "ConnectAnyway": "仍要連線", "Create": "建立", "Custom": "自訂", - "CustomSplashScreenSize": "自訂圖片應該要用 16:9 比例,而且解像度最少要有 1920x1080。", + "CustomSplashScreenSize": "自訂圖像應該要用 16:9 比例,而且解像度最少要有 1920x1080。", "CustomSubtitleStylingHelp": "自訂字幕樣式喺大多數裝置都支援到,不過會增加少少系統負載。", "DateModified": "修改日期", "DeleteEntireSeries": "剷走呢 {0} 集", - "DeleteCustomImage": "移除自訂圖片", + "DeleteCustomImage": "移除自訂圖像", "DeleteLyrics": "刪走歌詞", "DeleteSeries": "刪走系列", "DeleteEpisode": "刪走劇集", @@ -1310,7 +1310,7 @@ "LimitSegmentLength": "用更短嘅 HLS 片段", "LimitSegmentLengthHelp": "啟用呢個選項可能有助於防止 HLS 播放器喺某啲裝置(例如 webOS 電視)快轉嗰陣𠽤住。", "LimitSupportedVideoResolution": "限制支援嘅最高影片解像度", - "LimitSupportedVideoResolutionHelp": "將「允許嘅最高影片轉碼解像度」設為系統支援嘅最高上限。", + "LimitSupportedVideoResolutionHelp": "將「允許影片轉碼嘅最高解像度」設為系統支援嘅最高上限。", "ListView": "清單檢視", "LiveTVPageLoadError": "載入唔到錄影頁面", "Localization": "在地化", @@ -1372,7 +1372,7 @@ "MessageForgotPasswordInNetworkRequired": "唔該先check吓你屋企嘅網路再開始重設密碼程序。", "MessageGetInstalledPluginsError": "拎已安裝外掛程式清單嗰陣出咗錯。", "MessageImageFileTypeAllowed": "只支援 JPEG 同 PNG 格式。", - "MessageImageTypeNotSelected": "請喺下拉選單入面揀一個圖片類型。", + "MessageImageTypeNotSelected": "請喺下拉選單入面揀一個圖像類型。", "MessageInvalidForgotPasswordPin": "你輸入嘅 PIN 碼唔啱或者已經過期,唔該再試過。", "MessageInvalidUser": "使用者名稱或密碼唔啱,唔該再試過。", "MessageItemsAdded": "已新增項目。", @@ -1409,7 +1409,7 @@ "MessageSyncPlayErrorNoActivePlayer": "因為搵唔到活躍嘅播放器,SyncPlay 功能經已被停用。", "MessageSyncPlayNoGroupsAvailable": "你要先播住啲嘢至可以建立群組。", "MessageWaitingForServer": "正在等到伺服器響應...", - "Mobile": "移動設備 (舊版)", + "Mobile": "行動裝置 (舊版)", "MovieLibraryHelp": "去睇下 {0} 電影命名指南{1}。", "MusicLibraryHelp": "去睇下 {0}音樂命名指南{1}。", "MusicVideo": "MV", @@ -1433,7 +1433,7 @@ "OnApplicationStartup": "程式啟動嗰陣", "OnlyForcedSubtitlesHelp": "只會載入標記咗做「強制(Forced)」嘅字幕。", "OnlyForcedSubtitles": "僅顯示強制字幕", - "OnlyImageFormats": "只限圖片格式字幕(例如 VobSub、PGS、SUB)", + "OnlyImageFormats": "只限圖像格式字幕(例如 VobSub、PGS、SUB)", "OnWakeFromSleep": "喺睡眠模式喚醒嗰陣", "Option3D": "3D", "OptionAllowAudioPlaybackTranscoding": "允許播放需要轉碼嘅音", @@ -1455,7 +1455,7 @@ "OptionEnableExternalContentInSuggestions": "喺推薦內容入面顯示埋外部內容", "OptionEnableExternalContentInSuggestionsHelp": "允許將網上預告片同埋直播電視節目,一齊顯示喺建議內容入面。", "OptionEveryday": "每天", - "OptionExtractChapterImage": "開啟章節圖片擷取功能", + "OptionExtractChapterImage": "開啟章節圖像擷取功能", "OptionForceRemoteSourceTranscoding": "強制將遠端來源(例如電視直播)轉碼", "OptionLoginAttemptsBeforeLockout": "設定輸入錯幾多次密碼之後,系統會鎖死個帳號。", "OptionLoginAttemptsBeforeLockoutHelp": "設為 0 嘅話,普通用家會有 3 次登入機會,管理員就有 5 次。設為 -1 就會熄咗呢個保安功能。", @@ -1463,7 +1463,7 @@ "OptionMaxActiveSessionsHelp": "設為 0 即係熄咗呢個功能。", "OptionRequirePerfectSubtitleMatch": "只係會下載同影片檔案完美匹配嘅字幕", "OptionRequirePerfectSubtitleMatchHelp": "要求完全匹配會篩選出嗰啲專門為你個影片檔案測試同驗證過嘅字幕。唔勾選呢個會增加下載到字幕嘅機會,但同時亦會增加字幕時間軸唔準或者內容錯誤嘅風險。", - "OptionSaveMetadataAsHidden": "將媒體詳細資料同埋圖片儲存做隱藏檔案", + "OptionSaveMetadataAsHidden": "將媒體詳細資料同埋圖像儲存做隱藏檔案", "OptionSaveMetadataAsHiddenHelp": "更改呢個設定只會對未來保存嘅媒體資訊生效。現有媒體資訊檔案要等到伺服器下次保存嗰陣先會更新。", "OriginalAirDate": "首播日期", "OriginalAirDateValue": "首播日期:{0}", @@ -1533,7 +1533,7 @@ "AllowEmbeddedSubtitlesHelp": "停用打包喺媒體檔案入面嘅字幕。改完之後要對媒體櫃做一次完整掃描先會生效。", "AllowEmbeddedSubtitlesAllowAllOption": "全部允許", "AllowEmbeddedSubtitlesAllowNoneOption": "全部拒絕", - "AllowEmbeddedSubtitlesAllowImageOption": "允許圖片", + "AllowEmbeddedSubtitlesAllowImageOption": "允許圖像", "AllowEmbeddedSubtitlesAllowTextOption": "允許文字", "Premiere": "首映", "Premieres": "首映", @@ -1541,7 +1541,7 @@ "Previous": "上一個", "TabParentalControl": "家長監護", "LabelEnableGamepad": "啟用遊戲手掣", - "EnableGamepadHelp": "接收連咗線嘅遊戲手掣輸入。(要喺「電視」顯示模式先用得到)", + "EnableGamepadHelp": "接收連線咗嘅遊戲手掣輸入。(要喺「電視」顯示模式先用得到)", "SeriesDisplayOrderHelp": "設定劇集嘅排序方式,例如以播出日期、DVD 順序或者絕對編號。", "ProductionLocations": "出品地", "Runtime": "播放時長", @@ -1558,7 +1558,7 @@ "ThemeVideos": "主題影片", "SelectPreferredTranscodeVideoCodecHelp": "揀返你想轉碼輸出嘅首選影片編碼。如果唔支援個編碼,伺服器會自動改用下一個最適合嘅編碼。", "SelectPreferredTranscodeVideoAudioCodecHelp": "揀轉碼使用嘅首選音訊編碼。如果唔支援個編碼,伺服器會自動改用下一個最適合嘅編碼。", - "UploadCustomImage": "上載自訂圖片", + "UploadCustomImage": "上載自訂圖像", "ButtonAddProvider": "增加提供者", "LogLevel.Debug": "Debug", "ServerUpdateNeeded": "呢部伺服器需要更新。想下載最新版本,唔該去 {0}", @@ -1597,7 +1597,7 @@ "RepeatEpisodes": "重複劇集", "RepeatMode": "重複模式", "ReplaceAllMetadata": "取代晒所有媒體詳細資料", - "ReplaceExistingImages": "取代現有圖片", + "ReplaceExistingImages": "取代現有圖像", "ReplaceTrickplayImages": "取代現有嘅快轉預覽圖", "RepositoriesPageLoadError": "載入資源櫃失敗", "RetryWithGlobalSearch": "試下用「全域搜尋」再搵過", @@ -1610,7 +1610,7 @@ "SavePassword": "儲存密碼", "SaveRecordingNFO": "將錄影嘅 EPG 媒體詳細資料儲存喺 NFO 檔入面", "SaveRecordingNFOHelp": "將節目表(EPG)提供者嘅媒體詳細資料同媒體檔一齊儲存。", - "SaveRecordingImages": "儲存 EPG 圖片", + "SaveRecordingImages": "儲存 EPG 圖像", "SaveSubtitlesIntoMediaFolders": "將字幕儲存喺媒體資料夾入面", "SaveSubtitlesIntoMediaFoldersHelp": "將字幕直接儲存喺片源隔離,咁樣管理起嚟會方便好多。", "ScanForNewAndUpdatedFiles": "掃描新加入或者改動過嘅檔案", @@ -1635,14 +1635,14 @@ "ShowAdvancedSettings": "顯示進階設定", "ShowIndicatorsFor": "顯示標記喺:", "ShowLess": "顯示更少", - "ShowParentImages": "顯示劇集系列圖片", + "ShowParentImages": "顯示劇集系列圖像", "ShowTitle": "顯示標題", "Shuffle": "隨機播放", "SimultaneousConnectionLimitHelp": "限制最多可以同時有幾多個串流。填 0 即係冇限制。", "SkipEpisodesAlreadyInMyLibrary": "如果媒體櫃入面已經有嗰集,就唔好再錄", "SkipEpisodesAlreadyInMyLibraryHelp": "系統會透過季數同集數編號嚟比較劇集。", "Small": "細", - "SmallCaps": "小型大寫字母", + "SmallCaps": "細型大寫字母", "Smaller": "更小", "SmartSubtitlesHelp": "當段片播緊外語嗰陣,系統會根據你嘅語言偏好,自動幫你揀返啱用嘅字幕。", "Sort": "排序", @@ -1687,7 +1687,7 @@ "TrackCount": "{0} 個曲目", "TranscodingLoadError": "載入唔到轉碼設定", "Translator": "翻譯", - "TV": "TV", + "TV": "電視", "TvLibraryHelp": "去睇下 {0}電視節目命名指南{1}。", "TypeOptionPluralAudio": "音頻", "TypeOptionPluralBook": "書籍", @@ -1832,10 +1832,10 @@ "PriorityIdle": "閒置", "LabelProcessPriority": "處理程序優先權", "LabelProcessPriorityHelp": "設定呢個數值會決定 CPU 優先處理 FFmpeg 快轉縮圖嘅程度。如果你發現整緊縮圖嗰陣部機變慢咗,但又唔想完全停咗佢,可以試下降低呢個優先權同埋線程數量。", - "LabelImageInterval": "圖片間隔", + "LabelImageInterval": "圖像間隔", "LabelImageIntervalHelp": "每張新快轉預覽圖之間嘅時間間隔(毫秒)。", "LabelWidthResolutions": "橫向解像度", - "LabelWidthResolutionsHelp": "產生快轉縮圖嘅寬度列表(單位係像素,用逗號隔開)。圖片會跟返原本條片嘅比例嚟整,例如 16:9 嘅片,設定 320 寬度嘅話,出嚟嘅縮圖大約係 320x180。", + "LabelWidthResolutionsHelp": "產生快轉縮圖嘅寬度列表(單位係像素,用逗號隔開)。圖像會跟返原本條片嘅比例嚟整,例如 16:9 嘅片,設定 320 寬度嘅話,出嚟嘅縮圖大約係 320x180。", "LabelTileWidth": "圖塊寬度(水平數量)", "LabelTileWidthHelp": "每個圖塊(Tile)喺 X 軸方向最多可以有幾多張圖。", "LabelTileHeight": "圖塊高度(垂直數量)", @@ -1843,7 +1843,7 @@ "LabelJpegQuality": "JPEG 質素", "LabelJpegQualityHelp": "快轉預覽圖嘅 JPEG 壓縮質素。", "LabelQscale": "Qscale(品質等級)", - "LabelQscaleHelp": "FFmpeg 輸出圖片嘅質素等級,2 係最高質,31 係最差。", + "LabelQscaleHelp": "FFmpeg 輸出圖像嘅質素等級,2 係最高質,31 係最差。", "LabelTrickplayThreads": "FFmpeg 線程數", "LabelTrickplayThreadsHelp": "設定傳送畀 FFmpeg「-threads」參數嘅線程數量。", "OptionExtractTrickplayImage": "啟用快轉預覽圖擷取", @@ -1856,7 +1856,7 @@ "MediaInfoPixelFormat": "像素格式", "NextTrack": "跳去下一項", "PreviousTrack": "跳返去前一項", - "SaveRecordingImagesHelp": "將節目表(EPG)提供者嘅圖片同媒體檔一齊儲存。", + "SaveRecordingImagesHelp": "將節目表(EPG)提供者嘅圖像同媒體檔一齊儲存。", "HeaderMediaSegmentActions": "媒體分段動作", "Never": "永不", "New": "新增", @@ -1865,8 +1865,8 @@ "OneChannel": "單聲道", "OptionNew": "新建…", "LabelProgramData": "程式數據", - "LabelSlideshowInterval": "圖片輪播", - "LabelSlideshowIntervalHelp": "輪播圖片嗰陣,每張圖停留嘅秒數。", + "LabelSlideshowInterval": "圖像輪播", + "LabelSlideshowIntervalHelp": "輪播圖像嗰陣,每張圖停留嘅秒數。", "ConfirmDeleteCollection": "你確定要刪走呢個媒體櫃?", "ConfirmDeletePlaylist": "你確定要刪走呢個播放清單?", "HeaderDeleteCollection": "刪走媒體櫃", @@ -1924,5 +1924,6 @@ "ConfirmSplitMedia": "你確定要將媒體來源拆散做獨立項目?", "Creators": "創作人", "HeaderSplitMedia": "拆分媒體", - "IndexNumber": "索引編號" + "IndexNumber": "索引編號", + "NoCastTargets": "冇可用嘅投放目標裝置" } From bbdf0eb8538b82909757ada05c0b9a434068b0a7 Mon Sep 17 00:00:00 2001 From: rimasx Date: Sun, 5 Jul 2026 05:42:33 -0400 Subject: [PATCH 015/287] Translated using Weblate (Estonian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/ --- src/strings/et.json | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/strings/et.json b/src/strings/et.json index cbacb7479c..2434e86fa7 100644 --- a/src/strings/et.json +++ b/src/strings/et.json @@ -266,7 +266,7 @@ "HeaderBlockItemsWithNoRating": "Blokeeri üksused, millel puudub või on tuvastamatu reitingu teave", "HeaderAutoDiscovery": "Võrgu avastamine", "HeaderAudioSettings": "Heli seaded", - "HeaderAudioBooks": "Audioraamatud", + "HeaderAudioBooks": "Heliraamatud", "HeaderAppearsOn": "Osaleb", "HeaderApp": "Rakendus", "HeaderApiKeysHelp": "Välistel rakendustel peab olema serveriga suhtlemiseks API võti. Võtmed väljastatakse tavalise kasutajakontoga sisse logides või rakendusele käsitsi võtme andmisega.", @@ -1906,5 +1906,15 @@ "LabelBackupWarning": "Käimas on plaanilised toimingud. Enne varundamise alustamist on soovitatav need peatada või oodata nende lõpulejõudmist.", "HeaderBackupWarning": "HOIATUS: Käimasolevad plaanilised toimingud", "UsersEditPageError": "Kasutajate muutmise lehe laadimine nurjus", - "VideoRotationNotSupported": "Video pööramist ei toetata" + "VideoRotationNotSupported": "Video pööramist ei toetata", + "CardSettings": "Kaardi seaded", + "ConfirmDeleteItemByName": "\"{0}\" kustutamisel eemaldatakse see nii failisüsteemist kui ka sinu meediakogust. Kas oled kindel, et soovid jätkata?", + "ConfirmSplitMedia": "Kas oled kindel, et soovid meediaallikad eraldi üksusteks lahutada?", + "ConfirmStillWatching": "Kas vaatad ikka veel?", + "Creators": "Autorid", + "Disabled": "Keelatud", + "HeaderSplitMedia": "Lahuta meediaallikad", + "HeaderTypeSimilarItemProviders": "Sarnase sisu pakkujad ({0})", + "IndexNumber": "Järjekorranumber", + "LabelSimilarItemProvidersHelp": "Luba ja järjesta oma eelistatud sarnase sisu pakkujad prioriteedi alusel." } From 1c1565de67a4002c8b4833c4244490bc6aacd7e2 Mon Sep 17 00:00:00 2001 From: rimasx Date: Sun, 5 Jul 2026 05:52:49 -0400 Subject: [PATCH 016/287] Translated using Weblate (Estonian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/et/ --- src/strings/et.json | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/strings/et.json b/src/strings/et.json index 2434e86fa7..c9b30cd06d 100644 --- a/src/strings/et.json +++ b/src/strings/et.json @@ -1916,5 +1916,14 @@ "HeaderSplitMedia": "Lahuta meediaallikad", "HeaderTypeSimilarItemProviders": "Sarnase sisu pakkujad ({0})", "IndexNumber": "Järjekorranumber", - "LabelSimilarItemProvidersHelp": "Luba ja järjesta oma eelistatud sarnase sisu pakkujad prioriteedi alusel." + "LabelSimilarItemProvidersHelp": "Luba ja järjesta oma eelistatud sarnase sisu pakkujad prioriteedi alusel.", + "LabelOriginalLanguage": "Algkeel", + "NoCastTargets": "Ühtegi ülekandeseadet ei leitud", + "OriginalLanguage": "Algkeel", + "StillWatchingPrompt": "Vaatamise jätkamise küsimus", + "StillWatchingOption": "{0} episoodi või {1} minutit", + "StopWatching": "Lõpeta vaatamine", + "TableOfContents": "Sisukord", + "Unwatch": "Tühista vaatamine", + "Watch": "Vaata" } From d0911a53fffc2591224afcc5eaed11b8723d45fd Mon Sep 17 00:00:00 2001 From: myrad2267 <37258280+myrad2267@users.noreply.github.com> Date: Sun, 5 Jul 2026 08:43:05 -0400 Subject: [PATCH 017/287] Translated using Weblate (French (Canada)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr_CA/ --- src/strings/fr-ca.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/fr-ca.json b/src/strings/fr-ca.json index a598ce090e..1657d99378 100644 --- a/src/strings/fr-ca.json +++ b/src/strings/fr-ca.json @@ -1924,5 +1924,6 @@ "StopWatching": "Ne plus regarder", "HeaderBackupWarning": "AVERTISSEMENT : Tâches planifiées en cours", "TableOfContents": "Table des matières", - "IndexNumber": "Numéro d'index" + "IndexNumber": "Numéro d'index", + "NoCastTargets": "Aucune cible de casting disponible" } From 677a12715ab089e0a4d71b0b08332a6cec7f0a78 Mon Sep 17 00:00:00 2001 From: myrad2267 <37258280+myrad2267@users.noreply.github.com> Date: Sun, 5 Jul 2026 08:43:25 -0400 Subject: [PATCH 018/287] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 1dc15fc78c..398c945d24 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1924,5 +1924,6 @@ "ConfirmSplitMedia": "Êtes-vous sûr de vouloir diviser les sources multimédias en éléments distincts ?", "Creators": "Créateurs", "HeaderSplitMedia": "Séparer les supports", - "IndexNumber": "Numéro d'index" + "IndexNumber": "Numéro d'index", + "NoCastTargets": "Aucune cible de casting disponible" } From 8547894ea0256c6d6eea566e3e244694eb62b67e Mon Sep 17 00:00:00 2001 From: hoanghuy309 Date: Sun, 5 Jul 2026 09:24:02 -0400 Subject: [PATCH 019/287] Translated using Weblate (Vietnamese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/ --- src/strings/vi.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/vi.json b/src/strings/vi.json index 0d7d3be800..4378dbc3ea 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -64,7 +64,7 @@ "TabServer": "Máy chủ", "TabUpcoming": "Sắp Công Chiếu", "TellUsAboutYourself": "Cho chúng tôi biết thông tin về bạn", - "ThisWizardWillGuideYou": "Trình hướng dẫn này sẽ giúp hướng dẫn bạn trong quá trình thiết lập. Để bắt đầu, vui lòng nhập tên máy chủ và chọn ngôn ngữ ưa thích của bạn.", + "ThisWizardWillGuideYou": "Phần hướng dẫn này sẽ giúp bạn thực hiện quy trình thiết lập. Để bắt đầu, nhập tên máy chủ và chọn ngôn ngữ ưa thích của bạn.", "UninstallPluginConfirmation": "Bạn có chắc muốn gỡ bỏ {0}?", "HeaderUninstallPlugin": "Gỡ bỏ Plugin", "AccessRestrictedTryAgainLater": "Truy cập hiện đang bị hạn chế. Hãy thử lại sau.", @@ -1914,7 +1914,7 @@ "CardSettings": "Cài đặt thẻ", "ConfirmDeleteItemByName": "Xóa \"{0}\" sẽ xóa nó khỏi cả hệ thống tệp và thư viện phương tiện của bạn. Bạn có chắc chắn muốn tiếp tục không?", "ConfirmStillWatching": "Bạn vẫn đang xem chứ?", - "Disabled": "Đã Tắt", + "Disabled": "Đã tắt", "LabelOriginalLanguage": "Ngôn ngữ gốc", "OriginalLanguage": "Ngôn ngữ gốc", "StillWatchingPrompt": "Nhắc Nhở Khi Vẫn Đang Xem", From 1dd19ee8c5b26b1ba213a89c71dbeb027992db3f Mon Sep 17 00:00:00 2001 From: Ulrik Date: Sun, 5 Jul 2026 11:07:47 -0400 Subject: [PATCH 020/287] Translated using Weblate (Danish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/da/ --- src/strings/da.json | 754 +++++++++++++++++++++++--------------------- 1 file changed, 402 insertions(+), 352 deletions(-) diff --git a/src/strings/da.json b/src/strings/da.json index 98b5cd885e..07cfa66c4c 100644 --- a/src/strings/da.json +++ b/src/strings/da.json @@ -10,11 +10,11 @@ "AllChannels": "Alle kanaler", "AllEpisodes": "Alle episoder", "AllLibraries": "Alle biblioteker", - "AllowHWTranscodingHelp": "Tillad modtageren at omkode afspilninger på farten. Dette kan begrænse den ellers nødvendige omkodning af serveren.", + "AllowHWTranscodingHelp": "Tillad tuneren at transkodere strømme i realtid. Dette kan bidrage til at reducere den transkodning, der kræves af serveren.", "AllowMediaConversion": "Tillad mediekonvertering", - "AllowMediaConversionHelp": "Tillad eller afvis adgang til mediekonvertering funktionen.", + "AllowMediaConversionHelp": "Tillad eller afvis adgang til mediekonverterings-funktionen.", "AllowOnTheFlySubtitleExtraction": "Tillad udtræk af undertekster på farten", - "AllowOnTheFlySubtitleExtractionHelp": "Indlejrede undertekster kan udtrækkes fra videoer og sendes til klienter i ren tekst, for at undgå video omkodning. På nogle systemer kan dette tage lang tid og forårsage at video afspilningen hænger under udtrækningen. Deaktiver dette for at indlejrede undertekster indbrændes ind med video omkodningen, hvis de ikke er understøttet på klient enheden.", + "AllowOnTheFlySubtitleExtractionHelp": "Indlejrede undertekster kan udtrækkes fra videoer og leveres til klienter som almindelig tekst for at undgå transkodning af videoen. På visse systemer kan dette tage lang tid og medføre, at videoafspilningen går i stå under udtrækningen. Deaktivér denne indstilling for at få indlejrede undertekster indbrændt ved transkodning af videoen, når de ikke understøttes direkte af klientens enhed.", "AllowRemoteAccess": "Tillad fjernadgang til serveren", "AllowRemoteAccessHelp": "Hvis ikke markeret, vil alle forbindelser udefra blive blokeret.", "AllowedRemoteAddressesHelp": "Komma separeret liste over IP-adresser eller IP/rundsendings-adresser til netværk som har tilladelse til at forbinde udefra. Hvis dette felt er tomt, er alle eksterne adresser tilladt.", @@ -27,8 +27,8 @@ "BirthLocation": "Fødselslokation", "BirthPlaceValue": "Fødselssted: {0}", "BookLibraryHelp": "Lyd- og tekstbøger er understøttet. Gennemse {0}bognavngivningsguiden{1}.", - "Browse": "Gennemse", - "ButtonAddMediaLibrary": "Tilføj Mediebibliotek", + "Browse": "Gennemsé", + "ButtonAddMediaLibrary": "Tilføj mediebibliotek", "ButtonAddScheduledTaskTrigger": "Tilføj udløser", "ButtonAddServer": "Tilføj server", "ButtonAddUser": "Tilføj bruger", @@ -36,24 +36,24 @@ "ButtonArrowRight": "Højre", "ButtonAudioTracks": "Lysspor", "ButtonBack": "Tilbage", - "ButtonCancel": "Annuller", + "ButtonCancel": "Annullér", "ButtonChangeServer": "Skift server", "ButtonEditOtherUserPreferences": "Redigér denne brugers profil, billede og personlige indstillinger.", "ButtonForgotPassword": "Glemt adgangskode", "ButtonFullscreen": "Fuld skærm", "ButtonGotIt": "Forstået", "ButtonLibraryAccess": "Biblioteksadgang", - "ButtonManualLogin": "Manuel Login", + "ButtonManualLogin": "Manuel login", "ButtonMore": "Mere", "ButtonNextTrack": "Næste spor", "ButtonParentalControl": "Forældrekontrol", "ButtonPreviousTrack": "Forrige spor", - "ButtonQuickStartGuide": "Hurtig-start Guide", - "ButtonRefreshGuideData": "Opdater guide data", + "ButtonQuickStartGuide": "Opsætningsguide", + "ButtonRefreshGuideData": "Genopfrisk guideoplysninger", "ButtonRemove": "Fjern", "ButtonRename": "Omdøb", "ButtonResume": "Genoptag", - "ButtonRevoke": "Invalider", + "ButtonRevoke": "Tilbagekald", "ButtonScanAllLibraries": "Skan alle biblioteker", "ButtonSelectDirectory": "Vælg mappe", "ButtonSelectView": "Vælg visning", @@ -61,17 +61,17 @@ "ButtonSignIn": "Log Ind", "ButtonSignOut": "Log ud", "ButtonSubmit": "Indsend", - "ButtonUninstall": "Afinstaller", + "ButtonUninstall": "Afinstallér", "ButtonWebsite": "Hjemmeside", - "CancelRecording": "Annuller optagelse", - "CancelSeries": "Annuller serie", + "CancelRecording": "Annullér optagelse", + "CancelSeries": "Annullér serie", "Categories": "Kategorier", "ChangingMetadataImageSettingsNewContent": "Ændringer til metadata eller billeder hentnings indstillinger bliver kun aktiveret til nyt indhold i dit bibliotek. For at aktivere ændringer til eksisterende titler, skal du opdatere deres metadata manuelt.", "ChannelAccessHelp": "Vælg hvilke kanaler der skal deles med denne bruger. Administratorer vil kunne redigere alle kanaler ved hjælp af metadata administratoren.", "ChannelNameOnly": "Udelukkende kanal {0}", "ChannelNumber": "Kanalnummer", "Channels": "Kanaler", - "CinemaModeConfigurationHelp": "Biograftilstand giver dig biografoplevelsen direkte ind i din stue, med muligheden for at vise forfilm og brugerdefinerede introduktioner før hovedfilmen.", + "CinemaModeConfigurationHelp": "Biograftilstand giver dig biografoplevelsen direkte ind i din stue, med muligheden for at vise trailer og brugerdefinerede introduktioner før hovedfilmen.", "Composer": "Komponist", "ConfigureDateAdded": "Konfigurer hvordan metadata for 'tilføjet' dato bestemmes, under Kontrolpanel > Biblioteker > Visning", "ConfirmDeleteImage": "Slet billede?", @@ -95,18 +95,18 @@ "Director": "Instruktør", "Disconnect": "Afbryd", "DoNotRecord": "Optag ej", - "Download": "Hent", + "Download": "Download", "DrmChannelsNotImported": "Kanaler med DRM importeres ikke.", "Edit": "Redigér", "EditImages": "Redigér billeder", "EditSubtitles": "Redigér undertekster", "EnableCinemaMode": "Biograftilstand", "EnableColorCodedBackgrounds": "Farvekodet baggrunde", - "EnableHardwareEncoding": "Aktiver hardware indkoding", + "EnableHardwareEncoding": "Aktivér hardwarekodning", "EnablePhotos": "Vis fotos", "EnablePhotosHelp": "Billeder bliver registreret og vist sammen med andre mediefiler.", "EnableStreamLooping": "Auto-gentag live streams", - "EnableStreamLoopingHelp": "Aktiver dette hvis live streams kun indeholder få sekunders data og skal efterspørgsel hele tiden. Aktivering af dette uden det er nødvendigt kan forårsage problemer.", + "EnableStreamLoopingHelp": "Aktivér denne indstilling, hvis livestreams kun indeholder data i nogle få sekunder og derfor skal hentes løbende. Hvis du aktiverer denne indstilling, når det ikke er nødvendigt, kan det medføre problemer.", "Ended": "Færdig", "EndsAtValue": "Slutter {0}", "ErrorAddingListingsToSchedulesDirect": "Der opstod en fejl ved tilføjelse af lineup til din Schedules Direct-konto. Schedules Direct tillader kun et begrænset antal opstillinger pr. Konto. Det kan være nødvendigt at du logger ind på Schedules Direct-webstedet og fjerner andre lister fra din konto, før du fortsætter.", @@ -131,7 +131,7 @@ "Fullscreen": "Fuldskærm", "General": "Generelt", "Genres": "Genrer", - "GroupVersions": "Grupper versioner", + "GroupVersions": "Gruppér versioner", "GuestStar": "Gæsteskuespiller", "GuideProviderSelectListings": "Vælg udbyder", "H264CrfHelp": "Den konstante ratefaktor (CRF) er kvalitetsindstillingen for X264 og X265 software-indkodere. Du kan sætte værdien i mellem 0 og 51, hvor de lavere værdier resulterer i bedre kvalitet (på bekostning af større filstørrelser). Fornuftige værdier er i mellem 18 og 28. Standardenværdien for X264 er 23 og for Z265 er 28, så du kan bruge dette som udgangspunkt. Hardwareindkodere bruger ikke disse indstillinger.", @@ -145,7 +145,7 @@ "HeaderActivity": "Aktivitet", "HeaderAddToCollection": "Tilføj til samling", "HeaderAddToPlaylist": "Tilføj til playliste", - "HeaderAddUpdateImage": "Tilføj/opdater billede", + "HeaderAddUpdateImage": "Tilføj/opdatér billede", "HeaderAdditionalParts": "Andre stier", "HeaderAlert": "Advarsel", "HeaderAllowMediaDeletionFrom": "Tillad Media Sletning Fra", @@ -154,17 +154,17 @@ "HeaderApiKeysHelp": "Eksterne applikationer skal have en API-nøgle for at kunne kommunikere med serveren. Nøgler udstedes ved at logge ind med en normal bruger konto, eller ved manuelt at tildele applikationen en nøgle.", "HeaderAudioSettings": "Lydindstillinger", "HeaderBlockItemsWithNoRating": "Bloker titler uden eller med ukendt bedømmelsesinformation", - "HeaderCancelRecording": "Annuller optagelse", - "HeaderCancelSeries": "Annuller serie", + "HeaderCancelRecording": "Annullér optagelse", + "HeaderCancelSeries": "Annullér serie", "HeaderCastAndCrew": "Medvirkende", "HeaderChannelAccess": "Adgang til kanaler", - "HeaderChapterImages": "Kapitel Billeder", + "HeaderChapterImages": "Kapitelbilleder", "HeaderConfigureRemoteAccess": "Konfigurer fjernadgang", "HeaderConfirmPluginInstallation": "Bekræft Installation af Plugin", "HeaderConfirmRevokeApiKey": "Invalider API nøgle", "HeaderConnectToServer": "Forbind til server", "HeaderConnectionFailure": "Forbindelsesfejl", - "HeaderContinueWatching": "Fortsæt afspilning", + "HeaderContinueWatching": "Fortsæt med at se", "HeaderDateIssued": "Udstedelsesdato", "HeaderDefaultRecordingSettings": "Standard optagelsesindstillinger", "HeaderDeleteDevice": "Slet enhed", @@ -189,7 +189,7 @@ "HeaderGuideProviders": "TV-guide-udbydere", "HeaderIdentifyItemHelp": "Indtast et eller flere søgekriterier.Fjern kriterier for at få flere søgeresultater.", "HeaderImageOptions": "Billede Præferencer", - "HeaderInstall": "Installer", + "HeaderInstall": "Installér", "HeaderInstantMix": "Øjeblikkelig Mix", "HeaderKeepRecording": "Bevar optagelse", "HeaderKeepSeries": "Behold serie", @@ -203,22 +203,22 @@ "HeaderLibraryAccess": "Adgang til biblioteker", "HeaderLibraryFolders": "Mediemapper", "HeaderLibrarySettings": "Biblioteksindstillinger", - "HeaderLiveTvTunerSetup": "TV tuner opsætning", - "HeaderLoginFailure": "Login fejl", + "HeaderLiveTvTunerSetup": "Opsætning af live-tv-tuner", + "HeaderLoginFailure": "Login mislykkedes", "HeaderMedia": "Medier", "HeaderMediaFolders": "Mediemapper", "HeaderMetadataSettings": "Indstillinger for metadata", "HeaderMoreLikeThis": "Mere som dette", "HeaderMyMedia": "Mine medier", "HeaderNewApiKey": "Ny API-nøgle", - "HeaderNewDevices": "Nye Enheder", + "HeaderNewDevices": "Nye enheder", "HeaderOnNow": "Vises nu", "HeaderOtherItems": "Andre elementer", "HeaderParentalRatings": "Aldersgrænser", "HeaderPassword": "Adgangskode", "HeaderPasswordReset": "Nulstil adgangskode", "HeaderPaths": "Stier", - "HeaderPlayAll": "Afspil Alle", + "HeaderPlayAll": "Afspil alle", "HeaderPlayback": "Medieafspilning", "HeaderPlaybackError": "Fejl i afspilning", "HeaderPleaseSignIn": "Log venligst ind", @@ -234,29 +234,29 @@ "HeaderScenes": "Scener", "HeaderSeasons": "Sæsoner", "HeaderSelectCertificatePath": "Vælg certifikatsti", - "HeaderSelectMetadataPath": "Vælg Metadata Path", + "HeaderSelectMetadataPath": "Vælg sti til metadata", "HeaderSelectMetadataPathHelp": "Vælg eller indtast stien for hvor du ønsker at opbevare metadata. Mappen skal være skrivbar.", "HeaderSelectPath": "Vælg sti", - "HeaderSelectServerCachePath": "Vælg \"Server Cache Path\"", - "HeaderSelectServerCachePathHelp": "Vælg eller indtast stien som skal benyttes til serverens cache filer. Mappen må ikke være skrivebeskyttet.", - "HeaderSelectTranscodingPath": "Vælg \"Transcoding Temporary Path\"", - "HeaderSelectTranscodingPathHelp": "Vælg eller indtast stien som bruges til medie der omkodes. Mappen skal være skrivbar.", + "HeaderSelectServerCachePath": "Vælg sti til servercache", + "HeaderSelectServerCachePathHelp": "Vælg eller indtast stien som skal benyttes til serverens cachefiler. Mappen må ikke være skrivebeskyttet.", + "HeaderSelectTranscodingPath": "Vælg midlertidig sti til transkodning", + "HeaderSelectTranscodingPathHelp": "Gennemsé eller indtast den sti, der skal bruges til at transkodere filer. Mappen skal være skrivbar.", "HeaderSendMessage": "Send besked", "HeaderSeriesOptions": "Serie-indstillinger", - "HeaderSetupLibrary": "Konfigurer dine mediebiblioteker", - "HeaderSortBy": "Sorter Efter", - "HeaderSortOrder": "Sorteringsorden", + "HeaderSetupLibrary": "Opsæt dine mediebiblioteker", + "HeaderSortBy": "Sortér efter", + "HeaderSortOrder": "Sorteringsrækkefølge", "HeaderSpecialEpisodeInfo": "Information om specialepisoder", - "HeaderSubtitleDownloads": "Undertekst Downloads", + "HeaderSubtitleDownloads": "Download af undertekster", "HeaderTaskTriggers": "Udløsere", "HeaderThisUserIsCurrentlyDisabled": "Denne bruger er for øjeblikket deaktiveret", "HeaderTracks": "Spor", - "HeaderTunerDevices": "Tuner enheder", + "HeaderTunerDevices": "Tuner-enheder", "HeaderTuners": "Tunere", - "HeaderTypeImageFetchers": "Billede Hentere ({0})", + "HeaderTypeImageFetchers": "Billedhentere ({0})", "HeaderTypeText": "Indtast tekst", - "HeaderUpcomingOnTV": "Kommende I TV", - "HeaderUploadImage": "Upload Billede", + "HeaderUpcomingOnTV": "Kommende i TV", + "HeaderUploadImage": "Upload billede", "HeaderUser": "Bruger", "HeaderUsers": "Brugere", "HeaderVideoTypes": "Videotyper", @@ -264,7 +264,7 @@ "HeaderYears": "År", "Help": "Hjælp", "HttpsRequiresCert": "For at aktivere sikre forbindelser, skal du angive et betroet SSL certifikat, såsom Let's Encrypt. Venligst angiv et certifikat eller deaktiver sikre forbindelser.", - "Identify": "Identificer", + "Identify": "Identificér", "Images": "Billeder", "ImportFavoriteChannelsHelp": "Importerer udelukkende kanaler der er markeret som favoritter på tuner-enheden.", "InstallingPackage": "Installerer {0} (version {1})", @@ -282,10 +282,10 @@ "LabelAirsBeforeEpisode": "Sendes før episode", "LabelAirsBeforeSeason": "Sendes før sæson", "LabelAlbumArtists": "Albumartister", - "LabelAllowHWTranscoding": "Tillad hardware-omkodning", + "LabelAllowHWTranscoding": "Tillad hardware-transkodning", "LabelAllowedRemoteAddresses": "Fjernadgang IP adresse filter", "LabelAllowedRemoteAddressesMode": "Fjernadgang IP adresse filter mode", - "LabelAppName": "App navn", + "LabelAppName": "App-navn", "LabelAppNameExample": "Et læseligt navn til identificering af API-nøgler. Denne indstilling ændrer ikke på funktionaliteten.", "LabelArtists": "Artister", "LabelArtistsHelp": "Adskil flere kunstnere med et semikolon.", @@ -302,10 +302,10 @@ "LabelCancelled": "Annulleret", "LabelChannels": "Kanaler", "LabelCollection": "Samling", - "LabelCommunityRating": "Fællesskabsvurdering", + "LabelCommunityRating": "Fællesskabsbedømmelse", "LabelContentType": "Indholdstype", "LabelCountry": "Land/Region", - "LabelCriticRating": "Kritiker bedømmelse", + "LabelCriticRating": "Kritikerbedømmelse", "LabelCurrentPassword": "Nuværende adgangskode", "LabelCustomCertificatePath": "Brugerdefineret SSL certifikat sti", "LabelCustomCertificatePathHelp": "Sti til PKCS #12 fil indeholdende et certifikat og privat nøgle for at aktivere TLS understøttelse på et brugerdefineret domæne.", @@ -325,8 +325,8 @@ "LabelDownMixAudioScale": "Forøg lydstyrke ved nedmiksning", "LabelDownMixAudioScaleHelp": "Forøg lydstyrken når der nedmikses. Værdien '1' vil bevare den oprindelige lydstyrke.", "LabelDownloadLanguages": "Hent sprog", - "LabelDropImageHere": "Drop billede her, eller Tryk for at vælge.", - "LabelEnableRealtimeMonitor": "Aktiver realtidsovervågning", + "LabelDropImageHere": "Træk og slip billede her, eller tryk for at gennemsé.", + "LabelEnableRealtimeMonitor": "Aktivér overvågning i realtid", "LabelEnableRealtimeMonitorHelp": "Ændringer træder i kraft øjeblikkeligt på understøttede filsystemer.", "LabelEndDate": "Slutdato", "LabelEpisodeNumber": "Episodenummer", @@ -338,9 +338,9 @@ "LabelFileOrUrl": "Fil eller URL", "LabelFinish": "Afslut", "LabelForgotPasswordUsernameHelp": "Indtast dit brugernavn, hvis du kan huske det.", - "LabelFriendlyName": "System venligt navn", + "LabelFriendlyName": "Beskrivende navn", "LabelServerNameHelp": "Dette navn bruges til at identificere serveren. Som udgangspunkt anvendes computerens navn.", - "LabelGroupMoviesIntoCollections": "Grupper film i samlinger", + "LabelGroupMoviesIntoCollections": "Gruppér film i samlinger", "LabelGroupMoviesIntoCollectionsHelp": "Film i samlinger vil blive vist som en samlet visning i filmlister.", "LabelH264Crf": "H.264-indkodning CRF", "LabelEncoderPreset": "Forudindstilling for indkodning", @@ -348,7 +348,7 @@ "LabelHardwareAccelerationTypeHelp": "Hardwareacceleration kræver yderligere konfiguration.", "LabelHttpsPort": "Lokalt HTTPS portnummer", "LabelHttpsPortHelp": "TCP port for HTTPS server.", - "LabelImageFetchersHelp": "Aktiver og ranger dine fortrukne billede-hentere i en prioriteret rækkefølge.", + "LabelImageFetchersHelp": "Aktivér og rangordn dine foretrukne billedhentere efter prioritet.", "LabelImageType": "Billedtype", "LabelImportOnlyFavoriteChannels": "Begræns til kanaler der er markeret som favoritter", "LabelKeepUpTo": "Bevar op til", @@ -357,12 +357,12 @@ "LabelKodiMetadataDateFormatHelp": "Alle datoer i NFO-filer vil blive analyseret med dette format.", "LabelKodiMetadataEnableExtraThumbs": "Kopier ekstra fanart til extrathumbs", "LabelKodiMetadataEnableExtraThumbsHelp": "Ved hentning af billeder, kan de gemmes i både extrafanart og extrathumbs. Dette giver maks. Kodi skin kompatibilitet.", - "LabelKodiMetadataEnablePathSubstitution": "Aktiver stisubstitution", - "LabelKodiMetadataEnablePathSubstitutionHelp": "Aktiver stierstatning af billedstier ved at bruge serverens stierstatnings-indstillinger.", + "LabelKodiMetadataEnablePathSubstitution": "Aktivér sti-erstatning", + "LabelKodiMetadataEnablePathSubstitutionHelp": "Aktivér sti-erstatning for billedstier ved hjælp af serverens indstillinger for sti-erstatning.", "LabelKodiMetadataSaveImagePaths": "Gem stier til billeder i NFO-filer", "LabelKodiMetadataSaveImagePathsHelp": "Dette er anbefalet hvis du har billedfiler med navne der ikke lever op til Kodis retningslinjer.", "LabelKodiMetadataUser": "Gem brugerdata til NFO-filer til", - "LabelKodiMetadataUserHelp": "Gem overvågningsdata til NFO-filer til andre applikationer.", + "LabelKodiMetadataUserHelp": "Gem visningsdata til NFO-filer til andre applikationer.", "LabelLanNetworks": "Lokale netværk", "LabelLanguage": "Sprog", "LabelLineup": "Opstilling", @@ -378,7 +378,7 @@ "LabelMessageText": "Beskedtekst", "LabelMessageTitle": "Titel på besked", "LabelMetadataDownloadLanguage": "Foretrukket sprog for nedhentning", - "LabelMetadataDownloadersHelp": "Aktiver og ranger dine foretrukne metadata kilder i prioriteret rækkefølge. Lavt rangerende kilder vil kun blive benyttet til at udfylde manglende information.", + "LabelMetadataDownloadersHelp": "Aktivér og rangordn dine foretrukne metadata-downloadere efter prioritet. Downloadere med lavere prioritet vil kun blive brugt til at udfylde manglende oplysninger.", "LabelMetadataPath": "Metadatasti", "LabelMetadataPathHelp": "Angiv en brugerdefineret lokation til hentet grafik og metadata.", "LabelMetadataReaders": "Metadata aflæsere", @@ -400,7 +400,7 @@ "LabelNewPasswordConfirm": "Gentag adgangskode", "LabelNewsCategories": "Nyhedskategorier", "LabelNumber": "Nummer", - "LabelNumberOfGuideDays": "Dage af TV-guide-data der skal hentes", + "LabelNumberOfGuideDays": "Antal dage med guidedata, der skal downloades", "LabelNumberOfGuideDaysHelp": "Hentning af flere dages TV-guide-data giver mulighed for at planlægge længere ud i fremtiden, og se flere programoversigter, men det vil også tage længere tid at hente. Auto vil vælge baseret på antallet af kanaler.", "LabelOriginalAspectRatio": "Originalt formatforhold", "LabelOriginalTitle": "Original titel", @@ -431,7 +431,7 @@ "LabelRefreshMode": "Genopfrisk tilstand", "LabelReleaseDate": "Udgivelsesdato", "LabelRemoteClientBitrateLimit": "Begrænsning på bitrate ved internet streaming (Mbps)", - "LabelRemoteClientBitrateLimitHelp": "En valgfri per-stream bitrate begrændning for alle enheder ikke på netværket. Dette er praktisk til at forhindre enheder i at efterspørge højere bitrate end din internet forbindelse kan håndtere. Dette kan resultere i forhøjet CPU load på serveren for at omkode videoer til lavere bitrate on-the-fly.", + "LabelRemoteClientBitrateLimitHelp": "En valgfri begrænsning af bithastigheden pr. stream for alle enheder uden for netværket. Dette er nyttigt for at forhindre, at enheder anmoder om en højere bithastighed, end din internetforbindelse kan klare. Dette kan medføre en øget CPU-belastning på din server, da videoerne skal transkodes i realtid til en lavere bithastighed.", "LabelRuntimeMinutes": "Spilletid", "LabelSaveLocalMetadata": "Gem illustrationer og metadata i mediemapper", "LabelSaveLocalMetadataHelp": "Lagring af illustrationer og metadata i mediemapper vil placerer dem et sted hvor de nemt kan redigeres.", @@ -441,11 +441,11 @@ "LabelSeriesRecordingPath": "Serieoptagelsessti", "LabelServerHost": "Vært", "LabelServerHostHelp": "F. eks: 192.168.1.100:8096 eller https://myserver.com", - "LabelSimultaneousConnectionLimit": "samtidige stream begrænsning", + "LabelSimultaneousConnectionLimit": "Begrænsning af samtidige streams", "LabelSkipIfAudioTrackPresent": "Undlad hvis standardlydsporet er det samme sprog", "LabelSkipIfAudioTrackPresentHelp": "Angiv ikke dette for at sikre at alle videoer har undertekster, uanset hvilket sprog lydsporet anvender.", "LabelSkipIfGraphicalSubsPresent": "Spring over, hvis videoen allerede indeholder indlejrede undertekster", - "LabelSkipIfGraphicalSubsPresentHelp": "Ved at bruger tekstbaserede undertekster kan du få en mere effektive levering og nedsætte sandsynligheden for omkodning.", + "LabelSkipIfGraphicalSubsPresentHelp": "Hvis man bevarer tekstversionerne af underteksterne, vil det medføre en mere effektiv levering og mindske sandsynligheden for, at videoen skal transkodes.", "LabelSortTitle": "Sorter titel", "LabelSource": "Kilde", "LabelSpecialSeasonsDisplayName": "Special sæson visningsnavn", @@ -459,17 +459,17 @@ "LabelTime": "Tid", "LabelTimeLimitHours": "Tidsgrænse (timer)", "LabelTitle": "Titel", - "LabelTrackNumber": "Spor nummer", - "LabelTranscodingTempPathHelp": "Definer en brugerdefineret sti til omkodede filer til klienter. Efterlad tom for at bruge standardmappen.", - "LabelTranscodingThreadCount": "Antal af omkodningstråde", - "LabelTranscodingThreadCountHelp": "Vælg det maks. antal af tråde der bruges under omkodning. Reduktion af antallet af tråde sænker CPU-forbrug, men resulterer muligvis i at konvertering ikke foregår hurtigt nok til en jævn afspilning.", + "LabelTrackNumber": "Spornummer", + "LabelTranscodingTempPathHelp": "Angiv en brugerdefineret sti til de transkodede filer, der leveres til klienterne. Lad feltet være tomt for at bruge serverens standardindstilling.", + "LabelTranscodingThreadCount": "Antal tråde ved transkodning", + "LabelTranscodingThreadCountHelp": "Vælg det maksimale antal tråde, der skal bruges ved transkodning. Hvis du reducerer antallet af tråde, vil CPU-forbruget falde, men konverteringen vil muligvis ikke foregå hurtigt nok til at sikre en jævn afspilning.", "LabelTriggerType": "Udløsertype", "LabelTunerIpAddress": "IP-adresse for Tuner", "LabelTunerType": "Tunertype", "LabelTypeMetadataDownloaders": "Kilder for metadata ({0})", "LabelTypeText": "Tekst", "LabelUser": "Bruger", - "LabelUserAgent": "Bruger agent", + "LabelUserAgent": "Brugeragent", "LabelUserRemoteClientBitrateLimitHelp": "Overskriv den globale standard-indstilling sat i server indstillinger, se Kontrolpanel > Afspilning > Streaming.", "LabelUsername": "Brugernavn", "LabelVaapiDevice": "VA API Enhed", @@ -484,14 +484,14 @@ "LatestFromLibrary": "Nyligt tilføjet i {0}", "LibraryAccessHelp": "Vælg hvilke mediemapper der skal deles med denne bruger. Administratorer vil kunne redigere alle mapper ved hjælp af metadata-redskabet.", "LiveBroadcasts": "Live-udsending", - "ManageLibrary": "Håndter bibliotek", - "MapChannels": "Kortlæg Kanaler", - "MarkPlayed": "Marker som afspillet", - "MarkUnplayed": "Marker som ikke afspillet", + "ManageLibrary": "Administrér bibliotek", + "MapChannels": "Kortlæg kanaler", + "MarkPlayed": "Markér som afspillet", + "MarkUnplayed": "Markér som ikke-afspillet", "MaxParentalRatingHelp": "Indhold med en højere grænse, skjules for denne bruger.", "MediaInfoAnamorphic": "Anamorfisk", "MediaInfoAspectRatio": "Formatforhold", - "MediaInfoBitDepth": "Bit dybde", + "MediaInfoBitDepth": "Bitdybde", "MediaInfoChannels": "Kanaler", "MediaInfoCodecTag": "Codec mærkat", "MediaInfoContainer": "Beholder", @@ -510,15 +510,15 @@ "MessageAreYouSureYouWishToRemoveMediaFolder": "Er du sikker på at fjerne denne mediemappe?", "MessageConfirmDeleteGuideProvider": "Er du sikker på at du vil slette denne TV-guide-udbyder?", "MessageConfirmDeleteTunerDevice": "Er du sikker på at du vil slette denne enhed?", - "MessageConfirmRecordingCancellation": "Annuller optagelse?", - "MessageConfirmRemoveMediaLocation": "Er du sikker på du ønsker at fjerne denne lokalisation?", + "MessageConfirmRecordingCancellation": "Annullér optagelse?", + "MessageConfirmRemoveMediaLocation": "Er du sikker på, at du vil slette denne placering?", "MessageConfirmRestart": "Er du sikker på du vil genstarte Jellyfin?", "MessageConfirmRevokeApiKey": "Er du sikker på du ønsker at invalidere denne API nøgle? Applikationens forbindelse til denne server vil blive afbrudt øjeblikkeligt.", "MessageConfirmShutdown": "Er du sikker på du ønsker at slukke for serveren?", "MessageContactAdminToResetPassword": "Kontakt venligst din systemadministrator for at nulstille din adgangskode.", "MessageCreateAccountAt": "Opret en konto hos {0}", "MessageDeleteTaskTrigger": "Er du sikker på du ønsker at slette denne task trigger?", - "MessageDownloadQueued": "Hent sat i kø.", + "MessageDownloadQueued": "Download er sat i kø.", "MessageEnablingOptionLongerScans": "Aktivering af denne indstilling kan resultere i væsentlig længere biblioteks skan.", "MessageFileReadError": "Der opstod en fejl i forsøget på at læse filen.", "MessageForgotPasswordFileCreated": "Den følgende fil er blevet oprettet på din server og indeholder instruktioner vedrørende hvordan du skal fortsætte", @@ -539,7 +539,7 @@ "MessageTheFollowingLocationWillBeRemovedFromLibrary": "Følgende medieplaceringer fjernes fra dit bibliotek", "MessageUnableToConnectToServer": "Vi kan ikke forbinde til den valgte server på nuværende tidspunkt. Sikr dig venligst at serveren kører og prøv igen.", "MessageUnsetContentHelp": "Indhold vil blive vist som almindelige mapper. For optimalt resultat, benyt metadata-redskabet til at vælge indholdstypen i undermapper.", - "MetadataManager": "Metadata-Manager", + "MetadataManager": "Metadata-administrator", "MetadataSettingChangeHelp": "Ændring af indstillinger for metadata har effekt på indholdet der indlæses fremadrettet. For at genopfriske eksisterende indhold skal du åbne detajle-skærmen og klikke på 'opdater' knappen, eller uføre en masseopdatering via 'metadata-manageren'.", "MinutesAfter": "minutter efter", "MinutesBefore": "minutter før", @@ -548,49 +548,49 @@ "MoreUsersCanBeAddedLater": "Flere brugere kan tilføjes senere fra kontrolpanelet.", "MoveLeft": "Flyt mod venstre", "MoveRight": "Flyt mod højre", - "MovieLibraryHelp": "Gennemse {0}film navngivningsguiden{1}.", + "MovieLibraryHelp": "Læs {0}vejledningen til navngivning af film{1}.", "Movies": "Film", "Mute": "Afbryd lyd", - "MySubtitles": "Mine Undertekster", + "MySubtitles": "Mine undertekster", "Name": "Navn", "Never": "Aldrig", "NewCollection": "Ny samling", "NewCollectionHelp": "Samlinger lader dig oprette personaliserede grupper af film og andet biblioteksindhold.", - "NewCollectionNameExample": "Eksempel: Star Wars samling", + "NewCollectionNameExample": "Eksempel: Star Wars-samling", "NewEpisodes": "Nye episoder", "NewEpisodesOnly": "Kun nye episoder", "News": "Nyheder", - "NextUp": "Næste afsnit", + "NextUp": "Næste", "NoNewDevicesFound": "Ingen nye enheder fundet. For at tilføje en ny tuner, luk denne dialog og skriv enhedens informationer manuelt.", "MessageNoNextUpItems": "Ingen fundet. Se dine serier!", "MessageNoPluginConfiguration": "Dette plugin har ingen indstillinger.", "NoSubtitleSearchResultsFound": "Ingen resultater fundet.", "NumLocationsValue": "{0} mapper", "OneChannel": "En kanal", - "OptionAllowAudioPlaybackTranscoding": "Tillad lydafspilning der kræver omkodning", + "OptionAllowAudioPlaybackTranscoding": "Tillad afspilning af lyd, der kræver transkodning", "OptionAllowBrowsingLiveTv": "Tillad adgang til direkte TV", "OptionAllowLinkSharing": "Tillad deling på sociale medier", "OptionAllowLinkSharingHelp": "Kun websider der indeholder medieinformationer deles. Mediefiler deles aldrig offentligt. Delinger er tidsbegrænset og udløber efter {0} dage.", "OptionAllowManageLiveTv": "Tillad administrering af live TV-optagelser", "OptionAllowMediaPlayback": "Tillad medieafspilning", - "OptionAllowMediaPlaybackTranscodingHelp": "At begrænse adgang til omkodning kan forårsage afspilningsfejl på klienter, i tilfælde af medie formater der ikke understøttes..", + "OptionAllowMediaPlaybackTranscodingHelp": "Begrænsning af adgangen til transkodning kan medføre afspilningsfejl hos klienterne på grund af medieformater, der ikke understøttes.", "OptionAllowRemoteControlOthers": "Tillad fjernstyring af andre brugere", "OptionAllowRemoteSharedDevices": "Tillad fjernstyring af delte enheder", "OptionAllowRemoteSharedDevicesHelp": "DLNA-enheder betragtes som delt, indtil en bruger begynder at kontrollere dem.", - "OptionAllowSyncTranscoding": "Tillad at hente medier og synkronisering der kræver omkodning", + "OptionAllowSyncTranscoding": "Tillad download og synkronisering af mediefiler, der kræver transkodning", "OptionAllowUserToManageServer": "Tillad denne bruger at administrere serveren", "OptionAllowVideoPlaybackRemuxing": "Tillad videoafspilning som kræver konvertering uden omkodning", - "OptionAllowVideoPlaybackTranscoding": "Tillad videoafspilning der kræver omkodning", + "OptionAllowVideoPlaybackTranscoding": "Tillad afspilning af video, der kræver transkodning", "OptionAutomaticallyGroupSeries": "Flet automatisk serier der er spredt over adskillige mapper", "OptionAutomaticallyGroupSeriesHelp": "Serier som er adskilt i flere mapper i dette bibliotek vil automatisk blive sammensat til en enkelt serie.", "OptionCommunityRating": "Fællesskabsvurdering", - "OptionCriticRating": "Kritiker Bedømmelse", + "OptionCriticRating": "Kritikerbedømmelse", "OptionDaily": "Daglig", "OptionDateAdded": "Dato for tilføjelse", "OptionDateAddedFileTime": "Brug filen oprettelsesdato", "OptionDateAddedImportTime": "Brug datoen for indskanning", "OptionDatePlayed": "Dato for afspilning", - "OptionDisableUser": "Deaktiver denne bruger", + "OptionDisableUser": "Deaktivér denne bruger", "OptionDisableUserHelp": "Serveren vil ikke tillade forbindelser fra denne bruger. Eksisterende forbindelser vil blive afbrudt øjeblikkeligt.", "OptionDisplayFolderView": "Få vist en mappevisning til at se enkle mediemapper", "OptionDisplayFolderViewHelp": "Vis mapper sammen med dine andre mediebiblioteker. Dette kan være nyttigt, hvis du gerne vil have en simpel mappevisning.", @@ -598,11 +598,11 @@ "OptionEnableAccessFromAllDevices": "Tillad adgang fra alle enheder", "OptionEnableAccessToAllChannels": "Tillad adgang til alle kanaler", "OptionEnableAccessToAllLibraries": "Tillad adgang til alle biblioteker", - "OptionEnableExternalContentInSuggestions": "Aktiver eksternt indhold i anbefalinger", - "OptionEnableExternalContentInSuggestionsHelp": "Tillad at forfilm hentet fra internettet og direkte TV programmer inkluderes i det anbefalede indhold.", - "OptionEnableForAllTuners": "Aktiver for alle tuner-enheder", + "OptionEnableExternalContentInSuggestions": "Aktivér eksternt indhold i anbefalinger", + "OptionEnableExternalContentInSuggestionsHelp": "Tillad at trailers hentet fra internettet og direkte TV-programmer inkluderes i det anbefalede indhold.", + "OptionEnableForAllTuners": "Aktivér for alle tuner-enheder", "OptionEveryday": "Hver dag", - "OptionExtractChapterImage": "Aktiver udvinding af kapitelbillede", + "OptionExtractChapterImage": "Aktivér udtrækning af kapitelbilleder", "OptionHasThemeSong": "Temasang", "OptionHasThemeVideo": "Temavideo", "OptionHideUser": "Vis ikke denne bruger på loginsiden", @@ -621,18 +621,18 @@ "OptionSaveMetadataAsHiddenHelp": "Ændring af dette vil blive anvendt på nyt metadata gemt fremadrettet. Allerede eksisterende metadata-filer opdateres næste gang de gemmes af serveren.", "OptionSpecialEpisode": "Særudsendelser", "OptionTrackName": "Nummerets navn", - "OptionTvdbRating": "TheTVDB bedømmelse", + "OptionTvdbRating": "TheTVDB-bedømmelse", "OptionUnairedEpisode": "Ikke sendte episoder", "OptionWakeFromSleep": "Vågner fra dvale", "OptionWeekdays": "Hverdage", "OptionWeekends": "Weekender", "OptionWeekly": "Ugentlig", - "OriginalAirDateValue": "Originalt sendt: {0}", + "OriginalAirDateValue": "Første udsendelsesdato: {0}", "Overview": "Overblik", "PackageInstallCancelled": "{0} (version {1}) installation annulleret.", "PackageInstallCompleted": "{0} (version {1}) installation udført.", "PackageInstallFailed": "{0} (version {1}) installationen mislykkedes.", - "ParentalRating": "Parental Rating", + "ParentalRating": "Aldersgrænse", "PasswordMatchError": "Adgangskode og bekræft adgangskode skal være ens.", "PasswordResetComplete": "Adgangskoden er blevet nulstillet.", "PasswordResetConfirmation": "Er du sikker på at adgangskoden skal nulstilles?", @@ -666,11 +666,11 @@ "RecordingCancelled": "Optagelse annulleret.", "MessageChangeRecordingPath": "Ændring af optagelsesmappe migrerer ikke eksisterende optagelser fra den gamle lokation til den nye. Flyt dem manuelt, hvis dette ønskes.", "RecordingScheduled": "Optagelse planlagt.", - "Refresh": "Opdater", - "RefreshDialogHelp": "Metadata opdateres alt efter hvilke indstillinger og internettjenester der er aktiveret i kontrolpanelet.", - "RefreshQueued": "Opdatering sat i kø.", + "Refresh": "Genopfrisk", + "RefreshDialogHelp": "Metadata genopfriskes alt efter hvilke indstillinger og internettjenester der er aktiveret i kontrolpanelet.", + "RefreshQueued": "Genopfriskning sat i kø.", "ReleaseDate": "Udgivelsesdato", - "RememberMe": "Husk Mig", + "RememberMe": "Husk mig", "RemoveFromCollection": "Fjern fra samling", "RemoveFromPlaylist": "Fjern fra playliste", "Repeat": "Gentag", @@ -710,21 +710,21 @@ "SimultaneousConnectionLimitHelp": "Det maks. antal samtidige streams. Skriv 0 for ubegrænset.", "SkipEpisodesAlreadyInMyLibrary": "Optag ej episoder, som allerede findes i mit bibliotek", "SkipEpisodesAlreadyInMyLibraryHelp": "Episoder bliver sammenlignet på sæson og episodenummer, når muligt.", - "SortChannelsBy": "Sorter kanaler efter", + "SortChannelsBy": "Sortér kanaler efter", "SortName": "Sorteringsnavn", "Sports": "Sport", "StopRecording": "Stop optagelse", "Studios": "Studier", - "SubtitleDownloadersHelp": "Aktiver og ranger dine foretrukne kilder for undertekster i prioriteret rækkefølge.", + "SubtitleDownloadersHelp": "Aktivér og rangordn dine foretrukne undertekst-downloadere efter prioritet.", "Subtitles": "Undertekster", "Sunday": "Søndag", "TabAccess": "Adgang", "TabAdvanced": "Avanceret", "TabDashboard": "Kontrolpanel", - "TabLatest": "Nyeste tilføjelser", + "TabLatest": "Nyligt tilføjet", "TabMusic": "Musik", - "TabNetworks": "TV Netværk", - "TabNfoSettings": "NFO Indstillinger", + "TabNetworks": "Tv-kanaler", + "TabNfoSettings": "NFO-indstillinger", "TabOther": "Andet", "TabParentalControl": "Forældrekontrol", "TabPlugins": "Tilføjelser", @@ -738,7 +738,7 @@ "TitlePlayback": "Afspilning", "TrackCount": "{0} numre", "Tuesday": "Tirsdag", - "TvLibraryHelp": "Gennemgå {0} TV-navneguiden {1}.", + "TvLibraryHelp": "Læs {0}vejledningen til navngivning af tv-programmer{1}.", "UninstallPluginConfirmation": "Er du sikker på du vil afinstallere {0}?", "HeaderUninstallPlugin": "Afinstaller plugin", "Unmute": "Genoptag lyd", @@ -759,7 +759,7 @@ "ValueTimeLimitMultiHour": "Tidsbegrænsning: {0} timer", "ValueTimeLimitSingleHour": "Tidsbegrænsning: 1 time", "ViewAlbum": "Vis album", - "ViewPlaybackInfo": "Vis afspilnings information", + "ViewPlaybackInfo": "Vis afspilningsoplysninger", "Wednesday": "Onsdag", "WelcomeToProject": "Velkommen til Jellyfin!", "WizardCompleted": "Det er alt, hvad vi har brug for nu. Jellyfin er begyndt at indsamle information om dit mediebibliotek. Se nogle af vores apps, og klik derefter på Udfør for at se Kontrolpanel.", @@ -783,11 +783,11 @@ "Aired": "Udgivet", "AllComplexFormats": "Alle komplekse formater (ASS, SSA, VOBSUB, PGS, SUB,IDX, ...)", "AllLanguages": "Alle sprog", - "AlwaysPlaySubtitles": "Afspil Altid", + "AlwaysPlaySubtitles": "Afspil altid", "AlwaysPlaySubtitlesHelp": "Undertekster, der matcher dine sprogindstillinger, vil altid blive indlæst uanset lydsprog.", "Shows": "Serier", "Songs": "Sange", - "AnyLanguage": "Hvilken som helst sprog", + "AnyLanguage": "Ethvert sprog", "Art": "Illustration", "Ascending": "Stigende", "Auto": "Automatisk", @@ -804,81 +804,81 @@ "ButtonSend": "Send", "ButtonStart": "Start", "ButtonStop": "Stop", - "ButtonTrailer": "Forfilm", + "ButtonTrailer": "Trailer", "ColorPrimaries": "Primære farver", "ColorSpace": "Farverum", "ColorTransfer": "Farveoverførsel", - "CommunityRating": "Fællesskab bedømmelse", + "CommunityRating": "Fællesskabsbedømmelse", "ConfirmEndPlayerSession": "Ønsker du at slukke Jellyfin på {0}?", "ContinueWatching": "Fortsæt med at se", - "CriticRating": "Kritiker bedømmelse", + "CriticRating": "Kritikerbedømmelse", "DateAdded": "Dato tilføjet", "DatePlayed": "Dato afspillet", "Default": "Standard", "DefaultSubtitlesHelp": "Undertekster bliver indlæst baseret på standard- og tvungne flag i de integrerede metadata. Sprogpræferencer bliver overvejet når flere valg er tilgængelige.", - "Depressed": "Ikke Trykket", + "Depressed": "Ikke trykket", "Descending": "Faldene", - "Desktop": "Skrivebord (Legacy)", + "Desktop": "Desktop (ældre version)", "DirectPlaying": "Afspiller direkte", - "DirectStreamHelp1": "Video strømmen er kompatibel med enheden, men har et ikke kompatibelt lyd format (DTS, TrueHD osv.) eller et forkert antal kanaler. Video stømmen vil blive genpakket tabsfrit før den streames til enheden. Kun lyd strømmen vil blive genpakket.", + "DirectStreamHelp1": "Videostrømmen er kompatibel med enheden, men har et inkompatibelt lydformat (DTS, Dolby TrueHD osv.) eller et inkompatibelt antal lydkanaler. Videostrømmen ompakkes tabsløst i realtid, inden den sendes til enheden. Det er kun lydstrømmen, der transkodes.", "DirectStreamHelp2": "Strømforbruget ved direkte streaming afhænger oftest af lydprofilen. Kun video er ukomprimeret.", "DirectStreaming": "Direkte streaming", "Directors": "Instruktører", "Disc": "Disk", "Display": "Visning", "DisplayInMyMedia": "Visning på hjemmeskærm", - "DisplayInOtherHomeScreenSections": "Vis på hjemmeskærm sektioner såsom 'Nyligt tilføjet medier' og 'se videre'", - "DisplayMissingEpisodesWithinSeasons": "Vis manglende afsnit inde i sæsoner", + "DisplayInOtherHomeScreenSections": "Vis på hjemmeskærm-sektioner såsom 'Nyligt tilføjede medier' og ‘Fortsæt med at se’", + "DisplayMissingEpisodesWithinSeasons": "Vis manglende episoder inde i sæsoner", "DisplayMissingEpisodesWithinSeasonsHelp": "Dette skal også være aktiveret for TV-biblioteker i serverens indstillinger.", "DisplayModeHelp": "Vælg det ønskede tema for grænsefladen.", "Down": "Ned", "DownloadsValue": "{0} hentninger", "DropShadow": "Baggrundsskygge", "EditMetadata": "Redigér metadata", - "EnableBackdropsHelp": "Vis baggrundsbilleder i baggrunden af nogle sider mens man gennemser biblioteket.", - "EnableDisplayMirroring": "Visning afspejling", - "EnableExternalVideoPlayers": "Eksterne video afspillere", + "EnableBackdropsHelp": "Vis baggrundsbilleder i baggrunden af nogle sider mens man gennemsér biblioteket.", + "EnableDisplayMirroring": "Skærmdeling", + "EnableExternalVideoPlayers": "Eksterne videoafspillere", "EnableExternalVideoPlayersHelp": "En ekstern afspiller menu vil blive vist når video afspilning starter.", "EnableNextVideoInfoOverlay": "Vis næste video information mens der afspilles", - "EnableNextVideoInfoOverlayHelp": "I slutningen af en video, vis information om den næste video i nuværende afspilningsliste.", - "EnableThemeSongsHelp": "Afspil tema sange i baggrunden mens man gennemser biblioteket.", - "EnableThemeVideosHelp": "Afspil tema videoer i baggrunden mens man gennemser biblioteket.", - "Episodes": "Afsnit", + "EnableNextVideoInfoOverlayHelp": "Når en video er slut, skal der vises oplysninger om den næste video i den aktuelle playliste.", + "EnableThemeSongsHelp": "Afspil temasange i baggrunden mens man gennemsér biblioteket.", + "EnableThemeVideosHelp": "Afspil temavideoer i baggrunden mens man gennemsér biblioteket.", + "Episodes": "Episoder", "ErrorDeletingItem": "Der skete en fejl ved sletningen af mediet fra Jellyfin. Tjek venligst at Jellyfin har skrive-adgang til mediemappen og prøv igen.", - "ExtraLarge": "Ekstra Stor", + "ExtraLarge": "Ekstra stor", "Extras": "Bonusmateriale", "Features": "Funktioner", "Filters": "Filtre", "FormatValue": "Format: {0}", "Genre": "Genre", - "GroupBySeries": "Grupper efter serie", + "GroupBySeries": "Gruppér efter serie", "Guide": "Programoversigt", "GuideProviderLogin": "Log ind", "HeaderAdmin": "Administration", "HeaderApp": "App", - "HeaderAppearsOn": "Forekommer I", + "HeaderAppearsOn": "Forekommer i", "HeaderAudioBooks": "Lydbøger", - "HeaderBranding": "Mærkning", - "HeaderContinueListening": "Fortsæt med At Høre", - "HeaderDownloadSync": "Hentning Og Sync", - "HeaderLibraryOrder": "Bibliotektsorden", - "HeaderMusicQuality": "Musik Kvalitet", - "HeaderMyMediaSmall": "Mine Medier (lille)", + "HeaderBranding": "Branding", + "HeaderContinueListening": "Fortsæt med at lytte", + "HeaderDownloadSync": "Download og synkronisering", + "HeaderLibraryOrder": "Biblioteksrækkefølge", + "HeaderMusicQuality": "Musikkvalitet", + "HeaderMyMediaSmall": "Mine medier (lille)", "HeaderNavigation": "Navigation", - "HeaderNextEpisodePlayingInValue": "Næste afsnit afspilles om {0}", + "HeaderNextEpisodePlayingInValue": "Næste episode afspilles om {0}", "HeaderNextVideoPlayingInValue": "Næste video afspilles om {0}", - "HeaderPhotoAlbums": "Foto Albummer", - "HeaderPlayOn": "Afspil På", - "HeaderSecondsValue": "{0} Sekunder", - "HeaderSeriesStatus": "Serie status", - "HeaderStartNow": "Start Nu", + "HeaderPhotoAlbums": "Fotoalbum", + "HeaderPlayOn": "Afspil på", + "HeaderSecondsValue": "{0} sekunder", + "HeaderSeriesStatus": "Serie-status", + "HeaderStartNow": "Start nu", "HeaderStatus": "Status", "HeaderStopRecording": "Stop optagelse", - "HeaderSubtitleAppearance": "Undertekst Udseende", - "HeaderVideoQuality": "Video Kvalitet", - "HeaderVideoType": "Video Type", + "HeaderSubtitleAppearance": "Underteksters udseende", + "HeaderVideoQuality": "Videokvalitet", + "HeaderVideoType": "Videotype", "Hide": "Skjul", - "HideWatchedContentFromLatestMedia": "Skjul set indhold fra 'Nyligt tilføjet medier'", + "HideWatchedContentFromLatestMedia": "Skjul set indhold fra 'Nyligt tilføjede medier'", "Home": "Hjem", "Horizontal": "Horisontalt", "Label3DFormat": "3D format", @@ -890,30 +890,30 @@ "LabelCertificatePasswordHelp": "Hvis dit certifikat kræver en adgangskode, skriv det venligst her.", "LabelDashboardTheme": "Serverkontrolpanel-tema", "LabelDateTimeLocale": "Dato og tid område", - "LabelDefaultScreen": "Standard skærm", + "LabelDefaultScreen": "Standardskærm", "LabelDisplayLanguage": "Visningssprog", "LabelDisplayLanguageHelp": "Oversættelse af Jellyfin er et vedvarende projekt.", "LabelDisplayMode": "Visningstilstand", "LabelDropShadow": "Drop skygge", "LabelDynamicExternalId": "{0} ID", - "LabelEnableHardwareDecodingFor": "Aktiver hardware afkodning for", + "LabelEnableHardwareDecodingFor": "Aktivér hardwareafkodning for", "LabelFont": "Skrifttype", "LabelFormat": "Format", "LabelHomeNetworkQuality": "Hjemme netværk kvalitet", "LabelHomeScreenSectionValue": "Hjemmeskærm sektion {0}", - "LabelInternetQuality": "Internet kvalitet", - "LabelLogs": "Log", + "LabelInternetQuality": "Internetkvalitet", + "LabelLogs": "Logfiler", "LabelMaxChromecastBitrate": "Google Cast streaming kvalitet", "LabelMetadata": "Metadata", "LabelPreferredSubtitleLanguage": "Foretrukket undertekst sprog", "LabelProfileContainer": "Beholder", - "LabelReasonForTranscoding": "Grund til omkodning", + "LabelReasonForTranscoding": "Årsag til transkodning", "LabelScreensaver": "Pauseskærm", "LabelSelectFolderGroups": "Grupper automatisk indhold fra følgende mapper ind i visninger såsom 'Film', 'Musik' og 'TV'", "LabelSelectFolderGroupsHelp": "Mapper der ikke er valgt vil blive vist for sig selv i deres egen visning.", "LabelSkipBackLength": "Spol tilbage-længde", "LabelSkipForwardLength": "Gå fremad længde", - "LabelSortBy": "Sorter efter", + "LabelSortBy": "Sortér efter", "LabelSortOrder": "Sorteringsorden", "LabelStatus": "Status", "LabelTVHomeScreen": "TV modus hjemmeskærm", @@ -924,7 +924,7 @@ "LabelTextSize": "Tekststørrelse", "LabelType": "Type", "LabelVersion": "Version", - "LabelVideoCodec": "Video codec", + "LabelVideoCodec": "Videokodek", "LabelYear": "År", "Large": "Stor", "LearnHowYouCanContribute": "Lær hvordan du kan bidrage.", @@ -933,12 +933,12 @@ "Live": "Direkte", "LiveTV": "Direkte TV", "Logo": "Logo", - "ManageRecording": "Håndter optagelse", + "ManageRecording": "Administrér optagelse", "MediaInfoBitrate": "Bitrate", "MediaInfoCodec": "Codek", "MediaInfoFramerate": "Billederate", "MediaInfoInterlaced": "Interlaceret", - "MediaInfoLayout": "Udlæg", + "MediaInfoLayout": "Layout", "MediaInfoRefFrames": "Ref billeder", "MediaInfoSampleRate": "Samplingsfrekvens", "MediaIsBeingConverted": "Mediet bliver konverteret til et format der er kompatibel med enheden der afspiller mediet.", @@ -946,7 +946,7 @@ "MessageImageFileTypeAllowed": "Kun JPEG og PNG filer er understøttet.", "MessageImageTypeNotSelected": "Vælg venligst en type af billede i drop-down menuen.", "MessagePlayAccessRestricted": "Afspilning af dette indhold er begrænset. Kontakt venligst server administratoren for mere information.", - "Mobile": "Mobil (Legacy)", + "Mobile": "Mobil (ældre version)", "Next": "Næste", "No": "Nej", "NoSubtitlesHelp": "Undertekster vil ikke blive indlæst som standard. De kan slåes til manuelt under afspilning.", @@ -965,7 +965,7 @@ "Photos": "Fotos", "PlayCount": "Afspilninger", "PlayNext": "Afspil næste", - "PlayNextEpisodeAutomatically": "Afspil næste afsnit automatisk", + "PlayNextEpisodeAutomatically": "Afspil næste episode automatisk", "PlaybackErrorNoCompatibleStream": "Denne klient er ikke kompatibel med mediet, og serveren sender ikke et kompatibelt medieformat.", "Playlists": "Playlister", "Previous": "Forrige", @@ -976,10 +976,10 @@ "RefreshMetadata": "Genopfrisk metadata", "RepeatAll": "Gentag alle", "RepeatMode": "Gentagelsestilstand", - "RepeatOne": "Gentag en", + "RepeatOne": "Gentag én", "ScanForNewAndUpdatedFiles": "Skan for nye og opdaterede filer", "Schedule": "Tidsplan", - "SeriesDisplayOrderHelp": "Sorter episoder efter udsendelsesdato, DVD-orden, eller absolut nummerering.", + "SeriesDisplayOrderHelp": "Sortér episoder efter udsendelsesdato, DVD-orden, eller absolut nummerering.", "ShowTitle": "Vis titlen", "ShowYear": "Vis året", "Small": "Lille", @@ -987,30 +987,30 @@ "Smaller": "Mindre", "Smart": "Klog", "SmartSubtitlesHelp": "Undertekster der matcher det foretrukne sprog vil blive indlæst når lyden er et fremmed sprog.", - "Sort": "Sorter", - "SortByValue": "Sorter efter {0}", + "Sort": "Sortér", + "SortByValue": "Sortér efter {0}", "SubtitleAppearanceSettingsAlsoPassedToCastDevices": "Disse indstilinger bliver aktiveret for enhver Google Cast afspilning på denne enhed.", "SubtitleAppearanceSettingsDisclaimer": "Følgende indstillinger bliver ikke aktiveret på grafiske undertekster nævnt ovenfor eller ASS/SSA undertekster der har deres egen indbyggede stil.", "Suggestions": "Forslag", "TV": "TV", - "TabLogs": "Log", + "TabLogs": "Logfiler", "TabServer": "Server", "TabStreaming": "Streaming", "Tags": "Mærker", "TagsValue": "Mærker: {0}", - "ThemeSongs": "Tema sange", - "ThemeVideos": "Tema videoer", + "ThemeSongs": "Tema-sange", + "ThemeVideos": "Temavideoer", "TheseSettingsAffectSubtitlesOnThisDevice": "Disse indstillinger påvirker kun undertekster på denne enhed", "Thumb": "Tommel", - "Trailers": "Forfilm", - "Transcoding": "Omkodning", + "Trailers": "Trailere", + "Transcoding": "Transkodning", "Uniform": "Ensformig", "Unplayed": "Uafspillet", "Up": "Op", "Upload": "Upload", "ValueMinutes": "{0} minutter", "ValueOneAlbum": "1 album", - "ValueOneEpisode": "1 afsnit", + "ValueOneEpisode": "1 episode", "ValueSeconds": "{0} sekunder", "ValueSpecialEpisodeName": "Special - {0}", "Vertical": "Vertikal", @@ -1020,9 +1020,9 @@ "LabelServerName": "Servernavn", "LabelUserLoginAttemptsBeforeLockout": "Mislykkede loginforsøg før bruger lukkes ude", "ButtonAddImage": "Tilføj billede", - "AllowFfmpegThrottlingHelp": "Når en omkodning eller remux kommer langt nok foran den aktuelle afspilningsposition, skal du sætte processen på pause, så den bruger færre ressourcer. Dette er mest nyttigt, når du ser uden ofte at søge. Slå dette fra, hvis du oplever afspilningsproblemer.", - "AllowFfmpegThrottling": "Begræns omkodninger", - "AlbumArtist": "Album Kunstner", + "AllowFfmpegThrottlingHelp": "Når en transkodning eller remux er kommet langt nok foran den aktuelle afspilningsposition, skal du sætte processen på pause, så den bruger færre ressourcer. Dette er især nyttigt, når du ser video uden at springe frem og tilbage ofte. Slå denne funktion fra, hvis du oplever problemer med afspilningen.", + "AllowFfmpegThrottling": "Begræns transkodninger", + "AlbumArtist": "Albumkunstner", "Album": "Album", "EveryHour": "Hver time", "EveryXMinutes": "Hvert {0} minut", @@ -1036,40 +1036,40 @@ "PathNotFound": "Stien blev ikke fundet. Sørg for, at stien er gyldig, og prøv igen.", "Yadif": "Yet Another DeInterlacing Filter (YADIF)", "TabNetworking": "Netværk", - "SubtitleOffset": "Undertekst Offset", + "SubtitleOffset": "Undertekstforskydning", "SelectAdminUsername": "Vælg et brugernavn til administrator kontoen.", "Season": "Sæson", "Premiere": "Premiere", - "PreferEmbeddedEpisodeInfosOverFileNames": "Foretrækker integreret episode information frem for filnavne", - "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Brug episode informationen fra de integrerede metadata, hvis den er tilgængelig.", + "PreferEmbeddedEpisodeInfosOverFileNames": "Foretrækker indlejrede episodeoplysninger frem for filnavne", + "PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Brug oplysningerne om episoden fra de indlejrede metadata, hvis de er tilgængelige.", "PlaybackData": "Afspilningsdata", "Person": "Person", "PasswordResetProviderHelp": "Vælg en leverandør af 'nulstil adgangskode', der skal bruges, når denne bruger anmoder om en nulstilling af adgangskode.", "OptionRandom": "Tilfældig", "OptionLoginAttemptsBeforeLockoutHelp": "En værdi på nul betyder at standarden på tre forsøg for normale brugere, og fem for administratorer følges. Indstilling af dette til -1 vil deaktivere funktionen.", "OptionLoginAttemptsBeforeLockout": "Bestemmer hvor mange forkerte loginforsøg der skal til, før brugeren bliver låst ude.", - "OptionForceRemoteSourceTranscoding": "Tving omkodning af eksterne mediekilder (som direkte TV)", + "OptionForceRemoteSourceTranscoding": "Tving transkodning af eksterne mediekilder, såsom live-tv", "NoCreatedLibraries": "Det ser ud til, at du ikke har oprettet nogen biblioteker endnu. {0} Vil du oprette en nu? {1}", - "MusicVideo": "Musik Video", - "MusicLibraryHelp": "Gennemgå {0} guide til navngivning af musik {1}.", - "MusicArtist": "Musik Artist", - "MusicAlbum": "Musik Album", + "MusicVideo": "Musikvideo", + "MusicLibraryHelp": "Læs {0}vejledningen til navngivning af musik{1}.", + "MusicArtist": "Musiker", + "MusicAlbum": "Musikalbum", "Movie": "Film", - "MoreMediaInfo": "Medieinfo", + "MoreMediaInfo": "Medieoplysninger", "MessageNoServersAvailable": "Der er ikke fundet nogen servere ved hjælp af den automatiske serveropdagelse.", "MessageNoCollectionsAvailable": "Samlinger tillader dig at nyde personlige grupperinger af film, serier og album. Klik på '+' knappen for at skabe en samling.", "MessageConfirmAppExit": "Vil du afslutte?", "LabelWeb": "Web", "LabelVideoResolution": "Videoopløsning", - "LabelVideoBitrate": "Video bitrate", - "LabelTranscodingProgress": "Omkodningsforløb", - "LabelTranscodingFramerate": "Omkodnings opdateringshastighed", - "LabelTranscodes": "Omkodede filer", - "LabelTranscodePath": "Omkodningssti", + "LabelVideoBitrate": "Videobithastighed", + "LabelTranscodingProgress": "Status for transkodning", + "LabelTranscodingFramerate": "Transkodning-billedfrekvens", + "LabelTranscodes": "Transkodede filer", + "LabelTranscodePath": "Transkodningssti", "LabelStreamType": "Streamtype", "LabelSize": "Størrelse", "LabelPleaseRestart": "Ændringer vil træde i kraft efter webklienten er blevet genindlæst manuelt.", - "LabelPlayMethod": "Afspilnings metode", + "LabelPlayMethod": "Afspilningsmetode", "LabelPlayerDimensions": "Afspillerdimensioner", "LabelPlayer": "Afspiller", "LabelPasswordResetProvider": "Udbyder til nulstilling af adgangskode", @@ -1079,20 +1079,20 @@ "LabelBaseUrl": "Basis-URL", "LabelBaseUrlHelp": "Du kan tilføje et brugerdefineret underkatalog til serverens URL. For eksempel: http://example.com/<baseurl> ", "LabelDroppedFrames": "Tabte frames", - "LabelDeinterlaceMethod": "Konverteringsmetode", - "LabelCorruptedFrames": "Korrupte frames", + "LabelDeinterlaceMethod": "Metode til fjernelse af interlacing", + "LabelCorruptedFrames": "Beskadigede billeder", "LabelBitrate": "Bitrate", "LabelAuthProvider": "Autentifikationsudbyder", "LabelAudioSampleRate": "Lydopsamlingsfrekvens", - "LabelAudioCodec": "Lyd codec", - "LabelAudioChannels": "Lyd kanaler", - "LabelAudioBitrate": "Lyd bitrate", - "LabelAudioBitDepth": "Lyd bitdybde", + "LabelAudioCodec": "Lydkodek", + "LabelAudioChannels": "Lydkanaler", + "LabelAudioBitrate": "Lydbitrate", + "LabelAudioBitDepth": "Lydens bitdybde", "FetchingData": "Henter øvrige data", - "Episode": "Afsnit", - "DeinterlaceMethodHelp": "Vælg hvilken konverteringsmetode der skal bruges til omkodning af indhold. Når hardware-acceleration der understøtter hardware-deinterlacing er slået til, vil dette blive brugt i stedet for denne indstilling.", + "Episode": "Episode", + "DeinterlaceMethodHelp": "Vælg den deinterlacing-metode, der skal anvendes ved softwaretranskodning af interlaced indhold. Når hardwareacceleration med understøttelse af hardwarebaseret deinterlacing er aktiveret, vil den hardwarebaserede deinterlacer blive anvendt i stedet for denne indstilling.", "CopyStreamURLSuccess": "URL kopieret.", - "CopyStreamURL": "Kopier stream URL", + "CopyStreamURL": "Kopier stream-URL", "ClientSettings": "Klient", "ButtonSplit": "Opdel", "BoxSet": "Box Set", @@ -1102,22 +1102,22 @@ "EveryXHours": "Hver {0} time", "OnApplicationStartup": "Ved programstart", "UnsupportedPlayback": "Jellyfin kan ikke dekryptere indhold, der er beskyttet af DRM, men alt indhold vil blive forsøgt afspillet uanset, inklusive beskyttede titler. Nogle filer kan eventuelt vises med sort skærm på grund af kryptering eller andre funktioner, der ikke understøttes, såsom interaktive titler.", - "Filter": "Filtrer", - "New": "Nye", + "Filter": "Filtrér", + "New": "Ny", "ButtonTogglePlaylist": "Playliste", "ButtonSyncPlay": "SyncPlay", "HeaderRemoteAccessSettings": "Fjernadgangs-indstillinger", "HeaderHttpsSettings": "HTTPS-indstillinger", "EnableAutoCast": "Brug som standard", "Data": "Data", - "ButtonActivate": "Aktiver", - "LabelAudioInfo": "Lyd Information", - "LabelVideoInfo": "Video Information", - "LabelTranscodingInfo": "Omkodnings Information", - "LabelSyncPlayInfo": "SyncPlay Information", - "LabelOriginalMediaInfo": "Original Media Information", - "LabelRemuxingInfo": "Remuxing Information", - "LabelDirectStreamingInfo": "Direkte afspillings information", + "ButtonActivate": "Aktivér", + "LabelAudioInfo": "Lydoplysninger", + "LabelVideoInfo": "Videooplysninger", + "LabelTranscodingInfo": "Oplysninger om transkodning", + "LabelSyncPlayInfo": "Oplysninger om SyncPlay", + "LabelOriginalMediaInfo": "Oprindelige medieoplysninger", + "LabelRemuxingInfo": "Oplysninger om remuxing", + "LabelDirectStreamingInfo": "Oplysninger om direkte streaming", "PreferFmp4HlsContainer": "Foretræk fMP4-HLS Media Container", "AllowHevcEncoding": "Tillad indkodning i HEVC format", "LabelSelectAudioChannels": "Kanaler", @@ -1134,50 +1134,50 @@ "ButtonPlayer": "Afspiller", "Authorize": "Tillad", "ApiKeysCaption": "Liste over aktive API nøgler", - "EnableBlurHash": "Aktiver slørrede erstatninger for billeder", + "EnableBlurHash": "Aktivér slørede pladsholdere for billeder", "DeleteDevicesConfirmation": "Er du sikker på at du ønsker at slette alle enheder? Alle andre sessioner vil blive logget ud. Enhederne vil dukke op igen næste gang en bruger logger ind.", "DeleteAll": "Slet alle", - "EnableDetailsBanner": "Detalje banner", - "EnableDecodingColorDepth10Vp9": "Aktiver 10-bit hardware dekodning for VP9", - "EnableDecodingColorDepth10Hevc": "Aktiver 10-bit hardware dekodning for HEVC", + "EnableDetailsBanner": "Detaljebanner", + "EnableDecodingColorDepth10Vp9": "Aktivér 10-bit hardwareafkodning for VP9", + "EnableDecodingColorDepth10Hevc": "Aktivér 10-bit hardwareafkodning for HEVC", "AllowTonemappingHelp": "Tonemapping kan omdanne det dynamiske område for en video fra HDR til SDR, samtidig med at billeddetaljer og farver opretholdes, hvilket er meget vigtig information til at repræsentere den originale scene. Fungerer i øjeblikket kun, når der omkodes videoer med indlejret HDR10- eller HLG-metadata. Dette kræver den tilsvarende GPGPU-runtime.", "LabelCurrentStatus": "Aktuel status", "LabelChromecastVersion": "Google Cast-version", "LabelAutomaticDiscoveryHelp": "Tillad, at applikationer automatisk finder Jellyfin ved hjælp af UDP-port 7359.", - "LabelAutomaticDiscovery": "Aktiver automatisk opdagelse", + "LabelAutomaticDiscovery": "Aktivér automatisk registrering", "Image": "Billede", "HeaderUploadSubtitle": "Overfør undertekster", - "HeaderSyncPlaySelectGroup": "Tilslut en gruppe", - "HeaderSyncPlayEnabled": "SyncPlay aktiveret", + "HeaderSyncPlaySelectGroup": "Deltag i en gruppe", + "HeaderSyncPlayEnabled": "SyncPlay er aktiveret", "HeaderServerAddressSettings": "Serveradresse-indstillinger", "HeaderPortRanges": "Firewall- og proxy-indstillinger", "HeaderNewRepository": "Nyt arkiv", - "HeaderNetworking": "IP Protokoller", + "HeaderNetworking": "IP-protokoller", "HeaderDVR": "DVR", "HeaderDeleteDevices": "Fjern alle enheder", "HeaderAutoDiscovery": "Netværksopdagelse", "HeaderAddUser": "Tilføj bruger", - "HeaderAddUpdateSubtitle": "Tilføj/Opdater undertekster", + "HeaderAddUpdateSubtitle": "Tilføj/opdatér undertekster", "EnableQuickConnect": "Aktivér Lyn-forbind på denne server", "EnableFasterAnimationsHelp": "Brug hurtigere animationer og overgange.", "EnableFasterAnimations": "Hurtigere animationer", - "DisablePlugin": "Deaktiver", - "EnablePlugin": "Aktiver", + "DisablePlugin": "Deaktivér", + "EnablePlugin": "Aktivér", "DirectPlayHelp": "Kildefilen er kompatibel med denne klient og modtages uden brug af omkodning.", - "EnableEnhancedNvdecDecoder": "Aktiver forbedret NVDEC-dekoder", + "EnableEnhancedNvdecDecoder": "Aktivér udvidet NVDEC-dekoder", "MessagePlaybackError": "Der opstod en fejl under afspilning af denne fil på din Google Cast-modtager.", "MessageChromecastConnectionError": "Din Google Cast-modtager kan ikke komme i kontakt med Jellyfin. Undersøg venligst forbindelsen og prøv igen.", "LabelPlaybackInfo": "Afspilningsinformation", "Remuxing": "Ompakning", "AspectRatioFill": "Stræk", "AspectRatioCover": "Zoom", - "EnableFallbackFont": "Aktiver reserveskrifttyper", + "EnableFallbackFont": "Aktivér reserveskrifttyper", "Writers": "Forfattere", - "ViewAlbumArtist": "Vis album kunstner", + "ViewAlbumArtist": "Vis albumkunstner", "VideoAudio": "Video Lyd", "Video": "Video", "TabRepositories": "Arkiver", - "SyncPlayGroupDefaultTitle": "{0}'s gruppe", + "SyncPlayGroupDefaultTitle": "{0}s gruppe", "Subtitle": "Undertekster", "StopPlayback": "Stop afspilning", "SpecialFeatures": "Særlige funktioner", @@ -1186,13 +1186,13 @@ "SelectServer": "Vælg server", "Restart": "Genstart", "ResetPassword": "Nulstil adgangskode", - "QuickConnectNotAvailable": "Bed din server administrator om at aktivere Lyn-forbind", + "QuickConnectNotAvailable": "Bed din serveradministrator om at aktivere Lyn-forbind", "QuickConnectNotActive": "Lyn-forbind er ikke aktiveret på denne server", - "QuickConnectInvalidCode": "Ugyldig Lyn-forbind-kode", + "QuickConnectInvalidCode": "Ugyldig kode til Lyn-forbind", "QuickConnectDescription": "For at logge ind med Lyn-forbind vælg da 'Lyn-forbind'-knappen på den enhed du er logget ind fra og indtast den viste kode nedenfor.", - "QuickConnectDeactivated": "Lyn-forbind blev deaktiveret før log ind anmodningen kunne blive godkendt", + "QuickConnectDeactivated": "Lyn-forbind blev deaktiveret før log ind-anmodningen kunne blive godkendt", "QuickConnectAuthorizeSuccess": "Du har godkendt din enhed med succes!", - "QuickConnectAuthorizeFail": "Ukendt Lyn-forbind-kode", + "QuickConnectAuthorizeFail": "Ukendt kode til Lyn-forbind", "QuickConnectAuthorizeCode": "Angiv kode {0} for at logge ind", "QuickConnectActivationSuccessful": "Aktivering blev gennemført", "QuickConnect": "Lyn-forbind", @@ -1235,9 +1235,9 @@ "LabelSyncPlayResumePlayback": "Fortsæt lokal afspilning", "LabelSyncPlayNewGroupDescription": "Opret en ny gruppe", "LabelSyncPlayNewGroup": "Ny gruppe", - "LabelSyncPlayLeaveGroupDescription": "Deaktiver SyncPlay", + "LabelSyncPlayLeaveGroupDescription": "Deaktivér SyncPlay", "LabelSyncPlayLeaveGroup": "Forlad gruppe", - "LabelSyncPlayHaltPlaybackDescription": "Og ignorer nuværende afspilningslistes opdateringer", + "LabelSyncPlayHaltPlaybackDescription": "Og ignorér opdateringer af den aktuelle playliste", "LabelSyncPlayHaltPlayback": "Stop lokal afspilning", "LabelSyncPlayAccessNone": "Deaktiveret for denne bruger", "LabelSyncPlayAccessJoinGroups": "Tillad bruger at tilslutte grupper", @@ -1249,40 +1249,40 @@ "LabelRequireHttps": "Kræv HTTPS", "LabelRepositoryUrl": "Arkiv URL", "LabelRepositoryName": "Arkiv navn", - "LabelQuickConnectCode": "Lyn-forbind-kode", + "LabelQuickConnectCode": "Kode til Lyn-forbind", "LabelPublishedServerUri": "Udgivne server-URI'er", "LabelOpenclDevice": "OpenCL Enhed", "LabelIsForced": "Tvunget", "LabelH265Crf": "H.265-indkodning CRF", - "LabelEnableIP6Help": "Aktiver IPv6 funktionalitet.", - "LabelEnableIP6": "Aktiver IPv6", - "LabelEnableIP4Help": "Aktiver IPv4 funktionalitet.", - "LabelEnableIP4": "Aktiver IPv4", + "LabelEnableIP6Help": "Aktivér IPv6-funktionalitet.", + "LabelEnableIP6": "Aktivér IPv6", + "LabelEnableIP4Help": "Aktivér IPv4-funktionalitet.", + "LabelEnableIP4": "Aktivér IPv4", "LabelEnableHttpsHelp": "Lyt på den konfigurerede HTTPS port. Det er nødvendigt først at have et gyldigt SSL certifikat.", - "LabelEnableHttps": "Aktiver HTTPS", + "LabelEnableHttps": "Aktivér HTTPS", "KnownProxiesHelp": "Kommasepareret liste af IP-adresser eller værtsnavne af kendte proxier brugt ved forbindelse til JellyFin-instansen. Dette er nødvendigt for korrekt brug af 'X-Forwared-For'-headere. Kræver genstart efter ændring.", "Framerate": "Billedhastighed (Framerate)", - "EnableTonemapping": "Aktiver tonemapping", + "EnableTonemapping": "Aktivér tonemapping", "EnableDetailsBannerHelp": "Vis et banner billede i toppen af element detalje siden.", "EnableBlurHashHelp": "Billeder som stadigt indlæses vil blive vist med et tilfældigt unikt billede.", "LabelTonemappingDesat": "Tonemapping-afmætning", "ThumbCard": "Tommel Kort", "AllowVppTonemappingHelp": "Fuld Intel-driver-baseret tonemapping. Virker på nuværende tidspunkt kun når der omkodes video med HDR10-metadata. Dette har en højere prioritet end andre OpenCL-implementeringer.", - "EnableVppTonemapping": "Aktiver VPP-tonemapping", + "EnableVppTonemapping": "Aktivér VPP-tonemapping", "YoutubeDenied": "Den efterspurgte video er ikke tilladt at afspille i embedded afspillere.", "PreferFmp4HlsContainerHelp": "Brug helst fMP4 som default beholder for HLS, hvilket gør det muligt at streame HEVC og AV1 indhold direkte på understøttede enheder.", "RemuxHelp2": "Remux bruger meget lidt processor kraft med komplet tabsfri medie kvalitet.", "RemuxHelp1": "Medie filen er i en ikke-kompatibel fil beholder (MKV, AVI, WMV, osv) men både video og lys strømmene er kompatible med enheden. Medie filen vil blive genpakket tabsfrit før det sendes til enheden.", "LabelFallbackFontPathHelp": "Disse skrifttyper bruges af nogle klienter til at tegne undertekster. Se venligst dokumentationen for mere information.", "LabelFallbackFontPath": "Sti til reservemappen for skrifttyper", - "HeaderSelectFallbackFontPathHelp": "Gennemse eller skriv stien til reservemappen for skrifttyper til brug når der tegnes ASS/SSA undertekster.", + "HeaderSelectFallbackFontPathHelp": "Gennemsé eller skriv stien til reservemappen for skrifttyper til brug når der tegnes ASS/SSA-undertekster.", "HeaderSelectFallbackFontPath": "Vælg mappesti til reserve-skrifttype", "UseDoubleRateDeinterlacingHelp": "Denne instilling bruger felthastighed ved deinterlacing, ofte nævnt som bob deinterlacing, hvilket fordobler frameraten af videoen for at give fuld bevægelse som når man ser interlaced video på et TV.", "UseDoubleRateDeinterlacing": "Brug dobbelt framerate når der deinterlaces", "SyncPlayAccessHelp": "SyncPlay gør at man kan synkronisere sin afspilning med andre enheder. Vælg niveauet af adgang denne bruger har til SyncPlay funktionen.", "SubtitleVerticalPositionHelp": "Linje nummer hvor der er tekst. Positive numre betyder oppe fra og ned. Negative numre betyder nede fra og op.", "MessageSyncPlayGroupWait": "{0} er ved at buffer…", - "MessageNoGenresAvailable": "Aktiver en metadata udbyder for at hente genrer fra internettet.", + "MessageNoGenresAvailable": "Aktivér metadataleverandører at hente genrer fra internettet.", "MessageGetInstalledPluginsError": "Der skete en fejl ved efterspørgsel på liste over installerede plugins.", "MessageAddRepository": "Hvis du ønsker at tilføje et repository, klik på knappen ved siden af hoveddelen og udfyld det efterspurgte information.", "MediaInfoVideoRange": "Video rækkevidde", @@ -1294,7 +1294,7 @@ "LabelSyncPlayPlaybackDiff": "Afspilning tidsdifference", "LabelRepositoryUrlHelp": "Lokationen af det repository manifest du vil tilføje.", "LabelRepositoryNameHelp": "Et brugerdefineret navn til at skelne dette repository fra andre tilføjet til din server.", - "LabelPublishedServerUriHelp": "Overskriv URIen, der bruges af Jellyfin, baseret på grænsefladen eller klientens IP-adresse. Eksempelvis: internal=http://jellyfin.example.com, external=https://jellyfin.example.com, eller all=https://jellyfin.example.com", + "LabelPublishedServerUriHelp": "Overskriv den URI, som Jellyfin bruger, baseret på brugergrænsefladen eller klientens IP-adresse.", "LabelOpenclDeviceHelp": "Dette er OpenCL-enheden, der bliver brugt til tonemapping. Den venstre side af punktet er platformnummeret, og den højre side er enhedsnummeret på platformen. Standardværdien er 0.0. FFmpeg-programfilen, der indeholder OpenCL-hardwareaccelerationsmetoden, er påkrævet.", "LabelMinAudiobookResumeHelp": "Titler antages som ikke afspillet hvis de stoppes indenfor for denne tid.", "LabelMinAudiobookResume": "Min. afspilningstid for fortsættelse af lydbog", @@ -1303,10 +1303,10 @@ "LabelMaxAudiobookResume": "Lydbogens resterende minutter til at genoptage", "LabelMaxAudiobookResumeHelp": "Titler behandles som fuldt afspillet hvis de stoppes mens tilbageværende tid er mindre end denne værdi.", "LabelKnownProxies": "Kendte proxier", - "LabelDropSubtitleHere": "Smid undertekst her, eller klik for at gennemse.", + "LabelDropSubtitleHere": "Træk og slip undertekster her, eller klik for at gennemsé.", "LabelCreateHttpPortMapHelp": "Tillad automatisk port-mapping at generere en regel for HTTP-trafik udover HTTPS-trafik.", - "LabelCreateHttpPortMap": "Aktiver automatisk port-mapping for HTTP-trafik såvel som HTTPS.", - "LabelColorTransfer": "Farve overførsel", + "LabelCreateHttpPortMap": "Aktivér automatisk portmapping for både HTTP- og HTTPS-trafik.", + "LabelColorTransfer": "Farveoverførsel", "LabelColorSpace": "Farveplads", "LabelColorPrimaries": "Primære farver", "MediaInfoColorTransfer": "Farveoverførsel", @@ -1331,8 +1331,8 @@ "LabelSyncPlaySettingsDescription": "Ændr SyncPlay-præferencer", "LabelSortName": "Sorteringsnavn", "LabelOriginalName": "Original navn", - "LabelMaxDaysForNextUpHelp": "Indstil maks. dage, et program forbliver i køen uden at blive set.", - "LabelMaxDaysForNextUp": "Maks dage i 'kø'", + "LabelMaxDaysForNextUpHelp": "Indstil maks. dage, et program forbliver i ’Næste’ uden at blive set.", + "LabelMaxDaysForNextUp": "Maks dage i ’Næste’", "LabelHardwareEncoding": "Hardwareindkodning", "HeaderSyncPlayTimeSyncSettings": "Tidssynkronisering", "HeaderSyncPlayPlaybackSettings": "Afspilning", @@ -1342,20 +1342,20 @@ "Conductor": "Dirigent", "Arranger": "Arrangør", "AgeValue": "({0} år gammel)", - "LabelAutomaticallyAddToCollection": "Automatisk tilføj til samling", + "LabelAutomaticallyAddToCollection": "Tilføj automatisk til samling", "Cursive": "Kursiv", "Console": "Konsol", "StoryArc": "Handlingsgang", "IntelLowPowerEncHelp": "Lavstrøms-indkodning kan forårsage unødvendig synkronisering mellem CPU og GPU. På Linux skal det slås fra, hvis i915 HuC-firmwaren er ikke konfigureret.", "AudioSampleRateNotSupported": "Lydens prøvefrekvens er ikke understøttet", - "ThemeVideo": "Tema video", - "ThemeSong": "Tema sang", + "ThemeVideo": "Temavideo", + "ThemeSong": "Tema-sang", "Sample": "Eksempel", "Scene": "Scene", "Interview": "Interview", "DeletedScene": "Slettet scene", "BehindTheScenes": "Bag kulissen", - "Trailer": "Forfilm", + "Trailer": "Trailer", "Clip": "Klip", "SelectAll": "Vælg alle", "DirectPlayError": "Der skete en fejl ved at starte direkte afspilning", @@ -1363,9 +1363,9 @@ "UnknownVideoStreamInfo": "Videoens stream information er ukendt", "VideoBitrateNotSupported": "Videoens bitfrekvens er ikke understøttet", "AudioIsExternal": "Lyd-streamen er ekstern", - "LabelHardwareEncodingOptions": "Hardwareindkodningsindstillinger", - "EnableIntelLowPowerHevcHwEncoder": "Aktiver Intel Low-Power HEVC hardware encoder", - "EnableIntelLowPowerH264HwEncoder": "Aktiver Intel Low-Power H.264 hardware encoder", + "LabelHardwareEncodingOptions": "Indstillinger for hardwarekodning", + "EnableIntelLowPowerHevcHwEncoder": "Aktivér Intel Low-Power HEVC-hardwarekoder", + "EnableIntelLowPowerH264HwEncoder": "Aktivér Intel Low-Power H.264-hardwarekoder", "PreferSystemNativeHwDecoder": "Foertræk styresystemets native DXVA eller VA-API hardware afkodere", "ContainerBitrateExceedsLimit": "Videoens bitfrekvens overskrider grænsen", "AudioBitDepthNotSupported": "Lydens bit dybde er ikke understøtte", @@ -1384,31 +1384,31 @@ "VideoCodecNotSupported": "Video kodeks er ikke understøttet", "SubtitleCodecNotSupported": "Undertekst kodeks er ikke understøttet", "ContainerNotSupported": "Containeren er ikke understøttet", - "Controls": "Kontrol", + "Controls": "Kontroller", "Typewriter": "Skrivemaskine", "TonemappingRangeHelp": "Vælg output-farveintervallet. Auto er det samme som inputintervallet.", - "ShowParentImages": "Vis serie billeder", - "AllowEmbeddedSubtitles": "Deaktiver forskellige typer af indlejrede undertekster", + "ShowParentImages": "Vis seriebilleder", + "AllowEmbeddedSubtitles": "Deaktivér forskellige typer af indlejrede undertekster", "PlaybackErrorPlaceHolder": "Dette er en pladsholder for fysisk medie som Jellyfin ikke kan afspille. Indsæt disketten for at afspille.", - "LabelTonemappingDesatHelp": "Reducer mætning for fremhævninger som overstiger denne lysstyrke. Anbefalet værdi er 0 (deaktiveret).", + "LabelTonemappingDesatHelp": "Anvend desaturering på de lyseste områder, der overstiger dette lysstyrkeniveau. Den anbefalede værdi er 0 (deaktiveret).", "ItemDetails": "Element detaljer", "AudioCodecNotSupported": "Lydkodekset er ikke understøttet", "EnableGamepadHelp": "Lyt efter input fra enhver tilsluttet controller. (Kræver: 'TV' visetilstand)", - "LabelEnableGamepad": "Aktiver controller", - "EnableFallbackFontHelp": "Aktiver brugerdefinerede skrifttyper. Dette kan løse problemer med ukorrekt undertekst gengivelse.", - "UseEpisodeImagesInNextUpHelp": "'Kø' og 'fortsæt afspilning' sektioner vil bruge episode billeder som primære miniaturebilleder for serien.", - "UseEpisodeImagesInNextUp": "Brug episode billeder i 'kø' og 'fortsæt afspilning' sektioner", + "LabelEnableGamepad": "Aktivér gamepad", + "EnableFallbackFontHelp": "Aktivér brugerdefinerede alternative skrifttyper. Dette kan forhindre, at underteksterne vises forkert.", + "UseEpisodeImagesInNextUpHelp": "’Næste’- og ‘Fortsæt med at se”-områderne vil bruge episodebilleder som primære miniaturebilleder for serien.", + "UseEpisodeImagesInNextUp": "Brug billeder fra episoderne i områderne “Næste” og “Fortsæt med at se”", "TypeOptionPluralVideo": "Videoer", - "TypeOptionPluralSeries": "TV serier", + "TypeOptionPluralSeries": "Serier", "TypeOptionPluralSeason": "Sæsoner", - "TypeOptionPluralMusicVideo": "Musik video", - "TypeOptionPluralMusicArtist": "Musik artist", + "TypeOptionPluralMusicVideo": "Musikvideoer", + "TypeOptionPluralMusicArtist": "Musikartister", "TypeOptionPluralMusicAlbum": "Musikalbum", "TypeOptionPluralMovie": "Film", "TypeOptionPluralEpisode": "Episoder", "TypeOptionPluralBoxSet": "Bokssæt", "TypeOptionPluralBook": "Bøger", - "TypeOptionPluralAudio": "Lyde", + "TypeOptionPluralAudio": "Lydfiler", "Track": "Spor", "Remixer": "Remixer", "ReleaseGroup": "Udgivelsesgruppe", @@ -1419,19 +1419,19 @@ "AllowEmbeddedSubtitlesAllowImageOption": "Tillad billede", "AllowEmbeddedSubtitlesAllowNoneOption": "Tillad ingen", "AllowEmbeddedSubtitlesAllowAllOption": "Tillad alle", - "AllowEmbeddedSubtitlesHelp": "Deaktiver undertekster som er pakket i mediet. Kræver en komplet biblioteksopdatering.", + "AllowEmbeddedSubtitlesHelp": "Deaktivér undertekster, der er indlejret i mediefiler. Dette kræver en fuldstændig genopfriskning af biblioteket.", "OtherArtist": "Anden artist", - "OriginalAirDate": "Original sendedato", + "OriginalAirDate": "Første udsendelsesdato", "NextChapter": "Næste kapitel", "Mixer": "Mikser", "MixedMoviesShows": "Blandede film og serier", "MessageUnauthorizedUser": "Du har ikke adgang til denne server lige nu. Kontakt din server administrator for mere information.", "MediaInfoTitle": "Titel", "Lyricist": "Lyriker", - "Localization": "Lokalisation", + "Localization": "Lokalisering", "Larger": "Større", "LabelSyncPlaySettingsSkipToSyncHelp": "Synkronering korrigeringsmetode som består i at spole i afspilningen. Synkroniseringskorrektion skal være slået til.", - "LabelSyncPlaySettingsSkipToSync": "Aktiver SkipToSync", + "LabelSyncPlaySettingsSkipToSync": "Aktivér SkipToSync", "LabelSyncPlaySettingsSpeedToSyncHelp": "Synkroneringskorrigeringsmetode som består i at ændre afspilningshastighed. Synkroniseringskorrektion skal være slået til.", "LabelSyncPlaySettingsSpeedToSyncDurationHelp": "Antal millisekunder som SpeedToSync bruger til at korrigere afspilningen med.", "LabelSyncPlaySettingsSpeedToSyncDuration": "SpeedToSync længde", @@ -1442,14 +1442,14 @@ "Casual": "Afslappet", "ButtonSpace": "Mellemrum", "ButtonBackspace": "Backspace", - "EnableRewatchingNextUpHelp": "Vis allerede afspillede episoder i kø sektionen.", - "LabelSyncPlaySettingsSpeedToSync": "Aktiver SpeedToSync", + "EnableRewatchingNextUpHelp": "Vis allerede afspillede episoder i ‘Næste’-området.", + "LabelSyncPlaySettingsSpeedToSync": "Aktivér SpeedToSync", "LabelSyncPlaySettingsMinDelaySkipToSyncHelp": "Min. afspilningsforskydelse (i ms) hvorefter SkipToSync forsøger at rette afspilningen.", "LabelSyncPlaySettingsMinDelaySkipToSync": "Min. SkipToSync-forsinkelse", "LabelSyncPlaySettingsMinDelaySpeedToSync": "Min. SpeedToSync-forsinkelse", - "LabelSyncPlaySettingsSyncCorrectionHelp": "Aktiver aktiv synkronering af afspilning enten ved at ændre afspilningshastigheden eller ved at gå til den estimerede position. Slå fra i tilfælde af hakkende afspilning.", - "LabelAutomaticallyAddToCollectionHelp": "Når mindst 2 film har det samme kollektionsnavn, bliver de automatisk tilføjet kollektionen.", - "EnableRewatchingNextUp": "Tillad genafspilninger i kø", + "LabelSyncPlaySettingsSyncCorrectionHelp": "Aktivér aktiv synkronisering af afspilningen ved enten at fremskynde afspilningen eller ved at springe til den anslåede position. Deaktivér denne funktion, hvis der opstår kraftig hakken.", + "LabelAutomaticallyAddToCollectionHelp": "Når mindst 2 film har det samme samlingsnavn, bliver de automatisk tilføjet samlingen.", + "EnableRewatchingNextUp": "Tillad genafspilninger i ‘Næste’", "Digital": "Digital", "CopyFailed": "Kunne ikke kopiere", "Copy": "Kopier", @@ -1458,7 +1458,7 @@ "ButtonClose": "Luk", "AddToFavorites": "Tilføj som favorit", "EnableEnhancedNvdecDecoderHelp": "Udvidet NVDEC-implementering, slå denne indstilling fra for at bruge CUVID hvis du oplever afkodningsfejl.", - "DownloadAll": "Hent alle", + "DownloadAll": "Download alle", "ScreenResolution": "Skærmopløsning", "SecondarySubtitles": "Sekundære undertekster", "SubtitleBlack": "Sort", @@ -1467,27 +1467,27 @@ "SubtitleWhite": "Hvid", "Unreleased": "Ikke endnu udgivet", "Bold": "Fed", - "HeaderDummyChapter": "Kapitel billeder", + "HeaderDummyChapter": "Kapitelbilleder", "HeaderPerformance": "Ydelse", "LabelChapterImageResolution": "Opløsning", "SubtitleGray": "Grå", "SubtitleGreen": "Grøn", - "SubtitleLightGray": "lysegrå", + "SubtitleLightGray": "Lysegrå", "SubtitleRed": "Rød", "Short": "Kort", "Featurette": "Klip", "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "Ekstramateriale har ofte det samme indlejrede navn som det oprindelige materiale. Brug denne for at bruge den indlejrede titel alligevel.", - "MediaInfoDoViTitle": "DV titel", + "MediaInfoDoViTitle": "DV-titel", "OptionDateEpisodeAdded": "Dato episoden blev tilføjet", "PreferEmbeddedExtrasTitlesOverFileNames": "Foretræk indlejrede titler fremfor filnavne på ekstramateriale", "LabelTextWeight": "Tekst vægt", - "RememberSubtitleSelectionsHelp": "Forsøg at vælge undertekst ud fra tætteste match af foregående video.", + "RememberSubtitleSelectionsHelp": "Forsøg at vælge undertekster ud fra tætteste match af foregående video.", "SaveRecordingImages": "Gem optagelsens EPG-billeder", "HomeVideosPhotos": "Hjemmevideoer og -billeder", - "IgnoreDtsHelp": "Deaktivering af denne indstilling kan muligvis løse udfordringer såsom manglende lydkanal med separate lyd- og videospor.", + "IgnoreDtsHelp": "Hvis du deaktiverer denne indstilling, kan det muligvis løse visse problemer, f.eks. manglende lyd på kanaler med separate lyd- og videostrømme.", "EnableSplashScreen": "Aktivér opstartsskærmbilledet", "LabelStereoDownmixAlgorithm": "Stereonedskalerings-algoritme", - "LabelMaxVideoResolution": "Maks. opløsning af videoomkodning", + "LabelMaxVideoResolution": "Maksimal tilladt opløsning ved videotranskodning", "HeaderRecordingMetadataSaving": "Optagelsesmetadata", "LabelChapterImageResolutionHelp": "Opløsningen af det udtrukne kapitelbillede. Ændringen af dette vil ingen effekt have på dummykapitler.", "MessageRenameMediaFolder": "Omdøbning af et mediebibliotek sletter al tilhørende metadata. Fortsæt med forsigtighed.", @@ -1495,7 +1495,7 @@ "IgnoreDts": "Ignorer DTS (afkodning af tidsstempel)", "LabelDummyChapterDuration": "Interval", "LabelDummyChapterDurationHelp": "Intervallet mellem dummykapitler i sekunder. Sæt til 0 for at deaktivere dummykapitler. Ændringer har ingen effekt på eksisterende dummykapitler.", - "MediaInfoDvProfile": "DV profil", + "MediaInfoDvProfile": "DV-profil", "LabelParallelImageEncodingLimit": "Grænse for parallel billedeindkodning", "LabelParallelImageEncodingLimitHelp": "Maks antal af billedkodninger, som må køre parallelt. Hvis dette efterlades tomt, vælges en grænse baseret på dit systems antal kerner.", "MessageNoItemsAvailable": "Ingen elementer er tilgængelige i øjeblikket.", @@ -1503,7 +1503,7 @@ "OptionDateShowAdded": "Dato serien blev tilføjet", "RememberAudioSelections": "Vælg lydspor baseret på foregående element", "RememberAudioSelectionsHelp": "Forsøg at vælge lydspor ud fra tætteste match ud fra foregående video.", - "RememberSubtitleSelections": "Vælg undertekst baseret på foregående element", + "RememberSubtitleSelections": "Vælg undertekster baseret på foregående element", "EnableCardLayout": "Vis visuel CardBox", "ResolutionMatchSource": "Match kilde", "SubtitleCyan": "Cyan", @@ -1515,17 +1515,17 @@ "GridView": "Gittervisning", "HeaderConfirmRepositoryInstallation": "Bekræft installation af plugin-repositorium", "BackdropScreensaver": "Screensaver baggrund", - "AllowSegmentDeletionHelp": "Slet gamle segmenter, når de er blevet hentet af klienten. Dette forhindrer, at man skal gemme hele den omkodede fil på disken. Slå dette fra, hvis du oplever afspilningsproblemer.", + "AllowSegmentDeletionHelp": "Slet gamle segmenter, når de er blevet downloadet af klienten. Dette undgår, at hele den transkodede fil skal gemmes på disken. Deaktivér denne indstilling, hvis du oplever problemer med afspilningen.", "LabelThrottleDelaySeconds": "Begræns efter", - "LabelThrottleDelaySecondsHelp": "Tid i sekunder, hvorefter omkodning vil blive begrænset. Skal være stor nok til, at klienten kan opretholde en sund buffer. Virker kun, hvis throttling er aktiveret.", + "LabelThrottleDelaySecondsHelp": "Tid i sekunder, hvorefter transkoderen vil blive begrænset. Værdien skal være stor nok til, at klienten kan opretholde en tilstrækkelig buffer. Fungerer kun, hvis begrænsning er aktiveret.", "LabelSegmentKeepSeconds": "Tid at gemme segmenter i", "LabelSegmentKeepSecondsHelp": "Tid i sekunder, som segmenter skal gemmes i, efter de er hentet af klienten. Virker kun, hvis sletning af segmenter er aktiveret.", "HeaderGuestCast": "Gæstestjerner", "LabelAlbumGain": "Albumslydstyrke", "LabelSelectAudioNormalization": "Lydnormalisering", "LabelDate": "Dato", - "LabelEnableAudioVbr": "Aktiver VBR lyd indkodning", - "LogLevel.Debug": "Debug", + "LabelEnableAudioVbr": "Aktivér VBR-lydkodning", + "LogLevel.Debug": "Fejlfind", "MenuOpen": "Åbn menu", "MessageRepositoryInstallDisclaimer": "ADVARSEL: Installation af tredjepartspluginrepositories medfører risici. Pluginrepositories kan indeholde ustabil eller skadelig kode, og kan ændre sig til hver en tid. Installer kun pluginrepositories fra brugere du stoler på.", "UnknownError": "Der forekom en ukendt fejl.", @@ -1533,7 +1533,7 @@ "LabelSystem": "System", "PasswordRequiredForAdmin": "Administrator-konti kræver en adgangskode.", "Studio": "Studio", - "LabelEnableLUFSScan": "Aktiver LUFS scan", + "LabelEnableLUFSScan": "Aktivér LUFS-scanning", "UserMenu": "Brugermenu", "LogLevel.Critical": "Kritisk", "LogoScreensaver": "Logo pauseskærm", @@ -1554,12 +1554,12 @@ "SelectAudioNormalizationHelp": "Track gain - justerer volumen for hvert track så de afspiller med samme volume. Album gain - justerer volumen kun volumen for alle tracks i et album, samt bevarer albummets dynamic range. Skift mellem \"Fra\" og andre muligheder kræver genstart af den indeværende afspilning.", "Select": "Vælg", "LabelLevel": "Niveau", - "LabelMediaDetails": "Media detaljer", + "LabelMediaDetails": "Medieoplysninger", "MenuClose": "Luk menu", - "MediaInfoDvBlSignalCompatibilityId": "DV bl signals kompatibilitets id", + "MediaInfoDvBlSignalCompatibilityId": "DV—blsignalkompatibilitets-id", "ButtonEditUser": "Redigér bruger", "HeaderAllRecordings": "Alle optagelser", - "ListView": "Liste Visning", + "ListView": "Listevisning", "LabelVppTonemappingContrastHelp": "Anvend konstrastforstærkning i VPP-tonemapping. Den anbefalede værdi er 1.", "LogLevel.Trace": "Spore", "LabelServerVersion": "Server version", @@ -1574,17 +1574,17 @@ "ChannelResolutionHD": "HD", "ChannelResolutionFullHD": "Fuld HD", "ChannelResolutionUHD4K": "UHD (4K)", - "ConfirmDeleteSeries": "Sletning af denne serie vil slette ALLE {0} afsnit fra både filsystemet og dit mediebibliotek. Er du sikker på du vil fortsætte?", - "DeleteSeries": "Slet Serie", - "DeleteEpisode": "Slet Afsnit", + "ConfirmDeleteSeries": "Sletning af denne serie vil slette ALLE {0} episoder fra både filsystemet og dit mediebibliotek. Er du sikker på du vil fortsætte?", + "DeleteSeries": "Slet serie", + "DeleteEpisode": "Slet episode", "DlnaMovedMessage": "DLNA funktionaliteten er flyttet til et plugin.", - "EnableLibrary": "Aktiver biblioteket", - "EnableLibraryHelp": "Deaktivering af biblioteket vil gemme det fra alle brugeres visninger.", - "HeaderDeleteSeries": "Slet Serie", + "EnableLibrary": "Aktivér biblioteket", + "EnableLibraryHelp": "Hvis du deaktiverer biblioteket, skjules det for alle brugere.", + "HeaderDeleteSeries": "Slet serie", "LabelAllowContentWithTags": "Tillad elementer med mærkater", "LabelBuildVersion": "Buildversion", "DeleteName": "Slet {0}", - "DeleteEntireSeries": "Slet {0} Afsnit", + "DeleteEntireSeries": "Slet {0} episoder", "PlaybackError.ASS_RENDER_ERROR": "En fejl skete i ASS/SSA undertekst rendereren.", "PlaybackError.FATAL_HLS_ERROR": "En fatal fejl sekete i HLS strømmen.", "PlaybackError.MEDIA_DECODE_ERROR": "Afspilning fejlede i afkodning af mediet.", @@ -1594,21 +1594,21 @@ "PlaybackError.SERVER_ERROR": "Afspilning fejlede på grund af en server fejl.", "PlaybackError.NotAllowed": "Afspilning af dette medie er ikke tilladt.", "Lyric": "Lyrik", - "EnableSmoothScroll": "Aktiver glat rulning", + "EnableSmoothScroll": "Aktivér jævn rulning", "LimitSupportedVideoResolution": "Maks. understøttet videoopløsning", - "LimitSupportedVideoResolutionHelp": "Brug 'maks. tilladt videoomkodnings-opløsning' som maks. understøttet videoopløsning.", + "LimitSupportedVideoResolutionHelp": "Brug ‘Maksimal tilladt opløsning ved videotranskodning’ som den maksimale understøttede videoopløsning.", "AiTranslated": "AI-oversat", - "LabelEncodingFormatOptions": "Indkodningsformatindstillinger", - "EncodingFormatHelp": "Vælg videokodningen som Jellyfin skal omkode til. Jellyfin vil bruge softwareindkodning når hardwareacceleration til det valgte format ikke er tilgængelig. H264-kodning vil altid være aktiveret.", + "LabelEncodingFormatOptions": "Indstillinger for kodningsformat", + "EncodingFormatHelp": "Vælg den videokodning, som Jellyfin skal transkodere til. Jellyfin vil anvende softwarekodning, når der ikke er hardwareacceleration til rådighed for det valgte format. H264-kodning vil altid være aktiveret.", "MachineTranslated": "Maskinoversat", "Trickplay": "Trickplay", - "LabelTrickplayAccel": "Aktiver hardwareafkodning", + "LabelTrickplayAccel": "Aktivér hardwareafkodning", "PlaybackError.RateLimitExceeded": "Dette medie kan ikke afspilles lige nu på grund a rate begrænsninger.", "LabelImageIntervalHelp": "Tidsinterval (ms) mellem hver ny trickplay billede.", - "EnableVideoToolboxTonemapping": "Aktiver VideoToolbox-baseret tonemapping", + "EnableVideoToolboxTonemapping": "Aktivér tonemapping i VideoToolbox", "AllowVideoToolboxTonemappingHelp": "Hardwareaccelereret tonemapping fra VideoToolbox. Virker med de fleste HDR-formater, inklusive HDR10, HDR10+ og HLG, men virker ikke med Dolby Vision Profile 5. Denne har en højere prioritet sammenlignet med en anden Metal-implementering.", - "MediaInfoDvVersionMajor": "DV version overordnet", - "MediaInfoDvVersionMinor": "DV version underordnet", + "MediaInfoDvVersionMajor": "DV-version, hovedversion", + "MediaInfoDvVersionMinor": "DV-version, mindre ændring", "ForeignPartsOnly": "Kun tvungne/udenlandske dele", "HearingImpairedShort": "HI/SDH", "LabelIsHearingImpaired": "For hørehæmmede (SDH)", @@ -1617,16 +1617,16 @@ "LabelScanBehavior": "Skanningsopførsel", "LabelScanBehaviorHelp": "Standard adfærd er ublokerende, hvilket vil tilføje medie til biblioteket før trickplay-generering gennemføres. Blokering vil sikre at trickplay filer er genereret før mediet tilføjes til biblioteket, men vil gøre at skanning tager væsentligt længere tid.", "PriorityHigh": "Høj", - "PriorityAboveNormal": "Over Normal", + "PriorityAboveNormal": "Over normal", "PriorityNormal": "Normal", - "PriorityBelowNormal": "Under Normal", + "PriorityBelowNormal": "Under normal", "PriorityIdle": "Stille", - "LabelProcessPriority": "Proces Prioritet", + "LabelProcessPriority": "Procesprioritet", "LabelProcessPriorityHelp": "At indstille dette lavere eller højere vil bestemme, hvordan CPU'en prioriterer FFmpeg trickplay-genereringsprocessen i forhold til andre processer. Hvis du bemærker langsomhed, mens du genererer trickplay-billeder, men ikke ønsker at stoppe deres generation helt, så prøv at sænke dette samt antallet af tråde.", - "LabelImageInterval": "Billede Interval", - "LabelWidthResolutions": "Vidde Opløsninger", + "LabelImageInterval": "Billedinterval", + "LabelWidthResolutions": "Breddeopløsninger", "LabelWidthResolutionsHelp": "Kommasepareret liste over de bredder (px) som trickplay-billeder vil blive genereret i. Alle billeder bør blive genereret proportionelt til kilden, så en vidde på 320 på en 16:9 video medfører 320x180.", - "LabelTrackGain": "Spor Gain", + "LabelTrackGain": "Sporforstærkning", "LabelVppTonemappingContrast": "Kontrastforstærkning for VPP-tonemapping", "Unknown": "Ukendt", "AllowAv1Encoding": "Tillad indkodning i AV1 format", @@ -1634,11 +1634,11 @@ "MediaInfoVideoRangeType": "Video rækkevidde type", "LabelVppTonemappingBrightnessHelp": "Anvend lysstyrkeforstærkning i VPP-tonemapping. Den anbefalede værdi er 16.", "VideoRangeTypeNotSupported": "Videoens rækkevidde type er ikke supporteret", - "MediaInfoDvLevel": "DV niveau", + "MediaInfoDvLevel": "DV-niveau", "LabelVideoRangeType": "Video rækkevidde type", - "MediaInfoRpuPresentFlag": "DV rpu forudindstillelses flag", - "MediaInfoElPresentFlag": "DV el forudindstillelses flag", - "MediaInfoBlPresentFlag": "DV bl forudindstillelses flag", + "MediaInfoRpuPresentFlag": "DV-rpu-forudindstillingsflag", + "MediaInfoElPresentFlag": "DV-el-forudindstillingsflag", + "MediaInfoBlPresentFlag": "DV-bl-forudindstillingsflag", "LabelTonemappingMode": "Tonemappingmetode", "TonemappingModeHelp": "Vælg tonemappingmetode. Hvis du oplever udsprængte højlys, så prøv at skifte til RGB-tilstand.", "Author": "Forfatter", @@ -1649,15 +1649,15 @@ "Editor": "Redaktør", "DeleteLyrics": "Slet sangtekster", "ErrorDeletingLyrics": "Der opstod en fejl ved sletning af sangteksterne fra Jellyfin. Kontroller at Jellyfin har skrive-adgang til mediemappen, og prøv igen.", - "EnableDts": "Aktiver DTS (DCA)", - "EnableDtsHelp": "Aktiver kun, hvis din enhed understøtter DTS eller er tilsluttet en kompatibel lydmodtager, ellers kan det medføre afspilningsfejl.", - "EnableTrueHd": "Aktiver TrueHD", - "EnableTrueHdHelp": "Aktiver kun, hvis din enhed understøtter TrueHD eller er tilsluttet en kompatibel lydmodtager, ellers kan det medføre afspilningsfejl.", + "EnableDts": "Aktivér DTS (DCA)", + "EnableDtsHelp": "Aktivér kun denne indstilling, hvis din enhed understøtter DTS eller er tilsluttet en kompatibel lydmodtager; ellers kan det medføre afspilningsfejl.", + "EnableTrueHd": "Aktivér TrueHD", + "EnableTrueHdHelp": "Aktivér kun denne indstilling, hvis din enhed understøtter TrueHD eller er tilsluttet en kompatibel lydmodtager; ellers kan det medføre afspilningsfejl.", "HeaderDeleteLyrics": "Slet sangtekster", "HeaderLyricDownloads": "Sangtekst-hentninger", - "LabelSelectPreferredTranscodeVideoAudioCodec": "Foretrukket lydkodec til omkodning ved videoafspilning", + "LabelSelectPreferredTranscodeVideoAudioCodec": "Foretrukken lydkodek til transkodning ved videoafspilning", "LibraryScanFanoutConcurrency": "Grænse for parallelle biblioteksscanningsopgaver", - "SelectPreferredTranscodeVideoAudioCodecHelp": "Vælg den foretrukne audio codec til omkodning af videoindhold. Hvis den foretrukne codec ikke er understøttet, vil serveren bruge den næstbedste tilgængelige codec.", + "SelectPreferredTranscodeVideoAudioCodecHelp": "Vælg den ønskede lydkodek, som videoindholdet skal transkodes til. Hvis den ønskede kodek ikke understøttes, vil serveren anvende den næstbedste tilgængelige kodek.", "LabelTileWidth": "Flisebredde", "SavePassword": "Gem adgangskode", "Illustrator": "Illustratør", @@ -1672,22 +1672,22 @@ "SaveLyricsIntoMediaFoldersHelp": "Gemmer sangtekst ved siden af lydfiler vil gøre dem nemmere at håndtere.", "Translator": "Oversætter", "ViewLyrics": "Se sangtekst", - "LabelTrickplayAccelEncoding": "Aktiver hardwareaccelereret MJPEG indkodning", + "LabelTrickplayAccelEncoding": "Aktivér hardwareaccelereret MJPEG-kodning", "LabelTrickplayAccelEncodingHelp": "Kun tilgængeligt på QSV, VA-API, VideoToolbox og RKMPP. Denne indstilling har ingen effekt med andre hardwareaccelerationsmetoder.", "HeaderNoLyrics": "Ingen sangtekster blev fundet", - "HeaderVideoAdvanced": "Video Avanceret", + "HeaderVideoAdvanced": "Video – Avanceret", "PlaylistPublic": "Tillad offentlig adgang", "PlaylistPublicDescription": "Tillad at denne playliste kan blive set af enhver bruger der er logget ind.", "LabelTileHeight": "Flisehøjde", "LabelTileHeightHelp": "Maks. billeder per flise in Y-retningen.", "LabelTrickplayThreadsHelp": "Antallet af tråde at videregive til '-threads' argumentet fra FFmpeg.", - "OptionExtractTrickplayImage": "Aktiver udtrækning af trickplaybilleder", + "OptionExtractTrickplayImage": "Aktivér udtrækning af billeder fra Trickplay", "ExtractTrickplayImagesHelp": "Trickplay billeder minder om kapitelbilleder, men de strækker sig over hele længden af indholdet og bruges til at vise en forhåndsvisning, når der skimmes over videoer.", "LabelExtractTrickplayDuringLibraryScan": "Udtræk trickplay billeder under biblioteksscanning", "LabelExtractTrickplayDuringLibraryScanHelp": "Generer trickplay-billeder når videoer bliver importeret under biblioteksscanningen. Ellers vil de blive udtrukket under den planlagte opgave for trickplay-billeder. Hvis genereringen er indstillet til ublokerende vil det ikke påvirke den tid, det tager at fuldføre en biblioteksscanning.", - "LabelJpegQuality": "JPEG Kvalitet", + "LabelJpegQuality": "JPEG-kvalitet", "LabelTileWidthHelp": "Maks. billeder per flise in X-retningen.", - "LabelJpegQualityHelp": "JPEG komprimeringskvaliteten for trickplay billeder.", + "LabelJpegQualityHelp": "JPEG-komprimeringskvaliteten for trickplay-billeder.", "LabelQscale": "Qskalering", "LabelQscaleHelp": "Kvalitetsskaleringen af billeder fra FFmpeg, hvor 2 er den højeste kvalitet og 31 er den laveste.", "LabelTrickplayThreads": "FFmpeg-tråde", @@ -1698,9 +1698,9 @@ "MoveToBottom": "Flyt til bunden", "LabelDuration": "Varighed", "Reset": "Nulstil", - "LabelIsSynced": "Er Synkroniseret", + "LabelIsSynced": "Er synkroniseret", "AndOtherArtists": "{0} og {1} andre kunstnere.", - "LabelEnablePlugin": "Aktiver tilføjelsesprogram", + "LabelEnablePlugin": "Aktivér tilføjelsesprogram", "LabelNotInstalled": "Ikke installeret", "PluginDisableError": "Der opstod en fejl under deaktivering af plugin'et.", "LabelInstalled": "Installeret", @@ -1708,8 +1708,8 @@ "Alternate": "Alternativ", "AlternateDVD": "Alternativ DVD", "EditLyrics": "Redigér sangtekster", - "LabelDropLyricsHere": "Smid sangtekster her, eller klik på gennemse.", - "SelectPreferredTranscodeVideoCodecHelp": "Vælg det fortrukkede video codec at omkode til. Hvis det valgte codec ikke understøttes vil serveren bruge det næstbedste tilgængelige codec.", + "LabelDropLyricsHere": "Træk og slip sangtekster her, eller klik for at gennemsé.", + "SelectPreferredTranscodeVideoCodecHelp": "Vælg den ønskede videokodek, som videoen skal transkodes til. Hvis den ønskede kodek ikke understøttes, vil serveren anvende den næstbedste tilgængelige kodek.", "LabelTrickplayKeyFrameOnlyExtraction": "Generer kun billeder fra nøglerammer", "LabelTrickplayKeyFrameOnlyExtractionHelp": "Udtræk kun nøglerammer, for hurtigere bearbejdning med mindre nøjagtig timing. Hvis den konfigurerede hardwareafkoder ikke understøtter denne tilstand, vil softwareafkodning blive brugt i stedet.", "HeaderPreviewLyrics": "Gennemgå sangtekster", @@ -1722,15 +1722,15 @@ "LabelRepository": "Arkiv", "HeaderAddLyrics": "Tilføj sangtekst", "LabelNoChangelog": "Ingen ændringslog er givet for denne udgivelse.", - "LabelSelectPreferredTranscodeVideoCodec": "Fforetrukne video codec til omkodning", + "LabelSelectPreferredTranscodeVideoCodec": "Foretrukken videokodek til transkodning", "PluginLoadConfigError": "Der opstod en fejl imens vi hentede konfigurationssiderne til pluginet.", - "AllowFmp4TranscodingContainerHelp": "Tillad fMP4-omkodningscontainer for denne tuner for at aktivere HEVC og HDR-indhold. Ikke alle tunere er kompatible med denne container. Deaktiver dette, hvis du oplever afspilningsproblemer.", + "AllowFmp4TranscodingContainerHelp": "Tillad fMP4-transkodningsformatet for denne tuner for at aktivere HEVC- og HDR-indhold. Ikke alle tunere er kompatible med dette format. Deaktivér denne indstilling, hvis du oplever afspilningsproblemer.", "AllowStreamSharingHelp": "Tillad Jellyfin at kopiere mpegts-streamen fra tuner og dele denne kopierede stream til dens klienter. Dette er brugbart når tunerens totale stream-antal er begrænset, men kan også skabe afspilningsproblemer.", - "AlwaysBurnInSubtitleWhenTranscoding": "Brænd altid undertekster ind under omkodning", - "AlwaysBurnInSubtitleWhenTranscodingHelp": "Brænd alle undertekster fast når omkodning aktiveres. Dette sikre synkronisering af undertekster efter omkodning, på bekostning af reduceret omkodningshastighed.", + "AlwaysBurnInSubtitleWhenTranscoding": "Brænd altid undertekster ind ved transkodning", + "AlwaysBurnInSubtitleWhenTranscodingHelp": "Brænd alle undertekster ind, når transkodningen startes. Dette sikrer, at underteksterne er synkroniseret efter transkodningen, men det medfører en lavere transkodningshastighed.", "AlwaysRemuxFlacAudioFilesHelp": "Hvis du har filer som din browser nægter at afspille eller hvis den udregner tidsstempler upræcist, kan du aktivere dette som en løsning.", - "RenderPgsSubtitle": "Eksperimentel PGS undertekstvisning", - "RenderPgsSubtitleHelp": "Bestem om klienten skal vise PGS-undertekster i stedet for at bruge indbrændte undertekster. Dette kan undgå server-side omkodning til fordel for klient-side renderingsydelse.", + "RenderPgsSubtitle": "Eksperimentel gengivelse af PGS-undertekster", + "RenderPgsSubtitleHelp": "Bestem, om klienten skal gengive PGS-undertekster i stedet for at bruge indbrændte undertekster. Dette kan undgå transkodning på serversiden til gengæld for en lavere ydeevne ved gengivelse på klientsiden.", "LabelScreensaverTime": "Pauseskærm-tid", "LabelAudioTagSettings": "Lydmærkat-indstillinger", "LabelQsvDevice": "QSV-enhed", @@ -1750,27 +1750,27 @@ "AlwaysRemuxMp3AudioFilesHelp": "Hvis du har filer, som din browser unøjagtigt beregner tidsstempler for, skal du aktivere dette som en midlertidig løsning.", "MediaSegmentAction.AskToSkip": "Spørg om at springe over", "MediaSegmentSkipPrompt": "Spring over {0}", - "MediaSegmentType.Commercial": "Kommerciel", + "MediaSegmentType.Commercial": "Reklame", "MediaSegmentType.Intro": "Intro", "MediaSegmentType.Outro": "Rulletekster", "MediaSegmentType.Preview": "Forhåndsvisning", "MediaSegmentType.Recap": "Opsummering", "DateModified": "Dato modificeret", "DisableVbrAudioEncodingHelp": "Stop serveren i at indkode lyd med VBR for denne klient.", - "EnableHi10p": "Aktiver H.264 High 10 Profil", - "EnableHi10pHelp": "Aktiver for at undgå omkodning af H.264 10-bit videoer. Deaktiver denne mulighed, hvis videoen viser tomme billeder.", - "FallbackMaxStreamingBitrateHelp": "Den maks. streaming bitrate bruges som en fallback, når ffprobe ikke kan bestemme kilde-stream bitrate. Dette hjælper med at forhindre, at klienter anmoder om en alt for høj omkodningsbitrate, hvilket kan få afspilleren til at fejle og overbelaste indkoderen.", + "EnableHi10p": "Aktivér H.264 High 10-profil", + "EnableHi10pHelp": "Aktivér denne indstilling for at undgå transkodning af H.264-videoer i 10-bit. Deaktivér denne indstilling, hvis videoen viser tomme billeder.", + "FallbackMaxStreamingBitrateHelp": "Den maksimale streaming-bithastighed bruges som en reserve, når ffprobe ikke kan fastslå kildestrømmens bithastighed. Dette bidrager til at forhindre, at klienter anmoder om en alt for høj transkodningsbithastighed, hvilket kan medføre, at afspilleren går ned og overbelaster koderen.", "HeaderAudioAdvanced": "Avanceret lyd", - "LabelAllowFmp4TranscodingContainer": "Tillad fMP4 omkodningsbeholder", + "LabelAllowFmp4TranscodingContainer": "Tillad fMP4-transkodningscontainer", "LabelCustomTagDelimiters": "Brugerdefineret mærkat-afgrænser", "LabelCustomTagDelimitersHelp": "Tegn, der skal betragtes som afgrænsere for at adskille mærkater.", "LabelDelimiterWhitelist": "Tilladte afgrænsere", "LabelDelimiterWhitelistHelp": "Elementer, der skal udelukkes fra mærkatopdeling. Et element pr. linje.", - "LabelDisableVbrAudioEncoding": "Deaktiver VBR lydkodning", + "LabelDisableVbrAudioEncoding": "Deaktivér VBR-lydkodning", "LabelSaveTrickplayLocally": "Gem trickplay-billeder ved siden af medierne", "LabelSaveTrickplayLocallyHelp": "Gemmes trickplay-billeder i mediemapper vil de placeres ved siden af dine medier for nem migrering og adgang.", "LibraryInvalidItemIdError": "Biblioteket er i en ugyldig tilstand og kan ikke redigeres. Du oplever muligvis en fejl: stien i databasen er ikke den korrekte sti på filsystemet.", - "LyricDownloadersHelp": "Aktiver og ranger dine foretrukne underteksthentere i rækkefølge efter prioritet.", + "LyricDownloadersHelp": "Aktivér og rangordn dine foretrukne programmer til download af sangtekster efter prioritet.", "MessageCancelSeriesTimerError": "Der opstod en fejl under annullering af serietimeren", "MessageCancelTimerError": "Der opstod en fejl under annullering af timeren", "MessageSplitVersionsError": "Der opstod en fejl under opdeling af versioner", @@ -1782,11 +1782,11 @@ "VideoCodecTagNotSupported": "Videokodek-mærkatet understøttes ikke", "HeaderMediaSegmentActions": "Mediesegmenthandlinger", "Anime": "Anime", - "MoviesAndShows": "Film og TV-serier", - "HeaderNextEpisode": "Næste afsnit", + "MoviesAndShows": "Film og serier", + "HeaderNextEpisode": "Næste episode", "HeaderNextVideo": "Næste video", "LabelMediaSegmentProviders": "Mediesegment tilbydere", - "MediaSegmentProvidersHelp": "Aktiver og arranger dine foretrukne mediesegment-tilbydere efter prioritering.", + "MediaSegmentProvidersHelp": "Aktivér og rangordn dine foretrukne udbydere af mediesegmenter efter prioritet.", "DeleteServerConfirmation": "Er du sikker på at du ønsker slette denne server?", "AutoSubtitleStylingHelp": "Denne tilstand vil automatisk skifte mellem oprindelig og brugerdefineret undertekst stylings-mekanismer baseret på din enheds type.", "Custom": "Brugerdefineret", @@ -1821,27 +1821,27 @@ "LabelGroupShowsIntoCollectionsHelp": "Serier i en samling vises som ét samlet element, når serielister vises.", "LimitSegmentLength": "Brug kortere HLS-segmenter", "ViewSettings": "Vis Indstillinger", - "HeaderServerUnavailable": "Server Utilgængelig", - "HeaderUpdateRequired": "Opdatering Nødvendig", - "PluginsLoadError": "En fejl opstod imens der blev loaded plugins.", - "ButtonLearnMore": "Lær Mere", + "HeaderServerUnavailable": "Serveren er utilgængelig", + "HeaderUpdateRequired": "Opdatering nødvendig", + "PluginsLoadError": "En fejl opstod imens der blev hentet plugins", + "ButtonLearnMore": "Lær mere", "MessageForgotPasswordPinReset": "Skriv PIN her for at færdigøre adgangskode-nulstilling", - "BackupsPageLoadError": "Fejlede ved at load backup side", - "ButtonCreateBackup": "Opret Backup", + "BackupsPageLoadError": "Det lykkedes ikke at indlæse siden med sikkerhedskopier", + "ButtonCreateBackup": "Opret sikkerhedskopi", "Create": "Opret", - "LabelBackupsUnavailable": "Ingen backups tilgængelige", - "LabelRestore": "Genopret", - "MessageBackupDisclaimer": "Afhængig af størrelsen på det biblotek, backup processen tager måske et stykke tid.", - "MessageBackupInProgress": "Backup igang", + "LabelBackupsUnavailable": "Der er ingen sikkerhedskopier tilgængelige", + "LabelRestore": "Genskab", + "MessageBackupDisclaimer": "Afhængigt af størrelsen på dit bibliotek kan sikkerhedskopieringen tage et stykke tid.", + "MessageBackupInProgress": "Sikkerhedskopiering i gang", "LabelDatabase": "Database", - "LabelProgramData": "Program Data", + "LabelProgramData": "Programdata", "LiveTVPageLoadError": "Fejl ved indlæsning af optagelsessiden", "StorageType.CDRom": "CD-ROM", "StorageType.Ram": "Hukommelse", "ConnectAnyway": "Forbind alligevel", "DownloadManager": "Downloadede filer", "HeaderBackupsHelp": "Opret og gendan snapshots af din server, som kan inkludere database, metadata, undertekster og trickplay.", - "HeaderServerMismatch": "server-uoverensstemmelse", + "HeaderServerMismatch": "Server-uoverensstemmelse", "MessageRestoreDisclaimer": "ADVARSEL: Du er ved at gendanne fra en tidligere sikkerhedskopi. Din server vil være utilgængelig i hele processen, og alle nye data oprettet siden sikkerhedskopien vil gå tabt.", "MessageServerMismatch": "Den server, du forbinder til, er ikke den samme server, som du tidligere har forbundet til på denne adresse. Hvis dette er forventet, vælg venligst \"Forbind alligevel\". Ellers kan din forbindelse eller serveren være kompromitteret.", "RepositoriesPageLoadError": "Fejl ved indlæsning af bibliotekerne", @@ -1859,21 +1859,71 @@ "Success": "Vellykket", "HeaderBackups": "Sikkerhedskopier", "TranscodingLoadError": "Fejl ved indlæsning af transkodningsindstillinger", - "ManageRepositories": "Administrer arkiver", + "ManageRepositories": "Administrér arkiver", "ViewAllPlugins": "Vis alle plugins", "LabelAvailable": "Tilgængelig", "LabelBundled": "Inkluderet", - "ButtonAddProvider": "Tilføj Leverandør", - "ButtonAddTunerDevice": "Tilføj Tuner Enhed", + "ButtonAddProvider": "Tilføj meverandør", + "ButtonAddTunerDevice": "Tilføj tuner-enhed", "LabelSlideshowInterval": "Billede Slideshow Interval", "LabelSlideshowIntervalHelp": "Mængden af tid i sekunder hvert billede er vist slideshows.", "HeaderDeletePlaylist": "Slet playliste", - "ConfirmDeleteCollection": "Er du sikker på at du vil slette denne kollektion?", + "ConfirmDeleteCollection": "Er du sikker på at du vil slette denne samling?", "ConfirmDeletePlaylist": "Er du sikker på at du vil slette denne playliste?", - "HeaderDeleteCollection": "Slet kollektion", - "ActivitiesLoadError": "kunne ikke indlæse aktiviteter", + "HeaderDeleteCollection": "Slet samling", + "ActivitiesLoadError": "Kunne ikke indlæse aktiviteter", "ApiKeysLoadError": "Kunne ikke indlæse API nøgler", "Authors": "Forfattere", "NewPlaylist": "Ny playliste", - "Disabled": "Deaktiveret" + "Disabled": "Deaktiveret", + "BrandingLoadError": "Det lykkedes ikke at indlæse branding-indstillingerne", + "CardSettings": "Kortindstillinger", + "ConfirmDeleteItemByName": "Hvis du sletter “{0}”, vil det blive slettet både fra filsystemet og fra dit mediebibliotek. Er du sikker på, at du vil fortsætte?", + "ConfirmSplitMedia": "Er du sikker på, at du vil opdele mediekilderne i separate elementer?", + "ConfirmStillWatching": "Ser du stadig med?", + "ContinueReading": "Fortsæt med at læse", + "Creators": "Skabere", + "DevicesLoadError": "Det lykkedes ikke at indlæse enhederne", + "HeaderLatestBooks": "Nyligt tilføjede bøger", + "HeaderLatestMusicVideos": "Nyligt tilføjede musikvideoer", + "HeaderSplitMedia": "Adskil medier", + "HeaderTypeSimilarItemProviders": "Leverandører af lignende elementer ({0})", + "IndexNumber": "Indeksnummer", + "LabelBackupWarning": "Der kører i øjeblikket planlagte opgaver. Det anbefales at stoppe dem eller vente, indtil de er afsluttet, før sikkerhedskopieringen udføres.", + "LabelSimilarItemProvidersHelp": "Aktivér og rangordn dine foretrukne udbydere af lignende elementer efter prioritet.", + "LabelInternalServerUri": "Intern URI", + "LabelInternalServerUriHelp": "Offentliggjort server-URI til intern adgang.", + "LabelOriginalLanguage": "Originalsprog", + "LabelSyncPlayJoinGroup": "Tilmeld gruppe", + "LabelUseSamePublishedServerUri": "Brug den samme offentliggjorte server-URI til både intern og ekstern adgang", + "LibrariesLoadError": "Det lykkedes ikke at indlæse biblioteker", + "NetworkingPageLoadError": "Det lykkedes ikke at indlæse netværksindstillingerne", + "NoCastTargets": "Der er ingen mål til castning tilgængelige", + "OnFilesystem": "På filsystemet: {0}", + "OptionDatePlaylistUpdated": "Dato for opdatering af playsliste", + "OriginalLanguage": "Originalsprog", + "ResetFilters": "Nulstil filtre", + "ResumeLoadError": "Det lykkedes ikke at indlæse genoptagelsesindstillinger", + "StillWatchingPrompt": "Ser du stadig med?-promt", + "StillWatchingOption": "{0} episoder eller {1} minutter", + "StopWatching": "Stop med at se", + "StreamingLoadError": "Det lykkedes ikke at indlæse indstillingerne for streamingsiden", + "HeaderBackupWarning": "ADVARSEL: Igangværende planlagte opgaver", + "TableOfContents": "Indholdsfortegnelse", + "UsersEditPageError": "Det lykkedes ikke at indlæse redigeringssiden for brugere", + "VideoRotationNotSupported": "Videorotation understøttes ikke", + "TrickplayLoadError": "Det lykkedes ikke at indlæse trickplay-indstillingerne", + "LabelExternalServerUri": "Ekstern URI", + "LabelExternalServerUriHelp": "Offentliggjort server-URI til ekstern adgang.", + "LabelVideoAttributes": "Videoegenskaber", + "LabelVideoColors": "Videoefarver", + "LabelVideoBitDepth": "Videobitdybde", + "LabelAudioAttributes": "Lydegenskaber", + "LabelTargetCodecs": "Mål-kodeks", + "LabelProgressAndSpeed": "Fremskridt/hastighed", + "LabelReasons": "Årsager", + "LabelPlayerSizes": "Afspiller-størrelser", + "LabelPlaybackQuality": "Billeder gået tabt/beskadiget", + "Unwatch": "Markér som Ikke-set", + "Watch": "Set" } From e4c734d4ba8493f1effc5d6348f1c49a55b41e07 Mon Sep 17 00:00:00 2001 From: Rolf Date: Sun, 5 Jul 2026 12:05:19 -0400 Subject: [PATCH 021/287] Translated using Weblate (Swedish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sv/ --- src/strings/sv.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/sv.json b/src/strings/sv.json index 178f9c00a6..72f02c0847 100644 --- a/src/strings/sv.json +++ b/src/strings/sv.json @@ -1923,5 +1923,6 @@ "ConfirmSplitMedia": "Är du säker på att du vill dela upp mediakällorna till separata objekt?", "HeaderSplitMedia": "Dela upp media", "StillWatchingPrompt": "Tittar du fortfarande", - "Creators": "Skaparna" + "Creators": "Skaparna", + "IndexNumber": "Indexnummer" } From dc4243e8e8ed47503b40f964cb20c1ed81e4940d Mon Sep 17 00:00:00 2001 From: Lofuuzi Date: Sun, 5 Jul 2026 13:33:47 -0400 Subject: [PATCH 022/287] Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant_HK/ --- src/strings/zh-hk.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index 94092c8e8d..6e79910b06 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -1461,8 +1461,8 @@ "OptionLoginAttemptsBeforeLockoutHelp": "設為 0 嘅話,普通用家會有 3 次登入機會,管理員就有 5 次。設為 -1 就會熄咗呢個保安功能。", "OptionMaxActiveSessions": "設定最大嘅 Session(連線)數量。", "OptionMaxActiveSessionsHelp": "設為 0 即係熄咗呢個功能。", - "OptionRequirePerfectSubtitleMatch": "只係會下載同影片檔案完美匹配嘅字幕", - "OptionRequirePerfectSubtitleMatchHelp": "要求完全匹配會篩選出嗰啲專門為你個影片檔案測試同驗證過嘅字幕。唔勾選呢個會增加下載到字幕嘅機會,但同時亦會增加字幕時間軸唔準或者內容錯誤嘅風險。", + "OptionRequirePerfectSubtitleMatch": "只係會下載同影片檔案完美最接近嘅字幕", + "OptionRequirePerfectSubtitleMatchHelp": "要求完全符合會篩選出嗰啲專門為你個影片檔案測試同驗證過嘅字幕。唔勾選呢個會比較容易下載到字幕,但同時亦會增加字幕時間軸唔夾或者內容出錯嘅風險。", "OptionSaveMetadataAsHidden": "將媒體詳細資料同埋圖像儲存做隱藏檔案", "OptionSaveMetadataAsHiddenHelp": "更改呢個設定只會對未來保存嘅媒體資訊生效。現有媒體資訊檔案要等到伺服器下次保存嗰陣先會更新。", "OriginalAirDate": "首播日期", @@ -1480,7 +1480,7 @@ "PathNotFound": "搵唔到呢個路徑。唔該check吓個路徑啱唔啱,然後再試。", "Penciller": "鉛筆畫師", "People": "出演", - "PerfectMatch": "最佳匹配", + "PerfectMatch": "最佳符合", "Person": "人物", "PersonRole": "飾演 {0}", "Photo": "照片", @@ -1587,9 +1587,9 @@ "ReleaseDate": "發行日期", "ReleaseGroup": "發行系列", "RememberAudioSelections": "根據返之前睇過嘅內容嚟設定音軌", - "RememberAudioSelectionsHelp": "自動試下揀返同上一個影片最匹配嘅音軌。", + "RememberAudioSelectionsHelp": "自動嘗試揀返同上一條片設定最接近嘅音軌。", "RememberSubtitleSelections": "根據返之前睇過嘅內容嚟設定字幕", - "RememberSubtitleSelectionsHelp": "自動試下揀返同上一個影片最匹配嘅字幕。", + "RememberSubtitleSelectionsHelp": "自動嘗試揀返同上一條片設定最接近嘅字幕。", "Remixer": "重混師", "RemoveFromPlaylist": "由播放清單入面拎走", "RenderPgsSubtitle": "實驗性 PGS 字幕渲染", @@ -1602,7 +1602,7 @@ "RepositoriesPageLoadError": "載入資源櫃失敗", "RetryWithGlobalSearch": "試下用「全域搜尋」再搵過", "Reset": "重置", - "ResolutionMatchSource": "匹配來源", + "ResolutionMatchSource": "使用來源", "Restart": "重新啟動", "ResumeAt": "由 {0} 續播", "SaveLyricsIntoMediaFolders": "將歌詞儲存喺媒體資料夾入面", @@ -1769,7 +1769,7 @@ "ContainerNotSupported": "唔支援呢種封裝格式(Container)", "SubtitleCodecNotSupported": "唔支援呢種字幕編碼", "VideoCodecNotSupported": "唔支援呢種影片編碼", - "VideoCodecTagNotSupported": "唔支援呢個影片編碼標籤(Codec tag)", + "VideoCodecTagNotSupported": "唔支援呢條片嘅編碼標籤(Codec tag)", "AudioBitrateNotSupported": "唔支援呢個音訊碼率(Bitrate)", "AudioChannelsNotSupported": "系統唔支援呢個數目嘅音訊聲道", "VideoResolutionNotSupported": "唔支援呢條片嘅解像度", @@ -1779,10 +1779,10 @@ "InterlacedVideoNotSupported": "唔支援隔行掃描(Interlaced)影片", "SecondaryAudioNotSupported": "唔支援第二音軌", "RefFramesNotSupported": "唔支援參考影格(Reference frames)", - "VideoBitDepthNotSupported": "唔支援呢個影片位元深度(Bit depth)", + "VideoBitDepthNotSupported": "唔支援呢條片嘅位元深度(Bit depth)", "VideoFramerateNotSupported": "唔支援呢條片嘅影格率(Framerate)", - "VideoLevelNotSupported": "唔支援呢個影片編碼等級(Level)", - "VideoProfileNotSupported": "唔支援呢個影片編碼設定(Profile)", + "VideoLevelNotSupported": "唔支援呢條片嘅編碼等級(Level)", + "VideoProfileNotSupported": "唔支援呢條片嘅編碼設定(Profile)", "PreferSystemNativeHwDecoder": "優先用系統原生嘅 DXVA 或者 VA-API 硬體解碼器", "EnableIntelLowPowerH264HwEncoder": "啟用 Intel 低功耗 H.264 硬體編碼", "EnableIntelLowPowerHevcHwEncoder": "啟用 Intel 低功耗 HEVC 硬體編碼", From 7e9d571dacbc468e98417975b656b850b4a03c36 Mon Sep 17 00:00:00 2001 From: Gargotaire Date: Mon, 6 Jul 2026 02:23:06 -0400 Subject: [PATCH 023/287] Translated using Weblate (Catalan) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ca/ --- src/strings/ca.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/ca.json b/src/strings/ca.json index 8529665266..e9e73611ee 100644 --- a/src/strings/ca.json +++ b/src/strings/ca.json @@ -1922,5 +1922,7 @@ "Creators": "Creadors", "HeaderSplitMedia": "Divideix els continguts multimèdia", "StillWatchingPrompt": "Avís de continuació de reproducció", - "StopWatching": "Deixa de veure" + "StopWatching": "Deixa de veure", + "NoCastTargets": "No hi ha objectius d'emissió disponibles", + "IndexNumber": "Número d'índex" } From 12ccd4b501b02e703d409440e68cb15471a26d81 Mon Sep 17 00:00:00 2001 From: Vincenzo Reale Date: Mon, 6 Jul 2026 02:18:03 -0400 Subject: [PATCH 024/287] Translated using Weblate (Italian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/ --- src/strings/it.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/it.json b/src/strings/it.json index b4f234ae66..07bde0c2b4 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -1924,5 +1924,6 @@ "Creators": "Creatori", "ConfirmSplitMedia": "Sei sicuro di voler dividere le fonti multimediali in elementi separati?", "HeaderSplitMedia": "Suddividi media", - "IndexNumber": "Numero indice" + "IndexNumber": "Numero indice", + "NoCastTargets": "Nessuna destinazione di trasmissione disponibile" } From 89b8cf5c4a26af94faaf653bd54e39e25d8ca9f3 Mon Sep 17 00:00:00 2001 From: Lofuuzi Date: Mon, 6 Jul 2026 04:03:20 -0400 Subject: [PATCH 025/287] Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant_HK/ --- src/strings/zh-hk.json | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index 6e79910b06..686e9d7857 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -401,7 +401,7 @@ "EnableDecodingColorDepth10Vp9": "啟用 VP9 10-bit 硬體解碼", "EnableDecodingColorDepth10Hevc": "啟用 HEVC 10-bit 硬體解碼", "EnableColorCodedBackgrounds": "彩色背景", - "EnableBlurHashHelp": "喺圖像未載入完嗰陣,顯示一個用已載入數據整出嚟嘅模糊縮圖(BlurHash)。", + "EnableBlurHashHelp": "喺圖像未載入完嗰陣,顯示一個用已載入數據整出嚟嘅模糊預覽圖(BlurHash)。", "EnableBlurHash": "啟用圖像模糊預覽效果(BlurHash)", "EnableBackdropsHelp": "喺瀏覽媒體櫃嗰陣,將「背景圖」顯示喺頁面背景。", "EditMetadata": "編輯媒體詳細資料", @@ -519,7 +519,7 @@ "LabelKodiMetadataEnablePathSubstitutionHelp": "允許伺服器用路徑取代設定,去替代原本嘅圖像路徑。", "LabelKodiMetadataEnablePathSubstitution": "啟用路徑取代", "LabelKodiMetadataEnableExtraThumbsHelp": "為咗最大程度兼容 Kodi 嘅主題,下載返嚟嘅圖像會同時儲存喺「extrafanart」同「extrathumbs」資料夾。", - "LabelKodiMetadataEnableExtraThumbs": "將「額外背景圖」嘅內容複製去「額外縮圖」欄位", + "LabelKodiMetadataEnableExtraThumbs": "將「額外背景圖」嘅內容複製去「額外預覽圖」欄位", "LabelKodiMetadataDateFormatHelp": "NFO 檔案入面嘅所有日期都會以呢個格式嚟解析。", "LabelKodiMetadataDateFormat": "發佈日期格式", "LabelKnownProxies": "已知 Proxy 伺服器", @@ -997,7 +997,7 @@ "LabelChapterImageResolutionHelp": "擷取章節圖像嘅解像度。改呢個設定唔會影響已經整好咗嘅模擬章節。", "HeaderRecordingMetadataSaving": "錄影媒體詳細資料", "UseEpisodeImagesInNextUp": "喺「跟住落嚟」同「繼續睇返」區域,顯示該集數嘅圖像", - "UseEpisodeImagesInNextUpHelp": "「跟住落嚟」同「繼續睇返」區域會用相關集數嘅圖像取代劇集主縮圖嚟顯示。", + "UseEpisodeImagesInNextUpHelp": "「跟住落嚟」同「繼續睇返」區域會用相關集數嘅圖像取代劇集主預覽圖嚟顯示。", "TabScheduledTasks": "工作排程器", "LabelPlaybackInfo": "播放資訊", "EnableCardLayout": "顯示卡片式佈局(CardBox)", @@ -1152,7 +1152,7 @@ "PageNotFound": "搵唔到你要搵嘅頁面。", "PasswordMatchError": "密碼同確認密碼一定要一樣。", "PasswordRequiredForAdmin": "管理員帳戶一定要設定密碼。", - "Thumb": "縮圖", + "Thumb": "預覽圖", "ChannelResolutionHD": "高清(HD)", "ChannelResolutionFullHD": "全高清(Full HD)", "AlwaysRemuxMp3AudioFilesHelp": "如果你啲 MP3 檔喺瀏覽器播嗰陣計唔準時間,可以開咗呢項嚟解決。", @@ -1680,7 +1680,7 @@ "TabLogs": "日誌", "TextSent": "訊息已發送。", "TheseSettingsAffectSubtitlesOnThisDevice": "呢啲設定只會影響呢部裝置嘅字幕顯示", - "ThumbCard": "縮圖卡片", + "ThumbCard": "預覽圖卡片", "TitleHostingSettings": "主機設定", "TitlePlayback": "播放", "Track": "聲軌", @@ -1815,27 +1815,27 @@ "MachineTranslated": "機器翻譯", "ForeignPartsOnly": "剩係要強制/外語部分", "HearingImpairedShort": "聽障/SDH", - "Trickplay": "快轉縮圖(Trickplay)", + "Trickplay": "快轉預覽圖(Trickplay)", "LabelTrickplayAccel": "啟用硬體解碼", "LabelTrickplayAccelEncoding": "啟用硬體加速 MJPEG 編碼", "LabelTrickplayAccelEncodingHelp": "目前只支援 QSV、VA-API、VideoToolbox 同 RKMPP,呢個選項對其他硬體加速方法冇效果。", "LabelTrickplayKeyFrameOnlyExtraction": "只係用關鍵影格(Key frames)嚟整預覽圖", "LabelTrickplayKeyFrameOnlyExtractionHelp": "只係擷取「關鍵影格(Key frames)」,咁樣處理速度會快好多,但時間定位就未必百分百準確。如果設定咗嘅硬體解碼器唔支援呢個模式,就會轉用軟體解碼。", - "NonBlockingScan": "非阻塞(Non-blocking)— 先排隊整縮圖,然後直接完成掃描", - "BlockingScan": "阻塞(Blocking)— 排隊整預覽圖,整完先會完成掃描", + "NonBlockingScan": "非阻塞(Non-blocking)— 將縮圖產生加入工作排程,然後直接先完成掃描", + "BlockingScan": "阻窒(Blocking)— 先產生預覽圖,整完先會繼續完成掃描", "LabelScanBehavior": "掃描行為", - "LabelScanBehaviorHelp": "初始係「非阻塞」,即係未整完縮圖都會照樣將影片加入媒體櫃。揀「阻塞(Blocking)」嘅話,就會整完縮圖先加,但掃描速度會慢好多。", + "LabelScanBehaviorHelp": "初始係「非阻窒」,即係未整完預覽圖都會照樣將影片加入媒體櫃。揀「阻窒(Blocking)」嘅話,就會整完預覽圖先加,但掃描速度會慢好多。", "PriorityHigh": "高", "PriorityAboveNormal": "高於正常", "PriorityNormal": "正常", "PriorityBelowNormal": "低於正常", "PriorityIdle": "閒置", "LabelProcessPriority": "處理程序優先權", - "LabelProcessPriorityHelp": "設定呢個數值會決定 CPU 優先處理 FFmpeg 快轉縮圖嘅程度。如果你發現整緊縮圖嗰陣部機變慢咗,但又唔想完全停咗佢,可以試下降低呢個優先權同埋線程數量。", + "LabelProcessPriorityHelp": "設定呢個數值會決定 CPU 優先處理 FFmpeg 快轉預覽圖嘅程度。如果你發現整緊預覽圖嗰陣部機變慢咗,但又唔想完全停咗佢,可以試下降低呢個優先權同埋線程數量。", "LabelImageInterval": "圖像間隔", "LabelImageIntervalHelp": "每張新快轉預覽圖之間嘅時間間隔(毫秒)。", "LabelWidthResolutions": "橫向解像度", - "LabelWidthResolutionsHelp": "產生快轉縮圖嘅寬度列表(單位係像素,用逗號隔開)。圖像會跟返原本條片嘅比例嚟整,例如 16:9 嘅片,設定 320 寬度嘅話,出嚟嘅縮圖大約係 320x180。", + "LabelWidthResolutionsHelp": "產生快轉預覽圖嘅寬度列表(單位係像素,用逗號隔開)。圖像會跟返原本條片嘅比例嚟整,例如 16:9 嘅片,設定 320 寬度嘅話,出嚟嘅預覽圖大約係 320x180。", "LabelTileWidth": "圖塊寬度(水平數量)", "LabelTileWidthHelp": "每個圖塊(Tile)喺 X 軸方向最多可以有幾多張圖。", "LabelTileHeight": "圖塊高度(垂直數量)", @@ -1847,9 +1847,9 @@ "LabelTrickplayThreads": "FFmpeg 線程數", "LabelTrickplayThreadsHelp": "設定傳送畀 FFmpeg「-threads」參數嘅線程數量。", "OptionExtractTrickplayImage": "啟用快轉預覽圖擷取", - "ExtractTrickplayImagesHelp": "快轉縮圖同章節縮圖差唔多,分別在於佢係覆蓋成條片嘅長度,等你在拉動進度條嗰陣可以睇到預覽畫面。", + "ExtractTrickplayImagesHelp": "快轉預覽圖同章節預覽圖差唔多,分別在於佢係覆蓋成條片嘅長度,等你在拉動進度條嗰陣可以睇到預覽畫面。", "LabelExtractTrickplayDuringLibraryScan": "掃描媒體櫃嗰陣,順便整埋快轉預覽圖", - "LabelExtractTrickplayDuringLibraryScanHelp": "掃描媒體櫃嗰陣順便產生埋快轉縮圖。如果唔係,縮圖就會留返喺「快轉縮圖」排程工作嗰陣先做。如果設定做「非阻塞(Non-blocking)」,就唔會拖慢成個掃描進度。", + "LabelExtractTrickplayDuringLibraryScanHelp": "掃描媒體櫃嗰陣順便產生埋快轉預覽圖。如果唔係,預覽圖就會留返喺「快轉預覽圖」排程工作嗰陣先做。如果設定做「非阻窒(Non-blocking)」,就唔會拖慢成個掃描進度。", "Larger": "大啲", "MediaInfoCodecTag": "編碼標籤", "MediaInfoColorPrimaries": "原色座標", From 9466329206e9963267ff94146fe370114a8e03ed Mon Sep 17 00:00:00 2001 From: Thunderstrike116 Date: Mon, 6 Jul 2026 04:49:11 -0400 Subject: [PATCH 026/287] Translated using Weblate (Greek) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/el/ --- src/strings/el.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/el.json b/src/strings/el.json index 9ce3693f99..4117367ea1 100644 --- a/src/strings/el.json +++ b/src/strings/el.json @@ -1924,5 +1924,6 @@ "LabelReasons": "Αιτίες", "LabelPlayerSizes": "Μεγέθη προγράμματος αναπαραγωγής", "LabelPlaybackQuality": "Χαμένο / κατεστραμμένο καρέ", - "IndexNumber": "Αριθμός ευρετηρίου" + "IndexNumber": "Αριθμός ευρετηρίου", + "NoCastTargets": "Δεν υπάρχουν διαθέσιμοι στόχοι μετάδοσης" } From 295f6d43706fd6f6b0af1af69be506d6614105ab Mon Sep 17 00:00:00 2001 From: formosa Date: Mon, 6 Jul 2026 10:56:15 -0400 Subject: [PATCH 027/287] Translated using Weblate (Russian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/ --- src/strings/ru.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/strings/ru.json b/src/strings/ru.json index bb4656d76e..68f96f0077 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -1910,5 +1910,15 @@ "HeaderTypeSimilarItemProviders": "Провайдер похожих элементов ({0})", "LabelBackupWarning": "Есть активные запланированные задачи. Рекомендуем остановить их либо дождаться их выполнения перед созданием бэкапа.", "LabelSimilarItemProvidersHelp": "Включайте и ранжируйте провайдеров похожих элементов порядке приоритета.", - "HeaderBackupWarning": "ВНИМАНИЕ: Есть активные запланированные задачи" + "HeaderBackupWarning": "ВНИМАНИЕ: Есть активные запланированные задачи", + "ConfirmDeleteItemByName": "Удаление \"{0}\" удалит это и из файловой системы, и из Вашей библиотеки. Вы уверены что хотите продолжить?", + "ConfirmSplitMedia": "Вы уверены что хотите разделить медиа-источники на разные объекты?", + "ConfirmStillWatching": "Вы всё ещё смотрите?", + "Creators": "Создатели", + "Disabled": "Отключено", + "HeaderSplitMedia": "Разделить Медиа на части", + "LabelOriginalLanguage": "Оригинальный язык", + "NoCastTargets": "Нет доступных устройств для трансляции", + "OriginalLanguage": "Оригинальный язык", + "StillWatchingPrompt": "Подсказка „Всё ещё смотрите?“" } From f6288ad4f8d2fd92c4a79c975d3d182d8ea35854 Mon Sep 17 00:00:00 2001 From: serzh-photograf Date: Mon, 6 Jul 2026 12:53:50 -0400 Subject: [PATCH 028/287] Translated using Weblate (Ukrainian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/uk/ --- src/strings/uk.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/uk.json b/src/strings/uk.json index 7d598dfcbb..8ba38a92aa 100644 --- a/src/strings/uk.json +++ b/src/strings/uk.json @@ -1923,5 +1923,7 @@ "TableOfContents": "Зміст", "ConfirmSplitMedia": "Ви впевнені, що хочете розділити медіаджерела на окремі елементи?", "HeaderSplitMedia": "Розділити медіафайл", - "Creators": "Творці" + "Creators": "Творці", + "IndexNumber": "Номер індексу", + "NoCastTargets": "Немає пристроїв для трансляції" } From 1adc643ddf77d32b894a20ef424a9d43dc5b97b2 Mon Sep 17 00:00:00 2001 From: Lofuuzi Date: Mon, 6 Jul 2026 12:07:38 -0400 Subject: [PATCH 029/287] Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant_HK/ --- src/strings/zh-hk.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index 686e9d7857..451d1b8d7a 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -526,11 +526,11 @@ "LabelKidsCategories": "兒童分類", "LabelKeepUpTo": "保留最新", "LabelIsForced": "強制", - "LabelInternetQuality": "網路畫質", + "LabelInternetQuality": "網際網路品質", "LabelImportOnlyFavoriteChannels": "只限已標記做「心水」嘅頻道", "LabelImageType": "圖像格式", "LabelHomeScreenSectionValue": "主畫面第 {0} 部分", - "LabelHomeNetworkQuality": "屋企網路畫質", + "LabelHomeNetworkQuality": "屋企網路(區域網)品質", "LabelHardwareEncoding": "硬體加速", "LabelHardwareAccelerationTypeHelp": "硬體加速仲需要啲額外設定先用到。", "LabelHardwareAccelerationType": "硬體加速", @@ -650,7 +650,7 @@ "HeaderYears": "年", "HeaderVideoTypes": "影片類型", "HeaderVideoType": "影片類型", - "HeaderVideoQuality": "影片畫質", + "HeaderVideoQuality": "影片品質", "HeaderUser": "使用者", "HeaderUploadSubtitle": "上載字幕", "HeaderUploadImage": "上載圖像", @@ -1739,7 +1739,7 @@ "XmlTvNewsCategoriesHelp": "屬於呢啲類別嘅節目會顯示做新聞節目。如果有幾個類別,唔該用「|」隔開。", "XmlTvPathHelp": "XML 電視檔案嘅路徑。Jellyfin 會讀取呢個檔案,並且會定期check吓有無更新。你需要自己負責建立同更新呢個檔案。", "XmlTvSportsCategoriesHelp": "屬於呢啲類別嘅節目會顯示做體育節目。如果有幾個類別,唔該用「|」隔開。", - "Yadif": "又一個去交錯濾鏡 (YADIF)", + "Yadif": "Yet Another 去交錯濾鏡 (YADIF)", "HeaderSelectFallbackFontPath": "揀返備用字體資料夾嘅路徑", "HeaderSelectFallbackFontPathHelp": "搵下或者輸入備用字體資料夾路徑,用嚟顯示 ASS/SSA 格式嘅字幕。", "LabelFallbackFontPath": "備用字體資料夾路徑", @@ -1750,7 +1750,7 @@ "AspectRatioFill": "拉伸", "Remuxing": "重新封裝", "RemuxHelp1": "媒體用緊唔夾嘅檔案容器(MKV、AVI、WMV 等),但影片同音訊串流同部裝置係夾嘅。媒體會喺傳送去裝置之前即時進行無損重新封裝。", - "RemuxHelp2": "重新封裝(Remux)幾乎唔使點耗用系統資源,而且畫質完全無損。", + "RemuxHelp2": "重新封裝(Remux)幾乎唔使點耗用系統資源,而且品質完全無損。", "LabelAudioInfo": "音頻資訊", "LabelVideoInfo": "影片資訊", "LabelTrackGain": "音軌增益", @@ -1821,7 +1821,7 @@ "LabelTrickplayAccelEncodingHelp": "目前只支援 QSV、VA-API、VideoToolbox 同 RKMPP,呢個選項對其他硬體加速方法冇效果。", "LabelTrickplayKeyFrameOnlyExtraction": "只係用關鍵影格(Key frames)嚟整預覽圖", "LabelTrickplayKeyFrameOnlyExtractionHelp": "只係擷取「關鍵影格(Key frames)」,咁樣處理速度會快好多,但時間定位就未必百分百準確。如果設定咗嘅硬體解碼器唔支援呢個模式,就會轉用軟體解碼。", - "NonBlockingScan": "非阻塞(Non-blocking)— 將縮圖產生加入工作排程,然後直接先完成掃描", + "NonBlockingScan": "非阻塞(Non-blocking)— 將預覽圖產生加入工作排程,然後直接先完成掃描", "BlockingScan": "阻窒(Blocking)— 先產生預覽圖,整完先會繼續完成掃描", "LabelScanBehavior": "掃描行為", "LabelScanBehaviorHelp": "初始係「非阻窒」,即係未整完預覽圖都會照樣將影片加入媒體櫃。揀「阻窒(Blocking)」嘅話,就會整完預覽圖先加,但掃描速度會慢好多。", From 54b51089b6700cf7a94dad875edc4643a690d434 Mon Sep 17 00:00:00 2001 From: Lofuuzi Date: Mon, 6 Jul 2026 16:55:25 -0400 Subject: [PATCH 030/287] Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant_HK/ --- src/strings/zh-hk.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index 451d1b8d7a..cf4cf23ff8 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -388,7 +388,7 @@ "EnableQuickConnect": "喺呢部伺服器啟用快速連線功能", "EnablePhotosHelp": "系統會自動搵返啲相,並將佢哋同其他媒體檔一齊顯示。", "EnablePhotos": "顯示相片", - "EnableNextVideoInfoOverlayHelp": "喺影片就快播完嗰陣,顯示播放清單下一條片嘅資訊。", + "EnableNextVideoInfoOverlayHelp": "喺影片就快完咗嗰陣,顯示播放清單下一條片嘅資訊。", "EnableNextVideoInfoOverlay": "播放嗰陣顯示下一條片嘅資訊", "EnableHardwareEncoding": "啟用硬體編碼", "EnableFasterAnimationsHelp": "用更快速嘅動畫同過渡效果。", From 45103424f80051a400f1d6fceaf211f1baa5c30f Mon Sep 17 00:00:00 2001 From: yuuta0331 Date: Mon, 6 Jul 2026 18:46:18 -0400 Subject: [PATCH 031/287] Translated using Weblate (Japanese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ja/ --- src/strings/ja.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/ja.json b/src/strings/ja.json index a358df36da..d6c798c4bf 100644 --- a/src/strings/ja.json +++ b/src/strings/ja.json @@ -1870,5 +1870,6 @@ "ActivitiesLoadError": "アクティビティの読み込みに失敗しました", "ApiKeysLoadError": "APIキーの読み込みに失敗しました", "ConfirmDeleteCollection": "このコレクションを削除してよろしいですか?", - "ConfirmDeletePlaylist": "このプレイリストを削除してよろしいですか?" + "ConfirmDeletePlaylist": "このプレイリストを削除してよろしいですか?", + "Authors": "著者" } From e4001a51e4f760bca1a9737e7e4599bb1311fa33 Mon Sep 17 00:00:00 2001 From: Shed Shedson Date: Tue, 7 Jul 2026 12:33:03 -0400 Subject: [PATCH 032/287] Translated using Weblate (Icelandic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/is/ --- src/strings/is-is.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/strings/is-is.json b/src/strings/is-is.json index be72c37f10..c6ac31cad7 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -466,5 +466,11 @@ "LabelSegmentKeepSeconds": "Tími til að halda bútum", "LabelSegmentKeepSecondsHelp": "Tími í sekúndum sem bútum er haldið eftir að biðlarinn halar þeim niður. Virkar einungis ef heimilt er að eyða bútum.", "AllowFmp4TranscodingContainerHelp": "Leyfa fMP4 umritunarílát fyrir þennan móttakara til að virkja HEVC og HDR efni. Ekki eru allir móttakarar samhæfir þessum íláti. Slökktu á þessu ef þú lendir í vandræðum með spilun.", - "AlwaysBurnInSubtitleWhenTranscoding": "Alltaf brenna inn texta við umritun" + "AlwaysBurnInSubtitleWhenTranscoding": "Alltaf brenna inn texta við umritun", + "ActivitiesLoadError": "Ekki tókst að hlaða inn efni", + "AllowStreamSharingHelp": "Gefa leyfi fyrir Jellyfin til að afrita \"mpegts\" streyminu frá móttakaranum og deila afritaða steyminu með m notenda. Þetta er gagnlegt þegar móttakarinn hefur hámarksfjölda fyrir streymi, en getur valdið spilunarvillum.", + "AlwaysBurnInSubtitleWhenTranscodingHelp": "Brennir alla texta þegar umkóðun hefst. Þetta tryggir samstillingu texta eftir umkóðun á kostnað hægari umkóðun.", + "AllowTonemappingHelp": "Með litavörpun er hægt að breyta myndbandi úr HDR yfir í SDR án þess að tapa litum og smáatriðum, sem skiptir öllu máli svo upprunalegu myndina skili sér rétt. Sem stendur virkar þetta aðeins með 10-bita HDR10, HLG og Dolby Vision(DoVi) myndböndum. Þetta krefst þess að viðeigandi GPGPU-keyrsluumhverfi sé til staðar.", + "AlwaysRemuxFlacAudioFilesHelp": "Kveiktu á þessu sem bráðabirgðalausn ef vafrinn spilar ekki skrárnar eða sýnir rangan tíma í spilaranum.", + "AlwaysRemuxMp3AudioFilesHelp": "Virkjaðu þetta sem bráðabirgðalausn ef vafrinn þinn reiknar tímastimpla rangt." } From a5219462c6f34a8c92d065615e7fba435695a393 Mon Sep 17 00:00:00 2001 From: Shed Shedson Date: Tue, 7 Jul 2026 14:02:12 -0400 Subject: [PATCH 033/287] Translated using Weblate (Icelandic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/is/ --- src/strings/is-is.json | 42 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/src/strings/is-is.json b/src/strings/is-is.json index c6ac31cad7..4b73670cce 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -366,7 +366,7 @@ "LabelBirthYear": "Fæðingarár", "LabelBirthDate": "Fæðingardagur", "LabelArtists": "Listamenn", - "LabelAppNameExample": "Dæmi: Sickbeard, Sonarr", + "LabelAppNameExample": "Lýsandi nafn fyrir API-lykla.", "LabelAccessDay": "Vikudagur", "Kids": "Krakkar", "Hide": "Fela", @@ -400,7 +400,7 @@ "LabelEnableHardwareDecodingFor": "Gera vélbúnaðarafkóðun virka fyrir", "LabelDroppedFrames": "Felldir rammar", "LabelDiscNumber": "Númer disks", - "LabelDashboardTheme": "Þema mælaborðs", + "LabelDashboardTheme": "Þema stjórnborðs", "LabelCustomCss": "Sérsniðin CSS", "LabelCriticRating": "Einkunn gagnrýnanda", "LabelCorruptedFrames": "Skemmdir rammar", @@ -472,5 +472,41 @@ "AlwaysBurnInSubtitleWhenTranscodingHelp": "Brennir alla texta þegar umkóðun hefst. Þetta tryggir samstillingu texta eftir umkóðun á kostnað hægari umkóðun.", "AllowTonemappingHelp": "Með litavörpun er hægt að breyta myndbandi úr HDR yfir í SDR án þess að tapa litum og smáatriðum, sem skiptir öllu máli svo upprunalegu myndina skili sér rétt. Sem stendur virkar þetta aðeins með 10-bita HDR10, HLG og Dolby Vision(DoVi) myndböndum. Þetta krefst þess að viðeigandi GPGPU-keyrsluumhverfi sé til staðar.", "AlwaysRemuxFlacAudioFilesHelp": "Kveiktu á þessu sem bráðabirgðalausn ef vafrinn spilar ekki skrárnar eða sýnir rangan tíma í spilaranum.", - "AlwaysRemuxMp3AudioFilesHelp": "Virkjaðu þetta sem bráðabirgðalausn ef vafrinn þinn reiknar tímastimpla rangt." + "AlwaysRemuxMp3AudioFilesHelp": "Virkjaðu þetta sem bráðabirgðalausn ef vafrinn þinn reiknar tímastimpla rangt.", + "AndOtherArtists": "{0} og {1} aðrir listamenn.", + "Anime": "Anime", + "ApiKeysLoadError": "Tókst ekki að hlaða inn API-lyklum", + "Authors": "Höfundar", + "Author": "Höfundur", + "AutoSubtitleStylingHelp": "Hér er skipt sjálfkrafa á milli upprunalegs og sérsniðins útlits á texta eftir því hvaða tæki þú notar.", + "BackdropScreensaver": "Skjávari", + "BackupsPageLoadError": "Tókst ekki að opna síðu fyrir öryggisafrit", + "BlockContentWithTagsHelp": "Fela efni með að minnsta kosti eitt af eftirfarandi merkingum.", + "BrandingLoadError": "Ekki tókst að hlaða inn þínu vörumerking stillingum", + "ButtonAddProvider": "Bæta við veitanda", + "ButtonAddTunerDevice": "Bæta við móttakara", + "ButtonCreateBackup": "Búa til afrit", + "ButtonEditUser": "Breyta notanda", + "ButtonLearnMore": "Lærðu meira", + "ButtonSelectView": "Veldu útlit", + "CancelSeries": "Hætta við þáttaröð", + "Casual": "Óformlegt", + "ChannelResolutionSD": "SD", + "ChannelResolutionSDPAL": "SD(PAL)", + "ChannelResolutionHD": "HD", + "ChannelResolutionFullHD": "Full HD", + "ChannelResolutionUHD4K": "UHD (4K)", + "CinemaModeConfigurationHelp": "Bíóhamur færir kvikmyndahúsa-upplifunina beint heim í stofuna með því að spila stiklur á undan myndinni.", + "SelectAudioNormalizationHelp": "Hljóðstig lags – jafnar hljóðstyrk á milli einstakra laga. Hljóðstig plötu – jafnar hljóðstyrk heilla platna en heldur innbyrðis dýnamík laganna. Breytingar taka gildi eftir að spilarinn er endurræstur.", + "Colorist": "Litari", + "ColorPrimaries": "Aðal litir", + "Conductor": "Stjórnandi", + "HeaderBackupsHelp": "Hér geturðu búið til og endurheimt skyndimyndir af þjóninum. Það getur innifalið gagnagrunna, lýsigögn, texta og „trickplay“-gögn.", + "HeaderKodiMetadataHelp": "Ef þú vilt kveikja eða slökkva á NFO-lýsigögnum skaltu breyta viðkomandi safni og fara í hlutann „Vistun lýsigagna“.", + "HeaderPreferredMetadataLanguage": "Sjálfgefið tungumál lýsigagna", + "HeaderRecordingMetadataSaving": "Upptöku lýsigögn", + "ChannelAccessHelp": "Veldu þær rásir sem á að deila með þessum notanda. Kerfisstjórar munu geta breytt öllum rásum í gegnum lýsigagna-stjórann.", + "ConfigureDateAdded": "Stilltu hvernig „Dagsetning bætt við“ er reiknuð undir Stjórnborð > Söfn > Sýna", + "DefaultMetadataLangaugeDescription": "Þetta eru sjálfgefnu stillingarnar þínar en þú getur breytt þeim fyrir hvert safn.", + "LabelUserRemoteClientBitrateLimitHelp": "Breytir sjálfgefna gildinu sem stillt er á þjóninum. Sjá nánar undir Stjórnborð > Spilun > Streymi." } From 88069a08f6268eadbbd75a3b6b920c007148ec50 Mon Sep 17 00:00:00 2001 From: Dan Tsivinsky Date: Tue, 7 Jul 2026 14:48:27 -0400 Subject: [PATCH 034/287] Translated using Weblate (Russian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ru/ --- src/strings/ru.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/ru.json b/src/strings/ru.json index 68f96f0077..5907abdd05 100644 --- a/src/strings/ru.json +++ b/src/strings/ru.json @@ -1920,5 +1920,6 @@ "LabelOriginalLanguage": "Оригинальный язык", "NoCastTargets": "Нет доступных устройств для трансляции", "OriginalLanguage": "Оригинальный язык", - "StillWatchingPrompt": "Подсказка „Всё ещё смотрите?“" + "StillWatchingPrompt": "Подсказка „Всё ещё смотрите?“", + "TableOfContents": "Оглавление" } From 53ab5e25a29b497d89d5e972a76cd4ba10b61599 Mon Sep 17 00:00:00 2001 From: Translation expert Date: Tue, 7 Jul 2026 18:46:36 -0400 Subject: [PATCH 035/287] Translated using Weblate (Arabic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ar/ --- src/strings/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/ar.json b/src/strings/ar.json index d55a7f310a..45e40b594b 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -1914,7 +1914,7 @@ "CardSettings": "اعدادت البطاقة", "ConfirmDeleteItemByName": "حذف\"{0}\" سيقوم بحذفه من نظام الملفات و مكتبك وسائطك معا. هل انت متأكد من رغبتك في المتابعة؟", "ConfirmStillWatching": "هل مازلت تشاهد؟", - "Disabled": "مثبّط", + "Disabled": "غير نشط", "LabelOriginalLanguage": "لغة أصلية", "OriginalLanguage": "لغة أصلية", "StillWatchingPrompt": "ملقم متابعة المشاهدة", From 218ff376cfc8104eb7388d704d906747c74ebdde Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 8 Jul 2026 13:54:18 +0000 Subject: [PATCH 036/287] Update dependency @jellyfin/sdk to v0.0.0-unstable.202607081347 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 876912fbe5..58651a280b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@fontsource/noto-sans-sc": "5.2.9", "@fontsource/noto-sans-tc": "5.2.9", "@jellyfin/libass-wasm": "4.2.4", - "@jellyfin/sdk": "0.0.0-unstable.202607010629", + "@jellyfin/sdk": "0.0.0-unstable.202607081347", "@jellyfin/ux-web": "1.0.0", "@mui/icons-material": "6.5.0", "@mui/material": "6.5.0", @@ -4661,9 +4661,9 @@ "license": "LGPL-2.1-or-later AND (FTL OR GPL-2.0-or-later) AND MIT AND MIT-Modern-Variant AND ISC AND NTP AND Zlib AND BSL-1.0" }, "node_modules/@jellyfin/sdk": { - "version": "0.0.0-unstable.202607010629", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202607010629.tgz", - "integrity": "sha512-Ky4ErdbRi/atC/8u2PvVVFEK1TJCd6NuEyzOehOMrFCvp+Pm5fmI6Hs5/1tLXhgnaC6+6W4NqR1mfJ0aUONefw==", + "version": "0.0.0-unstable.202607081347", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202607081347.tgz", + "integrity": "sha512-VPe7CLvM0363lsewqOjZipuwR0U0OQm5KjtukZHHejkb6ey5N342Vu/gQX03yriZJ6T69ioRkdIZ6qHgxrB/Sw==", "license": "MPL-2.0", "peerDependencies": { "axios": "^1.12.0" diff --git a/package.json b/package.json index 181c9a7c73..0ef134ecce 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "@fontsource/noto-sans-sc": "5.2.9", "@fontsource/noto-sans-tc": "5.2.9", "@jellyfin/libass-wasm": "4.2.4", - "@jellyfin/sdk": "0.0.0-unstable.202607010629", + "@jellyfin/sdk": "0.0.0-unstable.202607081347", "@jellyfin/ux-web": "1.0.0", "@mui/icons-material": "6.5.0", "@mui/material": "6.5.0", From 3d7537deb182932ba2bcc2ab28688c6bc0be8c5c Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 8 Jul 2026 11:34:55 -0400 Subject: [PATCH 037/287] Fix v12 api refactoring --- .../features/activity/api/useLogEntries.ts | 10 +-- .../features/devices/api/useDeleteDevice.ts | 8 +-- .../features/devices/api/useDevices.ts | 10 +-- .../features/devices/api/useUpdateDevice.ts | 8 +-- .../devices/components/DeviceCard.tsx | 4 +- .../dashboard/features/keys/api/useApiKeys.ts | 4 +- .../features/keys/api/useCreateKey.ts | 8 +-- .../features/keys/api/useRevokeKey.ts | 8 +-- .../plugins/api/useConfigurationPages.ts | 12 ++-- .../features/plugins/api/useDisablePlugin.ts | 8 +-- .../features/plugins/api/useEnablePlugin.ts | 8 +-- .../features/plugins/api/useInstallPackage.ts | 8 +-- .../features/plugins/api/usePackageInfo.ts | 12 ++-- .../features/plugins/api/usePackages.ts | 5 +- .../features/plugins/api/usePlugins.ts | 6 +- .../features/plugins/api/useRepositories.ts | 5 +- .../plugins/api/useSetRepositories.ts | 8 +-- .../plugins/api/useUninstallPlugin.ts | 8 +-- .../sessions/utils/getNowPlayingName.ts | 4 +- .../utils/getSessionNowPlayingStreamInfo.ts | 4 +- .../utils/getSessionNowPlayingTime.ts | 4 +- .../features/tasks/api/useStartTask.ts | 8 +-- .../features/tasks/api/useStopTask.ts | 8 +-- .../dashboard/features/tasks/api/useTask.ts | 10 +-- .../dashboard/features/tasks/api/useTasks.ts | 10 +-- .../features/tasks/api/useUpdateTask.ts | 8 +-- .../features/tasks/hooks/useLiveTasks.ts | 4 +- .../features/users/api/useChannels.ts | 10 +-- .../features/users/api/useNetworkConfig.ts | 4 +- src/apps/dashboard/routes/branding/index.tsx | 10 +-- src/apps/dashboard/routes/devices/index.tsx | 4 +- .../dashboard/routes/libraries/display.tsx | 8 +-- .../dashboard/routes/libraries/metadata.tsx | 6 +- src/apps/dashboard/routes/libraries/nfo.tsx | 4 +- .../dashboard/routes/livetv/recordings.tsx | 4 +- src/apps/dashboard/routes/logs/index.tsx | 6 +- .../dashboard/routes/networking/index.tsx | 4 +- src/apps/dashboard/routes/playback/resume.tsx | 6 +- .../dashboard/routes/playback/streaming.tsx | 6 +- .../dashboard/routes/playback/transcoding.tsx | 4 +- .../dashboard/routes/playback/trickplay.tsx | 6 +- src/apps/dashboard/routes/settings/index.tsx | 6 +- src/apps/legacy/controllers/favorites.js | 4 +- .../legacy/controllers/itemDetails/index.js | 3 +- src/apps/legacy/controllers/lyrics.js | 4 +- .../features/libraries/api/useLatestMedia.ts | 12 ++-- .../features/libraries/api/useNextUp.ts | 12 ++-- .../features/libraries/api/useResumeItems.ts | 12 ++-- .../playback/utils/mediaSegmentManager.ts | 4 +- .../features/search/api/fetchItemsByType.ts | 8 +-- .../features/search/api/useArtistsSearch.ts | 8 +-- .../features/search/api/usePeopleSearch.ts | 8 +-- .../features/search/api/useProgramsSearch.ts | 4 +- .../search/api/useSearchSuggestions.ts | 4 +- .../features/search/api/useStudiosSearch.ts | 8 +-- .../features/search/api/useVideoSearch.ts | 8 +-- src/apps/legacy/routes/quickConnect/index.tsx | 4 +- .../details/hooks/api/useGetItemByType.ts | 4 +- src/components/itemHelper.js | 4 +- src/components/lyricseditor/lyricseditor.js | 8 +-- .../lyricsuploader/lyricsuploader.js | 4 +- .../playlisteditor/playlisteditor.ts | 19 +++-- src/components/shortcuts.js | 4 +- src/hooks/api/useDisplayPreferences.ts | 12 ++-- src/hooks/api/useUserViews.ts | 12 ++-- .../videosHooks/useDeleteAlternateSources.ts | 10 +-- src/hooks/useConfiguration.ts | 4 +- src/hooks/useFetchItems.ts | 71 +++++++++---------- src/hooks/useItem.ts | 4 +- src/hooks/useNamedConfiguration.ts | 4 +- src/hooks/useQuickConnect.ts | 4 +- src/scripts/playlistViewer.js | 4 +- src/utils/image.ts | 10 +-- 73 files changed, 281 insertions(+), 288 deletions(-) diff --git a/src/apps/dashboard/features/activity/api/useLogEntries.ts b/src/apps/dashboard/features/activity/api/useLogEntries.ts index 40853a31ed..42ad9cab07 100644 --- a/src/apps/dashboard/features/activity/api/useLogEntries.ts +++ b/src/apps/dashboard/features/activity/api/useLogEntries.ts @@ -1,17 +1,17 @@ -import type { ActivityLogApiGetLogEntriesRequest } from '@jellyfin/sdk/lib/generated-client/api/activity-log-api'; +import type { SystemApiGetLogEntriesRequest } from '@jellyfin/sdk/lib/generated-client/api/system-api'; import type { AxiosRequestConfig } from 'axios'; import type { Api } from '@jellyfin/sdk'; -import { getActivityLogApi } from '@jellyfin/sdk/lib/utils/api/activity-log-api'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; import { useQuery } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; const fetchLogEntries = async ( api: Api, - requestParams?: ActivityLogApiGetLogEntriesRequest, + requestParams?: SystemApiGetLogEntriesRequest, options?: AxiosRequestConfig ) => { - const response = await getActivityLogApi(api).getLogEntries(requestParams, { + const response = await getSystemApi(api).getLogEntries(requestParams, { signal: options?.signal }); @@ -19,7 +19,7 @@ const fetchLogEntries = async ( }; export const useLogEntries = ( - requestParams: ActivityLogApiGetLogEntriesRequest + requestParams: SystemApiGetLogEntriesRequest ) => { const { api } = useApi(); return useQuery({ diff --git a/src/apps/dashboard/features/devices/api/useDeleteDevice.ts b/src/apps/dashboard/features/devices/api/useDeleteDevice.ts index 0caefe2b18..44f5e18a25 100644 --- a/src/apps/dashboard/features/devices/api/useDeleteDevice.ts +++ b/src/apps/dashboard/features/devices/api/useDeleteDevice.ts @@ -1,5 +1,5 @@ -import type { DevicesApiDeleteDeviceRequest } from '@jellyfin/sdk/lib/generated-client/api/devices-api'; -import { getDevicesApi } from '@jellyfin/sdk/lib/utils/api/devices-api'; +import type { DeviceApiDeleteDeviceRequest } from '@jellyfin/sdk/lib/generated-client/api/device-api'; +import { getDeviceApi } from '@jellyfin/sdk/lib/utils/api/device-api'; import { useMutation } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; @@ -10,8 +10,8 @@ export const useDeleteDevice = () => { const { api } = useApi(); return useMutation({ - mutationFn: (params: DevicesApiDeleteDeviceRequest) => ( - getDevicesApi(api!) + mutationFn: (params: DeviceApiDeleteDeviceRequest) => ( + getDeviceApi(api!) .deleteDevice(params) ), onSuccess: () => { diff --git a/src/apps/dashboard/features/devices/api/useDevices.ts b/src/apps/dashboard/features/devices/api/useDevices.ts index a97664ad3d..628b817ea8 100644 --- a/src/apps/dashboard/features/devices/api/useDevices.ts +++ b/src/apps/dashboard/features/devices/api/useDevices.ts @@ -1,7 +1,7 @@ -import type { DevicesApiGetDevicesRequest } from '@jellyfin/sdk/lib/generated-client/api/devices-api'; +import type { DeviceApiGetDevicesRequest } from '@jellyfin/sdk/lib/generated-client/api/device-api'; import type { AxiosRequestConfig } from 'axios'; import type { Api } from '@jellyfin/sdk'; -import { getDevicesApi } from '@jellyfin/sdk/lib/utils/api/devices-api'; +import { getDeviceApi } from '@jellyfin/sdk/lib/utils/api/device-api'; import { useQuery } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; @@ -10,10 +10,10 @@ export const QUERY_KEY = 'Devices'; const fetchDevices = async ( api: Api, - requestParams?: DevicesApiGetDevicesRequest, + requestParams?: DeviceApiGetDevicesRequest, options?: AxiosRequestConfig ) => { - const response = await getDevicesApi(api).getDevices(requestParams, { + const response = await getDeviceApi(api).getDevices(requestParams, { signal: options?.signal }); @@ -21,7 +21,7 @@ const fetchDevices = async ( }; export const useDevices = ( - requestParams: DevicesApiGetDevicesRequest + requestParams: DeviceApiGetDevicesRequest ) => { const { api } = useApi(); return useQuery({ diff --git a/src/apps/dashboard/features/devices/api/useUpdateDevice.ts b/src/apps/dashboard/features/devices/api/useUpdateDevice.ts index eb9ad7f94c..1852375c88 100644 --- a/src/apps/dashboard/features/devices/api/useUpdateDevice.ts +++ b/src/apps/dashboard/features/devices/api/useUpdateDevice.ts @@ -1,5 +1,5 @@ -import type { DevicesApiUpdateDeviceOptionsRequest } from '@jellyfin/sdk/lib/generated-client/api/devices-api'; -import { getDevicesApi } from '@jellyfin/sdk/lib/utils/api/devices-api'; +import type { DeviceApiUpdateDeviceOptionsRequest } from '@jellyfin/sdk/lib/generated-client/api/device-api'; +import { getDeviceApi } from '@jellyfin/sdk/lib/utils/api/device-api'; import { useMutation } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; @@ -10,8 +10,8 @@ export const useUpdateDevice = () => { const { api } = useApi(); return useMutation({ - mutationFn: (params: DevicesApiUpdateDeviceOptionsRequest) => ( - getDevicesApi(api!) + mutationFn: (params: DeviceApiUpdateDeviceOptionsRequest) => ( + getDeviceApi(api!) .updateDeviceOptions(params) ), onSuccess: () => { diff --git a/src/apps/dashboard/features/devices/components/DeviceCard.tsx b/src/apps/dashboard/features/devices/components/DeviceCard.tsx index 31e5d6837d..72a250478c 100644 --- a/src/apps/dashboard/features/devices/components/DeviceCard.tsx +++ b/src/apps/dashboard/features/devices/components/DeviceCard.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useMemo, useState } from 'react'; -import type { SessionInfo } from '@jellyfin/sdk/lib/generated-client/models/session-info'; +import type { SessionInfoDto } from '@jellyfin/sdk/lib/generated-client/models/session-info-dto'; import Typography from '@mui/material/Typography'; import Card from '@mui/material/Card'; import CardMedia from '@mui/material/CardMedia'; @@ -27,7 +27,7 @@ import InputDialog from 'components/InputDialog'; import { useSendMessage } from '../../sessions/api/useSendMessage'; type DeviceCardProps = { - device: SessionInfo; + device: SessionInfoDto; }; const DeviceCard = ({ device }: DeviceCardProps) => { diff --git a/src/apps/dashboard/features/keys/api/useApiKeys.ts b/src/apps/dashboard/features/keys/api/useApiKeys.ts index e8f50b545c..f4ab880466 100644 --- a/src/apps/dashboard/features/keys/api/useApiKeys.ts +++ b/src/apps/dashboard/features/keys/api/useApiKeys.ts @@ -1,5 +1,5 @@ import { Api } from '@jellyfin/sdk'; -import { getApiKeyApi } from '@jellyfin/sdk/lib/utils/api/api-key-api'; +import { getAuthenticationApi } from '@jellyfin/sdk/lib/utils/api/authentication-api'; import { useQuery } from '@tanstack/react-query'; import { AxiosRequestConfig } from 'axios'; import { useApi } from 'hooks/useApi'; @@ -7,7 +7,7 @@ import { useApi } from 'hooks/useApi'; export const QUERY_KEY = 'ApiKeys'; const fetchApiKeys = async (api: Api, options?: AxiosRequestConfig) => { - const response = await getApiKeyApi(api).getKeys(options); + const response = await getAuthenticationApi(api).getKeys(options); return response.data; }; diff --git a/src/apps/dashboard/features/keys/api/useCreateKey.ts b/src/apps/dashboard/features/keys/api/useCreateKey.ts index ec7e474778..31bf324eaf 100644 --- a/src/apps/dashboard/features/keys/api/useCreateKey.ts +++ b/src/apps/dashboard/features/keys/api/useCreateKey.ts @@ -1,5 +1,5 @@ -import { ApiKeyApiCreateKeyRequest } from '@jellyfin/sdk/lib/generated-client/api/api-key-api'; -import { getApiKeyApi } from '@jellyfin/sdk/lib/utils/api/api-key-api'; +import { AuthenticationApiCreateKeyRequest } from '@jellyfin/sdk/lib/generated-client/api/authentication-api'; +import { getAuthenticationApi } from '@jellyfin/sdk/lib/utils/api/authentication-api'; import { useMutation } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; import { queryClient } from 'utils/query/queryClient'; @@ -9,8 +9,8 @@ export const useCreateKey = () => { const { api } = useApi(); return useMutation({ - mutationFn: (params: ApiKeyApiCreateKeyRequest) => ( - getApiKeyApi(api!) + mutationFn: (params: AuthenticationApiCreateKeyRequest) => ( + getAuthenticationApi(api!) .createKey(params) ), onSuccess: () => { diff --git a/src/apps/dashboard/features/keys/api/useRevokeKey.ts b/src/apps/dashboard/features/keys/api/useRevokeKey.ts index bc7dd67754..bd646222c8 100644 --- a/src/apps/dashboard/features/keys/api/useRevokeKey.ts +++ b/src/apps/dashboard/features/keys/api/useRevokeKey.ts @@ -1,5 +1,5 @@ -import type { ApiKeyApiRevokeKeyRequest } from '@jellyfin/sdk/lib/generated-client/api/api-key-api'; -import { getApiKeyApi } from '@jellyfin/sdk/lib/utils/api/api-key-api'; +import type { AuthenticationApiRevokeKeyRequest } from '@jellyfin/sdk/lib/generated-client/api/authentication-api'; +import { getAuthenticationApi } from '@jellyfin/sdk/lib/utils/api/authentication-api'; import { useMutation } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; import { queryClient } from 'utils/query/queryClient'; @@ -9,8 +9,8 @@ export const useRevokeKey = () => { const { api } = useApi(); return useMutation({ - mutationFn: (params: ApiKeyApiRevokeKeyRequest) => ( - getApiKeyApi(api!) + mutationFn: (params: AuthenticationApiRevokeKeyRequest) => ( + getAuthenticationApi(api!) .revokeKey(params) ), onSuccess: () => { diff --git a/src/apps/dashboard/features/plugins/api/useConfigurationPages.ts b/src/apps/dashboard/features/plugins/api/useConfigurationPages.ts index 9161c89265..2d4c9695d7 100644 --- a/src/apps/dashboard/features/plugins/api/useConfigurationPages.ts +++ b/src/apps/dashboard/features/plugins/api/useConfigurationPages.ts @@ -1,6 +1,6 @@ import type { Api } from '@jellyfin/sdk'; -import type { DashboardApiGetConfigurationPagesRequest } from '@jellyfin/sdk/lib/generated-client/api/dashboard-api'; -import { getDashboardApi } from '@jellyfin/sdk/lib/utils/api/dashboard-api'; +import type { PluginApiGetConfigurationPagesRequest } from '@jellyfin/sdk/lib/generated-client/api/plugin-api'; +import { getPluginApi } from '@jellyfin/sdk/lib/utils/api/plugin-api'; import { queryOptions, useQuery } from '@tanstack/react-query'; import type { AxiosRequestConfig } from 'axios'; @@ -10,17 +10,17 @@ import { QueryKey } from './queryKey'; const fetchConfigurationPages = async ( api: Api, - params?: DashboardApiGetConfigurationPagesRequest, + params?: PluginApiGetConfigurationPagesRequest, options?: AxiosRequestConfig ) => { - const response = await getDashboardApi(api) + const response = await getPluginApi(api) .getConfigurationPages(params, options); return response.data; }; const getConfigurationPagesQuery = ( api?: Api, - params?: DashboardApiGetConfigurationPagesRequest + params?: PluginApiGetConfigurationPagesRequest ) => queryOptions({ queryKey: [ QueryKey.ConfigurationPages, params?.enableInMainMenu ], queryFn: ({ signal }) => fetchConfigurationPages(api!, params, { signal }), @@ -28,7 +28,7 @@ const getConfigurationPagesQuery = ( }); export const useConfigurationPages = ( - params?: DashboardApiGetConfigurationPagesRequest + params?: PluginApiGetConfigurationPagesRequest ) => { const { api } = useApi(); return useQuery(getConfigurationPagesQuery(api, params)); diff --git a/src/apps/dashboard/features/plugins/api/useDisablePlugin.ts b/src/apps/dashboard/features/plugins/api/useDisablePlugin.ts index 4285213fa8..c119300168 100644 --- a/src/apps/dashboard/features/plugins/api/useDisablePlugin.ts +++ b/src/apps/dashboard/features/plugins/api/useDisablePlugin.ts @@ -1,5 +1,5 @@ -import type { PluginsApiDisablePluginRequest } from '@jellyfin/sdk/lib/generated-client/api/plugins-api'; -import { getPluginsApi } from '@jellyfin/sdk/lib/utils/api/plugins-api'; +import type { PluginApiDisablePluginRequest } from '@jellyfin/sdk/lib/generated-client/api/plugin-api'; +import { getPluginApi } from '@jellyfin/sdk/lib/utils/api/plugin-api'; import { useMutation } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; @@ -10,8 +10,8 @@ import { QueryKey } from './queryKey'; export const useDisablePlugin = () => { const { api } = useApi(); return useMutation({ - mutationFn: (params: PluginsApiDisablePluginRequest) => ( - getPluginsApi(api!) + mutationFn: (params: PluginApiDisablePluginRequest) => ( + getPluginApi(api!) .disablePlugin(params) ), onSuccess: () => { diff --git a/src/apps/dashboard/features/plugins/api/useEnablePlugin.ts b/src/apps/dashboard/features/plugins/api/useEnablePlugin.ts index a89eab5c57..f52ffa4da9 100644 --- a/src/apps/dashboard/features/plugins/api/useEnablePlugin.ts +++ b/src/apps/dashboard/features/plugins/api/useEnablePlugin.ts @@ -1,5 +1,5 @@ -import type { PluginsApiEnablePluginRequest } from '@jellyfin/sdk/lib/generated-client/api/plugins-api'; -import { getPluginsApi } from '@jellyfin/sdk/lib/utils/api/plugins-api'; +import type { PluginApiEnablePluginRequest } from '@jellyfin/sdk/lib/generated-client/api/plugin-api'; +import { getPluginApi } from '@jellyfin/sdk/lib/utils/api/plugin-api'; import { useMutation } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; @@ -10,8 +10,8 @@ import { QueryKey } from './queryKey'; export const useEnablePlugin = () => { const { api } = useApi(); return useMutation({ - mutationFn: (params: PluginsApiEnablePluginRequest) => ( - getPluginsApi(api!) + mutationFn: (params: PluginApiEnablePluginRequest) => ( + getPluginApi(api!) .enablePlugin(params) ), onSuccess: () => { diff --git a/src/apps/dashboard/features/plugins/api/useInstallPackage.ts b/src/apps/dashboard/features/plugins/api/useInstallPackage.ts index 93aeb1e8e7..2c5e61a3e3 100644 --- a/src/apps/dashboard/features/plugins/api/useInstallPackage.ts +++ b/src/apps/dashboard/features/plugins/api/useInstallPackage.ts @@ -1,5 +1,5 @@ -import type { PackageApiInstallPackageRequest } from '@jellyfin/sdk/lib/generated-client/api/package-api'; -import { getPackageApi } from '@jellyfin/sdk/lib/utils/api/package-api'; +import type { PluginApiInstallPackageRequest } from '@jellyfin/sdk/lib/generated-client/api/plugin-api'; +import { getPluginApi } from '@jellyfin/sdk/lib/utils/api/plugin-api'; import { useMutation } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; @@ -10,8 +10,8 @@ import { QueryKey } from './queryKey'; export const useInstallPackage = () => { const { api } = useApi(); return useMutation({ - mutationFn: (params: PackageApiInstallPackageRequest) => ( - getPackageApi(api!) + mutationFn: (params: PluginApiInstallPackageRequest) => ( + getPluginApi(api!) .installPackage(params) ), onSuccess: () => { diff --git a/src/apps/dashboard/features/plugins/api/usePackageInfo.ts b/src/apps/dashboard/features/plugins/api/usePackageInfo.ts index 43ef3f9372..726ab4a41d 100644 --- a/src/apps/dashboard/features/plugins/api/usePackageInfo.ts +++ b/src/apps/dashboard/features/plugins/api/usePackageInfo.ts @@ -1,7 +1,7 @@ import { queryOptions, useQuery } from '@tanstack/react-query'; import type { Api } from '@jellyfin/sdk'; -import type { PackageApiGetPackageInfoRequest } from '@jellyfin/sdk/lib/generated-client/api/package-api'; -import { getPackageApi } from '@jellyfin/sdk/lib/utils/api/package-api'; +import type { PluginApiGetPackageInfoRequest } from '@jellyfin/sdk/lib/generated-client/api/plugin-api'; +import { getPluginApi } from '@jellyfin/sdk/lib/utils/api/plugin-api'; import type { AxiosRequestConfig } from 'axios'; import { useApi } from 'hooks/useApi'; @@ -12,7 +12,7 @@ import type { PackageInfo } from '@jellyfin/sdk/lib/generated-client/models/pack const fetchPackageInfo = async ( api: Api, - params: PackageApiGetPackageInfoRequest, + params: PluginApiGetPackageInfoRequest, options?: AxiosRequestConfig ) => { const packagesData = queryClient.getQueryData([ QueryKey.Packages ]) as PackageInfo[]; @@ -25,14 +25,14 @@ const fetchPackageInfo = async ( } } - const response = await getPackageApi(api) + const response = await getPluginApi(api) .getPackageInfo(params, options); return response.data; }; const getPackageInfoQuery = ( api: Api | undefined, - params?: PackageApiGetPackageInfoRequest + params?: PluginApiGetPackageInfoRequest ) => queryOptions({ // Don't retry since requests for plugins not available in repos fail retry: false, @@ -42,7 +42,7 @@ const getPackageInfoQuery = ( }); export const usePackageInfo = ( - params?: PackageApiGetPackageInfoRequest + params?: PluginApiGetPackageInfoRequest ) => { const { api } = useApi(); return useQuery(getPackageInfoQuery(api, params)); diff --git a/src/apps/dashboard/features/plugins/api/usePackages.ts b/src/apps/dashboard/features/plugins/api/usePackages.ts index 45fe3e76ed..2b5d28c6b0 100644 --- a/src/apps/dashboard/features/plugins/api/usePackages.ts +++ b/src/apps/dashboard/features/plugins/api/usePackages.ts @@ -1,5 +1,5 @@ import type { Api } from '@jellyfin/sdk'; -import { getPackageApi } from '@jellyfin/sdk/lib/utils/api/package-api'; +import { getPluginApi } from '@jellyfin/sdk/lib/utils/api/plugin-api'; import { queryOptions, useQuery } from '@tanstack/react-query'; import type { AxiosRequestConfig } from 'axios'; @@ -11,7 +11,7 @@ const fetchPackages = async ( api: Api, options?: AxiosRequestConfig ) => { - const response = await getPackageApi(api) + const response = await getPluginApi(api) .getPackages(options); return response.data; }; @@ -29,4 +29,3 @@ export const usePackages = () => { const { api } = useApi(); return useQuery(getPackagesQuery(api)); }; - diff --git a/src/apps/dashboard/features/plugins/api/usePlugins.ts b/src/apps/dashboard/features/plugins/api/usePlugins.ts index a44ce474ee..a23f803933 100644 --- a/src/apps/dashboard/features/plugins/api/usePlugins.ts +++ b/src/apps/dashboard/features/plugins/api/usePlugins.ts @@ -1,5 +1,5 @@ import type { Api } from '@jellyfin/sdk'; -import { getPluginsApi } from '@jellyfin/sdk/lib/utils/api/plugins-api'; +import { getPluginApi } from '@jellyfin/sdk/lib/utils/api/plugin-api'; import { queryOptions, useQuery } from '@tanstack/react-query'; import type { AxiosRequestConfig } from 'axios'; @@ -11,8 +11,7 @@ const fetchPlugins = async ( api: Api, options?: AxiosRequestConfig ) => { - const response = await getPluginsApi(api) - .getPlugins(options); + const response = await getPluginApi(api).getPlugins(options); return response.data; }; @@ -28,4 +27,3 @@ export const usePlugins = () => { const { api } = useApi(); return useQuery(getPluginsQuery(api)); }; - diff --git a/src/apps/dashboard/features/plugins/api/useRepositories.ts b/src/apps/dashboard/features/plugins/api/useRepositories.ts index 27c5ef1fec..59674cabba 100644 --- a/src/apps/dashboard/features/plugins/api/useRepositories.ts +++ b/src/apps/dashboard/features/plugins/api/useRepositories.ts @@ -3,13 +3,13 @@ import { queryOptions, useQuery } from '@tanstack/react-query'; import type { AxiosRequestConfig } from 'axios'; import { useApi } from 'hooks/useApi'; import { QueryKey } from './queryKey'; -import { getPackageApi } from '@jellyfin/sdk/lib/utils/api/package-api'; +import { getPluginApi } from '@jellyfin/sdk/lib/utils/api/plugin-api'; const fetchRepositories = async ( api: Api, options?: AxiosRequestConfig ) => { - const response = await getPackageApi(api) + const response = await getPluginApi(api) .getRepositories(options); return response.data; }; @@ -26,4 +26,3 @@ export const useRepositories = () => { const { api } = useApi(); return useQuery(getRepositoriesQuery(api)); }; - diff --git a/src/apps/dashboard/features/plugins/api/useSetRepositories.ts b/src/apps/dashboard/features/plugins/api/useSetRepositories.ts index 62f9589755..1851a283a8 100644 --- a/src/apps/dashboard/features/plugins/api/useSetRepositories.ts +++ b/src/apps/dashboard/features/plugins/api/useSetRepositories.ts @@ -2,14 +2,14 @@ import { useMutation } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; import { queryClient } from 'utils/query/queryClient'; import { QueryKey } from './queryKey'; -import { getPackageApi } from '@jellyfin/sdk/lib/utils/api/package-api'; -import { PackageApiSetRepositoriesRequest } from '@jellyfin/sdk/lib/generated-client/api/package-api'; +import { getPluginApi } from '@jellyfin/sdk/lib/utils/api/plugin-api'; +import { PluginApiSetRepositoriesRequest } from '@jellyfin/sdk/lib/generated-client/api/plugin-api'; export const useSetRepositories = () => { const { api } = useApi(); return useMutation({ - mutationFn: (params: PackageApiSetRepositoriesRequest) => ( - getPackageApi(api!) + mutationFn: (params: PluginApiSetRepositoriesRequest) => ( + getPluginApi(api!) .setRepositories(params) ), onSuccess: () => { diff --git a/src/apps/dashboard/features/plugins/api/useUninstallPlugin.ts b/src/apps/dashboard/features/plugins/api/useUninstallPlugin.ts index 99ca9ec7c9..b78e33943b 100644 --- a/src/apps/dashboard/features/plugins/api/useUninstallPlugin.ts +++ b/src/apps/dashboard/features/plugins/api/useUninstallPlugin.ts @@ -1,5 +1,5 @@ -import type { PluginsApiUninstallPluginByVersionRequest } from '@jellyfin/sdk/lib/generated-client/api/plugins-api'; -import { getPluginsApi } from '@jellyfin/sdk/lib/utils/api/plugins-api'; +import type { PluginApiUninstallPluginByVersionRequest } from '@jellyfin/sdk/lib/generated-client/api/plugin-api'; +import { getPluginApi } from '@jellyfin/sdk/lib/utils/api/plugin-api'; import { useMutation } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; @@ -10,8 +10,8 @@ import { QueryKey } from './queryKey'; export const useUninstallPlugin = () => { const { api } = useApi(); return useMutation({ - mutationFn: (params: PluginsApiUninstallPluginByVersionRequest) => ( - getPluginsApi(api!) + mutationFn: (params: PluginApiUninstallPluginByVersionRequest) => ( + getPluginApi(api!) .uninstallPluginByVersion(params) ), onSuccess: () => { diff --git a/src/apps/dashboard/features/sessions/utils/getNowPlayingName.ts b/src/apps/dashboard/features/sessions/utils/getNowPlayingName.ts index 56e95e684b..4d9ad25123 100644 --- a/src/apps/dashboard/features/sessions/utils/getNowPlayingName.ts +++ b/src/apps/dashboard/features/sessions/utils/getNowPlayingName.ts @@ -1,4 +1,4 @@ -import type { SessionInfo } from '@jellyfin/sdk/lib/generated-client/models/session-info'; +import type { SessionInfoDto } from '@jellyfin/sdk/lib/generated-client/models/session-info-dto'; import itemHelper from 'components/itemHelper'; import formatDistanceToNow from 'date-fns/formatDistanceToNow'; import globalize from 'lib/globalize'; @@ -11,7 +11,7 @@ type NowPlayingInfo = { image?: string; }; -const getNowPlayingName = (session: SessionInfo): NowPlayingInfo => { +const getNowPlayingName = (session: SessionInfoDto): NowPlayingInfo => { let imgUrl = ''; const nowPlayingItem = session.NowPlayingItem; // FIXME: It seems that, sometimes, server sends date in the future, so date-fns displays messages like 'in less than a minute'. We should fix diff --git a/src/apps/dashboard/features/sessions/utils/getSessionNowPlayingStreamInfo.ts b/src/apps/dashboard/features/sessions/utils/getSessionNowPlayingStreamInfo.ts index 16f86d8ac7..18e690ddff 100644 --- a/src/apps/dashboard/features/sessions/utils/getSessionNowPlayingStreamInfo.ts +++ b/src/apps/dashboard/features/sessions/utils/getSessionNowPlayingStreamInfo.ts @@ -1,9 +1,9 @@ -import type { SessionInfo } from '@jellyfin/sdk/lib/generated-client/models/session-info'; +import type { SessionInfoDto } from '@jellyfin/sdk/lib/generated-client/models/session-info-dto'; import playmethodhelper from 'components/playback/playmethodhelper'; import globalize from 'lib/globalize'; // eslint-disable-next-line sonarjs/cognitive-complexity -const getSessionNowPlayingStreamInfo = (session: SessionInfo): string => { +const getSessionNowPlayingStreamInfo = (session: SessionInfoDto): string => { let text = ''; let showTranscodingInfo = false; const displayPlayMethod = playmethodhelper.getDisplayPlayMethod(session); diff --git a/src/apps/dashboard/features/sessions/utils/getSessionNowPlayingTime.ts b/src/apps/dashboard/features/sessions/utils/getSessionNowPlayingTime.ts index 07f55f8712..3564ee80f7 100644 --- a/src/apps/dashboard/features/sessions/utils/getSessionNowPlayingTime.ts +++ b/src/apps/dashboard/features/sessions/utils/getSessionNowPlayingTime.ts @@ -1,7 +1,7 @@ -import type { SessionInfo } from '@jellyfin/sdk/lib/generated-client/models/session-info'; +import type { SessionInfoDto } from '@jellyfin/sdk/lib/generated-client/models/session-info-dto'; import datetime from 'scripts/datetime'; -const getSessionNowPlayingTime = (session: SessionInfo) => { +const getSessionNowPlayingTime = (session: SessionInfoDto) => { const nowPlayingItem = session.NowPlayingItem; let start = '0:00'; diff --git a/src/apps/dashboard/features/tasks/api/useStartTask.ts b/src/apps/dashboard/features/tasks/api/useStartTask.ts index ef37b7e6e8..8b0a069207 100644 --- a/src/apps/dashboard/features/tasks/api/useStartTask.ts +++ b/src/apps/dashboard/features/tasks/api/useStartTask.ts @@ -1,5 +1,5 @@ -import { ScheduledTasksApiStartTaskRequest } from '@jellyfin/sdk/lib/generated-client/api/scheduled-tasks-api'; -import { getScheduledTasksApi } from '@jellyfin/sdk/lib/utils/api/scheduled-tasks-api'; +import { ScheduledTaskApiStartTaskRequest } from '@jellyfin/sdk/lib/generated-client/api/scheduled-task-api'; +import { getScheduledTaskApi } from '@jellyfin/sdk/lib/utils/api/scheduled-task-api'; import { useMutation } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; import { queryClient } from 'utils/query/queryClient'; @@ -9,8 +9,8 @@ export const useStartTask = () => { const { api } = useApi(); return useMutation({ - mutationFn: (params: ScheduledTasksApiStartTaskRequest) => ( - getScheduledTasksApi(api!) + mutationFn: (params: ScheduledTaskApiStartTaskRequest) => ( + getScheduledTaskApi(api!) .startTask(params) ), onSuccess: () => { diff --git a/src/apps/dashboard/features/tasks/api/useStopTask.ts b/src/apps/dashboard/features/tasks/api/useStopTask.ts index 30421ee6af..8b02333a08 100644 --- a/src/apps/dashboard/features/tasks/api/useStopTask.ts +++ b/src/apps/dashboard/features/tasks/api/useStopTask.ts @@ -1,5 +1,5 @@ -import { ScheduledTasksApiStartTaskRequest } from '@jellyfin/sdk/lib/generated-client/api/scheduled-tasks-api'; -import { getScheduledTasksApi } from '@jellyfin/sdk/lib/utils/api/scheduled-tasks-api'; +import { ScheduledTaskApiStartTaskRequest } from '@jellyfin/sdk/lib/generated-client/api/scheduled-task-api'; +import { getScheduledTaskApi } from '@jellyfin/sdk/lib/utils/api/scheduled-task-api'; import { useMutation } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; import { queryClient } from 'utils/query/queryClient'; @@ -9,8 +9,8 @@ export const useStopTask = () => { const { api } = useApi(); return useMutation({ - mutationFn: (params: ScheduledTasksApiStartTaskRequest) => ( - getScheduledTasksApi(api!) + mutationFn: (params: ScheduledTaskApiStartTaskRequest) => ( + getScheduledTaskApi(api!) .stopTask(params) ), onSuccess: () => { diff --git a/src/apps/dashboard/features/tasks/api/useTask.ts b/src/apps/dashboard/features/tasks/api/useTask.ts index 9df4adaefa..86ab3165c5 100644 --- a/src/apps/dashboard/features/tasks/api/useTask.ts +++ b/src/apps/dashboard/features/tasks/api/useTask.ts @@ -1,7 +1,7 @@ -import type { ScheduledTasksApiGetTaskRequest } from '@jellyfin/sdk/lib/generated-client/api/scheduled-tasks-api'; +import type { ScheduledTaskApiGetTaskRequest } from '@jellyfin/sdk/lib/generated-client/api/scheduled-task-api'; import type { AxiosRequestConfig } from 'axios'; import type { Api } from '@jellyfin/sdk'; -import { getScheduledTasksApi } from '@jellyfin/sdk/lib/utils/api/scheduled-tasks-api'; +import { getScheduledTaskApi } from '@jellyfin/sdk/lib/utils/api/scheduled-task-api'; import { useQuery } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; @@ -9,15 +9,15 @@ import { QUERY_KEY } from './useTasks'; const fetchTask = async ( api: Api, - params: ScheduledTasksApiGetTaskRequest, + params: ScheduledTaskApiGetTaskRequest, options?: AxiosRequestConfig ) => { - const response = await getScheduledTasksApi(api).getTask(params, options); + const response = await getScheduledTaskApi(api).getTask(params, options); return response.data; }; -export const useTask = (params: ScheduledTasksApiGetTaskRequest) => { +export const useTask = (params: ScheduledTaskApiGetTaskRequest) => { const { api } = useApi(); return useQuery({ diff --git a/src/apps/dashboard/features/tasks/api/useTasks.ts b/src/apps/dashboard/features/tasks/api/useTasks.ts index 7a4b6e1c4d..76114b23bc 100644 --- a/src/apps/dashboard/features/tasks/api/useTasks.ts +++ b/src/apps/dashboard/features/tasks/api/useTasks.ts @@ -1,7 +1,7 @@ -import type { ScheduledTasksApiGetTasksRequest } from '@jellyfin/sdk/lib/generated-client/api/scheduled-tasks-api'; +import type { ScheduledTaskApiGetTasksRequest } from '@jellyfin/sdk/lib/generated-client/api/scheduled-task-api'; import type { AxiosRequestConfig } from 'axios'; import type { Api } from '@jellyfin/sdk'; -import { getScheduledTasksApi } from '@jellyfin/sdk/lib/utils/api/scheduled-tasks-api'; +import { getScheduledTaskApi } from '@jellyfin/sdk/lib/utils/api/scheduled-task-api'; import { useQuery } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; @@ -10,15 +10,15 @@ export const QUERY_KEY = 'Tasks'; const fetchTasks = async ( api: Api, - params?: ScheduledTasksApiGetTasksRequest, + params?: ScheduledTaskApiGetTasksRequest, options?: AxiosRequestConfig ) => { - const response = await getScheduledTasksApi(api).getTasks(params, options); + const response = await getScheduledTaskApi(api).getTasks(params, options); return response.data; }; -export const useTasks = (params?: ScheduledTasksApiGetTasksRequest) => { +export const useTasks = (params?: ScheduledTaskApiGetTasksRequest) => { const { api } = useApi(); return useQuery({ diff --git a/src/apps/dashboard/features/tasks/api/useUpdateTask.ts b/src/apps/dashboard/features/tasks/api/useUpdateTask.ts index dd0e8ac72b..d79f8a5268 100644 --- a/src/apps/dashboard/features/tasks/api/useUpdateTask.ts +++ b/src/apps/dashboard/features/tasks/api/useUpdateTask.ts @@ -1,5 +1,5 @@ -import { ScheduledTasksApiUpdateTaskRequest } from '@jellyfin/sdk/lib/generated-client/api/scheduled-tasks-api'; -import { getScheduledTasksApi } from '@jellyfin/sdk/lib/utils/api/scheduled-tasks-api'; +import { ScheduledTaskApiUpdateTaskRequest } from '@jellyfin/sdk/lib/generated-client/api/scheduled-task-api'; +import { getScheduledTaskApi } from '@jellyfin/sdk/lib/utils/api/scheduled-task-api'; import { useMutation } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; import { queryClient } from 'utils/query/queryClient'; @@ -9,8 +9,8 @@ export const useUpdateTask = () => { const { api } = useApi(); return useMutation({ - mutationFn: (params: ScheduledTasksApiUpdateTaskRequest) => ( - getScheduledTasksApi(api!) + mutationFn: (params: ScheduledTaskApiUpdateTaskRequest) => ( + getScheduledTaskApi(api!) .updateTask(params) ), onSuccess: (_data, params) => { diff --git a/src/apps/dashboard/features/tasks/hooks/useLiveTasks.ts b/src/apps/dashboard/features/tasks/hooks/useLiveTasks.ts index c0e98a1030..a6f2a2fecc 100644 --- a/src/apps/dashboard/features/tasks/hooks/useLiveTasks.ts +++ b/src/apps/dashboard/features/tasks/hooks/useLiveTasks.ts @@ -1,11 +1,11 @@ import { useEffect } from 'react'; import { useApi } from 'hooks/useApi'; import { QUERY_KEY, useTasks } from '../api/useTasks'; -import type { ScheduledTasksApiGetTasksRequest } from '@jellyfin/sdk/lib/generated-client/api/scheduled-tasks-api'; +import type { ScheduledTaskApiGetTasksRequest } from '@jellyfin/sdk/lib/generated-client/api/scheduled-task-api'; import { queryClient } from 'utils/query/queryClient'; import { OutboundWebSocketMessageType } from '@jellyfin/sdk/lib/websocket'; -const useLiveTasks = (params: ScheduledTasksApiGetTasksRequest) => { +const useLiveTasks = (params: ScheduledTaskApiGetTasksRequest) => { const { api } = useApi(); const tasksQuery = useTasks(params); diff --git a/src/apps/dashboard/features/users/api/useChannels.ts b/src/apps/dashboard/features/users/api/useChannels.ts index ebf2db0439..65449a178f 100644 --- a/src/apps/dashboard/features/users/api/useChannels.ts +++ b/src/apps/dashboard/features/users/api/useChannels.ts @@ -1,17 +1,17 @@ import { Api } from '@jellyfin/sdk'; import { useQuery } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; -import { getChannelsApi } from '@jellyfin/sdk/lib/utils/api/channels-api'; -import { ChannelsApiGetChannelsRequest } from '@jellyfin/sdk/lib/generated-client/api/channels-api'; +import { getChannelApi } from '@jellyfin/sdk/lib/utils/api/channel-api'; +import { ChannelApiGetChannelsRequest } from '@jellyfin/sdk/lib/generated-client/api/channel-api'; import type { AxiosRequestConfig } from 'axios'; -const fetchChannels = async (api: Api, params?: ChannelsApiGetChannelsRequest, options?: AxiosRequestConfig) => { - const response = await getChannelsApi(api).getChannels(params, options); +const fetchChannels = async (api: Api, params?: ChannelApiGetChannelsRequest, options?: AxiosRequestConfig) => { + const response = await getChannelApi(api).getChannels(params, options); return response.data; }; -export const useChannels = (params?: ChannelsApiGetChannelsRequest) => { +export const useChannels = (params?: ChannelApiGetChannelsRequest) => { const { api } = useApi(); return useQuery({ diff --git a/src/apps/dashboard/features/users/api/useNetworkConfig.ts b/src/apps/dashboard/features/users/api/useNetworkConfig.ts index 9b06ca64f9..8993135d88 100644 --- a/src/apps/dashboard/features/users/api/useNetworkConfig.ts +++ b/src/apps/dashboard/features/users/api/useNetworkConfig.ts @@ -1,12 +1,12 @@ import { Api } from '@jellyfin/sdk'; import { useQuery } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; -import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; import type { AxiosRequestConfig } from 'axios'; import type { NetworkConfiguration } from '@jellyfin/sdk/lib/generated-client/models/network-configuration'; const fetchNetworkConfig = async (api: Api, options?: AxiosRequestConfig) => { - const response = await getConfigurationApi(api).getNamedConfiguration({ key: 'network' }, options); + const response = await getSystemApi(api).getNamedConfiguration({ key: 'network' }, options); return response.data as NetworkConfiguration; }; diff --git a/src/apps/dashboard/routes/branding/index.tsx b/src/apps/dashboard/routes/branding/index.tsx index b087a1c901..6918ef089c 100644 --- a/src/apps/dashboard/routes/branding/index.tsx +++ b/src/apps/dashboard/routes/branding/index.tsx @@ -1,5 +1,5 @@ -import type { BrandingOptions } from '@jellyfin/sdk/lib/generated-client/models/branding-options'; -import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import type { BrandingOptionsDto } from '@jellyfin/sdk/lib/generated-client/models/branding-options-dto'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; import { getImageApi } from '@jellyfin/sdk/lib/utils/api/image-api'; import Delete from '@mui/icons-material/Delete'; import Upload from '@mui/icons-material/Upload'; @@ -39,13 +39,13 @@ export const action = async ({ request }: ActionFunctionArgs) => { const formData = await request.formData(); const data = Object.fromEntries(formData); - const brandingOptions: BrandingOptions = { + const brandingOptions: BrandingOptionsDto = { CustomCss: data.CustomCss?.toString(), LoginDisclaimer: data.LoginDisclaimer?.toString(), SplashscreenEnabled: data.SplashscreenEnabled?.toString() === 'on' }; - await getConfigurationApi(api) + await getSystemApi(api) .updateNamedConfiguration({ key: BRANDING_CONFIG_KEY, body: JSON.stringify(brandingOptions) @@ -150,7 +150,7 @@ export const Component = () => { const setSplashscreenEnabled = useCallback(async (_: React.ChangeEvent, isEnabled: boolean) => { setIsSplashscreenEnabled(isEnabled); - await getConfigurationApi(api!) + await getSystemApi(api!) .updateNamedConfiguration({ key: BRANDING_CONFIG_KEY, body: JSON.stringify({ diff --git a/src/apps/dashboard/routes/devices/index.tsx b/src/apps/dashboard/routes/devices/index.tsx index 42a3b1b6a8..46f656f1ef 100644 --- a/src/apps/dashboard/routes/devices/index.tsx +++ b/src/apps/dashboard/routes/devices/index.tsx @@ -77,7 +77,7 @@ export const Component = () => { const onConfirmDelete = useCallback(() => { if (pendingDeleteDeviceId) { deleteDevice.mutate({ - id: pendingDeleteDeviceId + id: [pendingDeleteDeviceId] }, { onSettled: onCloseDeleteConfirmDialog }); @@ -97,7 +97,7 @@ export const Component = () => { Promise .all(devices.map(item => { if (api && item.Id && api.deviceInfo.id === item.Id) { - return deleteDevice.mutateAsync({ id: item.Id }); + return deleteDevice.mutateAsync({ id: [item.Id] }); } return Promise.resolve(); })) diff --git a/src/apps/dashboard/routes/libraries/display.tsx b/src/apps/dashboard/routes/libraries/display.tsx index 06cb6eb5de..26a977b17b 100644 --- a/src/apps/dashboard/routes/libraries/display.tsx +++ b/src/apps/dashboard/routes/libraries/display.tsx @@ -12,7 +12,7 @@ import TextField from '@mui/material/TextField'; import Typography from '@mui/material/Typography'; import Loading from 'components/loading/LoadingComponent'; import Page from 'components/Page'; -import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; import { QUERY_KEY as CONFIG_QUERY_KEY, useConfiguration } from 'hooks/useConfiguration'; import { QUERY_KEY as NAMED_CONFIG_QUERY_KEY, useNamedConfiguration } from 'hooks/useNamedConfiguration'; import globalize from 'lib/globalize'; @@ -31,7 +31,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { const formData = await request.formData(); const data = Object.fromEntries(formData); - const { data: config } = await getConfigurationApi(api).getConfiguration(); + const { data: config } = await getSystemApi(api).getConfiguration(); const metadataConfig: MetadataConfiguration = { UseFileCreationTimeForDateAdded: data.DateAddedBehavior.toString() === '1' @@ -43,10 +43,10 @@ export const action = async ({ request }: ActionFunctionArgs) => { config.EnableGroupingShowsIntoCollections = data.GroupShowsIntoCollections?.toString() === 'on'; config.EnableExternalContentInSuggestions = data.EnableExternalContentInSuggestions?.toString() === 'on'; - await getConfigurationApi(api) + await getSystemApi(api) .updateConfiguration({ serverConfiguration: config }); - await getConfigurationApi(api) + await getSystemApi(api) .updateNamedConfiguration({ key: CONFIG_KEY, body: metadataConfig }); void queryClient.invalidateQueries({ diff --git a/src/apps/dashboard/routes/libraries/metadata.tsx b/src/apps/dashboard/routes/libraries/metadata.tsx index a1d7c69a3d..4b6ad4d71f 100644 --- a/src/apps/dashboard/routes/libraries/metadata.tsx +++ b/src/apps/dashboard/routes/libraries/metadata.tsx @@ -1,5 +1,5 @@ import { ImageResolution } from '@jellyfin/sdk/lib/generated-client/models/image-resolution'; -import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; import Alert from '@mui/material/Alert'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; @@ -27,14 +27,14 @@ export const action = async ({ request }: ActionFunctionArgs) => { const formData = await request.formData(); const data = Object.fromEntries(formData); - const { data: config } = await getConfigurationApi(api).getConfiguration(); + const { data: config } = await getSystemApi(api).getConfiguration(); config.PreferredMetadataLanguage = data.Language.toString(); config.MetadataCountryCode = data.Country.toString(); config.DummyChapterDuration = parseInt(data.DummyChapterDuration.toString(), 10); config.ChapterImageResolution = data.ChapterImageResolution.toString() as ImageResolution; - await getConfigurationApi(api) + await getSystemApi(api) .updateConfiguration({ serverConfiguration: config }); void queryClient.invalidateQueries({ diff --git a/src/apps/dashboard/routes/libraries/nfo.tsx b/src/apps/dashboard/routes/libraries/nfo.tsx index 7a108fd1b4..b282d4ac05 100644 --- a/src/apps/dashboard/routes/libraries/nfo.tsx +++ b/src/apps/dashboard/routes/libraries/nfo.tsx @@ -1,4 +1,4 @@ -import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; import Alert from '@mui/material/Alert'; import Box from '@mui/material/Box'; import Button from '@mui/material/Button'; @@ -40,7 +40,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { EnableExtraThumbsDuplication: data.EnableExtraThumbsDuplication?.toString() === 'on' }; - await getConfigurationApi(api) + await getSystemApi(api) .updateNamedConfiguration({ key: CONFIG_KEY, body: newConfig }); void queryClient.invalidateQueries({ diff --git a/src/apps/dashboard/routes/livetv/recordings.tsx b/src/apps/dashboard/routes/livetv/recordings.tsx index b7da831544..7e2c6b2faf 100644 --- a/src/apps/dashboard/routes/livetv/recordings.tsx +++ b/src/apps/dashboard/routes/livetv/recordings.tsx @@ -21,7 +21,7 @@ import Checkbox from '@mui/material/Checkbox'; import FormHelperText from '@mui/material/FormHelperText'; import Button from '@mui/material/Button'; import { ServerConnections } from 'lib/jellyfin-apiclient'; -import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; import { queryClient } from 'utils/query/queryClient'; import { ActionData } from 'types/actionData'; @@ -33,7 +33,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { const data = await request.json() as LiveTvOptions; - await getConfigurationApi(api) + await getSystemApi(api) .updateNamedConfiguration({ key: CONFIG_KEY, body: data }); void queryClient.invalidateQueries({ diff --git a/src/apps/dashboard/routes/logs/index.tsx b/src/apps/dashboard/routes/logs/index.tsx index f44b7a6155..113115f7ff 100644 --- a/src/apps/dashboard/routes/logs/index.tsx +++ b/src/apps/dashboard/routes/logs/index.tsx @@ -1,5 +1,5 @@ import React, { ChangeEvent, useCallback, useEffect, useState } from 'react'; -import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; import Loading from 'components/loading/LoadingComponent'; import Page from 'components/Page'; import globalize from 'lib/globalize'; @@ -24,7 +24,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { if (!api) throw new Error('No Api instance available'); const formData = await request.formData(); - const { data: config } = await getConfigurationApi(api).getConfiguration(); + const { data: config } = await getSystemApi(api).getConfiguration(); const enableWarningMessage = formData.get('EnableWarningMessage'); config.EnableSlowResponseWarning = enableWarningMessage === 'on'; @@ -34,7 +34,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { config.SlowResponseThresholdMs = parseInt(responseTime.toString(), 10); } - await getConfigurationApi(api) + await getSystemApi(api) .updateConfiguration({ serverConfiguration: config }); return { diff --git a/src/apps/dashboard/routes/networking/index.tsx b/src/apps/dashboard/routes/networking/index.tsx index ab35582567..9dcf79f47f 100644 --- a/src/apps/dashboard/routes/networking/index.tsx +++ b/src/apps/dashboard/routes/networking/index.tsx @@ -21,7 +21,7 @@ import DirectoryBrowser from 'components/directorybrowser/directorybrowser'; import MenuItem from '@mui/material/MenuItem'; import Button from '@mui/material/Button'; import { ServerConnections } from 'lib/jellyfin-apiclient'; -import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; import { QUERY_KEY as CONFIG_QUERY_KEY } from 'hooks/useConfiguration'; import { queryClient } from 'utils/query/queryClient'; import { encodePublishedServerUris, getPublishedServerUris, PublishedServerUris, splitString } from 'apps/dashboard/features/networking/utils'; @@ -69,7 +69,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { newConfig.PublishedServerUriBySubnet = encodePublishedServerUris(publishedServerUri); - await getConfigurationApi(api) + await getSystemApi(api) .updateNamedConfiguration({ key: CONFIG_KEY, body: newConfig }); void queryClient.invalidateQueries({ diff --git a/src/apps/dashboard/routes/playback/resume.tsx b/src/apps/dashboard/routes/playback/resume.tsx index 981bd5b87b..709d39314a 100644 --- a/src/apps/dashboard/routes/playback/resume.tsx +++ b/src/apps/dashboard/routes/playback/resume.tsx @@ -12,14 +12,14 @@ import { type ActionFunctionArgs, Form, useActionData, useNavigation } from 'rea import { ActionData } from 'types/actionData'; import { QUERY_KEY, useConfiguration } from 'hooks/useConfiguration'; import Loading from 'components/loading/LoadingComponent'; -import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; import { queryClient } from 'utils/query/queryClient'; export const action = async ({ request }: ActionFunctionArgs) => { const api = ServerConnections.getApi(); if (!api) throw new Error('No Api instance available'); - const { data: config } = await getConfigurationApi(api).getConfiguration(); + const { data: config } = await getSystemApi(api).getConfiguration(); const formData = await request.formData(); const minResumePercentage = formData.get('MinResumePercentage')?.toString(); @@ -34,7 +34,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { if (maxAudiobookResume) config.MaxAudiobookResume = parseInt(maxAudiobookResume, 10); if (minResumeDuration) config.MinResumeDurationSeconds = parseInt(minResumeDuration, 10); - await getConfigurationApi(api) + await getSystemApi(api) .updateConfiguration({ serverConfiguration: config }); void queryClient.invalidateQueries({ diff --git a/src/apps/dashboard/routes/playback/streaming.tsx b/src/apps/dashboard/routes/playback/streaming.tsx index 733f9b6904..5f05272158 100644 --- a/src/apps/dashboard/routes/playback/streaming.tsx +++ b/src/apps/dashboard/routes/playback/streaming.tsx @@ -9,7 +9,7 @@ import Stack from '@mui/material/Stack'; import TextField from '@mui/material/TextField'; import Typography from '@mui/material/Typography'; import { type ActionFunctionArgs, Form, useActionData, useNavigation } from 'react-router-dom'; -import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; import { QUERY_KEY, useConfiguration } from 'hooks/useConfiguration'; import Loading from 'components/loading/LoadingComponent'; import { ActionData } from 'types/actionData'; @@ -19,13 +19,13 @@ export const action = async ({ request }: ActionFunctionArgs) => { const api = ServerConnections.getApi(); if (!api) throw new Error('No Api instance available'); - const { data: config } = await getConfigurationApi(api).getConfiguration(); + const { data: config } = await getSystemApi(api).getConfiguration(); const formData = await request.formData(); const bitrateLimit = formData.get('StreamingBitrateLimit')?.toString(); config.RemoteClientBitrateLimit = Math.trunc(1e6 * parseFloat(bitrateLimit || '0')); - await getConfigurationApi(api) + await getSystemApi(api) .updateConfiguration({ serverConfiguration: config }); void queryClient.invalidateQueries({ diff --git a/src/apps/dashboard/routes/playback/transcoding.tsx b/src/apps/dashboard/routes/playback/transcoding.tsx index 13b4a02c39..13da3e666b 100644 --- a/src/apps/dashboard/routes/playback/transcoding.tsx +++ b/src/apps/dashboard/routes/playback/transcoding.tsx @@ -24,7 +24,7 @@ import { QUERY_KEY, useNamedConfiguration } from 'hooks/useNamedConfiguration'; import type { EncodingOptions } from '@jellyfin/sdk/lib/generated-client/models/encoding-options'; import { HardwareAccelerationType } from '@jellyfin/sdk/lib/generated-client/models/hardware-acceleration-type'; import { ServerConnections } from 'lib/jellyfin-apiclient'; -import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; import { queryClient } from 'utils/query/queryClient'; import { ActionData } from 'types/actionData'; import { CODECS, HEVC_REXT_DECODING_TYPES, HEVC_VP9_HW_DECODING_TYPES } from 'apps/dashboard/features/playback/constants/codecs'; @@ -38,7 +38,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { const data = await request.json() as EncodingOptions; - await getConfigurationApi(api) + await getSystemApi(api) .updateNamedConfiguration({ key: CONFIG_KEY, body: data }); void queryClient.invalidateQueries({ diff --git a/src/apps/dashboard/routes/playback/trickplay.tsx b/src/apps/dashboard/routes/playback/trickplay.tsx index dbeb723089..9d816b888b 100644 --- a/src/apps/dashboard/routes/playback/trickplay.tsx +++ b/src/apps/dashboard/routes/playback/trickplay.tsx @@ -17,7 +17,7 @@ import MenuItem from '@mui/material/MenuItem'; import TextField from '@mui/material/TextField'; import Button from '@mui/material/Button'; import Alert from '@mui/material/Alert'; -import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; import { TrickplayScanBehavior } from '@jellyfin/sdk/lib/generated-client/models/trickplay-scan-behavior'; import { ProcessPriorityClass } from '@jellyfin/sdk/lib/generated-client/models/process-priority-class'; import { ActionData } from 'types/actionData'; @@ -30,7 +30,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { const formData = await request.formData(); const data = Object.fromEntries(formData); - const { data: config } = await getConfigurationApi(api).getConfiguration(); + const { data: config } = await getSystemApi(api).getConfiguration(); const options = config.TrickplayOptions; if (!options) throw new Error('Unexpected null TrickplayOptions'); @@ -48,7 +48,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { options.JpegQuality = parseInt(data.JpegQuality.toString() || '90', 10); options.ProcessThreads = parseInt(data.TrickplayThreads.toString() || '1', 10); - await getConfigurationApi(api) + await getSystemApi(api) .updateConfiguration({ serverConfiguration: config }); void queryClient.invalidateQueries({ diff --git a/src/apps/dashboard/routes/settings/index.tsx b/src/apps/dashboard/routes/settings/index.tsx index 878e346565..3a3a1417aa 100644 --- a/src/apps/dashboard/routes/settings/index.tsx +++ b/src/apps/dashboard/routes/settings/index.tsx @@ -22,7 +22,7 @@ import Checkbox from '@mui/material/Checkbox'; import Button from '@mui/material/Button'; import Link from '@mui/material/Link'; import DirectoryBrowser from 'components/directorybrowser/directorybrowser'; -import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; import { queryClient } from 'utils/query/queryClient'; import { ActionData } from 'types/actionData'; @@ -30,7 +30,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { const api = ServerConnections.getApi(); if (!api) throw new Error('No Api instance available'); - const { data: config } = await getConfigurationApi(api).getConfiguration(); + const { data: config } = await getSystemApi(api).getConfiguration(); const formData = await request.formData(); config.ServerName = formData.get('ServerName')?.toString(); @@ -41,7 +41,7 @@ export const action = async ({ request }: ActionFunctionArgs) => { config.LibraryScanFanoutConcurrency = parseInt(formData.get('LibraryScanFanoutConcurrency')?.toString() || '0', 10); config.ParallelImageEncodingLimit = parseInt(formData.get('ParallelImageEncodingLimit')?.toString() || '0', 10); - await getConfigurationApi(api) + await getSystemApi(api) .updateConfiguration({ serverConfiguration: config }); void queryClient.invalidateQueries({ diff --git a/src/apps/legacy/controllers/favorites.js b/src/apps/legacy/controllers/favorites.js index 64078377ab..0d024639d9 100644 --- a/src/apps/legacy/controllers/favorites.js +++ b/src/apps/legacy/controllers/favorites.js @@ -2,7 +2,7 @@ import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-ite import { ImageType } from '@jellyfin/sdk/lib/generated-client/models/image-type'; import { ItemFields } from '@jellyfin/sdk/lib/generated-client/models/item-fields'; import { ItemSortBy } from '@jellyfin/sdk/lib/generated-client/models/item-sort-by'; -import { getStudiosApi } from '@jellyfin/sdk/lib/utils/api/studios-api'; +import { getStudioApi } from '@jellyfin/sdk/lib/utils/api/studio-api'; import cardBuilder from 'components/cardbuilder/cardBuilder'; import { getBackdropShape, getPortraitShape, getSquareShape } from 'components/cardbuilder/utils/shape'; @@ -208,7 +208,7 @@ function getFetchDataFn(section) { return Promise.resolve(undefined); } - return getStudiosApi(api) + return getStudioApi(api) .getStudios({ userId, isFavorite: true, diff --git a/src/apps/legacy/controllers/itemDetails/index.js b/src/apps/legacy/controllers/itemDetails/index.js index 9a6607bbc0..9154a47ba4 100755 --- a/src/apps/legacy/controllers/itemDetails/index.js +++ b/src/apps/legacy/controllers/itemDetails/index.js @@ -2,7 +2,6 @@ import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-ite import { ItemFields } from '@jellyfin/sdk/lib/generated-client/models/item-fields'; import { PersonKind } from '@jellyfin/sdk/lib/generated-client/models/person-kind'; import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api'; -import { getUserLibraryApi } from '@jellyfin/sdk/lib/utils/api/user-library-api'; import { intervalToDuration } from 'date-fns'; import DOMPurify from 'dompurify'; import escapeHtml from 'escape-html'; @@ -2170,7 +2169,7 @@ export default function (view, params) { return; } - getUserLibraryApi(api).getItem({ + getLibraryApi(api).getItem({ userId: apiClient?.getCurrentUserId(), itemId: selectedId }).then(function ({ data: altItem }) { diff --git a/src/apps/legacy/controllers/lyrics.js b/src/apps/legacy/controllers/lyrics.js index c35a35ef55..c91b7d6eea 100644 --- a/src/apps/legacy/controllers/lyrics.js +++ b/src/apps/legacy/controllers/lyrics.js @@ -1,4 +1,4 @@ -import { getLyricsApi } from '@jellyfin/sdk/lib/utils/api/lyrics-api'; +import { getLyricApi } from '@jellyfin/sdk/lib/utils/api/lyric-api'; import escapeHtml from 'escape-html'; import { AutoScroll } from 'apps/legacy/features/lyrics/constants/autoScroll'; @@ -137,7 +137,7 @@ export default function (view) { return; } - return getLyricsApi(api).getLyrics({ itemId }) + return getLyricApi(api).getLyrics({ itemId }) .then(({ data }) => { if (!data.Lyrics?.length) { throw new Error('No lyrics returned'); diff --git a/src/apps/legacy/features/libraries/api/useLatestMedia.ts b/src/apps/legacy/features/libraries/api/useLatestMedia.ts index f70b7e86e7..f2eec21ca9 100644 --- a/src/apps/legacy/features/libraries/api/useLatestMedia.ts +++ b/src/apps/legacy/features/libraries/api/useLatestMedia.ts @@ -1,6 +1,6 @@ import type { Api } from '@jellyfin/sdk/lib/api'; -import type { UserLibraryApiGetLatestMediaRequest } from '@jellyfin/sdk/lib/generated-client/api/user-library-api'; -import { getUserLibraryApi } from '@jellyfin/sdk/lib/utils/api/user-library-api'; +import type { LibraryApiGetLatestMediaRequest } from '@jellyfin/sdk/lib/generated-client/api/library-api'; +import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api'; import { queryOptions, useQuery } from '@tanstack/react-query'; import type { AxiosRequestConfig } from 'axios'; @@ -8,17 +8,17 @@ import { useApi } from 'hooks/useApi'; const fetchLatestMedia = async ( api: Api, - params?: UserLibraryApiGetLatestMediaRequest, + params?: LibraryApiGetLatestMediaRequest, options?: AxiosRequestConfig ) => { - const response = await getUserLibraryApi(api) + const response = await getLibraryApi(api) .getLatestMedia(params, options); return response.data; }; export const getLatestMediaQuery = ( api?: Api, - params?: UserLibraryApiGetLatestMediaRequest + params?: LibraryApiGetLatestMediaRequest ) => queryOptions({ queryKey: [ 'User', params?.userId, 'LatestMedia', params ], queryFn: ({ signal }) => fetchLatestMedia(api!, params, { signal }), @@ -26,7 +26,7 @@ export const getLatestMediaQuery = ( }); export const useLatestMedia = ( - params?: UserLibraryApiGetLatestMediaRequest + params?: LibraryApiGetLatestMediaRequest ) => { const { api, user } = useApi(); return useQuery(getLatestMediaQuery(api, { diff --git a/src/apps/legacy/features/libraries/api/useNextUp.ts b/src/apps/legacy/features/libraries/api/useNextUp.ts index 5d0c81f66b..78c6bd1160 100644 --- a/src/apps/legacy/features/libraries/api/useNextUp.ts +++ b/src/apps/legacy/features/libraries/api/useNextUp.ts @@ -1,6 +1,6 @@ import type { Api } from '@jellyfin/sdk/lib/api'; -import type { TvShowsApiGetNextUpRequest } from '@jellyfin/sdk/lib/generated-client/api/tv-shows-api'; -import { getTvShowsApi } from '@jellyfin/sdk/lib/utils/api/tv-shows-api'; +import type { ShowApiGetNextUpRequest } from '@jellyfin/sdk/lib/generated-client/api/show-api'; +import { getShowApi } from '@jellyfin/sdk/lib/utils/api/show-api'; import { queryOptions, useQuery } from '@tanstack/react-query'; import type { AxiosRequestConfig } from 'axios'; @@ -8,17 +8,17 @@ import { useApi } from 'hooks/useApi'; const fetchNextUp = async ( api: Api, - params?: TvShowsApiGetNextUpRequest, + params?: ShowApiGetNextUpRequest, options?: AxiosRequestConfig ) => { - const response = await getTvShowsApi(api) + const response = await getShowApi(api) .getNextUp(params, options); return response.data; }; export const getNextUpQuery = ( api?: Api, - params?: TvShowsApiGetNextUpRequest + params?: ShowApiGetNextUpRequest ) => queryOptions({ queryKey: [ 'User', params?.userId, 'NextUp', params ], queryFn: ({ signal }) => fetchNextUp(api!, params, { signal }), @@ -26,7 +26,7 @@ export const getNextUpQuery = ( }); export const useNextUp = ( - params?: TvShowsApiGetNextUpRequest + params?: ShowApiGetNextUpRequest ) => { const { api, user } = useApi(); return useQuery(getNextUpQuery(api, { diff --git a/src/apps/legacy/features/libraries/api/useResumeItems.ts b/src/apps/legacy/features/libraries/api/useResumeItems.ts index 43488462dd..8470289ed6 100644 --- a/src/apps/legacy/features/libraries/api/useResumeItems.ts +++ b/src/apps/legacy/features/libraries/api/useResumeItems.ts @@ -1,6 +1,6 @@ import type { Api } from '@jellyfin/sdk/lib/api'; -import type { ItemsApiGetResumeItemsRequest } from '@jellyfin/sdk/lib/generated-client/api/items-api'; -import { getItemsApi } from '@jellyfin/sdk/lib/utils/api/items-api'; +import type { LibraryApiGetResumeItemsRequest } from '@jellyfin/sdk/lib/generated-client/api/library-api'; +import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api'; import { queryOptions, useQuery } from '@tanstack/react-query'; import type { AxiosRequestConfig } from 'axios'; @@ -8,17 +8,17 @@ import { useApi } from 'hooks/useApi'; const fetchResumeItems = async ( api: Api, - params?: ItemsApiGetResumeItemsRequest, + params?: LibraryApiGetResumeItemsRequest, options?: AxiosRequestConfig ) => { - const response = await getItemsApi(api) + const response = await getLibraryApi(api) .getResumeItems(params, options); return response.data; }; export const getResumeItemsQuery = ( api?: Api, - params?: ItemsApiGetResumeItemsRequest + params?: LibraryApiGetResumeItemsRequest ) => queryOptions({ queryKey: [ 'User', params?.userId, 'ResumeItems', params ], queryFn: ({ signal }) => fetchResumeItems(api!, params, { signal }), @@ -26,7 +26,7 @@ export const getResumeItemsQuery = ( }); export const useResumeItems = ( - params?: ItemsApiGetResumeItemsRequest + params?: LibraryApiGetResumeItemsRequest ) => { const { api, user } = useApi(); return useQuery(getResumeItemsQuery(api, { diff --git a/src/apps/legacy/features/playback/utils/mediaSegmentManager.ts b/src/apps/legacy/features/playback/utils/mediaSegmentManager.ts index cedb71e541..6fd9198f35 100644 --- a/src/apps/legacy/features/playback/utils/mediaSegmentManager.ts +++ b/src/apps/legacy/features/playback/utils/mediaSegmentManager.ts @@ -1,7 +1,7 @@ import type { Api } from '@jellyfin/sdk/lib/api'; import type { MediaSegmentDto } from '@jellyfin/sdk/lib/generated-client/models/media-segment-dto'; import { MediaSegmentType } from '@jellyfin/sdk/lib/generated-client/models/media-segment-type'; -import { getMediaSegmentsApi } from '@jellyfin/sdk/lib/utils/api/media-segments-api'; +import { getMediaSegmentApi } from '@jellyfin/sdk/lib/utils/api/media-segment-api'; import type { PlaybackManager } from 'components/playback/playbackmanager'; import { TICKS_PER_MILLISECOND, TICKS_PER_SECOND } from 'constants/time'; @@ -25,7 +25,7 @@ class MediaSegmentManager extends PlaybackSubscriber { private async fetchMediaSegments(api: Api, itemId: string, includeSegmentTypes: MediaSegmentType[]) { try { - const { data: mediaSegments } = await getMediaSegmentsApi(api) + const { data: mediaSegments } = await getMediaSegmentApi(api) .getItemSegments({ itemId, includeSegmentTypes }); this.mediaSegments = mediaSegments.Items || []; } catch (err) { diff --git a/src/apps/legacy/features/search/api/fetchItemsByType.ts b/src/apps/legacy/features/search/api/fetchItemsByType.ts index ec52347dbf..fb65606600 100644 --- a/src/apps/legacy/features/search/api/fetchItemsByType.ts +++ b/src/apps/legacy/features/search/api/fetchItemsByType.ts @@ -1,16 +1,16 @@ import { Api } from '@jellyfin/sdk/lib/api'; -import { ItemsApiGetItemsRequest } from '@jellyfin/sdk/lib/generated-client/api/items-api'; -import { getItemsApi } from '@jellyfin/sdk/lib/utils/api/items-api'; +import { LibraryApiGetItemsRequest } from '@jellyfin/sdk/lib/generated-client/api/library-api'; +import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api'; import { AxiosRequestConfig } from 'axios'; import { QUERY_OPTIONS } from '../constants/queryOptions'; export const fetchItemsByType = async ( api: Api, userId?: string, - params?: ItemsApiGetItemsRequest, + params?: LibraryApiGetItemsRequest, options?: AxiosRequestConfig ) => { - const response = await getItemsApi(api).getItems( + const response = await getLibraryApi(api).getItems( { ...QUERY_OPTIONS, userId, diff --git a/src/apps/legacy/features/search/api/useArtistsSearch.ts b/src/apps/legacy/features/search/api/useArtistsSearch.ts index 4be8c70b57..b85c844d63 100644 --- a/src/apps/legacy/features/search/api/useArtistsSearch.ts +++ b/src/apps/legacy/features/search/api/useArtistsSearch.ts @@ -1,7 +1,7 @@ import { Api } from '@jellyfin/sdk'; -import { ArtistsApiGetArtistsRequest } from '@jellyfin/sdk/lib/generated-client/api/artists-api'; +import { ArtistApiGetArtistsRequest } from '@jellyfin/sdk/lib/generated-client/api/artist-api'; import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type'; -import { getArtistsApi } from '@jellyfin/sdk/lib/utils/api/artists-api'; +import { getArtistApi } from '@jellyfin/sdk/lib/utils/api/artist-api'; import { useQuery } from '@tanstack/react-query'; import { AxiosRequestConfig } from 'axios'; import { useApi } from 'hooks/useApi'; @@ -11,10 +11,10 @@ import { isMusic } from '../utils/search'; const fetchArtists = async ( api: Api, userId: string, - params?: ArtistsApiGetArtistsRequest, + params?: ArtistApiGetArtistsRequest, options?: AxiosRequestConfig ) => { - const response = await getArtistsApi(api).getArtists( + const response = await getArtistApi(api).getArtists( { ...QUERY_OPTIONS, userId, diff --git a/src/apps/legacy/features/search/api/usePeopleSearch.ts b/src/apps/legacy/features/search/api/usePeopleSearch.ts index 9fcad79f4e..cc78ca1681 100644 --- a/src/apps/legacy/features/search/api/usePeopleSearch.ts +++ b/src/apps/legacy/features/search/api/usePeopleSearch.ts @@ -5,17 +5,17 @@ import { AxiosRequestConfig } from 'axios'; import { useApi } from 'hooks/useApi'; import { QUERY_OPTIONS } from '../constants/queryOptions'; import { isMovies, isTVShows } from '../utils/search'; -import { PersonsApiGetPersonsRequest } from '@jellyfin/sdk/lib/generated-client/api/persons-api'; -import { getPersonsApi } from '@jellyfin/sdk/lib/utils/api/persons-api'; +import { PersonApiGetPersonsRequest } from '@jellyfin/sdk/lib/generated-client/api/person-api'; +import { getPersonApi } from '@jellyfin/sdk/lib/utils/api/person-api'; import { PersonKind } from '@jellyfin/sdk/lib/generated-client/models/person-kind'; const fetchPeople = async ( api: Api, userId: string, - params?: PersonsApiGetPersonsRequest, + params?: PersonApiGetPersonsRequest, options?: AxiosRequestConfig ) => { - const response = await getPersonsApi(api).getPersons( + const response = await getPersonApi(api).getPersons( { ...QUERY_OPTIONS, userId, diff --git a/src/apps/legacy/features/search/api/useProgramsSearch.ts b/src/apps/legacy/features/search/api/useProgramsSearch.ts index 23d91381b5..b76a238ea4 100644 --- a/src/apps/legacy/features/search/api/useProgramsSearch.ts +++ b/src/apps/legacy/features/search/api/useProgramsSearch.ts @@ -4,13 +4,13 @@ import { useQuery } from '@tanstack/react-query'; import { AxiosRequestConfig } from 'axios'; import { useApi } from 'hooks/useApi'; import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; -import { ItemsApiGetItemsRequest } from '@jellyfin/sdk/lib/generated-client/api/items-api'; +import { LibraryApiGetItemsRequest } from '@jellyfin/sdk/lib/generated-client/api/library-api'; import { fetchItemsByType } from './fetchItemsByType'; const fetchPrograms = async ( api: Api, userId: string, - params?: ItemsApiGetItemsRequest, + params?: LibraryApiGetItemsRequest, options?: AxiosRequestConfig ) => { const response = await fetchItemsByType( diff --git a/src/apps/legacy/features/search/api/useSearchSuggestions.ts b/src/apps/legacy/features/search/api/useSearchSuggestions.ts index 5e1a0a70ad..5efcaec6f2 100644 --- a/src/apps/legacy/features/search/api/useSearchSuggestions.ts +++ b/src/apps/legacy/features/search/api/useSearchSuggestions.ts @@ -2,7 +2,7 @@ import type { AxiosRequestConfig } from 'axios'; import type { Api } from '@jellyfin/sdk'; import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; import { ItemSortBy } from '@jellyfin/sdk/lib/generated-client/models/item-sort-by'; -import { getItemsApi } from '@jellyfin/sdk/lib/utils/api/items-api'; +import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api'; import { useQuery } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; @@ -13,7 +13,7 @@ const fetchGetItems = async ( parentId?: string, options?: AxiosRequestConfig ) => { - const response = await getItemsApi(api).getItems( + const response = await getLibraryApi(api).getItems( { userId, sortBy: [ItemSortBy.IsFavoriteOrLiked, ItemSortBy.Random], diff --git a/src/apps/legacy/features/search/api/useStudiosSearch.ts b/src/apps/legacy/features/search/api/useStudiosSearch.ts index 42dd63bb0d..5f1c99c110 100644 --- a/src/apps/legacy/features/search/api/useStudiosSearch.ts +++ b/src/apps/legacy/features/search/api/useStudiosSearch.ts @@ -1,7 +1,7 @@ import { Api } from '@jellyfin/sdk'; import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type'; -import { StudiosApiGetStudiosRequest } from '@jellyfin/sdk/lib/generated-client/api/studios-api'; -import { getStudiosApi } from '@jellyfin/sdk/lib/utils/api/studios-api'; +import { StudioApiGetStudiosRequest } from '@jellyfin/sdk/lib/generated-client/api/studio-api'; +import { getStudioApi } from '@jellyfin/sdk/lib/utils/api/studio-api'; import { useQuery } from '@tanstack/react-query'; import { AxiosRequestConfig } from 'axios'; import { useApi } from 'hooks/useApi'; @@ -11,10 +11,10 @@ import { isMovies, isTVShows } from '../utils/search'; const fetchStudios = async ( api: Api, userId: string, - params?: StudiosApiGetStudiosRequest, + params?: StudioApiGetStudiosRequest, options?: AxiosRequestConfig ) => { - const response = await getStudiosApi(api).getStudios( + const response = await getStudioApi(api).getStudios( { ...QUERY_OPTIONS, userId, diff --git a/src/apps/legacy/features/search/api/useVideoSearch.ts b/src/apps/legacy/features/search/api/useVideoSearch.ts index 06eaaf25e7..392463040f 100644 --- a/src/apps/legacy/features/search/api/useVideoSearch.ts +++ b/src/apps/legacy/features/search/api/useVideoSearch.ts @@ -4,18 +4,18 @@ import { useQuery } from '@tanstack/react-query'; import { AxiosRequestConfig } from 'axios'; import { useApi } from 'hooks/useApi'; import { QUERY_OPTIONS } from '../constants/queryOptions'; -import { getItemsApi } from '@jellyfin/sdk/lib/utils/api/items-api'; +import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api'; import { MediaType } from '@jellyfin/sdk/lib/generated-client/models/media-type'; import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; -import { ItemsApiGetItemsRequest } from '@jellyfin/sdk/lib/generated-client/api/items-api'; +import { LibraryApiGetItemsRequest } from '@jellyfin/sdk/lib/generated-client/api/library-api'; const fetchVideos = async ( api: Api, userId: string, - params?: ItemsApiGetItemsRequest, + params?: LibraryApiGetItemsRequest, options?: AxiosRequestConfig ) => { - const response = await getItemsApi(api).getItems( + const response = await getLibraryApi(api).getItems( { ...QUERY_OPTIONS, userId, diff --git a/src/apps/legacy/routes/quickConnect/index.tsx b/src/apps/legacy/routes/quickConnect/index.tsx index 217b900ae2..e042cf86ce 100644 --- a/src/apps/legacy/routes/quickConnect/index.tsx +++ b/src/apps/legacy/routes/quickConnect/index.tsx @@ -1,4 +1,4 @@ -import { getQuickConnectApi } from '@jellyfin/sdk/lib/utils/api/quick-connect-api'; +import { getAuthenticationApi } from '@jellyfin/sdk/lib/utils/api/authentication-api'; import React, { FC, FormEvent, useCallback, useState } from 'react'; import { Link, useSearchParams } from 'react-router-dom'; @@ -41,7 +41,7 @@ const QuickConnectPage: FC = () => { const normalizedCode = code.replace(/\s/g, ''); console.log('[QuickConnect] authorizing code %s as user %s', normalizedCode, userId); - getQuickConnectApi(api) + getAuthenticationApi(api) .authorizeQuickConnect({ code: normalizedCode, userId diff --git a/src/apps/modern/features/details/hooks/api/useGetItemByType.ts b/src/apps/modern/features/details/hooks/api/useGetItemByType.ts index c2966e97d4..5f09fa19b2 100644 --- a/src/apps/modern/features/details/hooks/api/useGetItemByType.ts +++ b/src/apps/modern/features/details/hooks/api/useGetItemByType.ts @@ -1,5 +1,5 @@ import type { AxiosRequestConfig } from 'axios'; -import { getUserLibraryApi } from '@jellyfin/sdk/lib/utils/api/user-library-api'; +import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api'; import { getLiveTvApi } from '@jellyfin/sdk/lib/utils/api/live-tv-api'; import { useQuery } from '@tanstack/react-query'; import { type JellyfinApiContext, useApi } from 'hooks/useApi'; @@ -33,7 +33,7 @@ const getItemByType = async ( ); break; default: { - response = await getUserLibraryApi(api).getItem( + response = await getLibraryApi(api).getItem( { userId: user.Id, itemId }, options ); diff --git a/src/components/itemHelper.js b/src/components/itemHelper.js index 0650481abb..e83d6f00ef 100644 --- a/src/components/itemHelper.js +++ b/src/components/itemHelper.js @@ -3,7 +3,7 @@ import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-ite import { LocationType } from '@jellyfin/sdk/lib/generated-client/models/location-type'; import { RecordingStatus } from '@jellyfin/sdk/lib/generated-client/models/recording-status'; import { MediaType } from '@jellyfin/sdk/lib/generated-client/models/media-type'; -import { getPlaylistsApi } from '@jellyfin/sdk/lib/utils/api/playlists-api'; +import { getPlaylistApi } from '@jellyfin/sdk/lib/utils/api/playlist-api'; import { appHost } from './apphost'; import { AppFeature } from 'constants/appFeature'; @@ -167,7 +167,7 @@ export async function canEditPlaylist(user, item) { const api = ServerConnections.getApi(item.ServerId); try { - const { data: permissions } = await getPlaylistsApi(api) + const { data: permissions } = await getPlaylistApi(api) .getPlaylistUser({ userId: user.Id, playlistId: item.Id diff --git a/src/components/lyricseditor/lyricseditor.js b/src/components/lyricseditor/lyricseditor.js index 8c57c9a2fd..29f0af260c 100644 --- a/src/components/lyricseditor/lyricseditor.js +++ b/src/components/lyricseditor/lyricseditor.js @@ -1,6 +1,6 @@ import escapeHtml from 'escape-html'; -import { getLyricsApi } from '@jellyfin/sdk/lib/utils/api/lyrics-api'; +import { getLyricApi } from '@jellyfin/sdk/lib/utils/api/lyric-api'; import dialogHelper from '../dialogHelper/dialogHelper'; import layoutManager from '../layoutManager'; import globalize from 'lib/globalize'; @@ -26,7 +26,7 @@ let hasChanges; function downloadRemoteLyrics(context, id) { const api = ServerConnections.getApi(currentItem.ServerId); - getLyricsApi(api).downloadRemoteLyrics({ + getLyricApi(api).downloadRemoteLyrics({ itemId: currentItem.Id, lyricId: id }).then(function () { @@ -127,7 +127,7 @@ function searchForLyrics(context) { loading.show(); const api = ServerConnections.getApi(currentItem.ServerId); - getLyricsApi(api).searchRemoteLyrics({ + getLyricApi(api).searchRemoteLyrics({ itemId: currentItem.Id }).then(function (results) { renderSearchResults(context, results.data); @@ -294,7 +294,7 @@ function onDeleteLyrics(e) { function fillCurrentLyrics(context, apiClient, item) { const api = ServerConnections.getApi(apiClient.serverId()); - getLyricsApi(api).getLyrics({ + getLyricApi(api).getLyrics({ itemId: item.Id }).then((response) => { if (!response.data.Lyrics) { diff --git a/src/components/lyricsuploader/lyricsuploader.js b/src/components/lyricsuploader/lyricsuploader.js index e2e526264a..9688053bd5 100644 --- a/src/components/lyricsuploader/lyricsuploader.js +++ b/src/components/lyricsuploader/lyricsuploader.js @@ -1,5 +1,5 @@ import escapeHtml from 'escape-html'; -import { getLyricsApi } from '@jellyfin/sdk/lib/utils/api/lyrics-api'; +import { getLyricApi } from '@jellyfin/sdk/lib/utils/api/lyric-api'; import dialogHelper from '../../components/dialogHelper/dialogHelper'; import dom from '../../utils/dom'; @@ -92,7 +92,7 @@ async function onSubmit(e) { const api = ServerConnections.getApi(currentServerId); const data = await readFileAsText(file); - getLyricsApi(api).uploadLyrics({ + getLyricApi(api).uploadLyrics({ itemId: currentItemId, fileName: file.name, body: data diff --git a/src/components/playlisteditor/playlisteditor.ts b/src/components/playlisteditor/playlisteditor.ts index c96d8f64af..5ad8ec65fb 100644 --- a/src/components/playlisteditor/playlisteditor.ts +++ b/src/components/playlisteditor/playlisteditor.ts @@ -1,8 +1,7 @@ import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; import { ItemSortBy } from '@jellyfin/sdk/lib/generated-client/models/item-sort-by'; -import { getItemsApi } from '@jellyfin/sdk/lib/utils/api/items-api'; -import { getPlaylistsApi } from '@jellyfin/sdk/lib/utils/api/playlists-api'; -import { getUserLibraryApi } from '@jellyfin/sdk/lib/utils/api/user-library-api'; +import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api'; +import { getPlaylistApi } from '@jellyfin/sdk/lib/utils/api/playlist-api'; import escapeHtml from 'escape-html'; import toast from 'components/toast/toast'; @@ -95,7 +94,7 @@ function createPlaylist(dlg: DialogElement) { if (!api) return Promise.reject(new Error('No Api instance available')); - return getPlaylistsApi(api) + return getPlaylistApi(api) .createPlaylist({ createPlaylistDto: { Name: name ?? '', @@ -133,7 +132,7 @@ function updatePlaylist(dlg: DialogElement) { const api = ServerConnections.getApi(currentServerId); if (!api) return Promise.reject(new Error('No Api instance available')); - return getPlaylistsApi(api) + return getPlaylistApi(api) .updatePlaylist({ playlistId: dlg.playlistId, updatePlaylistDto: { @@ -166,7 +165,7 @@ function addToPlaylist(dlg: DialogElement, id: string) { if (!api) return Promise.reject(new Error('No Api instance available')); - return getPlaylistsApi(api) + return getPlaylistApi(api) .addItemToPlaylist({ playlistId: id, ids: itemIds.split(','), @@ -199,7 +198,7 @@ function populatePlaylists(editorOptions: PlaylistEditorOptions, panel: DialogEl if (!api) return Promise.reject(new Error('No Api instance available')); - return getItemsApi(api) + return getLibraryApi(api) .getItems({ userId: apiClient?.getCurrentUserId(), includeItemTypes: [ BaseItemKind.Playlist ], @@ -217,7 +216,7 @@ function populatePlaylists(editorOptions: PlaylistEditorOptions, panel: DialogEl if (!item.Id || !userId) return playlist; - return getPlaylistsApi(api) + return getPlaylistApi(api) .getPlaylistUser({ playlistId: item.Id, userId @@ -352,9 +351,9 @@ function initEditor(content: DialogElement, options: PlaylistEditorOptions, item } Promise.all([ - getUserLibraryApi(api) + getLibraryApi(api) .getItem({ itemId: options.id }), - getPlaylistsApi(api) + getPlaylistApi(api) .getPlaylist({ playlistId: options.id }) ]) .then(([ { data: playlistItem }, { data: playlist } ]) => { diff --git a/src/components/shortcuts.js b/src/components/shortcuts.js index 376b1703d0..4c50d37fa2 100644 --- a/src/components/shortcuts.js +++ b/src/components/shortcuts.js @@ -1,7 +1,7 @@ /** * "Shortcut" action handlers for BaseItems. */ -import { getPlaylistsApi } from '@jellyfin/sdk/lib/utils/api/playlists-api'; +import { getPlaylistApi } from '@jellyfin/sdk/lib/utils/api/playlist-api'; import { EventType } from 'constants/eventType'; import { ItemAction } from 'constants/itemAction'; @@ -141,7 +141,7 @@ function showContextMenu(card, options = {}) { apiClient?.getCurrentUser(), // Fetch playlist perms if item is a child of a playlist api && playlistId ? - getPlaylistsApi(api) + getPlaylistApi(api) .getPlaylistUser({ playlistId, userId: apiClient?.getCurrentUserId() diff --git a/src/hooks/api/useDisplayPreferences.ts b/src/hooks/api/useDisplayPreferences.ts index 617a4a6ae6..65209f4067 100644 --- a/src/hooks/api/useDisplayPreferences.ts +++ b/src/hooks/api/useDisplayPreferences.ts @@ -1,6 +1,6 @@ import type { Api } from '@jellyfin/sdk/lib/api'; -import { DisplayPreferencesApiGetDisplayPreferencesRequest } from '@jellyfin/sdk/lib/generated-client/api/display-preferences-api'; -import { getDisplayPreferencesApi } from '@jellyfin/sdk/lib/utils/api/display-preferences-api'; +import { DisplayPreferenceApiGetDisplayPreferencesRequest } from '@jellyfin/sdk/lib/generated-client/api/display-preference-api'; +import { getDisplayPreferenceApi } from '@jellyfin/sdk/lib/utils/api/display-preference-api'; import { queryOptions, useQuery } from '@tanstack/react-query'; import type { AxiosRequestConfig } from 'axios'; @@ -8,17 +8,17 @@ import { useApi } from 'hooks/useApi'; const fetchDisplayPreferences = async ( api: Api, - params: DisplayPreferencesApiGetDisplayPreferencesRequest, + params: DisplayPreferenceApiGetDisplayPreferencesRequest, options?: AxiosRequestConfig ) => { - const response = await getDisplayPreferencesApi(api) + const response = await getDisplayPreferenceApi(api) .getDisplayPreferences(params, options); return response.data; }; export const getDisplayPreferencesQuery = ( api?: Api, - params?: DisplayPreferencesApiGetDisplayPreferencesRequest + params?: DisplayPreferenceApiGetDisplayPreferencesRequest ) => queryOptions({ queryKey: [ 'User', params?.userId, 'DisplayPreferences', params?.displayPreferencesId, params?.client ], queryFn: ({ signal }) => fetchDisplayPreferences(api!, params!, { signal }), @@ -26,7 +26,7 @@ export const getDisplayPreferencesQuery = ( }); export const useDisplayPreferences = ( - params: DisplayPreferencesApiGetDisplayPreferencesRequest + params: DisplayPreferenceApiGetDisplayPreferencesRequest ) => { const { api, user } = useApi(); return useQuery(getDisplayPreferencesQuery(api, { diff --git a/src/hooks/api/useUserViews.ts b/src/hooks/api/useUserViews.ts index 2684da471b..baff3dbdf4 100644 --- a/src/hooks/api/useUserViews.ts +++ b/src/hooks/api/useUserViews.ts @@ -1,6 +1,6 @@ import type { Api } from '@jellyfin/sdk/lib/api'; -import type { UserViewsApiGetUserViewsRequest } from '@jellyfin/sdk/lib/generated-client/api/user-views-api'; -import { getUserViewsApi } from '@jellyfin/sdk/lib/utils/api/user-views-api'; +import type { UserViewApiGetUserViewsRequest } from '@jellyfin/sdk/lib/generated-client/api/user-view-api'; +import { getUserViewApi } from '@jellyfin/sdk/lib/utils/api/user-view-api'; import { queryOptions, useQuery } from '@tanstack/react-query'; import type { AxiosRequestConfig } from 'axios'; @@ -8,17 +8,17 @@ import { useApi } from '../useApi'; const fetchUserViews = async ( api: Api, - params?: UserViewsApiGetUserViewsRequest, + params?: UserViewApiGetUserViewsRequest, options?: AxiosRequestConfig ) => { - const response = await getUserViewsApi(api) + const response = await getUserViewApi(api) .getUserViews(params, options); return response.data; }; export const getUserViewsQuery = ( api?: Api, - params?: UserViewsApiGetUserViewsRequest + params?: UserViewApiGetUserViewsRequest ) => queryOptions({ queryKey: [ 'User', params?.userId, 'Views', params ], queryFn: ({ signal }) => fetchUserViews(api!, params, { signal }), @@ -26,7 +26,7 @@ export const getUserViewsQuery = ( }); export const useUserViews = ( - params?: UserViewsApiGetUserViewsRequest + params?: UserViewApiGetUserViewsRequest ) => { const { api, user } = useApi(); return useQuery(getUserViewsQuery(api, { diff --git a/src/hooks/api/videosHooks/useDeleteAlternateSources.ts b/src/hooks/api/videosHooks/useDeleteAlternateSources.ts index b1ee47ff6d..dc4dde6056 100644 --- a/src/hooks/api/videosHooks/useDeleteAlternateSources.ts +++ b/src/hooks/api/videosHooks/useDeleteAlternateSources.ts @@ -1,24 +1,24 @@ -import type { VideosApiDeleteAlternateSourcesRequest } from '@jellyfin/sdk/lib/generated-client/api/videos-api'; -import { getVideosApi } from '@jellyfin/sdk/lib/utils/api/videos-api'; +import type { VideoApiDeleteAlternateSourcesRequest } from '@jellyfin/sdk/lib/generated-client/api/video-api'; +import { getVideoApi } from '@jellyfin/sdk/lib/utils/api/video-api'; import { useMutation } from '@tanstack/react-query'; import { type JellyfinApiContext, useApi } from 'hooks/useApi'; const deleteAlternateSources = async ( apiContext: JellyfinApiContext, - params: VideosApiDeleteAlternateSourcesRequest + params: VideoApiDeleteAlternateSourcesRequest ) => { const { api } = apiContext; if (!api) throw new Error('[deleteAlternateSources] No API instance available'); - const response = await getVideosApi(api).deleteAlternateSources(params); + const response = await getVideoApi(api).deleteAlternateSources(params); return response.data; }; export const useDeleteAlternateSources = () => { const apiContext = useApi(); return useMutation({ - mutationFn: (params: VideosApiDeleteAlternateSourcesRequest) => + mutationFn: (params: VideoApiDeleteAlternateSourcesRequest) => deleteAlternateSources(apiContext, params) }); }; diff --git a/src/hooks/useConfiguration.ts b/src/hooks/useConfiguration.ts index 81ddb79f03..5d373c1739 100644 --- a/src/hooks/useConfiguration.ts +++ b/src/hooks/useConfiguration.ts @@ -1,5 +1,5 @@ import { Api } from '@jellyfin/sdk'; -import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; import { useQuery } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; import type { AxiosRequestConfig } from 'axios'; @@ -7,7 +7,7 @@ import type { AxiosRequestConfig } from 'axios'; export const QUERY_KEY = 'Configuration'; export const fetchConfiguration = async (api: Api, options?: AxiosRequestConfig) => { - const response = await getConfigurationApi(api).getConfiguration(options); + const response = await getSystemApi(api).getConfiguration(options); return response.data; }; diff --git a/src/hooks/useFetchItems.ts b/src/hooks/useFetchItems.ts index 38dd298cb3..a55381f57a 100644 --- a/src/hooks/useFetchItems.ts +++ b/src/hooks/useFetchItems.ts @@ -1,6 +1,6 @@ import type { AxiosRequestConfig } from 'axios'; -import type { ItemsApiGetItemsRequest } from '@jellyfin/sdk/lib/generated-client/api/items-api'; -import type { PlaylistsApiMoveItemRequest } from '@jellyfin/sdk/lib/generated-client/api/playlists-api'; +import type { LibraryApiGetItemsRequest } from '@jellyfin/sdk/lib/generated-client/api/library-api'; +import type { PlaylistApiMoveItemRequest } from '@jellyfin/sdk/lib/generated-client/api/playlist-api'; import type { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; import { ImageType } from '@jellyfin/sdk/lib/generated-client/models/image-type'; import { ItemFields } from '@jellyfin/sdk/lib/generated-client/models/item-fields'; @@ -8,18 +8,17 @@ import { ItemFilter } from '@jellyfin/sdk/lib/generated-client/models/item-filte import { PersonKind } from '@jellyfin/sdk/lib/generated-client/models/person-kind'; import { ItemSortBy } from '@jellyfin/sdk/lib/generated-client/models/item-sort-by'; import { SortOrder } from '@jellyfin/sdk/lib/generated-client/models/sort-order'; -import { getArtistsApi } from '@jellyfin/sdk/lib/utils/api/artists-api'; +import { getArtistApi } from '@jellyfin/sdk/lib/utils/api/artist-api'; import { getFilterApi } from '@jellyfin/sdk/lib/utils/api/filter-api'; -import { getGenresApi } from '@jellyfin/sdk/lib/utils/api/genres-api'; -import { getItemsApi } from '@jellyfin/sdk/lib/utils/api/items-api'; -import { getMoviesApi } from '@jellyfin/sdk/lib/utils/api/movies-api'; -import { getPersonsApi } from '@jellyfin/sdk/lib/utils/api/persons-api'; -import { getStudiosApi } from '@jellyfin/sdk/lib/utils/api/studios-api'; -import { getTvShowsApi } from '@jellyfin/sdk/lib/utils/api/tv-shows-api'; -import { getUserLibraryApi } from '@jellyfin/sdk/lib/utils/api/user-library-api'; -import { getPlaylistsApi } from '@jellyfin/sdk/lib/utils/api/playlists-api'; +import { getGenreApi } from '@jellyfin/sdk/lib/utils/api/genre-api'; +import { getMovieApi } from '@jellyfin/sdk/lib/utils/api/movie-api'; +import { getPersonApi } from '@jellyfin/sdk/lib/utils/api/person-api'; +import { getStudioApi } from '@jellyfin/sdk/lib/utils/api/studio-api'; +import { getShowApi } from '@jellyfin/sdk/lib/utils/api/show-api'; +import { getPlaylistApi } from '@jellyfin/sdk/lib/utils/api/playlist-api'; +import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api'; import { getLiveTvApi } from '@jellyfin/sdk/lib/utils/api/live-tv-api'; -import { getPlaystateApi } from '@jellyfin/sdk/lib/utils/api/playstate-api'; +import { getUserDataApi } from '@jellyfin/sdk/lib/utils/api/user-data-api'; import { useMutation, useQuery } from '@tanstack/react-query'; import datetime from 'scripts/datetime'; import globalize from 'lib/globalize'; @@ -37,12 +36,12 @@ import type { ItemDto } from 'types/base/models/item-dto'; const fetchGetItems = async ( currentApi: JellyfinApiContext, - parametersOptions: ItemsApiGetItemsRequest, + parametersOptions: LibraryApiGetItemsRequest, options?: AxiosRequestConfig ) => { const { api, user } = currentApi; if (api && user?.Id) { - const response = await getItemsApi(api).getItems( + const response = await getLibraryApi(api).getItems( { userId: user.Id, ...parametersOptions @@ -55,7 +54,7 @@ const fetchGetItems = async ( } }; -export const useGetItems = (parametersOptions: ItemsApiGetItemsRequest) => { +export const useGetItems = (parametersOptions: LibraryApiGetItemsRequest) => { const currentApi = useApi(); const isRandom = Boolean(parametersOptions.sortBy?.includes(ItemSortBy.Random)); @@ -82,7 +81,7 @@ const fetchGetMovieRecommendations = async ( ) => { const { api, user } = currentApi; if (api && user?.Id) { - const response = await getMoviesApi(api).getMovieRecommendations( + const response = await getMovieApi(api).getMovieRecommendations( { userId: user.Id, fields: [ @@ -118,7 +117,7 @@ const fetchGetGenres = async ( ) => { const { api, user } = currentApi; if (api && user?.Id) { - const response = await getGenresApi(api).getGenres( + const response = await getGenreApi(api).getGenres( { userId: user.Id, sortBy: [ItemSortBy.SortName], @@ -153,7 +152,7 @@ const fetchGetStudios = async ( ) => { const { api, user } = currentApi; if (api && user?.Id) { - const response = await getStudiosApi(api).getStudios( + const response = await getStudioApi(api).getStudios( { userId: user.Id, includeItemTypes: itemType, @@ -236,7 +235,7 @@ const fetchGetItemsViewByType = async ( let response; switch (viewType) { case LibraryTab.AlbumArtists: { - response = await getArtistsApi(api).getAlbumArtists( + response = await getArtistApi(api).getAlbumArtists( { userId: user.Id, parentId: parentId ?? undefined, @@ -257,7 +256,7 @@ const fetchGetItemsViewByType = async ( break; } case LibraryTab.Artists: { - response = await getArtistsApi(api).getArtists( + response = await getArtistApi(api).getArtists( { userId: user.Id, parentId: parentId ?? undefined, @@ -278,7 +277,7 @@ const fetchGetItemsViewByType = async ( break; } case LibraryTab.Authors: { - response = await getPersonsApi(api).getPersons( + response = await getPersonApi(api).getPersons( { userId: user.Id, parentId: parentId ?? undefined, @@ -297,7 +296,7 @@ const fetchGetItemsViewByType = async ( break; } case LibraryTab.Studios: - response = await getStudiosApi(api).getStudios( + response = await getStudioApi(api).getStudios( { userId: user.Id, parentId: parentId ?? undefined, @@ -330,7 +329,7 @@ const fetchGetItemsViewByType = async ( break; } case LibraryTab.Folders: { - response = await getItemsApi(api).getItems( + response = await getLibraryApi(api).getItems( { userId: user.Id, recursive: false, @@ -366,7 +365,7 @@ const fetchGetItemsViewByType = async ( ); break; default: { - response = await getItemsApi(api).getItems( + response = await getLibraryApi(api).getItems( { userId: user.Id, recursive: true, @@ -454,11 +453,11 @@ export const useGetItemsViewByType = ( const fetchPlaylistsMoveItem = async ( currentApi: JellyfinApiContext, - requestParameters: PlaylistsApiMoveItemRequest + requestParameters: PlaylistApiMoveItemRequest ) => { const { api, user } = currentApi; if (api && user?.Id) { - const response = await getPlaylistsApi(api).moveItem({ + const response = await getPlaylistApi(api).moveItem({ ...requestParameters }); return response.data; @@ -468,7 +467,7 @@ const fetchPlaylistsMoveItem = async ( export const usePlaylistsMoveItemMutation = () => { const currentApi = useApi(); return useMutation({ - mutationFn: (requestParameters: PlaylistsApiMoveItemRequest) => + mutationFn: (requestParameters: PlaylistApiMoveItemRequest) => fetchPlaylistsMoveItem(currentApi, requestParameters ) }); }; @@ -528,7 +527,7 @@ const fetchGetGroupsUpcomingEpisodes = async ( ) => { const { api, user } = currentApi; if (api && user?.Id) { - const response = await getTvShowsApi(api).getUpcomingEpisodes( + const response = await getShowApi(api).getUpcomingEpisodes( { userId: user.Id, limit: 25, @@ -574,13 +573,13 @@ const fetchUpdateFavoriteStatus = async ( const { api, user } = currentApi; if (api && user?.Id) { if (isFavorite) { - const response = await getUserLibraryApi(api).unmarkFavoriteItem({ + const response = await getUserDataApi(api).unmarkFavoriteItem({ userId: user.Id, itemId: itemId }); return response.data.IsFavorite; } else { - const response = await getUserLibraryApi(api).markFavoriteItem({ + const response = await getUserDataApi(api).markFavoriteItem({ userId: user.Id, itemId: itemId }); @@ -610,13 +609,13 @@ const fetchUpdatePlayedState = async ( const { api, user } = currentApi; if (api && user?.Id) { if (isPlayed) { - const response = await getPlaystateApi(api).markUnplayedItem({ + const response = await getUserDataApi(api).markUnplayedItem({ userId: user.Id, itemId: itemId }); return response.data.Played; } else { - const response = await getPlaystateApi(api).markPlayedItem({ + const response = await getUserDataApi(api).markPlayedItem({ userId: user.Id, itemId: itemId }); @@ -809,7 +808,7 @@ const fetchGetSectionItems = async ( } case SectionApiMethod.NextUp: { response = ( - await getTvShowsApi(api).getNextUp( + await getShowApi(api).getNextUp( { userId: user.Id, limit: 25, @@ -836,7 +835,7 @@ const fetchGetSectionItems = async ( } case SectionApiMethod.ResumeItems: { response = ( - await getItemsApi(api).getResumeItems( + await getLibraryApi(api).getResumeItems( { userId: user.Id, parentId: parentId ?? undefined, @@ -862,7 +861,7 @@ const fetchGetSectionItems = async ( } case SectionApiMethod.LatestMedia: { response = ( - await getUserLibraryApi(api).getLatestMedia( + await getLibraryApi(api).getLatestMedia( { userId: user.Id, fields: [ @@ -883,7 +882,7 @@ const fetchGetSectionItems = async ( } default: { response = ( - await getItemsApi(api).getItems( + await getLibraryApi(api).getItems( { userId: user.Id, parentId: parentId ?? undefined, diff --git a/src/hooks/useItem.ts b/src/hooks/useItem.ts index 9312568a41..ff550cea5c 100644 --- a/src/hooks/useItem.ts +++ b/src/hooks/useItem.ts @@ -1,5 +1,5 @@ import type { Api } from '@jellyfin/sdk/lib/api'; -import { getUserLibraryApi } from '@jellyfin/sdk/lib/utils/api/user-library-api'; +import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api'; import { queryOptions, useQuery } from '@tanstack/react-query'; import type { AxiosRequestConfig } from 'axios'; @@ -12,7 +12,7 @@ const fetchItem = async ( userId: string, options?: AxiosRequestConfig ) => { - const response = await getUserLibraryApi(api) + const response = await getLibraryApi(api) .getItem({ userId, itemId }, options); return response.data as ItemDto; }; diff --git a/src/hooks/useNamedConfiguration.ts b/src/hooks/useNamedConfiguration.ts index c789a50910..2107dd43d6 100644 --- a/src/hooks/useNamedConfiguration.ts +++ b/src/hooks/useNamedConfiguration.ts @@ -1,5 +1,5 @@ import { Api } from '@jellyfin/sdk'; -import { getConfigurationApi } from '@jellyfin/sdk/lib/utils/api/configuration-api'; +import { getSystemApi } from '@jellyfin/sdk/lib/utils/api/system-api'; import { useQuery } from '@tanstack/react-query'; import { useApi } from 'hooks/useApi'; import type { AxiosRequestConfig } from 'axios'; @@ -11,7 +11,7 @@ export interface NamedConfiguration { } const fetchNamedConfiguration = async (api: Api, key: string, options?: AxiosRequestConfig) => { - const response = await getConfigurationApi(api).getNamedConfiguration({ key }, options); + const response = await getSystemApi(api).getNamedConfiguration({ key }, options); return response.data; }; diff --git a/src/hooks/useQuickConnect.ts b/src/hooks/useQuickConnect.ts index 2ac8fa74a9..2c3b687539 100644 --- a/src/hooks/useQuickConnect.ts +++ b/src/hooks/useQuickConnect.ts @@ -1,4 +1,4 @@ -import { getQuickConnectApi } from '@jellyfin/sdk/lib/utils/api/quick-connect-api'; +import { getAuthenticationApi } from '@jellyfin/sdk/lib/utils/api/authentication-api'; import { useQuery } from '@tanstack/react-query'; import type { AxiosRequestConfig } from 'axios'; @@ -11,7 +11,7 @@ const fetchQuickConnectEnabled = async ( const { api } = apiContext; if (!api) throw new Error('No API instance available'); - const response = await getQuickConnectApi(api) + const response = await getAuthenticationApi(api) .getQuickConnectEnabled(options); return response.data; }; diff --git a/src/scripts/playlistViewer.js b/src/scripts/playlistViewer.js index d6eccdceec..079af07bda 100644 --- a/src/scripts/playlistViewer.js +++ b/src/scripts/playlistViewer.js @@ -1,4 +1,4 @@ -import { getPlaylistsApi } from '@jellyfin/sdk/lib/utils/api/playlists-api'; +import { getPlaylistApi } from '@jellyfin/sdk/lib/utils/api/playlist-api'; import listView from 'components/listview/listview'; import { ServerConnections } from 'lib/jellyfin-apiclient'; @@ -39,7 +39,7 @@ async function init(page, item) { } let isEditable = false; - const { data } = await getPlaylistsApi(api) + const { data } = await getPlaylistApi(api) .getPlaylistUser({ playlistId: item.Id, userId: apiClient.getCurrentUserId() diff --git a/src/utils/image.ts b/src/utils/image.ts index 72b56abd73..633cba94ae 100644 --- a/src/utils/image.ts +++ b/src/utils/image.ts @@ -1,7 +1,7 @@ import { CollectionType } from '@jellyfin/sdk/lib/generated-client/models/collection-type'; import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; -import type { DeviceInfo } from '@jellyfin/sdk/lib/generated-client/models/device-info'; -import type { SessionInfo } from '@jellyfin/sdk/lib/generated-client/models/session-info'; +import type { DeviceInfoDto } from '@jellyfin/sdk/lib/generated-client/models/device-info-dto'; +import type { SessionInfoDto } from '@jellyfin/sdk/lib/generated-client/models/session-info-dto'; const BASE_DEVICE_IMAGE_URL = 'assets/img/devices/'; @@ -40,8 +40,8 @@ function getWebDeviceIcon(browser: string | null | undefined) { } } -export function getDeviceIcon(info: DeviceInfo | SessionInfo) { - switch ((info as DeviceInfo).AppName || (info as SessionInfo).Client) { +export function getDeviceIcon(info: DeviceInfoDto | SessionInfoDto) { + switch ((info as DeviceInfoDto).AppName || (info as SessionInfoDto).Client) { case 'Samsung Smart TV': return BASE_DEVICE_IMAGE_URL + 'samsungtv.svg'; case 'Xbox One': @@ -82,7 +82,7 @@ export function getDeviceIcon(info: DeviceInfo | SessionInfo) { case 'Finamp': return BASE_DEVICE_IMAGE_URL + 'finamp.svg'; case 'Jellyfin Web': - return getWebDeviceIcon((info as DeviceInfo).Name || (info as SessionInfo).DeviceName); + return getWebDeviceIcon((info as DeviceInfoDto).Name || (info as SessionInfoDto).DeviceName); default: if (info.Capabilities?.IconUrl) { try { From 3fb0ebfb8e61d1270976052a0ee3e5f776bc70a0 Mon Sep 17 00:00:00 2001 From: GolanGitHub Date: Wed, 8 Jul 2026 11:02:01 -0400 Subject: [PATCH 038/287] Translated using Weblate (Spanish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/ --- src/strings/es.json | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/strings/es.json b/src/strings/es.json index b63ef9b424..45b2e08937 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -312,7 +312,7 @@ "Images": "Imágenes", "ImportFavoriteChannelsHelp": "Sólo los canales guardados como favoritos en el sintonizador se importarán.", "InstallingPackage": "Instalando {0} (versión {1})", - "InstantMix": "Mix instantáneo", + "InstantMix": "Mezcla instantánea", "ItemCount": "Elementos {0}", "Items": "Elementos", "Kids": "Infantil", @@ -1433,7 +1433,7 @@ "ButtonClose": "Cerrar", "ButtonBackspace": "Retroceso", "AddToFavorites": "Añadir a favoritos", - "ItemDetails": "Detalles del objeto", + "ItemDetails": "Detalles del elemento", "EnableRewatchingNextUpHelp": "Mostrar episodios vistos en la sección 'Volver a ver'.", "EnableRewatchingNextUp": "Activar Volver a ver", "Digital": "Digital", @@ -1923,5 +1923,7 @@ "StillWatchingOption": "{0} episodios o {1} minutos", "StopWatching": "Dejar de mirar", "TableOfContents": "Índice", - "Creators": "Creadores" + "Creators": "Creadores", + "NoCastTargets": "No hay dispositivos de transmisión disponibles.", + "IndexNumber": "Número de índice" } From 5860b44129dddf0e053b50a8c922d788114bbbe9 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 8 Jul 2026 17:24:05 -0400 Subject: [PATCH 039/287] Refactor purple haze to use base theme --- src/themes/_base/_theme.scss | 120 +++++- src/themes/appletv/theme.scss | 14 +- src/themes/purplehaze/index.ts | 29 +- src/themes/purplehaze/theme.scss | 624 ++++++------------------------- 4 files changed, 250 insertions(+), 537 deletions(-) diff --git a/src/themes/_base/_theme.scss b/src/themes/_base/_theme.scss index e2ecac7735..c9f19b850c 100644 --- a/src/themes/_base/_theme.scss +++ b/src/themes/_base/_theme.scss @@ -2,6 +2,8 @@ // Theme options $dark: true !default; +// Enable rounded person cards (e.g. for actors/directors) +$rounded-person-cards: false !default; // Color palette $common-white: palette.$common-white !default; @@ -39,11 +41,23 @@ $button-inheritContainedBg: #424242 !default; $button-inheritContainedHoverBg: #616161 !default; $snackbarContent-bg: #303030 !default; $snackbarContent-color: rgba(255, 255, 255, 0.87) !default; +// Secondary/accent color used for focus and interactive states. +// Defaults to $primary-main so all existing themes are unaffected. +$secondary-main: $primary-main !default; +$secondary-contrastText: $primary-contrastText !default; +// Background for legacy Jellyfin surface elements (paperList, visualCardBox, etc.). +// Kept separate from $background-paper so themes can use a translucent overlay here +// while $background-paper stays solid for MUI components (menus, dropdowns). +$surface-overlay: $background-paper !default; +// Optional CSS gradient applied over $appBar-defaultBg on the header and detail ribbon. +// Set to a CSS gradient value to enable; leave as none to use only the solid colour. +$appBar-gradient: none !default; // Assign custom css variables not part of the MUI theme palette :root { --jf-palette-background-defaultImage: #{$background-defaultImage}; --jf-palette-AppBar-transparentBg: #{$appBar-transparentBg}; + --jf-palette-AppBar-gradient: #{$appBar-gradient}; --jf-card-borderRadius: #{$card-borderRadius}; } @@ -71,12 +85,21 @@ html { border-color: var(--jf-palette-divider, $divider); } -.skinHeader-withBackground { +.skinHeader-withBackground, +.detailRibbon { background-color: var(--jf-palette-AppBar-defaultBg, $appBar-defaultBg); + background-image: var(--jf-palette-AppBar-gradient, $appBar-gradient); +} + +.detailRibbon { + .layout-tv & { + background: none; + } } .skinHeader.semiTransparent { background-color: var(--jf-palette-AppBar-transparentBg, $appBar-transparentBg); + background-image: none; backdrop-filter: none !important; .layout-tv & { @@ -100,9 +123,7 @@ html { } .backgroundContainer, -.dialog, .nowPlayingPlaylist, -.nowPlayingContextMenu, html { background-color: var(--jf-palette-background-default, $background-default); background-image: var(--jf-palette-background-defaultImage, $background-defaultImage); @@ -115,6 +136,11 @@ html { opacity: 0.86; } +.dialog, +.nowPlayingContextMenu { + background-color: var(--jf-palette-background-default, $background-default); +} + @media (hover: hover) and (pointer: fine) { .paper-icon-button-light:hover:not(:disabled) { color: var(--jf-palette-primary-main, $primary-main); @@ -130,7 +156,7 @@ html { } .paper-icon-button-light.show-focus:focus { - color: var(--jf-palette-primary-main, $primary-main); + color: var(--jf-palette-secondary-main, $secondary-main); } .emby-scrollbuttons { @@ -143,20 +169,27 @@ a[data-role="button"], background: var(--jf-palette-Button-inheritContainedBg, $button-inheritContainedBg); color: var(--jf-palette-text-secondary, $text-secondary); - &:focus, &:hover { background: var(--jf-palette-Button-inheritContainedHoverBg, $button-inheritContainedHoverBg); } + + &:focus { + background: var(--jf-palette-secondary-main, $secondary-main); + } } .button-submit { background: var(--jf-palette-primary-main, $primary-main); color: var(--jf-palette-primary-contrastText, $primary-contrastText); - &:focus, &:hover { background: var(--jf-palette-primary-dark, $primary-dark); } + + &:focus { + background: var(--jf-palette-secondary-main, $secondary-main); + color: var(--jf-palette-secondary-contrastText, $secondary-contrastText); + } } .button-delete { @@ -179,7 +212,7 @@ a[data-role="button"], .inputLabelFocused, .selectLabelFocused, .textareaLabelFocused { - color: var(--jf-palette-primary-main, $primary-main); + color: var(--jf-palette-secondary-main, $secondary-main); } .checkboxOutline { @@ -189,12 +222,12 @@ a[data-role="button"], .collapseContent, .formDialogFooter:not(.formDialogFooter-clear), .formDialogHeader:not(.formDialogHeader-clear) { - background-color: var(--jf-palette-background-paper, $background-paper); + background-color: $surface-overlay; } .paperList, .visualCardBox { - background-color: var(--jf-palette-background-paper, $background-paper); + background-color: $surface-overlay; border-radius: var(--jf-card-borderRadius, $card-borderRadius); } @@ -207,6 +240,14 @@ a[data-role="button"], border-radius: var(--jf-card-borderRadius, $card-borderRadius); } +.cardBox:not(.visualCardBox) .cardPadder { + background-color: $surface-overlay; +} + +.cardPadder .cardImageIcon { + color: $surface-overlay; +} + .layout-tv .formDialogFooter:not(.formDialogFooter-clear) { background-color: transparent; } @@ -230,6 +271,39 @@ a[data-role="button"], opacity: 0.5; } +@if $rounded-person-cards { + .personCard { + .cardScalable { + border-radius: 50% !important; + border: 1px solid transparent; + } + + .overflowPortraitCard { + width: 40vw; + } + + .coveredImage { + background-position-y: 20%; + border-radius: 50%; + } + + .cardOverlayContainer { + clip-path: circle(50% at 50% 50%); + } + + .cardOverlayButton-br { + right: 20%; + } + + .cardPadder-overflowPortrait, + .cardPadder-portrait { + padding-bottom: 100%; + contain: strict; + border-radius: 50% !important; + } + } +} + .toast { background: var(--jf-palette-SnackbarContent-bg, $snackbarContent-bg); color: var(--jf-palette-SnackbarContent-color, $snackbarContent-color); @@ -274,8 +348,8 @@ a[data-role="button"], } &-tv:focus { - background-color: var(--jf-palette-primary-main, $primary-main); - color: var(--jf-palette-primary-contrastText, $primary-contrastText); + background-color: var(--jf-palette-secondary-main, $secondary-main); + color: var(--jf-palette-secondary-contrastText, $secondary-contrastText); } } @@ -328,7 +402,7 @@ a[data-role="button"], border-radius: 0.2em; &:focus { - border-color: var(--jf-palette-primary-main, $primary-main); + border-color: var(--jf-palette-secondary-main, $secondary-main); } } @@ -349,12 +423,12 @@ a[data-role="button"], } .emby-select-withcolor:focus { - border-color: var(--jf-palette-primary-main, $primary-main) !important; + border-color: var(--jf-palette-secondary-main, $secondary-main) !important; } .emby-select-tv-withcolor:focus { - background-color: var(--jf-palette-primary-main, $primary-main) !important; - color: var(--jf-palette-primary-contrastText, $primary-contrastText) !important; + background-color: var(--jf-palette-secondary-main, $secondary-main) !important; + color: var(--jf-palette-secondary-contrastText, $secondary-contrastText) !important; } .emby-checkbox:checked + span + .checkboxOutline { @@ -362,7 +436,7 @@ a[data-role="button"], } .emby-checkbox:focus + span + .checkboxOutline { - border-color: var(--jf-palette-common-white, $common-white); + border-color: var(--jf-palette-secondary-main, $secondary-main); } .emby-checkbox:checked + span + .checkboxOutline, @@ -371,7 +445,7 @@ a[data-role="button"], } .emby-checkbox:focus:not(:checked) + span + .checkboxOutline { - border-color: var(--jf-palette-primary-main, $primary-main); + border-color: var(--jf-palette-secondary-main, $secondary-main); } .itemProgressBarForeground-recording { @@ -415,7 +489,7 @@ a[data-role="button"], .emby-tab-button.show-focus:focus, .emby-tab-button:hover { - color: var(--jf-palette-primary-main, $primary-main); + color: var(--jf-palette-secondary-main, $secondary-main); } .channelPrograms, @@ -461,7 +535,7 @@ a[data-role="button"], .guide-date-tab-button.emby-tab-button-active, .guide-date-tab-button:focus { - color: var(--jf-palette-primary-main, $primary-main); + color: var(--jf-palette-secondary-main, $secondary-main); } .guide-date-tab-button.show-focus:focus { @@ -487,7 +561,7 @@ a[data-role="button"], .card:focus .cardBox.visualCardBox, .card:focus .cardBox:not(.visualCardBox) .cardScalable { - border-color: var(--jf-palette-primary-main, $primary-main) !important; + border-color: var(--jf-palette-secondary-main, $secondary-main) !important; border-radius: var(--jf-card-borderRadius, $card-borderRadius); } @@ -556,3 +630,9 @@ a[data-role="button"], color: var(--jf-palette-primary-main, $primary-main); } } + +/* emby-radio style override */ +.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles svg .mdl-radio__outer-circle, +.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles svg .mdl-radio__inner-circle { + color: var(--jf-palette-secondary-main, $secondary-main); +} diff --git a/src/themes/appletv/theme.scss b/src/themes/appletv/theme.scss index 0c8fca81f7..69a11d83e1 100644 --- a/src/themes/appletv/theme.scss +++ b/src/themes/appletv/theme.scss @@ -21,6 +21,7 @@ $header-gradient: linear-gradient(to right, #bcbcbc, #a7b4b7, #beb5a5, #adbec2, $divider: rgba(0, 0, 0, 0.158), // Components $appBar-defaultBg: $header-background, + $appBar-gradient: $header-gradient, $appBar-transparentBg: rgba(213, 233, 242, 0.86), $filledInput-bg: rgba(255, 255, 255, 0.9), $filledInput-borderColor: rgba(0, 0, 0, 0.158), @@ -61,8 +62,7 @@ $header-gradient: linear-gradient(to right, #bcbcbc, #a7b4b7, #beb5a5, #adbec2, background-color: #f57f17; } -/* Gradient header, footer, and ribbon — used throughout the appletv theme */ -.skinHeader-withBackground, +/* Gradient footer, form dialog header/footer, and ribbon — skinHeader and detailRibbon handled by base */ .formDialogHeader:not(.formDialogHeader-clear), .formDialogFooter:not(.formDialogFooter-clear), .appfooter, @@ -106,16 +106,6 @@ $header-gradient: linear-gradient(to right, #bcbcbc, #a7b4b7, #beb5a5, #adbec2, background: #fff; } -/* Detail ribbon on item details pages */ -.detailRibbon { - background: $header-background; - background: $header-gradient; - - .layout-tv & { - background: none; - } -} - /* Inner card footer spacing and rounding */ .innerCardFooter { border-radius: 0.14rem; diff --git a/src/themes/purplehaze/index.ts b/src/themes/purplehaze/index.ts index 0ab57ad097..b442810114 100644 --- a/src/themes/purplehaze/index.ts +++ b/src/themes/purplehaze/index.ts @@ -4,7 +4,8 @@ import { buildCustomColorScheme } from 'themes/utils'; const theme = buildCustomColorScheme({ palette: { background: { - paper: '#000420' + default: '#230c33', + paper: '#230c33' }, primary: { main: '#48c3c8' @@ -12,8 +13,32 @@ const theme = buildCustomColorScheme({ secondary: { main: '#ff77f1' }, + text: { + primary: '#f8f8fe', + secondary: 'rgba(248, 248, 254, 0.973)' + }, + action: { + focus: 'rgba(0, 0, 0, 0.3)', + hover: '#12122f' + }, + divider: 'rgba(255, 255, 255, 0.14)', + Alert: { + infoFilledBg: '#dbe6ff', + infoFilledColor: '#0e0f2d' + }, AppBar: { - defaultBg: '#000420' + defaultBg: '#230c33' + }, + Button: { + inheritContainedBg: 'rgba(0, 0, 0, 0.5)', + inheritContainedHoverBg: 'rgb(12, 232, 214)' + }, + FilledInput: { + bg: 'rgba(0, 0, 0, 0.5)' + }, + SnackbarContent: { + bg: '#303030', + color: 'rgba(255, 255, 255, 0.87)' } } }); diff --git a/src/themes/purplehaze/theme.scss b/src/themes/purplehaze/theme.scss index e05c3c922e..c99ff80d8a 100644 --- a/src/themes/purplehaze/theme.scss +++ b/src/themes/purplehaze/theme.scss @@ -1,193 +1,98 @@ -.skinHeader, -html { - color: #f8f8fe; - color: rgba(248, 248, 254, 0.973); -} +@use "../_base/palette" as palette; -.wizardStartForm, -.ui-corner-all, -.ui-shadow { - background-color: #303030; -} +/* Background color for headers and detail ribbon */ +$header-background: #230c33; +/* Accent teal for indicators, progress bar and checked state (brighter than primary) */ +$teal-bright: rgb(12, 232, 214); +/* Background color for footers */ +$footer-blue: #06256f; +/* Background color for info badges */ +$info-background: #dbe6ff; +/* Transparent backdrop for dialogs and overlays */ +$surface: rgba(0, 0, 0, 0.5); +/* Primary text color */ +$text-primary: #f8f8fe; +/* Gradient used across headers, footers, and detail ribbon */ +$header-gradient: linear-gradient(to right, #000420 0%, $footer-blue 18%, #2b052b 38%, #2b052b 68%, $footer-blue 81%, #000420 100%); -.emby-collapsible-button { - border-color: #383838; - border-color: rgba(255, 255, 255, 0.135); -} +/* Import the base theme with overrides */ +@use "../_base/theme" with ( + // Theme options + $dark: true, + $rounded-person-cards: true, -.skinHeader-withBackground { - background: #000420; - background: linear-gradient(to right, #000420 0%, #06256f 18%, #2b052b 38%, #2b052b 68%, #06256f 81%, #000420 100%); -} - -.skinHeader.semiTransparent { - backdrop-filter: none !important; - background: linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0)); - background-color: rgba(0, 0, 0, 0.3); -} - -.layout-tv .skinHeader.semiTransparent { - background: none; -} - -.pageTitleWithDefaultLogo { - background-image: url(@jellyfin/ux-web/banner-light.png); -} - -.layout-tv .pageTitleWithDefaultLogo { - background-image: url(@jellyfin/ux-web/icon-transparent.png); -} - -.dialog, -.nowPlayingPlaylist, -.nowPlayingContextMenu, -html { - background-color: #230c33; -} - -.backgroundContainer { - background: url(bg.jpg) center top no-repeat #030322; - background-size: cover; -} - -.backgroundContainer.withBackdrop { - opacity: 0.86; -} + // Color palette + $background-default: $header-background, + $background-defaultImage: url(bg.jpg), + $background-paper: $header-background, + $primary-main: #48c3c8, + $secondary-main: #ff77f1, + $text-primary: $text-primary, + $text-secondary: rgba(248, 248, 254, 0.973), + $action-focus: rgba(0, 0, 0, 0.3), + $action-hover: #12122f, + $divider: rgba(255, 255, 255, 0.14), + // Components + $appBar-defaultBg: $header-background, + $appBar-gradient: $header-gradient, + $appBar-transparentBg: rgba(0, 0, 0, 0.3), + $surface-overlay: $surface, + $filledInput-bg: $surface, + $filledInput-borderColor: transparent, + $card-borderRadius: 0.8em, + $alert-infoFilledBg: $info-background, + $alert-infoFilledColor: #0e0f2d, + $button-inheritContainedBg: $surface, + $button-inheritContainedHoverBg: $teal-bright, + $snackbarContent-bg: #303030, + $snackbarContent-color: rgba(255, 255, 255, 0.87) +); +/* Adjust background position for portrait orientation */ @media (orientation: portrait) { .backgroundContainer { background-position: 30% top; } } +/* Icon buttons: hover/active icon colour is bright teal, not primary */ @media (hover: hover) and (pointer: fine) { .paper-icon-button-light:hover:not(:disabled) { - color: rgb(12, 232, 214); - background-color: rgba(0, 164, 220, 0.2); + color: $teal-bright; } } .paper-icon-button-light:active:not(:disabled) { - color: rgb(12, 232, 214); - background-color: rgba(0, 164, 220, 0.2); -} - -.paper-icon-button-light.show-focus:focus { - color: #ff77f1; -} - -progress { - border-radius: 0.4em; -} - -progress::-webkit-progress-bar { - border-radius: 0.4em; -} - -progress::-moz-progress-bar { - border-radius: 0.4em; + color: $teal-bright; } +/* Rounded progress bars */ +progress, +progress::-webkit-progress-bar, +progress::-moz-progress-bar, progress::-webkit-progress-value { border-radius: 0.4em; } -.fab, -.raised { - background: rgba(0, 0, 0, 0.5); - color: rgba(255, 255, 255, 0.87); -} - -.fab:focus, -.raised:focus { - background: #ff77f1; -} - -div[data-role="controlgroup"] .controlGroupButton.ui-btn-active, -div[data-role="controlgroup"] a.ui-btn-active { - background: #55828b !important; - color: #e1e5f2 !important; -} - -.controlGroupButton, -a[data-role="button"] { - background: rgba(2, 43, 58, 0.521) !important; -} - -#btnDeleteImage, -.submit, -.btnBrowse, -.mini, -.btnRefresh, -.btnManual, -.button-submit, -.viewTabButton, -.button-alt, -.btnOption { - background: rgb(72, 195, 200); - color: rgb(225, 229, 242); -} - -#btnResetPassword, -.btnForgotPassword, -.btnCancel, -.button-cancel { - background: rgba(0, 0, 0, 0.5); - color: rgba(255, 255, 255, 0.87); -} - -.alphaPickerButton { - color: #999; - color: rgba(255, 255, 255, 0.5); - background-color: transparent; -} - -#btnResetPassword:hover, -#btnRestart:hover, -#btnDeleteImage:hover, -#btnShutdown:hover, -.button-cancel:hover, -.fab:hover, -.raised:hover, -.alphaPickerButton:hover, -.submit:hover, -.btnBrowse:hover, -.mini:hover, -.btnRefresh:hover, -.button-submit:hover, -.viewTabButton:hover, -.button-alt:hover, -.btnOption:hover, -.btnManual:hover, -.block:hover { - background: rgb(12, 232, 214); - color: rgba(255, 255, 255, 0.87); -} - -.button-submit:focus { - background: #ff77f1; -} - -.button-delete { - background: rgb(247, 0, 0); - color: rgba(255, 255, 255, 0.87); -} - -.itemName { - color: #f1f7ee; -} - +/* Item titles and section headings */ +.itemName, .textareaLabel, -.sectionTitle, -.fieldDescription, -.checkboxLabel { +.sectionTitle { color: #f1f7ee; } -.checkboxLabel { - color: inherit; +/* Subdued secondary text — more transparent than $text-secondary */ +.cardText-secondary, +.fieldDescription, +.guide-programNameCaret, +.listItem .secondary, +.nowPlayingBarSecondaryText, +.programSecondaryTitle, +.secondaryText { + color: rgba(255, 255, 255, 0.5); } +/* Form labels use a blue-white rather than $text-secondary */ .selectLabel, .checkboxLabel, .checkboxListLabel, @@ -198,42 +103,18 @@ a[data-role="button"] { color: rgb(191, 219, 247); } -.inputLabelFocused, -.selectLabelFocused, -.textareaLabelFocused { - color: #ff77f1; -} - -.checkboxOutline { - border-color: currentColor; -} - -.cardContent { - border-radius: 0.8em; -} - +/* Form dialog header/footer and collapsible also get border-radius */ .collapseContent, .formDialogFooter:not(.formDialogFooter-clear), -.formDialogHeader:not(.formDialogHeader-clear), -.paperList, -.visualCardBox { - background-color: rgba(0, 0, 0, 0.5); +.formDialogHeader:not(.formDialogHeader-clear) { border-radius: 0.8em; } .layout-tv .formDialogFooter:not(.formDialogFooter-clear) { - background-color: transparent; border-radius: 0; } -.cardOverlayContainer { - border-radius: 0.8em; -} - -.blurhash-canvas { - border-radius: 0.8em; -} - +/* Default card background colours */ .defaultCardBackground1 { background-color: #9c20ab; } @@ -254,37 +135,19 @@ a[data-role="button"] { background-color: #ab8820; } -.cardText-secondary, -.fieldDescription, -.guide-programNameCaret, -.listItem .secondary, -.nowPlayingBarSecondaryText, -.programSecondaryTitle, -.secondaryText { - color: #999; +/* Alpha picker */ +.alphaPickerButton { color: rgba(255, 255, 255, 0.5); + + &-selected { + color: $teal-bright; + } } -.actionsheetDivider { - background: #444; - background: rgba(255, 255, 255, 0.14); -} - -.cardFooter-vibrant .cardText-secondary { - color: inherit; - opacity: 0.5; -} - -.toast { - background: #303030; - color: #f8f8fe; - color: rgba(255, 255, 255, 0.87); -} - +/* Footer uses a deep-blue accent instead of $background-paper */ .appfooter, .playlistSectionButton { - background: #06256f; - color: #ccc; + background: $footer-blue; color: rgba(255, 255, 255, 0.78); } @@ -295,264 +158,79 @@ a[data-role="button"] { } } -.itemSelectionPanel { - border: 1px solid #48c3c8; -} - -.selectionCommandsPanel { - background: #48c3c8; - color: #f8f8fe; -} - -.upNextDialog-countdownText { - color: #48c3c8; -} - -.alphaPickerButton-selected { - color: #0ce8d6; -} - -.alphaPickerButton-tv:focus { - background: #ff77f1; - color: #f8f8fe !important; -} - -.detailRibbon { - background: #000420; - background: linear-gradient(to right, #000420 0%, #06256f 18%, #2b052b 38%, #2b052b 68%, #06256f 81%, #000420 100%); -} - -.layout-tv .detailRibbon { - background: none; -} - -.noBackdropTransparency .detailPagePrimaryContainer, -.noBackdropTransparency .detailPageSecondaryContainer { - background: url(bg.jpg) center top no-repeat #030322; - background-size: cover; - background-attachment: fixed; -} - .detailTableBodyRow-shaded:nth-child(even) { - background: #1c1c1c; background: rgba(30, 30, 30, 0.9); } -.listItem-border { - border-color: rgba(255, 255, 255, 0.1) !important; -} - -.listItem:focus { - background: rgba(0, 0, 0, 0.3); -} - -.listItem:hover { - background: #12122f; -} - .actionSheetMenuItem:hover { - background-color: rgba(0, 0, 0, 0.5); -} - -.progressring-spiner { - border-color: #48c3c8; -} - -.button-flat:hover { - color: #48c3c8; -} - -.button-link { - color: #48c3c8; -} - -.mediaInfoText { - color: #f8f8fe; - background: rgba(170, 170, 190, 0.2); -} - -.emby-input, -.emby-textarea { - color: inherit; - background: rgba(0, 0, 0, 0.5); - border: 0.16em solid transparent; - border-radius: 0.2em; -} - -.emby-input:focus, -.emby-textarea:focus { - border-color: #ff77f1; -} - -.emby-select-withcolor { - color: inherit; - background: rgba(0, 0, 0, 0.5); - border: 0.07em solid transparent; -} - -.emby-select-withcolor > option { - color: inherit; - background: #030322d7; -} - -.emby-select-withcolor:focus { - border-color: #ff77f1 !important; -} - -.emby-select-tv-withcolor:focus { - background-color: #ff77f1 !important; - color: #fff !important; -} - -.emby-checkbox:checked + span + .checkboxOutline { - background-color: #030322; - border: 0.14em solid rgb(72, 195, 200); -} - -.emby-checkbox:checked + span + .checkboxOutline > .checkboxIcon-checked { - color: rgb(12, 232, 214); -} - -.emby-checkbox:focus + span + .checkboxOutline { - border-color: #ff77f1; -} - -.emby-checkbox:focus:not(:checked) + span + .checkboxOutline { - border: 0.14em solid #ff77f1; -} - -.itemProgressBarForeground { - background-color: rgb(12, 232, 214); -} - -.itemProgressBarForeground-recording { - background-color: #cb272a; -} - -.countIndicator, -.fullSyncIndicator, -.mediaSourceIndicator, -.playedIndicator { - background: rgb(12, 232, 214); -} - -.fullSyncIndicator { - color: #fff; + background-color: $surface; } +/* Translucent drawer surfaces */ .mainDrawer { - color: #f8f8fe; - background: rgba(0, 0, 0, 0.5); + background: $surface; } .drawer-open { background-color: #030322; } -.navMenuOption:hover { - background: rgba(221, 221, 221, 0.068); -} - +/* Selected nav item uses a custom purple */ .navMenuOption-selected { background: #6f0765 !important; - color: #f8f8fe; + color: $text-primary; } +/* Emby button focus uses a distinct light teal (different from primary or secondary) */ .emby-button.show-focus:focus { background: #8ae9c1; - color: #f8f8fe; -} - -.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles svg .mdl-radio__outer-circle, -.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles svg .mdl-radio__inner-circle { - color: #ff77f1; + color: $text-primary; } +/* Radio button focus-ring circle uses the global default primary, not PH's primary */ .mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__focus-circle { - background: #00a4dc; + background: palette.$primary-main; } -.emby-tab-button { - color: #999; -} - -.emby-tab-button-active { - color: #f8f8fe; -} - -.emby-tab-button.show-focus:focus { - color: #ff77f1; -} - -.emby-tab-button:hover { - color: #ff77f1; -} - -.channelPrograms, -.guide-channelHeaderCell, -.programCell { - border-color: rgba(255, 255, 255, 0.05); -} - -.programCell-sports { - background: #3949ab !important; -} - -.programCell-movie { - background: #5e35b1 !important; -} - -.programCell-kids { - background: #039be5 !important; -} - -.programCell-news { - background: #43a047 !important; +/* Guide date tab — dimmed by default */ +.guide-date-tab-button { + color: rgba(255, 255, 255, 0.3); } .programCell-active { background: rgba(0, 0, 0, 0.4) !important; } -.guide-channelHeaderCell:focus, -.programCell:focus { - background-color: #48c3c8 !important; - color: #fff !important; +/* Select element uses a narrower border than base inputs */ +.emby-select-withcolor { + border-width: 0.07em; } -.guide-programTextIcon { - color: #1e1e1e; - background: #555; +/* Select option uses the dark page colour as background */ +.emby-select-withcolor > option { + background: #030322d7; // $bg-base at 85% opacity } -.guide-headerTimeslots { - color: inherit; +/* Checkbox checked state uses primary teal accent */ +.emby-checkbox:checked + span + .checkboxOutline { + background-color: #030322; + border: 0.14em solid #48c3c8; } -.guide-date-tab-button { - color: #555; - color: rgba(255, 255, 255, 0.3); +.emby-checkbox:checked + span + .checkboxOutline > .checkboxIcon-checked { + color: $teal-bright; } -.guide-date-tab-button.emby-tab-button-active, -.guide-date-tab-button:focus { - color: #ff77f1; +/* Progress bar and playback indicators use bright teal */ +.itemProgressBarForeground { + background-color: $teal-bright; } -.guide-date-tab-button.show-focus:focus { - background-color: #48c3c8; - color: #fff; -} - -.infoBanner { - color: #0e0f2d; - background: #dbe6ff; - padding: 1em; - border-radius: 0.25em; -} - -.ratingbutton-icon-withrating { - color: #c33; +.countIndicator, +.fullSyncIndicator, +.mediaSourceIndicator, +.playedIndicator { + background: $teal-bright; } .downloadbutton-icon-complete, @@ -560,98 +238,38 @@ a[data-role="button"] { color: #4285f4; } -.playstatebutton-icon-played { - color: #c33; -} - +/* buttonActive retains the global default primary blue, not PH's primary */ .buttonActive { - color: #00a4dc !important; -} - -.personCard .cardScalable { - border-radius: 50% !important; - border: 1px solid transparent; -} - -.cardBox:not(.visualCardBox) .cardPadder { - background-color: rgba(0, 0, 0, 0.5); - border-radius: 0.8em; -} - -.cardPadder .cardImageIcon { - color: rgba(0, 0, 0, 0.5); -} - -.card:focus .cardBox.visualCardBox, -.card:focus .cardBox:not(.visualCardBox) .cardScalable { - border-color: #ff77f1 !important; -} - -.card.show-focus:not(.show-animation) .cardBox.visualCardBox, -.card.show-focus:not(.show-animation) .cardBox:not(.visualCardBox) .cardScalable { - border-radius: 1.3em; + color: palette.$primary-main !important; } +/* Custom scrollbar colours */ .layout-desktop, .scrollY { scrollbar-width: thin; scrollbar-color: #888 rgba(59, 59, 59, 0.5); } -::-webkit-scrollbar-track { - box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3); +.layout-desktop ::-webkit-scrollbar, +.layout-tv ::-webkit-scrollbar { + height: 1em; } ::-webkit-scrollbar-track-piece { background-color: rgba(59, 59, 59, 0.5); } -.layout-desktop ::-webkit-scrollbar, -.layout-tv ::-webkit-scrollbar { - width: 0.4em; - height: 1em; -} - -::-webkit-scrollbar-thumb:horizontal, -::-webkit-scrollbar-thumb:vertical { - border-radius: 2px; - background: center no-repeat #888; -} - -.timeslotHeaders-desktop::-webkit-scrollbar { - height: 0.7em; +.mediaInfoText { + color: $text-primary; + background: rgba(170, 170, 190, 0.2); } .mediaInfoOfficialRating { border: 0.09em solid #583fa0; - background-color: #dbe6ff; + background-color: $info-background; color: #0e0f2d; } .metadataSidebarIcon { - color: #dbe6ff; -} - -.personCard .overflowPortraitCard { - width: 40vw; -} - -.personCard .coveredImage { - background-position-y: 20%; - border-radius: 50%; -} - -.personCard .cardOverlayContainer { - clip-path: circle(50% at 50% 50%); -} - -.personCard .cardOverlayButton-br { - right: 20%; -} - -.personCard .cardPadder-overflowPortrait, -.personCard .cardPadder-portrait { - padding-bottom: 100%; - contain: strict; - border-radius: 50% !important; + color: $info-background; } From c2a3e624069da8092517ca518a997d8cf1fa0354 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 8 Jul 2026 21:32:22 +0000 Subject: [PATCH 040/287] Update dependency caniuse-lite to v1.0.30001800 --- package-lock.json | 29 ++++------------------------- package.json | 2 +- 2 files changed, 5 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 58651a280b..f1671f81bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -93,7 +93,7 @@ "@vitest/coverage-v8": "3.2.6", "autoprefixer": "10.5.2", "babel-loader": "10.1.1", - "caniuse-lite": "1.0.30001799", + "caniuse-lite": "1.0.30001800", "clean-webpack-plugin": "4.0.0", "confusing-browser-globals": "1.0.11", "copy-webpack-plugin": "14.0.0", @@ -8519,27 +8519,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/browserslist/node_modules/caniuse-lite": { - "version": "1.0.30001799", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", - "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -8761,9 +8740,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001799", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", - "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "version": "1.0.30001800", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001800.tgz", + "integrity": "sha512-MMHtuAz9Ys840zAY5F4k6fV5GaivZ9sPk+nz0mY+GYVzRBnYkN0mpqkSR92oWRQ19yQWo4HvBV/FnC16AJX8MA==", "dev": true, "funding": [ { diff --git a/package.json b/package.json index 0ef134ecce..36aae46b12 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@vitest/coverage-v8": "3.2.6", "autoprefixer": "10.5.2", "babel-loader": "10.1.1", - "caniuse-lite": "1.0.30001799", + "caniuse-lite": "1.0.30001800", "clean-webpack-plugin": "4.0.0", "confusing-browser-globals": "1.0.11", "copy-webpack-plugin": "14.0.0", From 561401dce8cd700994acf539e3c8f7a17fa3c336 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 8 Jul 2026 17:24:49 -0400 Subject: [PATCH 041/287] Reduce elevation on app bars to better match theme color --- src/apps/dashboard/AppLayout.tsx | 1 - src/apps/modern/AppLayout.tsx | 2 +- src/themes/purplehaze/theme.scss | 6 ++++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/apps/dashboard/AppLayout.tsx b/src/apps/dashboard/AppLayout.tsx index 5164e929de..c9f42e18c2 100644 --- a/src/apps/dashboard/AppLayout.tsx +++ b/src/apps/dashboard/AppLayout.tsx @@ -59,7 +59,6 @@ export const Component: FC = () => { { }} > - + Date: Wed, 8 Jul 2026 10:03:10 -0400 Subject: [PATCH 042/287] Refactor useMovieRecommendations hook --- .../components/SuggestionsSectionView.tsx | 18 +++++--- .../hooks/api/useMovieRecommendations.ts | 43 +++++++++++++++++++ src/hooks/useFetchItems.ts | 36 ---------------- 3 files changed, 56 insertions(+), 41 deletions(-) create mode 100644 src/apps/modern/features/libraries/hooks/api/useMovieRecommendations.ts diff --git a/src/apps/modern/features/libraries/components/SuggestionsSectionView.tsx b/src/apps/modern/features/libraries/components/SuggestionsSectionView.tsx index 8322b22326..3e9abc04ed 100644 --- a/src/apps/modern/features/libraries/components/SuggestionsSectionView.tsx +++ b/src/apps/modern/features/libraries/components/SuggestionsSectionView.tsx @@ -1,13 +1,11 @@ +import { ItemFields } from '@jellyfin/sdk/lib/generated-client/models/item-fields'; import type { RecommendationDto } from '@jellyfin/sdk/lib/generated-client/models/recommendation-dto'; import { RecommendationType } from '@jellyfin/sdk/lib/generated-client/models/recommendation-type'; import React, { type FC } from 'react'; import { CardShape } from 'components/cardbuilder/utils/shape'; import { useApi } from 'hooks/useApi'; -import { - useGetMovieRecommendations, - useGetSuggestionSectionsWithItems -} from 'hooks/useFetchItems'; +import { useGetSuggestionSectionsWithItems } from 'hooks/useFetchItems'; import { appRouter } from 'components/router/appRouter'; import globalize from 'lib/globalize'; import Loading from 'components/loading/LoadingComponent'; @@ -17,6 +15,8 @@ import type { ParentId } from 'types/library'; import type { Section, SectionType } from 'types/sections'; import type { ItemDto } from 'types/base/models/item-dto'; +import { useMovieRecommendations } from '../hooks/api/useMovieRecommendations'; + interface SuggestionsSectionViewProps { parentId: ParentId; sectionType: SectionType[]; @@ -35,7 +35,15 @@ const SuggestionsSectionView: FC = ({ const { isLoading: isRecommendationsLoading, data: movieRecommendationsItems - } = useGetMovieRecommendations(isMovieRecommendationEnabled, parentId); + } = useMovieRecommendations({ + parentId: parentId || undefined, + fields: [ + ItemFields.PrimaryImageAspectRatio, + ItemFields.MediaSourceCount + ], + categoryLimit: 6, + itemLimit: 20 + }, isMovieRecommendationEnabled); if (isLoading || isRecommendationsLoading) { return ; diff --git a/src/apps/modern/features/libraries/hooks/api/useMovieRecommendations.ts b/src/apps/modern/features/libraries/hooks/api/useMovieRecommendations.ts new file mode 100644 index 0000000000..1e281bb86b --- /dev/null +++ b/src/apps/modern/features/libraries/hooks/api/useMovieRecommendations.ts @@ -0,0 +1,43 @@ +import type { Api } from '@jellyfin/sdk/lib/api'; +import type { MovieApiGetMovieRecommendationsRequest } from '@jellyfin/sdk/lib/generated-client/api/movie-api'; +import { getMovieApi } from '@jellyfin/sdk/lib/utils/api/movie-api'; +import { queryOptions, useQuery } from '@tanstack/react-query'; +import type { AxiosRequestConfig } from 'axios'; + +import { useApi } from 'hooks/useApi'; + +const fetchGetMovieRecommendations = async ( + api: Api, + params: MovieApiGetMovieRecommendationsRequest, + options?: AxiosRequestConfig +) => { + const response = await getMovieApi(api).getMovieRecommendations(params, options); + return response.data; +}; + +/** Query options for fetching movie recommendations. */ +export const getMovieRecommendationsQuery = ( + api?: Api, + params: MovieApiGetMovieRecommendationsRequest = {}, + enabled = true +) => queryOptions({ + queryKey: ['MovieRecommendations', params?.parentId], + queryFn: ({ signal }) => fetchGetMovieRecommendations(api!, params, { signal }), + enabled: !!api && enabled +}); + +/** Hook for fetching movie recommendations. */ +export const useMovieRecommendations = ( + params?: MovieApiGetMovieRecommendationsRequest, + enabled?: boolean +) => { + const { api, user } = useApi(); + return useQuery(getMovieRecommendationsQuery( + api, + { + ...params, + userId: params?.userId || user?.Id + }, + enabled + )); +}; diff --git a/src/hooks/useFetchItems.ts b/src/hooks/useFetchItems.ts index a55381f57a..caea795600 100644 --- a/src/hooks/useFetchItems.ts +++ b/src/hooks/useFetchItems.ts @@ -11,7 +11,6 @@ import { SortOrder } from '@jellyfin/sdk/lib/generated-client/models/sort-order' import { getArtistApi } from '@jellyfin/sdk/lib/utils/api/artist-api'; import { getFilterApi } from '@jellyfin/sdk/lib/utils/api/filter-api'; import { getGenreApi } from '@jellyfin/sdk/lib/utils/api/genre-api'; -import { getMovieApi } from '@jellyfin/sdk/lib/utils/api/movie-api'; import { getPersonApi } from '@jellyfin/sdk/lib/utils/api/person-api'; import { getStudioApi } from '@jellyfin/sdk/lib/utils/api/studio-api'; import { getShowApi } from '@jellyfin/sdk/lib/utils/api/show-api'; @@ -74,41 +73,6 @@ export const useGetItems = (parametersOptions: LibraryApiGetItemsRequest) => { }); }; -const fetchGetMovieRecommendations = async ( - currentApi: JellyfinApiContext, - parentId: ParentId, - options?: AxiosRequestConfig -) => { - const { api, user } = currentApi; - if (api && user?.Id) { - const response = await getMovieApi(api).getMovieRecommendations( - { - userId: user.Id, - fields: [ - ItemFields.PrimaryImageAspectRatio, - ItemFields.MediaSourceCount - ], - parentId: parentId ?? undefined, - categoryLimit: 6, - itemLimit: 20 - }, - { - signal: options?.signal - } - ); - return response.data; - } -}; - -export const useGetMovieRecommendations = (isMovieRecommendationEnabled: boolean, parentId: ParentId) => { - const currentApi = useApi(); - return useQuery({ - queryKey: ['MovieRecommendations', isMovieRecommendationEnabled, parentId], - queryFn: ({ signal }) => fetchGetMovieRecommendations(currentApi, parentId, { signal }), - enabled: !!currentApi.api && !!currentApi.user?.Id && isMovieRecommendationEnabled - }); -}; - const fetchGetGenres = async ( currentApi: JellyfinApiContext, itemType: BaseItemKind[], From c30562ae9f1ae255c81e831d66b05169eb55bc5b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 03:02:07 +0000 Subject: [PATCH 043/287] Update dependency idb-keyval to v6.2.6 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index f1671f81bd..fb736ddb7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "headroom.js": "0.12.0", "history": "5.3.0", "hls.js": "1.6.16", - "idb-keyval": "6.2.5", + "idb-keyval": "6.2.6", "intersection-observer": "0.12.2", "jellyfin-apiclient": "1.11.0", "jquery": "3.7.1", @@ -13592,9 +13592,9 @@ } }, "node_modules/idb-keyval": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.5.tgz", - "integrity": "sha512-eKQkTnS0relYsSOYomx8ozIbmdsQCKUdhyuIaQ2DZgKuaxtyQQMkyD/wlnQN32pO3yutN1b1L8uqwcDKaJd7/Q==", + "version": "6.2.6", + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.6.tgz", + "integrity": "sha512-FY64UEhw+5liMzMQ1R9Mw6AF0+wyBrg1CIA1z4CjI/EvT5ty/SvQcWZgd8s9sgaNhX10Y8UzScTh89tEAls5nA==", "license": "Apache-2.0" }, "node_modules/ignore": { diff --git a/package.json b/package.json index 36aae46b12..91ad940eec 100644 --- a/package.json +++ b/package.json @@ -111,7 +111,7 @@ "headroom.js": "0.12.0", "history": "5.3.0", "hls.js": "1.6.16", - "idb-keyval": "6.2.5", + "idb-keyval": "6.2.6", "intersection-observer": "0.12.2", "jellyfin-apiclient": "1.11.0", "jquery": "3.7.1", From bfaec1745f2c523da5b04841e6437a2bddefce58 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 04:13:19 +0000 Subject: [PATCH 044/287] Update dependency postcss to v8.5.16 --- package-lock.json | 37 ++++--------------------------------- package.json | 2 +- 2 files changed, 5 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index fb736ddb7d..27ed2bb92f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -116,7 +116,7 @@ "html-webpack-plugin": "5.6.7", "jsdom": "29.1.1", "mini-css-extract-plugin": "2.10.2", - "postcss": "8.5.15", + "postcss": "8.5.16", "postcss-loader": "8.2.1", "postcss-preset-env": "10.6.1", "postcss-scss": "4.0.9", @@ -16651,9 +16651,9 @@ } }, "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "version": "8.5.16", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", + "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", "dev": true, "funding": [ { @@ -22602,35 +22602,6 @@ "stylelint": "^16.24.0 || ^17.0.0" } }, - "node_modules/stylelint-no-browser-hacks/node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.12", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/stylelint-no-browser-hacks/node_modules/postcss-selector-parser": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", diff --git a/package.json b/package.json index 91ad940eec..ab9b62ce47 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "html-webpack-plugin": "5.6.7", "jsdom": "29.1.1", "mini-css-extract-plugin": "2.10.2", - "postcss": "8.5.15", + "postcss": "8.5.16", "postcss-loader": "8.2.1", "postcss-preset-env": "10.6.1", "postcss-scss": "4.0.9", From 08769194ae9d4820793ee0fa154e9cbc0ee76166 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 04:22:22 +0000 Subject: [PATCH 045/287] Bump ws from 8.19.0 to 8.21.0 Bumps [ws](https://github.com/websockets/ws) from 8.19.0 to 8.21.0. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/8.19.0...8.21.0) --- updated-dependencies: - dependency-name: ws dependency-version: 8.21.0 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 27ed2bb92f..a6166196eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25635,9 +25635,9 @@ } }, "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "dev": true, "license": "MIT", "engines": { From d91a96e29f5f1a5eaeda6624e6a37757ea4a8f9a Mon Sep 17 00:00:00 2001 From: Tim Eisele Date: Thu, 9 Jul 2026 12:19:14 +0200 Subject: [PATCH 046/287] Fix episode image handling in next-up --- src/components/cardbuilder/utils/url.ts | 10 ++++++++++ src/components/homesections/sections/recentlyAdded.ts | 1 + src/types/cardOptions.ts | 1 + 3 files changed, 12 insertions(+) diff --git a/src/components/cardbuilder/utils/url.ts b/src/components/cardbuilder/utils/url.ts index 54874b3a4c..d0ea4f93df 100644 --- a/src/components/cardbuilder/utils/url.ts +++ b/src/components/cardbuilder/utils/url.ts @@ -68,6 +68,16 @@ export function getCardImageUrl({ imgType = ImageType.Backdrop; imgTag = item.ParentBackdropImageTags[0]; itemId = item.ParentBackdropItemId; + } else if (options.preferParentPoster && !options.preferThumb && item.Type === 'Episode' + && ((item.ParentPrimaryImageTag && item.ParentPrimaryImageItemId) || (item.SeriesPrimaryImageTag && item.SeriesId))) { + imgType = ImageType.Primary; + if (item.ParentPrimaryImageTag && item.ParentPrimaryImageItemId) { + imgTag = item.ParentPrimaryImageTag; + itemId = item.ParentPrimaryImageItemId; + } else { + imgTag = item.SeriesPrimaryImageTag; + itemId = item.SeriesId; + } } else if (item.ImageTags?.Primary && (item.Type !== 'Episode' || item.ChildCount !== 0)) { imgType = ImageType.Primary; imgTag = item.ImageTags.Primary; diff --git a/src/components/homesections/sections/recentlyAdded.ts b/src/components/homesections/sections/recentlyAdded.ts index 91297f5866..3edd57549d 100644 --- a/src/components/homesections/sections/recentlyAdded.ts +++ b/src/components/homesections/sections/recentlyAdded.ts @@ -83,6 +83,7 @@ function getLatestItemsHtmlFn( items: items, shape: shape, preferThumb: viewType !== 'movies' && viewType !== 'tvshows' && itemType !== 'Channel' && viewType !== 'music' ? 'auto' : null, + preferParentPoster: true, showUnplayedIndicator: false, showChildCountIndicator: true, context: 'home', diff --git a/src/types/cardOptions.ts b/src/types/cardOptions.ts index 5040b3daef..78f22143fc 100644 --- a/src/types/cardOptions.ts +++ b/src/types/cardOptions.ts @@ -28,6 +28,7 @@ export interface CardOptions { preferThumb?: boolean | string | null; preferDisc?: boolean; preferLogo?: boolean; + preferParentPoster?: boolean; scalable?: boolean; shape?: CardShape; defaultShape?: CardShape; From 5970fbda38beda70622419a46fce099311294a3b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 12:04:56 +0000 Subject: [PATCH 047/287] Update dependency @jellyfin/sdk to v0.0.0-unstable.202607090422 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index a6166196eb..f3a1ff770d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@fontsource/noto-sans-sc": "5.2.9", "@fontsource/noto-sans-tc": "5.2.9", "@jellyfin/libass-wasm": "4.2.4", - "@jellyfin/sdk": "0.0.0-unstable.202607081347", + "@jellyfin/sdk": "0.0.0-unstable.202607090422", "@jellyfin/ux-web": "1.0.0", "@mui/icons-material": "6.5.0", "@mui/material": "6.5.0", @@ -4661,9 +4661,9 @@ "license": "LGPL-2.1-or-later AND (FTL OR GPL-2.0-or-later) AND MIT AND MIT-Modern-Variant AND ISC AND NTP AND Zlib AND BSL-1.0" }, "node_modules/@jellyfin/sdk": { - "version": "0.0.0-unstable.202607081347", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202607081347.tgz", - "integrity": "sha512-VPe7CLvM0363lsewqOjZipuwR0U0OQm5KjtukZHHejkb6ey5N342Vu/gQX03yriZJ6T69ioRkdIZ6qHgxrB/Sw==", + "version": "0.0.0-unstable.202607090422", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202607090422.tgz", + "integrity": "sha512-mcM9iYMFfjEh3J+jCmlGj6LAelYTu7pxJmM4m/PPNr3CkrNzMUy0YjT5UWF9R5xRvhZkmYphSApUvhIp6MhMUw==", "license": "MPL-2.0", "peerDependencies": { "axios": "^1.12.0" diff --git a/package.json b/package.json index ab9b62ce47..8ce034d996 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "@fontsource/noto-sans-sc": "5.2.9", "@fontsource/noto-sans-tc": "5.2.9", "@jellyfin/libass-wasm": "4.2.4", - "@jellyfin/sdk": "0.0.0-unstable.202607081347", + "@jellyfin/sdk": "0.0.0-unstable.202607090422", "@jellyfin/ux-web": "1.0.0", "@mui/icons-material": "6.5.0", "@mui/material": "6.5.0", From 8828e8aea5f599800df85fa1a39b73b79b9064d3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 13:43:11 +0000 Subject: [PATCH 048/287] Update tanstack-query monorepo to v5.101.2 --- package-lock.json | 54 +++++++++++++++++++++++------------------------ package.json | 6 +++--- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index f3a1ff770d..f9e7183de9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,9 +24,9 @@ "@mui/material": "6.5.0", "@mui/x-date-pickers": "7.29.4", "@react-hook/resize-observer": "2.0.2", - "@tanstack/react-query": "5.101.1", - "@tanstack/react-query-devtools": "5.101.1", - "@tanstack/react-query-persist-client": "5.101.1", + "@tanstack/react-query": "5.101.2", + "@tanstack/react-query-devtools": "5.101.2", + "@tanstack/react-query-persist-client": "5.101.2", "abortcontroller-polyfill": "1.7.8", "axios": "1.18.1", "blurhash": "2.0.5", @@ -6177,9 +6177,9 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.101.1", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.101.1.tgz", - "integrity": "sha512-Y6Y92dkXtNqx67m2pMSxUsA3zOCwv862JexZRP8/EPwvKXMPu9m8rv43spiXWzOUIggQ3SQApttALStzhA8B4g==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.101.2.tgz", + "integrity": "sha512-hH5MLoJhF7KaIGd7q3xTXGXvslI+GYlM1Z/35aSHHWaCJWB7XvTSHYuV3eM7tw+aE0mT/xMro4M4Q9rCGHT0lw==", "license": "MIT", "funding": { "type": "github", @@ -6187,9 +6187,9 @@ } }, "node_modules/@tanstack/query-devtools": { - "version": "5.101.1", - "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.101.1.tgz", - "integrity": "sha512-37RQ9U2PxlXQiv1era2t+uHgVhmiyvxqTMu30+KoVf0rufiucu6rpGRKFJk61Wh5OAZFKqCQd6lxTzFWfLZiuQ==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.101.2.tgz", + "integrity": "sha512-o+wHcqgN7Pp0s8v1i0UGq/ZrrEKrxdIiMQmKRdYb2w7NPtylYSJ4+wg/tIn71m9DLstwUwdEGAvROdly6HXP6w==", "license": "MIT", "funding": { "type": "github", @@ -6197,12 +6197,12 @@ } }, "node_modules/@tanstack/query-persist-client-core": { - "version": "5.101.1", - "resolved": "https://registry.npmjs.org/@tanstack/query-persist-client-core/-/query-persist-client-core-5.101.1.tgz", - "integrity": "sha512-rR5Er6jmdI3Oo8o6Wc0ceM6glDU4umgePu2IxM3Gy2UvPqcQONduxxxSzU1+F17mpS09XHqHKmj0Irhfb2cGYg==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/@tanstack/query-persist-client-core/-/query-persist-client-core-5.101.2.tgz", + "integrity": "sha512-rgMsbvBVpSPDUsprC9FYxojdG0Q1LH6yq1i3DXz2aps4VEqv2l4Msj3YDqIifU3xkl/DrYe9YWntZAJLrM6xTg==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.101.1" + "@tanstack/query-core": "5.101.2" }, "funding": { "type": "github", @@ -6210,12 +6210,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.101.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.101.1.tgz", - "integrity": "sha512-ZnONUuQKJe1bJMStXUL1s5uKN9FcfC28j5cK+iDZcdSHtUv1wtin1cGc/Oewhf2Oc4eKY7lggtpvT/AbMmhHew==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.101.2.tgz", + "integrity": "sha512-seDkr6kzGzX1okaaTtZPtgA688CDPlXUz1C6xSg0ESqn04Vuc8tlrYms1s3de+znBqhPVxFRfpAfUf+6XvfPWg==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.101.1" + "@tanstack/query-core": "5.101.2" }, "funding": { "type": "github", @@ -6226,36 +6226,36 @@ } }, "node_modules/@tanstack/react-query-devtools": { - "version": "5.101.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.101.1.tgz", - "integrity": "sha512-OXFR9XKdEslraq3cpl3kCUeNvTIq/xGWEZiFZdn2bLB/q4WxSALMEDKYZ5yYjMQytsfnQxwQYqV4qtVEf0nuog==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.101.2.tgz", + "integrity": "sha512-eU7HctdA9gDjqoERoEdzLbw9DiqnBDfh5+Hu0u26gjqoHJezOpQAuiesDL2VvkU+2cPV76zgv0tMZsOrI4LjnQ==", "license": "MIT", "dependencies": { - "@tanstack/query-devtools": "5.101.1" + "@tanstack/query-devtools": "5.101.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query": "^5.101.2", "react": "^18 || ^19" } }, "node_modules/@tanstack/react-query-persist-client": { - "version": "5.101.1", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-persist-client/-/react-query-persist-client-5.101.1.tgz", - "integrity": "sha512-bBSne+3+28EZ/Ch5a06J0YQi6d5yaT2G+vyHAyhzwzYA1FAEAFe6Ou6TsNVQaT6ef6pFShU73FL/NB4guTWNng==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-persist-client/-/react-query-persist-client-5.101.2.tgz", + "integrity": "sha512-19UpaRtf0lvB2QAJ2MoixxtGf3osMOd508g99EsttUj4+3eLs+ulnNgYjB7AkQMHrRlcbVXqpVNqWkB4a7g8Zw==", "license": "MIT", "dependencies": { - "@tanstack/query-persist-client-core": "5.101.1" + "@tanstack/query-persist-client-core": "5.101.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/react-query": "^5.101.1", + "@tanstack/react-query": "^5.101.2", "react": "^18 || ^19" } }, diff --git a/package.json b/package.json index 8ce034d996..590055aad0 100644 --- a/package.json +++ b/package.json @@ -92,9 +92,9 @@ "@mui/material": "6.5.0", "@mui/x-date-pickers": "7.29.4", "@react-hook/resize-observer": "2.0.2", - "@tanstack/react-query": "5.101.1", - "@tanstack/react-query-devtools": "5.101.1", - "@tanstack/react-query-persist-client": "5.101.1", + "@tanstack/react-query": "5.101.2", + "@tanstack/react-query-devtools": "5.101.2", + "@tanstack/react-query-persist-client": "5.101.2", "abortcontroller-polyfill": "1.7.8", "axios": "1.18.1", "blurhash": "2.0.5", From 55b3fbcb03b70481f5a779c9bcec4a5ea1800b05 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 15:10:58 +0000 Subject: [PATCH 049/287] Update dependency markdown-it to v14.3.0 --- package-lock.json | 18 +++++++++--------- package.json | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index f9e7183de9..480bd91f5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,7 +51,7 @@ "libarchive.js": "2.0.2", "libpgs": "0.8.1", "lodash-es": "4.18.1", - "markdown-it": "14.2.0", + "markdown-it": "14.3.0", "material-design-icons-iconfont": "6.7.0", "material-react-table": "3.2.1", "native-promise-only": "0.8.1", @@ -15024,9 +15024,9 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "node_modules/linkify-it": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.1.tgz", - "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", + "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", "funding": [ { "type": "github", @@ -15267,9 +15267,9 @@ } }, "node_modules/markdown-it": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.2.0.tgz", - "integrity": "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==", + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz", + "integrity": "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==", "funding": [ { "type": "github", @@ -15283,8 +15283,8 @@ "license": "MIT", "dependencies": { "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.1", + "entities": "^4.5.0", + "linkify-it": "^5.0.2", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" diff --git a/package.json b/package.json index 590055aad0..8456b5499e 100644 --- a/package.json +++ b/package.json @@ -119,7 +119,7 @@ "libarchive.js": "2.0.2", "libpgs": "0.8.1", "lodash-es": "4.18.1", - "markdown-it": "14.2.0", + "markdown-it": "14.3.0", "material-design-icons-iconfont": "6.7.0", "material-react-table": "3.2.1", "native-promise-only": "0.8.1", From 2c6670fac17dc8d0a490d8f6724b14c633eb393d Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Thu, 9 Jul 2026 15:19:10 -0400 Subject: [PATCH 050/287] Fix secondary color in default theme to match primary --- src/themes/_base/theme.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/themes/_base/theme.ts b/src/themes/_base/theme.ts index 4c8a27a09f..31ced1db8f 100644 --- a/src/themes/_base/theme.ts +++ b/src/themes/_base/theme.ts @@ -11,7 +11,7 @@ export const DEFAULT_COLOR_SCHEME: ColorSystemOptions = { main: '#00a4dc' }, secondary: { - main: '#aa5cc3' + main: '#00a4dc' }, background: { default: '#101010', From dd5bfeb420341b06cb777ad09edcb26829dcfc53 Mon Sep 17 00:00:00 2001 From: TheMelmacian <76712303+TheMelmacian@users.noreply.github.com> Date: Sat, 4 Jul 2026 00:18:01 +0200 Subject: [PATCH 051/287] add language filters for subtitles and audio in modern layout --- .../components/filter/FilterButton.tsx | 76 ++++++++++++++++--- .../filter/FiltersAudioLanguages.tsx | 59 ++++++++++++++ .../filter/FiltersSubtitleLanguages.tsx | 59 ++++++++++++++ src/hooks/useFetchItems.ts | 38 ++++++++++ src/strings/en-us.json | 4 +- src/types/library.ts | 2 + src/utils/items.ts | 4 +- 7 files changed, 229 insertions(+), 13 deletions(-) create mode 100644 src/apps/modern/features/libraries/components/filter/FiltersAudioLanguages.tsx create mode 100644 src/apps/modern/features/libraries/components/filter/FiltersSubtitleLanguages.tsx diff --git a/src/apps/modern/features/libraries/components/filter/FilterButton.tsx b/src/apps/modern/features/libraries/components/filter/FilterButton.tsx index e18e40cbf2..3dbe411bf0 100644 --- a/src/apps/modern/features/libraries/components/filter/FilterButton.tsx +++ b/src/apps/modern/features/libraries/components/filter/FilterButton.tsx @@ -15,9 +15,10 @@ import Badge from '@mui/material/Badge'; import { styled } from '@mui/material/styles'; import Typography from '@mui/material/Typography'; -import { useGetQueryFiltersLegacy, useGetStudios } from 'hooks/useFetchItems'; +import { useGetQueryFilters, useGetQueryFiltersLegacy, useGetStudios } from 'hooks/useFetchItems'; import globalize from 'lib/globalize'; +import FiltersAudioLanguages from './FiltersAudioLanguages'; import FiltersFeatures from './FiltersFeatures'; import FiltersGenres from './FiltersGenres'; import FiltersOfficialRatings from './FiltersOfficialRatings'; @@ -25,6 +26,7 @@ import FiltersEpisodesStatus from './FiltersEpisodesStatus'; import FiltersSeriesStatus from './FiltersSeriesStatus'; import FiltersStatus from './FiltersStatus'; import FiltersStudios from './FiltersStudios'; +import FiltersSubtitleLanguages from './FiltersSubtitleLanguages'; import FiltersTags from './FiltersTags'; import FiltersVideoTypes from './FiltersVideoTypes'; import FiltersYears from './FiltersYears'; @@ -99,7 +101,8 @@ const FilterButton: FC = ({ const open = Boolean(anchorEl); const id = open ? 'filter-popover' : undefined; - const { data } = useGetQueryFiltersLegacy(parentId, itemType); + const { data: filtersLegacy } = useGetQueryFiltersLegacy(parentId, itemType); + const { data: filters } = useGetQueryFilters(parentId, itemType); const { data: studios } = useGetStudios(parentId, itemType); const handleChange = @@ -173,6 +176,13 @@ const FilterButton: FC = ({ return viewType === LibraryTab.Episodes; }; + const isFiltersLanguagesEnabled = () => { + return viewType === LibraryTab.Movies + || viewType === LibraryTab.Series + || viewType === LibraryTab.Episodes + || viewType === LibraryTab.Mixed; + }; + return ( <>
+
+ +
diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 7e7dcbc268..06cb7b943a 100755 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1565,6 +1565,7 @@ "Series": "Series", "SeriesCancelled": "Series cancelled.", "SeriesDisplayOrderHelp": "Order episodes by air date, DVD order, or absolute numbering.", + "SeriesName": "Series Name", "SeriesRecordingScheduled": "Series recording scheduled.", "SeriesSettings": "Series settings", "SeriesYearToPresent": "{0} - Present", From 5bfb8e17e5e021d50ef82bf578f470aa78d99055 Mon Sep 17 00:00:00 2001 From: Jordan Rushing Date: Mon, 6 Jul 2026 16:57:46 -0500 Subject: [PATCH 080/287] Add aria label to satisfy SonarQube --- src/components/metadataEditor/metadataEditor.template.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/metadataEditor/metadataEditor.template.html b/src/components/metadataEditor/metadataEditor.template.html index eb1702998c..276939c4fa 100644 --- a/src/components/metadataEditor/metadataEditor.template.html +++ b/src/components/metadataEditor/metadataEditor.template.html @@ -61,7 +61,7 @@

${LabelArtistsHelp}

- +
From 8395aea38d6f4632a2fb0c3eee7e2d13e2c80f13 Mon Sep 17 00:00:00 2001 From: MagentaGaming Date: Wed, 15 Jul 2026 03:13:26 -0400 Subject: [PATCH 081/287] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/de.json b/src/strings/de.json index 843c31b9ce..f0283216dc 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1925,5 +1925,6 @@ "HeaderSplitMedia": "Medien auseinander trennen", "Creators": "Ersteller", "IndexNumber": "Indexnummer", - "NoCastTargets": "Keine Ziele zum Casten verfügbar" + "NoCastTargets": "Keine Ziele zum Casten verfügbar", + "MessageNoEpisodesFound": "Es sind gerade keine Episoden verfügbar." } From 31d8cc90489294a5564d3222654f8b76e7bc67d7 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Wed, 15 Jul 2026 11:00:37 -0400 Subject: [PATCH 082/287] Fix react hook error by always returning a value --- src/hooks/useFetchItems.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hooks/useFetchItems.ts b/src/hooks/useFetchItems.ts index 6a0bdff5fa..e18a7d7e8f 100644 --- a/src/hooks/useFetchItems.ts +++ b/src/hooks/useFetchItems.ts @@ -355,6 +355,8 @@ const fetchGetItemsViewByType = async ( } return response.data as ItemDtoQueryResult; } + + return {}; }; export const useGetItemsViewByType = ( From 8d3330a166944e208a349b31efb7be7642e39fd3 Mon Sep 17 00:00:00 2001 From: Lionel Morin Date: Wed, 15 Jul 2026 11:53:59 -0400 Subject: [PATCH 083/287] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 398c945d24..29129f4743 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1925,5 +1925,6 @@ "Creators": "Créateurs", "HeaderSplitMedia": "Séparer les supports", "IndexNumber": "Numéro d'index", - "NoCastTargets": "Aucune cible de casting disponible" + "NoCastTargets": "Aucune cible de casting disponible", + "MessageNoEpisodesFound": "Aucun n'est épisode disponible pour le moment." } From fd612e6113cbb9dc022d0a132b9586ab1cb705b9 Mon Sep 17 00:00:00 2001 From: myrad2267 <37258280+myrad2267@users.noreply.github.com> Date: Wed, 15 Jul 2026 12:38:08 -0400 Subject: [PATCH 084/287] Translated using Weblate (French (Canada)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr_CA/ --- src/strings/fr-ca.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/fr-ca.json b/src/strings/fr-ca.json index 1657d99378..a5b911b61c 100644 --- a/src/strings/fr-ca.json +++ b/src/strings/fr-ca.json @@ -1925,5 +1925,6 @@ "HeaderBackupWarning": "AVERTISSEMENT : Tâches planifiées en cours", "TableOfContents": "Table des matières", "IndexNumber": "Numéro d'index", - "NoCastTargets": "Aucune cible de casting disponible" + "NoCastTargets": "Aucune cible de casting disponible", + "MessageNoEpisodesFound": "Aucun n'est épisode disponible pour le moment." } From c9257f070dc2e84e8db3f14e59c00f3251653cc6 Mon Sep 17 00:00:00 2001 From: Lofuuzi Date: Wed, 15 Jul 2026 14:23:31 -0400 Subject: [PATCH 085/287] Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hant_HK/ --- src/strings/zh-hk.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/zh-hk.json b/src/strings/zh-hk.json index cf4cf23ff8..dff40ce926 100644 --- a/src/strings/zh-hk.json +++ b/src/strings/zh-hk.json @@ -1925,5 +1925,6 @@ "Creators": "創作人", "HeaderSplitMedia": "拆分媒體", "IndexNumber": "索引編號", - "NoCastTargets": "冇可用嘅投放目標裝置" + "NoCastTargets": "冇可用嘅投放目標裝置", + "MessageNoEpisodesFound": "目前暫時冇任何集數。" } From d389ef42aad2572a0cd1e5fa2bfc91c2f843d3db Mon Sep 17 00:00:00 2001 From: Translation expert Date: Wed, 15 Jul 2026 18:17:56 -0400 Subject: [PATCH 086/287] Translated using Weblate (Arabic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ar/ --- src/strings/ar.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/ar.json b/src/strings/ar.json index d55a7f310a..ee4c754c85 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -1925,5 +1925,6 @@ "ConfirmSplitMedia": "هل انت متأكد من رغبتك في تقسيم مصادر الوسائط إلى عناصر منفصلة؟", "Creators": "مكوّنين", "IndexNumber": "رقم المؤشر", - "NoCastTargets": "لا اهداف بث متوفرة" + "NoCastTargets": "لا اهداف بث متوفرة", + "MessageNoEpisodesFound": "لا تتوفر حلقات حاليا." } From e0c6b4e14b81fbd69e2fd09f9b56bc77d0882fbf Mon Sep 17 00:00:00 2001 From: hoanghuy309 Date: Thu, 16 Jul 2026 00:08:46 -0400 Subject: [PATCH 087/287] Translated using Weblate (Vietnamese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/ --- src/strings/vi.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/vi.json b/src/strings/vi.json index db5ee4b7d5..5834189e40 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -1925,5 +1925,6 @@ "HeaderSplitMedia": "Tách Phương Tiện Riêng Biệt", "Creators": "Người tạo", "IndexNumber": "Số Chỉ Mục", - "NoCastTargets": "Không có mục tiêu sử dụng" + "NoCastTargets": "Không có mục tiêu sử dụng", + "MessageNoEpisodesFound": "Hiện chưa có tập nào." } From b2b09f887e60f6f2c77e483f4c4b4c6ec1c5d336 Mon Sep 17 00:00:00 2001 From: Translation expert Date: Thu, 16 Jul 2026 19:03:58 -0400 Subject: [PATCH 088/287] Translated using Weblate (Arabic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ar/ --- src/strings/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/ar.json b/src/strings/ar.json index ee4c754c85..67580a6c3b 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -1914,7 +1914,7 @@ "CardSettings": "اعدادت البطاقة", "ConfirmDeleteItemByName": "حذف\"{0}\" سيقوم بحذفه من نظام الملفات و مكتبك وسائطك معا. هل انت متأكد من رغبتك في المتابعة؟", "ConfirmStillWatching": "هل مازلت تشاهد؟", - "Disabled": "مثبّط", + "Disabled": "معطّل", "LabelOriginalLanguage": "لغة أصلية", "OriginalLanguage": "لغة أصلية", "StillWatchingPrompt": "ملقم متابعة المشاهدة", From e968e90de1a9d6de33d8b7141329044435613ae9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabi=C3=A1n=20Sanhueza?= Date: Thu, 16 Jul 2026 18:22:16 -0400 Subject: [PATCH 089/287] Translated using Weblate (Spanish (Latin America)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es_419/ --- src/strings/es_419.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/strings/es_419.json b/src/strings/es_419.json index 9790f42d68..c268b57c4b 100644 --- a/src/strings/es_419.json +++ b/src/strings/es_419.json @@ -1701,5 +1701,19 @@ "AudioSampleRateNotSupported": "La frecuencia de muestreo del audio no es compatible", "AnamorphicVideoNotSupported": "El video anamórfico no es compatible", "Trickplay": "Trickplay", - "LabelTrickplayAccel": "Habilitar decodificación por hardware" + "LabelTrickplayAccel": "Habilitar decodificación por hardware", + "ActivitiesLoadError": "Hubo un error al cargar las actividades", + "ApiKeysLoadError": "Error al cargar las API keys", + "Authors": "Autores", + "BrandingLoadError": "Error al cargar los ajustes de branding", + "CardSettings": "Ajustes de tarjeta", + "ConfirmSplitMedia": "¿Está seguro de que desea dividir los archivos multimedia en ítems independientes?", + "ConfirmStillWatching": "¿Sigue mirando?", + "ContinueReading": "Continuar leyendo", + "Creators": "Creadores", + "DevicesLoadError": "Error al cargar dispositivos", + "Disabled": "Deshabilitado", + "HeaderLatestBooks": "Libros añadidos recientemente", + "HeaderLatestMusicVideos": "Videos musicales añadidos recientemente", + "HeaderSplitMedia": "Separar Archivo Multimedia" } From 7b5580a09fb9e45f3188e113cf4fee7063e32e3d Mon Sep 17 00:00:00 2001 From: Ekaterine Papava Date: Fri, 17 Jul 2026 00:52:15 -0400 Subject: [PATCH 090/287] Translated using Weblate (Georgian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ka/ --- src/strings/ka.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/strings/ka.json b/src/strings/ka.json index 038ddbb897..dc67927571 100644 --- a/src/strings/ka.json +++ b/src/strings/ka.json @@ -1457,5 +1457,17 @@ "OnlyImageFormats": "მხოლოდ გამოსახულების ფორმატები (VobSub, PGS, SUB)", "OptionAllowAudioPlaybackTranscoding": "იმ ხმის დაკვრის დაშვება, რომელსაც ტრანსკოდირება სჭირდება", "OptionAllowRemoteControlOthers": "სხვა მომხმარებლების დაშორებული კონტროლის დაშვება", - "OptionAllowRemoteSharedDevices": "გაზიარებული მოწყობილობების დაშორებული მართვის დაშვება" + "OptionAllowRemoteSharedDevices": "გაზიარებული მოწყობილობების დაშორებული მართვის დაშვება", + "Disabled": "გათიშულია", + "Remuxing": "რემუქსი", + "Creators": "შემქმნელები", + "CardSettings": "ბარათის პარმაეტრები", + "LabelOriginalLanguage": "ორიგინალი ენა", + "OriginalLanguage": "ორიგინალი ენა", + "StopWatching": "ყურების შეწყვეტა", + "IndexNumber": "ინდექსის ნომერი", + "StillWatchingPrompt": "კითხვა, ჯერ კიდევ უყურებთ, თუ არა", + "TableOfContents": "სარჩევი", + "HeaderSplitMedia": "მედიის დაშლა ნაწილებად", + "ConfirmStillWatching": "ჯერ კიდევ უყურებთ?" } From 9d936b2085ae1368caf911be63f6d2ef4a09a564 Mon Sep 17 00:00:00 2001 From: dkanada Date: Fri, 17 Jul 2026 19:40:39 +0900 Subject: [PATCH 091/287] invert layout state to match RTL toggle behavior --- src/plugins/bookPlayer/BookOsd/BookOsd.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/bookPlayer/BookOsd/BookOsd.tsx b/src/plugins/bookPlayer/BookOsd/BookOsd.tsx index 04eac9ef18..fe5e753c40 100644 --- a/src/plugins/bookPlayer/BookOsd/BookOsd.tsx +++ b/src/plugins/bookPlayer/BookOsd/BookOsd.tsx @@ -41,7 +41,7 @@ const BookOsd: FC = ({ const settings = userSettings.getComicsPlayerSettings(item.Id!) as ComicsPlayerSettings; const [direction, setDirection] = useState(settings.langDir === 'rtl'); - const [layout, setLayout] = useState(settings.pagesPerView === 1); + const [layout, setLayout] = useState(settings.pagesPerView === 2); const [fullscreen, setFullscreen] = useState(false); const onClickDirection = useCallback(() => { From 6aa203a91d230bebc3d4b1fe074790e7327413b5 Mon Sep 17 00:00:00 2001 From: dkanada Date: Fri, 17 Jul 2026 23:23:59 +0900 Subject: [PATCH 092/287] fix several issues with book navigation --- src/plugins/bookPlayer/plugin.js | 3 +-- src/plugins/pdfPlayer/plugin.js | 6 +++--- src/plugins/pdfPlayer/style.scss | 9 ++++++++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/plugins/bookPlayer/plugin.js b/src/plugins/bookPlayer/plugin.js index f200dee04e..780c4815ad 100644 --- a/src/plugins/bookPlayer/plugin.js +++ b/src/plugins/bookPlayer/plugin.js @@ -193,8 +193,7 @@ export class BookPlayer { this.rendition?.on('keydown', this.onWindowKeyDown); if (browser.safari) { - const player = document.querySelector('.bookOsd'); - this.addSwipeGestures(player); + this.addSwipeGestures(document.querySelector('#bookPlayerContainer')); } else { this.rendition?.on('rendered', (e, i) => this.addSwipeGestures(i.document.documentElement)); } diff --git a/src/plugins/pdfPlayer/plugin.js b/src/plugins/pdfPlayer/plugin.js index 2189ccecab..c857aef9f4 100644 --- a/src/plugins/pdfPlayer/plugin.js +++ b/src/plugins/pdfPlayer/plugin.js @@ -142,13 +142,13 @@ export class PdfPlayer { bindEvents() { this.mediaElement?.addEventListener('close', this.onDialogClosed, { once: true }); document.addEventListener('keydown', this.onWindowKeyDown); - document.addEventListener('touchstart', this.onTouchStart); + document.querySelector('#container')?.addEventListener('touchstart', this.onTouchStart); } unbindEvents() { this.mediaElement?.removeEventListener('close', this.onDialogClosed); document.removeEventListener('keydown', this.onWindowKeyDown); - document.removeEventListener('touchstart', this.onTouchStart); + document.querySelector('#container')?.removeEventListener('touchstart', this.onTouchStart); } createMediaElement(options) { @@ -169,7 +169,7 @@ export class PdfPlayer { }); elem.id = 'pdfPlayer'; - elem.innerHTML = '
'; + elem.innerHTML = '
'; dialogHelper.open(elem); } diff --git a/src/plugins/pdfPlayer/style.scss b/src/plugins/pdfPlayer/style.scss index cfe79d167a..c648339f0c 100644 --- a/src/plugins/pdfPlayer/style.scss +++ b/src/plugins/pdfPlayer/style.scss @@ -1,3 +1,11 @@ +#container { + position: relative; + display: grid; + place-items: center; + top: 5vh; + height: 90vh; +} + #pdfPlayer { position: relative; height: 100%; @@ -8,7 +16,6 @@ #canvas { position: relative; - top: 5vh; display: block; margin: auto; } From 9df3334760a331999482c36b2390b1b249cad7fd Mon Sep 17 00:00:00 2001 From: theguymadmax Date: Fri, 17 Jul 2026 13:19:16 -0400 Subject: [PATCH 093/287] Add version restore warning --- .../features/backups/components/RestoreConfirmationDialog.tsx | 2 +- src/strings/en-us.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apps/dashboard/features/backups/components/RestoreConfirmationDialog.tsx b/src/apps/dashboard/features/backups/components/RestoreConfirmationDialog.tsx index ee80686bae..d5a042988b 100644 --- a/src/apps/dashboard/features/backups/components/RestoreConfirmationDialog.tsx +++ b/src/apps/dashboard/features/backups/components/RestoreConfirmationDialog.tsx @@ -26,7 +26,7 @@ const RestoreConfirmationDialog: FunctionComponent = ({ open, onClose, o - + {globalize.translate('MessageRestoreDisclaimer')} diff --git a/src/strings/en-us.json b/src/strings/en-us.json index 7e7dcbc268..a1a5a535fb 100755 --- a/src/strings/en-us.json +++ b/src/strings/en-us.json @@ -1208,7 +1208,7 @@ "MessageReenableUser": "See below to reenable", "MessageRenameMediaFolder": "Renaming a media library will cause all metadata to be lost, proceed with caution.", "MessageRepositoryInstallDisclaimer": "WARNING: Installing a third party plugin repository carries risks. It may contain unstable or malicious code, and may change at any time. Only install repositories from authors that you trust.", - "MessageRestoreDisclaimer": "WARNING: You are about to restore from a previous backup. Your server will be rendered unusable for the duration of the process and any new data created since the backup will be lost.", + "MessageRestoreDisclaimer": "WARNING: You are about to restore from a previous backup. Your server will be rendered unusable for the duration of the process and any new data created since the backup will be lost.\n\nBackups should only be restored to the same version they were created on. Restoring a backup to a different version is unsupported and may render the server unusable.", "MessageRestoreInProgress": "Restore in progress", "MessageRestoreSuccess": "Restore successfully completed", "MessageSent": "Message sent.", From 44ef9296b6296c9446d0cc986374e670d711ccc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=84=A1=E6=83=85=E5=A4=A9?= Date: Sat, 18 Jul 2026 04:44:12 -0400 Subject: [PATCH 094/287] Translated using Weblate (Chinese (Simplified Han script)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 893100e6ac..1d2e03b839 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1925,5 +1925,6 @@ "Creators": "主创人员", "HeaderSplitMedia": "拆分媒体", "IndexNumber": "索引编号", - "NoCastTargets": "无可用投屏设备" + "NoCastTargets": "无可用投屏设备", + "MessageNoEpisodesFound": "暂无剧集可供观看。" } From 15628e6c0db96f5bb97e742b82018ac965ec0d49 Mon Sep 17 00:00:00 2001 From: krvi Date: Sat, 18 Jul 2026 10:26:08 -0400 Subject: [PATCH 095/287] Translated using Weblate (Faroese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fo/ --- src/strings/fo.json | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index ea6199e5ae..2de259b986 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -3,9 +3,9 @@ "Actor": "Sjónleikari", "Add": "Legg afturat", "AddedOnValue": "{0} lagt afturat", - "AddToCollection": "Koyr í samling", - "AddToFavorites": "Legg til yndislistan", - "AddToPlaylist": "Legg til spælilistan", + "AddToCollection": "Legg í samling", + "AddToFavorites": "Legg á yndislistan", + "AddToPlaylist": "Legg á spælilista", "Alerts": "Ávaringar", "All": "Øll", "AllEpisodes": "Allir partar", @@ -19,9 +19,9 @@ "Unknown": "Ókend", "TonemappingModeHelp": "Vel tónaavmyndingarháttin. Um tú verður fyri útblástum hálýsingum, royn so heldur RGB-støðuna.", "Unreleased": "Ikki latið út enn", - "AlbumArtist": "Album Listafólk", + "AlbumArtist": "Plátulistafólk", "AllChannels": "Allar rásir", - "AllComplexFormats": "Allar Kompleksu Formatir (ASS, SSA, VobSub, PGS, SUB, IDX, ...)", + "AllComplexFormats": "Øll fjølbroytt forsnið (ASS, SSA, VobSub, PGS, SUB, IDX, ...)", "Directors": "Leikstjórar", "AgeValue": "({0} ára gamalt)", "AllLibraries": "Øll søvn", @@ -39,18 +39,18 @@ "HeaderError": "Feilur", "HeaderForKids": "Fyri Børn", "AllowSegmentDeletion": "Strika partar", - "LabelThrottleDelaySeconds": "Kyrkja", - "AllowMediaConversion": "miðla", - "AllowOnTheFlySubtitleExtraction": "undirteksta", + "LabelThrottleDelaySeconds": "", + "AllowMediaConversion": "Loyv miðlaformbroytan", + "AllowOnTheFlySubtitleExtraction": "", "AllowCollectionManagement": "brúkara", "AllowFfmpegThrottling": "Kyrkja", "AllowFfmpegThrottlingHelp": "umkoding avspæling avspælingar", - "AllowSegmentDeletionHelp": "avspælingar", - "LabelSegmentKeepSecondsHelp": "Kyrkja parta.", - "AllowHWTranscodingHelp": "avkoda ambætarinum", - "AllowMediaConversionHelp": "miðla", - "AllowOnTheFlySubtitleExtractionHelp": "Íkervnir undirtekstir avspæling íkervnar undirtekstir", - "AllowRemoteAccess": "ambætaran", + "AllowSegmentDeletionHelp": "", + "LabelSegmentKeepSecondsHelp": "", + "AllowHWTranscodingHelp": "", + "AllowMediaConversionHelp": "", + "AllowOnTheFlySubtitleExtractionHelp": "", + "AllowRemoteAccess": "Loyv fjaratgongd til hendan ambætaran", "HeaderPassword": "Loyniorð", "HeaderLibraries": "Søvn", "HeaderParentalRatings": "Aldursmark", @@ -60,12 +60,12 @@ "LabelArtists": "Listafólk", "LabelCountry": "Land", "LabelDeveloper": "Mennari", - "Absolute": "Absolut", + "Absolute": "", "AddToPlayQueue": "Legg til spæl bíðirøð", - "AirDate": "Útgávu ár", + "AirDate": "Útgávu dagur", "Aired": "Útgivið", - "Album": "Album", - "Albums": "Album", + "Album": "Plátuútgáva", + "Albums": "Plátur", "LabelSegmentKeepSeconds": "Tíð at halda petti", "AroundTime": "Umleið {0}", "Ascending": "Hækkandi", @@ -165,7 +165,7 @@ "SubtitleGray": "Grátt", "SubtitleLightGray": "Ljósagráður", "SubtitleMagenta": "Viólreyður", - "AllowedRemoteAddressesHelp": "Komma býttur listið av IP addressum ella IP/netmask inngangur fyri netverk, ið verða loyvd at fjarbinda. Um hesin teigur er blankur, so eru allar fjar addressur loyvdar.", + "AllowedRemoteAddressesHelp": "Kommaskiltur listið av IP-atsetrum ella IP/netsíla av netum, ið verða loyvd at fjarbinda. Er hesin teigur blankur eru øll fjaratsetur loyvd.", "SubtitleWhite": "Hvítt", "Arranger": "Fyrireikari", "SubtitleYellow": "Gult", @@ -208,7 +208,9 @@ "Favorites": "Yndis", "Folders": "Mappur", "Collections": "Søvn", - "Default": "Sjálvgildi", + "Default": "Forsett", "Genres": "Greinar", - "AirPlay": "AirPlay" + "AirPlay": "AirPlay", + "Photos": "Ljósmyndir", + "AndOtherArtists": "{0} og {1} onnur listafólk." } From ecac7279c077276d01b1c71d167c5c0e1f4ed96e Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 18 Jul 2026 10:26:27 -0400 Subject: [PATCH 096/287] Update translation files Updated by "Remove blank strings" hook in Weblate. Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ --- src/strings/fo.json | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index 2de259b986..56daf0d6bf 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -39,17 +39,10 @@ "HeaderError": "Feilur", "HeaderForKids": "Fyri Børn", "AllowSegmentDeletion": "Strika partar", - "LabelThrottleDelaySeconds": "", "AllowMediaConversion": "Loyv miðlaformbroytan", - "AllowOnTheFlySubtitleExtraction": "", "AllowCollectionManagement": "brúkara", "AllowFfmpegThrottling": "Kyrkja", "AllowFfmpegThrottlingHelp": "umkoding avspæling avspælingar", - "AllowSegmentDeletionHelp": "", - "LabelSegmentKeepSecondsHelp": "", - "AllowHWTranscodingHelp": "", - "AllowMediaConversionHelp": "", - "AllowOnTheFlySubtitleExtractionHelp": "", "AllowRemoteAccess": "Loyv fjaratgongd til hendan ambætaran", "HeaderPassword": "Loyniorð", "HeaderLibraries": "Søvn", @@ -60,7 +53,6 @@ "LabelArtists": "Listafólk", "LabelCountry": "Land", "LabelDeveloper": "Mennari", - "Absolute": "", "AddToPlayQueue": "Legg til spæl bíðirøð", "AirDate": "Útgávu dagur", "Aired": "Útgivið", From 48d56a62485532ecd07388971f8afd1d874e13c2 Mon Sep 17 00:00:00 2001 From: krvi Date: Sat, 18 Jul 2026 10:38:32 -0400 Subject: [PATCH 097/287] Translated using Weblate (Faroese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fo/ --- src/strings/fo.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index 56daf0d6bf..859d4ecb01 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -161,7 +161,7 @@ "SubtitleWhite": "Hvítt", "Arranger": "Fyrireikari", "SubtitleYellow": "Gult", - "AskAdminToCreateLibrary": "Bið ein fyrisitari upprætta eitt savn.", + "AskAdminToCreateLibrary": "Bið ein umsitara stovna eitt savn.", "TabAccess": "Atgongd", "TypeOptionPluralEpisode": "Partar", "TitlePlayback": "Avspæling", @@ -204,5 +204,6 @@ "Genres": "Greinar", "AirPlay": "AirPlay", "Photos": "Ljósmyndir", - "AndOtherArtists": "{0} og {1} onnur listafólk." + "AndOtherArtists": "{0} og {1} onnur listafólk.", + "Authors": "Høvundar" } From 5ef47f867e26ed03da494c33df85cf9446028b45 Mon Sep 17 00:00:00 2001 From: krvi Date: Sat, 18 Jul 2026 10:43:32 -0400 Subject: [PATCH 098/287] Translated using Weblate (Faroese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fo/ --- src/strings/fo.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index 859d4ecb01..339bcd2381 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -205,5 +205,7 @@ "AirPlay": "AirPlay", "Photos": "Ljósmyndir", "AndOtherArtists": "{0} og {1} onnur listafólk.", - "Authors": "Høvundar" + "Authors": "Høvundar", + "Author": "Høvundur", + "Authorize": "Samgilda" } From 9888880480071a15234325466ccc39bb1c5edca0 Mon Sep 17 00:00:00 2001 From: MrPlow Date: Sat, 18 Jul 2026 11:24:34 -0400 Subject: [PATCH 099/287] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/de.json b/src/strings/de.json index f0283216dc..fbacbf1716 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1926,5 +1926,5 @@ "Creators": "Ersteller", "IndexNumber": "Indexnummer", "NoCastTargets": "Keine Ziele zum Casten verfügbar", - "MessageNoEpisodesFound": "Es sind gerade keine Episoden verfügbar." + "MessageNoEpisodesFound": "Es sind gerade keine Folgen verfügbar." } From d2d7fbfcb9164aee7d2d583b8c9c7c6d8f71367f Mon Sep 17 00:00:00 2001 From: krvi Date: Sat, 18 Jul 2026 12:24:45 -0400 Subject: [PATCH 100/287] Translated using Weblate (Faroese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fo/ --- src/strings/fo.json | 61 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index 339bcd2381..c942fac75b 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -207,5 +207,64 @@ "AndOtherArtists": "{0} og {1} onnur listafólk.", "Authors": "Høvundar", "Author": "Høvundur", - "Authorize": "Samgilda" + "Authorize": "Samgilda", + "Backdrop": "Bakgrund", + "BirthDateValue": "Fødd(ur): {0}", + "BirthLocation": "Føðistaður", + "BirthPlaceValue": "Føðistaður: {0}", + "BoxRear": "Húsi (baksíða)", + "Box": "Húsi", + "ButtonActivate": "Virkja", + "ButtonArrowLeft": "Vinstri", + "ButtonArrowRight": "Høgri", + "ButtonAudioTracks": "Ljóðspor", + "ButtonBack": "Aftur", + "ButtonChangeServer": "Skift ambætara", + "ButtonEditUser": "Broyt brúkara", + "ButtonGotIt": "Eg skilji", + "ButtonLearnMore": "Frætt meira", + "ButtonRename": "Nýnevn", + "ClientSettings": "Viðskiftarastillingar", + "ConfirmDeleteImage": "Strika mynd?", + "ConfirmStillWatching": "Hyggur tú framvegis?", + "Console": "Stýristøð", + "Copied": "Avritað", + "Copy": "Avrita", + "CopyStreamURLSuccess": "Leinkjan er avritað.", + "CoverArtist": "Tøkulistafólk", + "Delete": "Strika", + "DeleteEntireSeries": "Strika {0} partar", + "DeleteImage": "Strika mynd", + "DeleteLyrics": "Strika sangtekst", + "DeleteEpisode": "Strika part", + "DeleteName": "Strika {0}", + "DeleteUser": "Strika brúkara", + "DeleteUserConfirmation": "Ynskir tú at strika hendan brúkaran?", + "DeleteServerConfirmation": "Ynskir tú at strika hendan ambætaran?", + "Descending": "Lækkandi", + "DirectPlayHelp": "Keldufílan hevur fult sínamillumvirkni við hendan viðskiftaran og verður hon móttikin uttan broytingar.", + "EnablePlugin": "Virkja", + "DisablePlugin": "Óvirkja", + "Disabled": "Óvirkt", + "Down": "Niður", + "DownloadManager": "Niðurtøkur", + "DownloadsValue": "{0} niðurtøkur", + "Edit": "Broyt", + "Editor": "Ritstjóri", + "EditLyrics": "Broyt sangtekst", + "EditMetadata": "Broyt metadátur", + "EditSubtitles": "Broyt undirtekstir", + "EnableAutoCast": "Set sum forsett", + "Ended": "Endað", + "Engineer": "Ljóðblandari", + "Episode": "Partur", + "Episodes": "Partar", + "EveryHour": "Hvønn tíma", + "EveryNDays": "{0}. hvønn dag", + "EveryXHours": "{0}. hvønn tíma", + "EveryXMinutes": "{0}. hvønn minutt", + "File": "Fíla", + "FileNotFound": "Fílan varð ikki funnin.", + "FormatValue": "Forsnið: {0}", + "Genre": "Grein" } From ef9ced13545e13139fc97a8eb99fa779fed00474 Mon Sep 17 00:00:00 2001 From: krvi Date: Sat, 18 Jul 2026 14:25:44 -0400 Subject: [PATCH 101/287] Translated using Weblate (Faroese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fo/ --- src/strings/fo.json | 82 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 3 deletions(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index c942fac75b..66b5a793f3 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -37,7 +37,7 @@ "HeaderAdmin": "Umsiting", "HeaderDevices": "Eindir", "HeaderError": "Feilur", - "HeaderForKids": "Fyri Børn", + "HeaderForKids": "Fyri børn", "AllowSegmentDeletion": "Strika partar", "AllowMediaConversion": "Loyv miðlaformbroytan", "AllowCollectionManagement": "brúkara", @@ -46,7 +46,7 @@ "AllowRemoteAccess": "Loyv fjaratgongd til hendan ambætaran", "HeaderPassword": "Loyniorð", "HeaderLibraries": "Søvn", - "HeaderParentalRatings": "Aldursmark", + "HeaderParentalRatings": "Aldursmørk", "HeaderSecondsValue": "{0} sekund", "HeaderSendMessage": "Send boð", "Kids": "Børn", @@ -266,5 +266,81 @@ "File": "Fíla", "FileNotFound": "Fílan varð ikki funnin.", "FormatValue": "Forsnið: {0}", - "Genre": "Grein" + "Genre": "Grein", + "GuestStar": "Gestaframførsla", + "HeaderActiveDevices": "Virknar eindir", + "HeaderApiKey": "API-lykil", + "HeaderApiKeys": "API-lyklar", + "HeaderApp": "App", + "HeaderAudioBooks": "Ljóðbøkur", + "HeaderAudioSettings": "Ljóðstillingar", + "HeaderCastAndCrew": "Leikarar og manning", + "HeaderConfirmPluginInstallation": "Vátta ískoytisforritsinnleggjan", + "HeaderDeleteDevices": "Strika allar eindir", + "HeaderDeleteLyrics": "Strika sangtekstir", + "HeaderFrequentlyPlayed": "Javnan spælt", + "HeaderHttpsSettings": "HTTPS-stillingar", + "HeaderLatestBooks": "Nýliga innlagdar bøkur", + "HeaderLatestEpisodes": "Nýliga innlagdir partar", + "HeaderLatestMedia": "Nýliga innlagdir miðlar", + "HeaderLatestMovies": "Nýliga innlagdir filmar", + "HeaderLatestMusic": "Nýliga innlagdur tónleikur", + "HeaderMetadataSettings": "Metadátustillingar", + "HeaderNewDevices": "Nýggjar eindir", + "HeaderNextEpisode": "Næsti partur", + "HeaderPhotoAlbums": "Myndabøkur", + "HeaderPleaseSignIn": "Vinaliga rita inn", + "HeaderSortBy": "Raða eftir", + "HeaderUninstallPlugin": "Strika ískoytisforrit", + "HeaderUpdateRequired": "Dagføring neyðug", + "HeaderUploadImage": "Uppsend mynd", + "HeaderUploadLyrics": "Uppsend sangtekstir", + "HeaderUploadSubtitle": "Uppsend undirtekst", + "HeaderUser": "Brúkari", + "HeaderUsers": "Brúkarir", + "HeaderVideoQuality": "Myndagóðska", + "HeaderYears": "Ár", + "Help": "Hjálp", + "Hide": "Fjal", + "Horizontal": "Vatnrætt", + "Illustrator": "Myndprýðari", + "Image": "Mynd", + "Images": "Myndir", + "Inker": "Málari", + "InstallingPackage": "Innleggur {0} (útgávu {1})", + "LabelAccessDay": "Vikudagur", + "LabelBirthDate": "Føðidagur", + "LabelBirthYear": "Føðiár", + "LabelCache": "Kovi", + "LabelCurrentPassword": "Núverandi loyniorð", + "LabelDatabase": "Dátugrunnur", + "LabelDay": "Vikudagur", + "LabelDevice": "Eind", + "LabelDisplayLanguageHelp": "Týðing av Jellyfin er ein áhaldandi verkætlan.", + "LabelChapterImageResolution": "Loysni", + "LabelEnableHttps": "Virkja HTTPS", + "LabelEnableIP4": "Virkja IPv4", + "LabelEnableIP6": "Virkja IPv6", + "LabelEnableIP6Help": "Virkja IPv6 virkisføri.", + "LabelEnableIP4Help": "Virkja IPv4 virkisføri.", + "LabelEnablePlugin": "Virkja ískoytisforrit", + "LabelFileOrUrl": "Fíla ella leinkja", + "LabelFolder": "Skjátta", + "LabelFont": "Stavsnið", + "LabelInstalled": "Innløgd", + "LabelLanNetworks": "Nærnet", + "LabelLogs": "Gerðalistar", + "LabelMetadata": "Metadátur", + "LabelNewPassword": "Nýtt loyniorð", + "LabelNewPasswordConfirm": "Endurtak nýggja loyniorðið", + "LabelNotInstalled": "Ikki innlagt", + "LabelParentalRating": "Aldursmark", + "LabelPassword": "Loyniorð", + "LabelPasswordRecoveryPinCode": "PIN-kota", + "LabelPath": "Leið", + "LabelPersonRole": "Leiklutur", + "LabelPlaceOfBirth": "Føðistaður", + "LabelQsvDevice": "QSV-eind", + "LabelReleaseDate": "Útgávudagur", + "LabelServerHost": "Vertur" } From c36fdef6426590cf8c043a6b2cec3d210f6d2cdc Mon Sep 17 00:00:00 2001 From: krvi Date: Sat, 18 Jul 2026 14:36:35 -0400 Subject: [PATCH 102/287] Translated using Weblate (Faroese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fo/ --- src/strings/fo.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index 66b5a793f3..6241b24d72 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -342,5 +342,20 @@ "LabelPlaceOfBirth": "Føðistaður", "LabelQsvDevice": "QSV-eind", "LabelReleaseDate": "Útgávudagur", - "LabelServerHost": "Vertur" + "LabelServerHost": "Vertur", + "LabelServerHostHelp": "192.168.1.100:8096 ella https://mínambætari.fo", + "LabelServerVersion": "Ambætaraútgáva", + "LabelSortBy": "Raða eftir", + "LabelTag": "Spjaldur", + "Bold": "Feitt", + "LabelUser": "Brúkari", + "LabelUsername": "Brúkaranavn", + "LabelVaapiDevice": "VA-API-eind", + "LabelVersion": "Útgáva", + "LabelVersionInstalled": "{0} innløgd", + "LabelYear": "Ár", + "LabelZipCode": "Postnummar", + "ListPaging": "{0}-{1} av {2}", + "Live": "Beinleiðis", + "LiveTV": "Beinleiðis sjónvarp" } From f00d43753ff4700b02e80a856111c734ee500588 Mon Sep 17 00:00:00 2001 From: krvi Date: Sat, 18 Jul 2026 16:54:08 -0400 Subject: [PATCH 103/287] Translated using Weblate (Faroese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fo/ --- src/strings/fo.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index 6241b24d72..b6dadbf2c5 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -357,5 +357,12 @@ "LabelZipCode": "Postnummar", "ListPaging": "{0}-{1} av {2}", "Live": "Beinleiðis", - "LiveTV": "Beinleiðis sjónvarp" + "LiveTV": "Beinleiðis sjónvarp", + "MediaInfoAspectRatio": "Støddarlutfall", + "MediaInfoDefault": "Forsett", + "MediaInfoPath": "Leið", + "MediaInfoResolution": "Loysni", + "MediaSegmentAction.None": "Einki", + "MediaSegmentAction.Skip": "Leyp um", + "MediaSegmentType.Commercial": "Lýsing" } From d1f470df32ee3213b5c76f68a5e3e8e4750708f9 Mon Sep 17 00:00:00 2001 From: krvi Date: Sat, 18 Jul 2026 17:47:52 -0400 Subject: [PATCH 104/287] Translated using Weblate (Faroese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fo/ --- src/strings/fo.json | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index b6dadbf2c5..98918606b8 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -364,5 +364,18 @@ "MediaInfoResolution": "Loysni", "MediaSegmentAction.None": "Einki", "MediaSegmentAction.Skip": "Leyp um", - "MediaSegmentType.Commercial": "Lýsing" + "MediaSegmentType.Commercial": "Lýsing", + "MessageWaitingForServer": "Bíðar eftir ambætara...", + "MillisecondsUnit": "ms", + "Monday": "Mánadag", + "Movies": "Filmar", + "MoviesAndShows": "Filmar og røðir", + "MusicAlbum": "Tónleikaútgáva", + "Mute": "Doyv", + "NewEpisodes": "Nýggir partar", + "No": "Nei", + "NumLocationsValue": "{0} skjáttur", + "Option3D": "3D", + "OptionBluray": "BD", + "OptionDaily": "Dagliga" } From 2f9d69e843dfbff7b6f74f8f399e5176073dfacd Mon Sep 17 00:00:00 2001 From: krvi Date: Sat, 18 Jul 2026 18:18:52 -0400 Subject: [PATCH 105/287] Translated using Weblate (Faroese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fo/ --- src/strings/fo.json | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index 98918606b8..a405a0dc66 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -61,16 +61,16 @@ "LabelSegmentKeepSeconds": "Tíð at halda petti", "AroundTime": "Umleið {0}", "Ascending": "Hækkandi", - "SearchForMissingMetadata": "Leita eftir manglandi metadata", - "SearchForSubtitles": "Leita eftir undirtekstið", + "SearchForMissingMetadata": "Leita eftir vantandi metadátum", + "SearchForSubtitles": "Leita eftir undirtekstum", "SearchResults": "Leitiúrslit", "SelectServer": "Vel ambætara", "SendMessage": "Send boð", - "Season": "Sesong", - "SeriesDisplayOrderHelp": "Raða partar eftir dato, DVD ordan ella absolut nummerering.", + "Season": "", + "SeriesDisplayOrderHelp": "", "ServerNameIsRestarting": "Ambætarin á {0} endurbyrjar.", "ServerNameIsShuttingDown": "Ambætarin á {0} sløknar.", - "ServerUpdateNeeded": "Hesin ambætarin má dagførast. Fyri at heinta nýggjastu útgávuna, vinarliga vitja {0}.", + "ServerUpdateNeeded": "Hesin ambætarin noyðist at dagførast. Vinaliga vitja {0}, til tess at heinta nýggjastu útgávuna.", "Share": "Býta", "ShowIndicatorsFor": "Vís indikator fyri", "ShowLess": "Vís minni", @@ -144,14 +144,14 @@ "SimultaneousConnectionLimitHelp": "Mest loyvda antalið av samstundis stroymingum. Skriva 0 fyri einki hámark.", "Settings": "Stillingar", "SettingsSaved": "Stillingar eru goymdar.", - "SelectAdminUsername": "Vinarliga vel eitt brúkaranavn til fyrisitara kontu.", + "SelectAdminUsername": "Vinaliga vel eitt brúkaranavn til umsitarakontuna.", "Series": "Røð", "SeriesCancelled": "Røðin er steðga.", "Search": "Leita", - "SearchForCollectionInternetMetadata": "Leita eftir list og metadata á alnótini", - "SeriesSettings": "Røð stillingar", + "SearchForCollectionInternetMetadata": "Leita eftir list og metadátum á alnótini", + "SeriesSettings": "Røðstillingar", "SeriesYearToPresent": "{0} - Núverandi", - "ServerRestartNeededAfterPluginInstall": "Jellyfin má endurbyrjast, aftaná at eitt ískoytisforrit er lagt inn.", + "ServerRestartNeededAfterPluginInstall": "Jellyfin noyðist at endurbyrjast, eftir at eitt ískoytisforrit er innlagt.", "ShowAdvancedSettings": "Vís framkomnar stillingar", "StopPlayback": "Steðga avspæling", "SubtitleGray": "Grátt", @@ -377,5 +377,26 @@ "NumLocationsValue": "{0} skjáttur", "Option3D": "3D", "OptionBluray": "BD", - "OptionDaily": "Dagliga" + "OptionDaily": "Dagliga", + "OptionDisableUser": "Óvirkja hendan brúkaran", + "OptionDvd": "DVD", + "OptionHasThemeSong": "Eyðkennislag", + "OptionParentalRating": "Aldursmark", + "OptionReleaseDate": "Útgávudagur", + "OptionWeekdays": "Vikudagar", + "OptionWeekends": "Vikuskiftir", + "OptionWeekly": "Vikuliga", + "ParentalRating": "Aldursmark", + "Person": "Persónur", + "Premiere": "Frumsýning", + "Producer": "Framleiðslustjóri", + "RecommendationDirectedBy": "Leikstjórnað hevur {0}", + "ReleaseDate": "Útgávudagur", + "RememberMe": "Minst til mín", + "Repeat": "Endurtak", + "RepeatEpisodes": "Endurtak partar", + "Rewind": "Spola aftur", + "Saturday": "Leygardag", + "Save": "Goym", + "SavePassword": "Goym loyniorð" } From b3377931f03295719c10cb8e9e2134f714167193 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 18 Jul 2026 18:19:51 -0400 Subject: [PATCH 106/287] Update translation files Updated by "Remove blank strings" hook in Weblate. Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ --- src/strings/fo.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index a405a0dc66..cb1e7c8f24 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -66,8 +66,6 @@ "SearchResults": "Leitiúrslit", "SelectServer": "Vel ambætara", "SendMessage": "Send boð", - "Season": "", - "SeriesDisplayOrderHelp": "", "ServerNameIsRestarting": "Ambætarin á {0} endurbyrjar.", "ServerNameIsShuttingDown": "Ambætarin á {0} sløknar.", "ServerUpdateNeeded": "Hesin ambætarin noyðist at dagførast. Vinaliga vitja {0}, til tess at heinta nýggjastu útgávuna.", From 95b638e5844c0d256ebea5a4dbdcddc6bbf53869 Mon Sep 17 00:00:00 2001 From: krvi Date: Sat, 18 Jul 2026 18:34:46 -0400 Subject: [PATCH 107/287] Translated using Weblate (Faroese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fo/ --- src/strings/fo.json | 54 ++++++++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index cb1e7c8f24..a6694e2924 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -69,11 +69,11 @@ "ServerNameIsRestarting": "Ambætarin á {0} endurbyrjar.", "ServerNameIsShuttingDown": "Ambætarin á {0} sløknar.", "ServerUpdateNeeded": "Hesin ambætarin noyðist at dagførast. Vinaliga vitja {0}, til tess at heinta nýggjastu útgávuna.", - "Share": "Býta", - "ShowIndicatorsFor": "Vís indikator fyri", + "Share": "Deil", + "ShowIndicatorsFor": "", "ShowLess": "Vís minni", - "ShowMore": "Vís meiri", - "ShowParentImages": "Vís røð myndir", + "ShowMore": "Vís meira", + "ShowParentImages": "Vís røðmyndir", "Shuffle": "Blanda", "Shows": "Røðir", "ShowTitle": "Vís heitið", @@ -81,7 +81,7 @@ "SmallCaps": "Lítlir stavir", "Smaller": "Minni", "Songs": "Sangir", - "Sort": "Skipa", + "Sort": "Raða", "SpecialFeatures": "Serstøk eyðkenni", "StopRecording": "Steðga upptøku", "Studio": "Filmsfelag", @@ -89,29 +89,29 @@ "Subtitle": "Undirtekstur", "SubtitleCyan": "Blágrønur", "SubtitleGreen": "Grønt", - "SubtitleOffset": "Undirtekstur offset", + "SubtitleOffset": "", "SubtitleRed": "Reytt", - "Subtitles": "Undirtekstur", + "Subtitles": "Undirtekstir", "Suggestions": "Uppskot", - "SyncPlayGroupDefaultTitle": "{0}'sa bólkur", + "SyncPlayGroupDefaultTitle": "", "TabAdvanced": "Framkomin", - "TabDashboard": "Kunningarbretti", - "TabLatest": "Lagt afturat fyri stuttum", + "TabDashboard": "Yvirlitsskíggi", + "TabLatest": "Nýliga innlagt", "TabLogs": "Gerðalistar", "TabNetworking": "Net", - "TabNfoSettings": "NFO stillingar", + "TabNfoSettings": "NFO-stillingar", "TabPlugins": "Ískoytisforrit", "TabRepositories": "Goymslur", "TabServer": "Ambætari", "TabStreaming": "Stroyming", "TabUpcoming": "Komandi", - "Tags": "Frámerkir", - "TellUsAboutYourself": "Fortel um teg sjálvan", - "ThemeSongs": "Tema sangir", - "ThemeVideos": "Tema sjónbond", + "Tags": "Spjøldur", + "TellUsAboutYourself": "Fortel okkum um teg", + "ThemeSongs": "Eyðkennisløg", + "ThemeVideos": "", "ThumbCard": "Tummlakort", - "TitleHardwareAcceleration": "Tólbúnað ferðøking", - "TitleHostingSettings": "Hýsingastillingar", + "TitleHardwareAcceleration": "", + "TitleHostingSettings": "Hýsingarstillingar", "TrackCount": "{0} spor", "Trailers": "Forfilmar", "Tuesday": "Týsdag", @@ -136,7 +136,7 @@ "ValueOneSeries": "1 røð", "ValueSeconds": "{0} sekund", "ValueSeriesCount": "{0} røðir", - "Sports": "Ítróttur", + "Sports": "Ítróttir", "Smart": "Smart", "ShowYear": "Vís árið", "SimultaneousConnectionLimitHelp": "Mest loyvda antalið av samstundis stroymingum. Skriva 0 fyri einki hámark.", @@ -150,7 +150,7 @@ "SeriesSettings": "Røðstillingar", "SeriesYearToPresent": "{0} - Núverandi", "ServerRestartNeededAfterPluginInstall": "Jellyfin noyðist at endurbyrjast, eftir at eitt ískoytisforrit er innlagt.", - "ShowAdvancedSettings": "Vís framkomnar stillingar", + "ShowAdvancedSettings": "Vís víðkaðar stillingar", "StopPlayback": "Steðga avspæling", "SubtitleGray": "Grátt", "SubtitleLightGray": "Ljósagráður", @@ -165,12 +165,12 @@ "TitlePlayback": "Avspæling", "TabMusic": "Tónleikur", "TabOther": "Annað", - "TagsValue": "Frámerkir: {0}", - "TabParentalControl": "Foreldra ræði", + "TagsValue": "Spjøldur: {0}", + "TabParentalControl": "Foreldraræði", "Sunday": "Sunnudag", "SubtitleBlack": "Svart", "SubtitleBlue": "Blátt", - "TextSent": "Tekst sent.", + "TextSent": "Tekstur sendur.", "TheseSettingsAffectSubtitlesOnThisDevice": "Hesir stillingar ávirka undirteksir á hesari eindini", "Thumb": "Tummil", "Thursday": "Hósdagur", @@ -396,5 +396,13 @@ "Rewind": "Spola aftur", "Saturday": "Leygardag", "Save": "Goym", - "SavePassword": "Goym loyniorð" + "SavePassword": "Goym loyniorð", + "SortByValue": "Raða eftir {0}", + "StillWatchingOption": "{0} partar ella {1} minuttir", + "StorageType.CDRom": "CD-ROM", + "StorageType.Network": "Net", + "StorageType.Ram": "Ritminni", + "StorageType.Unknown": "Ókent", + "HeaderBackups": "Trygdaravrit", + "TableOfContents": "Innihaldsyvirlit" } From b57c74f17ab0d1cf8b81e17427b1b38f57cbbc35 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 18 Jul 2026 18:35:34 -0400 Subject: [PATCH 108/287] Update translation files Updated by "Remove blank strings" hook in Weblate. Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ --- src/strings/fo.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index a6694e2924..7d201d511c 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -70,7 +70,6 @@ "ServerNameIsShuttingDown": "Ambætarin á {0} sløknar.", "ServerUpdateNeeded": "Hesin ambætarin noyðist at dagførast. Vinaliga vitja {0}, til tess at heinta nýggjastu útgávuna.", "Share": "Deil", - "ShowIndicatorsFor": "", "ShowLess": "Vís minni", "ShowMore": "Vís meira", "ShowParentImages": "Vís røðmyndir", @@ -89,11 +88,9 @@ "Subtitle": "Undirtekstur", "SubtitleCyan": "Blágrønur", "SubtitleGreen": "Grønt", - "SubtitleOffset": "", "SubtitleRed": "Reytt", "Subtitles": "Undirtekstir", "Suggestions": "Uppskot", - "SyncPlayGroupDefaultTitle": "", "TabAdvanced": "Framkomin", "TabDashboard": "Yvirlitsskíggi", "TabLatest": "Nýliga innlagt", @@ -108,9 +105,7 @@ "Tags": "Spjøldur", "TellUsAboutYourself": "Fortel okkum um teg", "ThemeSongs": "Eyðkennisløg", - "ThemeVideos": "", "ThumbCard": "Tummlakort", - "TitleHardwareAcceleration": "", "TitleHostingSettings": "Hýsingarstillingar", "TrackCount": "{0} spor", "Trailers": "Forfilmar", From f8979408a1ded5f3aae82ef5f44f498b3be559f3 Mon Sep 17 00:00:00 2001 From: krvi Date: Sat, 18 Jul 2026 19:02:45 -0400 Subject: [PATCH 109/287] Translated using Weblate (Faroese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fo/ --- src/strings/fo.json | 50 ++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index 7d201d511c..b67a47fad2 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -10,14 +10,14 @@ "All": "Øll", "AllEpisodes": "Allir partar", "AllLanguages": "Øll tungumál", - "LabelTonemappingMode": "Tónaavmyndingarháttur", + "LabelTonemappingMode": "", "HearingImpairedShort": "Hoyriveik/SDH", - "MachineTranslated": "Maskin týðing", - "AiTranslated": "Vitlíkistýðing", - "AllowAv1Encoding": "Loyva koding í AV1 bygnaði", + "MachineTranslated": "Maskintýtt", + "AiTranslated": "Vitlíkistýtt", + "AllowAv1Encoding": "", "LabelIsHearingImpaired": "Til hoyriveik (SDH)", "Unknown": "Ókend", - "TonemappingModeHelp": "Vel tónaavmyndingarháttin. Um tú verður fyri útblástum hálýsingum, royn so heldur RGB-støðuna.", + "TonemappingModeHelp": "", "Unreleased": "Ikki latið út enn", "AlbumArtist": "Plátulistafólk", "AllChannels": "Allar rásir", @@ -112,10 +112,10 @@ "Tuesday": "Týsdag", "TV": "Sjónvarp", "TypeOptionPluralAudio": "Ljóð", - "TypeOptionPluralBoxSet": "Boks sett", - "TypeOptionPluralMusicAlbum": "Tónleika album", + "TypeOptionPluralBoxSet": "Bokssett", + "TypeOptionPluralMusicAlbum": "Tónleikaútgávur", "TypeOptionPluralMusicVideo": "Tónleikasjónbond", - "TypeOptionPluralSeason": "Sesongir", + "TypeOptionPluralSeason": "", "TypeOptionPluralVideo": "Sjónbond", "Typewriter": "Skrivimaskina", "Uniform": "Einsháttað", @@ -177,14 +177,14 @@ "TypeOptionPluralSeries": "Sjónvarpsrøðir", "UnknownError": "Ein ókendur feilur hendi.", "Unplayed": "Ikki spældur", - "Upload": "Send upp", - "UseEpisodeImagesInNextUp": "Brúka partamyndir í 'Komandi' og 'Hyggj víðari' teigum", + "Upload": "Uppsend", + "UseEpisodeImagesInNextUp": "Brúka partamyndir í 'Komandi' og 'Hygg víðari' teigum", "UserMenu": "Brúkara valmynd", - "ValueAlbumCount": "{0} album", + "ValueAlbumCount": "{0} útgávur", "ValueDiscNumber": "Fløga {0}", "ValueMusicVideoCount": "{0} tónleika sjónbond", - "ValueOneAlbum": "1 album", - "ValueOneSong": "1 sangur", + "ValueOneAlbum": "1 útgáva", + "ValueOneSong": "1 sang", "ValueSongCount": "{0} sangir", "ButtonForgotPassword": "Gloymt loyniorð", "ButtonSignIn": "Innrita", @@ -399,5 +399,27 @@ "StorageType.Ram": "Ritminni", "StorageType.Unknown": "Ókent", "HeaderBackups": "Trygdaravrit", - "TableOfContents": "Innihaldsyvirlit" + "TableOfContents": "Innihaldsyvirlit", + "UninstallPluginConfirmation": "Ynskir tú at strikað {0}?", + "Vertical": "Loddrætt", + "Watched": "", + "Wednesday": "Mikudag", + "WeeklyAt": "{0} klokkan {1}", + "WelcomeToProject": "Vælkomin til Jellyfin!", + "WriteAccessRequired": "Jellyfin tørvar skrivirættindi til hesa skjáttuna, Vinaliga tryggjað skrivirættindi og royn aftur.", + "Yes": "Ja", + "Yesterday": "Í gjár", + "AspectRatioCover": "Surra", + "AspectRatioFill": "Spenn", + "Short": "Stuttfilmur", + "Trailer": "Forfilmur", + "BehindTheScenes": "Fyri aftan leiktjøldini", + "Interview": "Samrøða", + "ThemeSong": "Eyðkennislag", + "PriorityHigh": "Høgt", + "PriorityAboveNormal": "Yvir vanligt", + "PriorityNormal": "Vanligt", + "PriorityBelowNormal": "Undir vanligt", + "LabelJpegQuality": "JPEG-góðska", + "LabelTrickplayThreads": "FFmpeg træðrir" } From 3d7adb53480f02164041fdd983b3f7abc28d0fd9 Mon Sep 17 00:00:00 2001 From: Weblate Date: Sat, 18 Jul 2026 20:26:26 -0400 Subject: [PATCH 110/287] Update translation files Updated by "Remove blank strings" hook in Weblate. Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ --- src/strings/fo.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index b67a47fad2..38a581d39c 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -10,14 +10,11 @@ "All": "Øll", "AllEpisodes": "Allir partar", "AllLanguages": "Øll tungumál", - "LabelTonemappingMode": "", "HearingImpairedShort": "Hoyriveik/SDH", "MachineTranslated": "Maskintýtt", "AiTranslated": "Vitlíkistýtt", - "AllowAv1Encoding": "", "LabelIsHearingImpaired": "Til hoyriveik (SDH)", "Unknown": "Ókend", - "TonemappingModeHelp": "", "Unreleased": "Ikki latið út enn", "AlbumArtist": "Plátulistafólk", "AllChannels": "Allar rásir", @@ -115,7 +112,6 @@ "TypeOptionPluralBoxSet": "Bokssett", "TypeOptionPluralMusicAlbum": "Tónleikaútgávur", "TypeOptionPluralMusicVideo": "Tónleikasjónbond", - "TypeOptionPluralSeason": "", "TypeOptionPluralVideo": "Sjónbond", "Typewriter": "Skrivimaskina", "Uniform": "Einsháttað", @@ -402,7 +398,6 @@ "TableOfContents": "Innihaldsyvirlit", "UninstallPluginConfirmation": "Ynskir tú at strikað {0}?", "Vertical": "Loddrætt", - "Watched": "", "Wednesday": "Mikudag", "WeeklyAt": "{0} klokkan {1}", "WelcomeToProject": "Vælkomin til Jellyfin!", From 34f3d80b916a367800e8b887d7a2870cd5dfdeb6 Mon Sep 17 00:00:00 2001 From: krvi <27792771+krvi@users.noreply.github.com> Date: Sun, 19 Jul 2026 17:00:27 -0400 Subject: [PATCH 111/287] Translated using Weblate (Faroese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fo/ --- src/strings/fo.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index 38a581d39c..e91c8d9ccd 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -39,7 +39,7 @@ "AllowMediaConversion": "Loyv miðlaformbroytan", "AllowCollectionManagement": "brúkara", "AllowFfmpegThrottling": "Kyrkja", - "AllowFfmpegThrottlingHelp": "umkoding avspæling avspælingar", + "AllowFfmpegThrottlingHelp": "", "AllowRemoteAccess": "Loyv fjaratgongd til hendan ambætaran", "HeaderPassword": "Loyniorð", "HeaderLibraries": "Søvn", @@ -65,7 +65,7 @@ "SendMessage": "Send boð", "ServerNameIsRestarting": "Ambætarin á {0} endurbyrjar.", "ServerNameIsShuttingDown": "Ambætarin á {0} sløknar.", - "ServerUpdateNeeded": "Hesin ambætarin noyðist at dagførast. Vinaliga vitja {0}, til tess at heinta nýggjastu útgávuna.", + "ServerUpdateNeeded": "Hesin ambætarin noyðist at dagførast. Til tess at heinta nýggjastu útgávuna; vinaliga vitja {0}", "Share": "Deil", "ShowLess": "Vís minni", "ShowMore": "Vís meira", @@ -191,7 +191,7 @@ "Collections": "Søvn", "Default": "Forsett", "Genres": "Greinar", - "AirPlay": "AirPlay", + "AirPlay": "", "Photos": "Ljósmyndir", "AndOtherArtists": "{0} og {1} onnur listafólk.", "Authors": "Høvundar", From 45165bbd77eabb760857eb4648ed1db08d2ec62f Mon Sep 17 00:00:00 2001 From: Weblate Date: Sun, 19 Jul 2026 18:26:26 -0400 Subject: [PATCH 112/287] Update translation files Updated by "Remove blank strings" hook in Weblate. Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ --- src/strings/fo.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index e91c8d9ccd..6d92975ba3 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -39,7 +39,6 @@ "AllowMediaConversion": "Loyv miðlaformbroytan", "AllowCollectionManagement": "brúkara", "AllowFfmpegThrottling": "Kyrkja", - "AllowFfmpegThrottlingHelp": "", "AllowRemoteAccess": "Loyv fjaratgongd til hendan ambætaran", "HeaderPassword": "Loyniorð", "HeaderLibraries": "Søvn", @@ -191,7 +190,6 @@ "Collections": "Søvn", "Default": "Forsett", "Genres": "Greinar", - "AirPlay": "", "Photos": "Ljósmyndir", "AndOtherArtists": "{0} og {1} onnur listafólk.", "Authors": "Høvundar", From 5e64e6e5883aea18cd921794a45eda03930e1716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Signar=20Kampar=C3=A5s?= Date: Sun, 19 Jul 2026 20:27:32 -0400 Subject: [PATCH 113/287] Translated using Weblate (Swedish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sv/ --- src/strings/sv.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/sv.json b/src/strings/sv.json index 72f02c0847..1635a1216d 100644 --- a/src/strings/sv.json +++ b/src/strings/sv.json @@ -1924,5 +1924,6 @@ "HeaderSplitMedia": "Dela upp media", "StillWatchingPrompt": "Tittar du fortfarande", "Creators": "Skaparna", - "IndexNumber": "Indexnummer" + "IndexNumber": "Indexnummer", + "MessageNoEpisodesFound": "Inga avsnitt är tillgängliga för närvarande." } From fb0f38ed5272a04c5cfa136fda4a0810144e7467 Mon Sep 17 00:00:00 2001 From: aleksantero Date: Mon, 20 Jul 2026 02:43:08 -0400 Subject: [PATCH 114/287] Translated using Weblate (Finnish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fi/ --- src/strings/fi.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/fi.json b/src/strings/fi.json index 87607c2e2c..cc8363e9f0 100644 --- a/src/strings/fi.json +++ b/src/strings/fi.json @@ -1910,5 +1910,6 @@ "LabelBackupWarning": "On käynnissä olevia ajoitettuja tehtäviä. On suositeltavaa pysäyttää ne tai odottaa niiden valmistumista ennen varmuuskopiointia.", "LabelSimilarItemProvidersHelp": "Ota käyttöön ja järjestä samankaltaisten kohteiden tarjoajat tärkeysjärjestykseen.", "HeaderBackupWarning": "VAROITUS: Käynnissä olevia ajoitettuja tehtäviä", - "VideoRotationNotSupported": "Videon kiertoa ei tueta" + "VideoRotationNotSupported": "Videon kiertoa ei tueta", + "MessageNoEpisodesFound": "Jaksoja ei saatavilla tällä hetkellä." } From 2e4945d9fb38dc8e0ce2e70be9590ff0b54d3ce4 Mon Sep 17 00:00:00 2001 From: Vincenzo Reale Date: Mon, 20 Jul 2026 02:09:36 -0400 Subject: [PATCH 115/287] Translated using Weblate (Italian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/it/ --- src/strings/it.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/it.json b/src/strings/it.json index 07bde0c2b4..13200594c0 100644 --- a/src/strings/it.json +++ b/src/strings/it.json @@ -1925,5 +1925,6 @@ "ConfirmSplitMedia": "Sei sicuro di voler dividere le fonti multimediali in elementi separati?", "HeaderSplitMedia": "Suddividi media", "IndexNumber": "Numero indice", - "NoCastTargets": "Nessuna destinazione di trasmissione disponibile" + "NoCastTargets": "Nessuna destinazione di trasmissione disponibile", + "MessageNoEpisodesFound": "Al momento non sono disponibili episodi." } From 62d3e293bd16ee1719e2310dc658a6ac1d189e00 Mon Sep 17 00:00:00 2001 From: Thunderstrike116 Date: Mon, 20 Jul 2026 03:46:37 -0400 Subject: [PATCH 116/287] Translated using Weblate (Greek) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/el/ --- src/strings/el.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/el.json b/src/strings/el.json index 4117367ea1..93e6e538e0 100644 --- a/src/strings/el.json +++ b/src/strings/el.json @@ -1925,5 +1925,6 @@ "LabelPlayerSizes": "Μεγέθη προγράμματος αναπαραγωγής", "LabelPlaybackQuality": "Χαμένο / κατεστραμμένο καρέ", "IndexNumber": "Αριθμός ευρετηρίου", - "NoCastTargets": "Δεν υπάρχουν διαθέσιμοι στόχοι μετάδοσης" + "NoCastTargets": "Δεν υπάρχουν διαθέσιμοι στόχοι μετάδοσης", + "MessageNoEpisodesFound": "Δεν υπάρχουν διαθέσιμα επεισόδια αυτή τη στιγμή." } From 110d50928abc36fb16ea5fbac87ef779a412a546 Mon Sep 17 00:00:00 2001 From: Andras Milassin Date: Mon, 20 Jul 2026 03:10:29 -0400 Subject: [PATCH 117/287] Translated using Weblate (Hungarian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hu/ --- src/strings/hu.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/hu.json b/src/strings/hu.json index 2c5c019074..dad9bb3958 100644 --- a/src/strings/hu.json +++ b/src/strings/hu.json @@ -1925,5 +1925,6 @@ "ConfirmSplitMedia": "Biztosan külön elemekre szeretnéd osztani a médiaforrásokat?", "HeaderSplitMedia": "Szétválasztjuk a médiát", "IndexNumber": "Index szám", - "NoCastTargets": "Nincs elérhető célpont" + "NoCastTargets": "Nincs elérhető célpont", + "MessageNoEpisodesFound": "Jelenleg egyetlen epizód sem érhető el." } From cf0599563ca73503636d241255f04baf10dc917c Mon Sep 17 00:00:00 2001 From: Antonio Toledo Date: Mon, 20 Jul 2026 05:47:32 -0400 Subject: [PATCH 118/287] Translated using Weblate (Spanish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/ --- src/strings/es.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/es.json b/src/strings/es.json index 0542a9c676..d88f4a3055 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -1925,5 +1925,6 @@ "TableOfContents": "Índice", "Creators": "Creadores", "NoCastTargets": "No hay dispositivos de transmisión disponibles", - "IndexNumber": "Número de índice" + "IndexNumber": "Número de índice", + "MessageNoEpisodesFound": "Ningún episodio está disponible actualmente." } From fb509afc8d86662aa0fbbb37c9cd7dd9b40fea62 Mon Sep 17 00:00:00 2001 From: Antonio Toledo Date: Mon, 20 Jul 2026 05:46:20 -0400 Subject: [PATCH 119/287] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 29129f4743..60c43c6314 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1926,5 +1926,5 @@ "HeaderSplitMedia": "Séparer les supports", "IndexNumber": "Numéro d'index", "NoCastTargets": "Aucune cible de casting disponible", - "MessageNoEpisodesFound": "Aucun n'est épisode disponible pour le moment." + "MessageNoEpisodesFound": "Aucun épisode n'est disponible pour le moment." } From b4071b906e519618eda64791421243ac1ece8ad2 Mon Sep 17 00:00:00 2001 From: Shed Shedson Date: Mon, 20 Jul 2026 07:25:46 -0400 Subject: [PATCH 120/287] Translated using Weblate (Icelandic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/is/ --- src/strings/is-is.json | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/strings/is-is.json b/src/strings/is-is.json index 4b73670cce..6e6647cb97 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -508,5 +508,25 @@ "ChannelAccessHelp": "Veldu þær rásir sem á að deila með þessum notanda. Kerfisstjórar munu geta breytt öllum rásum í gegnum lýsigagna-stjórann.", "ConfigureDateAdded": "Stilltu hvernig „Dagsetning bætt við“ er reiknuð undir Stjórnborð > Söfn > Sýna", "DefaultMetadataLangaugeDescription": "Þetta eru sjálfgefnu stillingarnar þínar en þú getur breytt þeim fyrir hvert safn.", - "LabelUserRemoteClientBitrateLimitHelp": "Breytir sjálfgefna gildinu sem stillt er á þjóninum. Sjá nánar undir Stjórnborð > Spilun > Streymi." + "LabelUserRemoteClientBitrateLimitHelp": "Breytir sjálfgefna gildinu sem stillt er á þjóninum. Sjá nánar undir Stjórnborð > Spilun > Streymi.", + "Arranger": "Útsetjari", + "CardSettings": "Stillingar spjalda", + "ConfirmDeleteItemByName": "Ef þú eyðir \"{0}\" hverfur það bæði úr skráakerfinu og úr miðlasafninu þínu. Ertu viss um að þú viljir halda áfram?", + "ConfirmDeleteCollection": "Ertu viss um að þú viljir eyða þessari myndasyrpu?", + "ConfirmDeletePlaylist": "Ertu viss um að þú viljir eyða þessum spilunarlista?", + "ConfirmDeleteSeries": "Ef þú eyðir þessari þáttaröð eyðast ALLIR {0} þættirnir bæði úr skráakerfinu og úr miðlasafninu þínu. Ertu viss um að þú viljir halda áfram?", + "ConfirmDeleteLyrics": "Ef þú eyðir þessum texta eyðist hann bæði úr skráakerfinu og úr miðlasafninu þínu. Ertu viss um að þú viljir halda áfram?", + "ConfirmDeleteRepository": "Eyða safni?", + "ConfirmSplitMedia": "Ertu viss um að þú viljir skipta þessu í sundur?", + "ConfirmStillWatching": "Ertu ennþá að horfa?", + "ConnectAnyway": "Tengjast samt", + "Console": "Stjórnborð", + "ContinueReading": "Halda áfram að lesa", + "CopyLogSuccess": "Það tókst að afrita kladdann.", + "CoverArtist": "Kápuhönnuður", + "Create": "Búa til", + "Creator": "Skapari", + "Creators": "Skaparar", + "Cursive": "Skáletrað", + "Custom": "Sérsniðið" } From bcc8d7d4700ded9e3951c3a2fc94200d42c6d58f Mon Sep 17 00:00:00 2001 From: Matias Date: Mon, 20 Jul 2026 05:50:13 -0400 Subject: [PATCH 121/287] Translated using Weblate (Portuguese (Brazil)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/pt_BR/ --- src/strings/pt-br.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/pt-br.json b/src/strings/pt-br.json index dd2af81eec..969bf4281d 100644 --- a/src/strings/pt-br.json +++ b/src/strings/pt-br.json @@ -1925,5 +1925,6 @@ "HeaderBackupWarning": "CUIDADO: agendamento de tarefas em andamento", "VideoRotationNotSupported": "A rotação de vídeo não é suportada", "IndexNumber": "Número do índice", - "NoCastTargets": "Não há destinos de cast disponíveis" + "NoCastTargets": "Não há destinos de cast disponíveis", + "MessageNoEpisodesFound": "Sem episódios disponíveis no momento." } From 93127a85866c1fd6a017900b95bb730efa84bb39 Mon Sep 17 00:00:00 2001 From: Mia Date: Mon, 20 Jul 2026 07:02:10 -0400 Subject: [PATCH 122/287] Translated using Weblate (Japanese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ja/ --- src/strings/ja.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/strings/ja.json b/src/strings/ja.json index d6c798c4bf..c99b9f77e3 100644 --- a/src/strings/ja.json +++ b/src/strings/ja.json @@ -17,7 +17,7 @@ "AllEpisodes": "すべてのエピソード", "AllLanguages": "すべての言語", "AllLibraries": "すべてのライブラリ", - "AllowHWTranscodingHelp": "チューナーでのストリーム中のトランスコードを有効にします。 サーバーから要求されるトランスコードを減らすのに役立ちます。", + "AllowHWTranscodingHelp": "チューナーでのストリーム中のトランスコードを有効にします。 サーバから要求されるトランスコードを減らすのに役立ちます。", "AllowMediaConversion": "メディア変換を許可", "AllowMediaConversionHelp": "メディア変換機能へのアクセスを許可または拒否します。", "AllowOnTheFlySubtitleExtraction": "再生中の字幕の抽出を許可", @@ -50,7 +50,7 @@ "Box": "ボックス", "BoxRear": "ボックス ( 裏 )", "Browse": "ブラウズ", - "BurnSubtitlesHelp": "サーバーが字幕を焼きこむべきかどうかを決定します。 これを使用しない場合はパフォーマンスが大幅に向上します。 イメージベースのフォーマット(VobSub、PGS、SUB、IDXなど)と特定のASSまたはSSA字幕を書き込むには、Autoを選択してください。", + "BurnSubtitlesHelp": "サーバが字幕を焼きこむべきかどうかを決定します。 これを使用しない場合はパフォーマンスが大幅に向上します。 イメージベースのフォーマット (VobSub、PGS、SUB、IDXなど) と特定のASSまたはSSA字幕を書き込むには、\"自動\" を選択してください。", "ButtonAddMediaLibrary": "メディアライブラリーを追加", "ButtonAddScheduledTaskTrigger": "トリガーを追加", "ButtonAddServer": "サーバーを追加", From 3fcbf4bb295d95b711f1db37f35e329ef8d0570f Mon Sep 17 00:00:00 2001 From: Shed Shedson Date: Mon, 20 Jul 2026 07:33:33 -0400 Subject: [PATCH 123/287] Translated using Weblate (Icelandic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/is/ --- src/strings/is-is.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/is-is.json b/src/strings/is-is.json index 6e6647cb97..8a7fe8c0d0 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -528,5 +528,8 @@ "Creator": "Skapari", "Creators": "Skaparar", "Cursive": "Skáletrað", - "Custom": "Sérsniðið" + "Custom": "Sérsniðið", + "CustomSplashScreenSize": "Sérsniðnar myndir eiga að vera í stærðarhlutfallinu 16:9 og að lágmarki 1920x1080 pixlar.", + "CustomSubtitleStylingHelp": "Útlit texta mun virka á flestum tækjum en krefst meira álags.", + "DateModified": "Dagsetning breytingar" } From d05576e7bcd35848c02c2637192883ab3bc8bcc9 Mon Sep 17 00:00:00 2001 From: Helak Date: Mon, 20 Jul 2026 08:07:22 -0400 Subject: [PATCH 124/287] Translated using Weblate (Czech) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/ --- src/strings/cs.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/cs.json b/src/strings/cs.json index d40f29324d..e3efe1f9dd 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1925,5 +1925,6 @@ "HeaderSplitMedia": "Rozdělit média", "Creators": "Tvůrci", "IndexNumber": "Indexové číslo", - "NoCastTargets": "Nejsou k dispozici žádné obrazovky" + "NoCastTargets": "Nejsou k dispozici žádné obrazovky", + "MessageNoEpisodesFound": "V současné době nejsou k dispozici žádné epizody." } From b93c51d2acf98d89e22bd01424f80b48c3046aee Mon Sep 17 00:00:00 2001 From: GolanGitHub Date: Mon, 20 Jul 2026 08:02:52 -0400 Subject: [PATCH 125/287] Translated using Weblate (Spanish) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/es/ --- src/strings/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/es.json b/src/strings/es.json index d88f4a3055..fde51dced0 100644 --- a/src/strings/es.json +++ b/src/strings/es.json @@ -611,7 +611,7 @@ "MessageItemSaved": "Elemento guardado.", "MessageItemsAdded": "Ítems añadidos.", "MessageLeaveEmptyToInherit": "Dejar en blanco para heredar la configuración del elemento padre, o el valor global por defecto.", - "MessageNoMovieSuggestionsAvailable": "No hay sugerencias de películas disponibles. Comience ver y calificar sus películas y vuelva para ver las recomendaciones.", + "MessageNoMovieSuggestionsAvailable": "No hay sugerencias de películas disponibles. Comience a ver y calificar sus películas y vuelva para ver las recomendaciones.", "MessageNothingHere": "Nada aquí.", "MessagePasswordResetForUsers": "Se ha restablecido las contraseñas a los siguientes usuarios. Ahora pueden iniciar sesión con los códigos PIN que se usaron para el restablecimiento.", "MessagePleaseEnsureInternetMetadata": "Asegúrate de que la descarga de metadatos desde internet está activada.", From c6da08bb33fa2f131bdb421e72372ea8501db8f6 Mon Sep 17 00:00:00 2001 From: Shed Shedson Date: Mon, 20 Jul 2026 09:24:16 -0400 Subject: [PATCH 126/287] Translated using Weblate (Icelandic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/is/ --- src/strings/is-is.json | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/strings/is-is.json b/src/strings/is-is.json index 8a7fe8c0d0..016695e151 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -531,5 +531,20 @@ "Custom": "Sérsniðið", "CustomSplashScreenSize": "Sérsniðnar myndir eiga að vera í stærðarhlutfallinu 16:9 og að lágmarki 1920x1080 pixlar.", "CustomSubtitleStylingHelp": "Útlit texta mun virka á flestum tækjum en krefst meira álags.", - "DateModified": "Dagsetning breytingar" + "DateModified": "Dagsetning breytingar", + "DefaultSubtitlesHelp": "Textar eru hlaðnir inn samkvæmt sjálfgefnum og skylduðum merkjum í lýsigögnum skrárinnar. Tungumálastillingar ráða för ef fleiri en einn valkostur er í boði.", + "DeinterlaceMethodHelp": "Veldu hvaða fléttueyðingu (deinterlacing) á að nota þegar hugbúnaður endurkóðar fléttað efni. Ef vélbúnaðarhröðun er virk og styður fléttueyðingu, verður vélbúnaðurinn notaður í staðinn.", + "DeleteEntireSeries": "Eyða {0} þáttum", + "DeleteCustomImage": "Eyða sérsniðinni mynd", + "DeleteDevicesConfirmation": "Ertu viss um að þú viljir eyða út öllum tækjum? Allir verða skráðar út á þeim tækjum. Tækin birtast aftur næst þegar notandi skráir sig inn.", + "DeleteRepositoryConfirmation": "Ertu viss um að þú viljir eyða þessu viðbótasafni?", + "DeleteLyrics": "Eyða texta", + "DeleteSeries": "Eyða seríu", + "DeleteEpisode": "Eyða þátt", + "DeleteName": "Eyða {0}", + "DeleteServerConfirmation": "Ertu viss um að þú viljir eyða þessum þjóni?", + "Depressed": "Ekki inndregið", + "EnableQuickConnect": "Virkja \"Quick Connect\" á þessum þjóni", + "EnableSmoothScroll": "Virkja mjúkt skroll", + "EnableStreamLooping": "Endurtaka beinar útsendingar sjálfkrafa" } From 7a1665d8f9559b0a559d40c194ead7944836783f Mon Sep 17 00:00:00 2001 From: Shed Shedson Date: Mon, 20 Jul 2026 09:38:59 -0400 Subject: [PATCH 127/287] Translated using Weblate (Icelandic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/is/ --- src/strings/is-is.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/is-is.json b/src/strings/is-is.json index 016695e151..230e6c8295 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -546,5 +546,8 @@ "Depressed": "Ekki inndregið", "EnableQuickConnect": "Virkja \"Quick Connect\" á þessum þjóni", "EnableSmoothScroll": "Virkja mjúkt skroll", - "EnableStreamLooping": "Endurtaka beinar útsendingar sjálfkrafa" + "EnableStreamLooping": "Endurtaka beinar útsendingar sjálfkrafa", + "EnableStreamLoopingHelp": "Virkjaðu þetta ef beinar útsendingar innihalda aðeins nokkrar sekúndur af gögnum og kalla þarf eftir þeim stöðugt. Það getur valdið vandræðum ef það er kveikt á þessari stillingu að óþörfu.", + "EnableTonemapping": "Virkja litvörpun (Tone mapping)", + "EnableTrueHd": "Virkja TrueHD" } From 6ef160afbd0532ec8a536421643c31dd36bd958b Mon Sep 17 00:00:00 2001 From: Shed Shedson Date: Mon, 20 Jul 2026 09:42:08 -0400 Subject: [PATCH 128/287] Translated using Weblate (Icelandic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/is/ --- src/strings/is-is.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/is-is.json b/src/strings/is-is.json index 230e6c8295..9d13d7816c 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -549,5 +549,6 @@ "EnableStreamLooping": "Endurtaka beinar útsendingar sjálfkrafa", "EnableStreamLoopingHelp": "Virkjaðu þetta ef beinar útsendingar innihalda aðeins nokkrar sekúndur af gögnum og kalla þarf eftir þeim stöðugt. Það getur valdið vandræðum ef það er kveikt á þessari stillingu að óþörfu.", "EnableTonemapping": "Virkja litvörpun (Tone mapping)", - "EnableTrueHd": "Virkja TrueHD" + "EnableTrueHd": "Virkja TrueHD", + "EnableTrueHdHelp": "Aðeins virkja þetta ef tækið þitt styður TrueHD eða er tengt við magnara sem styður það, annars gæti spilun mistekist." } From 1c46147c27e308ee463773cf14cca26bd8a7b0bd Mon Sep 17 00:00:00 2001 From: Shed Shedson Date: Mon, 20 Jul 2026 09:43:44 -0400 Subject: [PATCH 129/287] Translated using Weblate (Icelandic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/is/ --- src/strings/is-is.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/is-is.json b/src/strings/is-is.json index 9d13d7816c..0e36da9ecb 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -550,5 +550,7 @@ "EnableStreamLoopingHelp": "Virkjaðu þetta ef beinar útsendingar innihalda aðeins nokkrar sekúndur af gögnum og kalla þarf eftir þeim stöðugt. Það getur valdið vandræðum ef það er kveikt á þessari stillingu að óþörfu.", "EnableTonemapping": "Virkja litvörpun (Tone mapping)", "EnableTrueHd": "Virkja TrueHD", - "EnableTrueHdHelp": "Aðeins virkja þetta ef tækið þitt styður TrueHD eða er tengt við magnara sem styður það, annars gæti spilun mistekist." + "EnableTrueHdHelp": "Aðeins virkja þetta ef tækið þitt styður TrueHD eða er tengt við magnara sem styður það, annars gæti spilun mistekist.", + "EncoderPresetHelp": "Veldu hærri hraða fyrir betri afköst, eða lægri hraða fyrir betri myndgæði.", + "Ended": "Lokið" } From 07c1d3ae56aba29862a2ea3c1211139651c557d9 Mon Sep 17 00:00:00 2001 From: Jordan Rushing Date: Mon, 20 Jul 2026 08:46:14 -0500 Subject: [PATCH 130/287] Enable iOS background play when screen is turned off (#8211) --- src/plugins/htmlAudioPlayer/plugin.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/plugins/htmlAudioPlayer/plugin.js b/src/plugins/htmlAudioPlayer/plugin.js index 2e4f4f3a8b..8016253321 100644 --- a/src/plugins/htmlAudioPlayer/plugin.js +++ b/src/plugins/htmlAudioPlayer/plugin.js @@ -164,6 +164,11 @@ class HtmlAudioPlayer { elem.crossOrigin = crossOrigin; } + // This avoids the AudioContext being suspended when Safari is put into background + if ('audioSession' in navigator) { + navigator.audioSession.type = 'playback'; + } + return enableHlsPlayer(val, options.item, options.mediaSource, 'Audio').then(function () { return new Promise(function (resolve, reject) { requireHlsPlayer(async () => { From 60e1e9ce2b490e901c8a1e13cc9c57a3e30c82fc Mon Sep 17 00:00:00 2001 From: Shed Shedson Date: Mon, 20 Jul 2026 11:26:13 -0400 Subject: [PATCH 131/287] Translated using Weblate (Icelandic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/is/ --- src/strings/is-is.json | 52 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/src/strings/is-is.json b/src/strings/is-is.json index 0e36da9ecb..450ffb4fd7 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -552,5 +552,55 @@ "EnableTrueHd": "Virkja TrueHD", "EnableTrueHdHelp": "Aðeins virkja þetta ef tækið þitt styður TrueHD eða er tengt við magnara sem styður það, annars gæti spilun mistekist.", "EncoderPresetHelp": "Veldu hærri hraða fyrir betri afköst, eða lægri hraða fyrir betri myndgæði.", - "Ended": "Lokið" + "Ended": "Lokið", + "EndsAtValue": "Lýkur kl. {0}", + "Engineer": "Hljóðmaður", + "ErrorAddingListingsToSchedulesDirect": "Villa kom upp við að bæta rásalistanum við Schedules Direct aðganginn þinn. Schedules Direct leyfir aðeins takmarkaðan fjölda rásalista á hverjum aðgangi. Þú gætir þurft að skrá þig inn á vefsíðu Schedules Direct og eyða öðrum listum áður en þú heldur áfram.", + "ErrorAddingMediaPathToVirtualFolder": "Villa kom upp við að bæta við slóðinni. Gakktu úr skugga um að slóðin sé rétt og að Jellyfin hafi aðgang að henni.", + "ErrorAddingTunerDevice": "Villa kom upp við að bæta við sjónvarpsmóttakaranum. Gakktu úr skugga um að tækið sé tengt og reyndu aftur.", + "ErrorAddingXmlTvFile": "Villa kom upp við að opna XMLTV-skrána. Gakktu úr skugga um að skráin sé til og reyndu aftur.", + "ErrorDeletingItem": "Villa kom upp við að eyða hlutnum af þjóninum. Gakktu úr skugga um að Jellyfin hafi skrif-aðgang að miðlamöppunni og reyndu aftur.", + "ErrorDeletingLyrics": "Villa kom upp við að eyða textanum af þjóninum. Gakktu úr skugga um að Jellyfin hafi skrifaðgang að miðlamöppunni og reyndu aftur.", + "ErrorGettingTvLineups": "Villa kom upp við að hlaða niður rásalistum. Gakktu úr skugga um að upplýsingarnar séu réttar og reyndu aftur.", + "ErrorPlayerNotFound": "Enginn spilari fannst fyrir þetta efni.", + "ErrorPleaseSelectLineup": "Vinsamlegast veldu rásalista og reyndu aftur. Ef engir rásalistar eru í boði skaltu athuga hvort notandanafn, lykilorð og póstnúmer séu rétt.", + "ErrorSavingTvProvider": "Villa kom upp við að vista sjónvarpsveituna. Gakktu úr skugga um að hún sé aðgengileg og reyndu aftur.", + "ErrorStartHourGreaterThanEnd": "Lokatími verður að vera á eftir upphafstíma.", + "EveryNDays": "Á {0} daga fresti", + "EveryXMinutes": "Á {0} mínútna fresti", + "ExitFullscreen": "Hætta í heilskjá", + "ExtractChapterImagesHelp": "Útdráttur kaflaskjámynda gerir spilurum kleift að sýna myndræna valmynd til að velja atriði. Þetta ferli getur verið hægvirkt, krafist mikillar vinnslugetu og tekið nokkur gígabæt af plássi. Það keyrir þegar ný myndbönd finnast, og einnig sem tímasett verk á næturnar. Hægt er að breyta tímasetningunni í hlutanum fyrir áætluð verk. Ekki er mælt með því að keyra þetta verk á álagstímum.", + "ExtraLarge": "Mjög stórt", + "Extras": "Aukaefni", + "FallbackMaxStreamingBitrateHelp": "Hámarksbitaafköst streymis eru notuð til vara ef ffprobe tekst ekki að greina bitaafköst upprunalega streymisins. Þetta kemur í veg fyrir að spilarar biðji um óþarflega há bitaafköst við endurkóðun, sem gæti valdið villu í spilaranum og ofgert kóðaranum.", + "FastForward": "Hrað spóla", + "Favorite": "Uppáhalds", + "Features": "Eiginleikar", + "FetchingData": "Sæki fleiri gögn", + "FFmpegSavePathNotFound": "Okkur tókst ekki að finna FFmpeg á slóðinni sem þú slóst inn. FFprobe er líka nauðsynlegt og verður að vera í sömu möppu. Þessum einingum er venjulega pakkað saman í einu niðurhali. Gakktu úr skugga um að slóðin sé rétt og reyndu aftur.", + "FileReadCancelled": "Hætt var við að lesa skrána.", + "FileReadError": "Villa kom upp við að lesa skrána.", + "Filters": "Síur", + "Framerate": "Rammatíðni", + "Fullscreen": "Heilskjár", + "GoHome": "Fara heim", + "GoogleCastUnsupported": "Engin stuðningur við Google Cast", + "GridView": "Töflusýn", + "GroupBySeries": "Hópa eftir þáttaröðum", + "GroupVersions": "Sameina útgáfur", + "GuestStar": "Gesta stjarna", + "Guide": "Dagskrá", + "GuideProviderSelectListings": "Veldu sjónvarpsskrár", + "H264CrfHelp": "„Constant Rate Factor“ (CRF) er sjálfgefna gæðastillingin fyrir x264 og x265 hugbúnaðarkóðarana. Hægt er að velja gildi á milli 0 og 51, þar sem lægri gildi gefa betri gæði (en stærri skrár). Skynsamleg gildi eru á milli 18 og 28. Sjálfgefin gildi fyrir x264 er 23, og 28 fyrir x265, svo gott er að miða við það í upphafi. Vélbúnaðarkóðarar nota ekki þessar stillingar.", + "HDPrograms": "HD efni", + "HardwareAccelerationWarning": "Að virkja vélbúnaðarhröðun getur valdið óstöðugleika í sumum kerfum. Gakktu úr skugga um að stýrikerfið og skjákorta-driverar séu uppfærðir. Ef upp koma vandamál í spilun eftir að kveikt er á þessu þarf að breyta stillingunni aftur í „Ekkert“.", + "HeaderAccessSchedule": "Aðgangsáætlun", + "HeaderAccessScheduleHelp": "Búa til aðgangsáætlun til að takmarka aðgang við ákveðna tíma.", + "HeaderActiveRecordings": "Virkar upptökur", + "HeaderActivity": "Virkni", + "HeaderAdditionalParts": "Viðbótahlutar", + "HeaderAddLyrics": "Bæta við texta", + "HeaderAddUpdateSubtitle": "Bæta við/uppfæra texta", + "HeaderKeepRecording": "Halda áfram upptöku", + "HeaderKeepSeries": "Halda þáttaröð" } From 92dfb6cdc8fc9c5583b0f1d7a75e165b40dd7a04 Mon Sep 17 00:00:00 2001 From: Bas <44002186+854562@users.noreply.github.com> Date: Mon, 20 Jul 2026 09:51:06 -0400 Subject: [PATCH 132/287] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index a04171f8c9..43cb01cd77 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -1840,7 +1840,7 @@ "MessageBackupDisclaimer": "Afhankelijk van de grootte van je bibliotheek kan het maken van de back-up enige tijd duren.", "LabelProgramData": "Programmagegevens", "StorageType.CDRom": "Cd-rom", - "MessageRestoreDisclaimer": "WAARSCHUWING: Je staat op het punt een eerdere back-up terug te zetten. Je server is tijdens dit proces onbruikbaar en alle gegevens die sinds de back-up zijn aangemaakt gaan verloren.", + "MessageRestoreDisclaimer": "WAARSCHUWING: Je staat op het punt een eerdere back-up terug te zetten. Je server is tijdens dit proces onbruikbaar en alle gegevens die sinds de back-up zijn aangemaakt gaan verloren.\n\nBack-ups mogen alleen worden teruggezet naar dezelfde versie als die waarop ze zijn gemaakt. Het terugzetten van een back-up naar een andere versie wordt niet ondersteund en kan de server onbruikbaar maken.", "StorageType.Fixed": "Vast", "StorageType.Network": "Netwerk", "StorageType.NoRootDirectory": "Geen hoofdmap", From 94878e2b6bd37f02095f00f112a688bef0f99b2b Mon Sep 17 00:00:00 2001 From: Gargotaire Date: Mon, 20 Jul 2026 12:46:32 -0400 Subject: [PATCH 133/287] Translated using Weblate (Catalan) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ca/ --- src/strings/ca.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/strings/ca.json b/src/strings/ca.json index e9e73611ee..8df6c19949 100644 --- a/src/strings/ca.json +++ b/src/strings/ca.json @@ -1924,5 +1924,6 @@ "StillWatchingPrompt": "Avís de continuació de reproducció", "StopWatching": "Deixa de veure", "NoCastTargets": "No hi ha objectius d'emissió disponibles", - "IndexNumber": "Número d'índex" + "IndexNumber": "Número d'índex", + "MessageNoEpisodesFound": "Actualment, no hi ha cap episodi disponible." } From 1363b749b5e01202919f8a35a2caabdaca6a18e0 Mon Sep 17 00:00:00 2001 From: Shed Shedson Date: Mon, 20 Jul 2026 12:31:40 -0400 Subject: [PATCH 134/287] Translated using Weblate (Icelandic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/is/ --- src/strings/is-is.json | 58 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/src/strings/is-is.json b/src/strings/is-is.json index 450ffb4fd7..71ad68cf38 100644 --- a/src/strings/is-is.json +++ b/src/strings/is-is.json @@ -602,5 +602,61 @@ "HeaderAddLyrics": "Bæta við texta", "HeaderAddUpdateSubtitle": "Bæta við/uppfæra texta", "HeaderKeepRecording": "Halda áfram upptöku", - "HeaderKeepSeries": "Halda þáttaröð" + "HeaderKeepSeries": "Halda þáttaröð", + "HeaderLatestBooks": "Nýlega bættar við bækur", + "HeaderLatestMedia": "Nýlega bætt við", + "HeaderLatestMusicVideos": "Nýlega bætt við tónlistarmyndbönd", + "HeaderLatestRecordings": "Nýlega bættar við upptökur", + "HeaderLibraries": "Söfn", + "HeaderLibraryAccess": "Aðgangur að söfnum", + "HeaderLibraryFolders": "Safnmöppur", + "HeaderLibraryOrder": "Röðun safns", + "HeaderLibrarySettings": "Stillingar safns", + "HeaderLiveTvTunerSetup": "Uppsetning sjónvarpsmóttakara", + "HeaderLyricDownloads": "Niðurhal texta", + "HeaderMediaFolders": "Miðlamöppur", + "HeaderMediaSegmentActions": "Aðgerðir fyrir miðlabúta", + "HeaderMoreLikeThis": "Svipað efni", + "HeaderMyMedia": "Mitt efni", + "HeaderMyMediaSmall": "Mitt efni (smátt)", + "HeaderNavigation": "Stjórnun", + "HeaderNetworking": "IP reglur", + "HeaderNewApiKey": "Nýr API lykill", + "HeaderNewPlaylist": "Nýr spilunarlisti", + "HeaderNewRepository": "Nýtt skrásafn", + "HeaderNextEpisode": "Næsti þáttur", + "HeaderNextEpisodePlayingInValue": "Næsti þáttur byrjar eftir {0}", + "HeaderNextVideo": "Næsta myndband", + "HeaderNextVideoPlayingInValue": "Næsta myndband byrjar eftir {0}", + "HeaderNoLyrics": "Enginn texti fannst", + "HeaderOnNow": "Í spilun", + "HeaderOtherItems": "Annað efni", + "HeaderPageNotFound": "Síða fannst ekki", + "HeaderParentalRatings": "Aldurs takmark", + "HeaderPerformance": "Afköst", + "HeaderPlayback": "Spilun efnis", + "HeaderPlaybackError": "Villa við spilun", + "HeaderPlayOn": "Spila á", + "HeaderPleaseSignIn": "Skráðu þig inn", + "HeaderPortRanges": "Stillingar eldveggs og proxy", + "HeaderPreviewLyrics": "Forskoða texta", + "HeaderRecentlyPlayed": "Nýlega spilað", + "HeaderRecordingOptions": "Upptökustillingar", + "HeaderRecordingPostProcessing": "Eftirvinnsla upptöku", + "HeaderRemoteAccessSettings": "Fjarstýringarstillingar", + "HeaderRemoteControl": "Fjarstýring", + "HeaderRemoveMediaFolder": "Fjarlægja miðlamöppu", + "HeaderRemoveMediaLocation": "Fjarlægja miðlastaðsetningu", + "HeaderRevisionHistory": "Breytingasaga", + "HeaderRunningTasks": "Tímasett verk í gangi", + "HeaderScenes": "Senur", + "HeaderSeasons": "Þáttaraðir", + "HeaderSecondsValue": "{0} sekúndur", + "HeaderSelectCertificatePath": "Veldu slóð fyrir skilríki", + "HeaderSelectMetadataPath": "Veldu slóð fyrir lýsigögn", + "HeaderSelectMetadataPathHelp": "Finndu eða sláðu inn slóðina sem þú vilt nota fyrir lýsigögn. Mappan verður að vera skrifanleg.", + "HeaderSelectPath": "Veldu slóð", + "HeaderSelectServerCachePath": "Veldu slóð fyrir skyndiminni þjónsins", + "HeaderSelectServerCachePathHelp": "Finndu eða sláðu inn slóðina sem á að nota fyrir skyndiminni þjónsins. Mappan verður að vera skrifanleg.", + "HeaderSelectTranscodingPath": "Veldu bráðabirgðaslóð fyrir endurkóðun" } From 5042ad8376441c56677652031c2578d173f82208 Mon Sep 17 00:00:00 2001 From: Milo Ivir Date: Mon, 20 Jul 2026 14:10:00 -0400 Subject: [PATCH 135/287] Translated using Weblate (Croatian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/hr/ --- src/strings/hr.json | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/strings/hr.json b/src/strings/hr.json index b11b2465d2..36c99a30b6 100644 --- a/src/strings/hr.json +++ b/src/strings/hr.json @@ -814,7 +814,7 @@ "HeaderSyncPlayEnabled": "SyncPlay omogućen", "HeaderSyncPlaySelectGroup": "Pridruži se jednoj grupi", "HeaderSubtitleDownloads": "Preuzimanje titlova", - "HeaderSubtitleAppearance": "Prikaz titlove", + "HeaderSubtitleAppearance": "Izgled titlova", "HeaderStopRecording": "Prekini snimanje", "HeaderStatus": "Status", "HeaderSeriesStatus": "Status serije", @@ -1028,7 +1028,7 @@ "ButtonExitApp": "Izlaz iz aplikacije", "Casual": "Ležerno", "Console": "Konzola", - "EnableCardLayout": "Prikažite vizualni CardBox", + "EnableCardLayout": "Prikaži vizualni CardBox", "GoogleCastUnsupported": "Google Cast nije podržan", "ButtonClose": "Zatvori", "CopyFailed": "Nije moguće kopirati", @@ -1805,7 +1805,7 @@ "MessageNoGenresAvailable": "Omogućite nekim pružateljima metapodataka da preuzimaju žanrove s interneta.", "MessagePlayAccessRestricted": "Reprodukcija ovog sadržaja je trenutno ograničena. Molimo kontaktirajte administratora vašeg poslužitelja za više informacija.", "MessageRepositoryInstallDisclaimer": "UPOZORENJE: Instaliranje repozitorija dodataka treće strane nosi rizike. Može sadržavati nestabilan ili zlonamjerni kod i može se promijeniti u bilo kojem trenutku. Instalirajte repozitorije samo od autora kojima vjerujete.", - "MessageRestoreDisclaimer": "UPOZORENJE: Uskoro ćete obaviti obnovu iz prethodne sigurnosne kopije. Vaš poslužitelj bit će neupotrebljiv tijekom cijelog postupka, a svi novi podaci nastali nakon sigurnosne kopije bit će izgubljeni.", + "MessageRestoreDisclaimer": "UPOZORENJE: Uskoro ćete obaviti obnovu iz prethodne sigurnosne kopije. Vaš poslužitelj bit će neupotrebljiv tijekom cijelog postupka, a svi novi podaci nastali nakon sigurnosne kopije bit će izgubljeni.\n\nSigurnosne kopije treba obnvaljati samo na istu verziju u kojoj su stvorene. Obnavljanje sigurnosne kopije na jednu drugu verziju nije podržano i može učiniti poslužitelj neupotrebljivim.", "MessageServerMismatch": "Poslužitelj s kojim se povezujete nije isti poslužitelj na koji ste se prethodno povezali na ovoj adresi. Ako je to očekivano, molimo odaberite \"Poveži se unatoč tome\". U suprotnom, vaša veza ili poslužitelj mogu biti ugroženi.", "MessageSyncPlayCreateGroupDenied": "Potreban je dopuštaj za stvaranje grupe.", "MessageSyncPlayErrorAccessingGroups": "Došlo je do pogreške pri pristupu popisu grupa.", @@ -1906,5 +1906,21 @@ "LabelPlayerSizes": "Veličine igrača", "LabelPlaybackQuality": "Okvir izgubljen / oštećen", "LabelSyncPlayJoinGroup": "Pridruži se grupi", - "Disabled": "Onemogućeno" + "Disabled": "Onemogućeno", + "MessageNoEpisodesFound": "Trenutačno nema dostupnih epizoda.", + "Creators": "Stvaratelji", + "ViewDoublePage": "Dvostranični prikaz", + "ViewSinglePage": "Jednostranični prikaz", + "ViewLeftToRight": "Slijeva na desno", + "ViewRightToLeft": "Sdesna na lijevo", + "HeaderSplitMedia": "Rastavi medije", + "IndexNumber": "Boj indeksa", + "LabelOriginalLanguage": "Izvorni jezik", + "OriginalLanguage": "Izvorni jezik", + "SeriesName": "Ime serije", + "StillWatchingOption": "{0} epizode ili {1} min", + "StopWatching": "Prekini gledati", + "TableOfContents": "Kazalo", + "VideoRotationNotSupported": "Okretanje videa nije podržano", + "CardSettings": "Postavke kartica" } From 8420e146a742988ecbeda4bec0d9259acd3353cd Mon Sep 17 00:00:00 2001 From: Bas <44002186+854562@users.noreply.github.com> Date: Mon, 20 Jul 2026 14:21:10 -0400 Subject: [PATCH 136/287] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index 43cb01cd77..9a1710acd2 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -1820,7 +1820,7 @@ "LimitSegmentLengthHelp": "Het inschakelen van deze optie kan helpen voorkomen dat de HLS-speler vastloopt tijdens terug- en vooruitspoelen op bepaalde apparaten, zoals webOS-tv's.", "HeaderUpdateRequired": "Bijwerken vereist", "HeaderServerUnavailable": "Server niet beschikbaar", - "MessageForgotPasswordPinReset": "Pincode hier invoeren om wachtwoordherstel te voltooien", + "MessageForgotPasswordPinReset": "Voer de pincode hier in om het wachtwoordherstel te voltooien", "DownloadManager": "Downloads", "ViewSettings": "Weergave-instellingen", "Create": "Aanmaken", From a1ea3d06ae8488ca673bbabc4c214a697c17e2b4 Mon Sep 17 00:00:00 2001 From: Jordan Rushing Date: Tue, 14 Jul 2026 18:54:12 -0500 Subject: [PATCH 137/287] Disable Audio Normalization in iOS to fix pitch and speed issues --- src/components/playbackSettings/playbackSettings.js | 1 + .../playbackSettings/playbackSettings.template.html | 2 +- src/plugins/htmlAudioPlayer/plugin.js | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/components/playbackSettings/playbackSettings.js b/src/components/playbackSettings/playbackSettings.js index 62843a0958..56d4a83de2 100644 --- a/src/components/playbackSettings/playbackSettings.js +++ b/src/components/playbackSettings/playbackSettings.js @@ -259,6 +259,7 @@ function loadForm(context, user, userSettings, systemInfo, apiClient) { context.querySelector('.chkEnableHi10p').checked = appSettings.enableHi10p(); context.querySelector('.chkEnableCinemaMode').checked = userSettings.enableCinemaMode(); context.querySelector('#selectAudioNormalization').value = userSettings.selectAudioNormalization(); + context.querySelector('.fldAudioNormalization').classList.toggle('hide', browser.iOS); context.querySelector('.chkEnableNextVideoOverlay').checked = userSettings.enableNextVideoInfoOverlay(); context.querySelector('.chkRememberAudioSelections').checked = user.Configuration.RememberAudioSelections || false; context.querySelector('.chkRememberSubtitleSelections').checked = user.Configuration.RememberSubtitleSelections || false; diff --git a/src/components/playbackSettings/playbackSettings.template.html b/src/components/playbackSettings/playbackSettings.template.html index c1abd3c645..ef97baa7a7 100644 --- a/src/components/playbackSettings/playbackSettings.template.html +++ b/src/components/playbackSettings/playbackSettings.template.html @@ -231,7 +231,7 @@

${HeaderAudioAdvanced}

-
+
Date: Thu, 30 Jul 2026 15:42:52 -0400 Subject: [PATCH 246/287] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index 5751f485a8..a76cd1ade7 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -1744,8 +1744,8 @@ "LabelFallbackMaxStreamingBitrate": "Maximale terugvalbitsnelheid voor streamen (Mbps)", "LabelLyricDownloaders": "Ophalers voor liedteksten", "LyricDownloadersHelp": "Activeer je voorkeursophalers voor liedteksten en bepaal hun prioriteit.", - "RenderPgsSubtitle": "PGS-ondertiteling weergeven (experimenteel)", - "RenderPgsSubtitleHelp": "Bepaal of de speler PGS-ondertiteling zelf moet weergeven in plaats van ingebrande ondertiteling te gebruiken. Dit voorkomt transcoderen aan de serverkant maar kan de weergaveprestaties aan de spelerkant beïnvloeden.", + "RenderPgsSubtitle": "PGS- en VobSub-ondertiteling weergeven (experimenteel)", + "RenderPgsSubtitleHelp": "Bepaal of de speler PGS- en VobSub-ondertiteling zelf moet weergeven in plaats van ingebrande ondertiteling te gebruiken. Dit voorkomt transcoderen aan de serverkant maar kan de weergaveprestaties aan de spelerkant beïnvloeden.", "LabelAudioTagSettings": "Instellingen voor geluidstags", "LabelCustomTagDelimiters": "Aangepast scheidingsteken voor tags", "LabelCustomTagDelimitersHelp": "Tekens die als scheidingsteken worden gezien om tags van elkaar te scheiden.", @@ -1933,5 +1933,6 @@ "AudioLanguages": "Gesproken taal", "SubtitleLanguages": "Taal ondertiteling", "ViewDoublePage": "Dubbele paginaweergave", - "ViewSinglePage": "Enkele paginaweergave" + "ViewSinglePage": "Enkele paginaweergave", + "LabelUsernameAllowedCharactersHelp": "Gebruikersnamen mogen letters, cijfers, spaties en de volgende tekens bevatten: - _ ' . @ +. Ze mogen niet beginnen of eindigen met een spatie." } From cb88726d980b7ba4aabaca4400b3fce5d0ca6adc Mon Sep 17 00:00:00 2001 From: Bas <44002186+854562@users.noreply.github.com> Date: Thu, 30 Jul 2026 15:46:58 -0400 Subject: [PATCH 247/287] Translated using Weblate (Dutch) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/nl/ --- src/strings/nl.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/strings/nl.json b/src/strings/nl.json index a76cd1ade7..97dcc337d4 100644 --- a/src/strings/nl.json +++ b/src/strings/nl.json @@ -1934,5 +1934,10 @@ "SubtitleLanguages": "Taal ondertiteling", "ViewDoublePage": "Dubbele paginaweergave", "ViewSinglePage": "Enkele paginaweergave", - "LabelUsernameAllowedCharactersHelp": "Gebruikersnamen mogen letters, cijfers, spaties en de volgende tekens bevatten: - _ ' . @ +. Ze mogen niet beginnen of eindigen met een spatie." + "LabelUsernameAllowedCharactersHelp": "Gebruikersnamen mogen letters, cijfers, spaties en de volgende tekens bevatten: - _ ' . @ +. Ze mogen niet beginnen of eindigen met een spatie.", + "BitmapSubtitleAspectModeContain": "Passend", + "BitmapSubtitleAspectModeCover": "Vullen", + "BitmapSubtitleAspectModeHelp": "Bepaalt hoe door de speler gerenderde PGS- en Vobsub-onderitteling wordt geschaald naar het zichtbare videobeeld.", + "BitmapSubtitleAspectModeStretch": "Uitrekken", + "LabelBitmapSubtitleAspectMode": "Beeldverhouding bitmapondertiteling" } From c76d8f99eca6c3a1740ff200dfc4e90a52eda153 Mon Sep 17 00:00:00 2001 From: Gargotaire Date: Thu, 30 Jul 2026 16:40:29 -0400 Subject: [PATCH 248/287] Translated using Weblate (Catalan) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ca/ --- src/strings/ca.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/ca.json b/src/strings/ca.json index 564b378915..027fadf6a5 100644 --- a/src/strings/ca.json +++ b/src/strings/ca.json @@ -1933,5 +1933,7 @@ "ViewRightToLeft": "De dreta a esquerra", "SeriesName": "Nom de la sèrie", "AudioLanguages": "Idiomes de l'àudio", - "SubtitleLanguages": "Idiomes del subtítol" + "SubtitleLanguages": "Idiomes del subtítol", + "BitmapSubtitleAspectModeContain": "Conté", + "BitmapSubtitleAspectModeCover": "Tapa" } From be546d5fe85c38dfa242728ed3d1a53e76095a58 Mon Sep 17 00:00:00 2001 From: Lionel Morin Date: Thu, 30 Jul 2026 16:07:27 -0400 Subject: [PATCH 249/287] Translated using Weblate (French) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fr/ --- src/strings/fr.json | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/strings/fr.json b/src/strings/fr.json index 3509982cc4..beb6462735 100644 --- a/src/strings/fr.json +++ b/src/strings/fr.json @@ -1745,14 +1745,14 @@ "LabelSaveTrickplayLocally": "Enregistrer les images de prévisualisation (trickplay) au même emplacement que les médias", "LabelSaveTrickplayLocallyHelp": "Enregistrer les images trickplay dans les dossiers de médias les placera à côté de vos médias pour une migration et un accès faciles.", "MediaInfoRotation": "Rotation", - "RenderPgsSubtitle": "Rendu expérimental des sous-titres PGS", + "RenderPgsSubtitle": "Rendu expérimental des sous-titres PGS et VobSub", "ReplaceTrickplayImages": "Remplacer les images trickplay existantes", "LibraryInvalidItemIdError": "La bibliothèque est dans un état invalide et ne peut pas être modifiée. Vous rencontrez probablement un bug : le chemin dans la base de données n'est pas le bon chemin sur le système de fichiers.", "MessageCancelTimerError": "Une erreur est survenue lors de l'annulation du minuteur", "MessageSplitVersionsError": "Une erreur s'est produite lors de la division des versions", "PreferNonstandardArtistsTag": "Préférer la balise ARTISTS si disponible", "PreferNonstandardArtistsTagHelp": "Utiliser la balise non standard ARTISTS au lieu de la balise ARTIST lorsqu'elle est disponible.", - "RenderPgsSubtitleHelp": "Détermine si le client doit rendre les sous-titres PGS au lieu d'utiliser des sous-titres incrustés. Cela peut éviter le transcodage côté serveur au profit de la performance de rendu côté client.", + "RenderPgsSubtitleHelp": "Détermine si le client doit rendre les sous-titres PGS et VobSub au lieu d'utiliser des sous-titres incrustés. Cela peut éviter le transcodage côté serveur au profit de la performance de rendu côté client.", "UseCustomTagDelimiters": "Utiliser un délimiteur de balise personnalisé", "VideoCodecTagNotSupported": "La balise de codec vidéo n'est pas prise en charge", "LabelFallbackMaxStreamingBitrate": "Bitrate de flux maximum de repli (Mbps)", @@ -1933,5 +1933,9 @@ "ViewRightToLeft": "Droite à gauche", "SeriesName": "Nom de la série", "AudioLanguages": "Langues audio", - "SubtitleLanguages": "Langues des sous-titres" + "SubtitleLanguages": "Langues des sous-titres", + "BitmapSubtitleAspectModeContain": "Contient", + "BitmapSubtitleAspectModeHelp": "Contrôle comment les sous-titres PGS et VobSub rendus côté client sont mis à l'échelle par rapport à la zone vidéo visible.", + "BitmapSubtitleAspectModeStretch": "Étirer", + "LabelUsernameAllowedCharactersHelp": "Les noms d'utilisateur peuvent contenir des lettres, chiffres, espaces et les caractères suivants : - _ ' . @ +. Ils ne peuvent pas commencer ou finir par un espace." } From 8bab719a8f8f412e288033d2d8bf410407451944 Mon Sep 17 00:00:00 2001 From: ahmadjamel89 Date: Thu, 30 Jul 2026 18:09:07 -0400 Subject: [PATCH 250/287] Translated using Weblate (Kurdish (Central)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ckb/ --- src/strings/ckb.json | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/strings/ckb.json b/src/strings/ckb.json index aca86701f5..288fa8915d 100644 --- a/src/strings/ckb.json +++ b/src/strings/ckb.json @@ -45,5 +45,45 @@ "LabelTag": "تاگ", "LabelTagline": "دروشم", "LabelTextBackgroundColor": "ڕەنگی پاشبنەمای دەق", - "LabelTextColor": "ڕەنگی دەق" + "LabelTextColor": "ڕەنگی دەق", + "LabelTextSize": "قەبارەی دەق", + "LabelTextWeight": "کێشی دەق", + "Bold": "تۆخ", + "LabelTheme": "ڕووکار", + "LabelTime": "کات", + "LabelTimeLimitHours": "سنووری کات (کاتژمێر)", + "LabelTitle": "سەردێڕ", + "LabelTonemappingAlgorithm": "دیاریکردنی ئەلگۆریزمی نەخشەسازیی ڕەنگاوڕەنگی (تۆن مێپینگ) بۆ بەکارهێنانی", + "LabelTonemappingDesat": "کەمکردنەوەی ڕەنگاوڕەنگیی نەخشەسازیی ڕەنگ", + "LabelTonemappingDesatHelp": "جێبەجێکردنی کەمکردنەوەی ڕەنگ بۆ ئەو بریقە و ڕووناکییە بەرزانەی کە لەم ئاستەی ڕووناکی زیاترن. بەهای پێشنیارکراو بریتییە لە 0 (ناچالاککردن) .", + "LabelTonemappingParam": "پێوەری نەخشەسازیی ڕەنگ", + "LabelTonemappingParamHelp": "ڕێکخستنی ئەلگۆریزمی نەخشەسازیی ڕەنگ .", + "LabelTonemappingPeak": "لووتکەی نەخشەسازیی ڕەنگ", + "LabelTonemappingPeakHelp": "جێگیرکردنی ئەم بەهای لوتکەیە لە شوێنی بەهای مەتاداتا چێنراوەکەی نیشانەی چوونەژوورەوە. بەهای بنەڕەتی بریتییە لە 100 (1000 نێت).", + "LabelTonemappingRange": "مەودای نەخشەسازیی ڕەنگ", + "LabelTrackNumber": "ژمارەی تڕاک", + "LabelTranscodePath": "ڕێڕەوی وەرگێڕانی کۆد", + "LabelTranscodes": "وەرگێڕانەکانی کۆد", + "LabelTranscodingFramerate": "ڕێژەی چوارچێوەی وەرگێڕانی کۆد", + "LabelTranscodingProgress": "پێشکەوتنی وەرگێڕانی کۆد", + "LabelTranscodingTempPathHelp": "دیاریکردنی ڕێڕەوێکی تایبەت بۆ فایلە وەرگێڕدراوەکانی کۆد کە پێشکەش بە بەکارهێنەران دەکەن. بەتاڵی بهێڵەوە بۆ بەکارهێنانی بژاردەی بنەڕەتیی ڕاژەکار (سێرڤەر).", + "LabelTranscodingThreadCount": "ژمارەی ڕێچکەکانی وەرگێڕانی کۆد", + "LabelTranscodingThreadCountHelp": "دیاریکردنی زۆرترین ژمارەی ڕێچکەکان (تڕێدەکان) بۆ بەکارهاردن لە کاتی وەرگێڕانی کۆددا (ترانسکۆد). کەمکردنەوەی ژمارەی ڕێچکەکان دەبێتە هۆی کەمبوونەوەی بەکارهێنانی پرۆسێسەر (CPU)، بەڵام ڕەنگە نەتوانێت بە خێراییەکی پێویست فایلەکە بگۆڕێت بۆ ئەوەی پەخشێکی خلیسک و بێ کێشە دابین بکات.", + "LabelTriggerType": "جۆری تریگەر", + "LabelTunerIpAddress": "ناونیشانی ئایپیی تیۆنەر", + "LabelTunerType": "جۆری تیۆنەر", + "LabelTVHomeScreen": "پەنجەرەی سەرەکیی دۆخی تەلەڤزیۆن", + "LabelType": "جۆر", + "LabelTypeMetadataDownloaders": "دابەزێنەرەکانی مەتاداتا ({0})", + "LabelTypeText": "دەق", + "LabelUnstable": "ناجێگیرە", + "LabelUseSamePublishedServerUri": "بەکارهێنانی هەمان ناونیشانی بەڵاوکراوەی ڕاژەکار (سێرڤەر URI) بۆ دەستگەیشتنی ناوخۆیی و دەرەکی", + "LabelUser": "بەکارهێنەر", + "LabelUserAgent": "بریکاری بەکارهێنەر", + "LabelUserLoginAttemptsBeforeLockout": "ژمارەی هەوڵە سەرنەکەوتووەکانی چوونەژوورەوە پێش ئەوەی بەکارهێنەر قفڵ بکرێت", + "LabelUserMaxActiveSessions": "زۆرترین ژمارەی دانیشتنە هاوکاتەکانی بەکارهێنەر", + "LabelUsername": "ناوی بەکارهێنەر", + "LabelUserRemoteClientBitrateLimitHelp": "سه‌رپێچیکردن (ڕەتکردنەوەی) بەهای گشتیی بنەڕەتی کە لە ڕێکخستنەکانی ڕاژەکاردا دانراوە، سەیری داشبۆرد > لێدانی په‌خش (پەیباک) > پەخشکردن (سترینینگ) بکە.", + "LabelVaapiDevice": "ئامێری VA-API", + "LabelVaapiDeviceHelp": "ئەمە ئەو گرێی ڕێندەرکردنەیە (Render Node) کە بۆ خێراکردنی ڕەقەکاڵا (Hardware Acceleration) بەکاردێت." } From b15f232212480589f417dd9e969c14b3f633012b Mon Sep 17 00:00:00 2001 From: krvi <27792771+krvi@users.noreply.github.com> Date: Thu, 30 Jul 2026 20:57:00 -0400 Subject: [PATCH 251/287] Translated using Weblate (Faroese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fo/ --- src/strings/fo.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index 2d22b4db53..473b633834 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -634,5 +634,7 @@ "LabelDisplayLanguage": "Nýtaramótsmál", "LabelHardwareEncoding": "Tólbúnaðarkoting", "LastSeen": "Seinasta virksemi var fyri {0}", - "LabelAudioAttributes": "Ljóðeginleikar" + "LabelAudioAttributes": "Ljóðeginleikar", + "NextUp": "Næst á skránni", + "MaxParentalRatingHelp": "Innihald við hægri aldursmarki verður fjalt fyri hesum brúkaranum." } From 4b487aa0600944dc87fb649aac03d28fa4310409 Mon Sep 17 00:00:00 2001 From: dkanada Date: Fri, 31 Jul 2026 11:08:34 +0900 Subject: [PATCH 252/287] add fallback for calc rules on older browsers --- src/plugins/bookPlayer/style.scss | 4 ++++ src/plugins/comicsPlayer/style.scss | 4 ++++ src/plugins/pdfPlayer/style.scss | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/src/plugins/bookPlayer/style.scss b/src/plugins/bookPlayer/style.scss index ddf6976634..b1987025ff 100644 --- a/src/plugins/bookPlayer/style.scss +++ b/src/plugins/bookPlayer/style.scss @@ -20,8 +20,12 @@ inset: 0; z-index: 1000; width: 100%; + /* stylelint-disable declaration-block-no-duplicate-properties */ + top: 5vh; + height: 90vh; top: calc(5vh + env(safe-area-inset-top)); height: calc(90vh - env(safe-area-inset-top) - env(safe-area-inset-bottom)); + /* stylelint-enable declaration-block-no-duplicate-properties */ } #dialogToc { diff --git a/src/plugins/comicsPlayer/style.scss b/src/plugins/comicsPlayer/style.scss index 4fcf21a0c5..2944623e06 100644 --- a/src/plugins/comicsPlayer/style.scss +++ b/src/plugins/comicsPlayer/style.scss @@ -3,8 +3,12 @@ .slideshowSwiperContainer { position: relative; + /* stylelint-disable declaration-block-no-duplicate-properties */ + top: 5vh; + height: 90vh; top: calc(5vh + env(safe-area-inset-top)); height: calc(90vh - env(safe-area-inset-top) - env(safe-area-inset-bottom)); + /* stylelint-enable declaration-block-no-duplicate-properties */ } .slider-zoom-container { diff --git a/src/plugins/pdfPlayer/style.scss b/src/plugins/pdfPlayer/style.scss index 70182360cb..4f19dead74 100644 --- a/src/plugins/pdfPlayer/style.scss +++ b/src/plugins/pdfPlayer/style.scss @@ -2,8 +2,12 @@ position: relative; display: grid; place-items: center; + /* stylelint-disable declaration-block-no-duplicate-properties */ + top: 5vh; + height: 90vh; top: calc(5vh + env(safe-area-inset-top)); height: calc(90vh - env(safe-area-inset-top) - env(safe-area-inset-bottom)); + /* stylelint-enable declaration-block-no-duplicate-properties */ } #pdfPlayer { From 54c5ab015b4c1f8a63d105d7714f02569f9781fd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 31 Jul 2026 06:54:05 +0000 Subject: [PATCH 253/287] Update CI dependencies --- .github/workflows/__codeql.yml | 8 ++++---- .github/workflows/__package.yml | 2 +- .github/workflows/__quality_checks.yml | 4 ++-- .github/workflows/pull_request.yml | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/__codeql.yml b/.github/workflows/__codeql.yml index 095b73785d..81b2744cae 100644 --- a/.github/workflows/__codeql.yml +++ b/.github/workflows/__codeql.yml @@ -20,21 +20,21 @@ jobs: steps: - name: Checkout repository ⬇️ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: ref: ${{ inputs.commit }} show-progress: false - name: Initialize CodeQL 🛠️ - uses: github/codeql-action/init@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0 + uses: github/codeql-action/init@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4 with: queries: security-and-quality languages: ${{ matrix.language }} - name: Autobuild 📦 - uses: github/codeql-action/autobuild@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0 + uses: github/codeql-action/autobuild@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4 - name: Perform CodeQL Analysis 🧪 - uses: github/codeql-action/analyze@99df26d4f13ea111d4ec1a7dddef6063f76b97e9 # v4.37.0 + uses: github/codeql-action/analyze@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4 with: category: '/language:${{matrix.language}}' diff --git a/.github/workflows/__package.yml b/.github/workflows/__package.yml index e2750f8294..65fa2c5476 100644 --- a/.github/workflows/__package.yml +++ b/.github/workflows/__package.yml @@ -14,7 +14,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: ref: ${{ inputs.commit || github.sha }} diff --git a/.github/workflows/__quality_checks.yml b/.github/workflows/__quality_checks.yml index 95d51a732b..cedf9e4d8c 100644 --- a/.github/workflows/__quality_checks.yml +++ b/.github/workflows/__quality_checks.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout Repository - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: ref: ${{ inputs.commit }} show-progress: false @@ -42,7 +42,7 @@ jobs: steps: - name: Checkout ⬇️ - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: ref: ${{ inputs.commit }} show-progress: false diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 51bf488f26..d6d496077b 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -46,7 +46,7 @@ jobs: steps: - name: Check out Git repository - uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: ref: ${{ github.event.pull_request.head.sha }} From 39ad606ed872565024cb9fc8c10a466ec22eda51 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 31 Jul 2026 06:55:46 +0000 Subject: [PATCH 254/287] Update dependency autoprefixer to v10.5.4 --- package-lock.json | 86 +++++++++++++++++++++++++++++++++++------------ package.json | 2 +- 2 files changed, 65 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index df98778473..57f5d7842e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -91,7 +91,7 @@ "@typescript-eslint/parser": "8.62.0", "@uupaa/dynamic-import-polyfill": "1.0.2", "@vitest/coverage-v8": "3.2.7", - "autoprefixer": "10.5.2", + "autoprefixer": "10.5.4", "babel-loader": "10.1.1", "caniuse-lite": "1.0.30001803", "clean-webpack-plugin": "4.0.0", @@ -7895,9 +7895,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.5.2", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.2.tgz", - "integrity": "sha512-rD5t5DwOjJdmSORcTq64j8MawTC+tbQ+HHqjR4NDumamy/ambn1UJrlKL+KdwujWxMkFjPM3pPHOEA9tl4767Q==", + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz", + "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==", "dev": true, "funding": [ { @@ -7915,8 +7915,8 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.28.4", - "caniuse-lite": "^1.0.30001799", + "browserslist": "^4.28.6", + "caniuse-lite": "^1.0.30001806", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -7931,6 +7931,27 @@ "postcss": "^8.1.0" } }, + "node_modules/autoprefixer/node_modules/caniuse-lite": { + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -8300,9 +8321,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.10.38", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", - "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.1.tgz", + "integrity": "sha512-HYXq73DDpCtNzOmrFsm9eSwCvWCql0RzqjpDzXN9EadiLJ4DNat0nsZ/Bzmy+Ud12mb4/zKDY0cQ805ZzN+i0A==", "dev": true, "license": "Apache-2.0", "bin": { @@ -8482,9 +8503,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.4.tgz", - "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", "dev": true, "funding": [ { @@ -8502,10 +8523,10 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.10.38", - "caniuse-lite": "^1.0.30001799", - "electron-to-chromium": "^1.5.376", - "node-releases": "^2.0.48", + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", "update-browserslist-db": "^1.2.3" }, "bin": { @@ -8515,6 +8536,27 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/browserslist/node_modules/caniuse-lite": { + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -10391,9 +10433,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.5.377", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.377.tgz", - "integrity": "sha512-cH1jZgJHoezfTnKfKwnScpHywTFVnJUNITDPREFdhNjiuD502+QFpG0Qk7G8jhsV/f+CEAFlIrzP1fT+IMb92g==", + "version": "1.5.396", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.396.tgz", + "integrity": "sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ==", "dev": true, "license": "ISC" }, @@ -15861,9 +15903,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.48", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.48.tgz", - "integrity": "sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA==", + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 5e0580a01e..c7c4b92b96 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@typescript-eslint/parser": "8.62.0", "@uupaa/dynamic-import-polyfill": "1.0.2", "@vitest/coverage-v8": "3.2.7", - "autoprefixer": "10.5.2", + "autoprefixer": "10.5.4", "babel-loader": "10.1.1", "caniuse-lite": "1.0.30001803", "clean-webpack-plugin": "4.0.0", From bb9a1a4e505b3c171f5b7ce3c56854ce1f949b1b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 31 Jul 2026 06:56:15 +0000 Subject: [PATCH 255/287] Update Webpack --- package-lock.json | 67 ++++++++++++++--------------------------------- package.json | 4 +-- 2 files changed, 21 insertions(+), 50 deletions(-) diff --git a/package-lock.json b/package-lock.json index df98778473..c292b578fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -135,8 +135,8 @@ "typescript-eslint": "8.62.0", "vite-tsconfig-paths": "6.1.1", "vitest": "3.2.7", - "webpack": "5.108.4", - "webpack-bundle-analyzer": "5.3.0", + "webpack": "5.109.0", + "webpack-bundle-analyzer": "5.3.1", "webpack-cli": "7.2.1", "webpack-dev-server": "5.2.6", "webpack-merge": "6.0.1", @@ -7385,19 +7385,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -10428,9 +10415,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.24.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.1.tgz", - "integrity": "sha512-7DdUaTjmNwMcH2gLr1qycesKII3BK4RLy/mdAb7x10Lq7bR4aNKHt1BR1ZALSv0rPM/hF5wYF0PhGop/rJm8vw==", + "version": "5.24.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.3.tgz", + "integrity": "sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==", "dev": true, "license": "MIT", "dependencies": { @@ -15050,20 +15037,6 @@ "uc.micro": "^2.0.0" } }, - "node_modules/loader-runner": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", - "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -24828,9 +24801,9 @@ } }, "node_modules/webpack": { - "version": "5.108.4", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.108.4.tgz", - "integrity": "sha512-yur8LyJoeiWh47dErD+Ok7vlbmDsJ3UbbRPAoxbGJ54WpE2y5yVo5G/inUzujnYgw3tPmBRdn+G7PoxXaYC33w==", + "version": "5.109.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.109.0.tgz", + "integrity": "sha512-vomrngskVVXEZF9sMZfYAd4pXZUnfaWdJGlF+BTNF+gJBCKYCQBnOeVPlrh39Ewl7nlCsirDplMy6o5g9xJHBg==", "dev": true, "license": "MIT", "dependencies": { @@ -24840,22 +24813,20 @@ "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.16.0", - "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.22.2", + "enhanced-resolve": "^5.24.2", "es-module-lexer": "^2.1.0", "eslint-scope": "5.1.1", "events": "^3.2.0", "graceful-fs": "^4.2.11", - "loader-runner": "^4.3.2", "mime-db": "^1.54.0", "minimizer-webpack-plugin": "^5.6.1", "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", "watchpack": "^2.5.2", - "webpack-sources": "^3.5.0" + "webpack-sources": "^3.5.1" }, "bin": { "webpack": "bin/webpack.js" @@ -24874,9 +24845,9 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-5.3.0.tgz", - "integrity": "sha512-PEhAoqiJ+47d0uLMx/+zo5XOvaU+Vk6N2ZLht7H3n09QLy/fhyvqGNwjdRUHJDgMN8crBR2ZwVHkIswT3Xuawg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-5.3.1.tgz", + "integrity": "sha512-wP2EusncRGL1tZyMHC/umLkjPdYMkTL9nPEKh8G8dkYCJ9TyF6xnXFqjhdqmv5J900irN/g0P5jMvLT22krEXQ==", "dev": true, "license": "MIT", "dependencies": { @@ -25117,9 +25088,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.0.tgz", - "integrity": "sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", + "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", "dev": true, "license": "MIT", "engines": { @@ -25134,9 +25105,9 @@ "license": "MIT" }, "node_modules/webpack/node_modules/es-module-lexer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.0.tgz", - "integrity": "sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index 5e0580a01e..ab4458ab41 100644 --- a/package.json +++ b/package.json @@ -69,8 +69,8 @@ "typescript-eslint": "8.62.0", "vite-tsconfig-paths": "6.1.1", "vitest": "3.2.7", - "webpack": "5.108.4", - "webpack-bundle-analyzer": "5.3.0", + "webpack": "5.109.0", + "webpack-bundle-analyzer": "5.3.1", "webpack-cli": "7.2.1", "webpack-dev-server": "5.2.6", "webpack-merge": "6.0.1", From 7a2e11ccd764d1846587c1fa5d5020219fca6f17 Mon Sep 17 00:00:00 2001 From: MrPlow Date: Fri, 31 Jul 2026 05:59:55 -0400 Subject: [PATCH 256/287] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/de.json b/src/strings/de.json index a23a2f9510..2349ec32e8 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1933,5 +1933,7 @@ "AudioLanguages": "Audio-Sprachen", "SubtitleLanguages": "Untertitel-Sprachen", "ViewDoublePage": "Doppelseitenansicht", - "ViewSinglePage": "Einzelseitenansicht" + "ViewSinglePage": "Einzelseitenansicht", + "BitmapSubtitleAspectModeContain": "Enthalten", + "BitmapSubtitleAspectModeCover": "Abdecken" } From 361370865f8bb40945b280bfcea027b2903b3d37 Mon Sep 17 00:00:00 2001 From: hoanghuy309 Date: Fri, 31 Jul 2026 04:56:52 -0400 Subject: [PATCH 257/287] Translated using Weblate (Vietnamese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/vi/ --- src/strings/vi.json | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/strings/vi.json b/src/strings/vi.json index 21483d91f2..b8f3eb2c34 100644 --- a/src/strings/vi.json +++ b/src/strings/vi.json @@ -1734,8 +1734,8 @@ "AlwaysRemuxMp3AudioFilesHelp": "Nếu bạn có các tệp mà trình duyệt của bạn tính toán dấu thời gian không chính xác, hãy kích hoạt tính năng này như một giải pháp thay thế.", "DisableVbrAudioEncodingHelp": "Ngăn máy chủ mã hóa âm thanh bằng VBR cho máy khách này.", "LyricDownloadersHelp": "Bật và xếp hạng ưu tiên các trình tải về lời bài hát ưa thích của bạn.", - "RenderPgsSubtitle": "Kết xuất phụ đề PGS thử nghiệm", - "RenderPgsSubtitleHelp": "Xác định xem khách hàng có nên hiển thị phụ đề PGS thay vì sử dụng phụ đề ghi sẵn hay không. Điều này có thể tránh việc chuyển mã phía máy chủ để đổi lấy hiệu suất hiển thị phía máy khách.", + "RenderPgsSubtitle": "Thử nghiệm hiển thị phụ đề PGS và VobSub", + "RenderPgsSubtitleHelp": "Xác định xem máy khách có nên hiển thị phụ đề PGS và VobSub thay vì sử dụng phụ đề được nhúng sẵn hay không. Điều này có thể tránh được việc chuyển mã phía máy chủ nhưng đổi lại sẽ làm giảm hiệu suất hiển thị phía máy khách.", "LabelLyricDownloaders": "Trình tải lời bài hát", "LabelAllowFmp4TranscodingContainer": "Cho phép vùng chứa chuyển mã fMP4", "LabelAllowStreamSharing": "Cho phép chia sẻ luồng", @@ -1931,5 +1931,9 @@ "ViewRightToLeft": "Phải sang Trái", "AudioLanguages": "Các ngôn ngữ âm thanh", "SubtitleLanguages": "Các ngôn ngữ phụ đề", - "SeriesName": "Tên Loạt Phim" + "SeriesName": "Tên Loạt Phim", + "BitmapSubtitleAspectModeHelp": "Tùy chỉnh cách phụ đề PGS và VobSub do máy khách hiển thị được điều chỉnh tỷ lệ sao cho phù hợp với vùng video hiển thị.", + "BitmapSubtitleAspectModeStretch": "Kéo dài", + "LabelBitmapSubtitleAspectMode": "Chế độ tỷ lệ khung hình phụ đề bitmap", + "LabelUsernameAllowedCharactersHelp": "Tên người dùng có thể chứa chữ cái, số, dấu cách và các ký tự sau: - _ ' . @ +. Tên người dùng không được bắt đầu hoặc kết thúc bằng khoảng trắng." } From b45595376176ae7ec39dc6781efa4eda6ea266bf Mon Sep 17 00:00:00 2001 From: ahmadjamel89 Date: Fri, 31 Jul 2026 04:58:06 -0400 Subject: [PATCH 258/287] Translated using Weblate (Kurdish (Central)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ckb/ --- src/strings/ckb.json | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/strings/ckb.json b/src/strings/ckb.json index 288fa8915d..cece69fa68 100644 --- a/src/strings/ckb.json +++ b/src/strings/ckb.json @@ -85,5 +85,46 @@ "LabelUsername": "ناوی بەکارهێنەر", "LabelUserRemoteClientBitrateLimitHelp": "سه‌رپێچیکردن (ڕەتکردنەوەی) بەهای گشتیی بنەڕەتی کە لە ڕێکخستنەکانی ڕاژەکاردا دانراوە، سەیری داشبۆرد > لێدانی په‌خش (پەیباک) > پەخشکردن (سترینینگ) بکە.", "LabelVaapiDevice": "ئامێری VA-API", - "LabelVaapiDeviceHelp": "ئەمە ئەو گرێی ڕێندەرکردنەیە (Render Node) کە بۆ خێراکردنی ڕەقەکاڵا (Hardware Acceleration) بەکاردێت." + "LabelVaapiDeviceHelp": "ئەمە ئەو گرێی ڕێندەرکردنەیە (Render Node) کە بۆ خێراکردنی ڕەقەکاڵا (Hardware Acceleration) بەکاردێت.", + "LabelValue": "بەها", + "LabelVersion": "وەشان", + "LabelVersionInstalled": "{0} دامەزراوە", + "LabelVideoBitrate": "ڕێژەی خێرایی داتای ڤیدیۆ", + "LabelVideoCodec": "کۆدەکی ڤیدیۆ", + "LabelVideoRange": "مەودای ڤیدیۆ", + "LabelVideoResolution": "ڕوونی ڤیدیۆ", + "LabelSelectPreferredTranscodeVideoCodec": "کۆدەکی پەسەندکراوی وەرگێڕانی کۆدی ڤیدیۆ", + "LabelWeb": "وێب", + "LabelWebVersion": "وەشانی وێب", + "LabelYear": "ساڵ", + "LabelYoureDone": "کارەکەت تەواو بوو!", + "LabelZipCode": "کۆدی پۆستی", + "LanNetworksHelp": "ڕیزبەندییەکی ناونیشانی IP یان دخلەکانی IP/netmask کە بە کلیلەی بۆتە (کۆما) لێک جیاکراونەتەوە بۆ ئەو تۆڕانەی کە لە کاتی جێبەجێکردنی سنوردارکردنی پانیی باند (بەندوایت) و دەستپێگەیشتنی دوور مەودادا بە بەشێک لە تۆڕی ناوخۆیی دادەنرێن. ئەگەر بە بەتاڵی جێبهێڵرێت، هەموو ناونیشانی RFC1918 بە ناوخۆیی دادەنرێن.", + "Large": "گەورە", + "Larger": "گەورەتر", + "LastActive": "دوا چالاک", + "LastSeen": "دوا چالاکی {0}", + "LatestFromLibrary": "بەم دواییە زیادکرا لە {0}", + "LearnHowYouCanContribute": "فێربە چۆن دەتوانیت بەشداری بکەیت.", + "LeaveBlankToNotSetAPassword": "دەتوانیت ئەم مەودایە (خانەیە) بە بەتاڵی جێبهێڵیت بۆ ئەوەی هیچ تێپەڕەوشەیەک (پاسۆردێک) دانەنێیت.", + "Letterer": "نامەنووس", + "LibrariesLoadError": "شکستی هێنا لە بارکردنی کتێبخانەکان", + "LibraryAccessHelp": "کتێبخانەکان هەڵبژێرە بۆ هاوبەشکردن لەگەڵ ئەم بەکارهێنەرە. بەڕێوەبەران دەتوانیت سەرجەم بوخچەکان دەستکاری بکەن بە بەکارهێنانی بەڕێوەبەری زانیارییە بنەڕەتییەکان .", + "LibraryNameInvalid": "ناوی کتێبخانە نابێت بەتاڵ بێت.", + "LibraryScanFanoutConcurrency": "سنووری ئەركە هاوکاتەکانی پشکنینی کتێبخانە", + "LibraryScanFanoutConcurrencyHelp": "زۆرترین ژمارەی ئەرکە هاوکاتەکان لە کاتی پشکنینی کتێبخانەکاندا. بە بەتاڵ جێهێشتنی ئەم خانەیە سنوورێک هەڵدەبژێرێت کە پشت بە ژمارەی ناوکەکانی سیستەمەکەت دەبەستێت. ئاگاداری: بەرزکردنەوەی ئەم ژمارەیە بۆ ئاستێکی زۆر بەرز ڕەنگە کێشە لەگەڵ سیستەمی فایلەکانی تۆڕدا دروست بکات؛ ئەگەر تووشی کێشە بوویت، ئەم ژمارەیە کەم بکەرەوە.", + "LibraryInvalidItemIdError": "کتێبخانەکە لە دۆخێکی نەگونجاودایە و ناتوانرێت دەستکاری بکرێت. لەوانەیە تووشی هەڵەیەک (بۆگێک) ببیت: ڕێڕەوەکە لە بنکەدراوەدا ڕێڕەوی ڕاستەقینە نییە لەسەر سیستەمی فایلەکان.", + "LimitSegmentLength": "بەکارهێنانی پارچەی کورتر بۆ HLS", + "LimitSegmentLengthHelp": "چالاککردنی ئەم هەڵبژاردەیە ڕەنگە یارمەتیدەر بێت لە ڕێگریکردن لە سڕبوون یان وەستانی یاریگەری (پلەیەر)ی HLS لە کاتی گەڕان و پێشخستن/دواخستنی ڤیدیۆ لە هەندێک ئامێردا، وەک تەلەفزیۆنەکانی webOS.", + "LimitSupportedVideoResolution": "سنووردارکردنی زۆرترین روونی پشتگیریکراوی ڤیدیۆ", + "LimitSupportedVideoResolutionHelp": "بەکارهێنانی 'زۆرترین ڕوونیی ڕێگەپێدراو بۆ تڕانسکۆدکردنی ڤیدیۆ' وەک زۆرترین ڕوونیی ڤیدیۆی پشتگیریکراو.", + "List": "لیست", + "ListView": "دیمەنی لیست", + "ListPaging": "{0}-{1} لە {2}", + "Live": "ڕاستەوخۆ", + "LiveBroadcasts": "پەخشە ڕاستەوخۆکان", + "LiveTV": "تەلەفزیۆنی ڕاستەوخۆ", + "LiveTVPageLoadError": "شکستی هێنا لە بارکردنی پەڕەی تۆمارکراوەکان", + "Localization": "خۆجێیکردن", + "LogLevel.Trace": "شوێنپێ" } From b25692e04cbe8484dabbab227454d47378377721 Mon Sep 17 00:00:00 2001 From: Helak Date: Fri, 31 Jul 2026 07:17:25 -0400 Subject: [PATCH 259/287] Translated using Weblate (Czech) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/cs/ --- src/strings/cs.json | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/strings/cs.json b/src/strings/cs.json index 6ef1b0a690..c51a1f82f7 100644 --- a/src/strings/cs.json +++ b/src/strings/cs.json @@ -1679,7 +1679,7 @@ "SaveLyricsIntoMediaFoldersHelp": "Uložení textů písní spolu se zvukovými souboru je snazší pro správu.", "Author": "Autor", "Colorist": "Kolorista", - "CoverArtist": "Obálka", + "CoverArtist": "Autor obálky", "Creator": "Tvůrce", "Editor": "Editor", "Illustrator": "Ilustrátor", @@ -1757,8 +1757,8 @@ "MessageSplitVersionsError": "Při rozdělování verzí došlo k chybě", "PreferNonstandardArtistsTag": "Preferovat značku ARTISTS, pokud existuje", "PreferNonstandardArtistsTagHelp": "Použít nestandardní značku ARTISTS místo ARTIST, pokud je k dispozici.", - "RenderPgsSubtitle": "Experimentální rendrování titulků ve formátu PGS", - "RenderPgsSubtitleHelp": "Zda má klient zobrazit titulky ve formátu PGS místo jejich vypálení do obrazu. Můžete se tak vyhnout překódování na serveru výměnou za horší výkon klienta.", + "RenderPgsSubtitle": "Experimentální vykreslování titulků ve formátech PGS a VobSub", + "RenderPgsSubtitleHelp": "Určete, zda má klient vykreslovat titulky ve formátech PGS a VobSub namísto použití titulků vypálených do videa. Tím lze zabránit transkódování na straně serveru, avšak na úkor výkonu vykreslování na straně klienta.", "UseCustomTagDelimiters": "Použít vlastní oddělovač štítků", "UseCustomTagDelimitersHelp": "Rozdělit štítky pro umělce a žánry pomocí vlastních znaků.", "LabelScreensaverTime": "Prodleva spořiče obrazovky", @@ -1933,5 +1933,11 @@ "ViewRightToLeft": "Zprava doleva", "SeriesName": "Název seriálu", "AudioLanguages": "Jazyky zvuku", - "SubtitleLanguages": "Jazyky titulků" + "SubtitleLanguages": "Jazyky titulků", + "BitmapSubtitleAspectModeContain": "Obsahuje", + "BitmapSubtitleAspectModeCover": "Obálka", + "BitmapSubtitleAspectModeHelp": "Určuje, jakým způsobem se titulky ve formátech PGS a VobSub, které jsou vykreslovány na straně klienta, přizpůsobují viditelné oblasti videa.", + "BitmapSubtitleAspectModeStretch": "Roztáhnout", + "LabelBitmapSubtitleAspectMode": "Režim zobrazení bitmapových titulků", + "LabelUsernameAllowedCharactersHelp": "Uživatelská jména mohou obsahovat písmena, číslice, mezery a následující znaky: - _ ' . @ +. Nesmí začínat ani končit mezerou." } From 842a6cb33c16b9617f3ad1355eb88aea411c9b65 Mon Sep 17 00:00:00 2001 From: MrPlow Date: Fri, 31 Jul 2026 06:01:34 -0400 Subject: [PATCH 260/287] Translated using Weblate (German) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/de/ --- src/strings/de.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/de.json b/src/strings/de.json index 2349ec32e8..1c9f731ed5 100644 --- a/src/strings/de.json +++ b/src/strings/de.json @@ -1935,5 +1935,7 @@ "ViewDoublePage": "Doppelseitenansicht", "ViewSinglePage": "Einzelseitenansicht", "BitmapSubtitleAspectModeContain": "Enthalten", - "BitmapSubtitleAspectModeCover": "Abdecken" + "BitmapSubtitleAspectModeCover": "Abdecken", + "BitmapSubtitleAspectModeHelp": "Bestimmt, wie von Clients gerenderte PGS und VobSub Untertitel auf den sichtbaren Videoereich skaliert werden.", + "BitmapSubtitleAspectModeStretch": "Strecken" } From 13ff5beb04c467c9347390a8572da63e8c11e454 Mon Sep 17 00:00:00 2001 From: ahmadjamel89 Date: Fri, 31 Jul 2026 07:56:17 -0400 Subject: [PATCH 261/287] Translated using Weblate (Kurdish (Central)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ckb/ --- src/strings/ckb.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/strings/ckb.json b/src/strings/ckb.json index cece69fa68..01b27682b8 100644 --- a/src/strings/ckb.json +++ b/src/strings/ckb.json @@ -126,5 +126,10 @@ "LiveTV": "تەلەفزیۆنی ڕاستەوخۆ", "LiveTVPageLoadError": "شکستی هێنا لە بارکردنی پەڕەی تۆمارکراوەکان", "Localization": "خۆجێیکردن", - "LogLevel.Trace": "شوێنپێ" + "LogLevel.Trace": "شوێنپێ", + "LogLevel.Debug": "چاککردنەوە", + "LogLevel.Information": "زانیاری", + "LogLevel.Warning": "ئاگاداری", + "LogLevel.Error": "هەڵە", + "LogLevel.Critical": "گرنگترین" } From 5a16e9bcd6c1fbf83439bf033208c1d21c2560bd Mon Sep 17 00:00:00 2001 From: ahmadjamel89 Date: Fri, 31 Jul 2026 08:40:00 -0400 Subject: [PATCH 262/287] Translated using Weblate (Kurdish (Central)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ckb/ --- src/strings/ckb.json | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/strings/ckb.json b/src/strings/ckb.json index 01b27682b8..84bde078fb 100644 --- a/src/strings/ckb.json +++ b/src/strings/ckb.json @@ -131,5 +131,19 @@ "LogLevel.Information": "زانیاری", "LogLevel.Warning": "ئاگاداری", "LogLevel.Error": "هەڵە", - "LogLevel.Critical": "گرنگترین" + "LogLevel.Critical": "گرنگترین", + "LogLevel.None": "هیچ", + "Logo": "لۆگۆ", + "LogoScreensaver": "پارێزەری شاشەی لۆگۆ", + "Lyric": "هۆنراوە", + "Lyricist": "هۆنراوەنووس", + "Lyrics": "هۆنراوەکان", + "LyricDownloadersHelp": "چالاککردن و ڕیزکردنی دابەزێنەرە پەسەندکراوەکانی هۆنراوە بەپێی پلەی گرنگی .", + "ManageLibrary": "بەڕێوەبردنی کتێبخانە", + "ManageRecording": "بەڕێوەبردنی تۆمارکردن", + "ManageRepositories": "بەڕێوەبردنی کۆگاکان", + "MapChannels": "نەخشەکردنی کەناڵەکان", + "MarkPlayed": "دیاریکراو وەک لێدراو", + "MarkUnplayed": "دیاریکراو وەک نەلێدراو", + "MaxParentalRatingHelp": "ناوەڕۆکێک کە هەڵسەنگاندنێکی بەرزی هەبێت لەم بەکارهێنەرە شاردراوە دەبێت." } From 09d565e76ea4ca11eb36433135b527aeb67596ab Mon Sep 17 00:00:00 2001 From: ahmadjamel89 Date: Fri, 31 Jul 2026 09:07:23 -0400 Subject: [PATCH 263/287] Translated using Weblate (Kurdish (Central)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ckb/ --- src/strings/ckb.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/strings/ckb.json b/src/strings/ckb.json index 84bde078fb..ee6a1d4562 100644 --- a/src/strings/ckb.json +++ b/src/strings/ckb.json @@ -145,5 +145,10 @@ "MapChannels": "نەخشەکردنی کەناڵەکان", "MarkPlayed": "دیاریکراو وەک لێدراو", "MarkUnplayed": "دیاریکراو وەک نەلێدراو", - "MaxParentalRatingHelp": "ناوەڕۆکێک کە هەڵسەنگاندنێکی بەرزی هەبێت لەم بەکارهێنەرە شاردراوە دەبێت." + "MaxParentalRatingHelp": "ناوەڕۆکێک کە هەڵسەنگاندنێکی بەرزی هەبێت لەم بەکارهێنەرە شاردراوە دەبێت.", + "MediaInfoAnamorphic": "شێوەگۆڕاو", + "MediaInfoAspectRatio": "ڕێژەی ڕووبەر", + "MediaInfoBitDepth": "قووڵی بیت", + "MediaInfoBitrate": "ڕێژەی بیت", + "MediaInfoChannels": "کەناڵەکان" } From d6d375d8e1f9ad56ff6e0dc124587492a54c80a9 Mon Sep 17 00:00:00 2001 From: Callum Wong Date: Sat, 1 Aug 2026 00:57:36 +1000 Subject: [PATCH 264/287] Use enum values from the SDK for playback state --- src/components/playback/playbackmanager.js | 3 ++- src/plugins/sessionPlayer/plugin.js | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/playback/playbackmanager.js b/src/components/playback/playbackmanager.js index ed78d09356..3a6068a0fa 100644 --- a/src/components/playback/playbackmanager.js +++ b/src/components/playback/playbackmanager.js @@ -2,6 +2,7 @@ import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-ite import { ItemFilter } from '@jellyfin/sdk/lib/generated-client/models/item-filter'; import { ItemSortBy } from '@jellyfin/sdk/lib/generated-client/models/item-sort-by'; import { MediaType } from '@jellyfin/sdk/lib/generated-client/models/media-type'; +import { PlaybackOrder } from '@jellyfin/sdk/lib/generated-client/models/playback-order'; import { PlaybackErrorCode } from '@jellyfin/sdk/lib/generated-client/models/playback-error-code'; import { getMediaInfoApi } from '@jellyfin/sdk/lib/utils/api/media-info-api'; import merge from 'lodash-es/merge'; @@ -2177,7 +2178,7 @@ export class PlaybackManager { state.PlayState.RepeatMode = self.getRepeatMode(player); state.PlayState.ShuffleMode = self.getQueueShuffleMode(player); // Needed for remote control because ShuffleMode doesn't exist in PlayerStateInfo from the server - state.PlayState.PlaybackOrder = state.PlayState.ShuffleMode === 'Shuffle' ? 'Shuffle' : 'Default'; + state.PlayState.PlaybackOrder = state.PlayState.ShuffleMode === 'Shuffle' ? PlaybackOrder.Shuffle : PlaybackOrder.Default; state.PlayState.MaxStreamingBitrate = self.getMaxStreamingBitrate(player); state.PlayState.PositionTicks = getCurrentTicks(player); diff --git a/src/plugins/sessionPlayer/plugin.js b/src/plugins/sessionPlayer/plugin.js index 0a0d5b5867..e5de4105d2 100644 --- a/src/plugins/sessionPlayer/plugin.js +++ b/src/plugins/sessionPlayer/plugin.js @@ -1,5 +1,7 @@ import isEqual from 'lodash-es/isEqual'; import { OutboundWebSocketMessageType, PeriodicListenerInterval } from '@jellyfin/sdk/lib/websocket'; +import { PlaybackOrder } from '@jellyfin/sdk/lib/generated-client/models/playback-order'; +import { RepeatMode } from '@jellyfin/sdk/lib/generated-client/models/repeat-mode'; import { playbackManager } from 'components/playback/playbackmanager'; import { PluginType } from 'constants/pluginType'; @@ -537,7 +539,7 @@ class SessionPlayer { getRepeatMode() { let state = this.lastPlayerData || {}; state = state.PlayState || {}; - return state.RepeatMode || 'RepeatNone'; + return state.RepeatMode || RepeatMode.RepeatNone; } setQueueShuffleMode(mode) { @@ -549,7 +551,7 @@ class SessionPlayer { getQueueShuffleMode() { let state = this.lastPlayerData || {}; state = state.PlayState || {}; - return state.PlaybackOrder === 'Shuffle' ? 'Shuffle' : 'Sorted'; + return state.PlaybackOrder === PlaybackOrder.Shuffle ? 'Shuffle' : 'Sorted'; } displayContent(options) { From 675556c53febb34b78d2fe5b6f446d896f899f5f Mon Sep 17 00:00:00 2001 From: theguymadmax Date: Fri, 31 Jul 2026 11:09:30 -0400 Subject: [PATCH 265/287] Apply review feedback --- src/apps/modern/features/libraries/components/ItemsView.tsx | 2 +- src/apps/modern/features/libraries/components/SortButton.tsx | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/apps/modern/features/libraries/components/ItemsView.tsx b/src/apps/modern/features/libraries/components/ItemsView.tsx index 613feda79c..629fb6281d 100644 --- a/src/apps/modern/features/libraries/components/ItemsView.tsx +++ b/src/apps/modern/features/libraries/components/ItemsView.tsx @@ -171,7 +171,7 @@ const ItemsView: FC = () => { noItemsMessage ]); - const hasSortName = libraryViewSettings.SortBy[0] !== ItemSortBy.Random; + const hasSortName = !libraryViewSettings.SortBy.includes(ItemSortBy.Random); const itemsContainerClass = classNames( 'padded-left padded-right', diff --git a/src/apps/modern/features/libraries/components/SortButton.tsx b/src/apps/modern/features/libraries/components/SortButton.tsx index 31f6224a55..e73a4df736 100644 --- a/src/apps/modern/features/libraries/components/SortButton.tsx +++ b/src/apps/modern/features/libraries/components/SortButton.tsx @@ -14,6 +14,7 @@ import Popover from '@mui/material/Popover'; import globalize from 'lib/globalize'; import { LibraryViewSettings } from 'types/library'; import { LibraryTab } from 'types/libraryTab'; +import isEqual from 'lodash-es/isEqual'; type SortOption = { label: string; @@ -190,7 +191,7 @@ const SortButton: FC = ({ setLibraryViewSettings((prevState) => { let sortOrder: SortOrder = SortOrder.Ascending; // If the user clicks the currently selected sort option, toggle the sort order - if (prevState.SortBy[0] === sortBy[0]) { + if (isEqual(prevState.SortBy, sortBy)) { sortOrder = prevState.SortOrder === SortOrder.Ascending ? SortOrder.Descending : SortOrder.Ascending; } @@ -243,7 +244,7 @@ const SortButton: FC = ({ {globalize.translate(option.label)} - {libraryViewSettings.SortBy[0] === option.value[0] && ( + {isEqual(libraryViewSettings.SortBy, option.value) && ( libraryViewSettings.SortOrder === SortOrder.Ascending ? ( ) : ( From 8d897123c9dac2ff0853e7ad609b869c2fbeedd5 Mon Sep 17 00:00:00 2001 From: theguymadmax Date: Fri, 31 Jul 2026 11:12:06 -0400 Subject: [PATCH 266/287] Fix songs tab sorting --- .../features/libraries/components/SortButton.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/apps/modern/features/libraries/components/SortButton.tsx b/src/apps/modern/features/libraries/components/SortButton.tsx index e73a4df736..a53bf3e01f 100644 --- a/src/apps/modern/features/libraries/components/SortButton.tsx +++ b/src/apps/modern/features/libraries/components/SortButton.tsx @@ -106,16 +106,16 @@ const sortOptionsMapping: SortOptionsMapping = { { label: 'IndexNumber', value: [ItemSortBy.IndexNumber, ItemSortBy.SortName] } ], [LibraryTab.Songs]: [ - { label: 'Name', value: [ItemSortBy.SortName] }, + { label: 'OptionTrackName', value: [ItemSortBy.Name] }, { label: 'OptionRandom', value: [ItemSortBy.Random] }, - { label: 'Album', value: [ItemSortBy.Album, ItemSortBy.SortName] }, - { label: 'AlbumArtist', value: [ItemSortBy.AlbumArtist, ItemSortBy.SortName] }, - { label: 'Artist', value: [ItemSortBy.Artist, ItemSortBy.SortName] }, + { label: 'Album', value: [ItemSortBy.Album, ItemSortBy.AlbumArtist, ItemSortBy.SortName] }, + { label: 'AlbumArtist', value: [ItemSortBy.AlbumArtist, ItemSortBy.Album, ItemSortBy.SortName] }, + { label: 'Artist', value: [ItemSortBy.Artist, ItemSortBy.Album, ItemSortBy.SortName] }, { label: 'OptionDateAdded', value: [ItemSortBy.DateCreated, ItemSortBy.SortName] }, { label: 'OptionDatePlayed', value: [ItemSortBy.DatePlayed, ItemSortBy.SortName] }, { label: 'OptionPlayCount', value: [ItemSortBy.PlayCount, ItemSortBy.SortName] }, - { label: 'OptionReleaseDate', value: [ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.SortName] }, - { label: 'Runtime', value: [ItemSortBy.Runtime, ItemSortBy.SortName] } + { label: 'OptionReleaseDate', value: [ItemSortBy.ProductionYear, ItemSortBy.PremiereDate, ItemSortBy.AlbumArtist, ItemSortBy.Album, ItemSortBy.SortName] }, + { label: 'Runtime', value: [ItemSortBy.Runtime, ItemSortBy.AlbumArtist, ItemSortBy.Album, ItemSortBy.SortName] } ], [LibraryTab.Playlists]: [ { label: 'Name', value: [ItemSortBy.SortName] }, From 9c1df2f3222fc836f52b135e643481fa04c9af8f Mon Sep 17 00:00:00 2001 From: ahmadjamel89 Date: Fri, 31 Jul 2026 13:03:20 -0400 Subject: [PATCH 267/287] Translated using Weblate (Kurdish (Central)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ckb/ --- src/strings/ckb.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/strings/ckb.json b/src/strings/ckb.json index ee6a1d4562..ed590e32be 100644 --- a/src/strings/ckb.json +++ b/src/strings/ckb.json @@ -150,5 +150,8 @@ "MediaInfoAspectRatio": "ڕێژەی ڕووبەر", "MediaInfoBitDepth": "قووڵی بیت", "MediaInfoBitrate": "ڕێژەی بیت", - "MediaInfoChannels": "کەناڵەکان" + "MediaInfoChannels": "کەناڵەکان", + "Disabled": "ناچالاککراو", + "Settings": "ڕێکخستنەکان", + "Watch": "سەیرکردن" } From e819f8618e56fc00a564bbc0eb53d67f36f2b2f9 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Fri, 31 Jul 2026 16:12:44 -0400 Subject: [PATCH 268/287] Remove unnecessary passing of fake livetv id --- .../modern/features/libraries/components/PageTabContent.tsx | 1 - .../features/libraries/components/ProgramsSectionView.tsx | 5 +---- src/hooks/useFetchItems.ts | 3 +-- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/apps/modern/features/libraries/components/PageTabContent.tsx b/src/apps/modern/features/libraries/components/PageTabContent.tsx index 484b48bb42..430e09f673 100644 --- a/src/apps/modern/features/libraries/components/PageTabContent.tsx +++ b/src/apps/modern/features/libraries/components/PageTabContent.tsx @@ -34,7 +34,6 @@ const PageTabContent: FC = ({ parentId, currentTab }) => { if (currentTab.viewType === LibraryTab.Programs || currentTab.viewType === LibraryTab.Recordings || currentTab.viewType === LibraryTab.Schedule) { return ( = ({ - parentId, sectionType, isUpcomingRecordingsEnabled = false }) => { const { __legacyApiClient__ } = useApi(); - const { isLoading, data: sectionsWithItems, refetch } = useGetProgramsSectionsWithItems(parentId, sectionType); + const { isLoading, data: sectionsWithItems, refetch } = useGetProgramsSectionsWithItems(sectionType); const { isLoading: isUpcomingRecordingsLoading, data: upcomingRecordings diff --git a/src/hooks/useFetchItems.ts b/src/hooks/useFetchItems.ts index 5d6ab0c75f..02f9509da6 100644 --- a/src/hooks/useFetchItems.ts +++ b/src/hooks/useFetchItems.ts @@ -954,14 +954,13 @@ export const useGetSuggestionSectionsWithItems = ( }; export const useGetProgramsSectionsWithItems = ( - parentId: ParentId, programSectionType: SectionType[] ) => { const currentApi = useApi(); const sections = getProgramSections(); return useQuery({ queryKey: ['ProgramSectionWithItems', { programSectionType }], - queryFn: ({ signal }) => getSectionsWithItems(currentApi, parentId, sections, programSectionType, { signal }), + queryFn: ({ signal }) => getSectionsWithItems(currentApi, undefined, sections, programSectionType, { signal }), enabled: !!currentApi.api && !!currentApi.user?.Id }); }; From 63022b1e1e21f0e27095c13d2c1ba0a337526435 Mon Sep 17 00:00:00 2001 From: Bill Thornton Date: Fri, 31 Jul 2026 16:13:17 -0400 Subject: [PATCH 269/287] Separate settings key and library id --- src/apps/modern/features/libraries/hooks/useLibrary.tsx | 4 ++-- src/hooks/useCurrentTab.ts | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/apps/modern/features/libraries/hooks/useLibrary.tsx b/src/apps/modern/features/libraries/hooks/useLibrary.tsx index 530519b133..7af88c8684 100644 --- a/src/apps/modern/features/libraries/hooks/useLibrary.tsx +++ b/src/apps/modern/features/libraries/hooks/useLibrary.tsx @@ -35,7 +35,7 @@ export const useLibrary = () => useContext(LibraryContext); export const LibraryProvider: FC> = ({ children }) => { const { pathname } = useLocation(); - const { libraryId, activeTab } = useCurrentTab(); + const { libraryId, activeTab, settingsKey } = useCurrentTab(); const route = useMemo(() => LibraryRoutes.find(({ path }) => path === pathname), [pathname]); const collectionType = route?.type; @@ -48,7 +48,7 @@ export const LibraryProvider: FC> = ({ children }) => // Local storage requires the view type to be known upfront so default to movies if unknown const settingsViewType = viewType ?? LibraryTab.Movies; const [viewSettings, setViewSettings] = useLocalStorage( - getSettingsKey(settingsViewType, libraryId), + getSettingsKey(settingsViewType, settingsKey), getDefaultLibraryViewSettings(settingsViewType) ); diff --git a/src/hooks/useCurrentTab.ts b/src/hooks/useCurrentTab.ts index f2739c00b0..99dbcf1caf 100644 --- a/src/hooks/useCurrentTab.ts +++ b/src/hooks/useCurrentTab.ts @@ -6,10 +6,8 @@ const useCurrentTab = () => { const location = useLocation(); const [searchParams, setSearchParams] = useSearchParams(); const searchParamsTab = searchParams.get('tab'); - const libraryId = - location.pathname === '/livetv' ? - 'livetv' : - searchParams.get('topParentId'); + const libraryId = searchParams.get('topParentId'); + const settingsKey = location.pathname === '/livetv' ? 'livetv' : libraryId; const activeTab: number = searchParamsTab !== null ? parseInt(searchParamsTab, 10) : @@ -19,6 +17,7 @@ const useCurrentTab = () => { searchParams, setSearchParams, libraryId, + settingsKey, activeTab }; }; From 1c32bc5a5ab312e3684211ea19d54b8b5a1083a8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 31 Jul 2026 20:36:31 +0000 Subject: [PATCH 270/287] Update dependency caniuse-lite to v1.0.30001806 --- package-lock.json | 50 ++++------------------------------------------- package.json | 2 +- 2 files changed, 5 insertions(+), 47 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4d6a6bc1db..58efe9b537 100644 --- a/package-lock.json +++ b/package-lock.json @@ -93,7 +93,7 @@ "@vitest/coverage-v8": "3.2.7", "autoprefixer": "10.5.4", "babel-loader": "10.1.1", - "caniuse-lite": "1.0.30001803", + "caniuse-lite": "1.0.30001806", "clean-webpack-plugin": "4.0.0", "confusing-browser-globals": "1.0.11", "copy-webpack-plugin": "14.0.0", @@ -7918,27 +7918,6 @@ "postcss": "^8.1.0" } }, - "node_modules/autoprefixer/node_modules/caniuse-lite": { - "version": "1.0.30001806", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", - "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -8523,27 +8502,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/browserslist/node_modules/caniuse-lite": { - "version": "1.0.30001806", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", - "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -8765,9 +8723,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001803", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001803.tgz", - "integrity": "sha512-g/uHREV2ZpK9qMalCsWaxmA6ol+DX8GYhuf3T40RKoP+oL7vhRJh8LNt73PCjpnR6l14FzfPrB5Yux4PKm2meg==", + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", "dev": true, "funding": [ { diff --git a/package.json b/package.json index dc4c5a4e9f..ec528398fc 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@vitest/coverage-v8": "3.2.7", "autoprefixer": "10.5.4", "babel-loader": "10.1.1", - "caniuse-lite": "1.0.30001803", + "caniuse-lite": "1.0.30001806", "clean-webpack-plugin": "4.0.0", "confusing-browser-globals": "1.0.11", "copy-webpack-plugin": "14.0.0", From 0bfd228f6be19d5b542d7a7331c593df85a50ff1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 31 Jul 2026 21:07:03 +0000 Subject: [PATCH 271/287] Update dependency @jellyfin/sdk to v0.0.0-unstable.202607220710 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 58efe9b537..da953588ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@fontsource/noto-sans-sc": "5.2.9", "@fontsource/noto-sans-tc": "5.2.9", "@jellyfin/libass-wasm": "4.2.4", - "@jellyfin/sdk": "0.0.0-unstable.202607141554", + "@jellyfin/sdk": "0.0.0-unstable.202607220710", "@jellyfin/ux-web": "1.0.0", "@mui/icons-material": "6.5.0", "@mui/material": "6.5.0", @@ -4654,9 +4654,9 @@ "license": "LGPL-2.1-or-later AND (FTL OR GPL-2.0-or-later) AND MIT AND MIT-Modern-Variant AND ISC AND NTP AND Zlib AND BSL-1.0" }, "node_modules/@jellyfin/sdk": { - "version": "0.0.0-unstable.202607141554", - "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202607141554.tgz", - "integrity": "sha512-wF1Oi0gcdwe7Un3Hh6cujtDtW/czIDk5CupHg6B/NQIZtvfrkVW3PjnsQ9pfpt8WZsiuM/tlyMF9pfZV0eWqWQ==", + "version": "0.0.0-unstable.202607220710", + "resolved": "https://registry.npmjs.org/@jellyfin/sdk/-/sdk-0.0.0-unstable.202607220710.tgz", + "integrity": "sha512-5gwbKhre7R2/aZYww2TVFM7Pug5t8MWWLSTKLZnS67dfhF5SST1FC06R7lO6jwZYEB4YFCQNKxAT+TS9dsMHcA==", "license": "MPL-2.0", "peerDependencies": { "axios": "^1.12.0" diff --git a/package.json b/package.json index ec528398fc..46fbceb40b 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "@fontsource/noto-sans-sc": "5.2.9", "@fontsource/noto-sans-tc": "5.2.9", "@jellyfin/libass-wasm": "4.2.4", - "@jellyfin/sdk": "0.0.0-unstable.202607141554", + "@jellyfin/sdk": "0.0.0-unstable.202607220710", "@jellyfin/ux-web": "1.0.0", "@mui/icons-material": "6.5.0", "@mui/material": "6.5.0", From 23f2e2fe7ec00628c6a20a20919e9ea6541e5d5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=84=A1=E6=83=85=E5=A4=A9?= Date: Fri, 31 Jul 2026 16:39:35 -0400 Subject: [PATCH 272/287] Translated using Weblate (Chinese (Simplified Han script)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index 3e1bdcc748..f387d15001 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1746,8 +1746,8 @@ "VideoCodecTagNotSupported": "视频编码标签不支持", "LabelLyricDownloaders": "歌词下载", "LyricDownloadersHelp": "启用并按优先级顺序排列您喜欢的歌词下载器。", - "RenderPgsSubtitle": "实验性 PGS 字幕渲染", - "RenderPgsSubtitleHelp": "在客户端渲染 PGS 字幕,而不是烧录字幕。这以降低客户端渲染性能为代价来避免服务器端转码。", + "RenderPgsSubtitle": "实验性 PGS 和 VobSub 字幕渲染", + "RenderPgsSubtitleHelp": "确定客户端是否应该渲染 PGS 和 VobSub 字幕,而不是使用内嵌字幕。这可以避免服务器端转码,但会牺牲客户端的渲染性能。", "LabelAudioTagSettings": "音频标签设置", "LabelCustomTagDelimiters": "自定义标签分隔符", "LabelCustomTagDelimitersHelp": "作为分隔符来分隔标签的字符。", @@ -1933,5 +1933,11 @@ "ViewRightToLeft": "从右到左", "SeriesName": "节目名称", "AudioLanguages": "音频语言", - "SubtitleLanguages": "字幕语言" + "SubtitleLanguages": "字幕语言", + "BitmapSubtitleAspectModeCover": "封面", + "BitmapSubtitleAspectModeHelp": "控制客户端渲染的 PGS 和 VobSub 字幕如何缩放到可见视频区域。", + "BitmapSubtitleAspectModeStretch": "拉伸", + "LabelBitmapSubtitleAspectMode": "位图字幕纵横比模式", + "LabelUsernameAllowedCharactersHelp": "用户名可以包含字母、数字、空格以及以下字符:- _ ' . @ +。用户名不能以空格开头或结尾。", + "BitmapSubtitleAspectModeContain": "容器" } From 6ba35dc6b4ce6c553767f5c909c66be0bb5b60a2 Mon Sep 17 00:00:00 2001 From: ahmadjamel89 Date: Fri, 31 Jul 2026 17:59:15 -0400 Subject: [PATCH 273/287] Translated using Weblate (Kurdish (Central)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ckb/ --- src/strings/ckb.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/strings/ckb.json b/src/strings/ckb.json index ed590e32be..95f1686f9b 100644 --- a/src/strings/ckb.json +++ b/src/strings/ckb.json @@ -153,5 +153,7 @@ "MediaInfoChannels": "کەناڵەکان", "Disabled": "ناچالاککراو", "Settings": "ڕێکخستنەکان", - "Watch": "سەیرکردن" + "Watch": "سەیرکردن", + "SubtitleLanguages": "زمانەکانی ژێرنووس", + "AllowOnTheFlySubtitleExtraction": "ڕێگەدان بە دەرهێنانی ژێرنووس لە کاتی پەخشدا" } From ab6bcb4b98d6707f7481dcd8400aa3e57b891408 Mon Sep 17 00:00:00 2001 From: Translation expert Date: Fri, 31 Jul 2026 18:30:06 -0400 Subject: [PATCH 274/287] Translated using Weblate (Arabic) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ar/ --- src/strings/ar.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/strings/ar.json b/src/strings/ar.json index a507e14c18..8677ebe0f2 100644 --- a/src/strings/ar.json +++ b/src/strings/ar.json @@ -428,7 +428,7 @@ "MoreFromValue": "المزيد من {0}", "MoreUsersCanBeAddedLater": "يمكن إضافة المزيد من المستخدمين لاحقًا من لوحة التحكم.", "Mute": "كتم الصوت", - "NextUp": "التالي", + "NextUp": "القادم", "MessageNoNextUpItems": "لم يتم العثور على شيء. ابدأ بمشاهدة مسلسلاتك!", "MessageNoPluginConfiguration": "لا يحتوي هذا الملحق على إعدادات ليتم إعدادها.", "NumLocationsValue": "{0} مجلدات", @@ -532,7 +532,7 @@ "TabScheduledTasks": "المهام المجدولة", "TabServer": "الخادم", "TabStreaming": "البث", - "TabUpcoming": "القادم", + "TabUpcoming": "التالي", "TellUsAboutYourself": "أخبرنا عن نفسك", "ThisWizardWillGuideYou": "سيساعدك هذا الدليل خلال عملية الإعداد. للبدء، يرجى إدخال اسم الخادم واختيار لغتك المفضلة.", "Thursday": "الخميس", @@ -1694,7 +1694,7 @@ "PreferEmbeddedExtrasTitlesOverFileNamesHelp": "غالبًا ما يكون للإضافات نفس الاسم المضمن للأصل، حدد هذا الخيار لاستخدام العناوين المضمنة لها على أي حال.", "PreviewLyrics": "معاينة الكلمات", "ReadInputAtNativeFramerate": "قراءة الإدخال بمعدل الإطارات الأصلي", - "RenderPgsSubtitleHelp": "حدّد ما إذا كان يجب على العميل عرض ترجمات PGS بدلاً من استخدام الترجمات المحروقة. هذا يمكن أن يجنبك تحويل الترميز من جانب الخادم مقابل أداء العرض من جانب العميل.", + "RenderPgsSubtitleHelp": "حدّد ما إذا كان يجب على العميل عرض ترجمات PGS بدلاً من استخدام الترجمات المضمّنة. هذا يمكن أن يجنبك تحويل الترميز من جانب الخادم بدلا من أداء العرض من طرف العميل.", "SaveRecordingNFOHelp": "حفظ البيانات الوصفية من مزود قوائم EPG بجانب المحتوى.", "SaveLyricsIntoMediaFolders": "حفظ الكلمات في مجلدات المحتوى", "SaveLyricsIntoMediaFoldersHelp": "تخزين الكلمات بجوار ملفات الصوت سيتيح إدارتها بسهولة أكبر.", @@ -1767,7 +1767,7 @@ "LibraryInvalidItemIdError": "المكتبة في حالة غير صالحة ولا يمكن تعديلها. ربما تواجه خطأً برمجيًا: المسار في قاعدة البيانات ليس هو المسار الصحيح في نظام الملفات.", "PluginEnableError": "حدث خطأ أثناء تفعيل الملحق.", "LabelTileWidthHelp": "الحد الأقصى لعدد الصور لكل بلاط في اتجاه X.", - "RenderPgsSubtitle": "عرض ترجمة PGS التجريبي", + "RenderPgsSubtitle": "تقديم ترجمة PGS و VobSub تجريبيا", "MediaInfoRotation": "الدوران", "DeleteCustomImage": "حذف الصورة المخصصة", "ImageDeleteFailed": "فشل حذف الصورة", @@ -1891,7 +1891,7 @@ "StreamingLoadError": "فشل تحميل إعدادات صفحة البث", "Unwatch": "إلغاء المشاهدة", "UsersEditPageError": "فشل تحميل صفحة تعديل المستخدمين", - "Watch": "مشاهدة", + "Watch": "شاهد", "TrickplayLoadError": "فشل تحميل إعدادات معاينات التنقل", "LabelExternalServerUri": "رابط URI خارجي", "LabelExternalServerUriHelp": "رابط URI المنشور للخادم للوصول الخارجي.", @@ -1914,7 +1914,7 @@ "CardSettings": "اعدادت البطاقة", "ConfirmDeleteItemByName": "حذف\"{0}\" سيقوم بحذفه من نظام الملفات و مكتبك وسائطك معا. هل انت متأكد من رغبتك في المتابعة؟", "ConfirmStillWatching": "هل مازلت تشاهد؟", - "Disabled": "معطّل", + "Disabled": "غير فاعل", "LabelOriginalLanguage": "لغة أصلية", "OriginalLanguage": "لغة أصلية", "StillWatchingPrompt": "ملقم متابعة المشاهدة", From 1966fd5b5e5ba6e0c2beb48aec7bc31586d889df Mon Sep 17 00:00:00 2001 From: ahmadjamel89 Date: Fri, 31 Jul 2026 18:13:28 -0400 Subject: [PATCH 275/287] Translated using Weblate (Kurdish (Central)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ckb/ --- src/strings/ckb.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/strings/ckb.json b/src/strings/ckb.json index 95f1686f9b..9b68a76be3 100644 --- a/src/strings/ckb.json +++ b/src/strings/ckb.json @@ -38,7 +38,7 @@ "LabelThrottleDelaySecondsHelp": "کات بە چرکە کە دوای ئەو کاتە هەڵگەڕان دەگیرێتەوە. دەبێت بە ڕادەیەک گەورە بێت تا بەکاربەر نێوانگرێکی دروستی هەبێت. تەنیا لەکاتی چالاککردنی گرتنەوە کاردەکات.", "LabelSegmentKeepSeconds": "کاتی هەڵگرتنی پارچەکان", "LabelSegmentKeepSecondsHelp": "کات بە چرکە کە تیایدا پارچەکان لە بیرگە هەڵدەگیرێن دوای ئەوەی لای بەکاربەر دابەزێنراون. تەنیا لە کاتی چالاککردنی سڕینەوەی پارچەکان کاردەکات.", - "AllowMediaConversion": "ڕێگەدان بە وەرگەڕانی میدیا", + "AllowMediaConversion": "ڕێگەدان بە گۆڕینی میدیا", "AllowMediaConversionHelp": "ڕێگەپێدان یان پێنەدان بە تایبەتمەندی وەرگەڕانی میدیا.", "ActivitiesLoadError": "بارکردنی چالاکییەکان سەرکەوتوو نەبوو", "LabelSystem": "سیستەم", @@ -155,5 +155,11 @@ "Settings": "ڕێکخستنەکان", "Watch": "سەیرکردن", "SubtitleLanguages": "زمانەکانی ژێرنووس", - "AllowOnTheFlySubtitleExtraction": "ڕێگەدان بە دەرهێنانی ژێرنووس لە کاتی پەخشدا" + "AllowOnTheFlySubtitleExtraction": "ڕێگەدان بە دەرهێنانی ژێرنووس لە کاتی پەخشدا", + "AllowOnTheFlySubtitleExtractionHelp": "ژێرنووسە ناوەکییەکان دەکرێت لە ڤیدیۆکان دەربکرێن و بە دەقێکی ڕوون بگەیەنرێنە کڕیارەکان، بە مەبەستی یارمەتیدان لە ڕێگریکردن لە وەرگێڕانی کۆدی ڤیدیۆ (Transcoding). لە هەندێک سیستەمدا ئەمە ڕەنگە کاتێکی زۆر بخایەنێت و بووە هۆی وەستان یان پەککەوتنی لێدانی ڤیدیۆ لە کاتی پرۆسەی دەرهێنانەکەدا. ئەمە ناچالاک بکە بۆ ئەوەی ژێرنووسە ناوەکییەکان لەگەڵ وەرگێڕانی کۆدی ڤیدیۆدا بسووتێنرێن (بکرێنە ناو ڤیدیۆکە خۆیەوە) کاتێک لەلایەن ئامێری کڕیارەوە بە شێوەی بنەڕەتی پشتگیری ناکرێن.", + "AllowRemoteAccess": "ڕێگەدان بە پەیوەندییە دوورەدەستەکان بۆ ئەم ڕاژەکارە", + "AllowRemoteAccessHelp": "ئەگەر هەڵنەبژێردرێت، هەموو پەیوەندییە دوورەدەستەکان بلۆک دەکرێن.", + "AllowTonemappingHelp": "نەخشەسازکردنی تۆن دەتوانێت مەودای داینامیکی ڤیدیۆیەک لە HDRەوە بگۆڕێت بۆ SDR لە کاتێکدا ئاگاداری وردەکارییەکانی وێنەکە و ڕەنگەکان دەبێت، کە زانیاری زۆر گرنگن بۆ نوێنەرایەتیکردنی دیمەنە ڕەسەنەکە. لە ئێستادا تەنها لەگەڵ ڤیدیۆکانی 10bit HDR10 و HLG و DoVi کاردەکات. ئەمەش پێویستی بە ژینگەی کارپێکردنی (GPGPU)ی پەیوەندیدار هەیە.", + "AllowHWTranscodingHelp": "ڕێگە بە پەخشکەر (Tuner) بدە ڕاستەوخۆ لە کاتی پەخشدا کۆدی پەخشەکان وەرگێڕێت (Transcode). ئەمە ڕەنگە یارمەتیدەر بێت لە کەمکردنەوەی وەرگێڕانی کۆد کە لەلایەن ڕاژەکارەکەوە پێویستە.", + "AlwaysPlaySubtitles": "هەمیشە پەخش بکە" } From c84565aaac3349e75d1d924d8b4b5f41de1f311e Mon Sep 17 00:00:00 2001 From: krvi <27792771+krvi@users.noreply.github.com> Date: Fri, 31 Jul 2026 20:29:21 -0400 Subject: [PATCH 276/287] Translated using Weblate (Faroese) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/fo/ --- src/strings/fo.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/strings/fo.json b/src/strings/fo.json index 473b633834..324c37816a 100644 --- a/src/strings/fo.json +++ b/src/strings/fo.json @@ -2,7 +2,7 @@ "AccessRestrictedTryAgainLater": "Atgongd er avmarkað. Vinaliga royn aftur seinni.", "Actor": "Sjónleikari", "Add": "Legg afturat", - "AddedOnValue": "{0} lagt afturat", + "AddedOnValue": "Innlagdur tann {0}", "AddToCollection": "Legg í samling", "AddToFavorites": "Legg á yndislistan", "AddToPlaylist": "Legg á spælilista", @@ -636,5 +636,9 @@ "LastSeen": "Seinasta virksemi var fyri {0}", "LabelAudioAttributes": "Ljóðeginleikar", "NextUp": "Næst á skránni", - "MaxParentalRatingHelp": "Innihald við hægri aldursmarki verður fjalt fyri hesum brúkaranum." + "MaxParentalRatingHelp": "Innihald við hægri aldursmarki verður fjalt fyri hesum brúkaranum.", + "DateAdded": "Innleggingardagur", + "LabelDateAdded": "Innleggingardagur", + "LatestFromLibrary": "Nýliga innlagt í {0}", + "OptionDateAdded": "Innleggingardagur" } From 1c431f6f1e9fcffc759c84fa162577dce677c8cf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 1 Aug 2026 05:14:03 +0000 Subject: [PATCH 277/287] Update dependency postcss to v8.5.23 --- package-lock.json | 16 ++++++++-------- package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index da953588ec..620ea6a2ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -116,7 +116,7 @@ "html-webpack-plugin": "5.6.7", "jsdom": "29.1.1", "mini-css-extract-plugin": "2.10.2", - "postcss": "8.5.18", + "postcss": "8.5.23", "postcss-loader": "8.2.1", "postcss-preset-env": "10.6.1", "postcss-scss": "4.0.9", @@ -15693,9 +15693,9 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", "dev": true, "funding": [ { @@ -16687,9 +16687,9 @@ } }, "node_modules/postcss": { - "version": "8.5.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.18.tgz", - "integrity": "sha512-xdB1oSLHbz1vRWgCDalrCqEFTWzFlhqFC5tIHLMOSUIjhm3XXQ1qrFy8S/ESr1JYRRXqM3c1QFiMZUJdUTqyMQ==", + "version": "8.5.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", + "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", "dev": true, "funding": [ { @@ -16707,7 +16707,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.12", + "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, diff --git a/package.json b/package.json index 46fbceb40b..37a29cbb94 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "html-webpack-plugin": "5.6.7", "jsdom": "29.1.1", "mini-css-extract-plugin": "2.10.2", - "postcss": "8.5.18", + "postcss": "8.5.23", "postcss-loader": "8.2.1", "postcss-preset-env": "10.6.1", "postcss-scss": "4.0.9", From 0c8ccb475240e444655ccb36c9b6152e938458a9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 1 Aug 2026 05:39:45 +0000 Subject: [PATCH 278/287] Update Linters --- package-lock.json | 243 ++++++++++++++++++++-------------------------- package.json | 8 +- 2 files changed, 111 insertions(+), 140 deletions(-) diff --git a/package-lock.json b/package-lock.json index 620ea6a2ca..1611e6af7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -76,7 +76,7 @@ "@babel/preset-env": "7.29.7", "@babel/preset-react": "7.29.7", "@eslint-community/eslint-plugin-eslint-comments": "4.7.2", - "@eslint/js": "9.39.4", + "@eslint/js": "9.39.5", "@stylistic/eslint-plugin": "4.4.1", "@stylistic/stylelint-plugin": "3.1.3", "@types/dompurify": "3.0.5", @@ -88,7 +88,7 @@ "@types/react-dom": "18.3.7", "@types/react-lazy-load-image-component": "1.6.5", "@types/sortablejs": "1.15.9", - "@typescript-eslint/parser": "8.62.0", + "@typescript-eslint/parser": "8.65.0", "@uupaa/dynamic-import-polyfill": "1.0.2", "@vitest/coverage-v8": "3.2.7", "autoprefixer": "10.5.4", @@ -101,7 +101,7 @@ "css-loader": "7.1.4", "cssnano": "7.1.9", "es-check": "9.6.4", - "eslint": "9.39.4", + "eslint": "9.39.5", "eslint-plugin-compat": "6.2.1", "eslint-plugin-import": "2.32.0", "eslint-plugin-jsx-a11y": "6.10.2", @@ -132,7 +132,7 @@ "stylelint-scss": "6.14.0", "ts-loader": "9.6.2", "typescript": "5.9.3", - "typescript-eslint": "8.62.0", + "typescript-eslint": "8.65.0", "vite-tsconfig-paths": "6.1.1", "vitest": "3.2.7", "webpack": "5.109.0", @@ -4276,9 +4276,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", - "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", + "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", "dev": true, "license": "MIT", "dependencies": { @@ -4288,7 +4288,7 @@ "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.1", + "js-yaml": "^4.3.0", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, @@ -4345,19 +4345,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4388,9 +4375,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", - "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", "dev": true, "license": "MIT", "engines": { @@ -6708,17 +6695,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.62.0.tgz", - "integrity": "sha512-o+mpz7EYiMzXoySXiKmzlabIvTVqUuK5yLrAedRPRDA0IpPFMUV1IXt6OqljIxX/kumN6EjUYp41Hqelh6p/Dw==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz", + "integrity": "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.62.0", - "@typescript-eslint/type-utils": "8.62.0", - "@typescript-eslint/utils": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/type-utils": "8.65.0", + "@typescript-eslint/utils": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -6731,7 +6718,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.62.0", + "@typescript-eslint/parser": "^8.65.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -6747,16 +6734,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.62.0.tgz", - "integrity": "sha512-dzHeT2gySzZtLDsuqxU9AkYgIsQoHAHtRBpOqM+Ofzx1Bwrd2RcCjQJ+6iQbsHOIR6NS33bF2W1k3blN1zLDrA==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz", + "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.62.0", - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/typescript-estree": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", "debug": "^4.4.3" }, "engines": { @@ -6772,14 +6759,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.62.0.tgz", - "integrity": "sha512-wexnCqiTg7BOGtbLDftYpRWlmLq4xfoMd7BKFR6Y75sZS3QmRKLdN3yWLhmIYgqMmP/OXWpj3H8odkb5nGURCQ==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", + "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.62.0", - "@typescript-eslint/types": "^8.62.0", + "@typescript-eslint/tsconfig-utils": "^8.65.0", + "@typescript-eslint/types": "^8.65.0", "debug": "^4.4.3" }, "engines": { @@ -6794,14 +6781,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.62.0.tgz", - "integrity": "sha512-1lX38kNxXIRb8mEc3lbq5mdHq1Pf2+U0nFU65KfT18mtPxxl0fvjuEE92mHuXPuCtElJhOrddOpyMlM3Z0umEA==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz", + "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0" + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6812,9 +6799,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.0.tgz", - "integrity": "sha512-y2GAdB6ykaXUvuspbYnizQc4oDDz0Tz/Yc7iWrXf9mx8vm/L/0vLHCe0tS2boG96Zy+DivnVDQ9ZUEWoHqqx1g==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", + "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", "dev": true, "license": "MIT", "engines": { @@ -6829,15 +6816,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.62.0.tgz", - "integrity": "sha512-+g5O3j0w2ldzC86Pv6fvbO/xhAonbJFIdf/MKQ1d30gndlsVzUOE83ldfSE15Qrl9fhFjK6AovHs5Wpp6vx86w==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz", + "integrity": "sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/typescript-estree": "8.62.0", - "@typescript-eslint/utils": "8.62.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -6854,9 +6841,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.62.0.tgz", - "integrity": "sha512-KvAclkktORPvM54TgLgA4z9HIV1M8zOgw9ZVNXl9f/8dLYfXYX1wkMXP7qmabpijQRV5bHJLOmoyGQbLMaUYeg==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", + "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", "dev": true, "license": "MIT", "engines": { @@ -6868,16 +6855,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.62.0.tgz", - "integrity": "sha512-+hVbNxtW64pIcZWDPGbyaKF7vp2IBTVY5ma1blwwksrjdsbdqqEKvJWMGbBofei4F6Dovx1M0RJgoFeNu2279A==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", + "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.62.0", - "@typescript-eslint/tsconfig-utils": "8.62.0", - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/visitor-keys": "8.62.0", + "@typescript-eslint/project-service": "8.65.0", + "@typescript-eslint/tsconfig-utils": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -6906,16 +6893,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", - "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", + "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { @@ -6948,16 +6935,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.62.0.tgz", - "integrity": "sha512-82r66fi9zYwZ+mTq3vKgwjbZ1PVk/DJzrXFLpG6RnBbdvH8TEGVHIs9H4d2drhkOzf0syZuD/OZvvlu6GDbP4g==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz", + "integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.62.0", - "@typescript-eslint/types": "8.62.0", - "@typescript-eslint/typescript-estree": "8.62.0" + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6972,13 +6959,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.62.0.tgz", - "integrity": "sha512-CY3uyFSRbcQv3nnSv8S0+lDftMVz6P963PoRlxrV7ew/Md564g9ut60PYzdLM5qW4jFn93GBF+Soi90ISAN+GQ==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz", + "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.62.0", + "@typescript-eslint/types": "8.65.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -10784,9 +10771,9 @@ } }, "node_modules/eslint": { - "version": "9.39.4", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", - "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", "dev": true, "license": "MIT", "dependencies": { @@ -10795,8 +10782,8 @@ "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.5", - "@eslint/js": "9.39.4", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -11242,9 +11229,9 @@ } }, "node_modules/eslint/node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "dependencies": { @@ -12415,19 +12402,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -14692,6 +14666,29 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsdom": { "version": "29.1.1", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", @@ -17549,19 +17546,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-loader/node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/postcss-loader/node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -22931,19 +22915,6 @@ "node": ">=0.10.0" } }, - "node_modules/stylelint/node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/stylelint/node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -24115,16 +24086,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.62.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.62.0.tgz", - "integrity": "sha512-8QxXi+ZACKX0kaqO4gY8kn0RSD9gFfaHDWwjqtEN48aWCBkX4MJaufWN+c3BzlrXLOxfywDL8CaoqUwcRq4j4Q==", + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.65.0.tgz", + "integrity": "sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.62.0", - "@typescript-eslint/parser": "8.62.0", - "@typescript-eslint/typescript-estree": "8.62.0", - "@typescript-eslint/utils": "8.62.0" + "@typescript-eslint/eslint-plugin": "8.65.0", + "@typescript-eslint/parser": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0", + "@typescript-eslint/utils": "8.65.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/package.json b/package.json index 37a29cbb94..b2a10def5c 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "@babel/preset-env": "7.29.7", "@babel/preset-react": "7.29.7", "@eslint-community/eslint-plugin-eslint-comments": "4.7.2", - "@eslint/js": "9.39.4", + "@eslint/js": "9.39.5", "@stylistic/eslint-plugin": "4.4.1", "@stylistic/stylelint-plugin": "3.1.3", "@types/dompurify": "3.0.5", @@ -22,7 +22,7 @@ "@types/react-dom": "18.3.7", "@types/react-lazy-load-image-component": "1.6.5", "@types/sortablejs": "1.15.9", - "@typescript-eslint/parser": "8.62.0", + "@typescript-eslint/parser": "8.65.0", "@uupaa/dynamic-import-polyfill": "1.0.2", "@vitest/coverage-v8": "3.2.7", "autoprefixer": "10.5.4", @@ -35,7 +35,7 @@ "css-loader": "7.1.4", "cssnano": "7.1.9", "es-check": "9.6.4", - "eslint": "9.39.4", + "eslint": "9.39.5", "eslint-plugin-compat": "6.2.1", "eslint-plugin-import": "2.32.0", "eslint-plugin-jsx-a11y": "6.10.2", @@ -66,7 +66,7 @@ "stylelint-scss": "6.14.0", "ts-loader": "9.6.2", "typescript": "5.9.3", - "typescript-eslint": "8.62.0", + "typescript-eslint": "8.65.0", "vite-tsconfig-paths": "6.1.1", "vitest": "3.2.7", "webpack": "5.109.0", From fc236586a8327fb079d7675e9b5f0c34ee8bddae Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 1 Aug 2026 09:51:26 +0000 Subject: [PATCH 279/287] Update dependency sass to v1.102.0 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1611e6af7a..f5a3acd808 100644 --- a/package-lock.json +++ b/package-lock.json @@ -120,7 +120,7 @@ "postcss-loader": "8.2.1", "postcss-preset-env": "10.6.1", "postcss-scss": "4.0.9", - "sass": "1.101.0", + "sass": "1.102.0", "sass-loader": "16.0.8", "source-map-loader": "5.0.0", "speed-measure-webpack-plugin": "1.6.0", @@ -19628,9 +19628,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.101.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.101.0.tgz", - "integrity": "sha512-OL3GoQyoUdDt843DpVmDO6y2k1sc5IhUDSpu8XucEI+35neq5QivZ1iuegnpraEVTJXlQGK1gl27zKcTLEPbQw==", + "version": "1.102.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.102.0.tgz", + "integrity": "sha512-NSOyTnaQF7rTAEOtI2fwb386vL+akyiQLBZu8Na7hXCb+umJy0GAqlcMIaqACZ6Z1VgTBS4K9PG6B3IdjHGJsw==", "dev": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index b2a10def5c..6ed05bb753 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "postcss-loader": "8.2.1", "postcss-preset-env": "10.6.1", "postcss-scss": "4.0.9", - "sass": "1.101.0", + "sass": "1.102.0", "sass-loader": "16.0.8", "source-map-loader": "5.0.0", "speed-measure-webpack-plugin": "1.6.0", From 59248a920bcd55e374b6e9bd4c219263490010cf Mon Sep 17 00:00:00 2001 From: FenomenaGaga Date: Sat, 1 Aug 2026 05:07:42 -0400 Subject: [PATCH 280/287] Translated using Weblate (Slovenian) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/sl/ --- src/strings/sl-si.json | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/strings/sl-si.json b/src/strings/sl-si.json index 4af4ee59ca..0dbdff5ddb 100644 --- a/src/strings/sl-si.json +++ b/src/strings/sl-si.json @@ -1714,7 +1714,7 @@ "PluginLoadRepoError": "Pri pridobivanju podrobnosti o vtičniku iz skladišča je prišlo do napake.", "Regional": "Regionalni", "MediaSegmentProvidersHelp": "Omogočite in razvrstite želene ponudnike medijskih segmentov po prednostnem vrstnem redu.", - "RenderPgsSubtitleHelp": "Ugotovite, ali naj odjemalec upodablja podnapise PGS namesto uporabe vžganih podnapisov. S tem se lahko izognete prekodiranju na strani strežnika v zameno za zmogljivost upodabljanja na strani odjemalca.", + "RenderPgsSubtitleHelp": "Ugotovite, ali naj odjemalec upodablja podnapise PGS in VobSub namesto uporabe vžganih podnapisov. S tem se lahko izognete prekodiranju na strani strežnika v zameno za zmogljivost upodabljanja na strani odjemalca.", "LabelQscaleHelp": "Lestvica kakovosti slik, ki jih ustvari ffmpeg, pri čemer je 2 najvišja kakovost, 31 pa najnižja.", "LabelTrickplayThreads": "Niti FFmpeg", "LabelTrackGain": "Ojačitev sledi", @@ -1765,7 +1765,7 @@ "LabelScanBehavior": "Vedenje Skeniranja", "LabelImageInterval": "Interval Slik", "PlaylistPublic": "Dovoli javni dostop", - "RenderPgsSubtitle": "Eksperimentalno upodabljanje podnapisov PGS", + "RenderPgsSubtitle": "Eksperimentalno upodabljanje podnapisov PGS in VobSub", "MediaSegmentAction.None": "Brez", "MediaSegmentAction.Skip": "Preskoči", "MediaSegmentType.Commercial": "Reklama", @@ -1826,7 +1826,7 @@ "ImageUploadFailed": "Nalaganje slike ni uspelo", "LimitSegmentLength": "Uporabi krajše HLS segmente", "LimitSegmentLengthHelp": "Omogočanje te možnosti lahko prepreči zatikanje predvajalnika HLS pri iskanju na nekaterih napravah, kot so televizorji s sistemom WebOS, zataknil.", - "MessageRestoreDisclaimer": "POZOR: Obnovili boste varnostno kopijo. Vaš strežnik bo med postopkom nedosegljiv in vsi podatki novejši od varnostne kopije, bodo izgubljeni.", + "MessageRestoreDisclaimer": "POZOR: Obnovili boste varnostno kopijo. Vaš strežnik bo med postopkom nedosegljiv in vsi podatki novejši od varnostne kopije, bodo izgubljeni.\n\nVarnostno kopijo obnovite le na strežniku, katerega verzija je enaka tisti, na kateri je bila varnostna kopija tudi prvotno narejena. Obnavljanje varnostne kopije na drugačni verziji strežnika od prvotne ni podprto in predstavlja možnost, da strežnik ne bo več uporaben.", "MessageBackupDisclaimer": "Odvisno od velikosti vaše knjižnice lahko postopek varnostnega kopiranja traja nekaj časa.", "MessageRestoreInProgress": "Obnovitev v teku", "LiveTVPageLoadError": "Strani s snemanji ni bilo mogoče naložiti", @@ -1923,5 +1923,21 @@ "LabelProgressAndSpeed": "Napredek / hitrost", "LabelReasons": "Razlogi", "LabelPlayerSizes": "Velikosti igralcev", - "LabelPlaybackQuality": "Okvirji izgubljeni / pokvarjeni" + "LabelPlaybackQuality": "Okvirji izgubljeni / pokvarjeni", + "BitmapSubtitleAspectModeHelp": "Nadzoruje kako so PGS in VobSub formati podnapisov upodobljeni glede na zaslonsko velikost videoposnetka na odjemalcih .", + "ViewDoublePage": "Dve platnici", + "ViewSinglePage": "Ena platnica", + "ViewLeftToRight": "Iz leve proti desni", + "ViewRightToLeft": "Iz desne proti levi", + "LabelBitmapSubtitleAspectMode": "Možnosti prikaza za podnapise tehnologije bitmap", + "MessageNoEpisodesFound": "Epizode trenutno niso na voljo.", + "NoCastTargets": "Noben odjemalec za oddaljeno predvajanje ni na voljo", + "SeriesName": "Naziv serije", + "LabelUsernameAllowedCharactersHelp": "Uporabniška imena lahko vsebujejo črke, številke, presledke in sledeče znake: - _ ' . @ +. Ne morejo se začeti ali končati s presledkom.", + "AudioLanguages": "Jeziki za zvok", + "SubtitleLanguages": "Jeziki za podnapise", + "BitmapSubtitleAspectModeContain": "Ne prilagodi velikosti podnapisov Bitmap oknu", + "BitmapSubtitleAspectModeCover": "Prilagodi velikosti podnapisov Bitmap oknu", + "BitmapSubtitleAspectModeStretch": "Raztegni velikost podnapisov Bitmap", + "IndexNumber": "Indeks" } From cec4c1f3e30669f39209866353b06ef90ba9a132 Mon Sep 17 00:00:00 2001 From: Nyanmisaka <799610810@qq.com> Date: Sat, 1 Aug 2026 05:02:17 -0400 Subject: [PATCH 281/287] Translated using Weblate (Chinese (Simplified Han script)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/zh_Hans/ --- src/strings/zh-cn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/strings/zh-cn.json b/src/strings/zh-cn.json index f387d15001..dddfa3ca0a 100644 --- a/src/strings/zh-cn.json +++ b/src/strings/zh-cn.json @@ -1888,7 +1888,7 @@ "StreamingLoadError": "流媒体传输页面设置加载失败", "Unwatch": "取消日志跟踪", "UsersEditPageError": "用户编辑页面加载失败", - "Watch": "观看", + "Watch": "开启日志跟踪", "TrickplayLoadError": "进度条预览图设置加载失败", "LabelExternalServerUriHelp": "用于外部访问的已发布服务器 URI。", "ActivitiesLoadError": "加载活动记录失败", From ccf7db63f481e4d84db13299e21bcc9cd8bb4234 Mon Sep 17 00:00:00 2001 From: ahmadjamel89 Date: Sat, 1 Aug 2026 08:12:13 -0400 Subject: [PATCH 282/287] Translated using Weblate (Kurdish (Central)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ckb/ --- src/strings/ckb.json | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/strings/ckb.json b/src/strings/ckb.json index 9b68a76be3..7dce40b77f 100644 --- a/src/strings/ckb.json +++ b/src/strings/ckb.json @@ -161,5 +161,23 @@ "AllowRemoteAccessHelp": "ئەگەر هەڵنەبژێردرێت، هەموو پەیوەندییە دوورەدەستەکان بلۆک دەکرێن.", "AllowTonemappingHelp": "نەخشەسازکردنی تۆن دەتوانێت مەودای داینامیکی ڤیدیۆیەک لە HDRەوە بگۆڕێت بۆ SDR لە کاتێکدا ئاگاداری وردەکارییەکانی وێنەکە و ڕەنگەکان دەبێت، کە زانیاری زۆر گرنگن بۆ نوێنەرایەتیکردنی دیمەنە ڕەسەنەکە. لە ئێستادا تەنها لەگەڵ ڤیدیۆکانی 10bit HDR10 و HLG و DoVi کاردەکات. ئەمەش پێویستی بە ژینگەی کارپێکردنی (GPGPU)ی پەیوەندیدار هەیە.", "AllowHWTranscodingHelp": "ڕێگە بە پەخشکەر (Tuner) بدە ڕاستەوخۆ لە کاتی پەخشدا کۆدی پەخشەکان وەرگێڕێت (Transcode). ئەمە ڕەنگە یارمەتیدەر بێت لە کەمکردنەوەی وەرگێڕانی کۆد کە لەلایەن ڕاژەکارەکەوە پێویستە.", - "AlwaysPlaySubtitles": "هەمیشە پەخش بکە" + "AlwaysPlaySubtitles": "هەمیشە پەخش بکە", + "AlwaysPlaySubtitlesHelp": "ئەو ژێرنووسانەی لەگەڵ زمانی دڵخوازدا دەگونجێن بار دەکرێن، بەبێ گوێدانە زمانی دەنگەکە.", + "AlwaysRemuxFlacAudioFilesHelp": "ئەگەر پەڕگەیەک لەوانەت هەیە کە وێبگەڕەکەت ڕەتیدەکاتەوە پەخشی بکات یان کاتەکانی بە شێوەیەکی نەپێکراو (ناڕاست) دەژمێرێت، ئەمە ناچالاک بکە وەک چارەسەرێکی کاتی.", + "AlwaysRemuxMp3AudioFilesHelp": "ئەگەر پەڕگەیەک لەوانەت هەیە کە وێبگەڕەکەت ڕەتیدەکاتەوە پەخشی بکات یان کاتەکانی بە شێوەیەکی نەپێکراو دەژمێرێت، ئەمە ناچالاک بکە وەک چارەسەرێکی کاتی.", + "AndOtherArtists": "{0} و {1} هونەرمەندەکانی تر.", + "Anime": "ئەنیمێ", + "AnyLanguage": "هەر زمانێک", + "Anytime": "لە هەر کاتێکدا", + "ApiKeysCaption": "لیستی کلیلەکانی API کە لە ئێستادا چالاککراون", + "ApiKeysLoadError": "بارکردنی کلیلەکانی API سەرکەوتوو نەبوو", + "AroundTime": "نزیکەی {0}", + "Arranger": "ڕێکخەر", + "Art": "وێنەی بێ پاشبنەما", + "Artist": "هونەرمەند", + "Artists": "هونەرمەندان", + "Ascending": "سەرکەوتوو", + "AskAdminToCreateLibrary": "داوا لە بەڕێوەبەر بکە بۆ دروستکردنی پەرتووکخانەیەک .", + "AsManyAsPossible": "تا بتوانرێت زۆرترین", + "AspectRatio": "ڕێژەی لایەنەکان" } From c7fe67398d705deb56d2265e32f24a83134f7113 Mon Sep 17 00:00:00 2001 From: nyanmisaka Date: Sat, 1 Aug 2026 20:55:25 +0800 Subject: [PATCH 283/287] Fix line breaks in log names on mobile Signed-off-by: nyanmisaka --- .../features/logs/components/LogItemList.tsx | 7 ++++++- src/apps/dashboard/routes/logs/file.tsx | 11 ++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/apps/dashboard/features/logs/components/LogItemList.tsx b/src/apps/dashboard/features/logs/components/LogItemList.tsx index df09745463..da14b37f1d 100644 --- a/src/apps/dashboard/features/logs/components/LogItemList.tsx +++ b/src/apps/dashboard/features/logs/components/LogItemList.tsx @@ -27,7 +27,12 @@ const LogItemList: FunctionComponent = ({ logs }: LogItemProps) => secondary={getDate(log)} slotProps={{ primary: { - variant: 'h3' + variant: 'h3', + sx: { + whiteSpace: 'normal', + overflowWrap: 'anywhere', + wordBreak: 'break-word' + } }, secondary: { variant: 'body1' diff --git a/src/apps/dashboard/routes/logs/file.tsx b/src/apps/dashboard/routes/logs/file.tsx index bc24b6c0e5..76da804924 100644 --- a/src/apps/dashboard/routes/logs/file.tsx +++ b/src/apps/dashboard/routes/logs/file.tsx @@ -110,7 +110,16 @@ export const Component = () => { ref={contentPrimaryRef} > - {fileName} + + {fileName} + {error && ( Date: Sat, 1 Aug 2026 21:20:25 +0800 Subject: [PATCH 284/287] Fix horizontal panning on mobile item details page Signed-off-by: nyanmisaka --- src/apps/modern/AppOverrides.scss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/apps/modern/AppOverrides.scss b/src/apps/modern/AppOverrides.scss index 3238e5cf53..0bc10f54ea 100644 --- a/src/apps/modern/AppOverrides.scss +++ b/src/apps/modern/AppOverrides.scss @@ -24,6 +24,12 @@ $mui-bp-xl: 1536px; } .layout-mobile { + .itemDetailPage { + // Fix horizontal panning on mobile item details page + overflow-x: hidden; + overflow-x: clip; + } + .itemBackdrop { // Fix backdrop position on mobile item details page margin-top: -48px !important; From 86090e6d285f2c2777d685e9b4c4a92ebb5b0c5e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 1 Aug 2026 14:40:08 +0000 Subject: [PATCH 285/287] Update dependency html-webpack-plugin to v5.6.8 --- package-lock.json | 10 +++++----- package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index f5a3acd808..cee6780262 100644 --- a/package-lock.json +++ b/package-lock.json @@ -113,7 +113,7 @@ "fork-ts-checker-webpack-plugin": "9.1.0", "globals": "17.7.0", "html-loader": "5.1.0", - "html-webpack-plugin": "5.6.7", + "html-webpack-plugin": "5.6.8", "jsdom": "29.1.1", "mini-css-extract-plugin": "2.10.2", "postcss": "8.5.23", @@ -13341,9 +13341,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.6.7", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz", - "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==", + "version": "5.6.8", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.8.tgz", + "integrity": "sha512-MZmKQcTnhEh1SPSyMiEytIeDZDUoBZVorNHivQGXMASHf/BSGGOrKa2xQ5bGx3TCe1n109ecCt+cpww7wwWhKA==", "dev": true, "license": "MIT", "dependencies": { @@ -13361,7 +13361,7 @@ "url": "https://opencollective.com/html-webpack-plugin" }, "peerDependencies": { - "@rspack/core": "0.x || 1.x", + "@rspack/core": "0.x || 1.x || 2.x", "webpack": "^5.20.0" }, "peerDependenciesMeta": { diff --git a/package.json b/package.json index 6ed05bb753..e6ed4f973b 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "fork-ts-checker-webpack-plugin": "9.1.0", "globals": "17.7.0", "html-loader": "5.1.0", - "html-webpack-plugin": "5.6.7", + "html-webpack-plugin": "5.6.8", "jsdom": "29.1.1", "mini-css-extract-plugin": "2.10.2", "postcss": "8.5.23", From ab4ad29eb85c41a0a3f5bd32ae088e0eb248f85f Mon Sep 17 00:00:00 2001 From: ahmadjamel89 Date: Sat, 1 Aug 2026 10:36:14 -0400 Subject: [PATCH 286/287] Translated using Weblate (Kurdish (Central)) Translation: Jellyfin/Jellyfin Web Translate-URL: https://translate.jellyfin.org/projects/jellyfin/jellyfin-web/ckb/ --- src/strings/ckb.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/strings/ckb.json b/src/strings/ckb.json index 7dce40b77f..7bea601024 100644 --- a/src/strings/ckb.json +++ b/src/strings/ckb.json @@ -179,5 +179,21 @@ "Ascending": "سەرکەوتوو", "AskAdminToCreateLibrary": "داوا لە بەڕێوەبەر بکە بۆ دروستکردنی پەرتووکخانەیەک .", "AsManyAsPossible": "تا بتوانرێت زۆرترین", - "AspectRatio": "ڕێژەی لایەنەکان" + "AspectRatio": "ڕێژەی لایەنەکان", + "Audio": "دەنگ", + "Authors": "نووسەران", + "Author": "نووسەر", + "Authorize": "ڕێگەپێدان", + "AuthProviderHelp": "دابینکەرێکی پشتڕاستکردنەوە هەڵبژێرە بۆ ڕاستکردنەوەی تێپەڕەوشەی ئەم بەکارهێنەرە .", + "Auto": "خۆکار", + "AutoSubtitleStylingHelp": "ئەم دۆخە بە شێوەیەکی خۆکارانە لە نێوان شێوازی ژێرنووسی ڕەسەن و دەستکاریبکراودا دەگۆڕێت بەپێی جۆری ئامێرەکەت .", + "Backdrop": "پاشبنەما", + "Backdrops": "پاشبنەماکان", + "BackdropScreensaver": "پارێزەری ڕوونمای پاشبنەما", + "BackupsPageLoadError": "کردنەوەی پەڕەی پشتیوانییەکان سەرکەوتوو نەبوو", + "Banner": "بانەر", + "BirthDateValue": "لەدایک بوون: {0}", + "BirthLocation": "شوێنی لەدایکبوون", + "BirthPlaceValue": "شوێنی لەدایک بوون: {0}", + "BitmapSubtitleAspectModeContain": "لەخۆگرتن" } From bc9b2b9c572d75a9600a14f221a3b7da97a4d6ee Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 1 Aug 2026 15:01:53 +0000 Subject: [PATCH 287/287] Update Fonts to v5.3.0 --- package-lock.json | 48 +++++++++++++++++++++++------------------------ package.json | 12 ++++++------ 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index cee6780262..e179cb41e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,12 +11,12 @@ "dependencies": { "@emotion/react": "11.14.0", "@emotion/styled": "11.14.1", - "@fontsource/noto-sans": "5.2.10", - "@fontsource/noto-sans-hk": "5.2.9", - "@fontsource/noto-sans-jp": "5.2.9", - "@fontsource/noto-sans-kr": "5.2.9", - "@fontsource/noto-sans-sc": "5.2.9", - "@fontsource/noto-sans-tc": "5.2.9", + "@fontsource/noto-sans": "5.3.0", + "@fontsource/noto-sans-hk": "5.3.0", + "@fontsource/noto-sans-jp": "5.3.0", + "@fontsource/noto-sans-kr": "5.3.0", + "@fontsource/noto-sans-sc": "5.3.0", + "@fontsource/noto-sans-tc": "5.3.0", "@jellyfin/libass-wasm": "4.2.4", "@jellyfin/sdk": "0.0.0-unstable.202607220710", "@jellyfin/ux-web": "1.0.0", @@ -4412,54 +4412,54 @@ } }, "node_modules/@fontsource/noto-sans": { - "version": "5.2.10", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans/-/noto-sans-5.2.10.tgz", - "integrity": "sha512-J58RVfS/C0Z2VBF+PoU260Tx8cdRGYuS+e3yQe4hYaIYDl0sEVn5CzlLo5zVRvQD0HaIUTV8AZMfqR7rtdEpqQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans/-/noto-sans-5.3.0.tgz", + "integrity": "sha512-fBCog2PY7DiVVTEEqtI/Qdinx/knobHYfoGpjFXdfBX5RoJaBp1Prw2G75p0OIsdlMZg3cLo0c+YbIUYOxnQJw==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" } }, "node_modules/@fontsource/noto-sans-hk": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-hk/-/noto-sans-hk-5.2.9.tgz", - "integrity": "sha512-ZZAfPCWxFIjvXwv6lHyo9IONzdQngcJgZU+7Q2t4DPHsS7WlRRKxhpZiHUHqKF/CvE7yJIRAxYWFAl8bLkeF0Q==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-hk/-/noto-sans-hk-5.3.0.tgz", + "integrity": "sha512-ojRRmRmb9c41KuhfInLCa7ft+1BBCGoDvOwaZLef1gyU1gO/+6xF7O/7A2/OrGXzHs9g8MyC5PbFl2rgWZZNBA==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" } }, "node_modules/@fontsource/noto-sans-jp": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-jp/-/noto-sans-jp-5.2.9.tgz", - "integrity": "sha512-6yVGiofnrnbiJjU8ch4JGSs2HqyozxMvsVyVmFwOnDH3u//qQKLqmKM4n0lqN0637uaJNzUW9nIJqbbMgHVQzw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-jp/-/noto-sans-jp-5.3.0.tgz", + "integrity": "sha512-OZbBzZ8LrFRs2RFT2Cc0HUV2C2ZeSfyEXhDJWR0EZuZaraJfRubpvrFmUnCljuBDEkw8Vn6CE/+nf9dj9b+0lg==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" } }, "node_modules/@fontsource/noto-sans-kr": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-kr/-/noto-sans-kr-5.2.9.tgz", - "integrity": "sha512-pbF8F0rUzKkDmnk/KYGAbxjgW4TrIHdFKnV6OQ+kUC9ELCn5utrAURcEgMqq3J9SRX+FvjOz+aBCmfcC8/r7cw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-kr/-/noto-sans-kr-5.3.0.tgz", + "integrity": "sha512-/JnpTjaCOXW7xUoqOyCVYSr05VOkDy5Yla9O+WAEiS7u+yYLsmHoqj6v1W0bf91G8G3XA2+NnRS3CX2Tf/FVZg==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" } }, "node_modules/@fontsource/noto-sans-sc": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-sc/-/noto-sans-sc-5.2.9.tgz", - "integrity": "sha512-bTUIWGBgJDpwi5qAr+x0/lcgv80IHTB9vl6s2f6EymZEa7qYV99yNRBZuKFT+SYDKVunZrjCEhWtpxqmbXWl5Q==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-sc/-/noto-sans-sc-5.3.0.tgz", + "integrity": "sha512-HeqIlGm0+ohOKxZLuHj1qW6r6avHH0OWdKERAcSDI0RQ+MXrteuLKA+M+5eOA8rYy0MFvOR5AT0fQo2rUkye0Q==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" } }, "node_modules/@fontsource/noto-sans-tc": { - "version": "5.2.9", - "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-tc/-/noto-sans-tc-5.2.9.tgz", - "integrity": "sha512-Z+pXTvXYrip79lPV9X1lCYO3UTys55P25VqcifDStIzdZ86I4R6t8dz+NhGd09YdbvHWvOCB5Icw1m7glKHPNQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@fontsource/noto-sans-tc/-/noto-sans-tc-5.3.0.tgz", + "integrity": "sha512-+0MguVH2vIxkVJLiaMHVKHk+yJZmZvMU9d8z88JdUx8C2CgMLOtm7WNloi3HYlvCNy7TpuvjIUvh5iiGp6INxQ==", "license": "OFL-1.1", "funding": { "url": "https://github.com/sponsors/ayuhito" diff --git a/package.json b/package.json index e6ed4f973b..5de3ea2976 100644 --- a/package.json +++ b/package.json @@ -79,12 +79,12 @@ "dependencies": { "@emotion/react": "11.14.0", "@emotion/styled": "11.14.1", - "@fontsource/noto-sans": "5.2.10", - "@fontsource/noto-sans-hk": "5.2.9", - "@fontsource/noto-sans-jp": "5.2.9", - "@fontsource/noto-sans-kr": "5.2.9", - "@fontsource/noto-sans-sc": "5.2.9", - "@fontsource/noto-sans-tc": "5.2.9", + "@fontsource/noto-sans": "5.3.0", + "@fontsource/noto-sans-hk": "5.3.0", + "@fontsource/noto-sans-jp": "5.3.0", + "@fontsource/noto-sans-kr": "5.3.0", + "@fontsource/noto-sans-sc": "5.3.0", + "@fontsource/noto-sans-tc": "5.3.0", "@jellyfin/libass-wasm": "4.2.4", "@jellyfin/sdk": "0.0.0-unstable.202607220710", "@jellyfin/ux-web": "1.0.0",