1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Merge remote-tracking branch 'upstream/master' into another-es6-pr

This commit is contained in:
MrTimscampi 2020-08-13 15:40:10 +02:00
commit 1b33cec561
16 changed files with 1527 additions and 1412 deletions

View file

@ -112,6 +112,7 @@
"src/components/favoriteitems.js",
"src/components/fetchhelper.js",
"src/components/filterdialog/filterdialog.js",
"src/components/filtermenu/filtermenu.js",
"src/components/focusManager.js",
"src/components/groupedcards.js",
"src/components/guide/guide.js",
@ -142,6 +143,7 @@
"src/components/metadataEditor/metadataEditor.js",
"src/components/metadataEditor/personEditor.js",
"src/components/multiSelect/multiSelect.js",
"src/components/notifications/notifications.js",
"src/components/nowPlayingBar/nowPlayingBar.js",
"src/components/playback/brightnessosd.js",
"src/components/playback/mediasession.js",
@ -187,13 +189,17 @@
"src/components/syncPlay/playbackPermissionManager.js",
"src/components/syncPlay/syncPlayManager.js",
"src/components/syncPlay/timeSyncManager.js",
"src/components/themeMediaPlayer.js",
"src/components/tabbedview/tabbedview.js",
"src/components/viewManager/viewManager.js",
"src/components/tvproviders/schedulesdirect.js",
"src/components/tvproviders/xmltv.js",
"src/components/toast/toast.js",
"src/components/tunerPicker.js",
"src/components/upnextdialog/upnextdialog.js",
"src/components/userdatabuttons/userdatabuttons.js",
"src/components/viewContainer.js",
"src/components/viewSettings/viewSettings.js",
"src/components/castSenderApi.js",
"src/controllers/session/addServer/index.js",
"src/controllers/session/forgotPassword/index.js",
@ -221,8 +227,8 @@
"src/controllers/dashboard/metadataImages.js",
"src/controllers/dashboard/metadatanfo.js",
"src/controllers/dashboard/networking.js",
"src/controllers/dashboard/notifications/notification.js",
"src/controllers/dashboard/notifications/notifications.js",
"src/controllers/dashboard/notifications/notification/index.js",
"src/controllers/dashboard/notifications/notifications/index.js",
"src/controllers/dashboard/playback.js",
"src/controllers/dashboard/plugins/add/index.js",
"src/controllers/dashboard/plugins/installed/index.js",
@ -256,6 +262,7 @@
"src/controllers/searchpage.js",
"src/controllers/livetv/livetvguide.js",
"src/controllers/livetvtuner.js",
"src/controllers/livetv/livetvsuggested.js",
"src/controllers/livetvstatus.js",
"src/controllers/livetvguideprovider.js",
"src/controllers/livetvsettings.js",

View file

@ -7,7 +7,6 @@
}
.osdPoster img,
.pageContainer,
.videoOsdBottom {
bottom: 0;
left: 0;
@ -248,11 +247,6 @@
animation: spin 4s linear infinite;
}
.pageContainer {
top: 0;
position: fixed;
}
@media all and (max-width: 30em) {
.btnFastForward,
.btnRewind,

View file

@ -1,16 +1,25 @@
define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost', 'inputManager', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'userSettings', 'emby-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (require, dom, focusManager, dialogHelper, loading, appHost, inputManager, layoutManager, connectionManager, appRouter, globalize, userSettings) {
'use strict';
import dom from 'dom';
import focusManager from 'focusManager';
import dialogHelper from 'dialogHelper';
import inputManager from 'inputManager';
import layoutManager from 'layoutManager';
import connectionManager from 'connectionManager';
import globalize from 'globalize';
import * as userSettings from 'userSettings';
import 'emby-checkbox';
import 'emby-input';
import 'paper-icon-button-light';
import 'emby-select';
import 'material-icons';
import 'css!./../formdialog';
import 'emby-button';
import 'flexStyles';
focusManager = focusManager.default || focusManager;
appRouter = appRouter.default || appRouter;
layoutManager = layoutManager.default || layoutManager;
function onSubmit(e) {
function onSubmit(e) {
e.preventDefault();
return false;
}
function renderOptions(context, selector, cssClass, items, isCheckedFn) {
}
function renderOptions(context, selector, cssClass, items, isCheckedFn) {
var elem = context.querySelector(selector);
if (items.length) {
@ -34,32 +43,116 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost',
}).join('');
elem.querySelector('.filterOptions').innerHTML = html;
}
}
function renderDynamicFilters(context, result, options) {
function renderDynamicFilters(context, result, options) {
renderOptions(context, '.genreFilters', 'chkGenreFilter', result.Genres, function (i) {
// Switching from | to ,
var delimeter = (options.settings.GenreIds || '').indexOf('|') === -1 ? ',' : '|';
return (delimeter + (options.settings.GenreIds || '') + delimeter).indexOf(delimeter + i.Id + delimeter) !== -1;
});
}
function setBasicFilter(context, key, elem) {
var value = elem.checked;
value = value ? value : null;
userSettings.setFilter(key, value);
}
function moveCheckboxFocus(elem, offset) {
var parent = dom.parentWithClass(elem, 'checkboxList-verticalwrap');
var elems = focusManager.getFocusableElements(parent);
var index = -1;
for (let i = 0, length = elems.length; i < length; i++) {
if (elems[i] === elem) {
index = i;
break;
}
}
function loadDynamicFilters(context, options) {
var apiClient = connectionManager.getApiClient(options.serverId);
index += offset;
var filterMenuOptions = Object.assign(options.filterMenuOptions, {
index = Math.min(elems.length - 1, index);
index = Math.max(0, index);
UserId: apiClient.getCurrentUserId(),
ParentId: options.parentId,
IncludeItemTypes: options.itemTypes.join(',')
});
apiClient.getFilters(filterMenuOptions).then(function (result) {
renderDynamicFilters(context, result, options);
var newElem = elems[index];
if (newElem) {
focusManager.focus(newElem);
}
}
function centerFocus(elem, horiz, on) {
import('scrollHelper').then(({ default: scrollHelper }) => {
var fn = on ? 'on' : 'off';
scrollHelper.centerFocus[fn](elem, horiz);
});
}
function onInputCommand(e) {
switch (e.detail.command) {
case 'left':
moveCheckboxFocus(e.target, -1);
e.preventDefault();
break;
case 'right':
moveCheckboxFocus(e.target, 1);
e.preventDefault();
break;
default:
break;
}
}
function saveValues(context, settings, settingsKey) {
var elems = context.querySelectorAll('.simpleFilter');
for (let i = 0, length = elems.length; i < length; i++) {
if (elems[i].tagName === 'INPUT') {
setBasicFilter(context, settingsKey + '-filter-' + elems[i].getAttribute('data-settingname'), elems[i]);
} else {
setBasicFilter(context, settingsKey + '-filter-' + elems[i].getAttribute('data-settingname'), elems[i].querySelector('input'));
}
}
function initEditor(context, settings) {
// Video type
var videoTypes = [];
elems = context.querySelectorAll('.chkVideoTypeFilter');
for (let i = 0, length = elems.length; i < length; i++) {
if (elems[i].checked) {
videoTypes.push(elems[i].getAttribute('data-filter'));
}
}
userSettings.setFilter(settingsKey + '-filter-VideoTypes', videoTypes.join(','));
// Series status
var seriesStatuses = [];
elems = context.querySelectorAll('.chkSeriesStatus');
for (let i = 0, length = elems.length; i < length; i++) {
if (elems[i].checked) {
seriesStatuses.push(elems[i].getAttribute('data-filter'));
}
}
// Genres
var genres = [];
elems = context.querySelectorAll('.chkGenreFilter');
for (let i = 0, length = elems.length; i < length; i++) {
if (elems[i].checked) {
genres.push(elems[i].getAttribute('data-filter'));
}
}
userSettings.setFilter(settingsKey + '-filter-GenreIds', genres.join(','));
}
function bindCheckboxInput(context, on) {
var elems = context.querySelectorAll('.checkboxList-verticalwrap');
for (let i = 0, length = elems.length; i < length; i++) {
if (on) {
inputManager.on(elems[i], onInputCommand);
} else {
inputManager.off(elems[i], onInputCommand);
}
}
}
function initEditor(context, settings) {
context.querySelector('form').addEventListener('submit', onSubmit);
var elems = context.querySelectorAll('.simpleFilter');
@ -99,128 +192,29 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost',
} else {
context.querySelector('.featureSection').classList.add('hide');
}
}
}
function loadDynamicFilters(context, options) {
var apiClient = connectionManager.getApiClient(options.serverId);
function saveValues(context, settings, settingsKey) {
var elems = context.querySelectorAll('.simpleFilter');
var i;
var length;
for (i = 0, length = elems.length; i < length; i++) {
if (elems[i].tagName === 'INPUT') {
setBasicFilter(context, settingsKey + '-filter-' + elems[i].getAttribute('data-settingname'), elems[i]);
} else {
setBasicFilter(context, settingsKey + '-filter-' + elems[i].getAttribute('data-settingname'), elems[i].querySelector('input'));
}
}
var filterMenuOptions = Object.assign(options.filterMenuOptions, {
// Video type
var videoTypes = [];
elems = context.querySelectorAll('.chkVideoTypeFilter');
for (i = 0, length = elems.length; i < length; i++) {
if (elems[i].checked) {
videoTypes.push(elems[i].getAttribute('data-filter'));
}
}
userSettings.setFilter(settingsKey + '-filter-VideoTypes', videoTypes.join(','));
// Series status
var seriesStatuses = [];
elems = context.querySelectorAll('.chkSeriesStatus');
for (i = 0, length = elems.length; i < length; i++) {
if (elems[i].checked) {
seriesStatuses.push(elems[i].getAttribute('data-filter'));
}
}
// Genres
var genres = [];
elems = context.querySelectorAll('.chkGenreFilter');
for (i = 0, length = elems.length; i < length; i++) {
if (elems[i].checked) {
genres.push(elems[i].getAttribute('data-filter'));
}
}
userSettings.setFilter(settingsKey + '-filter-GenreIds', genres.join(','));
}
function setBasicFilter(context, key, elem) {
var value = elem.checked;
value = value ? value : null;
userSettings.setFilter(key, value);
}
function centerFocus(elem, horiz, on) {
require(['scrollHelper'], function (scrollHelper) {
scrollHelper = scrollHelper.default || scrollHelper;
var fn = on ? 'on' : 'off';
scrollHelper.centerFocus[fn](elem, horiz);
UserId: apiClient.getCurrentUserId(),
ParentId: options.parentId,
IncludeItemTypes: options.itemTypes.join(',')
});
}
function moveCheckboxFocus(elem, offset) {
var parent = dom.parentWithClass(elem, 'checkboxList-verticalwrap');
var elems = focusManager.getFocusableElements(parent);
var index = -1;
for (var i = 0, length = elems.length; i < length; i++) {
if (elems[i] === elem) {
index = i;
break;
}
}
index += offset;
index = Math.min(elems.length - 1, index);
index = Math.max(0, index);
var newElem = elems[index];
if (newElem) {
focusManager.focus(newElem);
}
}
function onInputCommand(e) {
switch (e.detail.command) {
case 'left':
moveCheckboxFocus(e.target, -1);
e.preventDefault();
break;
case 'right':
moveCheckboxFocus(e.target, 1);
e.preventDefault();
break;
default:
break;
}
}
function FilterMenu() {
}
function bindCheckboxInput(context, on) {
var elems = context.querySelectorAll('.checkboxList-verticalwrap');
for (var i = 0, length = elems.length; i < length; i++) {
if (on) {
inputManager.on(elems[i], onInputCommand);
} else {
inputManager.off(elems[i], onInputCommand);
}
}
}
FilterMenu.prototype.show = function (options) {
return new Promise(function (resolve, reject) {
require(['text!./filtermenu.template.html'], function (template) {
apiClient.getFilters(filterMenuOptions).then((result) => {
renderDynamicFilters(context, result, options);
});
}
class FilterMenu {
show(options) {
return new Promise( (resolve, reject) => {
import('text!./filtermenu.template.html').then(({ default: template }) => {
var dialogOptions = {
removeOnClose: true,
scrollY: false
};
if (layoutManager.tv) {
dialogOptions.size = 'fullscreen';
} else {
@ -244,7 +238,7 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost',
dlg.innerHTML = globalize.translateHtml(html, 'core');
var settingElements = dlg.querySelectorAll('.viewSetting');
for (var i = 0, length = settingElements.length; i < length; i++) {
for (let i = 0, length = settingElements.length; i < length; i++) {
if (options.visibleSettings.indexOf(settingElements[i].getAttribute('data-settingname')) === -1) {
settingElements[i].classList.add('hide');
} else {
@ -256,7 +250,6 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost',
loadDynamicFilters(dlg, options);
bindCheckboxInput(dlg, true);
dlg.querySelector('.btnCancel').addEventListener('click', function () {
dialogHelper.close(dlg);
});
@ -271,7 +264,7 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost',
submitted = true;
}, true);
dialogHelper.open(dlg).then(function () {
dialogHelper.open(dlg).then( function() {
bindCheckboxInput(dlg, false);
if (layoutManager.tv) {
@ -281,16 +274,14 @@ define(['require', 'dom', 'focusManager', 'dialogHelper', 'loading', 'apphost',
if (submitted) {
//if (!options.onChange) {
saveValues(dlg, options.settings, options.settingsKey);
resolve();
return resolve();
//}
return;
}
return resolve();
});
});
});
}
}
reject();
});
});
});
};
return FilterMenu;
});
export default FilterMenu;

View file

@ -1,10 +1,9 @@
define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'require'], function (serverNotifications, playbackManager, events, globalize, require) {
'use strict';
import serverNotifications from 'serverNotifications';
import playbackManager from 'playbackManager';
import events from 'events';
import globalize from 'globalize';
playbackManager = playbackManager.default || playbackManager;
serverNotifications = serverNotifications.default || serverNotifications;
function onOneDocumentClick() {
function onOneDocumentClick() {
document.removeEventListener('click', onOneDocumentClick);
document.removeEventListener('keydown', onOneDocumentClick);
@ -13,14 +12,14 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
/* eslint-disable-next-line compat/compat */
Notification.requestPermission();
}
}
}
document.addEventListener('click', onOneDocumentClick);
document.addEventListener('keydown', onOneDocumentClick);
document.addEventListener('click', onOneDocumentClick);
document.addEventListener('keydown', onOneDocumentClick);
var serviceWorkerRegistration;
let serviceWorkerRegistration;
function closeAfter(notification, timeoutMs) {
function closeAfter(notification, timeoutMs) {
setTimeout(function () {
if (notification.close) {
notification.close();
@ -28,27 +27,27 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
notification.cancel();
}
}, timeoutMs);
}
}
function resetRegistration() {
function resetRegistration() {
/* eslint-disable-next-line compat/compat */
var serviceWorker = navigator.serviceWorker;
let serviceWorker = navigator.serviceWorker;
if (serviceWorker) {
serviceWorker.ready.then(function (registration) {
serviceWorkerRegistration = registration;
});
}
}
}
resetRegistration();
resetRegistration();
function showPersistentNotification(title, options, timeoutMs) {
function showPersistentNotification(title, options, timeoutMs) {
serviceWorkerRegistration.showNotification(title, options);
}
}
function showNonPersistentNotification(title, options, timeoutMs) {
function showNonPersistentNotification(title, options, timeoutMs) {
try {
var notif = new Notification(title, options); /* eslint-disable-line compat/compat */
let notif = new Notification(title, options); /* eslint-disable-line compat/compat */
if (notif.show) {
notif.show();
@ -65,10 +64,10 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
throw err;
}
}
}
}
function showNotification(options, timeoutMs, apiClient) {
var title = options.title;
function showNotification(options, timeoutMs, apiClient) {
let title = options.title;
options.data = options.data || {};
options.data.serverId = apiClient.serverInfo().Id;
@ -83,20 +82,20 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
}
showNonPersistentNotification(title, options, timeoutMs);
}
}
function showNewItemNotification(item, apiClient) {
function showNewItemNotification(item, apiClient) {
if (playbackManager.isPlayingLocally(['Video'])) {
return;
}
var body = item.Name;
let body = item.Name;
if (item.SeriesName) {
body = item.SeriesName + ' - ' + body;
}
var notification = {
let notification = {
title: 'New ' + item.Type,
body: body,
vibrate: true,
@ -104,7 +103,7 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
data: {}
};
var imageTags = item.ImageTags || {};
let imageTags = item.ImageTags || {};
if (imageTags.Primary) {
notification.icon = apiClient.getScaledImageUrl(item.Id, {
@ -115,10 +114,10 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
}
showNotification(notification, 15000, apiClient);
}
}
function onLibraryChanged(data, apiClient) {
var newItems = data.ItemsAdded;
function onLibraryChanged(data, apiClient) {
let newItems = data.ItemsAdded;
if (!newItems.length) {
return;
@ -141,26 +140,26 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
EnableTotalRecordCount: false
}).then(function (result) {
var items = result.Items;
let items = result.Items;
for (var i = 0, length = items.length ; i < length; i++) {
showNewItemNotification(items[i], apiClient);
for (const item of items) {
showNewItemNotification(item, apiClient);
}
});
}
}
function getIconUrl(name) {
function getIconUrl(name) {
name = name || 'notificationicon.png';
return require.toUrl('.').split('?')[0] + '/' + name;
}
return './components/notifications/' + name;
}
function showPackageInstallNotification(apiClient, installation, status) {
function showPackageInstallNotification(apiClient, installation, status) {
apiClient.getCurrentUser().then(function (user) {
if (!user.Policy.IsAdministrator) {
return;
}
var notification = {
let notification = {
tag: 'install' + installation.Id,
data: {}
};
@ -189,58 +188,58 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
}
if (status === 'progress') {
var percentComplete = Math.round(installation.PercentComplete || 0);
let percentComplete = Math.round(installation.PercentComplete || 0);
notification.body = percentComplete + '% complete.';
}
var timeout = status === 'cancelled' ? 5000 : 0;
let timeout = status === 'cancelled' ? 5000 : 0;
showNotification(notification, timeout, apiClient);
});
}
}
events.on(serverNotifications, 'LibraryChanged', function (e, apiClient, data) {
events.on(serverNotifications, 'LibraryChanged', function (e, apiClient, data) {
onLibraryChanged(data, apiClient);
});
});
events.on(serverNotifications, 'PackageInstallationCompleted', function (e, apiClient, data) {
events.on(serverNotifications, 'PackageInstallationCompleted', function (e, apiClient, data) {
showPackageInstallNotification(apiClient, data, 'completed');
});
});
events.on(serverNotifications, 'PackageInstallationFailed', function (e, apiClient, data) {
events.on(serverNotifications, 'PackageInstallationFailed', function (e, apiClient, data) {
showPackageInstallNotification(apiClient, data, 'failed');
});
});
events.on(serverNotifications, 'PackageInstallationCancelled', function (e, apiClient, data) {
events.on(serverNotifications, 'PackageInstallationCancelled', function (e, apiClient, data) {
showPackageInstallNotification(apiClient, data, 'cancelled');
});
});
events.on(serverNotifications, 'PackageInstalling', function (e, apiClient, data) {
events.on(serverNotifications, 'PackageInstalling', function (e, apiClient, data) {
showPackageInstallNotification(apiClient, data, 'progress');
});
});
events.on(serverNotifications, 'ServerShuttingDown', function (e, apiClient, data) {
var serverId = apiClient.serverInfo().Id;
var notification = {
events.on(serverNotifications, 'ServerShuttingDown', function (e, apiClient, data) {
let serverId = apiClient.serverInfo().Id;
let notification = {
tag: 'restart' + serverId,
title: globalize.translate('ServerNameIsShuttingDown', apiClient.serverInfo().Name)
};
showNotification(notification, 0, apiClient);
});
});
events.on(serverNotifications, 'ServerRestarting', function (e, apiClient, data) {
var serverId = apiClient.serverInfo().Id;
var notification = {
events.on(serverNotifications, 'ServerRestarting', function (e, apiClient, data) {
let serverId = apiClient.serverInfo().Id;
let notification = {
tag: 'restart' + serverId,
title: globalize.translate('ServerNameIsRestarting', apiClient.serverInfo().Name)
};
showNotification(notification, 0, apiClient);
});
});
events.on(serverNotifications, 'RestartRequired', function (e, apiClient) {
var serverId = apiClient.serverInfo().Id;
var notification = {
events.on(serverNotifications, 'RestartRequired', function (e, apiClient) {
let serverId = apiClient.serverInfo().Id;
let notification = {
tag: 'restart' + serverId,
title: globalize.translate('PleaseRestartServerName', apiClient.serverInfo().Name)
};
@ -255,5 +254,5 @@ define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'requir
];
showNotification(notification, 0, apiClient);
});
});

View file

@ -1,13 +1,12 @@
define(['playbackManager', 'userSettings', 'connectionManager'], function (playbackManager, userSettings, connectionManager) {
'use strict';
import playbackManager from 'playbackManager';
import * as userSettings from 'userSettings';
import connectionManager from 'connectionManager';
playbackManager = playbackManager.default || playbackManager;
let currentOwnerId;
let currentThemeIds = [];
var currentOwnerId;
var currentThemeIds = [];
function playThemeMedia(items, ownerId) {
var currentThemeItems = items.filter(function (i) {
function playThemeMedia(items, ownerId) {
const currentThemeItems = items.filter(function (i) {
return enabled(i.MediaType);
});
@ -32,27 +31,27 @@ define(['playbackManager', 'userSettings', 'connectionManager'], function (playb
} else {
stopIfPlaying();
}
}
}
function stopIfPlaying() {
function stopIfPlaying() {
if (currentOwnerId) {
playbackManager.stop();
}
currentOwnerId = null;
}
}
function enabled(mediaType) {
function enabled(mediaType) {
if (mediaType === 'Video') {
return userSettings.enableThemeVideos();
}
return userSettings.enableThemeSongs();
}
}
var excludeTypes = ['CollectionFolder', 'UserView', 'Program', 'SeriesTimer', 'Person', 'TvChannel', 'Channel'];
const excludeTypes = ['CollectionFolder', 'UserView', 'Program', 'SeriesTimer', 'Person', 'TvChannel', 'Channel'];
function loadThemeMedia(item) {
function loadThemeMedia(item) {
if (item.CollectionType) {
stopIfPlaying();
return;
@ -63,41 +62,40 @@ define(['playbackManager', 'userSettings', 'connectionManager'], function (playb
return;
}
var apiClient = connectionManager.getApiClient(item.ServerId);
const apiClient = connectionManager.getApiClient(item.ServerId);
apiClient.getThemeMedia(apiClient.getCurrentUserId(), item.Id, true).then(function (themeMediaResult) {
var ownerId = themeMediaResult.ThemeVideosResult.Items.length ? themeMediaResult.ThemeVideosResult.OwnerId : themeMediaResult.ThemeSongsResult.OwnerId;
const ownerId = themeMediaResult.ThemeVideosResult.Items.length ? themeMediaResult.ThemeVideosResult.OwnerId : themeMediaResult.ThemeSongsResult.OwnerId;
if (ownerId !== currentOwnerId) {
var items = themeMediaResult.ThemeVideosResult.Items.length ? themeMediaResult.ThemeVideosResult.Items : themeMediaResult.ThemeSongsResult.Items;
const items = themeMediaResult.ThemeVideosResult.Items.length ? themeMediaResult.ThemeVideosResult.Items : themeMediaResult.ThemeSongsResult.Items;
playThemeMedia(items, ownerId);
}
});
}
}
document.addEventListener('viewshow', function (e) {
var state = e.detail.state || {};
var item = state.item;
document.addEventListener('viewshow', function (e) {
const state = e.detail.state || {};
const item = state.item;
if (item && item.ServerId) {
loadThemeMedia(item);
return;
}
var viewOptions = e.detail.options || {};
const viewOptions = e.detail.options || {};
if (viewOptions.supportsThemeMedia) {
// Do nothing here, allow it to keep playing
} else {
playThemeMedia([], null);
}
}, true);
}, true);
Events.on(playbackManager, 'playbackstart', function (e, player) {
var item = playbackManager.currentItem(player);
Events.on(playbackManager, 'playbackstart', function (e, player) {
const item = playbackManager.currentItem(player);
// User played something manually
if (currentThemeIds.indexOf(item.Id) == -1) {
currentOwnerId = null;
}
});
});

View file

@ -1,16 +1,22 @@
define(['dialogHelper', 'dom', 'layoutManager', 'connectionManager', 'globalize', 'loading', 'browser', 'focusManager', 'scrollHelper', 'material-icons', 'formDialogStyle', 'emby-button', 'emby-itemscontainer', 'cardStyle'], function (dialogHelper, dom, layoutManager, connectionManager, globalize, loading, browser, focusManager, scrollHelper) {
'use strict';
import dialogHelper from 'dialogHelper';
import dom from 'dom';
import layoutManager from 'layoutManager';
import connectionManager from 'connectionManager';
import globalize from 'globalize';
import loading from 'loading';
import browser from 'browser';
import focusManager from 'focusManager';
import scrollHelper from 'scrollHelper';
import 'material-icons';
import 'formDialogStyle';
import 'emby-button';
import 'emby-itemscontainer';
import 'cardStyle';
browser = browser.default || browser;
loading = loading.default || loading;
layoutManager = layoutManager.default || layoutManager;
focusManager = focusManager.default || focusManager;
scrollHelper = scrollHelper.default || scrollHelper;
const enableFocusTransform = !browser.slow && !browser.edge;
var enableFocusTransform = !browser.slow && !browser.edge;
function getEditorHtml() {
var html = '';
function getEditorHtml() {
let html = '';
html += '<div class="formDialogContent scrollY">';
html += '<div class="dialogContentInner dialog-content-centered">';
html += '<div class="loadingContent hide">';
@ -22,15 +28,13 @@ define(['dialogHelper', 'dom', 'layoutManager', 'connectionManager', 'globalize'
html += '</div>';
html += '</div>';
return html += '</div>';
}
}
function getDeviceHtml(device) {
var padderClass;
var html = '';
var cssClass = 'card scalableCard';
var cardBoxCssClass = 'cardBox visualCardBox';
cssClass += ' backdropCard backdropCard-scalable';
padderClass = 'cardPadder-backdrop';
function getDeviceHtml(device) {
let html = '';
let cssClass = 'card scalableCard backdropCard backdropCard-scalable';
const cardBoxCssClass = 'cardBox visualCardBox';
const padderClass = 'cardPadder-backdrop';
// TODO move card creation code to Card component
@ -59,9 +63,9 @@ define(['dialogHelper', 'dom', 'layoutManager', 'connectionManager', 'globalize'
html += '</div>';
html += '</div>';
return html += '</button>';
}
}
function getTunerName(providerId) {
function getTunerName(providerId) {
switch (providerId = providerId.toLowerCase()) {
case 'm3u':
return 'M3U';
@ -78,14 +82,12 @@ define(['dialogHelper', 'dom', 'layoutManager', 'connectionManager', 'globalize'
default:
return 'Unknown';
}
}
}
function renderDevices(view, devices) {
var i;
var length;
var html = '';
function renderDevices(view, devices) {
let html = '';
for (i = 0, length = devices.length; i < length; i++) {
for (let i = 0, length = devices.length; i < length; i++) {
html += getDeviceHtml(devices[i]);
}
@ -96,15 +98,15 @@ define(['dialogHelper', 'dom', 'layoutManager', 'connectionManager', 'globalize'
view.querySelector('.devicesHeader').classList.add('hide');
}
var elem = view.querySelector('.results');
const elem = view.querySelector('.results');
elem.innerHTML = html;
if (layoutManager.tv) {
focusManager.autoFocus(elem);
}
}
}
function discoverDevices(view, apiClient) {
function discoverDevices(view, apiClient) {
loading.show();
view.querySelector('.loadingContent').classList.remove('hide');
return ApiClient.getJSON(ApiClient.getUrl('LiveTv/Tuners/Discvover', {
@ -115,11 +117,11 @@ define(['dialogHelper', 'dom', 'layoutManager', 'connectionManager', 'globalize'
view.querySelector('.loadingContent').classList.add('hide');
loading.hide();
});
}
}
function tunerPicker() {
function tunerPicker() {
this.show = function (options) {
var dialogOptions = {
const dialogOptions = {
removeOnClose: true,
scrollY: false
};
@ -130,9 +132,9 @@ define(['dialogHelper', 'dom', 'layoutManager', 'connectionManager', 'globalize'
dialogOptions.size = 'small';
}
var dlg = dialogHelper.createDialog(dialogOptions);
const dlg = dialogHelper.createDialog(dialogOptions);
dlg.classList.add('formDialog');
var html = '';
let html = '';
html += '<div class="formDialogHeader">';
html += '<button is="paper-icon-button-light" class="btnCancel autoSize" tabindex="-1"><span class="material-icons arrow_back"></span></button>';
html += '<h3 class="formDialogHeaderTitle">';
@ -144,12 +146,12 @@ define(['dialogHelper', 'dom', 'layoutManager', 'connectionManager', 'globalize'
dlg.querySelector('.btnCancel').addEventListener('click', function () {
dialogHelper.close(dlg);
});
var deviceResult;
let deviceResult;
dlg.querySelector('.results').addEventListener('click', function (e) {
var tunerCard = dom.parentWithClass(e.target, 'card');
const tunerCard = dom.parentWithClass(e.target, 'card');
if (tunerCard) {
var deviceId = tunerCard.getAttribute('data-id');
const deviceId = tunerCard.getAttribute('data-id');
deviceResult = currentDevices.filter(function (d) {
return d.DeviceId === deviceId;
})[0];
@ -161,7 +163,7 @@ define(['dialogHelper', 'dom', 'layoutManager', 'connectionManager', 'globalize'
scrollHelper.centerFocus.on(dlg.querySelector('.formDialogContent'), false);
}
var apiClient = connectionManager.getApiClient(options.serverId);
const apiClient = connectionManager.getApiClient(options.serverId);
discoverDevices(dlg, apiClient);
if (layoutManager.tv) {
@ -176,8 +178,8 @@ define(['dialogHelper', 'dom', 'layoutManager', 'connectionManager', 'globalize'
return Promise.reject();
});
};
}
}
var currentDevices = [];
return tunerPicker;
});
let currentDevices = [];
export default tunerPicker;

View file

@ -1,21 +1,27 @@
define(['connectionManager', 'globalize', 'dom', 'itemHelper', 'paper-icon-button-light', 'material-icons', 'emby-button', 'css!./userdatabuttons'], function (connectionManager, globalize, dom, itemHelper) {
'use strict';
import connectionManager from 'connectionManager';
import globalize from 'globalize';
import dom from 'dom';
import itemHelper from 'itemHelper';
import 'paper-icon-button-light';
import 'material-icons';
import 'emby-button';
import 'css!./userdatabuttons';
var userDataMethods = {
const userDataMethods = {
markPlayed: markPlayed,
markDislike: markDislike,
markLike: markLike,
markFavorite: markFavorite
};
};
function getUserDataButtonHtml(method, itemId, serverId, buttonCssClass, iconCssClass, icon, tooltip, style) {
function getUserDataButtonHtml(method, itemId, serverId, buttonCssClass, iconCssClass, icon, tooltip, style) {
if (style === 'fab-mini') {
style = 'fab';
buttonCssClass = buttonCssClass ? (buttonCssClass + ' mini') : 'mini';
}
var is = style === 'fab' ? 'emby-button' : 'paper-icon-button-light';
var className = style === 'fab' ? 'autoSize fab' : 'autoSize';
const is = style === 'fab' ? 'emby-button' : 'paper-icon-button-light';
let className = style === 'fab' ? 'autoSize fab' : 'autoSize';
if (buttonCssClass) {
className += ' ' + buttonCssClass;
@ -30,21 +36,21 @@ define(['connectionManager', 'globalize', 'dom', 'itemHelper', 'paper-icon-butto
iconCssClass += 'material-icons';
return '<button title="' + tooltip + '" data-itemid="' + itemId + '" data-serverid="' + serverId + '" is="' + is + '" data-method="' + method + '" class="' + className + '"><span class="' + iconCssClass + ' ' + icon + '"></span></button>';
}
}
function onContainerClick(e) {
var btnUserData = dom.parentWithClass(e.target, 'btnUserData');
function onContainerClick(e) {
const btnUserData = dom.parentWithClass(e.target, 'btnUserData');
if (!btnUserData) {
return;
}
var method = btnUserData.getAttribute('data-method');
const method = btnUserData.getAttribute('data-method');
userDataMethods[method](btnUserData);
}
}
function fill(options) {
var html = getIconsHtml(options);
function fill(options) {
const html = getIconsHtml(options);
if (options.fillMode === 'insertAdjacent') {
options.element.insertAdjacentHTML(options.insertLocation || 'beforeend', html);
@ -59,44 +65,44 @@ define(['connectionManager', 'globalize', 'dom', 'itemHelper', 'paper-icon-butto
dom.addEventListener(options.element, 'click', onContainerClick, {
passive: true
});
}
}
function destroy(options) {
function destroy(options) {
options.element.innerHTML = '';
dom.removeEventListener(options.element, 'click', onContainerClick, {
passive: true
});
}
}
function getIconsHtml(options) {
var item = options.item;
var includePlayed = options.includePlayed;
var cssClass = options.cssClass;
var style = options.style;
function getIconsHtml(options) {
const item = options.item;
const includePlayed = options.includePlayed;
const cssClass = options.cssClass;
const style = options.style;
var html = '';
let html = '';
var userData = item.UserData || {};
const userData = item.UserData || {};
var itemId = item.Id;
const itemId = item.Id;
if (itemHelper.isLocalItem(item)) {
return html;
}
var btnCssClass = 'btnUserData';
let btnCssClass = 'btnUserData';
if (cssClass) {
btnCssClass += ' ' + cssClass;
}
var iconCssClass = options.iconCssClass;
const iconCssClass = options.iconCssClass;
var serverId = item.ServerId;
const serverId = item.ServerId;
if (includePlayed !== false) {
var tooltipPlayed = globalize.translate('MarkPlayed');
const tooltipPlayed = globalize.translate('MarkPlayed');
if (itemHelper.canMarkPlayed(item)) {
if (userData.Played) {
@ -107,7 +113,7 @@ define(['connectionManager', 'globalize', 'dom', 'itemHelper', 'paper-icon-butto
}
}
var tooltipFavorite = globalize.translate('Favorite');
const tooltipFavorite = globalize.translate('Favorite');
if (userData.IsFavorite) {
html += getUserDataButtonHtml('markFavorite', itemId, serverId, btnCssClass + ' btnUserData btnUserDataOn', iconCssClass, 'favorite', tooltipFavorite, style);
} else {
@ -115,13 +121,13 @@ define(['connectionManager', 'globalize', 'dom', 'itemHelper', 'paper-icon-butto
}
return html;
}
}
function markFavorite(link) {
var id = link.getAttribute('data-itemid');
var serverId = link.getAttribute('data-serverid');
function markFavorite(link) {
const id = link.getAttribute('data-itemid');
const serverId = link.getAttribute('data-serverid');
var markAsFavorite = !link.classList.contains('btnUserDataOn');
const markAsFavorite = !link.classList.contains('btnUserDataOn');
favorite(id, serverId, markAsFavorite);
@ -130,11 +136,11 @@ define(['connectionManager', 'globalize', 'dom', 'itemHelper', 'paper-icon-butto
} else {
link.classList.remove('btnUserDataOn');
}
}
}
function markLike(link) {
var id = link.getAttribute('data-itemid');
var serverId = link.getAttribute('data-serverid');
function markLike(link) {
const id = link.getAttribute('data-itemid');
const serverId = link.getAttribute('data-serverid');
if (!link.classList.contains('btnUserDataOn')) {
likes(id, serverId, true);
@ -147,11 +153,11 @@ define(['connectionManager', 'globalize', 'dom', 'itemHelper', 'paper-icon-butto
}
link.parentNode.querySelector('.btnDislike').classList.remove('btnUserDataOn');
}
}
function markDislike(link) {
var id = link.getAttribute('data-itemid');
var serverId = link.getAttribute('data-serverid');
function markDislike(link) {
const id = link.getAttribute('data-itemid');
const serverId = link.getAttribute('data-serverid');
if (!link.classList.contains('btnUserDataOn')) {
likes(id, serverId, false);
@ -164,11 +170,11 @@ define(['connectionManager', 'globalize', 'dom', 'itemHelper', 'paper-icon-butto
}
link.parentNode.querySelector('.btnLike').classList.remove('btnUserDataOn');
}
}
function markPlayed(link) {
var id = link.getAttribute('data-itemid');
var serverId = link.getAttribute('data-serverid');
function markPlayed(link) {
const id = link.getAttribute('data-itemid');
const serverId = link.getAttribute('data-serverid');
if (!link.classList.contains('btnUserDataOn')) {
played(id, serverId, true);
@ -179,36 +185,35 @@ define(['connectionManager', 'globalize', 'dom', 'itemHelper', 'paper-icon-butto
link.classList.remove('btnUserDataOn');
}
}
}
function likes(id, serverId, isLiked) {
var apiClient = connectionManager.getApiClient(serverId);
function likes(id, serverId, isLiked) {
const apiClient = connectionManager.getApiClient(serverId);
return apiClient.updateUserItemRating(apiClient.getCurrentUserId(), id, isLiked);
}
}
function played(id, serverId, isPlayed) {
var apiClient = connectionManager.getApiClient(serverId);
function played(id, serverId, isPlayed) {
const apiClient = connectionManager.getApiClient(serverId);
var method = isPlayed ? 'markPlayed' : 'markUnplayed';
const method = isPlayed ? 'markPlayed' : 'markUnplayed';
return apiClient[method](apiClient.getCurrentUserId(), id, new Date());
}
}
function favorite(id, serverId, isFavorite) {
var apiClient = connectionManager.getApiClient(serverId);
function favorite(id, serverId, isFavorite) {
const apiClient = connectionManager.getApiClient(serverId);
return apiClient.updateFavoriteStatus(apiClient.getCurrentUserId(), id, isFavorite);
}
}
function clearLike(id, serverId) {
var apiClient = connectionManager.getApiClient(serverId);
function clearLike(id, serverId) {
const apiClient = connectionManager.getApiClient(serverId);
return apiClient.clearUserItemRating(apiClient.getCurrentUserId(), id);
}
}
return {
export default {
fill: fill,
destroy: destroy,
getIconsHtml: getIconsHtml
};
});
};

View file

@ -1,61 +1,66 @@
define(['require', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'connectionManager', 'appRouter', 'globalize', 'userSettings', 'emby-checkbox', 'emby-input', 'paper-icon-button-light', 'emby-select', 'material-icons', 'css!./../formdialog', 'emby-button', 'flexStyles'], function (require, dialogHelper, loading, appHost, layoutManager, connectionManager, appRouter, globalize, userSettings) {
'use strict';
import dialogHelper from 'dialogHelper';
import layoutManager from 'layoutManager';
import globalize from 'globalize';
import * as userSettings from 'userSettings';
import 'emby-checkbox';
import 'emby-input';
import 'paper-icon-button-light';
import 'emby-select';
import 'material-icons';
import 'css!./../formdialog';
import 'emby-button';
import 'flexStyles';
appRouter = appRouter.default || appRouter;
layoutManager = layoutManager.default || layoutManager;
function onSubmit(e) {
function onSubmit(e) {
e.preventDefault();
return false;
}
}
function initEditor(context, settings) {
function initEditor(context, settings) {
context.querySelector('form').addEventListener('submit', onSubmit);
var elems = context.querySelectorAll('.viewSetting-checkboxContainer');
const elems = context.querySelectorAll('.viewSetting-checkboxContainer');
for (var i = 0, length = elems.length; i < length; i++) {
elems[i].querySelector('input').checked = settings[elems[i].getAttribute('data-settingname')] || false;
for (const elem of elems) {
elem.querySelector('input').checked = settings[elem.getAttribute('data-settingname')] || false;
}
context.querySelector('.selectImageType').value = settings.imageType || 'primary';
}
}
function saveValues(context, settings, settingsKey) {
var elems = context.querySelectorAll('.viewSetting-checkboxContainer');
for (var i = 0, length = elems.length; i < length; i++) {
userSettings.set(settingsKey + '-' + elems[i].getAttribute('data-settingname'), elems[i].querySelector('input').checked);
function saveValues(context, settings, settingsKey) {
const elems = context.querySelectorAll('.viewSetting-checkboxContainer');
for (const elem of elems) {
userSettings.set(settingsKey + '-' + elem.getAttribute('data-settingname'), elem.querySelector('input').checked);
}
userSettings.set(settingsKey + '-imageType', context.querySelector('.selectImageType').value);
}
}
function centerFocus(elem, horiz, on) {
require(['scrollHelper'], function (scrollHelper) {
scrollHelper = scrollHelper.default || scrollHelper;
var fn = on ? 'on' : 'off';
function centerFocus(elem, horiz, on) {
import('scrollHelper').then(({default: scrollHelper}) => {
const fn = on ? 'on' : 'off';
scrollHelper.centerFocus[fn](elem, horiz);
});
}
}
function showIfAllowed(context, selector, visible) {
var elem = context.querySelector(selector);
function showIfAllowed(context, selector, visible) {
const elem = context.querySelector(selector);
if (visible && !elem.classList.contains('hiddenFromViewSettings')) {
elem.classList.remove('hide');
} else {
elem.classList.add('hide');
}
}
class ViewSettings {
constructor() {
}
function ViewSettings() {
}
ViewSettings.prototype.show = function (options) {
show(options) {
return new Promise(function (resolve, reject) {
require(['text!./viewSettings.template.html'], function (template) {
var dialogOptions = {
import('text!./viewSettings.template.html').then(({default: template}) => {
const dialogOptions = {
removeOnClose: true,
scrollY: false
};
@ -66,11 +71,11 @@ define(['require', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'conne
dialogOptions.size = 'small';
}
var dlg = dialogHelper.createDialog(dialogOptions);
const dlg = dialogHelper.createDialog(dialogOptions);
dlg.classList.add('formDialog');
var html = '';
let html = '';
html += '<div class="formDialogHeader">';
html += '<button is="paper-icon-button-light" class="btnCancel hide-mouse-idle-tv" tabindex="-1"><span class="material-icons arrow_back"></span></button>';
@ -82,14 +87,14 @@ define(['require', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'conne
dlg.innerHTML = globalize.translateHtml(html, 'core');
var settingElements = dlg.querySelectorAll('.viewSetting');
for (var i = 0, length = settingElements.length; i < length; i++) {
if (options.visibleSettings.indexOf(settingElements[i].getAttribute('data-settingname')) === -1) {
settingElements[i].classList.add('hide');
settingElements[i].classList.add('hiddenFromViewSettings');
const settingElements = dlg.querySelectorAll('.viewSetting');
for (const settingElement of settingElements) {
if (options.visibleSettings.indexOf(settingElement.getAttribute('data-settingname')) === -1) {
settingElement.classList.add('hide');
settingElement.classList.add('hiddenFromViewSettings');
} else {
settingElements[i].classList.remove('hide');
settingElements[i].classList.remove('hiddenFromViewSettings');
settingElement.classList.remove('hide');
settingElement.classList.remove('hiddenFromViewSettings');
}
}
@ -108,7 +113,7 @@ define(['require', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'conne
centerFocus(dlg.querySelector('.formDialogContent'), false, true);
}
var submitted;
let submitted;
dlg.querySelector('.selectImageType').dispatchEvent(new CustomEvent('change', {}));
@ -131,7 +136,7 @@ define(['require', 'dialogHelper', 'loading', 'apphost', 'layoutManager', 'conne
});
});
});
};
}
}
return ViewSettings;
});
export default ViewSettings;

View file

@ -1,38 +1,45 @@
define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize', 'libraryBrowser', 'mainTabsManager', 'cardBuilder', 'apphost', 'imageLoader', 'scrollStyles', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (layoutManager, userSettings, inputManager, loading, globalize, libraryBrowser, mainTabsManager, cardBuilder, appHost, imageLoader) {
'use strict';
import layoutManager from 'layoutManager';
import * as userSettings from 'userSettings';
import inputManager from 'inputManager';
import loading from 'loading';
import globalize from 'globalize';
import * as mainTabsManager from 'mainTabsManager';
import cardBuilder from 'cardBuilder';
import imageLoader from 'imageLoader';
import 'scrollStyles';
import 'emby-itemscontainer';
import 'emby-tabs';
import 'emby-button';
loading = loading.default || loading;
layoutManager = layoutManager.default || layoutManager;
function enableScrollX() {
function enableScrollX() {
return !layoutManager.desktop;
}
}
function getBackdropShape() {
function getBackdropShape() {
if (enableScrollX()) {
return 'overflowBackdrop';
}
return 'backdrop';
}
}
function getPortraitShape() {
function getPortraitShape() {
if (enableScrollX()) {
return 'overflowPortrait';
}
return 'portrait';
}
}
function getLimit() {
function getLimit() {
if (enableScrollX()) {
return 12;
}
return 9;
}
}
function loadRecommendedPrograms(page) {
function loadRecommendedPrograms(page) {
loading.show();
var limit = getLimit();
let limit = getLimit();
if (enableScrollX()) {
limit *= 2;
@ -53,13 +60,13 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
});
loading.hide();
require(['autoFocuser'], function (autoFocuser) {
import('autoFocuser').then(({default: autoFocuser}) => {
autoFocuser.autoFocus(page);
});
});
}
}
function reload(page, enableFullRender) {
function reload(page, enableFullRender) {
if (enableFullRender) {
loadRecommendedPrograms(page);
ApiClient.getLiveTvPrograms({
@ -130,10 +137,10 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
});
});
}
}
}
function renderItems(page, items, sectionClass, overlayButton, cardOptions) {
var html = cardBuilder.getCardsHtml(Object.assign({
function renderItems(page, items, sectionClass, overlayButton, cardOptions) {
const html = cardBuilder.getCardsHtml(Object.assign({
items: items,
preferThumb: 'auto',
inheritThumb: false,
@ -152,12 +159,12 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
showAirTime: true,
showAirDateTime: true
}, cardOptions || {}));
var elem = page.querySelector('.' + sectionClass);
const elem = page.querySelector('.' + sectionClass);
elem.innerHTML = html;
imageLoader.lazyChildren(elem);
}
}
function getTabs() {
function getTabs() {
return [{
name: globalize.translate('Programs')
}, {
@ -171,9 +178,9 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
}, {
name: globalize.translate('TabSeries')
}];
}
}
function setScrollClasses(elem, scrollX) {
function setScrollClasses(elem, scrollX) {
if (scrollX) {
elem.classList.add('hiddenScrollX');
@ -189,17 +196,17 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
elem.classList.remove('scrollX');
elem.classList.add('vertical-wrap');
}
}
}
function getDefaultTabIndex(folderId) {
function getDefaultTabIndex(folderId) {
if (userSettings.get('landing-' + folderId) === 'guide') {
return 1;
}
return 0;
}
}
return function (view, params) {
export default function (view, params) {
function enableFullRender() {
return new Date().getTime() - lastFullRender > 3e5;
}
@ -209,7 +216,7 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
}
function onTabChange(evt) {
var previousTabController = tabControllers[parseInt(evt.detail.previousIndex)];
const previousTabController = tabControllers[parseInt(evt.detail.previousIndex)];
if (previousTabController && previousTabController.onHide) {
previousTabController.onHide();
@ -227,48 +234,47 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
}
function getTabController(page, index, callback) {
var depends = [];
let depends;
// TODO int is a little hard to read
switch (index) {
case 0:
depends = 'controllers/livetv/livetvsuggested';
break;
case 1:
depends.push('controllers/livetv/livetvguide');
depends = 'controllers/livetv/livetvguide';
break;
case 2:
depends.push('controllers/livetv/livetvchannels');
depends = 'controllers/livetv/livetvchannels';
break;
case 3:
depends.push('controllers/livetv/livetvrecordings');
depends = 'controllers/livetv/livetvrecordings';
break;
case 4:
depends.push('controllers/livetv/livetvschedule');
depends = 'controllers/livetv/livetvschedule';
break;
case 5:
depends.push('controllers/livetv/livetvseriestimers');
depends = 'controllers/livetv/livetvseriestimers';
break;
}
require(depends, function (controllerFactory) {
controllerFactory = controllerFactory.default || controllerFactory;
import(depends).then(({default: controllerFactory}) => {
let tabContent;
var tabContent;
if (index == 0) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
if (index === 0) {
tabContent = view.querySelector(`.pageTabContent[data-index="${index}"]`);
self.tabContent = tabContent;
}
var controller = tabControllers[index];
let controller = tabControllers[index];
if (!controller) {
tabContent = view.querySelector(".pageTabContent[data-index='" + index + "']");
tabContent = view.querySelector(`.pageTabContent[data-index="${index}"]`);
if (index === 0) {
controller = self;
@ -304,7 +310,7 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
getTabController(page, index, function (controller) {
initialTabIndex = null;
if (renderedTabs.indexOf(index) == -1) {
if (renderedTabs.indexOf(index) === -1) {
if (index === 1) {
renderedTabs.push(index);
}
@ -325,13 +331,13 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
}
}
var isViewRestored;
var self = this;
var currentTabIndex = parseInt(params.tab || getDefaultTabIndex('livetv'));
var initialTabIndex = currentTabIndex;
var lastFullRender = 0;
let isViewRestored;
const self = this;
let currentTabIndex = parseInt(params.tab || getDefaultTabIndex('livetv'));
let initialTabIndex = currentTabIndex;
let lastFullRender = 0;
[].forEach.call(view.querySelectorAll('.sectionTitleTextButton-programs'), function (link) {
var href = link.href;
const href = link.href;
if (href) {
link.href = href + '&serverId=' + ApiClient.serverId();
@ -339,16 +345,16 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
});
self.initTab = function () {
var tabContent = view.querySelector(".pageTabContent[data-index='0']");
var containers = tabContent.querySelectorAll('.itemsContainer');
const tabContent = view.querySelector('.pageTabContent[data-index="0"]');
const containers = tabContent.querySelectorAll('.itemsContainer');
for (var i = 0, length = containers.length; i < length; i++) {
for (let i = 0, length = containers.length; i < length; i++) {
setScrollClasses(containers[i], enableScrollX());
}
};
self.renderTab = function () {
var tabContent = view.querySelector(".pageTabContent[data-index='0']");
const tabContent = view.querySelector('.pageTabContent[data-index="0"]');
if (enableFullRender()) {
reload(tabContent, true);
@ -358,9 +364,9 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
}
};
var currentTabController;
var tabControllers = [];
var renderedTabs = [];
let currentTabController;
const tabControllers = [];
const renderedTabs = [];
view.addEventListener('viewbeforeshow', function (evt) {
isViewRestored = evt.detail.isRestored;
initTabs();
@ -374,19 +380,18 @@ define(['layoutManager', 'userSettings', 'inputManager', 'loading', 'globalize',
inputManager.on(window, onInputCommand);
});
view.addEventListener('viewbeforehide', function (e) {
view.addEventListener('viewbeforehide', function () {
if (currentTabController && currentTabController.onHide) {
currentTabController.onHide();
}
inputManager.off(window, onInputCommand);
});
view.addEventListener('viewdestroy', function (evt) {
view.addEventListener('viewdestroy', function () {
tabControllers.forEach(function (tabController) {
if (tabController.destroy) {
tabController.destroy();
}
});
});
};
});
}

View file

@ -1,5 +1,4 @@
<div id="videoOsdPage" data-role="page" class="page libraryPage" data-backbutton="true">
<div class="pageContainer flex"></div>
<div class="upNextContainer hide"></div>
<div class="videoOsdBottom videoOsdBottom-maincontrols">
<div class="osdPoster"></div>

View file

@ -1484,7 +1484,7 @@
"AlwaysPlaySubtitles": "Siempre reproducir",
"AllowedRemoteAddressesHelp": "Lista separada por comas de direcciones IP/máscaras de red para las redes a las que se les permitirá conectarse remotamente. Si se deja en blanco, se les permitirá a todas las direcciones remotas.",
"AllowRemoteAccessHelp": "Si no se marca, se bloquearán todas las conexiones remotas.",
"AllowRemoteAccess": "Permitir conexiones remotas a este servidor Jellyfin.",
"AllowRemoteAccess": "Permitir conexiones remotas a este servidor.",
"AllowFfmpegThrottlingHelp": "Cuando una transcodificación o remuxeado se adelanta lo suficiente de la posición de reproducción actual, se pausa el proceso para que consuma menos recursos. Esto es más útil cuando se mira sin buscar con frecuencia. Apaga esto si experimentas problemas de reproducción.",
"AllowFfmpegThrottling": "Regular transcodificaciones",
"AllowOnTheFlySubtitleExtractionHelp": "Los subtítulos incrustados pueden extraerse de los videos y entregarse a los clientes en texto plano para ayudar a evitar la transcodificación de video. En algunos sistemas, esto puede tardar mucho tiempo y provocar que la reproducción de video se detenga durante el proceso de extracción. Deshabilite esta opción para que los subtítulos incrustados se graben con transcodificación de video cuando no estén soportados de forma nativa por el dispositivo cliente.",

View file

@ -22,7 +22,7 @@
"AllowMediaConversionHelp": "Autoriser ou refuser l'accès à la fonctionnalité de conversion des médias.",
"AllowOnTheFlySubtitleExtraction": "Autoriser l'extraction des sous-titres à la volée",
"AllowOnTheFlySubtitleExtractionHelp": "Les sous-titres intégrés peuvent être extraits des vidéos et envoyés vers les clients au format texte afin d'éviter le transcodage vidéo. Sur certains systèmes, cela peut prendre du temps et arrêter la lecture de la vidéo pendant le processus d'extraction. Désactivez cette option pour conserver les sous-titres pendant le transcodage si l'appareil client ne les prend pas en charge nativement.",
"AllowRemoteAccess": "Autoriser les connexions distantes à ce serveur Jellyfin.",
"AllowRemoteAccess": "Autoriser les connexions distantes à ce serveur.",
"AllowRemoteAccessHelp": "Si l'option est désactivée, toutes les connexions distantes seront bloquées.",
"AllowedRemoteAddressesHelp": "Liste d'adresses IP ou d'IP/masque de sous-réseau séparées par des virgules qui seront autorisées à se connecter à distance. Si la liste est vide, toutes les adresses distantes seront autorisées.",
"AlwaysPlaySubtitles": "Toujours afficher les sous-titres",
@ -131,7 +131,7 @@
"ColorTransfer": "Transfert de couleur",
"CommunityRating": "Note de la communauté",
"Composer": "Compositeur(trice)",
"ConfigureDateAdded": "Configurez comment la date d'ajout est déterminée dans le tableau de bord du serveur Jellyfin, dans les paramètres de médiathèque",
"ConfigureDateAdded": "Configurez comment la date d'ajout est déterminée dans le tableau de bord sous paramètres de médiathèque",
"ConfirmDeleteImage": "Supprimer l'image ?",
"ConfirmDeleteItem": "Supprimer cet élément l'effacera à la fois du système de fichiers et de votre médiathèque. Voulez-vous vraiment continuer ?",
"ConfirmDeleteItems": "Supprimer ces éléments les effacera à la fois du système de fichiers et de votre médiathèque. Voulez-vous vraiment continuer ?",
@ -210,10 +210,10 @@
"EndsAtValue": "Se termine à {0}",
"Episodes": "Épisodes",
"ErrorAddingListingsToSchedulesDirect": "Une erreur est survenue pendant l'ajout de la programmation avec votre compte Schedules Direct. Schedules Direct autorise uniquement un nombre limité de programmations par compte. Vous devez vous connecter au site Schedules Direct et supprimer d'autres programmations depuis votre compte avant de pouvoir réessayer.",
"ErrorAddingMediaPathToVirtualFolder": "Une erreur est survenue pendant l'ajout du chemin des médias. Veuillez vérifier que le chemin est valide et que le processus du serveur Jellyfin peut y accéder.",
"ErrorAddingMediaPathToVirtualFolder": "Une erreur est survenue pendant l'ajout du chemin des médias. Veuillez vérifier que le chemin est valide et que Jellyfin peut y accéder.",
"ErrorAddingTunerDevice": "Une erreur est survenue lors de l'ajout du tuner. Assurez-vous qu'il est accessible et réessayez.",
"ErrorAddingXmlTvFile": "Une erreur est survenue lors de l'accès au fichier XMLTV. Assurez-vous que le fichier existe et réessayez.",
"ErrorDeletingItem": "Une erreur s'est produite lors de la suppression de l'élément du serveur Jellyfin. Vérifiez que le serveur Jellyfin a un accès en écriture au dossier multimédia et réessayez.",
"ErrorDeletingItem": "Une erreur s'est produite lors de la suppression de l'élément du serveur. Vérifiez que Jellyfin a un accès en écriture au dossier multimédia et réessayez.",
"ErrorGettingTvLineups": "Une erreur est survenue pendant le téléchargement des programmes TV. Assurez-vous que vos informations sont correctes et réessayez.",
"ErrorStartHourGreaterThanEnd": "La date de fin doit être postérieure à la date de début.",
"ErrorPleaseSelectLineup": "Veuillez sélectionner une programmation et réessayer. Si aucune programmation n'est disponible, veuillez vérifier que vos identifiant, mot de passe et code postal sont corrects.",
@ -492,7 +492,7 @@
"LabelAudioLanguagePreference": "Langue audio préférée :",
"LabelAutomaticallyRefreshInternetMetadataEvery": "Actualiser automatiquement les métadonnées depuis internet :",
"LabelBindToLocalNetworkAddress": "Lier à l'adresse de réseau local :",
"LabelBindToLocalNetworkAddressHelp": "Remplace l'adresse IP locale du serveur HTTP. Sans paramètre, le serveur va se lier à toutes les adresses disponibles. La modification de cette valeur nécessite le redémarrage du serveur Jellyfin.",
"LabelBindToLocalNetworkAddressHelp": "Remplace l'adresse IP locale du serveur HTTP. Sans paramètre, le serveur va se lier à toutes les adresses disponibles. La modification de cette valeur nécessite un redémarrage.",
"LabelBirthDate": "Date de naissance :",
"LabelBirthYear": "Année de naissance :",
"LabelBlastMessageInterval": "Intervalle des messages de présence",
@ -552,7 +552,7 @@
"LabelEnableBlastAliveMessages": "Diffuser des message de présence",
"LabelEnableBlastAliveMessagesHelp": "Activer cette option si le serveur n'est pas détecté de manière fiable par les autres appareils UPnP sur votre réseau.",
"LabelEnableDlnaClientDiscoveryInterval": "Intervalle de découverte des clients",
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Détermine la durée en secondes entre les recherches SSDP exécutées par Jellyfin.",
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Détermine la durée en secondes entre les recherches SSDP.",
"LabelEnableDlnaDebugLogging": "Activer le débogage DLNA dans le journal d'événements",
"LabelEnableDlnaDebugLoggingHelp": "Génère de gros fichiers de journal d'événements et ne devrait être utilisé que pour des diagnostics d'erreur.",
"LabelEnableDlnaPlayTo": "Activer la lecture en DLNA",
@ -671,7 +671,7 @@
"LabelNumberOfGuideDays": "Nombre de jours de données du guide à télécharger :",
"LabelNumberOfGuideDaysHelp": "Télécharger plus de journées du guide permet de programmer des enregistrements plus longtemps à l'avance et de visualiser plus de contenus, mais prendra également plus de temps. Automatique permettra une sélection automatique basée sur le nombre de chaînes.",
"LabelOptionalNetworkPath": "Dossier réseau partagé :",
"LabelOptionalNetworkPathHelp": "Si le dossier est partagé sur votre réseau, donner le chemin d'accès au dossier réseau peut permettre aux applications Jellyfin sur d'autres appareils d'avoir accès à ses fichiers directement. Par exemple, {0} ou {1}.",
"LabelOptionalNetworkPathHelp": "Si le dossier est partagé sur votre réseau, donner le chemin d'accès au dossier réseau peut permettre aux clients sur d'autres appareils d'avoir accès à ses fichiers directement. Par exemple, {0} ou {1}.",
"LabelOriginalAspectRatio": "Ratio d'aspect original :",
"LabelOriginalTitle": "Titre original :",
"LabelOverview": "Synopsis :",
@ -847,13 +847,13 @@
"MessageConfirmProfileDeletion": "Voulez-vous vraiment supprimer ce profil ?",
"MessageConfirmRecordingCancellation": "Annuler l'enregistrement ?",
"MessageConfirmRemoveMediaLocation": "Voulez-vous vraiment supprimer cet emplacement ?",
"MessageConfirmRestart": "Voulez-vous vraiment redémarrer le serveur Jellyfin ?",
"MessageConfirmRevokeApiKey": "Voulez-vous vraiment révoquer cette clé API ? La connexion de l'application au serveur Jellyfin sera brutalement interrompue.",
"MessageConfirmRestart": "Voulez-vous vraiment redémarrer Jellyfin ?",
"MessageConfirmRevokeApiKey": "Voulez-vous vraiment révoquer cette clé API ? La connexion de l'application à ce serveur sera brutalement interrompue.",
"MessageConfirmShutdown": "Voulez-vous vraiment éteindre le serveur ?",
"MessageContactAdminToResetPassword": "Veuillez contacter votre administrateur système pour réinitialiser votre mot de passe.",
"MessageCreateAccountAt": "Créer un compte sur {0}",
"MessageDeleteTaskTrigger": "Voulez-vous vraiment supprimer ce déclencheur de tâche ?",
"MessageDirectoryPickerBSDInstruction": "Sur BSD, vous devrez peut-être configurer le stockage de votre jail FreeNAS pour autoriser Jellyfin à y accéder.",
"MessageDirectoryPickerBSDInstruction": "Sur BSD, vous devrez peut-être configurer le stockage de votre jail FreeNAS pour autoriser Jellyfin à accéder à vos médias.",
"MessageDirectoryPickerLinuxInstruction": "Pour Linux sur Arch Linux, CentOS, Debian, Fedora, openSUSE ou Ubuntu, vous devez au moins autoriser l'accès en lecture à vos répertoires de stockage pour l'utilisateur de service .",
"MessageDownloadQueued": "Téléchargement mis en file d'attente.",
"MessageEnablingOptionLongerScans": "Activer cette option peut accroître la durée d'actualisation de la médiathèque.",
@ -875,7 +875,7 @@
"MessagePleaseEnsureInternetMetadata": "Veuillez vous assurer que le téléchargement des métadonnées depuis Internet est activé.",
"MessagePleaseWait": "Veuillez patienter. Ceci peut prendre quelques minutes.",
"MessagePluginConfigurationRequiresLocalAccess": "Pour configurer cette extension, veuillez vous connecter directement à votre serveur local.",
"MessagePluginInstallDisclaimer": "Les extensions développées par les membres de la communauté Jellyfin sont une excellente manière d'améliorer votre expérience Jellyfin avec de nouvelles fonctionnalités. Avant toute installation, veuillez prendre connaissance de l'impact qu'elles peuvent avoir sur le serveur Jellyfin, comme l'augmentation de la durée d'actualisation de la médiathèque, de nouvelles tâches de fond, ou un système moins stable.",
"MessagePluginInstallDisclaimer": "Les extensions développées par les membres de la communauté sont une excellente manière d'améliorer votre expérience avec de nouvelles fonctionnalités. Avant toute installation, veuillez prendre connaissance de l'impact qu'elles peuvent avoir sur le serveur, comme l'augmentation de la durée d'actualisation de la médiathèque, de nouvelles tâches de fond, ou un système moins stable.",
"MessageReenableUser": "Voir ci-dessous pour le réactiver",
"MessageSettingsSaved": "Paramètres enregistrés.",
"MessageTheFollowingLocationWillBeRemovedFromLibrary": "Ces emplacements de média vont être supprimés de votre médiathèque :",
@ -1035,7 +1035,7 @@
"OptionRuntime": "Durée",
"OptionSaturday": "Samedi",
"OptionSaveMetadataAsHidden": "Enregistrer les métadonnées et les images en tant que fichier cachés",
"OptionSaveMetadataAsHiddenHelp": "La modification s'appliquera aux nouvelles métadonnées enregistrées à l'avenir. Les fichiers de métadonnées existants seront mis à jour la prochaine fois qu'ils seront enregistrés par le serveur Jellyfin.",
"OptionSaveMetadataAsHiddenHelp": "La modification s'appliquera aux nouvelles métadonnées enregistrées à l'avenir. Les fichiers de métadonnées existants seront mis à jour la prochaine fois qu'ils seront enregistrés par le serveur.",
"OptionSpecialEpisode": "Spéciaux",
"OptionSubstring": "Sous-chaîne",
"OptionSunday": "Dimanche",
@ -1078,9 +1078,9 @@
"PleaseAddAtLeastOneFolder": "Veuillez ajouter au moins un dossier à cette médiathèque en cliquant sur le bouton Ajouter.",
"PleaseConfirmPluginInstallation": "Merci de cliquer sur OK pour confirmer que vous avez lu ce qui précède et que vous souhaitez poursuivre l'installation de l'extension.",
"PleaseEnterNameOrId": "Veuillez saisir un nom ou un identifiant externe.",
"PleaseRestartServerName": "Veuillez redémarrer le serveur Jellyfin - {0}.",
"PleaseRestartServerName": "Veuillez redémarrer le serveur Jellyfin sur {0}.",
"PleaseSelectTwoItems": "Veuillez sélectionner au moins deux éléments.",
"MessagePluginInstalled": "Cette extension a été installée avec succès. Le serveur Jellyfin doit être redémarré afin que les modifications soient prises en compte.",
"MessagePluginInstalled": "Cette extension a été installée avec succès. Le serveur doit être redémarré afin que les modifications soient prises en compte.",
"PreferEmbeddedTitlesOverFileNames": "Préférer les titres intégrés aux médias aux noms des fichiers",
"PreferEmbeddedTitlesOverFileNamesHelp": "Cela détermine le titre affiché par défaut quand il n'y a pas de métadonnées en ligne ou locales disponibles.",
"Premieres": "Inédits",
@ -1142,10 +1142,10 @@
"SeriesRecordingScheduled": "Enregistrement de la série planifié.",
"SeriesSettings": "Paramètres de la série",
"SeriesYearToPresent": "{0} - Présent",
"ServerNameIsRestarting": "Serveur Jellyfin - {0} redémarre.",
"ServerNameIsShuttingDown": "Serveur Jellyfin - {0} s'arrête.",
"ServerRestartNeededAfterPluginInstall": "Le serveur Jellyfin devra être redémarré après l'installation d'une extension.",
"ServerUpdateNeeded": "Le serveur Jellyfin doit être mis à jour. Pour télécharger la dernière version, veuillez visiter {0}",
"ServerNameIsRestarting": "Le serveur sur {0} redémarre.",
"ServerNameIsShuttingDown": "Le serveur sur {0} s'arrête.",
"ServerRestartNeededAfterPluginInstall": "Jellyfin devra être redémarré après l'installation d'une extension.",
"ServerUpdateNeeded": "Ce serveur doit être mis à jour. Pour télécharger la dernière version, veuillez visiter {0}",
"Settings": "Paramètres",
"SettingsSaved": "Paramètres enregistrés.",
"SettingsWarning": "La modification de ces valeurs peut provoquer des défaillances de stabilité ou de connectivité. Si vous rencontrez des problèmes, nous vous recommandons de les remettre aux valeurs par défaut.",
@ -1441,7 +1441,7 @@
"LastSeen": "Vu pour la dernière fois {0}",
"PersonRole": "en tant que {0}",
"ListPaging": "{0}-{1} de {2}",
"WriteAccessRequired": "Le serveur Jellyfin a besoin d'un accès en écriture à ce dossier. Merci de vérifier laccès en écriture et réessayez.",
"WriteAccessRequired": "Jellyfin a besoin d'un accès en écriture à ce dossier. Merci de vérifier laccès en écriture et réessayez.",
"PathNotFound": "Le chemin d'accès n'a pas pu être trouvé. Merci de le vérifier et de réessayer.",
"YadifBob": "YADIF Bob",
"Yadif": "YADIF",

View file

@ -23,7 +23,7 @@
"AllowMediaConversionHelp": "Umożliwia dawanie lub odbieranie dostępu do funkcji konwersji mediów.",
"AllowOnTheFlySubtitleExtraction": "Zezwalaj na wydobywanie napisów w locie",
"AllowOnTheFlySubtitleExtractionHelp": "Napisy wbudowane mogą zostać wydobyte z plików wideo i dostarczone do klienta w postaci zwykłego tekstu, zapobiegając transkodowaniu wideo. Na niektórych systemach może to zabierać dużo czasu i powodować wstrzymywanie odtwarzania wideo podczas procesu ekstrakcji. Dezaktywuj tę opcję, aby wbudowane napisy były wypalane w transkodowanym wideo, gdy nie są obsługiwane przez urządzenie klienta.",
"AllowRemoteAccess": "Zezwalaj na zdalne połączenia z tym serwerem Jellyfin.",
"AllowRemoteAccess": "Zezwalaj na zdalne połączenia z tym serwerem.",
"AllowRemoteAccessHelp": "Jeśli nieaktywne, wszelkie zdalne połączenia będą blokowane.",
"AllowedRemoteAddressesHelp": "Lista rozdzielona przecinkiem w postaci adresów IP lub adresów IP z maską sieciową dla całych podsieci. W przypadku pozostawienia pustego pola, dopuszczalne będą połączenia ze wszystkich zdalnych adresów.",
"AlwaysPlaySubtitles": "Zawsze wyświetlaj napisy",
@ -136,7 +136,7 @@
"ColorTransfer": "Transfer kolorów",
"CommunityRating": "Ocena społeczności",
"Composer": "Kompozytor",
"ConfigureDateAdded": "Sposób ustalania daty dodania, można skonfigurować w ustawieniach biblioteki w kokpicie serwera Jellyfin",
"ConfigureDateAdded": "Skonfiguruj sposób określania dodanej daty na pulpicie nawigacyjnym w ustawieniach biblioteki.",
"ConfirmDeleteImage": "Usunąć obraz?",
"ConfirmDeleteItem": "Usunięcie tej pozycji usunie ją zarówno z systemu plików jak i z biblioteki mediów. Czy chcesz kontynuować?",
"ConfirmDeleteItems": "Usunięcie tej pozycji usunie ją zarówno z systemu plików jak i z biblioteki mediów. Czy chcesz kontynuować?",
@ -215,10 +215,10 @@
"EndsAtValue": "Koniec o {0}",
"Episodes": "Odcinki",
"ErrorAddingListingsToSchedulesDirect": "Wystąpił błąd podczas dodawania składu do twojego konta Schedules Direct. Schedules Direct pozwala na limitowaną ilość składów na konto. Może być wymagane zalogowanie się na stronę Schedules Direct i usunięcie innych składów przed kontynuowaniem.",
"ErrorAddingMediaPathToVirtualFolder": "Wystąpił błąd podczas dodawania folderu mediów. Upewnij się, że folder jest prawidłowy a serwer Jellyfin ma dostęp do tej lokalizacji.",
"ErrorAddingMediaPathToVirtualFolder": "Wystąpił błąd podczas dodawania folderu mediów. Upewnij się, że folder jest prawidłowy a Jellyfin ma dostęp do tej lokalizacji.",
"ErrorAddingTunerDevice": "Wystąpił błąd podczas dodawania tuner telewizyjnego. Upewnij się, że masz do niego dostęp i spróbuj ponownie.",
"ErrorAddingXmlTvFile": "Podczas próby dostępu do pliku XMLTV wystąpił błąd. Upewnij się, że plik istnieje i spróbuj ponownie.",
"ErrorDeletingItem": "Podczas usuwania pozycji z serwera Jellyfin wystąpił błąd. Upewnij się, że serwer ma uprawnienia do zapisu w folderze mediów i spróbuj ponownie.",
"ErrorDeletingItem": "Podczas usuwania pozycji z serwera wystąpił błąd. Upewnij się, że serwer ma uprawnienia do zapisu w folderze mediów i spróbuj ponownie.",
"ErrorGettingTvLineups": "Podczas pobierania programu telewizyjnego wystąpił błąd. Upewnij się, że informacje są poprawne i spróbuj ponownie.",
"ErrorStartHourGreaterThanEnd": "Czas końcowy musi być większy niż czas początkowy.",
"ErrorPleaseSelectLineup": "Wybierz program i spróbuj ponownie, jeśli żadne programy nie są dostępne, sprawdź czy twój login, hasło i kod pocztowy jest poprawny.",
@ -278,7 +278,7 @@
"HeaderAllowMediaDeletionFrom": "Zezwalaj na usuwanie mediów z",
"HeaderApiKey": "Klucz API",
"HeaderApiKeys": "Klucze API",
"HeaderApiKeysHelp": "Aplikacje zewnętrzne muszą posiadać klucz API, aby móc komunikować się z serwerem Jellyfin. Klucze wydawane są po zalogowaniu się za pomocą konta Jellyfin lub ręcznie nadając aplikacji klucz.",
"HeaderApiKeysHelp": "Aplikacje zewnętrzne muszą posiadać klucz API, aby móc komunikować się z serwerem. Klucze wydawane są po zalogowaniu się za pomocą konta lub ręcznie nadając aplikacji klucz.",
"HeaderApp": "Aplikacja",
"HeaderAppearsOn": "Występuje",
"HeaderAudioBooks": "Książka mówiona",
@ -396,7 +396,7 @@
"HeaderPreferredMetadataLanguage": "Preferowany język metadanych",
"HeaderProfile": "Profil",
"HeaderProfileInformation": "Informacja o Profilu",
"HeaderProfileServerSettingsHelp": "Te wartości kontrolują jak serwer Jellyfin będzie przedstawiany dla urządzeń.",
"HeaderProfileServerSettingsHelp": "Te wartości kontrolują jak serwer będzie przedstawiany dla urządzeń.",
"HeaderRecentlyPlayed": "Ostatnio odtwarzane",
"HeaderRecordingOptions": "Opcje nagrywania",
"HeaderRecordingPostProcessing": "Przetwarzanie finalne nagrań",
@ -473,7 +473,7 @@
"Identify": "Identyfikuj",
"Images": "Obrazy",
"ImportFavoriteChannelsHelp": "Jeśli aktywne, tylko kanały oznaczone jako ulubione na tunerze, będą importowane.",
"ImportMissingEpisodesHelp": "W przypadku aktywacji tej opcji, informacje o brakujących odcinkach zostaną zaimportowane do bazy Jellyfin i będą wyświetlane na listach sezonów i seriali. Może to jednak znacznie wydłużyć czas skanowania biblioteki.",
"ImportMissingEpisodesHelp": "Informacje o brakujących odcinkach zostaną zaimportowane do bazy i będą wyświetlane na listach sezonów i seriali. Może to jednak znacznie wydłużyć czas skanowania biblioteki.",
"InstallingPackage": "Instalowanie {0} (wersja {1})",
"InstantMix": "Szybki remiks",
"ItemCount": "{0} pozycje",
@ -503,15 +503,15 @@
"LabelAppName": "Nazwa Aplikacji",
"LabelAppNameExample": "Przykład: Sickbeard, Sonarr",
"LabelArtists": "Wykonawcy:",
"LabelArtistsHelp": "Oddzielaj używając ;",
"LabelArtistsHelp": "Oddziel wielu artystów średnikiem \";\"",
"LabelAudio": "Dźwięk",
"LabelAudioLanguagePreference": "Preferowany język ścieżki dźwiękowej:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "Odświeżaj automatycznie metadane z Internetu:",
"LabelBindToLocalNetworkAddress": "Przypisz do lokalnego adresu sieciowego:",
"LabelBindToLocalNetworkAddressHelp": "Opcjonalne. Zastąpi to lokalny adres IP adresem serwera HTTP Jeśli pozostanie puste, serwer będzie wiązać się z wszystkimi dostępnymi adresami. Zmiana tej wartości wymaga ponownego uruchomienia serwera Jellyfin.",
"LabelBindToLocalNetworkAddressHelp": "Zastąp lokalny adres IP serwera HTTP. Jeśli pozostanie puste, serwer połączy się ze wszystkimi dostępnymi adresami. Zmiana tej wartości wymaga ponownego uruchomienia.",
"LabelBirthDate": "Data urodzenia:",
"LabelBirthYear": "Rok urodzenia:",
"LabelBlastMessageInterval": "Częstotliwość komunikatów o dostępności (sekundy)",
"LabelBlastMessageInterval": "Częstotliwość komunikatów o dostępności",
"LabelBlastMessageIntervalHelp": "Określa częstotliwość, wyrażoną w sekundach, przesyłania komunikatów o dostępności serwera.",
"LabelBlockContentWithTags": "Blokuj pozycje ze znacznikami:",
"LabelBurnSubtitles": "Wypalaj napisy:",
@ -531,13 +531,13 @@
"LabelCustomCertificatePath": "Folder niestandardowego certyfikatu SSL:",
"LabelCustomCertificatePathHelp": "Ścieżka do pliku PKCS #12, zawierającego certyfikat i klucz prywatny, niezbędny do aktywowana obsługi TLS dla własnej domeny.",
"LabelCustomCss": "Niestandardowy CSS:",
"LabelCustomCssHelp": "Zastosuj własny niestandardowy arkusz stylów CSS dla interfejsu webowego.",
"LabelCustomCssHelp": "Zastosuj własne niestandardowe arkusze stylów dla interfejsu webowego.",
"LabelCustomDeviceDisplayName": "Nazwa wyświetlana:",
"LabelCustomDeviceDisplayNameHelp": "Dostarcz własną nazwę wyświetlania lub zostaw puste i użyj nazwy dostarczonej przez urządzenie.",
"LabelCustomRating": "Kategoria wiekowa własna:",
"LabelDateAdded": "Data dodania:",
"LabelDateAddedBehavior": "Data dodania dla nowej zawartości:",
"LabelDateAddedBehaviorHelp": "Jeśli istnieją metadane będą one użyte zawsze przed którąkolwiek z tych opcji.",
"LabelDateAddedBehaviorHelp": "Jeśli istnieją metadane, będą one zawsze użyte przed którąkolwiek z tych opcji.",
"LabelDateTimeLocale": "Strefa czasowa:",
"LabelDay": "Dzień:",
"LabelDeathDate": "Data śmierci:",
@ -566,8 +566,8 @@
"LabelEnableAutomaticPortMapHelp": "Umożliwia automatyczne przekierowanie publicznego portu na twoim ruterze do lokalnego portu na serwerze przy użyciu UPnP. Ta opcja może nie działać z niektórymi modelami ruterów lub w niektórych konfiguracjach sieci. Zmiany zaczną działać po ponownym uruchomieniu serwera.",
"LabelEnableBlastAliveMessages": "Przesyłaj komunikaty o dostępności",
"LabelEnableBlastAliveMessagesHelp": "Aktywuj tę funkcję, jeśli serwer nie jest odpowiednio wykrywany przez inne urządzenia UPnP w twojej sieci.",
"LabelEnableDlnaClientDiscoveryInterval": "Częstotliwość wykrywania klientów (sekundy)",
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Określa czas w sekundach, pomiędzy wyszukiwaniami SSDP, wykonywanymi przez Jellyfin.",
"LabelEnableDlnaClientDiscoveryInterval": "Częstotliwość wykrywania klientów",
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Określa czas w sekundach, pomiędzy wyszukiwaniami SSDP.",
"LabelEnableDlnaDebugLogging": "Rejestruj komunikaty diagnostyczne DLNA",
"LabelEnableDlnaDebugLoggingHelp": "Tworzenie ogromnych plików dziennika diagnostycznego powinno być używane tylko w przypadku rozwiązywania problemów.",
"LabelEnableDlnaPlayTo": "Aktywuj funkcję DLNA Play To",
@ -576,7 +576,7 @@
"LabelEnableDlnaServerHelp": "Umożliwia urządzeniom UPnP w sieci domowej, na przeglądanie i odtwarzanie zawartości.",
"LabelEnableHardwareDecodingFor": "Aktywuj dekodowanie sprzętowe dla:",
"LabelEnableRealtimeMonitor": "Monitoruj w czasie rzeczywistym",
"LabelEnableRealtimeMonitorHelp": "Na obsługiwanych systemach plików, zmiany zostaną przetworzone natychmiast.",
"LabelEnableRealtimeMonitorHelp": "Na obsługiwanych systemach plików zmiany zostaną przetworzone natychmiast.",
"LabelEnableSingleImageInDidlLimit": "Ograniczaj do jednego wbudowanego obrazu",
"LabelEnableSingleImageInDidlLimitHelp": "Niektóre urządzenie nie pokarzą prawidłowo wielu obrazów z Didl.",
"LabelEndDate": "Data zakończenia:",
@ -591,9 +591,9 @@
"LabelFont": "Czcionka:",
"LabelForgotPasswordUsernameHelp": "Podaj nazwę użytkownika, jeśli pamiętasz.",
"LabelFriendlyName": "Przyjazna nazwa:",
"LabelServerNameHelp": "Ta nazwa będzie użyta do identyfikacji serwera, domyślnie użyta będzie nazwa komputera.",
"LabelServerNameHelp": "Ta nazwa będzie użyta do identyfikacji serwera, domyślnie użyta będzie nazwa serwera.",
"LabelGroupMoviesIntoCollections": "Grupuj filmy w kolekcje",
"LabelGroupMoviesIntoCollectionsHelp": "Podczas wyświetlania listy filmów, filmy należące do kolekcji będą wyświetlone jako jedna zgrupowana pozycja.",
"LabelGroupMoviesIntoCollectionsHelp": "Podczas wyświetlania list filmów, filmy w kolekcji będą wyświetlane jako jedna zgrupowana pozycja.",
"LabelH264Crf": "CRF kodowania H264:",
"LabelEncoderPreset": "Szablon kodowania H264:",
"LabelHardwareAccelerationType": "Akceleracja sprzętowa:",
@ -601,7 +601,7 @@
"LabelHomeNetworkQuality": "Jakość dla sieci lokalnej:",
"LabelHomeScreenSectionValue": "Sekcja ekranu startowego {0}:",
"LabelHttpsPort": "Lokalny numer portu HTTPS:",
"LabelHttpsPortHelp": "Numer portu TCP w trybie HTTPS, na którym serwer Jellyfin ma być dostępny.",
"LabelHttpsPortHelp": "Numer portu TCP dla serwera HTTPS.",
"LabelIconMaxHeight": "Maksymalna wysokość ikon:",
"LabelIconMaxHeightHelp": "Maksymalna rozdzielczość ikon wystawianych przez upnp:icon.",
"LabelIconMaxWidth": "Maksymalna szerokość ikony:",
@ -629,7 +629,7 @@
"LabelLanguage": "Język:",
"LabelLineup": "Kolejka:",
"LabelLocalHttpServerPortNumber": "Lokalny numer portu HTTP:",
"LabelLocalHttpServerPortNumberHelp": "Numer portu TCP w trybie HTTP, na którym serwer Jellyfin ma być dostępny.",
"LabelLocalHttpServerPortNumberHelp": "Numer portu TCP dla serwera HTTP.",
"LabelLockItemToPreventChanges": "Zablokuj tę pozycję, aby zapobiec przyszłym zmianom",
"LabelLoginDisclaimer": "Zastrzeżenie odpowiedzialności:",
"LabelLoginDisclaimerHelp": "Wiadomość będzie wyświetlona na dole strony logowania.",
@ -655,7 +655,7 @@
"LabelMetadataReaders": "Czytnik metadanych:",
"LabelMetadataReadersHelp": "Określ swój priorytet dla źródeł metadanych. Pierwszy znaleziony plik będzie odczytany.",
"LabelMetadataSavers": "Zapisywanie metadanych:",
"LabelMetadataSaversHelp": "Wybierz formaty plików używane do zapisywania metadanych.",
"LabelMetadataSaversHelp": "Wybierz formaty plików używane do zapisywania Twoich metadanych.",
"LabelMethod": "Metoda:",
"LabelMinBackdropDownloadWidth": "Minimalna szerokość pobieranych fototapet:",
"LabelMinResumeDuration": "Minimalny czas wznowienia:",
@ -671,7 +671,7 @@
"LabelMovieCategories": "Kategorie filmowe:",
"LabelMoviePrefix": "Prefiks filmu:",
"LabelMoviePrefixHelp": "Jeśli stosujesz prefiksy dla tytułów filmów, wprowadź go tutaj, aby serwer mógł je obsługiwać prawidłowo.",
"LabelMovieRecordingPath": "Folder nagrywania filmów (opcjonalne):",
"LabelMovieRecordingPath": "Folder nagrywania filmów:",
"LabelMusicStreamingTranscodingBitrate": "Przepływność transkodowania muzyki:",
"LabelMusicStreamingTranscodingBitrateHelp": "Określa maksymalny bitrate podczas strumieniowania muzyki.",
"LabelName": "Nazwa:",
@ -684,8 +684,8 @@
"LabelNumber": "Numer:",
"LabelNumberOfGuideDays": "Liczba dni pobieranych danych przewodnika:",
"LabelNumberOfGuideDaysHelp": "Pobieranie większej liczby dni danych przewodnika, pozwoli na zaplanowanie zadań na dłuższy okres i wyświetlanie większej listy, ale wydłuży także czas na jego pobranie. Automatycznie wybierze na podstawie liczby kanałów.",
"LabelOptionalNetworkPath": "(Opcjonalne) Udostępniony folder sieciowy:",
"LabelOptionalNetworkPathHelp": "Jeśli folder jest udostępniony w sieci domowej, podanie jego ścieżki, umożliwi bezpośrednie odtwarzanie na innych urządzeniach. Na przykład, {0} lub {1}.",
"LabelOptionalNetworkPath": "Udostępniony folder sieciowy:",
"LabelOptionalNetworkPathHelp": "Jeśli ten folder jest udostępniony w sieci, podanie ścieżki udziału sieciowego może umożliwić klientom na innych urządzeniach bezpośredni dostęp do plików multimedialnych. Na przykład {0} lub {1}.",
"LabelOriginalAspectRatio": "Oryginalny format obrazu:",
"LabelOriginalTitle": "Tytuł oryginalny:",
"LabelOverview": "Opis:",
@ -729,7 +729,7 @@
"LabelReleaseDate": "Data wydania:",
"LabelRemoteClientBitrateLimit": "Limit przepływności transmisji (Mbps):",
"LabelRemoteClientBitrateLimitHelp": "Opcjonalny limit przepływności transmisji dla urządzeń poza siecią domową. Używaj tej opcji, w celu zapobiegania żądaniom o wyższe przepływności, niż Twojej połączenie internetowe może obsłużyć.",
"LabelRuntimeMinutes": "Czas (w minutach):",
"LabelRuntimeMinutes": "Czas trwania:",
"LabelSaveLocalMetadata": "Zapisuj grafiki w folderach mediów",
"LabelSaveLocalMetadataHelp": "Umożliwia zapisywanie grafik i bezpośrednio w folderach mediów, co umożliwia ich łatwą edycję.",
"LabelScheduledTaskLastRan": "Ostatnio uruchomiono {0}, czas trwania {1}.",
@ -741,7 +741,7 @@
"LabelSelectVersionToInstall": "Wybierz wersję do instalacji:",
"LabelSendNotificationToUsers": "Wyślij powiadomienie do:",
"LabelSerialNumber": "Numer seryjny",
"LabelSeriesRecordingPath": "Folder nagrywania seriali (opcjonalne):",
"LabelSeriesRecordingPath": "Folder nagrywania seriali:",
"LabelServerHost": "Serwer:",
"LabelServerHostHelp": "192.168.1.100:8096 or https://myserver.com",
"LabelSimultaneousConnectionLimit": "Limit jednoczesnych transmisji:",
@ -810,7 +810,7 @@
"LabelYoureDone": "Zakończono!",
"LabelZipCode": "Kod pocztowy:",
"LabelffmpegPath": "Folder aplikacji FFmpeg:",
"LabelffmpegPathHelp": "Określa folder aplikacji FFmpeg lub folder zawierający FFmpeg.",
"LabelffmpegPathHelp": "Określa folder aplikacji ffmpeg lub folder zawierający ffmpeg.",
"LanNetworksHelp": "Lista adresów IP lub adresów IP z maską podsieci dla całych sieci, rozdzielana przecinkami, które będą traktowane jako sieć lokalna w trakcie egzekwowania ograniczeń przepustowości. Jeśli zostanie wypełniona, wszystkie pozostałe adresy będą traktowane jako sieć zewnętrzna i będą podlegać ograniczeniom przepustowości. Jeśli zostanie pusta, tylko podsieć, w której znajduje się serwer, będzie traktowana jako sieć lokalna.",
"Large": "Duży",
"LatestFromLibrary": "{0} ostatnio dodane",
@ -860,13 +860,13 @@
"MessageConfirmProfileDeletion": "Czy na pewno chcesz usunąć ten profil?",
"MessageConfirmRecordingCancellation": "Anulować nagranie?",
"MessageConfirmRemoveMediaLocation": "Czy na pewno chcesz usunąć tę lokalizację?",
"MessageConfirmRestart": "Czy na pewno chcesz uruchomić serwer Jellyfin ponownie?",
"MessageConfirmRevokeApiKey": "Czy na pewno chcesz unieważnić klucz api? Połączenia aplikacji z serwerem Jellyfin zostaną natychmiastowo zakończone.",
"MessageConfirmRestart": "Czy na pewno chcesz uruchomić Jellyfin ponownie?",
"MessageConfirmRevokeApiKey": "Czy na pewno chcesz unieważnić kluczAPI? Połączenia aplikacji z serwerem zostaną natychmiastowo zakończone.",
"MessageConfirmShutdown": "Czy na pewno chcesz zamknąć serwer?",
"MessageContactAdminToResetPassword": "W celu wyczyszczenia hasła. skontaktuj się z administratorem systemu.",
"MessageCreateAccountAt": "Utwórz konto na {0}",
"MessageDeleteTaskTrigger": "Czy na pewno chcesz usunąć ten wyzwalacz zadania?",
"MessageDirectoryPickerBSDInstruction": "W wypadku BSD, należy skonfigurować oprogramowanie FreeNAS aby umożliwić serwerowi Jellyfin dostęp do danych.",
"MessageDirectoryPickerBSDInstruction": "W wypadku BSD, należy skonfigurować oprogramowanie FreeNAS aby umożliwić Jellyfin dostęp do danych.",
"MessageDirectoryPickerLinuxInstruction": "Dla Linuxa dystrybucji Arch Linux, CentOS, Debian, Fedora, openSUSE albo Ubuntu, musisz uzyskać dla użytkownika Jellyfin uprawnienia przynajmniej do odczytu pamięci masowej.",
"MessageDownloadQueued": "Dodano do kolejki pobierania.",
"MessageEnablingOptionLongerScans": "Aktywowanie tej opcji może spowodować znaczne wydłużenie czasu skanowania biblioteki.",
@ -888,7 +888,7 @@
"MessagePleaseEnsureInternetMetadata": "Upewnij się, że pobieranie metadanych z internetu jest aktywne.",
"MessagePleaseWait": "Proszę czekać. To może potrwać chwilę.",
"MessagePluginConfigurationRequiresLocalAccess": "Aby skonfigurować ten plugin zaloguj się bezpośrednio do lokalnego serwera.",
"MessagePluginInstallDisclaimer": "Wtyczki tworzone przez członków społeczności Jellyfin są doskonałym sposobem, aby zwiększyć swoje przeżycia z dodatkowymi funkcjami i zaletami Jellyfin. Przed instalacją należy zdawać sobie sprawę jakie efekty mogą mieć na twój serwer Jellyfin, takie jak dłuższy skan biblioteki, dodatkowe przetwarzanie w tle, a także obniżenie stabilności systemu.",
"MessagePluginInstallDisclaimer": "Wtyczki stworzone przez członków społeczności to świetny sposób na ulepszenie Twojego doświadczenia dzięki dodatkowym funkcjom i korzyściom. Przed instalacją zwróć uwagę na skutki, jakie mogą mieć na serwerze, takie jak dłuższe skanowanie bibliotek, dodatkowe przetwarzanie w tle i zmniejszona stabilność systemu.",
"MessageReenableUser": "Zobacz poniżej aby aktywować ponownie",
"MessageSettingsSaved": "Ustawienia zapisane.",
"MessageTheFollowingLocationWillBeRemovedFromLibrary": "Następujące lokalizacje mediów zostaną usunięte z twojej biblioteki:",
@ -897,7 +897,7 @@
"MessageYouHaveVersionInstalled": "Masz aktualnie zainstalowaną wersję {0}.",
"Metadata": "Metadane",
"MetadataManager": "Menedżer metadanych",
"MetadataSettingChangeHelp": "Zmiana ustawień metadanych wpłynie na nową treść, która będzie dodawana w przyszłości. W celu odświeżenia istniejącej zawartości, otwórz ekran szczegółów, a następnie naciśnij przycisk Odśwież lub wykonaj odświeżanie wsadowe, korzystając z menedżera metadanych.",
"MetadataSettingChangeHelp": "Zmiana ustawień metadanych wpłynie na nowe treści dodane w przyszłości. Aby odświeżyć istniejącą zawartość, otwórz ekran szczegółów i kliknij przycisk odświeżania lub przeprowadź zbiorcze odświeżanie za pomocą menedżera metadanych.",
"MinutesAfter": "minut po",
"MinutesBefore": "minut przed",
"Mobile": "Telefon",
@ -945,7 +945,7 @@
"OptionAllowLinkSharingHelp": "Tylko strony zawierające informacje o mediach są udostępnione. Media nigdy nie są udostępniane publicznie. Udostępnienia są ograniczone czasowo i wygasną po {0} dniach.",
"OptionAllowManageLiveTv": "Zezwalaj na zarządzanie nagrywaniem telewizji",
"OptionAllowMediaPlayback": "Zezwalaj na odtwarzanie mediów",
"OptionAllowMediaPlaybackTranscodingHelp": "Ograniczenie dostępu do transkodowania może powodować awarie odtwarzania w aplikacji Jellyfin, z powodu nieobsługiwanych formatów mediów.",
"OptionAllowMediaPlaybackTranscodingHelp": "Ograniczenie dostępu do transkodowania może spowodować błędy odtwarzania na klientach z powodu nieobsługiwanych formatów multimediów.",
"OptionAllowRemoteControlOthers": "Zezwalaj na zdalne sterowanie innymi użytkownikami",
"OptionAllowRemoteSharedDevices": "Zezwalaj na zdalne sterowanie urządzeniami współdzielonymi",
"OptionAllowRemoteSharedDevicesHelp": "Urządzenia DLNA są uważane za udostępnione, dopóki użytkownik nie zacznie ich kontrolować.",
@ -958,7 +958,7 @@
"OptionAuto": "Automatycznie",
"OptionAutomatic": "Automatycznie",
"OptionAutomaticallyGroupSeries": "Scalaj seriale znajdujące się w wielu folderach",
"OptionAutomaticallyGroupSeriesHelp": "Umożliwia automatyczne scalanie seriali, rozproszonych w wielu folderach biblioteki, w pojedyncze seriale.",
"OptionAutomaticallyGroupSeriesHelp": "Serie rozmieszczone w wielu folderach w tej bibliotece zostaną automatycznie połączone w jedną serię.",
"OptionBlockBooks": "Książki",
"OptionBlockChannelContent": "Kanały internetowe",
"OptionBlockLiveTvChannels": "Kanały telewizyjne",
@ -978,7 +978,7 @@
"OptionDatePlayed": "Data odtwarzania",
"OptionDescending": "Malejąco",
"OptionDisableUser": "Deaktywuj tego użytkownika",
"OptionDisableUserHelp": "Jeśli aktywne, serwer nie pozwoli na żadne połączenia tego użytkownika. Aktywne połączenia zostaną natychmiastowo zerwane.",
"OptionDisableUserHelp": "Serwer nie zezwoli na żadne połączenia od tego użytkownika. Istniejące połączenia zostaną nagle przerwane.",
"OptionDislikes": "Nie Lubie",
"OptionDisplayFolderView": "Wyświetlaj widok folderów z listą foldery mediów",
"OptionDisplayFolderViewHelp": "Wyświetl foldery obok innych bibliotek multimediów. Może to być przydatne, jeśli chcesz mieć prosty widok folderu.",
@ -988,7 +988,7 @@
"OptionDownloadBoxImage": "Pudełko",
"OptionDownloadDiscImage": "Dysk",
"OptionDownloadImagesInAdvance": "Pobieraj obrazy z wyprzedzeniem",
"OptionDownloadImagesInAdvanceHelp": "Domyślnie, większość obrazów jest pobierana tylko kiedy jest wymagana przez aplikacje Jellyfin. Aktywuj tę opcję, aby pobierać wszystkie obrazy z wyprzedzeniem, podczas importowania multimediów. Może powodować znacząco dłuższe skanowanie biblioteki.",
"OptionDownloadImagesInAdvanceHelp": "Domyślnie większość obrazów jest pobierana tylko na żądanie klienta. Włącz tę opcję, aby pobierać wszystkie obrazy z wyprzedzeniem podczas importowania nowych multimediów. Może to spowodować znacznie dłuższe skanowanie biblioteki.",
"OptionDownloadPrimaryImage": "Podstawowy",
"OptionDownloadThumbImage": "Miniatura",
"OptionDvd": "DVD",
@ -1019,7 +1019,7 @@
"OptionHlsSegmentedSubtitles": "Napisy dostosowane do HLS",
"OptionHomeVideos": "Zdjęcia",
"OptionIgnoreTranscodeByteRangeRequests": "Ignoruj żądanie zakresu byte transkodowania",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Jeżeli włączone, te żądania będą uznane ale będzie ignorowany nagłówek zakresu byte.",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Te żądania będą uznane ale będzie ignorowany nagłówek zakresu byte.",
"OptionImdbRating": "Ocena IMDb",
"OptionLikes": "Lubie",
"OptionMax": "Maksymalny",
@ -1032,9 +1032,9 @@
"OptionOnInterval": "Cyklicznie",
"OptionParentalRating": "Kategoria wiekowa",
"OptionPlainStorageFolders": "Wyświetlaj wszystkie foldery jako zwyczajne foldery",
"OptionPlainStorageFoldersHelp": "Jeżeli aktywne, wszystkie foldery są reprezentowane w DIDL jako \"object.container.storageFolder\" zamiast bardziej dokładnych typów takich jak \"object.container.person.musicArtist\".",
"OptionPlainStorageFoldersHelp": "Wszystkie foldery są reprezentowane w DIDL jako „object.container.storageFolder” zamiast bardziej konkretnego typu, takiego jak „object.container.person.musicArtist”.",
"OptionPlainVideoItems": "Wyświetlaj wszystkie wideo jako zwyczajne pozycje",
"OptionPlainVideoItemsHelp": "Jeżeli aktywne, wszystkie wideo są reprezentowane w DIDL jako \"object.item.videoitem\" zamiast bardziej dokładnych typów takich jak \"object.item.videoitem.movie\".",
"OptionPlainVideoItemsHelp": "Wszystkie wideo są reprezentowane w DIDL jako \"object.item.videoitem\" zamiast bardziej dokładnych typów takich jak \"object.item.videoitem.movie\".",
"OptionPlayCount": "Liczba odtworzeń",
"OptionPlayed": "Obejrzany",
"OptionPremiereDate": "Data premiery",
@ -1055,7 +1055,7 @@
"OptionRuntime": "Długość filmu",
"OptionSaturday": "Sobota",
"OptionSaveMetadataAsHidden": "Zapisuj metadane i obrazy jako pliki ukryte",
"OptionSaveMetadataAsHiddenHelp": "Zmiana ta będzie miała zastosowanie do nowych metadanych zapisanych w przyszłości. Istniejące pliki metadanych zostaną zaktualizowane przy następnym zapisie przez serwer Jellyfin.",
"OptionSaveMetadataAsHiddenHelp": "Zmiana ta będzie miała zastosowanie do nowych metadanych zapisanych w przyszłości. Istniejące pliki metadanych zostaną zaktualizowane przy następnym zapisie przez serwer.",
"OptionSpecialEpisode": "Specjalne",
"OptionSubstring": "Podwyrażenie",
"OptionSunday": "Niedziela",
@ -1099,9 +1099,9 @@
"PleaseAddAtLeastOneFolder": "Dodaj co najmniej jeden folder do tej biblioteki, klikając przycisk Dodaj.",
"PleaseConfirmPluginInstallation": "Kliknij OK aby potwierdzić, iż zapoznałeś się z powyższym i chcesz zainstalować plugin.",
"PleaseEnterNameOrId": "Proszę wprowadź nazwę lub zewnętrzne ID.",
"PleaseRestartServerName": "Uruchom ponownie serwer Jellyfin - {0}.",
"PleaseRestartServerName": "Uruchom ponownie Jellyfin na {0}.",
"PleaseSelectTwoItems": "Proszę wybierz przynajmniej dwie pozycje.",
"MessagePluginInstalled": "Wtyczka została poprawnie zainstalowana. Serwer Jellyfin będzie wymagała ponownego uruchomienia w celu zastosowania zmian.",
"MessagePluginInstalled": "Wtyczka została poprawnie zainstalowana. Serwer będzie wymagała ponownego uruchomienia w celu zastosowania zmian.",
"PreferEmbeddedTitlesOverFileNames": "Preferuj wbudowane tytuły zamiast nazw plików",
"PreferEmbeddedTitlesOverFileNamesHelp": "Określa domyślnie wyświetlany tytuł, gdy brak dostępnych metadanych lokalnych i od dostawców internetowych.",
"Premiere": "Premiera",
@ -1126,7 +1126,7 @@
"RecordingScheduled": "Zaplanowano nagranie.",
"Recordings": "Nagrania",
"Refresh": "Odśwież",
"RefreshDialogHelp": "Metadane są odświeżane w oparciu o ustawienia i dostawców internetowych, aktywowanych w kokpicie serwera Jellyfin.",
"RefreshDialogHelp": "Metadane są odświeżane na podstawie ustawień i usług internetowych włączonych na pulpicie nawigacyjnym.",
"RefreshMetadata": "Odśwież metadane",
"RefreshQueued": "Odświeżanie dodane do kolejki zadań.",
"ReleaseDate": "Data wydania",
@ -1164,10 +1164,10 @@
"SeriesRecordingScheduled": "Zaplanowano nagranie seryjne.",
"SeriesSettings": "Ustawienia nagrywania serialu",
"SeriesYearToPresent": "{0} - Teraz",
"ServerNameIsRestarting": "Jellyfin Server - {0} jest uruchamiany ponownie.",
"ServerNameIsShuttingDown": "Serwer Jellyfin - {0} jest zamykany.",
"ServerRestartNeededAfterPluginInstall": "Serwer Jellyfin będzie wymagał ponownego uruchomienia po zainstalowaniu wtyczki.",
"ServerUpdateNeeded": "Ten serwer Jellyfin wymaga aktualizacji. Aby pobrać najnowszą wersję, odwiedź stronę {0}",
"ServerNameIsRestarting": "Server za {0} zostanie uruchamiony ponownie.",
"ServerNameIsShuttingDown": "Serwer za {0} zostanie wyłączony.",
"ServerRestartNeededAfterPluginInstall": "Jellyfin będzie wymagał ponownego uruchomienia po zainstalowaniu wtyczki.",
"ServerUpdateNeeded": "Ten serwer wymaga aktualizacji. Aby pobrać najnowszą wersję, odwiedź stronę {0}",
"Settings": "Ustawienia",
"SettingsSaved": "Ustawienia zapisane.",
"SettingsWarning": "Zmiana tych wartości może spowodować niestabilność lub awarię połączenia. Jeśli wystąpią jakiekolwiek problemy, zalecamy powrót do ustawień ich na domyślne.",
@ -1330,7 +1330,7 @@
"LabelDynamicExternalId": "{0} Id:",
"LabelFormat": "Format:",
"LabelServerName": "Nazwa serwera:",
"AuthProviderHelp": "Wybierz dostawcę uwierzytelniania który ma być użyty do uwierzytelnienia hasła tego użytkownika.",
"AuthProviderHelp": "Wybierz dostawcę uwierzytelniania, który ma być użyty do uwierzytelnienia hasła tego użytkownika.",
"LabelPasswordResetProvider": "Dostawca resetowania hasła:",
"LabelTranscodePath": "Ścieżka Transkodowania:",
"LabelTranscodes": "Transkodery:",
@ -1372,7 +1372,7 @@
"OptionPosterCard": "Karta plakatu",
"OptionThumb": "Podgląd",
"OptionThumbCard": "Karta miniatury",
"PasswordResetProviderHelp": "Wybierz dostawcę resetowania hasła, który będzie używany, gdy ten użytkownik zażąda zresetowania hasła",
"PasswordResetProviderHelp": "Wybierz dostawcę resetowania hasła, który będzie używany, gdy ten użytkownik zażąda resetowania hasła.",
"PlaybackData": "Dane Odtwarzania",
"SubtitleOffset": "Przesunięcie Napisów",
"TabNetworking": "Łączność Sieciowa",
@ -1450,7 +1450,7 @@
"LastSeen": "Ostatnio widziany {0}",
"PersonRole": "jako {0}",
"ListPaging": "{0}-{1} z {2}",
"WriteAccessRequired": "Serwer Jellyfin wymaga praw zapisu do tego katalogu. Upewnij się, że prawa zapisu zostały przyznane i spróbuj ponownie.",
"WriteAccessRequired": "Jellyfin wymaga praw zapisu do tego katalogu. Upewnij się, że prawa zapisu zostały przyznane i spróbuj ponownie.",
"PathNotFound": "Ścieżka nie została znaleziona. Upewnij się, że ścieżka jest poprawna i spróbuj ponownie.",
"YadifBob": "YADIF Bob",
"Yadif": "YADIF",
@ -1509,7 +1509,7 @@
"LabelRequireHttps": "Wymagaj HTTPS",
"LabelStable": "Stabilny",
"LabelChromecastVersion": "Wersja Chromecast",
"LabelEnableHttpsHelp": "Pozwala serwerowi na nasłuchiwanie na skonfigurowanym porcie HTTPS. Prawidłowy certyfikat musi być skonfigurowany by ta opcja zadziałała.",
"LabelEnableHttpsHelp": "Nasłuchuj na skonfigurowanym porcie HTTPS. Aby to zadziałało, należy również przedstawić ważny certyfikat.",
"LabelEnableHttps": "Włącz HTTPS",
"HeaderSyncPlayEnabled": "SyncPlay włączony",
"HeaderSyncPlaySelectGroup": "Dołącz do grupy",
@ -1525,5 +1525,10 @@
"BoxSet": "Kolekcja",
"PreviousTrack": "Poprzedni",
"NextTrack": "Następny",
"LabelUnstable": "Niestabilny"
"LabelUnstable": "Niestabilny",
"Preview": "Zapowiedź",
"SubtitleVerticalPositionHelp": "Numer wiersza, w którym pojawia się tekst. Liczby dodatnie wskazują z góry na dół. Liczby ujemne wskazują od dołu do góry.",
"LabelSubtitleVerticalPosition": "Pozycja pionowa:",
"MessageGetInstalledPluginsError": "Wystąpił błąd podczas pobierania listy aktualnie zainstalowanych wtyczek.",
"MessagePluginInstallError": "Wystąpił błąd podczas instalacji wtyczki."
}

View file

@ -1,13 +1,13 @@
{
"BirthDateValue": "Народився: {0}",
"BirthDateValue": "Дата народження: {0}",
"BirthPlaceValue": "Місце народження: {0}",
"ButtonAddUser": "Додати користувача",
"ButtonCancel": "Скасувати",
"ButtonFilter": "Фільтр",
"ButtonNew": "Новий",
"ButtonNew": "Нове",
"ButtonRename": "Перейменувати",
"ButtonResetPassword": "Скинути пароль",
"ButtonSignOut": "Sign out",
"ButtonSignOut": "Вийти",
"DeathDateValue": "Помер: {0}",
"Dislike": "Не подобається",
"Favorite": "Улюблене",
@ -98,10 +98,10 @@
"All": "Всі",
"AllChannels": "Всі канали",
"AllEpisodes": "Всі епізоди",
"AllowRemoteAccess": "Дозволити віддалене підключення до цього сервера Jellyfin.",
"AllowRemoteAccess": "Дозволити віддалене підключення до цього сервера.",
"AlwaysPlaySubtitles": "Завжди вмикати субтитри",
"AnyLanguage": "Будь-яка мова",
"Anytime": "Завжди",
"Anytime": "У будь-який час",
"Add": "Додати",
"AddedOnValue": "Додано {0}",
"Albums": "Альбоми",
@ -123,10 +123,10 @@
"HeaderFavoriteArtists": "Улюблені виконавці",
"HeaderFavoriteShows": "Улюблені шоу",
"HeaderContinueWatching": "Продовжити перегляд",
"AllowedRemoteAddressesHelp": "Список з комами, в якості розділювачів, визначає IP-адреси та IP/мережеві маски для мереж, яким дозволено підключатись віддалено. Якщо залишити строку пустою, то усі віддалені підключення будуть дозволені.",
"AllowedRemoteAddressesHelp": "Список розділених комами IP-адрес або IP/мережевих масок, яким буде дозволено віддалено підключатися. Якщо залишити порожнім, усі віддалені адреси будуть дозволені.",
"AllowRemoteAccessHelp": "Якщо не відмічено прапорцем, усі віддалені підключення будуть заблоковані.",
"AllowFfmpegThrottling": "Примусово обмежити перекодування",
"AllowMediaConversionHelp": "Надайте або забороніть доступ для можливості перетворення медіа.",
"AllowMediaConversionHelp": "Надати або заборонити доступ до функції конвертації медіа.",
"AllowMediaConversion": "Дозволити перетворення медіа",
"Alerts": "Термінові сповіщення",
"AlbumArtist": "Виконавець альбому",
@ -139,20 +139,20 @@
"DropShadow": "Тінь",
"Blacklist": "Чорний список",
"BirthLocation": "Місце народження",
"Banner": "Обкладинка",
"Banner": "Банер",
"Auto": "Автоматично",
"AuthProviderHelp": "Оберіть сервіс аутентифікації, який буде використаний з поточним паролем користувача.",
"AuthProviderHelp": "Оберіть сервіс аутентифікації, який буде використаний для автентифікації пароля даного користувача.",
"Audio": "Аудіо",
"AttributeNew": "Новий",
"AspectRatio": "Відношення сторін",
"AskAdminToCreateLibrary": "Попросіть адміністратора створити бібліотеку.",
"AspectRatio": "Співвідношення сторін",
"AskAdminToCreateLibrary": "Попросіть адміністратора створити медіатеку.",
"Ascending": "У порядку зростання",
"AsManyAsPossible": "Настільки багато наскільки можливо",
"AsManyAsPossible": "Якнайбільше",
"Artist": "Виконавець",
"Art": "Мистецтво",
"Art": "Обкладинка",
"AllowOnTheFlySubtitleExtractionHelp": "Вбудовані субтитри можуть бути експортовані з відео і надіслані, по черзі, клієнтам у вигляді тексту. Це допоможе уникнути перекодування відео. На деяких системах, перекодування може зайняти тривалий час і зупинити відтворення відео, для того щоб забезпечити експортування. Вимкнення цієї функції дозволить вбудованим субтитрам бути інтегрованим у відео, під час перекодування, якщо вбудовані субтитри не підтримуються на стороні клієнта.",
"AllowOnTheFlySubtitleExtraction": "Дозволити експортування субтитрів «на льоту»",
"AllowHWTranscodingHelp": "Дозволити клієнту перекодування на «на льоту». Це дозволить відмикати перекодування, якщо вона вимагається сервером.",
"AllowHWTranscodingHelp": "Тюнеру дозволяється перекодувати потоки на льоту. Це може допомогти зменшити перекодування, необхідне серверу.",
"AllComplexFormats": "Усі складні формати (ASS, SSA, VOBSUB, PGS, SUB, IDX, …)",
"ButtonSyncPlay": "SyncPlay",
"ValueSpecialEpisodeName": "Спецепізод - {0}",
@ -162,5 +162,110 @@
"Playlists": "Плейлисти",
"Photos": "Фотографії",
"Aired": "Ефірний",
"AirDate": "Дата ефіру"
"AirDate": "Дата ефіру",
"CustomDlnaProfilesHelp": "Створіть спеціальний профіль, для нового пристрою або змініть системний профіль.",
"CriticRating": "Рейтинг критиків",
"CopyStreamURLSuccess": "URL-адреса успішно скопійована.",
"CopyStreamURL": "Скопіювати URL-адресу потоку",
"Continuing": "Продовження",
"ContinueWatching": "Продовжити перегляд",
"Connect": "Підключитись",
"ConfirmEndPlayerSession": "Ви хочете вимкнути Jellyfin на {0}?",
"ConfirmDeletion": "Підтвердити видалення",
"ConfirmDeleteItems": "Видалення цих елементів видалить їх як з файлової системи, так і з медіатеки. Ви впевнені, що хочете продовжити?",
"ConfirmDeleteItem": "Видалення цього елемента видалить його як з файлової системи, так і з медіатеки. Ви впевнені, що хочете продовжити?",
"ConfirmDeleteImage": "Видалити зображення?",
"ConfigureDateAdded": "Налаштуйте, як визначається дата додавання на інформаційній панелі в налаштуваннях медіатеки",
"Composer": "Композитор",
"CommunityRating": "Рейтинг спільноти",
"ColorTransfer": "Передача кольору",
"ColorSpace": "Кольоровий простір",
"ColorPrimaries": "Основні кольори",
"ClientSettings": "Налаштування клієнта",
"CinemaModeConfigurationHelp": "Режим кінотеатру забезпечує враження від глядацького залу прямо у вашій вітальні з можливістю відтворювати трейлери та власні відео перед фільмом.",
"ChannelNumber": "Номер каналу",
"ChannelNameOnly": "Тільки канал {0}",
"ChannelAccessHelp": "Виберіть канали, якими поділитись з даним користувачем. Адміністратори зможуть редагувати всі канали за допомогою менеджера метаданих.",
"ChangingMetadataImageSettingsNewContent": "Зміни в налаштуваннях завантаження метаданих або зображень стосуються лише нового вмісту, доданого до вашої бібліотеки. Щоб застосувати зміни до існуючих творів, потрібно оновити їх метадані вручну.",
"Categories": "Категорії",
"CancelSeries": "Скасувати серіал",
"CancelRecording": "Скасувати запис",
"ButtonWebsite": "Веб-сайт",
"ButtonUp": "Вгору",
"ButtonUninstall": "Видалити",
"ButtonTrailer": "Трейлер",
"ButtonTogglePlaylist": "Плейлист",
"ButtonSubtitles": "Субтитри",
"ButtonSubmit": "Підтвердити",
"ButtonSplit": "Розділити",
"ButtonStop": "Зупинити",
"ButtonStart": "Почати",
"ButtonSort": "Сортувати",
"ButtonSignIn": "Вхід",
"ButtonShutdown": "Завершити роботу",
"ButtonShuffle": "Перемішати",
"ButtonSettings": "Налаштування",
"ButtonSend": "Надіслати",
"ButtonSelectView": "Вибрати вигляд",
"ButtonSelectServer": "Вибрати сервер",
"ButtonSelectDirectory": "Вибрати каталог",
"ButtonScanAllLibraries": "Сканувати всі медіатеки",
"ButtonRevoke": "Відмінити",
"ButtonResume": "Відновити",
"ButtonRestart": "Перезапустити",
"ButtonResetEasyPassword": "Скинути простий пін-код",
"ButtonRemove": "Видалити",
"ButtonRefreshGuideData": "Оновити дані телегіда",
"ButtonRefresh": "Оновити",
"ButtonQuickStartGuide": "Посібник по швидкому запуску",
"ButtonProfile": "Профіль",
"ButtonPreviousTrack": "Попередня доріжка",
"ButtonPlay": "Відтворити",
"ButtonPause": "Пауза",
"ButtonParentalControl": "Батьківський контроль",
"ButtonOpen": "Відкрити",
"ButtonOk": "Ок",
"ButtonOff": "Вимкнути",
"ButtonNextTrack": "Наступна доріжка",
"ButtonNetwork": "Мережа",
"ButtonMore": "Більше",
"ButtonManualLogin": "Ввести ім’я користувача вручну",
"ButtonLibraryAccess": "Доступ до медіатеки",
"ButtonInfo": "Інформація",
"ButtonHome": "Головна",
"ButtonGuide": "Телегід",
"ButtonGotIt": "Зрозуміло",
"ButtonFullscreen": "Повноекранний режим",
"ButtonForgotPassword": "Забув(ла) пароль",
"ButtonEditOtherUserPreferences": "Редагувати профіль, зображення та особисті налаштування даного користувача.",
"ButtonEditImages": "Редагувати зображення",
"ButtonEdit": "Редагувати",
"ButtonDownload": "Завантажити",
"ButtonDown": "Вниз",
"ButtonDeleteImage": "Видалити зображення",
"ButtonDelete": "Видалити",
"ButtonConnect": "Підключитись",
"ButtonChangeServer": "Змінити сервер",
"ButtonBack": "Назад",
"ButtonAudioTracks": "Аудіозаписи",
"ButtonArrowUp": "Вниз",
"ButtonArrowRight": "Вправо",
"ButtonArrowLeft": "Вліво",
"ButtonArrowDown": "Вниз",
"ButtonAddServer": "Додати сервер",
"ButtonAddScheduledTaskTrigger": "Додати тригер",
"ButtonAddMediaLibrary": "Додати медіатеку",
"ButtonAddImage": "Додати зображення",
"BurnSubtitlesHelp": "Визначає, чи повинен сервер додавати субтитри під час перекодування відео. Уникнення цього значно покращить продуктивність. Виберіть Автоматично для записування форматів на основі зображень (VOBSUB, PGS, SUB, IDX, ...) та певні субтитри ASS або SSA.",
"MessageBrowsePluginCatalog": "Перегляньте каталог плагінів, щоб ознайомитися з доступними плагінами.",
"Browse": "Огляд",
"BoxRear": "Коробка (задня частина)",
"BoxSet": "Колекція",
"Box": "Коробка",
"BookLibraryHelp": "Підтримуються аудіо та текстові книги. Перегляньте {0} посібник з іменування книг {1}.",
"Backdrops": "Фони",
"Backdrop": "Фон",
"AroundTime": "Приблизно",
"AlwaysPlaySubtitlesHelp": "Субтитри, що відповідають мовним параметрам, завантажуватимуться незалежно від мови звуку.",
"AllowFfmpegThrottlingHelp": "Коли перекодування або перепакування досить далеко випереджає поточну позицію відтворення, процес призупиняється, щоб зекономити ресурси. Це найкорисніше при перегляді, коли рідко міняється позиція відтворення. Вимкніть це, якщо виникнуть проблеми з відтворенням."
}

View file

@ -22,7 +22,7 @@
"AllowMediaConversionHelp": "授予或拒绝访问媒体转换功能。",
"AllowOnTheFlySubtitleExtraction": "允许实时提取字幕",
"AllowOnTheFlySubtitleExtractionHelp": "为避免视频转码,可以从视频中提取内置的字幕,并以纯文本的形式发送给客户端。在某些系统中这个提取的进程可能会花费较长时间并导致视频播放出现卡顿。如果禁用这个选项,当内置字幕不能被客户端设备原生支持时,字幕将通过视频转码被烧录进视频中。",
"AllowRemoteAccess": "允许与此 Jellyfin 服务器进行远程连接。",
"AllowRemoteAccess": "允许与此服务器进行远程连接。",
"AllowRemoteAccessHelp": "如果取消勾选,所有的远程连接将会被阻止。",
"AllowedRemoteAddressesHelp": "允许远程连接的 IP 地址或 IP/子网掩码 的列表,以逗号分隔。如果留空,则允许所有远程地址。",
"AlwaysPlaySubtitles": "总是显示",
@ -198,7 +198,7 @@
"EndsAtValue": "结束于 {0}",
"Episodes": "剧集",
"ErrorAddingListingsToSchedulesDirect": "我们将阵容添加到您的Schedules Direct帐户时出错。 Schedules Direct只允许有限的账号排序。 您可能需要在继续前直接登入Schedules Direct 网站并删除其他列表。",
"ErrorAddingMediaPathToVirtualFolder": "添加媒体路径时发生错误。请确认路径是有效的,并且你的 Jellyfin 服务器进程有对该位置的访问权。",
"ErrorAddingMediaPathToVirtualFolder": "添加媒体路径时发生错误。请确认路径是有效的,并且Jellyfin有对该位置的访问权。",
"ErrorAddingTunerDevice": "添加协调器设备时发生错误。请确认它是可访问的然后再试一次。",
"ErrorAddingXmlTvFile": "访问 XmlTV 文件时发生错误。请确认该文件是否存在然后再试一次。",
"ErrorGettingTvLineups": "下载 TV 节目表 时发生错误。请确认你的信息是否正确,然后再试。",
@ -433,7 +433,7 @@
"Hide": "隐藏",
"HideWatchedContentFromLatestMedia": "从最新媒体中隐藏已观看的内容",
"Home": "首页",
"HttpsRequiresCert": "要启用安全连接, 您需要提供一个受信任的 SSL 证书, 例如 Let's Encrypt 。请提供证书或禁用安全连接。",
"HttpsRequiresCert": "要启用安全连接, 您需要提供一个受信任的 SSL 证书, 如 \"Let's Encrypt\"。请提供证书或禁用安全连接。",
"Identify": "识别",
"Images": "图片",
"ImportFavoriteChannelsHelp": "只有在协调器设备中被标记为我的最爱的频道才会被导入。",
@ -466,11 +466,11 @@
"LabelAppName": "APP名称",
"LabelAppNameExample": "例如Sickbeard, Sonarr",
"LabelArtists": "艺术家:",
"LabelArtistsHelp": "将多个艺术家用分号分隔",
"LabelArtistsHelp": "将多个艺术家用分号分隔",
"LabelAudioLanguagePreference": "首选音频语言:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "自动从互联网获取元数据并刷新:",
"LabelBindToLocalNetworkAddress": "监听的本地网络地址:",
"LabelBindToLocalNetworkAddressHelp": "覆盖 HTTP 服务器绑定的本地 IP 地址。如果留空,服务器将会监听所有可用的地址。改变这个值需要重启 Jellyfin 服务器。",
"LabelBindToLocalNetworkAddressHelp": "覆盖 HTTP 服务器绑定的本地 IP 地址。如果留空,服务器将会监听所有可用的地址。重启后生效。",
"LabelBirthDate": "出生日期:",
"LabelBirthYear": "出生年份:",
"LabelBlastMessageInterval": "活动信号的时间间隔",
@ -528,11 +528,11 @@
"LabelEmbedAlbumArtDidl": "在DIDL中嵌入专辑封面",
"LabelEmbedAlbumArtDidlHelp": "有些设备首选这种方式获取专辑封面。启用该选项可能导致其他设备播放失败。",
"LabelEnableAutomaticPortMap": "开启自动端口映射",
"LabelEnableAutomaticPortMapHelp": "通过UPnP将路由器端口自动转发到服务器端口。这可能不适用于某些型号的路由器和网络配置。需要服务器重新启动后才会应用更改。",
"LabelEnableAutomaticPortMapHelp": "勾选以通过 UPnP 自动映射公共端口到本地端口。这个选项在某些不支持的路由器和网络配置上可能不起作用。服务端重启之前设置不会生效。",
"LabelEnableBlastAliveMessages": "爆发活动信号",
"LabelEnableBlastAliveMessagesHelp": "如果该服务器不能被网络中的其他UPnP设备检测到请启用此选项。",
"LabelEnableDlnaClientDiscoveryInterval": "客户端搜寻时间间隔",
"LabelEnableDlnaClientDiscoveryIntervalHelp": "确定由 Jellyfin 执行的 SSDP 搜索之间的持续时间 (以秒为单位)。",
"LabelEnableDlnaClientDiscoveryIntervalHelp": "确定SSDP 搜索之间的持续时间 (以秒为单位)。",
"LabelEnableDlnaDebugLogging": "启用 DLNA 调试日志",
"LabelEnableDlnaDebugLoggingHelp": "创建一个很大的日志文件,仅应在排除故障时使用。",
"LabelEnableDlnaPlayTo": "启用 DLNA 播放",
@ -541,7 +541,7 @@
"LabelEnableDlnaServerHelp": "允许你网络上的 UPnP 设备浏览并播放内容。",
"LabelEnableHardwareDecodingFor": "启用硬件解码:",
"LabelEnableRealtimeMonitor": "启用实时监控",
"LabelEnableRealtimeMonitorHelp": "文件更改将立即在支持的文件系统上处理。",
"LabelEnableRealtimeMonitorHelp": "在支持的文件系统中,文件更改将即时处理。",
"LabelEnableSingleImageInDidlLimit": "仅限单一的嵌入式图像",
"LabelEnableSingleImageInDidlLimitHelp": "如果多个图像嵌入在DIDL某些设备将无法正确渲染。",
"LabelEndDate": "结束日期:",
@ -650,7 +650,7 @@
"LabelNumberOfGuideDays": "下载几天的节目指南:",
"LabelNumberOfGuideDaysHelp": "下载更多天的节目指南可以帮你进一步查看节目列表并做出提前安排,但下载过程也将耗时更久。它将基于频道数量自动选择。",
"LabelOptionalNetworkPath": "共享的网络文件夹:",
"LabelOptionalNetworkPathHelp": "如果这个文件夹在你的网络上是共享的,提供这个网络共享地址能够允许其他设备上的 Jellyfin 应用程序直接访问媒体文件,例如 {0} 或者 {1}。",
"LabelOptionalNetworkPathHelp": "如果这个文件夹在你的网络上是共享的,提供这个网络共享地址能够允许其他设备上的客户端直接访问媒体文件,例如 {0} 或者 {1}。",
"LabelOriginalAspectRatio": "原始长宽比:",
"LabelOriginalTitle": "原标题:",
"LabelOverview": "内容概述:",
@ -823,13 +823,13 @@
"MessageConfirmProfileDeletion": "你确定希望删除此配置文件?",
"MessageConfirmRecordingCancellation": "取消录制?",
"MessageConfirmRemoveMediaLocation": "你确定要移除此位置?",
"MessageConfirmRestart": "你确定要重启 Jellyfin 服务端",
"MessageConfirmRevokeApiKey": "你确定你希望撤销这个 API 秘钥吗?这个应用程序与 Jellyfin 服务器的连接将会被立刻中断。",
"MessageConfirmRestart": "你确定要重启 Jellyfin",
"MessageConfirmRevokeApiKey": "你确定你希望撤销这个 API 秘钥吗?这个应用程序与服务器的连接将会被立刻中断。",
"MessageConfirmShutdown": "你确定要关闭服务端?",
"MessageContactAdminToResetPassword": "请联系你的管理员以重置你的密码。",
"MessageCreateAccountAt": "在 {0} 创建帐户",
"MessageDeleteTaskTrigger": "你确定删除这个任务触发条件?",
"MessageDirectoryPickerBSDInstruction": "对于 BSD 系统,你需要设置包含你的 FreeNAS Jail 虚拟机的存储以允许 Jellyfin 访问它。",
"MessageDirectoryPickerBSDInstruction": "对于 BSD 系统,您需要配置包含您 FreeNAS Jail 虚拟机的存储以允许 Jellyfin 访问您的媒体文件。",
"MessageDirectoryPickerLinuxInstruction": "对于Arch Linux、 CentOS、Debian、Fedora、OpenSuse、Ubuntu上的Linux系统你必须授权系统服务用户访问你存储位置。",
"MessageDownloadQueued": "下载已列队。",
"MessageEnablingOptionLongerScans": "启用此选项可能会大大延长媒体库扫描时间。",
@ -850,7 +850,7 @@
"MessagePleaseEnsureInternetMetadata": "请确认已启用从网络上下载媒体资料的选项。",
"MessagePleaseWait": "请稍等。这将花费大约1分钟的时间。",
"MessagePluginConfigurationRequiresLocalAccess": "请直接登录你的本地服务器以设置这个插件。",
"MessagePluginInstallDisclaimer": "安装 Jellyfin 社区成员构建的插件来获取额外的功能是增强你的 Jellyfin 体验的一种很好的方式。但在安装之前请意识到他们可能会对你的 Jellyfin 服务器造成影响,如更长的媒体库扫描时间、额外的背景数据加工、降低系统稳定性等。",
"MessagePluginInstallDisclaimer": "安装社区成员构建的插件来获取额外的功能是增强体验的一种很好的方式。但在安装之前请意识到他们可能会对你的服务器造成影响,如更长的媒体库扫描时间、额外的后台处理、以及系统稳定性的降低等。",
"MessageReenableUser": "请参阅以下以重新启用",
"MessageSettingsSaved": "设置已保存。",
"MessageTheFollowingLocationWillBeRemovedFromLibrary": "以下媒体路径将从你的媒体库移除:",
@ -1022,7 +1022,7 @@
"OptionRuntime": "播放时长",
"OptionSaturday": "星期六",
"OptionSaveMetadataAsHidden": "保存媒体资料和图像为隐藏文件",
"OptionSaveMetadataAsHiddenHelp": "更改此项将应用于以后保存的元数据。现有元数据文件将在下一次 Jellyfin 服务器保存它们时被更新。",
"OptionSaveMetadataAsHiddenHelp": "更改此项将应用于以后保存的元数据。现有元数据文件将在下一次服务器保存它们时被更新。",
"OptionSpecialEpisode": "特集",
"OptionSubstring": "子串",
"OptionSunday": "星期天",
@ -1063,9 +1063,9 @@
"PleaseAddAtLeastOneFolder": "请点击添加按钮,添加至少一个文件夹到这个媒体库。",
"PleaseConfirmPluginInstallation": "请点击“OK”以确认你已经阅读了上述内容并希望继续插件安装进程。",
"PleaseEnterNameOrId": "请输入一个名称或一个外部ID。",
"PleaseRestartServerName": "请重启 Jellyfin 服务器 - {0}。",
"PleaseRestartServerName": "请重启 Jellyfin - {0}。",
"PleaseSelectTwoItems": "请至少选择2个项目。",
"MessagePluginInstalled": "这个插件已经被成功安装。Jellyfin 服务器需要重启以使该插件生效。",
"MessagePluginInstalled": "此插件已成功安装。服务器需要重启以使该插件生效。",
"PreferEmbeddedTitlesOverFileNames": "优先使用内置的标题而不是文件名",
"PreferEmbeddedTitlesOverFileNamesHelp": "这将在没有 internet 元数据或本地元数据可用时确定默认显示标题。",
"Premiere": "首映",
@ -1120,10 +1120,10 @@
"SeriesRecordingScheduled": "电视剧录制计划。",
"SeriesSettings": "系列设定",
"SeriesYearToPresent": "{0} - 现在",
"ServerNameIsRestarting": "Jellyfin Server - {0} 重启中。",
"ServerNameIsShuttingDown": "Jellyfin 服务器 - {0} 正在关闭。",
"ServerRestartNeededAfterPluginInstall": "安装插件后Jellyfin 服务器需要重启以使插件生效。",
"ServerUpdateNeeded": "Jellyfin 服务器需要更新,请访问 {0} 以下载最新的版本",
"ServerNameIsRestarting": "服务器- {0} 重启中。",
"ServerNameIsShuttingDown": "服务器 - {0} 正在关闭。",
"ServerRestartNeededAfterPluginInstall": "安装插件后Jellyfin需要重启。",
"ServerUpdateNeeded": "服务器需要更新,请访问 {0} 以下载最新的版本",
"Settings": "设置",
"SettingsSaved": "设置已保存。",
"SettingsWarning": "更改这些值可能会导致不稳定或连接故障。如果您遇到任何问题, 我们建议将它们重新更改为默认值。",
@ -1273,7 +1273,7 @@
"ColorSpace": "色彩空间",
"Directors": "导演",
"ColorTransfer": "色彩转换",
"ConfirmDeleteItem": "这将同时在磁盘和媒体库中删除这个项目。确认删除",
"ConfirmDeleteItem": "从媒体库中删除此项时,也会同时从文件系统中删除。确定要删除吗",
"ConfirmDeleteItems": "从媒体库中删除这些项目时,也会同时从文件系统中删除。确定要删除吗?",
"ConfirmEndPlayerSession": "确认要关闭位于{0}的Jellyfin吗",
"ValueSeconds": "{0}秒",
@ -1293,11 +1293,11 @@
"LabelTranscodePath": "转码路径:",
"LabelTranscodes": "转码:",
"AuthProviderHelp": "选择用于验证此用户密码的身份验证提供者。",
"ColorPrimaries": "色",
"ConfigureDateAdded": "在Jellyfin Server仪表板媒体库的设置里确认如何添加日期",
"ColorPrimaries": "色",
"ConfigureDateAdded": "配置如何确定Jellyfin Server仪表板中媒体库设置下的添加日期",
"DisplayModeHelp": "选择您想要的界面布局风格。",
"EnableColorCodedBackgrounds": "彩色背景",
"ErrorDeletingItem": "从 Jellyfin Server 删除项目时出错。请确认 Jellyfin Server 是否拥有对媒体目录的写权限,然后重试。",
"ErrorDeletingItem": "从服务器删除项目时出错。请检查Jellyfin是否拥有对媒体目录的写权限,然后重试。",
"GroupBySeries": "按系列分组",
"HeaderApp": "应用程序",
"DirectStreamHelp1": "该媒体文件的分辨率和编码H.264、AC3 等)与您的设备兼容,但文件格式(.mkv、.avi、.wmv 等)不受支持。因此,视频在串流至您的设备之前将会被即时封装为另一种格式。",
@ -1309,7 +1309,7 @@
"HeaderKeepSeries": "保持系列",
"HeaderMusicQuality": "音频质量",
"HeaderNextEpisodePlayingInValue": "下一集在 {0} 后播放",
"HeaderNextVideoPlayingInValue": "下一部影片在 {0} 后播放",
"HeaderNextVideoPlayingInValue": "下一个视频将在{0}播放",
"HeaderPlayOn": "播放在",
"HeaderSeriesStatus": "系列状态",
"HeaderStopRecording": "停止录制",
@ -1317,9 +1317,9 @@
"LabelAuthProvider": "认证提供者:",
"LabelKeepUpTo": "保持:",
"LabelPasswordResetProvider": "密码重置提供者:",
"LabelPersonRoleHelp": "例:冰淇淋车司机",
"LabelPersonRoleHelp": ":冰淇淋车司机",
"LabelSelectFolderGroups": "自动将来自下列文件夹的内容分组至电影、音乐、电视等视图中:",
"LabelSelectFolderGroupsHelp": "未选中的文件夹将显示在自身的视图中。",
"LabelSelectFolderGroupsHelp": "未勾选的文件夹将在它们自己的视图中显示。",
"LabelUserLoginAttemptsBeforeLockout": "用户被封禁前可尝试的次数:",
"DashboardVersionNumber": "版本:{0}",
"DashboardServerName": "服务器:{0}",
@ -1345,7 +1345,7 @@
"OptionDownloadLogoImage": "标志",
"OptionLoginAttemptsBeforeLockout": "确定在锁定之前可以进行多少次不正确的登录尝试。",
"OptionLoginAttemptsBeforeLockoutHelp": "如果值为0则表示将允许普通用户尝试三次、管理员尝试五次的默认值。将此设置为-1将禁用此功能。",
"PasswordResetProviderHelp": "选择一个密码重置提供者用于此用户申请重置密码",
"PasswordResetProviderHelp": "选择一个密码重置提供者用于此用户申请重置密码",
"PlaceFavoriteChannelsAtBeginning": "将最喜爱的频道置顶",
"PlayNext": "播放下一个",
"PlayNextEpisodeAutomatically": "自动播放下一集",
@ -1441,7 +1441,7 @@
"EveryXHours": "每 {0} 小时",
"EveryHour": "每小时",
"EveryXMinutes": "每 {0} 分钟",
"WriteAccessRequired": "Jellyfin 服务端需要此文件夹的写入权限。请确认是否拥有写入权限并重试。",
"WriteAccessRequired": "Jellyfin需要此文件夹的写入权限。请确认是否拥有写入权限并重试。",
"PathNotFound": "无法找到此路径。请确认路径有效并重试。",
"YadifBob": "YADIF Bob",
"Yadif": "YADIF",
@ -1491,7 +1491,7 @@
"EnableDetailsBanner": "详细信息页面的横幅",
"ButtonCast": "投射",
"ButtonSyncPlay": "SyncPlay",
"EnableBlurHashHelp": "仍在加载的图片将显示带有模糊的占位符",
"EnableBlurHashHelp": "仍在加载的图片将以独特的的占位符显示。",
"EnableBlurHash": "为图片启用模糊的占位符",
"SyncPlayAccessHelp": "为此用户选择对同步播放功能的访问级别。同步播放让你可以和其他设备同步播放进度。",
"ShowMore": "显示更多",

View file

@ -92,7 +92,7 @@
"HeaderUsers": "使用者",
"Help": "說明",
"ItemCount": "{0}個項目",
"LabelAudioLanguagePreference": "音語言偏好選項:",
"LabelAudioLanguagePreference": "音語言偏好選項:",
"LabelCachePath": "快取路徑:",
"LabelCollection": "收藏櫃:",
"LabelContentType": "內容類型:",
@ -100,11 +100,11 @@
"LabelCurrentPassword": "當前的密碼:",
"LabelDay": "日:",
"LabelDisplayMissingEpisodesWithinSeasons": "顯示節目季度內缺少的單元",
"LabelEnableDlnaClientDiscoveryInterval": "尋找戶端時間間隔",
"LabelEnableDlnaClientDiscoveryInterval": "尋找戶端時間間隔",
"LabelEnableDlnaDebugLogging": "記錄 DLNA 除錯資料到日誌",
"LabelEnableDlnaDebugLoggingHelp": "將會建立非常大的日誌檔案,建議在進行故障排除時啟用。",
"LabelEnableDlnaPlayTo": "播放到 DLNA 設備",
"LabelEnableRealtimeMonitor": "啟用時監控",
"LabelEnableRealtimeMonitor": "啟用時監控",
"LabelEnableRealtimeMonitorHelp": "檔案的更改將在支援的檔案系統上立即處理。",
"LabelEvent": "事件:",
"LabelEveryXMinutes": "每:",
@ -145,14 +145,14 @@
"MessageItemsAdded": "已新增項目。",
"MessageNoMovieSuggestionsAvailable": "目前並沒有推薦的電影,開始觀看並對您的電影評分後,我們就會為您推薦您可能會喜歡的內容。",
"MessageNothingHere": "這裡沒有什麼。",
"MessagePasswordResetForUsers": "下列使用者的密碼已被重新設置。該使用者現在可以使用在密碼重時所使用之 PIN 代碼進行登入。",
"MessagePleaseEnsureInternetMetadata": "請確保已啟用從互聯網下載媒體資料。",
"MessagePasswordResetForUsers": "下列使用者的密碼已被重新設置。該使用者現在可以使用在密碼重時所使用之 PIN 代碼進行登入。",
"MessagePleaseEnsureInternetMetadata": "請確保已啟用從際網路下載媒體資料。",
"Monday": "星期一",
"MoreUsersCanBeAddedLater": "也可於控制台內新增使用者。",
"MySubtitles": "我的字幕",
"NewCollection": "新合集",
"NewCollectionHelp": "收藏櫃讓您能夠建立個人化的影音及其他媒體的分類。",
"NewCollectionNameExample": "例子:星大戰合集",
"NewCollectionNameExample": "例子:星大戰合集",
"MessageNoNextUpItems": "沒有找到。開始看你的節目!",
"NoSubtitleSearchResultsFound": "無結果。",
"OptionAlbum": "專輯",
@ -182,7 +182,7 @@
"OptionDownloadLogoImage": "標誌",
"OptionDownloadMenuImage": "菜單",
"OptionDownloadPrimaryImage": "主要圖",
"OptionDownloadThumbImage": "縮圖",
"OptionDownloadThumbImage": "縮圖",
"OptionDvd": "DVD",
"OptionEnded": "完結",
"OptionFavorite": "我的最愛",
@ -192,7 +192,7 @@
"OptionHasThemeVideo": "主題影片",
"OptionHideUser": "在登入頁面隱藏此使用者",
"OptionImdbRating": "IMDB評分",
"OptionIsHD": "高",
"OptionIsHD": "高畫質",
"OptionIsSD": "標清",
"OptionLikes": "喜歡",
"OptionMissingEpisode": "缺少了的單元",
@ -237,7 +237,7 @@
"Saturday": "星期六",
"Save": "保存",
"Search": "搜尋",
"SearchForCollectionInternetMetadata": "在網路上搜媒體圖像和資料",
"SearchForCollectionInternetMetadata": "在網路上搜媒體圖像和資料",
"SearchForMissingMetadata": "搜尋遺失的中繼資料",
"SearchForSubtitles": "搜尋字幕",
"SeriesRecordingScheduled": "已排程錄製整個系列。",
@ -260,7 +260,7 @@
"TabMovies": "電影",
"TabMusic": "音樂",
"TabMyPlugins": "我的附加元件",
"TabNetworks": "網",
"TabNetworks": "網",
"TabPassword": "密碼",
"TabProfile": "設定",
"TabProfiles": "設定",
@ -332,13 +332,13 @@
"Aired": "已播於",
"AllEpisodes": "所有集數",
"AllowHWTranscodingHelp": "若啟用,將會允許調諧器同步轉檔,能夠減少伺服器轉檔需求。",
"AllowOnTheFlySubtitleExtraction": "允許同步字幕截取",
"AllowOnTheFlySubtitleExtractionHelp": "可以從影片中提取內建字幕並以純文字的形式給 Jellyfin 應用程式以避免影片轉檔。某些系統中提取的過程可能花費較長時間並導致影片播放出現停滯。若停用這個選項,當內建字幕不被播放端設備支援時,字幕將透過轉檔嵌入影片中。",
"AllowOnTheFlySubtitleExtraction": "允許即時擷取字幕",
"AllowOnTheFlySubtitleExtractionHelp": "從影片中提取內建字幕並以純文字的形式顯示以避免影片轉檔。某些系統中提取的過程可能花費較長時間並導致影片播放出現停滯。若停用這個選項,當內建字幕不被播放端設備支援時,字幕將透過轉檔嵌入影片中。",
"AllowedRemoteAddressesHelp": "可以從非本地連線的 IP 位址或 IP/子網域遮罩清單,用冒號分隔。 留白則允許所有IP。",
"BookLibraryHelp": "支援有聲書和電子書。請瀏覽 {0}書籍命名指南{1}。",
"Box": "盒子",
"BoxRear": "盒子(背面)",
"BurnSubtitlesHelp": "根據字幕格式決定伺服器在影片轉檔時是否燒錄字幕。避免燒錄字幕時消耗過多伺服器資源。選擇「自動」以燒錄基於圖片的字幕格式(如 VOBSUB、PGS 或 SUB/IDX 等)和一些複雜的 ASS/SSA 字幕。",
"BurnSubtitlesHelp": "根據字幕格式決定伺服器在影片轉檔時是否燒錄字幕。避免燒錄字幕時消耗過多伺服器資源。選擇「自動」以燒錄圖片格式的字幕(如 VOBSUB、PGS 或 SUB/IDX 等)與複雜的 ASS/SSA 字幕。",
"ButtonArrowDown": "下",
"ButtonConnect": "連結",
"ButtonDown": "下",
@ -379,7 +379,7 @@
"CancelRecording": "取消錄影",
"CancelSeries": "取消系列",
"Categories": "類別",
"ChangingMetadataImageSettingsNewContent": "更改影片中繼資料或媒體圖像的下載設定僅對以後添加至媒體庫中的新容生效,若需更改已存在的資料,請手動更新中繼資料。",
"ChangingMetadataImageSettingsNewContent": "更改影片中繼資料或媒體圖像的下載設定僅對以後添加至媒體庫中的新容生效,若需更改已存在的資料,請手動更新中繼資料。",
"ChannelAccessHelp": "選擇與此使用者共享之頻道。管理員將能夠使用中繼資料管理器編輯所有資料夾。",
"ChannelNameOnly": "只在頻道 {0}",
"ChannelNumber": "頻道號碼",
@ -432,7 +432,7 @@
"Down": "下",
"DownloadsValue": "{0} 個下載",
"DrmChannelsNotImported": "受 DMR 保護的頻道將不會被導入。",
"DropShadow": "背景投影",
"DropShadow": "影",
"EasyPasswordHelp": "你的簡易 PIN 碼將會用於在支援的 Jellyfin 應用上進行離線存取,同時也可被用於區域網路的登入。",
"EditMetadata": "編輯中繼資料",
"EditSubtitles": "編輯字幕",
@ -524,7 +524,7 @@
"HeaderConfigureRemoteAccess": "設定遠端控制",
"HeaderConfirmPluginInstallation": "確認附加元件安裝",
"HeaderConfirmProfileDeletion": "確認刪除個人資料",
"HeaderConfirmRevokeApiKey": "重 API 金鑰",
"HeaderConfirmRevokeApiKey": "重 API 金鑰",
"HeaderConnectToServer": "連結至伺服器",
"HeaderConnectionFailure": "連結失敗",
"HeaderContainerProfile": "影片載體設定",
@ -617,7 +617,7 @@
"HeaderSeasons": "季數",
"HeaderSecondsValue": "{0} 秒",
"HeaderSelectPath": "選擇位址",
"HeaderSelectTranscodingPath": "選擇轉暫放位址",
"HeaderSelectTranscodingPath": "選擇轉暫放位址",
"HeaderSelectTranscodingPathHelp": "瀏覽或輸入轉檔用來存暫時資料的位址。資料夾需具寫入權限。",
"HeaderSendMessage": "傳送訊息",
"HeaderSeriesOptions": "系列選項",
@ -646,7 +646,7 @@
"AuthProviderHelp": "選擇用於驗證使用者密碼的身份驗證提供者。",
"HeaderParentalRatings": "家長評級",
"HeaderProfile": "設定檔",
"HeaderProfileInformation": "設定檔息",
"HeaderProfileInformation": "設定檔息",
"HeaderProfileServerSettingsHelp": "這些數值將控制伺服器如何呈現給設備。",
"HeaderResponseProfile": "回覆設定檔",
"HeaderResponseProfileHelp": "當播放某些類型的媒體時,回覆設定檔提供一種方法來發送自定訊息到設備。",
@ -657,8 +657,8 @@
"HeaderSubtitleProfiles": "字幕設定檔",
"HeaderSubtitleProfilesHelp": "字幕設定檔描述設備所支援的字幕格式。",
"HeaderTaskTriggers": "任務觸發",
"HeaderTranscodingProfile": "轉設定",
"HeaderTranscodingProfileHelp": "新增轉碼設定檔標明哪些媒體格式需要轉碼處理。",
"HeaderTranscodingProfile": "轉設定",
"HeaderTranscodingProfileHelp": "新增轉檔設定檔標明哪些媒體格式需要轉檔處理。",
"HeaderTuners": "調諧器",
"HeaderTypeImageFetchers": "{0} 圖片獲取程序",
"HeaderTypeText": "輸入文字",
@ -683,13 +683,13 @@
"Images": "圖片",
"ImportFavoriteChannelsHelp": "若啟用,僅於調諧器設備中被標記為我的最愛的頻道才會被導入。",
"ImportMissingEpisodesHelp": "缺失劇集的資料將導入您的媒體庫,並在季度與系列中顯示。 可能導致媒體庫掃描延長。",
"InstallingPackage": "正在安 {0}(版本 {1}",
"InstallingPackage": "正在安 {0}(版本 {1}",
"InstantMix": "即時混音",
"Items": "項目",
"Kids": "兒童",
"Label3DFormat": "3D 格式:",
"LabelAbortedByServerShutdown": "(因為伺服器關閉被中止)",
"LabelAccessDay": "一中的何時:",
"LabelAccessDay": "一中的何時:",
"LabelAccessEnd": "結束時間:",
"LabelAccessStart": "開始時間:",
"LabelAirDays": "播出日期:",
@ -700,22 +700,22 @@
"LabelAlbum": "專輯:",
"LabelAlbumArtHelp": "PN 在 upnp:albumArtURI 裡的 dlna:profileID 屬性用於專輯封面。某些設備不管圖像的尺寸大小,都會要求特定的值。",
"LabelAlbumArtMaxHeight": "專輯封面最大高度:",
"LabelAlbumArtMaxHeightHelp": "通過 upnp:albumArtURI 顯示的專輯封面超鏈接的最大分辨率。",
"LabelAlbumArtMaxHeightHelp": "通過 upnp:albumArtURI 顯示的專輯封面超連結的最大解析度。",
"LabelAlbumArtMaxWidth": "專輯封面最大寬度:",
"LabelAlbumArtMaxWidthHelp": "通過 upnp:albumArtURI 顯示的專輯封面超鏈接的最大解析度。",
"LabelAlbumArtMaxWidthHelp": "通過 upnp:albumArtURI 顯示的專輯封面超連結的最大解析度。",
"LabelAlbumArtPN": "專輯封面 PN ",
"LabelAlbumArtists": "專輯作家:",
"LabelAllowHWTranscoding": "允許硬體轉",
"LabelAllowHWTranscoding": "允許硬體轉",
"LabelAllowedRemoteAddresses": "遠端 IP 位址過濾:",
"LabelAllowedRemoteAddressesMode": "遠端 IP 位址過濾模式:",
"LabelAppName": "APP 名稱",
"LabelAppNameExample": "例如:可愛蹦蹦主機、小安的 Jellyfin",
"LabelArtists": "藝人:",
"LabelArtistsHelp": "將多位演出者以「;」分隔。",
"LabelAudio": "音",
"LabelAudio": "音",
"LabelAuthProvider": "認證提供者:",
"LabelAutomaticallyRefreshInternetMetadataEvery": "從網路自動抓取中繼資料:",
"LabelBindToLocalNetworkAddress": "綁定本地網地址:",
"LabelBindToLocalNetworkAddress": "綁定本地網地址:",
"LabelBindToLocalNetworkAddressHelp": "(選用)覆蓋 HTTP 伺服器綁定的本地 IP 位址。如果留空,伺服器將會監聽所有可用的地址。改變此欄位需重啟 Jellyfin 伺服器。",
"LabelBirthDate": "出生日期:",
"LabelBirthYear": "出生年:",
@ -743,7 +743,7 @@
"LabelCustomDeviceDisplayNameHelp": "指定自訂的顯示名稱,或者留空以使用設備自己報告的名稱。",
"LabelCustomRating": "自訂分級:",
"LabelDateAdded": "新增日期:",
"LabelDateAddedBehavior": "新容加入的日期應使用:",
"LabelDateAddedBehavior": "新容加入的日期應使用:",
"LabelDateTimeLocale": "設定時區:",
"LabelDeathDate": "死亡時間:",
"LabelDefaultScreen": "預設分頁:",
@ -763,8 +763,8 @@
"LabelAudioBitDepth": "音訊位元深度:",
"LabelBaseUrl": "根路徑:",
"LabelIconMaxHeight": "圖示最高高度:",
"LabelHttpsPortHelp": "HTTPS 伺服器的 TCP 端口。",
"LabelIconMaxHeightHelp": "通過 upnp:icon 的圖最大解析度。",
"LabelHttpsPortHelp": "HTTPS 伺服器的 TCP 。",
"LabelIconMaxHeightHelp": "通過 upnp:icon 的圖最大解析度。",
"CopyStreamURL": "複製串流連結",
"MediaInfoDefault": "預設",
"MediaInfoStreamTypeAudio": "音訊",
@ -773,7 +773,7 @@
"LabelSeasonNumber": "季:",
"LabelDropImageHere": "拖移圖片到這裡,或是點擊來選取。",
"LabelImageType": "圖片格式:",
"LabelIdentificationFieldHelp": "不區分大小寫的子字串或正則表達式。",
"LabelIdentificationFieldHelp": "不區分大小寫的子字串或正則表達式。",
"Large": "大",
"LabelTranscodingAudioCodec": "音訊編碼:",
"MessageSettingsSaved": "設定已儲存.",
@ -823,9 +823,9 @@
"Shuffle": "隨機播放",
"Smart": "智慧",
"HeaderFavoriteBooks": "最愛的書籍",
"LabelAudioBitrate": "音訊比特率:",
"LabelAudioBitrate": "音訊位元率:",
"LabelAudioCodec": "音訊編碼:",
"LabelBitrate": "比特率:",
"LabelBitrate": "位元率:",
"LabelAudioChannels": "音訊聲道:",
"LabelAudioSampleRate": "音訊取樣率:",
"LabelFont": "字體:",
@ -833,12 +833,12 @@
"LabelDisplayOrder": "顯示順序:",
"LabelEnableBlastAliveMessages": "活動訊息",
"LabelEnableDlnaServer": "啟用 DLNA 伺服器",
"LabelEnableDlnaServerHelp": "允許網上的 UPnP 設備瀏覽和播放內容。",
"LabelEnableDlnaServerHelp": "允許網上的 UPnP 設備瀏覽和播放內容。",
"LabelEnableHardwareDecodingFor": "為以下啟用硬體解碼:",
"LabelEpisodeNumber": "集:",
"LabelBaseUrlHelp": "您可以在此處自訂伺服器 URL 路徑的子目錄,如:<code>http://example.com/<b>&lt;baseurl&gt;</b></code>",
"LabelExtractChaptersDuringLibraryScan": "於媒體庫掃描時擷取章節圖片",
"LabelHttpsPort": "本地 HTTPS 端口",
"LabelHttpsPort": "本地 HTTPS ",
"LabelFailed": "失敗",
"LabelSubtitles": "字幕",
"LabelSupportedMediaTypes": "支援的媒體類型:",
@ -864,7 +864,7 @@
"ManageLibrary": "管理媒體庫",
"MarkPlayed": "標記為已播放",
"MarkUnplayed": "標記為未播放",
"MediaInfoBitrate": "比特率",
"MediaInfoBitrate": "位元率",
"MediaInfoChannels": "聲道",
"MediaInfoCodec": "編碼",
"MediaInfoContainer": "影片容器",
@ -946,7 +946,7 @@
"LabelDownloadLanguages": "下載語言:",
"LabelDynamicExternalId": "{0} Id:",
"LabelEasyPinCode": "簡易代碼:",
"LabelEnableAutomaticPortMap": "啟用自動端口映射",
"LabelEnableAutomaticPortMap": "啟用自動映射",
"LabelEnableSingleImageInDidlLimit": "限制單個嵌入式圖片",
"LabelEndDate": "結束日期:",
"LabelLockItemToPreventChanges": "鎖定此項目來避免被更改",
@ -959,7 +959,7 @@
"LabelSelectVersionToInstall": "選擇要安裝的版本:",
"LabelSendNotificationToUsers": "傳送通知給:",
"LabelSortBy": "排序按照:",
"LabelVideoBitrate": "影片比特率:",
"LabelVideoBitrate": "影片位元率:",
"MediaInfoSize": "大小",
"MediaInfoTimestamp": "時間戳",
"MediaInfoStreamTypeData": "檔案",
@ -990,12 +990,12 @@
"LabelGroupMoviesIntoCollectionsHelp": "顯示電影清單時,屬於相同集合的電影將作為分組項目顯示。",
"LabelEncoderPreset": "H264 解碼品質:",
"LabelHardwareAccelerationType": "硬體加速:",
"LabelIconMaxWidthHelp": "通過 upnp:icon 的圖最大解析度。",
"LabelIconMaxWidthHelp": "通過 upnp:icon 的圖最大解析度。",
"LabelImportOnlyFavoriteChannels": "僅限收藏的頻道",
"LabelInNetworkSignInWithEasyPassword": "啟用以簡易密碼進行區域網路登入",
"LabelH264Crf": "H264 編碼 CRF:",
"LabelMaxStreamingBitrate": "最大串流畫質:",
"LabelMaxStreamingBitrateHelp": "指定最大串流比特率。",
"LabelMaxStreamingBitrateHelp": "指定最大串流位元率。",
"LabelMessageText": "訊息文字:",
"LabelMessageTitle": "訊息標題:",
"LabelMetadataDownloadLanguage": "偏好下載語言:",
@ -1086,10 +1086,10 @@
"Writer": "編劇",
"XmlTvMovieCategoriesHelp": "有這些類別的節目會被當作電影,以「|」來分隔多個項目。",
"ValueSeriesCount": "{0} 劇集",
"LabelHardwareAccelerationTypeHelp": "硬加速需要額外的配置。",
"LabelHardwareAccelerationTypeHelp": "硬加速需要額外的配置。",
"LabelHomeNetworkQuality": "區域網路畫質:",
"LabelHomeScreenSectionValue": "主畫面模 {0}",
"LabelMetadataDownloadersHelp": "啟用中繼資料下載器的優先次序,愈下次序只會用來填補缺少的息。",
"LabelHomeScreenSectionValue": "主畫面模 {0}",
"LabelMetadataDownloadersHelp": "啟用中繼資料下載器的優先次序,愈下次序只會用來填補缺少的息。",
"LabelMetadataReaders": "中繼資料閱讀器:",
"LabelMetadataSaversHelp": "選取儲存中繼資料的檔案格式。",
"LabelModelNumber": "型號",
@ -1099,7 +1099,7 @@
"OptionDownloadBannerImage": "橫幅",
"OptionEnableAccessToAllChannels": "允許存取所有頻道",
"OptionEnableAccessToAllLibraries": "允許存取所有媒體庫",
"OptionEnableForAllTuners": "开启所有调谐器",
"OptionEnableForAllTuners": "開啟所有調諧器",
"OptionExtractChapterImage": "開啟章節圖片擷取",
"OptionEnableM2tsModeHelp": "當編碼為 MPEGTS 時啟用 M2TS 模式。",
"OptionEquals": "等於",
@ -1139,13 +1139,13 @@
"LabelSimultaneousConnectionLimit": "同時串流限制:",
"LabelSize": "大小:",
"LabelSkipBackLength": "跳過長度:",
"LabelSkipIfGraphicalSubsPresentHelp": "保留文字版本的字幕會更有效率傳遞,減低影片轉的機會。",
"LabelSkipIfGraphicalSubsPresentHelp": "保留文字版本的字幕會更有效率傳遞,減低影片轉的機會。",
"LabelStopWhenPossible": "當可能時自動停止:",
"LabelStopping": "停止",
"LabelTagline": "個性宣言:",
"LabelSubtitleDownloaders": "字幕下載器:",
"LabelSubtitleFormatHelp": "SRT",
"LabelSubtitlePlaybackMode": "字幕模式",
"LabelSubtitleFormatHelp": "SRT",
"LabelSubtitlePlaybackMode": "字幕載入",
"LabelTranscodingThreadCount": "轉檔執行緒數:",
"LabelTunerIpAddress": "調諧器 IP 位址:",
"LabelTunerType": "調諧器類型:",
@ -1184,7 +1184,7 @@
"MessageDirectoryPickerLinuxInstruction": "使用 Linux on Arch Linux、CentOS、Debian、Fedora、openSUSE 或 Ubuntu 作業系統,您必須授權使用者至少讀取權限來存取您的儲存路徑。",
"MessageEnablingOptionLongerScans": "啟用這個選項可能會延長媒體庫的掃描時間。",
"MessageFileReadError": "讀取檔案時發生錯誤。",
"MessageForgotPasswordInNetworkRequired": "請檢查您的區域網路後再開始密碼重流程。",
"MessageForgotPasswordInNetworkRequired": "請檢查您的區域網路後再開始密碼重流程。",
"MessageForgotPasswordFileCreated": "已在伺服器上建立了以下檔案,並包含有關後續步驟說明:",
"MessageNoAvailablePlugins": "沒有可用的附加元件。",
"MessageNoServersAvailable": "無法自動偵測伺服器。",
@ -1192,7 +1192,7 @@
"MessageNoCollectionsAvailable": "分組能夠讓您享受個性化的影片、劇集和專輯。點擊+按鈕開始建立分組。",
"MessagePlayAccessRestricted": "此內容的播放受到限制,聯繫您的伺服器管理員以獲取更多訊息。",
"MessagePluginConfigurationRequiresLocalAccess": "請直接登入你的本地伺服器以設定這個附加元件。",
"MessagePluginInstallDisclaimer": "安裝 Jellyfin 社區成員建立的附加元件來讓您的 Jellyfin 獲取額外的功能化您的使用體驗。但可能會對你的 Jellyfin 伺服器效能造成影響,如更長的媒體庫掃描時間、額外的背景資料處理與系統穩定性降低等。",
"MessagePluginInstallDisclaimer": "安裝 Jellyfin 社區成員建立的附加元件來讓您的 Jellyfin 獲取額外的功能最佳化您的使用體驗。但可能會對你的 Jellyfin 伺服器效能造成影響,如更長的媒體庫掃描時間、額外的背景資料處理與系統穩定性降低等。",
"MessageReenableUser": "請參閱以下以重新啟用",
"MessageUnableToConnectToServer": "無法連上所選的伺服器,請確保該伺服器正在運作中。",
"MessageYouHaveVersionInstalled": "你目前安裝了 {0} 版本。",
@ -1201,7 +1201,7 @@
"NoNewDevicesFound": "找不到裝置,要添加新調諧器,請關閉此對話框並手動輸入裝置訊息。",
"OnlyForcedSubtitles": "僅顯示強制字幕",
"OnlyImageFormats": "圖片格式VOBSUB、PGS、SUB",
"OptionAllowLinkSharingHelp": "只有網頁包含的媒體訊息會被共享,媒體檔案本身不會被公開共享,共享的內容會在 {0} 天到期。",
"OptionAllowLinkSharingHelp": "只有網頁包含的媒體訊息會被共享,媒體檔案本身不會被公開共享,共享的內容會在 {0} 天到期。",
"OptionAllowRemoteSharedDevices": "允許遠端控制共享裝置",
"OptionAllowSyncTranscoding": "允許需要轉檔的媒體下載和同步",
"OptionAllowVideoPlaybackRemuxing": "允許播放需轉換但無需重新編碼的影片",
@ -1245,7 +1245,7 @@
"Programs": "節目",
"Quality": "品質",
"PackageInstallFailed": "{0} (版本 {1}) 安裝失敗。",
"Raised": "提高",
"Raised": "浮凹",
"Rate": "評等",
"Recordings": "錄影",
"ServerRestartNeededAfterPluginInstall": "安裝附加元件後Jellyfin 伺服器需要重啟使其生效。",
@ -1255,7 +1255,7 @@
"TheseSettingsAffectSubtitlesOnThisDevice": "這些設定僅影響該裝置的字幕顯示",
"TitleHardwareAcceleration": "硬體加速",
"TitleHostingSettings": "主機設定",
"Uniform": "輪廓",
"Uniform": "邊框",
"Unmute": "取消靜音",
"Unplayed": "尚未播放",
"TvLibraryHelp": "查看 {0} 電視命名指南 {1} 。",
@ -1266,7 +1266,7 @@
"LabelInNetworkSignInWithEasyPasswordHelp": "你可以在你的家庭網路中使用你的簡易 PIN 碼登錄 Jellyfin 應用程式,僅在你使用外部網路時才需要輸入密碼,如果 PIN 碼留空,那麼在你的區域網路中便不需輸入密碼。",
"LabelReleaseDate": "釋出日期:",
"LabelRemoteClientBitrateLimit": "網際網路串流傳輸位元率限制Mbps",
"LanNetworksHelp": "在強制頻寬限制時,認作本地網路上的 IP 位址或 IP/子網域遮罩項目的逗號分隔清單。若設置此項,所有其它 IP 位址將被視作在外部網路上,并且將受到外部頻寬限制。如果保留爲空,則只將伺服器的子網域遮罩作本地網路。",
"LanNetworksHelp": "在強制頻寬限制時,認作本地網路上的 IP 位址或 IP/子網域遮罩項目的逗號分隔清單。若設置此項,所有其它 IP 位址將被視作在外部網路上,並且將受到外部頻寬限制。如果保留為空,則只將伺服器的子網域遮罩作本地網路。",
"OptionIgnoreTranscodeByteRangeRequests": "忽略轉檔位元組範圍請求",
"OptionIgnoreTranscodeByteRangeRequestsHelp": "這些請求會被接受,但會忽略的位元組範圍標頭。",
"OptionLoginAttemptsBeforeLockoutHelp": "若值為 0則表示將允許普通使用者嘗試三次、管理員嘗試五次的預設值設定為 -1 來停用此功能。",
@ -1280,9 +1280,9 @@
"LabelEnableSingleImageInDidlLimitHelp": "若在 Didl 中嵌入多個圖片,某些裝置可能無法正常顯示。",
"SortByValue": "排序方式:{0}",
"LabelLineup": "排隊:",
"LabelLocalHttpServerPortNumber": "本地 HTTP 端口",
"LabelLocalHttpServerPortNumberHelp": "HTTP 伺服器的 TCP 端口。",
"SubtitleAppearanceSettingsAlsoPassedToCastDevices": "這些設定也會被套用在任何透過此裝置發起的 Chromecast 播放。",
"LabelLocalHttpServerPortNumber": "本地 HTTP ",
"LabelLocalHttpServerPortNumberHelp": "HTTP 伺服器的 TCP 。",
"SubtitleAppearanceSettingsAlsoPassedToCastDevices": "此設定也會影響透過此裝置投放的 Chromecast。",
"LabelLoginDisclaimer": "登入字句:",
"LabelLogs": "日誌:",
"SubtitleDownloadersHelp": "按優先順序啟用並排列您的首選字幕下載程式。",
@ -1290,7 +1290,7 @@
"SystemDlnaProfilesHelp": "系統設定檔案是唯讀的,更改系統設定檔案將被儲存到自訂的新設定檔案。",
"LabelNumber": "編號:",
"LabelNumberOfGuideDays": "下載電視指南日數:",
"OnlyForcedSubtitlesHelp": "僅標記為「強制」的字幕會被載入。",
"OnlyForcedSubtitlesHelp": "僅標記為「強制」的字幕會被載入。",
"PackageInstallCompleted": "{0} (版本 {1}) 安裝完成。",
"OptionDisplayFolderViewHelp": "在其他媒體庫旁邊顯示資料夾,對想要一個普通的資料夾檢視很有用。",
"LabelReasonForTranscoding": "轉檔原因:",
@ -1318,7 +1318,7 @@
"LabelVaapiDevice": "VA API 裝置:",
"DashboardArchitecture": "架構:{0}",
"MediaInfoSampleRate": "採樣率",
"MessageContactAdminToResetPassword": "請聯繫您的管理員來重置密碼。",
"MessageContactAdminToResetPassword": "請聯絡您的管理員來重設密碼。",
"MessageUnsetContentHelp": "內容將顯示為純資料夾,建議使用中繼資料管理器設置子資料夾的內容類型。",
"OptionAllowAudioPlaybackTranscoding": "允許播放需要轉檔的音訊",
"OptionCustomUsers": "自訂",
@ -1336,8 +1336,8 @@
"LabelModelDescription": "型號描述",
"LabelModelName": "型號名稱",
"LabelModelUrl": "型號網址",
"LabelMusicStreamingTranscodingBitrate": "音樂轉檔比特率:",
"LabelMusicStreamingTranscodingBitrateHelp": "指定音樂串流時的最大比特率。",
"LabelMusicStreamingTranscodingBitrate": "音樂轉檔位元率:",
"LabelMusicStreamingTranscodingBitrateHelp": "指定音樂串流時的最大位元率。",
"LabelOptionalNetworkPathHelp": "如果這個資料夾在網路上分享,提供網路分享路徑可以供其他應用程式直接存取媒體檔案,例如 {0} 或者 {1}。",
"LabelOriginalAspectRatio": "原始長寬比:",
"LabelOverview": "內容概述:",
@ -1361,8 +1361,8 @@
"LabelPreferredSubtitleLanguage": "字幕語言偏好:",
"LabelProtocol": "協議:",
"LabelProtocolInfo": "協議資訊:",
"LabelPublicHttpPort": "公開 HTTP 端口",
"LabelPublicHttpsPort": "公開 HTTPS 端口",
"LabelPublicHttpPort": "公開 HTTP ",
"LabelPublicHttpsPort": "公開 HTTPS ",
"LabelProtocolInfoHelp": "當響應來自裝置的 GetProtocolInfo獲取協議訊息請求時該值將被使用。",
"LabelPublicHttpPortHelp": "公開連接埠應映射到本地 HTTP 連接埠。",
"LabelPublicHttpsPortHelp": "公開連接埠應映射到本地 HTTPS 連接埠。",
@ -1404,20 +1404,20 @@
"HeaderFavoritePeople": "最愛人物",
"XmlDocumentAttributeListHelp": "這些屬性會在每一個 XML 回應的根元素上套用。",
"SkipEpisodesAlreadyInMyLibraryHelp": "劇集將使用季和劇集編號進行比較。",
"SelectAdminUsername": "請為管理員賬戶選擇一個用戶名。",
"SelectAdminUsername": "請為管理員帳戶選擇一個使用者名稱。",
"OptionSaveMetadataAsHiddenHelp": "更改此項將套用至未來保存的中繼資料。現有中繼資料檔案將在下一次伺服器儲存它們時被更新。",
"OptionAllowRemoteSharedDevicesHelp": "DLNA裝置將被視為共享中直至有使用者控制。",
"OptionForceRemoteSourceTranscoding": "强制遠端轉碼(像電視直播一樣)",
"OptionForceRemoteSourceTranscoding": "強制遠端轉檔(像電視直播一樣)",
"MessageConfirmAppExit": "您要退出嗎?",
"LabelVideoResolution": "視頻解析度:",
"LabelVideoResolution": "影片解析度:",
"LabelStreamType": "串流類型:",
"LabelPlayerDimensions": "播放器尺寸:",
"LabelDroppedFrames": "丟棄的幀:",
"LabelCorruptedFrames": "損壞的幀:",
"ButtonSplit": "分割",
"AskAdminToCreateLibrary": "如要建立資料庫,請聯管理員。",
"AskAdminToCreateLibrary": "如要建立資料庫,請聯管理員。",
"NoCreatedLibraries": "看來您還未創任何媒體庫。{0}立刻創一個新的嗎?{1}",
"ClientSettings": "戶端設定",
"ClientSettings": "戶端設定",
"AllowFfmpegThrottlingHelp": "當轉檔或重組進度遠超於目前播放進度時,將暫停轉檔節省消耗的資源。在不常跳播的時候最有效。如果遇到播放問題,請關閉此功能。",
"AllowFfmpegThrottling": "限制轉檔",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "這將會使用內建中繼資料。",
@ -1448,7 +1448,7 @@
"LabelLibraryPageSize": "媒體庫分頁大小:",
"LabelDeinterlaceMethod": "反交錯方法:",
"Episode": "劇集",
"DeinterlaceMethodHelp": "選擇對隔行掃描內容進行轉時所用的反交錯方法。",
"DeinterlaceMethodHelp": "選擇對隔行掃描內容進行轉時所用的反交錯方法。",
"BoxSet": "套裝",
"UnsupportedPlayback": "Jellyfin 無法解密受 DRM 保護的內容,但仍然會嘗試播放所有內容。某些檔案由於被加密或包含如互動標題等不受支援的內容,在播放時可能會沒有畫面。",
"Filter": "篩選器",
@ -1462,7 +1462,7 @@
"LabelRequireHttps": "強制 HTTPS",
"LabelStable": "穩定版",
"LabelChromecastVersion": "Chromecast 版本",
"LabelEnableHttpsHelp": "監聽指定的 HTTPS 端口。須設定有效的證書使其生效。",
"LabelEnableHttpsHelp": "監聽指定的 HTTPS 。須設定有效的證書使其生效。",
"LabelEnableHttps": "啟用HTTPS",
"HeaderServerAddressSettings": "伺服器位置設定",
"HeaderRemoteAccessSettings": "遠端存取設定",