mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
Merge branch 'master' into migrated-livetvseriestimers-to-es6-module
This commit is contained in:
commit
aeb5e944d4
134 changed files with 2913 additions and 3049 deletions
|
@ -29,7 +29,7 @@ module.exports = {
|
|||
],
|
||||
rules: {
|
||||
'block-spacing': ['error'],
|
||||
'brace-style': ['error', "1tbs", { "allowSingleLine": true }],
|
||||
'brace-style': ['error', '1tbs', { 'allowSingleLine': true }],
|
||||
'comma-dangle': ['error', 'never'],
|
||||
'comma-spacing': ['error'],
|
||||
'eol-last': ['error'],
|
||||
|
@ -41,7 +41,7 @@ module.exports = {
|
|||
'no-multiple-empty-lines': ['error', { 'max': 1 }],
|
||||
'no-trailing-spaces': ['error'],
|
||||
'no-unused-expressions': ['error', { 'allowShortCircuit': true, 'allowTernary': true, 'allowTaggedTemplates': true }],
|
||||
"no-unused-vars": ["error", { "vars": "all", "args": "none", "ignoreRestSiblings": true }],
|
||||
'no-unused-vars': ['error', { 'vars': 'all', 'args': 'none', 'ignoreRestSiblings': true }],
|
||||
'one-var': ['error', 'never'],
|
||||
'padded-blocks': ['error', 'never'],
|
||||
'quotes': ['error', 'single', { 'avoidEscape': true, 'allowTemplateLiterals': false }],
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
- [Thibault Nocchi](https://github.com/ThibaultNocchi)
|
||||
- [MrTimscampi](https://github.com/MrTimscampi)
|
||||
- [Sarab Singh](https://github.com/sarab97)
|
||||
- [GuilhermeHideki](https://github.com/GuilhermeHideki)
|
||||
- [Andrei Oanca](https://github.com/OancaAndrei)
|
||||
- [Cromefire_](https://github.com/cromefire)
|
||||
|
||||
|
|
23
package.json
23
package.json
|
@ -20,7 +20,7 @@
|
|||
"css-loader": "^4.2.0",
|
||||
"cssnano": "^4.1.10",
|
||||
"del": "^5.1.0",
|
||||
"eslint": "^6.8.0",
|
||||
"eslint": "^7.6.0",
|
||||
"eslint-plugin-compat": "^3.5.1",
|
||||
"eslint-plugin-eslint-comments": "^3.2.0",
|
||||
"eslint-plugin-import": "^2.21.2",
|
||||
|
@ -38,7 +38,7 @@
|
|||
"gulp-postcss": "^8.0.0",
|
||||
"gulp-sass": "^4.0.2",
|
||||
"gulp-sourcemaps": "^2.6.5",
|
||||
"gulp-terser": "^1.2.1",
|
||||
"gulp-terser": "^1.3.0",
|
||||
"html-webpack-plugin": "^4.3.0",
|
||||
"lazypipe": "^1.0.2",
|
||||
"node-sass": "^4.13.1",
|
||||
|
@ -107,6 +107,7 @@
|
|||
"src/components/dialogHelper/dialogHelper.js",
|
||||
"src/components/directorybrowser/directorybrowser.js",
|
||||
"src/components/displaySettings/displaySettings.js",
|
||||
"src/components/favoriteitems.js",
|
||||
"src/components/fetchhelper.js",
|
||||
"src/components/filterdialog/filterdialog.js",
|
||||
"src/components/groupedcards.js",
|
||||
|
@ -126,6 +127,7 @@
|
|||
"src/components/lazyLoader/lazyLoaderIntersectionObserver.js",
|
||||
"src/components/libraryoptionseditor/libraryoptionseditor.js",
|
||||
"src/components/listview/listview.js",
|
||||
"src/components/loading/loading.js",
|
||||
"src/components/maintabsmanager.js",
|
||||
"src/components/mediainfo/mediainfo.js",
|
||||
"src/components/mediaLibraryCreator/mediaLibraryCreator.js",
|
||||
|
@ -138,6 +140,7 @@
|
|||
"src/components/playback/mediasession.js",
|
||||
"src/components/playback/nowplayinghelper.js",
|
||||
"src/components/playback/playbackorientation.js",
|
||||
"src/components/playback/playbackmanager.js",
|
||||
"src/components/playback/playerSelectionMenu.js",
|
||||
"src/components/playback/playersettingsmenu.js",
|
||||
"src/components/playback/playmethodhelper.js",
|
||||
|
@ -163,6 +166,9 @@
|
|||
"src/components/syncPlay/playbackPermissionManager.js",
|
||||
"src/components/syncPlay/syncPlayManager.js",
|
||||
"src/components/syncPlay/timeSyncManager.js",
|
||||
"src/components/toast/toast.js",
|
||||
"src/components/upnextdialog/upnextdialog.js",
|
||||
"src/components/viewContainer.js",
|
||||
"src/controllers/session/addServer/index.js",
|
||||
"src/controllers/session/forgotPassword/index.js",
|
||||
"src/controllers/session/redeemPassword/index.js",
|
||||
|
@ -189,6 +195,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/playback.js",
|
||||
"src/controllers/dashboard/plugins/repositories/index.js",
|
||||
"src/controllers/dashboard/scheduledtasks/scheduledtask.js",
|
||||
|
@ -201,12 +209,19 @@
|
|||
"src/controllers/dashboard/users/userparentalcontrol.js",
|
||||
"src/controllers/dashboard/users/userpasswordpage.js",
|
||||
"src/controllers/dashboard/users/userprofilespage.js",
|
||||
"src/controllers/edititemmetadata.js",
|
||||
"src/controllers/favorites.js",
|
||||
"src/controllers/hometab.js",
|
||||
"src/controllers/playback/nowplaying.js",
|
||||
"src/controllers/playback/videoosd.js",
|
||||
"src/controllers/itemDetails/index.js",
|
||||
"src/controllers/playback/queue/index.js",
|
||||
"src/controllers/playback/video/index.js",
|
||||
"src/controllers/searchpage.js",
|
||||
"src/controllers/livetvtuner.js",
|
||||
"src/controllers/livetvstatus.js",
|
||||
"src/controllers/livetvguideprovider.js",
|
||||
"src/controllers/livetvsettings.js",
|
||||
"src/controllers/livetv/livetvseriestimers.js",
|
||||
"src/controllers/shows/episodes.js",
|
||||
"src/controllers/shows/tvgenres.js",
|
||||
|
@ -264,10 +279,14 @@
|
|||
"src/scripts/globalize.js",
|
||||
"src/scripts/imagehelper.js",
|
||||
"src/scripts/inputManager.js",
|
||||
"src/scripts/autoThemes.js",
|
||||
"src/scripts/themeManager.js",
|
||||
"src/scripts/keyboardNavigation.js",
|
||||
"src/scripts/libraryBrowser.js",
|
||||
"src/scripts/mouseManager.js",
|
||||
"src/scripts/multiDownload.js",
|
||||
"src/scripts/playlists.js",
|
||||
"src/scripts/routes.js",
|
||||
"src/scripts/settings/appSettings.js",
|
||||
"src/scripts/settings/userSettings.js",
|
||||
"src/scripts/settings/webSettings.js",
|
||||
|
|
|
@ -49,7 +49,7 @@ import 'formDialogStyle';
|
|||
};
|
||||
|
||||
if (parseFloat(updatedSchedule.StartHour) >= parseFloat(updatedSchedule.EndHour)) {
|
||||
return void alert(globalize.translate('ErrorMessageStartHourGreaterThanEnd'));
|
||||
return void alert(globalize.translate('ErrorStartHourGreaterThanEnd'));
|
||||
}
|
||||
|
||||
context.submitted = true;
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdrop', 'browser', 'page', 'appSettings', 'apphost', 'connectionManager'], function (loading, globalize, events, viewManager, skinManager, backdrop, browser, page, appSettings, appHost, connectionManager) {
|
||||
'use strict';
|
||||
|
||||
browser = browser.default || browser;
|
||||
loading = loading.default || loading;
|
||||
|
||||
var appRouter = {
|
||||
showLocalLogin: function (serverId, manualLogin) {
|
||||
var pageName = manualLogin ? 'manuallogin' : 'login';
|
||||
|
@ -34,7 +37,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro
|
|||
switch (result.State) {
|
||||
case 'SignedIn':
|
||||
loading.hide();
|
||||
skinManager.loadUserSkin();
|
||||
Emby.Page.goHome();
|
||||
break;
|
||||
case 'ServerSignIn':
|
||||
result.ApiClient.getPublicUsers().then(function (users) {
|
||||
|
@ -147,7 +150,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro
|
|||
if (typeof route.path === 'string') {
|
||||
loadContentUrl(ctx, next, route, currentRequest);
|
||||
} else {
|
||||
// ? TODO
|
||||
next();
|
||||
}
|
||||
};
|
||||
|
@ -285,12 +287,9 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro
|
|||
|
||||
connectionManager.connect({
|
||||
enableAutoLogin: appSettings.enableAutoLogin()
|
||||
|
||||
}).then(function (result) {
|
||||
firstConnectionResult = result;
|
||||
|
||||
options = options || {};
|
||||
|
||||
page({
|
||||
click: options.click !== false,
|
||||
hashbang: options.hashbang !== false
|
||||
|
@ -342,7 +341,7 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro
|
|||
|
||||
if (route.isDefaultRoute) {
|
||||
console.debug('appRouter - loading skin home page');
|
||||
loadUserSkinWithOptions(ctx);
|
||||
Emby.Page.goHome();
|
||||
return;
|
||||
} else if (route.roles) {
|
||||
validateRoles(apiClient, route.roles).then(function () {
|
||||
|
@ -356,15 +355,6 @@ define(['loading', 'globalize', 'events', 'viewManager', 'skinManager', 'backdro
|
|||
callback();
|
||||
}
|
||||
|
||||
function loadUserSkinWithOptions(ctx) {
|
||||
require(['queryString'], function (queryString) {
|
||||
var params = queryString.parse(ctx.querystring);
|
||||
skinManager.loadUserSkin({
|
||||
start: params.start
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function validateRoles(apiClient, roles) {
|
||||
return Promise.all(roles.split(',').map(function (role) {
|
||||
return validateRole(apiClient, role);
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'globalize'], function (appSettings, browser, events, htmlMediaHelper, webSettings, globalize) {
|
||||
'use strict';
|
||||
|
||||
browser = browser.default || browser;
|
||||
|
||||
function getBaseProfileOptions(item) {
|
||||
var disableHlsVideoAudioCodecs = [];
|
||||
|
||||
|
@ -277,7 +279,7 @@ define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'g
|
|||
features.push('targetblank');
|
||||
features.push('screensaver');
|
||||
|
||||
webSettings.enableMultiServer().then(enabled => {
|
||||
webSettings.getMultiServer().then(enabled => {
|
||||
if (enabled) features.push('multiserver');
|
||||
});
|
||||
|
||||
|
@ -407,13 +409,6 @@ define(['appSettings', 'browser', 'events', 'htmlMediaHelper', 'webSettings', 'g
|
|||
getPushTokenInfo: function () {
|
||||
return {};
|
||||
},
|
||||
setThemeColor: function (color) {
|
||||
var metaThemeColor = document.querySelector('meta[name=theme-color]');
|
||||
|
||||
if (metaThemeColor) {
|
||||
metaThemeColor.setAttribute('content', color);
|
||||
}
|
||||
},
|
||||
setUserScalable: function (scalable) {
|
||||
if (!browser.tv) {
|
||||
var att = scalable ? 'width=device-width, initial-scale=1, minimum-scale=1, user-scalable=yes' : 'width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no';
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import browser from 'browser';
|
||||
import layoutManager from 'layoutManager';
|
||||
import appSettings from 'appSettings';
|
||||
import pluginManager from 'pluginManager';
|
||||
import appHost from 'apphost';
|
||||
import focusManager from 'focusManager';
|
||||
|
@ -16,17 +15,22 @@ import 'emby-button';
|
|||
|
||||
/* eslint-disable indent */
|
||||
|
||||
function fillThemes(select, isDashboard) {
|
||||
select.innerHTML = skinManager.getThemes().map(t => {
|
||||
let value = t.id;
|
||||
if (t.isDefault && !isDashboard) {
|
||||
value = '';
|
||||
} else if (t.isDefaultServerDashboard && isDashboard) {
|
||||
value = '';
|
||||
}
|
||||
function fillThemes(context, userSettings) {
|
||||
const select = context.querySelector('#selectTheme');
|
||||
|
||||
return `<option value="${value}">${t.name}</option>`;
|
||||
skinManager.getThemes().then(themes => {
|
||||
select.innerHTML = themes.map(t => {
|
||||
return `<option value="${t.id}">${t.name}</option>`;
|
||||
}).join('');
|
||||
|
||||
// get default theme
|
||||
var defaultTheme = themes.find(theme => {
|
||||
return theme.default;
|
||||
});
|
||||
|
||||
// set the current theme
|
||||
select.value = userSettings.theme() || defaultTheme.id;
|
||||
});
|
||||
}
|
||||
|
||||
function loadScreensavers(context, userSettings) {
|
||||
|
@ -46,6 +50,7 @@ import 'emby-button';
|
|||
selectScreensaver.innerHTML = options.map(o => {
|
||||
return `<option value="${o.value}">${o.name}</option>`;
|
||||
}).join('');
|
||||
|
||||
selectScreensaver.value = userSettings.screensaver();
|
||||
|
||||
if (!selectScreensaver.value) {
|
||||
|
@ -54,57 +59,6 @@ import 'emby-button';
|
|||
}
|
||||
}
|
||||
|
||||
function loadSoundEffects(context, userSettings) {
|
||||
const selectSoundEffects = context.querySelector('.selectSoundEffects');
|
||||
const options = pluginManager.ofType('soundeffects').map(plugin => {
|
||||
return {
|
||||
name: plugin.name,
|
||||
value: plugin.id
|
||||
};
|
||||
});
|
||||
|
||||
options.unshift({
|
||||
name: globalize.translate('None'),
|
||||
value: 'none'
|
||||
});
|
||||
|
||||
selectSoundEffects.innerHTML = options.map(o => {
|
||||
return `<option value="${o.value}">${o.name}</option>`;
|
||||
}).join('');
|
||||
selectSoundEffects.value = userSettings.soundEffects();
|
||||
|
||||
if (!selectSoundEffects.value) {
|
||||
// TODO: set the default instead of none
|
||||
selectSoundEffects.value = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
function loadSkins(context, userSettings) {
|
||||
const selectSkin = context.querySelector('.selectSkin');
|
||||
|
||||
const options = pluginManager.ofType('skin').map(plugin => {
|
||||
return {
|
||||
name: plugin.name,
|
||||
value: plugin.id
|
||||
};
|
||||
});
|
||||
|
||||
selectSkin.innerHTML = options.map(o => {
|
||||
return `<option value="${o.value}">${o.name}</option>`;
|
||||
}).join('');
|
||||
selectSkin.value = userSettings.skin();
|
||||
|
||||
if (!selectSkin.value && options.length) {
|
||||
selectSkin.value = options[0].value;
|
||||
}
|
||||
|
||||
if (options.length > 1 && appHost.supports('skins')) {
|
||||
context.querySelector('.selectSkinContainer').classList.remove('hide');
|
||||
} else {
|
||||
context.querySelector('.selectSkinContainer').classList.add('hide');
|
||||
}
|
||||
}
|
||||
|
||||
function showOrHideMissingEpisodesField(context) {
|
||||
if (browser.tizen || browser.web0s) {
|
||||
context.querySelector('.fldDisplayMissingEpisodes').classList.add('hide');
|
||||
|
@ -115,12 +69,6 @@ import 'emby-button';
|
|||
}
|
||||
|
||||
function loadForm(context, user, userSettings) {
|
||||
if (user.Policy.IsAdministrator) {
|
||||
context.querySelector('.selectDashboardThemeContainer').classList.remove('hide');
|
||||
} else {
|
||||
context.querySelector('.selectDashboardThemeContainer').classList.add('hide');
|
||||
}
|
||||
|
||||
if (appHost.supports('displaylanguage')) {
|
||||
context.querySelector('.languageSection').classList.remove('hide');
|
||||
} else {
|
||||
|
@ -139,18 +87,6 @@ import 'emby-button';
|
|||
context.querySelector('.learnHowToContributeContainer').classList.add('hide');
|
||||
}
|
||||
|
||||
if (appHost.supports('runatstartup')) {
|
||||
context.querySelector('.fldAutorun').classList.remove('hide');
|
||||
} else {
|
||||
context.querySelector('.fldAutorun').classList.add('hide');
|
||||
}
|
||||
|
||||
if (appHost.supports('soundeffects')) {
|
||||
context.querySelector('.fldSoundEffects').classList.remove('hide');
|
||||
} else {
|
||||
context.querySelector('.fldSoundEffects').classList.add('hide');
|
||||
}
|
||||
|
||||
if (appHost.supports('screensaver')) {
|
||||
context.querySelector('.selectScreensaverContainer').classList.remove('hide');
|
||||
} else {
|
||||
|
@ -173,16 +109,8 @@ import 'emby-button';
|
|||
context.querySelector('.fldThemeVideo').classList.add('hide');
|
||||
}
|
||||
|
||||
context.querySelector('.chkRunAtStartup').checked = appSettings.runAtStartup();
|
||||
|
||||
const selectTheme = context.querySelector('#selectTheme');
|
||||
const selectDashboardTheme = context.querySelector('#selectDashboardTheme');
|
||||
|
||||
fillThemes(selectTheme);
|
||||
fillThemes(selectDashboardTheme, true);
|
||||
fillThemes(context, userSettings);
|
||||
loadScreensavers(context, userSettings);
|
||||
loadSoundEffects(context, userSettings);
|
||||
loadSkins(context, userSettings);
|
||||
|
||||
context.querySelector('.chkDisplayMissingEpisodes').checked = user.Configuration.DisplayMissingEpisodes || false;
|
||||
|
||||
|
@ -198,9 +126,6 @@ import 'emby-button';
|
|||
|
||||
context.querySelector('#txtLibraryPageSize').value = userSettings.libraryPageSize();
|
||||
|
||||
selectDashboardTheme.value = userSettings.dashboardTheme() || '';
|
||||
selectTheme.value = userSettings.theme() || '';
|
||||
|
||||
context.querySelector('.selectLayout').value = layoutManager.getSavedLayout() || '';
|
||||
|
||||
showOrHideMissingEpisodesField(context);
|
||||
|
@ -209,8 +134,6 @@ import 'emby-button';
|
|||
}
|
||||
|
||||
function saveUser(context, user, userSettingsInstance, apiClient) {
|
||||
appSettings.runAtStartup(context.querySelector('.chkRunAtStartup').checked);
|
||||
|
||||
user.Configuration.DisplayMissingEpisodes = context.querySelector('.chkDisplayMissingEpisodes').checked;
|
||||
|
||||
if (appHost.supports('displaylanguage')) {
|
||||
|
@ -221,15 +144,11 @@ import 'emby-button';
|
|||
|
||||
userSettingsInstance.enableThemeSongs(context.querySelector('#chkThemeSong').checked);
|
||||
userSettingsInstance.enableThemeVideos(context.querySelector('#chkThemeVideo').checked);
|
||||
userSettingsInstance.dashboardTheme(context.querySelector('#selectDashboardTheme').value);
|
||||
userSettingsInstance.theme(context.querySelector('#selectTheme').value);
|
||||
userSettingsInstance.soundEffects(context.querySelector('.selectSoundEffects').value);
|
||||
userSettingsInstance.screensaver(context.querySelector('.selectScreensaver').value);
|
||||
|
||||
userSettingsInstance.libraryPageSize(context.querySelector('#txtLibraryPageSize').value);
|
||||
|
||||
userSettingsInstance.skin(context.querySelector('.selectSkin').value);
|
||||
|
||||
userSettingsInstance.enableFastFadein(context.querySelector('#chkFadein').checked);
|
||||
userSettingsInstance.enableBlurhash(context.querySelector('#chkBlurhash').checked);
|
||||
userSettingsInstance.enableBackdrops(context.querySelector('#chkBackdrops').checked);
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
<form style="margin: 0 auto;">
|
||||
|
||||
<h2 class="sectionTitle">
|
||||
${Display}
|
||||
</h2>
|
||||
|
@ -123,26 +122,14 @@
|
|||
<div class="fieldDescription">${LabelPleaseRestart}</div>
|
||||
</div>
|
||||
|
||||
<div class="selectContainer hide selectSkinContainer">
|
||||
<select is="emby-select" class="selectSkin" label="${LabelSkin}"></select>
|
||||
</div>
|
||||
|
||||
<div class="selectContainer">
|
||||
<select id="selectTheme" is="emby-select" label="${LabelTheme}"></select>
|
||||
</div>
|
||||
|
||||
<div class="selectContainer selectDashboardThemeContainer hide">
|
||||
<select id="selectDashboardTheme" is="emby-select" label="${LabelDashboardTheme}"></select>
|
||||
</div>
|
||||
|
||||
<div class="selectContainer hide selectScreensaverContainer">
|
||||
<select is="emby-select" class="selectScreensaver" label="${LabelScreensaver}"></select>
|
||||
</div>
|
||||
|
||||
<div class="selectContainer fldSoundEffects hide">
|
||||
<select is="emby-select" class="selectSoundEffects" label="${LabelSoundEffects}"></select>
|
||||
</div>
|
||||
|
||||
<div class="inputContainer inputContainer-withDescription">
|
||||
<input is="emby-input" type="number" id="txtLibraryPageSize" pattern="[0-9]*" required="required" min="0" max="1000" step="1" label="${LabelLibraryPageSize}" />
|
||||
<div class="fieldDescription">${LabelLibraryPageSizeHelp}</div>
|
||||
|
@ -159,9 +146,9 @@
|
|||
<div class="checkboxContainer checkboxContainer-withDescription">
|
||||
<label>
|
||||
<input type="checkbox" is="emby-checkbox" id="chkBlurhash" />
|
||||
<span>${EnableBlurhash}</span>
|
||||
<span>${EnableBlurHash}</span>
|
||||
</label>
|
||||
<div class="fieldDescription checkboxFieldDescription">${EnableBlurhashHelp}</div>
|
||||
<div class="fieldDescription checkboxFieldDescription">${EnableBlurHashHelp}</div>
|
||||
</div>
|
||||
|
||||
<div class="checkboxContainer checkboxContainer-withDescription">
|
||||
|
@ -196,13 +183,6 @@
|
|||
<div class="fieldDescription checkboxFieldDescription">${EnableThemeVideosHelp}</div>
|
||||
</div>
|
||||
|
||||
<div class="checkboxContainer hide fldAutorun">
|
||||
<label>
|
||||
<input type="checkbox" is="emby-checkbox" class="chkRunAtStartup" />
|
||||
<span>${RunAtStartup}</span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="checkboxContainer checkboxContainer-withDescription fldDisplayMissingEpisodes hide">
|
||||
<label>
|
||||
<input type="checkbox" is="emby-checkbox" class="chkDisplayMissingEpisodes" />
|
||||
|
|
|
@ -1,5 +1,14 @@
|
|||
define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoader', 'globalize', 'layoutManager', 'scrollStyles', 'emby-itemscontainer'], function (loading, libraryBrowser, cardBuilder, dom, appHost, imageLoader, globalize, layoutManager) {
|
||||
'use strict';
|
||||
import loading from 'loading';
|
||||
import cardBuilder from 'cardBuilder';
|
||||
import dom from 'dom';
|
||||
import appHost from 'apphost';
|
||||
import imageLoader from 'imageLoader';
|
||||
import globalize from 'globalize';
|
||||
import layoutManager from 'layoutManager';
|
||||
import 'scrollStyles';
|
||||
import 'emby-itemscontainer';
|
||||
|
||||
/* eslint-disable indent */
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop;
|
||||
|
@ -94,8 +103,8 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
|
|||
}
|
||||
|
||||
function loadSection(elem, userId, topParentId, section, isSingleSection) {
|
||||
var screenWidth = dom.getWindowSize().innerWidth;
|
||||
var options = {
|
||||
const screenWidth = dom.getWindowSize().innerWidth;
|
||||
const options = {
|
||||
SortBy: 'SortName',
|
||||
SortOrder: 'Ascending',
|
||||
Filters: 'IsFavorite',
|
||||
|
@ -118,7 +127,7 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
|
|||
}
|
||||
}
|
||||
|
||||
var promise;
|
||||
let promise;
|
||||
|
||||
if (section.types === 'MusicArtist') {
|
||||
promise = ApiClient.getArtists(userId, options);
|
||||
|
@ -128,7 +137,7 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
|
|||
}
|
||||
|
||||
return promise.then(function (result) {
|
||||
var html = '';
|
||||
let html = '';
|
||||
|
||||
if (result.Items.length) {
|
||||
if (html += '<div class="sectionTitleContainer sectionTitleContainer-cards padded-left">', !layoutManager.tv && options.Limit && result.Items.length >= options.Limit) {
|
||||
|
@ -144,7 +153,7 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
|
|||
|
||||
html += '</div>';
|
||||
if (enableScrollX()) {
|
||||
var scrollXClass = 'scrollX hiddenScrollX';
|
||||
let scrollXClass = 'scrollX hiddenScrollX';
|
||||
if (layoutManager.tv) {
|
||||
scrollXClass += ' smoothScrollX';
|
||||
}
|
||||
|
@ -154,7 +163,7 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
|
|||
html += '<div is="emby-itemscontainer" class="itemsContainer vertical-wrap padded-left padded-right">';
|
||||
}
|
||||
|
||||
var cardLayout = appHost.preferVisualCards && section.autoCardLayout && section.showTitle;
|
||||
let cardLayout = appHost.preferVisualCards && section.autoCardLayout && section.showTitle;
|
||||
cardLayout = false;
|
||||
html += cardBuilder.getCardsHtml(result.Items, {
|
||||
preferThumb: section.preferThumb,
|
||||
|
@ -179,10 +188,10 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
|
|||
});
|
||||
}
|
||||
|
||||
function loadSections(page, userId, topParentId, types) {
|
||||
export function loadSections(page, userId, topParentId, types) {
|
||||
loading.show();
|
||||
var sections = getSections();
|
||||
var sectionid = getParameterByName('sectionid');
|
||||
let sections = getSections();
|
||||
const sectionid = getParameterByName('sectionid');
|
||||
|
||||
if (sectionid) {
|
||||
sections = sections.filter(function (s) {
|
||||
|
@ -196,24 +205,22 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
|
|||
});
|
||||
}
|
||||
|
||||
var i;
|
||||
var length;
|
||||
var elem = page.querySelector('.favoriteSections');
|
||||
let elem = page.querySelector('.favoriteSections');
|
||||
|
||||
if (!elem.innerHTML) {
|
||||
var html = '';
|
||||
let html = '';
|
||||
|
||||
for (i = 0, length = sections.length; i < length; i++) {
|
||||
for (let i = 0, length = sections.length; i < length; i++) {
|
||||
html += '<div class="verticalSection section' + sections[i].id + '"></div>';
|
||||
}
|
||||
|
||||
elem.innerHTML = html;
|
||||
}
|
||||
|
||||
var promises = [];
|
||||
const promises = [];
|
||||
|
||||
for (i = 0, length = sections.length; i < length; i++) {
|
||||
var section = sections[i];
|
||||
for (let i = 0, length = sections.length; i < length; i++) {
|
||||
const section = sections[i];
|
||||
elem = page.querySelector('.section' + section.id);
|
||||
promises.push(loadSection(elem, userId, topParentId, section, sections.length === 1));
|
||||
}
|
||||
|
@ -223,7 +230,8 @@ define(['loading', 'libraryBrowser', 'cardBuilder', 'dom', 'apphost', 'imageLoad
|
|||
});
|
||||
}
|
||||
|
||||
return {
|
||||
export default {
|
||||
render: loadSections
|
||||
};
|
||||
});
|
||||
|
||||
/* eslint-enable indent */
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
define(['require', 'inputManager', 'browser', 'globalize', 'connectionManager', 'scrollHelper', 'serverNotifications', 'loading', 'datetime', 'focusManager', 'playbackManager', 'userSettings', 'imageLoader', 'events', 'layoutManager', 'itemShortcuts', 'dom', 'css!./guide.css', 'programStyles', 'material-icons', 'scrollStyles', 'emby-programcell', 'emby-button', 'paper-icon-button-light', 'emby-tabs', 'emby-scroller', 'flexStyles', 'webcomponents'], function (require, inputManager, browser, globalize, connectionManager, scrollHelper, serverNotifications, loading, datetime, focusManager, playbackManager, userSettings, imageLoader, events, layoutManager, itemShortcuts, dom) {
|
||||
'use strict';
|
||||
|
||||
playbackManager = playbackManager.default || playbackManager;
|
||||
browser = browser.default || browser;
|
||||
loading = loading.default || loading;
|
||||
|
||||
function showViewSettings(instance) {
|
||||
require(['guide-settings-dialog'], function (guideSettingsDialog) {
|
||||
guideSettingsDialog.show(instance.categoryOptions).then(function () {
|
||||
|
|
|
@ -59,8 +59,8 @@ import 'css!./imageeditor';
|
|||
currentItem = item;
|
||||
|
||||
apiClient.getRemoteImageProviders(getBaseRemoteOptions()).then(function (providers) {
|
||||
const btnBrowseAllImages = page.querySelectorAll('.btnBrowseAllImages');
|
||||
for (let i = 0, length = btnBrowseAllImages.length; i < length; i++) {
|
||||
var btnBrowseAllImages = page.querySelectorAll('.btnBrowseAllImages');
|
||||
for (var i = 0, length = btnBrowseAllImages.length; i < length; i++) {
|
||||
if (providers.length) {
|
||||
btnBrowseAllImages[i].classList.remove('hide');
|
||||
} else {
|
||||
|
@ -217,7 +217,7 @@ import 'css!./imageeditor';
|
|||
reload(context, null, focusContext);
|
||||
}, function () {
|
||||
import('alert').then(({default: alert}) => {
|
||||
alert(globalize.translate('DefaultErrorMessage'));
|
||||
alert(globalize.translate('ErrorDefault'));
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -205,7 +205,7 @@ import 'css!./style';
|
|||
|
||||
/* eslint-enable indent */
|
||||
export default {
|
||||
serLazyImage: setLazyImage,
|
||||
setLazyImage: setLazyImage,
|
||||
fillImages: fillImages,
|
||||
fillImage: fillImage,
|
||||
lazyImage: lazyImage,
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['playbackManager', 'serverNotifications', 'events'], function (playbackManager, serverNotifications, events) {
|
||||
'use strict';
|
||||
|
||||
playbackManager = playbackManager.default || playbackManager;
|
||||
|
||||
function onUserDataChanged(e, apiClient, userData) {
|
||||
var instance = this;
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['browser', 'appSettings', 'events'], function (browser, appSettings, events) {
|
||||
'use strict';
|
||||
|
||||
browser = browser.default || browser;
|
||||
|
||||
function setLayout(instance, layout, selectedLayout) {
|
||||
if (layout === selectedLayout) {
|
||||
instance[layout] = true;
|
||||
|
|
|
@ -1,17 +1,15 @@
|
|||
define(['css!./loading'], function () {
|
||||
'use strict';
|
||||
import 'css!./loading';
|
||||
|
||||
var loadingElem;
|
||||
var layer1;
|
||||
var layer2;
|
||||
var layer3;
|
||||
var layer4;
|
||||
var circleLefts;
|
||||
var circleRights;
|
||||
let loadingElem;
|
||||
let layer1;
|
||||
let layer2;
|
||||
let layer3;
|
||||
let layer4;
|
||||
let circleLefts;
|
||||
let circleRights;
|
||||
|
||||
return {
|
||||
show: function () {
|
||||
var elem = loadingElem;
|
||||
export function show() {
|
||||
let elem = loadingElem;
|
||||
|
||||
if (!elem) {
|
||||
elem = document.createElement('div');
|
||||
|
@ -40,19 +38,17 @@ define(['css!./loading'], function () {
|
|||
layer3.classList.add('mdl-spinner__layer-3-active');
|
||||
layer4.classList.add('mdl-spinner__layer-4-active');
|
||||
|
||||
var i;
|
||||
var length;
|
||||
|
||||
for (i = 0, length = circleLefts.length; i < length; i++) {
|
||||
for (let i = 0, length = circleLefts.length; i < length; i++) {
|
||||
circleLefts[i].classList.add('mdl-spinner__circleLeft-active');
|
||||
}
|
||||
|
||||
for (i = 0, length = circleRights.length; i < length; i++) {
|
||||
for (let i = 0, length = circleRights.length; i < length; i++) {
|
||||
circleRights[i].classList.add('mdl-spinner__circleRight-active');
|
||||
}
|
||||
},
|
||||
hide: function () {
|
||||
var elem = loadingElem;
|
||||
}
|
||||
|
||||
export function hide() {
|
||||
const elem = loadingElem;
|
||||
|
||||
if (elem) {
|
||||
elem.classList.remove('mdlSpinnerActive');
|
||||
|
@ -62,17 +58,17 @@ define(['css!./loading'], function () {
|
|||
elem.classList.remove('mdl-spinner__layer-3-active');
|
||||
elem.classList.remove('mdl-spinner__layer-4-active');
|
||||
|
||||
var i;
|
||||
var length;
|
||||
|
||||
for (i = 0, length = circleLefts.length; i < length; i++) {
|
||||
for (let i = 0, length = circleLefts.length; i < length; i++) {
|
||||
circleLefts[i].classList.remove('mdl-spinner__circleLeft-active');
|
||||
}
|
||||
|
||||
for (i = 0, length = circleRights.length; i < length; i++) {
|
||||
for (let i = 0, length = circleRights.length; i < length; i++) {
|
||||
circleRights[i].classList.remove('mdl-spinner__circleRight-active');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
show: show,
|
||||
hide: hide
|
||||
};
|
||||
});
|
||||
|
|
|
@ -85,7 +85,7 @@ import 'flexStyles';
|
|||
refreshLibraryFromServer(dom.parentWithClass(button, 'dlg-libraryeditor'));
|
||||
}, () => {
|
||||
import('toast').then(({default: toast}) => {
|
||||
toast(globalize.translate('DefaultErrorMessage'));
|
||||
toast(globalize.translate('ErrorDefault'));
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['serverNotifications', 'playbackManager', 'events', 'globalize', 'require'], function (serverNotifications, playbackManager, events, globalize, require) {
|
||||
'use strict';
|
||||
|
||||
playbackManager = playbackManager.default || playbackManager;
|
||||
|
||||
function onOneDocumentClick() {
|
||||
document.removeEventListener('click', onOneDocumentClick);
|
||||
document.removeEventListener('keydown', onOneDocumentClick);
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -104,7 +104,7 @@ define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'c
|
|||
var apiClient = connectionManager.getApiClient(serverId);
|
||||
|
||||
apiClient.getLiveTvProgram(programId, apiClient.getCurrentUserId()).then(function (item) {
|
||||
playbackManager.play({
|
||||
playbackManager.default.play({
|
||||
ids: [item.ChannelId],
|
||||
serverId: serverId
|
||||
});
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'scrollStyles', 'emby-button', 'emby-collapse', 'emby-input', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons', 'flexStyles'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
|
||||
var currentDialog;
|
||||
var recordingDeleted = false;
|
||||
var currentItemId;
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['globalize', 'connectionManager', 'serverNotifications', 'require', 'loading', 'apphost', 'dom', 'recordingHelper', 'events', 'paper-icon-button-light', 'emby-button', 'css!./recordingfields', 'flexStyles'], function (globalize, connectionManager, serverNotifications, require, loading, appHost, dom, recordingHelper, events) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
|
||||
function loadData(parent, program, apiClient) {
|
||||
if (program.IsSeries) {
|
||||
parent.querySelector('.recordSeriesContainer').classList.remove('hide');
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['globalize', 'loading', 'connectionManager'], function (globalize, loading, connectionManager) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
|
||||
function changeRecordingToSeries(apiClient, timerId, programId, confirmTimerCancellation) {
|
||||
loading.show();
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['dialogHelper', 'globalize', 'layoutManager', 'mediaInfo', 'apphost', 'connectionManager', 'require', 'loading', 'scrollHelper', 'imageLoader', 'datetime', 'scrollStyles', 'emby-button', 'emby-checkbox', 'emby-input', 'emby-select', 'paper-icon-button-light', 'css!./../formdialog', 'css!./recordingcreator', 'material-icons', 'flexStyles'], function (dialogHelper, globalize, layoutManager, mediaInfo, appHost, connectionManager, require, loading, scrollHelper, imageLoader, datetime) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
|
||||
var currentDialog;
|
||||
var recordingUpdated = false;
|
||||
var recordingDeleted = false;
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageLoader', 'playbackManager', 'nowPlayingHelper', 'events', 'connectionManager', 'apphost', 'globalize', 'layoutManager', 'userSettings', 'cardBuilder', 'itemContextMenu', 'cardStyle', 'emby-itemscontainer', 'css!./remotecontrol.css', 'emby-ratingbutton'], function (browser, datetime, backdrop, libraryBrowser, listView, imageLoader, playbackManager, nowPlayingHelper, events, connectionManager, appHost, globalize, layoutManager, userSettings, cardBuilder, itemContextMenu) {
|
||||
'use strict';
|
||||
|
||||
playbackManager = playbackManager.default || playbackManager;
|
||||
|
||||
var showMuteButton = true;
|
||||
var showVolumeSlider = true;
|
||||
|
||||
|
@ -119,9 +122,9 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
|
|||
var nowPlayingServerId = (item.ServerId || serverId);
|
||||
if (item.Type == 'Audio' || item.MediaStreams[0].Type == 'Audio') {
|
||||
var songName = item.Name;
|
||||
if (item.Album != null && item.Artists != null) {
|
||||
var artistsSeries = '';
|
||||
var albumName = item.Album;
|
||||
var albumName = '';
|
||||
if (item.Artists != null) {
|
||||
if (item.ArtistItems != null) {
|
||||
for (const artist of item.ArtistItems) {
|
||||
let artistName = artist.Name;
|
||||
|
@ -142,9 +145,12 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
|
|||
}
|
||||
}
|
||||
}
|
||||
context.querySelector('.nowPlayingArtist').innerHTML = artistsSeries;
|
||||
context.querySelector('.nowPlayingAlbum').innerHTML = '<a class="button-link emby-button" is="emby-linkbutton" href="details?id=' + item.AlbumId + `&serverId=${nowPlayingServerId}">${albumName}</a>`;
|
||||
}
|
||||
if (item.Album != null) {
|
||||
albumName = '<a class="button-link emby-button" is="emby-linkbutton" href="details?id=' + item.AlbumId + `&serverId=${nowPlayingServerId}">` + item.Album + '</a>';
|
||||
}
|
||||
context.querySelector('.nowPlayingAlbum').innerHTML = albumName;
|
||||
context.querySelector('.nowPlayingArtist').innerHTML = artistsSeries;
|
||||
context.querySelector('.nowPlayingSongName').innerHTML = songName;
|
||||
} else if (item.Type == 'Episode') {
|
||||
if (item.SeasonName != null) {
|
||||
|
|
|
@ -1,184 +0,0 @@
|
|||
define(['apphost', 'userSettings', 'browser', 'events', 'backdrop', 'globalize', 'require', 'appSettings'], function (appHost, userSettings, browser, events, backdrop, globalize, require, appSettings) {
|
||||
'use strict';
|
||||
|
||||
var themeStyleElement;
|
||||
var currentThemeId;
|
||||
|
||||
function unloadTheme() {
|
||||
var elem = themeStyleElement;
|
||||
if (elem) {
|
||||
elem.parentNode.removeChild(elem);
|
||||
themeStyleElement = null;
|
||||
currentThemeId = null;
|
||||
}
|
||||
}
|
||||
|
||||
function loadUserSkin(options) {
|
||||
options = options || {};
|
||||
if (options.start) {
|
||||
Emby.Page.invokeShortcut(options.start);
|
||||
} else {
|
||||
Emby.Page.goHome();
|
||||
}
|
||||
}
|
||||
|
||||
function getThemes() {
|
||||
return [{
|
||||
name: 'Apple TV',
|
||||
id: 'appletv'
|
||||
}, {
|
||||
name: 'Blue Radiance',
|
||||
id: 'blueradiance'
|
||||
}, {
|
||||
name: 'Dark',
|
||||
id: 'dark',
|
||||
isDefault: true,
|
||||
isDefaultServerDashboard: true
|
||||
}, {
|
||||
name: 'Light',
|
||||
id: 'light'
|
||||
}, {
|
||||
name: 'Purple Haze',
|
||||
id: 'purplehaze'
|
||||
}, {
|
||||
name: 'Windows Media Center',
|
||||
id: 'wmc'
|
||||
}];
|
||||
}
|
||||
|
||||
var skinManager = {
|
||||
getThemes: getThemes,
|
||||
loadUserSkin: loadUserSkin
|
||||
};
|
||||
|
||||
function getThemeStylesheetInfo(id, isDefaultProperty) {
|
||||
var themes = skinManager.getThemes();
|
||||
var defaultTheme;
|
||||
var selectedTheme;
|
||||
|
||||
for (var i = 0, length = themes.length; i < length; i++) {
|
||||
var theme = themes[i];
|
||||
if (theme[isDefaultProperty]) {
|
||||
defaultTheme = theme;
|
||||
}
|
||||
if (id === theme.id) {
|
||||
selectedTheme = theme;
|
||||
}
|
||||
}
|
||||
|
||||
selectedTheme = selectedTheme || defaultTheme;
|
||||
return {
|
||||
stylesheetPath: require.toUrl('themes/' + selectedTheme.id + '/theme.css'),
|
||||
themeId: selectedTheme.id
|
||||
};
|
||||
}
|
||||
|
||||
var themeResources = {};
|
||||
var lastSound = 0;
|
||||
var currentSound;
|
||||
|
||||
function loadThemeResources(id) {
|
||||
lastSound = 0;
|
||||
if (currentSound) {
|
||||
currentSound.stop();
|
||||
currentSound = null;
|
||||
}
|
||||
|
||||
backdrop.clearBackdrop();
|
||||
}
|
||||
|
||||
function onThemeLoaded() {
|
||||
document.documentElement.classList.remove('preload');
|
||||
try {
|
||||
var color = getComputedStyle(document.querySelector('.skinHeader')).getPropertyValue('background-color');
|
||||
if (color) {
|
||||
appHost.setThemeColor(color);
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('error setting theme color: ' + err);
|
||||
}
|
||||
}
|
||||
|
||||
skinManager.setTheme = function (id, context) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
if (currentThemeId && currentThemeId === id) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
var isDefaultProperty = context === 'serverdashboard' ? 'isDefaultServerDashboard' : 'isDefault';
|
||||
var info = getThemeStylesheetInfo(id, isDefaultProperty);
|
||||
if (currentThemeId && currentThemeId === info.themeId) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
var linkUrl = info.stylesheetPath;
|
||||
unloadTheme();
|
||||
|
||||
var link = document.createElement('link');
|
||||
link.setAttribute('rel', 'stylesheet');
|
||||
link.setAttribute('type', 'text/css');
|
||||
link.onload = function () {
|
||||
onThemeLoaded();
|
||||
resolve();
|
||||
};
|
||||
|
||||
link.setAttribute('href', linkUrl);
|
||||
document.head.appendChild(link);
|
||||
themeStyleElement = link;
|
||||
currentThemeId = info.themeId;
|
||||
loadThemeResources(info.themeId);
|
||||
|
||||
onViewBeforeShow({});
|
||||
});
|
||||
};
|
||||
|
||||
function onViewBeforeShow(e) {
|
||||
if (e.detail && e.detail.type === 'video-osd') {
|
||||
// This removes the space that the scrollbar takes while playing a video
|
||||
document.body.classList.remove('force-scroll');
|
||||
return;
|
||||
}
|
||||
|
||||
if (themeResources.backdrop) {
|
||||
backdrop.setBackdrop(themeResources.backdrop);
|
||||
}
|
||||
|
||||
if (!browser.mobile && userSettings.enableThemeSongs()) {
|
||||
if (lastSound === 0) {
|
||||
if (themeResources.themeSong) {
|
||||
playSound(themeResources.themeSong);
|
||||
}
|
||||
} else if ((new Date().getTime() - lastSound) > 30000) {
|
||||
if (themeResources.effect) {
|
||||
playSound(themeResources.effect);
|
||||
}
|
||||
}
|
||||
}
|
||||
// This keeps the scrollbar always present in all pages, so we avoid clipping while switching between pages
|
||||
// that need the scrollbar and pages that don't.
|
||||
document.body.classList.add('force-scroll');
|
||||
}
|
||||
|
||||
document.addEventListener('viewshow', onViewBeforeShow);
|
||||
|
||||
function playSound(path, volume) {
|
||||
lastSound = new Date().getTime();
|
||||
require(['howler'], function (howler) {
|
||||
/* globals Howl */
|
||||
try {
|
||||
var sound = new Howl({
|
||||
src: [path],
|
||||
volume: volume || 0.1
|
||||
});
|
||||
sound.play();
|
||||
currentSound = sound;
|
||||
} catch (err) {
|
||||
console.error('error playing sound: ' + err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return skinManager;
|
||||
});
|
|
@ -5,6 +5,8 @@
|
|||
define(['dialogHelper', 'inputManager', 'connectionManager', 'layoutManager', 'focusManager', 'browser', 'apphost', 'dom', 'css!./style', 'material-icons', 'paper-icon-button-light'], function (dialogHelper, inputManager, connectionManager, layoutManager, focusManager, browser, appHost, dom) {
|
||||
'use strict';
|
||||
|
||||
browser = browser.default || browser;
|
||||
|
||||
/**
|
||||
* Name of transition event.
|
||||
*/
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['dialogHelper', 'require', 'layoutManager', 'globalize', 'userSettings', 'connectionManager', 'loading', 'focusManager', 'dom', 'apphost', 'emby-select', 'listViewStyle', 'paper-icon-button-light', 'css!./../formdialog', 'material-icons', 'css!./subtitleeditor', 'emby-button', 'flexStyles'], function (dialogHelper, require, layoutManager, globalize, userSettings, connectionManager, loading, focusManager, dom, appHost) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
|
||||
var currentItem;
|
||||
var hasChanges;
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['playbackManager', 'layoutManager', 'text!./subtitlesync.template.html', 'css!./subtitlesync'], function (playbackManager, layoutManager, template, css) {
|
||||
'use strict';
|
||||
|
||||
playbackManager = playbackManager.default || playbackManager;
|
||||
|
||||
var player;
|
||||
var subtitleSyncSlider;
|
||||
var subtitleSyncTextField;
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['playbackManager', 'userSettings', 'connectionManager'], function (playbackManager, userSettings, connectionManager) {
|
||||
'use strict';
|
||||
|
||||
playbackManager = playbackManager.default || playbackManager;
|
||||
|
||||
var currentOwnerId;
|
||||
var currentThemeIds = [];
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
define(['css!./toast'], function () {
|
||||
'use strict';
|
||||
import 'css!./toast';
|
||||
|
||||
function remove(elem) {
|
||||
setTimeout(function () {
|
||||
|
@ -14,14 +13,14 @@ define(['css!./toast'], function () {
|
|||
}, 3300);
|
||||
}
|
||||
|
||||
return function (options) {
|
||||
export default function (options) {
|
||||
if (typeof options === 'string') {
|
||||
options = {
|
||||
text: options
|
||||
};
|
||||
}
|
||||
|
||||
var elem = document.createElement('div');
|
||||
const elem = document.createElement('div');
|
||||
elem.classList.add('toast');
|
||||
elem.innerHTML = options.text;
|
||||
|
||||
|
@ -32,5 +31,4 @@ define(['css!./toast'], function () {
|
|||
|
||||
animateRemove(elem);
|
||||
}, 300);
|
||||
};
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
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';
|
||||
|
||||
browser = browser.default || browser;
|
||||
loading = loading.default || loading;
|
||||
|
||||
var enableFocusTransform = !browser.slow && !browser.edge;
|
||||
|
||||
function getEditorHtml() {
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'listViewStyle', 'emby-input', 'emby-select', 'emby-button', 'flexStyles'], function ($, loading, globalize) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
|
||||
return function (page, providerId, options) {
|
||||
function reload() {
|
||||
loading.show();
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['jQuery', 'loading', 'globalize', 'emby-checkbox', 'emby-input', 'listViewStyle', 'paper-icon-button-light'], function ($, loading, globalize) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
|
||||
return function (page, providerId, options) {
|
||||
function getListingProvider(config, id) {
|
||||
if (config && id) {
|
||||
|
|
|
@ -1,7 +1,19 @@
|
|||
define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'layoutManager', 'focusManager', 'globalize', 'itemHelper', 'css!./upnextdialog', 'emby-button', 'flexStyles'], function (dom, playbackManager, connectionManager, events, mediaInfo, layoutManager, focusManager, globalize, itemHelper) {
|
||||
'use strict';
|
||||
import dom from 'dom';
|
||||
import playbackManager from 'playbackManager';
|
||||
import connectionManager from 'connectionManager';
|
||||
import events from 'events';
|
||||
import mediaInfo from 'mediaInfo';
|
||||
import layoutManager from 'layoutManager';
|
||||
import focusManager from 'focusManager';
|
||||
import globalize from 'globalize';
|
||||
import itemHelper from 'itemHelper';
|
||||
import 'css!./upnextdialog';
|
||||
import 'emby-button';
|
||||
import 'flexStyles';
|
||||
|
||||
var transitionEndEventName = dom.whichTransitionEvent();
|
||||
/* eslint-disable indent */
|
||||
|
||||
const transitionEndEventName = dom.whichTransitionEvent();
|
||||
|
||||
function seriesImageUrl(item, options) {
|
||||
if (item.Type !== 'Episode') {
|
||||
|
@ -56,7 +68,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
|
|||
|
||||
function setPoster(osdPoster, item, secondaryItem) {
|
||||
if (item) {
|
||||
var imgUrl = seriesImageUrl(item, { type: 'Primary' }) ||
|
||||
let imgUrl = seriesImageUrl(item, { type: 'Primary' }) ||
|
||||
seriesImageUrl(item, { type: 'Thumb' }) ||
|
||||
imageUrl(item, { type: 'Primary' });
|
||||
|
||||
|
@ -76,7 +88,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
|
|||
}
|
||||
|
||||
function getHtml() {
|
||||
var html = '';
|
||||
let html = '';
|
||||
|
||||
html += '<div class="upNextDialog-poster">';
|
||||
html += '</div>';
|
||||
|
@ -112,17 +124,17 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
|
|||
}
|
||||
|
||||
function setNextVideoText() {
|
||||
var instance = this;
|
||||
const instance = this;
|
||||
|
||||
var elem = instance.options.parent;
|
||||
const elem = instance.options.parent;
|
||||
|
||||
var secondsRemaining = Math.max(Math.round(getTimeRemainingMs(instance) / 1000), 0);
|
||||
const secondsRemaining = Math.max(Math.round(getTimeRemainingMs(instance) / 1000), 0);
|
||||
|
||||
console.debug('up next seconds remaining: ' + secondsRemaining);
|
||||
|
||||
var timeText = '<span class="upNextDialog-countdownText">' + globalize.translate('HeaderSecondsValue', secondsRemaining) + '</span>';
|
||||
const timeText = '<span class="upNextDialog-countdownText">' + globalize.translate('HeaderSecondsValue', secondsRemaining) + '</span>';
|
||||
|
||||
var nextVideoText = instance.itemType === 'Episode' ?
|
||||
const nextVideoText = instance.itemType === 'Episode' ?
|
||||
globalize.translate('HeaderNextEpisodePlayingInValue', timeText) :
|
||||
globalize.translate('HeaderNextVideoPlayingInValue', timeText);
|
||||
|
||||
|
@ -130,9 +142,9 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
|
|||
}
|
||||
|
||||
function fillItem(item) {
|
||||
var instance = this;
|
||||
const instance = this;
|
||||
|
||||
var elem = instance.options.parent;
|
||||
const elem = instance.options.parent;
|
||||
|
||||
setPoster(elem.querySelector('.upNextDialog-poster'), item);
|
||||
|
||||
|
@ -141,7 +153,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
|
|||
elem.querySelector('.upNextDialog-mediainfo').innerHTML = mediaInfo.getPrimaryMediaInfoHtml(item, {
|
||||
});
|
||||
|
||||
var title = itemHelper.getDisplayName(item);
|
||||
let title = itemHelper.getDisplayName(item);
|
||||
if (item.SeriesName) {
|
||||
title = item.SeriesName + ' - ' + title;
|
||||
}
|
||||
|
@ -161,10 +173,10 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
|
|||
}
|
||||
|
||||
function onStartNowClick() {
|
||||
var options = this.options;
|
||||
const options = this.options;
|
||||
|
||||
if (options) {
|
||||
var player = options.player;
|
||||
const player = options.player;
|
||||
|
||||
this.hide();
|
||||
|
||||
|
@ -186,7 +198,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
|
|||
}
|
||||
|
||||
function clearHideAnimationEventListeners(instance, elem) {
|
||||
var fn = instance._onHideAnimationComplete;
|
||||
const fn = instance._onHideAnimationComplete;
|
||||
|
||||
if (fn) {
|
||||
dom.removeEventListener(elem, transitionEndEventName, fn, {
|
||||
|
@ -196,8 +208,8 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
|
|||
}
|
||||
|
||||
function onHideAnimationComplete(e) {
|
||||
var instance = this;
|
||||
var elem = e.target;
|
||||
const instance = this;
|
||||
const elem = e.target;
|
||||
|
||||
elem.classList.add('hide');
|
||||
|
||||
|
@ -206,14 +218,14 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
|
|||
}
|
||||
|
||||
function hideComingUpNext() {
|
||||
var instance = this;
|
||||
const instance = this;
|
||||
clearCountdownTextTimeout(this);
|
||||
|
||||
if (!instance.options) {
|
||||
return;
|
||||
}
|
||||
|
||||
var elem = instance.options.parent;
|
||||
const elem = instance.options.parent;
|
||||
|
||||
if (!elem) {
|
||||
return;
|
||||
|
@ -230,7 +242,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
|
|||
|
||||
elem.classList.add('upNextDialog-hidden');
|
||||
|
||||
var fn = onHideAnimationComplete.bind(instance);
|
||||
const fn = onHideAnimationComplete.bind(instance);
|
||||
instance._onHideAnimationComplete = fn;
|
||||
|
||||
dom.addEventListener(elem, transitionEndEventName, fn, {
|
||||
|
@ -239,12 +251,12 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
|
|||
}
|
||||
|
||||
function getTimeRemainingMs(instance) {
|
||||
var options = instance.options;
|
||||
const options = instance.options;
|
||||
if (options) {
|
||||
var runtimeTicks = playbackManager.duration(options.player);
|
||||
const runtimeTicks = playbackManager.duration(options.player);
|
||||
|
||||
if (runtimeTicks) {
|
||||
var timeRemainingTicks = runtimeTicks - playbackManager.currentTime(options.player);
|
||||
const timeRemainingTicks = runtimeTicks - playbackManager.currentTime(options.player);
|
||||
|
||||
return Math.round(timeRemainingTicks / 10000);
|
||||
}
|
||||
|
@ -254,7 +266,7 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
|
|||
}
|
||||
|
||||
function startComingUpNextHideTimer(instance) {
|
||||
var timeRemainingMs = getTimeRemainingMs(instance);
|
||||
const timeRemainingMs = getTimeRemainingMs(instance);
|
||||
|
||||
if (timeRemainingMs <= 0) {
|
||||
return;
|
||||
|
@ -266,14 +278,14 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
|
|||
instance._countdownTextTimeout = setInterval(setNextVideoText.bind(instance), 400);
|
||||
}
|
||||
|
||||
function UpNextDialog(options) {
|
||||
class UpNextDialog {
|
||||
constructor(options) {
|
||||
this.options = options;
|
||||
|
||||
init(this, options);
|
||||
}
|
||||
|
||||
UpNextDialog.prototype.show = function () {
|
||||
var elem = this.options.parent;
|
||||
show() {
|
||||
const elem = this.options.parent;
|
||||
|
||||
clearHideAnimationEventListeners(this, elem);
|
||||
|
||||
|
@ -291,18 +303,18 @@ define(['dom', 'playbackManager', 'connectionManager', 'events', 'mediaInfo', 'l
|
|||
}
|
||||
|
||||
startComingUpNextHideTimer(this);
|
||||
};
|
||||
|
||||
UpNextDialog.prototype.hide = function () {
|
||||
}
|
||||
hide() {
|
||||
hideComingUpNext.call(this);
|
||||
};
|
||||
|
||||
UpNextDialog.prototype.destroy = function () {
|
||||
}
|
||||
destroy() {
|
||||
hideComingUpNext.call(this);
|
||||
|
||||
this.options = null;
|
||||
this.itemType = null;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return UpNextDialog;
|
||||
});
|
||||
export default UpNextDialog;
|
||||
|
||||
/* eslint-enable indent */
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewContainer'], function (browser, dom, layoutManager) {
|
||||
'use strict';
|
||||
import 'css!components/viewManager/viewContainer';
|
||||
/* eslint-disable indent */
|
||||
|
||||
function setControllerClass(view, options) {
|
||||
if (options.controllerFactory) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
var controllerUrl = view.getAttribute('data-controller');
|
||||
let controllerUrl = view.getAttribute('data-controller');
|
||||
|
||||
if (controllerUrl) {
|
||||
if (controllerUrl.indexOf('__plugin/') === 0) {
|
||||
|
@ -14,7 +14,7 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
|
|||
}
|
||||
|
||||
controllerUrl = Dashboard.getConfigurationResourceUrl(controllerUrl);
|
||||
return getRequirePromise([controllerUrl]).then(function (ControllerFactory) {
|
||||
return import(controllerUrl).then((ControllerFactory) => {
|
||||
options.controllerFactory = ControllerFactory;
|
||||
});
|
||||
}
|
||||
|
@ -22,36 +22,28 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
|
|||
return Promise.resolve();
|
||||
}
|
||||
|
||||
function getRequirePromise(deps) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
require(deps, resolve);
|
||||
});
|
||||
}
|
||||
|
||||
function loadView(options) {
|
||||
export function loadView(options) {
|
||||
if (!options.cancel) {
|
||||
var selected = selectedPageIndex;
|
||||
var previousAnimatable = selected === -1 ? null : allPages[selected];
|
||||
var pageIndex = selected + 1;
|
||||
const selected = selectedPageIndex;
|
||||
const previousAnimatable = selected === -1 ? null : allPages[selected];
|
||||
let pageIndex = selected + 1;
|
||||
|
||||
if (pageIndex >= pageContainerCount) {
|
||||
pageIndex = 0;
|
||||
}
|
||||
|
||||
var isPluginpage = options.url.toLowerCase().indexOf('/configurationpage') !== -1;
|
||||
var newViewInfo = normalizeNewView(options, isPluginpage);
|
||||
var newView = newViewInfo.elem;
|
||||
var modulesToLoad = [];
|
||||
const isPluginpage = options.url.toLowerCase().indexOf('/configurationpage') !== -1;
|
||||
const newViewInfo = normalizeNewView(options, isPluginpage);
|
||||
const newView = newViewInfo.elem;
|
||||
|
||||
return new Promise(function (resolve) {
|
||||
require(modulesToLoad, function () {
|
||||
var currentPage = allPages[pageIndex];
|
||||
return new Promise((resolve) => {
|
||||
const currentPage = allPages[pageIndex];
|
||||
|
||||
if (currentPage) {
|
||||
triggerDestroy(currentPage);
|
||||
}
|
||||
|
||||
var view = newView;
|
||||
let view = newView;
|
||||
|
||||
if (typeof view == 'string') {
|
||||
view = document.createElement('div');
|
||||
|
@ -62,8 +54,8 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
|
|||
|
||||
if (currentPage) {
|
||||
if (newViewInfo.hasScript && window.$) {
|
||||
view = $(view).appendTo(mainAnimatedPages)[0];
|
||||
mainAnimatedPages.removeChild(currentPage);
|
||||
view = $(view).appendTo(mainAnimatedPages)[0];
|
||||
} else {
|
||||
mainAnimatedPages.replaceChild(view, currentPage);
|
||||
}
|
||||
|
@ -79,7 +71,7 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
|
|||
view.setAttribute('data-type', options.type);
|
||||
}
|
||||
|
||||
var properties = [];
|
||||
const properties = [];
|
||||
|
||||
if (options.fullscreen) {
|
||||
properties.push('fullscreen');
|
||||
|
@ -90,7 +82,7 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
|
|||
}
|
||||
|
||||
allPages[pageIndex] = view;
|
||||
setControllerClass(view, options).then(function () {
|
||||
setControllerClass(view, options).then(() => {
|
||||
if (onBeforeChange) {
|
||||
onBeforeChange(view, false, options);
|
||||
}
|
||||
|
@ -111,7 +103,6 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
|
|||
resolve(view);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -125,28 +116,28 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
|
|||
html = replaceAll(html, '<\/script>--\x3e', '<\/script>');
|
||||
}
|
||||
|
||||
var wrapper = document.createElement('div');
|
||||
const wrapper = document.createElement('div');
|
||||
wrapper.innerHTML = html;
|
||||
return wrapper.querySelector('div[data-role="page"]');
|
||||
}
|
||||
|
||||
function normalizeNewView(options, isPluginpage) {
|
||||
var viewHtml = options.view;
|
||||
const viewHtml = options.view;
|
||||
|
||||
if (viewHtml.indexOf('data-role="page"') === -1) {
|
||||
return viewHtml;
|
||||
}
|
||||
|
||||
var hasScript = viewHtml.indexOf('<script') !== -1;
|
||||
var elem = parseHtml(viewHtml, hasScript);
|
||||
let hasScript = viewHtml.indexOf('<script') !== -1;
|
||||
const elem = parseHtml(viewHtml, hasScript);
|
||||
|
||||
if (hasScript) {
|
||||
hasScript = elem.querySelector('script') != null;
|
||||
}
|
||||
|
||||
var hasjQuery = false;
|
||||
var hasjQuerySelect = false;
|
||||
var hasjQueryChecked = false;
|
||||
let hasjQuery = false;
|
||||
let hasjQuerySelect = false;
|
||||
let hasjQueryChecked = false;
|
||||
|
||||
if (isPluginpage) {
|
||||
hasjQuery = viewHtml.indexOf('jQuery') != -1 || viewHtml.indexOf('$(') != -1 || viewHtml.indexOf('$.') != -1;
|
||||
|
@ -164,7 +155,7 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
|
|||
}
|
||||
|
||||
function beforeAnimate(allPages, newPageIndex, oldPageIndex) {
|
||||
for (var index = 0, length = allPages.length; index < length; index++) {
|
||||
for (let index = 0, length = allPages.length; index < length; index++) {
|
||||
if (newPageIndex !== index && oldPageIndex !== index) {
|
||||
allPages[index].classList.add('hide');
|
||||
}
|
||||
|
@ -172,33 +163,33 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
|
|||
}
|
||||
|
||||
function afterAnimate(allPages, newPageIndex) {
|
||||
for (var index = 0, length = allPages.length; index < length; index++) {
|
||||
for (let index = 0, length = allPages.length; index < length; index++) {
|
||||
if (newPageIndex !== index) {
|
||||
allPages[index].classList.add('hide');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function setOnBeforeChange(fn) {
|
||||
export function setOnBeforeChange(fn) {
|
||||
onBeforeChange = fn;
|
||||
}
|
||||
|
||||
function tryRestoreView(options) {
|
||||
var url = options.url;
|
||||
var index = currentUrls.indexOf(url);
|
||||
export function tryRestoreView(options) {
|
||||
const url = options.url;
|
||||
const index = currentUrls.indexOf(url);
|
||||
|
||||
if (index !== -1) {
|
||||
var animatable = allPages[index];
|
||||
var view = animatable;
|
||||
const animatable = allPages[index];
|
||||
const view = animatable;
|
||||
|
||||
if (view) {
|
||||
if (options.cancel) {
|
||||
return;
|
||||
}
|
||||
|
||||
var selected = selectedPageIndex;
|
||||
var previousAnimatable = selected === -1 ? null : allPages[selected];
|
||||
return setControllerClass(view, options).then(function () {
|
||||
const selected = selectedPageIndex;
|
||||
const previousAnimatable = selected === -1 ? null : allPages[selected];
|
||||
return setControllerClass(view, options).then(() => {
|
||||
if (onBeforeChange) {
|
||||
onBeforeChange(view, true, options);
|
||||
}
|
||||
|
@ -228,25 +219,28 @@ define(['browser', 'dom', 'layoutManager', 'css!components/viewManager/viewConta
|
|||
view.dispatchEvent(new CustomEvent('viewdestroy', {}));
|
||||
}
|
||||
|
||||
function reset() {
|
||||
export function reset() {
|
||||
allPages = [];
|
||||
currentUrls = [];
|
||||
mainAnimatedPages.innerHTML = '';
|
||||
selectedPageIndex = -1;
|
||||
}
|
||||
|
||||
var onBeforeChange;
|
||||
var mainAnimatedPages = document.querySelector('.mainAnimatedPages');
|
||||
var allPages = [];
|
||||
var currentUrls = [];
|
||||
var pageContainerCount = 3;
|
||||
var selectedPageIndex = -1;
|
||||
let onBeforeChange;
|
||||
const mainAnimatedPages = document.querySelector('.mainAnimatedPages');
|
||||
let allPages = [];
|
||||
let currentUrls = [];
|
||||
const pageContainerCount = 3;
|
||||
let selectedPageIndex = -1;
|
||||
reset();
|
||||
mainAnimatedPages.classList.remove('hide');
|
||||
return {
|
||||
|
||||
/* eslint-enable indent */
|
||||
|
||||
export default {
|
||||
loadView: loadView,
|
||||
tryRestoreView: tryRestoreView,
|
||||
reset: reset,
|
||||
setOnBeforeChange: setOnBeforeChange
|
||||
};
|
||||
});
|
||||
|
||||
|
|
|
@ -1,3 +1,38 @@
|
|||
{
|
||||
"multiserver": false
|
||||
"multiserver": false,
|
||||
"themes": [
|
||||
{
|
||||
"name": "Apple TV",
|
||||
"id": "appletv"
|
||||
}, {
|
||||
"name": "Blue Radiance",
|
||||
"id": "blueradiance"
|
||||
}, {
|
||||
"name": "Dark",
|
||||
"id": "dark",
|
||||
"default": true
|
||||
}, {
|
||||
"name": "Light",
|
||||
"id": "light"
|
||||
}, {
|
||||
"name": "Purple Haze",
|
||||
"id": "purplehaze"
|
||||
}, {
|
||||
"name": "WMC",
|
||||
"id": "wmc"
|
||||
}
|
||||
],
|
||||
"plugins": [
|
||||
"plugins/playAccessValidation/plugin",
|
||||
"plugins/experimentalWarnings/plugin",
|
||||
"plugins/htmlAudioPlayer/plugin",
|
||||
"plugins/htmlVideoPlayer/plugin",
|
||||
"plugins/photoPlayer/plugin",
|
||||
"plugins/bookPlayer/plugin",
|
||||
"plugins/youtubePlayer/plugin",
|
||||
"plugins/backdropScreensaver/plugin",
|
||||
"plugins/logoScreensaver/plugin",
|
||||
"plugins/sessionPlayer/plugin",
|
||||
"plugins/chromecastPlayer/plugin"
|
||||
]
|
||||
}
|
||||
|
|
|
@ -81,7 +81,7 @@ import libraryMenu from 'libraryMenu';
|
|||
updateEncoder(form);
|
||||
}, function () {
|
||||
import('alert').then(({default: alert}) => {
|
||||
alert(globalize.translate('DefaultErrorMessage'));
|
||||
alert(globalize.translate('ErrorDefault'));
|
||||
});
|
||||
|
||||
Dashboard.processServerConfigurationUpdateResult();
|
||||
|
|
|
@ -52,7 +52,7 @@ import 'emby-button';
|
|||
});
|
||||
}, function () {
|
||||
import('alert').then(({default: alert}) => {
|
||||
alert(globalize.translate('DefaultErrorMessage'));
|
||||
alert(globalize.translate('ErrorDefault'));
|
||||
});
|
||||
|
||||
Dashboard.processServerConfigurationUpdateResult();
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
define(['jQuery', 'emby-checkbox'], function ($) {
|
||||
'use strict';
|
||||
import $ from 'jQuery';
|
||||
import 'emby-checkbox';
|
||||
|
||||
function fillItems(elem, items, cssClass, idPrefix, currentList, isEnabledList) {
|
||||
var html = '<div class="checkboxList paperList" style="padding: .5em 1em;">';
|
||||
let html = '<div class="checkboxList paperList" style="padding: .5em 1em;">';
|
||||
html += items.map(function (u) {
|
||||
var isChecked = isEnabledList ? currentList.indexOf(u.Id) != -1 : currentList.indexOf(u.Id) == -1;
|
||||
var checkedHtml = isChecked ? ' checked="checked"' : '';
|
||||
const isChecked = isEnabledList ? currentList.indexOf(u.Id) != -1 : currentList.indexOf(u.Id) == -1;
|
||||
const checkedHtml = isChecked ? ' checked="checked"' : '';
|
||||
return '<label><input is="emby-checkbox" class="' + cssClass + '" type="checkbox" data-itemid="' + u.Id + '"' + checkedHtml + '/><span>' + u.Name + '</span></label>';
|
||||
}).join('');
|
||||
html += '</div>';
|
||||
|
@ -13,20 +13,20 @@ define(['jQuery', 'emby-checkbox'], function ($) {
|
|||
}
|
||||
|
||||
function reload(page) {
|
||||
var type = getParameterByName('type');
|
||||
var promise1 = ApiClient.getUsers();
|
||||
var promise2 = ApiClient.getNamedConfiguration(notificationsConfigurationKey);
|
||||
var promise3 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Types'));
|
||||
var promise4 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Services'));
|
||||
const type = getParameterByName('type');
|
||||
const promise1 = ApiClient.getUsers();
|
||||
const promise2 = ApiClient.getNamedConfiguration(notificationsConfigurationKey);
|
||||
const promise3 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Types'));
|
||||
const promise4 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Services'));
|
||||
Promise.all([promise1, promise2, promise3, promise4]).then(function (responses) {
|
||||
var users = responses[0];
|
||||
var notificationOptions = responses[1];
|
||||
var types = responses[2];
|
||||
var services = responses[3];
|
||||
var notificationConfig = notificationOptions.Options.filter(function (n) {
|
||||
const users = responses[0];
|
||||
const notificationOptions = responses[1];
|
||||
const types = responses[2];
|
||||
const services = responses[3];
|
||||
let notificationConfig = notificationOptions.Options.filter(function (n) {
|
||||
return n.Type == type;
|
||||
})[0];
|
||||
var typeInfo = types.filter(function (n) {
|
||||
const typeInfo = types.filter(function (n) {
|
||||
return n.Type == type;
|
||||
})[0] || {};
|
||||
|
||||
|
@ -56,13 +56,13 @@ define(['jQuery', 'emby-checkbox'], function ($) {
|
|||
}
|
||||
|
||||
function save(page) {
|
||||
var type = getParameterByName('type');
|
||||
var promise1 = ApiClient.getNamedConfiguration(notificationsConfigurationKey);
|
||||
const type = getParameterByName('type');
|
||||
const promise1 = ApiClient.getNamedConfiguration(notificationsConfigurationKey);
|
||||
// TODO: Check if this promise is really needed, as it's unused.
|
||||
var promise2 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Types'));
|
||||
const promise2 = ApiClient.getJSON(ApiClient.getUrl('Notifications/Types'));
|
||||
Promise.all([promise1, promise2]).then(function (responses) {
|
||||
var notificationOptions = responses[0];
|
||||
var notificationConfig = notificationOptions.Options.filter(function (n) {
|
||||
const notificationOptions = responses[0];
|
||||
let notificationConfig = notificationOptions.Options.filter(function (n) {
|
||||
return n.Type == type;
|
||||
})[0];
|
||||
|
||||
|
@ -102,9 +102,9 @@ define(['jQuery', 'emby-checkbox'], function ($) {
|
|||
return false;
|
||||
}
|
||||
|
||||
var notificationsConfigurationKey = 'notifications';
|
||||
const notificationsConfigurationKey = 'notifications';
|
||||
$(document).on('pageinit', '#notificationSettingPage', function () {
|
||||
var page = this;
|
||||
const page = this;
|
||||
$('#selectUsers', page).on('change', function () {
|
||||
if (this.value == 'Custom') {
|
||||
$('.selectCustomUsers', page).show();
|
||||
|
@ -116,4 +116,3 @@ define(['jQuery', 'emby-checkbox'], function ($) {
|
|||
}).on('pageshow', '#notificationSettingPage', function () {
|
||||
reload(this);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,14 +1,17 @@
|
|||
define(['loading', 'libraryMenu', 'globalize', 'listViewStyle', 'emby-button'], function(loading, libraryMenu, globalize) {
|
||||
'use strict';
|
||||
import loading from 'loading';
|
||||
import libraryMenu from 'libraryMenu';
|
||||
import globalize from 'globalize';
|
||||
import 'listViewStyle';
|
||||
import 'emby-button';
|
||||
|
||||
function reload(page) {
|
||||
loading.show();
|
||||
ApiClient.getJSON(ApiClient.getUrl('Notifications/Types')).then(function (list) {
|
||||
var html = '';
|
||||
var lastCategory = '';
|
||||
var showHelp = true;
|
||||
let html = '';
|
||||
let lastCategory = '';
|
||||
let showHelp = true;
|
||||
html += list.map(function (notification) {
|
||||
var itemHtml = '';
|
||||
let itemHtml = '';
|
||||
if (notification.Category !== lastCategory) {
|
||||
lastCategory = notification.Category;
|
||||
if (lastCategory) {
|
||||
|
@ -52,9 +55,8 @@ define(['loading', 'libraryMenu', 'globalize', 'listViewStyle', 'emby-button'],
|
|||
});
|
||||
}
|
||||
|
||||
return function(view, params) {
|
||||
export default function (view, params) {
|
||||
view.addEventListener('viewshow', function () {
|
||||
reload(view);
|
||||
});
|
||||
};
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'connectionManager', 'emby-button'], function ($, loading, libraryMenu, globalize, connectionManager) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
|
||||
function populateHistory(packageInfo, page) {
|
||||
var html = '';
|
||||
var length = Math.min(packageInfo.versions.length, 10);
|
||||
|
@ -79,7 +81,7 @@ define(['jQuery', 'loading', 'libraryMenu', 'globalize', 'connectionManager', 'e
|
|||
page.querySelector('#btnInstall').disabled = true;
|
||||
ApiClient.installPlugin(name, guid, version).then(function () {
|
||||
loading.hide();
|
||||
alertText(globalize.translate('PluginInstalledMessage'));
|
||||
alertText(globalize.translate('MessagePluginInstalled'));
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['loading', 'libraryMenu', 'globalize', 'cardStyle', 'emby-button', 'emby-checkbox', 'emby-select'], function (loading, libraryMenu, globalize) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
|
||||
function reloadList(page) {
|
||||
loading.show();
|
||||
var promise1 = ApiClient.getAvailablePlugins();
|
||||
|
|
|
@ -1,15 +1,17 @@
|
|||
define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button'], function (loading, libraryMenu, dom, globalize) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
|
||||
function deletePlugin(page, uniqueid, name) {
|
||||
var msg = globalize.translate('UninstallPluginConfirmation', name);
|
||||
|
||||
require(['confirm'], function (confirm) {
|
||||
confirm.default({
|
||||
title: globalize.translate('UninstallPluginHeader'),
|
||||
title: globalize.translate('HeaderUninstallPlugin'),
|
||||
text: msg,
|
||||
primary: 'delete',
|
||||
confirmText: globalize.translate('UninstallPluginHeader')
|
||||
confirmText: globalize.translate('HeaderUninstallPlugin')
|
||||
}).then(function () {
|
||||
loading.show();
|
||||
ApiClient.uninstallPlugin(uniqueid).then(function () {
|
||||
|
@ -21,7 +23,7 @@ define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button'
|
|||
|
||||
function showNoConfigurationMessage() {
|
||||
Dashboard.alert({
|
||||
message: globalize.translate('NoPluginConfigurationMessage')
|
||||
message: globalize.translate('MessageNoPluginConfiguration')
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -95,7 +97,7 @@ define(['loading', 'libraryMenu', 'dom', 'globalize', 'cardStyle', 'emby-button'
|
|||
html += '<div class="centerMessage">';
|
||||
html += '<h1>' + globalize.translate('MessageNoPluginsInstalled') + '</h1>';
|
||||
html += '<p><a is="emby-linkbutton" class="button-link" href="availableplugins.html">';
|
||||
html += globalize.translate('BrowsePluginCatalogMessage');
|
||||
html += globalize.translate('MessageBrowsePluginCatalog');
|
||||
html += '</a></p>';
|
||||
html += '</div>';
|
||||
}
|
||||
|
|
|
@ -89,7 +89,7 @@ import 'emby-checkbox';
|
|||
});
|
||||
}, function (response) {
|
||||
import('toast').then(({default: toast}) => {
|
||||
toast(globalize.translate('DefaultErrorMessage'));
|
||||
toast(globalize.translate('ErrorDefault'));
|
||||
});
|
||||
|
||||
loading.hide();
|
||||
|
|
|
@ -145,14 +145,14 @@ import 'emby-button';
|
|||
function resetPassword() {
|
||||
const msg = globalize.translate('PasswordResetConfirmation');
|
||||
import('confirm').then(({default: confirm}) => {
|
||||
confirm(msg, globalize.translate('PasswordResetHeader')).then(function () {
|
||||
confirm(msg, globalize.translate('HeaderResetPassword')).then(function () {
|
||||
const userId = params.userId;
|
||||
loading.show();
|
||||
ApiClient.resetUserPassword(userId).then(function () {
|
||||
loading.hide();
|
||||
Dashboard.alert({
|
||||
message: globalize.translate('PasswordResetComplete'),
|
||||
title: globalize.translate('PasswordResetHeader')
|
||||
title: globalize.translate('HeaderResetPassword')
|
||||
});
|
||||
loadUser(view, params);
|
||||
});
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
define(['loading', 'scripts/editorsidebar'], function (loading) {
|
||||
'use strict';
|
||||
import loading from 'loading';
|
||||
import 'scripts/editorsidebar';
|
||||
|
||||
function reload(context, itemId) {
|
||||
loading.show();
|
||||
|
||||
if (itemId) {
|
||||
require(['metadataEditor'], function ({default: metadataEditor}) {
|
||||
import('metadataEditor').then(({ default: metadataEditor }) => {
|
||||
metadataEditor.embed(context.querySelector('.editPageInnerContent'), itemId, ApiClient.serverInfo().Id);
|
||||
});
|
||||
} else {
|
||||
|
@ -14,7 +14,7 @@ define(['loading', 'scripts/editorsidebar'], function (loading) {
|
|||
}
|
||||
}
|
||||
|
||||
return function (view, params) {
|
||||
export default function (view, params) {
|
||||
view.addEventListener('viewshow', function () {
|
||||
reload(this, MetadataEditor.getCurrentItemId());
|
||||
});
|
||||
|
@ -27,5 +27,4 @@ define(['loading', 'scripts/editorsidebar'], function (loading) {
|
|||
reload(view, data.id);
|
||||
}
|
||||
});
|
||||
};
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1,5 +1,15 @@
|
|||
define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'apphost', 'layoutManager', 'focusManager', 'emby-itemscontainer', 'emby-scroller'], function (appRouter, cardBuilder, dom, globalize, connectionManager, appHost, layoutManager, focusManager) {
|
||||
'use strict';
|
||||
import appRouter from 'appRouter';
|
||||
import cardBuilder from 'cardBuilder';
|
||||
import dom from 'dom';
|
||||
import globalize from 'globalize';
|
||||
import connectionManager from 'connectionManager';
|
||||
import appHost from 'apphost';
|
||||
import layoutManager from 'layoutManager';
|
||||
import focusManager from 'focusManager';
|
||||
import 'emby-itemscontainer';
|
||||
import 'emby-scroller';
|
||||
|
||||
/* eslint-disable indent */
|
||||
|
||||
function enableScrollX() {
|
||||
return true;
|
||||
|
@ -133,8 +143,8 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap
|
|||
|
||||
function getFetchDataFn(section) {
|
||||
return function () {
|
||||
var apiClient = this.apiClient;
|
||||
var options = {
|
||||
const apiClient = this.apiClient;
|
||||
const options = {
|
||||
SortBy: (section.types, 'SeriesName,SortName'),
|
||||
SortOrder: 'Ascending',
|
||||
Filters: 'IsFavorite',
|
||||
|
@ -145,7 +155,7 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap
|
|||
EnableTotalRecordCount: false
|
||||
};
|
||||
options.Limit = 20;
|
||||
var userId = apiClient.getCurrentUserId();
|
||||
const userId = apiClient.getCurrentUserId();
|
||||
|
||||
if (section.types === 'MusicArtist') {
|
||||
return apiClient.getArtists(userId, options);
|
||||
|
@ -170,16 +180,16 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap
|
|||
|
||||
function getItemsHtmlFn(section) {
|
||||
return function (items) {
|
||||
var cardLayout = appHost.preferVisualCards && section.autoCardLayout && section.showTitle;
|
||||
let cardLayout = appHost.preferVisualCards && section.autoCardLayout && section.showTitle;
|
||||
cardLayout = false;
|
||||
var serverId = this.apiClient.serverId();
|
||||
var leadingButtons = layoutManager.tv ? [{
|
||||
const serverId = this.apiClient.serverId();
|
||||
const leadingButtons = layoutManager.tv ? [{
|
||||
name: globalize.translate('All'),
|
||||
id: 'more',
|
||||
icon: 'favorite',
|
||||
routeUrl: getRouteUrl(section, serverId)
|
||||
}] : null;
|
||||
var lines = 0;
|
||||
let lines = 0;
|
||||
|
||||
if (section.showTitle) {
|
||||
lines++;
|
||||
|
@ -215,23 +225,12 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap
|
|||
};
|
||||
}
|
||||
|
||||
function FavoritesTab(view, params) {
|
||||
this.view = view;
|
||||
this.params = params;
|
||||
this.apiClient = connectionManager.currentApiClient();
|
||||
this.sectionsContainer = view.querySelector('.sections');
|
||||
createSections(this, this.sectionsContainer, this.apiClient);
|
||||
}
|
||||
|
||||
function createSections(instance, elem, apiClient) {
|
||||
var i;
|
||||
var length;
|
||||
var sections = getSections();
|
||||
var html = '';
|
||||
const sections = getSections();
|
||||
let html = '';
|
||||
|
||||
for (i = 0, length = sections.length; i < length; i++) {
|
||||
var section = sections[i];
|
||||
var sectionClass = 'verticalSection';
|
||||
for (const section of sections) {
|
||||
let sectionClass = 'verticalSection';
|
||||
|
||||
if (!section.showTitle) {
|
||||
sectionClass += ' verticalSection-extrabottompadding';
|
||||
|
@ -257,23 +256,32 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap
|
|||
}
|
||||
|
||||
elem.innerHTML = html;
|
||||
var elems = elem.querySelectorAll('.itemsContainer');
|
||||
const elems = elem.querySelectorAll('.itemsContainer');
|
||||
|
||||
for (i = 0, length = elems.length; i < length; i++) {
|
||||
var itemsContainer = elems[i];
|
||||
for (let i = 0, length = elems.length; i < length; i++) {
|
||||
const itemsContainer = elems[i];
|
||||
itemsContainer.fetchData = getFetchDataFn(sections[i]).bind(instance);
|
||||
itemsContainer.getItemsHtml = getItemsHtmlFn(sections[i]).bind(instance);
|
||||
itemsContainer.parentContainer = dom.parentWithClass(itemsContainer, 'verticalSection');
|
||||
}
|
||||
}
|
||||
|
||||
FavoritesTab.prototype.onResume = function (options) {
|
||||
var promises = (this.apiClient, []);
|
||||
var view = this.view;
|
||||
var elems = this.sectionsContainer.querySelectorAll('.itemsContainer');
|
||||
class FavoritesTab {
|
||||
constructor(view, params) {
|
||||
this.view = view;
|
||||
this.params = params;
|
||||
this.apiClient = connectionManager.currentApiClient();
|
||||
this.sectionsContainer = view.querySelector('.sections');
|
||||
createSections(this, this.sectionsContainer, this.apiClient);
|
||||
}
|
||||
|
||||
for (var i = 0, length = elems.length; i < length; i++) {
|
||||
promises.push(elems[i].resume(options));
|
||||
onResume(options) {
|
||||
const promises = (this.apiClient, []);
|
||||
const view = this.view;
|
||||
const elems = this.sectionsContainer.querySelectorAll('.itemsContainer');
|
||||
|
||||
for (const elem of elems) {
|
||||
promises.push(elem.resume(options));
|
||||
}
|
||||
|
||||
Promise.all(promises).then(function () {
|
||||
|
@ -281,30 +289,32 @@ define(['appRouter', 'cardBuilder', 'dom', 'globalize', 'connectionManager', 'ap
|
|||
focusManager.autoFocus(view);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
FavoritesTab.prototype.onPause = function () {
|
||||
var elems = this.sectionsContainer.querySelectorAll('.itemsContainer');
|
||||
|
||||
for (var i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].pause();
|
||||
}
|
||||
};
|
||||
|
||||
FavoritesTab.prototype.destroy = function () {
|
||||
onPause() {
|
||||
const elems = this.sectionsContainer.querySelectorAll('.itemsContainer');
|
||||
|
||||
for (const elem of elems) {
|
||||
elem.pause();
|
||||
}
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this.view = null;
|
||||
this.params = null;
|
||||
this.apiClient = null;
|
||||
var elems = this.sectionsContainer.querySelectorAll('.itemsContainer');
|
||||
const elems = this.sectionsContainer.querySelectorAll('.itemsContainer');
|
||||
|
||||
for (var i = 0, length = elems.length; i < length; i++) {
|
||||
elems[i].fetchData = null;
|
||||
elems[i].getItemsHtml = null;
|
||||
elems[i].parentContainer = null;
|
||||
for (const elem of elems) {
|
||||
elem.fetchData = null;
|
||||
elem.getItemsHtml = null;
|
||||
elem.parentContainer = null;
|
||||
}
|
||||
|
||||
this.sectionsContainer = null;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
return FavoritesTab;
|
||||
});
|
||||
export default FavoritesTab;
|
||||
|
||||
/* eslint-enable indent */
|
||||
|
|
|
@ -40,7 +40,7 @@ define(['tabbedView', 'globalize', 'require', 'emby-tabs', 'emby-button', 'emby-
|
|||
var controller = instance.tabControllers[index];
|
||||
|
||||
if (!controller) {
|
||||
controller = new controllerFactory(instance.view.querySelector(".tabContent[data-index='" + index + "']"), instance.params);
|
||||
controller = new controllerFactory.default(instance.view.querySelector(".tabContent[data-index='" + index + "']"), instance.params);
|
||||
instance.tabControllers[index] = controller;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,13 +1,66 @@
|
|||
define(['userSettings', 'loading', 'connectionManager', 'apphost', 'layoutManager', 'focusManager', 'homeSections', 'emby-itemscontainer'], function (userSettings, loading, connectionManager, appHost, layoutManager, focusManager, homeSections) {
|
||||
'use strict';
|
||||
import * as userSettings from 'userSettings';
|
||||
import loading from 'loading';
|
||||
import connectionManager from 'connectionManager';
|
||||
import focusManager from 'focusManager';
|
||||
import homeSections from 'homeSections';
|
||||
import 'emby-itemscontainer';
|
||||
|
||||
function HomeTab(view, params) {
|
||||
class HomeTab {
|
||||
constructor(view, params) {
|
||||
this.view = view;
|
||||
this.params = params;
|
||||
this.apiClient = connectionManager.currentApiClient();
|
||||
this.sectionsContainer = view.querySelector('.sections');
|
||||
view.querySelector('.sections').addEventListener('settingschange', onHomeScreenSettingsChanged.bind(this));
|
||||
}
|
||||
onResume(options) {
|
||||
if (this.sectionsRendered) {
|
||||
const sectionsContainer = this.sectionsContainer;
|
||||
|
||||
if (sectionsContainer) {
|
||||
return homeSections.resume(sectionsContainer, options);
|
||||
}
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
loading.show();
|
||||
const view = this.view;
|
||||
const apiClient = this.apiClient;
|
||||
this.destroyHomeSections();
|
||||
this.sectionsRendered = true;
|
||||
return apiClient.getCurrentUser().then(function (user) {
|
||||
return homeSections.loadSections(view.querySelector('.sections'), apiClient, user, userSettings).then(function () {
|
||||
if (options.autoFocus) {
|
||||
focusManager.autoFocus(view);
|
||||
}
|
||||
|
||||
loading.hide();
|
||||
});
|
||||
});
|
||||
}
|
||||
onPause() {
|
||||
const sectionsContainer = this.sectionsContainer;
|
||||
|
||||
if (sectionsContainer) {
|
||||
homeSections.pause(sectionsContainer);
|
||||
}
|
||||
}
|
||||
destroy() {
|
||||
this.view = null;
|
||||
this.params = null;
|
||||
this.apiClient = null;
|
||||
this.destroyHomeSections();
|
||||
this.sectionsContainer = null;
|
||||
}
|
||||
destroyHomeSections() {
|
||||
const sectionsContainer = this.sectionsContainer;
|
||||
|
||||
if (sectionsContainer) {
|
||||
homeSections.destroySections(sectionsContainer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function onHomeScreenSettingsChanged() {
|
||||
this.sectionsRendered = false;
|
||||
|
@ -19,56 +72,4 @@ define(['userSettings', 'loading', 'connectionManager', 'apphost', 'layoutManage
|
|||
}
|
||||
}
|
||||
|
||||
HomeTab.prototype.onResume = function (options) {
|
||||
if (this.sectionsRendered) {
|
||||
var sectionsContainer = this.sectionsContainer;
|
||||
|
||||
if (sectionsContainer) {
|
||||
return homeSections.resume(sectionsContainer, options);
|
||||
}
|
||||
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
loading.show();
|
||||
var view = this.view;
|
||||
var apiClient = this.apiClient;
|
||||
this.destroyHomeSections();
|
||||
this.sectionsRendered = true;
|
||||
return apiClient.getCurrentUser().then(function (user) {
|
||||
return homeSections.loadSections(view.querySelector('.sections'), apiClient, user, userSettings).then(function () {
|
||||
if (options.autoFocus) {
|
||||
focusManager.autoFocus(view);
|
||||
}
|
||||
|
||||
loading.hide();
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
HomeTab.prototype.onPause = function () {
|
||||
var sectionsContainer = this.sectionsContainer;
|
||||
|
||||
if (sectionsContainer) {
|
||||
homeSections.pause(sectionsContainer);
|
||||
}
|
||||
};
|
||||
|
||||
HomeTab.prototype.destroy = function () {
|
||||
this.view = null;
|
||||
this.params = null;
|
||||
this.apiClient = null;
|
||||
this.destroyHomeSections();
|
||||
this.sectionsContainer = null;
|
||||
};
|
||||
|
||||
HomeTab.prototype.destroyHomeSections = function () {
|
||||
var sectionsContainer = this.sectionsContainer;
|
||||
|
||||
if (sectionsContainer) {
|
||||
homeSections.destroySections(sectionsContainer);
|
||||
}
|
||||
};
|
||||
|
||||
return HomeTab;
|
||||
});
|
||||
export default HomeTab;
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager', 'cardBuilder', 'loading', 'connectionManager', 'alphaNumericShortcuts', 'scroller', 'playbackManager', 'alphaPicker', 'emby-itemscontainer', 'emby-scroller'], function (globalize, listView, layoutManager, userSettings, focusManager, cardBuilder, loading, connectionManager, AlphaNumericShortcuts, scroller, playbackManager, AlphaPicker) {
|
||||
'use strict';
|
||||
|
||||
playbackManager = playbackManager.default || playbackManager;
|
||||
loading = loading.default || loading;
|
||||
|
||||
function getInitialLiveTvQuery(instance, params) {
|
||||
var query = {
|
||||
UserId: connectionManager.getApiClient(params.serverId).getCurrentUserId(),
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
define(['cardBuilder', 'imageLoader', 'libraryBrowser', 'loading', 'events', 'userSettings', 'emby-itemscontainer'], function (cardBuilder, imageLoader, libraryBrowser, loading, events, userSettings) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
libraryBrowser = libraryBrowser.default || libraryBrowser;
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['layoutManager', 'loading', 'cardBuilder', 'apphost', 'imageLoader', 'scripts/livetvcomponents', 'listViewStyle', 'emby-itemscontainer'], function (layoutManager, loading, cardBuilder, appHost, imageLoader) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
|
||||
function renderRecordings(elem, recordings, cardOptions, scrollX) {
|
||||
if (!elem) {
|
||||
return;
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['layoutManager', 'cardBuilder', 'apphost', 'imageLoader', 'loading', 'scripts/livetvcomponents', 'emby-button', 'emby-itemscontainer'], function (layoutManager, cardBuilder, appHost, imageLoader, loading) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
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';
|
||||
|
||||
loading = loading.default || loading;
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop;
|
||||
}
|
||||
|
|
|
@ -1,22 +1,23 @@
|
|||
define(['events', 'loading', 'globalize'], function (events, loading, globalize) {
|
||||
'use strict';
|
||||
import events from 'events';
|
||||
import loading from 'loading';
|
||||
import globalize from 'globalize';
|
||||
|
||||
function onListingsSubmitted() {
|
||||
Dashboard.navigate('livetvstatus.html');
|
||||
}
|
||||
|
||||
function init(page, type, providerId) {
|
||||
var url = 'components/tvproviders/' + type + '.js';
|
||||
const url = 'components/tvproviders/' + type + '.js';
|
||||
|
||||
require([url], function (factory) {
|
||||
var instance = new factory(page, providerId, {});
|
||||
import(url).then(({default: factory}) => {
|
||||
const instance = new factory(page, providerId, {});
|
||||
events.on(instance, 'submitted', onListingsSubmitted);
|
||||
instance.init();
|
||||
});
|
||||
}
|
||||
|
||||
function loadTemplate(page, type, providerId) {
|
||||
require(['text!./components/tvproviders/' + type + '.template.html'], function (html) {
|
||||
import('text!./../components/tvproviders/' + type + '.template.html').then(({default: html}) => {
|
||||
page.querySelector('.providerTemplate').innerHTML = globalize.translateHtml(html);
|
||||
init(page, type, providerId);
|
||||
});
|
||||
|
@ -24,7 +25,6 @@ define(['events', 'loading', 'globalize'], function (events, loading, globalize)
|
|||
|
||||
pageIdOn('pageshow', 'liveTvGuideProviderPage', function () {
|
||||
loading.show();
|
||||
var providerId = getParameterByName('id');
|
||||
const providerId = getParameterByName('id');
|
||||
loadTemplate(this, getParameterByName('type'), providerId);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading, globalize) {
|
||||
'use strict';
|
||||
import $ from 'jQuery';
|
||||
import loading from 'loading';
|
||||
import globalize from 'globalize';
|
||||
import 'emby-button';
|
||||
|
||||
function loadPage(page, config) {
|
||||
$('.liveTvSettingsForm', page).show();
|
||||
|
@ -17,13 +19,13 @@ define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading,
|
|||
|
||||
function onSubmit() {
|
||||
loading.show();
|
||||
var form = this;
|
||||
const form = this;
|
||||
ApiClient.getNamedConfiguration('livetv').then(function (config) {
|
||||
config.GuideDays = $('#selectGuideDays', form).val() || null;
|
||||
var recordingPath = form.querySelector('#txtRecordingPath').value || null;
|
||||
var movieRecordingPath = form.querySelector('#txtMovieRecordingPath').value || null;
|
||||
var seriesRecordingPath = form.querySelector('#txtSeriesRecordingPath').value || null;
|
||||
var recordingPathChanged = recordingPath != config.RecordingPath || movieRecordingPath != config.MovieRecordingPath || seriesRecordingPath != config.SeriesRecordingPath;
|
||||
const recordingPath = form.querySelector('#txtRecordingPath').value || null;
|
||||
const movieRecordingPath = form.querySelector('#txtMovieRecordingPath').value || null;
|
||||
const seriesRecordingPath = form.querySelector('#txtSeriesRecordingPath').value || null;
|
||||
const recordingPathChanged = recordingPath != config.RecordingPath || movieRecordingPath != config.MovieRecordingPath || seriesRecordingPath != config.SeriesRecordingPath;
|
||||
config.RecordingPath = recordingPath;
|
||||
config.MovieRecordingPath = movieRecordingPath;
|
||||
config.SeriesRecordingPath = seriesRecordingPath;
|
||||
|
@ -41,25 +43,26 @@ define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading,
|
|||
}
|
||||
|
||||
function showSaveMessage(recordingPathChanged) {
|
||||
var msg = '';
|
||||
let msg = '';
|
||||
|
||||
if (recordingPathChanged) {
|
||||
msg += globalize.translate('RecordingPathChangeMessage');
|
||||
msg += globalize.translate('MessageChangeRecordingPath');
|
||||
}
|
||||
|
||||
if (msg) {
|
||||
require(['alert'], function (alert) {
|
||||
import('alert').then(({default: alert}) => {
|
||||
alert(msg);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export default function () {
|
||||
$(document).on('pageinit', '#liveTvSettingsPage', function () {
|
||||
var page = this;
|
||||
const page = this;
|
||||
$('.liveTvSettingsForm').off('submit', onSubmit).on('submit', onSubmit);
|
||||
$('#btnSelectRecordingPath', page).on('click.selectDirectory', function () {
|
||||
require(['directorybrowser'], function (directoryBrowser) {
|
||||
var picker = new directoryBrowser.default();
|
||||
import('directorybrowser').then(({default: directoryBrowser}) => {
|
||||
const picker = new directoryBrowser();
|
||||
picker.show({
|
||||
callback: function (path) {
|
||||
if (path) {
|
||||
|
@ -73,8 +76,8 @@ define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading,
|
|||
});
|
||||
});
|
||||
$('#btnSelectMovieRecordingPath', page).on('click.selectDirectory', function () {
|
||||
require(['directorybrowser'], function (directoryBrowser) {
|
||||
var picker = new directoryBrowser.default();
|
||||
import('directorybrowser').then(({default: directoryBrowser}) => {
|
||||
const picker = new directoryBrowser();
|
||||
picker.show({
|
||||
callback: function (path) {
|
||||
if (path) {
|
||||
|
@ -88,8 +91,8 @@ define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading,
|
|||
});
|
||||
});
|
||||
$('#btnSelectSeriesRecordingPath', page).on('click.selectDirectory', function () {
|
||||
require(['directorybrowser'], function (directoryBrowser) {
|
||||
var picker = new directoryBrowser.default();
|
||||
import('directorybrowser').then(({default: directoryBrowser}) => {
|
||||
const picker = new directoryBrowser();
|
||||
picker.show({
|
||||
callback: function (path) {
|
||||
if (path) {
|
||||
|
@ -103,8 +106,8 @@ define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading,
|
|||
});
|
||||
});
|
||||
$('#btnSelectPostProcessorPath', page).on('click.selectDirectory', function () {
|
||||
require(['directorybrowser'], function (directoryBrowser) {
|
||||
var picker = new directoryBrowser.default();
|
||||
import('directorybrowser').then(({default: directoryBrowser}) => {
|
||||
const picker = new directoryBrowser();
|
||||
picker.show({
|
||||
includeFiles: true,
|
||||
callback: function (path) {
|
||||
|
@ -119,9 +122,9 @@ define(['jQuery', 'loading', 'globalize', 'emby-button'], function ($, loading,
|
|||
});
|
||||
}).on('pageshow', '#liveTvSettingsPage', function () {
|
||||
loading.show();
|
||||
var page = this;
|
||||
const page = this;
|
||||
ApiClient.getNamedConfiguration('livetv').then(function (config) {
|
||||
loadPage(page, config);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
define(['loading', 'events', 'libraryBrowser', 'imageLoader', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (loading, events, libraryBrowser, imageLoader, listView, cardBuilder, userSettings, globalize) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
libraryBrowser = libraryBrowser.default || libraryBrowser;
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
define(['layoutManager', 'loading', 'libraryBrowser', 'cardBuilder', 'lazyLoader', 'apphost', 'globalize', 'appRouter', 'dom', 'emby-button'], function (layoutManager, loading, libraryBrowser, cardBuilder, lazyLoader, appHost, globalize, appRouter, dom) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
libraryBrowser = libraryBrowser.default || libraryBrowser;
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
define(['loading', 'layoutManager', 'userSettings', 'events', 'libraryBrowser', 'alphaPicker', 'listView', 'cardBuilder', 'globalize', 'emby-itemscontainer'], function (loading, layoutManager, userSettings, events, libraryBrowser, AlphaPicker, listView, cardBuilder, globalize) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
libraryBrowser = libraryBrowser.default || libraryBrowser;
|
||||
|
||||
return function (view, params, tabContent, options) {
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['events', 'layoutManager', 'inputManager', 'userSettings', 'libraryMenu', 'mainTabsManager', 'cardBuilder', 'dom', 'imageLoader', 'playbackManager', 'globalize', 'emby-scroller', 'emby-itemscontainer', 'emby-tabs', 'emby-button'], function (events, layoutManager, inputManager, userSettings, libraryMenu, mainTabsManager, cardBuilder, dom, imageLoader, playbackManager, globalize) {
|
||||
'use strict';
|
||||
|
||||
playbackManager = playbackManager.default || playbackManager;
|
||||
|
||||
function enableScrollX() {
|
||||
return !layoutManager.desktop;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
define(['layoutManager', 'loading', 'events', 'libraryBrowser', 'imageLoader', 'alphaPicker', 'listView', 'cardBuilder', 'userSettings', 'globalize', 'emby-itemscontainer'], function (layoutManager, loading, events, libraryBrowser, imageLoader, AlphaPicker, listView, cardBuilder, userSettings, globalize) {
|
||||
'use strict';
|
||||
|
||||
loading = loading.default || loading;
|
||||
libraryBrowser = libraryBrowser.default || libraryBrowser;
|
||||
|
||||
return function (view, params, tabContent) {
|
||||
|
|
|
@ -1,13 +1,11 @@
|
|||
<!DOCTYPE html>
|
||||
<html class="preload">
|
||||
<head>
|
||||
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no">
|
||||
<link rel="manifest" href="manifest.json">
|
||||
<meta name="format-detection" content="telephone=no">
|
||||
<meta name="msapplication-tap-highlight" content="no">
|
||||
|
||||
<meta http-equiv="X-UA-Compatibility" content="IE=Edge">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
|
@ -15,10 +13,9 @@
|
|||
<meta name="robots" content="noindex, nofollow, noarchive">
|
||||
<meta property="og:title" content="Jellyfin">
|
||||
<meta property="og:site_name" content="Jellyfin">
|
||||
<meta property="og:url" content="http://jellyfin.media">
|
||||
<meta property="og:description" content="The Free Software Media System.">
|
||||
<meta property="og:url" content="http://jellyfin.org">
|
||||
<meta property="og:description" content="The Free Software Media System">
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="fb:app_id" content="1618309211750238">
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="touchicon.png">
|
||||
|
||||
<!-- iPhone 5 -->
|
||||
|
@ -64,7 +61,6 @@
|
|||
<link rel="shortcut icon" href="favicon.ico">
|
||||
<meta name="msapplication-TileImage" content="touchicon144.png">
|
||||
<meta name="msapplication-TileColor" content="#333333">
|
||||
<meta name="theme-color" content="#101010">
|
||||
|
||||
<title>Jellyfin</title>
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser, dom) {
|
||||
"use strict";
|
||||
|
||||
browser = browser.default || browser;
|
||||
|
||||
return function (options) {
|
||||
function getTouches(e) {
|
||||
return e.changedTouches || e.targetTouches || e.touches;
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(["events", "playbackManager", "pluginManager", "inputManager", "connectionManager", "userSettings"], function (events, playbackManager, pluginManager, inputManager, connectionManager, userSettings) {
|
||||
"use strict";
|
||||
|
||||
playbackManager = playbackManager.default || playbackManager;
|
||||
|
||||
function getMinIdleTime() {
|
||||
// Returns the minimum amount of idle time required before the screen saver can be displayed
|
||||
//time units used Millisecond
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'scrollStyles'], function (browser, layoutManager, dom, focusManager, ResizeObserver) {
|
||||
'use strict';
|
||||
|
||||
browser = browser.default || browser;
|
||||
|
||||
/**
|
||||
* Return type of the value.
|
||||
*
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "Jellyfin",
|
||||
"description": "Jellyfin: the Free Software Media System.",
|
||||
"description": "The Free Software Media System",
|
||||
"lang": "en-US",
|
||||
"short_name": "Jellyfin",
|
||||
"start_url": "index.html#!/home.html",
|
||||
|
|
|
@ -2,6 +2,7 @@ import connectionManager from 'connectionManager';
|
|||
import loading from 'loading';
|
||||
import keyboardnavigation from 'keyboardnavigation';
|
||||
import dialogHelper from 'dialogHelper';
|
||||
import dom from 'dom';
|
||||
import events from 'events';
|
||||
import 'css!./style';
|
||||
import 'material-icons';
|
||||
|
@ -93,23 +94,22 @@ export class BookPlayer {
|
|||
|
||||
onWindowKeyUp(e) {
|
||||
let key = keyboardnavigation.getKeyName(e);
|
||||
let rendition = this._rendition;
|
||||
|
||||
// TODO: depending on the event this can be the document or the rendition itself
|
||||
let rendition = this._rendition || this;
|
||||
let book = rendition.book;
|
||||
|
||||
if (this._loaded === false) return;
|
||||
switch (key) {
|
||||
case 'l':
|
||||
case 'ArrowRight':
|
||||
case 'Right':
|
||||
if (this._loaded) {
|
||||
book.package.metadata.direction === 'rtl' ? rendition.prev() : rendition.next();
|
||||
}
|
||||
break;
|
||||
case 'j':
|
||||
case 'ArrowLeft':
|
||||
case 'Left':
|
||||
if (this._loaded) {
|
||||
book.package.metadata.direction === 'rtl' ? rendition.next() : rendition.prev();
|
||||
}
|
||||
break;
|
||||
case 'Escape':
|
||||
if (this._tocElement) {
|
||||
|
@ -123,6 +123,25 @@ export class BookPlayer {
|
|||
}
|
||||
}
|
||||
|
||||
onTouchStart(e) {
|
||||
// TODO: depending on the event this can be the document or the rendition itself
|
||||
let rendition = this._rendition || this;
|
||||
let book = rendition.book;
|
||||
|
||||
// check that the event is from the book or the document
|
||||
if (!book || this._loaded === false) return;
|
||||
|
||||
// epubjs stores pages off the screen or something for preloading
|
||||
// get the modulus of the touch event to account for the increased width
|
||||
if (!e.touches || e.touches.length === 0) return;
|
||||
let touch = e.touches[0].clientX % dom.getWindowSize().innerWidth;
|
||||
if (touch < dom.getWindowSize().innerWidth / 2) {
|
||||
book.package.metadata.direction === 'rtl' ? rendition.next() : rendition.prev();
|
||||
} else {
|
||||
book.package.metadata.direction === 'rtl' ? rendition.prev() : rendition.next();
|
||||
}
|
||||
}
|
||||
|
||||
onDialogClosed() {
|
||||
this.stop();
|
||||
}
|
||||
|
@ -139,8 +158,11 @@ export class BookPlayer {
|
|||
this.bindMediaElementEvents();
|
||||
|
||||
document.addEventListener('keyup', this.onWindowKeyUp);
|
||||
document.addEventListener('touchstart', this.onTouchStart);
|
||||
|
||||
// FIXME: I don't really get why document keyup event is not triggered when epub is in focus
|
||||
this._rendition.on('keyup', this.onWindowKeyUp);
|
||||
this._rendition.on('touchstart', this.onTouchStart);
|
||||
}
|
||||
|
||||
unbindMediaElementEvents() {
|
||||
|
@ -155,9 +177,13 @@ export class BookPlayer {
|
|||
if (this._mediaElement) {
|
||||
this.unbindMediaElementEvents();
|
||||
}
|
||||
|
||||
document.removeEventListener('keyup', this.onWindowKeyUp);
|
||||
document.removeEventListener('touchstart', this.onTouchStart);
|
||||
|
||||
if (this._rendition) {
|
||||
this._rendition.off('keyup', this.onWindowKeyUp);
|
||||
this._rendition.off('touchstart', this.onTouchStart);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -169,13 +195,11 @@ export class BookPlayer {
|
|||
|
||||
createMediaElement() {
|
||||
let elem = this._mediaElement;
|
||||
|
||||
if (elem) {
|
||||
return elem;
|
||||
}
|
||||
|
||||
elem = document.getElementById('bookPlayer');
|
||||
|
||||
if (!elem) {
|
||||
elem = dialogHelper.createDialog({
|
||||
exitAnimationDuration: 400,
|
||||
|
@ -185,6 +209,7 @@ export class BookPlayer {
|
|||
exitAnimation: 'fadeout',
|
||||
removeOnClose: true
|
||||
});
|
||||
|
||||
elem.id = 'bookPlayer';
|
||||
|
||||
let html = '';
|
||||
|
@ -230,6 +255,7 @@ export class BookPlayer {
|
|||
let cancellationToken = {
|
||||
shouldCancel: false
|
||||
};
|
||||
|
||||
this._cancellationToken = cancellationToken;
|
||||
|
||||
return rendition.display().then(() => {
|
||||
|
@ -253,7 +279,6 @@ export class BookPlayer {
|
|||
epubElem.style.display = 'block';
|
||||
rendition.on('relocated', (locations) => {
|
||||
this._progress = book.locations.percentageFromCfi(locations.start.cfi);
|
||||
|
||||
events.trigger(this, 'timeupdate');
|
||||
});
|
||||
|
||||
|
@ -262,7 +287,7 @@ export class BookPlayer {
|
|||
return resolve();
|
||||
});
|
||||
}, () => {
|
||||
console.error('Failed to display epub');
|
||||
console.error('failed to display epub');
|
||||
return reject();
|
||||
});
|
||||
});
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', 'globalize', 'events', 'require', 'castSenderApiLoader'], function (appSettings, userSettings, playbackManager, connectionManager, globalize, events, require, castSenderApiLoader) {
|
||||
'use strict';
|
||||
|
||||
playbackManager = playbackManager.default || playbackManager;
|
||||
|
||||
// Based on https://github.com/googlecast/CastVideos-chrome/blob/master/CastVideos.js
|
||||
var currentResolve;
|
||||
var currentReject;
|
||||
|
@ -363,7 +365,7 @@ define(['appSettings', 'userSettings', 'playbackManager', 'connectionManager', '
|
|||
}
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
require(['chromecastHelper'], function (chromecastHelper) {
|
||||
require(['./chromecastHelper'], function (chromecastHelper) {
|
||||
chromecastHelper.getServerAddress(apiClient).then(function (serverAddress) {
|
||||
message.serverAddress = serverAddress;
|
||||
player.sendMessageInternal(message).then(resolve, reject);
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['playbackManager', 'events', 'serverNotifications', 'connectionManager'], function (playbackManager, events, serverNotifications, connectionManager) {
|
||||
'use strict';
|
||||
|
||||
playbackManager = playbackManager.default || playbackManager;
|
||||
|
||||
function getActivePlayerId() {
|
||||
var info = playbackManager.getPlayerInfo();
|
||||
return info ? info.id : null;
|
||||
|
|
8
src/scripts/autoThemes.js
Normal file
8
src/scripts/autoThemes.js
Normal file
|
@ -0,0 +1,8 @@
|
|||
import * as userSettings from 'userSettings';
|
||||
import skinManager from 'skinManager';
|
||||
import connectionManager from 'connectionManager';
|
||||
import events from 'events';
|
||||
|
||||
events.on(connectionManager, 'localusersignedin', function (e, user) {
|
||||
skinManager.setTheme(userSettings.theme());
|
||||
});
|
|
@ -1,6 +1,8 @@
|
|||
define(['browser'], function (browser) {
|
||||
'use strict';
|
||||
|
||||
browser = browser.default || browser;
|
||||
|
||||
function canPlayH264(videoTestElement) {
|
||||
return !!(videoTestElement.canPlayType && videoTestElement.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/, ''));
|
||||
}
|
||||
|
|
|
@ -35,6 +35,7 @@ import appHost from 'apphost';
|
|||
if (eventListenerCount) {
|
||||
eventListenerCount--;
|
||||
}
|
||||
|
||||
dom.removeEventListener(scope, 'command', fn, {});
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', 'viewManager', 'libraryBrowser', 'appRouter', 'apphost', 'playbackManager', 'syncPlayManager', 'groupSelectionMenu', 'browser', 'globalize', 'scripts/imagehelper', 'paper-icon-button-light', 'material-icons', 'scrollStyles', 'flexStyles'], function (dom, layoutManager, inputManager, connectionManager, events, viewManager, libraryBrowser, appRouter, appHost, playbackManager, syncPlayManager, groupSelectionMenu, browser, globalize, imageHelper) {
|
||||
'use strict';
|
||||
|
||||
playbackManager = playbackManager.default || playbackManager;
|
||||
browser = browser.default || browser;
|
||||
|
||||
function renderHeader() {
|
||||
var html = '';
|
||||
html += '<div class="flex align-items-center flex-grow headerTop">';
|
||||
|
|
|
@ -1,10 +1,15 @@
|
|||
define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'dom'], function (inputManager, focusManager, browser, layoutManager, events, dom) {
|
||||
'use strict';
|
||||
import inputManager from 'inputManager';
|
||||
import focusManager from 'focusManager';
|
||||
import browser from 'browser';
|
||||
import layoutManager from 'layoutManager';
|
||||
import events from 'events';
|
||||
import dom from 'dom';
|
||||
/* eslint-disable indent */
|
||||
|
||||
var self = {};
|
||||
const self = {};
|
||||
|
||||
var lastMouseInputTime = new Date().getTime();
|
||||
var isMouseIdle;
|
||||
let lastMouseInputTime = new Date().getTime();
|
||||
let isMouseIdle;
|
||||
|
||||
function mouseIdleTime() {
|
||||
return new Date().getTime() - lastMouseInputTime;
|
||||
|
@ -15,14 +20,14 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd
|
|||
}
|
||||
|
||||
function removeIdleClasses() {
|
||||
var classList = document.body.classList;
|
||||
const classList = document.body.classList;
|
||||
|
||||
classList.remove('mouseIdle');
|
||||
classList.remove('mouseIdle-tv');
|
||||
}
|
||||
|
||||
function addIdleClasses() {
|
||||
var classList = document.body.classList;
|
||||
const classList = document.body.classList;
|
||||
|
||||
classList.add('mouseIdle');
|
||||
|
||||
|
@ -31,7 +36,7 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd
|
|||
}
|
||||
}
|
||||
|
||||
function showCursor() {
|
||||
export function showCursor() {
|
||||
if (isMouseIdle) {
|
||||
isMouseIdle = false;
|
||||
removeIdleClasses();
|
||||
|
@ -39,7 +44,7 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd
|
|||
}
|
||||
}
|
||||
|
||||
function hideCursor() {
|
||||
export function hideCursor() {
|
||||
if (!isMouseIdle) {
|
||||
isMouseIdle = true;
|
||||
addIdleClasses();
|
||||
|
@ -47,17 +52,17 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd
|
|||
}
|
||||
}
|
||||
|
||||
var lastPointerMoveData;
|
||||
let lastPointerMoveData;
|
||||
function onPointerMove(e) {
|
||||
var eventX = e.screenX;
|
||||
var eventY = e.screenY;
|
||||
const eventX = e.screenX;
|
||||
const eventY = e.screenY;
|
||||
|
||||
// if coord don't exist how could it move
|
||||
if (typeof eventX === 'undefined' && typeof eventY === 'undefined') {
|
||||
return;
|
||||
}
|
||||
|
||||
var obj = lastPointerMoveData;
|
||||
const obj = lastPointerMoveData;
|
||||
if (!obj) {
|
||||
lastPointerMoveData = {
|
||||
x: eventX,
|
||||
|
@ -81,11 +86,11 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd
|
|||
}
|
||||
|
||||
function onPointerEnter(e) {
|
||||
var pointerType = e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse');
|
||||
const pointerType = e.pointerType || (layoutManager.mobile ? 'touch' : 'mouse');
|
||||
|
||||
if (pointerType === 'mouse') {
|
||||
if (!isMouseIdle) {
|
||||
var parent = focusManager.focusableParent(e.target);
|
||||
const parent = focusManager.focusableParent(e.target);
|
||||
if (parent) {
|
||||
focusManager.focus(parent);
|
||||
}
|
||||
|
@ -115,7 +120,7 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd
|
|||
}
|
||||
}
|
||||
|
||||
var mouseInterval;
|
||||
let mouseInterval;
|
||||
function startMouseInterval() {
|
||||
if (!mouseInterval) {
|
||||
mouseInterval = setInterval(onMouseInterval, 5000);
|
||||
|
@ -123,7 +128,7 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd
|
|||
}
|
||||
|
||||
function stopMouseInterval() {
|
||||
var interval = mouseInterval;
|
||||
const interval = mouseInterval;
|
||||
|
||||
if (interval) {
|
||||
clearInterval(interval);
|
||||
|
@ -167,8 +172,10 @@ define(['inputManager', 'focusManager', 'browser', 'layoutManager', 'events', 'd
|
|||
|
||||
events.on(layoutManager, 'modechange', initMouse);
|
||||
|
||||
self.hideCursor = hideCursor;
|
||||
self.showCursor = showCursor;
|
||||
/* eslint-enable indent */
|
||||
|
||||
export default {
|
||||
hideCursor,
|
||||
showCursor
|
||||
};
|
||||
|
||||
return self;
|
||||
});
|
||||
|
|
|
@ -1,18 +1,21 @@
|
|||
define([
|
||||
'jQuery',
|
||||
'emby-button',
|
||||
'emby-input',
|
||||
'scripts/livetvcomponents',
|
||||
'paper-icon-button-light',
|
||||
'emby-itemscontainer',
|
||||
'emby-collapse',
|
||||
'emby-select',
|
||||
'livetvcss',
|
||||
'emby-checkbox',
|
||||
'emby-slider',
|
||||
'listViewStyle',
|
||||
'dashboardcss',
|
||||
'detailtablecss'], function () {
|
||||
import 'emby-button';
|
||||
import 'emby-input';
|
||||
import 'scripts/livetvcomponents';
|
||||
import 'paper-icon-button-light';
|
||||
import 'emby-itemscontainer';
|
||||
import 'emby-collapse';
|
||||
import 'emby-select';
|
||||
import 'livetvcss';
|
||||
import 'emby-checkbox';
|
||||
import 'emby-slider';
|
||||
import 'listViewStyle';
|
||||
import 'dashboardcss';
|
||||
import 'detailtablecss';
|
||||
|
||||
/* eslint-disable indent */
|
||||
|
||||
console.groupCollapsed('defining core routes');
|
||||
|
||||
function defineRoute(newRoute) {
|
||||
var path = newRoute.alias ? newRoute.alias : newRoute.path;
|
||||
console.debug('defining route: ' + path);
|
||||
|
@ -20,8 +23,6 @@ define([
|
|||
Emby.Page.addRoute(path, newRoute);
|
||||
}
|
||||
|
||||
console.debug('defining core routes');
|
||||
|
||||
defineRoute({
|
||||
alias: '/addserver.html',
|
||||
path: '/controllers/session/addServer/index.html',
|
||||
|
@ -30,6 +31,7 @@ define([
|
|||
startup: true,
|
||||
controller: 'session/addServer/index'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/selectserver.html',
|
||||
path: '/controllers/session/selectServer/index.html',
|
||||
|
@ -39,6 +41,7 @@ define([
|
|||
controller: 'session/selectServer/index',
|
||||
type: 'selectserver'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/login.html',
|
||||
path: '/controllers/session/login/index.html',
|
||||
|
@ -48,6 +51,7 @@ define([
|
|||
controller: 'session/login/index',
|
||||
type: 'login'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/forgotpassword.html',
|
||||
path: '/controllers/session/forgotPassword/index.html',
|
||||
|
@ -55,6 +59,7 @@ define([
|
|||
startup: true,
|
||||
controller: 'session/forgotPassword/index'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/forgotpasswordpin.html',
|
||||
path: '/controllers/session/redeemPassword/index.html',
|
||||
|
@ -68,42 +73,41 @@ define([
|
|||
alias: '/mypreferencesmenu.html',
|
||||
path: '/controllers/user/menu/index.html',
|
||||
autoFocus: false,
|
||||
transition: 'fade',
|
||||
controller: 'user/menu/index'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/myprofile.html',
|
||||
path: '/controllers/user/profile/index.html',
|
||||
autoFocus: false,
|
||||
transition: 'fade',
|
||||
controller: 'user/profile/index'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/mypreferencesdisplay.html',
|
||||
path: '/controllers/user/display/index.html',
|
||||
autoFocus: false,
|
||||
transition: 'fade',
|
||||
controller: 'user/display/index'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/mypreferenceshome.html',
|
||||
path: '/controllers/user/home/index.html',
|
||||
autoFocus: false,
|
||||
transition: 'fade',
|
||||
controller: 'user/home/index'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/mypreferencesplayback.html',
|
||||
path: '/controllers/user/playback/index.html',
|
||||
autoFocus: false,
|
||||
transition: 'fade',
|
||||
controller: 'user/playback/index'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/mypreferencessubtitles.html',
|
||||
path: '/controllers/user/subtitles/index.html',
|
||||
autoFocus: false,
|
||||
transition: 'fade',
|
||||
controller: 'user/subtitles/index'
|
||||
});
|
||||
|
||||
|
@ -113,42 +117,49 @@ define([
|
|||
roles: 'admin',
|
||||
controller: 'dashboard/dashboard'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/dashboardgeneral.html',
|
||||
controller: 'dashboard/general',
|
||||
autoFocus: false,
|
||||
roles: 'admin'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/networking.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/networking'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/devices.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/devices/devices'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/device.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/devices/device'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/dlnaprofile.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/dlna/profile'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/dlnaprofiles.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/dlna/profiles'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/addplugin.html',
|
||||
path: '/controllers/dashboard/plugins/add/index.html',
|
||||
|
@ -156,52 +167,61 @@ define([
|
|||
roles: 'admin',
|
||||
controller: 'dashboard/plugins/add/index'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/library.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/mediaLibrary'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/librarydisplay.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/librarydisplay'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/dlnasettings.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/dlna/settings'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/edititemmetadata.html',
|
||||
controller: 'edititemmetadata',
|
||||
autoFocus: false
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/encodingsettings.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/encodingsettings'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/log.html',
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/logs'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/metadataimages.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/metadataImages'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/metadatanfo.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/metadatanfo'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/notificationsetting.html',
|
||||
path: '/controllers/dashboard/notifications/notification/index.html',
|
||||
|
@ -209,6 +229,7 @@ define([
|
|||
roles: 'admin',
|
||||
controller: 'dashboard/notifications/notification/index'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/notificationsettings.html',
|
||||
path: '/controllers/dashboard/notifications/notifications/index.html',
|
||||
|
@ -216,12 +237,14 @@ define([
|
|||
autoFocus: false,
|
||||
roles: 'admin'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/playbackconfiguration.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/playback'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/availableplugins.html',
|
||||
path: '/controllers/dashboard/plugins/available/index.html',
|
||||
|
@ -229,6 +252,7 @@ define([
|
|||
roles: 'admin',
|
||||
controller: 'dashboard/plugins/available/index'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/repositories.html',
|
||||
path: '/controllers/dashboard/plugins/repositories/index.html',
|
||||
|
@ -241,67 +265,72 @@ define([
|
|||
path: '/home.html',
|
||||
autoFocus: false,
|
||||
controller: 'home',
|
||||
transition: 'fade',
|
||||
type: 'home'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/search.html',
|
||||
controller: 'searchpage'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/list.html',
|
||||
autoFocus: false,
|
||||
controller: 'list',
|
||||
transition: 'fade'
|
||||
controller: 'list'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/details',
|
||||
path: '/controllers/itemDetails/index.html',
|
||||
controller: 'itemDetails/index',
|
||||
autoFocus: false,
|
||||
transition: 'fade'
|
||||
autoFocus: false
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/livetv.html',
|
||||
controller: 'livetv/livetvsuggested',
|
||||
autoFocus: false,
|
||||
transition: 'fade'
|
||||
autoFocus: false
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/livetvguideprovider.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'livetvguideprovider'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/livetvsettings.html',
|
||||
autoFocus: false,
|
||||
controller: 'livetvsettings'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/livetvstatus.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'livetvstatus'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/livetvtuner.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'livetvtuner'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/movies.html',
|
||||
autoFocus: false,
|
||||
controller: 'movies/moviesrecommended',
|
||||
transition: 'fade'
|
||||
controller: 'movies/moviesrecommended'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/music.html',
|
||||
controller: 'music/musicrecommended',
|
||||
autoFocus: false,
|
||||
transition: 'fade'
|
||||
autoFocus: false
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/installedplugins.html',
|
||||
path: '/controllers/dashboard/plugins/installed/index.html',
|
||||
|
@ -309,41 +338,46 @@ define([
|
|||
roles: 'admin',
|
||||
controller: 'dashboard/plugins/installed/index'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/scheduledtask.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/scheduledtasks/scheduledtask'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/scheduledtasks.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/scheduledtasks/scheduledtasks'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/serveractivity.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/serveractivity'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/apikeys.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/apikeys'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/streamingsettings.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/streaming'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/tv.html',
|
||||
autoFocus: false,
|
||||
controller: 'shows/tvrecommended',
|
||||
transition: 'fade'
|
||||
controller: 'shows/tvrecommended'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
|
@ -352,29 +386,34 @@ define([
|
|||
roles: 'admin',
|
||||
controller: 'dashboard/users/useredit'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/userlibraryaccess.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/users/userlibraryaccess'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/usernew.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/users/usernew'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/userparentalcontrol.html',
|
||||
autoFocus: false,
|
||||
roles: 'admin',
|
||||
controller: 'dashboard/users/userparentalcontrol'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/userpassword.html',
|
||||
autoFocus: false,
|
||||
controller: 'dashboard/users/userpasswordpage'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/userprofiles.html',
|
||||
autoFocus: false,
|
||||
|
@ -389,6 +428,7 @@ define([
|
|||
anonymous: true,
|
||||
controller: 'wizard/remote/index'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/wizardfinish.html',
|
||||
path: '/controllers/wizard/finish/index.html',
|
||||
|
@ -396,12 +436,14 @@ define([
|
|||
anonymous: true,
|
||||
controller: 'wizard/finish/index'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/wizardlibrary.html',
|
||||
autoFocus: false,
|
||||
anonymous: true,
|
||||
controller: 'dashboard/mediaLibrary'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/wizardsettings.html',
|
||||
path: '/controllers/wizard/settings/index.html',
|
||||
|
@ -409,6 +451,7 @@ define([
|
|||
anonymous: true,
|
||||
controller: 'wizard/settings/index'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/wizardstart.html',
|
||||
path: '/controllers/wizard/start/index.html',
|
||||
|
@ -416,6 +459,7 @@ define([
|
|||
anonymous: true,
|
||||
controller: 'wizard/start/index'
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/wizarduser.html',
|
||||
path: '/controllers/wizard/user/index.html',
|
||||
|
@ -427,7 +471,6 @@ define([
|
|||
defineRoute({
|
||||
alias: '/video',
|
||||
path: '/controllers/playback/video/index.html',
|
||||
transition: 'fade',
|
||||
controller: 'playback/video/index',
|
||||
autoFocus: false,
|
||||
type: 'video-osd',
|
||||
|
@ -435,16 +478,17 @@ define([
|
|||
fullscreen: true,
|
||||
enableMediaControl: false
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
alias: '/queue',
|
||||
path: '/controllers/playback/queue/index.html',
|
||||
controller: 'playback/queue/index',
|
||||
autoFocus: false,
|
||||
transition: 'fade',
|
||||
fullscreen: true,
|
||||
supportsThemeMedia: true,
|
||||
enableMediaControl: false
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/configurationpage',
|
||||
autoFocus: false,
|
||||
|
@ -458,9 +502,13 @@ define([
|
|||
isDefaultRoute: true,
|
||||
autoFocus: false
|
||||
});
|
||||
|
||||
defineRoute({
|
||||
path: '/index.html',
|
||||
autoFocus: false,
|
||||
isDefaultRoute: true
|
||||
});
|
||||
});
|
||||
|
||||
console.groupEnd('defining core routes');
|
||||
|
||||
/* eslint-enable indent */
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
define(['connectionManager', 'playbackManager', 'syncPlayManager', 'events', 'inputManager', 'focusManager', 'appRouter'], function (connectionManager, playbackManager, syncPlayManager, events, inputManager, focusManager, appRouter) {
|
||||
'use strict';
|
||||
|
||||
playbackManager = playbackManager.default || playbackManager;
|
||||
|
||||
var serverNotifications = {};
|
||||
|
||||
function notifyApp() {
|
||||
|
|
|
@ -80,43 +80,6 @@ import events from 'events';
|
|||
return val ? parseInt(val) : null;
|
||||
}
|
||||
|
||||
export function syncOnlyOnWifi(val) {
|
||||
if (val !== undefined) {
|
||||
this.set('syncOnlyOnWifi', val.toString());
|
||||
}
|
||||
|
||||
return this.get('syncOnlyOnWifi') !== 'false';
|
||||
}
|
||||
|
||||
export function syncPath(val) {
|
||||
if (val !== undefined) {
|
||||
this.set('syncPath', val);
|
||||
}
|
||||
|
||||
return this.get('syncPath');
|
||||
}
|
||||
|
||||
export function cameraUploadServers(val) {
|
||||
if (val !== undefined) {
|
||||
this.set('cameraUploadServers', val.join(','));
|
||||
}
|
||||
|
||||
val = this.get('cameraUploadServers');
|
||||
if (val) {
|
||||
return val.split(',');
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
export function runAtStartup(val) {
|
||||
if (val !== undefined) {
|
||||
this.set('runatstartup', val.toString());
|
||||
}
|
||||
|
||||
return this.get('runatstartup') === 'true';
|
||||
}
|
||||
|
||||
export function set(name, value, userId) {
|
||||
const currentValue = this.get(name, userId);
|
||||
appStorage.setItem(getKey(name, userId), value);
|
||||
|
@ -139,10 +102,6 @@ export default {
|
|||
maxStreamingBitrate: maxStreamingBitrate,
|
||||
maxStaticMusicBitrate: maxStaticMusicBitrate,
|
||||
maxChromecastBitrate: maxChromecastBitrate,
|
||||
syncOnlyOnWifi: syncOnlyOnWifi,
|
||||
syncPath: syncPath,
|
||||
cameraUploadServers: cameraUploadServers,
|
||||
runAtStartup: runAtStartup,
|
||||
set: set,
|
||||
get: get
|
||||
};
|
||||
|
|
|
@ -18,7 +18,7 @@ function getDefaultConfig() {
|
|||
});
|
||||
}
|
||||
|
||||
export function enableMultiServer() {
|
||||
export function getMultiServer() {
|
||||
return getConfig().then(config => {
|
||||
return config.multiserver;
|
||||
}).catch(error => {
|
||||
|
@ -26,3 +26,21 @@ export function enableMultiServer() {
|
|||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
export function getThemes() {
|
||||
return getConfig().then(config => {
|
||||
return config.themes;
|
||||
}).catch(error => {
|
||||
console.log('cannot get web config:', error);
|
||||
return [];
|
||||
});
|
||||
}
|
||||
|
||||
export function getPlugins() {
|
||||
return getConfig().then(config => {
|
||||
return config.plugins;
|
||||
}).catch(error => {
|
||||
console.log('cannot get web config:', error);
|
||||
return [];
|
||||
});
|
||||
}
|
||||
|
|
|
@ -152,13 +152,13 @@ var Dashboard = {
|
|||
processPluginConfigurationUpdateResult: function () {
|
||||
require(['loading', 'toast'], function (loading, toast) {
|
||||
loading.hide();
|
||||
toast(Globalize.translate('MessageSettingsSaved'));
|
||||
toast.default(Globalize.translate('MessageSettingsSaved'));
|
||||
});
|
||||
},
|
||||
processServerConfigurationUpdateResult: function (result) {
|
||||
require(['loading', 'toast'], function (loading, toast) {
|
||||
loading.hide();
|
||||
toast(Globalize.translate('MessageSettingsSaved'));
|
||||
toast.default(Globalize.translate('MessageSettingsSaved'));
|
||||
});
|
||||
},
|
||||
processErrorResponse: function (response) {
|
||||
|
@ -180,7 +180,7 @@ var Dashboard = {
|
|||
alert: function (options) {
|
||||
if (typeof options == 'string') {
|
||||
return void require(['toast'], function (toast) {
|
||||
toast({
|
||||
toast.default({
|
||||
text: options
|
||||
});
|
||||
});
|
||||
|
@ -477,37 +477,31 @@ function initClient() {
|
|||
|
||||
function loadPlugins(appHost, browser, shell) {
|
||||
console.debug('loading installed plugins');
|
||||
var list = [
|
||||
'plugins/playAccessValidation/plugin',
|
||||
'plugins/experimentalWarnings/plugin',
|
||||
'plugins/htmlAudioPlayer/plugin',
|
||||
'plugins/htmlVideoPlayer/plugin',
|
||||
'plugins/photoPlayer/plugin',
|
||||
'plugins/bookPlayer/plugin',
|
||||
'plugins/youtubePlayer/plugin',
|
||||
'plugins/backdropScreensaver/plugin',
|
||||
'plugins/logoScreensaver/plugin'
|
||||
];
|
||||
return new Promise(function (resolve, reject) {
|
||||
require(['webSettings'], function (webSettings) {
|
||||
webSettings.getPlugins().then(function (list) {
|
||||
// these two plugins are dependent on features
|
||||
if (!appHost.supports('remotecontrol')) {
|
||||
list.splice(list.indexOf('sessionPlayer'), 1);
|
||||
|
||||
if (appHost.supports('remotecontrol')) {
|
||||
list.push('plugins/sessionPlayer/plugin');
|
||||
|
||||
if (browser.chrome || browser.edgeChromium || browser.opera) {
|
||||
list.push('plugins/chromecastPlayer/plugin');
|
||||
if (!browser.chrome && !browser.opera) {
|
||||
list.splice(list.indexOf('chromecastPlayer', 1));
|
||||
}
|
||||
}
|
||||
|
||||
// add any native plugins
|
||||
if (window.NativeShell) {
|
||||
list = list.concat(window.NativeShell.getPlugins());
|
||||
}
|
||||
|
||||
return new Promise(function (resolve, reject) {
|
||||
Promise.all(list.map(loadPlugin)).then(function () {
|
||||
require(['packageManager'], function (packageManager) {
|
||||
packageManager.init().then(resolve, reject);
|
||||
});
|
||||
}, reject);
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function loadPlugin(url) {
|
||||
|
@ -532,7 +526,7 @@ function initClient() {
|
|||
|
||||
window.Emby.Page = appRouter;
|
||||
|
||||
require(['emby-button', 'scripts/themeLoader', 'libraryMenu', 'scripts/routes'], function () {
|
||||
require(['emby-button', 'scripts/autoThemes', 'libraryMenu', 'scripts/routes'], function () {
|
||||
Emby.Page.start({
|
||||
click: false,
|
||||
hashbang: true
|
||||
|
@ -653,8 +647,7 @@ function initClient() {
|
|||
nowPlayingHelper: componentsPath + '/playback/nowplayinghelper',
|
||||
pluginManager: componentsPath + '/pluginManager',
|
||||
packageManager: componentsPath + '/packageManager',
|
||||
screensaverManager: componentsPath + '/screensavermanager',
|
||||
chromecastHelper: 'plugins/chromecastPlayer/chromecastHelpers'
|
||||
screensaverManager: componentsPath + '/screensavermanager'
|
||||
};
|
||||
|
||||
requirejs.onError = onRequireJsError;
|
||||
|
@ -848,7 +841,7 @@ function initClient() {
|
|||
define('viewContainer', [componentsPath + '/viewContainer'], returnFirstDependency);
|
||||
define('dialogHelper', [componentsPath + '/dialogHelper/dialogHelper'], returnFirstDependency);
|
||||
define('serverNotifications', [scriptsPath + '/serverNotifications'], returnFirstDependency);
|
||||
define('skinManager', [componentsPath + '/skinManager'], returnFirstDependency);
|
||||
define('skinManager', [scriptsPath + '/themeManager'], returnFirstDependency);
|
||||
define('keyboardnavigation', [scriptsPath + '/keyboardNavigation'], returnFirstDependency);
|
||||
define('mouseManager', [scriptsPath + '/mouseManager'], returnFirstDependency);
|
||||
define('scrollManager', [componentsPath + '/scrollManager'], returnFirstDependency);
|
||||
|
|
|
@ -1,29 +0,0 @@
|
|||
import * as userSettings from 'userSettings';
|
||||
import skinManager from 'skinManager';
|
||||
import connectionManager from 'connectionManager';
|
||||
import events from 'events';
|
||||
|
||||
var currentViewType;
|
||||
pageClassOn('viewbeforeshow', 'page', function () {
|
||||
var classList = this.classList;
|
||||
var viewType = classList.contains('type-interior') || classList.contains('wizardPage') ? 'a' : 'b';
|
||||
|
||||
if (viewType !== currentViewType) {
|
||||
currentViewType = viewType;
|
||||
var theme;
|
||||
var context;
|
||||
|
||||
if (viewType === 'a') {
|
||||
theme = userSettings.dashboardTheme();
|
||||
context = 'serverdashboard';
|
||||
} else {
|
||||
theme = userSettings.theme();
|
||||
}
|
||||
|
||||
skinManager.setTheme(theme, context);
|
||||
}
|
||||
});
|
||||
|
||||
events.on(connectionManager, 'localusersignedin', function (e, user) {
|
||||
currentViewType = null;
|
||||
});
|
66
src/scripts/themeManager.js
Normal file
66
src/scripts/themeManager.js
Normal file
|
@ -0,0 +1,66 @@
|
|||
import * as webSettings from 'webSettings';
|
||||
|
||||
var themeStyleElement;
|
||||
var currentThemeId;
|
||||
|
||||
function unloadTheme() {
|
||||
var elem = themeStyleElement;
|
||||
if (elem) {
|
||||
elem.parentNode.removeChild(elem);
|
||||
themeStyleElement = null;
|
||||
currentThemeId = null;
|
||||
}
|
||||
}
|
||||
|
||||
function getThemes() {
|
||||
return webSettings.getThemes();
|
||||
}
|
||||
|
||||
function getThemeStylesheetInfo(id) {
|
||||
return getThemes().then(themes => {
|
||||
var theme = themes.find(theme => {
|
||||
return id ? theme.id === id : theme.default;
|
||||
});
|
||||
|
||||
return {
|
||||
stylesheetPath: 'themes/' + theme.id + '/theme.css',
|
||||
themeId: theme.id
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
function setTheme(id) {
|
||||
return new Promise(function (resolve, reject) {
|
||||
if (currentThemeId && currentThemeId === id) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
getThemeStylesheetInfo(id).then(function (info) {
|
||||
if (currentThemeId && currentThemeId === info.themeId) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
|
||||
var linkUrl = info.stylesheetPath;
|
||||
unloadTheme();
|
||||
|
||||
var link = document.createElement('link');
|
||||
link.setAttribute('rel', 'stylesheet');
|
||||
link.setAttribute('type', 'text/css');
|
||||
link.onload = function () {
|
||||
resolve();
|
||||
};
|
||||
|
||||
link.setAttribute('href', linkUrl);
|
||||
document.head.appendChild(link);
|
||||
themeStyleElement = link;
|
||||
currentThemeId = info.themeId;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
export default {
|
||||
getThemes: getThemes,
|
||||
setTheme: setTheme
|
||||
};
|
|
@ -112,7 +112,7 @@
|
|||
"Up": "Op",
|
||||
"Unplayed": "Ongespeel",
|
||||
"Unmute": "Ontstom",
|
||||
"UninstallPluginHeader": "Oninstalleer Plugin",
|
||||
"HeaderUninstallPlugin": "Oninstalleer Plugin",
|
||||
"UninstallPluginConfirmation": "Is jy seker jy wil voortgaan met die oninstallasie {0}?",
|
||||
"Uniform": "Uniform",
|
||||
"TvLibraryHelp": "Hersien die {0}TV benamings gids{1}.",
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
"BirthDateValue": "وُلد: {0}",
|
||||
"BirthPlaceValue": "مكان الميلاد: {0}",
|
||||
"Browse": "تصفح",
|
||||
"BrowsePluginCatalogMessage": "تصفح قائمتنا للملحق لترى المتوفر من الملاحق.",
|
||||
"MessageBrowsePluginCatalog": "تصفح قائمتنا للملحق لترى المتوفر من الملاحق.",
|
||||
"ButtonAdd": "إضافة",
|
||||
"ButtonAddMediaLibrary": "إضافة مكتبة وسائط",
|
||||
"ButtonAddScheduledTaskTrigger": "إضافة زناد",
|
||||
|
@ -92,7 +92,7 @@
|
|||
"CinemaModeConfigurationHelp": "الطور السينمائي يوفر أجواء سينمائية إلى قلب صالتك مع إمكانية تشغيل عروض إعلانية لأفلام أخرى وعرض مقدمات أخرى من انتقاءاتك قبل تشغيل الفيلم الرئيسي.",
|
||||
"CustomDlnaProfilesHelp": "إنشاء عرائض مخصوصه تستهدف جهازاً جديداً أو يمتطي حساباً نظامياً.",
|
||||
"DeathDateValue": "توفي: {0}",
|
||||
"DefaultErrorMessage": "كان هناك خطأ في معالجة الطلب. الرجاء المحاولة لاحقاً.",
|
||||
"ErrorDefault": "كان هناك خطأ في معالجة الطلب. الرجاء المحاولة لاحقاً.",
|
||||
"Delete": "حذف",
|
||||
"DeleteDeviceConfirmation": "هل أنت متأكد أنك تريد حذف هذا الجهاز؟ سيظهر الجهاز من جديد في المرة القادمة التي يسجل فها مستخدم دخوله عبره.",
|
||||
"DeleteImage": "حذف صورة",
|
||||
|
@ -110,7 +110,7 @@
|
|||
"ErrorAddingTunerDevice": "كان هناك خطأ في إضافة جهاز المولف. الرجاء التأكد من صلاحية الوصول إليه ثم عاود المحاولة.",
|
||||
"ErrorAddingXmlTvFile": "كان هناك خطأ في محاولة الوصول إلى ملف XMLTV. الرجاء التأكد من وجود الملف ثم حاول مرة أخرى.",
|
||||
"ErrorGettingTvLineups": "كان هناك خطأ في إنزال اصطفافات التلفاز. الرجاء التأكد من أن بياناتك صحيحة ثم عاود المحاولة.",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "وقت النهاية يجب أن يكون أكبر من وقت البداية.",
|
||||
"ErrorStartHourGreaterThanEnd": "وقت النهاية يجب أن يكون أكبر من وقت البداية.",
|
||||
"ErrorPleaseSelectLineup": "الرجاء اختيار اصطفاف ثم المحاولة مرة أخرى. إن لم تتوفر أية اصطفافات، فالرجاء التأكد من اسم المستخدم وكلمة المرور الخاصة بك، وتأكد من صحة رمزك البريدي.",
|
||||
"ErrorSavingTvProvider": "كان هناك خطأ في حفظ مزود التلفزة. الرجاء التأكد من صلاحية الوصول إليه ثم عاود المحاولة.",
|
||||
"ExitFullscreen": "الخروج من الشاشة الكاملة",
|
||||
|
@ -632,8 +632,8 @@
|
|||
"MoreUsersCanBeAddedLater": "يمكن اضافة المستخدمين لاحقا من لوحة العدادات.",
|
||||
"Mute": "صامت",
|
||||
"NextUp": "التالي",
|
||||
"NoNextUpItemsMessage": "لم يتم ايجاد شيء، إبدأ بمشاهدة برامجك!",
|
||||
"NoPluginConfigurationMessage": "هذا الملحق ليس له إعدادات تضبط.",
|
||||
"MessageNoNextUpItems": "لم يتم ايجاد شيء، إبدأ بمشاهدة برامجك!",
|
||||
"MessageNoPluginConfiguration": "هذا الملحق ليس له إعدادات تضبط.",
|
||||
"NumLocationsValue": "{0} مجلد(ات)",
|
||||
"Option3D": "ثلاثي أبعاد",
|
||||
"OptionAdminUsers": "المدراء",
|
||||
|
@ -772,7 +772,7 @@
|
|||
"PasswordMatchError": "كلمة السر وتاكيدها يجب ان يتطابقان.",
|
||||
"PasswordResetComplete": "لقد تم اعادة تعيين كلمة السر.",
|
||||
"PasswordResetConfirmation": "هل انت متاكد من انك تريد اعادة تعيين كلمة السر؟",
|
||||
"PasswordResetHeader": "إعادة تهيئة كلمة السر",
|
||||
"HeaderResetPassword": "إعادة تهيئة كلمة السر",
|
||||
"PasswordSaved": "تم حفظ كلمة السر.",
|
||||
"PictureInPicture": "صورة داخل صورة",
|
||||
"PinCodeResetComplete": "تمت إعادة تهيئة الرمز الشخصي",
|
||||
|
@ -783,7 +783,7 @@
|
|||
"RecommendationBecauseYouWatched": "لأنك شاهدت {0}",
|
||||
"RecommendationDirectedBy": "إخراج {0}",
|
||||
"RecommendationStarring": "بطولة {0}",
|
||||
"RecordingPathChangeMessage": "إن تغيير مجلد التسجيل لم يهجّر التسجيلات الموجودة من الموقع القديم إلى الموقع الجديد. سيتعين عليك أن تنقلهم بنفسك لو شئت.",
|
||||
"MessageChangeRecordingPath": "إن تغيير مجلد التسجيل لم يهجّر التسجيلات الموجودة من الموقع القديم إلى الموقع الجديد. سيتعين عليك أن تنقلهم بنفسك لو شئت.",
|
||||
"RememberMe": "تذكرني",
|
||||
"Rewind": "الترجيع",
|
||||
"Saturday": "السبت",
|
||||
|
@ -862,7 +862,7 @@
|
|||
"TitlePlayback": "تشغيل",
|
||||
"Tuesday": "الثلاثاء",
|
||||
"UninstallPluginConfirmation": "هل انت متاكد انك تريد إزالة تثبيت {0}؟",
|
||||
"UninstallPluginHeader": "الغاء الملحق",
|
||||
"HeaderUninstallPlugin": "الغاء الملحق",
|
||||
"Unmute": "غير صامت",
|
||||
"UserProfilesIntro": "إمبي يتضمن الدعم التلقائي حسابات المستخدمين، ما يتيح لكل مستخدم أن يحفظ إعدادات العرض الخاصة وحالات تشغيل الوسائط وخواص الرقابة الأبوية.",
|
||||
"ValueAlbumCount": "{0} ألبومـ(ات)",
|
||||
|
|
|
@ -508,7 +508,7 @@
|
|||
"NewEpisodes": "Нови епизоди",
|
||||
"NewEpisodesOnly": "Само нови епизоди",
|
||||
"News": "Новини",
|
||||
"NoNextUpItemsMessage": "Нищо не е намерено. Започнете да гледате вашите предавания!",
|
||||
"MessageNoNextUpItems": "Нищо не е намерено. Започнете да гледате вашите предавания!",
|
||||
"NoSubtitleSearchResultsFound": "Няма намерени резултати.",
|
||||
"NoSubtitles": "Без",
|
||||
"None": "Нищо",
|
||||
|
@ -613,7 +613,7 @@
|
|||
"OriginalAirDateValue": "Дата на първоначално излъчване: {0}",
|
||||
"Overview": "Обобщение",
|
||||
"ParentalRating": "Родителска оценка",
|
||||
"PasswordResetHeader": "Зануляване на паролата",
|
||||
"HeaderResetPassword": "Зануляване на паролата",
|
||||
"People": "Хора",
|
||||
"Photos": "Снимки",
|
||||
"PictureInPicture": "Картина в картина",
|
||||
|
@ -748,7 +748,7 @@
|
|||
"TrackCount": "{0} песни",
|
||||
"Trailers": "Трейлъри",
|
||||
"Tuesday": "Вторник",
|
||||
"UninstallPluginHeader": "Деинсталиране на приставката",
|
||||
"HeaderUninstallPlugin": "Деинсталиране на приставката",
|
||||
"Unmute": "Без заглушаване",
|
||||
"Unplayed": "Непускано",
|
||||
"Upload": "Качване",
|
||||
|
@ -841,7 +841,7 @@
|
|||
"OptionResElement": "рес. елемент",
|
||||
"ButtonChangeServer": "Смяна на сървър",
|
||||
"ButtonAddImage": "Добавяне на изображение",
|
||||
"BrowsePluginCatalogMessage": "За да видите наличните добавки, прегледайте каталога с добавките.",
|
||||
"MessageBrowsePluginCatalog": "За да видите наличните добавки, прегледайте каталога с добавките.",
|
||||
"Box": "Кутия",
|
||||
"AlwaysPlaySubtitlesHelp": "Поднадписите, съвпадащи с езика от настройките, ще се зареждат, независимо от езика на аудио то.",
|
||||
"BookLibraryHelp": "Поддържат се аудио книги такива съдържащи текст. Проверете ръководството за наименуване {1} на книги {0}.",
|
||||
|
@ -882,7 +882,7 @@
|
|||
"CinemaModeConfigurationHelp": "Режимът на кино носи театрално изживяване направо във вашата всекидневна с възможност за пускане на трейлъри и персонализирани интродукции преди основния филм.",
|
||||
"ChangingMetadataImageSettingsNewContent": "Промените в настройките за изтегляне на метаданни или изображения ще се прилагат само за ново съдържание, добавено към вашата библиотека. За да приложите промените към съществуващите заглавия, ще трябва да обновите метаданните им ръчно.",
|
||||
"DefaultMetadataLangaugeDescription": "Това са настройки по подразбиране и могат да се променят на база библиотека.",
|
||||
"DefaultErrorMessage": "Възникна грешка при изпълнение на заявката. Моля опитайте по-късно.",
|
||||
"ErrorDefault": "Възникна грешка при изпълнение на заявката. Моля опитайте по-късно.",
|
||||
"CustomDlnaProfilesHelp": "Създаване на персонализиран профил за целево устройство или заменяне на системния профил.",
|
||||
"CopyStreamURL": "Копиране URL на стрийма",
|
||||
"CopyStreamURLError": "Възникна грешка при копиране на URL.",
|
||||
|
@ -903,7 +903,7 @@
|
|||
"ButtonToggleContextMenu": "Повече",
|
||||
"ErrorSavingTvProvider": "Има проблем със запазването на ТВ доставчика.Убедете се ,че е достъпен и опитайте отново.",
|
||||
"ErrorPleaseSelectLineup": "Моля изберете списък и опитайте отново.Ако няма налични списъци се убедете ,че името,паролата и пощенския код са точни.",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "Времето за край трябва да бъде по-голямо от началното време.",
|
||||
"ErrorStartHourGreaterThanEnd": "Времето за край трябва да бъде по-голямо от началното време.",
|
||||
"ErrorGettingTvLineups": "Има проблем при опита да бъдат свалени списъци с ТВ.Убедете се ,че информацията е правилна и опитайте отново.",
|
||||
"ErrorDeletingItem": "Има проблем при опита да бъде изтрит файла от сървъра.Убедете се ,че сървъра има право да трие папки и опитайте отново.",
|
||||
"ErrorAddingXmlTvFile": "Има проблем при достъпа на XMLTV файла.Уверете се ,че е наличен и пробвайте отново.",
|
||||
|
@ -1197,8 +1197,8 @@
|
|||
"LabelProtocolInfo": "Информация за протокола:",
|
||||
"LabelPostProcessorArgumentsHelp": "Използвай {path},като път за записване на файла.",
|
||||
"LabelPostProcessorArguments": "Аргументи на командния ред след обработка:",
|
||||
"EnableBlurhashHelp": "Изображенията, които все още се зареждат, ще се показват чрез функцията\"размито запълване\"",
|
||||
"EnableBlurhash": "Активиране на функцията \"размито запълване\" за изображения",
|
||||
"EnableBlurHashHelp": "Изображенията, които все още се зареждат, ще се показват чрез функцията\"размито запълване\"",
|
||||
"EnableBlurHash": "Активиране на функцията \"размито запълване\" за изображения",
|
||||
"UnsupportedPlayback": "Джелифин не може да дешифрира съдържание, защитено с DRM, но въпреки това цялото съдържание ще бъде обработено, включително защитените заглавия. Някои файлове могат да изглеждат напълно черни поради криптиране или други неподдържани функции, например интерактивни заглавия.",
|
||||
"OnApplicationStartup": "При стартиране на приложението",
|
||||
"EveryXHours": "На всеки {0} часа",
|
||||
|
@ -1423,7 +1423,7 @@
|
|||
"RefreshDialogHelp": "Метаданните се обновяват въз основа на настройките и интернет услугите, които са активирани от таблото за управление на сървъра.",
|
||||
"Recordings": "Записи",
|
||||
"RecordingScheduled": "Записът е насрочен.",
|
||||
"RecordingPathChangeMessage": "Промяната на вашата папка за запис няма да мигрира съществуващите записи от старото местоположение към новото.Необходимо е да направите това ръчно.",
|
||||
"MessageChangeRecordingPath": "Промяната на вашата папка за запис няма да мигрира съществуващите записи от старото местоположение към новото.Необходимо е да направите това ръчно.",
|
||||
"RecordSeries": "Запиши сериал",
|
||||
"RecommendationStarring": "В главните роли {0}",
|
||||
"RecommendationDirectedBy": "Режисьор {0}",
|
||||
|
@ -1434,7 +1434,7 @@
|
|||
"PreferEmbeddedEpisodeInfosOverFileNames": "Предпочитай \"вградената\" информация за епизода вместо името на файла",
|
||||
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Това използва информацията за епизода от вградените метаданни, ако е налична.",
|
||||
"PreferEmbeddedTitlesOverFileNamesHelp": "Това определя заглавието по подразбиране, когато няма интернет метаданни или локални метаданни.",
|
||||
"PluginInstalledMessage": "Добавката е успешно инсталирана. Джелифин ще трябва да бъде рестартиран, за да влязат в сила промените.",
|
||||
"MessagePluginInstalled": "Добавката е успешно инсталирана. Джелифин ще трябва да бъде рестартиран, за да влязат в сила промените.",
|
||||
"PleaseSelectTwoItems": "Моля, изберете поне два елемента.",
|
||||
"PleaseEnterNameOrId": "Моля, въведете име или външен идентификатор.",
|
||||
"PleaseConfirmPluginInstallation": "Моля, щракнете върху OK, за да потвърдите, че сте прочели горното и искате да продължите с инсталирането на добавката.",
|
||||
|
@ -1519,7 +1519,7 @@
|
|||
"OnlyForcedSubtitles": "Само принудително",
|
||||
"OneChannel": "Един канал",
|
||||
"NoSubtitlesHelp": "Субтитрите няма да бъдат заредени по подразбиране. Те все още могат да бъдат включени ръчно по време на възпроизвеждане.",
|
||||
"NoPluginConfigurationMessage": "Тази добавка няма настройки за конфигуриране.",
|
||||
"MessageNoPluginConfiguration": "Тази добавка няма настройки за конфигуриране.",
|
||||
"NoNewDevicesFound": "Не са намерени нови устройства. За да добавите нов тунер, затворете този диалогов прозорец и въведете ръчно информацията за устройството.",
|
||||
"NoCreatedLibraries": "Изглежда, че все още не сте създали библиотеки. {0} Искате ли да ги създадете сега? {1}",
|
||||
"NextUp": "Следващ по ред",
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
"AspectRatio": "Relació d'aspecte",
|
||||
"AttributeNew": "Nou",
|
||||
"Audio": "Àudio",
|
||||
"BrowsePluginCatalogMessage": "Consulta el nostre catàleg per veure els complements disponibles.",
|
||||
"MessageBrowsePluginCatalog": "Consulta el nostre catàleg per veure els complements disponibles.",
|
||||
"ButtonAdd": "Afegeix",
|
||||
"ButtonAddMediaLibrary": "Afegir Biblioteca Multimèdia",
|
||||
"ButtonAddScheduledTaskTrigger": "Afegir Disparador",
|
||||
|
@ -84,7 +84,7 @@
|
|||
"ConfirmDeletion": "Confirma supressió",
|
||||
"Connect": "Connecta",
|
||||
"Continuing": "Continuant",
|
||||
"DefaultErrorMessage": "Hi ha hagut un error processant la petició. Intenta-ho més tard si et plau.",
|
||||
"ErrorDefault": "Hi ha hagut un error processant la petició. Intenta-ho més tard si et plau.",
|
||||
"Delete": "Esborra",
|
||||
"DeleteImage": "Esborra Imatge",
|
||||
"DeleteImageConfirmation": "Esteu segur que voleu suprimir aquesta imatge?",
|
||||
|
@ -490,8 +490,8 @@
|
|||
"NewCollectionNameExample": "Exemple: Col·leció Star Wars",
|
||||
"NewEpisodes": "Nous episodis",
|
||||
"NewEpisodesOnly": "Només nous episodis",
|
||||
"NoNextUpItemsMessage": "Cap trobat. Comença a mirar els teus programes!",
|
||||
"NoPluginConfigurationMessage": "Aquest complement no té opcions de configuració.",
|
||||
"MessageNoNextUpItems": "Cap trobat. Comença a mirar els teus programes!",
|
||||
"MessageNoPluginConfiguration": "Aquest complement no té opcions de configuració.",
|
||||
"NoSubtitleSearchResultsFound": "No s'han trobat resultats.",
|
||||
"NoSubtitles": "Sense subtítols",
|
||||
"None": "Cap",
|
||||
|
@ -708,7 +708,7 @@
|
|||
"TrackCount": "{0} pistes",
|
||||
"Tuesday": "Dimarts",
|
||||
"UninstallPluginConfirmation": "Estàs segur que vols desinstal·lar {0}?",
|
||||
"UninstallPluginHeader": "Desinstal·lar Complement.",
|
||||
"HeaderUninstallPlugin": "Desinstal·lar Complement.",
|
||||
"Unmute": "De-silencia",
|
||||
"Unrated": "Sense valorar",
|
||||
"Up": "Amunt",
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"AccessRestrictedTryAgainLater": "Přístup je v současné době omezen. Prosím zkuste to znovu později.",
|
||||
"Actor": "Herec",
|
||||
"Add": "Přidat",
|
||||
"AddItemToCollectionHelp": "Přidat položky do kolekce jejich vyhledáním a použitím pravého tlačítka myši nebo klepnutím na tlačítko menu - přidat do sbírky.",
|
||||
"AddItemToCollectionHelp": "Přidat položky do kolekce jejich vyhledáním a použitím pravého tlačítka myši nebo kliknutím na příslušnou položku v nabídce.",
|
||||
"AddToCollection": "Přidat do kolekce",
|
||||
"AddToPlayQueue": "Přidat do fronty k přehrání",
|
||||
"AddToPlaylist": "Přidat do playlistu",
|
||||
|
@ -34,7 +34,7 @@
|
|||
"Books": "Knihy",
|
||||
"Box": "Pouzdro",
|
||||
"BoxRear": "Zadní část pouzdra",
|
||||
"BrowsePluginCatalogMessage": "Prohlédněte si náš katalog, kde najdete dostupné zásuvné moduly.",
|
||||
"MessageBrowsePluginCatalog": "Prohlédněte si náš katalog, kde najdete dostupné zásuvné moduly.",
|
||||
"ButtonAdd": "Přidat",
|
||||
"ButtonAddMediaLibrary": "Přidat knihovnu médií",
|
||||
"ButtonAddScheduledTaskTrigger": "Přidat Spouštěč",
|
||||
|
@ -131,7 +131,7 @@
|
|||
"DatePlayed": "Datum přehrání",
|
||||
"DeathDateValue": "Zemřel: {0}",
|
||||
"Default": "Výchozí",
|
||||
"DefaultErrorMessage": "Došlo k chybě při zpracování požadavku. Prosím zkuste to znovu později.",
|
||||
"ErrorDefault": "Došlo k chybě při zpracování požadavku. Prosím zkuste to znovu později.",
|
||||
"DefaultMetadataLangaugeDescription": "Toto jsou vaše výchozí hodnoty a lze je přizpůsobit na základě jednotlivých knihoven.",
|
||||
"DefaultSubtitlesHelp": "Titulky jsou načteny na základě výchozích a vynucených nastavení ve vložených metadatech. Jazykové preference jsou vzaty v úvahu, pokud je k dispozici více možností.",
|
||||
"Delete": "Odstranit",
|
||||
|
@ -144,7 +144,7 @@
|
|||
"Desktop": "PC",
|
||||
"DeviceAccessHelp": "Platí pouze pro zařízení, která mohou být jednoznačně identifikována. Těmto zařízením nebude bráněno v přístupu. Filtrování přístupu uživatelských zařízení bude bránit v užívání nových zařízení, dokud nebudou schváleny.",
|
||||
"DirectPlaying": "Přímé přehrání",
|
||||
"DirectStreamHelp1": "Médium je kompatibilní se zařízením, pokud jde o rozlišení a typ média (H.264, AC3, atd.), ale je v nekompatibilním kontejneru (.mkv, .avi, .wmv, atd.). Video bude za běhu přebaleno, než bude streamováno do zařízení.",
|
||||
"DirectStreamHelp1": "Médium je kompatibilní se zařízením, pokud jde o rozlišení a typ média (H.264, AC3, atd.), ale je v nekompatibilním kontejneru (.mkv, .avi, .wmv, atd.). Video bude za běhu přebaleno, než bude odesláno do zařízení.",
|
||||
"DirectStreaming": "Přímé streamování",
|
||||
"Director": "Režisér",
|
||||
"Disc": "Disk",
|
||||
|
@ -185,7 +185,7 @@
|
|||
"ErrorAddingXmlTvFile": "Nastala chyba při přístupu k XMLTV souboru. Ujistěte se, že soubor existuje a zkuste jej znovu otevřít.",
|
||||
"ErrorDeletingItem": "Při odstranění položky ze serveru Jellyfin došlo k chybě. Zkontrolujte prosím, zda má server Jellyfin oprávnění k zápisu do složky médií, a zkuste to prosím znovu.",
|
||||
"ErrorGettingTvLineups": "Došlo k chybě při stahování TV sestav. Ujistěte se prosím, že zadané informace jsou správné a zkuste to znovu.",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "Čas ukončení musí být větší než čas startu.",
|
||||
"ErrorStartHourGreaterThanEnd": "Čas ukončení musí být větší než čas startu.",
|
||||
"ErrorPleaseSelectLineup": "Vyberte prosím sestavu a zkuste to znovu. Pokud nejsou k dispozici žádné sestavy, zkontrolujte, zda je vaše uživatelské jméno, heslo a poštovní směrovací číslo správné.",
|
||||
"ErrorSavingTvProvider": "Při ukládání poskytovatele TV došlo k chybě. Prosím, ujistěte se, že je přístupný a zkuste to znovu.",
|
||||
"ExitFullscreen": "Opustit celou obrazovku",
|
||||
|
@ -235,7 +235,7 @@
|
|||
"HeaderAlert": "Upozornění",
|
||||
"HeaderApiKey": "Klíč Api",
|
||||
"HeaderApiKeys": "Klíče API",
|
||||
"HeaderApiKeysHelp": "Externí aplikace musí mít klíč k API, aby mohly komunikovat se serverem Jellyfin. Klíče jsou vydávány přihlášením k účtu Jellyfin nebo ruční žádostí o klíč.",
|
||||
"HeaderApiKeysHelp": "Externí aplikace musí mít klíč k API, aby mohly komunikovat se serverem. Klíče jsou vydávány přihlášením k běžnému uživatelskému účtu nebo ruční žádostí o klíč.",
|
||||
"HeaderApp": "Aplikace",
|
||||
"HeaderAudioBooks": "Audio knihy",
|
||||
"HeaderAudioSettings": "Nastavení zvuku",
|
||||
|
@ -341,7 +341,7 @@
|
|||
"HeaderPreferredMetadataLanguage": "Preferovaný jazyk metadat",
|
||||
"HeaderProfile": "Profil",
|
||||
"HeaderProfileInformation": "Informace o profilu",
|
||||
"HeaderProfileServerSettingsHelp": "Tyto hodnoty určují, jak se server Jellyfin bude zobrazovat v zařízení.",
|
||||
"HeaderProfileServerSettingsHelp": "Tyto hodnoty určují, jak se server bude zobrazovat klientům.",
|
||||
"HeaderRecentlyPlayed": "Naposledy přehráváno",
|
||||
"HeaderRecordingOptions": "Nastavení nahrávání",
|
||||
"HeaderRecordingPostProcessing": "Následné zpracování nahrávek",
|
||||
|
@ -358,13 +358,13 @@
|
|||
"HeaderSecondsValue": "{0} sekund",
|
||||
"HeaderSelectCertificatePath": "Vyber cestu k certifikátu",
|
||||
"HeaderSelectMetadataPath": "Vyberte cestu k metadatům",
|
||||
"HeaderSelectMetadataPathHelp": "Výběr nebo zadání cesty, kde chcete uložit metadata. Složka musí být zapisovatelná.",
|
||||
"HeaderSelectMetadataPathHelp": "Procházejte nebo zadejte cestu, kde chcete uložit metadata. Složka musí být zapisovatelná.",
|
||||
"HeaderSelectPath": "Vybrat složku",
|
||||
"HeaderSelectServer": "Vyber Server",
|
||||
"HeaderSelectServerCachePath": "Vyber složku pro vyrovnávací paměť serveru",
|
||||
"HeaderSelectServerCachePathHelp": "Vyberte nebo zadejte složku vyrovnávací paměti souborů. Složka musí být zapisovatelná.",
|
||||
"HeaderSelectTranscodingPath": "Zvolte dočasnou složku pro překódovávání médií",
|
||||
"HeaderSelectTranscodingPathHelp": "Vyberte nebo zadejte složku pro dočasné soubory překódování. Složka musí být zapisovatelná.",
|
||||
"HeaderSelectTranscodingPathHelp": "Vyberte nebo zadejte složku pro soubory překódování. Složka musí být zapisovatelná.",
|
||||
"HeaderSendMessage": "Poslat zprávu",
|
||||
"HeaderSeries": "Seriál",
|
||||
"HeaderSeriesOptions": "Nastavení seriálu",
|
||||
|
@ -410,8 +410,8 @@
|
|||
"Home": "Domů",
|
||||
"Identify": "Identifikovat",
|
||||
"Images": "Obrázky",
|
||||
"ImportFavoriteChannelsHelp": "Pokud je povoleno, jen kanály označené jako oblíbené budou importována na zařízení tuneru.",
|
||||
"ImportMissingEpisodesHelp": "Informace o chybějících epizodách budou importovány do databáze Jellyfin a zobrazí se u sezón a seriálů. Skenování knihovny se tím může značně prodloužit.",
|
||||
"ImportFavoriteChannelsHelp": "Jen kanály označené jako oblíbené na zařízení tuneru budou importovány.",
|
||||
"ImportMissingEpisodesHelp": "Informace o chybějících epizodách budou importovány do databáze a zobrazí se u sezón a seriálů. Skenování knihovny se tím může značně prodloužit.",
|
||||
"InstallingPackage": "Instalace {0} (Verze {1})",
|
||||
"InstantMix": "Okamžité míchání",
|
||||
"ItemCount": "{0} položek",
|
||||
|
@ -441,14 +441,14 @@
|
|||
"LabelAppName": "Název aplikace",
|
||||
"LabelAppNameExample": "Příklad: Sickbeard, Sonarr",
|
||||
"LabelArtists": "Umělci:",
|
||||
"LabelArtistsHelp": "Odděl pomocí ;",
|
||||
"LabelArtistsHelp": "Více interpretů se odděluje pomocí středníku.",
|
||||
"LabelAudio": "Zvuk",
|
||||
"LabelAudioLanguagePreference": "Preferovaný jazyk zvuku:",
|
||||
"LabelBindToLocalNetworkAddress": "Vázat na místní síťovou adresu:",
|
||||
"LabelBindToLocalNetworkAddressHelp": "Volitelné. Změní místní IP adresu, na kterou se váže server HTTP. Pokud je ponecháno prázdné, server bude svázán se všemi dostupnými adresami. Změna této hodnoty vyžaduje restartování serveru Jellyfin.",
|
||||
"LabelBindToLocalNetworkAddressHelp": "Změní místní IP adresu serveru HTTP. Pokud je ponecháno prázdné, server bude svázán se všemi dostupnými adresami. Změna této hodnoty vyžaduje restartování serveru Jellyfin.",
|
||||
"LabelBirthDate": "Datum narození:",
|
||||
"LabelBirthYear": "Rok narození:",
|
||||
"LabelBlastMessageInterval": "Doba zobrazení zprávy (v sekundách)",
|
||||
"LabelBlastMessageInterval": "Doba zobrazení zprávy",
|
||||
"LabelBlastMessageIntervalHelp": "Určuje dobu trvání v sekundách mezi zobrazením aktuálních zpráv.",
|
||||
"LabelCachePath": "Složka pro cache:",
|
||||
"LabelCachePathHelp": "Zadejte vlastní umístění pro serverové dočasné soubory, jako jsou obrázky. Ponechte prázdné, pokud chcete použít výchozí nastavení serveru.",
|
||||
|
@ -461,7 +461,7 @@
|
|||
"LabelCriticRating": "Hodnocení kritiků:",
|
||||
"LabelCurrentPassword": "Aktuální heslo:",
|
||||
"LabelCustomCss": "Vlastní CSS:",
|
||||
"LabelCustomCssHelp": "Aplikovat vaše vlastní styly do webového rozhraní.",
|
||||
"LabelCustomCssHelp": "Aplikovat vaše vlastní styly webového rozhraní.",
|
||||
"LabelCustomDeviceDisplayName": "Jméno pro zobrazení:",
|
||||
"LabelCustomDeviceDisplayNameHelp": "Nahradit vlastním názvem zobrazení nebo ponechte prázdné, aby název byl určen zařízením.",
|
||||
"LabelCustomRating": "Vlastní hodnocení:",
|
||||
|
@ -495,16 +495,16 @@
|
|||
"LabelEnableAutomaticPortMapHelp": "Automaticky zpřístupní port na vašem routeru pomocí technologie UPnP. Nemusí fungovat u některých routerů. Změny se projeví až po restartování serveru.",
|
||||
"LabelEnableBlastAliveMessages": "Vytroubit zprávu do světa",
|
||||
"LabelEnableBlastAliveMessagesHelp": "Tuto možnost povolte, pokud není server zjistitelný jinými UPnP zařízeními v síti.",
|
||||
"LabelEnableDlnaClientDiscoveryInterval": "Čas pro vyhledání klienta (sekund)",
|
||||
"LabelEnableDlnaClientDiscoveryInterval": "Interval pro vyhledání klienta",
|
||||
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Určuje interval mezi vyhledáváním SSDP, které Jellyfin provádí.",
|
||||
"LabelEnableDlnaDebugLogging": "Povolit DLNA protokolování (pro ladění)",
|
||||
"LabelEnableDlnaDebugLoggingHelp": "Vytváří velké soubory se záznamy a doporučuje se používat pouze pro potřeby odstraňování problémů.",
|
||||
"LabelEnableDlnaPlayTo": "Povolit DLNA přehrávání",
|
||||
"LabelEnableDlnaPlayToHelp": "Umí detekovat zařízení v rámci vaší sítě a nabízí možnost jeho dálkového ovládání.",
|
||||
"LabelEnableDlnaPlayToHelp": "Umí detekovat zařízení v rámci vaší sítě a nabízí možnost jejich dálkového ovládání.",
|
||||
"LabelEnableDlnaServer": "Povolit DLNA server",
|
||||
"LabelEnableDlnaServerHelp": "Umožňuje zařízením UPnP v síti procházet a přehrávat obsah.",
|
||||
"LabelEnableRealtimeMonitor": "Povolit sledování v reálném čase",
|
||||
"LabelEnableRealtimeMonitorHelp": "Změny budou zpracovány okamžitě, v podporovaných souborových systémech.",
|
||||
"LabelEnableRealtimeMonitorHelp": "V podporovaných souborových systémech budou změny zpracovány okamžitě.",
|
||||
"LabelEnableSingleImageInDidlLimit": "Limit na jednotlivé vložení obrázku",
|
||||
"LabelEnableSingleImageInDidlLimitHelp": "Některá zařízení nebudou videa zobrazovat správně, pokud je více obrazů uloženo v DIDL.",
|
||||
"LabelEndDate": "Datum ukončení:",
|
||||
|
@ -521,14 +521,14 @@
|
|||
"LabelFormat": "Formát:",
|
||||
"LabelFriendlyName": "Přívětivý název:",
|
||||
"LabelGroupMoviesIntoCollections": "Seskupit filmy do kolekcí",
|
||||
"LabelGroupMoviesIntoCollectionsHelp": "Při zobrazení seznamů filmu, budou filmy patřící do kolekce, zobrazeny jako jedna položka.",
|
||||
"LabelGroupMoviesIntoCollectionsHelp": "Při zobrazení seznamu filmů budou filmy v kolekci zobrazeny jako jedna položka.",
|
||||
"LabelH264Crf": "H264 kódování CRF:",
|
||||
"LabelEncoderPreset": "Přednastavení H264 kódování:",
|
||||
"LabelHardwareAccelerationType": "Hardwarová akcelerace:",
|
||||
"LabelHardwareAccelerationTypeHelp": "Hardwarová akcelerace vyžaduje další konfiguraci.",
|
||||
"LabelHomeScreenSectionValue": "Sekce domovské obrazovky {0}:",
|
||||
"LabelHttpsPort": "Lokální HTTPS port:",
|
||||
"LabelHttpsPortHelp": "Číslo portu TCP, ke kterému by se měl HTTPS server Jellyfin připojit.",
|
||||
"LabelHttpsPortHelp": "Číslo portu TCP serveru HTTPS.",
|
||||
"LabelIconMaxHeight": "Maximální výška ikon:",
|
||||
"LabelIconMaxHeightHelp": "Maximální rozlišení ikon nabízené prostřednictvím upnp:icon.",
|
||||
"LabelIconMaxWidth": "Maximální šířka ikon:",
|
||||
|
@ -552,7 +552,7 @@
|
|||
"LabelLanguage": "Jazyk:",
|
||||
"LabelLineup": "V pořadí:",
|
||||
"LabelLocalHttpServerPortNumber": "Lokální HTTP port:",
|
||||
"LabelLocalHttpServerPortNumberHelp": "Číslo portu TCP, ke kterému by se měl HTTP server Jellyfin připojit.",
|
||||
"LabelLocalHttpServerPortNumberHelp": "Číslo portu TCP HTTP serveru.",
|
||||
"LabelLockItemToPreventChanges": "Uzamknout položku pro zabránění budoucích změn",
|
||||
"LabelLoginDisclaimer": "Zřeknutí se zodpovědnosti při přihlášení:",
|
||||
"LabelLoginDisclaimerHelp": "Zpráva, která se zobrazí v dolní části přihlašovací stránky.",
|
||||
|
@ -576,7 +576,7 @@
|
|||
"LabelMetadataReaders": "Čtečky metadat:",
|
||||
"LabelMetadataReadersHelp": "Seřaďte své preferované lokální zdroje metadat dle priority. První nalezená data budou načtena.",
|
||||
"LabelMetadataSavers": "Střadatelé metadat:",
|
||||
"LabelMetadataSaversHelp": "Vyberte formáty souborů pro uložení metadat.",
|
||||
"LabelMetadataSaversHelp": "Vyberte formáty souborů, které chcete použít pro ukládání metadat.",
|
||||
"LabelMethod": "Metoda:",
|
||||
"LabelMinBackdropDownloadWidth": "Maximální šířka pro stažení pozadí:",
|
||||
"LabelMinResumeDuration": "Minimální doba trvání:",
|
||||
|
@ -592,7 +592,7 @@
|
|||
"LabelMovieCategories": "Filmové kategorie:",
|
||||
"LabelMoviePrefix": "Předpona filmu:",
|
||||
"LabelMoviePrefixHelp": "Pokud je v názvech filmů použita předpona, zadejte ji sem, aby ji server mohl správně zpracovat.",
|
||||
"LabelMovieRecordingPath": "Složka pro nahrávání filmů (volitelné):",
|
||||
"LabelMovieRecordingPath": "Umístění pro nahrávání filmů:",
|
||||
"LabelMusicStreamingTranscodingBitrate": "Datový tok pro překódování hudby:",
|
||||
"LabelMusicStreamingTranscodingBitrateHelp": "Zadejte maximální datový tok pro streamování hudby.",
|
||||
"LabelName": "Jméno:",
|
||||
|
@ -605,7 +605,7 @@
|
|||
"LabelNumber": "Číslo:",
|
||||
"LabelNumberOfGuideDays": "Počet dnů programového průvodce ke stažení:",
|
||||
"LabelNumberOfGuideDaysHelp": "Stažení více dnů televizního průvodce umožňuje naplánovat nahrávání na delší dobu dopředu, ale trvá déle. Automatické nastavení určí počet podle počtu kanálů.",
|
||||
"LabelOptionalNetworkPath": "(Nepovinné) Sdílená síťová složka:",
|
||||
"LabelOptionalNetworkPath": "Sdílená síťová složka:",
|
||||
"LabelOriginalAspectRatio": "Původní poměr stran:",
|
||||
"LabelOriginalTitle": "Originální název:",
|
||||
"LabelOverview": "Přehled:",
|
||||
|
@ -645,7 +645,7 @@
|
|||
"LabelRefreshMode": "Mód obnovy:",
|
||||
"LabelReleaseDate": "Datum vydání:",
|
||||
"LabelRemoteClientBitrateLimit": "Datový tok streamování do Internetu (Mbps):",
|
||||
"LabelRuntimeMinutes": "Délka (v minutách):",
|
||||
"LabelRuntimeMinutes": "Délka:",
|
||||
"LabelSaveLocalMetadata": "Uložit přebaly a metadata do složky s médii",
|
||||
"LabelSaveLocalMetadataHelp": "Povolíte-li uložení přebalů a metadat do složky s médii bude možné je jednoduše upravovat.",
|
||||
"LabelScheduledTaskLastRan": "Poslední spuštění {0}, zabralo {1}.",
|
||||
|
@ -657,7 +657,7 @@
|
|||
"LabelSelectVersionToInstall": "Vyber verzi k instalaci:",
|
||||
"LabelSendNotificationToUsers": "Odeslat oznámení pro:",
|
||||
"LabelSerialNumber": "Sériové číslo",
|
||||
"LabelSeriesRecordingPath": "Složka pro nahrávání seriálů (volitelné):",
|
||||
"LabelSeriesRecordingPath": "Umístění pro nahrávání seriálů:",
|
||||
"LabelServerHostHelp": "192.168.1.100:8096 nebo https://mujserver.cz",
|
||||
"LabelSkipBackLength": "Délka posunu zpět:",
|
||||
"LabelSkipForwardLength": "Délka posunu vpřed:",
|
||||
|
@ -717,7 +717,7 @@
|
|||
"LabelYoureDone": "Hotovo!",
|
||||
"LabelZipCode": "PSČ:",
|
||||
"LabelffmpegPath": "FFmpeg - cesta:",
|
||||
"LabelffmpegPathHelp": "Cesta k souboru aplikace ffmpeg, nebo složka obsahující aplikaci ffmpeg.",
|
||||
"LabelffmpegPathHelp": "Cesta k souboru aplikace ffmpeg nebo složka obsahující aplikaci ffmpeg.",
|
||||
"Large": "Velký",
|
||||
"LatestFromLibrary": "Nejnovější {0}",
|
||||
"LearnHowYouCanContribute": "Zjistěte, jak můžete přispět.",
|
||||
|
@ -798,7 +798,7 @@
|
|||
"MessageUnsetContentHelp": "Obsah je zobrazen pomocí prostých složek. Pro dosažení nejlepších výsledků pomocí správce metadat nastavte typy obsahu pod-složek.",
|
||||
"MessageYouHaveVersionInstalled": "V současné době máte instalovánu verzi {0}.",
|
||||
"MetadataManager": "Manažer metadat",
|
||||
"MetadataSettingChangeHelp": "Změna nastavení metadat bude mít vliv na nový obsah, který bude přidáván. Chcete-li aktualizovat stávající obsah, otevřte obrazovku s detailem a klepněte na tlačítko Aktualizovat, nebo proveďte hromadnou aktualizaci pomocí správce metadat.",
|
||||
"MetadataSettingChangeHelp": "Změna nastavení metadat bude mít vliv na obsah, který bude nově přidán v budoucnu. Chcete-li aktualizovat stávající obsah, otevřete obrazovku s podrobnostmi a klikněte na tlačítko Aktualizovat, nebo proveďte hromadnou aktualizaci pomocí správce metadat.",
|
||||
"MinutesAfter": "minut po",
|
||||
"MinutesBefore": "minut předem",
|
||||
"Mobile": "Mobilní",
|
||||
|
@ -819,8 +819,8 @@
|
|||
"News": "Zpravodajství",
|
||||
"Next": "Další",
|
||||
"No": "Ne",
|
||||
"NoNextUpItemsMessage": "Nic nenalezeno. Začněte sledovat Vaše oblíbené seriály!",
|
||||
"NoPluginConfigurationMessage": "Tento zásuvný modul nemá žádné nastavení.",
|
||||
"MessageNoNextUpItems": "Nic nenalezeno. Začněte sledovat Vaše oblíbené seriály!",
|
||||
"MessageNoPluginConfiguration": "Tento zásuvný modul nemá žádné nastavení.",
|
||||
"NoSubtitleSearchResultsFound": "Žádné výsledky.",
|
||||
"NoSubtitles": "Žádné",
|
||||
"NoSubtitlesHelp": "Ve výchozím nastavení nebudou titulky načteny. Během přehrávání však mohou být manuálně zapnuty.",
|
||||
|
@ -852,7 +852,7 @@
|
|||
"OptionAuto": "Automaticky",
|
||||
"OptionAutomatic": "Automaticky",
|
||||
"OptionAutomaticallyGroupSeries": "Automatické sloučení k seriálu, které jsou ve více složkách",
|
||||
"OptionAutomaticallyGroupSeriesHelp": "Pokud je povoleno, budou díly seriálu uložené ve více adresářích v této knihovně, automaticky sloučeny k jednomu seriálu.",
|
||||
"OptionAutomaticallyGroupSeriesHelp": "Seriály uložené ve více složkách v této knihovně budou automaticky sloučeny do jednoho seriálu.",
|
||||
"OptionBlockBooks": "Knihy",
|
||||
"OptionBlockChannelContent": "Obsah internetového kanálu",
|
||||
"OptionBlockLiveTvChannels": "Televizní kanály",
|
||||
|
@ -871,7 +871,7 @@
|
|||
"OptionDatePlayed": "Datum přehrání",
|
||||
"OptionDescending": "Sestupně",
|
||||
"OptionDisableUser": "Zablokovat tohoto uživatele",
|
||||
"OptionDisableUserHelp": "Pokud není povoleno, server nedovolí tomuto uživateli žádné připojení. Existující připojení bude okamžitě přerušeno.",
|
||||
"OptionDisableUserHelp": "Server nedovolí tomuto uživateli žádné připojení. Existující připojení bude okamžitě přerušeno.",
|
||||
"OptionDislikes": "Nelíbí se",
|
||||
"OptionDisplayFolderView": "Zobrazit složku s originálním zobrazením složek médií",
|
||||
"OptionDisplayFolderViewHelp": "Zobrazte složky vedle vašich ostatních knihoven médií. To může být užitečné, pokud si přejete mít prosté zobrazení složky.",
|
||||
|
@ -879,7 +879,7 @@
|
|||
"OptionDownloadBackImage": "Zadek",
|
||||
"OptionDownloadDiscImage": "Disk",
|
||||
"OptionDownloadImagesInAdvance": "Stáhnout obrázky pokročilejším způsobem",
|
||||
"OptionDownloadImagesInAdvanceHelp": "Ve výchozím nastavení se většina obrázků stahuje pouze na žádost aplikace Jellyfin. Povolením této možnosti dojde ke stažení všech obrázků předem současně s importem nových médií. Může způsobit výrazně delší skenování knihoven.",
|
||||
"OptionDownloadImagesInAdvanceHelp": "Ve výchozím nastavení se většina obrázků stahuje pouze na žádost klienta. Povolením této možnosti dojde ke stažení všech obrázků předem současně s importem nových médií. Může způsobit výrazně delší skenování knihoven.",
|
||||
"OptionDownloadMenuImage": "Nabídka",
|
||||
"OptionDownloadPrimaryImage": "Primární",
|
||||
"OptionDownloadThumbImage": "Miniatura",
|
||||
|
@ -911,7 +911,7 @@
|
|||
"OptionHlsSegmentedSubtitles": "Segmentované titulky HLS",
|
||||
"OptionHomeVideos": "Fotky",
|
||||
"OptionIgnoreTranscodeByteRangeRequests": "Ignorovat požadavky na překódování rozsahy bajtů",
|
||||
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Pokud je povoleno, budou tyto žádosti nadále plněny, ale budou ignorovány hlavičky bytových rozsahů.",
|
||||
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Tyto žádosti budou nadále plněny, ale budou ignorovány hlavičky bajtových rozsahů.",
|
||||
"OptionImdbRating": "Hodnocení IMDb",
|
||||
"OptionLikes": "Líbí se",
|
||||
"OptionMissingEpisode": "Chybějící episody",
|
||||
|
@ -923,9 +923,9 @@
|
|||
"OptionOnInterval": "V intervalu",
|
||||
"OptionParentalRating": "Rodičovské hodnocení",
|
||||
"OptionPlainStorageFolders": "Zobrazit všechny složky jako obyčejné složky pro ukládání",
|
||||
"OptionPlainStorageFoldersHelp": "Je-li povoleno, všechny složky jsou zastoupeny v DIDL jako \"object.container.storageFolder\" místo specifičtějšího typu, jako je například \"object.container.person.musicArtist\".",
|
||||
"OptionPlainStorageFoldersHelp": "Všechny složky jsou prezentovány v DIDL jako \"object.container.storageFolder\" místo konkrétnějšího typu, například \"object.container.person.musicArtist\".",
|
||||
"OptionPlainVideoItems": "Zobrazit všechna videa jako s obyčejné video položky",
|
||||
"OptionPlainVideoItemsHelp": "Je-li povoleno, všechna videa jsou prezentovány v DIDL jako \"object.item.videoItem\" místo specifičtějšího typu, jako je například \"object.item.videoItem.movie\".",
|
||||
"OptionPlainVideoItemsHelp": "Všechna videa jsou prezentována v DIDL jako \"object.item.videoItem\" místo konkrétnějšího typu, například \"object.item.videoItem.movie\".",
|
||||
"OptionPlayCount": "Počet přehrání",
|
||||
"OptionPlayed": "Shlédnuto",
|
||||
"OptionPremiereDate": "Datum premiéry",
|
||||
|
@ -964,7 +964,7 @@
|
|||
"PasswordMatchError": "Heslo a potvrzení hesla musí souhlasit.",
|
||||
"PasswordResetComplete": "Heslo bylo obnoveno.",
|
||||
"PasswordResetConfirmation": "Jste si jisti, že chcete obnovit heslo?",
|
||||
"PasswordResetHeader": "Obnovit heslo",
|
||||
"HeaderResetPassword": "Obnovit heslo",
|
||||
"PasswordSaved": "Heslo uloženo.",
|
||||
"People": "Lidé",
|
||||
"PerfectMatch": "Přesná shoda",
|
||||
|
@ -1004,11 +1004,11 @@
|
|||
"Record": "Nahrávat",
|
||||
"RecordSeries": "Nahrát série",
|
||||
"RecordingCancelled": "Nahrávání zrušeno.",
|
||||
"RecordingPathChangeMessage": "Změna záznamové složky automaticky nepřesune stávající záznamy ze starého umístění do nového. Budete muset přesunout ručně, pokud je to žádoucí.",
|
||||
"MessageChangeRecordingPath": "Změna záznamové složky automaticky nepřesune stávající záznamy ze starého umístění do nového. Budete muset přesunout ručně, pokud je to žádoucí.",
|
||||
"RecordingScheduled": "Plán nahrávání.",
|
||||
"Recordings": "Nahrávky",
|
||||
"Refresh": "Obnovit",
|
||||
"RefreshDialogHelp": "Metadata se aktualizují na základě nastavení a internetových služeb, které jsou povoleny na nástěnce serveru Jellyfin.",
|
||||
"RefreshDialogHelp": "Metadata se aktualizují na základě nastavení a internetových služeb, které jsou povoleny na nástěnce.",
|
||||
"RefreshMetadata": "Obnovit metadata",
|
||||
"RefreshQueued": "Obnovení zařazeno.",
|
||||
"ReleaseDate": "Datum vydání",
|
||||
|
@ -1131,7 +1131,7 @@
|
|||
"Transcoding": "Překódování",
|
||||
"Tuesday": "Úterý",
|
||||
"UninstallPluginConfirmation": "Jste si jisti, že chcete odinstalovat {0}?",
|
||||
"UninstallPluginHeader": "Odinstalovat zásuvný modul",
|
||||
"HeaderUninstallPlugin": "Odinstalovat zásuvný modul",
|
||||
"Unmute": "Povolit zvuk",
|
||||
"Unrated": "Nehodnoceno",
|
||||
"Up": "Nahoru",
|
||||
|
@ -1205,7 +1205,7 @@
|
|||
"Depressed": "Vytlačené",
|
||||
"Descending": "Klesající",
|
||||
"DetectingDevices": "Hledání zařízení",
|
||||
"DirectStreamHelp2": "Přímé streamování souboru používá velmi malý výkon bez ztráty kvality videa.",
|
||||
"DirectStreamHelp2": "Přímé streamování souboru vyžaduje velmi malý výkon téměř bez ztráty kvality videa.",
|
||||
"Directors": "Režiséři",
|
||||
"Disabled": "Vypnuto",
|
||||
"DisplayInMyMedia": "Zobrazit na domovské obrazovce",
|
||||
|
@ -1237,7 +1237,7 @@
|
|||
"HeaderFavoriteVideos": "Oblíbená videa",
|
||||
"HeaderFetcherSettings": "Nastavení načítání",
|
||||
"HeaderImageOptions": "Volby obrázku",
|
||||
"HeaderKodiMetadataHelp": "Chcete-li povolit nebo zakázat Nfo metadata, upravte nastavení knihovny v sekci ukládání metadat.",
|
||||
"HeaderKodiMetadataHelp": "Chcete-li povolit nebo zakázat metadata v souborech NFO, upravte nastavení knihovny v sekci ukládání metadat.",
|
||||
"HeaderLiveTV": "Televize",
|
||||
"HeaderLiveTv": "Televize",
|
||||
"HeaderLiveTvTunerSetup": "Nastavení televizního tuneru",
|
||||
|
@ -1305,7 +1305,7 @@
|
|||
"MediaInfoStreamTypeAudio": "Audio",
|
||||
"MediaInfoStreamTypeData": "Data",
|
||||
"MediaInfoStreamTypeVideo": "Video",
|
||||
"AuthProviderHelp": "Vyberte poskytovatele ověřování, který bude použit k ověření hesla tohoto uživatele.",
|
||||
"AuthProviderHelp": "Vyberte poskytovatele ověření, který bude použit k ověření hesla tohoto uživatele.",
|
||||
"HeaderFavoriteMovies": "Oblíbená videa",
|
||||
"HeaderFavoriteShows": "Oblíbené seriály",
|
||||
"HeaderFavoriteEpisodes": "Oblíbené epizody",
|
||||
|
@ -1313,7 +1313,7 @@
|
|||
"HeaderFavoriteArtists": "Oblíbení interpreti",
|
||||
"HeaderFavoriteSongs": "Oblíbená hudba",
|
||||
"LabelAuthProvider": "Poskytovatel ověření:",
|
||||
"LabelServerNameHelp": "Tento název bude použit k identifikaci serveru a bude výchozí pro název počítače serveru.",
|
||||
"LabelServerNameHelp": "Tento název bude použit k identifikaci serveru a ve výchozím nastavení bude použit název hostitele serveru.",
|
||||
"LabelPasswordResetProvider": "Poskytovatel obnovy hesla:",
|
||||
"LabelServerName": "Název serveru:",
|
||||
"LabelTranscodePath": "Cesta pro překódování:",
|
||||
|
@ -1339,7 +1339,7 @@
|
|||
"OnlyImageFormats": "Pouze obrazové formáty (VOBSUB, PGS, SUB, atd.)",
|
||||
"Option3D": "3D",
|
||||
"OptionAlbum": "Album",
|
||||
"OptionAllowMediaPlaybackTranscodingHelp": "Omezení přístupu k překódování může způsobit selhání přehrávání v aplikacích Jellyfin kvůli nepodporovaným formátům médií.",
|
||||
"OptionAllowMediaPlaybackTranscodingHelp": "Omezení přístupu k překódování může způsobit selhání přehrávání v klientech kvůli nepodporovaným formátům médií.",
|
||||
"OptionAllowSyncTranscoding": "Povolit stahování a synchronizaci médií, které vyžaduje překódování",
|
||||
"OptionBluray": "Blu-ray",
|
||||
"OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)",
|
||||
|
@ -1357,8 +1357,8 @@
|
|||
"OptionProtocolHls": "Přímý přenos z internetu",
|
||||
"OptionProtocolHttp": "HTTP",
|
||||
"OptionRequirePerfectSubtitleMatchHelp": "Vyžadování dokonalé shody filtruje titulky tak, aby obsahovaly pouze ty, které byly testovány a ověřeny s vaším přesným videosouborem. Zrušení zaškrtnutí tohoto políčka zvýší pravděpodobnost stahování titulků, ale zvýší pravděpodobnost chybného nebo nesprávného textu titulků.",
|
||||
"PasswordResetProviderHelp": "Zvolte poskytovatele resetování hesla, který bude použit, když tento uživatel o něj požádá",
|
||||
"PluginInstalledMessage": "Zásuvný modul byl úspěšně nainstalován. Server Jellyfin bude nutné restartovat, aby se změny projevily.",
|
||||
"PasswordResetProviderHelp": "Zvolte poskytovatele resetování hesla, který bude použit při žádosti tohoto uživatele o resetování hesla.",
|
||||
"MessagePluginInstalled": "Zásuvný modul byl úspěšně nainstalován. Server Jellyfin bude nutné restartovat, aby se změny projevily.",
|
||||
"PreferEmbeddedTitlesOverFileNames": "Preferovat vložené názvy nad názvy souborů",
|
||||
"PreferEmbeddedTitlesOverFileNamesHelp": "Toto určuje výchozí název zobrazení, pokud nejsou k dispozici žádná metadata z internetu nebo místní metadata.",
|
||||
"Raised": "Vystupující",
|
||||
|
@ -1499,7 +1499,7 @@
|
|||
"LabelStable": "Stabilní",
|
||||
"LabelChromecastVersion": "Verze Chromecastu",
|
||||
"ApiKeysCaption": "Seznam povolených API klíčů",
|
||||
"LabelEnableHttpsHelp": "Umožní serveru naslouchat na určeném portu HTTPS. K fungování je nutné nakonfigurovat i platný certifikát.",
|
||||
"LabelEnableHttpsHelp": "Naslouchání na uvedeném portu HTTPS. K fungování je nutné nakonfigurovat i platný certifikát.",
|
||||
"LabelEnableHttps": "Povolit HTTPS",
|
||||
"HeaderServerAddressSettings": "Nastavení adresy serveru",
|
||||
"HeaderRemoteAccessSettings": "Nastavení vzdáleného přístupu",
|
||||
|
@ -1543,8 +1543,8 @@
|
|||
"EnableDetailsBanner": "Obrázek detailu",
|
||||
"ShowMore": "Zobrazit více",
|
||||
"ShowLess": "Zobrazit méně",
|
||||
"EnableBlurhashHelp": "Nenačtené obrázky budou zobrazeny pomocí neurčitých zástupných obrázků",
|
||||
"EnableBlurhash": "Povolit zástupné obrázky",
|
||||
"EnableBlurHashHelp": "Obrázky, které se ještě načítají, budou zobrazeny pomocí jedinečných zástupných obrázků.",
|
||||
"EnableBlurHash": "Povolit zástupné obrázky",
|
||||
"ButtonCast": "Přehrát v zařízení",
|
||||
"ButtonSyncPlay": "SyncPlay",
|
||||
"MessageNoGenresAvailable": "Povolit některým poskytovatelům metadat stahovat informace o žánrech z Internetu.",
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
"BirthPlaceValue": "Fødselssted: {0}",
|
||||
"BookLibraryHelp": "Lyd- og tekstbøger er understøttet. Se {0}guiden til navngivning af bøger{1}.",
|
||||
"Browse": "Gennemse",
|
||||
"BrowsePluginCatalogMessage": "Gennemse vores plugin-katalog for at se tilgængelige plugins.",
|
||||
"MessageBrowsePluginCatalog": "Gennemse vores plugin-katalog for at se tilgængelige plugins.",
|
||||
"ButtonAdd": "Tilføj",
|
||||
"ButtonAddMediaLibrary": "Tilføj Mediebibliotek",
|
||||
"ButtonAddScheduledTaskTrigger": "Tilføj udløser",
|
||||
|
@ -119,7 +119,7 @@
|
|||
"Continuing": "Forsættes",
|
||||
"CustomDlnaProfilesHelp": "Lav brugerdefinerede profiler til nye enheder eller for at overstyre en systemprofil.",
|
||||
"DeathDateValue": "Dødsdato: {0}",
|
||||
"DefaultErrorMessage": "Det opstod en fejl ved behandlingen af forespørgslen. Prøv igen senere.",
|
||||
"ErrorDefault": "Det opstod en fejl ved behandlingen af forespørgslen. Prøv igen senere.",
|
||||
"DefaultMetadataLangaugeDescription": "Dette er dine standarder og kan brugerdefineres på per-biblioteks basis.",
|
||||
"Delete": "Slet",
|
||||
"DeleteDeviceConfirmation": "Er du sikker på du ønsker at slette denne enhed? Den vil dukke op igen næste gang en bruger logger ind med den.",
|
||||
|
@ -154,7 +154,7 @@
|
|||
"ErrorAddingTunerDevice": "Der opstod en fejl under tilføjelse af tuner-enhed. Kontroller venligst at den er tilgængelig og prøv igen.",
|
||||
"ErrorAddingXmlTvFile": "Der opstod en fejl under tilgang til XMLTV-filen. Kontroller venligst at filen findes og prøv igen.",
|
||||
"ErrorGettingTvLineups": "Der opstod en fejl under download af TV-opstillinger. Kontroller venligst at dine informationer er korrekte og prøv igen.",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "Slut tid skal være større end start tid.",
|
||||
"ErrorStartHourGreaterThanEnd": "Slut tid skal være større end start tid.",
|
||||
"ErrorPleaseSelectLineup": "Vælg venligst en opstilling og prøv igen. Hvis ingen opstillinger er tilgængelige, så kontroller venligst at dit brugernavn, adgangskode og postnummer er korrekt.",
|
||||
"ErrorSavingTvProvider": "Der opstod en fejl i forsøget på at gemme udbyder. Kontroller venligst at den er tilgængelig og prøv igen.",
|
||||
"EveryNDays": "Hver {0} dage",
|
||||
|
@ -754,8 +754,8 @@
|
|||
"News": "Nyheder",
|
||||
"NextUp": "Næste",
|
||||
"NoNewDevicesFound": "Ingen nye enheder fundet. For at tilføje en ny tuner, luk denne dialog og skriv enhedens informationer manuelt.",
|
||||
"NoNextUpItemsMessage": "Ingen fundet. Se dine serier!",
|
||||
"NoPluginConfigurationMessage": "Dette plugin har ingen indstillinger at konfigurere.",
|
||||
"MessageNoNextUpItems": "Ingen fundet. Se dine serier!",
|
||||
"MessageNoPluginConfiguration": "Dette plugin har ingen indstillinger at konfigurere.",
|
||||
"NoSubtitleSearchResultsFound": "Ingen resultater fundet.",
|
||||
"NumLocationsValue": "{0} mapper",
|
||||
"OneChannel": "En kanal",
|
||||
|
@ -890,7 +890,7 @@
|
|||
"PasswordMatchError": "Adgangskode og bekræft adgangskode skal være ens.",
|
||||
"PasswordResetComplete": "Adgangskoden er blevet nulstillet.",
|
||||
"PasswordResetConfirmation": "Er du sikker på at adgangskoden skal nulstilles?",
|
||||
"PasswordResetHeader": "Nulstil adgangskode",
|
||||
"HeaderResetPassword": "Nulstil adgangskode",
|
||||
"PasswordSaved": "Adgangskoden er gemt.",
|
||||
"People": "Personer",
|
||||
"PictureInPicture": "Billede i billede",
|
||||
|
@ -906,7 +906,7 @@
|
|||
"PleaseEnterNameOrId": "Indtast venligst et navn eller eksternt ID.",
|
||||
"PleaseRestartServerName": "Genstart venligst Jellyfin Server - {0}.",
|
||||
"PleaseSelectTwoItems": "Vælg venligst mindst to elementer.",
|
||||
"PluginInstalledMessage": "Plugin blev installeret med success. Jellyfin serveren skal genstartes for at aktivere det.",
|
||||
"MessagePluginInstalled": "Plugin blev installeret med success. Jellyfin serveren skal genstartes for at aktivere det.",
|
||||
"PreferEmbeddedTitlesOverFileNames": "Foretræk indlejrede titler over filnavne",
|
||||
"PreferEmbeddedTitlesOverFileNamesHelp": "Dette bestemmer standard visnings titel når ingen internet metadata eller lokal metadata er tilgængelig.",
|
||||
"Premieres": "Premiere",
|
||||
|
@ -923,7 +923,7 @@
|
|||
"Record": "Optag",
|
||||
"RecordSeries": "Optag serie",
|
||||
"RecordingCancelled": "Optagelse annulleret.",
|
||||
"RecordingPathChangeMessage": "Ændring af optagelsesmappe migrerer ikke eksisterende optagelser fra den gamle lokation til den nye. Du bliver nød til at flytte dem manuelt, hvis det ønskes.",
|
||||
"MessageChangeRecordingPath": "Ændring af optagelsesmappe migrerer ikke eksisterende optagelser fra den gamle lokation til den nye. Du bliver nød til at flytte dem manuelt, hvis det ønskes.",
|
||||
"RecordingScheduled": "Optagelse planlagt.",
|
||||
"Refresh": "Opdater",
|
||||
"RefreshDialogHelp": "Metadata opdateres alt efter hvilke indstillinger og internet-servicer der er aktiveret i Jellyfin Server-kontrolpanelet.",
|
||||
|
@ -1034,7 +1034,7 @@
|
|||
"Tuesday": "Tirsdag",
|
||||
"TvLibraryHelp": "Gennemgå {0} TV-navneguiden {1}.",
|
||||
"UninstallPluginConfirmation": "Er du sikker på du vil afinstallere {0}?",
|
||||
"UninstallPluginHeader": "Afinstaller plugin",
|
||||
"HeaderUninstallPlugin": "Afinstaller plugin",
|
||||
"Unmute": "Genoptag lyd",
|
||||
"Unrated": "Ingen bedømmelse",
|
||||
"UserAgentHelp": "Angiv en brugerdefineret bruger-agent HTTP-header.",
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
"Books": "Bücher",
|
||||
"BoxRear": "Box (Rückseite)",
|
||||
"Browse": "Blättern",
|
||||
"BrowsePluginCatalogMessage": "Durchsuche unsere Bibliothek, um alle verfügbaren Plugins anzuzeigen.",
|
||||
"MessageBrowsePluginCatalog": "Durchsuche unsere Bibliothek, um alle verfügbaren Plugins anzuzeigen.",
|
||||
"BurnSubtitlesHelp": "Legt fest, ob der Server die Untertitel während der Videotranskodierung einbrennen soll. Deaktivieren verbessert die Serverperformance immens. Wähle Auto, um bildbasierte Formate (z.B. VOBSUB, PGS, SUB, IDX, ...) sowie bestimmte ASS- oder SSA-Untertitel einbrennen zu lassen.",
|
||||
"ButtonAdd": "Hinzufügen",
|
||||
"ButtonAddMediaLibrary": "Füge Medienbibliothek hinzu",
|
||||
|
@ -143,7 +143,7 @@
|
|||
"DatePlayed": "Abgespielt am",
|
||||
"DeathDateValue": "Gestorben: {0}",
|
||||
"Default": "Standard",
|
||||
"DefaultErrorMessage": "Es gab einen Fehler beim verarbeiten der Anfrage. Bitte versuche es später erneut.",
|
||||
"ErrorDefault": "Es gab einen Fehler beim verarbeiten der Anfrage. Bitte versuche es später erneut.",
|
||||
"DefaultMetadataLangaugeDescription": "Das sind deine Default-Werte, die bibliotheksspezifisch verändert werden können.",
|
||||
"DefaultSubtitlesHelp": "Untertitel werden gemäß der Standard- und Erzwungen-Ansicht aus den eingebetteten Metadaten geladen. Spracheinstellungen werden zur Verfügung gestellt, wenn mehrere Sprachen verfügbar sind.",
|
||||
"Delete": "Löschen",
|
||||
|
@ -158,8 +158,8 @@
|
|||
"DetectingDevices": "Suche Geräte",
|
||||
"DeviceAccessHelp": "Dies wird nur auf Geräte angewandt die eindeutig identifiziert werden können und verhindert nicht den Web-Zugriff. Gefilterter Zugriff auf Geräte verhindert die Nutzung neuer Geräte solange, bis der Zugriff für diese freigegeben wird.",
|
||||
"DirectPlaying": "Direktes Abspielen",
|
||||
"DirectStreamHelp1": "Das Medium ist mit dem Abspielgerät kompatibel bzgl. Auflösung und Codecs (H.264, AC3, etc.), besitzt jedoch ein inkompatibles Containerformat (mkv, avi, wmv, etc.). Das Video wird in Echtzeit neuverpackt bevor es zum Abspielgerät gestreamt wird.",
|
||||
"DirectStreamHelp2": "Direktes Streaming von Dateien benötigt sehr wenig Rechenleistung ohne Verlust der Videoqualität.",
|
||||
"DirectStreamHelp1": "Das Medium ist mit dem Abspielgerät kompatibel bzgl. Auflösung und Codecs (H.264, AC3, etc.), besitzt jedoch ein inkompatibles Containerformat (mkv, avi, wmv, etc.). Das Video wird in Echtzeit neu verpackt bevor es zum Abspielgerät gesendet wird.",
|
||||
"DirectStreamHelp2": "Direkt Stream benötigt sehr wenig Rechenleistung mit minimalem Verlust der Videoqualität.",
|
||||
"DirectStreaming": "Direktes Streaming",
|
||||
"Director": "Regisseur",
|
||||
"Directors": "Regisseure",
|
||||
|
@ -210,7 +210,7 @@
|
|||
"ErrorAddingXmlTvFile": "Fehler beim Zugriff auf die XMLTV Datei. Stelle bitte sicher, dass die Datei existiert und versuche es nochmal.",
|
||||
"ErrorDeletingItem": "Fehler beim Löschen des Mediums vom Jellyfin Server. Bitte stelle sicher dass der Jellyfin Server Schreibzugriff auf den Dateiordner hat und versuche es erneut.",
|
||||
"ErrorGettingTvLineups": "Ein Fehler trat beim Herunterladen des Fernsehprogramms auf. Bitte stellen Sie sicher, dass Ihre Informationen korrekt sind und versuchen Sie es erneut.",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "Die Endzeit muss größer als die Startzeit sein.",
|
||||
"ErrorStartHourGreaterThanEnd": "Die Endzeit muss größer als die Startzeit sein.",
|
||||
"ErrorPleaseSelectLineup": "Bitte wählen Sie ein TV Programm und versuchen Sie es erneut. Wenn keine Programme verfügbar sind prüfen Sie bitte Benutzername, Passwort und Ihre Postleitzahl.",
|
||||
"ErrorSavingTvProvider": "Ein Fehler beim speichern des TV Verzeichnisses trat auf. Bitte stellen Sie sicher das dieser erreichbar ist und versuchen Sie es erneut.",
|
||||
"EveryNDays": "Alle {0} Tage",
|
||||
|
@ -263,7 +263,7 @@
|
|||
"HeaderAllowMediaDeletionFrom": "Erlaube Medienlöschung von",
|
||||
"HeaderApiKey": "API-Schlüssel",
|
||||
"HeaderApiKeys": "API-Schlüssel",
|
||||
"HeaderApiKeysHelp": "Externe Applikationen benötigen einen API-Schlüssel, um mit dem Jellyfin-Server zu kommunizieren. API-Schlüssel werden beim Anmelden mit einem Jellyfin-Konto oder durch eine manuelle Freigabe vergeben.",
|
||||
"HeaderApiKeysHelp": "Externe Applikationen benötigen einen API-Schlüssel, um mit dem Server zu kommunizieren. API-Schlüssel werden beim Anmelden mit einem normalen Benutzerkonto oder durch eine manuelle Freigabe vergeben.",
|
||||
"HeaderAppearsOn": "Erscheint auf",
|
||||
"HeaderAudioBooks": "Hörbücher",
|
||||
"HeaderAudioSettings": "Audioeinstellungen",
|
||||
|
@ -333,7 +333,7 @@
|
|||
"HeaderItems": "Inhalte",
|
||||
"HeaderKeepRecording": "Aufnahme behalten",
|
||||
"HeaderKeepSeries": "Serie behalten",
|
||||
"HeaderKodiMetadataHelp": "Jellyfin bietet native Unterstützung von NFO Metadatendateien. Um NFO Metadaten zu aktivieren oder deaktivieren, verwende den \"Metadaten\" Tab um die Optionen für deinen Medientypen zu konfigurieren.",
|
||||
"HeaderKodiMetadataHelp": "Um NFO Metadaten zu aktivieren oder deaktivieren, bearbeite eine Bibliothek und mache den Metadaten-Speicherer Abschnitt ausfindig.",
|
||||
"HeaderLatestEpisodes": "Neueste Episoden",
|
||||
"HeaderLatestMedia": "Neueste Medien",
|
||||
"HeaderLatestMovies": "Neueste Filme",
|
||||
|
@ -381,7 +381,7 @@
|
|||
"HeaderPreferredMetadataLanguage": "Bevorzugte Sprache der Metadaten",
|
||||
"HeaderProfile": "Profil",
|
||||
"HeaderProfileInformation": "Profil Infomationen",
|
||||
"HeaderProfileServerSettingsHelp": "Diese Werte geben an, wie Jellyfin Server sich Ihren Geräten präsentiert.",
|
||||
"HeaderProfileServerSettingsHelp": "Diese Werte geben an, wie der Server sich Ihren Clients präsentiert.",
|
||||
"HeaderRecentlyPlayed": "Zuletzt gesehen",
|
||||
"HeaderRecordingOptions": "Aufnahmeeinstellungen",
|
||||
"HeaderRecordingPostProcessing": "Aufnahme Nachbearbeitung",
|
||||
|
@ -399,13 +399,13 @@
|
|||
"HeaderSecondsValue": "{0} Sekunden",
|
||||
"HeaderSelectCertificatePath": "Wählen Sie einen Zertifikat Ordner",
|
||||
"HeaderSelectMetadataPath": "Wähle Metadaten Pfad",
|
||||
"HeaderSelectMetadataPathHelp": "Suche oder gib den Pfad für die Speicherung von Metadaten an. Das Verzeichnis muss beschreibbar sein.",
|
||||
"HeaderSelectMetadataPathHelp": "Suche oder gib den Pfad für Metadaten an. Das Verzeichnis muss beschreibbar sein.",
|
||||
"HeaderSelectPath": "Verzeichnis Wählen",
|
||||
"HeaderSelectServer": "Wähle Server",
|
||||
"HeaderSelectServerCachePath": "Wähle Server Cache Pfad",
|
||||
"HeaderSelectServerCachePathHelp": "Suche oder gib den Pfad für die Speicherung von Server Cache Dateien an. Das Verzeichnis muss beschreibbar sein.",
|
||||
"HeaderSelectTranscodingPath": "Wähle Pfad für temporäre Transkodierdateien",
|
||||
"HeaderSelectTranscodingPathHelp": "Suche oder gib den Pfad für die Speicherung von temporären Transkodierdateien an. Das Verzeichnis muss beschreibbar sein.",
|
||||
"HeaderSelectTranscodingPathHelp": "Suche oder gib den Pfad für die Speicherung Transkodierdateien an. Das Verzeichnis muss beschreibbar sein.",
|
||||
"HeaderSendMessage": "Nachricht senden",
|
||||
"HeaderSeries": "Serien",
|
||||
"HeaderSeriesOptions": "Serienoptionen",
|
||||
|
@ -452,8 +452,8 @@
|
|||
"HttpsRequiresCert": "Um https für externe Verbindungen zu erzwingen, benötigst du ein vertrauenswürdiges SSL-Zertifikat, z.B. von Let's Encrypt. Bitte stelle entweder ein Zertifikat bereit, oder deaktiviere sichere Verbindungen.",
|
||||
"Identify": "Identifizieren",
|
||||
"Images": "Bilder",
|
||||
"ImportFavoriteChannelsHelp": "Wenn aktiviert, werden nur auf dem Tuner favorisierte Kanäle importiert.",
|
||||
"ImportMissingEpisodesHelp": "Wenn aktiviert, werden Informationen über fehlende Episoden in Deine Jellyfin Datenbank importiert und innerhalb von Staffeln angezeigt. Dies kann zu deutlich längeren Bibliothek Scans führen.",
|
||||
"ImportFavoriteChannelsHelp": "Nur auf dem Tuner favorisierte Kanäle werden importiert.",
|
||||
"ImportMissingEpisodesHelp": "Informationen über fehlende Episoden werden in deine Datenbank importiert und innerhalb von Staffeln angezeigt. Dies kann zu deutlich längeren Bibliothek Scans führen.",
|
||||
"InstallingPackage": "Installiere {0} (Version {1})",
|
||||
"InstantMix": "Schnellmix",
|
||||
"ItemCount": "{0} Einträge",
|
||||
|
@ -485,14 +485,14 @@
|
|||
"LabelAppName": "App Name",
|
||||
"LabelAppNameExample": "Beispiel: Sickbeard, Sonarr",
|
||||
"LabelArtists": "Interpreten:",
|
||||
"LabelArtistsHelp": "Trenne mehrere Einträge durch ;",
|
||||
"LabelArtistsHelp": "Trenne mehrere Künstler durch ein Semikolon.",
|
||||
"LabelAudioLanguagePreference": "Bevorzugte Audiosprache:",
|
||||
"LabelAutomaticallyRefreshInternetMetadataEvery": "Aktualisiere Metadaten automatisch aus dem Internet:",
|
||||
"LabelBindToLocalNetworkAddress": "Binde an lokale Netzwerkadresse:",
|
||||
"LabelBindToLocalNetworkAddressHelp": "Optional. Überschreibt die lokale IP Adresse des HTTP Servers. Wenn leer, wird der Server an alle verfügbaren Adressen gebunden. Änderungen benötigen einen Neustart des Jellyfin Servers.",
|
||||
"LabelBindToLocalNetworkAddressHelp": "Überschreibt die lokale IP Adresse für den HTTP Server. Wenn leer, wird der Server an alle verfügbaren Adressen gebunden. Änderungen benötigen einen Neustart des Jellyfin Servers.",
|
||||
"LabelBirthDate": "Geburtsdatum:",
|
||||
"LabelBirthYear": "Geburtsjahr:",
|
||||
"LabelBlastMessageInterval": "Alive Meldungsintervall (Sekunden)",
|
||||
"LabelBlastMessageInterval": "Alive Meldungsintervall",
|
||||
"LabelBlastMessageIntervalHelp": "Legt die Dauer in Sekunden zwischen den Server-Alive-Meldungen fest.",
|
||||
"LabelBlockContentWithTags": "Blockiere Inhalte mit Tags:",
|
||||
"LabelBurnSubtitles": "Untertitel einbrennen:",
|
||||
|
@ -511,7 +511,7 @@
|
|||
"LabelCustomCertificatePath": "Benutzerdefinierter SSL-Zertifikatspfad:",
|
||||
"LabelCustomCertificatePathHelp": "Pfad zu einer PKCS #12 Datei die ein Zertifikat und einen privaten Schlüssel enthält, um TLS Unterstützung für eine eigene Domain zu aktivieren.",
|
||||
"LabelCustomCss": "Benutzerdefiniertes CSS:",
|
||||
"LabelCustomCssHelp": "Wende dein eigenes benutzerdefiniertes Styling auf die Weboberfläche an.",
|
||||
"LabelCustomCssHelp": "Wende deine eigenen benutzerdefinierte Styles auf die Weboberfläche an.",
|
||||
"LabelCustomDeviceDisplayName": "Angezeigter Name:",
|
||||
"LabelCustomDeviceDisplayNameHelp": "Lege einen individuellen Anzeigenamen fest oder lasse das Feld leer, um den vom gerät übermittelten Namen zu nutzen.",
|
||||
"LabelCustomRating": "Eigene Bewertung:",
|
||||
|
@ -547,12 +547,12 @@
|
|||
"LabelEnableAutomaticPortMapHelp": "Leitet automatisch die öffentlichen Ports des Routers an die lokalen Ports des Servers mit Hilfe von UPnP weiter. Dies kann mit einigen Router-Modellen nicht funktionieren. Die Änderungen werden erst nach einem Neustart des Server aktiv.",
|
||||
"LabelEnableBlastAliveMessages": "Erzeuge Alive Meldungen",
|
||||
"LabelEnableBlastAliveMessagesHelp": "Aktiviere dies, wenn der Server nicht zuverlässig von anderen UPnP Geräten in ihrem Netzwerk erkannt wird.",
|
||||
"LabelEnableDlnaClientDiscoveryInterval": "Client-Entdeckungs Intervall (Sekunden)",
|
||||
"LabelEnableDlnaClientDiscoveryInterval": "Client-Entdeckungs Intervall",
|
||||
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Ermittelt die Zeit in Sekunden zwischen SSDP Suchanfragen die durch Jellyfin ausgeführt wurden.",
|
||||
"LabelEnableDlnaDebugLogging": "Aktiviere DLNA Debug Logging",
|
||||
"LabelEnableDlnaDebugLoggingHelp": "Erzeugt große Logdateien und sollte nur zur Fehlerbehebung benutzt werden.",
|
||||
"LabelEnableDlnaPlayTo": "Aktiviere DLNA Play To",
|
||||
"LabelEnableDlnaPlayToHelp": "Jellyfin kann Geräte in Ihrem Netzwerk erkennen und bietet die Möglichkeit, diese fernzusteuern.",
|
||||
"LabelEnableDlnaPlayToHelp": "Jellyfin kann Geräte in Ihrem Netzwerk erkennen und bietet die Möglichkeit diese fernzusteuern.",
|
||||
"LabelEnableDlnaServer": "DLNA-Server aktivieren",
|
||||
"LabelEnableDlnaServerHelp": "Erlaubt UPnP Geräten in Ihrem Netzwerk den Zugriff und die Wiedergabe von Inhalten.",
|
||||
"LabelEnableHardwareDecodingFor": "Aktiviere Hardware-Decoding für:",
|
||||
|
@ -572,16 +572,16 @@
|
|||
"LabelFont": "Schriftart:",
|
||||
"LabelForgotPasswordUsernameHelp": "Bitte gib deinen Benutzernamen ein, falls du dich daran erinnerst.",
|
||||
"LabelFriendlyName": "Benutzerfreundlicher Name:",
|
||||
"LabelServerNameHelp": "Dieser Name wird benutzt um den Server zu identifizieren, standardmäßig wird der Server-/Computername verwendet.",
|
||||
"LabelServerNameHelp": "Dieser Name wird benutzt, um den Server zu identifizieren, standardmäßig wird der Hostname des Servers verwendet.",
|
||||
"LabelGroupMoviesIntoCollections": "Gruppiere Filme in Collections",
|
||||
"LabelGroupMoviesIntoCollectionsHelp": "Wenn Filmlisten angezeigt werden, dann werden Filme, die zu einer Collection gehören, als ein gruppiertes Element angezeigt.",
|
||||
"LabelGroupMoviesIntoCollectionsHelp": "Wenn Filmlisten angezeigt werden, werden Filme in einer Sammlung als ein gruppiertes Element angezeigt.",
|
||||
"LabelEncoderPreset": "H264 Encoding Voreinstellung:",
|
||||
"LabelHardwareAccelerationType": "Hardware Beschleunigung:",
|
||||
"LabelHardwareAccelerationTypeHelp": "Hardwarebeschleunigung benötigt zusätzliche Konfiguration.",
|
||||
"LabelHomeNetworkQuality": "Heimnetzwerkqualität:",
|
||||
"LabelHomeScreenSectionValue": "Startseitenbereich {0}:",
|
||||
"LabelHttpsPort": "Lokale HTTPS-Portnummer:",
|
||||
"LabelHttpsPortHelp": "Die TCP-Portnummer, die der HTTPS-Server von Jellyfin verwenden soll.",
|
||||
"LabelHttpsPortHelp": "Die TCP-Portnummer für den HTTPS-Server.",
|
||||
"LabelIconMaxHeight": "Maximale Iconhöhe:",
|
||||
"LabelIconMaxHeightHelp": "Maximale Auflösung für durch UPnP übermittelte Icons:icon.",
|
||||
"LabelIconMaxWidth": "Maximale Iconbreite:",
|
||||
|
@ -609,7 +609,7 @@
|
|||
"LabelLanguage": "Sprache:",
|
||||
"LabelLineup": "TV Programm:",
|
||||
"LabelLocalHttpServerPortNumber": "Lokale HTTP Portnummer:",
|
||||
"LabelLocalHttpServerPortNumberHelp": "Die TCP-Portnummer, die der HTTP-Server von Jellyfin verwenden soll.",
|
||||
"LabelLocalHttpServerPortNumberHelp": "Die TCP-Portnummer für den HTTP-Server.",
|
||||
"LabelLockItemToPreventChanges": "Sperre diesen Eintrag um zukünftige Änderungen zu verhindern",
|
||||
"LabelLoginDisclaimer": "Anmeldung Haftungsausschluss:",
|
||||
"LabelLoginDisclaimerHelp": "Diese Nachricht wird am unteren Ende des Anmeldebildschirms angezeigt.",
|
||||
|
@ -634,7 +634,7 @@
|
|||
"LabelMetadataReaders": "Metadatenleser:",
|
||||
"LabelMetadataReadersHelp": "Lege deine bevorzugte lokale Metadatenquelle fest und ordne sie nach Prioritäten. Die erste Datei die gefunden wird, wird verwendet.",
|
||||
"LabelMetadataSavers": "Metadaten-Speicherer:",
|
||||
"LabelMetadataSaversHelp": "Wähle das Dateiformat, in dem deine Metadaten gespeichert werden sollen.",
|
||||
"LabelMetadataSaversHelp": "Wähle die Dateiformate, die beim Speichern deiner Metadaten verwendet werden sollen.",
|
||||
"LabelMethod": "Methode:",
|
||||
"LabelMinBackdropDownloadWidth": "Minimale Breite für zu herunterladende Hintergründe:",
|
||||
"LabelMinResumeDuration": "Minimale Dauer für Wiederaufnahme:",
|
||||
|
@ -650,9 +650,9 @@
|
|||
"LabelMovieCategories": "Filmkategorien:",
|
||||
"LabelMoviePrefix": "Filmpräfix:",
|
||||
"LabelMoviePrefixHelp": "Wenn ein Präfix in Filmtiteln angewendet wird, gib es hier ein damit der Server es korrekt behandeln kann.",
|
||||
"LabelMovieRecordingPath": "Film Aufnahmepfad (Optional):",
|
||||
"LabelMovieRecordingPath": "Film Aufnahmepfad:",
|
||||
"LabelMusicStreamingTranscodingBitrate": "Musik-Transkodierung Bitrate:",
|
||||
"LabelMusicStreamingTranscodingBitrateHelp": "Wähle die maximale Bitrate für das streamen von Musik.",
|
||||
"LabelMusicStreamingTranscodingBitrateHelp": "Wähle die maximale Bitrate für das Streamen von Musik.",
|
||||
"LabelNewName": "Neuer Name:",
|
||||
"LabelNewPassword": "Neues Passwort:",
|
||||
"LabelNewPasswordConfirm": "Neues Passwort wiederholen:",
|
||||
|
@ -662,7 +662,7 @@
|
|||
"LabelNumber": "Nummer:",
|
||||
"LabelNumberOfGuideDays": "Anzahl von Tagen für die Programminformationen geladen werden sollen:",
|
||||
"LabelNumberOfGuideDaysHelp": "Das laden von zusätzlichen Programmdaten bietet einen besseren Überblick und die Möglichkeit weiter in die Zukunft zu planen. Aber es wird länger dauern alles herunterzuladen. Auto wählt auf Grundlage der Kanalanzahl.",
|
||||
"LabelOptionalNetworkPath": "(Optionaler) Gemeinsamer Netzwerkordner:",
|
||||
"LabelOptionalNetworkPath": "Geteilter Netzwerkordner:",
|
||||
"LabelOptionalNetworkPathHelp": "Wenn dieser Ordner in deinem Netzwerk geteilt wird, kann die Weitergabe des Netzwerkpfades Jellyfin Apps auf anderen Geräten direkten Zugang zu den Mediendateien ermöglichen. Beispielsweise {0} oder {1}.",
|
||||
"LabelOriginalAspectRatio": "Original Seitenverhältnis:",
|
||||
"LabelOriginalTitle": "Original Titel:",
|
||||
|
@ -705,7 +705,7 @@
|
|||
"LabelReleaseDate": "Veröffentlichungsdatum:",
|
||||
"LabelRemoteClientBitrateLimit": "Limit für die Internet Streaming Datenrate (Mbps):",
|
||||
"LabelRemoteClientBitrateLimitHelp": "Ein optionales Bitratenlimit pro Stream für alle Geräte außerhalb des Netzwerkes. Dies ist nützlich um zu verhindern, dass Geräte eine höhere Datenrate verwenden als die Internetverbindung erlaubt. Es kann zu erhöhter CPU-Last auf deinem Server kommen, da ggf. Videos in Echtzeit in eine niedrigere Bitrate transkodiert werden müssen.",
|
||||
"LabelRuntimeMinutes": "Laufzeit (Minuten):",
|
||||
"LabelRuntimeMinutes": "Laufzeit:",
|
||||
"LabelSaveLocalMetadata": "Speichere Bildmaterial und Metadaten in den Medienverzeichnissen",
|
||||
"LabelSaveLocalMetadataHelp": "Durch die Speicherung von Bildmaterial und Metadaten direkt in den Medienverzeichnissen, befinden sich diese an einem Ort wo sie sehr leicht bearbeitet werden können.",
|
||||
"LabelScheduledTaskLastRan": "Zuletzt ausgeführt vor: {0}. Benötigte Zeit: {1}.",
|
||||
|
@ -717,7 +717,7 @@
|
|||
"LabelSelectVersionToInstall": "Wähle die Version für die Installation:",
|
||||
"LabelSendNotificationToUsers": "Sende die Benachrichtigung an:",
|
||||
"LabelSerialNumber": "Seriennummer",
|
||||
"LabelSeriesRecordingPath": "Serien Aufnahmepfad (optional):",
|
||||
"LabelSeriesRecordingPath": "Serien Aufnahmepfad:",
|
||||
"LabelServerHost": "Adresse:",
|
||||
"LabelServerHostHelp": "192.168.1.100 oder https://myserver.com",
|
||||
"LabelSimultaneousConnectionLimit": "Paralleler Streamlimit:",
|
||||
|
@ -783,7 +783,7 @@
|
|||
"LabelYoureDone": "Du bist fertig!",
|
||||
"LabelZipCode": "PLZ:",
|
||||
"LabelffmpegPath": "FFmpeg Verzeichnis:",
|
||||
"LabelffmpegPathHelp": "Verzeichnis zur runtergeladenen FFmpeg Applikation oder zum Ordner, der FFMpeg enthält.",
|
||||
"LabelffmpegPathHelp": "Verzeichnis zur FFmpeg Applikationsdatei oder zum Ordner, der FFmpeg enthält.",
|
||||
"LanNetworksHelp": "Komma separierte Liste von IP Adressen oder IP Masken die als lokale Netzwerke behandelt werden sollen um Bandbreitenlimitationen auszusetzen. Wenn befüllt werden alle anderen IP Adressen als externe Netzwerke behandelt und unterliegen den Bandbreitenlimitationen für externe Verbindungen. Wenn leer, wird nur das SubNetz des Servers als Lokales Netz gesetzt.",
|
||||
"Large": "Groß",
|
||||
"LatestFromLibrary": "Neueste {0}",
|
||||
|
@ -864,7 +864,7 @@
|
|||
"MessageYouHaveVersionInstalled": "Du hast momentan Version {0} installiert.",
|
||||
"Metadata": "Metadaten",
|
||||
"MetadataManager": "Metadaten-Manager",
|
||||
"MetadataSettingChangeHelp": "Das Verändern der Metadata-Einstellungen hat nur Einfluss auf neu hinzugefügte Inhalte. Um eine Aktualisierung bereits hinzugefügter Inhalte durchzuführen, öffnen Sie bitte die Detail Ansicht und klicken die Aktualisieren Schaltfläche. Die Aktualisierung mehrerer Inhalte kann im Metadata Manager durchgeführt werden.",
|
||||
"MetadataSettingChangeHelp": "Das Verändern der Metadata-Einstellungen hat nur Einfluss auf neu hinzugefügte Inhalte. Um eine Aktualisierung bereits hinzugefügter Inhalte durchzuführen, öffnen Sie bitte die Detailansicht und klicken die Aktualisieren-Schaltfläche. Die Aktualisierung mehrerer Inhalte kann im Metadata Manager durchgeführt werden.",
|
||||
"MinutesAfter": "Minuten nach",
|
||||
"MinutesBefore": "Minuten vor",
|
||||
"Mobile": "Smartphone",
|
||||
|
@ -888,8 +888,8 @@
|
|||
"NextUp": "Es folgt",
|
||||
"No": "Nein",
|
||||
"NoNewDevicesFound": "Keine neuen Geräte gefunden. Um einen neuen Tuner hinzuzufügen, schließe diesen Dialog und gebe die Geräteinformationen manuell ein.",
|
||||
"NoNextUpItemsMessage": "Es wurde nichts gefunden. Schau dir deine Shows an!",
|
||||
"NoPluginConfigurationMessage": "Dieses Plugin hat keine konfigurierbaren Einstellungen.",
|
||||
"MessageNoNextUpItems": "Es wurde nichts gefunden. Schau dir deine Shows an!",
|
||||
"MessageNoPluginConfiguration": "Dieses Plugin hat keine konfigurierbaren Einstellungen.",
|
||||
"NoSubtitleSearchResultsFound": "Keine Ergebnisse gefunden.",
|
||||
"NoSubtitles": "Keine",
|
||||
"NoSubtitlesHelp": "Untertitel werden standardmäßig nicht geladen. Sie können aber während der Wiedergabe manuell aktiviert werden.",
|
||||
|
@ -910,7 +910,7 @@
|
|||
"OptionAllowLinkSharingHelp": "Es werden nur Web-Seiten mit Medieninformationen geteilt. Medien hingenen werden niemals öffentlich geteilt. Die geteilten Inhalte sind nur begrenzt zugänglich werden nach {0} Tagen ungültig.",
|
||||
"OptionAllowManageLiveTv": "Erlaube Live-TV Aufnahmeplanung",
|
||||
"OptionAllowMediaPlayback": "Erlaube Medienwiedergabe",
|
||||
"OptionAllowMediaPlaybackTranscodingHelp": "Das Einschränken des Transcoding-Zugriffes kann bei nicht unterstützten Medienformaten Abspielfehler in Jellyfin Apps hervorrufen.",
|
||||
"OptionAllowMediaPlaybackTranscodingHelp": "Das Einschränken des Transcoding-Zugriffes kann durch nicht unterstützte Medienformate Abspielfehler in Clients hervorrufen.",
|
||||
"OptionAllowRemoteControlOthers": "Erlaube Fernsteuerung anderer Benutzer",
|
||||
"OptionAllowRemoteSharedDevices": "Erlaube Fernsteuerung geteilter Geräte",
|
||||
"OptionAllowRemoteSharedDevicesHelp": "DLNA-Geräte werden als gemeinsam genutzt betrachtet, bis ein Benutzer die Steuerung übernimmt.",
|
||||
|
@ -921,7 +921,7 @@
|
|||
"OptionArtist": "Interpret",
|
||||
"OptionAscending": "Aufsteigend",
|
||||
"OptionAutomaticallyGroupSeries": "Vermische Serieninhalte, die in verschiedenen Ordnern abgelegt sind",
|
||||
"OptionAutomaticallyGroupSeriesHelp": "Wenn aktiviert, werden Inhalte einer Serie in verschiedenen Ordnern innerhalb einer Bibliothek als eine Serie angezeigt.",
|
||||
"OptionAutomaticallyGroupSeriesHelp": "Inhalte einer Serie in verschiedenen Ordnern werden innerhalb einer Bibliothek als eine Serie angezeigt.",
|
||||
"OptionBlockBooks": "Bücher",
|
||||
"OptionBlockChannelContent": "Internet Channelinhalte",
|
||||
"OptionBlockLiveTvChannels": "Live-TV Kanäle",
|
||||
|
@ -940,7 +940,7 @@
|
|||
"OptionDatePlayed": "Gesehen am",
|
||||
"OptionDescending": "Absteigend",
|
||||
"OptionDisableUser": "Sperre diesen Benutzer",
|
||||
"OptionDisableUserHelp": "Wenn deaktiviert wird der Server keine Verbindung von diesem Benutzer erlauben. Bestehende Verbindungen werden sofort beendet.",
|
||||
"OptionDisableUserHelp": "Der Server keine Verbindung von diesem Benutzer erlauben. Bestehende Verbindungen werden sofort beendet.",
|
||||
"OptionDislikes": "Mag ich nicht",
|
||||
"OptionDisplayFolderView": "Darstellung in Verzeichnisansicht zeigt Medien Verzechnisse",
|
||||
"OptionDisplayFolderViewHelp": "Zeige eine Verzeichnisansicht neben deinen Bibliotheken an. Dies kann praktisch sein, wenn man nur Verzeichnisansichten verwendet.",
|
||||
|
@ -948,7 +948,7 @@
|
|||
"OptionDownloadBackImage": "Zurück",
|
||||
"OptionDownloadDiscImage": "Disk",
|
||||
"OptionDownloadImagesInAdvance": "Bilder vorab herunterladen",
|
||||
"OptionDownloadImagesInAdvanceHelp": "Grundsätzlich werden die meisten Bilder erst dann runter geladen, wenn eine Jellyfin-App diese anfragt. Schalten Sie diese Option ein um alle Bilder im Voraus herunterzuladen, wenn neue Medien importiert wurden. Diese Einstellung kann zu signifikant längeren Bibliothekscans führen.",
|
||||
"OptionDownloadImagesInAdvanceHelp": "Standardmäßig werden die meisten Bilder erst dann heruntergeladen, wenn ein Client diese anfragt. Schalten Sie diese Option ein um alle Bilder im Voraus herunterzuladen, wenn neue Medien importiert werden. Diese Einstellung kann zu signifikant längeren Bibliothekscans führen.",
|
||||
"OptionDownloadMenuImage": "Menü",
|
||||
"OptionDownloadPrimaryImage": "Primär",
|
||||
"OptionDvd": "DVD",
|
||||
|
@ -978,7 +978,7 @@
|
|||
"OptionHlsSegmentedSubtitles": "HLS segmentierte Untertitel",
|
||||
"OptionHomeVideos": "Fotos",
|
||||
"OptionIgnoreTranscodeByteRangeRequests": "Ignoriere Anfragen für Transkodierbytebereiche",
|
||||
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Falls aktiviert, werden diese Anfragen berücksichtigt aber Byte-Range-Header ignoriert werden.",
|
||||
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Diese Anfragen werden berücksichtigt, aber den Byte-Range-Header ignorieren.",
|
||||
"OptionImdbRating": "IMDb Bewertung",
|
||||
"OptionLikes": "Mag ich",
|
||||
"OptionMissingEpisode": "Fehlende Episoden",
|
||||
|
@ -989,9 +989,9 @@
|
|||
"OptionOnInterval": "Nach einem Intervall",
|
||||
"OptionParentalRating": "Altersfreigabe",
|
||||
"OptionPlainStorageFolders": "Zeige alle Verzeichnisse als reine Speicherorte an",
|
||||
"OptionPlainStorageFoldersHelp": "Falls aktiviert, werden alle Verzeichnisse in DIDL als \"object.container.storageFolder\" angezeigt, anstatt eines spezifischen Typs wie beispielsweise \"object.container.person.musicArtist\".",
|
||||
"OptionPlainStorageFoldersHelp": "Alle Verzeichnisse werden in DIDL als \"object.container.storageFolder\" angezeigt, anstatt eines spezifischen Typs wie beispielsweise \"object.container.person.musicArtist\".",
|
||||
"OptionPlainVideoItems": "Zeige alle Videos als reine Videodateien an",
|
||||
"OptionPlainVideoItemsHelp": "Falls aktiviert, werden alle Videos in DIDL als \"object.item.videoItem\" angezeigt, anstatt eines spezifischen Typs wie beispielsweise \"object.item.videoItem.movie\".",
|
||||
"OptionPlainVideoItemsHelp": "Alle Videos werden in DIDL als \"object.item.videoItem\" angezeigt, anstatt eines spezifischen Typs wie beispielsweise \"object.item.videoItem.movie\".",
|
||||
"OptionPlayCount": "Zähler",
|
||||
"OptionPlayed": "Gesehen",
|
||||
"OptionPremiereDate": "Premiere",
|
||||
|
@ -1026,7 +1026,7 @@
|
|||
"PasswordMatchError": "Die Passwörter müssen übereinstimmen.",
|
||||
"PasswordResetComplete": "Das Passwort wurde zurückgesetzt.",
|
||||
"PasswordResetConfirmation": "Möchtest du das Passwort wirklich zurücksetzen?",
|
||||
"PasswordResetHeader": "Passwort zurücksetzen",
|
||||
"HeaderResetPassword": "Passwort zurücksetzen",
|
||||
"PasswordSaved": "Passwort gespeichert.",
|
||||
"People": "Personen",
|
||||
"PerfectMatch": "Perfektes Ergbnis",
|
||||
|
@ -1048,7 +1048,7 @@
|
|||
"PleaseEnterNameOrId": "Bitte gib einen Namen oder eine externe ID an.",
|
||||
"PleaseRestartServerName": "Bitte starte Jellyfin Server - {0} neu.",
|
||||
"PleaseSelectTwoItems": "Bitte wähle mindestens zwei Optionen aus.",
|
||||
"PluginInstalledMessage": "Das Plugin wurde erfolgreich installiert. Der Jellyfin-Server muss neu gestartet werden, um die Änderungen zu übernehmen.",
|
||||
"MessagePluginInstalled": "Das Plugin wurde erfolgreich installiert. Der Jellyfin-Server muss neu gestartet werden, um die Änderungen zu übernehmen.",
|
||||
"PreferEmbeddedTitlesOverFileNames": "Bevorzuge eingebettete Titel vor Dateinamen",
|
||||
"PreferEmbeddedTitlesOverFileNamesHelp": "Das bestimmt den Standard Displaytitel wenn keine lokale oder Internetmetadaten verfügbar sind.",
|
||||
"PreferEmbeddedEpisodeInfosOverFileNames": "Bevorzuge eingebettete Episodeninformationen vor Dateinamen",
|
||||
|
@ -1071,11 +1071,11 @@
|
|||
"Record": "Aufnehmen",
|
||||
"RecordSeries": "Serie aufnehmen",
|
||||
"RecordingCancelled": "Aufnahme abgebrochen.",
|
||||
"RecordingPathChangeMessage": "Das Ändern des Aufnahmeverzeichnisses wird alte Aufnahmen nicht automatisch verschieben. Wenn Du das möchtest, musst Du das selber machen.",
|
||||
"MessageChangeRecordingPath": "Das Ändern des Aufnahmeverzeichnisses wird alte Aufnahmen nicht automatisch verschieben. Wenn Du das möchtest, musst Du das selber machen.",
|
||||
"RecordingScheduled": "Aufnahme geplant.",
|
||||
"Recordings": "Aufnahmen",
|
||||
"Refresh": "Aktualisieren",
|
||||
"RefreshDialogHelp": "Metadaten werden auf Basis der Einstellungen und Internet Services in den Jellyfin Server Einstellungen aktualisiert.",
|
||||
"RefreshDialogHelp": "Metadaten werden auf Basis der Einstellungen und Internet Services, die im Dashboard aktiviert sind, aktualisiert.",
|
||||
"RefreshMetadata": "Aktualisiere Metadaten",
|
||||
"RefreshQueued": "Aktualisierung eingereiht.",
|
||||
"ReleaseDate": "Veröffentlichungsdatum",
|
||||
|
@ -1209,7 +1209,7 @@
|
|||
"TvLibraryHelp": "Überprüfe den {0}Serienbenennungsleitfaden{1}.",
|
||||
"Uniform": "Einheitlich",
|
||||
"UninstallPluginConfirmation": "Möchtest du {0} wirklich deinstallieren?",
|
||||
"UninstallPluginHeader": "Plugin deinstallieren",
|
||||
"HeaderUninstallPlugin": "Plugin deinstallieren",
|
||||
"Unmute": "Ton ein",
|
||||
"Unplayed": "Ungesehen",
|
||||
"Unrated": "Nicht bewertet",
|
||||
|
@ -1369,7 +1369,7 @@
|
|||
"TagsValue": "Markierungen: {0}",
|
||||
"Thumb": "Miniaturansicht",
|
||||
"Whitelist": "Erlaubt",
|
||||
"AuthProviderHelp": "Wähle einen Authentifizierungsanbieter, der zur Authentifizierung des Passworts dieses Benutzes verwendet werden soll.",
|
||||
"AuthProviderHelp": "Wähle einen Authentifizierungsanbieter, der zur Authentifizierung des Passworts dieses Benutzers verwendet werden soll.",
|
||||
"Features": "Funktionen",
|
||||
"HeaderFavoriteBooks": "Lieblingsbücher",
|
||||
"HeaderFavoriteMovies": "Lieblingsfilme",
|
||||
|
@ -1396,7 +1396,7 @@
|
|||
"OptionDownloadBoxImage": "Box",
|
||||
"OptionLoginAttemptsBeforeLockout": "Legt fest, wie viele falsche Anmeldeversuche durchgeführt werden können, bevor es zur Sperrung kommt.",
|
||||
"OptionLoginAttemptsBeforeLockoutHelp": "Null (0) bedeutet den Standardwert von drei Versuchen für normale, sowie fünf für Administrator-Benutzer zu übernehmen. Ein Wert von -1 deaktiviert die Funktion.",
|
||||
"PasswordResetProviderHelp": "Wählen Sie einen Password Reset Provider, der verwendet werden soll, wenn dieser Benutzer ein Passwort zurücksetzen möchte",
|
||||
"PasswordResetProviderHelp": "Wählen Sie einen Password Reset Provider, der verwendet werden soll, wenn dieser Benutzer ein Passwort zurücksetzen möchte.",
|
||||
"Box": "Box",
|
||||
"HeaderHome": "Startseite",
|
||||
"LabelAudioCodec": "Audiocodec:",
|
||||
|
@ -1414,7 +1414,7 @@
|
|||
"LabelTranscodingFramerate": "Transcodierrate:",
|
||||
"LabelAudioSampleRate": "Audio-Abtastrate:",
|
||||
"LabelBaseUrl": "Basis URL:",
|
||||
"LabelBaseUrlHelp": "Fügt ein benutzerdefiniertes Unterverzeichnis zur Server-URL hinzu, zum Beispiel: <code>http://example.com/<b><baseurl></b></code>",
|
||||
"LabelBaseUrlHelp": "Füge ein benutzerdefiniertes Unterverzeichnis zur Server-URL hinzu, zum Beispiel: <code>http://example.com/<b><baseurl></b></code>",
|
||||
"LabelFolder": "Ordner:",
|
||||
"LabelPasswordResetProvider": "Anbieter zum Zurücksetzen des Passwortes:",
|
||||
"LabelPlayMethod": "Spielmethode:",
|
||||
|
@ -1504,7 +1504,7 @@
|
|||
"SaveChanges": "Änderungen speichern",
|
||||
"LabelRequireHttpsHelp": "Wenn dies ausgewählt ist, leitet der Server alle Anfragen über HTTP an HTTPS weiter. Dies hat keinen Effekt, falls der Server nicht auf HTTPS hört.",
|
||||
"LabelRequireHttps": "Erfordere HTTPS",
|
||||
"LabelEnableHttpsHelp": "Erlaubt es dem Server, den konfigurierten HTTPS-Port zu beobachten. Damit dies geschehen kann, muss ein gültiges Zertifikat konfiguriert sein.",
|
||||
"LabelEnableHttpsHelp": "Beobachtet den konfigurierten HTTPS-Port. Damit dies geschehen kann, muss ein gültiges Zertifikat bereitgestellt werden.",
|
||||
"LabelEnableHttps": "Aktiviere HTTPS",
|
||||
"HeaderServerAddressSettings": "Server-Adresseinstellungen",
|
||||
"HeaderRemoteAccessSettings": "Fernzugriffs-Einstellungen",
|
||||
|
@ -1543,8 +1543,8 @@
|
|||
"EnableDetailsBanner": "Detailbanner",
|
||||
"ShowMore": "Mehr anzeigen",
|
||||
"ShowLess": "Weniger anzeigen",
|
||||
"EnableBlurhashHelp": "Bilder, die noch nicht fertig geladen wurden, werden mit einem verschwommenen Platzhalter dargestellt",
|
||||
"EnableBlurhash": "Verschwommene Platzhalter für Bilder erlauben",
|
||||
"EnableBlurHashHelp": "Bilder, die noch nicht fertig geladen wurden, werden mit einem verschwommenen Platzhalter dargestellt.",
|
||||
"EnableBlurHash": "Verschwommene Platzhalter für Bilder erlauben",
|
||||
"EnableFasterAnimations": "Schnellere Animationen",
|
||||
"EnableDecodingColorDepth10Vp9": "Aktiviere 10-Bit-Hardware-Dekodierung für VP9",
|
||||
"EnableDecodingColorDepth10Hevc": "Aktiviere 10-Bit-Hardware-Dekodierung für HEVC",
|
||||
|
@ -1564,5 +1564,8 @@
|
|||
"Writers": "Autoren",
|
||||
"ClearQueue": "Wiedergabeliste leeren",
|
||||
"StopPlayback": "Wiedergabe anhalten",
|
||||
"ViewAlbumArtist": "Zeige Albumkünstler"
|
||||
"ViewAlbumArtist": "Zeige Albumkünstler",
|
||||
"PreviousTrack": "Zum Vorherigen springen",
|
||||
"NextTrack": "Zum Nächsten springen",
|
||||
"LabelUnstable": "Instabil"
|
||||
}
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
"Books": "Βιβλία",
|
||||
"Box": "Κουτί",
|
||||
"Browse": "Αναζήτηση",
|
||||
"BrowsePluginCatalogMessage": "Πλοηγηθείτε στον κατάλογο plugin μας για να δείτε τα διαθέσιμα plugins.",
|
||||
"MessageBrowsePluginCatalog": "Πλοηγηθείτε στον κατάλογο plugin μας για να δείτε τα διαθέσιμα plugins.",
|
||||
"BurnSubtitlesHelp": "Καθορίζει αν ο διακομιστής πρέπει να εγγράψει τους υπότιτλους κατά τη μετατροπή βίντεο ανάλογα με τη μορφή των υπότιτλων. Η αποφυγή της εγγραφής στους υπότιτλους θα βελτιώσει την απόδοση του διακομιστή. Επιλέξτε Αυτόματα για να εγγράψετε μορφές βασισμένες σε εικόνες (VOBSUB, PGS, SUB / IDX κ.λπ.) και ορισμένους υπότιτλους ASS / SSA.",
|
||||
"ButtonAdd": "Πρόσθεσε",
|
||||
"ButtonAddMediaLibrary": "Προσθήκη βιβλιοθήκης πολυμέσων",
|
||||
|
@ -146,7 +146,7 @@
|
|||
"DatePlayed": "Ημερομηνία Αναπαραγωγής",
|
||||
"DeathDateValue": "Πέθανε: {0}",
|
||||
"Default": "Προεπιλογή",
|
||||
"DefaultErrorMessage": "Παρουσιάστηκε σφάλμα κατά την επεξεργασία του αιτήματός σας. Παρακαλώ δοκιμάστε ξανά αργότερα.",
|
||||
"ErrorDefault": "Παρουσιάστηκε σφάλμα κατά την επεξεργασία του αιτήματός σας. Παρακαλώ δοκιμάστε ξανά αργότερα.",
|
||||
"DefaultMetadataLangaugeDescription": "Αυτές είναι οι προεπιλογές σας και μπορούν να προσαρμοστούν σε βάση ανά βιβλιοθήκη.",
|
||||
"DefaultSubtitlesHelp": "Οι υπότιτλοι φορτώνονται με βάση τις προεπιλεγμένες και αναγκασμένες σημαίες στα ενσωματωμένα μεταδεδομένα. Οι προτιμήσεις γλώσσας εξετάζονται όταν υπάρχουν πολλές επιλογές.",
|
||||
"Delete": "Διαγραφή",
|
||||
|
@ -206,7 +206,7 @@
|
|||
"Episodes": "Επεισόδια",
|
||||
"ErrorAddingMediaPathToVirtualFolder": "Παρουσιάστηκε σφάλμα κατά την προσθήκη της διαδρομής πολυμέσων. Βεβαιωθείτε ότι η διαδρομή είναι έγκυρη και ότι η διαδικασία του διακομιστή Jellyfin έχει πρόσβαση σε αυτήν τη θέση.",
|
||||
"ErrorDeletingItem": "Παρουσιάστηκε σφάλμα κατά τη διαγραφή του στοιχείου από τον διακομιστή Jellyfin. Βεβαιωθείτε ότι ο διακομιστής Jellyfin έχει πρόσβαση εγγραφής στο φάκελο πολυμέσων και προσπαθήστε ξανά.",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "Η ώρα λήξης πρέπει να είναι μεγαλύτερη από την ώρα έναρξης.",
|
||||
"ErrorStartHourGreaterThanEnd": "Η ώρα λήξης πρέπει να είναι μεγαλύτερη από την ώρα έναρξης.",
|
||||
"EveryNDays": "Κάθε {0} μέρες",
|
||||
"ExitFullscreen": "Έξοδος από τη πλήρη οθόνη",
|
||||
"ExtraLarge": "Πολύ Μεγάλο",
|
||||
|
@ -794,8 +794,8 @@
|
|||
"Next": "Επόμενο",
|
||||
"NextUp": "Επόμενο",
|
||||
"No": "Οχι",
|
||||
"NoNextUpItemsMessage": "Δεν βρέθηκε κανένα. Ξεκινήστε παρακολουθώντας τις εκπομπές σας!",
|
||||
"NoPluginConfigurationMessage": "Αυτό το plugin δεν απαιτεί ρυθμίσεις.",
|
||||
"MessageNoNextUpItems": "Δεν βρέθηκε κανένα. Ξεκινήστε παρακολουθώντας τις εκπομπές σας!",
|
||||
"MessageNoPluginConfiguration": "Αυτό το plugin δεν απαιτεί ρυθμίσεις.",
|
||||
"NoSubtitleSearchResultsFound": "Δεν βρέθηκαν αποτελέσματα.",
|
||||
"NoSubtitles": "Χωρίς Υπότιτλους",
|
||||
"NoSubtitlesHelp": "Οι υπότιτλοι δεν θα φορτωθούν από προεπιλογή.Μπορούν ακόμα να ενεργοποιούνται χειροκίνητα κατά την αναπαραγωγή.",
|
||||
|
@ -925,7 +925,7 @@
|
|||
"PasswordMatchError": "Ο κωδικός πρόσβασης και ο κωδικός επιβεβαίωσης πρέπει να είναι ίδιοι.",
|
||||
"PasswordResetComplete": "Ο κωδικός πρόσβασης επαναφέρθηκε.",
|
||||
"PasswordResetConfirmation": "Είστε σίγουροι ότι θέλετε να επαναφέρετε τον κωδικό πρόσβασης;",
|
||||
"PasswordResetHeader": "Επαναφορά του κωδικού πρόσβασης",
|
||||
"HeaderResetPassword": "Επαναφορά του κωδικού πρόσβασης",
|
||||
"PasswordSaved": "Ο κωδικός πρόσβασης αποθηκεύτηκε.",
|
||||
"People": "Πρόσωπα",
|
||||
"PerfectMatch": "Τέλεια αντιστοίχιση",
|
||||
|
@ -946,7 +946,7 @@
|
|||
"PleaseEnterNameOrId": "Εισαγάγετε ένα όνομα ή ένα εξωτερικό αναγνωριστικό.",
|
||||
"PleaseRestartServerName": "Κάντε επανεκκίνηση του Jellyfin Server - {0}.",
|
||||
"PleaseSelectTwoItems": "Επιλέξτε τουλάχιστον δύο στοιχεία.",
|
||||
"PluginInstalledMessage": "Η προσθήκη έχει εγκατασταθεί με επιτυχία. Θα πρέπει να γίνει επανεκκίνηση του διακομιστή Jellyfin για να εφαρμοστούν οι αλλαγές.",
|
||||
"MessagePluginInstalled": "Η προσθήκη έχει εγκατασταθεί με επιτυχία. Θα πρέπει να γίνει επανεκκίνηση του διακομιστή Jellyfin για να εφαρμοστούν οι αλλαγές.",
|
||||
"Premiere": "Πρεμιέρα",
|
||||
"Premieres": "Πρεμιέρες",
|
||||
"Previous": "Προηγούμενο",
|
||||
|
@ -1103,7 +1103,7 @@
|
|||
"Tuesday": "Τρίτη",
|
||||
"Uniform": "ομοειδής",
|
||||
"UninstallPluginConfirmation": "Είστε σίγουροι ότι θέλετε να απεγκαταστήσετε;",
|
||||
"UninstallPluginHeader": "απεγκατάστησετε το plugin",
|
||||
"HeaderUninstallPlugin": "απεγκατάστησετε το plugin",
|
||||
"Unmute": "Με ήχο",
|
||||
"Unplayed": "Δεν παίχθηκε",
|
||||
"Unrated": "Χωρίς Βαθμολογία",
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"AdditionalNotificationServices": "Browse the plugin catalogue to install additional notification services.",
|
||||
"BrowsePluginCatalogMessage": "Browse our plugin catalogue to view available plugins.",
|
||||
"MessageBrowsePluginCatalog": "Browse our plugin catalogue to view available plugins.",
|
||||
"CinemaModeConfigurationHelp": "Cinema mode brings the theatre experience straight to your living room with the ability to play trailers and custom intros before the main feature.",
|
||||
"ColorPrimaries": "Colour primaries",
|
||||
"ColorSpace": "Colour space",
|
||||
|
@ -202,7 +202,7 @@
|
|||
"DatePlayed": "Date played",
|
||||
"DeathDateValue": "Died: {0}",
|
||||
"Default": "Default",
|
||||
"DefaultErrorMessage": "There was an error processing the request. Please try again later.",
|
||||
"ErrorDefault": "There was an error processing the request. Please try again later.",
|
||||
"DefaultSubtitlesHelp": "Subtitles are loaded based on the default and forced flags in the embedded metadata. Language preferences are considered when multiple options are available.",
|
||||
"Delete": "Delete",
|
||||
"DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.",
|
||||
|
@ -269,7 +269,7 @@
|
|||
"ErrorAddingXmlTvFile": "There was an error accessing the XMLTV file. Please ensure the file exists and try again.",
|
||||
"ErrorDeletingItem": "There was an error deleting the item from Jellyfin Server. Please check that Jellyfin Server has write access to the media folder and try again.",
|
||||
"ErrorGettingTvLineups": "There was an error downloading TV lineups. Please ensure your information is correct and try again.",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time.",
|
||||
"ErrorStartHourGreaterThanEnd": "End time must be greater than the start time.",
|
||||
"ErrorPleaseSelectLineup": "Please select a lineup and try again. If no lineups are available, then please check that your username, password, and postal code is correct.",
|
||||
"ErrorSavingTvProvider": "There was an error saving the TV provider. Please ensure it is accessible and try again.",
|
||||
"EveryNDays": "Every {0} days",
|
||||
|
@ -466,7 +466,7 @@
|
|||
"Unrated": "Unrated",
|
||||
"Unplayed": "Unplayed",
|
||||
"Unmute": "Unmute",
|
||||
"UninstallPluginHeader": "Uninstall Plugin",
|
||||
"HeaderUninstallPlugin": "Uninstall Plugin",
|
||||
"Trailers": "Trailers",
|
||||
"TrackCount": "{0} tracks",
|
||||
"TitlePlayback": "Playback",
|
||||
|
@ -567,7 +567,7 @@
|
|||
"Refresh": "Refresh",
|
||||
"Recordings": "Recordings",
|
||||
"RecordingScheduled": "Recording scheduled.",
|
||||
"RecordingPathChangeMessage": "Changing your recording folder will not migrate existing recordings from the old location to the new. You'll need to move them manually if desired.",
|
||||
"MessageChangeRecordingPath": "Changing your recording folder will not migrate existing recordings from the old location to the new. You'll need to move them manually if desired.",
|
||||
"RecordingCancelled": "Recording cancelled.",
|
||||
"RecordSeries": "Record series",
|
||||
"Record": "Record",
|
||||
|
@ -585,7 +585,7 @@
|
|||
"Premiere": "Premiere",
|
||||
"PreferEmbeddedTitlesOverFileNamesHelp": "This determines the default display title when no internet metadata or local metadata is available.",
|
||||
"PreferEmbeddedTitlesOverFileNames": "Prefer embedded titles over filenames",
|
||||
"PluginInstalledMessage": "The plugin has been successfully installed. Jellyfin Server will need to be restarted for changes to take effect.",
|
||||
"MessagePluginInstalled": "The plugin has been successfully installed. Jellyfin Server will need to be restarted for changes to take effect.",
|
||||
"PleaseSelectTwoItems": "Please select at least two items.",
|
||||
"PleaseRestartServerName": "Please restart Jellyfin Server - {0}.",
|
||||
"PleaseConfirmPluginInstallation": "Please click OK to confirm you've read the above and wish to proceed with the plugin installation.",
|
||||
|
@ -602,7 +602,7 @@
|
|||
"PictureInPicture": "Picture in picture",
|
||||
"PerfectMatch": "Perfect match",
|
||||
"PasswordSaved": "Password saved.",
|
||||
"PasswordResetHeader": "Reset Password",
|
||||
"HeaderResetPassword": "Reset Password",
|
||||
"PasswordResetConfirmation": "Are you sure you wish to reset the password?",
|
||||
"PasswordResetComplete": "The password has been reset.",
|
||||
"PasswordMatchError": "Password and password confirmation must match.",
|
||||
|
@ -686,8 +686,8 @@
|
|||
"None": "None",
|
||||
"NoSubtitlesHelp": "Subtitles will not be loaded by default. They can still be turned on manually during playback.",
|
||||
"NoSubtitles": "None",
|
||||
"NoPluginConfigurationMessage": "This plugin has no settings to configure.",
|
||||
"NoNextUpItemsMessage": "None found. Start watching your shows!",
|
||||
"MessageNoPluginConfiguration": "This plugin has no settings to configure.",
|
||||
"MessageNoNextUpItems": "None found. Start watching your shows!",
|
||||
"No": "No",
|
||||
"NextUp": "Next Up",
|
||||
"NewEpisodesOnly": "New episodes only",
|
||||
|
@ -1501,8 +1501,8 @@
|
|||
"ApiKeysCaption": "List of the currently enabled API keys",
|
||||
"ButtonCast": "Cast",
|
||||
"ButtonSyncPlay": "SyncPlay",
|
||||
"EnableBlurhashHelp": "Images that are still being loaded will be displayed with a blurred placeholder",
|
||||
"EnableBlurhash": "Enable blurred placeholders for images",
|
||||
"EnableBlurHashHelp": "Images that are still being loaded will be displayed with a blurred placeholder",
|
||||
"EnableBlurHash": "Enable blurred placeholders for images",
|
||||
"TabDVR": "DVR",
|
||||
"TabRepositories": "Repositories",
|
||||
"SyncPlayAccessHelp": "Select the level of access this user has to the SyncPlay feature. SyncPlay enables to sync playback with other devices.",
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
"AspectRatio": "Aspect Ratio",
|
||||
"AttributeNew": "New",
|
||||
"Audio": "Audio",
|
||||
"AuthProviderHelp": "Select an Authentication Provider to be used to authenticate this user's password.",
|
||||
"AuthProviderHelp": "Select an authentication provider to be used to authenticate this user's password.",
|
||||
"Auto": "Auto",
|
||||
"AutoBasedOnLanguageSetting": "Auto (based on language setting)",
|
||||
"Backdrop": "Backdrop",
|
||||
|
@ -61,7 +61,7 @@
|
|||
"BoxSet": "Box Set",
|
||||
"BoxRear": "Box (rear)",
|
||||
"Browse": "Browse",
|
||||
"BrowsePluginCatalogMessage": "Browse our plugin catalog to view available plugins.",
|
||||
"MessageBrowsePluginCatalog": "Browse our plugin catalog to view available plugins.",
|
||||
"BurnSubtitlesHelp": "Determines if the server should burn in subtitles when transcoding videos. Avoiding this will greatly improve performance. Select Auto to burn image based formats (VOBSUB, PGS, SUB, IDX, …) and certain ASS or SSA subtitles.",
|
||||
"ButtonAdd": "Add",
|
||||
"ButtonAddImage": "Add Image",
|
||||
|
@ -178,7 +178,7 @@
|
|||
"DatePlayed": "Date played",
|
||||
"DeathDateValue": "Died: {0}",
|
||||
"Default": "Default",
|
||||
"DefaultErrorMessage": "There was an error processing the request. Please try again later.",
|
||||
"ErrorDefault": "There was an error processing the request. Please try again later.",
|
||||
"DefaultMetadataLangaugeDescription": "These are your defaults and can be customized on a per-library basis.",
|
||||
"DefaultSubtitlesHelp": "Subtitles are loaded based on the default and forced flags in the embedded metadata. Language preferences are considered when multiple options are available.",
|
||||
"DeinterlaceMethodHelp": "Select the deinterlacing method to use when transcoding interlaced content.",
|
||||
|
@ -195,8 +195,8 @@
|
|||
"DetectingDevices": "Detecting devices",
|
||||
"DeviceAccessHelp": "This only applies to devices that can be uniquely identified and will not prevent browser access. Filtering user device access will prevent them from using new devices until they've been approved here.",
|
||||
"DirectPlaying": "Direct playing",
|
||||
"DirectStreamHelp1": "The media is compatible with the device regarding resolution and media type (H.264, AC3, etc), but is in an incompatible file container (mkv, avi, wmv, etc). The video will be re-packaged on the fly before streaming it to the device.",
|
||||
"DirectStreamHelp2": "Direct Streaming a file uses very little processing power without any loss in video quality.",
|
||||
"DirectStreamHelp1": "The media is compatible with the device regarding resolution and media type (H.264, AC3, etc), but in an incompatible file container (mkv, avi, wmv, etc). The video will be re-packaged on the fly before being sent to the device.",
|
||||
"DirectStreamHelp2": "Direct stream uses very little processing power with a minimal loss in video quality.",
|
||||
"DirectStreaming": "Direct streaming",
|
||||
"Director": "Director",
|
||||
"Directors": "Directors",
|
||||
|
@ -253,7 +253,7 @@
|
|||
"ErrorAddingXmlTvFile": "There was an error accessing the XMLTV file. Please ensure the file exists and try again.",
|
||||
"ErrorDeletingItem": "There was an error deleting the item from Jellyfin Server. Please check that Jellyfin Server has write access to the media folder and try again.",
|
||||
"ErrorGettingTvLineups": "There was an error downloading TV lineups. Please ensure your information is correct and try again.",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "End time must be greater than the start time.",
|
||||
"ErrorStartHourGreaterThanEnd": "End time must be greater than the start time.",
|
||||
"ErrorPleaseSelectLineup": "Please select a lineup and try again. If no lineups are available, then please check that your username, password, and postal code is correct.",
|
||||
"ErrorSavingTvProvider": "There was an error saving the TV provider. Please ensure it is accessible and try again.",
|
||||
"EveryNDays": "Every {0} days",
|
||||
|
@ -313,7 +313,7 @@
|
|||
"HeaderAllowMediaDeletionFrom": "Allow Media Deletion From",
|
||||
"HeaderApiKey": "API Key",
|
||||
"HeaderApiKeys": "API Keys",
|
||||
"HeaderApiKeysHelp": "External applications are required to have an API key in order to communicate with Jellyfin Server. Keys are issued by logging in with a Jellyfin account, or by manually granting the application a key.",
|
||||
"HeaderApiKeysHelp": "External applications are required to have an API key in order to communicate with the server. Keys are issued by logging in with a normal user account or manually granting the application a key.",
|
||||
"ApiKeysCaption": "List of the currently enabled API keys",
|
||||
"HeaderApp": "App",
|
||||
"HeaderAppearsOn": "Appears On",
|
||||
|
@ -400,7 +400,7 @@
|
|||
"HeaderItems": "Items",
|
||||
"HeaderKeepRecording": "Keep Recording",
|
||||
"HeaderKeepSeries": "Keep Series",
|
||||
"HeaderKodiMetadataHelp": "To enable or disable NFO metadata, edit a library in Jellyfin library setup and locate the metadata savers section.",
|
||||
"HeaderKodiMetadataHelp": "To enable or disable NFO metadata, edit a library and locate the metadata savers section.",
|
||||
"HeaderLatestEpisodes": "Latest Episodes",
|
||||
"HeaderLatestMedia": "Latest Media",
|
||||
"HeaderLatestMovies": "Latest Movies",
|
||||
|
@ -450,7 +450,7 @@
|
|||
"HeaderPreferredMetadataLanguage": "Preferred Metadata Language",
|
||||
"HeaderProfile": "Profile",
|
||||
"HeaderProfileInformation": "Profile Information",
|
||||
"HeaderProfileServerSettingsHelp": "These values control how Jellyfin Server will present itself to the device.",
|
||||
"HeaderProfileServerSettingsHelp": "These values control how the server will present itself to clients.",
|
||||
"HeaderRecentlyPlayed": "Recently Played",
|
||||
"HeaderRecordingOptions": "Recording Options",
|
||||
"HeaderRecordingPostProcessing": "Recording Post Processing",
|
||||
|
@ -469,13 +469,13 @@
|
|||
"HeaderSecondsValue": "{0} Seconds",
|
||||
"HeaderSelectCertificatePath": "Select Certificate Path",
|
||||
"HeaderSelectMetadataPath": "Select Metadata Path",
|
||||
"HeaderSelectMetadataPathHelp": "Browse or enter the path you'd like to store metadata within. The folder must be writeable.",
|
||||
"HeaderSelectMetadataPathHelp": "Browse or enter the path you'd like to use for metadata. The folder must be writeable.",
|
||||
"HeaderSelectPath": "Select Path",
|
||||
"HeaderSelectServer": "Select Server",
|
||||
"HeaderSelectServerCachePath": "Select Server Cache Path",
|
||||
"HeaderSelectServerCachePathHelp": "Browse or enter the path to use for server cache files. The folder must be writeable.",
|
||||
"HeaderSelectTranscodingPath": "Select Transcoding Temporary Path",
|
||||
"HeaderSelectTranscodingPathHelp": "Browse or enter the path to use for transcoding temporary files. The folder must be writeable.",
|
||||
"HeaderSelectTranscodingPathHelp": "Browse or enter the path to use for transcode files. The folder must be writeable.",
|
||||
"HeaderSendMessage": "Send Message",
|
||||
"HeaderSeries": "Series",
|
||||
"HeaderSeriesOptions": "Series Options",
|
||||
|
@ -531,8 +531,8 @@
|
|||
"HttpsRequiresCert": "To enable secure connections, you will need to supply a trusted SSL certificate, such as Let's Encrypt. Please either supply a certificate, or disable secure connections.",
|
||||
"Identify": "Identify",
|
||||
"Images": "Images",
|
||||
"ImportFavoriteChannelsHelp": "If enabled, only channels that are marked as favorite on the tuner device will be imported.",
|
||||
"ImportMissingEpisodesHelp": "If enabled, information about missing episodes will be imported into your Jellyfin database and displayed within seasons and series. This may cause significantly longer library scans.",
|
||||
"ImportFavoriteChannelsHelp": "Only channels that are marked as favorite on the tuner device will be imported.",
|
||||
"ImportMissingEpisodesHelp": "Information about missing episodes will be imported into your database and displayed within seasons and series. This may cause significantly longer library scans.",
|
||||
"InstallingPackage": "Installing {0} (version {1})",
|
||||
"InstantMix": "Instant mix",
|
||||
"ItemCount": "{0} items",
|
||||
|
@ -565,7 +565,7 @@
|
|||
"LabelAppName": "App name",
|
||||
"LabelAppNameExample": "Example: Sickbeard, Sonarr",
|
||||
"LabelArtists": "Artists:",
|
||||
"LabelArtistsHelp": "Separate multiple using ;",
|
||||
"LabelArtistsHelp": "Separate multiple artists with a semicolon.",
|
||||
"LabelAudio": "Audio",
|
||||
"LabelAudioBitDepth": "Audio bit depth:",
|
||||
"LabelAudioBitrate": "Audio bitrate:",
|
||||
|
@ -576,11 +576,11 @@
|
|||
"LabelAuthProvider": "Authentication Provider:",
|
||||
"LabelAutomaticallyRefreshInternetMetadataEvery": "Automatically refresh metadata from the internet:",
|
||||
"LabelBindToLocalNetworkAddress": "Bind to local network address:",
|
||||
"LabelBindToLocalNetworkAddressHelp": "Optional. Override the local IP address to bind the http server to. If left empty, the server will bind to all availabile addresses. Changing this value requires restarting Jellyfin Server.",
|
||||
"LabelBindToLocalNetworkAddressHelp": "Override the local IP address for the HTTP server. If left empty, the server will bind to all availabile addresses. Changing this value requires restarting Jellyfin Server.",
|
||||
"LabelBirthDate": "Birth date:",
|
||||
"LabelBirthYear": "Birth year:",
|
||||
"LabelBitrate": "Bitrate:",
|
||||
"LabelBlastMessageInterval": "Alive message interval (seconds)",
|
||||
"LabelBlastMessageInterval": "Alive message interval",
|
||||
"LabelBlastMessageIntervalHelp": "Determines the duration in seconds between blast alive messages.",
|
||||
"LabelBlockContentWithTags": "Block items with tags:",
|
||||
"LabelBurnSubtitles": "Burn subtitles:",
|
||||
|
@ -601,14 +601,14 @@
|
|||
"LabelCustomCertificatePath": "Custom SSL certificate path:",
|
||||
"LabelCustomCertificatePathHelp": "Path to a PKCS #12 file containing a certificate and private key to enable TLS support on a custom domain.",
|
||||
"LabelCustomCss": "Custom CSS:",
|
||||
"LabelCustomCssHelp": "Apply your own custom styling to the web interface.",
|
||||
"LabelCustomCssHelp": "Apply your own custom styles on the web interface.",
|
||||
"LabelCustomDeviceDisplayName": "Display name:",
|
||||
"LabelCustomDeviceDisplayNameHelp": "Supply a custom display name or leave empty to use the name reported by the device.",
|
||||
"LabelCustomRating": "Custom rating:",
|
||||
"LabelDashboardTheme": "Server dashboard theme:",
|
||||
"LabelDateAdded": "Date added:",
|
||||
"LabelDateAddedBehavior": "Date added behavior for new content:",
|
||||
"LabelDateAddedBehaviorHelp": "If a metadata value is present it will always be used before either of these options.",
|
||||
"LabelDateAddedBehaviorHelp": "If a metadata value is present, it will always be used before either of these options.",
|
||||
"LabelDateTimeLocale": "Date time locale:",
|
||||
"LabelDay": "Day:",
|
||||
"LabelDeathDate": "Death date:",
|
||||
|
@ -640,19 +640,19 @@
|
|||
"LabelEnableAutomaticPortMapHelp": "Automatically forward public ports on your router to local ports on your server via UPnP. This may not work with some router models or network configurations. Changes will not apply until after a server restart.",
|
||||
"LabelEnableBlastAliveMessages": "Blast alive messages",
|
||||
"LabelEnableBlastAliveMessagesHelp": "Enable this if the server is not detected reliably by other UPnP devices on your network.",
|
||||
"LabelEnableDlnaClientDiscoveryInterval": "Client discovery interval (seconds)",
|
||||
"LabelEnableDlnaClientDiscoveryInterval": "Client discovery interval",
|
||||
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Determines the duration in seconds between SSDP searches performed by Jellyfin.",
|
||||
"LabelEnableDlnaDebugLogging": "Enable DLNA debug logging",
|
||||
"LabelEnableDlnaDebugLoggingHelp": "Create large log files and should only be used as needed for troubleshooting purposes.",
|
||||
"LabelEnableDlnaPlayTo": "Enable DLNA Play To",
|
||||
"LabelEnableDlnaPlayToHelp": "Detect devices within your network and offer the ability to remote control them.",
|
||||
"LabelEnableDlnaPlayToHelp": "Detect devices within your network and offer the ability to control them remotely.",
|
||||
"LabelEnableDlnaServer": "Enable DLNA server",
|
||||
"LabelEnableDlnaServerHelp": "Allows UPnP devices on your network to browse and play content.",
|
||||
"LabelEnableHardwareDecodingFor": "Enable hardware decoding for:",
|
||||
"LabelEnableHttps": "Enable HTTPS",
|
||||
"LabelEnableHttpsHelp": "Enables the server to listen on the configured HTTPS port. A valid certificate must also be configured in order for this to take effect.",
|
||||
"LabelEnableHttpsHelp": "Listen on the configured HTTPS port. A valid certificate must also be supplied for this to take effect.",
|
||||
"LabelEnableRealtimeMonitor": "Enable real time monitoring",
|
||||
"LabelEnableRealtimeMonitorHelp": "Changes to files will be processed immediately, on supported file systems.",
|
||||
"LabelEnableRealtimeMonitorHelp": "Changes to files will be processed immediately on supported file systems.",
|
||||
"LabelEnableSingleImageInDidlLimit": "Limit to single embedded image",
|
||||
"LabelEnableSingleImageInDidlLimitHelp": "Some devices will not render properly if multiple images are embedded within Didl.",
|
||||
"LabelEndDate": "End date:",
|
||||
|
@ -660,7 +660,7 @@
|
|||
"LabelEvent": "Event:",
|
||||
"LabelEveryXMinutes": "Every:",
|
||||
"LabelBaseUrl": "Base URL:",
|
||||
"LabelBaseUrlHelp": "Adds a custom subdirectory to the server URL. For example: <code>http://example.com/<b><baseurl></b></code>",
|
||||
"LabelBaseUrlHelp": "Add a custom subdirectory to the server URL. For example: <code>http://example.com/<b><baseurl></b></code>",
|
||||
"LabelExtractChaptersDuringLibraryScan": "Extract chapter images during the library scan",
|
||||
"LabelExtractChaptersDuringLibraryScanHelp": "Generate chapter images when videos are imported during the library scan. Otherwise, they will be extracted during the chapter images scheduled task, allowing the regular library scan to complete faster.",
|
||||
"LabelFailed": "Failed",
|
||||
|
@ -671,9 +671,9 @@
|
|||
"LabelForgotPasswordUsernameHelp": "Enter your username, if you remember it.",
|
||||
"LabelFormat": "Format:",
|
||||
"LabelFriendlyName": "Friendly name:",
|
||||
"LabelServerNameHelp": "This name will be used to identify the server and will default to the server's computer name.",
|
||||
"LabelServerNameHelp": "This name will be used to identify the server and will default to the server's hostname.",
|
||||
"LabelGroupMoviesIntoCollections": "Group movies into collections",
|
||||
"LabelGroupMoviesIntoCollectionsHelp": "When displaying movie lists, movies belonging to a collection will be displayed as one grouped item.",
|
||||
"LabelGroupMoviesIntoCollectionsHelp": "When displaying movie lists, movies in a collection will be displayed as one grouped item.",
|
||||
"LabelH264Crf": "H264 encoding CRF:",
|
||||
"LabelEncoderPreset": "H264 and H265 encoding preset:",
|
||||
"LabelHardwareAccelerationType": "Hardware acceleration:",
|
||||
|
@ -681,7 +681,7 @@
|
|||
"LabelHomeNetworkQuality": "Home network quality:",
|
||||
"LabelHomeScreenSectionValue": "Home screen section {0}:",
|
||||
"LabelHttpsPort": "Local HTTPS port number:",
|
||||
"LabelHttpsPortHelp": "The TCP port number that Jellyfin's HTTPS server should bind to.",
|
||||
"LabelHttpsPortHelp": "The TCP port number for the HTTPS server.",
|
||||
"LabelIconMaxHeight": "Icon maximum height:",
|
||||
"LabelIconMaxHeightHelp": "Maximum resolution of icons exposed via upnp:icon.",
|
||||
"LabelIconMaxWidth": "Icon maximum width:",
|
||||
|
@ -711,7 +711,7 @@
|
|||
"LabelLibraryPageSizeHelp": "Sets the amount of items to show on a library page. Set to 0 in order to disable paging.",
|
||||
"LabelLineup": "Lineup:",
|
||||
"LabelLocalHttpServerPortNumber": "Local HTTP port number:",
|
||||
"LabelLocalHttpServerPortNumberHelp": "The TCP port number that Jellyfin's HTTP server should bind to.",
|
||||
"LabelLocalHttpServerPortNumberHelp": "The TCP port number for the HTTP server.",
|
||||
"LabelLockItemToPreventChanges": "Lock this item to prevent future changes",
|
||||
"LabelLoginDisclaimer": "Login disclaimer:",
|
||||
"LabelLoginDisclaimerHelp": "A message that will be displayed at the bottom of the login page.",
|
||||
|
@ -737,7 +737,7 @@
|
|||
"LabelMetadataReaders": "Metadata readers:",
|
||||
"LabelMetadataReadersHelp": "Rank your preferred local metadata sources in order of priority. The first file found will be read.",
|
||||
"LabelMetadataSavers": "Metadata savers:",
|
||||
"LabelMetadataSaversHelp": "Choose the file formats to save your metadata to.",
|
||||
"LabelMetadataSaversHelp": "Choose the file formats to use when saving your metadata.",
|
||||
"LabelMethod": "Method:",
|
||||
"LabelMinBackdropDownloadWidth": "Minimum backdrop download width:",
|
||||
"LabelMinResumeDuration": "Minimum resume duration:",
|
||||
|
@ -753,9 +753,9 @@
|
|||
"LabelMovieCategories": "Movie categories:",
|
||||
"LabelMoviePrefix": "Movie prefix:",
|
||||
"LabelMoviePrefixHelp": "If a prefix is applied to movie titles, enter it here so the server can handle it properly.",
|
||||
"LabelMovieRecordingPath": "Movie recording path (optional):",
|
||||
"LabelMovieRecordingPath": "Movie recording path:",
|
||||
"LabelMusicStreamingTranscodingBitrate": "Music transcoding bitrate:",
|
||||
"LabelMusicStreamingTranscodingBitrateHelp": "Specify a max bitrate when streaming music.",
|
||||
"LabelMusicStreamingTranscodingBitrateHelp": "Specify a maximum bitrate when streaming music.",
|
||||
"LabelName": "Name:",
|
||||
"LabelChromecastVersion": "Chromecast Version",
|
||||
"LabelStable": "Stable",
|
||||
|
@ -770,7 +770,7 @@
|
|||
"LabelNumber": "Number:",
|
||||
"LabelNumberOfGuideDays": "Number of days of guide data to download:",
|
||||
"LabelNumberOfGuideDaysHelp": "Downloading more days worth of guide data provides the ability to schedule out further in advance and view more listings, but it will also take longer to download. Auto will choose based on the number of channels.",
|
||||
"LabelOptionalNetworkPath": "(Optional) Shared network folder:",
|
||||
"LabelOptionalNetworkPath": "Shared network folder:",
|
||||
"LabelOptionalNetworkPathHelp": "If this folder is shared on your network, supplying the network share path can allow Jellyfin apps on other devices to access media files directly. For example, {0} or {1}.",
|
||||
"LabelOriginalAspectRatio": "Original aspect ratio:",
|
||||
"LabelOriginalTitle": "Original title:",
|
||||
|
@ -822,7 +822,7 @@
|
|||
"LabelRemoteClientBitrateLimitHelp": "An optional per-stream bitrate limit for all out of network devices. This is useful to prevent devices from requesting a higher bitrate than your internet connection can handle. This may result in increased CPU load on your server in order to transcode videos on the fly to a lower bitrate.",
|
||||
"LabelRequireHttps": "Require HTTPS",
|
||||
"LabelRequireHttpsHelp": "If checked, the server will automatically redirect all requests over HTTP to HTTPS. This has no effect if the server is not listening on HTTPS.",
|
||||
"LabelRuntimeMinutes": "Run time (minutes):",
|
||||
"LabelRuntimeMinutes": "Runtime:",
|
||||
"LabelSaveLocalMetadata": "Save artwork into media folders",
|
||||
"LabelSaveLocalMetadataHelp": "Saving artwork into media folders will put them in a place where they can be easily edited.",
|
||||
"LabelScheduledTaskLastRan": "Last ran {0}, taking {1}.",
|
||||
|
@ -836,7 +836,7 @@
|
|||
"LabelSelectVersionToInstall": "Select version to install:",
|
||||
"LabelSendNotificationToUsers": "Send the notification to:",
|
||||
"LabelSerialNumber": "Serial number",
|
||||
"LabelSeriesRecordingPath": "Series recording path (optional):",
|
||||
"LabelSeriesRecordingPath": "Series recording path:",
|
||||
"LabelServerHost": "Host:",
|
||||
"LabelServerHostHelp": "192.168.1.100:8096 or https://myserver.com",
|
||||
"LabelServerName": "Server name:",
|
||||
|
@ -938,7 +938,7 @@
|
|||
"LabelYoureDone": "You're Done!",
|
||||
"LabelZipCode": "Zip Code:",
|
||||
"LabelffmpegPath": "FFmpeg path:",
|
||||
"LabelffmpegPathHelp": "The path to the ffmpeg application file, or folder containing ffmpeg.",
|
||||
"LabelffmpegPathHelp": "The path to the ffmpeg application file or folder containing ffmpeg.",
|
||||
"LanNetworksHelp": "Comma separated list of IP addresses or IP/netmask entries for networks that will be considered on local network when enforcing bandwidth restrictions. If set, all other IP addresses will be considered to be on the external network and will be subject to the external bandwidth restrictions. If left blank, only the server's subnet is considered to be on the local network.",
|
||||
"Large": "Large",
|
||||
"LatestFromLibrary": "Latest {0}",
|
||||
|
@ -1067,7 +1067,7 @@
|
|||
"MessageSyncPlayErrorMedia": "Failed to enable SyncPlay! Media error.",
|
||||
"Metadata": "Metadata",
|
||||
"MetadataManager": "Metadata Manager",
|
||||
"MetadataSettingChangeHelp": "Changing metadata settings will affect new content that is added going forward. To refresh existing content, open the detail screen and click the refresh button, or perform bulk refreshes using the metadata manager.",
|
||||
"MetadataSettingChangeHelp": "Changing metadata settings will affect new content added going forward. To refresh existing content, open the detail screen and click the refresh button, or perform bulk refreshes using the metadata manager.",
|
||||
"MinutesAfter": "minutes after",
|
||||
"MinutesBefore": "minutes before",
|
||||
"Mobile": "Mobile",
|
||||
|
@ -1100,8 +1100,8 @@
|
|||
"No": "No",
|
||||
"NoCreatedLibraries": "Seems like you haven't created any libraries yet. {0}Would you like to create one now?{1}",
|
||||
"NoNewDevicesFound": "No new devices found. To add a new tuner, close this dialog and enter the device information manually.",
|
||||
"NoNextUpItemsMessage": "None found. Start watching your shows!",
|
||||
"NoPluginConfigurationMessage": "This plugin has no settings to configure.",
|
||||
"MessageNoNextUpItems": "None found. Start watching your shows!",
|
||||
"MessageNoPluginConfiguration": "This plugin has no settings to configure.",
|
||||
"NoSubtitleSearchResultsFound": "No results found.",
|
||||
"NoSubtitles": "None",
|
||||
"NoSubtitlesHelp": "Subtitles will not be loaded by default. They can still be turned on manually during playback.",
|
||||
|
@ -1126,7 +1126,7 @@
|
|||
"OptionAllowLinkSharingHelp": "Only web pages containing media information are shared. Media files are never shared publicly. Shares are time-limited and will expire after {0} days.",
|
||||
"OptionAllowManageLiveTv": "Allow Live TV recording management",
|
||||
"OptionAllowMediaPlayback": "Allow media playback",
|
||||
"OptionAllowMediaPlaybackTranscodingHelp": "Restricting access to transcoding may cause playback failures in Jellyfin apps due to unsupported media formats.",
|
||||
"OptionAllowMediaPlaybackTranscodingHelp": "Restricting access to transcoding may cause playback failures in clients due to unsupported media formats.",
|
||||
"OptionAllowRemoteControlOthers": "Allow remote control of other users",
|
||||
"OptionAllowRemoteSharedDevices": "Allow remote control of shared devices",
|
||||
"OptionAllowRemoteSharedDevicesHelp": "DLNA devices are considered shared until a user begins controlling them.",
|
||||
|
@ -1139,7 +1139,7 @@
|
|||
"OptionAuto": "Auto",
|
||||
"OptionAutomatic": "Auto",
|
||||
"OptionAutomaticallyGroupSeries": "Automatically merge series that are spread across multiple folders",
|
||||
"OptionAutomaticallyGroupSeriesHelp": "If enabled, series that are spread across multiple folders within this library will be automatically merged into a single series.",
|
||||
"OptionAutomaticallyGroupSeriesHelp": "Series that are spread across multiple folders within this library will be automatically merged into a single series.",
|
||||
"OptionBanner": "Banner",
|
||||
"OptionBlockBooks": "Books",
|
||||
"OptionBlockChannelContent": "Internet Channel Content",
|
||||
|
@ -1161,7 +1161,7 @@
|
|||
"OptionDatePlayed": "Date Played",
|
||||
"OptionDescending": "Descending",
|
||||
"OptionDisableUser": "Disable this user",
|
||||
"OptionDisableUserHelp": "If disabled the server will not allow any connections from this user. Existing connections will be abruptly terminated.",
|
||||
"OptionDisableUserHelp": "The server will not allow any connections from this user. Existing connections will be abruptly terminated.",
|
||||
"OptionDislikes": "Dislikes",
|
||||
"OptionDisplayFolderView": "Display a folder view to show plain media folders",
|
||||
"OptionDisplayFolderViewHelp": "Display folders alongside your other media libraries. This can be useful if you'd like to have a plain folder view.",
|
||||
|
@ -1171,7 +1171,7 @@
|
|||
"OptionDownloadBoxImage": "Box",
|
||||
"OptionDownloadDiscImage": "Disc",
|
||||
"OptionDownloadImagesInAdvance": "Download images in advance",
|
||||
"OptionDownloadImagesInAdvanceHelp": "By default, most images are only downloaded when requested by a Jellyfin app. Enable this option to download all images in advance, as new media is imported. This may cause significantly longer library scans.",
|
||||
"OptionDownloadImagesInAdvanceHelp": "By default, most images are only downloaded when requested by a client. Enable this option to download all images in advance, as new media is imported. This may cause significantly longer library scans.",
|
||||
"OptionDownloadLogoImage": "Logo",
|
||||
"OptionDownloadMenuImage": "Menu",
|
||||
"OptionDownloadPrimaryImage": "Primary",
|
||||
|
@ -1204,7 +1204,7 @@
|
|||
"OptionHlsSegmentedSubtitles": "HLS segmented subtitles",
|
||||
"OptionHomeVideos": "Photos",
|
||||
"OptionIgnoreTranscodeByteRangeRequests": "Ignore transcode byte range requests",
|
||||
"OptionIgnoreTranscodeByteRangeRequestsHelp": "If enabled, these requests will be honored but will ignore the byte range header.",
|
||||
"OptionIgnoreTranscodeByteRangeRequestsHelp": "These requests will be honored but will ignore the byte range header.",
|
||||
"OptionImdbRating": "IMDb Rating",
|
||||
"OptionIsHD": "HD",
|
||||
"OptionIsSD": "SD",
|
||||
|
@ -1222,9 +1222,9 @@
|
|||
"OptionOnInterval": "On an interval",
|
||||
"OptionParentalRating": "Parental Rating",
|
||||
"OptionPlainStorageFolders": "Display all folders as plain storage folders",
|
||||
"OptionPlainStorageFoldersHelp": "If enabled, all folders are represented in DIDL as \"object.container.storageFolder\" instead of a more specific type, such as \"object.container.person.musicArtist\".",
|
||||
"OptionPlainStorageFoldersHelp": "All folders are represented in DIDL as \"object.container.storageFolder\" instead of a more specific type, such as \"object.container.person.musicArtist\".",
|
||||
"OptionPlainVideoItems": "Display all videos as plain video items",
|
||||
"OptionPlainVideoItemsHelp": "If enabled, all videos are represented in DIDL as \"object.item.videoItem\" instead of a more specific type, such as \"object.item.videoItem.movie\".",
|
||||
"OptionPlainVideoItemsHelp": "All videos are represented in DIDL as \"object.item.videoItem\" instead of a more specific type, such as \"object.item.videoItem.movie\".",
|
||||
"OptionPlayCount": "Play Count",
|
||||
"OptionPlayed": "Played",
|
||||
"OptionPoster": "Poster",
|
||||
|
@ -1275,8 +1275,8 @@
|
|||
"PasswordMatchError": "Password and password confirmation must match.",
|
||||
"PasswordResetComplete": "The password has been reset.",
|
||||
"PasswordResetConfirmation": "Are you sure you wish to reset the password?",
|
||||
"PasswordResetHeader": "Reset Password",
|
||||
"PasswordResetProviderHelp": "Choose a Password Reset Provider to be used when this user requests a password reset",
|
||||
"HeaderResetPassword": "Reset Password",
|
||||
"PasswordResetProviderHelp": "Choose a password reset provider to be used when this user requests a password reset.",
|
||||
"PasswordSaved": "Password saved.",
|
||||
"People": "People",
|
||||
"PerfectMatch": "Perfect match",
|
||||
|
@ -1301,7 +1301,7 @@
|
|||
"PleaseEnterNameOrId": "Please enter a name or an external ID.",
|
||||
"PleaseRestartServerName": "Please restart Jellyfin Server - {0}.",
|
||||
"PleaseSelectTwoItems": "Please select at least two items.",
|
||||
"PluginInstalledMessage": "The plugin has been successfully installed. Jellyfin Server will need to be restarted for changes to take effect.",
|
||||
"MessagePluginInstalled": "The plugin has been successfully installed. Jellyfin Server will need to be restarted for changes to take effect.",
|
||||
"PreferEmbeddedTitlesOverFileNames": "Prefer embedded titles over filenames",
|
||||
"PreferEmbeddedTitlesOverFileNamesHelp": "This determines the default display title when no internet metadata or local metadata is available.",
|
||||
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "This uses the episode information from the embedded metadata if available.",
|
||||
|
@ -1326,11 +1326,11 @@
|
|||
"Record": "Record",
|
||||
"RecordSeries": "Record series",
|
||||
"RecordingCancelled": "Recording cancelled.",
|
||||
"RecordingPathChangeMessage": "Changing your recording folder will not migrate existing recordings from the old location to the new. You'll need to move them manually if desired.",
|
||||
"MessageChangeRecordingPath": "Changing your recording folder will not migrate existing recordings from the old location to the new. You'll need to move them manually if desired.",
|
||||
"RecordingScheduled": "Recording scheduled.",
|
||||
"Recordings": "Recordings",
|
||||
"Refresh": "Refresh",
|
||||
"RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the Jellyfin Server dashboard.",
|
||||
"RefreshDialogHelp": "Metadata is refreshed based on settings and internet services that are enabled in the dashboard.",
|
||||
"RefreshMetadata": "Refresh metadata",
|
||||
"RefreshQueued": "Refresh queued.",
|
||||
"ReleaseDate": "Release date",
|
||||
|
@ -1495,7 +1495,7 @@
|
|||
"TvLibraryHelp": "Review the {0}TV naming guide{1}.",
|
||||
"Uniform": "Uniform",
|
||||
"UninstallPluginConfirmation": "Are you sure you wish to uninstall {0}?",
|
||||
"UninstallPluginHeader": "Uninstall Plugin",
|
||||
"HeaderUninstallPlugin": "Uninstall Plugin",
|
||||
"Unmute": "Unmute",
|
||||
"Unplayed": "Unplayed",
|
||||
"Unrated": "Unrated",
|
||||
|
@ -1561,8 +1561,8 @@
|
|||
"EveryXHours": "Every {0} hours",
|
||||
"OnApplicationStartup": "On application startup",
|
||||
"UnsupportedPlayback": "Jellyfin cannot decrypt content protected by DRM but all content will be attempted regardless, including protected titles. Some files may appear completely black due to encryption or other unsupported features, such as interactive titles.",
|
||||
"EnableBlurhash": "Enable blurred placeholders for images",
|
||||
"EnableBlurhashHelp": "Images that are still being loaded will be displayed with a blurred placeholder",
|
||||
"EnableBlurHash": "Enable blurred placeholders for images",
|
||||
"EnableBlurHashHelp": "Images that are still being loaded will be displayed with a unique placeholder.",
|
||||
"ButtonSyncPlay": "SyncPlay",
|
||||
"ButtonCast": "Cast",
|
||||
"ButtonPlayer": "Player",
|
||||
|
|
|
@ -97,7 +97,7 @@
|
|||
"Box": "Caja",
|
||||
"BoxRear": "Caja (lado opuesto)",
|
||||
"Browse": "Explorar",
|
||||
"BrowsePluginCatalogMessage": "Explore nuestro catálogo de complementos para ver los complementos disponibles.",
|
||||
"MessageBrowsePluginCatalog": "Explore nuestro catálogo de complementos para ver los complementos disponibles.",
|
||||
"BurnSubtitlesHelp": "Determina si el servidor debe grabarse en subtítulos al transcodificar videos. Evitar esto mejorará en gran medida el rendimiento. Seleccione Automático para grabar formatos basados en imágenes (VOBSUB, PGS, SUB, IDX, ...) y ciertos subtítulos ASS o SSA.",
|
||||
"ButtonAdd": "Agregar",
|
||||
"ButtonAddMediaLibrary": "Agregar biblioteca de medios",
|
||||
|
@ -201,7 +201,7 @@
|
|||
"DatePlayed": "Fecha de reproducción",
|
||||
"DeathDateValue": "Muerte: {0}",
|
||||
"Default": "Predeterminado",
|
||||
"DefaultErrorMessage": "Hubo un error procesando la solicitud. Por favor intentalo nuevamente mas tarde.",
|
||||
"ErrorDefault": "Hubo un error procesando la solicitud. Por favor intentalo nuevamente mas tarde.",
|
||||
"DefaultMetadataLangaugeDescription": "Estos son tus predeterminados y pueden ser personalizados por librería únicamente.",
|
||||
"Delete": "Borrar",
|
||||
"DeleteDeviceConfirmation": "Estas seguro que quieres borrar este dispositivo? Este va a volver a aparecer cuando una persona se registre.",
|
||||
|
@ -271,7 +271,7 @@
|
|||
"ErrorAddingXmlTvFile": "Ocurrió un error al acceder al archivo de XmlTV. Por favor asegúrate de que el archivo existe e intenta de nuevo.",
|
||||
"ErrorDeletingItem": "Ocurrió un error al eliminar el ítem del servidor Jellyfin. Por favor verifica que el servidor Jellyfin tiene permiso de escritura a la carpeta de medios e intenta de nuevo.",
|
||||
"ErrorGettingTvLineups": "Ocurrió un error al descargar la guía de programación de TV. Por favor asegúrate que tu información es correcta e intenta de nuevo.",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "La hora de fin tiene que ser mayor que la de inicio.",
|
||||
"ErrorStartHourGreaterThanEnd": "La hora de fin tiene que ser mayor que la de inicio.",
|
||||
"ErrorPleaseSelectLineup": "Por favor selecciona un alineamiento e intenta de nuevo. Si no existen alineamientos disponibles, asegúrate de que tu nombre de usuario, contraseña y código postal son correctos.",
|
||||
"ErrorSavingTvProvider": "Ocurrió un error al guardar el proveedor de TV. Por favor asegúrate de que está disponible e intenta de nuevo.",
|
||||
"EveryNDays": "Cada {0} días",
|
||||
|
@ -918,8 +918,8 @@
|
|||
"NoSubtitlesHelp": "Los subtítulos no se cargarán de manera predeterminada. Todavía se pueden activar manualmente durante la reproducción.",
|
||||
"NoSubtitles": "Ninguno",
|
||||
"NoSubtitleSearchResultsFound": "No se han encontrado resultados.",
|
||||
"NoPluginConfigurationMessage": "Este complemento no tiene opciones para configurar.",
|
||||
"NoNextUpItemsMessage": "Nada encontrado. ¡Comienza a ver tus shows!",
|
||||
"MessageNoPluginConfiguration": "Este complemento no tiene opciones para configurar.",
|
||||
"MessageNoNextUpItems": "Nada encontrado. ¡Comienza a ver tus shows!",
|
||||
"NoNewDevicesFound": "No se encontraron nuevos dispositivos. Para agregar un nuevo sintonizador, cierre este cuadro de diálogo e ingrese la información del dispositivo manualmente.",
|
||||
"NoCreatedLibraries": "Parece que todavía no has creado ninguna biblioteca. {0}¿Te gustaría crear una ahora?{1}",
|
||||
"No": "No",
|
||||
|
@ -1208,7 +1208,7 @@
|
|||
"Refresh": "Actualizar",
|
||||
"Recordings": "Grabaciones",
|
||||
"RecordingScheduled": "Grabación programada.",
|
||||
"RecordingPathChangeMessage": "Cambiar su carpeta de grabación no migrará las grabaciones existentes de la ubicación anterior a la nueva. Tendrá que moverlos manualmente si lo desea.",
|
||||
"MessageChangeRecordingPath": "Cambiar su carpeta de grabación no migrará las grabaciones existentes de la ubicación anterior a la nueva. Tendrá que moverlos manualmente si lo desea.",
|
||||
"RecordingCancelled": "Grabación cancelada.",
|
||||
"RecordSeries": "Grabar series",
|
||||
"Record": "Grabar",
|
||||
|
@ -1232,7 +1232,7 @@
|
|||
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Esto usa la información de los metadatos incrustados del capítulo si está disponible.",
|
||||
"PreferEmbeddedTitlesOverFileNamesHelp": "Esto determina el título de visualización predeterminado cuando no hay metadatos de Internet o metadatos locales disponibles.",
|
||||
"PreferEmbeddedTitlesOverFileNames": "Preferir títulos incrustados sobre nombres de archivo",
|
||||
"PluginInstalledMessage": "El complemento se ha instalado correctamente. El servidor Jellyfin deberá reiniciarse para que los cambios surtan efecto.",
|
||||
"MessagePluginInstalled": "El complemento se ha instalado correctamente. El servidor Jellyfin deberá reiniciarse para que los cambios surtan efecto.",
|
||||
"PleaseSelectTwoItems": "Seleccione al menos dos elementos.",
|
||||
"PleaseRestartServerName": "Reinicie el servidor Jellyfin - {0}.",
|
||||
"PleaseEnterNameOrId": "Por favor, introduzca un nombre o una ID externa.",
|
||||
|
@ -1256,7 +1256,7 @@
|
|||
"People": "Personas",
|
||||
"PasswordSaved": "Contraseña guardada.",
|
||||
"PasswordResetProviderHelp": "Elija un proveedor de restablecimiento de contraseña para usar cuando este usuario solicite un restablecimiento de contraseña",
|
||||
"PasswordResetHeader": "Restablecer contraseña",
|
||||
"HeaderResetPassword": "Restablecer contraseña",
|
||||
"PasswordResetConfirmation": "¿Estás seguro de que deseas restablecer la contraseña?",
|
||||
"PasswordResetComplete": "La contraseña ha sido restablecida.",
|
||||
"PasswordMatchError": "La contraseña y la confirmación de la contraseña deben coincidir.",
|
||||
|
@ -1357,8 +1357,8 @@
|
|||
"ReleaseGroup": "Grupo de lanzamiento",
|
||||
"ButtonCast": "Transmitir",
|
||||
"ButtonSyncPlay": "SyncPlay",
|
||||
"EnableBlurhashHelp": "Las imágenes que aún se están cargando se mostrarán con un marcador de posición borroso",
|
||||
"EnableBlurhash": "Habilitar marcadores de posición borrosos para imágenes",
|
||||
"EnableBlurHashHelp": "Las imágenes que aún se están cargando se mostrarán con un marcador de posición borroso",
|
||||
"EnableBlurHash": "Habilitar marcadores de posición borrosos para imágenes",
|
||||
"OnApplicationStartup": "En el inicio de la aplicación",
|
||||
"EveryXHours": "Cada {0} horas",
|
||||
"EveryHour": "Cada hora",
|
||||
|
@ -1412,7 +1412,7 @@
|
|||
"Unrated": "Sin calificación",
|
||||
"Unplayed": "No reproducido",
|
||||
"Unmute": "Dejar de silenciar",
|
||||
"UninstallPluginHeader": "Desinstalar complemento",
|
||||
"HeaderUninstallPlugin": "Desinstalar complemento",
|
||||
"UninstallPluginConfirmation": "¿Estás seguro de que deseas desinstalar {0}?",
|
||||
"Uniform": "Uniforme",
|
||||
"TvLibraryHelp": "Revise la {0}guía de nombres de TV{1}.",
|
||||
|
|
|
@ -50,7 +50,7 @@
|
|||
"Box": "Caja",
|
||||
"BoxRear": "Caja (parte trasera)",
|
||||
"Browse": "Explorar",
|
||||
"BrowsePluginCatalogMessage": "Explora nuestro catálogo de complementos para ver los complementos disponibles.",
|
||||
"MessageBrowsePluginCatalog": "Explora nuestro catálogo de complementos para ver los complementos disponibles.",
|
||||
"BurnSubtitlesHelp": "Determina si el servidor debería quemar los subtítulos al transcodificar videos. Evitar esto mejorará altamente el rendimiento del servidor. Seleccione Auto para grabar formatos basados en imágenes (VOBSUB, PGS, SUB, IDX...) y ciertos subtítulos ASS o SSA.",
|
||||
"ButtonAdd": "Agregar",
|
||||
"ButtonAddMediaLibrary": "Agregar biblioteca de medios",
|
||||
|
@ -156,7 +156,7 @@
|
|||
"DatePlayed": "Fecha de reproducción",
|
||||
"DeathDateValue": "Falleció: {0}",
|
||||
"Default": "Por defecto",
|
||||
"DefaultErrorMessage": "Ha ocurrido un error al procesar la solicitud. Por favor, inténtalo de nuevo más tarde.",
|
||||
"ErrorDefault": "Ha ocurrido un error al procesar la solicitud. Por favor, inténtalo de nuevo más tarde.",
|
||||
"DefaultMetadataLangaugeDescription": "Estos son sus valores por defecto y pueden ser personalizados en cada biblioteca.",
|
||||
"DefaultSubtitlesHelp": "Los subtítulos se cargan basados en los indicadores «por defecto» y «forzado» incluidos en los metadatos. Las preferencias de idioma son consideradas cuando hay múltiples opciones disponibles.",
|
||||
"Delete": "Eliminar",
|
||||
|
@ -224,7 +224,7 @@
|
|||
"ErrorAddingXmlTvFile": "Hubo un error accediendo al archivo XMLTV. Por favor, asegúrate de que el archivo existe e inténtalo de nuevo.",
|
||||
"ErrorDeletingItem": "Hubo un error eliminando el elemento del servidor Jellyfin. Por favor, verifica que el servidor Jellyfin tiene permisos de escritura en la carpeta del medio e inténtalo de nuevo.",
|
||||
"ErrorGettingTvLineups": "Hubo un error al descargar la programación de TV. Por favor, asegúrate de que tu información sea correcta e inténtalo de nuevo.",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "La hora de finalización debe ser mayor que la hora de inicio.",
|
||||
"ErrorStartHourGreaterThanEnd": "La hora de finalización debe ser mayor que la hora de inicio.",
|
||||
"ErrorPleaseSelectLineup": "Por favor, selecciona una programación e inténtalo de nuevo. Si no hay disponible ninguna, entonces, por favor, verifica que tu nombre de usuario, contraseña, y código postal sean correctos.",
|
||||
"ErrorSavingTvProvider": "Hubo un error al guardar el proveedor de TV. Por favor, asegúrate de que sea accesible e inténtalo de nuevo.",
|
||||
"EveryNDays": "Cada {0} días",
|
||||
|
@ -934,8 +934,8 @@
|
|||
"Next": "Siguiente",
|
||||
"NextUp": "A continuación",
|
||||
"NoNewDevicesFound": "No se encontraron nuevos dispositivos. Para agregar un sintonizador nuevo, cierra este diálogo e introduce la información del dispositivo manualmente.",
|
||||
"NoNextUpItemsMessage": "No se encontró nada. ¡Comienza a ver tus programas!",
|
||||
"NoPluginConfigurationMessage": "Este complemento no tiene configuraciones disponibles.",
|
||||
"MessageNoNextUpItems": "No se encontró nada. ¡Comienza a ver tus programas!",
|
||||
"MessageNoPluginConfiguration": "Este complemento no tiene configuraciones disponibles.",
|
||||
"NoSubtitleSearchResultsFound": "No se encontraron resultados.",
|
||||
"NoSubtitles": "Ninguno",
|
||||
"NoSubtitlesHelp": "Los subtítulos no serán cargados por defecto. Pueden ser activados manualmente durante la reproducción.",
|
||||
|
@ -1087,7 +1087,7 @@
|
|||
"PasswordMatchError": "La contraseña y la confirmación de la contraseña deben coincidir.",
|
||||
"PasswordResetComplete": "La contraseña ha sido restablecida.",
|
||||
"PasswordResetConfirmation": "¿Estás seguro de querer restablecer la contraseña?",
|
||||
"PasswordResetHeader": "Restablecer contraseña",
|
||||
"HeaderResetPassword": "Restablecer contraseña",
|
||||
"PasswordSaved": "Contraseña guardada.",
|
||||
"People": "Personas",
|
||||
"PerfectMatch": "Coincidencia perfecta",
|
||||
|
@ -1109,7 +1109,7 @@
|
|||
"PleaseEnterNameOrId": "Por favor, introduce un nombre o ID externo.",
|
||||
"PleaseRestartServerName": "Por favor, reinicia el servidor Jellyfin - {0}.",
|
||||
"PleaseSelectTwoItems": "Por favor, selecciona al menos dos elementos.",
|
||||
"PluginInstalledMessage": "El complemento ha sido instalado con éxito. El servidor Jellyfin necesitará ser reiniciado para que los cambios surtan efecto.",
|
||||
"MessagePluginInstalled": "El complemento ha sido instalado con éxito. El servidor Jellyfin necesitará ser reiniciado para que los cambios surtan efecto.",
|
||||
"PreferEmbeddedTitlesOverFileNames": "Preferir títulos incrustados a los nombres de archivo",
|
||||
"PreferEmbeddedTitlesOverFileNamesHelp": "Esto determina el título mostrado por defecto cuando no hay disponibles metadatos en Internet o localmente.",
|
||||
"Premiere": "Estreno",
|
||||
|
@ -1131,7 +1131,7 @@
|
|||
"Record": "Grabar",
|
||||
"RecordSeries": "Grabar series",
|
||||
"RecordingCancelled": "Grabación cancelada.",
|
||||
"RecordingPathChangeMessage": "Cambiar la carpeta de grabaciones no moverá las grabaciones existentes de la antigua ubicación a la nueva. Necesitan moverse manualmente si se desea.",
|
||||
"MessageChangeRecordingPath": "Cambiar la carpeta de grabaciones no moverá las grabaciones existentes de la antigua ubicación a la nueva. Necesitan moverse manualmente si se desea.",
|
||||
"RecordingScheduled": "Grabación programada.",
|
||||
"Recordings": "Grabaciones",
|
||||
"Refresh": "Actualizar",
|
||||
|
@ -1281,7 +1281,7 @@
|
|||
"TvLibraryHelp": "Revisa la {0}guía de nombrado de series de TV{1}.",
|
||||
"Uniform": "Uniforme",
|
||||
"UninstallPluginConfirmation": "¿Estás seguro de querer desinstalar {0}?",
|
||||
"UninstallPluginHeader": "Desinstalar complemento",
|
||||
"HeaderUninstallPlugin": "Desinstalar complemento",
|
||||
"Unmute": "Activar sonido",
|
||||
"Unplayed": "No reproducido",
|
||||
"Unrated": "Sin clasificar",
|
||||
|
@ -1544,8 +1544,8 @@
|
|||
"ButtonSyncPlay": "SyncPlay",
|
||||
"ButtonPlayer": "Reproductor",
|
||||
"ButtonCast": "Elenco",
|
||||
"EnableBlurhashHelp": "Imágenes que aún están siendo cargadas serán mostradas difuminadas",
|
||||
"EnableBlurhash": "Habilitar imágenes de fondo difuminadas",
|
||||
"EnableBlurHashHelp": "Imágenes que aún están siendo cargadas serán mostradas difuminadas",
|
||||
"EnableBlurHash": "Habilitar imágenes de fondo difuminadas",
|
||||
"TabRepositories": "Repositorios",
|
||||
"ShowMore": "Mostrar más",
|
||||
"ShowLess": "Mostrar menos",
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
"Box": "Caja",
|
||||
"BoxRear": "Caja (trasera)",
|
||||
"Browse": "Explorar",
|
||||
"BrowsePluginCatalogMessage": "Explore el catálogo de extensiones para ver las extensiones disponibles.",
|
||||
"MessageBrowsePluginCatalog": "Explore el catálogo de extensiones para ver las extensiones disponibles.",
|
||||
"ButtonAdd": "Añadir",
|
||||
"ButtonAddMediaLibrary": "Añadir biblioteca de medios",
|
||||
"ButtonAddScheduledTaskTrigger": "Agregar Activador",
|
||||
|
@ -138,7 +138,7 @@
|
|||
"CustomDlnaProfilesHelp": "Crear un perfil personalizado para un nuevo dispositivo o reemplazar un perfil del sistema.",
|
||||
"DeathDateValue": "Murió: {0}",
|
||||
"Default": "Por defecto",
|
||||
"DefaultErrorMessage": "Ha habido un error procesando la solicitud. Por favor inténtalo más tarde.",
|
||||
"ErrorDefault": "Ha habido un error procesando la solicitud. Por favor inténtalo más tarde.",
|
||||
"DefaultMetadataLangaugeDescription": "Estos son tus ajustes y se pueden personalizar para cada biblioteca.",
|
||||
"DefaultSubtitlesHelp": "Los subtítulos que se utilizarán dependerán de como estén etiquetadas las pistas de los archivos (si \"por defecto\" o \"forzado\"). Los ajustes de idioma se tienen en cuenta cuando hay varias opciones disponibles.",
|
||||
"Delete": "Borrar",
|
||||
|
@ -185,7 +185,7 @@
|
|||
"ErrorAddingTunerDevice": "Ha habido un error añadiendo el dispositivo sintonizador. Por favor, asegúrate de que es accesible e inténtalo otra vez.",
|
||||
"ErrorAddingXmlTvFile": "Ha sucedido un error accediendo al archivo XML. Por favor, asegúrate que el archivo existe e inténtalo de nuevo.",
|
||||
"ErrorGettingTvLineups": "Ha habido un error descargando la programación de TV. Por favor, asegúrese que la información es correcta e inténtalo de nuevo.",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "La hora de finalización tiene que ser mayor que la de inicio.",
|
||||
"ErrorStartHourGreaterThanEnd": "La hora de finalización tiene que ser mayor que la de inicio.",
|
||||
"ErrorPleaseSelectLineup": "Por favor selecciona una alineación e inténtalo otra vez. Si no hay alineaciones disponibles, revisa que tu nombre de usuario, contraseña y código postal son correctos.",
|
||||
"ErrorSavingTvProvider": "Ha habido un error guardando el proveedor de TV. Por favor, asegúrate de que es accesible e inténtalo otra vez.",
|
||||
"EveryNDays": "Cada {0} días",
|
||||
|
@ -854,8 +854,8 @@
|
|||
"Next": "Siguiente",
|
||||
"NextUp": "Seguidamente",
|
||||
"NoNewDevicesFound": "No se han encontrado nuevos dispositivos. Para añadir un sintonizador cierra este diálogo e introduce la información del dispositivo manualmente.",
|
||||
"NoNextUpItemsMessage": "Nada encontrado. ¡Comienza a ver tus programas!",
|
||||
"NoPluginConfigurationMessage": "Este complemento no tiene opciones que configurar.",
|
||||
"MessageNoNextUpItems": "Nada encontrado. ¡Comienza a ver tus programas!",
|
||||
"MessageNoPluginConfiguration": "Este complemento no tiene opciones que configurar.",
|
||||
"NoSubtitleSearchResultsFound": "No se han encontrado resultados.",
|
||||
"NoSubtitles": "Sin subtítulos",
|
||||
"NoSubtitlesHelp": "Los subtítulos no se cargarán de forma predeterminada. Tienen que ser activados manualmente durante la reproducción.",
|
||||
|
@ -1000,7 +1000,7 @@
|
|||
"PasswordMatchError": "La contraseña y la confirmación de la contraseña deben de ser iguales.",
|
||||
"PasswordResetComplete": "La contraseña se ha restablecido.",
|
||||
"PasswordResetConfirmation": "¿Esta seguro de que desea restablecer la contraseña?",
|
||||
"PasswordResetHeader": "Restablecer contraseña",
|
||||
"HeaderResetPassword": "Restablecer contraseña",
|
||||
"PasswordSaved": "Contraseña guardada.",
|
||||
"People": "Gente",
|
||||
"PinCodeResetComplete": "El código PIN se ha restablecido.",
|
||||
|
@ -1017,7 +1017,7 @@
|
|||
"PleaseEnterNameOrId": "Introduzca un nombre o un identificador externo.",
|
||||
"PleaseRestartServerName": "Por favor, reinicie el Servidor de Jellyfin - {0}.",
|
||||
"PleaseSelectTwoItems": "Seleccione al menos dos elementos.",
|
||||
"PluginInstalledMessage": "El complemento se ha instalado correctamente. El servidor Jellyfin deberá reiniciarse para que los cambios surjan efecto.",
|
||||
"MessagePluginInstalled": "El complemento se ha instalado correctamente. El servidor Jellyfin deberá reiniciarse para que los cambios surjan efecto.",
|
||||
"PreferEmbeddedTitlesOverFileNames": "Preferir títulos incrustados sobre los nombres de archivo",
|
||||
"PreferEmbeddedTitlesOverFileNamesHelp": "Esto determina el título que se utilizará cuando un elemento no tenga etiquetas ni estas se hayan podido descargar de Internet.",
|
||||
"Premieres": "Estrenos",
|
||||
|
@ -1037,7 +1037,7 @@
|
|||
"Record": "Grabar",
|
||||
"RecordSeries": "Grabar serie",
|
||||
"RecordingCancelled": "Grabación cancelada.",
|
||||
"RecordingPathChangeMessage": "Cambiar la carpeta de grabación no migrará las grabaciones existentes de la ubicación antigua a la nueva. Tendrá que moverlos manualmente si lo desea.",
|
||||
"MessageChangeRecordingPath": "Cambiar la carpeta de grabación no migrará las grabaciones existentes de la ubicación antigua a la nueva. Tendrá que moverlos manualmente si lo desea.",
|
||||
"RecordingScheduled": "Grabación programada.",
|
||||
"Recordings": "Grabaciones",
|
||||
"Refresh": "Refrescar",
|
||||
|
@ -1169,7 +1169,7 @@
|
|||
"Tuesday": "Martes",
|
||||
"TvLibraryHelp": "Revisar la {0}guía de nombres de los programas de TV{1}.",
|
||||
"UninstallPluginConfirmation": "¿Esta seguro que desea desinstalar {0}?",
|
||||
"UninstallPluginHeader": "Desinstalar complemento",
|
||||
"HeaderUninstallPlugin": "Desinstalar complemento",
|
||||
"Unmute": "Activar audio",
|
||||
"Unrated": "Sin clasificar",
|
||||
"Up": "Arriba",
|
||||
|
@ -1511,8 +1511,8 @@
|
|||
"LabelEnableHttps": "Activar HTTPS",
|
||||
"TabDVR": "DVR",
|
||||
"SaveChanges": "Guardar cambios",
|
||||
"EnableBlurhash": "Mostrar una representación de las imágenes mientras cargan",
|
||||
"EnableBlurhashHelp": "Aparecerá una representación de los colores de las imágenes antes de que terminen de cargar",
|
||||
"EnableBlurHash": "Mostrar una representación de las imágenes mientras cargan",
|
||||
"EnableBlurHashHelp": "Aparecerá una representación de los colores de las imágenes antes de que terminen de cargar",
|
||||
"HeaderDVR": "DVR",
|
||||
"SyncPlayAccessHelp": "Selecciona el nivel de acceso de este usuario para utilizar SyncPlay. SyncPlay te permite sincronizar la reproducción entre varios dispositivos.",
|
||||
"MessageSyncPlayErrorMedia": "¡No se pudo activar SyncPlay! Error de medio.",
|
||||
|
|
|
@ -114,7 +114,7 @@
|
|||
"Unrated": "Sin clasificar",
|
||||
"Unplayed": "No reproducido",
|
||||
"Unmute": "Activar sonido",
|
||||
"UninstallPluginHeader": "Desinstalar complemento",
|
||||
"HeaderUninstallPlugin": "Desinstalar complemento",
|
||||
"UninstallPluginConfirmation": "¿Estás seguro de querer desinstalar {0}?",
|
||||
"Uniform": "Uniforme",
|
||||
"TvLibraryHelp": "Revisa la {0}guía de nombrado de series de TV{1}.",
|
||||
|
@ -306,8 +306,8 @@
|
|||
"NoSubtitlesHelp": "Los subtítulos no serán cargados por defecto. Pueden ser activados manualmente durante la reproducción.",
|
||||
"NoSubtitles": "Ninguno",
|
||||
"NoSubtitleSearchResultsFound": "No se encontraron resultados.",
|
||||
"NoPluginConfigurationMessage": "Este complemento no tiene configuraciones disponibles.",
|
||||
"NoNextUpItemsMessage": "No se encontró nada. ¡Comienza a ver tus programas!",
|
||||
"MessageNoPluginConfiguration": "Este complemento no tiene configuraciones disponibles.",
|
||||
"MessageNoNextUpItems": "No se encontró nada. ¡Comienza a ver tus programas!",
|
||||
"NoNewDevicesFound": "No se encontraron nuevos dispositivos. Para agregar un sintonizador nuevo, cierra este diálogo e introduce la información del dispositivo manualmente.",
|
||||
"NoCreatedLibraries": "Parece que no has creado ninguna biblioteca todavía. {0}¿Quisieras crear una ahora?{1}",
|
||||
"No": "No",
|
||||
|
@ -580,7 +580,7 @@
|
|||
"Refresh": "Actualizar",
|
||||
"Recordings": "Grabaciones",
|
||||
"RecordingScheduled": "Grabación programada.",
|
||||
"RecordingPathChangeMessage": "Cambiar la carpeta de grabaciones no moverá las grabaciones existentes de la antigua ubicación a la nueva. Necesitan moverse manualmente si se desea.",
|
||||
"MessageChangeRecordingPath": "Cambiar la carpeta de grabaciones no moverá las grabaciones existentes de la antigua ubicación a la nueva. Necesitan moverse manualmente si se desea.",
|
||||
"RecordingCancelled": "Grabación cancelada.",
|
||||
"RecordSeries": "Grabar series",
|
||||
"Record": "Grabar",
|
||||
|
@ -604,7 +604,7 @@
|
|||
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Esto utiliza la información del episodio desde los metadatos incrustados si están disponibles.",
|
||||
"PreferEmbeddedTitlesOverFileNamesHelp": "Esto determina el título mostrado por defecto cuando no hay disponibles metadatos en Internet o localmente.",
|
||||
"PreferEmbeddedTitlesOverFileNames": "Preferir títulos incrustados a los nombres de archivo",
|
||||
"PluginInstalledMessage": "El complemento ha sido instalado con éxito. El servidor Jellyfin necesitará ser reiniciado para que los cambios surtan efecto.",
|
||||
"MessagePluginInstalled": "El complemento ha sido instalado con éxito. El servidor Jellyfin necesitará ser reiniciado para que los cambios surtan efecto.",
|
||||
"PleaseSelectTwoItems": "Por favor, selecciona al menos dos elementos.",
|
||||
"PleaseRestartServerName": "Por favor, reinicia el servidor Jellyfin - {0}.",
|
||||
"PleaseEnterNameOrId": "Por favor, introduce un nombre o ID externo.",
|
||||
|
@ -628,7 +628,7 @@
|
|||
"People": "Personas",
|
||||
"PasswordSaved": "Contraseña guardada.",
|
||||
"PasswordResetProviderHelp": "Elige un proveedor de restablecimiento de contraseña para usar cuando este usuario solicite un restablecimiento de contraseña",
|
||||
"PasswordResetHeader": "Restablecer contraseña",
|
||||
"HeaderResetPassword": "Restablecer contraseña",
|
||||
"PasswordResetConfirmation": "¿Estás seguro de querer restablecer la contraseña?",
|
||||
"PasswordResetComplete": "La contraseña ha sido restablecida.",
|
||||
"PasswordMatchError": "La contraseña y la confirmación de la contraseña deben coincidir.",
|
||||
|
@ -1303,7 +1303,7 @@
|
|||
"EveryNDays": "Cada {0} días",
|
||||
"ErrorSavingTvProvider": "Hubo un error al guardar el proveedor de TV. Por favor, asegúrate de que sea accesible e inténtalo de nuevo.",
|
||||
"ErrorPleaseSelectLineup": "Por favor, selecciona una programación e inténtalo de nuevo. Si no hay disponible ninguna, entonces, por favor, verifica que tu nombre de usuario, contraseña, y código postal sean correctos.",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "La hora de finalización debe ser mayor que la hora de inicio.",
|
||||
"ErrorStartHourGreaterThanEnd": "La hora de finalización debe ser mayor que la hora de inicio.",
|
||||
"ErrorGettingTvLineups": "Hubo un error al descargar la programación de TV. Por favor, asegúrate de que tu información sea correcta e inténtalo de nuevo.",
|
||||
"ErrorDeletingItem": "Hubo un error eliminando el elemento del servidor Jellyfin. Por favor, verifica que el servidor Jellyfin tiene permisos de escritura en la carpeta del medio e inténtalo de nuevo.",
|
||||
"ErrorAddingXmlTvFile": "Hubo un error accediendo al archivo XMLTV. Por favor, asegúrate de que el archivo existe e inténtalo de nuevo.",
|
||||
|
@ -1374,7 +1374,7 @@
|
|||
"DeinterlaceMethodHelp": "Seleccione el método de desentrelazado que se usará al transcodificar contenido entrelazado.",
|
||||
"DefaultSubtitlesHelp": "Los subtítulos se cargan basados en los indicadores «por defecto» y «forzado» incluidos en los metadatos. Las preferencias de idioma son consideradas cuando hay múltiples opciones disponibles.",
|
||||
"DefaultMetadataLangaugeDescription": "Estos son sus valores por defecto y pueden ser personalizados en cada biblioteca.",
|
||||
"DefaultErrorMessage": "Ha ocurrido un error al procesar la solicitud. Por favor, inténtalo de nuevo más tarde.",
|
||||
"ErrorDefault": "Ha ocurrido un error al procesar la solicitud. Por favor, inténtalo de nuevo más tarde.",
|
||||
"Default": "Por defecto",
|
||||
"DeathDateValue": "Falleció: {0}",
|
||||
"DatePlayed": "Fecha de reproducción",
|
||||
|
@ -1496,7 +1496,7 @@
|
|||
"ButtonAddImage": "Agregar imagen",
|
||||
"ButtonAdd": "Agregar",
|
||||
"BurnSubtitlesHelp": "Determina si el servidor debería quemar los subtítulos al transcodificar videos. Evitar esto mejorará altamente el rendimiento del servidor. Seleccione Auto para grabar formatos basados en imágenes (VOBSUB, PGS, SUB, IDX...) y ciertos subtítulos ASS o SSA.",
|
||||
"BrowsePluginCatalogMessage": "Explora nuestro catálogo de complementos para ver los complementos disponibles.",
|
||||
"MessageBrowsePluginCatalog": "Explora nuestro catálogo de complementos para ver los complementos disponibles.",
|
||||
"Browse": "Explorar",
|
||||
"BoxRear": "Caja (parte trasera)",
|
||||
"Box": "Caja",
|
||||
|
@ -1541,10 +1541,10 @@
|
|||
"AllChannels": "Todos los canales",
|
||||
"All": "Todo",
|
||||
"Alerts": "Alertas",
|
||||
"EnableBlurhash": "Habilitar marcadores de posición borrosos para imágenes",
|
||||
"EnableBlurHash": "Habilitar marcadores de posición borrosos para imágenes",
|
||||
"ShowMore": "Mostrar más",
|
||||
"ShowLess": "Mostrar menos",
|
||||
"EnableBlurhashHelp": "Las imágenes que aún se están cargando se mostrarán con un marcador de posición borroso",
|
||||
"EnableBlurHashHelp": "Las imágenes que aún se están cargando se mostrarán con un marcador de posición borroso",
|
||||
"ButtonSyncPlay": "SyncPlay",
|
||||
"MessageNoGenresAvailable": "Permitir a algunos proveedores de metadatos obtener géneros desde Internet.",
|
||||
"MessageAddRepository": "Si desea agregar un repositorio, haga clic en el botón al lado del encabezado y complete la información solicitada.",
|
||||
|
|
|
@ -73,7 +73,7 @@
|
|||
"MessagePleaseEnsureInternetMetadata": "لطفا مطمئن شوید دانلود متاداده از اینترنت فعال است.",
|
||||
"MoreUsersCanBeAddedLater": "بعدا میتوانید کاربران بیشتری را در داشبورد اضافه کنید.",
|
||||
"NextUp": "بعدی چیه",
|
||||
"NoNextUpItemsMessage": "چیزی یافت نشد. دیدن سریال ها یتان را شروع کنید!",
|
||||
"MessageNoNextUpItems": "چیزی یافت نشد. دیدن سریال ها یتان را شروع کنید!",
|
||||
"OptionAscending": "صعودی",
|
||||
"OptionDescending": "نزولی",
|
||||
"OptionDislikes": "پسندیده نشده ها",
|
||||
|
@ -225,7 +225,7 @@
|
|||
"AddToCollection": "افزودن به مجموعه",
|
||||
"ExitFullscreen": "خروج از تمام صفحه",
|
||||
"EveryNDays": "هر {0} روز",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "زمان پایان باید پس از زمان شروع باشد.",
|
||||
"ErrorStartHourGreaterThanEnd": "زمان پایان باید پس از زمان شروع باشد.",
|
||||
"Episodes": "قسمتها",
|
||||
"EndsAtValue": "تمام شده در {0}",
|
||||
"Ended": "تمام شده",
|
||||
|
@ -272,7 +272,7 @@
|
|||
"DeleteDeviceConfirmation": "آیا از حذف این دستگاه اطمینان دارید؟ هنگامی که یک کاربر دوباره با آن دستگاه وارد شود، دوباره نمایش داده میشود.",
|
||||
"Delete": "حذف",
|
||||
"DefaultMetadataLangaugeDescription": "این موارد پیشفرضهای شماست و میتوانید برای هر کتابخانه آن را شخصی سازی کنید.",
|
||||
"DefaultErrorMessage": "خطایی در پردازش درخواست رخ داد. لطفا اندکی بعد دوباره تلاش کنید.",
|
||||
"ErrorDefault": "خطایی در پردازش درخواست رخ داد. لطفا اندکی بعد دوباره تلاش کنید.",
|
||||
"Default": "پیشفرض",
|
||||
"DeathDateValue": "تلف شد: {0}",
|
||||
"DatePlayed": "تاریخ پخش شده",
|
||||
|
@ -312,7 +312,7 @@
|
|||
"ButtonShutdown": "خاموش",
|
||||
"ButtonSelectDirectory": "انتخاب مسیر",
|
||||
"ButtonEditOtherUserPreferences": "نمایه، تصویر و ترجیحات شخصی این کاربر را ویرایش کنید.",
|
||||
"BrowsePluginCatalogMessage": "برای مرور کردن افزونههای موجود، به فروشگاه افزونههای ما سر بزنید.",
|
||||
"MessageBrowsePluginCatalog": "برای مرور کردن افزونههای موجود، به فروشگاه افزونههای ما سر بزنید.",
|
||||
"AuthProviderHelp": "ارائه دهنده تأیید اعتبار را انتخاب کنید تا برای تأیید اعتبار گذرواژه این کاربر استفاده شود.",
|
||||
"HeaderRecordingPostProcessing": "در حال ضبط پس پردازش",
|
||||
"HeaderRecordingOptions": "گزینههای ضبط",
|
||||
|
@ -520,7 +520,7 @@
|
|||
"Unrated": "بدون امتیاز",
|
||||
"Unplayed": "پخش نشده",
|
||||
"Unmute": "صدادار",
|
||||
"UninstallPluginHeader": "حذف نصب افزونه",
|
||||
"HeaderUninstallPlugin": "حذف نصب افزونه",
|
||||
"UninstallPluginConfirmation": "آیا اطمینان دارید که میخواهید {0} را حذف نصب کنید؟",
|
||||
"Uniform": "یکپارچه",
|
||||
"Tuesday": "سهشنبه",
|
||||
|
@ -698,7 +698,7 @@
|
|||
"MessageInvalidUser": "نام کاربری یا گذرواژه نامعتبر است. لطفا دوباره تلاش کنید.",
|
||||
"MessageInvalidForgotPasswordPin": "کد پین نامعتبر یا منقضی شده وارد شد. لطفا دوباره تلاش کنید.",
|
||||
"MessageInstallPluginFromApp": "این افزونه باید از داخل برنامهای که قصد استفاده از آن را دارید نصب شود.",
|
||||
"PasswordResetHeader": "بازنشانی گذرواژه",
|
||||
"HeaderResetPassword": "بازنشانی گذرواژه",
|
||||
"PasswordResetConfirmation": "آیا واقعا تمایل به بازنشانی گذرواژه دارید؟",
|
||||
"PasswordResetComplete": "گذرواژه بازنشانی شد.",
|
||||
"PasswordMatchError": "گذرواژه و تکرار گذرواژه باید یکسان باشند.",
|
||||
|
@ -743,7 +743,7 @@
|
|||
"Refresh": "بهروزرسانی",
|
||||
"Recordings": "ضبط شده ها",
|
||||
"RecordingScheduled": "ضبط برنامه ریزی شد.",
|
||||
"RecordingPathChangeMessage": "با تغییر محل ذخیره فایل های ضبط شده، فایل های موجود به صورت خودکار منتقل نمی شوند. در صورت نیاز، شما باید خودتان این کار را انجام دهید.",
|
||||
"MessageChangeRecordingPath": "با تغییر محل ذخیره فایل های ضبط شده، فایل های موجود به صورت خودکار منتقل نمی شوند. در صورت نیاز، شما باید خودتان این کار را انجام دهید.",
|
||||
"RecordingCancelled": "ضبط شدن لغو شد.",
|
||||
"RecordSeries": "ضبط کردن سریال ها",
|
||||
"Record": "ضبط کردن",
|
||||
|
@ -767,7 +767,7 @@
|
|||
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "این از اطلاعات قسمت در فراداده های تعبیه شده در صورت موجود استفاده می کند.",
|
||||
"PreferEmbeddedTitlesOverFileNamesHelp": "این عنوان نمایش را به صورت پیش فرض تعیین می کند، زمانی که فراداده اینترنتی یا محلی موجود نباشند.",
|
||||
"PreferEmbeddedTitlesOverFileNames": "عنوان های تعبیه شده را به نام فایل ترجیح بده",
|
||||
"PluginInstalledMessage": "افزونه با موفقیت نصب شد. برای اعمال تغییرات سرور جلیفین نیاز به بارگذاری مجدد دارد.",
|
||||
"MessagePluginInstalled": "افزونه با موفقیت نصب شد. برای اعمال تغییرات سرور جلیفین نیاز به بارگذاری مجدد دارد.",
|
||||
"PleaseSelectTwoItems": "لطفا حداقل دو مورد را انتخاب کنید.",
|
||||
"PleaseRestartServerName": "لطفا سرور جلیفین را دوباره بارگذاری کنید - {0}.",
|
||||
"PleaseEnterNameOrId": "لطفا یک نام یا شناسه خارجی را وارد کنید.",
|
||||
|
@ -797,7 +797,7 @@
|
|||
"LaunchWebAppOnStartup": "نمای وب هنگامی که سرور آغاز به کار میکند باز بشود",
|
||||
"NoSubtitles": "خالی",
|
||||
"NoSubtitleSearchResultsFound": "نتیجهای یافت نشد.",
|
||||
"NoPluginConfigurationMessage": "این افزونه هیچ تنظیماتی برای پیکربندی ندارد.",
|
||||
"MessageNoPluginConfiguration": "این افزونه هیچ تنظیماتی برای پیکربندی ندارد.",
|
||||
"No": "خیر",
|
||||
"Next": "بعدی",
|
||||
"News": "اخبار",
|
||||
|
@ -1543,7 +1543,7 @@
|
|||
"TvLibraryHelp": "Review the {0}TV naming guide{1}.",
|
||||
"UserAgentHelp": "Supply a custom user-agent HTTP header.",
|
||||
"ValueContainer": "Container: {0}",
|
||||
"EnableBlurhash": "Enable blurred placeholders for images",
|
||||
"EnableBlurhashHelp": "Images that are still being loaded will be displayed with a blurred placeholder",
|
||||
"EnableBlurHash": "Enable blurred placeholders for images",
|
||||
"EnableBlurHashHelp": "Images that are still being loaded will be displayed with a blurred placeholder",
|
||||
"ButtonSyncPlay": "SyncPlay"
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"BrowsePluginCatalogMessage": "Selaa lisäosakuvastoamme katsoaksesi saatavilla olevia lisäosia.",
|
||||
"MessageBrowsePluginCatalog": "Selaa lisäosakuvastoamme katsoaksesi saatavilla olevia lisäosia.",
|
||||
"ButtonAddUser": "Lisää Käyttäjä",
|
||||
"ButtonCancel": "Peruuta",
|
||||
"ButtonDeleteImage": "Poista Kuva",
|
||||
|
@ -47,7 +47,7 @@
|
|||
"TellUsAboutYourself": "Kerro meille itsestäsi",
|
||||
"ThisWizardWillGuideYou": "Tämä työkalu auttaa sinua asennusprosessin aikana. Valitse kieli aloittaaksesi.",
|
||||
"UninstallPluginConfirmation": "Oletko varma, että haluat poistaa {0}?",
|
||||
"UninstallPluginHeader": "Poista Lisäosa",
|
||||
"HeaderUninstallPlugin": "Poista Lisäosa",
|
||||
"Absolute": "Ehdoton",
|
||||
"Actor": "Näyttelijä",
|
||||
"Add": "Lisää",
|
||||
|
@ -201,7 +201,7 @@
|
|||
"DateAdded": "Lisäyspäivämäärä",
|
||||
"DatePlayed": "Toistopäivämäärä",
|
||||
"Default": "Oletus",
|
||||
"DefaultErrorMessage": "Pyynnön käsittelyssä tapahtui virhe. Yritä myöhemmin uudelleen.",
|
||||
"ErrorDefault": "Pyynnön käsittelyssä tapahtui virhe. Yritä myöhemmin uudelleen.",
|
||||
"DefaultMetadataLangaugeDescription": "Nämä ovat sinun oletuksetasetukset ja niitä voidaan muokata kirjastokohtaisesti.",
|
||||
"DefaultSubtitlesHelp": "Tekstitykset ladataan pakotettu- ja oletusmäärityksien upotetun metadatan mukaan. Kieliasetukset otetaan huomioon, kun on enemmän kuin yksi tekstitys josta valita.",
|
||||
"DeleteDeviceConfirmation": "Oletko varma, että haluat positaa tämän laitteen? Se ilmaantuu uudelleen seuraavan kerran, kun jokin käyttäjä kirjautuu sillä.",
|
||||
|
@ -303,7 +303,7 @@
|
|||
"Play": "Toista",
|
||||
"PinCodeResetConfirmation": "Haluatko varmasti nollata PIN-koodin?",
|
||||
"People": "Ihmiset",
|
||||
"PasswordResetHeader": "Nollaa salasana",
|
||||
"HeaderResetPassword": "Nollaa salasana",
|
||||
"OriginalAirDateValue": "Alkuperäinen esityspäivä: {0}",
|
||||
"OptionWeekly": "Viikottainen",
|
||||
"OptionWeekends": "Viikonloput",
|
||||
|
@ -831,7 +831,7 @@
|
|||
"OnApplicationStartup": "Käynnistyksen yhteydessä",
|
||||
"NumLocationsValue": "{0} kansiota",
|
||||
"NoSubtitleSearchResultsFound": "Ei tuloksia.",
|
||||
"NoPluginConfigurationMessage": "Tällä liitännäisellä ei ole asetuksia muokattavaksi.",
|
||||
"MessageNoPluginConfiguration": "Tällä liitännäisellä ei ole asetuksia muokattavaksi.",
|
||||
"NoCreatedLibraries": "Vaikuttaa siltä, ettet ole luonut vielä yhtään kirjastoa. {0} Haluaisitko luoda sellaisen nyt?{1}",
|
||||
"No": "Ei",
|
||||
"NextUp": "Seuraavana",
|
||||
|
@ -1216,7 +1216,7 @@
|
|||
"FolderTypeUnset": "Sekalainen sisältö",
|
||||
"FetchingData": "Noudetaan lisätietoja",
|
||||
"Features": "Ominaisuudet",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "Loppumisajan on oltava myöhemmin kuin aloitusaika.",
|
||||
"ErrorStartHourGreaterThanEnd": "Loppumisajan on oltava myöhemmin kuin aloitusaika.",
|
||||
"MediaInfoAnamorphic": "Anamorfinen",
|
||||
"ErrorGettingTvLineups": "TV esiintyjälistan lataamisessa tapahtui virhe. Varmista, että tiedot on oikein ja yritä uudelleen.",
|
||||
"EnableDetailsBannerHelp": "Näyttää julistekuvan yksityiskohdat -sivun ylälaidassa.",
|
||||
|
|
|
@ -138,7 +138,7 @@
|
|||
"Box": "Boîtier",
|
||||
"BoxRear": "Dos de boîtier",
|
||||
"Browse": "Parcourir",
|
||||
"BrowsePluginCatalogMessage": "Explorer notre catalogue des plugins pour voir les plugins disponibles.",
|
||||
"MessageBrowsePluginCatalog": "Explorer notre catalogue des plugins pour voir les plugins disponibles.",
|
||||
"AllowHWTranscodingHelp": "Permets au syntonisateur de transcoder les flux à la volée. Cela peut aider à réduire le transcodage requis par le serveur.",
|
||||
"BurnSubtitlesHelp": "Détermine si le serveur doit graver les sous-titres lors du transcodage vidéo. Éviter ceci améliorera les performances du serveur. Sélectionnez Auto pour graver les formats basés sur l'image (par exemple, VOBSUB, PGS, SUB/IDX etc) ainsi que certains sous-titres ASS/SSA.",
|
||||
"ButtonAdd": "Ajouter",
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
"Box": "Boîtier",
|
||||
"BoxRear": "Dos de boîtier",
|
||||
"Browse": "Parcourir",
|
||||
"BrowsePluginCatalogMessage": "Explorer notre catalogue des plugins pour voir les plugins disponibles.",
|
||||
"MessageBrowsePluginCatalog": "Explorer notre catalogue des plugins pour voir les plugins disponibles.",
|
||||
"BurnSubtitlesHelp": "Détermine si le serveur doit incruster les sous-titres lors du transcodage de la vidéo. Les performances seront grandement améliorées sans incrustation. Sélectionnez Auto pour incruster par image les formats (VOBSUB, PGS, SUB, IDX etc) et certains sous-titres ASS ou SSA.",
|
||||
"ButtonAdd": "Ajouter",
|
||||
"ButtonAddMediaLibrary": "Ajouter une médiathèque",
|
||||
|
@ -155,7 +155,7 @@
|
|||
"DatePlayed": "Date de lecture",
|
||||
"DeathDateValue": "Décédé(e) le {0}",
|
||||
"Default": "Par défaut",
|
||||
"DefaultErrorMessage": "Il y a eu une erreur lors de l'exécution de la requête. Veuillez réessayer plus tard.",
|
||||
"ErrorDefault": "Il y a eu une erreur lors de l'exécution de la requête. Veuillez réessayer plus tard.",
|
||||
"DefaultMetadataLangaugeDescription": "Ce sont vos réglages par défaut. Ils peuvent être personnalisés pour chaque médiathèque.",
|
||||
"DefaultSubtitlesHelp": "Les sous-titres seront chargés selon les marqueurs par défaut et forcé dans les métadonnées intégrées. Les langues préférées seront utilisées quand plusieurs options seront disponibles.",
|
||||
"Delete": "Supprimer",
|
||||
|
@ -172,7 +172,7 @@
|
|||
"DeviceAccessHelp": "Ceci ne s'applique qu'aux appareils qui peuvent être identifiés de manière unique et n'empêchera pas l'accès par navigateur. Le filtrage de l'accès aux appareil par utilisateur empêchera l'utilisation de nouveaux appareils jusqu'à ce qu'ils soient approuvés ici.",
|
||||
"DirectPlaying": "Lecture directe",
|
||||
"DirectStreamHelp1": "Le média est compatible avec l'appareil en ce qui concerne la résolution et le type de média (H.264, AC3, etc), mais se trouve dans un conteneur de fichiers incompatible (mkv, avi, wmv, etc). La vidéo sera rempaquetée à la volée avant d'être diffusée à l'appareil.",
|
||||
"DirectStreamHelp2": "Le streaming en direct d'un fichier utilise très peu de puissance de traitement sans perte de qualité vidéo.",
|
||||
"DirectStreamHelp2": "Le streaming en direct utilise très peu de puissance de traitement avec une perte minime de qualité vidéo.",
|
||||
"DirectStreaming": "Streaming direct",
|
||||
"Director": "Réalisateur(trice)",
|
||||
"Directors": "Réalisateurs",
|
||||
|
@ -224,7 +224,7 @@
|
|||
"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.",
|
||||
"ErrorGettingTvLineups": "Une erreur est survenue pendant le téléchargement des programmes TV. Assurez-vous que vos informations sont correctes et réessayez.",
|
||||
"ErrorMessageStartHourGreaterThanEnd": "La date de fin doit être postérieure à la date de début.",
|
||||
"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.",
|
||||
"ErrorSavingTvProvider": "Une erreur est survenue lors de la sauvegarde du fournisseur TV. Assurez-vous qu'il est accessible et réessayez.",
|
||||
"EveryNDays": "Tous les {0} jours",
|
||||
|
@ -277,7 +277,7 @@
|
|||
"HeaderAllowMediaDeletionFrom": "Autoriser la suppression de médias à partir de",
|
||||
"HeaderApiKey": "Clé API",
|
||||
"HeaderApiKeys": "Clés API",
|
||||
"HeaderApiKeysHelp": "Les applications externes ont besoin d'une clé d'API pour communiquer avec le serveur Jellyfin. Les clés sont distribuées lors d'une connexion avec un compte Jellyfin, ou bien en accordant manuellement une clé à une application.",
|
||||
"HeaderApiKeysHelp": "Les applications externes ont besoin d'une clé d'API pour communiquer avec le serveur. Les clés sont distribuées lors d'une connexion avec un compte normal ou en accordant manuellement une clé à une application.",
|
||||
"HeaderApp": "Application",
|
||||
"HeaderAppearsOn": "Apparait dans",
|
||||
"HeaderAudioBooks": "Livres audios",
|
||||
|
@ -397,7 +397,7 @@
|
|||
"HeaderPreferredMetadataLanguage": "Langue de métadonnées préférée",
|
||||
"HeaderProfile": "Profil",
|
||||
"HeaderProfileInformation": "Information de profil",
|
||||
"HeaderProfileServerSettingsHelp": "Ces valeurs contrôlent la façon dont le serveur Jellyfin se présentera aux appareils.",
|
||||
"HeaderProfileServerSettingsHelp": "Ces valeurs contrôlent la façon dont le serveur se présentera aux clients.",
|
||||
"HeaderRecentlyPlayed": "Lus récemment",
|
||||
"HeaderRecordingOptions": "Options d'enregistrement",
|
||||
"HeaderRecordingPostProcessing": "Traitement des enregistrements",
|
||||
|
@ -421,7 +421,7 @@
|
|||
"HeaderSelectServerCachePath": "Sélectionner le chemin d'accès du cache de serveur",
|
||||
"HeaderSelectServerCachePathHelp": "Parcourir ou saisir le chemin d'accès à utiliser pour les fichiers cache du serveur. Le dossier doit être accessible en écriture.",
|
||||
"HeaderSelectTranscodingPath": "Sélectionner le chemin d'accès du dossier temporaire de transcodage",
|
||||
"HeaderSelectTranscodingPathHelp": "Parcourir ou saisir le chemin d'accès à utiliser pour les fichiers de transcodage temporaires. Le dossier doit être accessible en écriture.",
|
||||
"HeaderSelectTranscodingPathHelp": "Parcourir ou saisir le chemin d'accès à utiliser pour les fichiers de transcodage. Le dossier doit être accessible en écriture.",
|
||||
"HeaderSendMessage": "Envoyer un message",
|
||||
"HeaderSeries": "Séries",
|
||||
"HeaderSeriesOptions": "Options de la série",
|
||||
|
@ -471,8 +471,8 @@
|
|||
"Home": "Accueil",
|
||||
"HttpsRequiresCert": "Pour activer les connexions sécurisées, vous devrez fournir un certificat SSL vérifié, comme ceux fournis par Let's Encrypt. Veuillez fournir un certificat ou désactiver les connexions sécurisées.",
|
||||
"Identify": "Identifier",
|
||||
"ImportFavoriteChannelsHelp": "Activez cette option pour n'importer que les chaînes ajoutées aux favoris sur le tuner.",
|
||||
"ImportMissingEpisodesHelp": "Les informations à propos des épisodes manquants seront importées dans votre base de donnée Jellyfin et affichées dans les saisons et séries. Cela peut accroître significativement la durée d'actualisation de la médiathèque.",
|
||||
"ImportFavoriteChannelsHelp": "Seules les chaînes ajoutées aux favoris sur le tuner seront importées.",
|
||||
"ImportMissingEpisodesHelp": "Les informations à propos des épisodes manquants seront importées dans votre base de données et affichées dans les saisons et séries. Cela peut accroître significativement la durée d'actualisation de la médiathèque.",
|
||||
"InstallingPackage": "Installation de {0} (version {1})",
|
||||
"InstantMix": "Mix instantané",
|
||||
"ItemCount": "{0} éléments",
|
||||
|
@ -505,14 +505,14 @@
|
|||
"LabelAppName": "Nom de l'application",
|
||||
"LabelAppNameExample": "Exemple: Sickbeard, Sonarr",
|
||||
"LabelArtists": "Artistes :",
|
||||
"LabelArtistsHelp": "Séparer les différents éléments par ;",
|
||||
"LabelArtistsHelp": "Séparer les différents éléments par un point-virgule.",
|
||||
"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": "Optionnel. Remplace l'adresse IP locale à laquelle se lie le 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 le redémarrage du serveur Jellyfin.",
|
||||
"LabelBirthDate": "Date de naissance :",
|
||||
"LabelBirthYear": "Année de naissance :",
|
||||
"LabelBlastMessageInterval": "Intervalle des messages de présence (secondes)",
|
||||
"LabelBlastMessageInterval": "Intervalle des messages de présence",
|
||||
"LabelBlastMessageIntervalHelp": "Détermine la durée en secondes entre les messages de présence.",
|
||||
"LabelBlockContentWithTags": "Bloquer les éléments avec les étiquettes :",
|
||||
"LabelBurnSubtitles": "Graver les sous-titres :",
|
||||
|
@ -569,7 +569,7 @@
|
|||
"LabelEnableAutomaticPortMapHelp": "Mapper automatiquement les ports publics vers des ports locaux via UPnP. Cela peut ne pas fonctionner avec certains modèles de routeurs. La modification de ce paramètre ne prendra effet qu'après redémarrage du serveur.",
|
||||
"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 (secondes)",
|
||||
"LabelEnableDlnaClientDiscoveryInterval": "Intervalle de découverte des clients",
|
||||
"LabelEnableDlnaClientDiscoveryIntervalHelp": "Détermine la durée en secondes entre les recherches SSDP exécutées par Jellyfin.",
|
||||
"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.",
|
||||
|
@ -579,7 +579,7 @@
|
|||
"LabelEnableDlnaServerHelp": "Autorise les appareils UPnP de votre réseau à parcourir et à lire le contenu.",
|
||||
"LabelEnableHardwareDecodingFor": "Activer le décodage matériel pour :",
|
||||
"LabelEnableRealtimeMonitor": "Activer la surveillance en temps réel",
|
||||
"LabelEnableRealtimeMonitorHelp": "Les modifications des fichiers seront traitées immédiatement, sur les systèmes de fichiers qui le permettent.",
|
||||
"LabelEnableRealtimeMonitorHelp": "Les modifications des fichiers seront traitées immédiatement sur les systèmes de fichiers qui le permettent.",
|
||||
"LabelEnableSingleImageInDidlLimit": "Limiter à une seule image intégrée",
|
||||
"LabelEnableSingleImageInDidlLimitHelp": "Quelques périphériques ne fourniront pas un rendu correct si plusieurs images sont intégrées dans Didl.",
|
||||
"LabelEndDate": "Date de fin :",
|
||||
|
@ -595,9 +595,9 @@
|
|||
"LabelForgotPasswordUsernameHelp": "Saisissez votre nom d'utilisateur, si vous vous en souvenez.",
|
||||
"LabelFormat": "Format :",
|
||||
"LabelFriendlyName": "Nom d'affichage :",
|
||||
"LabelServerNameHelp": "Ce nom sera utilisé pour identifier le serveur. La valeur par défaut est le nom d'ordinateur du serveur.",
|
||||
"LabelServerNameHelp": "Ce nom sera utilisé pour identifier le serveur. La valeur par défaut est le nom d'hôte du serveur.",
|
||||
"LabelGroupMoviesIntoCollections": "Grouper les films en collections",
|
||||
"LabelGroupMoviesIntoCollectionsHelp": "Dans l'affichage des listes de films, les films faisant partie d'une collection seront affichés comme un élément groupé.",
|
||||
"LabelGroupMoviesIntoCollectionsHelp": "Dans l'affichage des listes de films, les films d'une collection seront affichés comme un élément groupé.",
|
||||
"LabelH264Crf": "CRF d'encodage H264 :",
|
||||
"LabelEncoderPreset": "Profil d'encodage H264 :",
|
||||
"LabelHardwareAccelerationType": "Accélération matérielle :",
|
||||
|
@ -605,7 +605,7 @@
|
|||
"LabelHomeNetworkQuality": "Qualité du réseau local :",
|
||||
"LabelHomeScreenSectionValue": "Section {0} de l'accueil :",
|
||||
"LabelHttpsPort": "Numéro de port HTTPS local :",
|
||||
"LabelHttpsPortHelp": "Le port TCP que le serveur HTTPS de Jellyfin doit utiliser.",
|
||||
"LabelHttpsPortHelp": "Le numéro de port TCP pour le serveur HTTPS.",
|
||||
"LabelIconMaxHeight": "Hauteur maximum des icônes :",
|
||||
"LabelIconMaxHeightHelp": "Résolution maximum des icônes exposée par upnp:icon.",
|
||||
"LabelIconMaxWidth": "Largeur maximum des icônes :",
|
||||
|
@ -633,7 +633,7 @@
|
|||
"LabelLanguage": "Langue :",
|
||||
"LabelLineup": "Programmation :",
|
||||
"LabelLocalHttpServerPortNumber": "Numéro de port HTTP local :",
|
||||
"LabelLocalHttpServerPortNumberHelp": "Le port TCP que le serveur HTTP de Jellyfin doit utiliser.",
|
||||
"LabelLocalHttpServerPortNumberHelp": "Le numéro de port TCP pour le serveur HTTP.",
|
||||
"LabelLockItemToPreventChanges": "Verrouiller cet élément pour éviter de futures modifications",
|
||||
"LabelLoginDisclaimer": "Avertissement sur la page d'accueil :",
|
||||
"LabelLoginDisclaimerHelp": "Le slogan sera affiché en bas de la page de connexion.",
|
||||
|
@ -659,7 +659,7 @@
|
|||
"LabelMetadataReaders": "Lecteurs de métadonnées :",
|
||||
"LabelMetadataReadersHelp": "Classez vos sources locales de métadonnées préférées dans l'ordre de priorité. Le premier fichier trouvé sera lu.",
|
||||
"LabelMetadataSavers": "Enregistreurs de métadonnées :",
|
||||
"LabelMetadataSaversHelp": "Sélectionnez un format de fichier pour l'enregistrement des métadonnées.",
|
||||
"LabelMetadataSaversHelp": "Sélectionnez un format de fichier qui sera utilisé pour l'enregistrement des métadonnées.",
|
||||
"LabelMethod": "Méthode :",
|
||||
"LabelMinBackdropDownloadWidth": "Largeur minimum d'image d'arrière-plan à télécharger :",
|
||||
"LabelMinResumeDuration": "Temps de reprise minimum :",
|
||||
|
@ -675,7 +675,7 @@
|
|||
"LabelMovieCategories": "Catégories de films :",
|
||||
"LabelMoviePrefix": "Préfixe de film :",
|
||||
"LabelMoviePrefixHelp": "Si un préfixe est appliqué aux titres de film, précisez-le ici afin que le serveur puisse le gérer convenablement.",
|
||||
"LabelMovieRecordingPath": "Chemin d'enregistrement des films (optionnel) :",
|
||||
"LabelMovieRecordingPath": "Chemin d'enregistrement des films :",
|
||||
"LabelMusicStreamingTranscodingBitrate": "Débit du transcodage de la musique :",
|
||||
"LabelMusicStreamingTranscodingBitrateHelp": "Spécifiez le débit maximum pendant la diffusion de musique.",
|
||||
"LabelName": "Nom :",
|
||||
|
@ -688,7 +688,7 @@
|
|||
"LabelNumber": "Numéro :",
|
||||
"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": "(Optionnel) Dossier réseau partagé :",
|
||||
"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}.",
|
||||
"LabelOriginalAspectRatio": "Ratio d'aspect original :",
|
||||
"LabelOriginalTitle": "Titre original :",
|
||||
|
@ -733,7 +733,7 @@
|
|||
"LabelReleaseDate": "Date de sortie :",
|
||||
"LabelRemoteClientBitrateLimit": "Limite de débit de streaming Internet (Mbps) :",
|
||||
"LabelRemoteClientBitrateLimitHelp": "Une limite de débit optionnelle par streaming pour les connexions hors du réseau local. Utile pour éviter que les appareils ne demandent un débit supérieur à ce que votre connexion internet peu fournir. Cela peut augmenter la charge du processeur de votre serveur pour transcoder les vidéos à la volée à un débit plus faible.",
|
||||
"LabelRuntimeMinutes": "Durée (minutes) :",
|
||||
"LabelRuntimeMinutes": "Durée :",
|
||||
"LabelSaveLocalMetadata": "Enregistrer les illustrations dans les dossiers des médias",
|
||||
"LabelSaveLocalMetadataHelp": "L'enregistrement des illustrations dans les dossiers des médias les placera à un endroit où elles seront facilement modifiables.",
|
||||
"LabelScheduledTaskLastRan": "Dernière exécution {0}, durée {1}.",
|
||||
|
@ -745,7 +745,7 @@
|
|||
"LabelSelectVersionToInstall": "Sélectionner la version à installer :",
|
||||
"LabelSendNotificationToUsers": "Envoyer la notification à :",
|
||||
"LabelSerialNumber": "Numéro de série",
|
||||
"LabelSeriesRecordingPath": "Chemin d'enregistrement des séries (optionnel) :",
|
||||
"LabelSeriesRecordingPath": "Chemin d'enregistrement des séries :",
|
||||
"LabelServerHost": "Nom d'hôte :",
|
||||
"LabelServerHostHelp": "192.168.1.1:8096 ou https://monserveur.com",
|
||||
"LabelSimultaneousConnectionLimit": "Limite de flux simultanée :",
|
||||
|
@ -819,7 +819,7 @@
|
|||
"LabelYoureDone": "Vous avez terminé !",
|
||||
"LabelZipCode": "Code postal :",
|
||||
"LabelffmpegPath": "Chemin vers FFmpeg :",
|
||||
"LabelffmpegPathHelp": "Le chemin d'accès vers l'application FFmpeg, ou un dossier contenant FFmpeg.",
|
||||
"LabelffmpegPathHelp": "Le chemin d'accès vers l'application FFmpeg ou un dossier contenant FFmpeg.",
|
||||
"LanNetworksHelp": "Liste des adresses IP ou des entrées IP/masque de réseau séparées par des virgules pour les réseaux qui seront considérés comme locaux lors de l'application des restrictions de bande passante. Si elle est définie, toutes les autres adresses IP seront considérées sur le réseau externe et seront soumises aux restrictions de bande passante externe. Si elle est vide, seul le sous-réseau du serveur est considéré comme se trouvant sur le réseau local.",
|
||||
"Large": "Grand",
|
||||
"LatestFromLibrary": "{0}, ajouts récents",
|
||||
|
@ -932,8 +932,8 @@
|
|||
"NextUp": "A Suivre",
|
||||
"No": "Non",
|
||||
"NoNewDevicesFound": "Aucun nouvel appareil détecté. Pour en ajouter un, fermez cette fenêtre et saisissez les informations de l'appareil manuellement.",
|
||||
"NoNextUpItemsMessage": "Aucun élément trouvé. Commencez à regarder vos émissions !",
|
||||
"NoPluginConfigurationMessage": "Cette extension n'a aucun paramètre à configurer.",
|
||||
"MessageNoNextUpItems": "Aucun élément trouvé. Commencez à regarder vos émissions !",
|
||||
"MessageNoPluginConfiguration": "Cette extension n'a aucun paramètre à configurer.",
|
||||
"NoSubtitleSearchResultsFound": "Aucun résultat trouvé.",
|
||||
"NoSubtitles": "Pas de sous-titres",
|
||||
"NoSubtitlesHelp": "Les sous-titres ne seront pas chargés par défaut. Ils peuvent toujours être activés manuellement pendant la lecture.",
|
||||
|
@ -954,7 +954,7 @@
|
|||
"OptionAllowLinkSharingHelp": "Seules les pages Web contenant des informations de médias sont partagés. Les fichiers multimédias ne sont jamais partagés publiquement. Les partages sont limités dans le temps et expirent après {0} jours.",
|
||||
"OptionAllowManageLiveTv": "Autoriser la gestion des enregistrements de TV en direct",
|
||||
"OptionAllowMediaPlayback": "Autoriser la lecture de média",
|
||||
"OptionAllowMediaPlaybackTranscodingHelp": "Limiter l'accès au transcodage peut entraîner des échecs de lecture dans les applications Jellyfin en raison de formats de média non pris en charge.",
|
||||
"OptionAllowMediaPlaybackTranscodingHelp": "Limiter l'accès au transcodage peut entraîner des échecs de lecture dans les clients en raison de formats de média non pris en charge.",
|
||||
"OptionAllowRemoteControlOthers": "Autoriser le contrôle à distance des autres utilisateurs",
|
||||
"OptionAllowRemoteSharedDevices": "Autoriser le contrôle à distance des appareils partagés",
|
||||
"OptionAllowRemoteSharedDevicesHelp": "Les appareils DLNA sont considérés comme partagés tant qu'un utilisateur ne commence pas à les contrôler.",
|
||||
|
@ -986,7 +986,7 @@
|
|||
"OptionDatePlayed": "Date de lecture",
|
||||
"OptionDescending": "Décroissant",
|
||||
"OptionDisableUser": "Désactiver cet utilisateur",
|
||||
"OptionDisableUserHelp": "Si désactivé, le serveur n'autorisera pas de connexion de cet utilisateur. Les connexions existantes seront interrompues.",
|
||||
"OptionDisableUserHelp": "Le serveur n'autorisera pas de connexion de cet utilisateur. Les connexions existantes seront interrompues.",
|
||||
"OptionDislikes": "Pas aimés",
|
||||
"OptionDisplayFolderView": "Afficher une vue de dossiers pour montrer les dossiers multimédia en intégralité",
|
||||
"OptionDisplayFolderViewHelp": "Afficher les dossier au côté de votre médiathèque. Cela peut être utile si vous souhaitez avoir une vue complète des dossiers.",
|
||||
|
@ -995,7 +995,7 @@
|
|||
"OptionDownloadBoxImage": "Boîtier",
|
||||
"OptionDownloadDiscImage": "Disque",
|
||||
"OptionDownloadImagesInAdvance": "Télécharger les images en avance",
|
||||
"OptionDownloadImagesInAdvanceHelp": "Par défaut, la plupart des images sont téléchargées seulement lorsqu'une application Jellyfin le demande. Sélectionnez cette option pour télécharger toutes les images à l'avance, lorsqu'un nouveau média est importé. Cela peut allonger significativement la durée d'actualisation de la médiathèque.",
|
||||
"OptionDownloadImagesInAdvanceHelp": "Par défaut, la plupart des images sont téléchargées seulement lorsqu'un client le demande. Sélectionnez cette option pour télécharger toutes les images à l'avance, lorsqu'un nouveau média est importé. Cela peut allonger significativement la durée d'actualisation de la médiathèque.",
|
||||
"OptionDownloadPrimaryImage": "Principal",
|
||||
"OptionDownloadThumbImage": "Vignette",
|
||||
"OptionDvd": "DVD",
|
||||
|
@ -1026,7 +1026,7 @@
|
|||
"OptionHlsSegmentedSubtitles": "Sous-titres segmentés HLS",
|
||||
"OptionHomeVideos": "Photos",
|
||||
"OptionIgnoreTranscodeByteRangeRequests": "Ignore les requêtes de transcodage de plage d'octets",
|
||||
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Si l'option est activée, ces requêtes seront honorées mais l'en-tête de plage d'octets sera ignoré.",
|
||||
"OptionIgnoreTranscodeByteRangeRequestsHelp": "Ces requêtes seront honorées mais l'en-tête de plage d'octets sera ignoré.",
|
||||
"OptionImdbRating": "Note IMDb",
|
||||
"OptionLikes": "Aimés",
|
||||
"OptionMax": "Maximum",
|
||||
|
@ -1041,7 +1041,7 @@
|
|||
"OptionPlainStorageFolders": "Afficher tous les dossiers en tant que simples dossiers de stockage",
|
||||
"OptionPlainStorageFoldersHelp": "Tous les répertoires seront affichés dans le DIDL en tant que \"object.container.storageFolder\" au lieu de formats plus spécifiques comme, par exemple \"object.container.person.musicArtist\".",
|
||||
"OptionPlainVideoItems": "Afficher les vidéos en tant que simples éléments vidéos",
|
||||
"OptionPlainVideoItemsHelp": "Si activé, toutes les vidéos seront affichées dans le DIDL en tant que \"object.item.videoItem\" au lieu de formats plus spécifiques comme, par exemple \"object.item.videoItem.movie\".",
|
||||
"OptionPlainVideoItemsHelp": "Toutes les vidéos seront affichées dans le DIDL en tant que \"object.item.videoItem\" au lieu de formats plus spécifiques comme, par exemple \"object.item.videoItem.movie\".",
|
||||
"OptionPlayCount": "Nombre de lectures",
|
||||
"OptionPlayed": "Lu",
|
||||
"OptionPremiereDate": "Date de la première",
|
||||
|
@ -1082,7 +1082,7 @@
|
|||
"PasswordMatchError": "Le mot de passe et sa confirmation doivent correspondre.",
|
||||
"PasswordResetComplete": "Le mot de passe a été réinitialisé.",
|
||||
"PasswordResetConfirmation": "Êtes-vous sûr de vouloir réinitialiser le mot de passe ?",
|
||||
"PasswordResetHeader": "Réinitialiser le mot de passe",
|
||||
"HeaderResetPassword": "Réinitialiser le mot de passe",
|
||||
"PasswordSaved": "Mot de passe sauvegardé.",
|
||||
"People": "Personnes",
|
||||
"PerfectMatch": "Correspondance parfaite",
|
||||
|
@ -1103,7 +1103,7 @@
|
|||
"PleaseEnterNameOrId": "Veuillez saisir un nom ou un identifiant externe.",
|
||||
"PleaseRestartServerName": "Veuillez redémarrer le serveur Jellyfin - {0}.",
|
||||
"PleaseSelectTwoItems": "Veuillez sélectionner au moins deux éléments.",
|
||||
"PluginInstalledMessage": "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 Jellyfin 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",
|
||||
|
@ -1124,11 +1124,11 @@
|
|||
"Record": "Enregistrer",
|
||||
"RecordSeries": "Enregistrer la série",
|
||||
"RecordingCancelled": "Enregistrement annulé.",
|
||||
"RecordingPathChangeMessage": "Modifier votre dossier d'enregistrement ne déplacera pas les enregistrements existants de l'ancien emplacement vers le nouveau. Vous devrez les déplacer manuellement si vous le souhaitez.",
|
||||
"MessageChangeRecordingPath": "Modifier votre dossier d'enregistrement ne déplacera pas les enregistrements existants de l'ancien emplacement vers le nouveau. Vous devrez les déplacer manuellement si vous le souhaitez.",
|
||||
"RecordingScheduled": "Enregistrement planifié.",
|
||||
"Recordings": "Enregistrements",
|
||||
"Refresh": "Actualiser",
|
||||
"RefreshDialogHelp": "Les métadonnées sont actualisées en fonction des paramètres et des services Internet qui sont activés dans le tableau de bord du serveur Jellyfin.",
|
||||
"RefreshDialogHelp": "Les métadonnées sont actualisées en fonction des paramètres et des services Internet qui sont activés dans le tableau de bord.",
|
||||
"RefreshMetadata": "Actualiser les métadonnées",
|
||||
"RefreshQueued": "Actualisation mise en file d'attente.",
|
||||
"ReleaseDate": "Date de sortie",
|
||||
|
@ -1265,7 +1265,7 @@
|
|||
"TvLibraryHelp": "Consultez le {0}guide de nommage des émissions{1}.",
|
||||
"Uniform": "Uniforme",
|
||||
"UninstallPluginConfirmation": "Êtes-vous sûr de vouloir désinstaller {0} ?",
|
||||
"UninstallPluginHeader": "Désinstaller Plug-in",
|
||||
"HeaderUninstallPlugin": "Désinstaller Plug-in",
|
||||
"Unmute": "Rétablir le son",
|
||||
"Unplayed": "Non lu",
|
||||
"Unrated": "Non noté",
|
||||
|
@ -1386,7 +1386,7 @@
|
|||
"MediaInfoStreamTypeSubtitle": "Sous-titres",
|
||||
"MediaInfoStreamTypeVideo": "Video",
|
||||
"AuthProviderHelp": "Sélectionner un fournisseur d'authentification pour authentifier le mot de passe de cet utilisateur.",
|
||||
"PasswordResetProviderHelp": "Choisissez un Fournisseur de réinitialisation de mot de passe à utiliser lorsqu'un utilisateur demande la réinitialisation de son mot de passe",
|
||||
"PasswordResetProviderHelp": "Choisissez un fournisseur de réinitialisation de mot de passe à utiliser lorsqu'un utilisateur demande la réinitialisation de son mot de passe.",
|
||||
"HeaderHome": "Accueil",
|
||||
"LabelUserLoginAttemptsBeforeLockout": "Tentatives de connexion échouées avant que l'utilisateur ne soit verrouillé :",
|
||||
"DashboardOperatingSystem": "Système d'Exploitation: {0}",
|
||||
|
@ -1497,7 +1497,7 @@
|
|||
"HeaderFavoritePlaylists": "Listes de lecture favorites",
|
||||
"TabDVR": "DVR",
|
||||
"LabelChromecastVersion": "Version de Chromecast",
|
||||
"LabelEnableHttpsHelp": "Autorise le serveur à écouter les requêtes HTTPS sur le port configuré. Un certificat valide doit être configuré pour permettre ce mode de fonctionnement.",
|
||||
"LabelEnableHttpsHelp": "Écouter les requêtes HTTPS sur le port configuré. Un certificat valide doit être fourni pour permettre ce mode de fonctionnement.",
|
||||
"LabelEnableHttps": "Activer HTTPS",
|
||||
"HeaderServerAddressSettings": "Paramètres adresses serveur",
|
||||
"HeaderRemoteAccessSettings": "Paramètres d'accès distant",
|
||||
|
@ -1543,8 +1543,8 @@
|
|||
"MessageSyncPlayErrorAccessingGroups": "Une erreur s'est produite pendant l'accès à la liste de groupes.",
|
||||
"ShowMore": "Voir plus",
|
||||
"ShowLess": "Voir moins",
|
||||
"EnableBlurhashHelp": "Les images qui sont encore en cours de chargement seront remplacées par une image générique floue",
|
||||
"EnableBlurhash": "Utilise des images génériques floues à la place des images",
|
||||
"EnableBlurHashHelp": "Les images qui sont encore en cours de chargement seront remplacées par une image générique floue.",
|
||||
"EnableBlurHash": "Utilise des images génériques floues à la place des images",
|
||||
"ButtonCast": "Diffuser",
|
||||
"ButtonSyncPlay": "SyncPlay",
|
||||
"TabRepositories": "Dépôts",
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue