mirror of
https://github.com/jellyfin/jellyfin-web.git
synced 2024-11-17 19:08:18 -07:00
merge branch master into standalone
This commit is contained in:
commit
e60f01b3a3
15
package.json
15
package.json
@ -21,12 +21,12 @@
|
||||
"css-loader": "^5.0.0",
|
||||
"cssnano": "^4.1.10",
|
||||
"del": "^6.0.0",
|
||||
"eslint": "^7.12.0",
|
||||
"eslint": "^7.12.1",
|
||||
"eslint-plugin-compat": "^3.5.1",
|
||||
"eslint-plugin-eslint-comments": "^3.2.0",
|
||||
"eslint-plugin-import": "^2.22.1",
|
||||
"eslint-plugin-promise": "^4.2.1",
|
||||
"file-loader": "^6.1.1",
|
||||
"file-loader": "^6.2.0",
|
||||
"gulp": "^4.0.2",
|
||||
"gulp-babel": "^8.0.0",
|
||||
"gulp-cli": "^2.3.0",
|
||||
@ -39,10 +39,10 @@
|
||||
"gulp-postcss": "^8.0.0",
|
||||
"gulp-sass": "^4.0.2",
|
||||
"gulp-sourcemaps": "^2.6.5",
|
||||
"gulp-terser": "^1.4.0",
|
||||
"gulp-terser": "^1.4.1",
|
||||
"html-webpack-plugin": "^4.5.0",
|
||||
"lazypipe": "^1.0.2",
|
||||
"node-sass": "^4.13.1",
|
||||
"node-sass": "^5.0.0",
|
||||
"postcss-loader": "^3.0.0",
|
||||
"postcss-preset-env": "^6.7.0",
|
||||
"style-loader": "^2.0.0",
|
||||
@ -50,7 +50,7 @@
|
||||
"stylelint-config-rational-order": "^0.1.2",
|
||||
"stylelint-no-browser-hacks": "^1.2.1",
|
||||
"stylelint-order": "^4.1.0",
|
||||
"webpack": "^5.2.0",
|
||||
"webpack": "^5.3.2",
|
||||
"webpack-merge": "^4.2.2",
|
||||
"webpack-stream": "^6.1.0",
|
||||
"worker-plugin": "^5.0.0"
|
||||
@ -62,6 +62,7 @@
|
||||
"core-js": "^3.6.5",
|
||||
"date-fns": "^2.16.1",
|
||||
"epubjs": "^0.3.85",
|
||||
"pdfjs-dist": "2.5.207",
|
||||
"fast-text-encoding": "^1.0.3",
|
||||
"flv.js": "^1.5.0",
|
||||
"headroom.js": "^0.12.0",
|
||||
@ -69,7 +70,6 @@
|
||||
"howler": "^2.2.1",
|
||||
"intersection-observer": "^0.11.0",
|
||||
"jellyfin-apiclient": "^1.4.2",
|
||||
"jellyfin-noto": "https://github.com/jellyfin/jellyfin-noto",
|
||||
"jquery": "^3.5.1",
|
||||
"jstree": "^3.3.10",
|
||||
"libarchive.js": "^1.3.0",
|
||||
@ -81,7 +81,7 @@
|
||||
"resize-observer-polyfill": "^1.5.1",
|
||||
"screenfull": "^5.0.2",
|
||||
"sortablejs": "^1.12.0",
|
||||
"swiper": "^6.3.4",
|
||||
"swiper": "^6.3.5",
|
||||
"webcomponents.js": "^0.7.24",
|
||||
"whatwg-fetch": "^3.4.1"
|
||||
},
|
||||
@ -326,6 +326,7 @@
|
||||
"src/libraries/scroller.js",
|
||||
"src/plugins/backdropScreensaver/plugin.js",
|
||||
"src/plugins/bookPlayer/plugin.js",
|
||||
"src/plugins/pdfPlayer/plugin.js",
|
||||
"src/plugins/bookPlayer/tableOfContents.js",
|
||||
"src/plugins/chromecastPlayer/chromecastHelper.js",
|
||||
"src/plugins/photoPlayer/plugin.js",
|
||||
|
@ -1,29 +1,26 @@
|
||||
html {
|
||||
@mixin font($weight: null, $size: null) {
|
||||
font-family: "Noto Sans", sans-serif;
|
||||
font-weight: $weight;
|
||||
font-size: $size;
|
||||
}
|
||||
|
||||
html {
|
||||
@include font;
|
||||
text-size-adjust: 100%;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
text-rendering: optimizeLegibility;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3 {
|
||||
font-family: "Noto Sans", sans-serif;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-weight: 400;
|
||||
font-size: 1.8em;
|
||||
@include font(400, 1.8em);
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-weight: 400;
|
||||
font-size: 1.5em;
|
||||
@include font(400, 1.5em);
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-weight: 400;
|
||||
font-size: 1.17em;
|
||||
@include font(400, 1.17em);
|
||||
}
|
||||
|
||||
.layout-tv {
|
@ -1,31 +0,0 @@
|
||||
h1 {
|
||||
font-weight: 400;
|
||||
font-size: 1.8em;
|
||||
}
|
||||
|
||||
.layout-desktop h1 {
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-weight: 400;
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-weight: 400;
|
||||
font-size: 1.17em;
|
||||
}
|
||||
|
||||
@media all and (min-height: 720px) {
|
||||
html {
|
||||
font-size: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
/* This is supposed to be 1080p, but had to reduce the min height to account for possible browser chrome */
|
||||
@media all and (min-height: 1000px) {
|
||||
html {
|
||||
font-size: 27px;
|
||||
}
|
||||
}
|
31
src/assets/css/fonts.sized.scss
Normal file
31
src/assets/css/fonts.sized.scss
Normal file
@ -0,0 +1,31 @@
|
||||
@mixin header-font($size: null) {
|
||||
font-weight: 400;
|
||||
font-size: $size;
|
||||
}
|
||||
|
||||
html {
|
||||
@media all and (min-height: 720px) {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
/* This is supposed to be 1080p, but had to reduce the min height to account for possible browser chrome */
|
||||
@media all and (min-height: 1000px) {
|
||||
font-size: 27px;
|
||||
}
|
||||
}
|
||||
|
||||
h1 {
|
||||
@include header-font(1.8em);
|
||||
|
||||
.layout-desktop & {
|
||||
font-size: 2em;
|
||||
}
|
||||
}
|
||||
|
||||
h2 {
|
||||
@include header-font(1.8em);
|
||||
}
|
||||
|
||||
h3 {
|
||||
@include header-font(1.17em);
|
||||
}
|
@ -2,8 +2,8 @@
|
||||
padding-bottom: 15em;
|
||||
}
|
||||
|
||||
@media all and (min-width: 62.5em) {
|
||||
#guideTab {
|
||||
#guideTab {
|
||||
@media all and (min-width: 62.5em) {
|
||||
padding-left: 0.5em;
|
||||
}
|
||||
}
|
@ -1,14 +1,19 @@
|
||||
body,
|
||||
html {
|
||||
@mixin fullpage {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.layout-mobile,
|
||||
.layout-tv {
|
||||
-webkit-touch-callout: none;
|
||||
user-select: none;
|
||||
html {
|
||||
@include fullpage;
|
||||
line-height: 1.35;
|
||||
}
|
||||
|
||||
body {
|
||||
@include fullpage;
|
||||
overflow-x: hidden;
|
||||
background-color: transparent !important;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
.clipForScreenReader {
|
||||
@ -36,14 +41,10 @@ html {
|
||||
contain: strict;
|
||||
}
|
||||
|
||||
html {
|
||||
line-height: 1.35;
|
||||
}
|
||||
|
||||
body {
|
||||
overflow-x: hidden;
|
||||
background-color: transparent !important;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
.layout-mobile,
|
||||
.layout-tv {
|
||||
-webkit-touch-callout: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.mainAnimatedPage {
|
||||
@ -58,7 +59,7 @@ body {
|
||||
overflow-y: hidden !important;
|
||||
}
|
||||
|
||||
div[data-role=page] {
|
||||
div[data-role="page"] {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
@ -71,10 +72,10 @@ div[data-role=page] {
|
||||
padding-left: 0.15em;
|
||||
font-weight: 400;
|
||||
white-space: normal !important;
|
||||
}
|
||||
|
||||
.fieldDescription + .fieldDescription {
|
||||
margin-top: 0.3em;
|
||||
+ .fieldDescription {
|
||||
margin-top: 0.3em;
|
||||
}
|
||||
}
|
||||
|
||||
.content-primary,
|
||||
@ -85,9 +86,14 @@ div[data-role=page] {
|
||||
padding-bottom: 5em !important;
|
||||
}
|
||||
|
||||
@media all and (min-width: 50em) {
|
||||
.readOnlyContent,
|
||||
form {
|
||||
.readOnlyContent {
|
||||
@media all and (min-width: 50em) {
|
||||
max-width: 54em;
|
||||
}
|
||||
}
|
||||
|
||||
form {
|
||||
@media all and (min-width: 50em) {
|
||||
max-width: 54em;
|
||||
}
|
||||
}
|
||||
@ -107,14 +113,14 @@ div[data-role=page] {
|
||||
.headroom {
|
||||
will-change: transform;
|
||||
transition: transform 200ms linear;
|
||||
}
|
||||
|
||||
.headroom--pinned {
|
||||
transform: translateY(0%);
|
||||
}
|
||||
&--pinned {
|
||||
transform: translateY(0%);
|
||||
}
|
||||
|
||||
.headroom--unpinned {
|
||||
transform: translateY(-100%);
|
||||
&--unpinned {
|
||||
transform: translateY(-100%);
|
||||
}
|
||||
}
|
||||
|
||||
.drawerContent {
|
@ -90,17 +90,16 @@ _define('material-icons', function() {
|
||||
return materialIcons;
|
||||
});
|
||||
|
||||
// noto font
|
||||
const noto = require('jellyfin-noto');
|
||||
_define('jellyfin-noto', function () {
|
||||
return noto;
|
||||
});
|
||||
|
||||
const epubjs = require('epubjs');
|
||||
_define('epubjs', function () {
|
||||
return epubjs;
|
||||
});
|
||||
|
||||
const pdfjs = require('pdfjs-dist/build/pdf');
|
||||
_define('pdfjs', function () {
|
||||
return pdfjs;
|
||||
});
|
||||
|
||||
// page.js
|
||||
const page = require('page');
|
||||
_define('page', function() {
|
||||
|
@ -172,7 +172,6 @@ function supportsCue() {
|
||||
function onAppVisible() {
|
||||
if (isHidden) {
|
||||
isHidden = false;
|
||||
console.debug('triggering app resume event');
|
||||
events.trigger(appHost, 'resume');
|
||||
}
|
||||
}
|
||||
@ -180,7 +179,6 @@ function onAppVisible() {
|
||||
function onAppHidden() {
|
||||
if (!isHidden) {
|
||||
isHidden = true;
|
||||
console.debug('app is hidden');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
import appHost from 'apphost';
|
||||
import dialogHelper from 'dialogHelper';
|
||||
import layoutManager from 'layoutManager';
|
||||
import globalize from 'globalize';
|
||||
@ -388,6 +389,11 @@ function showEditorInternal(itemId, serverId, template) {
|
||||
btnSubmit.classList.add('hide');
|
||||
}
|
||||
|
||||
// Don't allow redirection to other websites from the TV layout
|
||||
if (layoutManager.tv || !appHost.supports('externallinks')) {
|
||||
dlg.querySelector('.btnHelp').remove();
|
||||
}
|
||||
|
||||
const editorContent = dlg.querySelector('.formDialogContent');
|
||||
|
||||
dlg.querySelector('.subtitleList').addEventListener('click', onSubtitleListClick);
|
||||
|
@ -23,6 +23,12 @@
|
||||
}
|
||||
],
|
||||
"servers": [],
|
||||
"fonts": [
|
||||
"https://repo.jellyfin.org/releases/other/jellyfin-noto/font-faces.css",
|
||||
"https://repo.jellyfin.org/releases/other/jellyfin-noto/css/KR.css",
|
||||
"https://repo.jellyfin.org/releases/other/jellyfin-noto/css/JP.css",
|
||||
"https://repo.jellyfin.org/releases/other/jellyfin-noto/css/SC.css"
|
||||
],
|
||||
"plugins": [
|
||||
"plugins/playAccessValidation/plugin",
|
||||
"plugins/experimentalWarnings/plugin",
|
||||
@ -33,6 +39,7 @@
|
||||
"plugins/bookPlayer/plugin",
|
||||
"plugins/youtubePlayer/plugin",
|
||||
"plugins/backdropScreensaver/plugin",
|
||||
"plugins/pdfPlayer/plugin",
|
||||
"plugins/logoScreensaver/plugin",
|
||||
"plugins/sessionPlayer/plugin",
|
||||
"plugins/chromecastPlayer/plugin"
|
||||
|
@ -5,6 +5,7 @@
|
||||
<div class="sectionTitleContainer sectionTitleContainer-cards flex align-items-center">
|
||||
<h2 class="sectionTitle sectionTitle-cards">${HeaderDevices}</h2>
|
||||
<a is="emby-linkbutton" rel="noopener noreferrer" class="raised button-alt headerHelpButton" target="_blank" href="https://docs.jellyfin.org/general/server/devices.html">${Help}</a>
|
||||
<button id="deviceDeleteAll" is="emby-button" type="button" class="raised button-alt">${DeleteAll}</button>
|
||||
</div>
|
||||
</div>
|
||||
<div is="emby-itemscontainer" class="devicesList vertical-wrap" data-multiselect="false"></div>
|
||||
|
@ -10,10 +10,32 @@ import 'cardStyle';
|
||||
|
||||
/* eslint-disable indent */
|
||||
|
||||
// Local cache of loaded
|
||||
let deviceIds = [];
|
||||
|
||||
function canDelete(deviceId) {
|
||||
return deviceId !== ApiClient.deviceId();
|
||||
}
|
||||
|
||||
function deleteAllDevices(page) {
|
||||
const msg = globalize.translate('DeleteDevicesConfirmation');
|
||||
|
||||
require(['confirm'], async function (confirm) {
|
||||
await confirm({
|
||||
text: msg,
|
||||
title: globalize.translate('HeaderDeleteDevices'),
|
||||
confirmText: globalize.translate('ButtonDelete'),
|
||||
primary: 'delete'
|
||||
});
|
||||
|
||||
loading.show();
|
||||
await Promise.all(
|
||||
deviceIds.filter(canDelete).map((id) => ApiClient.deleteDevice(id))
|
||||
);
|
||||
loadData(page);
|
||||
});
|
||||
}
|
||||
|
||||
function deleteDevice(page, id) {
|
||||
const msg = globalize.translate('DeleteDeviceConfirmation');
|
||||
|
||||
@ -23,16 +45,10 @@ import 'cardStyle';
|
||||
title: globalize.translate('HeaderDeleteDevice'),
|
||||
confirmText: globalize.translate('Delete'),
|
||||
primary: 'delete'
|
||||
}).then(function () {
|
||||
}).then(async () => {
|
||||
loading.show();
|
||||
ApiClient.ajax({
|
||||
type: 'DELETE',
|
||||
url: ApiClient.getUrl('Devices', {
|
||||
Id: id
|
||||
})
|
||||
}).then(function () {
|
||||
loadData(page);
|
||||
});
|
||||
await ApiClient.deleteDevice(id);
|
||||
loadData(page);
|
||||
});
|
||||
});
|
||||
}
|
||||
@ -129,6 +145,7 @@ import 'cardStyle';
|
||||
loading.show();
|
||||
ApiClient.getJSON(ApiClient.getUrl('Devices')).then(function (result) {
|
||||
load(page, result.Items);
|
||||
deviceIds = result.Items.map((device) => device.Id);
|
||||
loading.hide();
|
||||
});
|
||||
}
|
||||
@ -145,6 +162,9 @@ import 'cardStyle';
|
||||
view.addEventListener('viewshow', function () {
|
||||
loadData(this);
|
||||
});
|
||||
}
|
||||
|
||||
view.querySelector('#deviceDeleteAll').addEventListener('click', function() {
|
||||
deleteAllDevices(view);
|
||||
});
|
||||
}
|
||||
/* eslint-enable indent */
|
||||
|
@ -649,7 +649,10 @@ function reloadFromItem(instance, page, params, item, user) {
|
||||
const itemBirthLocation = page.querySelector('#itemBirthLocation');
|
||||
|
||||
if (item.Type == 'Person' && item.ProductionLocations && item.ProductionLocations.length) {
|
||||
const gmap = '<a is="emby-linkbutton" class="button-link textlink" target="_blank" href="https://maps.google.com/maps?q=' + item.ProductionLocations[0] + '">' + item.ProductionLocations[0] + '</a>';
|
||||
let gmap = item.ProductionLocations[0];
|
||||
if (!layoutManager.tv && appHost.supports('externallinks')) {
|
||||
gmap = `<a is="emby-linkbutton" class="button-link textlink" target="_blank" href="https://maps.google.com/maps?q=${gmap}">${gmap}</a>`;
|
||||
}
|
||||
itemBirthLocation.classList.remove('hide');
|
||||
itemBirthLocation.innerHTML = globalize.translate('BirthPlaceValue', gmap);
|
||||
} else {
|
||||
@ -1066,7 +1069,7 @@ function renderDetails(page, item, apiClient, context, isStatic) {
|
||||
reloadUserDataButtons(page, item);
|
||||
|
||||
// Don't allow redirection to other websites from the TV layout
|
||||
if (!layoutManager.tv) {
|
||||
if (!layoutManager.tv && appHost.supports('externallinks')) {
|
||||
renderLinks(page, item);
|
||||
}
|
||||
|
||||
@ -1724,7 +1727,7 @@ function renderCollectionItemType(page, parentItem, type, items) {
|
||||
html += '</div>';
|
||||
const collectionItems = page.querySelector('.collectionItems');
|
||||
collectionItems.insertAdjacentHTML('beforeend', html);
|
||||
imageLoader.lazyChildren(collectionItems);
|
||||
imageLoader.lazyChildren(collectionItems.lastChild);
|
||||
}
|
||||
|
||||
function renderMusicVideos(page, item, user) {
|
||||
|
@ -248,7 +248,7 @@ import 'emby-itemscontainer';
|
||||
tabContent.querySelector('.btnNewCollection').addEventListener('click', () => {
|
||||
import('collectionEditor').then(({default: collectionEditor}) => {
|
||||
const serverId = ApiClient.serverInfo().Id;
|
||||
new collectionEditor.showEditor({
|
||||
new collectionEditor({
|
||||
items: [],
|
||||
serverId: serverId
|
||||
});
|
||||
|
@ -17,7 +17,7 @@ import 'emby-button';
|
||||
if (!pageData) {
|
||||
pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: 'SortName',
|
||||
SortBy: 'Random',
|
||||
SortOrder: 'Ascending',
|
||||
IncludeItemTypes: 'Movie',
|
||||
Recursive: true,
|
||||
|
@ -17,7 +17,7 @@ import 'emby-button';
|
||||
if (!pageData) {
|
||||
pageData = data[key] = {
|
||||
query: {
|
||||
SortBy: 'SortName',
|
||||
SortBy: 'Random',
|
||||
SortOrder: 'Ascending',
|
||||
IncludeItemTypes: 'Series',
|
||||
Recursive: true,
|
||||
|
@ -25,8 +25,9 @@ export class BookPlayer {
|
||||
}
|
||||
|
||||
play(options) {
|
||||
this._progress = 0;
|
||||
this._loaded = false;
|
||||
this.progress = 0;
|
||||
this.cancellationToken = false;
|
||||
this.loaded = false;
|
||||
|
||||
loading.show();
|
||||
const elem = this.createMediaElement();
|
||||
@ -36,35 +37,35 @@ export class BookPlayer {
|
||||
stop() {
|
||||
this.unbindEvents();
|
||||
|
||||
const elem = this._mediaElement;
|
||||
const tocElement = this._tocElement;
|
||||
const rendition = this._rendition;
|
||||
const elem = this.mediaElement;
|
||||
const tocElement = this.tocElement;
|
||||
const rendition = this.rendition;
|
||||
|
||||
if (elem) {
|
||||
dialogHelper.close(elem);
|
||||
this._mediaElement = null;
|
||||
this.mediaElement = null;
|
||||
}
|
||||
|
||||
if (tocElement) {
|
||||
tocElement.destroy();
|
||||
this._tocElement = null;
|
||||
this.tocElement = null;
|
||||
}
|
||||
|
||||
if (rendition) {
|
||||
rendition.destroy();
|
||||
}
|
||||
|
||||
// Hide loader in case player was not fully loaded yet
|
||||
// hide loader in case player was not fully loaded yet
|
||||
loading.hide();
|
||||
this._cancellationToken.shouldCancel = true;
|
||||
this.cancellationToken = true;
|
||||
}
|
||||
|
||||
currentItem() {
|
||||
return this._currentItem;
|
||||
return this.item;
|
||||
}
|
||||
|
||||
currentTime() {
|
||||
return this._progress * 1000;
|
||||
return this.progress * 1000;
|
||||
}
|
||||
|
||||
duration() {
|
||||
@ -96,12 +97,10 @@ export class BookPlayer {
|
||||
|
||||
onWindowKeyUp(e) {
|
||||
const key = keyboardnavigation.getKeyName(e);
|
||||
|
||||
// TODO: depending on the event this can be the document or the rendition itself
|
||||
const rendition = this._rendition || this;
|
||||
const rendition = this.rendition;
|
||||
const book = rendition.book;
|
||||
|
||||
if (this._loaded === false) return;
|
||||
if (!this.loaded) return;
|
||||
switch (key) {
|
||||
case 'l':
|
||||
case 'ArrowRight':
|
||||
@ -114,9 +113,9 @@ export class BookPlayer {
|
||||
book.package.metadata.direction === 'rtl' ? rendition.next() : rendition.prev();
|
||||
break;
|
||||
case 'Escape':
|
||||
if (this._tocElement) {
|
||||
if (this.tocElement) {
|
||||
// Close table of contents on ESC if it is open
|
||||
this._tocElement.destroy();
|
||||
this.tocElement.destroy();
|
||||
} else {
|
||||
// Otherwise stop the entire book player
|
||||
this.stop();
|
||||
@ -130,7 +129,7 @@ export class BookPlayer {
|
||||
}
|
||||
|
||||
bindMediaElementEvents() {
|
||||
const elem = this._mediaElement;
|
||||
const elem = this.mediaElement;
|
||||
|
||||
elem.addEventListener('close', this.onDialogClosed, {once: true});
|
||||
elem.querySelector('#btnBookplayerExit').addEventListener('click', this.onDialogClosed, {once: true});
|
||||
@ -147,11 +146,11 @@ export class BookPlayer {
|
||||
document.addEventListener('keyup', this.onWindowKeyUp);
|
||||
|
||||
// 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('keyup', this.onWindowKeyUp);
|
||||
}
|
||||
|
||||
unbindMediaElementEvents() {
|
||||
const elem = this._mediaElement;
|
||||
const elem = this.mediaElement;
|
||||
|
||||
elem.removeEventListener('close', this.onDialogClosed);
|
||||
elem.querySelector('#btnBookplayerExit').removeEventListener('click', this.onDialogClosed);
|
||||
@ -163,20 +162,20 @@ export class BookPlayer {
|
||||
}
|
||||
|
||||
unbindEvents() {
|
||||
if (this._mediaElement) {
|
||||
if (this.mediaElement) {
|
||||
this.unbindMediaElementEvents();
|
||||
}
|
||||
|
||||
document.removeEventListener('keyup', this.onWindowKeyUp);
|
||||
|
||||
if (this._rendition) {
|
||||
this._rendition.off('keyup', this.onWindowKeyUp);
|
||||
if (this.rendition) {
|
||||
this.rendition.off('keyup', this.onWindowKeyUp);
|
||||
}
|
||||
}
|
||||
|
||||
openTableOfContents() {
|
||||
if (this._loaded) {
|
||||
this._tocElement = new TableOfContents(this);
|
||||
if (this.loaded) {
|
||||
this.tocElement = new TableOfContents(this);
|
||||
}
|
||||
}
|
||||
|
||||
@ -191,7 +190,7 @@ export class BookPlayer {
|
||||
}
|
||||
|
||||
createMediaElement() {
|
||||
let elem = this._mediaElement;
|
||||
let elem = this.mediaElement;
|
||||
if (elem) {
|
||||
return elem;
|
||||
}
|
||||
@ -207,8 +206,6 @@ export class BookPlayer {
|
||||
removeOnClose: true
|
||||
});
|
||||
|
||||
elem.id = 'bookPlayer';
|
||||
|
||||
let html = '';
|
||||
|
||||
if (browser.mobile) {
|
||||
@ -226,13 +223,13 @@ export class BookPlayer {
|
||||
html += '<div class="button-wrapper bottom-button"><button id="btnBookplayerNext" is="paper-icon-button-light" class="autoSize bookplayerButton hide-mouse-idle-tv">Next <i class="material-icons bookplayerButtonIcon navigate_next"></i></button></div>';
|
||||
}
|
||||
|
||||
elem.id = 'bookPlayer';
|
||||
elem.innerHTML = html;
|
||||
|
||||
dialogHelper.open(elem);
|
||||
}
|
||||
|
||||
this._mediaElement = elem;
|
||||
|
||||
this.mediaElement = elem;
|
||||
return elem;
|
||||
}
|
||||
|
||||
@ -253,7 +250,7 @@ export class BookPlayer {
|
||||
|
||||
setCurrentSrc(elem, options) {
|
||||
const item = options.items[0];
|
||||
this._currentItem = item;
|
||||
this.item = item;
|
||||
this.streamInfo = {
|
||||
started: true,
|
||||
ended: false,
|
||||
@ -271,13 +268,8 @@ export class BookPlayer {
|
||||
const book = epubjs(downloadHref, {openAs: 'epub'});
|
||||
const rendition = this.render('viewer', book);
|
||||
|
||||
this._currentSrc = downloadHref;
|
||||
this._rendition = rendition;
|
||||
const cancellationToken = {
|
||||
shouldCancel: false
|
||||
};
|
||||
|
||||
this._cancellationToken = cancellationToken;
|
||||
this.currentSrc = downloadHref;
|
||||
this.rendition = rendition;
|
||||
|
||||
return rendition.display().then(() => {
|
||||
const epubElem = document.querySelector('.epub-container');
|
||||
@ -285,10 +277,8 @@ export class BookPlayer {
|
||||
|
||||
this.bindEvents();
|
||||
|
||||
return this._rendition.book.locations.generate(1024).then(async () => {
|
||||
if (cancellationToken.shouldCancel) {
|
||||
return reject();
|
||||
}
|
||||
return this.rendition.book.locations.generate(1024).then(async () => {
|
||||
if (this.cancellationToken) reject();
|
||||
|
||||
const percentageTicks = options.startPositionTicks / 10000000;
|
||||
if (percentageTicks !== 0.0) {
|
||||
@ -296,15 +286,14 @@ export class BookPlayer {
|
||||
await rendition.display(resumeLocation);
|
||||
}
|
||||
|
||||
this._loaded = true;
|
||||
this.loaded = true;
|
||||
epubElem.style.display = 'block';
|
||||
rendition.on('relocated', (locations) => {
|
||||
this._progress = book.locations.percentageFromCfi(locations.start.cfi);
|
||||
this.progress = book.locations.percentageFromCfi(locations.start.cfi);
|
||||
events.trigger(this, 'timeupdate');
|
||||
});
|
||||
|
||||
loading.hide();
|
||||
|
||||
return resolve();
|
||||
});
|
||||
}, () => {
|
||||
@ -320,7 +309,7 @@ export class BookPlayer {
|
||||
}
|
||||
|
||||
canPlayItem(item) {
|
||||
if (item.Path && (item.Path.endsWith('epub'))) {
|
||||
if (item.Path && item.Path.endsWith('epub')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -2,8 +2,8 @@ import dialogHelper from 'dialogHelper';
|
||||
|
||||
export default class TableOfContents {
|
||||
constructor(bookPlayer) {
|
||||
this._bookPlayer = bookPlayer;
|
||||
this._rendition = bookPlayer._rendition;
|
||||
this.bookPlayer = bookPlayer;
|
||||
this.rendition = bookPlayer.rendition;
|
||||
|
||||
this.onDialogClosed = this.onDialogClosed.bind(this);
|
||||
|
||||
@ -11,24 +11,24 @@ export default class TableOfContents {
|
||||
}
|
||||
|
||||
destroy() {
|
||||
const elem = this._elem;
|
||||
const elem = this.elem;
|
||||
if (elem) {
|
||||
this.unbindEvents();
|
||||
dialogHelper.close(elem);
|
||||
}
|
||||
|
||||
this._bookPlayer._tocElement = null;
|
||||
this.bookPlayer.tocElement = null;
|
||||
}
|
||||
|
||||
bindEvents() {
|
||||
const elem = this._elem;
|
||||
const elem = this.elem;
|
||||
|
||||
elem.addEventListener('close', this.onDialogClosed, {once: true});
|
||||
elem.querySelector('.btnBookplayerTocClose').addEventListener('click', this.onDialogClosed, {once: true});
|
||||
}
|
||||
|
||||
unbindEvents() {
|
||||
const elem = this._elem;
|
||||
const elem = this.elem;
|
||||
|
||||
elem.removeEventListener('close', this.onDialogClosed);
|
||||
elem.querySelector('.btnBookplayerTocClose').removeEventListener('click', this.onDialogClosed);
|
||||
@ -52,7 +52,7 @@ export default class TableOfContents {
|
||||
}
|
||||
|
||||
createMediaElement() {
|
||||
const rendition = this._rendition;
|
||||
const rendition = this.rendition;
|
||||
|
||||
const elem = dialogHelper.createDialog({
|
||||
size: 'small',
|
||||
@ -68,7 +68,8 @@ export default class TableOfContents {
|
||||
tocHtml += '<ul class="toc">';
|
||||
rendition.book.navigation.forEach((chapter) => {
|
||||
tocHtml += '<li>';
|
||||
// Remove '../' from href
|
||||
|
||||
// remove parent directory reference from href to fix certain books
|
||||
const link = chapter.href.startsWith('../') ? chapter.href.substr(3) : chapter.href;
|
||||
tocHtml += `<a href="${rendition.book.path.directory + link}">${chapter.label}</a>`;
|
||||
tocHtml += '</li>';
|
||||
@ -83,7 +84,7 @@ export default class TableOfContents {
|
||||
this.destroy();
|
||||
});
|
||||
|
||||
this._elem = elem;
|
||||
this.elem = elem;
|
||||
|
||||
this.bindEvents();
|
||||
dialogHelper.open(elem);
|
||||
|
306
src/plugins/pdfPlayer/plugin.js
Normal file
306
src/plugins/pdfPlayer/plugin.js
Normal file
@ -0,0 +1,306 @@
|
||||
import loading from 'loading';
|
||||
import keyboardnavigation from 'keyboardnavigation';
|
||||
import dialogHelper from 'dialogHelper';
|
||||
import dom from 'dom';
|
||||
import appRouter from 'appRouter';
|
||||
import events from 'events';
|
||||
import 'css!./style';
|
||||
import 'material-icons';
|
||||
import 'paper-icon-button-light';
|
||||
|
||||
export class PdfPlayer {
|
||||
constructor() {
|
||||
this.name = 'PDF Player';
|
||||
this.type = 'mediaplayer';
|
||||
this.id = 'pdfplayer';
|
||||
this.priority = 1;
|
||||
|
||||
this.onDialogClosed = this.onDialogClosed.bind(this);
|
||||
this.onWindowKeyUp = this.onWindowKeyUp.bind(this);
|
||||
this.onTouchStart = this.onTouchStart.bind(this);
|
||||
}
|
||||
|
||||
play(options) {
|
||||
this.progress = 0;
|
||||
this.loaded = false;
|
||||
this.cancellationToken = false;
|
||||
this.pages = {};
|
||||
|
||||
loading.show();
|
||||
|
||||
const elem = this.createMediaElement();
|
||||
return this.setCurrentSrc(elem, options);
|
||||
}
|
||||
|
||||
stop() {
|
||||
this.unbindEvents();
|
||||
|
||||
const elem = this.mediaElement;
|
||||
if (elem) {
|
||||
dialogHelper.close(elem);
|
||||
this.mediaElement = null;
|
||||
}
|
||||
|
||||
// hide loading animation
|
||||
loading.hide();
|
||||
|
||||
// cancel page render
|
||||
this.cancellationToken = true;
|
||||
}
|
||||
|
||||
currentItem() {
|
||||
return this.item;
|
||||
}
|
||||
|
||||
currentTime() {
|
||||
return this.progress;
|
||||
}
|
||||
|
||||
duration() {
|
||||
return this.book ? this.book.numPages : 0;
|
||||
}
|
||||
|
||||
volume() {
|
||||
return 100;
|
||||
}
|
||||
|
||||
isMuted() {
|
||||
return false;
|
||||
}
|
||||
|
||||
paused() {
|
||||
return false;
|
||||
}
|
||||
|
||||
seekable() {
|
||||
return true;
|
||||
}
|
||||
|
||||
onWindowKeyUp(e) {
|
||||
const key = keyboardnavigation.getKeyName(e);
|
||||
|
||||
if (!this.loaded) return;
|
||||
switch (key) {
|
||||
case 'l':
|
||||
case 'ArrowRight':
|
||||
case 'Right':
|
||||
this.next();
|
||||
break;
|
||||
case 'j':
|
||||
case 'ArrowLeft':
|
||||
case 'Left':
|
||||
this.previous();
|
||||
break;
|
||||
case 'Escape':
|
||||
this.stop();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
onTouchStart(e) {
|
||||
if (!this.loaded || !e.touches || e.touches.length === 0) return;
|
||||
if (e.touches[0].clientX < dom.getWindowSize().innerWidth / 2) {
|
||||
this.previous();
|
||||
} else {
|
||||
this.next();
|
||||
}
|
||||
}
|
||||
|
||||
onDialogClosed() {
|
||||
this.stop();
|
||||
}
|
||||
|
||||
bindMediaElementEvents() {
|
||||
const elem = this.mediaElement;
|
||||
|
||||
elem.addEventListener('close', this.onDialogClosed, {once: true});
|
||||
elem.querySelector('.btnExit').addEventListener('click', this.onDialogClosed, {once: true});
|
||||
}
|
||||
|
||||
bindEvents() {
|
||||
this.bindMediaElementEvents();
|
||||
|
||||
document.addEventListener('keyup', this.onWindowKeyUp);
|
||||
document.addEventListener('touchstart', this.onTouchStart);
|
||||
}
|
||||
|
||||
unbindMediaElementEvents() {
|
||||
const elem = this.mediaElement;
|
||||
|
||||
elem.removeEventListener('close', this.onDialogClosed);
|
||||
elem.querySelector('.btnExit').removeEventListener('click', this.onDialogClosed);
|
||||
}
|
||||
|
||||
unbindEvents() {
|
||||
if (this.mediaElement) {
|
||||
this.unbindMediaElementEvents();
|
||||
}
|
||||
|
||||
document.removeEventListener('keyup', this.onWindowKeyUp);
|
||||
document.removeEventListener('touchstart', this.onTouchStart);
|
||||
}
|
||||
|
||||
createMediaElement() {
|
||||
let elem = this.mediaElement;
|
||||
if (elem) {
|
||||
return elem;
|
||||
}
|
||||
|
||||
elem = document.getElementById('pdfPlayer');
|
||||
if (!elem) {
|
||||
elem = dialogHelper.createDialog({
|
||||
exitAnimationDuration: 400,
|
||||
size: 'fullscreen',
|
||||
autoFocus: false,
|
||||
scrollY: false,
|
||||
exitAnimation: 'fadeout',
|
||||
removeOnClose: true
|
||||
});
|
||||
|
||||
let html = '';
|
||||
html += '<canvas id="canvas"></canvas>';
|
||||
html += '<div class="actionButtons">';
|
||||
html += '<button is="paper-icon-button-light" class="autoSize btnExit" tabindex="-1"><i class="material-icons actionButtonIcon close"></i></button>';
|
||||
html += '</div>';
|
||||
|
||||
elem.id = 'pdfPlayer';
|
||||
elem.innerHTML = html;
|
||||
|
||||
dialogHelper.open(elem);
|
||||
}
|
||||
|
||||
this.mediaElement = elem;
|
||||
return elem;
|
||||
}
|
||||
|
||||
setCurrentSrc(elem, options) {
|
||||
const item = options.items[0];
|
||||
|
||||
this.item = item;
|
||||
this.streamInfo = {
|
||||
started: true,
|
||||
ended: false,
|
||||
mediaSource: {
|
||||
Id: item.Id
|
||||
}
|
||||
};
|
||||
|
||||
const serverId = item.ServerId;
|
||||
const apiClient = window.connectionManager.getApiClient(serverId);
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
import('pdfjs').then(({default: pdfjs}) => {
|
||||
const downloadHref = apiClient.getItemDownloadUrl(item.Id);
|
||||
|
||||
this.bindEvents();
|
||||
pdfjs.GlobalWorkerOptions.workerSrc = appRouter.baseUrl() + '/libraries/pdf.worker.js';
|
||||
|
||||
const downloadTask = pdfjs.getDocument(downloadHref);
|
||||
downloadTask.promise.then(book => {
|
||||
if (this.cancellationToken) return;
|
||||
this.book = book;
|
||||
this.loaded = true;
|
||||
|
||||
const percentageTicks = options.startPositionTicks / 10000;
|
||||
if (percentageTicks !== 0) {
|
||||
this.loadPage(percentageTicks);
|
||||
this.progress = percentageTicks;
|
||||
} else {
|
||||
this.loadPage(1);
|
||||
}
|
||||
|
||||
return resolve();
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
next() {
|
||||
if (this.progress === this.duration() - 1) return;
|
||||
this.loadPage(this.progress + 2);
|
||||
this.progress = this.progress + 1;
|
||||
}
|
||||
|
||||
previous() {
|
||||
if (this.progress === 0) return;
|
||||
this.loadPage(this.progress);
|
||||
this.progress = this.progress - 1;
|
||||
}
|
||||
|
||||
replaceCanvas(canvas) {
|
||||
const old = document.getElementById('canvas');
|
||||
|
||||
canvas.id = 'canvas';
|
||||
old.parentNode.replaceChild(canvas, old);
|
||||
}
|
||||
|
||||
loadPage(number) {
|
||||
const prefix = 'page';
|
||||
const pad = 2;
|
||||
|
||||
// generate list of cached pages by padding the requested page on both sides
|
||||
const pages = [prefix + number];
|
||||
for (let i = 1; i <= pad; i++) {
|
||||
if (number - i > 0) pages.push(prefix + (number - i));
|
||||
if (number + i < this.duration()) pages.push(prefix + (number + i));
|
||||
}
|
||||
|
||||
// load any missing pages in the cache
|
||||
for (const page of pages) {
|
||||
if (!this.pages[page]) {
|
||||
this.pages[page] = document.createElement('canvas');
|
||||
this.renderPage(this.pages[page], parseInt(page.substr(4)));
|
||||
}
|
||||
}
|
||||
|
||||
// show the requested page
|
||||
this.replaceCanvas(this.pages[prefix + number], number);
|
||||
|
||||
// delete all pages outside the cache area
|
||||
for (const page in this.pages) {
|
||||
if (!pages.includes(page)) {
|
||||
delete this.pages[page];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
renderPage(canvas, number) {
|
||||
this.book.getPage(number).then(page => {
|
||||
events.trigger(this, 'timeupdate');
|
||||
|
||||
const original = page.getViewport({ scale: 1 });
|
||||
const context = canvas.getContext('2d');
|
||||
|
||||
const widthRatio = dom.getWindowSize().innerWidth / original.width;
|
||||
const heightRatio = dom.getWindowSize().innerHeight / original.height;
|
||||
const scale = Math.min(heightRatio, widthRatio);
|
||||
const viewport = page.getViewport({ scale: scale });
|
||||
|
||||
canvas.width = viewport.width;
|
||||
canvas.height = viewport.height;
|
||||
const renderContext = {
|
||||
canvasContext: context,
|
||||
viewport: viewport
|
||||
};
|
||||
|
||||
const renderTask = page.render(renderContext);
|
||||
renderTask.promise.then(() => {
|
||||
loading.hide();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
canPlayMediaType(mediaType) {
|
||||
return (mediaType || '').toLowerCase() === 'book';
|
||||
}
|
||||
|
||||
canPlayItem(item) {
|
||||
if (item.Path && item.Path.endsWith('pdf')) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
export default PdfPlayer;
|
25
src/plugins/pdfPlayer/style.css
Normal file
25
src/plugins/pdfPlayer/style.css
Normal file
@ -0,0 +1,25 @@
|
||||
#pdfPlayer {
|
||||
position: relative;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
overflow: none;
|
||||
z-index: 100;
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
#canvas {
|
||||
display: block;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
.actionButtons {
|
||||
right: 0.5vh;
|
||||
top: 0.5vh;
|
||||
z-index: 1002;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.actionButtonIcon {
|
||||
color: black;
|
||||
opacity: 0.7;
|
||||
}
|
@ -1,11 +1,22 @@
|
||||
import * as userSettings from 'userSettings';
|
||||
import * as webSettings from 'webSettings';
|
||||
import skinManager from 'skinManager';
|
||||
import events from 'events';
|
||||
|
||||
// Set the default theme when loading
|
||||
// set the default theme when loading
|
||||
skinManager.setTheme(userSettings.theme());
|
||||
|
||||
// Set the user's prefered theme when signing in
|
||||
// set the saved theme once a user authenticates
|
||||
events.on(window.connectionManager, 'localusersignedin', function (e, user) {
|
||||
skinManager.setTheme(userSettings.theme());
|
||||
});
|
||||
|
||||
webSettings.getFonts().then(fonts => {
|
||||
for (const font of fonts) {
|
||||
const link = document.createElement('link');
|
||||
link.setAttribute('rel', 'stylesheet');
|
||||
link.href = font;
|
||||
|
||||
document.getElementsByTagName('head')[0].appendChild(link);
|
||||
}
|
||||
});
|
||||
|
@ -111,3 +111,12 @@ export function getPlugins() {
|
||||
return [];
|
||||
});
|
||||
}
|
||||
|
||||
export function getFonts() {
|
||||
return getConfig().then(config => {
|
||||
return config.fonts;
|
||||
}).catch(error => {
|
||||
console.log('cannot get web config:', error);
|
||||
return [];
|
||||
});
|
||||
}
|
||||
|
@ -222,7 +222,7 @@ function initClient() {
|
||||
}
|
||||
|
||||
function loadCoreDictionary(globalize) {
|
||||
const languages = ['ar', 'be-by', 'bg-bg', 'ca', 'cs', 'da', 'de', 'el', 'en-gb', 'en-us', 'es', 'es-ar', 'es-mx', 'fa', 'fi', 'fr', 'fr-ca', 'gsw', 'he', 'hi-in', 'hr', 'hu', 'id', 'it', 'kk', 'ko', 'lt-lt', 'ms', 'nb', 'nl', 'pl', 'pt-br', 'pt-pt', 'ro', 'ru', 'sk', 'sl-si', 'sv', 'tr', 'uk', 'vi', 'zh-cn', 'zh-hk', 'zh-tw'];
|
||||
const languages = ['ar', 'be-by', 'bg-bg', 'ca', 'cs', 'da', 'de', 'el', 'en-gb', 'en-us', 'es', 'es-ar', 'es-mx', 'fa', 'fi', 'fr', 'fr-ca', 'gsw', 'he', 'hi-in', 'hr', 'hu', 'id', 'it', 'ja', 'kk', 'ko', 'lt-lt', 'ms', 'nb', 'nl', 'pl', 'pt-br', 'pt-pt', 'ro', 'ru', 'sk', 'sl-si', 'sv', 'tr', 'uk', 'vi', 'zh-cn', 'zh-hk', 'zh-tw'];
|
||||
const translations = languages.map(function (language) {
|
||||
return {
|
||||
lang: language,
|
||||
@ -487,6 +487,7 @@ function initClient() {
|
||||
'flvjs',
|
||||
'jstree',
|
||||
'epubjs',
|
||||
'pdfjs',
|
||||
'jQuery',
|
||||
'hlsjs',
|
||||
'howler',
|
||||
@ -497,7 +498,6 @@ function initClient() {
|
||||
'sortable',
|
||||
'webcomponents',
|
||||
'material-icons',
|
||||
'jellyfin-noto',
|
||||
'date-fns',
|
||||
'page',
|
||||
'polyfill',
|
||||
@ -520,7 +520,7 @@ function initClient() {
|
||||
});
|
||||
|
||||
promise = require(['fetch'])
|
||||
.then(() => require(['jQuery', 'polyfill', 'fast-text-encoding', 'intersection-observer', 'classlist-polyfill', 'css!assets/css/site', 'jellyfin-noto'], (jQuery) => {
|
||||
.then(() => require(['jQuery', 'polyfill', 'fast-text-encoding', 'intersection-observer', 'classlist-polyfill', 'css!assets/css/site'], (jQuery) => {
|
||||
// Expose jQuery globally
|
||||
window.$ = jQuery;
|
||||
window.jQuery = jQuery;
|
||||
|
@ -1422,5 +1422,8 @@
|
||||
"OptionMaxActiveSessions": "Nastavuje, kolik uživatelských relací může najednou existovat.",
|
||||
"LabelUserMaxActiveSessions": "Maximální počet uživatelských relací najednou:",
|
||||
"OptionAllowContentDownloadHelp": "Uživatelé si mohou média stáhnout a uložit na svá zařízení. Tato funkce není stejná jako synchronizace. Knihovny s knihami tuto funkci vyžadují ke správnému fungování.",
|
||||
"OptionAllowContentDownload": "Povolit stahování médií"
|
||||
"OptionAllowContentDownload": "Povolit stahování médií",
|
||||
"HeaderDeleteDevices": "Odstranit všechna zařízení",
|
||||
"DeleteDevicesConfirmation": "Opravdu chcete odstranit všechna zařízení? Souvisejicí relace budou odhlášeny. Zařízení se znovu objeví při dalším přihlášení.",
|
||||
"DeleteAll": "Odstranit vše"
|
||||
}
|
||||
|
@ -164,12 +164,12 @@
|
||||
"EnableStreamLoopingHelp": "Aktivieren, wenn Live Streams nur ein paar Sekunden Daten enthalten und ständig angefragt werden müssen. Kann zu Problemen führen wenn aktiviert, obwohl nicht nötig.",
|
||||
"EnableThemeSongsHelp": "Titelmusik wird während des Blätterns durch die Bibliothek im Hintergrund abgespielt.",
|
||||
"EnableThemeVideosHelp": "Titelvideos werden während des Blätterns durch die Bibliothek im Hintergrund abgespielt.",
|
||||
"Ended": "Beendent",
|
||||
"Ended": "Beendet",
|
||||
"EndsAtValue": "Endet um {0}",
|
||||
"Episodes": "Episoden",
|
||||
"ErrorAddingListingsToSchedulesDirect": "Ein Fehler trat beim Hinzufügen Ihrer Zusammenstellung zu Ihrem Schedules Direct Konto auf. Schedules Direct erlaubt nur eine begrenzte Anzahl von Zusammenstellungen je Account. Sie sollten sich auf der Website in Ihrem Schedules-Direct Konto einloggen und ein paar Zusammenstellungen von Ihrem Konto löschen bevor Sie fortfahren.",
|
||||
"ErrorAddingMediaPathToVirtualFolder": "Ein Fehler trat beim Hinzufügen eines Medienverzeichnisses auf. Bitte stellen Sie sicher, dass der Pfad gültig ist und Jellyfin die notwendigen Zugriffsrechte besitzt.",
|
||||
"ErrorAddingTunerDevice": "Es trat ein Fehler beim hinzufügen eines Tuners auf. Bitte stellen Sie sicher das dieser erreichbar ist und versuchen Sie es erneut.",
|
||||
"ErrorAddingTunerDevice": "Es trat ein Fehler beim Hinzufügen eines Tuners auf. Bitte stellen Sie sicher, dass dieser erreichbar ist und versuchen Sie es erneut.",
|
||||
"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 Server. Bitte stelle sicher, dass Jellyfin 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.",
|
||||
@ -1356,7 +1356,7 @@
|
||||
"Subtitle": "Untertitel",
|
||||
"SelectServer": "Server auswählen",
|
||||
"Restart": "Neustarten",
|
||||
"ResetPassword": "Passwort zurücksetzten",
|
||||
"ResetPassword": "Passwort zurücksetzen",
|
||||
"Profile": "Profil",
|
||||
"MusicVideos": "Musikvideos",
|
||||
"Image": "Bild",
|
||||
@ -1422,5 +1422,8 @@
|
||||
"OptionMaxActiveSessions": "Legt die maximale Anzahl gleichzeitiger Benutzer-Sessions fest.",
|
||||
"LabelUserMaxActiveSessions": "Maximale Anzahl von gleichzeitigen Benutzer-Sessions:",
|
||||
"OptionAllowContentDownloadHelp": "Benutzer können Medien herunterladen und auf ihren Geräten speichern. Dies ist nicht dasselbe wie eine Synchronisierungsfunktion. Buchbibliotheken benötigen diese Funktion, um ordnungsgemäß zu funktionieren.",
|
||||
"OptionAllowContentDownload": "Mediendownloads zulassen"
|
||||
"OptionAllowContentDownload": "Mediendownloads zulassen",
|
||||
"HeaderDeleteDevices": "Alle Geräte löschen",
|
||||
"DeleteDevicesConfirmation": "Sind Sie sicher, dass Sie alle Geräte löschen möchten? Alle anderen Sitzungen werden abgemeldet. Die Geräte erscheinen wieder, wenn sich ein Benutzer das nächste Mal anmeldet.",
|
||||
"DeleteAll": "Alle löschen"
|
||||
}
|
||||
|
@ -150,6 +150,8 @@
|
||||
"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 software transcoding interlaced content. When hardware acceleration supporting hardware deinterlacing is enabled the hardware deinterlacer will be used instead of this setting.",
|
||||
"Delete": "Delete",
|
||||
"DeleteAll": "Delete All",
|
||||
"DeleteDevicesConfirmation": "Are you sure you wish to delete all devices? All other sessions will be logged out. Devices will reappear the next time a user signs in.",
|
||||
"DeleteDeviceConfirmation": "Are you sure you wish to delete this device? It will reappear the next time a user signs in with it.",
|
||||
"DeleteImage": "Delete Image",
|
||||
"DeleteImageConfirmation": "Are you sure you wish to delete this image?",
|
||||
@ -298,6 +300,7 @@
|
||||
"HeaderDateIssued": "Date Issued",
|
||||
"HeaderDefaultRecordingSettings": "Default Recording Settings",
|
||||
"HeaderDeleteDevice": "Delete Device",
|
||||
"HeaderDeleteDevices": "Delete All Devices",
|
||||
"HeaderDeleteItem": "Delete Item",
|
||||
"HeaderDeleteItems": "Delete Items",
|
||||
"HeaderDeleteProvider": "Delete Provider",
|
||||
|
@ -1422,5 +1422,8 @@
|
||||
"OptionMaxActiveSessions": "Establece el número máximo de sesiones de usuario simultáneas.",
|
||||
"LabelUserMaxActiveSessions": "Número máximo de sesiones de usuario simultáneas:",
|
||||
"OptionAllowContentDownloadHelp": "Los usuarios pueden descargar medios y almacenarlos en sus dispositivos. No es lo mismo que una función de sincronización. Las bibliotecas de libros requieren que esta habilitado funcione correctamente.",
|
||||
"OptionAllowContentDownload": "Permitir descargas de medios"
|
||||
"OptionAllowContentDownload": "Permitir descargas de medios",
|
||||
"HeaderDeleteDevices": "Eliminar todos los dispositivos",
|
||||
"DeleteDevicesConfirmation": "¿Está seguro de que desea eliminar todos los dispositivos? Todas las demás sesiones se cerrarán. Los dispositivos volverán a aparecer la próxima vez que un usuario inicie sesión.",
|
||||
"DeleteAll": "Eliminar todos"
|
||||
}
|
||||
|
@ -1237,7 +1237,7 @@
|
||||
"EnableFasterAnimations": "Animaciones más rápidas",
|
||||
"AllowFfmpegThrottlingHelp": "Las conversiones se pausarán cuando se adelanten lo suficiente desde la posición en la que se encuentre el reproductor. Puede reducir la carga en el servidor y es útil cuando se reproduce de forma continua, sin saltar entre intervalos de tiempo, pero puede que tengas que desactivarlo si experimentas problemas en la reproducción o cambias de posición frecuentemente mientras reproduces contenido.",
|
||||
"PlaybackErrorNoCompatibleStream": "Este contenido no es compatible con este dispositivo y no se puede reproducir: No se puede obtener del servidor en un formato compatible.",
|
||||
"OptionForceRemoteSourceTranscoding": "Forzar la conversión para fuentes externas (como la televisión en directo)",
|
||||
"OptionForceRemoteSourceTranscoding": "Forzar la conversión para fuentes externas como la televisión en directo",
|
||||
"NoCreatedLibraries": "Parece que aún no se han creado librearías. {0}¿Quiere crear una ahora?{1}",
|
||||
"LabelVideoResolution": "Resolución de video:",
|
||||
"LabelStreamType": "Tipo de stream:",
|
||||
@ -1420,5 +1420,10 @@
|
||||
"LabelTonemappingThresholdHelp": "Los parámetros del algoritmo de mapeo de tonos se ajustan en cada escena. Se usa un umbral para detectar si la escena ha cambiado o no. Si el brillo promedio se sale del umbral entre el fotograma actual y el próximo, se volveran a calcular los valores de brillo promedio y de pico. Se recomiendan los valores predeterminados 0.8 y 0.2.",
|
||||
"OptionMaxActiveSessionsHelp": "Un valor de 0 desactivará esta característica.",
|
||||
"OptionMaxActiveSessions": "Fija el número máximo de sesiones que puede tener cada usuario.",
|
||||
"LabelUserMaxActiveSessions": "Número máximo de sesiones simultaneas por usuario:"
|
||||
"LabelUserMaxActiveSessions": "Número máximo de sesiones simultaneas por usuario:",
|
||||
"OptionAllowContentDownloadHelp": "Los usuarios pueden descargar los medios y guardarlos en sus dispositivos. Esto no es una función de sincronización. Las bibliotecas de libros requieren que esto esté activado para funcionar correctamente.",
|
||||
"OptionAllowContentDownload": "Permitir descargas de medios",
|
||||
"HeaderDeleteDevices": "Borrar todos los dispositivos",
|
||||
"DeleteDevicesConfirmation": "¿Estás seguro de que quieres borrar todos los dispositivos? Todas las otras sesiones se cerrarán. Los dispositivos reaparecerán la proxima vez que un usuario inicie sesión.",
|
||||
"DeleteAll": "Borrar todo"
|
||||
}
|
||||
|
@ -1185,5 +1185,11 @@
|
||||
"HeaderTranscodingProfileHelp": "Lisää transkoodausprofiileja osoittamaan, mitä muotoja tulisi käyttää, kun transkoodaus on tarpeen.",
|
||||
"LabelAlbumArtMaxResHelp": "Upnp: albumArtURI -ominaisuuden kautta näytetyn albumikuvan enimmäistarkkuus.",
|
||||
"KnownProxiesHelp": "Pilkuilla erotettu luettelo tunnettujen välityspalvelinten IP-osoitteista, joita käytetään muodostettaessa yhteyttä Jellyfin-palvelusi. Tämä vaaditaan X-Forwarded-For-otsikkojen oikeaan käyttöön. Uudelleenkäynnistys vaaditaan tallennuksen jälkeen.",
|
||||
"LabelInNetworkSignInWithEasyPasswordHelp": "Kirjaudu helppokäyttöisen PIN-koodin avulla sisään lähiverkon päätteisiin. Normaalia salasanaasi tarvitaan vain, kun kirjaudut sisään etäverkosta. Jos PIN-koodi jätetään tyhjäksi, et tarvitse salasanaa kotiverkossasi."
|
||||
"LabelInNetworkSignInWithEasyPasswordHelp": "Kirjaudu helppokäyttöisen PIN-koodin avulla sisään lähiverkon päätteisiin. Normaalia salasanaasi tarvitaan vain, kun kirjaudut sisään etäverkosta. Jos PIN-koodi jätetään tyhjäksi, et tarvitse salasanaa kotiverkossasi.",
|
||||
"LabelDateAddedBehaviorHelp": "Jos metatietoarvo on olemassa, sitä käytetään aina näiden vaihtoehtojen sijaan.",
|
||||
"LabelCurrentStatus": "Nykyinen tila:",
|
||||
"LabelCachePathHelp": "Määritä välimuistitiedostojen, kuten kuvien, polku. Jätä tyhjäksi käyttääksesi palvelimen oletusarvoa.",
|
||||
"LabelBlastMessageIntervalHelp": "Määrittää ajan sekunteina jokaisen \"Olen elossa\" -viestin välillä.",
|
||||
"LabelBindToLocalNetworkAddressHelp": "Korvaa HTTP-palvelimen paikallinen IP-osoite. Jos se on tyhjä, palvelin linkitetään kaikkiin käytettävissä oleviin osoitteisiin. Tämän arvon muuttaminen edellyttää uudelleenkäynnistystä.",
|
||||
"LabelDefaultUserHelp": "Määrittää käyttäjän kirjaston, joka näytetään liitetyissä laitteissa. Tätä asetusta voidaan muuttaa laitekohtaisesti laiteprofiilin avulla."
|
||||
}
|
||||
|
@ -1231,7 +1231,7 @@
|
||||
"ButtonSplit": "Séparer",
|
||||
"SelectAdminUsername": "Veuillez choisir un nom d'utilisateur pour le compte administrateur.",
|
||||
"HeaderNavigation": "Navigation",
|
||||
"OptionForceRemoteSourceTranscoding": "Transcodage forcé pour sources de media à distance (ex: TV en direct)",
|
||||
"OptionForceRemoteSourceTranscoding": "Forcer le transcodage pour les sources de media distance comme par exemple la TV en direct",
|
||||
"MessageConfirmAppExit": "Voulez-vous quitter ?",
|
||||
"LabelVideoResolution": "Résolution vidéo :",
|
||||
"LabelStreamType": "Type de flux :",
|
||||
@ -1420,5 +1420,10 @@
|
||||
"LabelMaxMuxingQueueSize": "Taille maximale de la queue de multiplexage :",
|
||||
"OptionMaxActiveSessionsHelp": "Une valeur à 0 désactive la fonctionnalité.",
|
||||
"OptionMaxActiveSessions": "Défini le nombre maximal de sessions utilisateurs simultanées.",
|
||||
"LabelUserMaxActiveSessions": "Nombre maximal de sessions utilisateurs simultanées :"
|
||||
"LabelUserMaxActiveSessions": "Nombre maximal de sessions utilisateurs simultanées :",
|
||||
"OptionAllowContentDownloadHelp": "Les utilisateurs peuvent télécharger des médias et les stocker sur leurs appareils. Ce n'est pas la même chose qu'une fonction de synchronisation. Les bibliothèques de livres nécessitent cette activation pour fonctionner correctement.",
|
||||
"OptionAllowContentDownload": "Autoriser les téléchargements de médias",
|
||||
"HeaderDeleteDevices": "Supprimer tous les appareils",
|
||||
"DeleteDevicesConfirmation": "Voulez-vous vraiment supprimer tous les appareils ? Toutes les autres sessions seront déconnectées. Les appareils réapparaîtront la prochaine fois qu'un utilisateur se connectera.",
|
||||
"DeleteAll": "Tout supprimer"
|
||||
}
|
||||
|
@ -1411,5 +1411,11 @@
|
||||
"LabelColorPrimaries": "Primari colore:",
|
||||
"LabelColorTransfer": "Trasferimento colore:",
|
||||
"MediaInfoColorPrimaries": "Colori primari",
|
||||
"MediaInfoColorTransfer": "Trasferimento colore"
|
||||
"MediaInfoColorTransfer": "Trasferimento colore",
|
||||
"LabelTonemappingThreshold": "Soglia di mappatura dei toni:",
|
||||
"OptionAllowContentDownload": "Consenti il download dei media",
|
||||
"HeaderDeleteDevices": "Elimina tutti i dispositivi",
|
||||
"DeleteDevicesConfirmation": "Sei sicuro di voler eliminare tutti i dispositivi? Tutte le altre sessioni verrano disconnesse. I dispositivi riappariranno appena un utente vi effettuerà il login.",
|
||||
"DeleteAll": "Elimina tutto",
|
||||
"OptionAllowContentDownloadHelp": "Gli utenti possono scaricare contenuti e salvarli nei loro dispositivi. Non è uguale alla sincronizzazione. I libri richiedono che questa proprietà sia attivata per lavorare correttamente."
|
||||
}
|
||||
|
@ -1422,5 +1422,8 @@
|
||||
"XmlTvMovieCategoriesHelp": "これらのカテゴリの番組は映画として表示されます。複数の場合は '|' で区切ってください。",
|
||||
"XmlTvKidsCategoriesHelp": "これらのカテゴリの番組は子供向けとして表示されます。複数の場合は '|' で区切ってください。",
|
||||
"OptionAllowContentDownloadHelp": "ユーザーのデバイスにメディアのダウンロードと保存ができます。これは同期機能とは異なります。ブックライブラリが正しく機能するには有効化が必要です。",
|
||||
"OptionAllowContentDownload": "メディアのダウンロードを許可"
|
||||
"OptionAllowContentDownload": "メディアのダウンロードを許可",
|
||||
"HeaderDeleteDevices": "すべてのデバイスの削除",
|
||||
"DeleteDevicesConfirmation": "すべてのデバイスを削除しますか?他のセッションはすべてログアウトされます。デバイスは次回ログインした際に再度表示されるようになります。",
|
||||
"DeleteAll": "すべて削除"
|
||||
}
|
||||
|
@ -423,7 +423,7 @@
|
||||
"MessageDeleteTaskTrigger": "이 작업 트리거를 삭제하겠습니까?",
|
||||
"MessageEnablingOptionLongerScans": "이 옵션을 사용하면 라이브러리 스캔이 상당히 길어질 수 있습니다.",
|
||||
"MessageFileReadError": "이 파일을 읽는 데 오류가 발생하였습니다.",
|
||||
"MessageForgotPasswordFileCreated": "진행 방법이 설명된 다음의 파일이 귀하의 서버에 생성되었습니다.",
|
||||
"MessageForgotPasswordFileCreated": "진행 방법이 설명된 다음의 파일이 귀하의 서버에 생성되었습니다:",
|
||||
"MessageForgotPasswordInNetworkRequired": "비밀번호 초기화를 진행하려면 귀하의 홈 네트워크에서 다시 시도하세요.",
|
||||
"MessageInvalidForgotPasswordPin": "올바르지 않거나 만료된 PIN 코드입니다. 다시 시도하십시오.",
|
||||
"MessageInvalidUser": "올바르지 않은 사용자명 또는 비밀번호입니다. 다시 시도하세요.",
|
||||
@ -521,7 +521,7 @@
|
||||
"PasswordResetComplete": "비밀번호가 재설정되었습니다.",
|
||||
"PasswordResetConfirmation": "비밀번호를 재설정하겠습니까?",
|
||||
"PasswordSaved": "비밀번호가 저장되었습니다.",
|
||||
"PictureInPicture": "Picture in picture",
|
||||
"PictureInPicture": "Picture in picture(PIP)",
|
||||
"PinCodeResetComplete": "PIN 코드가 초기화되었습니다.",
|
||||
"PinCodeResetConfirmation": "PIN 코드를 초기화하겠습니까?",
|
||||
"Play": "재생",
|
||||
@ -749,7 +749,7 @@
|
||||
"ShowYear": "년도 표시",
|
||||
"ShowTitle": "제목 표시",
|
||||
"ShowAdvancedSettings": "고급 설정 표시",
|
||||
"ServerUpdateNeeded": "이 서버를 업데이트해야합니다. 최신 버전을 다운로드하려면 {0}을 (를) 방문하십시오.",
|
||||
"ServerUpdateNeeded": "이 서버를 업데이트해야합니다. 최신 버전을 다운로드하려면 {0}을 (를) 방문하십시오",
|
||||
"ServerRestartNeededAfterPluginInstall": "플러그인을 설치 한 후 Jellyfin을 다시 시작해야합니다.",
|
||||
"ServerNameIsShuttingDown": "{0}의 서버가 종료됩니다.",
|
||||
"ServerNameIsRestarting": "{0}의 서버가 다시 시작됩니다.",
|
||||
@ -1110,9 +1110,9 @@
|
||||
"LanNetworksHelp": "대역폭을 강제로 제한할 때 로컬 네트워크로 간주되는 쉼표로 구분된 IP 주소 및 IP/서브넷 마스크 목록입니다. 지정될 경우 모든 다른 IP 주소는 외부 네트워크로 간주되며 외부 대역폭 제한이 적용됩니다. 공백일 경우 서버의 서브넷만이 로컬 네트워크로 간주됩니다.",
|
||||
"LabelffmpegPathHelp": "ffmpeg를 포함하는 ffmpeg 응용 프로그램 파일 또는 폴더의 경로입니다.",
|
||||
"LabelXDlnaDocHelp": "urn:schemas-dlna-org:device-1-0 네임스페이스에 포함된 X_DLNADOC 요소의 내용을 결정합니다.",
|
||||
"LabelXDlnaDoc": "X-DLNA doc:",
|
||||
"LabelXDlnaDoc": "X-DLNA 문서:",
|
||||
"LabelXDlnaCapHelp": "urn:schemas-dlna-org:device-1-0 네임스페이스에 포함된 X_DLNACAP 요소의 내용을 결정합니다.",
|
||||
"LabelXDlnaCap": "X-DLNA cap:",
|
||||
"LabelXDlnaCap": "X-DLNA 한도:",
|
||||
"LabelVideoResolution": "비디오 해상도:",
|
||||
"LabelTVHomeScreen": "TV 모드 홈 화면:",
|
||||
"LabelStreamType": "스트리밍 유형:",
|
||||
@ -1219,7 +1219,7 @@
|
||||
"QuickConnectDeactivated": "로그인 요청이 승인되기 전에 Quick connect가 비활성화되었습니다",
|
||||
"QuickConnectAuthorizeFail": "알수없는 퀵커넥트 코드",
|
||||
"QuickConnectAuthorizeSuccess": "승인 요청",
|
||||
"QuickConnectAuthorizeCode": "로그인하려면 {0} 코드를 입력하세요.",
|
||||
"QuickConnectAuthorizeCode": "로그인하려면 {0} 코드를 입력하세요",
|
||||
"QuickConnectActivationSuccessful": "성공적으로 활성화되었습니다",
|
||||
"QuickConnect": "퀵커넥트",
|
||||
"Profile": "프로파일",
|
||||
@ -1420,5 +1420,10 @@
|
||||
"LabelUserMaxActiveSessions": "최대 동시 접속 사용자 세션 수:",
|
||||
"EnableAutoCast": "기본값으로 설정",
|
||||
"OptionMaxActiveSessionsHelp": "값이 0이면 이 기능이 비활성화됩니다.",
|
||||
"OptionMaxActiveSessions": "동시 사용자 세션의 최대 수를 설정하세요."
|
||||
"OptionMaxActiveSessions": "동시 사용자 세션의 최대값을 설정합니다.",
|
||||
"OptionAllowContentDownloadHelp": "사용자의 장치에 미디어를 다운로드 할 수 있습니다.이것은 동기화하는 기능이 아닙니다. 라이브러리가 올바르게 작동하려면 동기화가 필요합니다.",
|
||||
"OptionAllowContentDownload": "영상 다운로드 허용",
|
||||
"HeaderDeleteDevices": "모든 기기 삭제",
|
||||
"DeleteDevicesConfirmation": "모든 디바이스를 삭제하시겠습니까?다른 세션은 모두 로그아웃 됩니다.디바이스는 다음 번 로그인 했을 때에 다시 표시되게 됩니다.",
|
||||
"DeleteAll": "전체삭제"
|
||||
}
|
||||
|
@ -150,7 +150,7 @@
|
||||
"DoNotRecord": "Não gravar",
|
||||
"Down": "Baixo",
|
||||
"DrmChannelsNotImported": "Canais com DRM não serão importados.",
|
||||
"DropShadow": "Sombra",
|
||||
"DropShadow": "Sombra projetada",
|
||||
"EasyPasswordHelp": "Seu código pin fácil é usado para acesso off-line em clientes suportados e pode ser usado para acesso fácil dentro da rede.",
|
||||
"Edit": "Editar",
|
||||
"EditImages": "Editar imagens",
|
||||
@ -1229,7 +1229,7 @@
|
||||
"ButtonAddImage": "Adicionar Imagem",
|
||||
"OptionRandom": "Aleatório",
|
||||
"SelectAdminUsername": "Por favor selecione um nome de usuário para a conta de administrador.",
|
||||
"OptionForceRemoteSourceTranscoding": "Forçar transcodificação em fontes de mídia remotas (como LiveTV)",
|
||||
"OptionForceRemoteSourceTranscoding": "Forçar a transcodificação de fontes de mídia remotas (como LiveTV)",
|
||||
"NoCreatedLibraries": "Parece que você ainda não criou nenhuma biblioteca. {0}Gostaria de criar uma agora?{1}",
|
||||
"MessageConfirmAppExit": "Você quer sair?",
|
||||
"LabelVideoResolution": "Resolução de vídeo:",
|
||||
@ -1420,5 +1420,10 @@
|
||||
"Bwdif": "BWDIF",
|
||||
"UseDoubleRateDeinterlacingHelp": "Essa configuração utiliza a \"field rate\" ao fazer o processo de \"deinterlacing\", frequentemente chamado de \"bob deinterlacing\", que dobra a taxa de quadros do vídeo para proporcionar um movimento completo similar àquele visto ao ver um vídeo \"interlaçado\" em uma TV.",
|
||||
"OptionMaxActiveSessions": "Estabelece o número máximo de sessões de usuários simultâneas.",
|
||||
"LabelUserMaxActiveSessions": "Número máximo de sessões de usuários simultâneas:"
|
||||
"LabelUserMaxActiveSessions": "Número máximo de sessões de usuários simultâneas:",
|
||||
"OptionAllowContentDownloadHelp": "Os usuários podem baixar mídias e armazená-las em seus dispositivos. Isso não é o mesmo que um recurso de sincronização. Para funcionar corretamente isso exige que a biblioteca de mídia esteja habilitada.",
|
||||
"OptionAllowContentDownload": "Permitir download de mídia",
|
||||
"HeaderDeleteDevices": "Excluir todos os dispositivos",
|
||||
"DeleteDevicesConfirmation": "Tem certeza de que deseja excluir todos os dispositivos? Todas as outras sessões serão desconectadas. Os dispositivos reaparecerão na próxima vez que um usuário fizer login.",
|
||||
"DeleteAll": "Excluir tudo"
|
||||
}
|
||||
|
@ -1413,5 +1413,6 @@
|
||||
"LabelTonemappingRange": "Alcance do Tone mapping :",
|
||||
"TonemappingAlgorithmHelp": "O Tone mapping pode ser afinado. Se não está familiarizado com estas opções mantenha os valores padrão. O valor recomendado é Reinhard.",
|
||||
"AllowTonemappingHelp": "O Tone mapping permite transformar o alcance dinâmico de um vídeo de HDR para SDR mantendo as cores e detalhes da imagem, que é informação importante para representar a cena original. Atualmente apenas funciona durante a transcodificação de vídeos com metadados HDR10 ou HLG embutidos. Caso a reprodução não seja suave ou falhe, considere desligar o descodificador de hardware correspondente.",
|
||||
"LabelMaxMuxingQueueSizeHelp": "Número máximo de pacotes armazenados em <i>buffer</i> enquanto aguardam que todas a transmissões iniciem. Tente aumentá-lo caso se depare com o seguinte erro nos <i>logs</i> do ffmpeg \"Too many packets buffered for output stream\". O valor recomendado é 2048."
|
||||
"LabelMaxMuxingQueueSizeHelp": "Número máximo de pacotes armazenados em <i>buffer</i> enquanto aguardam que todas a transmissões iniciem. Tente aumentá-lo caso se depare com o seguinte erro nos <i>logs</i> do ffmpeg \"Too many packets buffered for output stream\". O valor recomendado é 2048.",
|
||||
"DeleteAll": "Apagar tudo"
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"HeaderTypeImageFetchers": "{0} Pesquisadores de Imagens",
|
||||
"HeaderSubtitleDownloads": "Transferências de Legendas",
|
||||
"HeaderKodiMetadataHelp": "Para ativar ou desativar metadados, editar uma biblioteca nas configurações e localizar a seção dos metadados.",
|
||||
"HeaderKodiMetadataHelp": "Para ativar ou desativar metadados, edite uma biblioteca e localize a seção dos metadados.",
|
||||
"HeaderFetcherSettings": "Definições do Pesquisador",
|
||||
"HeaderCastAndCrew": "Elenco e Pessoal",
|
||||
"HeaderAppearsOn": "Presente em",
|
||||
@ -484,7 +484,7 @@
|
||||
"HeaderRecordingPostProcessing": "Pós-Processamento de Gravações",
|
||||
"HeaderRecordingOptions": "Opções de Gravação",
|
||||
"HeaderRecentlyPlayed": "Reproduzido Recentemente",
|
||||
"HeaderProfileServerSettingsHelp": "Estes valores controlam como o Servidor Jellyfin se apresenta a si mesmo ao dispositivo.",
|
||||
"HeaderProfileServerSettingsHelp": "Estes campos controlam como o servidor se apresenta aos clientes.",
|
||||
"HeaderProfileInformation": "Informação do Perfil",
|
||||
"HeaderPreferredMetadataLanguage": "Idioma Preferido dos Metadados",
|
||||
"HeaderPluginInstallation": "Instalar Extensão",
|
||||
@ -733,10 +733,10 @@
|
||||
"ErrorPleaseSelectLineup": "Por favor selecione a programação e tente novamente. Se não houver programações disponíveis, verifique se o seu nome de utilizador, senha e código postal estão correctos.",
|
||||
"ErrorStartHourGreaterThanEnd": "A hora de fim deve ser superior à hora de início.",
|
||||
"ErrorGettingTvLineups": "Ocorreu um erro ao transferir a programação de TV. Por favor, certifique-se que a sua informação está correcta e tente novamente.",
|
||||
"ErrorDeletingItem": "Ocorreu um erro ao apagar o item do Servidor Jellyfin. Por favor, verifique o acesso de escrita do Servidor Jellyfin à pasta e tente de novo.",
|
||||
"ErrorDeletingItem": "Ocorreu um erro ao apagar o item do servidor. Por favor, verifique se o Jellyfin tem accessp de escrita na pasta e tente de novo.",
|
||||
"ErrorAddingXmlTvFile": "Ocorreu um erro ao aceder ao ficheiro XmlTV. Por favor, garanta que o ficheiro está acessível e tente de novo.",
|
||||
"ErrorAddingTunerDevice": "Ocorreu um erro ao adicionar o dispositivo de sintonização. Por favor, garanta que está acessível e tente de novo.",
|
||||
"ErrorAddingMediaPathToVirtualFolder": "Ocorreu um erro ao adicionar a localização dos seus ficheiros. Por favor, assegure-se que o local é valido e que o processo do Jellyfin Server tenha acesso a essa localização.",
|
||||
"ErrorAddingMediaPathToVirtualFolder": "Ocorreu um erro ao adicionar a localização dos seus ficheiros. Por favor, verifique se o caminho é valido e se o Jellyfin tem acesso à localização.",
|
||||
"Episodes": "Episódios",
|
||||
"EndsAtValue": "Termina às {0}",
|
||||
"EnableThemeVideosHelp": "Reproduzir vídeos do tema em plano de fundo durante a navegação pela Biblioteca.",
|
||||
@ -977,7 +977,7 @@
|
||||
"HeaderAudioSettings": "Configurações de Áudio",
|
||||
"HeaderAudioBooks": "Livros de Áudio",
|
||||
"HeaderApp": "Aplicação",
|
||||
"HeaderApiKeysHelp": "As aplicações externas necessitam de uma chave da API para comunicar com o Jellyfin Server. As chaves são emitidas ao entrar com uma conta Jellyfin ou concedendo manualmente a chave à aplicação.",
|
||||
"HeaderApiKeysHelp": "As aplicações externas necessitam de uma chave de API para comunicar com o servidor. As chaves são emitidas ao iniciar sessão com uma conta de utilizador normal ou concedendo manualmente a chave à aplicação.",
|
||||
"HeaderApiKeys": "Chaves da API",
|
||||
"HeaderApiKey": "Chave da API",
|
||||
"HeaderAllowMediaDeletionFrom": "Permitir remoção de multimédia a partir de",
|
||||
@ -1007,7 +1007,7 @@
|
||||
"Genres": "Géneros",
|
||||
"Genre": "Género",
|
||||
"General": "Geral",
|
||||
"Fullscreen": "Ecrã inteiro",
|
||||
"Fullscreen": "Tela inteira",
|
||||
"Friday": "Sexta",
|
||||
"FormatValue": "Formato: {0}",
|
||||
"Folders": "Directórios",
|
||||
@ -1209,5 +1209,9 @@
|
||||
"EnableQuickConnect": "Ativar conexão rápida neste servidor",
|
||||
"EnableDecodingColorDepth10Vp9": "Habilitar decodificação de hardware de 10 bits para VP9",
|
||||
"EnableDecodingColorDepth10Hevc": "Habilitar decodificação de hardware de 10 bits para HEVC",
|
||||
"EnableAutoCast": "Definir como padrão"
|
||||
"EnableAutoCast": "Definir como padrão",
|
||||
"HeaderDeleteDevices": "Apagar Todos os Dispositivos",
|
||||
"Other": "Outros",
|
||||
"DeleteDevicesConfirmation": "Tem a certeza que pretende apagar todos os dispositivos? Todas as sessões serão terminadas e os dispositivos reaparecerão no próximo início de sessão.",
|
||||
"DeleteAll": "Apagar Tudo"
|
||||
}
|
||||
|
@ -1237,7 +1237,7 @@
|
||||
"LabelPlayerDimensions": "Dimensiunile soft redare:",
|
||||
"LabelDroppedFrames": "Cadre abandonate:",
|
||||
"LabelCorruptedFrames": "Cadre corupte:",
|
||||
"OptionForceRemoteSourceTranscoding": "Forțați transcodarea surselor media distante (cum ar fi LiveTV)",
|
||||
"OptionForceRemoteSourceTranscoding": "Forțați transcodarea surselor media distante cum ar fi Live TV",
|
||||
"NoCreatedLibraries": "Se pare că nu ați creat încă biblioteci. {0} Doriți să creați una acum? {1}",
|
||||
"AskAdminToCreateLibrary": "Cereți unui administrator să creeze o bibliotecă.",
|
||||
"PlaybackErrorNoCompatibleStream": "Clientul nu este compatibil cu formatul media, iar serverul nu trimite un format media compatibil.",
|
||||
@ -1418,5 +1418,13 @@
|
||||
"LabelKnownProxies": "Proxyuri cunoscute:",
|
||||
"LabelCurrentStatus": "Stare curentă:",
|
||||
"KnownProxiesHelp": "Lista separată prin virgulă a adreselor IP ale proxy-urilor cunoscute utilizate la conectarea la instanța dvs. Jellyfin. Acest lucru este necesar pentru a utiliza în mod corespunzător antetele X-Forwarded-For. Necesită o repornire după salvare.",
|
||||
"EnableAutoCast": "Setați ca implicit"
|
||||
"EnableAutoCast": "Setați ca implicit",
|
||||
"OptionMaxActiveSessionsHelp": "O valoare 0 va dezactiva opțiunea.",
|
||||
"OptionMaxActiveSessions": "Setează numărul maxim de sesiuni simultane per utilizator.",
|
||||
"OptionAllowContentDownloadHelp": "Utilizatorii pot descărca fișiere media și le pot stoca pe dispozitivele lor. Nu este același lucru cu o caracteristică de sincronizare. Bibliotecile de cărți necesită ca aceasta să fie activată pentru a funcționa corect.",
|
||||
"OptionAllowContentDownload": "Permiteți descărcările media",
|
||||
"LabelUserMaxActiveSessions": "Numărul maxim de sesiuni simultane per utilizator:",
|
||||
"HeaderDeleteDevices": "Șterge Toate Dispozitivele",
|
||||
"DeleteDevicesConfirmation": "Sigur doriți să ștergeți toate dispozitivele? Toate celelalte sesiuni vor fi deconectate. Dispozitivele vor reapărea data viitoare când un utilizator se conectează.",
|
||||
"DeleteAll": "Șterge tot"
|
||||
}
|
||||
|
@ -577,7 +577,7 @@
|
||||
"LabelMaxResumePercentageHelp": "Произведения предполагаются воспроизведёнными полностью, при остановке с данного момента.",
|
||||
"LabelMaxScreenshotsPerItem": "Макс. число снимков экрана на элемент:",
|
||||
"LabelMaxStreamingBitrate": "Макс. качество трансляции:",
|
||||
"LabelMaxStreamingBitrateHelp": "Укажите максимальный битрейт трансляции.",
|
||||
"LabelMaxStreamingBitrateHelp": "Укажите максимальную потоковую скорость трансляции.",
|
||||
"LabelMessageText": "Текст сообщения:",
|
||||
"LabelMessageTitle": "Заголовок сообщения:",
|
||||
"LabelMetadata": "Метаданные:",
|
||||
@ -605,8 +605,8 @@
|
||||
"LabelMoviePrefix": "Префикс фильма:",
|
||||
"LabelMoviePrefixHelp": "При применении к названиям фильмов префикса, введите его здесь, чтобы он правильно обрабатывался на сервере.",
|
||||
"LabelMovieRecordingPath": "Путь к записываемым фильмам:",
|
||||
"LabelMusicStreamingTranscodingBitrate": "Битрейт перекодировки музыки:",
|
||||
"LabelMusicStreamingTranscodingBitrateHelp": "Укажите максимальный битрейт при трансляции музыки.",
|
||||
"LabelMusicStreamingTranscodingBitrate": "Поток. ск-ть перекодировки музыки:",
|
||||
"LabelMusicStreamingTranscodingBitrateHelp": "Укажите максимальный потоковую скорость при трансляции музыки.",
|
||||
"LabelName": "Имя:",
|
||||
"LabelNewName": "Новое название:",
|
||||
"LabelNewPassword": "Новый пароль:",
|
||||
@ -656,8 +656,8 @@
|
||||
"LabelRecordingPathHelp": "Укажите стандартное расположение для сохранения записей. Если поле пусто, то используется папка program data сервера.",
|
||||
"LabelRefreshMode": "Режим обновления:",
|
||||
"LabelReleaseDate": "Дата выпуска:",
|
||||
"LabelRemoteClientBitrateLimit": "Ограничение битрейта интернет-трансляции, Мбит/с:",
|
||||
"LabelRemoteClientBitrateLimitHelp": "Необязательное ограничение битрейта для каждого из сетевых устройств. Может потребоваться, чтобы не допускать использования устройствами большего битрейта, чем способно пропустить интернет-соединение. Может привести к росту загрузки процессора на вашем сервере, так как потребуется динамическое перекодирование видео для снижения битрейта.",
|
||||
"LabelRemoteClientBitrateLimit": "Ограничение потоковой скорости интернет-трансляции, Мбит/с:",
|
||||
"LabelRemoteClientBitrateLimitHelp": "Необязательное ограничение потоковой скорости для любых сетевых устройств. Полезно для предотвращения запроса устройствами большей скорости, чем способно пропустить интернет-соединение. Возможен прирост загрузки процессора на сервере, из-за перекодирования видео в режиме реального времени для понижения скорости.",
|
||||
"LabelRuntimeMinutes": "Длительность:",
|
||||
"LabelSaveLocalMetadata": "Сохранять иллюстрации внутри медиапапок",
|
||||
"LabelSaveLocalMetadataHelp": "При сохранении иллюстраций внутри медиапапок, те помещаются в месте, где их можно легко править.",
|
||||
@ -756,7 +756,7 @@
|
||||
"MediaInfoAnamorphic": "Анаморфность",
|
||||
"MediaInfoAspectRatio": "Соотношение сторон",
|
||||
"MediaInfoBitDepth": "Глубина цвета",
|
||||
"MediaInfoBitrate": "Битрейт",
|
||||
"MediaInfoBitrate": "Поток. ск-ть",
|
||||
"MediaInfoChannels": "Каналы",
|
||||
"MediaInfoCodec": "Кодек",
|
||||
"MediaInfoCodecTag": "Тег кодека",
|
||||
@ -1212,18 +1212,18 @@
|
||||
"LabelPlayer": "Проигрыватель:",
|
||||
"MoreMediaInfo": "О медиаданных",
|
||||
"LabelVideoCodec": "Видео кодек:",
|
||||
"LabelVideoBitrate": "Битрейт видео:",
|
||||
"LabelVideoBitrate": "Поток. ск-ть видео:",
|
||||
"LabelTranscodingProgress": "Прогресс перекодировки:",
|
||||
"LabelTranscodingFramerate": "Частота кадров перекодировки:",
|
||||
"LabelSize": "Размер:",
|
||||
"LabelPlayMethod": "Метод воспроизведения:",
|
||||
"LabelFolder": "Папка:",
|
||||
"LabelBaseUrl": "Базовый URL:",
|
||||
"LabelBitrate": "Битрейт:",
|
||||
"LabelBitrate": "Поток. ск-ть:",
|
||||
"LabelAudioSampleRate": "Частота дискретизации аудио:",
|
||||
"LabelAudioCodec": "Аудио кодек:",
|
||||
"LabelAudioChannels": "Аудио каналы:",
|
||||
"LabelAudioBitrate": "Битрейт аудио:",
|
||||
"LabelAudioBitrate": "Поток. ск-ть аудио:",
|
||||
"LabelAudioBitDepth": "Битовая глубина аудио:",
|
||||
"CopyStreamURL": "Копировать URL потока",
|
||||
"LabelPleaseRestart": "Изменения вступят в силу после перезагрузки веб-клиента вручную.",
|
||||
@ -1412,5 +1412,18 @@
|
||||
"Authorize": "Авторизация",
|
||||
"LabelUserMaxActiveSessions": "Максимальное количество одновременных пользовательских сессий:",
|
||||
"OptionMaxActiveSessionsHelp": "Значение 0 отключит эту функцию.",
|
||||
"OptionMaxActiveSessions": "Устанавливает максимальное количество одновременных пользовательских сеансов."
|
||||
"OptionMaxActiveSessions": "Устанавливает максимальное количество одновременных пользовательских сеансов.",
|
||||
"OptionAllowContentDownload": "Разрешить загрузку медиафайлов",
|
||||
"LabelMaxMuxingQueueSizeHelp": "Максимальное число пакетов, которое возможно буферизовать при ожидании инициализации всех потоков. Попробуйте увеличить его, если всё ещё встречается ошибка «Too many packets buffered for output stream» (Слишком много пакетов буферизовано для выходного потока) в журналах ffmpeg. Рекомендуемое значение - 2048.",
|
||||
"LabelTonemappingParamHelp": "Подстройка алгоритма тонкомпрессии. Значение рекомендуемое и по умолчанию - NaN. Обычно оставляйте это поле пустым.",
|
||||
"LabelTonemappingDesatHelp": "Применяется обесцвечивание для светлых участков, яркость которых превышает этот уровень. Чем выше параметр, тем больше информации о цвете будет сохранено. Этот параметр помогает предотвращать неестественно размытые цвета для сверхсветлых участков, вместо этого (гладко) превращая их в белый. Это делает изображения более естественными за счет сокращения информации о запредельных цветах. Значения рекомендуемое и по умолчанию - 0 и 0.5.",
|
||||
"LabelTonemappingPeakHelp": "Этим значением перекрывается сигнальный/номинальный/эталонный пик. Полезно, когда встроенная информация о пиках в метаданных дисплея ненадёжна или при тонкомпрессии из узкого диапазона в более широкий. Значение рекомендуемое и по умолчанию - 0.",
|
||||
"LabelTonemappingThresholdHelp": "Параметры алгоритма тонкомпрессии подстраиваются для каждой сцены. А порог используется, чтобы определить, изменилась ли сцена или нет. Если дистанция между средней яркостью текущего кадра и текущим скользящим средним превышает пороговое значение, мы пересчитаем среднюю и пиковую яркость сцены. Значения рекомендуемое и по умолчанию - 0.8 и 0.2.",
|
||||
"TonemappingAlgorithmHelp": "Тонкомпрессию можно подстроить. Если вы не уверены с этими параметрами, оставьте значения по умолчанию. Рекомендуемое значение - Reinhard.",
|
||||
"AllowTonemappingHelp": "Тонкомпрессия может преобразовать динамический диапазон видео из HDR в SDR, сохраняя детали изображения и цвета, которые являются очень важной информацией для представления исходной сцены. В настоящее время работает только при перекодировании видео со встроенными метаданными HDR10 или HLG. Если воспроизведение не плавное или не удаётся, отключите соответствующий аппаратный декодер.",
|
||||
"LabelOpenclDeviceHelp": "Это устройство OpenCL, которое используется для тонкомпрессии. Слева от точки - номер платформы, а справа - это номер устройства на платформе. Значение по умолчанию - 0.0. Требуется файл приложения ffmpeg, содержащий метод аппаратного ускорения OpenCL.",
|
||||
"OptionAllowContentDownloadHelp": "Пользователи могут загружать медиафайлы и хранить их на своих устройствах. Это не то же самое, как функция синхронизации. Для правильной работы книжных медиатек это необходимо.",
|
||||
"HeaderDeleteDevices": "Удалить все устройства",
|
||||
"DeleteDevicesConfirmation": "Вы уверены, что хотите удалить все устройства? Все остальные сеансы будут отключены. Устройства снова появятся, когда пользователь войдет в систему.",
|
||||
"DeleteAll": "Удалить все"
|
||||
}
|
||||
|
@ -74,7 +74,7 @@
|
||||
"Folders": "Mape",
|
||||
"Genres": "Zvrsti",
|
||||
"HeaderAlbumArtists": "Izvajalci albuma",
|
||||
"HeaderContinueWatching": "Nadaljuj gledanje",
|
||||
"HeaderContinueWatching": "Nadaljuj z ogledom",
|
||||
"Movies": "Filmi",
|
||||
"AllowedRemoteAddressesHelp": "Z vejico ločen seznam IP naslovov ali IP/maska omrežij, ki jim je dovoljen oddaljeni dostop. Če pustite prazno, bodo dovoljeni vsi oddaljeni naslovi.",
|
||||
"AlwaysPlaySubtitles": "Vedno prikaži",
|
||||
@ -203,7 +203,7 @@
|
||||
"CopyStreamURL": "Kopiraj URL pretakanja",
|
||||
"ButtonSubmit": "Pošli",
|
||||
"ButtonAddImage": "Dodaj sliko",
|
||||
"ValueSpecialEpisodeName": "Poseben - {0}",
|
||||
"ValueSpecialEpisodeName": "Posebna - {0}",
|
||||
"Shows": "Serije",
|
||||
"DoNotRecord": "Ne snemaj",
|
||||
"DisplayModeHelp": "Izberite želeno razporeditev uporabniškega vmesnika.",
|
||||
|
@ -860,7 +860,7 @@
|
||||
"OptionPlainStorageFolders": "Visa alla mappar som vanliga lagringsmappar",
|
||||
"OptionPlainStorageFoldersHelp": "Alla mappar representeras i DIDL som \"object.container.storageFolder\" i stället för en mer specifik typ, t.ex. \"object.container.person.musicArtist\".",
|
||||
"OptionPlainVideoItems": "Visa alla videor som objekt utan specifikt format",
|
||||
"OptionPlainVideoItemsHelp": "Alla videor representeras i DIDL som \"object.item.videoItem\" i stället för en mer specifik typ, t ex \"object.item.videoItem.movie\".",
|
||||
"OptionPlainVideoItemsHelp": "Alla videor representeras i DIDL som \"object.item.videoItem\" i stället för en mer specifik typ, t ex \"object.item.videoItem.movie\".",
|
||||
"OptionPlayCount": "Antal visningar",
|
||||
"OptionPremiereDate": "Premiärdatum",
|
||||
"OptionProtocolHls": "Live-strömning via Http",
|
||||
@ -1185,7 +1185,7 @@
|
||||
"SaveSubtitlesIntoMediaFoldersHelp": "Spara undertexter vid video filer kommer göra det mer enklare att hantera.",
|
||||
"Rewind": "Spola tillbaka",
|
||||
"MessageChangeRecordingPath": "Ändring av din inspelnings mapp kommer inte migrera existerande inspelningar från gamla platsen till den nya. Du behöver flytta dom manuellt om så önskas.",
|
||||
"PlaybackData": "Uppspelnings Data",
|
||||
"PlaybackData": "Uppspelningsdata",
|
||||
"PasswordResetProviderHelp": "Välj en tjänst för återställning av lösenord, som används när denna användare begär en lösenordsåterställning.",
|
||||
"OptionSaveMetadataAsHiddenHelp": "Denna ändring påverkar ny metadata som sparas framledes. Existerande metadata-filer kommer att uppdateras nästa gång de sparas av servern.",
|
||||
"OptionResElement": "återskapa element",
|
||||
@ -1198,7 +1198,7 @@
|
||||
"OptionIsSD": "SD",
|
||||
"OptionIsHD": "HD",
|
||||
"OptionCaptionInfoExSamsung": "CaptionInfoEx (Samsung)",
|
||||
"OptionForceRemoteSourceTranscoding": "Tvinga omkodning på fjärr media källor (som LiveTV)",
|
||||
"OptionForceRemoteSourceTranscoding": "Tvinga omkodning på utomstående mediakällor, som t.ex. live-TV",
|
||||
"Option3D": "3D",
|
||||
"Normal": "Normal",
|
||||
"NoCreatedLibraries": "Ser ut som du inte har skapat några bibliotek än. {0}Vill du skapa ett nu?{1}",
|
||||
@ -1317,7 +1317,7 @@
|
||||
"StopPlayback": "Stoppa uppspelning",
|
||||
"ButtonPlayer": "Spelare",
|
||||
"ButtonCast": "Roller",
|
||||
"EnableBlurHashHelp": "Bilder som fortfarande laddas kommer visas med en suddig platshållare",
|
||||
"EnableBlurHashHelp": "Bilder som fortfarande laddas kommer visas med en unik platshållare.",
|
||||
"EnableBlurHash": "Aktivera suddiga platshållare för bilder",
|
||||
"Writers": "Skribenter",
|
||||
"ViewAlbumArtist": "Visa albums artist",
|
||||
@ -1389,5 +1389,22 @@
|
||||
"Restart": "Starta om",
|
||||
"ResetPassword": "Återställ lösenord",
|
||||
"QuickConnectNotActive": "Snabbanslutning är inte aktiverat på denna server",
|
||||
"QuickConnectNotAvailable": "Be din serveradministratör aktivera snabbanslutning"
|
||||
"QuickConnectNotAvailable": "Be din serveradministratör aktivera snabbanslutning",
|
||||
"LabelColorPrimaries": "Färgprimärer:",
|
||||
"LabelColorTransfer": "Färgöverföring:",
|
||||
"LabelColorSpace": "Färgrymd:",
|
||||
"LabelVideoRange": "Video-omfång:",
|
||||
"MediaInfoColorPrimaries": "Färgprimärer",
|
||||
"MediaInfoColorTransfer": "Färgöverföring",
|
||||
"MediaInfoColorSpace": "Färgrymd",
|
||||
"MediaInfoVideoRange": "Video-omfång",
|
||||
"Bwdif": "BWDIF",
|
||||
"VideoAudio": "Video Ljud",
|
||||
"UseDoubleRateDeinterlacing": "Dubbla frameraten vid deinterlacing",
|
||||
"PlaybackRate": "Uppspelningshastighet",
|
||||
"OptionAllowContentDownloadHelp": "Användare kan ladda ner media och lagra på deras enheter. Detta är inte det samma som synkfunktion. Bokbibliotek kräver att detta är påslaget för att fungera korrekt.",
|
||||
"OptionAllowContentDownload": "Tillåt nedladdning av media",
|
||||
"HeaderDeleteDevices": "Radera alla enheter",
|
||||
"DeleteDevicesConfirmation": "Är du säker på att du vill radera alla enheter? Alla andra sessioner kommer loggas ut. Enheter visas igen nästa gång en användare loggar in.",
|
||||
"DeleteAll": "Radera alla"
|
||||
}
|
||||
|
@ -1016,7 +1016,7 @@
|
||||
"OptionAllowLinkSharing": "சமூக ஊடக பகிர்வை அனுமதிக்கவும்",
|
||||
"OptionAllowContentDownloading": "மீடியா பதிவிறக்க மற்றும் ஒத்திசைக்க அனுமதிக்கவும்",
|
||||
"OptionAllowBrowsingLiveTv": "நேரடி தொலைக்காட்சி அணுகலை அனுமதிக்கவும்",
|
||||
"OptionForceRemoteSourceTranscoding": "தொலைநிலை ஊடக மூலங்களின் டிரான்ஸ்கோடிங்கை கட்டாயப்படுத்தவும் (லைடிவி போன்றவை)",
|
||||
"OptionForceRemoteSourceTranscoding": "லைவ் டிவி போன்ற தொலைநிலை ஊடக ஆதாரங்களின் டிரான்ஸ்கோடிங்கை கட்டாயப்படுத்துங்கள்",
|
||||
"OptionAllowAudioPlaybackTranscoding": "டிரான்ஸ்கோடிங் தேவைப்படும் ஆடியோ பிளேபேக்கை அனுமதிக்கவும்",
|
||||
"OptionAllUsers": "அனைத்து பயனாளர்கள்",
|
||||
"OptionAdminUsers": "நிர்வாகிகள்",
|
||||
@ -1435,5 +1435,10 @@
|
||||
"EnableAutoCast": "இயல்புநிலைக்கு அமை",
|
||||
"OptionMaxActiveSessionsHelp": "0 இன் மதிப்பு அம்சத்தை முடக்கும்.",
|
||||
"OptionMaxActiveSessions": "ஒரே நேரத்தில் பயனர் அமர்வுகளின் அதிகபட்ச எண்ணிக்கையை அமைக்கிறது.",
|
||||
"LabelUserMaxActiveSessions": "ஒரே நேரத்தில் பயனர் அமர்வுகளின் அதிகபட்ச எண்ணிக்கை:"
|
||||
"LabelUserMaxActiveSessions": "ஒரே நேரத்தில் பயனர் அமர்வுகளின் அதிகபட்ச எண்ணிக்கை:",
|
||||
"OptionAllowContentDownloadHelp": "பயனர்கள் மீடியாவை பதிவிறக்கம் செய்து தங்கள் சாதனங்களில் சேமிக்கலாம். இது ஒத்திசைவு அம்சத்திற்கு சமமானதல்ல. புத்தக நூலகங்களுக்கு இது சரியாக இயங்க வேண்டும்.",
|
||||
"OptionAllowContentDownload": "மீடியா பதிவிறக்கங்களை அனுமதிக்கவும்",
|
||||
"HeaderDeleteDevices": "எல்லா சாதனங்களையும் நீக்கு",
|
||||
"DeleteDevicesConfirmation": "எல்லா சாதனங்களையும் நீக்க விரும்புகிறீர்களா? மற்ற அனைத்து அமர்வுகளும் வெளியேற்றப்படும். ஒரு பயனர் அடுத்த முறை உள்நுழையும்போது சாதனங்கள் மீண்டும் தோன்றும்.",
|
||||
"DeleteAll": "அனைத்தையும் நீக்கு"
|
||||
}
|
||||
|
@ -177,7 +177,7 @@
|
||||
"ButtonEditOtherUserPreferences": "Bu kullanıcının profilini, resmini ve kişisel tercihlerini düzenleyin.",
|
||||
"ButtonForgotPassword": "Şifremi unuttum",
|
||||
"ButtonFullscreen": "Tam Ekran",
|
||||
"Collections": "Koleksiyonlar",
|
||||
"Collections": "Koleksiyon",
|
||||
"Favorites": "Favoriler",
|
||||
"Folders": "Klasörler",
|
||||
"Genres": "Türler",
|
||||
|
@ -1422,5 +1422,8 @@
|
||||
"OptionMaxActiveSessions": "Đặt số lượng phiên người dùng đồng thời tối đa.",
|
||||
"LabelUserMaxActiveSessions": "Số lượng phiên người dùng cùng lúc tối đa:",
|
||||
"OptionAllowContentDownloadHelp": "Người dùng có thể tải xuống phương tiện và lưu trữ trên thiết bị của họ. Điều này không giống như một tính năng đồng bộ hóa. Thư viện sách yêu cầu kích hoạt này để hoạt động bình thường.",
|
||||
"OptionAllowContentDownload": "Cho phép tải xuống phương tiện"
|
||||
"OptionAllowContentDownload": "Cho phép tải xuống phương tiện",
|
||||
"HeaderDeleteDevices": "Xóa Tất Cả Thiết Bị",
|
||||
"DeleteDevicesConfirmation": "Bạn có chắc muốn xóa hết các thiết bị không? Tất cả các phiên khác sẽ được đăng xuất. Thiết bị sẽ xuất hiện lại vào lần tiếp theo khi người dùng đăng nhập.",
|
||||
"DeleteAll": "Xóa Hết"
|
||||
}
|
||||
|
@ -1237,7 +1237,7 @@
|
||||
"SelectAdminUsername": "请为管理员账户选择一个用户名。",
|
||||
"HeaderNavigation": "导航",
|
||||
"MessageConfirmAppExit": "你要退出吗?",
|
||||
"OptionForceRemoteSourceTranscoding": "强制远程转码(像电视直播一样)",
|
||||
"OptionForceRemoteSourceTranscoding": "强制对直播电视等远程媒体源进行转码",
|
||||
"NoCreatedLibraries": "看上去您还未创建任何资料库。{0} 您想现在创建一个吗? {1}",
|
||||
"AskAdminToCreateLibrary": "请联系管理员以创建一个新的资料库。",
|
||||
"PlaybackErrorNoCompatibleStream": "该客户端与媒体不兼容,服务器未发送兼容的媒体格式。",
|
||||
@ -1420,5 +1420,10 @@
|
||||
"EnableAutoCast": "设置为默认",
|
||||
"OptionMaxActiveSessionsHelp": "如果值为0则没有限制。",
|
||||
"OptionMaxActiveSessions": "设置用户同时进行会话的最大数量。",
|
||||
"LabelUserMaxActiveSessions": "用户同时进行会话的最大数量:"
|
||||
"LabelUserMaxActiveSessions": "用户同时进行会话的最大数量:",
|
||||
"OptionAllowContentDownloadHelp": "用户可以下载媒体并将其存储在他们的设备上。 这与同步功能不同。 图书库要求启用此功能才能正常运行。",
|
||||
"OptionAllowContentDownload": "允许媒体下载",
|
||||
"HeaderDeleteDevices": "删除所有设备",
|
||||
"DeleteDevicesConfirmation": "您确定要删除所有设备吗?所有其他会话将被注销。用户下次登录时,设备会重新出现。",
|
||||
"DeleteAll": "删除全部"
|
||||
}
|
||||
|
@ -12,7 +12,8 @@ const Assets = [
|
||||
'libass-wasm/dist/js/subtitles-octopus-worker.wasm',
|
||||
'libass-wasm/dist/js/subtitles-octopus-worker-legacy.js',
|
||||
'libass-wasm/dist/js/subtitles-octopus-worker-legacy.data',
|
||||
'libass-wasm/dist/js/subtitles-octopus-worker-legacy.js.mem'
|
||||
'libass-wasm/dist/js/subtitles-octopus-worker-legacy.js.mem',
|
||||
'pdfjs-dist/build/pdf.worker.js'
|
||||
];
|
||||
|
||||
const LibarchiveWasm = [
|
||||
|
235
yarn.lock
235
yarn.lock
@ -861,10 +861,10 @@
|
||||
resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7"
|
||||
integrity sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==
|
||||
|
||||
"@eslint/eslintrc@^0.2.0":
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.0.tgz#bc7e3c4304d4c8720968ccaee793087dfb5fe6b4"
|
||||
integrity sha512-+cIGPCBdLCzqxdtwppswP+zTsH9BOIGzAeKfBIbtb4gW/giMlfMwP0HUSFfhzh20f9u8uZ8hOp62+4GPquTbwQ==
|
||||
"@eslint/eslintrc@^0.2.1":
|
||||
version "0.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.2.1.tgz#f72069c330461a06684d119384435e12a5d76e3c"
|
||||
integrity sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==
|
||||
dependencies:
|
||||
ajv "^6.12.4"
|
||||
debug "^4.1.1"
|
||||
@ -2496,6 +2496,11 @@ chownr@^1.1.1:
|
||||
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
|
||||
integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
|
||||
|
||||
chownr@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
|
||||
integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
|
||||
|
||||
chrome-trace-event@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
|
||||
@ -3005,7 +3010,7 @@ cross-spawn@^6.0.0:
|
||||
shebang-command "^1.2.0"
|
||||
which "^1.2.9"
|
||||
|
||||
cross-spawn@^7.0.2:
|
||||
cross-spawn@^7.0.2, cross-spawn@^7.0.3:
|
||||
version "7.0.3"
|
||||
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
|
||||
integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
|
||||
@ -3842,7 +3847,7 @@ enhanced-resolve@^4.3.0:
|
||||
memory-fs "^0.5.0"
|
||||
tapable "^1.0.0"
|
||||
|
||||
enhanced-resolve@^5.3.0:
|
||||
enhanced-resolve@^5.3.1:
|
||||
version "5.3.1"
|
||||
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.3.1.tgz#3f988d0d7775bdc2d96ede321dc81f8249492f57"
|
||||
integrity sha512-G1XD3MRGrGfNcf6Hg0LVZG7GIKcYkbfHa5QMxt1HDUTdYoXH0JR1xXyg+MaKLF73E9A27uWNVxvFivNRYeUB6w==
|
||||
@ -3867,6 +3872,11 @@ entities@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4"
|
||||
integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==
|
||||
|
||||
env-paths@^2.2.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43"
|
||||
integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==
|
||||
|
||||
epubjs@^0.3.85:
|
||||
version "0.3.88"
|
||||
resolved "https://registry.yarnpkg.com/epubjs/-/epubjs-0.3.88.tgz#bc365e7e21893cf2d92717ce10927c1071275347"
|
||||
@ -4108,13 +4118,13 @@ eslint-visitor-keys@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
|
||||
integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
|
||||
|
||||
eslint@^7.12.0:
|
||||
version "7.12.0"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.12.0.tgz#7b6a85f87a9adc239e979bb721cde5ce0dc27da6"
|
||||
integrity sha512-n5pEU27DRxCSlOhJ2rO57GDLcNsxO0LPpAbpFdh7xmcDmjmlGUfoyrsB3I7yYdQXO5N3gkSTiDrPSPNFiiirXA==
|
||||
eslint@^7.12.1:
|
||||
version "7.12.1"
|
||||
resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.12.1.tgz#bd9a81fa67a6cfd51656cdb88812ce49ccec5801"
|
||||
integrity sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg==
|
||||
dependencies:
|
||||
"@babel/code-frame" "^7.0.0"
|
||||
"@eslint/eslintrc" "^0.2.0"
|
||||
"@eslint/eslintrc" "^0.2.1"
|
||||
ajv "^6.10.0"
|
||||
chalk "^4.0.0"
|
||||
cross-spawn "^7.0.2"
|
||||
@ -4481,10 +4491,10 @@ file-entry-cache@^5.0.1:
|
||||
dependencies:
|
||||
flat-cache "^2.0.1"
|
||||
|
||||
file-loader@^6.1.1:
|
||||
version "6.1.1"
|
||||
resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.1.1.tgz#a6f29dfb3f5933a1c350b2dbaa20ac5be0539baa"
|
||||
integrity sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==
|
||||
file-loader@^6.2.0:
|
||||
version "6.2.0"
|
||||
resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d"
|
||||
integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==
|
||||
dependencies:
|
||||
loader-utils "^2.0.0"
|
||||
schema-utils "^3.0.0"
|
||||
@ -4767,6 +4777,13 @@ fs-extra@3.0.1:
|
||||
jsonfile "^3.0.0"
|
||||
universalify "^0.1.0"
|
||||
|
||||
fs-minipass@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
|
||||
integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==
|
||||
dependencies:
|
||||
minipass "^3.0.0"
|
||||
|
||||
fs-mkdirp-stream@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb"
|
||||
@ -5178,7 +5195,7 @@ got@^8.3.1:
|
||||
url-parse-lax "^3.0.0"
|
||||
url-to-options "^1.0.1"
|
||||
|
||||
graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.2, graceful-fs@^4.2.4:
|
||||
graceful-fs@4.X, graceful-fs@^4.0.0, graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.2, graceful-fs@^4.2.3, graceful-fs@^4.2.4:
|
||||
version "4.2.4"
|
||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
|
||||
integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
|
||||
@ -5349,10 +5366,10 @@ gulp-sourcemaps@^2.6.5:
|
||||
strip-bom-string "1.X"
|
||||
through2 "2.X"
|
||||
|
||||
gulp-terser@^1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/gulp-terser/-/gulp-terser-1.4.0.tgz#0ac4dfdbed4ab46906007c5b358810c1642b9764"
|
||||
integrity sha512-7df9leJna3WOmj76tYHxjpn7BSU+vmKVjVSd6bz3uLEyrzCfZI97KPhRcIabrSNzs0UY/UXTt+JwkxPw3sF85w==
|
||||
gulp-terser@^1.4.1:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.yarnpkg.com/gulp-terser/-/gulp-terser-1.4.1.tgz#06b30023889b149bdbbdd49fada31b233fe737df"
|
||||
integrity sha512-VUoKrk24G0ojr7fXqlZ7vA8qDFHRloYAM6doNRyKdJ/LFkj+X3P04f+7LlOp7j05WtdOCEg65oG6nGjSf//78A==
|
||||
dependencies:
|
||||
is-promise "^4.0.0"
|
||||
plugin-error "^1.0.1"
|
||||
@ -6412,10 +6429,6 @@ jellyfin-apiclient@^1.4.2:
|
||||
resolved "https://registry.yarnpkg.com/jellyfin-apiclient/-/jellyfin-apiclient-1.4.2.tgz#0a7ab7b371380cfb1bc9789204439b8dfdcdbafd"
|
||||
integrity sha512-xUvt1G0cDlam6hJgC5Jr6EE5botzdEMGxeer3Vm0+zhM7nb8iFnRmQRmTpVbXtYS8NLiHsiUmK1RLlelgtWDYg==
|
||||
|
||||
"jellyfin-noto@https://github.com/jellyfin/jellyfin-noto":
|
||||
version "1.0.3"
|
||||
resolved "https://github.com/jellyfin/jellyfin-noto#b784602db063734c721a46563ae5d6577ec2b35d"
|
||||
|
||||
jest-worker@^26.6.1:
|
||||
version "26.6.1"
|
||||
resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.1.tgz#c2ae8cde6802cc14056043f997469ec170d9c32a"
|
||||
@ -7372,6 +7385,21 @@ minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
|
||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
|
||||
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
|
||||
|
||||
minipass@^3.0.0:
|
||||
version "3.1.3"
|
||||
resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd"
|
||||
integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==
|
||||
dependencies:
|
||||
yallist "^4.0.0"
|
||||
|
||||
minizlib@^2.1.1:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
|
||||
integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==
|
||||
dependencies:
|
||||
minipass "^3.0.0"
|
||||
yallist "^4.0.0"
|
||||
|
||||
mississippi@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
|
||||
@ -7408,6 +7436,11 @@ mixin-deep@^1.2.0:
|
||||
dependencies:
|
||||
minimist "^1.2.5"
|
||||
|
||||
mkdirp@^1.0.3:
|
||||
version "1.0.4"
|
||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
|
||||
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
|
||||
|
||||
move-concurrently@^1.0.1:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
|
||||
@ -7546,6 +7579,22 @@ node-gyp@^3.8.0:
|
||||
tar "^2.0.0"
|
||||
which "1"
|
||||
|
||||
node-gyp@^7.1.0:
|
||||
version "7.1.2"
|
||||
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-7.1.2.tgz#21a810aebb187120251c3bcec979af1587b188ae"
|
||||
integrity sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==
|
||||
dependencies:
|
||||
env-paths "^2.2.0"
|
||||
glob "^7.1.4"
|
||||
graceful-fs "^4.2.3"
|
||||
nopt "^5.0.0"
|
||||
npmlog "^4.1.2"
|
||||
request "^2.88.2"
|
||||
rimraf "^3.0.2"
|
||||
semver "^7.3.2"
|
||||
tar "^6.0.2"
|
||||
which "^2.0.2"
|
||||
|
||||
node-libs-browser@^2.2.1:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
|
||||
@ -7580,29 +7629,6 @@ node-releases@^1.1.61:
|
||||
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.61.tgz#707b0fca9ce4e11783612ba4a2fcba09047af16e"
|
||||
integrity sha512-DD5vebQLg8jLCOzwupn954fbIiZht05DAZs0k2u8NStSe6h9XdsuIQL8hSRKYiU8WUQRznmSDrKGbv3ObOmC7g==
|
||||
|
||||
node-sass@^4.13.1:
|
||||
version "4.14.1"
|
||||
resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.1.tgz#99c87ec2efb7047ed638fb4c9db7f3a42e2217b5"
|
||||
integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==
|
||||
dependencies:
|
||||
async-foreach "^0.1.3"
|
||||
chalk "^1.1.1"
|
||||
cross-spawn "^3.0.0"
|
||||
gaze "^1.0.0"
|
||||
get-stdin "^4.0.1"
|
||||
glob "^7.0.3"
|
||||
in-publish "^2.0.0"
|
||||
lodash "^4.17.15"
|
||||
meow "^3.7.0"
|
||||
mkdirp "^0.5.1"
|
||||
nan "^2.13.2"
|
||||
node-gyp "^3.8.0"
|
||||
npmlog "^4.0.0"
|
||||
request "^2.88.0"
|
||||
sass-graph "2.2.5"
|
||||
stdout-stream "^1.4.0"
|
||||
"true-case-path" "^1.0.2"
|
||||
|
||||
node-sass@^4.8.3:
|
||||
version "4.14.0"
|
||||
resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.14.0.tgz#a8e9d7720f8e15b4a1072719dcf04006f5648eeb"
|
||||
@ -7626,6 +7652,28 @@ node-sass@^4.8.3:
|
||||
stdout-stream "^1.4.0"
|
||||
"true-case-path" "^1.0.2"
|
||||
|
||||
node-sass@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-5.0.0.tgz#4e8f39fbef3bac8d2dc72ebe3b539711883a78d2"
|
||||
integrity sha512-opNgmlu83ZCF792U281Ry7tak9IbVC+AKnXGovcQ8LG8wFaJv6cLnRlc6DIHlmNxWEexB5bZxi9SZ9JyUuOYjw==
|
||||
dependencies:
|
||||
async-foreach "^0.1.3"
|
||||
chalk "^1.1.1"
|
||||
cross-spawn "^7.0.3"
|
||||
gaze "^1.0.0"
|
||||
get-stdin "^4.0.1"
|
||||
glob "^7.0.3"
|
||||
lodash "^4.17.15"
|
||||
meow "^3.7.0"
|
||||
mkdirp "^0.5.1"
|
||||
nan "^2.13.2"
|
||||
node-gyp "^7.1.0"
|
||||
npmlog "^4.0.0"
|
||||
request "^2.88.0"
|
||||
sass-graph "2.2.5"
|
||||
stdout-stream "^1.4.0"
|
||||
"true-case-path" "^1.0.2"
|
||||
|
||||
"nopt@2 || 3":
|
||||
version "3.0.6"
|
||||
resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
|
||||
@ -7633,6 +7681,13 @@ node-sass@^4.8.3:
|
||||
dependencies:
|
||||
abbrev "1"
|
||||
|
||||
nopt@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"
|
||||
integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==
|
||||
dependencies:
|
||||
abbrev "1"
|
||||
|
||||
normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0:
|
||||
version "2.5.0"
|
||||
resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
|
||||
@ -7701,7 +7756,7 @@ npm-run-path@^2.0.0:
|
||||
dependencies:
|
||||
path-key "^2.0.0"
|
||||
|
||||
"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0:
|
||||
"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.1.2:
|
||||
version "4.1.2"
|
||||
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
|
||||
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
|
||||
@ -8315,6 +8370,11 @@ pbkdf2@^3.0.3:
|
||||
safe-buffer "^5.0.1"
|
||||
sha.js "^2.4.8"
|
||||
|
||||
pdfjs-dist@2.5.207:
|
||||
version "2.5.207"
|
||||
resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-2.5.207.tgz#b5e8c19627be64269cd3fb6df3eaaf45ddffe7b6"
|
||||
integrity sha512-xGDUhnCYPfHy+unMXCLCJtlpZaaZ17Ew3WIL0tnSgKFUZXHAPD49GO9xScyszSsQMoutNDgRb+rfBXIaX/lJbw==
|
||||
|
||||
pend@~1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
|
||||
@ -9784,7 +9844,7 @@ replace-homedir@^1.0.0:
|
||||
is-absolute "^1.0.0"
|
||||
remove-trailing-separator "^1.1.0"
|
||||
|
||||
request@^2.87.0, request@^2.88.0:
|
||||
request@^2.87.0, request@^2.88.0, request@^2.88.2:
|
||||
version "2.88.2"
|
||||
resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
|
||||
integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
|
||||
@ -11121,10 +11181,10 @@ svgo@^1.0.0, svgo@^1.3.2:
|
||||
unquote "~1.1.1"
|
||||
util.promisify "~1.0.0"
|
||||
|
||||
swiper@^6.3.4:
|
||||
version "6.3.4"
|
||||
resolved "https://registry.yarnpkg.com/swiper/-/swiper-6.3.4.tgz#94bebb39437825d303afd19d9f28927fa943e5f2"
|
||||
integrity sha512-6XWBJCAjOTQd3yVVZO9y47B007QPeiCcn/pm9OkueVLpYNWZBAXpoX0P8JaGch/bzcaH3oXteWCj5KC8R3AloA==
|
||||
swiper@^6.3.5:
|
||||
version "6.3.5"
|
||||
resolved "https://registry.yarnpkg.com/swiper/-/swiper-6.3.5.tgz#7444b680d0fdafe84859825ac3559b5b01bd1916"
|
||||
integrity sha512-MZkkVJ+sXukp6G3Z3BlKayhBjRIQuO1TZaTlH7ooI/0qbH0kkmItFMjFo19nOOsJaDXglA32xqyc9KCtmbJv0w==
|
||||
dependencies:
|
||||
dom7 "^3.0.0-alpha.7"
|
||||
ssr-window "^3.0.0-alpha.4"
|
||||
@ -11186,6 +11246,18 @@ tar@^2.0.0:
|
||||
fstream "^1.0.12"
|
||||
inherits "2"
|
||||
|
||||
tar@^6.0.2:
|
||||
version "6.0.5"
|
||||
resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.5.tgz#bde815086e10b39f1dcd298e89d596e1535e200f"
|
||||
integrity sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==
|
||||
dependencies:
|
||||
chownr "^2.0.0"
|
||||
fs-minipass "^2.0.0"
|
||||
minipass "^3.0.0"
|
||||
minizlib "^2.1.1"
|
||||
mkdirp "^1.0.3"
|
||||
yallist "^4.0.0"
|
||||
|
||||
temp-dir@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
|
||||
@ -11224,10 +11296,10 @@ terser-webpack-plugin@^1.4.3:
|
||||
webpack-sources "^1.4.0"
|
||||
worker-farm "^1.7.0"
|
||||
|
||||
terser-webpack-plugin@^5.0.0:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.0.1.tgz#b1f02e43d93ca61a0bdd9e870f4e3489e12a6c9b"
|
||||
integrity sha512-EwUe+XDTFf/2cAlmAlZZ7vRpNKMZUAypX2kIRm0Fmjlz4l7SqbI/VabmgiesNZW2nq/LR0N7ku/wlTQ6ygen0w==
|
||||
terser-webpack-plugin@^5.0.3:
|
||||
version "5.0.3"
|
||||
resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz#ec60542db2421f45735c719d2e17dabfbb2e3e42"
|
||||
integrity sha512-zFdGk8Lh9ZJGPxxPE6jwysOlATWB8GMW8HcfGULWA/nPal+3VdATflQvSBSLQJRCmYZnfFJl6vkRTiwJGNgPiQ==
|
||||
dependencies:
|
||||
jest-worker "^26.6.1"
|
||||
p-limit "^3.0.2"
|
||||
@ -11236,16 +11308,7 @@ terser-webpack-plugin@^5.0.0:
|
||||
source-map "^0.6.1"
|
||||
terser "^5.3.8"
|
||||
|
||||
terser@>=4, terser@^4.1.2, terser@^4.6.3:
|
||||
version "4.8.0"
|
||||
resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
|
||||
integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
|
||||
dependencies:
|
||||
commander "^2.20.0"
|
||||
source-map "~0.6.1"
|
||||
source-map-support "~0.5.12"
|
||||
|
||||
terser@^5.3.8:
|
||||
terser@>=4, terser@^5.3.8:
|
||||
version "5.3.8"
|
||||
resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.8.tgz#991ae8ba21a3d990579b54aa9af11586197a75dd"
|
||||
integrity sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ==
|
||||
@ -11254,6 +11317,15 @@ terser@^5.3.8:
|
||||
source-map "~0.7.2"
|
||||
source-map-support "~0.5.19"
|
||||
|
||||
terser@^4.1.2, terser@^4.6.3:
|
||||
version "4.8.0"
|
||||
resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
|
||||
integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
|
||||
dependencies:
|
||||
commander "^2.20.0"
|
||||
source-map "~0.6.1"
|
||||
source-map-support "~0.5.12"
|
||||
|
||||
text-table@^0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
|
||||
@ -12133,10 +12205,10 @@ webpack-sources@^1.4.0, webpack-sources@^1.4.1:
|
||||
source-list-map "^2.0.0"
|
||||
source-map "~0.6.1"
|
||||
|
||||
webpack-sources@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.0.1.tgz#1467f6e692ddce91e88b8044c44347b1087bbd4f"
|
||||
integrity sha512-A9oYz7ANQBK5EN19rUXbvNgfdfZf5U2gP0769OXsj9CvYkCR6OHOsd6OKyEy4H38GGxpsQPKIL83NC64QY6Xmw==
|
||||
webpack-sources@^2.1.1:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.2.0.tgz#058926f39e3d443193b6c31547229806ffd02bac"
|
||||
integrity sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==
|
||||
dependencies:
|
||||
source-list-map "^2.0.1"
|
||||
source-map "^0.6.1"
|
||||
@ -12185,10 +12257,10 @@ webpack@^4.26.1:
|
||||
watchpack "^1.7.4"
|
||||
webpack-sources "^1.4.1"
|
||||
|
||||
webpack@^5.2.0:
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.2.0.tgz#02f22466b79751a80a50f20f027a716e296b3ef5"
|
||||
integrity sha512-evtOjOJQq3zaHJIWsJjM4TGtNHtSrNVAIyQ+tdPW/fRd+4PLGbUG6S3xt+N4+QwDBOaCVd0xCWiHd4R6lWO5DQ==
|
||||
webpack@^5.3.2:
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.3.2.tgz#f88f6f2c54eaa1f68c8f37d8984657eaf68b00f0"
|
||||
integrity sha512-DXsfHoI6lQAR3KnQh7+FsRfs9fs+TEvzXCA35UbKv4kVuzslg7QCMAcpFRZNDMjdtm9N/PoO54XEzGN9TeacQg==
|
||||
dependencies:
|
||||
"@types/eslint-scope" "^3.7.0"
|
||||
"@types/estree" "^0.0.45"
|
||||
@ -12199,7 +12271,7 @@ webpack@^5.2.0:
|
||||
acorn "^8.0.4"
|
||||
browserslist "^4.14.5"
|
||||
chrome-trace-event "^1.0.2"
|
||||
enhanced-resolve "^5.3.0"
|
||||
enhanced-resolve "^5.3.1"
|
||||
eslint-scope "^5.1.1"
|
||||
events "^3.2.0"
|
||||
glob-to-regexp "^0.4.1"
|
||||
@ -12211,9 +12283,9 @@ webpack@^5.2.0:
|
||||
pkg-dir "^4.2.0"
|
||||
schema-utils "^3.0.0"
|
||||
tapable "^2.0.0"
|
||||
terser-webpack-plugin "^5.0.0"
|
||||
terser-webpack-plugin "^5.0.3"
|
||||
watchpack "^2.0.0"
|
||||
webpack-sources "^2.0.1"
|
||||
webpack-sources "^2.1.1"
|
||||
|
||||
webworkify@^1.5.0:
|
||||
version "1.5.0"
|
||||
@ -12242,7 +12314,7 @@ which@1, which@^1.2.14, which@^1.2.9, which@^1.3.1:
|
||||
dependencies:
|
||||
isexe "^2.0.0"
|
||||
|
||||
which@^2.0.1:
|
||||
which@^2.0.1, which@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
|
||||
integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
|
||||
@ -12384,6 +12456,11 @@ yallist@^3.0.2:
|
||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
|
||||
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
|
||||
|
||||
yallist@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
|
||||
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
|
||||
|
||||
yaml@^1.10.0:
|
||||
version "1.10.0"
|
||||
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e"
|
||||
|
Loading…
Reference in New Issue
Block a user