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

Merge remote-tracking branch 'upstream/master' into translate-everything

This commit is contained in:
ferferga 2020-03-26 13:55:00 +01:00
commit 3543a60b8b
53 changed files with 1287 additions and 1116 deletions

View file

@ -3,6 +3,12 @@ env:
browser: true
amd: true
parserOptions:
ecmaVersion: 6
sourceType: module
ecmaFeatures:
impliedStrict: true
globals:
# New browser globals
DataView: readonly

View file

@ -19,13 +19,13 @@ const inject = require('gulp-inject');
const postcss = require('gulp-postcss');
const sass = require('gulp-sass');
sass.compiler = require('node-sass')
sass.compiler = require('node-sass');
let config;
if (mode.production()) {
var config = require('./webpack.prod.js');
config = require('./webpack.prod.js');
} else {
var config = require('./webpack.dev.js');
config = require('./webpack.dev.js');
}
function serve() {
@ -36,20 +36,20 @@ function serve() {
port: 8080
});
watch(['src/**/*.js', '!src/bundle.js'], javascript);
watch(['src/**/*.js', '!src/bundle.js'], series(javascript, standalone));
watch('src/bundle.js', webpack);
watch('src/**/*.css', css);
watch(['src/**/*.html', '!src/index.html'], html);
watch(['src/**/*.png', 'src/**/*.jpg', 'src/**/*.gif', 'src/**/*.svg'], images);
watch(['src/**/*.json', 'src/**/*.ico'], copy);
watch('src/index.html', injectBundle);
watch(['src/standalone.js', 'src/scripts/apploader.js'], standalone);
}
function standalone() {
return src(['src/standalone.js', 'src/scripts/apploader.js'], { base: './src/' })
.pipe(concat('scripts/apploader.js'))
.pipe(dest('dist/'));
.pipe(dest('dist/'))
.pipe(browserSync.stream());
}
function clean() {
@ -70,7 +70,6 @@ function javascript() {
}))
.pipe(mode.development(sourcemaps.write('.')))
.pipe(dest('dist/'))
.pipe(browserSync.stream());
}
function webpack() {
@ -118,6 +117,6 @@ function injectBundle() {
.pipe(browserSync.stream());
}
exports.default = series(clean, parallel(javascript, webpack, css, html, images, copy), injectBundle)
exports.standalone = series(exports.default, standalone)
exports.serve = series(exports.standalone, serve)
exports.default = series(clean, parallel(javascript, webpack, css, html, images, copy), injectBundle);
exports.standalone = series(exports.default, standalone);
exports.serve = series(exports.standalone, serve);

View file

@ -7,6 +7,7 @@
"devDependencies": {
"@babel/core": "^7.8.6",
"@babel/polyfill": "^7.8.7",
"@babel/plugin-transform-modules-amd": "^7.8.3",
"@babel/preset-env": "^7.8.6",
"autoprefixer": "^9.7.4",
"babel-loader": "^8.0.6",
@ -58,10 +59,10 @@
"jquery": "^3.4.1",
"jstree": "^3.3.7",
"libass-wasm": "https://github.com/jellyfin/JavascriptSubtitlesOctopus",
"libjass": "^0.11.0",
"material-design-icons-iconfont": "^5.0.1",
"native-promise-only": "^0.8.0-a",
"page": "^1.11.5",
"query-string": "^6.11.1",
"resize-observer-polyfill": "^1.5.1",
"shaka-player": "^2.5.9",
"sortablejs": "^1.10.2",
@ -70,9 +71,11 @@
"whatwg-fetch": "^3.0.0"
},
"babel": {
"presets": [
"@babel/preset-env"
]
"presets": ["@babel/preset-env"],
"overrides": [{
"test": ["src/components/cardbuilder/cardBuilder.js"],
"plugins": ["@babel/plugin-transform-modules-amd"]
}]
},
"browserslist": [
"last 2 Firefox versions",

View file

@ -21,7 +21,7 @@
}
.libraryPage {
padding-top: 7em !important;
padding-top: 7em;
}
.itemDetailPage {
@ -115,7 +115,7 @@
display: -webkit-inline-box;
display: -webkit-inline-flex;
display: inline-flex;
margin: 0.3em 0 0 0.5em;
margin: 0 0 0 0.5em;
height: 1.7em;
-webkit-box-align: center;
-webkit-align-items: center;
@ -128,6 +128,10 @@
margin-top: 0;
}
.layout-mobile .pageTitleWithDefaultLogo {
background-image: url(../img/icon-transparent.png);
}
.headerLeft,
.skinHeader {
display: -webkit-box;
@ -242,7 +246,6 @@
}
@media all and (min-width: 40em) {
.dashboardDocument .adminDrawerLogo,
.dashboardDocument .mainDrawerButton {
display: none !important;
}
@ -268,12 +271,6 @@
}
}
@media all and (max-width: 60em) {
.libraryDocument .mainDrawerButton {
display: none;
}
}
@media all and (max-width: 84em) {
.withSectionTabs .headerTop {
padding-bottom: 0.55em;
@ -1122,3 +1119,7 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards {
.itemsViewSettingsContainer > .button-flat {
margin: 0;
}
.layout-mobile #myPreferencesMenuPage {
padding-top: 3.75em;
}

View file

@ -16,6 +16,12 @@ _define("fetch", function() {
return fetch
});
// query-string
var query = require("query-string");
_define("queryString", function() {
return query;
});
// flvjs
var flvjs = require("flv.js/dist/flv").default;
_define("flvjs", function() {
@ -75,14 +81,7 @@ _define("sortable", function() {
// webcomponents
var webcomponents = require("webcomponents.js/webcomponents-lite");
_define("webcomponents", function() {
return webcomponents
});
// libjass
var libjass = require("libjass");
require("libjass/libjass.css");
_define("libjass", function() {
return libjass;
return webcomponents;
});
// libass-wasm
@ -97,11 +96,10 @@ _define("material-icons", function() {
return material_icons;
});
// Noto Sans
var jellyfin_noto = require("jellyfin-noto");
// noto font
var noto = require("jellyfin-noto");
_define("jellyfin-noto", function () {
return jellyfin_noto;
return noto;
});
// page.js

View file

@ -511,9 +511,16 @@ define(['loading', 'globalize', 'events', 'viewManager', 'layoutManager', 'skinM
return baseRoute;
}
var popstateOccurred = false;
window.addEventListener('popstate', function () {
popstateOccurred = true;
});
function getHandler(route) {
return function (ctx, next) {
ctx.isBack = popstateOccurred;
handleRoute(ctx, next, route);
popstateOccurred = false;
};
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,34 @@
define([], function() {
'use strict';
if (window.appMode === "cordova" || window.appMode === "android") {
return {
load: function () {
window.chrome = window.chrome || {};
return Promise.resolve();
}
};
} else {
var ccLoaded = false;
return {
load: function () {
if (ccLoaded) {
return Promise.resolve();
}
return new Promise(function (resolve, reject) {
var fileref = document.createElement("script");
fileref.setAttribute("type", "text/javascript");
fileref.onload = function () {
ccLoaded = true;
resolve();
};
fileref.setAttribute("src", "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js");
document.querySelector("head").appendChild(fileref);
});
}
};
}
});

View file

@ -1,8 +1,32 @@
define(['dialog', 'globalize'], function (dialog, globalize) {
define(["browser", "dialog", "globalize"], function(browser, dialog, globalize) {
'use strict';
return function (text, title) {
function replaceAll(str, find, replace) {
return str.split(find).join(replace);
}
if (browser.tv && window.confirm) {
// Use the native confirm dialog
return function (options) {
if (typeof options === 'string') {
options = {
title: '',
text: options
};
}
var text = replaceAll(options.text || '', '<br/>', '\n');
var result = confirm(text);
if (result) {
return Promise.resolve();
} else {
return Promise.reject();
}
};
} else {
// Use our own dialog
return function (text, title) {
var options;
if (typeof text === 'string') {
options = {
@ -37,4 +61,5 @@ define(['dialog', 'globalize'], function (dialog, globalize) {
return Promise.reject();
});
};
}
});

View file

@ -1,27 +0,0 @@
define([], function () {
'use strict';
function replaceAll(str, find, replace) {
return str.split(find).join(replace);
}
return function (options) {
if (typeof options === 'string') {
options = {
title: '',
text: options
};
}
var text = replaceAll(options.text || '', '<br/>', '\n');
var result = confirm(text);
if (result) {
return Promise.resolve();
} else {
return Promise.reject();
}
};
});

View file

@ -169,6 +169,15 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager',
}, {
passive: true
});
dom.addEventListener((dlg.dialogContainer || backdrop), 'contextmenu', function (e) {
if (e.target === dlg.dialogContainer) {
// Close the application dialog menu
close(dlg);
// Prevent the default browser context menu from appearing
e.preventDefault();
}
});
}
function isHistoryEnabled(dlg) {

View file

@ -80,7 +80,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
if (track) {
var format = (track.Codec || '').toLowerCase();
if (format === 'ssa' || format === 'ass') {
// libjass is needed here
return false;
}
}
@ -1047,7 +1046,7 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
lastCustomTrackMs = 0;
}
function renderWithSubtitlesOctopus(videoElement, track, item) {
function renderSsaAss(videoElement, track, item) {
var attachments = self._currentPlayOptions.mediaSource.MediaAttachments || [];
var options = {
video: videoElement,
@ -1066,82 +1065,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
});
}
function renderWithLibjass(videoElement, track, item) {
var rendererSettings = {};
if (browser.ps4) {
// Text outlines are not rendering very well
rendererSettings.enableSvg = false;
} else if (browser.edge || browser.msie) {
// svg not rendering at all
rendererSettings.enableSvg = false;
}
// probably safer to just disable everywhere
rendererSettings.enableSvg = false;
require(['libjass', 'ResizeObserver'], function (libjass, ResizeObserver) {
libjass.ASS.fromUrl(getTextTrackUrl(track, item)).then(function (ass) {
var clock = new libjass.renderers.ManualClock();
currentClock = clock;
// Create a DefaultRenderer using the video element and the ASS object
var renderer = new libjass.renderers.WebRenderer(ass, clock, videoElement.parentNode, rendererSettings);
currentAssRenderer = renderer;
renderer.addEventListener("ready", function () {
try {
renderer.resize(videoElement.offsetWidth, videoElement.offsetHeight, 0, 0);
if (!self._resizeObserver) {
self._resizeObserver = new ResizeObserver(onVideoResize, {});
self._resizeObserver.observe(videoElement);
}
//clock.pause();
} catch (ex) {
//alert(ex);
}
});
}, function () {
htmlMediaHelper.onErrorInternal(self, 'mediadecodeerror');
});
});
}
function renderSsaAss(videoElement, track, item) {
if (supportsCanvas() && supportsWebWorkers()) {
console.debug('rendering subtitles with SubtitlesOctopus');
renderWithSubtitlesOctopus(videoElement, track, item);
} else {
console.debug('rendering subtitles with libjass');
renderWithLibjass(videoElement, track, item);
}
}
function onVideoResize() {
if (browser.iOS) {
// the new sizes will be delayed for about 500ms with wkwebview
setTimeout(resetVideoRendererSize, 500);
} else {
resetVideoRendererSize();
}
}
function resetVideoRendererSize() {
var renderer = currentAssRenderer;
if (renderer) {
var videoElement = self._mediaElement;
var width = videoElement.offsetWidth;
var height = videoElement.offsetHeight;
console.debug('videoElement resized: ' + width + 'x' + height);
renderer.resize(width, height, 0, 0);
}
}
function requiresCustomSubtitlesElement() {
// after a system update, ps4 isn't showing anything when creating a track element dynamically
@ -1231,7 +1154,6 @@ define(['browser', 'require', 'events', 'apphost', 'loading', 'dom', 'playbackMa
if (!itemHelper.isLocalItem(item) || track.IsExternal) {
var format = (track.Codec || '').toLowerCase();
if (format === 'ssa' || format === 'ass') {
// libjass is needed here
renderSsaAss(videoElement, track, item);
return;
}

View file

@ -396,6 +396,12 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct
parent.querySelector(".chkEnableEmbeddedTitlesContainer").classList.remove("hide");
}
if (contentType === "tvshows") {
parent.querySelector(".chkEnableEmbeddedEpisodeInfosContainer").classList.remove("hide");
} else {
parent.querySelector(".chkEnableEmbeddedEpisodeInfosContainer").classList.add("hide");
}
return populateMetadataSettings(parent, contentType);
}
@ -493,6 +499,7 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct
SeasonZeroDisplayName: parent.querySelector("#txtSeasonZeroName").value,
AutomaticRefreshIntervalDays: parseInt(parent.querySelector("#selectAutoRefreshInterval").value),
EnableEmbeddedTitles: parent.querySelector("#chkEnableEmbeddedTitles").checked,
EnableEmbeddedEpisodeInfos: parent.querySelector("#chkEnableEmbeddedEpisodeInfos").checked,
SkipSubtitlesIfEmbeddedSubtitlesPresent: parent.querySelector("#chkSkipIfGraphicalSubsPresent").checked,
SkipSubtitlesIfAudioTrackMatches: parent.querySelector("#chkSkipIfAudioTrackPresent").checked,
SaveSubtitlesWithMedia: parent.querySelector("#chkSaveSubtitlesLocally").checked,
@ -545,6 +552,7 @@ define(["globalize", "dom", "emby-checkbox", "emby-select", "emby-input"], funct
parent.querySelector("#chkImportMissingEpisodes").checked = options.ImportMissingEpisodes;
parent.querySelector(".chkAutomaticallyGroupSeries").checked = options.EnableAutomaticSeriesGrouping;
parent.querySelector("#chkEnableEmbeddedTitles").checked = options.EnableEmbeddedTitles;
parent.querySelector("#chkEnableEmbeddedEpisodeInfos").checked = options.EnableEmbeddedEpisodeInfos;
parent.querySelector("#chkSkipIfGraphicalSubsPresent").checked = options.SkipSubtitlesIfEmbeddedSubtitlesPresent;
parent.querySelector("#chkSaveSubtitlesLocally").checked = options.SaveSubtitlesWithMedia;
parent.querySelector("#chkSkipIfAudioTrackPresent").checked = options.SkipSubtitlesIfAudioTrackMatches;

View file

@ -28,6 +28,13 @@
</label>
<div class="fieldDescription checkboxFieldDescription">${PreferEmbeddedTitlesOverFileNamesHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription chkEnableEmbeddedEpisodeInfosContainer hide advanced">
<label>
<input is="emby-checkbox" type="checkbox" id="chkEnableEmbeddedEpisodeInfos" />
<span>${PreferEmbeddedEpisodeInfosOverFileNames}</span>
</label>
<div class="fieldDescription checkboxFieldDescription">${PreferEmbeddedEpisodeInfosOverFileNamesHelp}</div>
</div>
<div class="checkboxContainer checkboxContainer-withDescription advanced">
<label>

View file

@ -238,13 +238,6 @@
background-color: transparent !important;
}
.listItemMediaInfo {
/* Don't display if flex not supported */
display: none;
align-items: center;
margin-right: 1em;
}
.listGroupHeader-first {
margin-top: 0;
}

View file

@ -3162,7 +3162,8 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
// User clicked stop or content ended
var state = self.getPlayerState(player);
var streamInfo = getPlayerData(player).streamInfo;
var data = getPlayerData(player);
var streamInfo = data.streamInfo;
var nextItem = self._playNextAfterEnded ? self._playQueueManager.getNextItemInfo() : null;
@ -3210,6 +3211,9 @@ define(['events', 'datetime', 'appSettings', 'itemHelper', 'pluginManager', 'pla
showPlaybackInfoErrorMessage(self, displayErrorCode, nextItem);
} else if (nextItem) {
self.nextTrack();
} else {
// Nothing more to play - clear data
data.streamInfo = null;
}
}

View file

@ -1,28 +0,0 @@
define([], function () {
'use strict';
function replaceAll(str, find, replace) {
return str.split(find).join(replace);
}
return function (options) {
if (typeof options === 'string') {
options = {
label: '',
text: options
};
}
var label = replaceAll(options.label || '', '<br/>', '\n');
var result = prompt(label, options.text || '');
if (result) {
return Promise.resolve(result);
} else {
return Promise.reject(result);
}
};
});

View file

@ -1,6 +1,10 @@
define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle'], function (dialogHelper, layoutManager, scrollHelper, globalize, dom, require) {
define(["browser", 'dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 'require', 'material-icons', 'emby-button', 'paper-icon-button-light', 'emby-input', 'formDialogStyle'], function(browser, dialogHelper, layoutManager, scrollHelper, globalize, dom, require) {
'use strict';
function replaceAll(str, find, replace) {
return str.split(find).join(replace);
}
function setInputProperties(dlg, options) {
var txtInput = dlg.querySelector('#txtInput');
@ -13,7 +17,6 @@ define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 're
}
function showDialog(options, template) {
var dialogOptions = {
removeOnClose: true,
scrollY: false
@ -71,26 +74,40 @@ define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 're
dlg.style.minWidth = (Math.min(400, dom.getWindowSize().innerWidth - 50)) + 'px';
return dialogHelper.open(dlg).then(function () {
if (layoutManager.tv) {
scrollHelper.centerFocus.off(dlg.querySelector('.formDialogContent'), false);
}
var value = submitValue;
if (value) {
return value;
if (submitValue) {
return submitValue;
} else {
return Promise.reject();
}
});
}
if ((browser.tv || browser.xboxOne) && window.confirm) {
return function (options) {
if (typeof options === 'string') {
options = {
label: '',
text: options
};
}
var label = replaceAll(options.label || '', '<br/>', '\n');
var result = prompt(label, options.text || '');
if (result) {
return Promise.resolve(result);
} else {
return Promise.reject(result);
}
};
} else {
return function (options) {
return new Promise(function (resolve, reject) {
require(['text!./prompt.template.html'], function (template) {
if (typeof options === 'string') {
options = {
title: '',
@ -101,4 +118,5 @@ define(['dialogHelper', 'layoutManager', 'scrollHelper', 'globalize', 'dom', 're
});
});
};
}
});

View file

@ -10,12 +10,6 @@ define([], function () {
}
},
canExec: false,
exec: function (options) {
// options.path
// options.arguments
return Promise.reject();
},
enableFullscreen: function () {
if (window.NativeShell) {
window.NativeShell.enableFullscreen();

View file

@ -264,17 +264,13 @@ define(["jQuery", "loading", "emby-checkbox", "listViewStyle", "emby-input", "em
self.init = function () {
options = options || {};
if (options.showCancelButton) {
page.querySelector(".btnCancel").classList.remove("hide");
} else {
page.querySelector(".btnCancel").classList.add("hide");
}
// Only hide the buttons if explicitly set to false; default to showing if undefined or null
// FIXME: rename this option to clarify logic
var hideCancelButton = options.showCancelButton === false;
page.querySelector(".btnCancel").classList.toggle("hide", hideCancelButton);
if (options.showSubmitButton) {
page.querySelector(".btnSubmitListings").classList.remove("hide");
} else {
page.querySelector(".btnSubmitListings").classList.add("hide");
}
var hideSubmitButton = options.showSubmitButton === false;
page.querySelector(".btnSubmitListings").classList.toggle("hide", hideSubmitButton);
$(".formLogin", page).on("submit", function () {
submitLoginForm();

View file

@ -163,17 +163,13 @@ define(["jQuery", "loading", "emby-checkbox", "emby-input", "listViewStyle", "pa
self.init = function () {
options = options || {};
if (false !== options.showCancelButton) {
page.querySelector(".btnCancel").classList.remove("hide");
} else {
page.querySelector(".btnCancel").classList.add("hide");
}
// Only hide the buttons if explicitly set to false; default to showing if undefined or null
// FIXME: rename this option to clarify logic
var hideCancelButton = options.showCancelButton === false;
page.querySelector(".btnCancel").classList.toggle("hide", hideCancelButton);
if (false !== options.showSubmitButton) {
page.querySelector(".btnSubmitListings").classList.remove("hide");
} else {
page.querySelector(".btnSubmitListings").classList.add("hide");
}
var hideSubmitButton = options.showSubmitButton === false;
page.querySelector(".btnSubmitListings").classList.toggle("hide", hideSubmitButton);
$("form", page).on("submit", function () {
submitListingsForm();

View file

@ -671,7 +671,8 @@ define(["playbackManager", "dom", "inputManager", "datetime", "itemHelper", "med
}
function onTimeUpdate(e) {
if (isEnabled) {
// Test for 'currentItem' is required for Firefox since its player spams 'timeupdate' events even being at breakpoint
if (isEnabled && currentItem) {
var now = new Date().getTime();
if (!(now - lastUpdateTime < 700)) {

View file

@ -1,4 +1,4 @@
define(["apphost", "connectionManager", "listViewStyle", "emby-button"], function(appHost, connectionManager) {
define(["apphost", "connectionManager", "layoutManager", "listViewStyle", "emby-button"], function(appHost, connectionManager, layoutManager) {
"use strict";
return function(view, params) {
@ -10,6 +10,10 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio
Dashboard.selectServer();
});
view.querySelector(".clientSettings").addEventListener("click", function () {
window.NativeShell.openClientSettings();
});
view.addEventListener("viewshow", function() {
// this page can also be used by admins to change user preferences from the user edit page
var userId = params.userId || Dashboard.getCurrentUserId();
@ -21,6 +25,12 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio
page.querySelector(".lnkPlaybackPreferences").setAttribute("href", "mypreferencesplayback.html?userId=" + userId);
page.querySelector(".lnkSubtitlePreferences").setAttribute("href", "mypreferencessubtitles.html?userId=" + userId);
if (window.NativeShell && window.NativeShell.AppHost.supports("clientsettings")) {
page.querySelector(".clientSettings").classList.remove("hide");
} else {
page.querySelector(".clientSettings").classList.add("hide");
}
if (appHost.supports("multiserver")) {
page.querySelector(".selectServer").classList.remove("hide");
} else {
@ -33,6 +43,12 @@ define(["apphost", "connectionManager", "listViewStyle", "emby-button"], functio
page.querySelector(".adminSection").classList.add("hide");
}
if (layoutManager.mobile) {
page.querySelector(".headerUsername").classList.add("hide");
page.querySelector(".adminSection").classList.add("hide");
page.querySelector(".userSection").classList.add("hide");
}
ApiClient.getUser(userId).then(function(user) {
page.querySelector(".headerUsername").innerHTML = user.Name;
if (!user.Policy.IsAdministrator) {

View file

@ -55,7 +55,7 @@
height: 1.83em;
margin: 0;
overflow: hidden;
border: 2px solid currentcolor;
border: 0.14em solid currentcolor;
border-radius: 0.14em;
z-index: 2;
display: flex;

View file

@ -5,7 +5,8 @@ define(['browser', 'dom', 'css!./emby-checkbox', 'registerElement'], function (b
function onKeyDown(e) {
// Don't submit form on enter
if (e.keyCode === 13) {
// Real (non-emulator) Tizen does nothing on Space
if (e.keyCode === 13 || e.keyCode === 32) {
e.preventDefault();
this.checked = !this.checked;

View file

@ -4,7 +4,6 @@
display: inline-block;
box-sizing: border-box;
margin: 0;
padding-left: 24px;
}
.radio-label-block {
@ -31,67 +30,82 @@
border: none;
}
.mdl-radio__outer-circle {
position: absolute;
top: 4px;
left: 0;
display: inline-block;
box-sizing: border-box;
width: 16px;
height: 16px;
margin: 0;
cursor: pointer;
border: 2px solid currentcolor;
.mdl-radio__circles {
position: relative;
margin-right: 0.54em;
width: 1.08em;
height: 1.08em;
border-radius: 50%;
z-index: 2;
cursor: pointer;
}
.mdl-radio__button:checked + .mdl-radio__label + .mdl-radio__outer-circle {
border: 2px solid #00a4dc;
.mdl-radio__circles svg {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
z-index: 1;
overflow: visible;
}
.mdl-radio__button:disabled + .mdl-radio__label + .mdl-radio__outer-circle {
border: 2px solid rgba(0, 0, 0, 0.26);
.mdl-radio__button:disabled + .mdl-radio__circles {
cursor: auto;
}
.mdl-radio__button:disabled + .mdl-radio__circles .mdl-radio__outer-circle {
color: rgba(0, 0, 0, 0.26);
}
.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__outer-circle {
color: #00a4dc;
}
.mdl-radio__inner-circle {
position: absolute;
z-index: 1;
margin: 0;
top: 8px;
left: 4px;
box-sizing: border-box;
width: 8px;
height: 8px;
cursor: pointer;
transition-duration: 0.28s;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 0.2s;
transition-property: -webkit-transform;
transition-property: transform;
transition-property: transform, -webkit-transform;
-webkit-transform: scale3d(0, 0, 0);
transform: scale3d(0, 0, 0);
-webkit-transform: scale(0);
transform: scale(0);
transform-origin: 50% 50%;
}
.mdl-radio__button:checked + .mdl-radio__circles .mdl-radio__inner-circle {
-webkit-transform: scale(1);
transform: scale(1);
}
.mdl-radio__button:disabled + .mdl-radio__circles .mdl-radio__inner-circle {
color: rgba(0, 0, 0, 0.26);
}
.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__inner-circle {
color: #00a4dc;
}
.mdl-radio__focus-circle {
position: absolute;
top: 0;
left: 0;
box-sizing: border-box;
width: 100%;
height: 100%;
margin: 0;
border-radius: 50%;
background: #00a4dc;
opacity: 0.26;
transition-duration: 0.2s;
transition-property: -webkit-transform;
transition-property: transform;
transition-property: transform, -webkit-transform;
-webkit-transform: scale(0);
transform: scale(0);
}
.mdl-radio__button:checked + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle {
-webkit-transform: scale3d(1, 1, 1);
transform: scale3d(1, 1, 1);
}
.mdl-radio__button:disabled + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle {
background: rgba(0, 0, 0, 0.26);
cursor: auto;
}
.mdl-radio__button:focus + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle {
box-shadow: 0 0 0 10px rgba(255, 255, 255, 0.76);
}
.mdl-radio__button:checked:focus + .mdl-radio__label + .mdl-radio__outer-circle + .mdl-radio__inner-circle {
box-shadow: 0 0 0 10px rgba(0, 164, 220, 0.26);
.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__focus-circle {
-webkit-transform: scale(1.75);
transform: scale(1.75);
}
.mdl-radio__label {

View file

@ -1,4 +1,4 @@
define(['css!./emby-radio', 'registerElement'], function () {
define(['layoutManager', 'css!./emby-radio', 'registerElement'], function (layoutManager) {
'use strict';
var EmbyRadioPrototype = Object.create(HTMLInputElement.prototype);
@ -6,16 +6,24 @@ define(['css!./emby-radio', 'registerElement'], function () {
function onKeyDown(e) {
// Don't submit form on enter
if (e.keyCode === 13) {
// Real (non-emulator) Tizen does nothing on Space
if (e.keyCode === 13 || e.keyCode === 32) {
e.preventDefault();
if (!this.checked) {
this.checked = true;
this.dispatchEvent(new CustomEvent('change', {
bubbles: true
}));
}
return false;
}
}
EmbyRadioPrototype.attachedCallback = function () {
var showFocus = !layoutManager.mobile;
if (this.getAttribute('data-radio') === 'true') {
return;
@ -30,13 +38,36 @@ define(['css!./emby-radio', 'registerElement'], function () {
labelElement.classList.add('mdl-radio');
labelElement.classList.add('mdl-js-radio');
labelElement.classList.add('mdl-js-ripple-effect');
if (showFocus) {
labelElement.classList.add('show-focus');
}
var labelTextElement = labelElement.querySelector('span');
labelTextElement.classList.add('radioButtonLabel');
labelTextElement.classList.add('mdl-radio__label');
labelElement.insertAdjacentHTML('beforeend', '<span class="mdl-radio__outer-circle"></span><span class="mdl-radio__inner-circle"></span>');
var html = '';
html += '<div class="mdl-radio__circles">';
html += '<svg>';
html += '<defs>';
html += '<clipPath id="cutoff">';
html += '<circle cx="50%" cy="50%" r="50%" />';
html += '</clipPath>';
html += '</defs>';
html += '<circle class="mdl-radio__outer-circle" cx="50%" cy="50%" r="50%" fill="none" stroke="currentcolor" stroke-width="0.26em" clip-path="url(#cutoff)" />';
html += '<circle class="mdl-radio__inner-circle" cx="50%" cy="50%" r="25%" fill="currentcolor" />';
html += '</svg>';
if (showFocus) {
html += '<div class="mdl-radio__focus-circle"></div>';
}
html += '</div>';
this.insertAdjacentHTML('afterend', html);
this.addEventListener('keydown', onKeyDown);
};

View file

@ -1,18 +0,0 @@
"use strict";
window.queryString = {}, window.queryString.extract = function(maybeUrl) {
return maybeUrl.split("?")[1] || ""
}, window.queryString.parse = function(str) {
return "string" != typeof str ? {} : (str = str.trim().replace(/^(\?|#|&)/, ""), str ? str.split("&").reduce(function(ret, param) {
var parts = param.replace(/\+/g, " ").split("="),
key = parts[0],
val = parts[1];
return key = decodeURIComponent(key), val = void 0 === val ? null : decodeURIComponent(val), ret.hasOwnProperty(key) ? Array.isArray(ret[key]) ? ret[key].push(val) : ret[key] = [ret[key], val] : ret[key] = val, ret
}, {}) : {})
}, window.queryString.stringify = function(obj) {
return obj ? Object.keys(obj).sort().map(function(key) {
var val = obj[key];
return Array.isArray(val) ? val.sort().map(function(val2) {
return encodeURIComponent(key) + "=" + encodeURIComponent(val2)
}).join("&") : encodeURIComponent(key) + "=" + encodeURIComponent(val)
}).join("&") : ""
};

View file

@ -1,83 +0,0 @@
"use strict";
var assert = require("assert"),
qs = require("./");
describe(".parse()", function() {
it("query strings starting with a `?`", function() {
assert.deepEqual(qs.parse("?foo=bar"), {
foo: "bar"
})
}), it("query strings starting with a `#`", function() {
assert.deepEqual(qs.parse("#foo=bar"), {
foo: "bar"
})
}), it("query strings starting with a `&", function() {
assert.deepEqual(qs.parse("&foo=bar&foo=baz"), {
foo: ["bar", "baz"]
})
}), it("parse a query string", function() {
assert.deepEqual(qs.parse("foo=bar"), {
foo: "bar"
})
}), it("parse multiple query string", function() {
assert.deepEqual(qs.parse("foo=bar&key=val"), {
foo: "bar",
key: "val"
})
}), it("parse query string without a value", function() {
assert.deepEqual(qs.parse("foo"), {
foo: null
}), assert.deepEqual(qs.parse("foo&key"), {
foo: null,
key: null
}), assert.deepEqual(qs.parse("foo=bar&key"), {
foo: "bar",
key: null
})
}), it("return empty object if no qss can be found", function() {
assert.deepEqual(qs.parse("?"), {}), assert.deepEqual(qs.parse("&"), {}), assert.deepEqual(qs.parse("#"), {}), assert.deepEqual(qs.parse(" "), {})
}), it("handle `+` correctly", function() {
assert.deepEqual(qs.parse("foo+faz=bar+baz++"), {
"foo faz": "bar baz "
})
}), it("handle multiple of the same key", function() {
assert.deepEqual(qs.parse("foo=bar&foo=baz"), {
foo: ["bar", "baz"]
})
}), it("query strings params including embedded `=`", function() {
assert.deepEqual(qs.parse("?param=http%3A%2F%2Fsomeurl%3Fid%3D2837"), {
param: "http://someurl?id=2837"
})
})
}), describe(".stringify()", function() {
it("stringify", function() {
assert.strictEqual(qs.stringify({
foo: "bar"
}), "foo=bar"), assert.strictEqual(qs.stringify({
foo: "bar",
bar: "baz"
}), "bar=baz&foo=bar")
}), it("different types", function() {
assert.strictEqual(qs.stringify(), ""), assert.strictEqual(qs.stringify(0), "")
}), it("URI encode", function() {
assert.strictEqual(qs.stringify({
"foo bar": "baz faz"
}), "foo%20bar=baz%20faz")
}), it("handle array value", function() {
assert.strictEqual(qs.stringify({
abc: "abc",
foo: ["bar", "baz"]
}), "abc=abc&foo=bar&foo=baz")
})
}), describe(".extract()", function() {
it("should extract qs from url", function() {
assert.equal(qs.extract("http://foo.bar/?abc=def&hij=klm"), "abc=def&hij=klm"), assert.equal(qs.extract("http://foo.bar/?"), "")
}), it("should handle strings not containing qs", function() {
assert.equal(qs.extract("http://foo.bar/"), ""), assert.equal(qs.extract(""), "")
}), it("should throw for invalid values", function() {
assert.throws(function() {
qs.extract(null)
}, TypeError), assert.throws(function() {
qs.extract(void 0)
}, TypeError)
})
});

View file

@ -47,6 +47,15 @@
</div>
</div>
</a>
<a is="emby-linkbutton" data-ripple="false" href="#" style="display:block;padding:0;margin:0;" class="clientSettings listItem-border">
<div class="listItem">
<i class="material-icons listItemIcon listItemIcon-transparent devices_other"></i>
<div class="listItemBody">
<div class="listItemBodyText">${ClientSettings}</div>
</div>
</div>
</a>
</div>
<div class="adminSection verticalSection verticalSection-extrabottompadding">
<h2 class="sectionTitle" style="padding-left:.25em;">${HeaderAdmin}</h2>

View file

@ -271,6 +271,9 @@ define([], function () {
if (!browser.tizen) {
browser.orsay = userAgent.toLowerCase().indexOf('smarthub') !== -1;
} else {
var v = (navigator.appVersion).match(/Tizen (\d+).(\d+)/);
browser.tizenVersion = parseInt(v[1]);
}
if (browser.edgeUwp) {

View file

@ -214,6 +214,15 @@ define(['browser'], function (browser) {
break;
case 'avi':
supported = browser.tizen || browser.orsay || browser.web0s || browser.edgeUwp;
// New Samsung TV don't support XviD/DivX
// Explicitly add supported codecs to make other codecs be transcoded
if (browser.tizenVersion >= 4) {
videoCodecs.push('h264');
if (canPlayH265(videoTestElement, options)) {
videoCodecs.push('h265');
videoCodecs.push('hevc');
}
}
break;
case 'mpg':
case 'mpeg':

View file

@ -73,7 +73,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
}
if (user && user.localUser) {
if (headerHomeButton) {
if (headerHomeButton && !layoutManager.mobile) {
headerHomeButton.classList.remove("hide");
}
@ -243,15 +243,20 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder" data-itemid="selectserver" href="selectserver.html?showuser=1"><i class="material-icons navMenuOptionIcon">wifi</i><span class="navMenuOptionText">' + globalize.translate("ButtonSelectServer") + "</span></a>";
}
html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder btnSettings" data-itemid="settings" href="#"><i class="material-icons navMenuOptionIcon settings"></i><span class="navMenuOptionText">' + globalize.translate("ButtonSettings") + "</span></a>";
html += '<a is="emby-linkbutton" class="navMenuOption lnkMediaFolder btnLogout" data-itemid="logout" href="#"><i class="material-icons navMenuOptionIcon exit_to_app"></i><span class="navMenuOptionText">' + globalize.translate("ButtonSignOut") + "</span></a>";
html += "</div>";
}
// add buttons to navigation drawer
navDrawerScrollContainer.innerHTML = html;
// bind logout button click to method
var btnLogout = navDrawerScrollContainer.querySelector(".btnLogout");
var btnSettings = navDrawerScrollContainer.querySelector(".btnSettings");
if (btnSettings) {
btnSettings.addEventListener("click", onSettingsClick);
}
var btnLogout = navDrawerScrollContainer.querySelector(".btnLogout");
if (btnLogout) {
btnLogout.addEventListener("click", onLogoutClick);
}
@ -598,6 +603,10 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
}
}
function onSettingsClick() {
Dashboard.navigate("mypreferencesmenu.html");
}
function onLogoutClick() {
Dashboard.logout();
}
@ -788,7 +797,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
var headerCastButton;
var headerSearchButton;
var headerAudioPlayerButton;
var enableLibraryNavDrawer = !layoutManager.tv;
var enableLibraryNavDrawer = layoutManager.desktop;
var skinHeader = document.querySelector(".skinHeader");
var requiresUserRefresh = true;
var lastOpenTime = new Date().getTime();
@ -863,6 +872,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
pageClassOn("pageshow", "page", function (e) {
var page = this;
var isDashboardPage = page.classList.contains("type-interior");
var isHomePage = page.classList.contains("homePage");
var isLibraryPage = !isDashboardPage && page.classList.contains("libraryPage");
var apiClient = getCurrentApiClient();
@ -874,7 +884,7 @@ define(["dom", "layoutManager", "inputManager", "connectionManager", "events", "
refreshDashboardInfoInDrawer(apiClient);
} else {
if (mainDrawerButton) {
if (enableLibraryNavDrawer) {
if (enableLibraryNavDrawer || isHomePage) {
mainDrawerButton.classList.remove("hide");
} else {
mainDrawerButton.classList.add("hide");

View file

@ -355,39 +355,6 @@ var AppInfo = {};
return headroom;
}
function getCastSenderApiLoader() {
var ccLoaded = false;
return {
load: function () {
if (ccLoaded) {
return Promise.resolve();
}
return new Promise(function (resolve, reject) {
var fileref = document.createElement("script");
fileref.setAttribute("type", "text/javascript");
fileref.onload = function () {
ccLoaded = true;
resolve();
};
fileref.setAttribute("src", "https://www.gstatic.com/cv/js/sender/v1/cast_sender.js");
document.querySelector("head").appendChild(fileref);
});
}
};
}
function getDummyCastSenderApiLoader() {
return {
load: function () {
window.chrome = window.chrome || {};
return Promise.resolve();
}
};
}
function createSharedAppFooter(appFooter) {
return new appFooter({});
}
@ -439,28 +406,16 @@ var AppInfo = {};
defineResizeObserver();
define("dialog", [componentsPath + "/dialog/dialog"], returnFirstDependency);
if (preferNativeAlerts && window.confirm) {
define("confirm", [componentsPath + "/confirm/nativeconfirm"], returnFirstDependency);
} else {
define("confirm", [componentsPath + "/confirm/confirm"], returnFirstDependency);
}
if ((preferNativeAlerts || browser.xboxOne) && window.confirm) {
define("prompt", [componentsPath + "/prompt/nativeprompt"], returnFirstDependency);
} else {
define("prompt", [componentsPath + "/prompt/prompt"], returnFirstDependency);
}
define("loading", [componentsPath + "/loading/loading"], returnFirstDependency);
define("multi-download", [componentsPath + "/multidownload"], returnFirstDependency);
define("fileDownloader", [componentsPath + "/filedownloader"], returnFirstDependency);
define("localassetmanager", [bowerPath + "/apiclient/localassetmanager"], returnFirstDependency);
if ("cordova" === self.appMode || "android" === self.appMode) {
define("castSenderApiLoader", [], getDummyCastSenderApiLoader);
} else {
define("castSenderApiLoader", [], getCastSenderApiLoader);
}
define("castSenderApiLoader", [componentsPath + "/castSenderApi"], returnFirstDependency);
define("transfermanager", [bowerPath + "/apiclient/sync/transfermanager"], returnFirstDependency);
define("filerepository", [bowerPath + "/apiclient/sync/filerepository"], returnFirstDependency);
@ -734,8 +689,8 @@ var AppInfo = {};
"resize-observer-polyfill",
"shaka",
"swiper",
"queryString",
"sortable",
"libjass",
"webcomponents",
"material-icons",
"jellyfin-noto",
@ -800,9 +755,6 @@ var AppInfo = {};
define("headroom", [componentsPath + "/headroom/headroom"], returnFirstDependency);
define("scroller", [componentsPath + "/scroller"], returnFirstDependency);
define("navdrawer", [componentsPath + "/navdrawer/navdrawer"], returnFirstDependency);
define("queryString", [bowerPath + "/query-string/index"], function () {
return queryString;
});
define("emby-button", [elementsPath + "/emby-button/emby-button"], returnFirstDependency);
define("paper-icon-button-light", [elementsPath + "/emby-button/paper-icon-button-light"], returnFirstDependency);

View file

@ -832,5 +832,9 @@
"ButtonNetwork": "Мрежа",
"ButtonFullscreen": "На цял екран",
"ButtonDown": "Надолу",
"ButtonConnect": "Свързване"
"ButtonConnect": "Свързване",
"AllowOnTheFlySubtitleExtraction": "Позволява моментално извличане на поднадписи",
"AllowHWTranscodingHelp": "Позволява на тунера да прекодира моментално. Това може да помогне за редуциране на прекодирането от сървъра.",
"AddItemToCollectionHelp": "Добавяне към колекция чрез търсенето им и използване на дясно-щракване с мишката или контекстното меню.",
"Absolute": "Aбсолютен"
}

View file

@ -1,5 +1,5 @@
{
"Absolute": "Gesamt",
"Absolute": "Absolut",
"AccessRestrictedTryAgainLater": "Der Zugriff ist derzeit eingeschränkt. Bitte versuche es später erneut.",
"Actor": "Darsteller(in)",
"Add": "Hinzufügen",
@ -1069,6 +1069,8 @@
"PluginInstalledMessage": "Das Plugin wurde erfolgreich installiert. Der Jellyfin-Server muss neu gestartet werden, um die Änderungen zu übernehmen.",
"PreferEmbeddedTitlesOverFileNames": "Bevorzuge eingebettete Titel vor Dateinamen",
"PreferEmbeddedTitlesOverFileNamesHelp": "Das bestimmt den Standard Displaytitel wenn keine lokale oder Internetmetadaten verfügbar sind.",
"PreferEmbeddedEpisodeInfosOverFileNames": "Bevorzuge eingebettete Episodeninformationen vor Dateinamen",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Bevorzugt die in den Metadaten eingebetteten Episodeninformationen.",
"PreferredNotRequired": "Bevorzugt, aber nicht benötigt",
"Premieres": "Premieren",
"Previous": "Vorheriges",
@ -1491,5 +1493,6 @@
"NoCreatedLibraries": "Sieht so aus als hättest du bis jetzt keine Bibliothek erstellt. {0}Möchtest du jetzt eine Bibliothek erstellen?{1}",
"AllowFfmpegThrottling": "Transkodierung drosseln",
"PlaybackErrorNoCompatibleStream": "Es gab ein Problem bei der Erkennung des Wiedergabeprofils des Clients und der Server sendet kein kompatibles Format.",
"AllowFfmpegThrottlingHelp": "Wenn eine Transkodierung oder ein Remux weit genug über die aktuelle Abspielposition fortgeschritten ist, pausiere sie sodass weniger Ressourcen verbraucht werden. Dies ist am nützlichsten, wenn wenig geskippt wird. Bei Wiedergabeproblemen sollte diese Option deaktiviert werden."
"AllowFfmpegThrottlingHelp": "Wenn eine Transkodierung oder ein Remux weit genug über die aktuelle Abspielposition fortgeschritten ist, pausiere sie sodass weniger Ressourcen verbraucht werden. Dies ist am nützlichsten, wenn wenig geskippt wird. Bei Wiedergabeproblemen sollte diese Option deaktiviert werden.",
"ClientSettings": "Client Einstellungen"
}

View file

@ -147,6 +147,7 @@
"ChannelNumber": "Channel number",
"Channels": "Channels",
"CinemaModeConfigurationHelp": "Cinema mode brings the theater experience straight to your living room with the ability to play trailers and custom intros before the main feature.",
"ClientSettings": "Client Settings",
"Collections": "Collections",
"ColorPrimaries": "Color primaries",
"ColorSpace": "Color space",
@ -1239,6 +1240,8 @@
"PluginInstalledMessage": "The plugin has been successfully installed. Jellyfin Server will need to be restarted for changes to take effect.",
"PreferEmbeddedTitlesOverFileNames": "Prefer embedded titles over filenames",
"PreferEmbeddedTitlesOverFileNamesHelp": "This determines the default display title when no internet metadata or local metadata is available.",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "This uses the episode informations from the embedded metadata if available.",
"PreferEmbeddedEpisodeInfosOverFileNames": "Prefer embedded episode informations over filenames",
"PreferredNotRequired": "Preferred, but not required",
"Premiere": "Premiere",
"Premieres": "Premieres",

View file

@ -68,7 +68,7 @@
"AllowMediaConversion": "Permitir conversión de medios",
"AllowMediaConversionHelp": "Permitir o denegar acceso a la opción de convertir medios.",
"AllowOnTheFlySubtitleExtraction": "Permitir extracción de subtítulos al vuelo",
"AllowOnTheFlySubtitleExtractionHelp": "Los subtítulos incrustados pueden ser extraídos de videos y entregados a apps de Jellyfin en texto plano para ayudar a prevenir la transcodificación de video. En algunos sistemas esto puede llevar un largo tiempo y causar demoras en la reproducción durante el proceso de extracción. Desactivar esta opción para quemar los subtítulos incrustados en la transcodificación de video cuando no son soportados nativamente por el dispositivo cliente.",
"AllowOnTheFlySubtitleExtractionHelp": "Los subtítulos incrustados pueden extraerse de los videos y entregarse a los reproductores en texto plano para ayudar a evitar la transcodificación de video. En algunos sistemas, esto puede tardar mucho tiempo y provocar que la reproducción de video se detenga durante el proceso de extracción. Deshabilite esta opción para que los subtítulos incrustados se graben con transcodificación de video cuando no estén soportados de forma nativa por el dispositivo cliente.",
"AllowRemoteAccess": "Permitir conexiones remotas a este Servidor Jellyfin.",
"AllowRemoteAccessHelp": "Si no está tildado, todas las conexiones remotas serán bloqueadas.",
"AlwaysPlaySubtitles": "Siempre reproducir subtítulos",
@ -81,7 +81,7 @@
"AutoBasedOnLanguageSetting": "Auto (basado en configuración de idioma)",
"AutomaticallyConvertNewContent": "Convertir contenido nuevo automáticamente",
"Backdrop": "Fondo",
"AllowHWTranscodingHelp": "Si se activa, se permitirá al sintonizador transcodificar streams al vuelo. Esto podría ayudar a reducir la transcodificación requerida por el servidor Jellyfin.",
"AllowHWTranscodingHelp": "Permite que el sintonizador transcodifique las transmisiones sobre la marcha. Esto puede ayudar a reducir la transcodificación requerida por el servidor.",
"AllowedRemoteAddressesHelp": "Lista separada por comas de direcciones IP o IP/máscara-de-red para redes a las que se les permitirá conectarse de forma remota. Si se deja vacía, todas las direcciones remotas serán permitidas.",
"AlwaysPlaySubtitlesHelp": "Los subtítulos que concuerden con la preferencia de idioma se cargarán independientemente del idioma del audio.",
"AndroidUnlockRestoreHelp": "Para recuperar tu compra anterior, por favor asegurate que iniciaste sesión en el dispositivo con la misma cuenta de Google (o Amazon) que hizo la compra originalmente. Asegurate de que la tienda de aplicaciones esté habilitada y no posea control parental alguno, y que tiene una conexión a Internet activa. Solo tendrás que hacer esto una sola vez para recuperar tu compra anterior.",
@ -102,12 +102,12 @@
"BirthPlaceValue": "Lugar de nacimiento: {0}",
"Blacklist": "Lista negra",
"BobAndWeaveWithHelp": "Bob and weave (mayor calidad, pero más lento)",
"BookLibraryHelp": "Libros de audio y de texto son soportados. Revise la {0}guía de nombrado de libros de Jellyfin{1}.",
"BookLibraryHelp": "Los libros de texto y audio libros son soportados. Revise la {0}Guía para Nomenclatura de Libros{1}.",
"Box": "Caja",
"BoxRear": "Caja (lado opuesto)",
"Browse": "Explorar",
"BrowsePluginCatalogMessage": "Explore nuestro catálogo de complementos para ver los complementos disponibles.",
"BurnSubtitlesHelp": "Determine si el servidor debería incrustar los subtítulos cuando convierte los videos dependiendo del formato de subtítulo. Evitar incrustar subtitulos mejorará el rendimiento del servidor. Seleccione Auto para incrustar formatos basados en imagen (por ejemplo, VOBSUB, PGS, SUB/IDX, etc.), como así también ciertos subtítulos ASS/SSA",
"BurnSubtitlesHelp": "Determina si el servidor debe grabar subtítulos al convertir videos dependiendo del formato de los subtítulos. Evitar la grabación de subtítulos mejorará el rendimiento del servidor. Seleccione Auto para grabar formatos basados en imágenes (VOBSUB, PGS, SUB/IDX, etc.) y ciertos subtítulos ASS/SSA.",
"ButtonAccept": "Aceptar",
"ButtonAdd": "Agregar",
"ButtonAddMediaLibrary": "Agregar biblioteca de medios",
@ -308,7 +308,7 @@
"DeviceLastUsedByUserName": "Usado ultima vez por {0}",
"DirectPlayError": "Error en la reproducción directa",
"DirectPlaying": "Reproducción directa",
"DirectStreamHelp1": "El medio es compatible con el dispositivo respecto a la resolución y el tipo de medio (H.264, AC3, etc.), pero esta en un contenedor incompatible (.mkv, .avi, .wmv, etc.). El video va a ser re-empaquetado en el momento que sea transmitido al dispositivo.",
"DirectStreamHelp1": "El medio es compatible con el dispositivo en cuanto a la resolución y tipo de medio (H.264, AC3, etc.), pero está en un contenedor de archivo incompatible (mkv, avi, wmv, etc.). El video sera reempaquetado en el acto antes de transmitirlo al dispositivo.",
"DirectStreamHelp2": "Transmitir directamente un archivo usa muy poco procesamiento, esto sin perdida en la calidad de video.",
"DirectStreaming": "Transmisión en directo",
"Director": "Director",
@ -321,7 +321,7 @@
"DisplayInMyMedia": "Mostrar en pantalla principal",
"DisplayInOtherHomeScreenSections": "Mostrar en las secciones de la pantalla principal, como últimos medios y continuar viendo",
"DisplayMissingEpisodesWithinSeasons": "Mostrar episodios faltantes entre temporadas",
"DisplayMissingEpisodesWithinSeasonsHelp": "Esto debe ser habilitado en las bibilotecas de TV, en la configuracion del servidor de Jellyfin.",
"DisplayMissingEpisodesWithinSeasonsHelp": "Esto también debe estar habilitado para las bibliotecas de TV en la configuración del servidor.",
"DisplayModeHelp": "Selecciona el tipo de pantalla en el cual estas usando Jellyfin.",
"DoNotRecord": "No grabar",
"Down": "Abajo",
@ -345,7 +345,7 @@
"EnableBackdropsHelp": "Si esta habilitado, los fondos van a ser mostrados en segundo plano de algunas paginas mientras estas en la biblioteca.",
"EnableCinemaMode": "Habilitar modo Cine",
"EnableColorCodedBackgrounds": "Habilitar colores en el fondo del codigo",
"AuthProviderHelp": "Selecciona un Proveedor de Autenticación para autenticar la contraseña de este usuario",
"AuthProviderHelp": "Seleccione un proveedor de autenticación que se utilizará para autenticar la contraseña de este usuario.",
"CriticRating": "Calificación de la crítica",
"DefaultSubtitlesHelp": "Los subtítulos se cargan en base a los indicadores por defecto y los indicadores forzados en los metadatos embebidos. Las preferencias de idioma son consideradas cuando existe más de una opción.",
"Dislike": "No me gusta",
@ -411,5 +411,13 @@
"HeaderFavoriteEpisodes": "Episodios favoritos",
"HeaderFavoriteArtists": "Artistas favoritos",
"HeaderFavoriteAlbums": "Álbumes favoritos",
"Shows": "Series"
"Shows": "Series",
"CopyStreamURLError": "Hubo un error copiando la URL.",
"CopyStreamURLSuccess": "URL copiada con éxito.",
"CopyStreamURL": "Copiar la URL de la transmisión",
"ButtonSplit": "Dividir",
"ButtonAddImage": "Agregar imagen",
"AskAdminToCreateLibrary": "Pregunte al administrador para crear una biblioteca.",
"AllowFfmpegThrottlingHelp": "Cuando una transcodificación o conversión avanza demasiado con respecto a la posición actual de la reproducción, se pausara el proceso para consumir menos recursos. esto es mas útil cuando no se hacen búsquedas de tiempo a menudo. Desactive esta opción si experimenta problemas en la reproducción.",
"AllowFfmpegThrottling": "Transcodificación Throttle"
}

View file

@ -195,7 +195,7 @@
"Download": "Descargar",
"DownloadsValue": "{0} descargas",
"DrmChannelsNotImported": "Los canales con DRM no serán importados.",
"DropShadow": "Mostrar sombra",
"DropShadow": "Sombra Paralela",
"EasyPasswordHelp": "Su código PIN fácil se utiliza para el acceso sin conexión en los clientes compatibles y también puede utilizarse para acceder fácilmente cuando se está en la misma red.",
"Edit": "Editar",
"EditImages": "Editar imágenes",

View file

@ -139,5 +139,8 @@
"AllLanguages": "تمام زبان ها",
"AllLibraries": "تمام کتابخانه ها",
"AllowHWTranscodingHelp": "اگر فعال شود, اجازه میدهید تبدیل ( کم و زیاد کردن کیفیت ) درلحظه و توسط کارت دریافت سیگنال صورت گیرد. این کمک میکند به اینکه سرور جلیفین کمتر عمل تبدیل را انجام دهد.",
"AllowOnTheFlySubtitleExtraction": "اجازه میدهد در لحظه زیرنویس بازشود"
"AllowOnTheFlySubtitleExtraction": "اجازه میدهد در لحظه زیرنویس بازشود",
"Add": "افزودن",
"Actor": "بازیگر",
"AccessRestrictedTryAgainLater": "دسترسی در حال حاضر محدود شده است. لطفا دوباره تلاش کنید."
}

View file

@ -257,7 +257,7 @@
"DownloadsValue": "{0} latausta",
"DrmChannelsNotImported": "Kanavia joissa on tekijänoikeusesto-ohjelmia, ei ladata.",
"DropShadow": "Tiputa varjo",
"EasyPasswordHelp": "Sinun helppoa PIN-koodia käytetään offline-käytössä tuetuissa Jellyfin-sovelluksissa, ja voidaan myös nopeuttaa verkkoon kirjautumista.",
"EasyPasswordHelp": "Sinun helppoa PIN-koodia käytetään offline-käytössä tuetuissa Jellyfin-sovelluksissa, ja voi myös nopeuttaa lan yhteyden kautta kirjautumista.",
"Edit": "Muokkaa",
"EditImages": "Muokkaa kuvia",
"EditMetadata": "Muokkaa metadataa",
@ -305,5 +305,20 @@
"EnableDisplayMirroring": "Näytön peilaus",
"EnableColorCodedBackgrounds": "Väri-koodatut taustat",
"EnableCinemaMode": "Teatteri-tila",
"EnableBackdropsHelp": "Näytä taustat tietyillä sivuilla selatessasi kirjastoa."
"EnableBackdropsHelp": "Näytä taustat tietyillä sivuilla selatessasi kirjastoa.",
"EnableExternalVideoPlayersHelp": "Videota soitettaessa näytetään erillinen valikko.",
"Depressed": "Painettu",
"CopyStreamURLError": "Verkko-osoitteen kopioinnissa tapahtui virhe.",
"ButtonSplit": "jaa",
"AskAdminToCreateLibrary": "Pyydä järjestelmän ylläpitäjää luomaan kirjasto.",
"EnableStreamLooping": "Auto-toista suoralähetykset",
"EnableNextVideoInfoOverlayHelp": "Videon lopussa, näytä soittolistassa seuraavaksi toistettavan videon tiedot.",
"ClientSettings": "Pääte-asetukset",
"AllowFfmpegThrottlingHelp": "Kun uudelleenkoodaus tai remux ehtii tarpeeksi toiston edelle, keskeytä laskenta jotta laskentaresursseja kuluu vähemmän. Tämä on hyödyllistä jos katselet hyppimättä eri kohtiin. Älä käytä jos toiston kanssa ilmenee ongelmia.",
"AllowFfmpegThrottling": "Rajoita uudelleenkoodaus",
"ErrorDeletingItem": "Tiedostoa poistaessa Jellyfin Palvelimelta ilmeni virhe. Varmista, että Jellyfin Palvelimella on kirjoitusoikeudet mediakansioon ja kokeile uudestaan.",
"ErrorAddingXmlTvFile": "XMLTV-tiedostoa käyttäessä tapahtui virhe. Varmista, että tiedosto on olemassa ja kokeile uudestaan.",
"ErrorAddingTunerDevice": "Viritintä lisätessä ilmeni ongelma. Varmista, että se on kytketty oikein ja kokeile uudestaan.",
"EnableThemeVideosHelp": "Soita tunnusvideoita taustalla, selatessasi kirjastoa.",
"EnableThemeVideos": "Teeman videot"
}

View file

@ -1100,7 +1100,7 @@
"PlayAllFromHere": "Tout lire à partir d'ici",
"PlayCount": "Nombre de lectures",
"PlayFromBeginning": "Lire depuis le début",
"PlayNext": "Lire le suivant",
"PlayNext": "Lire ensuite",
"PlayNextEpisodeAutomatically": "Lancer l'épisode suivant automatiquement",
"Played": "Lu",
"Playlists": "Listes de lecture",
@ -1470,5 +1470,7 @@
"AllowFfmpegThrottlingHelp": "Quand le transcodage ou le remultiplexage est suffisamment loin de la position de lecture, le processus se mettra en pause afin déconomiser des ressources. Plus utile lors dune lecture continue. À désactiver en cas de problèmes de lecture.",
"AllowFfmpegThrottling": "Adapter la Vitesse du Transcodage",
"NoCreatedLibraries": "Il semblerait que vous n'ayez créé aucune librairie. {0}Voulez-vous en créer une maintenant ?{1}",
"PlaybackErrorNoCompatibleStream": "Problème de profil client, le serveur na pas pu envoyer un format média compatible."
"PlaybackErrorNoCompatibleStream": "Problème de profil client, le serveur na pas pu envoyer un format média compatible.",
"PreferEmbeddedEpisodeInfosOverFileNames": "Préférer les informations intégrées aux noms de fichiers",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Utilise les informations des métadonnées intégrées, si disponible."
}

View file

@ -164,5 +164,8 @@
"Songs": "Lieder",
"Sync": "Synchronisation",
"ValueSpecialEpisodeName": "Extra - {0}",
"VersionNumber": "Version {0}"
"VersionNumber": "Version {0}",
"Absolute": "Absolut",
"Actor": "Schauspiler",
"AccessRestrictedTryAgainLater": "Zuegriff isch momentan beschränkt. Probier bitte später nomau. "
}

View file

@ -32,5 +32,7 @@
"Aired": "प्रसारित हो चुका",
"AdditionalNotificationServices": "अतिरिक्त सूचना सेवाओं को स्थापित करने के लिए प्लगइन सूची पर नज़र डालें।",
"AddedOnValue": "जोड़ दिया",
"AddToPlaylist": "प्लेलिस्ट में जोड़ें"
"AddToPlaylist": "प्लेलिस्ट में जोड़ें",
"AllowMediaConversionHelp": "मीडिया परिवर्तन के लिये अनुमति दें",
"AllowMediaConversion": "मीडिया रूपांतरण की अनुमति दें"
}

View file

@ -1213,7 +1213,7 @@
"Screenshots": "Képernyőképek",
"SearchForCollectionInternetMetadata": "Keresés az interneten artwork és metaadat után",
"Series": "Sorozatok",
"SeriesCancelled": "A sorozat törölt.",
"SeriesCancelled": "Sorozat törölve.",
"SeriesRecordingScheduled": "A sorozatfelvétel ütemezett.",
"SeriesSettings": "Sorozat beállítások",
"ServerRestartNeededAfterPluginInstall": "A bővítmény telepítése után újra kell indítani a Jellyfin Szerver-t.",
@ -1474,5 +1474,7 @@
"DeviceAccessHelp": "Ez csak azokra az eszközökre alkalmazható, amelyek egyedileg vannak azonosítva és nem gátolják meg a böngészőből való elérést. A felhasználói eszközök kiszűrése meg fogja akadályozni az új eszközök használatát addig, amíg itt nem engedélyezed őket.",
"PlaybackErrorNoCompatibleStream": "Hiba történt a kliens felmérése közben és a szerver nem küld kompatibilis formátumot az eszközre.",
"AllowFfmpegThrottlingHelp": "Ha az átkódolás vagy remux eléggé előtöltődött a jelenlegi lejátszási pozícióhoz képest, ez megállítja a folyamatot, hogy kevesebb erőforrást vegyen igénybe. Ez akkor hasznos, ha ritkán ugrálsz előre a lejátszott videókban. Kapcsold ki, ha lejátszási problémákba ütközöl.",
"AllowFfmpegThrottling": "Átkódolás visszafogása"
"AllowFfmpegThrottling": "Átkódolás visszafogása",
"PreferEmbeddedEpisodeInfosOverFileNames": "Inkább a beágyazott epizódokra vonatkozó információkat részesítse előnyben a fájlnevekkel szemben",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "Ez a beágyazott metaadatok epizódinformációit használja, ha rendelkezésre állnak."
}

View file

@ -581,7 +581,7 @@
"LabelForgotPasswordUsernameHelp": "Inserisci il tuo nome utente, se te lo ricordi.",
"LabelFormat": "Formato:",
"LabelFriendlyName": "Nome Condiviso:",
"LabelServerNameHelp": "Questo nome è usato per identificare il server e verrà usato di default come nome del pc.",
"LabelServerNameHelp": "Questo nome è usato per identificare il server e avrà come default il nome del pc.",
"LabelGroupMoviesIntoCollections": "Raggruppa i film nelle collezioni",
"LabelGroupMoviesIntoCollectionsHelp": "Quando si visualizzano le liste di film, quelli appartenenti ad una collezione saranno visualizzati come un elemento raggruppato.",
"LabelH264Crf": "CRF di codifica H264:",

View file

@ -32,11 +32,11 @@
"MessageDownloadQueued": "Lejupielāde ierindota.",
"MessageCreateAccountAt": "Izveido kontu {0}",
"MessageContactAdminToResetPassword": "Lūdzu sazinies ar sistēmas administratoru lai atiestatītu paroli.",
"MessageConfirmShutdown": "Vai tu tiešām gribi izslēgt serveri?",
"MessageConfirmRestart": "Vai tu tiešām gribi restartēt Jellyfin Server?",
"MessageConfirmRemoveMediaLocation": "Vai tu tiešām gribi noņemt šo ceļu?",
"MessageConfirmShutdown": "Vai tu tiešām vēlies izslēgt serveri?",
"MessageConfirmRestart": "Vai tu tiešām vēlies restartēt Jellyfin Server?",
"MessageConfirmRemoveMediaLocation": "Vai tu tiešām vēlies noņemt šo ceļu?",
"MessageConfirmRecordingCancellation": "Atcelt ierakstu?",
"MessageConfirmAppExit": "Vai tu gribi iziet?",
"MessageConfirmAppExit": "Vai tu vēlies iziet?",
"MessageAlreadyInstalled": "Šī versija jau ir uzstādīta.",
"MediaInfoStreamTypeVideo": "Video",
"MediaInfoStreamTypeSubtitle": "Subtitri",
@ -698,7 +698,7 @@
"Unplayed": "Neatskaņots",
"Unmute": "Ieslēgt skaņu",
"UninstallPluginHeader": "Noņemt Paplašinājumu",
"UninstallPluginConfirmation": "Vai tu tiešām gribi noņemt {0}?",
"UninstallPluginConfirmation": "Vai tu tiešām vēlies noņemt {0}?",
"Tuesday": "Otrdiena",
"Transcoding": "Trans-kodēšana",
"Trailers": "Treileri",
@ -916,9 +916,9 @@
"HeaderTaskTriggers": "Uzdevumu Trigeri",
"HeaderSelectTranscodingPathHelp": "Pārlūko vai ievadi ceļu, kurā tiks glabātas īslaicīgās trans-kodēšanas datnes. Šai mapei jābūt rakstāmai.",
"HeaderSelectTranscodingPath": "Izvēlies Trans-kodēšanas Īslaicīgo Ceļu",
"HeaderSelectServerCachePathHelp": "Pārlūko vai ievadi ceļu, kurā tu gribi saglabāt servera keša datnes. Šai mapei jābūt rakstāmai.",
"HeaderSelectServerCachePathHelp": "Pārlūko vai ievadi ceļu, kurā vēlies saglabāt servera keša datnes. Šai mapei jābūt rakstāmai.",
"HeaderSelectPath": "Izvēlies Ceļu",
"HeaderSelectMetadataPathHelp": "Pārlūko vai ievadi ceļu, kurā tu gribi saglabāt metadatus. Šai mapei jābūt rakstāmai.",
"HeaderSelectMetadataPathHelp": "Pārlūko vai ievadi ceļu, kurā vēlies saglabāt metadatus. Šai mapei jābūt rakstāmai.",
"HeaderSelectMetadataPath": "Izvēlies Metadatu Ceļu",
"HeaderSelectCertificatePath": "Izvēlies Sertifikāta Ceļu",
"HeaderScenes": "Ainas",
@ -975,11 +975,11 @@
"DirectStreamHelp1": "Šis medijs ir saderīgs ar ierīci pēc izšķirtspējas un medija veida (H.264, AC3, utt.), bet atrodas nesaderīgā datnes konteinerī (mkv, avi, wmv, utt.). Video tiks pārpakots uz saderīgu formātu pirms tas tiks straumēts uz ierīci.",
"Descending": "Disltošs",
"Depressed": "Atspiests",
"DeleteUserConfirmation": "Vai tu tiešām gribi izdzēst šo lietotāju?",
"DeleteUserConfirmation": "Vai tu tiešām vēlies izdzēst šo lietotāju?",
"DeleteUser": "Dzēst Lietotāju",
"DeleteMedia": "Dzēst mediju",
"DeleteImageConfirmation": "Vai tu tiešām gribi izdzēst šo attēlu?",
"DeleteDeviceConfirmation": "Vai tu tiešām gribi noņemt šo ierīci? Tā parādīsies atkārtoti nākamo reizi, kad lietotājs ieiet ar to.",
"DeleteImageConfirmation": "Vai tu tiešām vēlies izdzēst šo attēlu?",
"DeleteDeviceConfirmation": "Vai tu tiešām vēlies noņemt šo ierīci? Tā parādīsies atkārtoti nākamo reizi, kad lietotājs ieiet ar to.",
"DefaultErrorMessage": "Apstrādājot pieprasījumu notika kļūda. Pēc brītiņa lūdzu mēģini vēlreiz.",
"DeathDateValue": "Miris: {0}",
"ConfirmEndPlayerSession": "Vai jūs gribat izslēgt Jellyfin uz {0}?",
@ -1046,5 +1046,42 @@
"LabelKodiMetadataSaveImagePathsHelp": "Tas ir ieteicams ja tev ir attēlu datņu nosaukumi, kas neatbilst Kodi vadlīnijām.",
"LabelKodiMetadataSaveImagePaths": "Saglabāt attēlu ceļus iekš nfo datnēm",
"LabelKodiMetadataEnablePathSubstitutionHelp": "Iespējot ceļu substitūciju attēlu ceļiem izmantojot serveru ceļu substitūcijas iestatījumus.",
"LabelKodiMetadataEnablePathSubstitution": "Iespējot ceļu substitūciju"
"LabelKodiMetadataEnablePathSubstitution": "Iespējot ceļu substitūciju",
"MessageDirectoryPickerBSDInstruction": "Priekš BSD, tev var būt vajadzēs nokonfigurēt glabātuvi savā FreeNAS jail, lai atļautu Jellyfin tai piekļuvi.",
"MessageConfirmRevokeApiKey": "Vai tu tiešām vēlies atsaukt šo api atslēgu? Lietotnes savienojums ar Jellyfin Serveri tiks strauji atslēgts.",
"MessageConfirmProfileDeletion": "Vai tu tiešām vēlies izdzēst šo profilu?",
"LabelTranscodingProgress": "Trans-kodēšanas progress:",
"LabelTranscodingFramerate": "Trans-kodēšanas kadru ātrums:",
"LabelRecordingPathHelp": "Ievadi noklusējuma vietējo vietu, kur saglabāt ierakstus. Ja atstāsts tukšs, servera programmas datu mape tiks lietota tā vietā.",
"LabelPublicHttpsPortHelp": "Publiskais porta numurs, ko kartēt uz vietējo HTTPS portu.",
"LabelOriginalAspectRatio": "Oriģinālās proporcijas:",
"LabelMaxStreamingBitrateHelp": "Ievadi maksimālo bitu ātrumu straumēšanai.",
"LabelLocalHttpServerPortNumberHelp": "TCP porta numurs, kuru izmantos Jellyfin HTTP serveris.",
"MessageAreYouSureYouWishToRemoveMediaFolder": "Vai tiešām vēlies noņemt šo mediju datni?",
"MessageAreYouSureDeleteSubtitles": "Vai tiešām vēlies izdzēst šo subtitru datni?",
"MediaIsBeingConverted": "Medijs tiek pārveidots uz formātu kuru atbalsta tā atskaņojošā ierīce.",
"MediaInfoStreamTypeEmbeddedImage": "Iegults Attēls",
"MediaInfoTimestamp": "Laika zīmogs",
"MediaInfoSampleRate": "Izlases ātrums",
"MediaInfoInterlaced": "Rindpārlēkts",
"MediaInfoFramerate": "Kadru ātrums",
"MediaInfoAspectRatio": "Attēla proporcijas",
"MaxParentalRatingHelp": "Saturs ar augstāku reitingu tiks paslēpts no šī lietotāja.",
"LibraryAccessHelp": "Izvēlies bibliotēkas, ko koplietot ar šo lietotāju. Administratori spēs rediģēt visas bibliotēkas izmantojot metadatu pārvaldnieku.",
"LearnHowYouCanContribute": "Uzzini, kā tu vari dot ieguldījumu.",
"LabelUserLoginAttemptsBeforeLockout": "Neizdevušies piekļuves mēģinājumi pirms lietotājs tiek bloķēts:",
"LabelTranscodingThreadCount": "Trans-kodēšanas kodolu daudzums:",
"LabelTranscodes": "Transkodi:",
"LabelTitle": "Tituls:",
"LabelSaveLocalMetadata": "Saglabāt māksu media mapēs",
"LabelReadHowYouCanContribute": "Uzzini, kā tu vari dot ieguldījumu.",
"LabelNumberOfGuideDays": "Dienu daudzumus, kuram lejupielādēt gidu:",
"LabelLockItemToPreventChanges": "Aizslēgt šo objektu lai aizliegtu izmaiņas",
"LabelLocalHttpServerPortNumber": "Vietējais HTTP porta numurs:",
"OptionAllowManageLiveTv": "Atļaut Tiešraides TV ierakstu pārvaldīšanu",
"OptionAllowLinkSharing": "Atļaut dalīšanos sociālajos tīklos",
"OptionAllowBrowsingLiveTv": "Atļaut Tiešraides TV piekļuvi",
"MediaInfoForced": "Piespiests",
"LabelPublicHttpPortHelp": "Publiskai porta numurs, kas tiks kartēts uz vietējo HTTP portu.",
"LabelOptionalNetworkPath": "(Neobligāts) Koplietota tīkla mape:"
}

View file

@ -1213,5 +1213,10 @@
"CopyStreamURLError": "Ocorreu um erro ao copiar o URL.",
"ButtonSplit": "Dividir",
"AskAdminToCreateLibrary": "Peça a um administrador para criar a biblioteca.",
"AllowFfmpegThrottling": "Transcodificação com falhas"
"AllowFfmpegThrottling": "Transcodificação com falhas",
"DashboardOperatingSystem": "Sistema Operativo",
"LabelUserLoginAttemptsBeforeLockout": "Número de tentativas de login falhadas antes do bloqueio do utilizador:",
"LabelTrackNumber": "Número da faixa:",
"LabelSportsCategories": "Categorias de Desportos:",
"Yesterday": "Ontem"
}

View file

@ -537,8 +537,8 @@
"LabelDisplayName": "显示名称:",
"LabelDisplayOrder": "显示顺序:",
"LabelDisplaySpecialsWithinSeasons": "显示季中所播出的特集",
"LabelDownMixAudioScale": "混音频增强:",
"LabelDownMixAudioScaleHelp": "缩混音频增强。值为A将保留原来的音量。",
"LabelDownMixAudioScale": "混音频增强:",
"LabelDownMixAudioScaleHelp": "降混音时增强音频。值为 1 时将保留原始音量。",
"LabelDownloadLanguages": "下载语言:",
"LabelDropImageHere": "拖拽或点击选择图像于此处。",
"LabelDroppedFrames": "丢弃的帧:",
@ -705,7 +705,7 @@
"LabelPublicHttpPortHelp": "映射到本地 HTTP 端口的公开端口号。",
"LabelPublicHttpsPort": "公开 HTTPS 端口号:",
"LabelPublicHttpsPortHelp": "映射到本地 HTTPS 端口的公开端口号。",
"LabelReadHowYouCanContribute": "学习如何构建。",
"LabelReadHowYouCanContribute": "了解如何做出贡献。",
"LabelReasonForTranscoding": "转码原因:",
"LabelRecord": "录制:",
"LabelRecordingPath": "默认录制路径:",
@ -1348,7 +1348,7 @@
"HeaderFavoriteArtists": "最爱的艺术家",
"HeaderKeepRecording": "继续录制",
"HeaderKeepSeries": "保持系列",
"HeaderMusicQuality": "音",
"HeaderMusicQuality": "音频质量",
"HeaderNextEpisodePlayingInValue": "下一集在 {0} 后播放",
"HeaderNextVideoPlayingInValue": "下一部影片在 {0} 后播放",
"HeaderPlayOn": "播放在",
@ -1474,5 +1474,8 @@
"AskAdminToCreateLibrary": "请联系管理员以创建一个新的资料库。",
"PlaybackErrorNoCompatibleStream": "客户端配置文件存在问题,服务器未发送兼容的媒体格式。",
"AllowFfmpegThrottlingHelp": "当转码或再封装的进度大幅超过当前播放位置时,暂停该进程,以使其消耗更少的资源。在观看时不经常调整播放进度的情况下,这将非常有用。如果遇到播放问题,请关闭此功能。",
"AllowFfmpegThrottling": "限制转码速度"
"AllowFfmpegThrottling": "限制转码速度",
"PreferEmbeddedEpisodeInfosOverFileNames": "优先使用内置的剧集信息而不是文件名",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "这将在内置元数据含剧集信息时使用内置信息。",
"ClientSettings": "客户端设置"
}

View file

@ -328,7 +328,7 @@
"Art": "圖像",
"Artists": "演出者",
"AsManyAsPossible": "越多越好",
"Ascending": "由少到多",
"Ascending": "遞增",
"AspectRatio": "長寬比",
"AttributeNew": "新增",
"Audio": "音訊",
@ -552,7 +552,7 @@
"EncoderPresetHelp": "速度越慢則會得到更好的壓縮編碼效率。",
"HDPrograms": "HD節目",
"HandledByProxy": "由反向代理處理",
"HardwareAccelerationWarning": "啟動硬體加速可能在某些環境下導致系統不穩定。請確認你的作業系統和影片驅動程式是最新的。如果你在開啟此項後播放影片產生困難,那麼你需要將此選項設回”自動“。",
"HardwareAccelerationWarning": "啟動硬體加速可能在某些環境下導致系統不穩定。請確認你的作業系統和影片驅動程式是最新的。如果你在開啟此項後播放影片產生困難,那麼你需要將此選項設回”“。",
"HeaderAccessSchedule": "存取時程",
"HeaderAccessScheduleHelp": "建立一個存取時程以限制可存取的時段。",
"HeaderActiveDevices": "運行中裝置",
@ -1493,7 +1493,7 @@
"RecordingPathChangeMessage": "更改錄製資料夾不會將現有錄製從舊位置遷移到新的,您需要手動移動它們。",
"RestartPleaseWaitMessage": "Jellyfin 伺服器將重新啟動,這將花費幾分鐘時間。",
"LabelEmbedAlbumArtDidl": "於 Didl 中嵌入專輯封面",
"LabelEnableAutomaticPortMapHelp": "自動嘗試映射公共連接埠到 UPnP 本地連接埠。這可能無法用於某些路由器。",
"LabelEnableAutomaticPortMapHelp": "自動嘗試映射公共連接埠到 UPnP 本地連接埠。這可能無法用於某些路由器。需重新啓動伺服器。",
"LabelEmbedAlbumArtDidlHelp": "有些裝置使用這個方式來取得專輯封面,啟用這個選項可能導致其他設備播放失敗。",
"SettingsWarning": "更改這些值可能會導致不穩定或連線故障。如果您遇到任何問題,建議將它們重新更改為預設值。",
"LabelEnableSingleImageInDidlLimitHelp": "若在 Didl 中嵌入多個圖片,某些裝置可能無法正常顯示。",
@ -1636,10 +1636,18 @@
"LaunchWebAppOnStartupHelp": "伺服器啓動時在默認游覽器中打開網頁端。使用重啓伺服器功能時此項不生效。",
"LabelVideoResolution": "視頻解析度:",
"LabelStreamType": "串流類型:",
"EnableFastImageFadeInHelp": "為已加載的圖片啓用更快的淡入動畫",
"EnableFastImageFadeIn": "快速圖片淡入",
"EnableFastImageFadeInHelp": "對已載入的圖片啟用更快的淡入動畫",
"EnableFastImageFadeIn": "圖片快速淡入效果",
"LabelPlayerDimensions": "播放器尺寸:",
"LabelDroppedFrames": "丟棄的幀:",
"LabelCorruptedFrames": "損壞的幀:",
"ButtonSplit": "拆分"
"ButtonSplit": "分割",
"AskAdminToCreateLibrary": "如要建立資料庫,請求管理員。",
"NoCreatedLibraries": "看來您還未創任何媒體庫。{0}立刻創一個新的嗎?{1}",
"ClientSettings": "用戶設定",
"AllowFfmpegThrottlingHelp": "當轉檔或重組進度大量超前目前播放進度時,將暫停轉檔節省消耗的資源。在不常跳播的時候最有效。如果遇到播放問題,請關閉此功能。",
"AllowFfmpegThrottling": "限制轉檔",
"PreferEmbeddedEpisodeInfosOverFileNamesHelp": "這將會使用內建劇集資料。",
"PlaybackErrorNoCompatibleStream": "用戶端偵測出了問題,伺服器也未傳送相容的媒體格式。",
"PreferEmbeddedEpisodeInfosOverFileNames": "優先使用內建劇集資訊而不是檔案名稱"
}

View file

@ -382,7 +382,7 @@ a[data-role=button] {
.emby-checkbox:checked + span + .checkboxOutline {
background-color: #030322;
border: 2px solid rgb(72, 195, 200);
border: 0.14em solid rgb(72, 195, 200);
}
.emby-checkbox:checked + span + .checkboxOutline > .checkboxIcon-checked {
@ -394,7 +394,7 @@ a[data-role=button] {
}
.emby-checkbox:focus:not(:checked) + span + .checkboxOutline {
border: 2px solid #ff77f1;
border: 0.14em solid #ff77f1;
}
.itemProgressBarForeground {
@ -438,6 +438,15 @@ a[data-role=button] {
color: #f8f8fe;
}
.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles svg .mdl-radio__outer-circle,
.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles svg .mdl-radio__inner-circle {
color: #ff77f1;
}
.mdl-radio.show-focus .mdl-radio__button:focus + .mdl-radio__circles .mdl-radio__focus-circle {
background: #00a4dc;
}
.emby-tab-button {
color: #999;
}

View file

@ -6,12 +6,12 @@ const CopyPlugin = require("copy-webpack-plugin");
const Assets = [
"alameda/alameda.js",
"native-promise-only/npo.js",
"libass-wasm/dist/subtitles-octopus-worker.js",
"libass-wasm/dist/subtitles-octopus-worker.data",
"libass-wasm/dist/subtitles-octopus-worker.wasm",
"libass-wasm/dist/subtitles-octopus-worker-legacy.js",
"libass-wasm/dist/subtitles-octopus-worker-legacy.data",
"libass-wasm/dist/subtitles-octopus-worker-legacy.js.mem"
"libass-wasm/dist/js/subtitles-octopus-worker.js",
"libass-wasm/dist/js/subtitles-octopus-worker.data",
"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"
];
module.exports = {

748
yarn.lock

File diff suppressed because it is too large Load diff